openclaw/scripts/protocol-event-coverage.allowlist.json
Peter Steinberger fe403619f9
fix(ui): chat stays blocked after model credentials recover (#132179)
* fix(ui): refresh chat readiness after credential recovery

Keep retained Chat and New Session on one accepted metadata publication
flow, preserve session profile locks, and notify clients when authoritative
metadata settles. Fence stale responses and publish persisted inline model
selections; refresh Android metadata through the same event.

Release note: Control UI chat recovers model readiness after credential or
selection changes without reloading, clearing drafts, or hiding prior errors.

* test(gateway): adopt prepared metadata projection fixture

* fix(ui): preserve metadata scope across chat interactions

Read slash commands from the active session publication and rebind retained global chats when agent selection changes. Preserve warm picker state until the authoritative session projection settles. Integrate runtime fixtures and move cross-layer persisted-selection coverage into the Gateway lane without changing check limits.

* test(ui): return valid empty lifecycle RPC results

* test(ui): keep metadata regression within suite limits

* test(gateway): supply prepared model metadata in auth recovery regression

* test(gateway): preserve session metadata read access

Extend the documented view/suggest read-policy matrix to chat history, startup, and metadata. Participation continues to gate mutations; existing none, incognito, and pending-profile guards remain unchanged.

* fix(android): retain session scope in chat metadata

Preserve profile-specific availability across metadata refreshes and same-agent session transitions. Carry the required prepared catalog owner into the Gateway lifecycle regression fixture.

* fix(ui): preserve draft controls when reconnecting

* fix(android): negotiate session metadata refresh scope

Advertise session-scoped chat metadata through hello capabilities while
preserving the shipped agent-only request and cache contract for older peers.

Refresh matching session mutations and missed metadata publications through
one synchronous request fence, retaining accepted catalogs and chat drafts.

* fix(ui): split streamed pull-request refresh from chat events

Keep the merged event owner below the unchanged 700-line lint bound.
Move existing link parsing and bounded stream refresh without changing
behavior, reply visibility, terminal recovery, or metadata invalidation.

The merged guard fails at 710 lines before and passes after. Existing
117 UI tests, forced UI types, lint, build, and isolated P0 review pass.
2026-08-29 05:10:23 -07:00

76 lines
8.6 KiB
JSON

{
"$comment": "Gateway events each mobile client intentionally does not handle yet, with a one-line reason. Consumed by scripts/check-protocol-event-coverage.mjs (pnpm check:protocol-coverage). Adding a gateway event without a client handler requires either handling it or adding an entry here; the check also fails when an entry goes stale (event removed or now handled).",
"ios": {
"chat.metadata.changed": "iOS has no model-availability auth gate; chat transport refreshes metadata capabilities during swarm bootstrap, while model choices load on demand.",
"controlUi.sessionPullRequests.changed": "Sidebar PR indicators are a Control UI surface; native apps do not render session PR chips.",
"cron": "Cron run activity is not surfaced in the iOS app.",
"device.pair.changed": "Device label projection refresh is a Control UI surface; iOS does not render the Gateway Devices page.",
"device.pair.requested": "Device pairing flows poll via device.pair.* methods on iOS.",
"device.pair.resolved": "Device pairing flows poll via device.pair.* methods on iOS.",
"device.pair.setup.completed": "Generated setup lifecycle is a Control UI surface; iOS direct Watch setup completes through Watch connectivity.",
"device.pair.setup.deliveryUncertain": "Generated setup recovery is a Control UI surface; native clients receive the handoff response directly.",
"heartbeat": "iOS liveness uses tick and WebSocket-level ping; heartbeat is unused.",
"node.pair.requested": "Node pairing state is fetched on demand; no push consumer on iOS yet.",
"node.pair.resolved": "Node pairing state is fetched on demand; no push consumer on iOS yet.",
"node.presence": "Node activity is reported by macOS nodes and consumed by gateway routing; iOS has no presence reporter yet.",
"node.runnerInventory.changed": "Session-host placement refresh is a Control UI surface; iOS does not offer device runner placement yet.",
"openclaw.approval.requested": "OpenClaw system-agent config approvals are a web/desktop operator surface; iOS has no operator-approval prompt.",
"openclaw.approval.resolved": "OpenClaw system-agent config approvals are a web/desktop operator surface; iOS has no operator-approval prompt.",
"plugin.approval.requested": "Plugin approval prompts are not implemented on iOS.",
"plugin.approval.resolved": "Plugin approval prompts are not implemented on iOS.",
"portal.changed": "Control-UI-only surface; native apps have no portal viewer yet.",
"presence": "Presence roster is a control-UI (web/desktop) surface; iOS does not render it.",
"session.approval": "Native approval review uses exec.approval push/nudge delivery; the session-scoped approval stream is a Control UI chat surface.",
"session.operation": "Chat UI derives run state from chat/agent events; no session.operation consumer yet.",
"session.sharing": "Session visibility/membership management is a Control UI operator surface; iOS reads visibility/sharingRole from session rows and has no sharing editor.",
"session.sharing.evidence": "Principal-less sharing evidence is a Control UI operator surface; iOS refreshes canonical session rows through sessions.changed.",
"session.suggestion": "The suggestion queue is a Control UI collaboration surface; iOS does not render or resolve session suggestions.",
"session.tool": "Session tool stream is not rendered by the iOS chat surface yet.",
"session.typing": "Collaborative typing state is a Control UI-only ephemeral indicator; iOS does not render it.",
"shutdown": "iOS relies on socket close plus reconnect/backoff instead of the shutdown notice.",
"skills.changed": "Skills settings is a macOS operator surface; iOS does not expose skill management yet.",
"task.suggestion": "Task suggestion cards are a Control UI-only surface; iOS does not render them.",
"terminal.data": "Embedded terminal is a web/desktop surface; iOS has no terminal client.",
"terminal.exit": "Embedded terminal is a web/desktop surface; iOS has no terminal client.",
"ui.command": "Web Control UI-only layout commands; iOS does not consume them.",
"update.available": "Gateway self-update notices do not apply to iOS; app updates ship via the App Store.",
"voicewake.routing.changed": "iOS only consumes voicewake.changed trigger updates; routing changes are not surfaced."
},
"android": {
"controlUi.sessionPullRequests.changed": "Sidebar PR indicators are a Control UI surface; native apps do not render session PR chips.",
"cron": "Cron run activity is not surfaced in the Android app.",
"device.pair.changed": "Device label projection refresh is a Control UI surface; Android does not render the Gateway Devices page.",
"device.pair.requested": "Device pairing flows poll via device.pair.* methods on Android.",
"device.pair.resolved": "Device pairing flows poll via device.pair.* methods on Android.",
"device.pair.setup.completed": "Generated setup lifecycle is a Control UI surface; Android consumes setup codes but does not issue or track them.",
"device.pair.setup.deliveryUncertain": "Generated setup recovery is a Control UI surface; Android consumes setup codes but does not issue or track them.",
"heartbeat": "Android liveness uses tick and WebSocket-level ping; heartbeat is unused.",
"node.invoke.cancel": "Cancel targets streaming agent.cli.claude.run.v1 invokes; app nodes never advertise agent runs, so no cancel can address them.",
"node.invoke.input": "Carries terminal keystrokes/resize to a node PTY relay invoke; the relay runs on gateway/CLI node hosts and app nodes never host it, so Android has no consumer.",
"node.pair.requested": "Android's bounded operator session lacks operator.pairing; onboarding refreshes node approval with explicit node.list requests.",
"node.pair.resolved": "Android's bounded operator session lacks operator.pairing; onboarding refreshes node approval with explicit node.list requests.",
"node.presence": "Node activity is reported by macOS nodes and consumed by gateway routing; Android has no presence reporter yet.",
"node.runnerInventory.changed": "Session-host placement refresh is a Control UI surface; Android does not offer device runner placement yet.",
"openclaw.approval.requested": "OpenClaw system-agent config approvals are a web/desktop operator surface; Android has no operator-approval prompt.",
"openclaw.approval.resolved": "OpenClaw system-agent config approvals are a web/desktop operator surface; Android has no operator-approval prompt.",
"plugin.approval.requested": "Plugin approval prompts are not implemented on Android.",
"plugin.approval.resolved": "Plugin approval prompts are not implemented on Android.",
"portal.changed": "Control-UI-only surface; native apps have no portal viewer yet.",
"presence": "Presence roster is a control-UI (web/desktop) surface; Android does not render it.",
"session.approval": "Native approval review uses exec.approval push/nudge delivery; the session-scoped approval stream is a Control UI chat surface.",
"session.operation": "Chat UI derives run state from chat/agent events; no session.operation consumer yet.",
"session.sharing": "Session visibility/membership management is a Control UI operator surface; Android reads visibility/sharingRole from session rows and has no sharing editor.",
"session.sharing.evidence": "Principal-less sharing evidence is a Control UI operator surface; Android refreshes canonical session rows through sessions.changed.",
"session.suggestion": "The suggestion queue is a Control UI collaboration surface; Android does not render or resolve session suggestions.",
"session.tool": "Session tool stream is not rendered by the Android chat surface yet.",
"session.typing": "Collaborative typing state is a Control UI-only ephemeral indicator; Android does not render it.",
"shutdown": "Android relies on socket close plus reconnect/backoff instead of the shutdown notice.",
"skills.changed": "Skills settings is a macOS operator surface; Android does not expose skill management yet.",
"talk.mode": "Android toggles talk mode locally; gateway talk.mode sync is not consumed.",
"task.suggestion": "Task suggestion cards are a Control UI-only surface; Android does not render them.",
"terminal.data": "Embedded terminal is a web/desktop surface; Android has no terminal client.",
"terminal.exit": "Embedded terminal is a web/desktop surface; Android has no terminal client.",
"ui.command": "Web Control UI-only layout commands; Android does not consume them.",
"voicewake.routing.changed": "Android reads voicewake state on demand via voicewake.get; no push consumer yet."
}
}