Whissle · Build a voice agent app

What changed

Every edition of the guide, what moved in it, and whether it means you have to change anything. Older editions stay readable at their own URLs — a link you shared still says what it said then.

v4

current2 September 2026read this version
@whissle/agents 0.7.0@whissle/sdk 0.4.0@whissle/cli 1.1.0

Since v3 (1 September 2026).

  • addedCards can now act: a policy-held tool (`action_policy: {"send_email": "approve"}`) ships Approve/Discard buttons on its result card as `ToolFinished.affordances`, fired with `agent.fireAffordance()` or by the ready-made widget — and every resolution, from any surface, comes back as one `affordance-resolved` event.Before 0.7.0 a sensitive tool either ran the moment the model called it or did not exist. Now the draft waits for the human in the conversation — and a card renderer needs exactly one code path whether the tap, a spoken “send it”, or the operator’s inbox resolved it.
  • addedOpt-in gesture input (`gestures: true` + `gestureAssetsUrl`): exactly three gestures, on-device, that fire the focused card’s affordances.A third modality for the same approval — nothing gesture-shaped runs, loads, or asks for a camera unless you turn it on, and no frame ever leaves the browser.
  • changedPackages verified against agents 0.7.0, sdk 0.4.0 (alerts, voices catalog, KB ingestion, key rotation) and cli 1.1.0 (actions inbox, alerts, voices, compliance).The 0.5.0/0.3.0/1.0.2 set the guide pinned is three releases behind what npm installs today; every snippet was re-verified against the new versions.
  • changedKey-type semantics, error-code tables and endpoint shapes now link to the API reference instead of restating it.Two homes for one fact drift independently and one of them is always eventually wrong. The guide keeps inline only what a reader needs mid-flow (the scope list, the /bot check); the reference owns the exhaustive surface.

v3

1 September 2026read this version
@whissle/agents 0.5.0@whissle/sdk 0.3.0@whissle/cli 1.0.2

Since v2 (15 August 2026).

  • fixedThe key-creation scope list now includes `sessions:write` and `billing:read`.A key minted from the old five-scope list could provision every agent and then fail at the one step that matters — the embed mint refuses a key without `sessions:write` (or `embed:mint`) with a 403, and `whissle usage` reads the wallet, which needs `billing:read`. Scopes are fixed at creation, so the miss costs a re-issued key.
  • fixedThe `error` snippet uses the real two-argument handler — `(msg, detail) => …` — and its codes are semantic strings (“no-credit”, “origin-not-allowed”, “expired”, “not-found”), not HTTP numbers.The one-argument snippet compiled and then read `undefined.code` at the worst time — inside the error path. The first argument stays the human sentence; the machine-readable detail arrives second, so existing handlers keep working.
  • fixed`tool-finished` carries `evidence`, not `citations`; `thinking` delivers `{ active, tool, label }`, not a bare boolean.Both snippets were written against field names that never shipped. Code copied from the guide showed no citations and a UI stuck on “thinking”.
  • changed`whoami` is shown as `whissle whoami --json`, with its verbatim payload (`ok`, `organization`, `role`).The prose command and the JSON reply it showed came from two different commands, so the first thing a reader checked against the guide disagreed with it.
  • fixedThe update-knowledge note names the real method: `kb.addSnippet`, not `kb.add`.`kb.add` does not exist on the agent KB resource — the note sent people to a method the SDK would reject.

v2

15 August 2026read this version
@whissle/agents 0.5.0@whissle/sdk 0.3.0@whissle/cli 1.0.2

Since v1 (12 August 2026).

  • addedA section on what the page can hear — tool-started / tool-progress / tool-finished with args, result and evidence, plus `thinking`, `agent-partial`, `agent-word` and `listening-started`.When an agent calls a tool it stops talking. Before 0.5.0 an embed went silent for however long the tool took, with no event to hang a UI on — and every caller reads silence as a hang.
  • added`sendText()` — type into a live call, or take a turn over HTTP without one.A visitor who cannot speak, or will not in an open-plan office, had no way to use a voice agent at all.
  • changedHistory now reads `sessions`, not `calls`.`calls` means “rows from the calls table” and structurally cannot see a text thread. Anyone building a text product was reading a fraction of their own history with no signal the rest existed.
  • added`sessions.trace(id)` — which provider and model actually answered a turn, and whether it failed over mid-turn.It is the only view in the product of what really served a conversation, which is the first question when a call goes strange.
  • changedErrors are typed and carry a code: 402 out of credit, 403 missing scope (named), 404 not found.The old guidance was one sentence — “check the key and the agent id” — for three unrelated failures with three different fixes.
  • fixedThe microphone is checked before connecting, with the fix in the message.A refused microphone used to bring the session up and then ignore the visitor for the entire call.
  • fixed`whissle` CLI links point at whissle.ai, not the retired platform.whissle.ai.That host answers 503, and the URL is persisted in ~/.whissle/config.json — so 1.0.2 migrates a stored one rather than only changing the default.

v1

12 August 2026read this version
@whissle/agents 0.4.0@whissle/sdk 0.2.0@whissle/cli 1.0.1
  • addedThe first public edition: provision agents from one JSON file, mint a session server-side, run a call with or without an avatar, read transcripts and scores.Everything before this was a private example nobody outside the team could run.
What changed between guide versions