@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,414 @@
|
|
|
1
|
+
# Codex Desktop support in AKK 0.14.0
|
|
2
|
+
|
|
3
|
+
AKK can discover an existing local Codex Desktop conversation, send a task to
|
|
4
|
+
its original Desktop owner, and monitor the exact native task for completion
|
|
5
|
+
or attention. It can notify and answer asynchronous questions in the same active
|
|
6
|
+
native task. It does not open a second CLI conversation from the same history.
|
|
7
|
+
Command/file approvals, blocking questions, session settings, and exact task interruption use that same original owner. Unsupported native request forms remain manual.
|
|
8
|
+
|
|
9
|
+
AKK 0.14.0 introduces these Desktop controls. See the [README](../README.md)
|
|
10
|
+
for the first-task workflow and [OpenClaw installation](openclaw-operations.md#choose-one-installation-path)
|
|
11
|
+
for packaged and optional source installation.
|
|
12
|
+
|
|
13
|
+
## Version and platform evidence
|
|
14
|
+
|
|
15
|
+
The reviewed application is macOS Codex Desktop `26.1002.52244`, build `13536`,
|
|
16
|
+
bundle ID `com.openai.codex`, installed as `/Applications/ChatGPT.app`. These
|
|
17
|
+
values come from the app's `Info.plist`, not the globally installed Codex CLI.
|
|
18
|
+
Its bundled Codex metadata identifies `0.162.0-alpha.2`; that embedded metadata
|
|
19
|
+
is not an app-server runtime handshake or a claim that every running process
|
|
20
|
+
uses that version.
|
|
21
|
+
|
|
22
|
+
A read-only audit on 2026-10-10 reconfirmed those installed bundle values.
|
|
23
|
+
[The runtime](../src/desktop-runtime.ts) currently reads that fixed application
|
|
24
|
+
path on Darwin and requires the correct bundle ID.
|
|
25
|
+
[The IPC client's write profile](../src/desktop-ipc-client.ts) requires both
|
|
26
|
+
the version and build to match exactly. This is **not a minimum version** or a
|
|
27
|
+
promise of compatibility with later builds. An unreviewed build may still
|
|
28
|
+
return a compatible read-only snapshot; that does not authorize native writes.
|
|
29
|
+
|
|
30
|
+
The app's own `LSMinimumSystemVersion=13.0` metadata is not an AKK-verified
|
|
31
|
+
minimum macOS version. No Desktop Linux/Windows or alternate installation-path
|
|
32
|
+
support is established. The private IPC handshake does not attest the running
|
|
33
|
+
owner's build, so an updated disk bundle with an older app still running remains
|
|
34
|
+
a compatibility limitation. The real task/interaction evidence below is dated
|
|
35
|
+
2026-10-09; the new [backend Recovery work](backend-task-recovery.md#validation-boundary)
|
|
36
|
+
has fast-regression coverage, not a new live Desktop proof.
|
|
37
|
+
|
|
38
|
+
## Capability boundary
|
|
39
|
+
|
|
40
|
+
| Operation | AKK 0.14.0 behavior |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| List | Default to persisted expanded sidebar membership; offer the broader saved catalog with explicit `desktop_view: "history"`; retain unconnected rows and support search, project filtering, and pagination |
|
|
43
|
+
| Status | Read a fresh snapshot from the exact local Desktop owner when available; report unknown live state when only metadata is available |
|
|
44
|
+
| Send | Verify a live, idle thread, persist a send intent, submit once to its original owner, and correlate native acceptance |
|
|
45
|
+
| Automatic monitoring | Retain a durable Watch for the accepted native task and reconcile uncertain acceptance without resending |
|
|
46
|
+
| Explicit Watch | Bind to one exact task already running in the selected Desktop conversation |
|
|
47
|
+
| Completion | Settle from the bound native task's terminal state and retain its result even if a later task starts |
|
|
48
|
+
| Asynchronous questions | Expose the question and options, notify the controller, and submit its explicit answer to the same active task |
|
|
49
|
+
| Blocking questions | Notify with all native questions and submit one complete typed answer to the exact pending request |
|
|
50
|
+
| Command/file approvals | Notify with the available current command or file preview; submit explicit accept-once or reject and confirm native item progression |
|
|
51
|
+
| Permissions | Apply Read Only, Default, or Full Access to this idle conversation and verify the effective policy |
|
|
52
|
+
| Model and mode | Read current settings; apply an explicitly requested model/effort and optional Plan/default mode; no model catalog is exposed |
|
|
53
|
+
| Cancellation | Interrupt the exact selected native task; an old task ID never cancels a newer task |
|
|
54
|
+
| Unwatch | Stop observation without cancelling or changing the Desktop task |
|
|
55
|
+
| Cold loading, resume, new conversation | Not supported by the Desktop adapter |
|
|
56
|
+
|
|
57
|
+
No Desktop operation types a slash command or uses terminal activity as exact
|
|
58
|
+
completion evidence. Existing terminal capabilities remain separate and retain
|
|
59
|
+
their previous checks.
|
|
60
|
+
|
|
61
|
+
## Find and select a conversation
|
|
62
|
+
|
|
63
|
+
Use `agent_knock_knock_list` through the controller Host. Select Desktop rows
|
|
64
|
+
from `conversations[]` using their title, project, and `conversation_id`;
|
|
65
|
+
`desktop_scan` carries catalog/pagination diagnostics. Raw CLI output also
|
|
66
|
+
retains `desktop_sessions[]` for operator compatibility. Desktop continues to
|
|
67
|
+
use its original IPC owner; backend-first CLI routing does not turn saved
|
|
68
|
+
Desktop history into a replacement CLI conversation.
|
|
69
|
+
The default `desktop_view: "sidebar"` follows persisted expanded sidebar
|
|
70
|
+
membership (`persisted_expanded_membership`): eligible pinned conversations
|
|
71
|
+
and members of expanded project groups, respecting supported saved layout
|
|
72
|
+
settings. It does not inspect the rendered screen, scrolling, per-window
|
|
73
|
+
temporary state, or a group's live Show More pagination. If the saved layout
|
|
74
|
+
is unsupported or unavailable, inspect the returned limitations; AKK does not
|
|
75
|
+
silently replace this view with all historical candidates.
|
|
76
|
+
|
|
77
|
+
Use `desktop_view: "history"` explicitly for the broader saved catalog,
|
|
78
|
+
including older or hidden conversations. Sidebar discovery and historical
|
|
79
|
+
discovery both retain unconnected candidates. Show those rows with their
|
|
80
|
+
connection state instead of reporting only conversations with Send enabled.
|
|
81
|
+
|
|
82
|
+
Narrow the result using `desktopSearch` for a title or path and
|
|
83
|
+
`desktopProject` for an exact project ID or absolute project directory.
|
|
84
|
+
`desktopLimit` bounds a page; pass the returned cursor as `desktopCursor` to
|
|
85
|
+
continue the same view and filters. A page is not the complete catalog.
|
|
86
|
+
`view` identifies the selected scope; `total_candidates` describes that view
|
|
87
|
+
after filtering. `history_candidates` counts the broader saved pool before
|
|
88
|
+
search filters. `sidebar_selection_scope: "persisted_expanded_membership"` identifies
|
|
89
|
+
the sidebar reconstruction; `sidebar_status` and `limitations` describe its
|
|
90
|
+
evidence boundary. `returned` and `live_count` describe only the returned page
|
|
91
|
+
(`live_probe_scope: "returned_page"`). Four live rows out of thirty
|
|
92
|
+
returned rows means twenty-six candidates are not proven live, not that only
|
|
93
|
+
four Desktop conversations were discovered.
|
|
94
|
+
|
|
95
|
+
Select the conversation using its title and project, then copy its complete
|
|
96
|
+
`desktop:v1:...` ID from List. This identity encodes the Codex home, host, and
|
|
97
|
+
native thread; it is independent of window position, display title, and the
|
|
98
|
+
current owner's temporary client ID. Do not construct it from a title, use a
|
|
99
|
+
terminal selector, or substitute a conversation with the same project.
|
|
100
|
+
|
|
101
|
+
Sidebar or historical membership does not mean a conversation is currently
|
|
102
|
+
loaded in Desktop. Some entries were created in CLI, some have an unknown
|
|
103
|
+
creator, and some no longer have a live owner. Membership uses saved Desktop
|
|
104
|
+
project and sidebar state, not an original-creator filter. Live capabilities
|
|
105
|
+
are checked separately.
|
|
106
|
+
|
|
107
|
+
If the chosen row has no verified live owner, open that exact conversation in
|
|
108
|
+
Desktop and refresh List. AKK does not load it implicitly or resume it through
|
|
109
|
+
CLI. Remote/cloud entries do not gain local write capability from catalog
|
|
110
|
+
metadata.
|
|
111
|
+
|
|
112
|
+
## Send and monitor
|
|
113
|
+
|
|
114
|
+
The structured tools use the Desktop conversation ID for selection and the
|
|
115
|
+
returned Watch ID for exact task monitoring:
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{ "tool": "agent_knock_knock_send", "arguments": {
|
|
119
|
+
"conversation_id": "desktop:v1:...", "request": "Summarize this project's test setup."
|
|
120
|
+
} }
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The controller supplies a stable message identity. Retain the returned
|
|
124
|
+
`desktop-watch:...` ID and query it with
|
|
125
|
+
`agent_knock_knock_status({watch_id})` if a callback is delayed. For a task
|
|
126
|
+
already running, use `agent_knock_knock_watch({conversation_id})`. Explicit
|
|
127
|
+
Watch requires an exact active native task; an idle or unknown conversation
|
|
128
|
+
does not create a best-effort activity Watch.
|
|
129
|
+
|
|
130
|
+
Equivalent CLI commands are:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
agent-knock-knock list --desktop-view sidebar
|
|
134
|
+
agent-knock-knock list --desktop-view history --desktop-search 'older title'
|
|
135
|
+
agent-knock-knock status --conversation 'desktop:v1:...'
|
|
136
|
+
agent-knock-knock send --conversation 'desktop:v1:...' \
|
|
137
|
+
--message 'Summarize this project.' --message-id 'one-stable-request-id' \
|
|
138
|
+
--openclaw-session 'initiating-controller-session' --background
|
|
139
|
+
agent-knock-knock watch-terminal --conversation 'desktop:v1:...' \
|
|
140
|
+
--openclaw-session 'initiating-controller-session'
|
|
141
|
+
agent-knock-knock watch-status --watch 'desktop-watch:...'
|
|
142
|
+
agent-knock-knock unwatch-terminal --watch 'desktop-watch:...' \
|
|
143
|
+
--openclaw-session 'initiating-controller-session'
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The examples contain placeholders: copy real IDs from List and Send/Watch.
|
|
147
|
+
Use a new message ID only for a genuinely new task. Repeating an ID recovers
|
|
148
|
+
its existing record rather than sending another task. A lost response or
|
|
149
|
+
uncertain receipt is not permission to retry with a different ID.
|
|
150
|
+
|
|
151
|
+
Conversation Status and task Status answer different questions. The former
|
|
152
|
+
reports the live conversation; the latter follows the original native task.
|
|
153
|
+
An idle conversation, a newer message, or a callback transport acknowledgement
|
|
154
|
+
does not by itself prove the selected task succeeded. A completion result may
|
|
155
|
+
be `completed`, `failed`, or `interrupted`; inspect the recorded outcome.
|
|
156
|
+
|
|
157
|
+
Asynchronous questions appear in `interaction_state` on fresh conversation or
|
|
158
|
+
Watch Status. The Watch sends a durable notification with the question and
|
|
159
|
+
options while the task continues working. A notification is not permission to
|
|
160
|
+
choose an answer: the controller refreshes Status, presents the question to the
|
|
161
|
+
user, and waits for their reply. It then refreshes Status and calls
|
|
162
|
+
`agent_knock_knock_respond_interaction` with the exact conversation or Watch,
|
|
163
|
+
interaction ID, and the advertised question/option IDs. Free-text answers are
|
|
164
|
+
also supported. Only `steer_current_turn` is supported; a completed task's
|
|
165
|
+
question cannot start another task.
|
|
166
|
+
|
|
167
|
+
The response is recorded before dispatch. Inspect later Status `response_state`
|
|
168
|
+
to recover its receipt without resending. The durable dispatcher deduplicates
|
|
169
|
+
repeated identical answers, but an expired or consumed Host offer does not
|
|
170
|
+
authorize another Respond call. A native acknowledgement is `sent`, not
|
|
171
|
+
`confirmed`; confirmation requires the matching accepted native answer in the
|
|
172
|
+
original task. An uncertain outcome is observed, never automatically replayed. Later Status
|
|
173
|
+
returns `response_state` so receipt recovery does not require resending an answer.
|
|
174
|
+
Answered questions disappear from the pending list. Undelivered reminders are
|
|
175
|
+
withdrawn when the question is answered or its task ends; an already delivered
|
|
176
|
+
notification cannot be recalled.
|
|
177
|
+
|
|
178
|
+
Blocking questions use the same response tool, with all advertised questions
|
|
179
|
+
answered together and no `delivery_mode`. Command/file approvals use
|
|
180
|
+
`agent_knock_knock_approve` with the exact conversation or Watch,
|
|
181
|
+
`interaction_id`, and `decision: "approve_once"` or `"reject"`. Refresh Status in
|
|
182
|
+
the same controller conversation before acting. Approval confirmation requires
|
|
183
|
+
the exact native command/file item to advance; a missing request or a completed
|
|
184
|
+
task alone is insufficient. Other native request forms remain manual.
|
|
185
|
+
|
|
186
|
+
## Settings and cancellation
|
|
187
|
+
|
|
188
|
+
`permission_options({conversation_id})` exposes `read-only`, `default`, and
|
|
189
|
+
`full-access`. `set_permissions({conversation_id,mode})` changes only this idle
|
|
190
|
+
conversation. Full Access is an ordinary option with no extra confirmation.
|
|
191
|
+
AKK verifies the effective permission profile, approval policy, reviewer, and
|
|
192
|
+
sandbox type before reporting `applied: true`; global defaults are unchanged.
|
|
193
|
+
For an idle conversation, `applies_to: "next_task"` reads resolved
|
|
194
|
+
`latestThreadSettings`. The app keeps `currentPermissions` from the last task
|
|
195
|
+
until another starts; during active work, permission inspection reports that
|
|
196
|
+
current task's actual policy instead.
|
|
197
|
+
|
|
198
|
+
`model_options({conversation_id})` reports the current model, reasoning effort,
|
|
199
|
+
and collaboration mode. The reviewed follower API has no model-list method:
|
|
200
|
+
`catalog_available` is false, not an empty or fabricated available-model list.
|
|
201
|
+
`set_model({conversation_id,model,reasoning_effort,collaboration_mode?})` accepts
|
|
202
|
+
an explicitly requested model ID. Optional mode is `plan` or `default`; omitting
|
|
203
|
+
it preserves the existing mode and custom instructions. Readback confirms the
|
|
204
|
+
effective settings, not model availability or account entitlement. Settings
|
|
205
|
+
changes require an idle conversation. Unknown outcomes are inspected, never
|
|
206
|
+
automatically replayed.
|
|
207
|
+
|
|
208
|
+
`cancel({watch_id})` targets the Watch's original native task.
|
|
209
|
+
`cancel({conversation_id,expected_native_turn_id})` uses the exact task ID from
|
|
210
|
+
fresh Status. Both use the native expected-turn interruption contract. An old
|
|
211
|
+
settled task returns its existing outcome without interrupting a newer task.
|
|
212
|
+
Cancellation may race with completion: report the observed native outcome,
|
|
213
|
+
not a promised interruption. `unwatch` only stops monitoring.
|
|
214
|
+
|
|
215
|
+
Desktop backend tasks also support `recover`, `renew`, managed `close`, and
|
|
216
|
+
manual `retry_callback` using their exact persisted task IDs, without terminal
|
|
217
|
+
fallback. Close ends Send management, while Unwatch leaves that management
|
|
218
|
+
intact. See [backend task recovery](backend-task-recovery.md) for deadline,
|
|
219
|
+
identity, callback retry and stopped-observation semantics.
|
|
220
|
+
|
|
221
|
+
## Protocol and persistence
|
|
222
|
+
|
|
223
|
+
OpenAI documents app-server threads, turns, and completion notifications in
|
|
224
|
+
its [app-server reference](https://learn.chatgpt.com/docs/app-server).
|
|
225
|
+
Those shared concepts explain the native task identifiers; the documented
|
|
226
|
+
app-server interface alone does not establish ownership of a conversation
|
|
227
|
+
already open in Desktop.
|
|
228
|
+
|
|
229
|
+
This adapter uses the app's private local IPC socket under the selected Codex
|
|
230
|
+
home. The reviewed route discovers the current thread owner, follows its
|
|
231
|
+
state stream, and submits through that owner. It validates socket ownership,
|
|
232
|
+
message shapes, peer identity, thread identity, revision freshness, pending
|
|
233
|
+
interactions, and the send receipt. Writes require the reviewed Desktop
|
|
234
|
+
version/build. This IPC surface is not an official stable third-party API;
|
|
235
|
+
an app upgrade may require another compatibility review.
|
|
236
|
+
|
|
237
|
+
Catalog reads copy supported SQLite database/WAL files to a private temporary
|
|
238
|
+
directory, validate the copy, and query it without opening the user's source
|
|
239
|
+
database through SQLite. AKK does not edit session databases or rely on an old
|
|
240
|
+
JSONL path for Desktop task state. Failed or changed catalog snapshots are
|
|
241
|
+
reported as incomplete evidence, not silently treated as an empty catalog.
|
|
242
|
+
|
|
243
|
+
Before sending, AKK persists the controller, target, request identity, and
|
|
244
|
+
submission intent. It then attempts one native submission. Recovery observes
|
|
245
|
+
native user-message/task evidence; it never replays a possibly sent request.
|
|
246
|
+
Watch state and callback outbox records survive an AKK process restart.
|
|
247
|
+
Callback retries use stable notification identity and bounded delivery
|
|
248
|
+
handling; an uncertain transport outcome remains uncertain rather than being
|
|
249
|
+
reported as delivery success.
|
|
250
|
+
|
|
251
|
+
The native send API has no atomic idle-and-send precondition. AKK checks a
|
|
252
|
+
fresh idle snapshot immediately before dispatch, but a human can start work
|
|
253
|
+
between that check and the app accepting input. This race can yield uncertain
|
|
254
|
+
task attribution. Do not operate the same conversation simultaneously when
|
|
255
|
+
you need an unambiguous handoff; inspect the native conversation and the saved
|
|
256
|
+
Watch instead of sending again. Reconnecting a follower may legitimately
|
|
257
|
+
advance the stream revision, so revision changes alone do not prove a new
|
|
258
|
+
task; owner, native task, input, and current state must agree.
|
|
259
|
+
|
|
260
|
+
## Evidence and limits
|
|
261
|
+
|
|
262
|
+
The implementation follows local read-only app/source inspection and a
|
|
263
|
+
dedicated Desktop proof on 2026-10-09. The proof sent a uniquely identified
|
|
264
|
+
benign message to the exact test thread, observed its native completion, and
|
|
265
|
+
the user confirmed the reply appeared in that same Desktop conversation.
|
|
266
|
+
A separate discovery pass retained previously missed unloaded/creator-unknown
|
|
267
|
+
candidates; the user confirmed the resulting five relevant conversations.
|
|
268
|
+
These observations establish the route and discovery strategy, not universal
|
|
269
|
+
support for every Desktop build, platform, or remote host.
|
|
270
|
+
|
|
271
|
+
The reviewed boundary does not cover Windows/Linux Desktop, cloud-hosted
|
|
272
|
+
threads, arbitrary installations of the app, automatic conversation loading,
|
|
273
|
+
automatic model catalog discovery, unsupported approval forms, or atomic
|
|
274
|
+
coordination with simultaneous human input. Completion generation and durable
|
|
275
|
+
delivery state must also be distinguished from successful delivery through an
|
|
276
|
+
external chat provider.
|
|
277
|
+
|
|
278
|
+
Development verification uses `npm run test:fast` plus relevant build and
|
|
279
|
+
architecture checks. The repository reserves full/release suites for an
|
|
280
|
+
actual publication gate; local development and installation do not authorize
|
|
281
|
+
those suites.
|
|
282
|
+
|
|
283
|
+
## Production-adapter verification — 2026-10-09
|
|
284
|
+
|
|
285
|
+
The 0.14.0 implementation was exercised against the reviewed macOS build,
|
|
286
|
+
using only the user's dedicated Desktop test conversation:
|
|
287
|
+
|
|
288
|
+
- The normal `list` command returned the live Desktop conversation alongside
|
|
289
|
+
terminal rows. Exact thread selection and read-only conversation Status agreed.
|
|
290
|
+
- Two benign tasks were submitted to that same original Desktop conversation.
|
|
291
|
+
One initially had unproven acceptance; its detached monitor later correlated
|
|
292
|
+
the persisted client message with the native task and observed completion,
|
|
293
|
+
without another submission.
|
|
294
|
+
- An explicit Watch added during the second task bound to the same native turn
|
|
295
|
+
as the automatic Watch. Both retained the exact completed result.
|
|
296
|
+
- Repeating the first task's stable message ID returned the original Watch;
|
|
297
|
+
the native latest-turn ID did not change.
|
|
298
|
+
- A local callback receiver exercised the existing OpenClaw `chat.send`
|
|
299
|
+
transport path and acknowledged each Watch's stable idempotency key. Each
|
|
300
|
+
Watch delivered one completion notification; subsequent reconciliation added
|
|
301
|
+
none. This verifies local callback creation, dispatch, acknowledgement, and
|
|
302
|
+
durable settlement. Real Gateway/WeChat delivery was not exercised.
|
|
303
|
+
|
|
304
|
+
`npm run test:fast` passed **2529 tests**, including Desktop protocol,
|
|
305
|
+
correlation, CLI/tool routing, persistence, manual-attention fixtures, and
|
|
306
|
+
existing terminal regressions. Build, architecture and refactor-evidence
|
|
307
|
+
validators passed without increasing architecture budgets. Full/release tests
|
|
308
|
+
were not run because this was an implementation round, not publication.
|
|
309
|
+
Those initial implementation tests did not exercise manual questions/approvals,
|
|
310
|
+
app restart during a task, unloaded-thread activation, or alternate app builds.
|
|
311
|
+
Later verification and the asynchronous-question change are recorded below.
|
|
312
|
+
|
|
313
|
+
The installed app bundle identifies the reviewed version. The private IPC
|
|
314
|
+
handshake does not attest the live owner's build; installations where the
|
|
315
|
+
running app and its on-disk bundle differ remain a compatibility boundary.
|
|
316
|
+
|
|
317
|
+
## Asynchronous-question repair — 2026-10-09
|
|
318
|
+
|
|
319
|
+
A dedicated-thread reproduction confirmed that Desktop stores asynchronous
|
|
320
|
+
questions on `agentMessage.delivery = "async"` with `questions`, while
|
|
321
|
+
`requests` can remain empty. The original adapter dropped these fields and
|
|
322
|
+
missed the notification. The repaired adapter reads both structures and
|
|
323
|
+
recognizes accepted native replies, including steering messages that later
|
|
324
|
+
materialize as canonical user messages.
|
|
325
|
+
|
|
326
|
+
The changed production semantic tools and compiled CLI were exercised against
|
|
327
|
+
the same reviewed Desktop build, without installing the patch:
|
|
328
|
+
|
|
329
|
+
- A choice question appeared in Watch Status and delivered one durable
|
|
330
|
+
question notification. The advertised Green option was submitted through
|
|
331
|
+
`respond_interaction`; exact native answer evidence confirmed the response,
|
|
332
|
+
and the original task completed with Green.
|
|
333
|
+
- A free-text question appeared in conversation Status. Orchid was submitted
|
|
334
|
+
to that exact conversation through the same tool, and the original task
|
|
335
|
+
completed with Orchid. Later Status exposed the confirmed `response_state`.
|
|
336
|
+
- Repeating each answer recovered the same confirmed response record, with no
|
|
337
|
+
additional task. Answered questions disappeared, and each task delivered one
|
|
338
|
+
completion callback.
|
|
339
|
+
|
|
340
|
+
These two repair proofs used the production Host-profile callback transport
|
|
341
|
+
with a local receiver; this patch was not installed into the running Gateway
|
|
342
|
+
and no new WeChat delivery is claimed. The earlier Desktop completion proof
|
|
343
|
+
separately reached WeChat and was confirmed by the user. A preliminary native
|
|
344
|
+
PoC was also repeated before implementing the repair.
|
|
345
|
+
|
|
346
|
+
Fast regressions cover incomplete history, stale questions, owner/turn changes,
|
|
347
|
+
unknown dispatch outcomes, explicit retries after proven non-dispatch, response
|
|
348
|
+
recovery through Status, cross-Watch deduplication, and retirement of unsent
|
|
349
|
+
obsolete notifications. Partial history is unknown, not proof that a question
|
|
350
|
+
was answered. Native async-answer acknowledgement and exact answer confirmation
|
|
351
|
+
remain separate states. That repair alone did not enable approvals, blocking responses, or settings.
|
|
352
|
+
The subsequent implementation below adds those controls; cold loading remains unsupported.
|
|
353
|
+
|
|
354
|
+
The final repair check passed `npm run test:fast` (**2622/2622**), including its
|
|
355
|
+
build, plus `npm run validate:architecture`, `npm run validate:refactor-evidence`
|
|
356
|
+
and `git diff --check`. Architecture budgets were unchanged. Full/integration
|
|
357
|
+
and release suites were not run under the repository's development test policy.
|
|
358
|
+
|
|
359
|
+
## Native controls implementation — 2026-10-09
|
|
360
|
+
|
|
361
|
+
The production semantic tools, compiled CLI, durable response store, and Watch
|
|
362
|
+
monitor were exercised against the same reviewed Desktop build in the dedicated
|
|
363
|
+
test conversation. This round did not rely on direct proof-script responses:
|
|
364
|
+
all task sends, answers, approvals, settings changes, and cancellation used the
|
|
365
|
+
AKK product entry points.
|
|
366
|
+
|
|
367
|
+
Eight native tasks verified:
|
|
368
|
+
|
|
369
|
+
- Read Only command approval accepted and execution observed; a separate command
|
|
370
|
+
rejected, with its proposed file demonstrably absent.
|
|
371
|
+
- File approval accepted and the exact expected file contents observed.
|
|
372
|
+
- Plan-mode blocking input answered both native questions in one typed response;
|
|
373
|
+
native answer records and the original task's final result agreed.
|
|
374
|
+
- Default-mode asynchronous input answered in the same running task, preserving
|
|
375
|
+
the earlier async-question repair.
|
|
376
|
+
- Default permission mode allowed a benign workspace write; Full Access allowed
|
|
377
|
+
a benign write to a dedicated directory outside that workspace. Native task
|
|
378
|
+
permissions and file contents confirmed both effects.
|
|
379
|
+
- An exact Watch cancelled its own active task. The native state and callback
|
|
380
|
+
reported `interrupted`; repeating cancellation for that settled native ID
|
|
381
|
+
returned its existing outcome without issuing another interruption.
|
|
382
|
+
|
|
383
|
+
Seven tasks completed and one was intentionally interrupted. Each produced one
|
|
384
|
+
settlement callback; all five approval/question interactions also produced
|
|
385
|
+
attention notifications and confirmed response records. This round used the
|
|
386
|
+
production Host-profile callback transport with a local receiver, not a new
|
|
387
|
+
Gateway/WeChat delivery test. Earlier user-confirmed WeChat evidence remains
|
|
388
|
+
separate.
|
|
389
|
+
|
|
390
|
+
The same product controls changed the model and reasoning effort, switched
|
|
391
|
+
Plan/default mode, and verified the effective collaboration settings. They then
|
|
392
|
+
restored the original model, effort, mode, and permission preset. Test files were
|
|
393
|
+
removed after verifying their exact contents; the conversation was left idle
|
|
394
|
+
and its test monitors exited. No unrelated conversation was used.
|
|
395
|
+
|
|
396
|
+
One real readback issue was corrected during this verification: idle setting
|
|
397
|
+
updates replace `latestThreadSettings`, while `currentPermissions` remains the
|
|
398
|
+
last task's applied policy. AKK now distinguishes next-task settings from active
|
|
399
|
+
task permissions instead of incorrectly timing out on an already-applied change.
|
|
400
|
+
Regression coverage preserves both native fields and rejects partial preset
|
|
401
|
+
matches. Model confirmation likewise uses the effective collaboration tuple,
|
|
402
|
+
not only a top-level model cache.
|
|
403
|
+
|
|
404
|
+
Limitations still include automatic new/cold-resume operations, model catalog
|
|
405
|
+
and account-availability discovery, unsupported native request forms, alternate
|
|
406
|
+
Desktop builds/platforms, and atomic coordination with simultaneous human input.
|
|
407
|
+
No package publication or local installation was performed in this round.
|
|
408
|
+
|
|
409
|
+
Final checks passed `npm run test:fast` (**2662/2662**, including the build),
|
|
410
|
+
`npm run validate:architecture`, `npm run validate:refactor-evidence`, Skill
|
|
411
|
+
synchronization/validation, and `git diff --check`. Architecture budgets were
|
|
412
|
+
unchanged. Full/integration/release suites were skipped under the development
|
|
413
|
+
test policy. An additional native settings check confirmed that changing only
|
|
414
|
+
model/effort preserves the current mode, then restored the original settings.
|