Sophon

Changelog

v0.1 — W12 wrap-up (May 2026)

The bridge data path is feature-complete for a chat-with-tools-and-approvals workflow. Everything below is wired through /v1/bridge/* and ships in iOS Phase 3.

Added

  • /v1/bridge/createTask | updateTask | finishTask — mirror the existing task_* SAP events for paired bridges. Surfaces tool calls inside the bubble (drill-in) and on the live activity deck.
  • /v1/bridge/requestApproval — HITL for shell commands and plugin invocations. Resolution flows back through the bridge bus so the bridge can call exec.approval.resolve on OpenClaw.
  • /v1/me/sessions/:id/archive + /unarchive — chat archive affordance with cross-device SSE sync.
  • /v1/me/installations/:id PATCH now accepts custom_emoji alongside custom_display_name.
  • installation_updated SSE event for cross-device rename + emoji sync.
  • Phase 3.5 — bridge task routes (createTask, updateTask, finishTask, requestApproval) are idempotent on their natural ids. Re-sending the same shape returns idempotent: true. See Idempotency & resume.
  • Phase 3.6 — structured validation errors. 400 invalid_request responses now carry an errors[] array with field paths (attachments.0.size), zod issue codes (too_big, invalid_type), and human messages. See Errors & rate limits.
  • Phase 3.6X-RateLimit-* headers on every bridge response, bucketed (msg, delta, task, approval, memory, default) with documented capacities and refill rates.
  • Phase 3.6X-Request-ID and traceparent (W3C Trace Context) on every /v1/* response. See Observability.
  • Phase 3.7GET /v1/me/snapshot cold-launch endpoint. Returns { ts, pending_approvals }. iOS folds it before the SSE attaches so a "may I run this?" sheet that fired while the app was killed reappears on relaunch.
  • iOS: streaming-state granularity (.thinking → .streaming on first delta).
  • iOS: file & image attachments forwarded through the bridge to OpenClaw's media pipeline.
  • iOS: persistent tool segments inside the assistant bubble (the task_* events now also yield to the in-flight send() continuation, which SessionStore's accumulator folds into ChatMessage.segments).

Fixed

  • Snake_case sweep across /v1/me/* (lib/wire.ts projector). Previously PlatformSession.lastActivityAt was silently dropping to now() because the server emitted lastActivityAt and iOS expected last_activity_at.
  • GET /v1/me/sessions/:id/messages returns wire-shape rows now; every chat history fetch was a hard-fail decode prior to this.
  • Schema migration 0003 — chat_sessions.agent_id nullable for bridge-owned sessions.
  • Schema migration 0004 — approvals.agent_id nullable for bridge approvals.
  • Schema migration 0005 — installations.custom_emoji text column.

Deferred

  • Question prompts (AskUserQuestion tool surface).
  • Server-side full-text search.
  • Per-session model picker.
  • Device-capability passthrough for bridge agents.
  • Shared-agent path (/v1/bot/*, agt_* tokens). The protocol RFC defines it; iOS does not surface it. Personal bridges (inst_*) are the supported path indefinitely.

v0.0 — W11 (April 2026)

  • First end-to-end pairing flow.
  • /v1/bridge/sendMessage | sendMessageDelta | sendMessageEnd.
  • Bridge connector dist (@sophonai/openclaw) shipped to npm.
  • iOS PlatformAdapter consumes the bridge namespace.