@scotthuang/agent-knock-knock 0.13.17 → 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 (291) hide show
  1. package/CHANGELOG.md +38 -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-async-question-adapter.js +14 -4
  22. package/dist/src/codex-async-question-adapter.js.map +1 -1
  23. package/dist/src/codex-lifecycle-compatibility.d.ts +1 -1
  24. package/dist/src/codex-lifecycle-compatibility.js +9 -3
  25. package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
  26. package/dist/src/codex-native-cli-adapter.d.ts +6 -0
  27. package/dist/src/codex-native-cli-adapter.js +273 -0
  28. package/dist/src/codex-native-cli-adapter.js.map +1 -0
  29. package/dist/src/codex-native-client-interactions.d.ts +6 -0
  30. package/dist/src/codex-native-client-interactions.js +124 -0
  31. package/dist/src/codex-native-client-interactions.js.map +1 -0
  32. package/dist/src/codex-native-client-rpc.d.ts +21 -0
  33. package/dist/src/codex-native-client-rpc.js +137 -0
  34. package/dist/src/codex-native-client-rpc.js.map +1 -0
  35. package/dist/src/codex-native-client.d.ts +42 -0
  36. package/dist/src/codex-native-client.js +326 -0
  37. package/dist/src/codex-native-client.js.map +1 -0
  38. package/dist/src/codex-native-identity.d.ts +6 -0
  39. package/dist/src/codex-native-identity.js +42 -0
  40. package/dist/src/codex-native-identity.js.map +1 -0
  41. package/dist/src/codex-native-monitor.d.ts +4 -0
  42. package/dist/src/codex-native-monitor.js +92 -0
  43. package/dist/src/codex-native-monitor.js.map +1 -0
  44. package/dist/src/codex-native-outbox.d.ts +16 -0
  45. package/dist/src/codex-native-outbox.js +120 -0
  46. package/dist/src/codex-native-outbox.js.map +1 -0
  47. package/dist/src/codex-native-public-projection.d.ts +545 -0
  48. package/dist/src/codex-native-public-projection.js +182 -0
  49. package/dist/src/codex-native-public-projection.js.map +1 -0
  50. package/dist/src/codex-native-record-store.d.ts +27 -0
  51. package/dist/src/codex-native-record-store.js +111 -0
  52. package/dist/src/codex-native-record-store.js.map +1 -0
  53. package/dist/src/codex-native-response-service.d.ts +69 -0
  54. package/dist/src/codex-native-response-service.js +244 -0
  55. package/dist/src/codex-native-response-service.js.map +1 -0
  56. package/dist/src/codex-native-runtime.d.ts +46 -0
  57. package/dist/src/codex-native-runtime.js +112 -0
  58. package/dist/src/codex-native-runtime.js.map +1 -0
  59. package/dist/src/codex-native-semantic.d.ts +17 -0
  60. package/dist/src/codex-native-semantic.js +175 -0
  61. package/dist/src/codex-native-semantic.js.map +1 -0
  62. package/dist/src/codex-native-snapshot.d.ts +19 -0
  63. package/dist/src/codex-native-snapshot.js +160 -0
  64. package/dist/src/codex-native-snapshot.js.map +1 -0
  65. package/dist/src/codex-native-state-store.d.ts +61 -0
  66. package/dist/src/codex-native-state-store.js +132 -0
  67. package/dist/src/codex-native-state-store.js.map +1 -0
  68. package/dist/src/codex-native-task-service.d.ts +71 -0
  69. package/dist/src/codex-native-task-service.js +502 -0
  70. package/dist/src/codex-native-task-service.js.map +1 -0
  71. package/dist/src/codex-native-types.d.ts +92 -0
  72. package/dist/src/codex-native-types.js +15 -0
  73. package/dist/src/codex-native-types.js.map +1 -0
  74. package/dist/src/codex-permission-surface.d.ts +1 -1
  75. package/dist/src/codex-permission-surface.js +1 -1
  76. package/dist/src/codex-permission-surface.js.map +1 -1
  77. package/dist/src/codex-terminal-agent-adapter.js +3 -1
  78. package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
  79. package/dist/src/conversation-list.d.ts +12 -0
  80. package/dist/src/conversation-list.js +30 -0
  81. package/dist/src/conversation-list.js.map +1 -0
  82. package/dist/src/conversation-route-dispatch.d.ts +13 -0
  83. package/dist/src/conversation-route-dispatch.js +66 -0
  84. package/dist/src/conversation-route-dispatch.js.map +1 -0
  85. package/dist/src/conversation-route-legacy.d.ts +18 -0
  86. package/dist/src/conversation-route-legacy.js +54 -0
  87. package/dist/src/conversation-route-legacy.js.map +1 -0
  88. package/dist/src/conversation-route-store.d.ts +51 -0
  89. package/dist/src/conversation-route-store.js +126 -0
  90. package/dist/src/conversation-route-store.js.map +1 -0
  91. package/dist/src/conversation-routing-cli-adapter.d.ts +12 -0
  92. package/dist/src/conversation-routing-cli-adapter.js +211 -0
  93. package/dist/src/conversation-routing-cli-adapter.js.map +1 -0
  94. package/dist/src/conversation-routing-commands.d.ts +11 -0
  95. package/dist/src/conversation-routing-commands.js +85 -0
  96. package/dist/src/conversation-routing-commands.js.map +1 -0
  97. package/dist/src/conversation-routing-home.d.ts +26 -0
  98. package/dist/src/conversation-routing-home.js +105 -0
  99. package/dist/src/conversation-routing-home.js.map +1 -0
  100. package/dist/src/conversation-routing-identity.d.ts +40 -0
  101. package/dist/src/conversation-routing-identity.js +174 -0
  102. package/dist/src/conversation-routing-identity.js.map +1 -0
  103. package/dist/src/conversation-runtime-route-store.d.ts +11 -0
  104. package/dist/src/conversation-runtime-route-store.js +118 -0
  105. package/dist/src/conversation-runtime-route-store.js.map +1 -0
  106. package/dist/src/desktop-async-interactions.d.ts +15 -0
  107. package/dist/src/desktop-async-interactions.js +88 -0
  108. package/dist/src/desktop-async-interactions.js.map +1 -0
  109. package/dist/src/desktop-async-state.d.ts +5 -0
  110. package/dist/src/desktop-async-state.js +53 -0
  111. package/dist/src/desktop-async-state.js.map +1 -0
  112. package/dist/src/desktop-cli-adapter.d.ts +7 -0
  113. package/dist/src/desktop-cli-adapter.js +322 -0
  114. package/dist/src/desktop-cli-adapter.js.map +1 -0
  115. package/dist/src/desktop-cli-controls.d.ts +9 -0
  116. package/dist/src/desktop-cli-controls.js +45 -0
  117. package/dist/src/desktop-cli-controls.js.map +1 -0
  118. package/dist/src/desktop-command-presentation.d.ts +2 -0
  119. package/dist/src/desktop-command-presentation.js +31 -0
  120. package/dist/src/desktop-command-presentation.js.map +1 -0
  121. package/dist/src/desktop-control-semantic.d.ts +8 -0
  122. package/dist/src/desktop-control-semantic.js +68 -0
  123. package/dist/src/desktop-control-semantic.js.map +1 -0
  124. package/dist/src/desktop-identity.d.ts +5 -0
  125. package/dist/src/desktop-identity.js +40 -0
  126. package/dist/src/desktop-identity.js.map +1 -0
  127. package/dist/src/desktop-interaction-projection.d.ts +57 -0
  128. package/dist/src/desktop-interaction-projection.js +196 -0
  129. package/dist/src/desktop-interaction-projection.js.map +1 -0
  130. package/dist/src/desktop-interaction-state.d.ts +3 -0
  131. package/dist/src/desktop-interaction-state.js +48 -0
  132. package/dist/src/desktop-interaction-state.js.map +1 -0
  133. package/dist/src/desktop-ipc-async-answer.d.ts +9 -0
  134. package/dist/src/desktop-ipc-async-answer.js +71 -0
  135. package/dist/src/desktop-ipc-async-answer.js.map +1 -0
  136. package/dist/src/desktop-ipc-client.d.ts +47 -0
  137. package/dist/src/desktop-ipc-client.js +400 -0
  138. package/dist/src/desktop-ipc-client.js.map +1 -0
  139. package/dist/src/desktop-ipc-native-operations.d.ts +11 -0
  140. package/dist/src/desktop-ipc-native-operations.js +126 -0
  141. package/dist/src/desktop-ipc-native-operations.js.map +1 -0
  142. package/dist/src/desktop-ipc-transport.d.ts +13 -0
  143. package/dist/src/desktop-ipc-transport.js +123 -0
  144. package/dist/src/desktop-ipc-transport.js.map +1 -0
  145. package/dist/src/desktop-list.d.ts +25 -0
  146. package/dist/src/desktop-list.js +55 -0
  147. package/dist/src/desktop-list.js.map +1 -0
  148. package/dist/src/desktop-metadata-reader.d.ts +30 -0
  149. package/dist/src/desktop-metadata-reader.js +182 -0
  150. package/dist/src/desktop-metadata-reader.js.map +1 -0
  151. package/dist/src/desktop-monitor.d.ts +4 -0
  152. package/dist/src/desktop-monitor.js +101 -0
  153. package/dist/src/desktop-monitor.js.map +1 -0
  154. package/dist/src/desktop-public-projection.d.ts +6 -0
  155. package/dist/src/desktop-public-projection.js +134 -0
  156. package/dist/src/desktop-public-projection.js.map +1 -0
  157. package/dist/src/desktop-request-interactions.d.ts +14 -0
  158. package/dist/src/desktop-request-interactions.js +144 -0
  159. package/dist/src/desktop-request-interactions.js.map +1 -0
  160. package/dist/src/desktop-response-dispatch.d.ts +14 -0
  161. package/dist/src/desktop-response-dispatch.js +19 -0
  162. package/dist/src/desktop-response-dispatch.js.map +1 -0
  163. package/dist/src/desktop-response-evidence.d.ts +4 -0
  164. package/dist/src/desktop-response-evidence.js +19 -0
  165. package/dist/src/desktop-response-evidence.js.map +1 -0
  166. package/dist/src/desktop-response-service.d.ts +11 -0
  167. package/dist/src/desktop-response-service.js +188 -0
  168. package/dist/src/desktop-response-service.js.map +1 -0
  169. package/dist/src/desktop-response-store.d.ts +35 -0
  170. package/dist/src/desktop-response-store.js +58 -0
  171. package/dist/src/desktop-response-store.js.map +1 -0
  172. package/dist/src/desktop-response-types.d.ts +20 -0
  173. package/dist/src/desktop-response-types.js +2 -0
  174. package/dist/src/desktop-response-types.js.map +1 -0
  175. package/dist/src/desktop-response-value.d.ts +6 -0
  176. package/dist/src/desktop-response-value.js +31 -0
  177. package/dist/src/desktop-response-value.js.map +1 -0
  178. package/dist/src/desktop-runtime.d.ts +153 -0
  179. package/dist/src/desktop-runtime.js +88 -0
  180. package/dist/src/desktop-runtime.js.map +1 -0
  181. package/dist/src/desktop-semantic.d.ts +21 -0
  182. package/dist/src/desktop-semantic.js +140 -0
  183. package/dist/src/desktop-semantic.js.map +1 -0
  184. package/dist/src/desktop-session-catalog.d.ts +68 -0
  185. package/dist/src/desktop-session-catalog.js +225 -0
  186. package/dist/src/desktop-session-catalog.js.map +1 -0
  187. package/dist/src/desktop-session-controls.d.ts +145 -0
  188. package/dist/src/desktop-session-controls.js +176 -0
  189. package/dist/src/desktop-session-controls.js.map +1 -0
  190. package/dist/src/desktop-sidebar-metadata.d.ts +27 -0
  191. package/dist/src/desktop-sidebar-metadata.js +83 -0
  192. package/dist/src/desktop-sidebar-metadata.js.map +1 -0
  193. package/dist/src/desktop-sidebar-projects.d.ts +10 -0
  194. package/dist/src/desktop-sidebar-projects.js +31 -0
  195. package/dist/src/desktop-sidebar-projects.js.map +1 -0
  196. package/dist/src/desktop-sidebar-selection.d.ts +28 -0
  197. package/dist/src/desktop-sidebar-selection.js +85 -0
  198. package/dist/src/desktop-sidebar-selection.js.map +1 -0
  199. package/dist/src/desktop-snapshot-details.d.ts +4 -0
  200. package/dist/src/desktop-snapshot-details.js +116 -0
  201. package/dist/src/desktop-snapshot-details.js.map +1 -0
  202. package/dist/src/desktop-snapshot.d.ts +11 -0
  203. package/dist/src/desktop-snapshot.js +276 -0
  204. package/dist/src/desktop-snapshot.js.map +1 -0
  205. package/dist/src/desktop-state-store.d.ts +72 -0
  206. package/dist/src/desktop-state-store.js +269 -0
  207. package/dist/src/desktop-state-store.js.map +1 -0
  208. package/dist/src/desktop-task-interactions.d.ts +10 -0
  209. package/dist/src/desktop-task-interactions.js +93 -0
  210. package/dist/src/desktop-task-interactions.js.map +1 -0
  211. package/dist/src/desktop-task-recovery.d.ts +38 -0
  212. package/dist/src/desktop-task-recovery.js +171 -0
  213. package/dist/src/desktop-task-recovery.js.map +1 -0
  214. package/dist/src/desktop-task-service.d.ts +54 -0
  215. package/dist/src/desktop-task-service.js +441 -0
  216. package/dist/src/desktop-task-service.js.map +1 -0
  217. package/dist/src/desktop-types.d.ts +281 -0
  218. package/dist/src/desktop-types.js +13 -0
  219. package/dist/src/desktop-types.js.map +1 -0
  220. package/dist/src/host-monitor-reconciliation.js +36 -4
  221. package/dist/src/host-monitor-reconciliation.js.map +1 -1
  222. package/dist/src/host-profile-runtime.js +7 -3
  223. package/dist/src/host-profile-runtime.js.map +1 -1
  224. package/dist/src/local-codex-cli-adapter.d.ts +7 -0
  225. package/dist/src/local-codex-cli-adapter.js +13 -0
  226. package/dist/src/local-codex-cli-adapter.js.map +1 -0
  227. package/dist/src/openclaw-callback-transport.js +2 -1
  228. package/dist/src/openclaw-callback-transport.js.map +1 -1
  229. package/dist/src/semantic-conversation-target.d.ts +4 -0
  230. package/dist/src/semantic-conversation-target.js +20 -0
  231. package/dist/src/semantic-conversation-target.js.map +1 -0
  232. package/dist/src/semantic-permission-control.js +47 -9
  233. package/dist/src/semantic-permission-control.js.map +1 -1
  234. package/dist/src/semantic-private-authority-offers.d.ts +1 -1
  235. package/dist/src/semantic-private-authority-offers.js +3 -1
  236. package/dist/src/semantic-private-authority-offers.js.map +1 -1
  237. package/dist/src/semantic-tool-command-helpers.d.ts +6 -0
  238. package/dist/src/semantic-tool-command-helpers.js +199 -78
  239. package/dist/src/semantic-tool-command-helpers.js.map +1 -1
  240. package/dist/src/semantic-tool-descriptions.d.ts +2 -1
  241. package/dist/src/semantic-tool-descriptions.js +81 -35
  242. package/dist/src/semantic-tool-descriptions.js.map +1 -1
  243. package/dist/src/semantic-tool-list-projection.js +66 -2
  244. package/dist/src/semantic-tool-list-projection.js.map +1 -1
  245. package/dist/src/semantic-tool-presentation.js +76 -7
  246. package/dist/src/semantic-tool-presentation.js.map +1 -1
  247. package/dist/src/semantic-tool-runtime.js +129 -29
  248. package/dist/src/semantic-tool-runtime.js.map +1 -1
  249. package/dist/src/semantic-tool-schemas.d.ts +410 -27
  250. package/dist/src/semantic-tool-schemas.js +176 -88
  251. package/dist/src/semantic-tool-schemas.js.map +1 -1
  252. package/dist/src/terminal-action-contracts.js +10 -6
  253. package/dist/src/terminal-action-contracts.js.map +1 -1
  254. package/dist/src/terminal-list-cli-adapter.d.ts +1 -0
  255. package/dist/src/terminal-list-cli-adapter.js +6 -3
  256. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  257. package/dist/src/terminal-model-control-profile.d.ts +3 -1
  258. package/dist/src/terminal-model-control-profile.js +15 -7
  259. package/dist/src/terminal-model-control-profile.js.map +1 -1
  260. package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
  261. package/dist/src/terminal-native-inspection-profile.js +4 -0
  262. package/dist/src/terminal-native-inspection-profile.js.map +1 -1
  263. package/dist/src/terminal-permission-control-list-projection.d.ts +1 -1
  264. package/dist/src/terminal-permission-control.js +5 -1
  265. package/dist/src/terminal-permission-control.js.map +1 -1
  266. package/dist/src/terminal-questionnaire-adapter.js +5 -2
  267. package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
  268. package/dist/src/terminal-user-send-intent.d.ts +2 -0
  269. package/dist/src/terminal-user-send-intent.js +11 -3
  270. package/dist/src/terminal-user-send-intent.js.map +1 -1
  271. package/docs/architecture/current-architecture.md +313 -0
  272. package/docs/architecture/interactive-terminal-response.md +276 -0
  273. package/docs/architecture/issue-126-final-report.md +248 -0
  274. package/docs/architecture/orchestration-refactor-history.md +2987 -0
  275. package/docs/architecture/orchestration-refactor.md +21 -0
  276. package/docs/backend-task-recovery.md +89 -0
  277. package/docs/bidirectional-agent-protocol.md +260 -0
  278. package/docs/codex-0.160.0-compatibility.md +126 -0
  279. package/docs/codex-cli-native-compatibility.md +246 -0
  280. package/docs/codex-desktop-compatibility.md +414 -0
  281. package/docs/codex-permissions.md +12 -1
  282. package/docs/openclaw-operations.md +281 -0
  283. package/docs/openclaw-session-turn-delivery-requirement.md +45 -0
  284. package/docs/operator-guide.md +543 -0
  285. package/docs/storage-and-logging.md +91 -0
  286. package/docs/test-performance-issue-108.md +80 -0
  287. package/docs/test-performance-issue-120.md +226 -0
  288. package/docs/testing.md +628 -0
  289. package/openclaw.plugin.json +7 -3
  290. package/package.json +6 -12
  291. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +69 -18
@@ -0,0 +1,54 @@
1
+ import { createHash } from "node:crypto";
2
+ import { assertCodexNativeTaskRecord } from "./codex-native-state-store.js";
3
+ import { nativeDigest, nativeErrorCode } from "./codex-native-task-service.js";
4
+ import { ConversationRouteError } from "./conversation-route-store.js";
5
+ import { parseTerminalConversationId } from "./terminal-agent-adapter.js";
6
+ import { terminalSubmissionPayload } from "./terminal-dispatch-execution.js";
7
+ import { createTerminalUserSendIntentRepository } from "./terminal-user-send-intent.js";
8
+ function conflict(detail) {
9
+ throw new ConversationRouteError("conversation_route_conflict", `Message ID is already bound to different immutable request input or a different legacy route: ${detail}`);
10
+ }
11
+ /** Consult only the two exact old message ledgers, before backend discovery or input.
12
+ * An old reservation remains a route pin even when its outcome is uncertain.
13
+ * Terminal receipts predate public target storage; their provider must still
14
+ * validate runtime key and physical token before replay or any input.
15
+ */
16
+ export function selectLegacyConversationRoute(options) {
17
+ const { input, nativeTasks, terminalRuntimeDir } = options;
18
+ const id = `codex-cli-watch:${nativeDigest([input.controllerSession, input.messageId])}`;
19
+ let native;
20
+ try {
21
+ native = nativeTasks.status(id);
22
+ }
23
+ catch (error) {
24
+ if (nativeErrorCode(error) !== "codex_native_watch_not_found")
25
+ throw error;
26
+ }
27
+ if (native) {
28
+ assertCodexNativeTaskRecord(native);
29
+ if (native.id !== id || native.kind !== "send" || native.controller_session !== input.controllerSession ||
30
+ native.send_intent?.message_id !== input.messageId || native.send_intent.text !== input.requestText) {
31
+ conflict("native message identity or request changed");
32
+ }
33
+ if (native.native_id !== input.canonicalTarget)
34
+ conflict("native conversation changed or terminal alias is unproven");
35
+ }
36
+ const terminal = createTerminalUserSendIntentRepository({ runtimeDir: terminalRuntimeDir }).loadMessage({ messageId: input.messageId });
37
+ if (native && terminal)
38
+ conflict("both transport ledgers already exist; automatic routing is ambiguous");
39
+ if (native)
40
+ return { route: "native", targetId: native.native_id, reason: "legacy_native_message" };
41
+ if (!terminal)
42
+ return undefined;
43
+ const requestHash = createHash("sha256").update(terminalSubmissionPayload(input.requestText)).digest("hex");
44
+ if (terminal.request_hash !== requestHash)
45
+ conflict("terminal request changed");
46
+ const target = parseTerminalConversationId(input.canonicalTarget);
47
+ if (target?.agent !== "codex")
48
+ conflict("legacy terminal receipt cannot identify a terminal from a backend alias");
49
+ if (options.managedOnly || options.expectedTerminalToken !== terminal.physical_token) {
50
+ conflict("legacy terminal Send requires its exact explicit terminal authority");
51
+ }
52
+ return { route: "terminal", targetId: input.canonicalTarget, reason: "legacy_terminal_message" };
53
+ }
54
+ //# sourceMappingURL=conversation-route-legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-route-legacy.js","sourceRoot":"","sources":["../../src/conversation-route-legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,eAAe,EAA+B,MAAM,gCAAgC,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAA+B,MAAM,+BAA+B,CAAC;AAEpG,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,sCAAsC,EAAE,MAAM,gCAAgC,CAAC;AAYxF,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,IAAI,sBAAsB,CAAC,6BAA6B,EAC5D,iGAAiG,MAAM,EAAE,CAAC,CAAC;AAC/G,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,OAAuC;IACnF,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,EAAE,GAAG,mBAAmB,YAAY,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IACzF,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IACxC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,8BAA8B;YAAE,MAAM,KAAK,CAAC;IAAC,CAAC;IAC7F,IAAI,MAAM,EAAE,CAAC;QACX,2BAA2B,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,kBAAkB,KAAK,KAAK,CAAC,iBAAiB;YACrG,MAAM,CAAC,WAAW,EAAE,UAAU,KAAK,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YACtG,QAAQ,CAAC,4CAA4C,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,eAAe;YAAE,QAAQ,CAAC,2DAA2D,CAAC,CAAC;IACxH,CAAC;IACD,MAAM,QAAQ,GAAG,sCAAsC,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACxI,IAAI,MAAM,IAAI,QAAQ;QAAE,QAAQ,CAAC,sEAAsE,CAAC,CAAC;IACzG,IAAI,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACpG,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5G,IAAI,QAAQ,CAAC,YAAY,KAAK,WAAW;QAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAClE,IAAI,MAAM,EAAE,KAAK,KAAK,OAAO;QAAE,QAAQ,CAAC,yEAAyE,CAAC,CAAC;IACnH,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,qBAAqB,KAAK,QAAQ,CAAC,cAAc,EAAE,CAAC;QACrF,QAAQ,CAAC,qEAAqE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;AACnG,CAAC"}
@@ -0,0 +1,51 @@
1
+ export interface ConversationRouteInput {
2
+ controllerSession: string;
3
+ messageId: string;
4
+ requestText: string;
5
+ /** The selected public target. A retry through a different alias conflicts instead of authorizing another send. */
6
+ canonicalTarget: string;
7
+ }
8
+ export interface ConversationRouteChoice {
9
+ route: "native" | "terminal";
10
+ targetId: string;
11
+ }
12
+ export interface ConversationRouteRecord {
13
+ schema: "agent-knock-knock/conversation-route";
14
+ version: 1;
15
+ revision: number;
16
+ id: string;
17
+ controller_session: string;
18
+ message_id: string;
19
+ request_text: string;
20
+ canonical_target: string;
21
+ route: ConversationRouteChoice["route"];
22
+ target_id: string;
23
+ created_at: string;
24
+ updated_at: string;
25
+ /** A recorded receipt is an observation, not proof of delivery or task acceptance. */
26
+ state: "reserved" | "uncertain" | "recorded";
27
+ receipt?: Record<string, unknown>;
28
+ error_code?: string;
29
+ }
30
+ export interface ConversationRouteStore {
31
+ load(input: ConversationRouteInput): ConversationRouteRecord | undefined;
32
+ reserve(input: ConversationRouteInput, choice: ConversationRouteChoice): {
33
+ record: ConversationRouteRecord;
34
+ created: boolean;
35
+ };
36
+ recordReceipt(input: ConversationRouteInput, choice: ConversationRouteChoice, receipt: Record<string, unknown>): ConversationRouteRecord;
37
+ markUncertain(input: ConversationRouteInput, choice: ConversationRouteChoice, errorCode?: string): ConversationRouteRecord;
38
+ }
39
+ export declare class ConversationRouteError extends Error {
40
+ readonly code: "conversation_route_conflict" | "conversation_route_missing" | "conversation_route_invalid";
41
+ constructor(code: "conversation_route_conflict" | "conversation_route_missing" | "conversation_route_invalid", message: string);
42
+ }
43
+ export declare function conversationRouteId(controllerSession: string, messageId: string): string;
44
+ /** Select once after preflight; crashes and uncertain delivery never authorize a different route.
45
+ * This journal does not replace the selected provider's stable-message-ID dispatch ledger.
46
+ */
47
+ export declare function createConversationRouteStore(storeDir: string, locks: {
48
+ acquire(lockPath: string): () => void;
49
+ }, options?: {
50
+ now?(): Date;
51
+ }): ConversationRouteStore;
@@ -0,0 +1,126 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isDeepStrictEqual } from "node:util";
3
+ import { createNativeRecordRepository } from "./codex-native-record-store.js";
4
+ export class ConversationRouteError extends Error {
5
+ code;
6
+ constructor(code, message) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = "ConversationRouteError";
10
+ }
11
+ }
12
+ const nonblank = (value) => typeof value === "string" && value.trim().length > 0;
13
+ const recordValue = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
14
+ const validTime = (value) => typeof value === "string" && Number.isFinite(Date.parse(value));
15
+ function invalid(message) { throw new ConversationRouteError("conversation_route_invalid", message); }
16
+ function conflict() { throw new ConversationRouteError("conversation_route_conflict", "Message ID is already bound to different immutable request input or a different conversation route"); }
17
+ export function conversationRouteId(controllerSession, messageId) {
18
+ if (!nonblank(controllerSession) || !nonblank(messageId))
19
+ invalid("Conversation route requires a controller and message ID");
20
+ return `conversation-route:${createHash("sha256").update(JSON.stringify([controllerSession, messageId])).digest("hex")}`;
21
+ }
22
+ function assertInput(input) {
23
+ if (!input || !nonblank(input.controllerSession) || !nonblank(input.messageId) ||
24
+ !nonblank(input.requestText) || !nonblank(input.canonicalTarget))
25
+ invalid("Invalid conversation route input");
26
+ }
27
+ function assertChoice(choice) {
28
+ if (!choice || !["native", "terminal"].includes(choice.route) || !nonblank(choice.targetId))
29
+ invalid("Invalid conversation route choice");
30
+ }
31
+ function assertMatches(record, input) {
32
+ if (record.controller_session !== input.controllerSession || record.message_id !== input.messageId ||
33
+ record.request_text !== input.requestText || record.canonical_target !== input.canonicalTarget)
34
+ conflict();
35
+ }
36
+ function assertRecord(value) {
37
+ const r = value;
38
+ if (!r || r.schema !== "agent-knock-knock/conversation-route" || r.version !== 1 ||
39
+ !Number.isSafeInteger(r.revision) || r.revision < 1 || !nonblank(r.request_text) || !nonblank(r.canonical_target) ||
40
+ !validTime(r.created_at) || !validTime(r.updated_at) || !["reserved", "uncertain", "recorded"].includes(r.state)) {
41
+ invalid("Invalid conversation route record");
42
+ }
43
+ if (r.id !== conversationRouteId(r.controller_session, r.message_id))
44
+ invalid("Conversation route record identity mismatch");
45
+ assertChoice({ route: r.route, targetId: r.target_id });
46
+ if ((r.state === "recorded") !== (r.receipt !== undefined) || r.receipt !== undefined && !recordValue(r.receipt) ||
47
+ r.error_code !== undefined && !/^[a-zA-Z0-9_-]{1,100}$/.test(r.error_code))
48
+ invalid("Invalid conversation route outcome");
49
+ }
50
+ function assertUpdate(previous, next) {
51
+ for (const key of ["id", "controller_session", "message_id", "request_text", "canonical_target", "route", "target_id", "created_at"]) {
52
+ if (previous[key] !== next[key])
53
+ conflict();
54
+ }
55
+ if (previous.receipt && !isDeepStrictEqual(previous.receipt, next.receipt))
56
+ conflict();
57
+ if (previous.state !== "reserved" && next.state === "reserved")
58
+ conflict();
59
+ }
60
+ /** Select once after preflight; crashes and uncertain delivery never authorize a different route.
61
+ * This journal does not replace the selected provider's stable-message-ID dispatch ledger.
62
+ */
63
+ export function createConversationRouteStore(storeDir, locks, options = {}) {
64
+ const now = options.now ?? (() => new Date());
65
+ const repository = createNativeRecordRepository({ storeDir, directory: "conversation-routes",
66
+ prefix: "conversation-route:", acquire: locks.acquire, assert: assertRecord, assertUpdate });
67
+ const load = (input) => {
68
+ assertInput(input);
69
+ const found = repository.load(conversationRouteId(input.controllerSession, input.messageId));
70
+ if (found)
71
+ assertMatches(found, input);
72
+ return found;
73
+ };
74
+ const update = (input, choice, operation) => {
75
+ assertInput(input);
76
+ assertChoice(choice);
77
+ return repository.withLock(conversationRouteId(input.controllerSession, input.messageId), () => {
78
+ const current = load(input);
79
+ if (!current)
80
+ throw new ConversationRouteError("conversation_route_missing", "Conversation route must be reserved before recording an outcome");
81
+ if (current.route !== choice.route || current.target_id !== choice.targetId)
82
+ conflict();
83
+ const next = operation(current);
84
+ return next === current ? current : repository.save({ ...next, updated_at: now().toISOString() }, current.revision);
85
+ });
86
+ };
87
+ return {
88
+ load,
89
+ reserve(input, choice) {
90
+ assertInput(input);
91
+ assertChoice(choice);
92
+ return repository.withLock(conversationRouteId(input.controllerSession, input.messageId), () => {
93
+ const previous = load(input);
94
+ if (previous)
95
+ return { record: previous, created: false };
96
+ const date = now().toISOString();
97
+ return { created: true, record: repository.save({ schema: "agent-knock-knock/conversation-route", version: 1,
98
+ revision: 1, id: conversationRouteId(input.controllerSession, input.messageId), controller_session: input.controllerSession,
99
+ message_id: input.messageId, request_text: input.requestText, canonical_target: input.canonicalTarget,
100
+ route: choice.route, target_id: choice.targetId, created_at: date, updated_at: date, state: "reserved" }, null) };
101
+ });
102
+ },
103
+ recordReceipt(input, choice, receipt) {
104
+ if (!recordValue(receipt))
105
+ invalid("Conversation route receipt must be an object");
106
+ const saved = JSON.parse(JSON.stringify(receipt));
107
+ if (!recordValue(saved))
108
+ invalid("Conversation route receipt must serialize to an object");
109
+ return update(input, choice, current => {
110
+ if (current.receipt) {
111
+ if (!isDeepStrictEqual(current.receipt, saved))
112
+ conflict();
113
+ return current;
114
+ }
115
+ return { ...current, state: "recorded", receipt: saved };
116
+ });
117
+ },
118
+ markUncertain(input, choice, errorCode) {
119
+ if (errorCode !== undefined && !/^[a-zA-Z0-9_-]{1,100}$/.test(errorCode))
120
+ invalid("Invalid conversation route error code");
121
+ return update(input, choice, current => current.state !== "reserved" ? current :
122
+ { ...current, state: "uncertain", ...(errorCode ? { error_code: errorCode } : {}) });
123
+ }
124
+ };
125
+ }
126
+ //# sourceMappingURL=conversation-route-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-route-store.js","sourceRoot":"","sources":["../../src/conversation-route-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ type Options = Record<string, unknown>;
2
+ type Row = Record<string, unknown>;
3
+ export interface ConversationRoutingCliPorts {
4
+ terminals(options: Options, terminalId?: string): Promise<Row[]>;
5
+ /** Executes the existing command without entering this router again. */
6
+ execute(command: string, options: Options): Promise<Row>;
7
+ }
8
+ export declare function executeConversationCommand(command: string | undefined, options: Options, terminals: ConversationRoutingCliPorts["terminals"], execute: (command: string | undefined, options: Options) => Promise<void>): Promise<void>;
9
+ /** A read failure is fallback evidence only here, before either task transport is invoked. */
10
+ export declare function backendPreflightUnavailable(error: unknown): boolean;
11
+ export declare function dispatchRoutedConversationCli(command: string | undefined, original: Options, ports: ConversationRoutingCliPorts): Promise<boolean>;
12
+ export {};
@@ -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":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAGzE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAChI,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe;IACrH,wBAAwB,EAAE,SAAS,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;AACrH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC;AACxE,MAAM,iBAAiB,GAAG,0CAA0C,CAAC;AACrE,MAAM,qBAAqB,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAElH,oGAAoG;AACpG,MAAM,UAAU,yBAAyB,CAAC,OAAe,EAAE,OAAgB;IACzE,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACvE,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,2BAA2B,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;eAC7H,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAC5I,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,KAAK,gBAAgB;QAAE,OAAO;YACvC,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK;SAC7H,CAAC;IACF,IAAI,OAAO,KAAK,iBAAiB,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACzH,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;IAClH,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACpF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAgB,EAAE,KAA4B;IAC3F,IAAI,OAAO,KAAK,eAAe;QAAE,OAAO,gBAAgB,CAAC;IACzD,IAAI,KAAK,KAAK,UAAU,IAAI,OAAO,KAAK,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,aAAa;QAAE,OAAO,oBAAoB,CAAC;IAClJ,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,kCAAkC,CAAC,OAAe,EAAE,QAAiB,EAAE,GAAY;IACjG,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5H,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,uBAAuB,CAAC,EAAE,CAAC;YACtG,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,2FAA2F;QAC3F,yFAAyF;QACzF,QAAQ,CAAC,qBAAqB,KAAK,IAAI,EAAE,uBAAuB,CAAC;QACjE,QAAQ,CAAC,4BAA4B,KAAK,IAAI,EAAE,+BAA+B,CAAC;IAClF,CAAC;SAAM,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7I,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/G,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,sBAAsB,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,OAAO,oBAAoB,CAAC,CAAC;YACzJ,QAAQ,CAAC,oBAAoB,GAAG,SAAU,CAAC,sBAAsB,CAAC;QACpE,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAC3G,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,qCAAqC,CAAC,CAAC;QACtK,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,gBAAgB;QAAE,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAe,EAAE,OAAgB,EAAE,KAA4B,EAAE,QAAgB;IACzH,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,sBAAsB,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACxH,MAAM,CAAC,YAAY,GAAG,QAAQ,CAAC;IAC/B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,4BAA4B,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACtJ,MAAM,CAAC,eAAe,KAAK,iBAAiB,CAAC;QAC7C,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,OAAO,KAAK,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/F,MAAM,CAAC,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAuC,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;;QAAM,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC"}