@scotthuang/agent-knock-knock 0.13.18 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/CONTRIBUTING.md +212 -0
- package/README.md +105 -166
- package/connectors/deepseek-harness/LICENSE +21 -0
- package/connectors/deepseek-harness/README.md +406 -0
- package/connectors/pi/LICENSE +21 -0
- package/connectors/pi/README.md +446 -0
- package/dist/src/backend-recovery-semantic.d.ts +16 -0
- package/dist/src/backend-recovery-semantic.js +113 -0
- package/dist/src/backend-recovery-semantic.js.map +1 -0
- package/dist/src/backend-task-recovery.d.ts +103 -0
- package/dist/src/backend-task-recovery.js +142 -0
- package/dist/src/backend-task-recovery.js.map +1 -0
- package/dist/src/callback-transport.d.ts +8 -0
- package/dist/src/callback-transport.js +14 -0
- package/dist/src/callback-transport.js.map +1 -1
- package/dist/src/cli-core.js +18 -8
- package/dist/src/cli-core.js.map +1 -1
- package/dist/src/cli-runtime-context.d.ts +5 -0
- package/dist/src/cli-runtime-context.js.map +1 -1
- package/dist/src/codex-native-cli-adapter.d.ts +6 -0
- package/dist/src/codex-native-cli-adapter.js +273 -0
- package/dist/src/codex-native-cli-adapter.js.map +1 -0
- package/dist/src/codex-native-client-interactions.d.ts +6 -0
- package/dist/src/codex-native-client-interactions.js +124 -0
- package/dist/src/codex-native-client-interactions.js.map +1 -0
- package/dist/src/codex-native-client-rpc.d.ts +21 -0
- package/dist/src/codex-native-client-rpc.js +137 -0
- package/dist/src/codex-native-client-rpc.js.map +1 -0
- package/dist/src/codex-native-client.d.ts +42 -0
- package/dist/src/codex-native-client.js +326 -0
- package/dist/src/codex-native-client.js.map +1 -0
- package/dist/src/codex-native-identity.d.ts +6 -0
- package/dist/src/codex-native-identity.js +42 -0
- package/dist/src/codex-native-identity.js.map +1 -0
- package/dist/src/codex-native-monitor.d.ts +4 -0
- package/dist/src/codex-native-monitor.js +92 -0
- package/dist/src/codex-native-monitor.js.map +1 -0
- package/dist/src/codex-native-outbox.d.ts +16 -0
- package/dist/src/codex-native-outbox.js +120 -0
- package/dist/src/codex-native-outbox.js.map +1 -0
- package/dist/src/codex-native-public-projection.d.ts +545 -0
- package/dist/src/codex-native-public-projection.js +182 -0
- package/dist/src/codex-native-public-projection.js.map +1 -0
- package/dist/src/codex-native-record-store.d.ts +27 -0
- package/dist/src/codex-native-record-store.js +111 -0
- package/dist/src/codex-native-record-store.js.map +1 -0
- package/dist/src/codex-native-response-service.d.ts +69 -0
- package/dist/src/codex-native-response-service.js +244 -0
- package/dist/src/codex-native-response-service.js.map +1 -0
- package/dist/src/codex-native-runtime.d.ts +46 -0
- package/dist/src/codex-native-runtime.js +112 -0
- package/dist/src/codex-native-runtime.js.map +1 -0
- package/dist/src/codex-native-semantic.d.ts +17 -0
- package/dist/src/codex-native-semantic.js +175 -0
- package/dist/src/codex-native-semantic.js.map +1 -0
- package/dist/src/codex-native-snapshot.d.ts +19 -0
- package/dist/src/codex-native-snapshot.js +160 -0
- package/dist/src/codex-native-snapshot.js.map +1 -0
- package/dist/src/codex-native-state-store.d.ts +61 -0
- package/dist/src/codex-native-state-store.js +132 -0
- package/dist/src/codex-native-state-store.js.map +1 -0
- package/dist/src/codex-native-task-service.d.ts +71 -0
- package/dist/src/codex-native-task-service.js +502 -0
- package/dist/src/codex-native-task-service.js.map +1 -0
- package/dist/src/codex-native-types.d.ts +92 -0
- package/dist/src/codex-native-types.js +15 -0
- package/dist/src/codex-native-types.js.map +1 -0
- package/dist/src/conversation-list.d.ts +12 -0
- package/dist/src/conversation-list.js +30 -0
- package/dist/src/conversation-list.js.map +1 -0
- package/dist/src/conversation-route-dispatch.d.ts +13 -0
- package/dist/src/conversation-route-dispatch.js +66 -0
- package/dist/src/conversation-route-dispatch.js.map +1 -0
- package/dist/src/conversation-route-legacy.d.ts +18 -0
- package/dist/src/conversation-route-legacy.js +54 -0
- package/dist/src/conversation-route-legacy.js.map +1 -0
- package/dist/src/conversation-route-store.d.ts +51 -0
- package/dist/src/conversation-route-store.js +126 -0
- package/dist/src/conversation-route-store.js.map +1 -0
- package/dist/src/conversation-routing-cli-adapter.d.ts +12 -0
- package/dist/src/conversation-routing-cli-adapter.js +211 -0
- package/dist/src/conversation-routing-cli-adapter.js.map +1 -0
- package/dist/src/conversation-routing-commands.d.ts +11 -0
- package/dist/src/conversation-routing-commands.js +85 -0
- package/dist/src/conversation-routing-commands.js.map +1 -0
- package/dist/src/conversation-routing-home.d.ts +26 -0
- package/dist/src/conversation-routing-home.js +105 -0
- package/dist/src/conversation-routing-home.js.map +1 -0
- package/dist/src/conversation-routing-identity.d.ts +40 -0
- package/dist/src/conversation-routing-identity.js +174 -0
- package/dist/src/conversation-routing-identity.js.map +1 -0
- package/dist/src/conversation-runtime-route-store.d.ts +11 -0
- package/dist/src/conversation-runtime-route-store.js +118 -0
- package/dist/src/conversation-runtime-route-store.js.map +1 -0
- package/dist/src/desktop-async-interactions.d.ts +15 -0
- package/dist/src/desktop-async-interactions.js +88 -0
- package/dist/src/desktop-async-interactions.js.map +1 -0
- package/dist/src/desktop-async-state.d.ts +5 -0
- package/dist/src/desktop-async-state.js +53 -0
- package/dist/src/desktop-async-state.js.map +1 -0
- package/dist/src/desktop-cli-adapter.d.ts +7 -0
- package/dist/src/desktop-cli-adapter.js +322 -0
- package/dist/src/desktop-cli-adapter.js.map +1 -0
- package/dist/src/desktop-cli-controls.d.ts +9 -0
- package/dist/src/desktop-cli-controls.js +45 -0
- package/dist/src/desktop-cli-controls.js.map +1 -0
- package/dist/src/desktop-command-presentation.d.ts +2 -0
- package/dist/src/desktop-command-presentation.js +31 -0
- package/dist/src/desktop-command-presentation.js.map +1 -0
- package/dist/src/desktop-control-semantic.d.ts +8 -0
- package/dist/src/desktop-control-semantic.js +68 -0
- package/dist/src/desktop-control-semantic.js.map +1 -0
- package/dist/src/desktop-identity.d.ts +5 -0
- package/dist/src/desktop-identity.js +40 -0
- package/dist/src/desktop-identity.js.map +1 -0
- package/dist/src/desktop-interaction-projection.d.ts +57 -0
- package/dist/src/desktop-interaction-projection.js +196 -0
- package/dist/src/desktop-interaction-projection.js.map +1 -0
- package/dist/src/desktop-interaction-state.d.ts +3 -0
- package/dist/src/desktop-interaction-state.js +48 -0
- package/dist/src/desktop-interaction-state.js.map +1 -0
- package/dist/src/desktop-ipc-async-answer.d.ts +9 -0
- package/dist/src/desktop-ipc-async-answer.js +71 -0
- package/dist/src/desktop-ipc-async-answer.js.map +1 -0
- package/dist/src/desktop-ipc-client.d.ts +47 -0
- package/dist/src/desktop-ipc-client.js +400 -0
- package/dist/src/desktop-ipc-client.js.map +1 -0
- package/dist/src/desktop-ipc-native-operations.d.ts +11 -0
- package/dist/src/desktop-ipc-native-operations.js +126 -0
- package/dist/src/desktop-ipc-native-operations.js.map +1 -0
- package/dist/src/desktop-ipc-transport.d.ts +13 -0
- package/dist/src/desktop-ipc-transport.js +123 -0
- package/dist/src/desktop-ipc-transport.js.map +1 -0
- package/dist/src/desktop-list.d.ts +25 -0
- package/dist/src/desktop-list.js +55 -0
- package/dist/src/desktop-list.js.map +1 -0
- package/dist/src/desktop-metadata-reader.d.ts +30 -0
- package/dist/src/desktop-metadata-reader.js +182 -0
- package/dist/src/desktop-metadata-reader.js.map +1 -0
- package/dist/src/desktop-monitor.d.ts +4 -0
- package/dist/src/desktop-monitor.js +101 -0
- package/dist/src/desktop-monitor.js.map +1 -0
- package/dist/src/desktop-public-projection.d.ts +6 -0
- package/dist/src/desktop-public-projection.js +134 -0
- package/dist/src/desktop-public-projection.js.map +1 -0
- package/dist/src/desktop-request-interactions.d.ts +14 -0
- package/dist/src/desktop-request-interactions.js +144 -0
- package/dist/src/desktop-request-interactions.js.map +1 -0
- package/dist/src/desktop-response-dispatch.d.ts +14 -0
- package/dist/src/desktop-response-dispatch.js +19 -0
- package/dist/src/desktop-response-dispatch.js.map +1 -0
- package/dist/src/desktop-response-evidence.d.ts +4 -0
- package/dist/src/desktop-response-evidence.js +19 -0
- package/dist/src/desktop-response-evidence.js.map +1 -0
- package/dist/src/desktop-response-service.d.ts +11 -0
- package/dist/src/desktop-response-service.js +188 -0
- package/dist/src/desktop-response-service.js.map +1 -0
- package/dist/src/desktop-response-store.d.ts +35 -0
- package/dist/src/desktop-response-store.js +58 -0
- package/dist/src/desktop-response-store.js.map +1 -0
- package/dist/src/desktop-response-types.d.ts +20 -0
- package/dist/src/desktop-response-types.js +2 -0
- package/dist/src/desktop-response-types.js.map +1 -0
- package/dist/src/desktop-response-value.d.ts +6 -0
- package/dist/src/desktop-response-value.js +31 -0
- package/dist/src/desktop-response-value.js.map +1 -0
- package/dist/src/desktop-runtime.d.ts +153 -0
- package/dist/src/desktop-runtime.js +88 -0
- package/dist/src/desktop-runtime.js.map +1 -0
- package/dist/src/desktop-semantic.d.ts +21 -0
- package/dist/src/desktop-semantic.js +140 -0
- package/dist/src/desktop-semantic.js.map +1 -0
- package/dist/src/desktop-session-catalog.d.ts +68 -0
- package/dist/src/desktop-session-catalog.js +225 -0
- package/dist/src/desktop-session-catalog.js.map +1 -0
- package/dist/src/desktop-session-controls.d.ts +145 -0
- package/dist/src/desktop-session-controls.js +176 -0
- package/dist/src/desktop-session-controls.js.map +1 -0
- package/dist/src/desktop-sidebar-metadata.d.ts +27 -0
- package/dist/src/desktop-sidebar-metadata.js +83 -0
- package/dist/src/desktop-sidebar-metadata.js.map +1 -0
- package/dist/src/desktop-sidebar-projects.d.ts +10 -0
- package/dist/src/desktop-sidebar-projects.js +31 -0
- package/dist/src/desktop-sidebar-projects.js.map +1 -0
- package/dist/src/desktop-sidebar-selection.d.ts +28 -0
- package/dist/src/desktop-sidebar-selection.js +85 -0
- package/dist/src/desktop-sidebar-selection.js.map +1 -0
- package/dist/src/desktop-snapshot-details.d.ts +4 -0
- package/dist/src/desktop-snapshot-details.js +116 -0
- package/dist/src/desktop-snapshot-details.js.map +1 -0
- package/dist/src/desktop-snapshot.d.ts +11 -0
- package/dist/src/desktop-snapshot.js +276 -0
- package/dist/src/desktop-snapshot.js.map +1 -0
- package/dist/src/desktop-state-store.d.ts +72 -0
- package/dist/src/desktop-state-store.js +269 -0
- package/dist/src/desktop-state-store.js.map +1 -0
- package/dist/src/desktop-task-interactions.d.ts +10 -0
- package/dist/src/desktop-task-interactions.js +93 -0
- package/dist/src/desktop-task-interactions.js.map +1 -0
- package/dist/src/desktop-task-recovery.d.ts +38 -0
- package/dist/src/desktop-task-recovery.js +171 -0
- package/dist/src/desktop-task-recovery.js.map +1 -0
- package/dist/src/desktop-task-service.d.ts +54 -0
- package/dist/src/desktop-task-service.js +441 -0
- package/dist/src/desktop-task-service.js.map +1 -0
- package/dist/src/desktop-types.d.ts +281 -0
- package/dist/src/desktop-types.js +13 -0
- package/dist/src/desktop-types.js.map +1 -0
- package/dist/src/host-monitor-reconciliation.js +36 -4
- package/dist/src/host-monitor-reconciliation.js.map +1 -1
- package/dist/src/host-profile-runtime.js +7 -3
- package/dist/src/host-profile-runtime.js.map +1 -1
- package/dist/src/local-codex-cli-adapter.d.ts +7 -0
- package/dist/src/local-codex-cli-adapter.js +13 -0
- package/dist/src/local-codex-cli-adapter.js.map +1 -0
- package/dist/src/openclaw-callback-transport.js +2 -1
- package/dist/src/openclaw-callback-transport.js.map +1 -1
- package/dist/src/semantic-conversation-target.d.ts +4 -0
- package/dist/src/semantic-conversation-target.js +20 -0
- package/dist/src/semantic-conversation-target.js.map +1 -0
- package/dist/src/semantic-permission-control.js +47 -9
- package/dist/src/semantic-permission-control.js.map +1 -1
- package/dist/src/semantic-private-authority-offers.d.ts +1 -1
- package/dist/src/semantic-private-authority-offers.js +3 -1
- package/dist/src/semantic-private-authority-offers.js.map +1 -1
- package/dist/src/semantic-tool-command-helpers.d.ts +6 -0
- package/dist/src/semantic-tool-command-helpers.js +199 -78
- package/dist/src/semantic-tool-command-helpers.js.map +1 -1
- package/dist/src/semantic-tool-descriptions.d.ts +2 -1
- package/dist/src/semantic-tool-descriptions.js +81 -35
- package/dist/src/semantic-tool-descriptions.js.map +1 -1
- package/dist/src/semantic-tool-list-projection.js +66 -2
- package/dist/src/semantic-tool-list-projection.js.map +1 -1
- package/dist/src/semantic-tool-presentation.js +76 -7
- package/dist/src/semantic-tool-presentation.js.map +1 -1
- package/dist/src/semantic-tool-runtime.js +129 -29
- package/dist/src/semantic-tool-runtime.js.map +1 -1
- package/dist/src/semantic-tool-schemas.d.ts +410 -27
- package/dist/src/semantic-tool-schemas.js +176 -88
- package/dist/src/semantic-tool-schemas.js.map +1 -1
- package/dist/src/terminal-action-contracts.js +10 -6
- package/dist/src/terminal-action-contracts.js.map +1 -1
- package/dist/src/terminal-list-cli-adapter.d.ts +1 -0
- package/dist/src/terminal-list-cli-adapter.js +6 -3
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
- package/dist/src/terminal-permission-control-list-projection.d.ts +1 -1
- package/dist/src/terminal-user-send-intent.d.ts +2 -0
- package/dist/src/terminal-user-send-intent.js +11 -3
- package/dist/src/terminal-user-send-intent.js.map +1 -1
- package/docs/architecture/current-architecture.md +313 -0
- package/docs/architecture/interactive-terminal-response.md +276 -0
- package/docs/architecture/issue-126-final-report.md +248 -0
- package/docs/architecture/orchestration-refactor-history.md +2987 -0
- package/docs/architecture/orchestration-refactor.md +21 -0
- package/docs/backend-task-recovery.md +89 -0
- package/docs/bidirectional-agent-protocol.md +260 -0
- package/docs/codex-cli-native-compatibility.md +246 -0
- package/docs/codex-desktop-compatibility.md +414 -0
- package/docs/openclaw-operations.md +281 -0
- package/docs/openclaw-session-turn-delivery-requirement.md +45 -0
- package/docs/operator-guide.md +543 -0
- package/docs/storage-and-logging.md +91 -0
- package/docs/test-performance-issue-108.md +80 -0
- package/docs/test-performance-issue-120.md +226 -0
- package/docs/testing.md +628 -0
- package/openclaw.plugin.json +7 -3
- package/package.json +6 -13
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +66 -15
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Orchestration architecture documents
|
|
2
|
+
|
|
3
|
+
This path is a stable index. It intentionally contains no current tool count,
|
|
4
|
+
Store protocol number, action-contract version, or module-size snapshot.
|
|
5
|
+
|
|
6
|
+
Use these documents according to purpose:
|
|
7
|
+
|
|
8
|
+
- [Current architecture and health budget](./current-architecture.md) is the
|
|
9
|
+
only authoritative description of the source tree and public surface now.
|
|
10
|
+
- [Issue #126 orchestration refactor history](./orchestration-refactor-history.md)
|
|
11
|
+
is an immutable chronological record of the v0.12 refactor baseline, phase
|
|
12
|
+
reports, and later issue addenda. Numbers such as 14 or 16 tools, Watch v2,
|
|
13
|
+
and writer protocol 6 describe their explicitly dated historical snapshot;
|
|
14
|
+
they are not current product documentation.
|
|
15
|
+
- [Issue #126 final report](./issue-126-final-report.md) records that refactor's
|
|
16
|
+
closeout evidence.
|
|
17
|
+
- [Interactive terminal response](./interactive-terminal-response.md) describes
|
|
18
|
+
the dedicated questionnaire-response architecture.
|
|
19
|
+
|
|
20
|
+
For operator workflows and the current semantic-tool surface, use the
|
|
21
|
+
[operator guide](../operator-guide.md) and the canonical packaged Skill.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Backend task recovery
|
|
2
|
+
|
|
3
|
+
AKK 0.14.0 introduces exact-task recovery for its backend adapters. See the
|
|
4
|
+
[README](../README.md) for installation and the first-task workflow.
|
|
5
|
+
|
|
6
|
+
Codex CLI direct connections and Codex Desktop use persisted exact task identities
|
|
7
|
+
for recovery. These operations do not require tmux or Herdr and do not send task
|
|
8
|
+
text, slash commands, approvals, cancellation, or lifecycle commands to Codex.
|
|
9
|
+
|
|
10
|
+
## Management and observation
|
|
11
|
+
|
|
12
|
+
A backend Send creates a managed task with automatic observation. Its response
|
|
13
|
+
includes `turn_id` and `watch_id` identifying that same stored record. A standalone
|
|
14
|
+
Watch observes an existing task and does not acquire Send management. Inspect
|
|
15
|
+
`task_kind`, `management_state`, and `observation_state` separately.
|
|
16
|
+
|
|
17
|
+
| Operation | Meaning |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| `unwatch({watch_id})` | Stop observation and withdraw notifications not yet dispatched. A managed Send stays managed. |
|
|
20
|
+
| `close({turn_id})` | Close a managed Send, stop observation, and release its AKK management. A standalone Watch must use Unwatch. |
|
|
21
|
+
| `renew({watch_id, minutes})` | Verify the original task and extend observation; an expired or explicitly stopped Watch can resume while that same task is still active. |
|
|
22
|
+
| `recover({watch_id})` | Reconnect/read the original task, reconcile its receipt and state, and supervise eligible monitor work. Does not extend the deadline or resume an explicitly stopped Watch. |
|
|
23
|
+
| `retry_callback({watch_id, notification_id})` | Retry one persisted notification with its original event ID and controller target. Does not rerun the task. |
|
|
24
|
+
|
|
25
|
+
The tool prefix is `agent_knock_knock_`. Native Send `turn_id` is also accepted
|
|
26
|
+
by Recover, Renew, Close, Retry Callback, and Status. Unwatch uses `watch_id`.
|
|
27
|
+
Copy the exact IDs and available actions
|
|
28
|
+
from Send, List or Status. A conversation ID alone cannot select a task to close,
|
|
29
|
+
renew, recover, or retry. Multiple eligible failed notifications require an
|
|
30
|
+
explicit `notification_id`.
|
|
31
|
+
|
|
32
|
+
Closed management cannot be reopened. Unwatch does not release an unresolved
|
|
33
|
+
Send reservation; Close explicitly releases management without asserting that
|
|
34
|
+
the native submission failed. Reusing the original Send message ID still returns
|
|
35
|
+
its original record and never resends its text. None of these operations cancels
|
|
36
|
+
the actual Codex task or closes its conversation.
|
|
37
|
+
|
|
38
|
+
## Identity and outcomes
|
|
39
|
+
|
|
40
|
+
Close and Unwatch update the saved AKK record and do not require reconnecting
|
|
41
|
+
to Codex. Recover and Renew read the original native task. Retry Callback reuses
|
|
42
|
+
the saved notification; an interaction notification additionally requires fresh
|
|
43
|
+
confirmation that its original question or approval is still pending. These
|
|
44
|
+
different checks do not rediscover or select another task.
|
|
45
|
+
|
|
46
|
+
Recovery uses the saved Codex home, thread, native turn, original submission
|
|
47
|
+
receipt and client message identity. It never substitutes the latest task, a
|
|
48
|
+
matching project directory, or another terminal. If the original task cannot be
|
|
49
|
+
verified, it remains unknown rather than being rebound. Renewal requires exact
|
|
50
|
+
task evidence; if that task has already settled, its actual outcome is recorded
|
|
51
|
+
instead of declaring it running. Each new observation deadline has its own
|
|
52
|
+
timeout notification generation; old unsent expiry notices are withdrawn.
|
|
53
|
+
|
|
54
|
+
Manual callback retry accepts only a recorded `retryable_failure`, including a
|
|
55
|
+
failure whose automatic attempts were exhausted. It preserves the notification
|
|
56
|
+
body, destination, event ID and cumulative attempt history. It cannot replay an
|
|
57
|
+
accepted notification, an in-flight attempt, an uncertain result, or a withdrawn
|
|
58
|
+
or obsolete interaction. Interaction notifications require fresh evidence that
|
|
59
|
+
the same question or approval is still pending. A closed or unwatched record
|
|
60
|
+
cannot dispatch callbacks. Already in-flight notifications cannot be recalled;
|
|
61
|
+
their eventual acknowledgement remains visible.
|
|
62
|
+
|
|
63
|
+
Callback acceptance means that the controller accepted the notification. It
|
|
64
|
+
does not prove that a downstream channel, such as WeChat, delivered a user-visible
|
|
65
|
+
message. Retry Callback is not a repair for a controller-to-channel failure.
|
|
66
|
+
|
|
67
|
+
## Terminal recovery remains separate
|
|
68
|
+
|
|
69
|
+
Existing terminal `reconcile_binding`, `identify_foreground`, and
|
|
70
|
+
`repair_model_control` repair or inspect a physical terminal binding or menu.
|
|
71
|
+
They retain their terminal requirements. Backend `recover` reconciles an exact
|
|
72
|
+
stored task; it does not detach a terminal binding or manufacture new authority.
|
|
73
|
+
Native conversation creation, clearing, restoration, model controls, and
|
|
74
|
+
cancellation retain their separately documented provider capabilities.
|
|
75
|
+
|
|
76
|
+
## Validation boundary
|
|
77
|
+
|
|
78
|
+
The backend recovery paths are covered by the fast regression tier, including
|
|
79
|
+
ownership, exact task retention, expired/stopped observation, duplicate and
|
|
80
|
+
uncertain sends, callback leases and retry identity. This change does not itself
|
|
81
|
+
establish a new live Desktop/CLI or user-visible channel delivery result. Existing
|
|
82
|
+
user sessions and historical notifications must not be used as implicit tests.
|
|
83
|
+
|
|
84
|
+
Development validation on 2026-10-10: `npm run test:fast` passed all 2,788 tests
|
|
85
|
+
and its build/Skill synchronization gates. `npm run validate:architecture` and
|
|
86
|
+
`npm run validate:refactor-evidence` also passed. Full, integration and release
|
|
87
|
+
tiers were not run during that development check, in accordance with the
|
|
88
|
+
repository test policy. This records development evidence, not the separate
|
|
89
|
+
publication gate.
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# Terminal Handoff Protocol
|
|
2
|
+
|
|
3
|
+
Agent Knock Knock coordinates a controller Host, a local coding agent, and a human through one visible tmux or Herdr terminal.
|
|
4
|
+
|
|
5
|
+
- OpenClaw, Pi, DeepSeek Harness, or another compatible Host is the orchestrator, requirements owner, and final acceptance decision maker.
|
|
6
|
+
- Codex or Claude Code performs the engineering work inside tmux or Herdr.
|
|
7
|
+
- AKK owns terminal delivery, monitoring, lifecycle state, and callbacks.
|
|
8
|
+
- A human can attach to the same terminal at any time, continue directly, and later hand control back to the Host.
|
|
9
|
+
- AKK sends input only after it verifies the selected agent, pane, process, pane/process working directory, approval state, and action-specific composer. Managed paths require idle; an advertised user-explicit physical Send may steer a working mutable composer.
|
|
10
|
+
- AKK labels the evidence behind every notification. Managed Turns and exact-task Watches report completion only from correlated evidence; a user-selected terminal-activity Watch may instead report a clearly marked best-effort stable-idle observation that is not exact task-completion proof.
|
|
11
|
+
|
|
12
|
+
## Identity Model
|
|
13
|
+
|
|
14
|
+
AKK models shared work as:
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
tmux or Herdr terminal / verified process incarnation
|
|
18
|
+
├─ native Codex or Claude Code session
|
|
19
|
+
│ └─ AKK session (session_id)
|
|
20
|
+
│ ├─ Turn (turn_id)
|
|
21
|
+
│ └─ Turn (turn_id)
|
|
22
|
+
└─ Terminal Watch schema v3 (watch_id + exact task anchor or terminal-activity epoch)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- The terminal is the physical pane and coding-agent process incarnation.
|
|
26
|
+
- The native session is the continuing context owned by Codex or Claude Code.
|
|
27
|
+
- The AKK `session_id` identifies a continuing context and is the strict `session_exact` send target. The physical `terminal_id` is the separate `terminal_follow_current` or user-priority `terminal_user_explicit` send target, exactly as advertised.
|
|
28
|
+
- A `turn_id` identifies exactly one accepted dispatch through its final monitor and callback state.
|
|
29
|
+
- A `watch_id` identifies an independent observation aggregate for a user-selected exact terminal. It prefers one provider-correlated task, may fall back to that terminal/process activity epoch, and may also identify one exact request already delivered through user-explicit unmanaged fallback. It is never a Session, Turn, dispatch receipt, or terminal owner. A new exact Watch may hold a narrowly scoped native-interaction response lease, but only after same-controller Status and fresh exact terminal/native-task revalidation; activity Watches never receive such authority.
|
|
30
|
+
- A terminal binding generation identifies one verified terminal-to-native-thread attachment. Native lifecycle transitions advance it even though they create no Turn.
|
|
31
|
+
|
|
32
|
+
List and Status preserve three independent evidence axes. `screen_state`
|
|
33
|
+
classifies the bounded live TUI, `native_identity_state` reports whether the
|
|
34
|
+
foreground native session is resolved, ambiguous, verified absent, or
|
|
35
|
+
unavailable, and `durable_activity_state` reports exact artifact-backed task
|
|
36
|
+
activity when available. The legacy `activity_state` remains conservative for
|
|
37
|
+
compatibility; it can be `unknown` while the screen is visibly idle because
|
|
38
|
+
native identity or durable activity is ambiguous. These axes are diagnostic
|
|
39
|
+
and never replace a current `available_actions` entry as mutation authority.
|
|
40
|
+
|
|
41
|
+
Human-friendly selectors such as `only`, `codex`, `claude`, and `@short-ref` remain slash-command discovery inputs. The v30 structured model contract carries semantic IDs only and does not expose selectors or opaque authority values. Its core shapes are `send({session_id|terminal_id,request})` with mutually exclusive targets, `watch({terminal_id})`, `model_options({terminal_id})`, the separately advertised Codex-only `repair_model_control({terminal_id})`, followed by `set_model({terminal_id,model,reasoning_effort})`, `native_inspect({terminal_id,inspection})`, `identify_foreground({terminal_id})`, `identify_and_send({terminal_id,request})`, `new_thread({terminal_id})`, `resume_thread({terminal_id,native_thread_id})`, `respond_interaction({turn_id|watch_id,interaction_id,answers,delivery_mode?})` with exactly one subject target and `delivery_mode` present only for an `async_question`, managed `approve({turn_id,decision})` or approve-once-only terminal-scoped `approve({terminal_id})`, and `reconcile_binding({terminal_id,conflicting_session_id})`. Model selection, model-control residue repair, approval, native interaction response, handoff takeover, and reconciliation require explicit user intent and fresh source state. The trusted plugin/CLI privately derives and revalidates terminal, catalog, binding, candidate, prompt, interaction, composer, handoff, revision, and compare-and-swap fences; the model never transports them. Store format remains 1 and writer protocol is 8; Terminal Watch schema is 3.
|
|
42
|
+
|
|
43
|
+
## Managed Turn Flow
|
|
44
|
+
|
|
45
|
+
This flow describes managed Session/Turn delivery. Codex 0.158.0/0.159.0/0.159.2 physical Send
|
|
46
|
+
uses an independent exact paginated task Watch and returns `watch_id` without
|
|
47
|
+
creating a managed `turn_id`. Its foreground binding, native answer receipts,
|
|
48
|
+
and session-only/new/resume and first-modal limits are described in the
|
|
49
|
+
[0.158.0/0.159.0/0.159.2 compatibility review](codex-0.159.2-compatibility.md).
|
|
50
|
+
|
|
51
|
+
1. The controller Host calls ordinary send using the exact current listed action and the user-facing request. `session_exact` carries `session_id`; `terminal_follow_current` and `terminal_user_explicit` carry `terminal_id`. Both target fields may be omitted only when AKK must prove one unique send-ready pane. Initial discovery may first resolve one eligible Codex or Claude Code terminal into an AKK session.
|
|
52
|
+
2. AKK verifies that the session is bound to the expected native session, terminal, and idle coding-agent process.
|
|
53
|
+
3. AKK creates a unique `turn_id`, writes the request to the verified idle pane, and starts a monitor bound to that Turn, pane, process, and message.
|
|
54
|
+
4. The coding agent works in the same terminal that the human can inspect or take over.
|
|
55
|
+
5. AKK sends a structured callback containing both `session_id` and `turn_id` to the originating Host session when it has reliable approval, completion, cancellation, stall, or failure evidence.
|
|
56
|
+
6. After completion, refresh the terminal list. Another ordinary send through that row's current exact action creates a new Turn without clearing the native coding-agent context.
|
|
57
|
+
|
|
58
|
+
Steps 2–6 describe managed delivery, which may require an exact empty Composer before input. For an advertised `terminal_user_explicit` Send, the selected live terminal/process and direct input-safety checks authorize the one physical Send; rollout, Session, Store, and callback state are sidecar management evidence rather than vetoes. Parsed working activity, an existing draft, and ordinary main-Composer visibility do not veto this user-priority path, but a blocked native approval or a proven input-owning questionnaire, editor, menu, or read-only viewer remains a zero-input boundary. Profiled Codex 0.154.0/0.155.1 exact collapsed async-question summaries remain sendable because the main Composer owns input; their expanded, clipped, or ambiguous async editors do not. Codex clears the current Composer once with `C-u`; Claude Code uses a sentinel-backed native `C-s` stash-clear transaction that is independent of the cursor position and does not interrupt an active turn, then proves the main Composer empty. Each then injects the request, waits through the paste window, and dispatches Enter exactly once. Codex also freezes the complete pre-send open-rollout inventory and scans those candidates together with newly opened roots after submission. One rollout that uniquely accepts the exact request hash is promoted to the managed Session/Turn; zero matches remain pending/unproven, while multiple matches or changed file/process authority become uncertain without replay. After either agent's text injection, no Composer observation may veto Enter.
|
|
59
|
+
|
|
60
|
+
If managed preparation still fails before input, physical-terminal authority performs the same single Send and best-effort persists an exact request-bound Terminal Watch. That Watch supplies completion callbacks. Before exact native acceptance it remains notify-only; after acceptance it can emit an idempotent `interaction_required` wake-up and, through same-controller Status, expose one supported native-interaction response offer. Activity/best-effort or manual-only observations emit `interaction_manual_required` and require direct TUI input. Watch attachment failure is reported without changing or retrying the successful Send. Send output treats transport, native acceptance, management, and observation as separate facts through `terminal_input_dispatched`, `agent_acceptance`, `management_mode`, `observation_mode`, and `capabilities`; legacy delivery fields remain compatibility aliases. Once clear or request input may have occurred, an uncertain result must never be retried automatically.
|
|
61
|
+
|
|
62
|
+
P2 adds an explicit path for an exact-empty idle Codex pane whose foreground
|
|
63
|
+
rollout cannot be selected safely. `identify_foreground({terminal_id})` holds
|
|
64
|
+
the exact terminal lock and dispatches the closed `/status` probe once. It is
|
|
65
|
+
read-only with respect to the AKK Store, but it is terminal input. Its proof is
|
|
66
|
+
bound to the pane, process incarnation, real cwd, agent version, and screen
|
|
67
|
+
generation, expires after 30 seconds, and grants no binding or mutation
|
|
68
|
+
authority after the lock is released. It creates no Session, Turn, receipt,
|
|
69
|
+
monitor, or callback.
|
|
70
|
+
|
|
71
|
+
`identify_and_send({terminal_id,request})` is the atomic actionable form. It
|
|
72
|
+
retains one terminal lock from the probe through the requested task, rechecks
|
|
73
|
+
the live boundary before task input, and still grants durable Session/Turn
|
|
74
|
+
identity only to the rollout that uniquely accepts the exact request. The
|
|
75
|
+
status UUID is provisional evidence, never durable ownership. Probe or boundary
|
|
76
|
+
uncertainty stops before the task and cannot be retried automatically. This
|
|
77
|
+
operation is optional: ordinary human Send continues to follow its independent
|
|
78
|
+
user-priority contract and is never implicitly redirected through these
|
|
79
|
+
identification actions. List never types an identity probe, and exact bound-task
|
|
80
|
+
Status stays read-only. A targeted conversation Status for an unbound, idle
|
|
81
|
+
Codex terminal may use a separate closed routing identity inspection; see
|
|
82
|
+
[Status and native inspection](operator-guide.md#akk-status-and-native-inspection).
|
|
83
|
+
Codex 0.158.0/0.159.0/0.159.2 physical Send
|
|
84
|
+
and exact Watch creation use their separate closed `/status` transaction to
|
|
85
|
+
bind the foreground paginated thread.
|
|
86
|
+
|
|
87
|
+
An ordinary send never targets a completed or historical `turn_id`. If the current Turn is in the compatibility state `waiting_for_openclaw` because the coding agent asked a question, the controller Host uses `respond(turn_id, answer)`; that answer remains inside the same Turn.
|
|
88
|
+
|
|
89
|
+
A native Claude Code or Codex interaction is a separate status-bound flow. In the same owning controller conversation, call Status for the exact managed Turn or exact Watch and present its current `interaction_state` to the user. If that projection is pending and advertises response capability, submit exactly one subject (`turn_id` or `watch_id`) plus only its opaque `interaction_id`, `question_id`, and `option_id` values or bounded typed text. A blocking `questionnaire` owns the input surface and forbids `delivery_mode`. A Codex `async_question` is a parallel pending interaction while terminal activity and its Turn remain `working`; its projection advertises one or both semantic delivery modes, and its response defaults to advertised `steer_current_turn` (or explicitly selects advertised `queue_next_turn`): `steer_current_turn` delivers the answer to the running turn, while `queue_next_turn` queues it for the next turn. One response resolves only the current step; refresh Status before every later question or final confirmation. The callback itself never grants mutation authority. Changed, unprovable, secret-bearing, unsupported, multi-select, manual-required, or uncertain interactions fail closed and must not receive guessed keys, shortcut chords, menu indexes, or automatic retries. Expiry is a freshness boundary: an elapsed offer requires an exact live recapture rather than an unconditional rejection or replay. Codex 0.154.0 and 0.155.1 are separate version-bound TUI profiles; notification and stable-question-identity wrappers added to main after 0.155.1 are not part of either released contract.
|
|
90
|
+
|
|
91
|
+
If no eligible terminal exists, AKK stops and returns an actionable setup message. It does not launch an invisible replacement agent.
|
|
92
|
+
|
|
93
|
+
### Trusted controller callback boundary
|
|
94
|
+
|
|
95
|
+
Callback routing is an administrator/trusted-host concern, never a model
|
|
96
|
+
argument. The OpenClaw plugin captures its own authenticated controller
|
|
97
|
+
session identity and gives AKK a versioned, secretless `callback_route`; the
|
|
98
|
+
durable outbox freezes that route together with a canonical callback envelope
|
|
99
|
+
before delivery. A transport returns one explicit outcome: accepted,
|
|
100
|
+
retryable failure, permanent failure, or uncertain. Permanent and uncertain
|
|
101
|
+
outcomes are not blindly retried, while an accepted checkpoint remains
|
|
102
|
+
authoritative if a later wake or observation step fails.
|
|
103
|
+
|
|
104
|
+
The core outbox, managed-Turn monitor, stall notification, and Terminal Watch
|
|
105
|
+
use the host-neutral route/envelope/outcome boundary. First-party adapters
|
|
106
|
+
translate that boundary into the Host's own lifecycle: OpenClaw uses its
|
|
107
|
+
Gateway session, while Pi and DeepSeek Harness use a local `command_json_v1`
|
|
108
|
+
callback path. Existing OpenClaw Store fields remain readable and dual-written
|
|
109
|
+
for compatibility; OpenClaw-specific `sessionKey`, Gateway calls, executable
|
|
110
|
+
paths, and credentials stay inside the trusted OpenClaw adapter. No route,
|
|
111
|
+
profile, controller-session identity, token, composer digest, draft text, or
|
|
112
|
+
transport evidence is exposed through the v30 model-facing contract. A new
|
|
113
|
+
controller Host still needs a trusted session-context adapter and runtime
|
|
114
|
+
integration; the protocol boundary is not a standalone supervisor.
|
|
115
|
+
|
|
116
|
+
## User-Selected Terminal Watch
|
|
117
|
+
|
|
118
|
+
Terminal Watch is the read-only, user-intent-first path for observing an exact visible Codex or Claude Code terminal:
|
|
119
|
+
|
|
120
|
+
1. The user selects one complete `terminal_id`. A fresh `/akk list` and its advertised `available_actions.watch` are the safest discovery path, but advertisement is not authorization and its absence does not veto an explicit Watch request.
|
|
121
|
+
2. `agent_knock_knock_watch({terminal_id})`, or `/akk watch <exact-terminal-id>`, observes that exact endpoint/process and attempts to construct one privacy-safe exact task anchor. It does not acquire terminal-input or managed-owner authority.
|
|
122
|
+
3. If a unique provider task anchor is available, AKK creates `watch_mode="exact_task"`, `confidence="exact"`; missing or mismatched version evidence remains a warning and does not weaken that otherwise exact anchor. If task artifacts, native identity, or task boundaries cannot establish an anchor, AKK records warnings and creates `watch_mode="terminal_activity"`, `confidence="best_effort"` instead.
|
|
123
|
+
4. Status and cancellation target only the returned ID: `agent_knock_knock_status({watch_id})`, `/akk status <watch-id>`, `agent_knock_knock_unwatch({watch_id})`, or `/akk unwatch <watch-id>`.
|
|
124
|
+
5. Startup and periodic supervision observe and settle the same Watch, then deliver its durable notification outbox to the originating controller session.
|
|
125
|
+
|
|
126
|
+
Creating a Watch hard-fails only when the exact terminal is absent, its endpoint/process cannot be identified, neither a durable exact-task anchor nor a read-only screen-status activity path exists, or AKK cannot create/write the durable Watch Store. A missing or mismatched coding-agent version, unusable rollout/transcript artifact when screen activity remains observable, existing managed Turn or other ownership record, missing binding metadata, and missing `available_actions.watch` are diagnostics, never Watch vetoes. If the same exact active Watch already exists, AKK may return it rather than treating the request as a conflict. Because Watch is read-only, it can coexist with a managed monitor without adopting, superseding, or changing its Session/Turn; the managed monitor remains preferable when the user wants exact Turn attribution.
|
|
127
|
+
|
|
128
|
+
Every aggregate records a revision, exact terminal endpoint/process epoch, workspace, creation warnings, controller route, timestamps/deadline, lifecycle status, last activity, optional settlement, and an append-only notification outbox. An exact-task Watch additionally stores one privacy-safe provider anchor: Codex binds rollout identity and task request/turn byte boundaries; Claude binds transcript identity, root prompt, and current-turn byte boundaries. Exact durable completion already written to that anchor wins, while later replacement, truncation, successor task, changed boundary or fingerprint, or process/thread/endpoint drift invalidates that exact Watch instead of following a different task.
|
|
129
|
+
|
|
130
|
+
A terminal-activity Watch makes no task-identity claim. Its checkpoint must first observe activity (`working` or `awaiting_approval`) in the selected terminal/process epoch and then observe stable `idle` across consecutive reconciliation sweeps. That transition emits a completion-shaped callback with reason `terminal_activity_became_stably_idle`, but the callback and public status remain labeled `best_effort`: they prove only that observed terminal activity became idle, not that a particular task completed or succeeded. They carry no exact-task completion text. Starting from idle or unknown does not immediately settle; later activity must be seen first.
|
|
131
|
+
|
|
132
|
+
An approval observation appends at most one notification per exact fingerprint and leaves either Watch mode active. It never sends approval keys and never enters automatic approval; a human must inspect and decide in the TUI. Exact-task completion/failure, best-effort stable idle, timeout, invalidation, or explicit `unwatch` settles once and enqueues one terminal notification. Deterministic notification IDs and idempotency keys, append-only receipts, claim leases, and retry timestamps make callback recovery crash-safe: transport is at-least-once, while the idempotency key makes the logical notification effectively at-most-once.
|
|
133
|
+
|
|
134
|
+
The current core Host Adapter surface has 22 registered tools and emits list action-contract v30. Its Watch tools map to four internal CLI entries: `watch-terminal`, `watch-status`, `unwatch-terminal`, and `reconcile-watches`. These entries are an internal adapter boundary, not alternate raw terminal controls. The v30 ordinary Send shape remains `send({session_id|terminal_id,request})`; the agent-neutral user-explicit composer policy is advertised as `replace_current_composer_and_submit`, not as another model-supplied argument. The v28 Codex-named field remains a compatibility alias. The interaction tool consumes only the current same-controller Status projection and never exposes its private prompt fingerprint or terminal-key plan. The two foreground-identification tools are separate, advertised Codex-only operations and are never implicit ordinary-Send preprocessing.
|
|
135
|
+
|
|
136
|
+
## Native Thread Transitions
|
|
137
|
+
|
|
138
|
+
New/clear and resume are lifecycle transitions, not message types and not ordinary sends:
|
|
139
|
+
|
|
140
|
+
```text
|
|
141
|
+
verified idle terminal + private current-binding fence
|
|
142
|
+
├─ new_thread ────> new native thread + new AKK Session
|
|
143
|
+
└─ resume_thread ─> exact historical native thread + restored/new AKK Session
|
|
144
|
+
(no Turn created)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Before either transition, the public action supplies the exact full `terminal_id`; resume additionally supplies the complete `native_thread_id`. AKK then derives a fresh compare-and-swap binding fence and candidate fence privately, and requires a recognized adapter, a complete `x.y.z` agent version, an idle prompt, and no active or unresolved Turn. An exact regression-tested profile is a verification level, not an authorization gate; an unverified version remains callable and carries a compatibility warning. Human-facing numbers and collision-safe short IDs are scoped to a five-minute private runtime snapshot; AKK resolves them to the complete UUID before the structured action and revalidates the entire ordered candidate set, terminal dispatch generation, process, workspace, and binding before input. They are never model arguments or stored as native identity. A replaced or changed transcript/rollout cannot be resumed under stale metadata. `previous` is derived only from the current bound Session's latest committed transition and is advertised only when fresh discovery proves exactly one resumable source; static lineage and recency are not authority. Candidates from another workspace, archived or ambiguous threads, and threads active in another process are not resumable.
|
|
148
|
+
|
|
149
|
+
The lifecycle operation is serialized against send, approval, monitor, cancellation, and recovery work for that pane. AKK records the previous and next native identities, verifies the post-operation identity and idle prompt, creates or reactivates the corresponding AKK Session, and advances the binding generation. It fails closed if any identity or capability evidence is missing or changed. Monitor supervision never reclassifies a historical binding: only a later lifecycle listing may classify one bound historical Session as resumable when its recorded process has conclusively exited, and the resume mutation compare-and-swap detaches that binding before terminal input. Every first-line native slash command is rejected as ordinary task or answer text, including clear/new/resume/status, Codex fork/side-thread commands, and Claude conversation branching; supported context changes must use the lifecycle boundary.
|
|
150
|
+
|
|
151
|
+
For the next ordinary send, refresh `agent_knock_knock_list` and use only the resulting terminal row's advertised action. A `session_exact` action supplies `session_id`; a `terminal_follow_current` action supplies `terminal_id`. Either accepted action creates the context's first new `turn_id`. A callback, monitor, approval, receipt, or recovery action bound to an earlier Session, native identity, terminal incarnation, or binding generation cannot mutate the newly active context.
|
|
152
|
+
|
|
153
|
+
## Native Status Inspection
|
|
154
|
+
|
|
155
|
+
`agent_knock_knock_status` is an AKK Turn/screen inspection. It does not execute a coding-agent slash command. Native inspection is a separate terminal action advertised when the adapter, terminal identity, private binding fence, idle composer, and ownership state are currently safe. An unverified semantic agent version adds a warning but does not hide the action.
|
|
156
|
+
|
|
157
|
+
The `agent_knock_knock_native_inspect` contract accepts exactly two fields: the full `terminal_id` and `inspection="status"`. The adapter owns the closed command, and AKK derives the fresh binding fence internally; callers cannot supply a command string or opaque authority. Regression-tested profiles cover Codex 0.146.0/0.146.1/0.147.0/0.148.0/0.149.1/0.150.1/0.151.0/0.153.0/0.153.4/0.154.0/0.155.1 and Claude Code 2.1.218/2.1.226/2.1.237/2.1.251/2.1.259/2.1.263/2.1.266/2.1.267/2.1.285. Other complete `x.y.z` versions use the generic runtime profile with a compatibility warning; unchanged UI behavior succeeds, while incompatible behavior fails or is reported uncertain without automatic retry. Claude's modal Status panel must be freshly proven, parsed, dismissed once, and followed by the same idle empty composer. `/usage`, `/cost`, `/stats`, `/usage-credits`, `/model`, `/compact`, and arbitrary slash commands remain unavailable. Bare Codex `/usage` opens an interactive menu whose later Enter can select an account-side usage-limit reset, so it must not be treated as a read-only inspection.
|
|
158
|
+
|
|
159
|
+
Native model control is a separate two-step mutation based on explicit authority
|
|
160
|
+
for one exact physical pane/process. `model_options({terminal_id})` dynamically
|
|
161
|
+
captures the native model/reasoning catalog; `set_model` accepts only one exact
|
|
162
|
+
tuple from that same-controller offer. Profiled Codex 0.154.0/0.155.1 accepts either one exact
|
|
163
|
+
current native Session or a verified-zero-rollout pane, where
|
|
164
|
+
`identify_foreground` is not a prerequisite; Claude Code still requires one
|
|
165
|
+
exact current native Session. Both steps require no active Turn, approval,
|
|
166
|
+
questionnaire/editor, or read-only viewer. `model_options` normally requires
|
|
167
|
+
an idle empty Composer, but current List may bind it to one exact stable Codex
|
|
168
|
+
0.154 `/model` residual and authorize continuing only that slash command into
|
|
169
|
+
read-only discovery. Every native frame is revalidated under lock. An unproven
|
|
170
|
+
postcondition is `uncertain` and must not be retried automatically. Codex reports
|
|
171
|
+
`current_and_new_sessions` with the existing current-only Ultra exception;
|
|
172
|
+
Claude Code reports `current_session`.
|
|
173
|
+
|
|
174
|
+
A failed profiled Codex 0.154.0/0.155.1 model-control operation can expose both residual-bound
|
|
175
|
+
`model_options({terminal_id})` and the distinct cleanup-only
|
|
176
|
+
`repair_model_control({terminal_id})` action when List proves the same
|
|
177
|
+
exact physical pane/process, an exact profiled `/model` popup or exact bare
|
|
178
|
+
`/model` Composer, no active Turn, and no approval, questionnaire/editor, or
|
|
179
|
+
viewer. The trusted adapter consumes the residual-entry authority at the
|
|
180
|
+
`model_options` Enter boundary. After exact catalog discovery and dismissal to
|
|
181
|
+
an empty Composer, AKK derives a fresh ordinary binding/catalog offer for one
|
|
182
|
+
`set_model` attempt. Neither residual-entry nor repair authority is accepted by
|
|
183
|
+
`set_model`. Repair never presses Enter or accepts raw text/keys; success
|
|
184
|
+
requires an empty Composer. Refresh List and obtain a new model catalog
|
|
185
|
+
afterward. An uncertain repair cannot be retried automatically.
|
|
186
|
+
|
|
187
|
+
Foreground identification is a separate Codex-only capability for a physically
|
|
188
|
+
exact but durably ambiguous pane. `agent_knock_knock_identify_foreground`
|
|
189
|
+
accepts only the advertised `terminal_id`; it sends `/status` once and returns
|
|
190
|
+
a 30-second diagnostic proof while leaving the Store unchanged. That proof is
|
|
191
|
+
not an authority object and cannot be supplied to any later call.
|
|
192
|
+
`agent_knock_knock_identify_and_send` accepts the advertised `terminal_id` and
|
|
193
|
+
one `request`, and consumes the foreground observation only while the same
|
|
194
|
+
terminal lock remains held. It neither weakens exact request acceptance nor
|
|
195
|
+
turns the status UUID into durable identity.
|
|
196
|
+
|
|
197
|
+
Native inspection is serialized against send, lifecycle transition, approval, cancellation, monitoring terminal access, and recovery. It verifies the exact slash composer beyond the versioned Enter-suppression window, sends at most one Enter, proves one fresh bounded/redacted status result, and requires an idle postcondition. It creates no Session, Turn, dispatch receipt, monitor, callback, or response-round state. Any stale private fence, non-empty composer, identity/version drift, unresolved Turn/transition/dispatch, unproven Enter, or ambiguous result fails closed without a blind second Enter.
|
|
198
|
+
|
|
199
|
+
Ordinary `send` and `respond` continue to reject every first-line native slash command. Native inspection is a narrow capability boundary, not a slash-command allowlist.
|
|
200
|
+
|
|
201
|
+
## Message Types
|
|
202
|
+
|
|
203
|
+
| Type | Purpose |
|
|
204
|
+
| --- | --- |
|
|
205
|
+
| `task` | The controller Host starts a new Turn with work for the coding agent. |
|
|
206
|
+
| `answer` | The controller Host answers a question inside a `waiting_for_openclaw` Turn. |
|
|
207
|
+
| `progress` | AKK reports reliable non-final progress. |
|
|
208
|
+
| `blocked` | AKK reports that the task needs attention. |
|
|
209
|
+
| `done` | AKK reports that the current terminal turn completed. |
|
|
210
|
+
| `error` | AKK reports a terminal, monitor, callback, or protocol failure. |
|
|
211
|
+
| `control` | AKK records Turn-level control such as cancellation or timeout. |
|
|
212
|
+
|
|
213
|
+
The coding agent does not run a callback command and does not need an AKK-specific hook or plugin. AKK's terminal monitor owns callback delivery.
|
|
214
|
+
|
|
215
|
+
## Terminal Identity
|
|
216
|
+
|
|
217
|
+
Each managed Turn is bound to a concrete identity, including:
|
|
218
|
+
|
|
219
|
+
- coding agent (`codex` or `claude`)
|
|
220
|
+
- canonical working directory captured for this pane and Turn
|
|
221
|
+
- terminal provider endpoint and pane target
|
|
222
|
+
- pane and agent process identity
|
|
223
|
+
- native session evidence, AKK `session_id`, `turn_id`, and message identity
|
|
224
|
+
- terminal binding ID and generation, including the transition that established it
|
|
225
|
+
- monitor owner and lease
|
|
226
|
+
|
|
227
|
+
AKK revalidates that identity before sending tasks, interrupt keys, or approval input. Stale, changed, ambiguous, or replayed actions are rejected.
|
|
228
|
+
|
|
229
|
+
Approval authorization is prompt-scoped. Managed approval carries only `turn_id`; terminal-scoped approval carries only `terminal_id`, and both require explicit user confirmation. An adapter isolates one complete bounded approval region and keeps its exact unredacted bytes and fingerprint local. The plugin/CLI retains the private confirmation offer, recaptures it under lock, and rejects before an approval key if any prompt, choice, command/secret, process, cwd, owner, or request evidence changed. Missing or ambiguous prompt evidence is never downgraded to whole-screen or parsed-display authority. No prompt fingerprint or terminal token crosses the model-facing boundary.
|
|
230
|
+
|
|
231
|
+
The active Host runtime supervises eligible terminal monitors and Terminal Watches
|
|
232
|
+
independently of interactive commands. At startup and in one non-overlapping
|
|
233
|
+
five-second cycle, it runs managed-Turn monitor reconciliation and Terminal
|
|
234
|
+
Watch reconciliation as separate coordination steps with separate error
|
|
235
|
+
boundaries; a failure in either step does not starve the other. Managed monitor
|
|
236
|
+
reconciliation distinguishes a transient Store-lock timeout from proven binding
|
|
237
|
+
supersession and preserves the Turn's exactly-once completion claim across
|
|
238
|
+
monitor replacement. Watch reconciliation restores observation and retries its
|
|
239
|
+
durable idempotent callback outbox. Codex managed completion first scans the
|
|
240
|
+
exact accepted native turn in the rollout bound to the Turn; it does not fall
|
|
241
|
+
back to another same-workspace rollout after that exact detector reports an
|
|
242
|
+
identity or integrity failure. Detector limitations are retained in the Turn
|
|
243
|
+
event history for diagnosis.
|
|
244
|
+
|
|
245
|
+
## Human Handoff
|
|
246
|
+
|
|
247
|
+
The tmux or Herdr pane remains the source of visible truth:
|
|
248
|
+
|
|
249
|
+
- Attach to the shared terminal to inspect or continue the work yourself.
|
|
250
|
+
- Use AKK status for a bounded remote view.
|
|
251
|
+
- Send the next request to `session_id` only when AKK verifies the pane is idle; this creates a new Turn.
|
|
252
|
+
- Answer an in-flight agent question only through `respond(turn_id, answer)`.
|
|
253
|
+
- Interrupt the current turn without closing the pane.
|
|
254
|
+
- Renew monitoring only when the same live task remains in that pane.
|
|
255
|
+
|
|
256
|
+
This makes handoff reversible: the controller Host and the human operate the same coding-agent session instead of creating parallel, hidden conversations.
|
|
257
|
+
|
|
258
|
+
If a human context switch conflicts with an active Turn, AKK presents a decision rather than redirecting automatically. After explicit takeover confirmation, the model calls `agent_knock_knock_close({turn_id,reason:"superseded_by_human_context_switch"})`; the plugin/CLI privately resolves and revalidates the exact advertised handoff decision, so no live native UUID or handoff token is transported. Low-level binding repair is similarly explicit: `reconcile_binding({terminal_id,conflicting_session_id})` carries no Session revision, binding ID/generation, or token. Reconciliation only detaches the proven stale binding; it neither adopts the live thread nor sends terminal input.
|
|
259
|
+
|
|
260
|
+
Native clear/new/resume operations are separate Session-lifecycle features. Ordinary send and Turn creation do not invoke them; successful lifecycle transitions create no Turn.
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Codex CLI shared-backend control
|
|
2
|
+
|
|
3
|
+
AKK can control an existing Codex CLI conversation through its local shared
|
|
4
|
+
app-server. This route needs neither tmux nor Herdr, and does not type into the
|
|
5
|
+
terminal. The original CLI displays the same tasks, questions, approvals and
|
|
6
|
+
answers.
|
|
7
|
+
|
|
8
|
+
AKK 0.14.0 introduces this direct adapter. See the [README](../README.md) for
|
|
9
|
+
the first-task workflow and [OpenClaw installation](openclaw-operations.md#choose-one-installation-path)
|
|
10
|
+
for packaged and optional source installation.
|
|
11
|
+
|
|
12
|
+
## Discovery and use
|
|
13
|
+
|
|
14
|
+
Ask your controller to call AKK List. Its `conversations[]` collection includes
|
|
15
|
+
loaded main CLI threads from configured local Codex homes, supported physical
|
|
16
|
+
terminals, and Desktop candidates. Choose the returned `conversation_id` by
|
|
17
|
+
its title and working directory. Raw CLI output retains `codex_cli_sessions[]`
|
|
18
|
+
and the other provider arrays for diagnostics; they are not extra conversations
|
|
19
|
+
to present again. The opaque ID includes
|
|
20
|
+
the backend home and exact thread ID; a directory or title alone is never a
|
|
21
|
+
target identity. Child-agent threads and unloaded histories are excluded.
|
|
22
|
+
|
|
23
|
+
The existing tools accept a listed native conversation ID. The table describes
|
|
24
|
+
the shared-backend capabilities; terminal fallback retains its own evidence
|
|
25
|
+
and limitations:
|
|
26
|
+
|
|
27
|
+
| Tool | Native CLI behavior |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| List | Discover currently loaded main CLI threads, with backend version and activity flags |
|
|
30
|
+
| Status / native Status | Read exact task state and results; refresh pending approvals and questions |
|
|
31
|
+
| Send | Send one task to an idle thread, persist its submission, and create an exact task Watch |
|
|
32
|
+
| Watch | Attach to the uniquely active native task, including a task started manually in the CLI |
|
|
33
|
+
| Watch Status / Unwatch | Refresh the original task, or stop observation without stopping Codex |
|
|
34
|
+
| Approve | Accept once or reject a current command or file approval by its interaction ID |
|
|
35
|
+
| Respond Interaction | Answer blocking or asynchronous questions using advertised question and option IDs |
|
|
36
|
+
| Permission Options / Set Permissions | Read or set Read Only, Default, or Full Access for the current thread |
|
|
37
|
+
|
|
38
|
+
No additional confirmation is required by AKK for Full Access. Permission
|
|
39
|
+
updates use `thread/settings/update`, then check the effective setting. They
|
|
40
|
+
do not create a new task or modify global defaults. Send itself does not change
|
|
41
|
+
permissions.
|
|
42
|
+
|
|
43
|
+
For example, in a controller chat: “Find my Codex conversation for this project,
|
|
44
|
+
set its permissions to Default, then send this task and tell me when it finishes.”
|
|
45
|
+
The controller uses List, Permission Options, Set Permissions, then Send with
|
|
46
|
+
the returned native ID. Existing terminal and Desktop IDs retain their own
|
|
47
|
+
adapters and capabilities; callers use the advertised operation targets.
|
|
48
|
+
|
|
49
|
+
Operators can inspect only this inventory with:
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
agent-knock-knock codex-cli-list
|
|
53
|
+
agent-knock-knock status --conversation '<conversation_id from List>'
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
For native Watch and response commands, use the exact returned Watch or
|
|
57
|
+
interaction ID. Watch IDs can be UUIDs or deterministic submission hashes;
|
|
58
|
+
they are opaque, not values to construct.
|
|
59
|
+
|
|
60
|
+
## Automatic conversation routing (2026-10-10)
|
|
61
|
+
|
|
62
|
+
For conversation operations, select the conversation and requested action,
|
|
63
|
+
not a transport. The shared routing policy covers Status, Send, Watch,
|
|
64
|
+
native inspection, permissions, approvals and questions, and capability checks
|
|
65
|
+
for model and lifecycle operations. AKK prefers a compatible, reachable shared backend when it
|
|
66
|
+
proves that backend thread is the selected live conversation. Existing opaque
|
|
67
|
+
`codex-cli:v1:...` and `terminal:v...` IDs remain accepted; the Host tools also
|
|
68
|
+
accept a terminal ID as `conversation_id` for these operations.
|
|
69
|
+
|
|
70
|
+
A physical terminal and a backend thread are coalesced only with exact current
|
|
71
|
+
thread identity, the verified Codex home of the live process, and the physical
|
|
72
|
+
terminal/process incarnation. A configured default home, matching cwd, title,
|
|
73
|
+
launch `resume` UUID or frontend version alone does not establish that link.
|
|
74
|
+
Home evidence comes from the observed process and its open resources, including
|
|
75
|
+
the Codex arg0 lock when available. Missing or conflicting evidence leaves the
|
|
76
|
+
representations separate. `terminal_aliases[]` records proven associations;
|
|
77
|
+
`terminal_controls[]` retains their managed Turns, recovery and terminal-only
|
|
78
|
+
actions inside the same conversation row. These nested controls are not extra
|
|
79
|
+
tasks or permission to bypass their existing checks.
|
|
80
|
+
|
|
81
|
+
List does not type into terminals. A targeted conversation operation, including
|
|
82
|
+
ordinary Status, can use the existing advertised idle-only `/status` inspection
|
|
83
|
+
to discover a missing paginated-thread identity before choosing the backend.
|
|
84
|
+
Codex renders this as a visible native status card; it creates no user task.
|
|
85
|
+
The inspection must retain the same exact pane, process, home and thread and
|
|
86
|
+
pass its existing empty-Composer and prompt checks. It never interrupts a
|
|
87
|
+
working or blocked terminal to discover identity. Without fresh proof, AKK
|
|
88
|
+
retains the eligible terminal route rather than guessing a backend thread.
|
|
89
|
+
No cached UUID, startup command or latest same-directory history can replace
|
|
90
|
+
fresh proof. The public backend currently exposes loaded thread IDs but no
|
|
91
|
+
terminal PID-to-current-thread mapping. This inspection is not an arbitrary
|
|
92
|
+
slash-command interface and cannot target another pane.
|
|
93
|
+
|
|
94
|
+
Backend unavailability established before dispatch may select an eligible
|
|
95
|
+
terminal route. A native ID requires a unique, freshly proven physical alias
|
|
96
|
+
for fallback; AKK does not choose arbitrarily between multiple matching panes.
|
|
97
|
+
A busy thread, pending approval/question, identity conflict or invalid protocol
|
|
98
|
+
response is not treated as permission to bypass the backend through terminal
|
|
99
|
+
input. A send's stable message identity pins its selected route; failures or
|
|
100
|
+
uncertain outcomes after selection never trigger another transport attempt.
|
|
101
|
+
Existing submission ledgers also retain their original route across upgrade.
|
|
102
|
+
A replayed Send receipt is the original submission observation, not a fresh
|
|
103
|
+
completion check. Use Status with the returned task/Watch ID for current state.
|
|
104
|
+
Read the returned routing and delivery fields: physical Enter dispatch still
|
|
105
|
+
does not prove native task acceptance or an exact completion callback.
|
|
106
|
+
|
|
107
|
+
Backend task recovery supports `recover`, `renew`, `close`, `unwatch`, and
|
|
108
|
+
`retry_callback` using the exact returned task/Watch ID. Close releases Send
|
|
109
|
+
management; Unwatch only stops observation. See [backend task recovery](backend-task-recovery.md)
|
|
110
|
+
for ownership, original-task reconciliation and callback delivery boundaries.
|
|
111
|
+
|
|
112
|
+
An existing `watch_id` stays bound to its original native task or terminal
|
|
113
|
+
observation. Answers and approvals use the exact current action from that
|
|
114
|
+
Watch or conversation's Status; they are not migrated between transports.
|
|
115
|
+
Permission reads and changes prefer the backend. Approval and question replies
|
|
116
|
+
use the exact interaction advertised by fresh Status; terminal request IDs and
|
|
117
|
+
fingerprints are not translated into backend requests. Model inspection/change,
|
|
118
|
+
Ctrl-C cancellation, and terminal binding/menu recovery can retain their
|
|
119
|
+
terminal path only where that exact terminal advertises the capability.
|
|
120
|
+
New/clear/resume and resumable-thread listing for paginated Codex 0.158+ remain
|
|
121
|
+
unsupported by both paths; switching to a terminal does not enable them.
|
|
122
|
+
An unsupported backend operation is not a reason to create a replacement CLI
|
|
123
|
+
or mutate another thread. Desktop continues to use its original IPC owner.
|
|
124
|
+
|
|
125
|
+
The routing changes have isolated regression coverage for exact association,
|
|
126
|
+
rejected weak identities, preflight fallback, pinned send routes, receipt
|
|
127
|
+
normalization, and actual unified List output passing through compact Host
|
|
128
|
+
projection into semantic conversation operations. These use fixtures and local
|
|
129
|
+
recording relays. They are distinct from the real backend tests dated
|
|
130
|
+
2026-10-09 below: this change does not claim a new live Send, Watch or callback
|
|
131
|
+
verification. Normal development validation uses only the repository's fast
|
|
132
|
+
test tier; full/release suites remain publication gates.
|
|
133
|
+
|
|
134
|
+
## What the evidence means
|
|
135
|
+
|
|
136
|
+
List uses read-only discovery. `active_flags` can report waiting for approval or
|
|
137
|
+
input, but List does not subscribe to every conversation's requests. Its
|
|
138
|
+
`interaction_requests_scanned=false` and null pending count are not proof that
|
|
139
|
+
there are no questions. Status subscribes to the selected, already loaded thread
|
|
140
|
+
to retrieve current requests without terminal input.
|
|
141
|
+
|
|
142
|
+
A successful send is confirmed by the native thread, accepted turn and exact
|
|
143
|
+
client-message ID. An RPC acknowledgement alone is insufficient. AKK briefly
|
|
144
|
+
waits for newly accepted history to materialize; if still uncertain, the
|
|
145
|
+
persisted Watch continues observation and the send is never automatically
|
|
146
|
+
replayed. A repeated message ID returns the same durable task.
|
|
147
|
+
|
|
148
|
+
Completion means the specific native turn has settled and its items have been
|
|
149
|
+
read completely. It does not mean that the latest terminal screen looks idle,
|
|
150
|
+
or that another later task has finished. The callback outbox records delivery
|
|
151
|
+
attempts and does not blindly retry an ambiguous transport result.
|
|
152
|
+
|
|
153
|
+
Approvals and answers bind to the current thread, turn, item and stable
|
|
154
|
+
interaction ID. A reconnect refreshes connection-local request IDs. Responses
|
|
155
|
+
are persisted before dispatch. `sent` means the response was dispatched;
|
|
156
|
+
`confirmed` includes the returned evidence of exact asynchronous answer history
|
|
157
|
+
or subsequent native task progress. These evidence labels do not imply that
|
|
158
|
+
every response has an independent server acknowledgement.
|
|
159
|
+
|
|
160
|
+
A response proved `not_sent` may be explicitly requested again after refreshing
|
|
161
|
+
the same question; AKK revalidates it and records the new attempt. This does not
|
|
162
|
+
permit automatic replay of `sent` or `uncertain` responses.
|
|
163
|
+
|
|
164
|
+
## Compatibility and limits
|
|
165
|
+
|
|
166
|
+
| Evidence | Scope |
|
|
167
|
+
| --- | --- |
|
|
168
|
+
| Live-tested combination, 2026-10-09 | **macOS: Codex CLI 0.160.0 + shared app-server 0.162.0**; production-adapter operations and limits are recorded below. |
|
|
169
|
+
| Current local observation, 2026-10-10 | `codex --version` returned **0.162.1**. The installed daemon version marker and running daemon executable path also identified **0.162.1**. This read-only audit did not obtain a fresh runtime handshake or run an end-to-end task. |
|
|
170
|
+
| Runtime admission | A loaded main CLI thread, the selected local Codex home, valid stable `x.y.z` backend metadata, and the required live protocol shapes/methods. There is **no established numeric minimum** or exact version allowlist for direct control. |
|
|
171
|
+
| Platform evidence | The live proof was on macOS. It does not establish a Linux/Windows direct-control validation matrix. |
|
|
172
|
+
|
|
173
|
+
The [native RPC adapter](../src/codex-native-client-rpc.ts) selects
|
|
174
|
+
`read_contract` compatibility in the [app-server client](../src/codex-app-server-read-client.ts).
|
|
175
|
+
AKK checks backend identity and each operation's protocol contract instead of
|
|
176
|
+
requiring frontend/backend version equality. A valid version string alone does
|
|
177
|
+
not establish support. Unsupported methods or changed response shapes fail for
|
|
178
|
+
that operation with a diagnostic; unknown state never becomes task completion.
|
|
179
|
+
Prerelease version suffixes do not meet the stable version syntax check.
|
|
180
|
+
|
|
181
|
+
The **0.162.1** installation is an observation, not a minimum requirement or a
|
|
182
|
+
newly verified combination. No separate 0.162.1 end-to-end evidence was found in
|
|
183
|
+
this audit. A thread's `cliVersion` is creation metadata, not proof of the
|
|
184
|
+
currently attached frontend's executable version. The terminal TUI's
|
|
185
|
+
[audited version pairs](codex-0.160.0-compatibility.md) govern a different
|
|
186
|
+
adapter and must not be used as the direct-control version matrix.
|
|
187
|
+
|
|
188
|
+
The permission update API is experimental. Backends may evolve, so action-time
|
|
189
|
+
contract checks and the actual effective settings remain necessary.
|
|
190
|
+
|
|
191
|
+
### Implementation verification (2026-10-09)
|
|
192
|
+
|
|
193
|
+
The production CLI adapter, native monitor and durable callback outbox were
|
|
194
|
+
exercised against the version combination above in one isolated CLI launched
|
|
195
|
+
with the user's existing `mycodes --remote` wrapper. The shared daemon and
|
|
196
|
+
other working conversations were not restarted. Raw protocol calls were used
|
|
197
|
+
only to prepare the test thread's workspace, model and Plan mode; the actions
|
|
198
|
+
below used AKK's public CLI commands.
|
|
199
|
+
The original CLI display contained all seven task-result markers, confirming
|
|
200
|
+
that these were tasks in the attached CLI conversation.
|
|
201
|
+
|
|
202
|
+
The 2026-10-10 documentation audit rechecked the retained local evidence
|
|
203
|
+
manifest and all seven proof-file hashes. It confirmed the version pair above;
|
|
204
|
+
those private artifacts are not shipped with the package. The native
|
|
205
|
+
RPC/client/snapshot source hashes still matched; task-service and CLI routing
|
|
206
|
+
code have since changed. These historical proofs therefore do not certify the
|
|
207
|
+
new Recover/Renew/Close/Retry Callback implementation. Its current validation
|
|
208
|
+
boundary is recorded in [backend Recovery](backend-task-recovery.md#validation-boundary).
|
|
209
|
+
|
|
210
|
+
| Path | Observed result |
|
|
211
|
+
| --- | --- |
|
|
212
|
+
| Discovery and Status | Selected the dedicated main thread by exact ID and read its real task state |
|
|
213
|
+
| Send and automatic Watch | Accepted client-message ID bound to the exact native turn; repeated message ID did not create another turn |
|
|
214
|
+
| Completion and interaction callbacks | Production Host-profile transport acknowledged durable notifications; each tested completion delivered once |
|
|
215
|
+
| Explicit Watch / Unwatch | Attached to the already active turn; stopping that Watch left the native task running |
|
|
216
|
+
| Command and file approval | Exposed exact pending request, accepted it, and observed the same task finish |
|
|
217
|
+
| Blocking / asynchronous question | Exposed native question and option IDs, sent the chosen answer, and observed the same task finish with that answer |
|
|
218
|
+
| Permissions | All three presets read back correctly without a new turn; Full Access executed a write outside the test workspace |
|
|
219
|
+
| Monitor interruption | Stopped only the test monitor; host reconciliation recovered the original task's completion and delivered its callback once |
|
|
220
|
+
|
|
221
|
+
These implementation tests used a local Host-profile callback receiver. The
|
|
222
|
+
earlier PoC separately verified the existing OpenClaw transport through WeChat,
|
|
223
|
+
including user confirmation; a new WeChat delivery is not claimed by this run.
|
|
224
|
+
Protocol rejection, uncertain sends/responses, reconnect behavior and callback
|
|
225
|
+
lease recovery are also covered by fast regression tests. Network approvals,
|
|
226
|
+
multiline answers and rejection decisions have contract-level coverage; they
|
|
227
|
+
were not separately repeated against the live backend in this run. The full
|
|
228
|
+
and release test tiers are deferred to an actual publication under repository
|
|
229
|
+
policy. Final `npm run test:fast` passed **2,588/2,588** tests, including the build
|
|
230
|
+
and skill consistency check. `npm run validate:architecture` passed with no
|
|
231
|
+
import cycles, no hard-limit violations and no increase to the existing
|
|
232
|
+
complexity budget.
|
|
233
|
+
|
|
234
|
+
Only a CLI actually connected to a compatible shared backend appears in this
|
|
235
|
+
inventory. An embedded CLI backend does not become discoverable merely because
|
|
236
|
+
its history is readable. AKK does not restart Codex, switch a running CLI to a
|
|
237
|
+
different backend, or load an absent thread as a replacement session. The
|
|
238
|
+
existing tmux/Herdr route remains available for applicable terminal sessions.
|
|
239
|
+
|
|
240
|
+
This adapter does not add new-thread, resume-thread, model-change or interrupt
|
|
241
|
+
operations. Async answers target the still-active task; queued answers after
|
|
242
|
+
that task ends are not supported. Standard command/file approvals, Plan-mode
|
|
243
|
+
blocking questions and active-turn async questions are covered; specialized
|
|
244
|
+
MCP ownership verification is outside this adapter.
|
|
245
|
+
|
|
246
|
+
Official protocol reference: [Codex app-server](https://learn.chatgpt.com/docs/app-server).
|