Agentic Workforce ME Developer PortalDocs 1.21 · Widget 0.5.0 · API —

Help

Changelog

Widget and API release notes.

The hosted line /embed/v1/ receives compatible updates in place; entries below describe what changed. Breaking changes would ship as /embed/v2/ and be announced here at least one release ahead.

1.1 (planned) — Known gaps scheduled for the next widget release

TBD

  • Widget auto-recovery after a terminal setup error: today a widget that failed GET /config or the session mint (403 EMBED_ORIGIN_DENIED, 401 EMBED_KEY_DISABLED, network) stays in its offline state until the page is reloaded, even after the key or allowlist is fixed. v1.1 retries on the next open / send.
  • Public npm packages for @hive/embed and @hive/sdk (today: hosted bundle at /embed/v1/* and tarball / private registry).

1.21.0 — Approvals need a person for forced gates, tool grants document their capability policy, deployed versions in the header

2026-10-24

  • Approvals (/backend-approvals): in an organization workspace an item with requested_action.forced_gate (payments, code execution, browser actions, connector or HTTP API writes, untrusted external agents, high-risk agents, grant obligations) is approved only by someone signed in to the console — an API key gets 403 HUMAN_REQUIRED, though it may still reject it. A key decides as its owner, so it never approves its owner’s own runs while someone else can (403 APPROVAL_SELF_DECISION). Live since the roll of 24 October 2026.
  • Tool grants (POST /v1/tool-grants, REST reference): the body now documents the capability policy a grant carries — identity_mode (shared_connection | user | agent, with agent_federation_id for agent), max_access (read | write | destructive), approval (inherit | on_write | always) and expires_at — and the masar / browser_skill / http_api sources with their ids. Omitted policy fields keep today’s behaviour (shared_connection, destructive, inherit, no expiry). A shared-connection grant that allows writes needs tools:write; a grant that acts as the agent needs tools:write or identity:manage — a key acts as admin and holds both.
  • Header badge: next to the docs release and the widget bundle, the portal shows the deployed platform API version (read server-side from the API’s public GET /v1/meta/version, “—” when unknown).
  • Documentation only — the widget bundle, /embed/v1/ and every identifier are unchanged. Re-run setup-hive (no --rotate) after deploy so the docs assistant picks up the change.

1.20.0 — Voice: keep talking while it works — queued input, pause-not-cancel barge-in, hesitation-aware turns

2026-10-24

  • Voice WebSocket (/v1/embed/voice, /v1/voice/session; see the Voice section of the REST reference): new server frames sentence {run_id, index, chars} — sent before each sentence’s binary audio, chars = cumulative reply characters at its end — resumed {run_id} and interrupted {run_id, heard_chars?}; the client’s barge_in gains heard_chars? (the chars of the last sentence that fully played; absent on older clients, the server falls back to the last sentence it sent); turn.heard_chars says how much of a silenced reply was heard. Additive — a client that ignores the new frames keeps working.
  • Rule 1 — input while the agent THINKS is queued, never an interruption: each utterance (or typed text) is transcribed at once (utterance.committed + transcript), up to four wait (oldest dropped) and everything queued runs as ONE merged follow-up turn after the current reply. A spoken "cancel" there cancels the run in flight.
  • Rule 2 — talking over the agent PAUSES its voice, never its work: on barge_in the server holds the audio, transcribes the interruption and answers resumed for a short acknowledgment ("mm-hmm", "okay", "yes" and their Arabic equivalents) or "continue" — also after ~2.5 s of nothing — or interrupted {heard_chars} when the speech stops for good: "enough" / "stop" ⇒ the run finishes silently, no new turn; "cancel" / "never mind" ⇒ the run is cancelled; anything else ⇒ the run finishes silently and the words become the next turn. mute never cancels a run. The spoken commands match in English and Arabic.
  • Rule 3 — hesitation-aware turn ending: an utterance that trails off on a filler or connector ("and", "um", "focusing on", "such as" and their Arabic equivalents) is held up to 1.5 s (twice at most) for the rest before it is sent; typed text is never held.
  • Widget: inherits the model through @hive/voice-ui with no host change — the orb pauses on speech, shows "Paused — go on" while held and "Got it — I’ll answer that next" when a remark is queued (the kit’s own EN/AR captions, not config.strings).
  • Threads: an agent message whose spoken reply was silenced carries the voice_interrupted {heard_chars, at} message part (also written by POST /v1/runs/:id/voice/interrupted for the console’s live voice), so a transcript reader knows how much of it was actually heard.
  • Supersedes the "one running + one pending (latest wins)" model and its "still working — say that again in a moment" caption: nothing a person says is dropped in favour of a later remark any more.
  • Documentation and protocol frames only — the widget bundle path /embed/v1/ is unchanged. Re-run setup-hive (no --rotate) after deploy so the docs assistant picks up the change.

1.19.0 — People-only routes, reference drift fixes, 25 MB avatar models

2026-10-23

  • API keys & authentication (/backend-auth): some routes are for people only — changing a member’s role (making or demoting an owner included), custom roles, org-node roles and MFA answer 403 HUMAN_REQUIRED to an API key (and to support sessions); removing an owner answers 403 OWNER_REQUIRED (only an owner signed in to the console may); on a member’s private agent a key keeps admin governance reads and actions (manual runs and triggers included) but cannot open or post to its conversations (403 AGENT_PRIVATE). Live since the access-control roll of 23 October 2026.
  • Run events: tool.progress { idx, tool, data } — progress from a long-running built-in tool (today the prototype page builder: estimate, streamed page text, phase), flushed before the call’s tool.result, and listed among the events the widget never relays.
  • Error reference: VOICE_GLASSES_DISABLED and VOICE_PROTOTYPE_DISABLED (403, a fatal frame, then close 1008) answer a widget voice hello that asks for the glasses or prototype surface — only the console voice session grants those.
  • Talking avatars: a 3D model upload takes up to 25 MB (raised from 15 MB on 20 October 2026); a portrait photo stays at 5 MB.
  • MCP (/backend-mcp, error reference): a tenant may register a stdio server only when it is one bundled with the deployment — any other command answers 403 MCP_STDIO_NOT_ALLOWED; servers your backend hosts use http.
  • Channels: an agent can carry its own voice (manifest voice.tts, schema 2.17) for its spoken channel replies — honoured when its provider (default VOICE_PROVIDER) is the deployment’s configured speech provider and a model is known (its own or VOICE_TTS_MODEL); otherwise the platform voice speaks.
  • Documentation only — the widget bundle, /embed/v1/ and every identifier are unchanged. Re-run setup-hive (no --rotate) after deploy so the docs assistant picks up the change.

1.18.1 — Memory graph — typed entities, document graphs switch off cleanly

2026-10-23

  • Graph extraction (conversations and knowledge-base documents) types every entity from one vocabulary: person, contact, organization, team, role, product, service, system, policy, procedure, document, place, event, time, amount, topic, other — a fact’s subject or object the model did not list takes the model’s subject_type / object_type, else a type read from its name, instead of unknown; a guessed type yields to a type the model states later. GET /v1/memory/graph/stats by_type reads accordingly.
  • GET /v1/memory/graph/stats with view=agent: episodes and last_extracted_at include the extractions of the agent’s knowledge bases.
  • Knowledge bases: turning graph_extraction off (PATCH /v1/knowledge-bases/:id) also removes the entities and facts extracted from that knowledge base (audited kb.graph.update with the counts); documents and search are unaffected.

1.18.0 — Talking avatars, skill drafts, hyphenated workflow placeholders

2026-10-16

  • New page "Talking avatars" (/avatars). An agent’s face is a presentation attribute of the agent row (agents.avatar), never a manifest field, so saving it does not publish a new version. Three modes: 2d (parametric look), 3d (uploaded .glb / .vrm, ≤ 15 MB) and photo (a stored portrait animated from five face points, consent required). PATCH /v1/agents/:id sets mode, look, framing and photo points; null removes the face and both files. POST /v1/agents/:id/avatar/from-photo returns a look to preview and stores nothing (422 AVATAR_NO_FACE, usage avatar_vision_call). POST /v1/agents/:id/avatar/model and POST …/avatar/photo store the bytes (201); member GETs serve them; admin DELETEs remove them.
  • On the widget the face is off until the embed key’s config.avatar.enabled is true (size: compact in the header, or stage in ::part(avatar-stage)). GET /v1/embed/config returns agent.avatar only then. REST reference gains GET /v1/embed/avatar/model and GET /v1/embed/avatar/photo (publishable key + origin, 6/min per IP shared, private, max-age=86400). The widget lazy-loads hive-embed-avatar.js, and hive-embed-avatar3d.js for a 3D face. This is separate from the 0.2.2 static theme.avatar image. The mouth follows voice audio while a voice session is live, and the streamed text otherwise.
  • Skills (6 October 2026): PATCH /v1/skills/:id edits a row in place; kind and body are accepted only while that row is a draft (409 VERSION_IMMUTABLE on a published body). PUT /v1/skills/:id still mints the next version — status: "draft" parks it, status: "active" publishes it and archives the slug’s current active version, and expected_version answers 409 VERSION_CONFLICT when a newer version landed first. GET /v1/skills?slug= lists one skill’s versions; ?status=active is one row per slug.
  • Workflow templates expand {{outputs.<node-id>.text}} when the node id contains a hyphen (the designer’s agent-1 ids). A missing path still expands to an empty string.
  • Memory graph (23 October 2026): GET /v1/memory/graph/neighborhood and /entities take view=agent (with agent_id: what that agent can recall, plus the graphs of the knowledge bases its manifest uses), include_contacts and types (comma-separated entity types); a read naming a private agent is 404 for members other than its creator. New GET /v1/memory/graph/stats (counts by type and scope, last extraction, the agent’s published learning switches with include_learning=true, and the backfill job’s state) and admin POST /v1/memory/graph/backfill (build an agent’s graph from up to 50 recent live conversations; 409 NOT_PUBLISHED | GRAPH_DISABLED | BACKFILL_IN_PROGRESS). Graph rows gain scope kb with kb_id (mentions: document_id): facts extracted from knowledge-base documents when the organization’s allow_kb_graph and the KB’s graph_extraction are both on — shown in the console, never recalled into an agent’s prompt; POST /v1/knowledge-bases/:id/graph/rebuild (admin) re-extracts up to 200 ready documents.
  • Documentation only for the widget bundle line: /embed/v1/ is unchanged. Re-run setup-hive (no --rotate) after deploy so the docs assistant picks up /avatars.

1.17.0 — Console follow-ups — the detailed Observability Overview, one door per list, Workspace paging

2026-10-04

  • Console (both variants, EN + AR): the Observability Overview is now the detailed operational dashboard — six sections top to bottom (Health & attention · Trends for the bar's window · Breakdowns by agent and channel · Ledgers all-time · Platform trends · Quality signals), charts and stats only, no hidden "System" disclosure; the Improve group overview is the lighter summary (runs · success · cost · tokens, two charts) that points at it. Every hub view gained the columns its job needs (Runs: Duration and the workflow sub-line; Approvals: "raised … / decided by …"; Audit: actor and target chips; Usage: Cost by kind and By model; Quality: a 2 × 2 chart row; Channels: Failed and Last message; Agents: Last run, In flight, Avg cost / run) and wide tables drop low-priority columns on narrower frames instead of scrolling sideways. Explanatory strips render above the lists they explain, every list has exactly one create door (empty states are text-only), Knowledge reads header → Documents → Knowledge sources → Test search ‖ Used by agents, and the Skills search placeholder is just "Search skills".
  • Workspace: the chat rail pages with a keyset cursor — "Load older chats" at the end of the list, an end marker when there are no more; the header search button is gone (⌘K / Ctrl-K still opens the palette).
  • API (additive, member-safe, same transaction and cache): GET /v1/observability/overview gains kpis.runs.failed_series, kpis.latency_series, kpis.approvals { raised, by_status, series }, by_agent[].last_run_at, by_channel[].failed / last_message_at and a quality block (eval runs per bucket with pass rate; guardrail facets for admins only). GET /v1/usage/summary gains by_kind and by_model.

1.16.0 — Console UX pass — group overviews, charts-first Observability, tidier hubs

2026-10-03

  • Console (both variants, EN + AR): the navigation groups now read Home · Build · Operate · Improve · Quality · Governance · Admin, and every group lands on an Overview — KPI tiles, charts and links, no lists. Observability's Overview is charts-only; "Needs attention" and "Activity" are their own views (the health pill opens Attention). The Integration Hub keeps its expert tabs inside an "Advanced" view (?advanced=<tab> still lands), the Knowledge view moved to /knowledge (?tab=knowledge redirects), grids are aligned, and templates live inside the create flows (Evals "New suite" step 1); Contacts, Organization and Memory open their add forms as dialogs. Skills and Knowledge gained list toolbars.
  • API: GET /v1/console/overview?group=build|operate|improve|quality|governance|admin — one member-safe read per group (admin-only sections answer null); cost and tokens follow the house usage rule (kind = run cost, tokens_in / tokens_out quantities) so Improve, Observability and Usage agree. Approvals: multi-approver rows now carry decided_by_me (list, single read and the decision response) so a four-eyes card can state "1 of 2 approvals — awaiting a second approver" and hide the buttons from an approver who already decided.
  • Browser Skills follow-ups from the first production day: Recorder typing is delivered in order at any latency (keys queued behind an in-flight request go as one text insert — passwords stay masked), and the reject card localises the "no reason given" fallback in Arabic.

1.15.0 — Browser Skills — taught web actions under human approval

2026-10-03

  • Browser Skills (console release of 3 October 2026, admin only): "Teach a browser action" on an agent's page (or Build → Integrations → Automation → "Browser action — taught") opens the Recorder in Action mode on a web system you own — sign in (the username and password are detected as a step and stored encrypted), do the action once, bind the values that change into typed parameters, mark the step that submits, add checks, pick the result fields, save with the ownership attestation and a per-skill approval policy (always_before_run · at_commit_point · dry_run_only · none_for_idempotent_reads, with risk level, approver role, SLA and required_approvals up to 3 — four-eyes at 2), then grant it to an agent. Agents call browser_skill:<slug>.run / .dry_run; replay is deterministic on the sandboxed browser, the model never sees a credential, and the approval card shows the pre-commit screenshot, the bound values and the landed URL before anything is submitted. New page: /backend-browser-skills.
  • API: /v1/browser-skills/* (list · create · get · patch · delete · :id/dry-run · runs incl. ?agent_run_id= · grants · artifact proxy); POST /v1/approvals/:id/decision refuses edit with 422 APPROVAL_EDIT_FORBIDDEN unless the skill allows edited parameters; the skill's policy terms tighten the approval row (risk, approver role, SLA, required approvals). Problem codes BROWSER_SKILL_NOT_FOUND | INVALID | ATTESTATION_REQUIRED | UNAVAILABLE | RUN_FAILED; audit browser_skill.*; usage kind browser_skill_run. Schema: browser_skills, browser_skill_runs (migrations 0161 + 0162, RLS). Console: JSON responses through the console's /v1 proxy are now gzip/brotli-compressed; streams are untouched.

1.14.0 — The Observability Hub

2026-10-03

  • Observability Hub (console release of 3 October 2026): Improve → Observability becomes one entry point for every signal — a shared filter bar (24h / 7d / 30d or custom dates · agent · workflow · channel · status · "Find by id" for a run, thread, approval, conversation or case id) that persists across eight views: Overview (KPI tiles with sparklines, "Needs attention" ranked worst first, one merged Activity timeline), Runs, Approvals, Audit, Usage, Quality, Channels and Agents. The former counters, trends, notifications and ledgers live under "System counters, trends & ledgers". Run pages open with a summary strip (status · agent · origin · duration · tokens · cost · error · who approved what · Evidence links). Every existing route keeps working and the pages now honour their deep links (/runs?status=failed, /approvals?status=&run_id=, /usage?from=&to=, /audit?from=&to=).
  • API: GET /v1/observability/overview (windowed KPIs, attention, activity, per-agent and per-channel health — observability:read, member visibility applied, 20 s cache) and GET /v1/observability/find?id=; GET /v1/runs accepts from / to; GET /v1/approvals items carry decided_by_name. No schema change.

1.13.0 — Masar Recorder — teach by example; grounded citations; sorted queries

2026-10-02

  • Masar Recorder (console release of 2 October 2026, admin only): "Teach by example" on the Masar wizard opens a sandboxed browser in the console — browse (and sign in to) a system you own, switch to Select, pick fields, select all similar rows, mark the pager, test the draft live on another page and save it as an ordinary Masar source. The routes are /v1/masar/recorder/sessions/* on the /backend-masar page (start · SSE stream of frames · input · inspect · highlight · pick · similar · test-extract · save · stop); saving requires the terms attestation and an ownership attestation; a stored session or sign-in credentials are AES-256-GCM at rest and never returned by any route. Replay happens only inside the governed refresh crawl (bounded steps, same SSRF and scope checks per page). Caps: 2 sessions per tenant, 4 per process, 10 minutes idle, 45 minutes maximum; 503 MASAR_RECORDER_UNAVAILABLE when no browser sandbox is configured.
  • Grounded citations: an agent turn that cites masar:<slug>#<version>/<row> is checked against the Masar tool results actually received in that turn. Verified answers carry the "Masar citations verified n/n" marker in the Workspace; an ungrounded cite is annotated in the answer and audited as masar.cite.ungrounded.
  • masar:<slug>.query accepts sort: { field, dir } (nulls last) over the latest snapshot and says so in its description; a truncated result states how many of the total rows were returned so the agent does not report an aggregate over a partial page as the whole.

1.12.0 — The Integration Hub

2026-10-02

  • Integration Hub (console release of 2 October 2026): the Integrations page gains an "All integrations" landing list across every type — type badge, one status vocabulary (Connected · Not checked yet · Needs credentials · Credentials rejected · Broken · Disabled · Awaiting first event), last activity, Check now / Test where the type has a probe, Open — and ONE "Add integration" door: a chooser grouped by purpose (Tools & data · Agents elsewhere · Channels · Automation · Knowledge) whose cards say what you will need and launch each type's existing setup (Connect a system, Masar, Foundry, external agent, channel wizard, or the trigger / webhook / knowledge form opened on arrival via ?new=1). Six views replace the seven tabs; every old ?tab= deep link still resolves (connectors / masar → Tools & data, external-agents / foundry → Agents elsewhere). External agents gain a standard-console surface. /tools?add=<type> deep-links a type's setup. No API change.

1.11.0 — Masar: any website as a structured source

2026-10-01

  • New page under Backend integration: "Masar: any website as a structured source" (/backend-masar). Masar turns any website into a structured, queryable source for your agents without an API: a source definition (entry URLs and scope, ordered extractors — dom, network, readability, pdf, vlm, ocr — a JSON Schema you own, key fields, a cron schedule at least 15 minutes apart, politeness and vision caps, a terms attestation), POST /v1/masar/discover and POST /v1/masar/test-extract to see what a page really loads and preview records with per-field provenance before saving, sources CRUD under /v1/masar/sources, POST …/refresh (202 with the queued run; 409 MASAR_RUN_IN_PROGRESS), runs, versioned snapshots with provenance and a diff between any two versions, screenshot artifacts and the domain-neutral starter templates. The MASAR_* error codes, the masar.* audit actions and the masar_page / masar_vlm_call usage kinds are listed. Documentation only — the widget bundle, /embed/v1/ and every identifier are unchanged; re-run setup-hive (no --rotate) after deploy so the knowledge base picks up the new document.
  • Agents consume a source through three generated tools — masar:<slug>.query (typed filters over the latest snapshot, every record cited as masar:<slug>#<version>/<row>, stale past the source’s max age), masar:<slug>.latest (what changed, how old) and masar:<slug>.refresh (enqueues a crawl; always requires a human approval, not relaxable) — declared as manifest tools.masar[] and granted by POST /v1/integrations/attach with connector.kind = "masar" or POST /v1/tool-grants with source: masar + masar_source_id. Posture stated on the page: robots.txt honoured and not switchable, identified crawler, politeness limits, every URL through the SSRF policy, no challenge or paywall bypass, null with a reason instead of a guess. The page closes with six shapes served by one engine — a central-bank exchange-rate table, a JavaScript search page read from its own JSON request, a news list, a publication page with its PDF, a photographed notice read by OCR / a vision model, and a public procurement board — to make "any website" concrete. Honest status: implemented and verified locally on 1 October 2026; authenticated sites, navigation actions, change webhooks and a knowledge-base feed are roadmap (Next).

1.10.0 — Azure AI Foundry project connection

2026-09-29

  • New page under Backend integration: "Connect your Azure AI Foundry project" (/backend-foundry) — the project-level /v1/foundry/* surface that complements registering one Foundry agent as an external agent. Connections CRUD (POST /v1/foundry/connections, write-only Entra client credentials, project_endpoint pinned to https://*.services.ai.azure.com/api/projects/*, …/test), inventory and inspect (GET …/agents, GET …/agents/:name, classic …/threads / …/runs), native …/invoke on both Foundry API generations, …/link into the external-agents registry, …/import and offline POST /v1/foundry/import-definition to a draft agent with a fidelity report, and POST …/:id/publish with dry_run. Request / response shapes from the API’s Zod schemas, the FOUNDRY_* error codes, the required Entra role (Foundry User, not the invoke-only Foundry Agent Consumer) and a "connect your Foundry project" quickstart.
  • Status is stated on the page and in the docs assistant’s knowledge base: the surface was verified live once on 29 Sep 2026 against a Foundry project — inventory, inspect, invoke, import-to-draft and publish (prompt agents only; hosted/container agents not supported); vector stores, Toolboxes and evals are referenced, not copied, and kb.search is omitted on publish until a vector store is bound. Two first-contact facts are documented: the agent-endpoint Responses route needs no Foundry-Features header, and re-publishing an existing name is a Foundry 409 that POST /agents/{name}/versions deduplicates (the existing version comes back for an identical definition). The page closes with the cheapest Foundry configuration to demo against (Microsoft list prices, 29 Sep 2026). Documentation only — the widget bundle, /embed/v1/ and every identifier are unchanged; re-run setup-hive (no --rotate) after deploy so the knowledge base picks up the new document.

1.9.0 — Docs assistant covers the whole portal

2026-09-26

  • The playground docs assistant ("Ask me") now answers from every portal area, not only the embed SDK: its knowledge base grows from 11 to 19 documents — backend integration (API keys and X-Tenant-Id, runs and SSE, triggers and workflows incl. BPMN import, MCP servers your backend hosts, outbound webhooks and Hive-Signature, approvals, provisioning as code), the reference implementation, external agents in both directions (registering Foundry / Copilot Studio / Claude / watsonx / OpenAI / Bedrock / any A2A agent; exposing platform agents over A2A and as MCP tools at POST /v1/mcp), the platform API and SDKs, and the examples / support pages. A coverage guard (test/kb-coverage.test.ts) pins every nav page to a document that names its route.
  • The assistant persona (content/assistant.ts) is one module shared by scripts/setup-hive.ts and the playground: a wider scope statement, a greeting that names the new areas, and six starter questions — one per portal area — published as the agent manifest's identity.starter_questions (≤ 6 items of ≤ 200 chars). The grounding rules now cover runs, workflows, external agents, A2A, memory, connectors, channels and provisioning, tell the widget-vs-backend readings of "webhooks" and "MCP" apart, and call anything the docs label "Next" / "roadmap" out as not available today.
  • Playground: the starter questions render as suggestion chips in the widget's suggestions slot (light-DOM children of <hive-chat>, styled by the page; a tap sends the question) — the same pattern a host page uses. Documentation and playground only: the hosted bundle line, /embed/v1/, every identifier and the publishable key are unchanged. Re-run setup-hive (no --rotate) after deploy so the knowledge base and the agent version pick this up.

1.7.0 — BPMN 2.0 import

2026-09-17

  • REST reference gains POST /v1/workflows/import/bpmn (Triggers & workflows): import a BPMN 2.0 diagram exported from Camunda Modeler / bpmn.io, Camunda 7, Signavio, Bizagi or Visio into a NEW draft workflow. JSON (xml) or multipart/form-data (file + optional body), 2 MiB cap, <!DOCTYPE refused before parsing. dry_run: true returns { draft, report, preview } without persisting anything; commit returns 201 { workflow, version, report } and never publishes.
  • The import report lists every BPMN element with its mapping (mapped / approximated / placeholder / dropped / unsupported), a confidence and { code, params } notes + fix-it hints, the bindings required (agent-like tasks and parallel branches → your published agents; callActivity → a published workflow), every translated guard (FEEL / JUEL / JavaScript single comparisons; anything else becomes an obviously named never-true placeholder), trigger suggestions (message start → webhook, timer cycle → cron; created DISABLED only with create_triggers: true), lanes and layout. Commit without bindings answers 422 INVALID_GRAPH { unbound[] }.
  • Optional enrich: true (default off) makes one model call over element names, documentation, engine hints and lanes — never the XML — and attaches binding / department suggestions post-filtered to the tenant’s published agents and org nodes; nothing is applied without a client action and a model failure leaves report.enrichment.status = "unavailable" with the request still succeeding.
  • Workflow graphs gain an optional, additive meta on nodes (bpmn_id, name, description, lane, position, hints) and edges (bpmn_id). The runtime ignores it; the designer now persists node positions in meta.position for every workflow. Existing graphs validate unchanged. Error table gains 422 BPMN_PARSE_ERROR, 422 BPMN_NO_PROCESS, 413/422 BPMN_TOO_LARGE and documents INVALID_GRAPH.
  • Widget bundle 0.5.0: the hands-free voice composer (1.6.0) had shipped under the unchanged package version 0.4.1, so browsers holding the hour-long cached hive-embed.js kept the pre-voice widget. HiveChat.version now reports 0.5.0; host pages that pin the loader URL should move their cache-buster to hive-embed.js?v=0.5.0. The hosted path /embed/v1/ and every identifier are unchanged.

1.6.0 — Hands-free voice on the widget and in the console

2026-09-17

  • Voice on the widget: voice: { handsfree, ptt } on the embed key (config.voice, both default false) and as a host option (tighten-only). GET /v1/embed/config returns the EFFECTIVE flags (deployment ∧ tenant allow_voice_handsfree ∧ agent manifest voice ∧ key); the mic renders only when one is true.
  • REST reference gains POST /v1/embed/voice/ticket (single-use 60 s ticket, bearer session) and the GET /v1/embed/voice?ticket= WebSocket (JSON control frames + 20 ms PCM16 16 kHz binary frames up; ready / state / utterance.committed / transcript / turn.started / agent.delta / audio_start + audio / replace / interrupted / turn / error down). Runs execute on the worker like every embed message; deltas are withheld under output guardrails exactly like the SSE relay. New error codes: 403 VOICE_DISABLED, 403 VOICE_HANDSFREE_DISABLED, 401 VOICE_TICKET_USED, 429 VOICE_BUSY, 429 VOICE_RATE (non-fatal per-utterance budget / fatal uplink flood), 400 VOICE_SESSION_PROTOCOL.
  • Hosted bundle line gains hive-embed-voice.js — the orb, captions and controls, loaded lazily on the first mic tap so the core widget stays under its 30 KB budget. Host events: hive:voice { state, transcript? }; hive:status gains listening / thinking / speaking.
  • Agent manifest 2.11: the voice block (handsfree.enabled default false, handsfree.barge_in, handsfree.eagerness patient|normal|eager, handsfree.max_session_sec, ptt default true). Spoken turns meter voice_stt (ms) and voice_tts (characters) on usage events.

1.5.0 — Memory graph, attachments, voice replies, identity and memory

2026-09-16

  • New page "Memory & the memory graph" (Backend integration): scope-explicit long-term memory (tenant / agent / end_user; a run never sees another contact’s rows, memory.save defaults to the served contact’s scope, long_term.user_modeling is a no-op), the temporal knowledge graph (typed entities, dated facts with valid_from / valid_to, episodes with a digest and never a transcript), contradiction ⇒ invalidate-never-delete and same-triple supersession, the run-time prompt block and the read-only builtins memory.graph_search / memory.graph_explain, the memory.graph manifest block (schema 2.10, tighten-only, every field), human authoring and the DSAR / retention coverage (GET /v1/tenants/current/export carries memory_graph, POST /v1/end-users/:id/erase removes the contact’s graph).
  • REST reference gains the twelve /v1/memory/graph/* endpoints (entities, entity detail with timeline and possible duplicates, neighborhood, search returning the exact prompt block, edge with provenance, episode, assert fact, patch edge, patch entity, merge, forget edge / entity) with request, response, audit action and errors; the error table gains 409 SCOPE_MISMATCH, 409 ENTITY_NAME_TAKEN and 503 UNAVAILABLE (embedding gateway not configured). Drift guards pin every route, body and query field to the platform’s Zod schemas and the manifest fields to graphMemorySchema.
  • Runs: POST /v1/threads/:id/attachments is documented — PNG, JPEG, WebP, PDF ≤ 20 MB, metadata-only response with the PDF’s total page_count (415 UNSUPPORTED_TYPE, 413 FILE_TOO_LARGE) — together with the vision caption contract: every image the model receives is preceded by Attachment <n>: <filename> (<mime>, page <p> of <total>), recorded on the llm step under input.vision.
  • Approvals: requested_action.reasoning_summary is never empty — the model’s words when it wrote any, otherwise a deterministic sentence naming the tool and its argument names (never values).
  • Channels: WhatsApp media in (voice notes transcribed, images and PDFs as vision attachments — on the linked-device path too) and opt-in spoken replies out (voice_replies: true in the channel config; push-to-talk notes when the output is Opus, text fallback recorded as voice_fallback), plus the platform voice settings (VOICE_PROVIDER openai_compatible | elevenlabs, models, voice id, VOICE_LANGUAGE_CODE, VOICE_TTS_OUTPUT_FORMAT).
  • Authentication & security: "What identity buys you" — a signed identity JWT maps the visitor to one contact, so long-term memory and the memory graph are per person and never shared; the same contact is what an erase request wipes. Documentation-only release for the widget: the hosted bundle line stays /embed/v1/. Re-run the docs assistant setup-hive.ts after deploy so the knowledge base picks up the new pages.

1.4.0 — Widget 0.4: native charts and synchronized results

2026-09-14

  • The chat plugin now renders schema-validated bar, line, pie and KPI results directly inside the transcript with fixed safe markup. Chart-shaped json fences and full-message chart JSON are accepted as model-tolerance fallbacks, while malformed specifications remain escaped code.
  • blocks.render now accepts inline, host, or both; both keeps the inline chart and emits hive:block so a host dashboard can render the same validated result. Streaming source is suppressed and history restores the visual without replaying host side effects.
  • Bundle version 0.5.0; the hosted URL remains /embed/v1/.

1.3.2 — Widget 0.2.2: phone sheet ergonomics, slots, avatar

2026-09-06

  • On a phone (≤ 480 px, launcher mode) the open panel is now a real bottom sheet: it is sized from window.visualViewport so the composer stays above the on-screen keyboard on iOS Safari and Android Chrome (resizes-visual), the page behind it is locked (no rubber-band, no URL-bar jump; scroll position restored on close), aria-modal="true" while full-screen, the dialog — not the textarea — takes focus on open (no surprise keyboard), a grab handle (::part(handle)) with swipe-down-to-close, 44 px tap targets and safe-area-inset-bottom padding. Desktop, tablet and inline mode are unchanged.
  • Named slots notice and suggestions: light-DOM children of <hive-chat> with a matching slot attribute render between the transcript and the composer, styled by the host page. Empty by default.
  • New theme field avatar (server-side on the key or local theme.avatar): an https:// URL or same-origin path drawn as the header avatar image instead of the letter/emoji chip. data: and protocol-relative values are dropped. Bundle version 0.5.0; the hosted line stays /embed/v1/.

1.3.1 — Widget 0.2.1: styleable error/status rows, copy overrides, retry_after

2026-09-06

  • The widget’s failed-turn row (and the offline notice) is now part="error" with the problem code in data-code, and the in-flight row is part="status" (data-status: sending | working | waiting) — a host page that renders its own error copy can hide or restyle the widget’s (hive-chat::part(error) { display: none }). Before 0.2.1 the shadow DOM exposed no part for either row.
  • Visitor-facing copy no longer includes the raw problem code: 0.2 appended "(RATE_LIMITED)" to the generic error text; 0.2.1 shows only the copy and keeps the code in data-code / hive:error.
  • New strings option ({ en?, ar? }, programmatic only; React strings prop): per-locale overrides for error, retry, offline, waiting, sending, working and the widget labels. Unset keys keep the built-in text — hosts that pass nothing see exactly the 0.2 copy (tested).
  • hive:error detail gains retry_after (seconds) when the API problem carried it — today 429 RATE_LIMITED — so a host can show a real countdown; undefined for every other failure. React onError receives the same object. ESM build exports resolveStrings. Bundle version 0.5.0; the hosted line stays /embed/v1/, no server changes.

1.3.0 — Widget 0.2: host-rendered blocks and conversation status

2026-09-06

  • New blocks option ({ languages, render: 'host', placeholder? }, programmatic only): a fenced code block in an agent reply whose language is listed is removed from the bubble — a "Shown on the page ↗" chip (::part(block-chip)) takes its place — and reaches your page as a hive:block event ({ lang, source, index, message_id }, one per fence, in document order) once the message is final. Listed fences are suppressed while the reply streams; a restored thread lifts the fence but fires no event; unlisted languages still render as code. source is untrusted model text — parse and validate it, never inject it as HTML.
  • New hive:status event ({ status: idle | sending | streaming | waiting | error }) on every conversation-state transition, idle right after hive:ready, so a host composer can disable itself while a turn is in flight instead of hitting 409 EMBED_RUN_IN_FLIGHT.
  • Behaviour change for 0.1 hosts: a run.failed stream event now also fires hive:error with the run’s problem code (MODEL_ERROR, BUDGET_EXCEEDED, RETRIES_EXHAUSTED, TOOL_ERROR, …) — previously such failures only showed in the bubble. Existing onError / hive:error handlers therefore see more events; the bubble copy is unchanged and BUDGET_EXCEEDED still puts the widget in the resting state.
  • React wrapper: blocks prop plus onBlock and onStatus callbacks. ESM build exports liftFences (the widget’s fence parser) and resolveBlocks. Bundle version 0.2.0; the hosted line stays /embed/v1/, no server changes.

1.2.3 — Bearer mode documented: basePath, authToken, binding, setAuthToken()

2026-09-04

  • Configuration reference gains the three HiveChatOptions the widget accepted without documentation: basePath (attribute base-path; the API path under apiUrl, default /v1/embed), authToken (auth-token; a pre-issued bearer — no session mint, Authorization: Bearer on every request, key optional, a 401 pauses the widget with hive:auth-expired until the host supplies a new token) and binding (binding; names the declared agent, sent as ?binding= on the config read and in every message). None has a loader data-* form. A new "Bearer mode" section states plainly that these exist for platform surfaces mounting the embed protocol elsewhere (today the prototype agent bridge) and that embedding on your own site keeps key + user.token.
  • JavaScript API reference: setAuthToken(token) on the handle and on <hive-chat> (swap the bearer in place, resume a paused widget, hive:auth-resumed); update() lists basePath / binding among the options that re-mint and a new authToken as a token swap; init() reuse keyed by basePath + binding when there is no key.
  • Events reference gains the two bearer-mode DOM events hive:auth-expired ({ code } — the pre-issued token was refused with a 401; sends pause until setAuthToken()) and hive:auth-resumed (a replacement token resumed the paused widget, same thread). The React wrapper @hive/embed/react maps them to the new onAuthExpired / onAuthResumed callback props (listed on the React page next to onError); the events drift guard now enforces hyphenated hive:* names, so every event the element emits must carry a documented React prop.
  • Error reference: the drift guard now reads every apps/api/src/routes/embed*.ts and apps/api/src/lib/embed-*.ts file — EMBED_RUN_IN_FLIGHT, EMBED_THREAD_FULL, EMBED_TOO_MANY_STREAMS and AGENT_NOT_PUBLISHED moved into the shared embed-threads.ts helper — and follows the relay’s caller-supplied problem code, so a helper extracted from a route cannot leave the guard. Codes, statuses and remedies are unchanged. Documentation-only release for the widget: the hosted bundle line stays /embed/v1/.

1.2.2 — Console workstream in production; catalog = connection kinds

2026-09-04

  • The console behaviour documented in the Integration types section — Integrations hub, "Connect a system" wizard, health badges and background sweep, per-agent Connected systems, the five /v1/integrations/* and connected-systems routes — is in production since the 2026-09-04 console release (W1 Now-A + Now-B). Every "shipping in the next console release" / "coming soon" note now reads available; the "New in this release" rows read Available.
  • Catalog wording corrected to the product decision of 2026-09-04: GET /v1/integrations/catalog and wizard step 1 list connection kinds for real systems only — MCP server (API key, bearer or no auth), PostgreSQL / SQL Server / Oracle, remote agent (A2A). No demo, sandbox or mock-data card ships; vendor templates are Next. Demo tenants register their own servers through their setup scripts, and the two government MCP templates are platform rows registered by operations, not catalog cards.
  • Documentation-only release for the widget: the hosted bundle line stays /embed/v1/. Re-run the docs assistant setup-hive.ts after deploy so the knowledge base picks up the new wording.

1.2.1 — English-only documentation

2026-09-04

  • The portal is English-only documentation: the Arabic canonical sentence, definitions, table columns and labels added in 1.2.0 are removed, and a new guard (english-only.test.ts) fails the build if Arabic-script prose reappears on a page, in a content module, in the docs assistant knowledge base or in search. The platform itself remains bilingual — the widget, console and docs assistant still support Arabic, and the docs say so in English. Documentation-only release.

1.2.0 — Integration types section

2026-09-04

  • New "Integration types" documentation group: the overview (/integrations) with the canonical sentence, the four types, the four-layer diagram, definitions, the governance triad, MCP in both directions, what is true today vs. what is Next, and the "New in this release" box; plus one page each for connectors, tools & grants (kinds, connections and health states, grant resolution, approval policies vs. manifest rules, the five-step "Connect a system" path, API mapping), channels (kinds with availability status, widget vs. web chat endpoint, WhatsApp policy), knowledge sources (kinds, sync, kb.search, document permissions) and automation (triggers in, outbound webhooks out).
  • Vocabulary is the integrations glossary, verbatim; a new drift guard (drift-vocabulary.test.ts) pins every definition and the canonical sentence to the committed glossary, rejects retired words across the portal prose, and requires every roadmap item to carry the visible label "Next" (MySQL only as Next; Teams, Slack, SMS and Voice "with your provider credentials").
  • Existing pages reworded around the four types: "Choose your integration" names the type each answer maps to, the home page links the new section, the REST reference group for /v1/mcp-servers is titled "Connectors (MCP servers), connections and tool grants". Search indexes the types, definitions, connector kinds, health states and channel kinds. The docs assistant knowledge base gains an integration-types document (re-run setup-hive.ts after deploy).
  • Console behaviour that ships with the next console release (Integrations hub, "Connect a system" wizard, health badges, starter catalog, per-agent Connected systems, /v1/integrations/*) is described as "shipping in the next console release" / "coming soon" — not as available. Documentation-only release for the widget: the hosted bundle line stays /embed/v1/.

1.1.0 — Backend integration section

2026-09-03

  • New "Backend integration" documentation group: choose your integration, overview and reference architecture, API keys and authentication, starting runs (threads, one-off runs, SSE), triggers and workflows, exposing your systems with MCP, webhooks, human-in-the-loop approvals from your own UI, how the demo portals do it, and provisioning as code.
  • Runnable example examples/backend-integration-node: an Express "orders" backend with a signed trigger, an MCP server, a signed-webhook receiver, an approvals proxy and an idempotent provisioning script (setup-hive.mjs, --teardown).
  • Drift guards pin the documentation to the platform source: registered routes, error codes, signature schemes (the example’s signing helpers and the Python samples are executed against the platform signer), webhook retry policy, SSE and status vocabularies, SDK method tables, workflow/approval semantics, rotation semantics, and lifecycle-webhook emission.
  • Documentation-only release for the widget: the hosted bundle line stays /embed/v1/.

1.0.1 — Portal rebranded to Agentic Workforce ME

2026-09-03

  • The portal is now the Agentic Workforce ME Developer Portal (header shows the product mark and name; metadata, home page, playground greeting and example titles updated). Documentation-only release.
  • Shipped identifiers are unchanged: @hive/embed, HiveChat, <hive-chat>, hive:* events, hive_pk_… keys, the X-Hive-Embed-Key header, /embed/v1/hive-embed.js and the EMBED_* error codes. The FAQ explains the codename they carry.
  • The playground assistant is now named "Agentic Workforce ME docs assistant".

1.0.0 — Initial release of the embed surface

2026-09-03

  • Hosted bundle line /embed/v1/ (hive-embed.js, hive-embed.mjs, react.mjs); the bundle reports build 0.5.0 via HiveChat.version.
  • <hive-chat> Web Component with Shadow DOM isolation, launcher and inline modes, English + Arabic (RTL), Markdown rendering, streaming replies, thread persistence, keyboard and screen-reader support, mobile full-screen below 480 px.
  • Script-tag loader: data-* auto-init, window.HiveChat.init command queue, apiUrl inferred from the script origin.
  • React wrapper @hive/embed/react (<HiveChat embedKey=… />) with onReady/onSession/onOpen/onClose/onMessage/onError.
  • Public API /v1/embed/*: config (key in the X-Hive-Embed-Key header, fetched on page load), session (15-minute HMAC tokens scoped to tenant + key + agent + origin + visitor, minted lazily on first open or first send), messages, thread history, redacted SSE relay (text deltas and anonymous tool.called/tool.result with step idx), cancel. Per-key CORS allowlists, fail-closed.
  • Publishable embed keys hive_pk_… (hashed at rest) with origin allowlists, server-side theme/config (including branding_url), per-key rate limits, enable/disable, rotate and revoke — console Embed tab and admin /v1/embed-keys API, @hive/sdk embedKeys resource.
  • Identified end users through backend-signed HS256 identity JWTs (sub, name, email, meta, exp ≤ 24 h, optional iat/nbf with clock-skew checks); contacts upserted with PII tags.
  • Rate limits: 60 config reads/min and 30 session mints/min per IP, session mints per key at 10 × rate_limit_per_min, key rate_limit_per_min (default 60) for messages, 20 messages/min and 60 reads/min per visitor, 2 concurrent event streams per visitor, 200 messages per thread, one in-flight reply per thread (409 EMBED_RUN_IN_FLIGHT).
  • Constructed-stylesheet CSS so strict host CSPs need only script-src and connect-src additions.