@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.
Files changed (270) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/CONTRIBUTING.md +212 -0
  3. package/README.md +105 -166
  4. package/connectors/deepseek-harness/LICENSE +21 -0
  5. package/connectors/deepseek-harness/README.md +406 -0
  6. package/connectors/pi/LICENSE +21 -0
  7. package/connectors/pi/README.md +446 -0
  8. package/dist/src/backend-recovery-semantic.d.ts +16 -0
  9. package/dist/src/backend-recovery-semantic.js +113 -0
  10. package/dist/src/backend-recovery-semantic.js.map +1 -0
  11. package/dist/src/backend-task-recovery.d.ts +103 -0
  12. package/dist/src/backend-task-recovery.js +142 -0
  13. package/dist/src/backend-task-recovery.js.map +1 -0
  14. package/dist/src/callback-transport.d.ts +8 -0
  15. package/dist/src/callback-transport.js +14 -0
  16. package/dist/src/callback-transport.js.map +1 -1
  17. package/dist/src/cli-core.js +18 -8
  18. package/dist/src/cli-core.js.map +1 -1
  19. package/dist/src/cli-runtime-context.d.ts +5 -0
  20. package/dist/src/cli-runtime-context.js.map +1 -1
  21. package/dist/src/codex-native-cli-adapter.d.ts +6 -0
  22. package/dist/src/codex-native-cli-adapter.js +273 -0
  23. package/dist/src/codex-native-cli-adapter.js.map +1 -0
  24. package/dist/src/codex-native-client-interactions.d.ts +6 -0
  25. package/dist/src/codex-native-client-interactions.js +124 -0
  26. package/dist/src/codex-native-client-interactions.js.map +1 -0
  27. package/dist/src/codex-native-client-rpc.d.ts +21 -0
  28. package/dist/src/codex-native-client-rpc.js +137 -0
  29. package/dist/src/codex-native-client-rpc.js.map +1 -0
  30. package/dist/src/codex-native-client.d.ts +42 -0
  31. package/dist/src/codex-native-client.js +326 -0
  32. package/dist/src/codex-native-client.js.map +1 -0
  33. package/dist/src/codex-native-identity.d.ts +6 -0
  34. package/dist/src/codex-native-identity.js +42 -0
  35. package/dist/src/codex-native-identity.js.map +1 -0
  36. package/dist/src/codex-native-monitor.d.ts +4 -0
  37. package/dist/src/codex-native-monitor.js +92 -0
  38. package/dist/src/codex-native-monitor.js.map +1 -0
  39. package/dist/src/codex-native-outbox.d.ts +16 -0
  40. package/dist/src/codex-native-outbox.js +120 -0
  41. package/dist/src/codex-native-outbox.js.map +1 -0
  42. package/dist/src/codex-native-public-projection.d.ts +545 -0
  43. package/dist/src/codex-native-public-projection.js +182 -0
  44. package/dist/src/codex-native-public-projection.js.map +1 -0
  45. package/dist/src/codex-native-record-store.d.ts +27 -0
  46. package/dist/src/codex-native-record-store.js +111 -0
  47. package/dist/src/codex-native-record-store.js.map +1 -0
  48. package/dist/src/codex-native-response-service.d.ts +69 -0
  49. package/dist/src/codex-native-response-service.js +244 -0
  50. package/dist/src/codex-native-response-service.js.map +1 -0
  51. package/dist/src/codex-native-runtime.d.ts +46 -0
  52. package/dist/src/codex-native-runtime.js +112 -0
  53. package/dist/src/codex-native-runtime.js.map +1 -0
  54. package/dist/src/codex-native-semantic.d.ts +17 -0
  55. package/dist/src/codex-native-semantic.js +175 -0
  56. package/dist/src/codex-native-semantic.js.map +1 -0
  57. package/dist/src/codex-native-snapshot.d.ts +19 -0
  58. package/dist/src/codex-native-snapshot.js +160 -0
  59. package/dist/src/codex-native-snapshot.js.map +1 -0
  60. package/dist/src/codex-native-state-store.d.ts +61 -0
  61. package/dist/src/codex-native-state-store.js +132 -0
  62. package/dist/src/codex-native-state-store.js.map +1 -0
  63. package/dist/src/codex-native-task-service.d.ts +71 -0
  64. package/dist/src/codex-native-task-service.js +502 -0
  65. package/dist/src/codex-native-task-service.js.map +1 -0
  66. package/dist/src/codex-native-types.d.ts +92 -0
  67. package/dist/src/codex-native-types.js +15 -0
  68. package/dist/src/codex-native-types.js.map +1 -0
  69. package/dist/src/conversation-list.d.ts +12 -0
  70. package/dist/src/conversation-list.js +30 -0
  71. package/dist/src/conversation-list.js.map +1 -0
  72. package/dist/src/conversation-route-dispatch.d.ts +13 -0
  73. package/dist/src/conversation-route-dispatch.js +66 -0
  74. package/dist/src/conversation-route-dispatch.js.map +1 -0
  75. package/dist/src/conversation-route-legacy.d.ts +18 -0
  76. package/dist/src/conversation-route-legacy.js +54 -0
  77. package/dist/src/conversation-route-legacy.js.map +1 -0
  78. package/dist/src/conversation-route-store.d.ts +51 -0
  79. package/dist/src/conversation-route-store.js +126 -0
  80. package/dist/src/conversation-route-store.js.map +1 -0
  81. package/dist/src/conversation-routing-cli-adapter.d.ts +12 -0
  82. package/dist/src/conversation-routing-cli-adapter.js +211 -0
  83. package/dist/src/conversation-routing-cli-adapter.js.map +1 -0
  84. package/dist/src/conversation-routing-commands.d.ts +11 -0
  85. package/dist/src/conversation-routing-commands.js +85 -0
  86. package/dist/src/conversation-routing-commands.js.map +1 -0
  87. package/dist/src/conversation-routing-home.d.ts +26 -0
  88. package/dist/src/conversation-routing-home.js +105 -0
  89. package/dist/src/conversation-routing-home.js.map +1 -0
  90. package/dist/src/conversation-routing-identity.d.ts +40 -0
  91. package/dist/src/conversation-routing-identity.js +174 -0
  92. package/dist/src/conversation-routing-identity.js.map +1 -0
  93. package/dist/src/conversation-runtime-route-store.d.ts +11 -0
  94. package/dist/src/conversation-runtime-route-store.js +118 -0
  95. package/dist/src/conversation-runtime-route-store.js.map +1 -0
  96. package/dist/src/desktop-async-interactions.d.ts +15 -0
  97. package/dist/src/desktop-async-interactions.js +88 -0
  98. package/dist/src/desktop-async-interactions.js.map +1 -0
  99. package/dist/src/desktop-async-state.d.ts +5 -0
  100. package/dist/src/desktop-async-state.js +53 -0
  101. package/dist/src/desktop-async-state.js.map +1 -0
  102. package/dist/src/desktop-cli-adapter.d.ts +7 -0
  103. package/dist/src/desktop-cli-adapter.js +322 -0
  104. package/dist/src/desktop-cli-adapter.js.map +1 -0
  105. package/dist/src/desktop-cli-controls.d.ts +9 -0
  106. package/dist/src/desktop-cli-controls.js +45 -0
  107. package/dist/src/desktop-cli-controls.js.map +1 -0
  108. package/dist/src/desktop-command-presentation.d.ts +2 -0
  109. package/dist/src/desktop-command-presentation.js +31 -0
  110. package/dist/src/desktop-command-presentation.js.map +1 -0
  111. package/dist/src/desktop-control-semantic.d.ts +8 -0
  112. package/dist/src/desktop-control-semantic.js +68 -0
  113. package/dist/src/desktop-control-semantic.js.map +1 -0
  114. package/dist/src/desktop-identity.d.ts +5 -0
  115. package/dist/src/desktop-identity.js +40 -0
  116. package/dist/src/desktop-identity.js.map +1 -0
  117. package/dist/src/desktop-interaction-projection.d.ts +57 -0
  118. package/dist/src/desktop-interaction-projection.js +196 -0
  119. package/dist/src/desktop-interaction-projection.js.map +1 -0
  120. package/dist/src/desktop-interaction-state.d.ts +3 -0
  121. package/dist/src/desktop-interaction-state.js +48 -0
  122. package/dist/src/desktop-interaction-state.js.map +1 -0
  123. package/dist/src/desktop-ipc-async-answer.d.ts +9 -0
  124. package/dist/src/desktop-ipc-async-answer.js +71 -0
  125. package/dist/src/desktop-ipc-async-answer.js.map +1 -0
  126. package/dist/src/desktop-ipc-client.d.ts +47 -0
  127. package/dist/src/desktop-ipc-client.js +400 -0
  128. package/dist/src/desktop-ipc-client.js.map +1 -0
  129. package/dist/src/desktop-ipc-native-operations.d.ts +11 -0
  130. package/dist/src/desktop-ipc-native-operations.js +126 -0
  131. package/dist/src/desktop-ipc-native-operations.js.map +1 -0
  132. package/dist/src/desktop-ipc-transport.d.ts +13 -0
  133. package/dist/src/desktop-ipc-transport.js +123 -0
  134. package/dist/src/desktop-ipc-transport.js.map +1 -0
  135. package/dist/src/desktop-list.d.ts +25 -0
  136. package/dist/src/desktop-list.js +55 -0
  137. package/dist/src/desktop-list.js.map +1 -0
  138. package/dist/src/desktop-metadata-reader.d.ts +30 -0
  139. package/dist/src/desktop-metadata-reader.js +182 -0
  140. package/dist/src/desktop-metadata-reader.js.map +1 -0
  141. package/dist/src/desktop-monitor.d.ts +4 -0
  142. package/dist/src/desktop-monitor.js +101 -0
  143. package/dist/src/desktop-monitor.js.map +1 -0
  144. package/dist/src/desktop-public-projection.d.ts +6 -0
  145. package/dist/src/desktop-public-projection.js +134 -0
  146. package/dist/src/desktop-public-projection.js.map +1 -0
  147. package/dist/src/desktop-request-interactions.d.ts +14 -0
  148. package/dist/src/desktop-request-interactions.js +144 -0
  149. package/dist/src/desktop-request-interactions.js.map +1 -0
  150. package/dist/src/desktop-response-dispatch.d.ts +14 -0
  151. package/dist/src/desktop-response-dispatch.js +19 -0
  152. package/dist/src/desktop-response-dispatch.js.map +1 -0
  153. package/dist/src/desktop-response-evidence.d.ts +4 -0
  154. package/dist/src/desktop-response-evidence.js +19 -0
  155. package/dist/src/desktop-response-evidence.js.map +1 -0
  156. package/dist/src/desktop-response-service.d.ts +11 -0
  157. package/dist/src/desktop-response-service.js +188 -0
  158. package/dist/src/desktop-response-service.js.map +1 -0
  159. package/dist/src/desktop-response-store.d.ts +35 -0
  160. package/dist/src/desktop-response-store.js +58 -0
  161. package/dist/src/desktop-response-store.js.map +1 -0
  162. package/dist/src/desktop-response-types.d.ts +20 -0
  163. package/dist/src/desktop-response-types.js +2 -0
  164. package/dist/src/desktop-response-types.js.map +1 -0
  165. package/dist/src/desktop-response-value.d.ts +6 -0
  166. package/dist/src/desktop-response-value.js +31 -0
  167. package/dist/src/desktop-response-value.js.map +1 -0
  168. package/dist/src/desktop-runtime.d.ts +153 -0
  169. package/dist/src/desktop-runtime.js +88 -0
  170. package/dist/src/desktop-runtime.js.map +1 -0
  171. package/dist/src/desktop-semantic.d.ts +21 -0
  172. package/dist/src/desktop-semantic.js +140 -0
  173. package/dist/src/desktop-semantic.js.map +1 -0
  174. package/dist/src/desktop-session-catalog.d.ts +68 -0
  175. package/dist/src/desktop-session-catalog.js +225 -0
  176. package/dist/src/desktop-session-catalog.js.map +1 -0
  177. package/dist/src/desktop-session-controls.d.ts +145 -0
  178. package/dist/src/desktop-session-controls.js +176 -0
  179. package/dist/src/desktop-session-controls.js.map +1 -0
  180. package/dist/src/desktop-sidebar-metadata.d.ts +27 -0
  181. package/dist/src/desktop-sidebar-metadata.js +83 -0
  182. package/dist/src/desktop-sidebar-metadata.js.map +1 -0
  183. package/dist/src/desktop-sidebar-projects.d.ts +10 -0
  184. package/dist/src/desktop-sidebar-projects.js +31 -0
  185. package/dist/src/desktop-sidebar-projects.js.map +1 -0
  186. package/dist/src/desktop-sidebar-selection.d.ts +28 -0
  187. package/dist/src/desktop-sidebar-selection.js +85 -0
  188. package/dist/src/desktop-sidebar-selection.js.map +1 -0
  189. package/dist/src/desktop-snapshot-details.d.ts +4 -0
  190. package/dist/src/desktop-snapshot-details.js +116 -0
  191. package/dist/src/desktop-snapshot-details.js.map +1 -0
  192. package/dist/src/desktop-snapshot.d.ts +11 -0
  193. package/dist/src/desktop-snapshot.js +276 -0
  194. package/dist/src/desktop-snapshot.js.map +1 -0
  195. package/dist/src/desktop-state-store.d.ts +72 -0
  196. package/dist/src/desktop-state-store.js +269 -0
  197. package/dist/src/desktop-state-store.js.map +1 -0
  198. package/dist/src/desktop-task-interactions.d.ts +10 -0
  199. package/dist/src/desktop-task-interactions.js +93 -0
  200. package/dist/src/desktop-task-interactions.js.map +1 -0
  201. package/dist/src/desktop-task-recovery.d.ts +38 -0
  202. package/dist/src/desktop-task-recovery.js +171 -0
  203. package/dist/src/desktop-task-recovery.js.map +1 -0
  204. package/dist/src/desktop-task-service.d.ts +54 -0
  205. package/dist/src/desktop-task-service.js +441 -0
  206. package/dist/src/desktop-task-service.js.map +1 -0
  207. package/dist/src/desktop-types.d.ts +281 -0
  208. package/dist/src/desktop-types.js +13 -0
  209. package/dist/src/desktop-types.js.map +1 -0
  210. package/dist/src/host-monitor-reconciliation.js +36 -4
  211. package/dist/src/host-monitor-reconciliation.js.map +1 -1
  212. package/dist/src/host-profile-runtime.js +7 -3
  213. package/dist/src/host-profile-runtime.js.map +1 -1
  214. package/dist/src/local-codex-cli-adapter.d.ts +7 -0
  215. package/dist/src/local-codex-cli-adapter.js +13 -0
  216. package/dist/src/local-codex-cli-adapter.js.map +1 -0
  217. package/dist/src/openclaw-callback-transport.js +2 -1
  218. package/dist/src/openclaw-callback-transport.js.map +1 -1
  219. package/dist/src/semantic-conversation-target.d.ts +4 -0
  220. package/dist/src/semantic-conversation-target.js +20 -0
  221. package/dist/src/semantic-conversation-target.js.map +1 -0
  222. package/dist/src/semantic-permission-control.js +47 -9
  223. package/dist/src/semantic-permission-control.js.map +1 -1
  224. package/dist/src/semantic-private-authority-offers.d.ts +1 -1
  225. package/dist/src/semantic-private-authority-offers.js +3 -1
  226. package/dist/src/semantic-private-authority-offers.js.map +1 -1
  227. package/dist/src/semantic-tool-command-helpers.d.ts +6 -0
  228. package/dist/src/semantic-tool-command-helpers.js +199 -78
  229. package/dist/src/semantic-tool-command-helpers.js.map +1 -1
  230. package/dist/src/semantic-tool-descriptions.d.ts +2 -1
  231. package/dist/src/semantic-tool-descriptions.js +81 -35
  232. package/dist/src/semantic-tool-descriptions.js.map +1 -1
  233. package/dist/src/semantic-tool-list-projection.js +66 -2
  234. package/dist/src/semantic-tool-list-projection.js.map +1 -1
  235. package/dist/src/semantic-tool-presentation.js +76 -7
  236. package/dist/src/semantic-tool-presentation.js.map +1 -1
  237. package/dist/src/semantic-tool-runtime.js +129 -29
  238. package/dist/src/semantic-tool-runtime.js.map +1 -1
  239. package/dist/src/semantic-tool-schemas.d.ts +410 -27
  240. package/dist/src/semantic-tool-schemas.js +176 -88
  241. package/dist/src/semantic-tool-schemas.js.map +1 -1
  242. package/dist/src/terminal-action-contracts.js +10 -6
  243. package/dist/src/terminal-action-contracts.js.map +1 -1
  244. package/dist/src/terminal-list-cli-adapter.d.ts +1 -0
  245. package/dist/src/terminal-list-cli-adapter.js +6 -3
  246. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  247. package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
  248. package/dist/src/terminal-permission-control-list-projection.d.ts +1 -1
  249. package/dist/src/terminal-user-send-intent.d.ts +2 -0
  250. package/dist/src/terminal-user-send-intent.js +11 -3
  251. package/dist/src/terminal-user-send-intent.js.map +1 -1
  252. package/docs/architecture/current-architecture.md +313 -0
  253. package/docs/architecture/interactive-terminal-response.md +276 -0
  254. package/docs/architecture/issue-126-final-report.md +248 -0
  255. package/docs/architecture/orchestration-refactor-history.md +2987 -0
  256. package/docs/architecture/orchestration-refactor.md +21 -0
  257. package/docs/backend-task-recovery.md +89 -0
  258. package/docs/bidirectional-agent-protocol.md +260 -0
  259. package/docs/codex-cli-native-compatibility.md +246 -0
  260. package/docs/codex-desktop-compatibility.md +414 -0
  261. package/docs/openclaw-operations.md +281 -0
  262. package/docs/openclaw-session-turn-delivery-requirement.md +45 -0
  263. package/docs/operator-guide.md +543 -0
  264. package/docs/storage-and-logging.md +91 -0
  265. package/docs/test-performance-issue-108.md +80 -0
  266. package/docs/test-performance-issue-120.md +226 -0
  267. package/docs/testing.md +628 -0
  268. package/openclaw.plugin.json +7 -3
  269. package/package.json +6 -13
  270. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +66 -15
@@ -0,0 +1,211 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import path from "node:path";
3
+ import { cliDependencies, cliEnv, cliNow, cliNowMs, cliPid, cliSleepSync, writeCliStdout, runCliCommandExecution, setCliExitCode } from "./cli-runtime-context.js";
4
+ import { codexNativeRuntimeOptions } from "./codex-native-cli-adapter.js";
5
+ import { createCodexNativeRuntime } from "./codex-native-runtime.js";
6
+ import { isCodexNativeConversationId, parseCodexNativeConversationId } from "./codex-native-identity.js";
7
+ import { nativeErrorCode } from "./codex-native-task-service.js";
8
+ import { parseTerminalConversationId } from "./terminal-agent-adapter.js";
9
+ import { associateConversationRoutes, resolveNativeTerminalRoute, proveNativeTerminalRoute, withClosedStatusInspection, canonicalTerminalRouteId, terminalRouteIdsMatch } from "./conversation-routing-identity.js";
10
+ import { createConversationRuntimeRouteStore } from "./conversation-runtime-route-store.js";
11
+ import { dispatchConversationRoute } from "./conversation-route-dispatch.js";
12
+ import { createFileLockCliAdapter } from "./file-lock-cli-adapter.js";
13
+ import { recordValue, nonBlankString } from "./value-guards.js";
14
+ import { terminalSubmissionPayload } from "./terminal-dispatch-execution.js";
15
+ import { isCodexPaginatedReadCandidate } from "./codex-lifecycle-compatibility.js";
16
+ import { selectLegacyConversationRoute } from "./conversation-route-legacy.js";
17
+ import { defaultStoreDir } from "./store.js";
18
+ import { expandHome } from "./cli-command-runtime.js";
19
+ import { conversationCommandPolicy, conversationRoutedOptions, prepareConversationTerminalOptions, routedCommand } from "./conversation-routing-commands.js";
20
+ const preflightUnavailable = new Set(["ENOENT", "ECONNREFUSED", "ECONNRESET", "ENOTSOCK", "ETIMEDOUT", "closed", "timeout", "unsupported_capability", "thread_not_loaded"]);
21
+ export async function executeConversationCommand(command, options, terminals, execute) {
22
+ if (await dispatchRoutedConversationCli(command, options, {
23
+ terminals: cliDependencies().conversationRoutingTerminals ?? terminals,
24
+ execute: async (selectedCommand, selectedOptions) => {
25
+ const result = await runCliCommandExecution(selectedCommand, selectedOptions, { ...cliDependencies(), stdout: undefined }, () => execute(selectedCommand, selectedOptions));
26
+ setCliExitCode(result.exitCode);
27
+ return JSON.parse(result.stdout);
28
+ }
29
+ }))
30
+ return;
31
+ await execute(command, options);
32
+ }
33
+ /** A read failure is fallback evidence only here, before either task transport is invoked. */
34
+ export function backendPreflightUnavailable(error) {
35
+ const value = recordValue(error);
36
+ return preflightUnavailable.has(nativeErrorCode(error)) && value?.dispatchState !== "unknown" && value?.dispatchState !== "accepted";
37
+ }
38
+ export async function dispatchRoutedConversationCli(command, original, ports) {
39
+ const target = routingTarget(command, original);
40
+ if (!target || !command)
41
+ return false;
42
+ const options = { ...original };
43
+ if (command === "send")
44
+ options.messageId ??= randomUUID();
45
+ const configuration = codexNativeRuntimeOptions(options);
46
+ const runtime = (cliDependencies().createCodexNativeRuntime ?? createCodexNativeRuntime)(configuration);
47
+ const identityOptions = {};
48
+ const input = command === "send" ? {
49
+ controllerSession: nonBlankString(options.openclawSession) ?? "agent:main:main",
50
+ messageId: String(options.messageId), requestText: String(options.message ?? options.request ?? ""), canonicalTarget: target
51
+ } : undefined;
52
+ const terminalRuntimeDir = cliEnv().AKK_RUNTIME_DIR ? path.resolve(expandHome(cliEnv().AKK_RUNTIME_DIR)) : path.join(path.dirname(defaultStoreDir()), "runtime-v2");
53
+ const locks = createFileLockCliAdapter({ now: cliNow, nowMs: cliNowMs, pid: cliPid, sleepSync: cliSleepSync });
54
+ try {
55
+ const result = await dispatchConversationRoute({ command, input,
56
+ store: input ? createConversationRuntimeRouteStore(configuration.storeDir, terminalRuntimeDir, locks, { now: cliNow }) : undefined,
57
+ select: async () => canonicalRouteSelection(await ((input ? selectLegacyConversationRoute({ input, nativeTasks: runtime.tasks,
58
+ expectedTerminalToken: nonBlankString(options.expectedTerminalToken), managedOnly: options.managedOnly === true,
59
+ terminalRuntimeDir }) : undefined)
60
+ ?? selectConversationRoute({ command, target, options, runtime, ports, identityOptions }))),
61
+ execute: async (choice) => {
62
+ const selectedOptions = conversationRoutedOptions(command, options, choice.route, choice.targetId);
63
+ const selectedCommand = routedCommand(command, options, choice.route);
64
+ if (choice.route === "terminal")
65
+ await prepareTerminalFallback({ command: selectedCommand, target, choice, selectedOptions, options, ports, identityOptions });
66
+ return ports.execute(selectedCommand, selectedOptions);
67
+ }
68
+ });
69
+ writeCliStdout(JSON.stringify(result, null, 2) + "\n");
70
+ return true;
71
+ }
72
+ finally {
73
+ await runtime.close();
74
+ }
75
+ }
76
+ function canonicalRouteSelection(choice) {
77
+ return choice.route === "terminal" ? { ...choice, targetId: canonicalTerminalRouteId(choice.targetId) } : choice;
78
+ }
79
+ function routingTarget(command, original) {
80
+ const target = nonBlankString(original.conversation ?? original.conversationId ?? original.terminal ?? original.session);
81
+ if (!command || !target || !conversationCommandPolicy(command, original))
82
+ return undefined;
83
+ const native = isCodexNativeConversationId(target);
84
+ const terminal = native ? undefined : parseTerminalConversationId(target);
85
+ if (!native && terminal?.agent !== "codex")
86
+ return undefined;
87
+ // Diagnostic managed-only sends intentionally bypass physical inventory and routing.
88
+ if (terminal && original.managedOnly === true)
89
+ return undefined;
90
+ assertRoutedInput(command, original, native);
91
+ return target;
92
+ }
93
+ function assertRoutedInput(command, original, native) {
94
+ if (!native && command === "send")
95
+ terminalSubmissionPayload(String(original.message ?? original.request ?? ""));
96
+ if (["conversation", "conversationId", "terminal", "session"].filter(key => original[key] !== undefined).length !== 1) {
97
+ throw new Error("Conversation routing accepts exactly one conversation or terminal target");
98
+ }
99
+ if (command === "send" && (original.type ?? "task") !== "task")
100
+ throw new Error("ordinary send only accepts message type task");
101
+ }
102
+ async function prepareTerminalFallback(input) {
103
+ const { command, target, choice, selectedOptions, options, ports, identityOptions } = input;
104
+ const rows = await ports.terminals(options, canonicalTerminalRouteId(choice.targetId));
105
+ if (rows.length !== 1 || !terminalRouteIdsMatch(rows[0].id, choice.targetId) || isCodexNativeConversationId(target) && proveNativeTerminalRoute(target, rows[0], identityOptions).status !== "exact") {
106
+ throw new Error("The selected conversation no longer has its exact terminal fallback; no input was sent");
107
+ }
108
+ prepareConversationTerminalOptions(command, selectedOptions, rows[0]);
109
+ }
110
+ async function selectConversationRoute(input) {
111
+ const { target, options, runtime, ports, identityOptions } = input;
112
+ if (isCodexNativeConversationId(target))
113
+ return selectNativeConversationRoute(input);
114
+ const terminalId = canonicalTerminalRouteId(target);
115
+ const terminals = await ports.terminals(options, terminalId);
116
+ if (terminals.length !== 1 || !terminalRouteIdsMatch(terminals[0].id, target))
117
+ throw new Error("The exact selected terminal is unavailable");
118
+ const policy = conversationCommandPolicy(input.command, options);
119
+ if (!policy.backend)
120
+ return { route: "terminal", targetId: terminalId, reason: "backend_operation_unavailable" };
121
+ const discovery = await runtime.catalog.discover();
122
+ const unsafe = discovery.errors.find(error => !preflightUnavailable.has(error.error_code));
123
+ if (unsafe)
124
+ throw new Error(`Backend discovery failed verification: ${unsafe.error_code}; no terminal fallback was attempted`);
125
+ const rows = discovery.sessions.map(entry => ({ id: entry.nativeId, conversation_id: entry.nativeId,
126
+ native_thread_id: entry.threadId, source: "codex_cli", agent: "codex", connection_state: "loaded_backend_verified" }));
127
+ let match = associateConversationRoutes(terminals, rows, identityOptions).associations[0];
128
+ // All supported conversation operations share identity acquisition. The existing closed transaction
129
+ // may briefly inspect an idle CLI; a working/blocked terminal is never disturbed to learn its thread.
130
+ if (!match && rows.length && mayInspectMissingAlias(terminals[0])) {
131
+ match = await inspectMissingAlias(input, terminals[0], rows);
132
+ }
133
+ if (!match) {
134
+ if (policy.requireBackend)
135
+ throw new Error("The native interaction requires its exact backend identity; no terminal response was sent");
136
+ return { route: "terminal", targetId: terminalId, reason: rows.length ? "native_identity_unresolved" : "backend_unavailable" };
137
+ }
138
+ try {
139
+ const snapshot = await runtime.read(parseCodexNativeConversationId(match.nativeId));
140
+ if (snapshot.threadId !== match.threadId || snapshot.thread.id !== match.threadId)
141
+ throw new Error("Backend conversation identity mismatch");
142
+ if (snapshot.loaded)
143
+ return { route: "native", targetId: match.nativeId, reason: "exact_terminal_alias" };
144
+ }
145
+ catch (error) {
146
+ if (!backendPreflightUnavailable(error))
147
+ throw error;
148
+ }
149
+ if (policy.requireBackend)
150
+ throw new Error("The native interaction backend is unavailable; no terminal response was sent");
151
+ return { route: "terminal", targetId: terminalId, reason: "backend_unavailable" };
152
+ }
153
+ async function selectNativeConversationRoute(input) {
154
+ const { target, options, runtime, ports, identityOptions } = input;
155
+ const identity = parseCodexNativeConversationId(target);
156
+ const policy = conversationCommandPolicy(input.command, options);
157
+ if (policy.backend) {
158
+ try {
159
+ const snapshot = await runtime.read(identity);
160
+ if (snapshot.threadId !== identity.threadId || snapshot.thread.id !== identity.threadId)
161
+ throw new Error("Backend conversation identity mismatch");
162
+ if (snapshot.loaded)
163
+ return { route: "native", targetId: target, reason: "backend_available" };
164
+ }
165
+ catch (error) {
166
+ if (!backendPreflightUnavailable(error))
167
+ throw error;
168
+ }
169
+ }
170
+ if (policy.requireBackend)
171
+ throw new Error("The native interaction backend is unavailable; no terminal response was sent");
172
+ const proof = resolveNativeTerminalRoute(target, await ports.terminals(options), identityOptions);
173
+ if (proof.status !== "exact")
174
+ throw new Error(`${policy.backend ? "Backend unavailable" : "AKK has no equivalent backend operation"}; no unique verified terminal fallback: ${proof.reason}`);
175
+ return { route: "terminal", targetId: canonicalTerminalRouteId(proof.association.terminalId), reason: policy.backend ? "backend_unavailable" : "backend_operation_unavailable" };
176
+ }
177
+ function mayInspectMissingAlias(terminal) {
178
+ if (terminal.activity_state !== "idle" || recordValue(terminal.approval_state)?.blocked === true)
179
+ return false;
180
+ if (!nonBlankString(terminal.native_agent_codex_home ?? terminal.codex_home))
181
+ return false;
182
+ if (!isCodexPaginatedReadCandidate(terminal.agent_version) || nonBlankString(terminal.native_agent_session_id))
183
+ return false;
184
+ const observation = recordValue(terminal.native_agent_identity_observation);
185
+ return (observation?.status ?? terminal.native_identity_state) === "verified_absent";
186
+ }
187
+ async function inspectMissingAlias(input, before, rows) {
188
+ const prior = { ...before };
189
+ if (!terminalRouteIdsMatch(prior.id, input.target))
190
+ throw new Error("Native status inspection did not find the exact selected terminal; no task input was sent");
191
+ const terminalId = canonicalTerminalRouteId(input.target);
192
+ const action = recordValue(recordValue(before.available_actions)?.native_inspect);
193
+ const args = recordValue(action?.arguments);
194
+ if (action?.tool !== "agent_knock_knock_native_inspect" || !nonBlankString(args?.expected_binding_token))
195
+ return undefined;
196
+ const observation = await input.ports.execute("native-inspect", inspectionOptions(input.options, terminalId, String(args.expected_binding_token)));
197
+ const after = await input.ports.terminals(input.options, terminalId);
198
+ if (after.length !== 1)
199
+ throw new Error("Native status inspection lost its exact terminal; no task input was sent");
200
+ const inspected = withClosedStatusInspection(prior, after[0], observation);
201
+ const result = associateConversationRoutes([inspected], rows, input.identityOptions);
202
+ const ambiguous = result.unassociated.find(item => item.reason !== "matching_loaded_backend_not_found");
203
+ if (ambiguous)
204
+ throw new Error(`Native status inspection could not safely resolve its backend: ${ambiguous.reason}; no task input was sent`);
205
+ return result.associations[0];
206
+ }
207
+ function inspectionOptions(options, target, token) {
208
+ return { storeDir: options.storeDir, logDir: options.logDir, codexHome: options.codexHome,
209
+ terminal: target, inspection: "status", expectedBindingToken: token };
210
+ }
211
+ //# sourceMappingURL=conversation-routing-cli-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-routing-cli-adapter.js","sourceRoot":"","sources":["../../src/conversation-routing-cli-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ type Options = Record<string, unknown>;
2
+ /** Provider support, not a version allowlist. Bound Turn/Watch operations never change provider. */
3
+ export declare function conversationCommandPolicy(command: string, options: Options): {
4
+ backend: boolean;
5
+ requireBackend: boolean;
6
+ } | undefined;
7
+ export declare function routedCommand(command: string, options: Options, route: "native" | "terminal"): string;
8
+ /** Read/catalog authority may be refreshed. A displayed mutation offer must never be invented. */
9
+ export declare function prepareConversationTerminalOptions(command: string, selected: Options, row: Options): void;
10
+ export declare function conversationRoutedOptions(command: string, options: Options, route: "native" | "terminal", targetId: string): Options;
11
+ export {};
@@ -0,0 +1,85 @@
1
+ import { nonBlankString, recordValue } from "./value-guards.js";
2
+ import { isCodexNativeConversationId } from "./codex-native-identity.js";
3
+ const backendCommands = new Set(["send", "status", "watch-terminal", "native-status", "permission-options", "set-permissions"]);
4
+ const terminalCommands = new Set(["model-options", "set-model", "cancel", "new-thread", "clear-thread", "resume-thread",
5
+ "list-resumable-threads", "threads", "identify-foreground", "repair-model-control", "reconcile-binding", "close"]);
6
+ const interactionCommands = new Set(["approve", "respond-interaction"]);
7
+ const nativeInteraction = /^codex-native-interaction:[0-9a-f]{64}$/u;
8
+ const nativePermissionModes = { read_only: "read-only", ask_for_approval: "default", full_access: "full-access" };
9
+ /** Provider support, not a version allowlist. Bound Turn/Watch operations never change provider. */
10
+ export function conversationCommandPolicy(command, options) {
11
+ if (options.watch || options.turn || options.respond)
12
+ return undefined;
13
+ if (interactionCommands.has(command)) {
14
+ const backend = isCodexNativeConversationId(options.conversation ?? options.conversationId ?? options.terminal ?? options.session)
15
+ || nativeInteraction.test(String(options.interaction ?? "")) || String(options.interaction ?? "").startsWith("codex-native-interaction:");
16
+ return { backend, requireBackend: backend };
17
+ }
18
+ if (command === "native-inspect")
19
+ return {
20
+ backend: ["status", "permissions"].includes(String(options.action ?? options.inspection ?? "status")), requireBackend: false
21
+ };
22
+ if (command === "set-permissions" && options.mode === "approve_for_me")
23
+ return { backend: false, requireBackend: false };
24
+ if (backendCommands.has(command))
25
+ return { backend: true, requireBackend: options.routingRequireNative === true };
26
+ if (terminalCommands.has(command))
27
+ return { backend: false, requireBackend: false };
28
+ return undefined;
29
+ }
30
+ export function routedCommand(command, options, route) {
31
+ if (command === "native-status")
32
+ return "native-inspect";
33
+ if (route === "terminal" && command === "native-inspect" && (options.action ?? options.inspection) === "permissions")
34
+ return "permission-options";
35
+ return command;
36
+ }
37
+ /** Read/catalog authority may be refreshed. A displayed mutation offer must never be invented. */
38
+ export function prepareConversationTerminalOptions(command, selected, row) {
39
+ const actions = recordValue(row.available_actions);
40
+ const action = command === "send" ? "send" : command === "native-inspect" ? "native_inspect" : command.replaceAll("-", "_");
41
+ const args = recordValue(recordValue(actions?.[action])?.arguments);
42
+ if (command === "send") {
43
+ if (!nonBlankString(selected.expectedTerminalToken) && !nonBlankString(args?.expected_terminal_token)) {
44
+ throw new Error("Exact terminal fallback cannot currently accept this task");
45
+ }
46
+ // Existing explicit Send authority is revalidated by the dispatch boundary, even when List
47
+ // cannot advertise a new offer. Never turn this routing preflight into a second UI veto.
48
+ selected.expectedTerminalToken ??= args?.expected_terminal_token;
49
+ selected.expectedManagedTerminalToken ??= args?.expected_managed_terminal_token;
50
+ }
51
+ else if (["native-inspect", "permission-options", "model-options", "new-thread", "clear-thread", "repair-model-control"].includes(command)) {
52
+ if (!nonBlankString(selected.expectedBindingToken)) {
53
+ const authority = command === "clear-thread" ? recordValue(recordValue(actions?.new_thread)?.arguments) : args;
54
+ if (!nonBlankString(authority?.expected_binding_token))
55
+ throw new Error(`Exact terminal fallback cannot currently perform ${command}; refresh AKK List`);
56
+ selected.expectedBindingToken = authority.expected_binding_token;
57
+ }
58
+ }
59
+ else if (["set-permissions", "set-model"].includes(command)) {
60
+ if (!nonBlankString(selected.expectedBindingToken) || !nonBlankString(selected.expectedCatalogFingerprint)) {
61
+ throw new Error(`Backend operation is unavailable; refresh ${command === "set-model" ? "model-options" : "permission-options"} before using its terminal fallback`);
62
+ }
63
+ }
64
+ if (command === "native-inspect")
65
+ selected.inspection ??= "status";
66
+ }
67
+ export function conversationRoutedOptions(command, options, route, targetId) {
68
+ const result = { ...options };
69
+ for (const key of ["conversation", "conversationId", "terminal", "session", "routingRequireNative"])
70
+ delete result[key];
71
+ result.conversation = targetId;
72
+ if (route === "native") {
73
+ for (const key of ["expectedTerminalToken", "expectedManagedTerminalToken", "expectedBindingToken", "expectedCatalogFingerprint"])
74
+ delete result[key];
75
+ result.openclawSession ??= "agent:main:main";
76
+ result.action ??= result.inspection;
77
+ if (command === "set-permissions" && Object.hasOwn(nativePermissionModes, String(result.mode))) {
78
+ result.mode = nativePermissionModes[String(result.mode)];
79
+ }
80
+ }
81
+ else
82
+ result.inspection ??= result.action;
83
+ return result;
84
+ }
85
+ //# sourceMappingURL=conversation-routing-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-routing-commands.js","sourceRoot":"","sources":["../../src/conversation-routing-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ type Row = Record<string, unknown>;
2
+ export type ConversationRoutingHome = {
3
+ status: "verified";
4
+ codexHome: string;
5
+ evidence: "open_arg0_lock";
6
+ } | {
7
+ status: "unavailable" | "ambiguous";
8
+ reason: string;
9
+ };
10
+ export interface ConversationRoutingHomePorts {
11
+ processBirth(pid: number): string;
12
+ openFiles(pid: number): {
13
+ status: number | null;
14
+ stdout: string;
15
+ error?: unknown;
16
+ };
17
+ }
18
+ /** Codex retains a .lock descriptor in its CODEX_HOME/tmp/arg0 entry for its lifetime.
19
+ * Inspect names and inode identity only;
20
+ * never read its environment, log contents, credentials, or chat history.
21
+ * Official implementation: codex-rs/arg0/src/lib.rs, prepare_path_entry_for_codex_aliases.
22
+ */
23
+ export declare function readConversationRoutingHome(terminal: Row, ports?: Partial<ConversationRoutingHomePorts>): ConversationRoutingHome;
24
+ /** Attach private physical evidence to a raw terminal row; scan configuration is not proof. */
25
+ export declare function withConversationRoutingHome(terminal: Row, ports?: Partial<ConversationRoutingHomePorts>): Row;
26
+ export {};
@@ -0,0 +1,105 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { resolveOptionalExecutable } from "./cli-command-runtime.js";
5
+ import { codexProcessBirthForLifecycle } from "./codex-process-incarnation.js";
6
+ import { parseLsofOpenFiles } from "./codex-open-rollout-inventory.js";
7
+ const unavailable = (reason) => ({ status: "unavailable", reason });
8
+ /** Codex retains a .lock descriptor in its CODEX_HOME/tmp/arg0 entry for its lifetime.
9
+ * Inspect names and inode identity only;
10
+ * never read its environment, log contents, credentials, or chat history.
11
+ * Official implementation: codex-rs/arg0/src/lib.rs, prepare_path_entry_for_codex_aliases.
12
+ */
13
+ export function readConversationRoutingHome(terminal, ports = {}) {
14
+ const pid = terminal.pid, expectedBirth = terminal.native_agent_process_birth;
15
+ if (terminal.agent !== "codex" || terminal.process_state !== "active" || !Number.isSafeInteger(pid) || Number(pid) < 2 ||
16
+ typeof expectedBirth !== "string" || !expectedBirth.trim())
17
+ return unavailable("physical_process_incarnation_missing");
18
+ const birth = ports.processBirth ?? codexProcessBirthForLifecycle;
19
+ try {
20
+ if (birth(Number(pid)) !== expectedBirth)
21
+ return unavailable("physical_process_incarnation_changed");
22
+ const files = (ports.openFiles ?? processOpenFiles)(Number(pid));
23
+ if (files.status !== 0 || files.error)
24
+ return unavailable("process_open_files_unavailable");
25
+ const result = homeFromOpenFiles(Number(pid), files.stdout);
26
+ if (birth(Number(pid)) !== expectedBirth)
27
+ return unavailable("physical_process_incarnation_changed");
28
+ return result;
29
+ }
30
+ catch {
31
+ return unavailable("process_home_observation_failed");
32
+ }
33
+ }
34
+ /** Attach private physical evidence to a raw terminal row; scan configuration is not proof. */
35
+ export function withConversationRoutingHome(terminal, ports = {}) {
36
+ if (terminal.agent !== "codex")
37
+ return terminal;
38
+ const observation = readConversationRoutingHome(terminal, ports);
39
+ return { ...terminal, native_agent_codex_home: observation.status === "verified" ? observation.codexHome : undefined,
40
+ native_agent_codex_home_observation: observation };
41
+ }
42
+ function processOpenFiles(pid) {
43
+ const result = spawnSync(resolveOptionalExecutable("lsof"), ["-a", "-p", String(pid), "-FnfDit"], {
44
+ encoding: "utf8", timeout: 5000, maxBuffer: 2 * 1024 * 1024
45
+ });
46
+ return { status: result.status, stdout: String(result.stdout ?? ""), error: result.error };
47
+ }
48
+ function homeFromOpenFiles(pid, output) {
49
+ const processes = output.split(/\r?\n/u).filter(line => line.startsWith("p"));
50
+ if (processes.length !== 1 || processes[0] !== `p${pid}`)
51
+ return unavailable("process_open_files_identity_mismatch");
52
+ const candidates = parseLsofOpenFiles(output).filter(file => file.path && arg0Home(file.path.replace(/ \(deleted\)$/u, "")));
53
+ if (!candidates.length)
54
+ return unavailable("codex_home_descriptor_missing");
55
+ if (candidates.length > 128)
56
+ return unavailable("codex_home_descriptor_limit");
57
+ const homes = [];
58
+ for (const file of candidates) {
59
+ const home = verifiedDescriptorHome(file);
60
+ if (!home)
61
+ return unavailable("codex_home_descriptor_unverifiable");
62
+ homes.push(home);
63
+ }
64
+ const unique = [...new Set(homes)];
65
+ return unique.length === 1 ? { status: "verified", codexHome: unique[0], evidence: "open_arg0_lock" }
66
+ : { status: "ambiguous", reason: "multiple_codex_home_descriptors" };
67
+ }
68
+ function arg0Home(filename) {
69
+ if (!path.isAbsolute(filename) || path.basename(filename) !== ".lock")
70
+ return undefined;
71
+ const entry = path.dirname(filename), arg0 = path.dirname(entry), temporary = path.dirname(arg0);
72
+ return /^codex-arg0[^/]+$/u.test(path.basename(entry)) && path.basename(arg0) === "arg0" && path.basename(temporary) === "tmp"
73
+ ? path.dirname(temporary) : undefined;
74
+ }
75
+ function verifiedDescriptorHome(file) {
76
+ if (file.type !== "REG" || !/^\d+$/u.test(file.fd ?? "") || !file.path || !file.device || !file.inode)
77
+ return undefined;
78
+ const device = integer(file.device), inode = integer(file.inode);
79
+ if (device === undefined || inode === undefined)
80
+ return undefined;
81
+ try {
82
+ const stat = fs.lstatSync(file.path, { bigint: true });
83
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.dev !== device || stat.ino !== inode)
84
+ return undefined;
85
+ const real = fs.realpathSync(file.path), home = arg0Home(real);
86
+ if (!home || fs.realpathSync(file.path) !== real)
87
+ return undefined;
88
+ const confirmed = fs.statSync(real, { bigint: true });
89
+ return confirmed.dev === device && confirmed.ino === inode ? home : undefined;
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ }
95
+ function integer(value) {
96
+ if (!/^(?:[0-9]+|0x[0-9a-f]+)$/iu.test(value))
97
+ return undefined;
98
+ try {
99
+ return BigInt(value);
100
+ }
101
+ catch {
102
+ return undefined;
103
+ }
104
+ }
105
+ //# sourceMappingURL=conversation-routing-home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-routing-home.js","sourceRoot":"","sources":["../../src/conversation-routing-home.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ type Row = Record<string, unknown>;
2
+ export interface ConversationRoutingIdentityOptions {
3
+ /** @deprecated A configured scan home is not physical process evidence and is ignored. */
4
+ defaultCodexHome?: string;
5
+ }
6
+ export interface ConversationRouteAssociation {
7
+ terminalId: string;
8
+ nativeId: string;
9
+ threadId: string;
10
+ codexHome: string;
11
+ evidence: "resolved_native_identity" | "visible_status_card" | "closed_status_inspection";
12
+ }
13
+ type RejectedProof = {
14
+ status: "unavailable" | "conflict" | "ambiguous";
15
+ reason: string;
16
+ };
17
+ export type ConversationRouteProof = {
18
+ status: "exact";
19
+ association: ConversationRouteAssociation;
20
+ } | RejectedProof;
21
+ /** Legacy terminal IDs name the same exact provider, agent, endpoint and process. */
22
+ export declare function canonicalTerminalRouteId(value: string): string;
23
+ export declare function terminalRouteIdsMatch(left: unknown, right: string): boolean;
24
+ /** Link only fresh physical identity evidence. A same-cwd or resume command match never participates. */
25
+ export declare function associateConversationRoutes(terminals: readonly Row[], nativeRows: readonly Row[], options?: ConversationRoutingIdentityOptions): {
26
+ associations: ConversationRouteAssociation[];
27
+ unassociated: {
28
+ terminalId: string;
29
+ reason: string;
30
+ }[];
31
+ };
32
+ /** Native-offline fallback still requires the exact fresh terminal thread and home.
33
+ * This proves identity only; dispatch certainty and terminal input safety remain separate gates.
34
+ */
35
+ export declare function proveNativeTerminalRoute(nativeId: string, terminal: Row, options?: ConversationRoutingIdentityOptions): ConversationRouteProof;
36
+ /** Multiple exact aliases are useful for List but cannot select a fallback terminal implicitly. */
37
+ export declare function resolveNativeTerminalRoute(nativeId: string, terminals: readonly Row[], options?: ConversationRoutingIdentityOptions): ConversationRouteProof;
38
+ /** The closed inspection transaction is internal evidence, never a user-supplied routing hint. */
39
+ export declare function withClosedStatusInspection(before: Row, after: Row, observation: Row): Row;
40
+ export {};