AkurAI-RustAgent agent OS UI

Status: ⬜ planned integration contract.

The AkurAI-RustAgent web surface must be a tenant-scoped agent operating system, not a plain chat box. It should preserve the same interaction semantics an operator gets from a mature agent runtime: channels, tool calls, confirmations, questions, edit previews, artifacts, durable work queues, and receipts back to the agent.

The framework already ships the native-ESM assistant-ui + tool-ui substrate needed for that UI. The remaining work is an adapter that turns RustAgent/Hermes-style events into framework component payloads and sends user decisions back as receipts.

Required surfaces

Channel contract

The adapter should keep channel identity explicit. A run event should include:

{
  "run_id": "run_123",
  "sequence": 42,
  "channel": "commentary",
  "kind": "tool_call",
  "tool_call_id": "call_abc",
  "payload": {}
}

Recommended channels:

Hermes-style asks

The UI must treat agent asks as blocking structured requests, not prose. At minimum, support these request/response pairs:

Approval choices should keep Hermes semantics: once, session, always, or deny. If allow_permanent is false, do not show or persist always. Clarification choices should stay short and bounded; open-ended clarification is represented by omitting choices.

Component mapping

Use the shipped tool-ui components before creating new UI:

If no component matches, the runtime must fall back to readable JSON rather than dropping the event.

Receipts back to the agent

Interactive components must reply through the existing receipt shape:

{
  "channel": "tool-result",
  "receipt": {
    "toolCallId": "call_abc",
    "component": "approval_card",
    "action": "approve",
    "data": { "approved": true },
    "ts": 1782487573184
  }
}

For RustAgent, that receipt should be forwarded to the run/gateway as the answer to the pending agent ask. The UI should not convert approvals into plain chat text; it must preserve the target toolCallId, selected action, and typed data.

The receipt bridge maps component receipts to the matching response method:

Implementation slices

  1. Event adapter: normalize RustAgent/Hermes gateway events into the channel

contract above, preserving sequence, run id, tool call id, and tenant id.

  1. Workspace shell: compose ThreadList, branch picker, reasoning, suggestions,

tool-call runtime, and the artifact components into an agent-OS layout.

  1. Receipt bridge: route toolui:receipt and component confirmations back to

RustAgent as structured answers, then update the pending timeline item.

  1. Durable state panes: wire memory, notes, passvault, kanban, cron, and curator

records as first-class sidebar/context objects.

  1. Hermes parity checks: build fixtures for confirmations, questions, tool

calls, edits, artifacts, channel ordering, and recovery from disconnected runs.