Skip to main content

Command line reference

wai is WAI's command line. This page lists every operation of the toolchain, generated from its operation catalogue, /ops.json (format wai.ops/1), as the open-standards repository holds it at commit f6bfd71ca9e5. wai ops list, wai ops search "<task>" and wai ops show <id> read, offline, the catalogue the binary you run carries.

Each operation is named noun.verb, and each command also answers to wai <noun> <verb>. Each is stable (changed only with a deprecation window) or preview (published and working; its shape may still change), and names the toolchain version that first carries it: a release carries the operations up to its own version, and a build from source at the commit above carries every one (the quickstart installs either).

Agent rules

Every command keeps them. With --json, standard output holds one envelope (envelope/1) and logs stay on standard error.

ExitMeaning
0Done; every check held.
1Ran, and a check failed.
2Usage error or invalid input.
3Authentication or permission.
4Confirmation required; nothing changed.
5Not found (file, target, room, operation).
6Target unavailable; safe to retry.
7Internal error.
FlagWhat it does
--jsonOne JSON envelope on stdout: {"wai": "envelope/1", "op", "ok", "data" | "error"}.
--dry-runWrite nothing and send nothing; say what would be done (an operation that only reads ignores it).
--yesConfirm a change that waits for confirmation; off a terminal, without it, exit 4. Also --confirm, deprecated since 0.3.0 (use --yes).
--no-inputNever ask: a change that waits for confirmation exits 4 unless --yes is given.

Commands

Each command, by toolset: what it does, its synopsis and its arguments.

Core (toolset core)

wai hello

WAI's four steps (name, dispatch, rebuild, receipt) on a picture made here, its receipt checked offline.

toolchain.test · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · writes a signed record a verify operation checks · needs the build feature quickstart · also wai toolchain test

wai hello [<dir>]   WAI's four steps (name, dispatch, rebuild, receipt) on a sample, written to <dir> (wai-hello)
  • <dir>, path: Where the object and its receipts are written (wai-hello).

wai create

A new project from one of the examples, written into a new or empty directory; --list names the templates.

project.create · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · also wai project create

wai create <dir> --template <name> | create --list   a new project from one of the examples
  • <dir>, path: A directory that does not exist or is empty.
  • --template, string: The template, one of `wai create --list`.
  • --list, boolean: List the templates instead.

wai lock

wai.lock written beside wai.json: everything whose bytes change a result pinned by digest, the same bytes on any host; --check refuses a stale or edited lock.

project.lock · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · also wai project lock · the MCP tool project_lock

wai lock [<dir>] [--check] [--root <wai-dir>] [--packer BIN]   write wai.lock; --check holds it to what it pins, exit 1 when it is stale or was edited
  • <dir>, path: The project's directory (.).
  • --check, boolean: Write nothing: hold the file to what it pins.
  • --root, path: The wai/ directory of a checkout of the standard, for the corpora conform.suites names (found from the current directory otherwise).
  • --packer, path: wai-pack, for the policy package.policy names ($WAI_PACK_BIN, beside wai, or on PATH otherwise).

wai check

A project validated without building it: wai.json, each file it states, its app, and wai.lock against what it pins, every finding reported; what could not run says not checked.

project.check · preview · since 0.5.0 · runs on this machine, touching nothing else · reads only · also wai project check · the MCP tool project_check

wai check [<dir>] [--root <wai-dir>] [--packer BIN]   exit 1 when a check failed, 5 when none failed and one or more could not run
  • <dir>, path: The project's directory (.).
  • --root, path: The wai/ directory of a checkout of the standard, for the corpora conform.suites names (found from the current directory otherwise).
  • --packer, path: wai-pack, for the policy package.policy names ($WAI_PACK_BIN, beside wai, or on PATH otherwise).

wai build

dist/ written for a project whose checks hold: the same bytes from the same project and lock, with a build record naming the digests of wai.json and wai.lock.

project.build · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · also wai project build · the MCP tool project_build

wai build [<dir>] [--key <seed file>] [--packer BIN] [--root <wai-dir>]   write dist/; refused, nothing written, when a check fails or the lock is stale
  • <dir>, path: The project's directory (.).
  • --key, path: The seed file (64 hexadecimal digits) that signs a package's receipt, for a project with package.
  • --packer, path: wai-pack, for a project with package ($WAI_PACK_BIN, beside wai, or on PATH otherwise).
  • --root, path: The wai/ directory of a checkout of the standard, for the corpora conform.suites names (found from the current directory otherwise).

wai verify

Every receipt index (*.wai.receipts) under each path, its group receipts and claims checked offline, and every conformance result, fleet report bundle and envelope there.

receipt.verify · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature quickstart · also wai receipt verify · the MCP tool receipt_verify

wai verify <path>... [--conformant [--root <wai-dir>]]   the receipts (receipt indexes *.wai.receipts), conformance
    results (*.wai-conform.json), fleet report bundles (*.wai-fleet.json) and envelopes' pins (*.wai) under each path,
    checked offline; --conformant admits a result only for a run that passed against this checkout's corpus,
    and gives each area the results' suites are in a verdict
  • <paths>, list of string, required: Files or directories holding receipt indexes, conformance results, fleet report bundles or envelopes.
  • --conformant, boolean: Admit each conformance result only when its run passed, against the corpus of a checkout.
  • --root, path: With --conformant, the wai/ directory of the checkout whose corpus a result names.

wai inspect

What an envelope holds and whether this build decodes it: media, intent, pin, capability, fallback, the dispatch verdict and the conformance checks.

envelope.inspect · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · also wai envelope inspect · the MCP tool envelope_inspect

wai inspect <in.wai>   what a WAI1 or WAI2 envelope holds, and the verdict of SPEC §4's dispatch here
  • <path>, path, required: A .wai envelope.

wai wrap

Carry a registered capability's bytes in an envelope, byte for byte, under SPEC's intent, role and candidate rules.

envelope.wrap · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · also wai envelope wrap · the MCP tool envelope_wrap

wai wrap <capability> <payload> [-o out.wai] [--fallback <cap>] [--intent <intent>]
    [--companion <cap> <payload>]...   WAI2: companions bound to the payload
  • <capability>, string, required: A registered capability (`wai capabilities`).
  • <payload>, path, required: The bytes to carry.
  • -o (out), path: The envelope (out.wai).
  • --fallback, string: A WAI1 fallback capability.
  • --intent, string: The envelope's intent (replicate where SPEC §7 allows it).
  • --companion, list of string: A companion capability and its payload, bound to the payload.

wai unwrap

An envelope's capability and its checks, and with -o its payload or one component, exactly as wrapped.

envelope.unwrap · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · also wai envelope unwrap

wai unwrap <in.wai> [-o payload] [--component <i>]   extract any registered capability's bytes
  • <path>, path, required: A .wai envelope.
  • -o (out), path: Where the payload is written.
  • --component, integer: A WAI2 component's index.

wai encode

Encode a file with a codec this build holds, in an envelope; AVC and HEVC through the device's own encoders, with a signed record.

media.encode · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · writes a signed record a verify operation checks · needs one of the build features floor, codecs, platform_encode · also wai media encode

wai encode <codec> <input> [-o out.wai] [-q quality]   codecs: png jpeg avif jxl jxl-lossless opus flac av1 av1-lossless zstd xz
    a build with `floor` alone encodes png and zstd; the others need `codecs`
    image codecs: .rgb (with .meta holding 'H W') or a PNG/JPEG file; audio: .f32 (raw mono float32)
    with .meta holding the sample rate; video: packed RGB frames with .meta 'N H W fps_num fps_den';
    text codecs: any file
wai encode avc|hevc <in.y4m> [-o out.wai] [--encoder auto|platform|va|gpu-driver|software] [--library <path>]
    [--device <node|ordinal>] [--hardware yes|no] [--kbps <n>] [--size WxH] [--idr-every <frames> |
    --idr-plan <plan.txt>] [--es <out>] [--record <out.json> --key <name|seed>] [--meter <counter> [--rounds <n>]]
    (a build with `platform_encode`)
  • <codec>, string, required: png, jpeg, avif, jxl, jxl-lossless, opus, flac, av1, av1-lossless, zstd, xz; or avc, hevc.
  • <input>, path, required: The file to encode.
  • -o (out), path: The envelope (out.wai).
  • -q (quality), integer: Quality, 1 to 100 (75).

wai decode

Decode an envelope through SPEC §4's dispatch to raw samples, with a .meta file beside them.

media.decode · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs one of the build features floor, codecs · also wai media decode

wai decode <in.wai> -o <output>   a build with `floor` decodes png, flac and zstd; `codecs` the rest
  • <path>, path, required: A .wai envelope.
  • -o (out), path, required: The decoded samples.

wai generate

Make a wai.generate.spectral picture natively and print its SHA-256, or write its instruction object.

media.generate · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature generate · also wai media generate

wai generate --model <json> (--prompt <s> --seed <u32> --steps <n> | --instr <object>) --size WxH -o <out.rgb>
    make a wai.generate.spectral picture (RGB8) and print its SHA-256; --sizes WxH,... --write-instr
    <object> writes the instruction object of form v0 (SPEC §5)
  • --model, path, required: The model file.
  • --prompt, string: The prompt.
  • --seed, integer: The seed.
  • --steps, integer: The steps.
  • --instr, path: An instruction object of form v0.
  • --size, string: WxH.
  • -o (out), path: The picture, RGB8.

wai identify

What a file is, from its bytes alone: the formats they fit with the bytes that say so, its tracks, its protection, and measures where no format is recognised.

media.inspect · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature identify · also wai media inspect · the MCP tool media_inspect

wai identify <file> [--json]   any file, not only an envelope (extensions/media-identify.md); unknown stays unknown
  • <path>, path, required: Any file.

wai upscale run

Upscale a PNG exactly, by an integer network under a pinned prior, with a signed record a verifier recomputes.

media.upscale · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · writes a signed record a verify operation checks · needs the build feature exact_upscale · also wai media upscale

wai upscale run <in.png> --prior <p.wsr> [--derivation sr2|sr4] -o <out.png>
    [--record <out.json> --envelope <in.wai> --key <name|seed>] [--issued-at <date-time>] [--json]
    an 8-bit RGB PNG; --record signs what exact-upscale §7 recomputes from --envelope and the prior
  • <path>, path, required: An 8-bit RGB PNG.
  • --prior, path, required: The WSR1 prior.
  • --derivation, string: sr2 (the default) or sr4.
  • -o (out), path, required: The picture, a PNG.
  • --record, path: The signed upscale record.
  • --envelope, path: The WAI1 of the input, which the record names.
  • --key, string: The record's signing key: its name in the keystore (wai key list), 64 hexadecimal digits, or a file holding them.

wai upscale verify

An upscale record recomputed from its input and its prior, and the picture held to it.

upscale.verify · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature exact_upscale

wai upscale verify <record.json> --envelope <in.wai> --prior <p.wsr> [--picture <out.png>]
    the record's outcome as JSON (extensions/exact-upscale.md §7, under require-proof); exit 1 when it is refused
  • <record>, path, required: The upscale record.
  • --envelope, path, required: The WAI1 of the input, which the record names.
  • --prior, path, required: The WSR1 prior the record names.
  • --picture, path: The picture: its samples are held to the record's output.

wai tonemap run

Render a still's gain map exactly at the headrooms named, with a signed record a verifier recomputes.

media.tonemap · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · writes a signed record a verify operation checks · needs the build feature exact_tonemap · also wai media tonemap

wai tonemap run <in.wai> --headrooms <h,h,...> --out <dir> [--input-class <class>]
    [--record <out.json> --key <name|seed>] [--issued-at <date-time>] [--json]
    a WAI2 of a PNG base and its gain map; a headroom is in 1/10000 of a stop; each rendition is RGB16
  • <path>, path, required: A WAI2 of a PNG base and its gain map.
  • --headrooms, string, required: The headrooms, in 1/10000 of a stop, joined by commas.
  • --out, path, required: The directory the renditions are written in.
  • --input-class (input_class), string: The input's class (captured).
  • --record, path: The signed rendition record.
  • --key, string: The record's signing key: its name in the keystore (wai key list), 64 hexadecimal digits, or a file holding them.

wai tonemap verify

A rendition record recomputed from its envelope, and the renditions held to it.

tonemap.verify · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature exact_tonemap

wai tonemap verify <record.json> --envelope <in.wai> [--renditions <dir>]
    the record's outcome as JSON (extensions/exact-tonemap.md §8, under require-proof); exit 1 when it is refused
  • <record>, path, required: The rendition record.
  • --envelope, path, required: The WAI2 the record names.
  • --renditions, path: The directory `wai tonemap run` wrote: each rendition is held to its picture.

wai score build

A WSCR score from integer note fields.

score.build · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature score

wai score build <notes.json> -o <out.wscr>   a WSCR from integer note fields
  • <notes>, path, required: The note fields, JSON.
  • -o (out), path, required: The score.

wai score render

A score's reference mixdown and its digests (pcm_sha256, mixdown_blake3, score_hash).

score.decode · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature score · also wai score decode

wai score render <in.wscr> [--pcm <out.s16>]   the reference mixdown and its digests
  • <score>, path, required: A WSCR score.
  • --pcm, path: Where the mixdown is written.

wai encoders

What each encoder interface offers on this device, for AVC and HEVC.

encoder.list · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature platform_encode · also wai encoder list

wai encoders [--library <path>]   what each encoder interface offers here
  • --library, path: A software encoder library.

wai encode-record verify

A signed encode record checked, against the stream and its source where given.

encoder.verify · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature platform_encode · also wai encoder verify

wai encode-record verify <record.json> [--stream <es>] [--source <in.y4m>]
  • <record>, path, required: The signed record.
  • --stream, path: The elementary stream it names.
  • --source, path: The source it names.

wai package build

A package packed by the reference packager wai-pack from a policy, a source per component and a supplied floor, with its signed package receipt.

package.build · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · writes a signed record a verify operation checks

wai package build --policy <policy.toml> --out <dir> --key <seed.hex> [--source <id>=<file>]... [--floor <dir>]
    [--signer-id <id>] [--meter none|model:<mW>] [--packer <wai-pack>] [wai-pack pack's other flags]
    the reference packager's pack (extensions/packaging.md): the policy's components packed into <dir>, new or empty,
    with the package receipt (package.receipt.json); the packer is --packer, $WAI_PACK_BIN, wai-pack beside wai,
    or wai-pack on PATH
  • --policy, path, required: The packaging policy (extensions/packaging.md §3).
  • --out, path, required: A new or empty directory, written with the package.
  • --key, path, required: The packager's signing key: a 32-byte seed, in hexadecimal.
  • --source, list of string: A component's source, <id>=<file>; each component's own by default.
  • --floor, path: A supplied floor's directory (floor/ beside the policy by default).
  • --signer-id (signer_id), string: The receipt's signer id (the key's did:key by default).
  • --meter, string: none, or model:<milliwatts>: the meter of the receipt's figure.
  • --packer, path: The packer's binary (wai-pack).

wai package verify

A package verified by the reference packager wai-pack: every reason it is refused, or its counts and pack digest.

package.verify · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only

wai package verify <dir> [--parent <dir>] [--packer <wai-pack>]   the reference packager's verify
    (extensions/packaging.md §9): the package's receipt, stage indexes, objects and floor; with --parent, a re-pack against
    the package its receipt names; exit 1 when refused
  • <dir>, path, required: The package's directory.
  • --parent, path: The package a re-pack's receipt names.
  • --packer, path: The packer's binary (wai-pack).

wai capabilities

Every registered capability with its fidelity, licence class, replicate class and role, and whether this build decodes it.

registry.list · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · also wai registry list · the MCP tool registry_list

wai capabilities   the registered capabilities, their tier, licence, replicate class and role

wai prior-set

The listing of a parameter set (wai.prior.set) on stdout, and its pin on stderr.

prior.list · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · also wai prior list

wai prior-set <root>   print the listing of a parameter set (wai.prior.set) and its pin
  • <root>, path, required: The parameter set's directory.

wai stage refine

A refinement layer over a base and the layers below it, toward a target.

stage.encode · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build features staged, video_int, audio_int, splat_int · also wai stage encode

wai stage refine --base <b.wai> [--on <L.wai>]... --toward <file> --q N [--predictor identity|up2|rate:NUM/DEN]
    [--span F:C] [--out-dims D0,D1,D2] [--max-symbols N] [--table-per-unit] -o L.wai
  • --base, path, required: The base envelope.
  • --toward, path, required: The samples the layer refines toward (--target, deprecated, is the same).
  • --q, integer, required: The quantiser.
  • -o (out), path, required: The layer.

wai stage apply

Envelopes taken in order: each layer offered, each base decoded and refined, with each report and the units.

stage.decode · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build features staged, video_int, audio_int, splat_int · also wai stage decode

wai stage apply <envelope>...   each layer offered, a base decoded (SPEC §4) and refined; the reports and units, or a JSON trace
  • <envelopes>, list of string, required: The base, then its layers.

wai stage base

A wai.video.int_motion base of N frames of RGB8 (WIV1, keyframe 0, zero motion).

stage.build · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build features staged, video_int, audio_int, splat_int · also wai stage build

wai stage base --frames <file> --dims N,H,W --q Q -o base.wai
  • --frames, path, required: The frames, packed RGB8.
  • --dims, string, required: N,H,W.
  • --q, integer, required: The quantiser.
  • -o (out), path, required: The base envelope.

wai stage inspect

A refinement layer's refines, its WIR1 header and its declared cost.

stage.inspect · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build features staged, video_int, audio_int, splat_int

wai stage inspect <L.wai>
  • <layer>, path, required: A layer envelope.

wai stage pack

WAI1 envelopes packed into one WAI2, their manifests verbatim.

stage.wrap · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build features staged, video_int, audio_int, splat_int · also wai stage wrap

wai stage pack <base.wai> <L.wai>... -o x.wai
  • <envelopes>, list of string, required: The base, then its layers.
  • -o (out), path, required: The WAI2 envelope.

wai stage explode

One component of a WAI2 envelope as its WAI1 envelope.

stage.unwrap · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build features staged, video_int, audio_int, splat_int · also wai stage unwrap

wai stage explode <x.wai> <i> [-o out.wai]
  • <path>, path, required: A WAI2 envelope.
  • <index>, integer, required: The component's index.
  • -o (out), path: The WAI1 envelope.

wai http publish

Envelopes named by their content hash, each with its head proof and entity tag, ready for an origin.

http.export · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature http · also wai http export

wai http publish <in.wai>... --out <dir>
  • <envelopes>, list of string, required: The envelopes.
  • --out, path, required: The directory.

wai http codecs

The codecs parameter a sequence of envelopes advertises: its union and its floor.

http.inspect · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature http · also wai http inspect

wai http codecs <in.wai>...
  • <envelopes>, list of string, required: The envelopes.

wai http origin

An origin on loopback serving a published directory with http-delivery's headers, ranges and If-Range.

http.start · preview · since 0.3.0 · runs on this machine, touching nothing else · runs something and writes only its own state · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature http · also wai http start

wai http origin --root <dir> [--port P] [--delay-range FIRST-LAST:MS]
  • --root, path, required: The published directory.
  • --port, integer: The port on 127.0.0.1.

wai http hls

An HLS rendition of published objects.

hls.build · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature http · also wai hls build

wai http hls --objects <list.json> --out <dir> [--master NAME]
  • --objects, path, required: The objects, JSON.
  • --out, path, required: The directory.

wai http mpd

A DASH manifest of published objects.

dash.build · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature http · also wai dash build

wai http mpd --objects <list.json> --out <wai.mpd> [--period-id ID] [--set-id N]
  • --objects, path, required: The objects, JSON.
  • --out, path, required: The manifest.

wai http seal-playlist

A media playlist sealed with a signed manifest receipt.

playlist.lock · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · writes a signed record a verify operation checks · needs the build features http, video_manifest · also wai playlist lock

wai http seal-playlist <m3u8> --key <name|seed> [--signer-id ID] [--content-id ID] [--parent <mr.json>] [--out <dir>]
  • <playlist>, path, required: The playlist.
  • --key, string, required: The signing key: its name in the keystore (wai key list), 64 hexadecimal digits, or a file holding them.

wai http check-playlist

A media playlist checked against its manifest receipt.

playlist.verify · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build features http, video_manifest · also wai playlist verify

wai http check-playlist <m3u8> --receipt <mr.json> [--parent <mr.json>] [--classical <m3u8>]
  • <playlist>, path, required: The playlist.
  • --receipt, path, required: Its manifest receipt.

wai http bench

An object fetched by the byte-range procedure, repeatedly, and the record of each run.

http.load · preview · since 0.3.0 · runs on this machine, against a service it names · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature http · also wai http load

wai http bench --url URL --runs N --advertise CAP [--advertise CAP]... --out F
  • --url, string, required: The object's URL.
  • --runs, integer, required: How many runs.
  • --advertise, list of string, required: A capability this sink advertises.
  • --out, path, required: The record.

wai http receipts

An object's receipt index fetched over HTTP and checked, its signers confirmed under the origin's key log where named.

receipt.fetch · preview · since 0.3.0 · runs on this machine, against a service it names · reads only · needs the build features http, receipt_claims · also wai receipt fetch

wai http receipts --url URL [--advertise CAP]... [--held fetch|none] [--join] [--max-walk N] [--fetch-budget N]
    [--deadline-ms MS] [--key-origin https://HOST[:PORT] [--pin-key-log FILE | --test-plaintext-connect HOST:PORT]]
  • --url, string, required: The object's URL.

wai breaking

What the working tree breaks against a git ref, by category (wire, record, api); a break passes once the CHANGELOG names it.

compat.check · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · also wai compat check

wai breaking --against <git-ref> [--category wire|record|api] [--only <surface>,...] [--skip <surface>,...]
    [--root <dir>] [--target-dir <dir>] [--all]   exit 1 on a break the CHANGELOG does not acknowledge
  • --against, string, required: The git ref to compare with.
  • --category, string: wire, record or api: the categories checked, cumulative (api).
  • --only, string: Only these surfaces, comma-separated.
  • --skip, string: Not these surfaces, comma-separated.
  • --root, path: The repository's root (.).
  • --target-dir (target_dir), path: Where the Rust API's description is built.
  • --all, boolean: List every finding, compatible ones too.

wai conform

WAI's conformance corpus run against another implementation, through a command or an HTTP adapter, or every corpus's independent verifier; each result a signed record wai verify checks.

conformance.run · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature quickstart · also wai conformance run · the MCP tool conformance_run

wai conform <kind> --suite <suite> --impl <command or URL> [--independent] [--key <file>] [--out <file>]
    [--root <wai-dir>] [--timeout <seconds>] [--name <text>] [--version <text>] [--python <program>] [--all]
    [--level required|all] [--format text|json|junit|html] [--yes]   `wai conformance list` names the kinds and
    suites; --independent runs the corpus's independent verifier beside the implementation, and both must conform;
    a case is required unless its corpus marks it informative, and --level all counts every case
wai conform --independent [--suite <area|name>[,...]] [--out <dir>] [--key <file>] [--root <wai-dir>]
    [--timeout <seconds>] [--python <program>] [--format text|json|junit|html] [--yes]   every corpus's
    independent verifier (or those named), a record each in <dir>; a record that exists is replaced only with
    --yes (--confirm, deprecated, is the same)
  • <kind>, string: The kind of implementation (wai conformance list): a decoder, a verifier, an origin, a cache, a packager, a sink; none with --independent alone.
  • --suite, string: The suite (wai conformance list); with --independent alone, areas and independent verifiers, comma-separated.
  • --impl, string: The implementation: a command with {case}/{in}/{out}/{corpus}/{model} placeholders (a cache's: {port} and {origin}), or a URL; required with a kind.
  • --independent, boolean: Run the corpus's independent verifier beside the implementation, held to the same cases; without a kind, every independent verifier.
  • --key, path: The seed the records are signed with.
  • --out, path: The record (<suite>.wai-conform.json); with --independent alone, a directory for a record a corpus.
  • --root, path: The wai/ directory whose corpora are run.
  • --timeout, integer: Seconds a case may take (60), or an independent verifier its whole corpus (1800).
  • --name, string: The implementation's name, for the record.
  • --version, string: The implementation's version, for the record.
  • --python, string: The Python the independent verifiers run with (python3).
  • --format, string: What is printed: text, json (the envelope, as --json), junit (JUnit XML) or html, the last two from the records.
  • --all, boolean: List every case, passed ones too.
  • --level, string: required (the default: a case the corpus marks informative is reported, not counted) or all (every case counted); for a suite whose corpus marks a case informative.

wai conformance list

The kinds and suites wai conform runs, each suite's corpus and its cases, and every corpus's independent verifier.

conformance.list · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature quickstart · the MCP tool conformance_list

wai conformance list [--root <wai-dir>]   the kinds and suites, and the independent verifiers (also wai conform --list)
  • --root, path: The wai/ directory whose corpora are listed.

wai enrolment create

A node's enrolment signed with the organisation key, written to a file and, with --target, given to a fleet service.

enrolment.create · preview · since 0.3.0 · runs on this machine, against a service it names · changes a target that is not this machine · takes --dry-run · waits for --yes before it changes the target it names or replaces a file that exists · writes a signed record a verify operation checks · needs the build feature fleet

wai enrolment create <node-key> --role <role> --key <name|file> [--label L] [--from µs] [--until µs] [--out F]
    [--target <name|url>] [--yes]   a node's enrolment (WFE1), signed with the organisation key, written to F
    (<node>.wfe without --target) and, with --target, given to the fleet service it names (never to the target in
    use unless named); changing the service or replacing a file waits for --yes (--confirm, deprecated, is the same)
  • <node>, string, required: The node's Ed25519 public key, 64 hexadecimal digits.
  • --role, string, required: relay, compositor, ingest, room, ledger or audit.
  • --key, string, required: The organisation key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.
  • --label, string: The node's label, at most 64 bytes.
  • --from, integer: The start of the span it holds, microseconds since 1970 (0).
  • --until, integer: The end of that span, microseconds since 1970 (none).
  • --out, path: The enrolment's file (<node>.wfe when no --target is given).
  • --target, string: The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.

wai enrolment list

The nodes a fleet service holds enrolled, each with its role, label and how many records it gave.

enrolment.list · preview · since 0.3.0 · runs on this machine, against a service it names · reads only

wai enrolment list [--target <name|url>]   the nodes the fleet service holds enrolled (the target in use when none is named)
  • --target, string: The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.

wai report create

The fleet report of a period, signed by a fleet service over the enrolments and records it holds.

report.create · preview · since 0.3.0 · runs on this machine, against a service it names · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · writes a signed record a verify operation checks

wai report create [--target <name|url>] --start µs --end µs [--yes]   the fleet report of [start, end), signed by the
    fleet service (the target in use when none is named); it changes the service, so it waits for --yes (--confirm,
    deprecated, is the same)
  • --target, string: The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.
  • --start, integer, required: The period's start, microseconds since 1970.
  • --end, integer, required: The period's end, after its start.

wai report export

A fleet report's bundle fetched from a fleet service, its report recomputed here, then written to a file.

report.export · preview · since 0.3.0 · runs on this machine, against a service it names · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature fleet

wai report export <digest> [--target <name|url>] [--out F] [--yes]   the report's bundle from the fleet service
    (the target in use when none is named), recomputed by this build and written to F (<digest>.wai-fleet.json) for
    `wai verify`; replacing a file waits for --yes (--confirm, deprecated, is the same)
  • <digest>, string, required: The report's digest, 64 hexadecimal digits.
  • --target, string: The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.
  • --out, path: The bundle's file (<digest>.wai-fleet.json).

wai route verify

A route record checked offline against its request, price book and routing policy, and against its hops' OER/2 receipts where given.

route.verify · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature route_record

wai route verify <document.json>   a verification document (extensions/route-record.md §7.1): the record's outcome
    (§7.3) as JSON, recomputed from the request, the price book and the policy; exit 1 when it is refused
  • <document>, path, required: The verification document: the request, price book, policy and record, and the hops' receipts.

wai channel import

A linear channel's feeds (an XMLTV schedule, Media RSS catalogues or the JSON form, and a Media Playlist's SCTE-35 date ranges) imported into its signed receipt, its signed lineup and its breaks' cues.

channel.import · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature channel_lineup

wai channel import --channel ID (--xmltv F [--mrss F]... | --mrss F... | --feed F) [--playlist F] --key K
    [--mrss-owner O]... [--owner O] [--signer-id S] [--id-system N] [--xmltv-channel X] [--start-ms T] [--artwork DIR]
    [--window-start T --window-end T] [--parent HEX] [--out-dir D] [--yes]   the receipt (channel.json), the lineup
    (lineup.wlu) and the cues (cues.json), written to D (.); a refusal's code is its reason; replacing a file waits
    for --yes (--confirm, deprecated, is the same)
  • --channel, string, required: The channel id.
  • --xmltv, path: An XMLTV document: the schedule.
  • --mrss, list of string: A Media RSS document: a catalogue. Repeated.
  • --mrss-owner (mrss_owner), list of string: The rights holder of each --mrss document's items, in their order: none, or one each.
  • --feed, path: The JSON form of a schedule, its catalogue and its breaks.
  • --playlist, path: The channel's HLS Media Playlist, whose SCTE-35 date ranges are its breaks.
  • --key, string, required: The operator's key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.
  • --owner, string: The rights holder of every asset no other input gives one.
  • --signer-id (signer_id), string: The receipt's signer id (the operator key's did:key).
  • --id-system (id_system), string: The XMLTV episode-num system that names a programme's asset (wai-asset-id).
  • --xmltv-channel (xmltv_channel), string: The XMLTV channel id whose programmes are read (the channel id).
  • --start-ms (start_ms), integer: Where a schedule of Media RSS items alone begins, milliseconds since 1970.
  • --artwork, path: The directory holding the artwork files the feeds' icons and thumbnails name.
  • --window-start (window_start), integer: The receipt's window's start (the schedule's first start).
  • --window-end (window_end), integer: The receipt's window's end (the schedule's last end).
  • --parent, string: The receipt hash of the window before this one, 64 hexadecimal digits.
  • --out-dir (out_dir), path: Where channel.json, lineup.wlu and cues.json are written (.).

wai channel guide

A channel's guide, an XMLTV document or a now/next document, rendered from its receipt and its lineup and naming both.

channel.guide · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · needs the build feature channel_lineup

wai channel guide --receipt R --lineup L [--from T --to T | --now-next --at T] [--out F] [--yes]   the XMLTV guide
    of a range (the whole schedule), or the now/next document of an instant, written to F (guide.xml, now-next.json);
    replacing a file waits for --yes (--confirm, deprecated, is the same)
  • --receipt, path, required: The channel receipt, in its JSON carriage.
  • --lineup, path, required: The lineup's file.
  • --from, integer: The range's start, milliseconds since 1970 (the schedule's first start).
  • --to, integer: The range's end (the schedule's last end).
  • --now-next (now_next), boolean: The now/next document of --at instead.
  • --at, integer: The instant of a now/next document, milliseconds since 1970.
  • --out, path: The guide's file (guide.xml, or now-next.json).

wai channel verify

A channel's receipt, its lineup and a guide verified together: the guide recomputed from the two and compared, each programme with whether it aired.

channel.verify · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature channel_lineup

wai channel verify --receipt R --lineup L [--guide G]   the receipt, the lineup and the guide checked together;
    exit 1 with the reason when one does not verify
  • --receipt, path, required: The channel receipt, in its JSON carriage.
  • --lineup, path, required: The lineup's file.
  • --guide, path: An XMLTV guide or a now/next document.

wai mcp

WAI's operations as tools for a coding agent: a Model Context Protocol server on standard input and output, in toolsets.

mcp.start · preview · since 0.3.0 · runs on this machine, against a service it names · runs something and writes only its own state · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature mcp · also wai mcp start

wai mcp [--toolset core,dev,app] [--read-only] [--project DIR] [--spec-root DIR] [--room-bin BIN]
    [--target <name|url> [--allow-write]]   serves until standard input closes; --dry-run names the tools it would
    serve and serves nothing. With --target, the operations of the service's API are tools too, each sent to its
    route on that target alone: those that read it, and those that change it where the server may (a target on
    this machine, or another with --allow-write; never with --read-only or to a read-only target)
  • --toolset, string: The toolsets to offer, comma-separated (core when none is named).
  • --read-only (read_only), boolean: Offer only the tools that read or run a verifier.
  • --project, path: The directory the server may write in (the current one).
  • --spec-root (spec_root), path: The wai/ directory whose text and corpora the tools read.
  • --room-bin (room_bin), path: The room service the development room runs.
  • --target, string: The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.
  • --allow-write (allow_write), boolean: Offer the tools that change the target where it is on another machine.

wai setup-agent

A project made ready for coding agents: AGENTS.md, an import of it in a CLAUDE.md already there, and wai mcp registered in its MCP configuration.

agent.setup · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · also wai agent setup

wai setup-agent [--dir D] [--all] [--only FILE,...] [--toolset core,dev,app] [--command PROGRAM]
    a file that exists changes only once confirmed (--yes, or yes at a terminal); --dry-run shows each diff
  • --dir, path: The project directory (the current one).
  • --all, boolean: Write every agent's configuration file, not only those whose directory is there.
  • --only, string: Only these files, comma-separated.
  • --toolset, string: The toolsets the registered server offers.
  • --command, string: The program the registration runs (wai).

wai registry show

One capability's registry entry, whether this build decodes it, its role, and the specification lines that name it.

registry.show · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature mcp · the MCP tool registry_show

wai registry show <capability> [--spec-root <wai-dir>]   one capability's registry entry, whether this build decodes it,
    its role, and the specification lines that name it, where the specification's text is here (--spec-root,
    $WAI_SPEC_ROOT, or the tree this binary was built from)
  • <capability>, string, required: A capability string, e.g. wai.image.avif.
  • --spec-root (spec_root), path: The wai/ directory whose text is read, on the command line (wai mcp has a --spec-root of its own).

wai docs search

Lines of the specification and its extensions holding every word of a query, each with its file, line and section.

docs.search · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature mcp · the MCP tool docs_search

wai docs search <word>... [--limit N] [--spec-root <wai-dir>]   the lines of the specification and its extensions that hold
    every word, with each one's file, line and section, offline; the text is --spec-root's, $WAI_SPEC_ROOT's, or the
    tree this binary was built from
  • <query>, string, required: Words that must all appear on a line.
  • --limit, integer: At most this many hits (20).
  • --spec-root (spec_root), path: The wai/ directory whose text is searched, on the command line (wai mcp has a --spec-root of its own).

wai service show

The service's health.

service.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET / on wai-room

wai service show [--target <name|url>] [--query <name>=<value>]...   GET / on the room service

wai service check

The service's health.

service.check · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /health on wai-room

wai service check [--target <name|url>] [--query <name>=<value>]...   GET /health on the room service

wai room show

The current room.

room.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /room on wai-room

wai room show [--target <name|url>] [--query <name>=<value>]...   GET /room on the room service

wai admission show

The room's admission receipt so far.

admission.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /age/receipt on wai-room

wai admission show [--target <name|url>] [--query <name>=<value>]...   GET /age/receipt on the room service

wai mls tail

The room's log of MLS messages.

mls.tail · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /mls on wai-room

wai mls tail [--target <name|url>] [--query <name>=<value>]...   GET /mls on the room service

wai mls import

A KeyPackage for a granted principal's Add.

mls.import · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /mls/key-package on wai-room

wai mls import [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /mls/key-package on the room service

wai mls update

A GroupInfo, or a commit and its Welcome.

mls.update · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /mls/post on wai-room

wai mls update [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /mls/post on the room service

wai performance list

The clock's log of objects.

performance.list · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /co/objects on wai-room

wai performance list [--target <name|url>] [--query <name>=<value>]...   GET /co/objects on the room service

wai performance show

The room's co-performance as the clock holds it.

performance.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /co/state on wai-room

wai performance show [--target <name|url>] [--query <name>=<value>]...   GET /co/state on the room service

wai schedule create

A turn schedule the clock signs.

schedule.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /co/schedule on wai-room

wai schedule create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/schedule on the room service

wai handover create

A handover the clock signs.

handover.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /co/handover on wai-room

wai handover create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/handover on the room service

wai window create

A selection window the clock signs.

window.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /co/window on wai-room

wai window create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/window on the room service

wai fidelity create

A fidelity statement now.

fidelity.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /co/fidelity on wai-room

wai fidelity create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/fidelity on the room service

wai time show

The service's clock.

time.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /watch/time on wai-room

wai time show [--target <name|url>] [--query <name>=<value>]...   GET /watch/time on the room service

wai source fetch

The watch room's source, whole.

source.fetch · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /watch/source on wai-room

wai source fetch [--target <name|url>] [--query <name>=<value>]...   GET /watch/source on the room service

wai watch setup

A challenge for a join's proof.

watch.setup · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · GET /watch/challenge on wai-room

wai watch setup [--target <name|url>] [--query <name>=<value>]... [--yes]   GET /watch/challenge on the room service

wai watch tail

The watch room's log.

watch.tail · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /watch on wai-room

wai watch tail [--target <name|url>] [--query <name>=<value>]...   GET /watch on the room service

wai watch show

The room as a co-watch verifier is given it.

watch.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /watch/room on wai-room

wai watch show [--target <name|url>] [--query <name>=<value>]...   GET /watch/room on the room service

wai watch join

A viewer enters by a proof of its key.

watch.join · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /watch/join on wai-room

wai watch join [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /watch/join on the room service

wai watch update

A viewer's events, checked and carried in order.

watch.update · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /watch/post on wai-room

wai watch update [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /watch/post on the room service

wai control grant

The host hands control over.

control.grant · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /remote/control on wai-room

wai control grant [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /remote/control on the room service

wai remote show

The session as the clock holds it.

remote.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /remote/room on wai-room

wai remote show [--target <name|url>] [--query <name>=<value>]...   GET /remote/room on the room service

wai remote verify

That session verified.

remote.verify · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /remote/state on wai-room

wai remote verify [--target <name|url>] [--query <name>=<value>]...   GET /remote/state on the room service

wai conversation show

The conversation.

conversation.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /msg on wai-room

wai conversation show [--target <name|url>] [--query <name>=<value>]...   GET /msg on the room service

wai conversation setup

A challenge for a proof.

conversation.setup · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · GET /msg/challenge on wai-room

wai conversation setup [--target <name|url>] [--query <name>=<value>]... [--yes]   GET /msg/challenge on the room service

wai conversation join

A key that proves itself is admitted.

conversation.join · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /msg/join on wai-room

wai conversation join [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/join on the room service

wai conversation tail

The log as it is owed to the caller.

conversation.tail · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /msg/log on wai-room

wai conversation tail [--target <name|url>] [--query <name>=<value>]...   GET /msg/log on the room service

wai conversation import

A member's KeyPackage.

conversation.import · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /msg/key-package on wai-room

wai conversation import [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/key-package on the room service

wai conversation update

A GroupInfo, or a commit and its Welcome.

conversation.update · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /msg/mls on wai-room

wai conversation update [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/mls on the room service

wai message create

A message.

message.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /msg/post on wai-room

wai message create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/post on the room service

wai acknowledgement create

An acknowledgement.

acknowledgement.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /msg/ack on wai-room

wai acknowledgement create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/ack on the room service

wai conversation leave

The caller leaves.

conversation.leave · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /msg/leave on wai-room

wai conversation leave [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/leave on the room service

wai member delete

The owner removes a member.

member.delete · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /msg/remove on wai-room

wai member delete [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/remove on the room service

wai call setup

A challenge for a proof.

call.setup · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · GET /call/challenge on wai-room

wai call setup [--target <name|url>] [--query <name>=<value>]... [--yes]   GET /call/challenge on the room service

wai call create

Place a call.

call.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /call/place on wai-room

wai call create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /call/place on the room service

wai call invite

Ring invitees.

call.invite · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /call/ring on wai-room

wai call invite [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /call/ring on the room service

wai inbox show

The caller's inbox.

inbox.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /inbox on wai-room

wai inbox show [--target <name|url>] [--query <name>=<value>]...   GET /inbox on the room service

wai answer create

Accept, decline or cancel.

answer.create · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · POST /call/answer on wai-room

wai answer create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /call/answer on the room service

wai call show

The current call.

call.show · preview · since 0.3.0 · runs on a service, through its HTTP route · reads only · GET /call on wai-room

wai call show [--target <name|url>] [--query <name>=<value>]...   GET /call on the room service

wai contract create

A channel's share contract from its terms, signed with the operator key; each owner countersigns it.

contract.create · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature revenue_share

wai contract create <terms.json> --key <name|file> [--out F] [--yes]   the share contract (WRC1) of the terms, signed
    with the operator key, every countersignature still to come, written to F (<digest>.wrc); each owner adds
    its own with `wai contract accept`; replacing a file waits for --yes (--confirm, deprecated, is the same)
  • <terms>, path, required: The terms: start, end, currency, channel, channel_signer, rule, between, carriers, owners, splits and assets.
  • --key, string, required: The operator key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.
  • --out, path: The contract's file (<digest>.wrc).

wai contract accept

An owner's countersignature added to a share contract, after its rules and the operator's signature are checked.

contract.update · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature revenue_share · also wai contract update

wai contract accept <contract> --key <name|file> [--out F] [--yes]   the owner's countersignature added to the contract,
    written to F (the contract's own file when F is not given); replacing a file waits for --yes (--confirm,
    deprecated, is the same)
  • <contract>, path, required: The contract's file (WRC1).
  • --key, string, required: The owner key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.
  • --out, path: Where the countersigned contract goes (the contract's own file).

wai statement create

A party's revenue-share statement for a period, recomputed from the ledger's invoices and the channel's program-as-run, signed with the operator key.

statement.create · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature revenue_share

wai statement create <inputs.json> --party <key> --start µs --end µs --key <name|file> [--out F] [--yes]   the statement
    (WRS1) of the party for [start, end), computed from a verification document without its statement (the
    contract, other contracts, runs and ledger documents), signed with the operator key and written with its
    document to F (<digest>.wai-share.json) for `wai statement verify`; replacing a file waits for --yes
  • <inputs>, path, required: A verification document without its statement: contract, contracts, runs and ledgers.
  • --party, string, required: The party's key, 64 hexadecimal digits: the operator or an owner.
  • --start, integer, required: The period's start, microseconds since 1970.
  • --end, integer, required: The period's end, after its start.
  • --key, string, required: The operator key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.
  • --out, path: The verification document's file (<digest>.wai-share.json).

wai statement verify

A revenue-share statement's verification document checked: every line recomputed from the public records, or the reason it is refused.

statement.verify · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature revenue_share

wai statement verify <document.json>   the outcome of a statement's verification document: each line, each split's
    division and each impression's attribution, recomputed; exit 1 with the reason on a refusal
  • <document>, path, required: The verification document: contract, contracts, statement, runs and ledgers.

wai opportunity create

A party's opportunity report for a period: the ad breaks a channel's signed cues and program-as-run prove in the programmes it shares in, signed with the issuer key.

opportunity.create · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature opportunity_report

wai opportunity create <inputs.json> --party <key> --start µs --end µs --key <name|file> [--out F] [--yes]   the report
    (WOR1) of the party for [start, end), computed from a verification document without its report (the
    contract, other contracts, runs and rooms), signed with the issuer key and written with its document to F
    (<digest>.wai-opportunity.json) for `wai opportunity verify`; replacing a file waits for --yes
  • <inputs>, path, required: A verification document without its report: contract, contracts, runs and rooms.
  • --party, string, required: The party's key, 64 hexadecimal digits: the operator or an owner.
  • --start, integer, required: The period's start, microseconds since 1970.
  • --end, integer, required: The period's end, after its start.
  • --key, string, required: The issuer key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.
  • --out, path: The verification document's file (<digest>.wai-opportunity.json).

wai opportunity verify

An opportunity report's or a statement check's verification document checked: every break, line and flag recomputed from the records, or the reason it is refused.

opportunity.verify · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature opportunity_report

wai opportunity verify <document.json>   the outcome of a report's or a check's verification document: each break
    attributed, each line and flag recomputed; exit 1 with the reason on a refusal
  • <document>, path, required: The verification document: a report's (contract, contracts, report, runs, rooms) or a check's (report, reported, statement, check).

wai statement check

A platform's reported statement checked against an opportunity report and, when given, the operator's signed statement, signed with the issuer key.

statement.check · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · writes a signed record a verify operation checks · needs the build feature opportunity_report

wai statement check <report.json> <reported> [--statement <document.json>] [--floor ppm] [--ceiling ppm] --key <name|file> [--out F] [--yes]
    the check (WCK1) of a reported statement (JSON, or CSV for a file named .csv) beside a report's verification
    document and a signed statement's, at the bounds given (500000 and 2000000 when not), signed with the issuer
    key and written with its document to F (<digest>.wai-check.json); replacing a file waits for --yes
  • <report>, path, required: A report's verification document, with its report.
  • <reported>, path, required: The reported statement: JSON, or CSV for a file named .csv.
  • --statement, path: A signed revenue-share statement's verification document of the same party and period.
  • --floor, integer: The lower bound, in millionths of the period's rate (500000).
  • --ceiling, integer: The upper bound, in millionths of the period's rate (2000000).
  • --key, string, required: The issuer key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.
  • --out, path: The verification document's file (<digest>.wai-check.json).

wai key create

A new Ed25519 signing key kept under a name, for one role, its secret in macOS's keychain or in a seed file; every signing operation's --key takes the name.

key.create · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · needs the build feature quickstart

wai key create <name> --for <role> [--store keychain|file] [--keystore DIR]   a new signing key named <name>
    (1 to 48 of a-z, 0-9, - and _), for one role: origin, signer, room, audit, ledger, release, remote-host,
    quantum or dev. Its secret is kept in the login keychain (--store keychain, the default on macOS) or in a
    file of the keystore (--store file, the default elsewhere: mode 0600 on Unix; on Windows an access list for
    this account alone, inheritance off), and is never printed; a seed file another account may read is refused.
    The keystore is DIR, $WAI_KEYSTORE, or ~/.config/wai/keys (%APPDATA%\wai\keys on Windows). --key <name> signs
    with it
  • <name>, string, required: The key's name: 1 to 48 of a-z, 0-9, - and _, beginning with a letter or a digit.
  • --for (role), string, required: The key's role: origin, signer, room, audit, ledger, release, remote-host, quantum or dev.
  • --store, string: Where the secret is kept: keychain (the default on macOS) or file (the default elsewhere: mode 0600 on Unix; on Windows, an access list for this account alone).
  • --keystore, path: The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).

wai key list

Every key of the keystore: its name, role, key id, public key, status and where its secret is kept.

key.list · preview · since 0.5.0 · runs on this machine, touching nothing else · reads only · needs the build feature quickstart

wai key list [--for <role>] [--keystore DIR]   every key of the keystore, its newest version, and where its secret is kept
  • --for (role), string: Only the keys of this role.
  • --keystore, path: The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).

wai key show

One key: its public key and did:key, its role, every version with its status as a key log states it, and the version --key signs with.

key.show · preview · since 0.5.0 · runs on this machine, touching nothing else · reads only · needs the build feature quickstart

wai key show <name> [--keystore DIR]   one key's versions, each active, retired (until) or revoked (compromised since), as
    jwp-receipts §7.2's key log states them, and the one --key <name> signs with
  • <name>, string, required: The key's name.
  • --keystore, path: The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).

wai key rotate

A key's successor made under the same name and a new key id, the old version retired now and its secret destroyed.

key.rotate · preview · since 0.5.0 · runs on this machine, touching nothing else · removes or replaces what cannot be recovered · takes --dry-run · waits for --yes every time it changes something · needs the build feature quickstart

wai key rotate <name> [--store keychain|file] [--keystore DIR] [--yes]   a successor under a new key id (<name>.<n>),
    which --key <name> signs with from now; the old version is retired now and its secret destroyed (jwp-receipts
    §7.6), so it waits for --yes
  • <name>, string, required: The key's name.
  • --store, string: Where the successor's secret is kept (where the old one's was).
  • --keystore, path: The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).

wai key revoke

A key's version revoked as compromised from a time, its secret destroyed, so --key signs nothing with it.

key.revoke · preview · since 0.5.0 · runs on this machine, touching nothing else · removes or replaces what cannot be recovered · takes --dry-run · waits for --yes every time it changes something · needs the build feature quickstart

wai key revoke <name> [--id <key-id>] [--compromised-since <date-time>] [--keystore DIR] [--yes]   the key's newest
    version (or --id's) revoked, compromised since the time given (now; YYYY-MM-DDTHH:MM:SSZ), and its secret
    destroyed (jwp-receipts §7.6); it waits for --yes
  • <name>, string, required: The key's name.
  • --id, string: The version to revoke, by its key id (the newest).
  • --compromised-since (compromised_since), string: From when another party may have held it: a date-time in UTC, YYYY-MM-DDTHH:MM:SSZ (now).
  • --keystore, path: The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).

wai key import

A key file's seed kept under a name, as wai key create keeps a new one; a published test seed is refused unless named one.

key.import · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · needs the build feature quickstart

wai key import <name> --for <role> --from <file> [--store keychain|file] [--published-test-seed] [--keystore DIR]
    the seed of a key file (64 hexadecimal digits or the 32 bytes, as every --key file holds) kept as wai key create
    keeps one; a seed of one byte repeated 32 times, the form of every seed WAI publishes, is refused unless
    --published-test-seed names it a test key
  • <name>, string, required: The key's name.
  • --for (role), string, required: The key's role: origin, signer, room, audit, ledger, release, remote-host, quantum or dev.
  • --from, path, required: The key file: 64 hexadecimal digits, or the 32 bytes.
  • --store, string: Where the secret is kept: keychain (the default on macOS) or file.
  • --published-test-seed (published_test_seed), boolean: Keep a published test seed, marked as one.
  • --keystore, path: The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).

wai key export

A key's public half, never its secret: in hexadecimal, as a did:key, as key-log entries, or as the line wai-keys lists it by.

key.export · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · needs the build feature quickstart

wai key export <name> [--format hex|did-key|entry|wai-keys] [--may-sign <authority>,...] [--out F] [--keystore DIR]
    the public half alone: hex (the default), did-key, entry (each version as a key-log entry, jwp-receipts §7.2) or
    wai-keys (the newest as wai-keys init --key and append --add take it); entry and wai-keys name the authorities
    an origin gives it (--may-sign); to stdout, or to F (replacing a file waits for --yes)
  • <name>, string, required: The key's name.
  • --format, string: hex (the default), did-key, entry or wai-keys.
  • --may-sign (may_sign), string: With entry and wai-keys: the authorities an origin gives the key (jwp-receipts §7.5), comma-separated.
  • --out, path: Write it to this file.
  • --keystore, path: The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).

wai auth login

The key a service takes, read from standard input and kept for its origin in the keychain or a file only its owner reads.

credential.create · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · also wai credential create

wai auth login --url <URL> [--store keychain|file] [--yes]   the key for the service at URL, read from standard input
    (one line; never from the command line), kept for its origin: in the login keychain on macOS, else in a file of
    the configuration directory that only its owner reads; WAI_TOKEN, when set, is sent ahead of every kept key.
    A key goes over https://, or over http:// to this machine alone. Replacing an origin's key waits for --yes
  • --url, string, required: The service's http:// or https:// address; the key is kept for its origin.
  • --store, string: keychain (the default on macOS) or file (the default elsewhere).

wai auth status

The origins a key is kept for and where each is kept, never a key, and whether WAI_TOKEN is set.

credential.list · preview · since 0.5.0 · runs on this machine, touching nothing else · reads only · also wai credential list

wai auth status   each origin a key is kept for (wai auth login) and where it is kept, and whether WAI_TOKEN is set; no key is printed

wai auth logout

The key kept for a service's origin removed from the keychain or its file.

credential.delete · preview · since 0.5.0 · runs on this machine, touching nothing else · removes or replaces what cannot be recovered · takes --dry-run · waits for --yes every time it changes something · also wai credential delete

wai auth logout --url <URL> [--yes]   the key kept for URL's origin removed, from the keychain or its file; it waits for --yes
  • --url, string, required: The service's address; the key kept for its origin is removed.

wai target add

A target: a name for a service's address, kept in the project's wai.json or in the person's own list, and never with a key.

target.create · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file that exists · also wai target create

wai target add <name> --url <URL> [--read-only] [--user] [--yes]   kept in ./wai.json where there is one, else (or with
    --user) in the person's own list; --read-only refuses every operation that would change the service; a target is
    never kept with a key (wai auth login keeps it). Replacing a target of that name waits for --yes
  • <name>, string, required: The target's name: lowercase letters, digits and hyphens, beginning with a letter (local is the development room's).
  • --url, string, required: The service's http:// or https:// address, with no user, query or fragment.
  • --read-only (read_only), boolean: Refuse every operation that would change the service.
  • --user, boolean: Keep it in the person's own list, not the project's wai.json.

wai target use

The target an operation that needs a service acts on when --target names none.

target.update · preview · since 0.5.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · also wai target update

wai target use <name> | --none   the target taken where --target names none, kept in the person's own list; --none
    takes none
  • <name>, string: A target's name (wai target list).
  • --none, boolean: Take no target where none is named.

wai target list

Every target, its address, whether it is read-only, where it is kept and whether a key is kept for it; and the one in use.

target.list · preview · since 0.5.0 · runs on this machine, touching nothing else · reads only

wai target list   the project's targets (./wai.json) and the person's own, and the one in use

wai target remove

A target removed from the project's wai.json or the person's own list.

target.delete · preview · since 0.5.0 · runs on this machine, touching nothing else · removes or replaces what cannot be recovered · takes --dry-run · waits for --yes every time it changes something · also wai target delete

wai target remove <name> [--user] [--yes]   from ./wai.json where it is kept there, else (or with --user) from the
    person's own list; it waits for --yes
  • <name>, string, required: The target's name.
  • --user, boolean: Remove it from the person's own list.

wai ops list

Every operation of this catalogue: its id, command line, effect and whether this build holds it.

ops.list · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only

wai ops list   every operation, its id and command line

wai ops search

The operations that match a task, ranked, offline: up to five.

ops.search · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only

wai ops search "<task>"   up to five operations that match, ranked, offline
  • <task>, string, required: What you want to do, in words.

wai ops show

One operation's entry: its input and output schemas, effect, placement and command line.

ops.show · stable · since 0.3.0 · runs on this machine, touching nothing else · reads only · also wai ops schema

wai ops show <id>   one operation's entry, as JSON (also wai ops schema)
  • <id>, string, required: An operation id, noun.verb.

wai ops export

The catalogue as JSON (wai.ops/1), what other tools and CI read; --check compares a file with it.

ops.export · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name

wai ops export [--out FILE | --check FILE]   the catalogue as JSON, to stdout, to FILE, or compared with FILE
  • --out, path: Write the export here.
  • --check, path: Compare this file with the export; exit 1 when they differ.

wai --version

This wai's version, the digests of its catalogue and its registry, the release of the standard it implements, and the build features it holds.

toolchain.show · preview · since 0.5.0 · runs on this machine, touching nothing else · reads only · also wai version · also wai toolchain show

wai --version [--json]   this binary's version, the SHA-256 of its catalogue (wai/catalogue/ops.json) and of its
    registry (wai/registry/capabilities.json), the release of the standard it implements with the envelope formats
    it reads, and the build features it holds (also wai version; wai/VERSIONING.md says what each promises)

wai doctor

Whether this machine can run the toolchain: this wai and PATH, the relay and room service, the local stack's ports, browsers, and where keys are kept.

toolchain.doctor · preview · since 0.5.0 · runs on this machine, touching nothing else · reads only · also wai toolchain doctor · the MCP tool toolchain_doctor

wai doctor [--keystore DIR] [--json]   one check to a line: pass, FAIL with its fix, or not checked with the reason. Exit 1 when
    one failed; result says passed, failed, or passed-with-not-checked. No secret is read and no prompt raised (wai/quickstart/README.md)
  • --keystore, path: The keystore to look at (default: where wai key keeps keys).

Development (toolset dev)

wai dev

A relay, a room service and the room page on one origin on this machine, for development; --check starts, checks every piece and stops.

dev.start · stable · since 0.3.0 · runs on this machine, touching nothing else · runs something and writes only its own state · takes --dry-run · waits for --yes before it replaces a file the command line did not name · also wai dev start · the MCP tool dev_start

wai dev [--port P] [--dir D] [--site DIR] [--watch FILE [--watch-ms MS]] [--call] [--remote]
    [--show [--audience N]] [--messaging] [--e2ee] [--publishers N] [--check] [--for S] [--web DIR]
    [--relay BIN] [--room BIN]
  --port P         the origin's port on 127.0.0.1 (8080; 0 picks a free one)
  --dir D          keys, configuration and logs (.wai/dev)
  --site DIR       your page: DIR is served at /, the room client beside it at /room/
  --publishers N   places in the room (4)
  --watch FILE     a watch room: everyone in it watches FILE together (.wav, .webm, .mp4,
                   .ogg, .mp3); --watch-ms MS its duration, read from a WAV file's header
  --call           the room is a call: /room/call.html places one, rings, answers
  --remote         the room is one host's shared screen; prints the host's invitation
  --show           the room is a show: hosts on camera, an audience that votes in polls
                   the room's clock opens and signs (co-performance); --audience N each
                   viewer's inputs to a poll (1)
  --messaging      a conversation beside the room, at /msg-api/: /room/messages.html
  --e2ee           every room end-to-end encrypted
  --check          start, check every piece through the origin, report, stop
  --for S          stop after S seconds
  --web DIR        the room client's files (beside this binary: ../share/wai/web; $WAI_WEB)
  --relay BIN      wai-relay (beside this binary, then $PATH; $WAI_RELAY_BIN)
  --room BIN       wai-room (beside this binary, then $PATH; $WAI_ROOM_BIN)
  WAI Studio is served at /_wai/ when its files are found ($WAI_STUDIO, or share/wai/studio
  beside this binary).
  A wai.json in the current directory (`wai create` writes one) gives the defaults; a flag
  wins over it. Ctrl-C stops everything. With --json and without --check, the first line
  is {"ready": true, ...}.
  • --port, integer: The origin's port on 127.0.0.1 (8080; 0 picks a free one).
  • --dir, path: Keys, configuration and logs (.wai/dev).
  • --site, path: A directory served at /.
  • --watch, path: A file everyone in a watch room watches together.
  • --watch-ms (watch_ms), integer: The watch file's duration in milliseconds.
  • --call, boolean: The room is a call.
  • --remote, boolean: The room is one host's shared screen.
  • --show, boolean: The room is a show: hosts on camera, an audience that votes in polls.
  • --audience, integer: With --show, each viewer's inputs to a poll (1).
  • --messaging, boolean: A conversation beside the room.
  • --e2ee, boolean: Every room end-to-end encrypted.
  • --publishers, integer: Places in the room (4).
  • --check, boolean: Start, check every piece, report and stop.
  • --for (for_s), integer: Stop after this many seconds.
  • --web, path: The room client's files.
  • --relay, path: The relay's binary.
  • --room, path: The room service's binary.

wai room grant

A grant for a key.

room.grant · preview · since 0.3.0 · runs on a service, through its HTTP route · changes a target that is not this machine · takes --dry-run · waits for --yes every time it changes something · the MCP tool room_grant · POST /grant on wai-room

wai room grant [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /grant on the room service

Apps (toolset app)

wai app guide

The line language and every WAI widget, as a model writing a WAI app is told them.

app.guide · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature app · the MCP tool app_guide

wai app guide   what a model writing an app made with Create is told

wai app check

An app program checked against the WAI registry and WAI's rules, every error with its line and reason code; in a project, its room and runtime too.

app.check · preview · since 0.3.0 · runs on this machine, touching nothing else · reads only · needs the build feature app · the MCP tool app_check

wai app check [<dir> | <app.oui>]   exit 1 when something does not hold, each failure named
  • <program>, path: A project directory or a program (.).

wai app export

An app made with Create written as a project: the program, wai.json naming its room, the page and its runtime, a README, AGENTS.md and the licence.

app.export · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature app · the MCP tool app_export

wai app export <app.oui> <dir> [--runtime DIR]   the same as wai create <dir> --from <app.oui>
  • <program>, path, required: The program made with Create.
  • <dir>, path, required: A directory that does not exist or is empty.
  • --runtime, path: A Create runtime ($WAI_APP_RUNTIME, or share/wai/app beside wai).

Maintainers (toolset maintainer)

wai registry export

Write, or with --check compare, the registry's machine-readable export and the generated table of REGISTRY.md.

registry.export · stable · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name

wai registry export [--root <wai-dir>] [--check]   write (or compare) registry/capabilities.json, its
    schema, vocab/v2.* and the generated table of REGISTRY.md
  • --root, path: The wai/ directory.
  • --check, boolean: Compare, write nothing.

wai http vectors

The HTTP conformance corpus: generated, verified, or its differential and fuzz cases written.

corpus.generate · preview · since 0.3.0 · runs on this machine, touching nothing else · writes files on this machine · takes --dry-run · waits for --yes before it replaces a file the command line did not name · needs the build feature http · also wai corpus generate

wai http vectors gen|verify <http-conformance dir>
wai http vectors diff|fuzz <dir> --seed S --count N --out F
  • <mode>, string, required: gen, verify, diff or fuzz.
  • <dir>, path, required: The corpus directory.

Through the MCP server alone

wai mcp serves these as tools, beside every command above whose entry names a tool.

app_stream

A program streamed into the person's open Create page through the bridge wai mcp runs on loopback.

app.stream · preview · since 0.3.0 · runs on this machine, touching nothing else · runs something and writes only its own state · needs the build feature app · the MCP tool app_stream

  • program, string, required: The program's text.
  • chunk, integer: Characters a chunk (24).
  • pace_ms, integer: Milliseconds between chunks (30).

dev_stop

The development relay and room service a wai mcp server started, stopped.

dev.stop · stable · since 0.3.0 · runs on this machine, touching nothing else · runs something and writes only its own state · the MCP tool dev_stop

room_join

A test principal enters the development room with its grant, publishes its tracks, and is seen joined by the room's clock.

room.join · stable · since 0.3.0 · runs on this machine, against a service it names · changes a target that is not this machine · the MCP tool room_join

  • target, string: local: the development room on this machine.
  • principal, string, required: A test principal granted the publisher role.
  • objects, integer: Objects on each track (1).

room_leave

A test principal's session in the development room closed, and its leave seen by the room's clock.

room.leave · stable · since 0.3.0 · runs on this machine, against a service it names · changes a target that is not this machine · the MCP tool room_leave

  • target, string: local: the development room on this machine.
  • principal, string, required: The test principal's name.

session_show

The development room's session as a verifier is given it: descriptor, grants, key-log head and the clock's event chain.

session.show · stable · since 0.3.0 · runs on this machine, against a service it names · reads only · the MCP tool session_show

  • target, string: local: the development room on this machine.

On the room service

The room service (wai-room) answers these over HTTP. The room service and the relay describes each route, and the service's OpenAPI description names each by its operation.

RouteOperationWhat it does
GET /service.show, previewThe service's health.
GET /healthservice.check, previewThe service's health.
GET /roomroom.show, previewThe current room.
POST /grantroom.grant, preview; the MCP tool room_grantA grant for a key.
GET /age/receiptadmission.show, previewThe room's admission receipt so far.
GET /mlsmls.tail, previewThe room's log of MLS messages.
POST /mls/key-packagemls.import, previewA KeyPackage for a granted principal's Add.
POST /mls/postmls.update, previewA GroupInfo, or a commit and its Welcome.
GET /co/objectsperformance.list, previewThe clock's log of objects.
GET /co/stateperformance.show, previewThe room's co-performance as the clock holds it.
POST /co/scheduleschedule.create, previewA turn schedule the clock signs.
POST /co/handoverhandover.create, previewA handover the clock signs.
POST /co/windowwindow.create, previewA selection window the clock signs.
POST /co/fidelityfidelity.create, previewA fidelity statement now.
GET /watch/timetime.show, previewThe service's clock.
GET /watch/sourcesource.fetch, previewThe watch room's source, whole.
GET /watch/challengewatch.setup, previewA challenge for a join's proof.
GET /watchwatch.tail, previewThe watch room's log.
GET /watch/roomwatch.show, previewThe room as a co-watch verifier is given it.
POST /watch/joinwatch.join, previewA viewer enters by a proof of its key.
POST /watch/postwatch.update, previewA viewer's events, checked and carried in order.
POST /remote/controlcontrol.grant, previewThe host hands control over.
GET /remote/roomremote.show, previewThe session as the clock holds it.
GET /remote/stateremote.verify, previewThat session verified.
GET /msgconversation.show, previewThe conversation.
GET /msg/challengeconversation.setup, previewA challenge for a proof.
POST /msg/joinconversation.join, previewA key that proves itself is admitted.
GET /msg/logconversation.tail, previewThe log as it is owed to the caller.
POST /msg/key-packageconversation.import, previewA member's KeyPackage.
POST /msg/mlsconversation.update, previewA GroupInfo, or a commit and its Welcome.
POST /msg/postmessage.create, previewA message.
POST /msg/ackacknowledgement.create, previewAn acknowledgement.
POST /msg/leaveconversation.leave, previewThe caller leaves.
POST /msg/removemember.delete, previewThe owner removes a member.
GET /call/challengecall.setup, previewA challenge for a proof.
POST /call/placecall.create, previewPlace a call.
POST /call/ringcall.invite, previewRing invitees.
GET /inboxinbox.show, previewThe caller's inbox.
POST /call/answeranswer.create, previewAccept, decline or cancel.
GET /callcall.show, previewThe current call.