@scotthuang/agent-knock-knock 0.12.11 → 0.12.13

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 (344) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +43 -30
  3. package/dist/src/approval-policy.d.ts +11 -2
  4. package/dist/src/approval-policy.js +33 -7
  5. package/dist/src/approval-policy.js.map +1 -1
  6. package/dist/src/callback-cli-adapter.d.ts +47 -0
  7. package/dist/src/callback-cli-adapter.js +156 -0
  8. package/dist/src/callback-cli-adapter.js.map +1 -0
  9. package/dist/src/callback-outbox-policy.d.ts +95 -0
  10. package/dist/src/callback-outbox-policy.js +149 -0
  11. package/dist/src/callback-outbox-policy.js.map +1 -0
  12. package/dist/src/callback-outbox-service.d.ts +247 -0
  13. package/dist/src/callback-outbox-service.js +1053 -0
  14. package/dist/src/callback-outbox-service.js.map +1 -0
  15. package/dist/src/callback-outbox-settlement.d.ts +54 -0
  16. package/dist/src/callback-outbox-settlement.js +241 -0
  17. package/dist/src/callback-outbox-settlement.js.map +1 -0
  18. package/dist/src/canonical-json.d.ts +1 -0
  19. package/dist/src/canonical-json.js +14 -0
  20. package/dist/src/canonical-json.js.map +1 -0
  21. package/dist/src/claude-lifecycle-compatibility.js +15 -0
  22. package/dist/src/claude-lifecycle-compatibility.js.map +1 -1
  23. package/dist/src/claude-local-transcript-provider.d.ts +82 -1
  24. package/dist/src/claude-local-transcript-provider.js +873 -23
  25. package/dist/src/claude-local-transcript-provider.js.map +1 -1
  26. package/dist/src/cli-command-runtime.d.ts +14 -0
  27. package/dist/src/cli-command-runtime.js +164 -0
  28. package/dist/src/cli-command-runtime.js.map +1 -0
  29. package/dist/src/cli-core.d.ts +4 -42
  30. package/dist/src/cli-core.js +958 -28684
  31. package/dist/src/cli-core.js.map +1 -1
  32. package/dist/src/cli-runtime-context.d.ts +57 -0
  33. package/dist/src/cli-runtime-context.js +118 -0
  34. package/dist/src/cli-runtime-context.js.map +1 -0
  35. package/dist/src/codex-lifecycle-compatibility.js +2 -1
  36. package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
  37. package/dist/src/codex-local-session-provider.d.ts +18 -0
  38. package/dist/src/codex-local-session-provider.js +67 -0
  39. package/dist/src/codex-local-session-provider.js.map +1 -1
  40. package/dist/src/codex-session-provider.js +1 -3
  41. package/dist/src/codex-session-provider.js.map +1 -1
  42. package/dist/src/conversation-trace.d.ts +30 -0
  43. package/dist/src/conversation-trace.js +185 -0
  44. package/dist/src/conversation-trace.js.map +1 -0
  45. package/dist/src/deferred-foreground-application-service.d.ts +84 -0
  46. package/dist/src/deferred-foreground-application-service.js +742 -0
  47. package/dist/src/deferred-foreground-application-service.js.map +1 -0
  48. package/dist/src/deferred-foreground-authority-cli-adapter.d.ts +78 -0
  49. package/dist/src/deferred-foreground-authority-cli-adapter.js +795 -0
  50. package/dist/src/deferred-foreground-authority-cli-adapter.js.map +1 -0
  51. package/dist/src/deferred-foreground-boundary.d.ts +61 -0
  52. package/dist/src/deferred-foreground-boundary.js +2 -0
  53. package/dist/src/deferred-foreground-boundary.js.map +1 -0
  54. package/dist/src/deferred-foreground-capability.d.ts +4 -0
  55. package/dist/src/deferred-foreground-capability.js +184 -0
  56. package/dist/src/deferred-foreground-capability.js.map +1 -0
  57. package/dist/src/deferred-foreground-preparation-cli-adapter.d.ts +53 -0
  58. package/dist/src/deferred-foreground-preparation-cli-adapter.js +210 -0
  59. package/dist/src/deferred-foreground-preparation-cli-adapter.js.map +1 -0
  60. package/dist/src/deferred-foreground-preparation-service.d.ts +72 -0
  61. package/dist/src/deferred-foreground-preparation-service.js +179 -0
  62. package/dist/src/deferred-foreground-preparation-service.js.map +1 -0
  63. package/dist/src/deferred-foreground-recovery-cli-adapter.d.ts +139 -0
  64. package/dist/src/deferred-foreground-recovery-cli-adapter.js +1125 -0
  65. package/dist/src/deferred-foreground-recovery-cli-adapter.js.map +1 -0
  66. package/dist/src/deferred-foreground-recovery-service.d.ts +48 -0
  67. package/dist/src/deferred-foreground-recovery-service.js +91 -0
  68. package/dist/src/deferred-foreground-recovery-service.js.map +1 -0
  69. package/dist/src/deferred-foreground-transfer-policy.d.ts +2 -0
  70. package/dist/src/deferred-foreground-transfer-policy.js +10 -0
  71. package/dist/src/deferred-foreground-transfer-policy.js.map +1 -0
  72. package/dist/src/deferred-foreground-transfer.js +46 -105
  73. package/dist/src/deferred-foreground-transfer.js.map +1 -1
  74. package/dist/src/doctor-capabilities.d.ts +9 -0
  75. package/dist/src/doctor-capabilities.js +22 -0
  76. package/dist/src/doctor-capabilities.js.map +1 -1
  77. package/dist/src/durable-json-file.d.ts +22 -0
  78. package/dist/src/durable-json-file.js +127 -0
  79. package/dist/src/durable-json-file.js.map +1 -0
  80. package/dist/src/file-lock-cli-adapter.d.ts +43 -0
  81. package/dist/src/file-lock-cli-adapter.js +150 -0
  82. package/dist/src/file-lock-cli-adapter.js.map +1 -0
  83. package/dist/src/herdr-terminal-control-provider.js +1 -3
  84. package/dist/src/herdr-terminal-control-provider.js.map +1 -1
  85. package/dist/src/install-doctor-command-adapter.d.ts +17 -0
  86. package/dist/src/install-doctor-command-adapter.js +225 -0
  87. package/dist/src/install-doctor-command-adapter.js.map +1 -0
  88. package/dist/src/live-lifecycle-evidence.js +76 -46
  89. package/dist/src/live-lifecycle-evidence.js.map +1 -1
  90. package/dist/src/live-lifecycle-smoke.js +74 -50
  91. package/dist/src/live-lifecycle-smoke.js.map +1 -1
  92. package/dist/src/managed-session.d.ts +2 -0
  93. package/dist/src/managed-session.js +24 -0
  94. package/dist/src/managed-session.js.map +1 -1
  95. package/dist/src/managed-turn-recovery-service.d.ts +86 -0
  96. package/dist/src/managed-turn-recovery-service.js +145 -0
  97. package/dist/src/managed-turn-recovery-service.js.map +1 -0
  98. package/dist/src/mutation-transaction.d.ts +48 -0
  99. package/dist/src/mutation-transaction.js +73 -0
  100. package/dist/src/mutation-transaction.js.map +1 -0
  101. package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +154 -0
  102. package/dist/src/native-thread-lifecycle-cli-adapter.js +786 -0
  103. package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -0
  104. package/dist/src/native-thread-lifecycle-ledger-cli-adapter.d.ts +25 -0
  105. package/dist/src/native-thread-lifecycle-ledger-cli-adapter.js +50 -0
  106. package/dist/src/native-thread-lifecycle-ledger-cli-adapter.js.map +1 -0
  107. package/dist/src/native-thread-lifecycle-query-service.d.ts +75 -0
  108. package/dist/src/native-thread-lifecycle-query-service.js +297 -0
  109. package/dist/src/native-thread-lifecycle-query-service.js.map +1 -0
  110. package/dist/src/native-thread-lifecycle-recovery-adapter.d.ts +45 -0
  111. package/dist/src/native-thread-lifecycle-recovery-adapter.js +154 -0
  112. package/dist/src/native-thread-lifecycle-recovery-adapter.js.map +1 -0
  113. package/dist/src/native-thread-lifecycle-recovery-service.d.ts +211 -0
  114. package/dist/src/native-thread-lifecycle-recovery-service.js +1093 -0
  115. package/dist/src/native-thread-lifecycle-recovery-service.js.map +1 -0
  116. package/dist/src/native-thread-resume-snapshot-policy.d.ts +73 -0
  117. package/dist/src/native-thread-resume-snapshot-policy.js +218 -0
  118. package/dist/src/native-thread-resume-snapshot-policy.js.map +1 -0
  119. package/dist/src/native-thread-resume-snapshot.d.ts +3 -61
  120. package/dist/src/native-thread-resume-snapshot.js +2 -143
  121. package/dist/src/native-thread-resume-snapshot.js.map +1 -1
  122. package/dist/src/native-thread-transition-application.d.ts +147 -0
  123. package/dist/src/native-thread-transition-application.js +974 -0
  124. package/dist/src/native-thread-transition-application.js.map +1 -0
  125. package/dist/src/native-thread-transition-policy.d.ts +127 -0
  126. package/dist/src/native-thread-transition-policy.js +154 -0
  127. package/dist/src/native-thread-transition-policy.js.map +1 -0
  128. package/dist/src/native-thread-transition-resource-adapter.d.ts +12 -0
  129. package/dist/src/native-thread-transition-resource-adapter.js +44 -0
  130. package/dist/src/native-thread-transition-resource-adapter.js.map +1 -0
  131. package/dist/src/native-thread-transition-settlement-service.d.ts +94 -0
  132. package/dist/src/native-thread-transition-settlement-service.js +134 -0
  133. package/dist/src/native-thread-transition-settlement-service.js.map +1 -0
  134. package/dist/src/native-thread-transition-verification-adapter.d.ts +62 -0
  135. package/dist/src/native-thread-transition-verification-adapter.js +451 -0
  136. package/dist/src/native-thread-transition-verification-adapter.js.map +1 -0
  137. package/dist/src/openclaw-callback-transport.d.ts +69 -0
  138. package/dist/src/openclaw-callback-transport.js +583 -0
  139. package/dist/src/openclaw-callback-transport.js.map +1 -0
  140. package/dist/src/openclaw-plugin-callback-adapter.d.ts +1 -0
  141. package/dist/src/openclaw-plugin-callback-adapter.js +423 -0
  142. package/dist/src/openclaw-plugin-callback-adapter.js.map +1 -0
  143. package/dist/src/openclaw-plugin-command-adapter.d.ts +16 -0
  144. package/dist/src/openclaw-plugin-command-adapter.js +1868 -0
  145. package/dist/src/openclaw-plugin-command-adapter.js.map +1 -0
  146. package/dist/src/openclaw-plugin-helpers.d.ts +27 -4
  147. package/dist/src/openclaw-plugin-helpers.js +356 -81
  148. package/dist/src/openclaw-plugin-helpers.js.map +1 -1
  149. package/dist/src/openclaw-plugin-schemas.d.ts +358 -0
  150. package/dist/src/openclaw-plugin-schemas.js +366 -0
  151. package/dist/src/openclaw-plugin-schemas.js.map +1 -0
  152. package/dist/src/openclaw-plugin-supervisor.d.ts +6 -0
  153. package/dist/src/openclaw-plugin-supervisor.js +123 -0
  154. package/dist/src/openclaw-plugin-supervisor.js.map +1 -0
  155. package/dist/src/openclaw-plugin.js +7 -2212
  156. package/dist/src/openclaw-plugin.js.map +1 -1
  157. package/dist/src/openclaw-private-authority-offers.d.ts +22 -0
  158. package/dist/src/openclaw-private-authority-offers.js +177 -0
  159. package/dist/src/openclaw-private-authority-offers.js.map +1 -0
  160. package/dist/src/protocol.d.ts +5 -0
  161. package/dist/src/protocol.js +59 -3
  162. package/dist/src/protocol.js.map +1 -1
  163. package/dist/src/session-store.d.ts +1 -0
  164. package/dist/src/session-store.js +84 -106
  165. package/dist/src/session-store.js.map +1 -1
  166. package/dist/src/store.d.ts +1 -0
  167. package/dist/src/store.js +5 -2
  168. package/dist/src/store.js.map +1 -1
  169. package/dist/src/terminal-acceptance-application-service.d.ts +65 -0
  170. package/dist/src/terminal-acceptance-application-service.js +63 -0
  171. package/dist/src/terminal-acceptance-application-service.js.map +1 -0
  172. package/dist/src/terminal-acceptance-cli-adapter.d.ts +210 -0
  173. package/dist/src/terminal-acceptance-cli-adapter.js +957 -0
  174. package/dist/src/terminal-acceptance-cli-adapter.js.map +1 -0
  175. package/dist/src/terminal-action-projection.d.ts +309 -0
  176. package/dist/src/terminal-action-projection.js +376 -0
  177. package/dist/src/terminal-action-projection.js.map +1 -0
  178. package/dist/src/terminal-agent-bridge.d.ts +3 -0
  179. package/dist/src/terminal-agent-bridge.js +29 -8
  180. package/dist/src/terminal-agent-bridge.js.map +1 -1
  181. package/dist/src/terminal-authority-policy.d.ts +141 -0
  182. package/dist/src/terminal-authority-policy.js +367 -0
  183. package/dist/src/terminal-authority-policy.js.map +1 -0
  184. package/dist/src/terminal-binding-authority.d.ts +118 -0
  185. package/dist/src/terminal-binding-authority.js +245 -0
  186. package/dist/src/terminal-binding-authority.js.map +1 -0
  187. package/dist/src/terminal-binding-reconciliation-service.d.ts +75 -0
  188. package/dist/src/terminal-binding-reconciliation-service.js +73 -0
  189. package/dist/src/terminal-binding-reconciliation-service.js.map +1 -0
  190. package/dist/src/terminal-command-cli-adapter.d.ts +380 -0
  191. package/dist/src/terminal-command-cli-adapter.js +3288 -0
  192. package/dist/src/terminal-command-cli-adapter.js.map +1 -0
  193. package/dist/src/terminal-control-ref.d.ts +4 -0
  194. package/dist/src/terminal-control-ref.js +11 -8
  195. package/dist/src/terminal-control-ref.js.map +1 -1
  196. package/dist/src/terminal-delegate-cli-adapter.d.ts +41 -0
  197. package/dist/src/terminal-delegate-cli-adapter.js +242 -0
  198. package/dist/src/terminal-delegate-cli-adapter.js.map +1 -0
  199. package/dist/src/terminal-dispatch-abort.d.ts +22 -0
  200. package/dist/src/terminal-dispatch-abort.js +30 -0
  201. package/dist/src/terminal-dispatch-abort.js.map +1 -0
  202. package/dist/src/terminal-dispatch-application.d.ts +115 -0
  203. package/dist/src/terminal-dispatch-application.js +478 -0
  204. package/dist/src/terminal-dispatch-application.js.map +1 -0
  205. package/dist/src/terminal-dispatch-capability.d.ts +63 -0
  206. package/dist/src/terminal-dispatch-capability.js +133 -0
  207. package/dist/src/terminal-dispatch-capability.js.map +1 -0
  208. package/dist/src/terminal-dispatch-completion-cli-adapter.d.ts +22 -0
  209. package/dist/src/terminal-dispatch-completion-cli-adapter.js +96 -0
  210. package/dist/src/terminal-dispatch-completion-cli-adapter.js.map +1 -0
  211. package/dist/src/terminal-dispatch-composition.d.ts +79 -0
  212. package/dist/src/terminal-dispatch-composition.js +2 -0
  213. package/dist/src/terminal-dispatch-composition.js.map +1 -0
  214. package/dist/src/terminal-dispatch-execution.d.ts +290 -0
  215. package/dist/src/terminal-dispatch-execution.js +916 -0
  216. package/dist/src/terminal-dispatch-execution.js.map +1 -0
  217. package/dist/src/terminal-dispatch-ledger-codec.d.ts +110 -0
  218. package/dist/src/terminal-dispatch-ledger-codec.js +399 -0
  219. package/dist/src/terminal-dispatch-ledger-codec.js.map +1 -0
  220. package/dist/src/terminal-dispatch-policy.d.ts +93 -0
  221. package/dist/src/terminal-dispatch-policy.js +122 -0
  222. package/dist/src/terminal-dispatch-policy.js.map +1 -0
  223. package/dist/src/terminal-dispatch-presenter.d.ts +65 -0
  224. package/dist/src/terminal-dispatch-presenter.js +258 -0
  225. package/dist/src/terminal-dispatch-presenter.js.map +1 -0
  226. package/dist/src/terminal-dispatch-receipt.d.ts +79 -0
  227. package/dist/src/terminal-dispatch-receipt.js +314 -0
  228. package/dist/src/terminal-dispatch-receipt.js.map +1 -0
  229. package/dist/src/terminal-dispatch-recovery-cli-adapter.d.ts +132 -0
  230. package/dist/src/terminal-dispatch-recovery-cli-adapter.js +1330 -0
  231. package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -0
  232. package/dist/src/terminal-dispatch-recovery-service.d.ts +271 -0
  233. package/dist/src/terminal-dispatch-recovery-service.js +374 -0
  234. package/dist/src/terminal-dispatch-recovery-service.js.map +1 -0
  235. package/dist/src/terminal-dispatch-repository-cli-adapter.d.ts +35 -0
  236. package/dist/src/terminal-dispatch-repository-cli-adapter.js +483 -0
  237. package/dist/src/terminal-dispatch-repository-cli-adapter.js.map +1 -0
  238. package/dist/src/terminal-handoff-application-service.d.ts +7 -0
  239. package/dist/src/terminal-handoff-application-service.js +18 -0
  240. package/dist/src/terminal-handoff-application-service.js.map +1 -0
  241. package/dist/src/terminal-handoff-cli-adapter.d.ts +229 -0
  242. package/dist/src/terminal-handoff-cli-adapter.js +1389 -0
  243. package/dist/src/terminal-handoff-cli-adapter.js.map +1 -0
  244. package/dist/src/terminal-handoff-facts.d.ts +12 -0
  245. package/dist/src/terminal-handoff-facts.js +16 -0
  246. package/dist/src/terminal-handoff-facts.js.map +1 -0
  247. package/dist/src/terminal-identity-authority-cli-adapter.d.ts +318 -0
  248. package/dist/src/terminal-identity-authority-cli-adapter.js +1072 -0
  249. package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -0
  250. package/dist/src/terminal-identity-authority-service.d.ts +48 -0
  251. package/dist/src/terminal-identity-authority-service.js +45 -0
  252. package/dist/src/terminal-identity-authority-service.js.map +1 -0
  253. package/dist/src/terminal-list-cli-adapter.d.ts +274 -0
  254. package/dist/src/terminal-list-cli-adapter.js +2444 -0
  255. package/dist/src/terminal-list-cli-adapter.js.map +1 -0
  256. package/dist/src/terminal-list-renderer.d.ts +34 -0
  257. package/dist/src/terminal-list-renderer.js +643 -0
  258. package/dist/src/terminal-list-renderer.js.map +1 -0
  259. package/dist/src/terminal-maintenance-cli-adapter.d.ts +102 -0
  260. package/dist/src/terminal-maintenance-cli-adapter.js +1059 -0
  261. package/dist/src/terminal-maintenance-cli-adapter.js.map +1 -0
  262. package/dist/src/terminal-monitor-application-service.d.ts +275 -0
  263. package/dist/src/terminal-monitor-application-service.js +982 -0
  264. package/dist/src/terminal-monitor-application-service.js.map +1 -0
  265. package/dist/src/terminal-monitor-cli-adapter.d.ts +130 -0
  266. package/dist/src/terminal-monitor-cli-adapter.js +442 -0
  267. package/dist/src/terminal-monitor-cli-adapter.js.map +1 -0
  268. package/dist/src/terminal-monitor-decision-policy.d.ts +98 -0
  269. package/dist/src/terminal-monitor-decision-policy.js +246 -0
  270. package/dist/src/terminal-monitor-decision-policy.js.map +1 -0
  271. package/dist/src/terminal-monitor-launch-plan.d.ts +45 -0
  272. package/dist/src/terminal-monitor-launch-plan.js +94 -0
  273. package/dist/src/terminal-monitor-launch-plan.js.map +1 -0
  274. package/dist/src/terminal-monitor-ownership-policy.d.ts +31 -0
  275. package/dist/src/terminal-monitor-ownership-policy.js +64 -0
  276. package/dist/src/terminal-monitor-ownership-policy.js.map +1 -0
  277. package/dist/src/terminal-monitor-poll-policy.d.ts +48 -0
  278. package/dist/src/terminal-monitor-poll-policy.js +67 -0
  279. package/dist/src/terminal-monitor-poll-policy.js.map +1 -0
  280. package/dist/src/terminal-monitor-reconciliation-eligibility.d.ts +53 -0
  281. package/dist/src/terminal-monitor-reconciliation-eligibility.js +114 -0
  282. package/dist/src/terminal-monitor-reconciliation-eligibility.js.map +1 -0
  283. package/dist/src/terminal-monitor-state-cli-adapter.d.ts +106 -0
  284. package/dist/src/terminal-monitor-state-cli-adapter.js +1492 -0
  285. package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -0
  286. package/dist/src/terminal-monitor-state-reconciliation-service.d.ts +87 -0
  287. package/dist/src/terminal-monitor-state-reconciliation-service.js +106 -0
  288. package/dist/src/terminal-monitor-state-reconciliation-service.js.map +1 -0
  289. package/dist/src/terminal-monitor-supervision-cli-adapter.d.ts +122 -0
  290. package/dist/src/terminal-monitor-supervision-cli-adapter.js +685 -0
  291. package/dist/src/terminal-monitor-supervision-cli-adapter.js.map +1 -0
  292. package/dist/src/terminal-process-facts.d.ts +2 -0
  293. package/dist/src/terminal-process-facts.js +19 -0
  294. package/dist/src/terminal-process-facts.js.map +1 -0
  295. package/dist/src/terminal-process-source.d.ts +6 -4
  296. package/dist/src/terminal-process-source.js +25 -20
  297. package/dist/src/terminal-process-source.js.map +1 -1
  298. package/dist/src/terminal-runtime-cli-adapter.d.ts +80 -0
  299. package/dist/src/terminal-runtime-cli-adapter.js +488 -0
  300. package/dist/src/terminal-runtime-cli-adapter.js.map +1 -0
  301. package/dist/src/terminal-scoped-approval-authority.d.ts +62 -0
  302. package/dist/src/terminal-scoped-approval-authority.js +281 -0
  303. package/dist/src/terminal-scoped-approval-authority.js.map +1 -0
  304. package/dist/src/terminal-selector-projection-service.d.ts +26 -0
  305. package/dist/src/terminal-selector-projection-service.js +81 -0
  306. package/dist/src/terminal-selector-projection-service.js.map +1 -0
  307. package/dist/src/terminal-status-cli-adapter.d.ts +126 -0
  308. package/dist/src/terminal-status-cli-adapter.js +577 -0
  309. package/dist/src/terminal-status-cli-adapter.js.map +1 -0
  310. package/dist/src/terminal-status-facts.d.ts +56 -0
  311. package/dist/src/terminal-status-facts.js +199 -0
  312. package/dist/src/terminal-status-facts.js.map +1 -0
  313. package/dist/src/terminal-submission-acceptance.d.ts +62 -145
  314. package/dist/src/terminal-submission-acceptance.js +555 -222
  315. package/dist/src/terminal-submission-acceptance.js.map +1 -1
  316. package/dist/src/terminal-submission-facts.d.ts +123 -0
  317. package/dist/src/terminal-submission-facts.js +205 -0
  318. package/dist/src/terminal-submission-facts.js.map +1 -0
  319. package/dist/src/terminal-turn-binding-authority-cli-adapter.d.ts +14 -0
  320. package/dist/src/terminal-turn-binding-authority-cli-adapter.js +90 -0
  321. package/dist/src/terminal-turn-binding-authority-cli-adapter.js.map +1 -0
  322. package/dist/src/terminal-watch-callback-cli-adapter.d.ts +20 -0
  323. package/dist/src/terminal-watch-callback-cli-adapter.js +55 -0
  324. package/dist/src/terminal-watch-callback-cli-adapter.js.map +1 -0
  325. package/dist/src/terminal-watch-cli-adapter.d.ts +64 -0
  326. package/dist/src/terminal-watch-cli-adapter.js +508 -0
  327. package/dist/src/terminal-watch-cli-adapter.js.map +1 -0
  328. package/dist/src/terminal-watch-service.d.ts +97 -0
  329. package/dist/src/terminal-watch-service.js +714 -0
  330. package/dist/src/terminal-watch-service.js.map +1 -0
  331. package/dist/src/terminal-watch-store.d.ts +149 -0
  332. package/dist/src/terminal-watch-store.js +861 -0
  333. package/dist/src/terminal-watch-store.js.map +1 -0
  334. package/dist/src/value-guards.d.ts +4 -0
  335. package/dist/src/value-guards.js +12 -0
  336. package/dist/src/value-guards.js.map +1 -0
  337. package/dist/src/verified-dead-agent-policy.d.ts +192 -0
  338. package/dist/src/verified-dead-agent-policy.js +262 -0
  339. package/dist/src/verified-dead-agent-policy.js.map +1 -0
  340. package/docs/quickstart-herdr.md +8 -0
  341. package/docs/quickstart-tmux.md +33 -6
  342. package/openclaw.plugin.json +11 -3
  343. package/package.json +3 -1
  344. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +58 -40
@@ -0,0 +1,795 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ import { canonicalJson } from "./canonical-json.js";
4
+ import { isExactNativeThreadId, managedSessionBindingToken, managedSessionRevision, managedSessionStatesFromConversations } from "./managed-session.js";
5
+ import { executorForConversation, isTerminalDispatchOwnerReleasedStatus, sessionIdForConversation, turnIdForConversation } from "./protocol.js";
6
+ import { listManagedSessions, loadManagedSession, loadNativeThreadTransition } from "./session-store.js";
7
+ import { candidateSourceRootAuthorityMatches, exactBoundCodexSendSource, terminalControlsShareIncarnation } from "./terminal-authority-policy.js";
8
+ import { terminalControlEvidenceMatches, terminalEndpointFromControlRef } from "./terminal-control-ref.js";
9
+ import { terminalDispatchReceiptHistory as terminalLedgerReceiptHistory } from "./terminal-dispatch-ledger-codec.js";
10
+ import { terminalActionFingerprint } from "./native-thread-resume-snapshot-policy.js";
11
+ import { terminalBridgeRequestFingerprint, terminalBridgeSubmission, terminalBridgeSubmissionReceipts } from "./terminal-dispatch-receipt.js";
12
+ import { pathsForConversation, pathsForConversationDir } from "./store.js";
13
+ import { validTerminalMonitorTimestampMs as validTimestampMs } from "./terminal-monitor-decision-policy.js";
14
+ import { isRecord, nonBlankString as stringValue } from "./value-guards.js";
15
+ const TERMINAL_INPUT_EVIDENCE_FIELDS = [
16
+ "text_injected_at",
17
+ "enter_dispatched_at",
18
+ "submitted_at",
19
+ "agent_accepted_at",
20
+ "not_accepted_at",
21
+ "uncertain_at",
22
+ "acceptance_evidence"
23
+ ];
24
+ function required(value, message) {
25
+ if (value === undefined || value === null || value === "") {
26
+ throw new Error(message);
27
+ }
28
+ return value;
29
+ }
30
+ export function codexCandidateInventoryHasNoOtherManagedClaim(ports, { storeDir, inventory, sourceSessionId, includeDetached = true }) {
31
+ const candidateIds = new Set(inventory.roots.map((root) => root.sessionId.toLowerCase()));
32
+ return !listManagedSessions(storeDir).some((session) => session.session_id !== sourceSessionId &&
33
+ (includeDetached || session.status !== "detached") &&
34
+ isExactNativeThreadId(session.binding?.native_thread_id) &&
35
+ candidateIds.has(session.binding.native_thread_id.toLowerCase()));
36
+ }
37
+ function hasExactReleasedAbortEnvelope(context) {
38
+ const { ports, session, turn, binding, takeover, submission, terminalControl, messageId } = context;
39
+ if (session.status !== "bound" ||
40
+ session.agent !== "codex" ||
41
+ !binding ||
42
+ !isExactNativeThreadId(binding.native_thread_id) ||
43
+ !isTerminalDispatchOwnerReleasedStatus(turn.status) ||
44
+ ports.turn.needsAttention(turn) ||
45
+ isRecord(turn.callback_delivery) ||
46
+ isRecord(turn.terminal_bridge_completion_claim) ||
47
+ !takeover ||
48
+ isRecord(takeover.terminal_bridge_completion_claim) ||
49
+ !submission ||
50
+ !terminalControl ||
51
+ !messageId) {
52
+ return false;
53
+ }
54
+ return true;
55
+ }
56
+ function hasExactReleasedAbortStage(context) {
57
+ const { submission, preparedAt, abortedAt } = context;
58
+ if (submission.status !== "aborted" ||
59
+ submission.safe_to_retry !== true ||
60
+ stringValue(submission.last_proven_stage) !== "prepared" ||
61
+ !preparedAt ||
62
+ !abortedAt ||
63
+ !validTimestampMs(preparedAt) ||
64
+ !validTimestampMs(abortedAt) ||
65
+ Date.parse(abortedAt) < Date.parse(preparedAt) ||
66
+ TERMINAL_INPUT_EVIDENCE_FIELDS.some((field) => submission[field] !== undefined)) {
67
+ return false;
68
+ }
69
+ return true;
70
+ }
71
+ function releasedAbortRequestMatches(context) {
72
+ const { takeover, submission, messageId } = context;
73
+ return stringValue(takeover.terminal_bridge_message_id) === messageId &&
74
+ stringValue(takeover.terminal_bridge_request_hash) ===
75
+ stringValue(submission.request_hash) &&
76
+ terminalBridgeRequestFingerprint(stringValue(takeover.terminal_bridge_request_text) ?? "") === stringValue(submission.request_hash);
77
+ }
78
+ function releasedAbortConversationMatches(context) {
79
+ const { session, turn, submission } = context;
80
+ return executorForConversation(turn).kind === "codex" &&
81
+ sessionIdForConversation(turn) === session.session_id &&
82
+ stringValue(submission.session_id) === session.session_id &&
83
+ stringValue(submission.turn_id) === turnIdForConversation(turn) &&
84
+ stringValue(submission.executor_kind) === "codex" &&
85
+ stringValue(submission.openclaw_session) === turn.openclaw_session;
86
+ }
87
+ function releasedAbortBindingMatches(context) {
88
+ const { turn, binding, takeover, submission } = context;
89
+ return stringValue(turn.terminal_binding_id) === binding.binding_id &&
90
+ Number(turn.terminal_binding_generation) === binding.generation &&
91
+ stringValue(takeover.terminal_binding_id) === binding.binding_id &&
92
+ Number(takeover.terminal_binding_generation) === binding.generation &&
93
+ stringValue(submission.binding_id) === binding.binding_id &&
94
+ Number(submission.binding_generation) === binding.generation &&
95
+ stringValue(turn.native_thread_id) === binding.native_thread_id &&
96
+ stringValue(takeover.terminal_agent_session_id) ===
97
+ binding.native_thread_id &&
98
+ stringValue(submission.native_thread_id) === binding.native_thread_id;
99
+ }
100
+ function releasedAbortProcessAndControlMatches(context) {
101
+ const { session, turn, binding, takeover, submission, terminalControl } = context;
102
+ return Number(takeover.terminal_agent_pid) === binding.native_process.pid &&
103
+ stringValue(takeover.terminal_agent_process_uuid) ===
104
+ binding.native_process.process_uuid &&
105
+ stringValue(takeover.terminal_agent_process_birth) ===
106
+ binding.native_process.process_birth &&
107
+ terminalControlsShareIncarnation(terminalControl, binding.terminal_control) &&
108
+ terminalControlEvidenceMatches(submission.terminal_endpoint ?? terminalControl, binding.terminal_control) &&
109
+ path.resolve(turn.workspace) === path.resolve(session.workspace);
110
+ }
111
+ function releasedAbortPathsMatch(context, canonical) {
112
+ const { ports, storeDir, turn, submission } = context;
113
+ return path.resolve(stringValue(turn.state_path) ?? "") ===
114
+ path.resolve(canonical.statePath) &&
115
+ path.resolve(stringValue(turn.event_log_path) ?? "") ===
116
+ path.resolve(canonical.logPath) &&
117
+ path.resolve(ports.turn.storeDir(turn) ?? "") === path.resolve(storeDir) &&
118
+ path.resolve(stringValue(submission.store_dir) ?? "") ===
119
+ path.resolve(storeDir);
120
+ }
121
+ function exactReleasedSafeAbortedCandidateTurn(ports, { storeDir, session, turn }) {
122
+ const binding = session.binding;
123
+ const takeover = isRecord(turn.native_session_takeover)
124
+ ? turn.native_session_takeover
125
+ : undefined;
126
+ const submission = terminalBridgeSubmission(turn);
127
+ const terminalControl = ports.turn.terminalControl(takeover);
128
+ const messageId = stringValue(submission?.message_id);
129
+ const preparedAt = stringValue(submission?.prepared_at);
130
+ const abortedAt = stringValue(submission?.aborted_at);
131
+ const context = {
132
+ ports,
133
+ storeDir,
134
+ session,
135
+ turn,
136
+ binding,
137
+ takeover,
138
+ submission,
139
+ terminalControl,
140
+ messageId,
141
+ preparedAt,
142
+ abortedAt
143
+ };
144
+ if (!hasExactReleasedAbortEnvelope(context) ||
145
+ !hasExactReleasedAbortStage(context) ||
146
+ !releasedAbortRequestMatches(context) ||
147
+ !releasedAbortConversationMatches(context) ||
148
+ !releasedAbortBindingMatches(context) ||
149
+ !releasedAbortProcessAndControlMatches(context)) {
150
+ return false;
151
+ }
152
+ const canonical = pathsForConversation(turn.conversation_id, storeDir);
153
+ if (!releasedAbortPathsMatch(context, canonical)) {
154
+ return false;
155
+ }
156
+ const matchingReceipts = terminalBridgeSubmissionReceipts(turn).filter((receipt) => stringValue(receipt.message_id) === messageId);
157
+ return matchingReceipts.length === 1 &&
158
+ canonicalJson(matchingReceipts[0]) === canonicalJson(submission);
159
+ }
160
+ export function deferredCandidateSourceTurnHistory(ports, storeDir, session) {
161
+ const binding = session.binding;
162
+ if (!binding?.native_thread_id) {
163
+ return undefined;
164
+ }
165
+ const turns = currentCandidateBindingTurns(binding, ports.turn.turnsForSession(storeDir, session.session_id));
166
+ if (!turns || turns.some((turn) => {
167
+ const callbackDelivered = isRecord(turn.callback_delivery) &&
168
+ turn.callback_delivery.status === "delivered";
169
+ const explicitlyAbandonedUncertain = exactExplicitlyAbandonedUncertainCandidateTurn(ports, {
170
+ storeDir,
171
+ session,
172
+ turn
173
+ });
174
+ const safelyAbortedBeforeInput = exactReleasedSafeAbortedCandidateTurn(ports, {
175
+ storeDir,
176
+ session,
177
+ turn
178
+ });
179
+ return (!isTerminalDispatchOwnerReleasedStatus(turn.status) ||
180
+ ports.turn.needsAttention(turn) ||
181
+ (isRecord(turn.callback_delivery) &&
182
+ !callbackDelivered) ||
183
+ (Boolean(turn.gateway_method) &&
184
+ !callbackDelivered &&
185
+ !explicitlyAbandonedUncertain &&
186
+ !safelyAbortedBeforeInput));
187
+ })) {
188
+ return undefined;
189
+ }
190
+ return turns
191
+ .map((turn) => ({
192
+ turn_id: turnIdForConversation(turn),
193
+ status: turn.status,
194
+ updated_at: required(stringValue(turn.updated_at), `managed Turn ${turnIdForConversation(turn)} updated_at is unavailable`),
195
+ binding_id: binding.binding_id,
196
+ binding_generation: binding.generation,
197
+ native_thread_id: binding.native_thread_id,
198
+ turn_fingerprint: createHash("sha256")
199
+ .update(JSON.stringify(turn))
200
+ .digest("hex")
201
+ }))
202
+ .sort((left, right) => left.turn_id.localeCompare(right.turn_id));
203
+ }
204
+ function frozenCandidateSourceTurnHistory(ports, storeDir, session) {
205
+ const binding = session.binding;
206
+ if (!binding?.native_thread_id) {
207
+ return undefined;
208
+ }
209
+ const turns = currentCandidateBindingTurns(binding, ports.turn.turnsForSession(storeDir, session.session_id));
210
+ if (!turns || turns.some((turn) => !isTerminalDispatchOwnerReleasedStatus(turn.status))) {
211
+ return undefined;
212
+ }
213
+ return turns.map((turn) => ({
214
+ turn_id: turnIdForConversation(turn),
215
+ status: turn.status,
216
+ updated_at: required(stringValue(turn.updated_at), `managed Turn ${turnIdForConversation(turn)} updated_at is unavailable`),
217
+ binding_id: binding.binding_id,
218
+ binding_generation: binding.generation,
219
+ native_thread_id: binding.native_thread_id,
220
+ turn_fingerprint: createHash("sha256")
221
+ .update(JSON.stringify(turn))
222
+ .digest("hex")
223
+ })).sort((left, right) => left.turn_id.localeCompare(right.turn_id));
224
+ }
225
+ function candidateTurnNativeThreadId(turn) {
226
+ return stringValue(turn.native_thread_id) ??
227
+ stringValue(isRecord(turn.native_session_takeover)
228
+ ? turn.native_session_takeover.terminal_agent_session_id
229
+ : undefined);
230
+ }
231
+ function candidateTurnMatchesCurrentBinding(turn, binding) {
232
+ return stringValue(turn.terminal_binding_id) === binding.binding_id &&
233
+ Number(turn.terminal_binding_generation) === binding.generation &&
234
+ candidateTurnNativeThreadId(turn) === binding.native_thread_id;
235
+ }
236
+ function candidateTurnHasStrictEarlierBinding(turn, binding) {
237
+ const turnBindingId = stringValue(turn.terminal_binding_id);
238
+ const turnBindingGeneration = Number(turn.terminal_binding_generation);
239
+ const turnNativeThreadId = stringValue(turn.native_thread_id);
240
+ const takeover = isRecord(turn.native_session_takeover)
241
+ ? turn.native_session_takeover
242
+ : undefined;
243
+ if (turnBindingId &&
244
+ Number.isSafeInteger(turnBindingGeneration) &&
245
+ turnBindingGeneration >= 1 &&
246
+ isExactNativeThreadId(turnNativeThreadId)) {
247
+ const nestedBindingId = stringValue(takeover?.terminal_binding_id);
248
+ const nestedBindingGeneration = takeover?.terminal_binding_generation ===
249
+ undefined
250
+ ? undefined
251
+ : Number(takeover.terminal_binding_generation);
252
+ const nestedNativeThreadIds = [
253
+ takeover?.terminal_agent_expected_session_id,
254
+ takeover?.terminal_agent_session_id
255
+ ].filter((value) => value !== undefined);
256
+ if ((takeover?.terminal_binding_id !== undefined &&
257
+ nestedBindingId !== turnBindingId) ||
258
+ (nestedBindingGeneration !== undefined &&
259
+ nestedBindingGeneration !== turnBindingGeneration) ||
260
+ nestedNativeThreadIds.some((value) => stringValue(value) !== turnNativeThreadId)) {
261
+ return false;
262
+ }
263
+ return turnBindingId !== binding.binding_id &&
264
+ turnBindingGeneration < binding.generation;
265
+ }
266
+ const hasNoPersistedBindingIdentity = turn.terminal_binding_id === undefined &&
267
+ turn.terminal_binding_generation === undefined &&
268
+ turn.native_thread_id === undefined &&
269
+ takeover?.terminal_binding_id === undefined &&
270
+ takeover?.terminal_binding_generation === undefined;
271
+ if (!hasNoPersistedBindingIdentity) {
272
+ return false;
273
+ }
274
+ try {
275
+ const migrated = managedSessionStatesFromConversations([turn])[0];
276
+ const migratedBinding = migrated?.status === "bound"
277
+ ? migrated.binding
278
+ : undefined;
279
+ return Boolean(migratedBinding &&
280
+ migratedBinding.binding_id !== binding.binding_id &&
281
+ migratedBinding.generation < binding.generation &&
282
+ isExactNativeThreadId(migratedBinding.native_thread_id));
283
+ }
284
+ catch {
285
+ return false;
286
+ }
287
+ }
288
+ /**
289
+ * Keep the mutable authority fingerprint scoped to the current binding epoch.
290
+ * A released Turn from a strictly earlier binding epoch no longer owns current
291
+ * terminal input. Its callback and notification recovery remain independent
292
+ * concerns; any ambiguous binding or non-released Turn still fails closed.
293
+ */
294
+ function currentCandidateBindingTurns(binding, turns) {
295
+ const current = [];
296
+ for (const turn of turns) {
297
+ if (candidateTurnMatchesCurrentBinding(turn, binding)) {
298
+ current.push(turn);
299
+ continue;
300
+ }
301
+ if (!isTerminalDispatchOwnerReleasedStatus(turn.status) ||
302
+ !candidateTurnHasStrictEarlierBinding(turn, binding)) {
303
+ return undefined;
304
+ }
305
+ }
306
+ return current;
307
+ }
308
+ function exactExplicitlyAbandonedUncertainCandidateTurn(ports, { storeDir, session, turn }) {
309
+ return explicitlyAbandonedUncertainCandidateTurnFingerprint(ports, {
310
+ storeDir,
311
+ session,
312
+ turn
313
+ }) !== undefined;
314
+ }
315
+ function hasExplicitCandidateClose(turn) {
316
+ return turn.status === "closed" &&
317
+ !isRecord(turn.callback_delivery) &&
318
+ !isRecord(turn.terminal_bridge_completion_claim) &&
319
+ Boolean(stringValue(turn.closed_at)) &&
320
+ Boolean(stringValue(turn.close_reason));
321
+ }
322
+ function hasUncertainCandidateEnvelope(context) {
323
+ const { session, turn, takeover, submission, terminalControl, messageId } = context;
324
+ if (!takeover ||
325
+ isRecord(takeover.terminal_bridge_completion_claim) ||
326
+ !terminalControl ||
327
+ submission?.status !== "uncertain" ||
328
+ submission.safe_to_retry === true ||
329
+ !messageId ||
330
+ stringValue(takeover.terminal_bridge_message_id) !== messageId ||
331
+ stringValue(submission.session_id) !== session.session_id ||
332
+ stringValue(submission.turn_id) !== turnIdForConversation(turn)) {
333
+ return false;
334
+ }
335
+ return true;
336
+ }
337
+ function uncertainCandidatePathsMatch(context, canonical) {
338
+ const { ports, storeDir, turn } = context;
339
+ return path.resolve(stringValue(turn.state_path) ?? "") ===
340
+ path.resolve(canonical.statePath) &&
341
+ path.resolve(stringValue(turn.event_log_path) ?? "") ===
342
+ path.resolve(canonical.logPath) &&
343
+ path.resolve(ports.turn.storeDir(turn) ?? "") === path.resolve(storeDir);
344
+ }
345
+ function tryLoadAbandonmentLedger(ports, terminalControl, ledgerOverride) {
346
+ try {
347
+ return ledgerOverride ?? ports.ledger.load(terminalControl);
348
+ }
349
+ catch {
350
+ return undefined;
351
+ }
352
+ }
353
+ function resolvedAbandonmentLedgerMatches(ledger, context, canonical) {
354
+ const { storeDir, session, turn, submission, messageId } = context;
355
+ return ledger.status === "resolved" &&
356
+ ledger.reason === "conversation explicitly closed by request" &&
357
+ Boolean(validTimestampMs(ledger.resolved_at)) &&
358
+ stringValue(ledger.conversation_id) === turn.conversation_id &&
359
+ stringValue(ledger.session_id) === session.session_id &&
360
+ stringValue(ledger.turn_id) === turnIdForConversation(turn) &&
361
+ stringValue(ledger.message_id) === messageId &&
362
+ stringValue(ledger.request_hash) === stringValue(submission.request_hash) &&
363
+ stringValue(ledger.binding_id) === stringValue(turn.terminal_binding_id) &&
364
+ Number(ledger.binding_generation) ===
365
+ Number(turn.terminal_binding_generation) &&
366
+ path.resolve(stringValue(ledger.state_path) ?? "") ===
367
+ path.resolve(canonical.statePath) &&
368
+ path.resolve(stringValue(ledger.event_log_path) ?? "") ===
369
+ path.resolve(canonical.logPath) &&
370
+ path.resolve(stringValue(ledger.store_dir) ?? "") === path.resolve(storeDir);
371
+ }
372
+ function uniqueAbandonmentReceipt(ledger, messageId) {
373
+ try {
374
+ const matchingReceipts = terminalLedgerReceiptHistory(ledger).filter((candidate) => stringValue(candidate.message_id) === messageId);
375
+ return matchingReceipts.length === 1
376
+ ? matchingReceipts[0]
377
+ : undefined;
378
+ }
379
+ catch {
380
+ return undefined;
381
+ }
382
+ }
383
+ function uncertainAbandonmentReceiptMatches(receipt, context, canonical) {
384
+ const { ports, storeDir, session, turn, submission, terminalControl } = context;
385
+ if (!receipt ||
386
+ receipt.status !== "uncertain" ||
387
+ receipt.safe_to_retry === true ||
388
+ !validTimestampMs(receipt.uncertain_at) ||
389
+ !ports.ledger.matchesControl(receipt, terminalControl) ||
390
+ stringValue(receipt.conversation_id) !== turn.conversation_id ||
391
+ stringValue(receipt.session_id) !== session.session_id ||
392
+ stringValue(receipt.turn_id) !== turnIdForConversation(turn) ||
393
+ stringValue(receipt.request_hash) !== stringValue(submission.request_hash) ||
394
+ stringValue(receipt.binding_id) !== stringValue(turn.terminal_binding_id) ||
395
+ Number(receipt.binding_generation) !==
396
+ Number(turn.terminal_binding_generation) ||
397
+ path.resolve(stringValue(receipt.state_path) ?? "") !==
398
+ path.resolve(canonical.statePath) ||
399
+ path.resolve(stringValue(receipt.event_log_path) ?? "") !==
400
+ path.resolve(canonical.logPath) ||
401
+ path.resolve(stringValue(receipt.store_dir) ?? "") !== path.resolve(storeDir)) {
402
+ return false;
403
+ }
404
+ return true;
405
+ }
406
+ function tryFindExplicitCloseEvent(ports, turn, logPath) {
407
+ try {
408
+ return ports.turn.readEvents(logPath).find((event) => event.event === "conversation_closed" &&
409
+ event.conversation_id === turn.conversation_id &&
410
+ event.status === "closed" &&
411
+ event.ts === turn.closed_at &&
412
+ event.reason === turn.close_reason);
413
+ }
414
+ catch {
415
+ return undefined;
416
+ }
417
+ }
418
+ function explicitlyAbandonedUncertainCandidateTurnProof(ports, { storeDir, session, turn, ledgerOverride, requireResolvedTopLevel = true }) {
419
+ if (!hasExplicitCandidateClose(turn)) {
420
+ return undefined;
421
+ }
422
+ const takeover = isRecord(turn.native_session_takeover)
423
+ ? turn.native_session_takeover
424
+ : undefined;
425
+ const submission = terminalBridgeSubmission(turn);
426
+ const terminalControl = ports.turn.terminalControl(takeover);
427
+ const messageId = stringValue(submission?.message_id);
428
+ const context = {
429
+ ports,
430
+ storeDir,
431
+ session,
432
+ turn,
433
+ takeover,
434
+ submission,
435
+ terminalControl,
436
+ messageId
437
+ };
438
+ if (!hasUncertainCandidateEnvelope(context)) {
439
+ return undefined;
440
+ }
441
+ const canonical = pathsForConversation(turn.conversation_id, storeDir);
442
+ if (!uncertainCandidatePathsMatch(context, canonical)) {
443
+ return undefined;
444
+ }
445
+ const ledger = tryLoadAbandonmentLedger(ports, context.terminalControl, ledgerOverride);
446
+ if (!ledger ||
447
+ !ports.ledger.matchesControl(ledger, context.terminalControl) ||
448
+ (requireResolvedTopLevel &&
449
+ !resolvedAbandonmentLedgerMatches(ledger, context, canonical))) {
450
+ return undefined;
451
+ }
452
+ const receipt = uniqueAbandonmentReceipt(ledger, context.messageId);
453
+ if (!uncertainAbandonmentReceiptMatches(receipt, context, canonical)) {
454
+ return undefined;
455
+ }
456
+ const closeEvent = tryFindExplicitCloseEvent(ports, turn, canonical.logPath);
457
+ if (!closeEvent) {
458
+ return undefined;
459
+ }
460
+ // Hash the immutable close event and append-only uncertain receipt, not the
461
+ // mutable top-level terminal ledger that the next dispatch will replace.
462
+ return {
463
+ turnId: turnIdForConversation(turn),
464
+ messageId: context.messageId,
465
+ turnFingerprint: createHash("sha256")
466
+ .update(JSON.stringify(turn))
467
+ .digest("hex"),
468
+ closeEvent,
469
+ uncertainReceipt: receipt
470
+ };
471
+ }
472
+ function explicitlyAbandonedUncertainCandidateTurnFingerprint(ports, args) {
473
+ const proof = explicitlyAbandonedUncertainCandidateTurnProof(ports, args);
474
+ return proof
475
+ ? terminalActionFingerprint({
476
+ kind: "explicitly_abandoned_uncertain_codex_turn",
477
+ source_session_id: args.session.session_id,
478
+ source_revision: managedSessionRevision(args.session),
479
+ source_binding_token: managedSessionBindingToken(args.session),
480
+ turn_id: proof.turnId,
481
+ turn_fingerprint: proof.turnFingerprint,
482
+ close_event: proof.closeEvent,
483
+ uncertain_receipt: proof.uncertainReceipt
484
+ })
485
+ : undefined;
486
+ }
487
+ export function explicitlyAbandonedCandidateSourceFingerprint(ports, { storeDir, session, sourceTurnHistory, dispatchSnapshot, sourceRevision = managedSessionRevision(session), sourceBindingToken = managedSessionBindingToken(session), ledgerOverride, requireResolvedTopLevel = true }) {
488
+ if (dispatchSnapshot.status !== "resolved") {
489
+ return undefined;
490
+ }
491
+ const abandonedTurnProofs = ports.turn.turnsForSession(storeDir, session.session_id).flatMap((turn) => {
492
+ const proof = explicitlyAbandonedUncertainCandidateTurnProof(ports, {
493
+ storeDir,
494
+ session,
495
+ turn,
496
+ ledgerOverride,
497
+ requireResolvedTopLevel
498
+ });
499
+ return proof
500
+ ? [{
501
+ turn_id: proof.turnId,
502
+ message_id: proof.messageId,
503
+ turn_fingerprint: proof.turnFingerprint,
504
+ close_event: proof.closeEvent,
505
+ uncertain_receipt: proof.uncertainReceipt
506
+ }]
507
+ : [];
508
+ }).sort((left, right) => left.turn_id.localeCompare(right.turn_id));
509
+ if (abandonedTurnProofs.length === 0) {
510
+ return undefined;
511
+ }
512
+ return terminalActionFingerprint({
513
+ kind: "explicitly_abandoned_codex_predecessor",
514
+ source_session_id: session.session_id,
515
+ source_revision: sourceRevision,
516
+ source_binding_token: sourceBindingToken,
517
+ source_turn_history: sourceTurnHistory,
518
+ previous_dispatch_snapshot: dispatchSnapshot,
519
+ abandoned_turns: abandonedTurnProofs
520
+ });
521
+ }
522
+ export function assertFrozenExplicitlyAbandonedPredecessorAuthority(ports, { storeDir, transfer, terminalControl }) {
523
+ if (transfer.source_rollout_authority !==
524
+ "explicitly_abandoned_predecessor") {
525
+ return;
526
+ }
527
+ const source = loadManagedSession(storeDir, transfer.source_session_id);
528
+ const sourceAsBound = {
529
+ ...source,
530
+ status: "bound",
531
+ binding: transfer.source_before_binding,
532
+ last_transition_id: transfer.source_previous_last_transition_id
533
+ };
534
+ const history = frozenCandidateSourceTurnHistory(ports, storeDir, sourceAsBound);
535
+ const ledger = ports.ledger.load(terminalControl);
536
+ const fingerprint = history && ledger
537
+ ? explicitlyAbandonedCandidateSourceFingerprint(ports, {
538
+ storeDir,
539
+ session: sourceAsBound,
540
+ sourceTurnHistory: history,
541
+ dispatchSnapshot: {
542
+ status: transfer.previous_dispatch_status,
543
+ fingerprint: transfer.previous_dispatch_fingerprint
544
+ },
545
+ sourceRevision: transfer.source_expected_revision,
546
+ sourceBindingToken: transfer.source_binding_token,
547
+ ledgerOverride: ledger,
548
+ requireResolvedTopLevel: false
549
+ })
550
+ : undefined;
551
+ if (!history ||
552
+ JSON.stringify(history) !== JSON.stringify(transfer.source_turn_history) ||
553
+ fingerprint !== transfer.source_abandonment_fingerprint) {
554
+ throw new Error(`deferred foreground transfer ${transfer.transfer_id} lost its exact ` +
555
+ "explicitly abandoned predecessor authority");
556
+ }
557
+ }
558
+ function candidateSourceTransitionHistoryIsTerminal(ports, storeDir, session) {
559
+ if (ports.transition.hasUnresolved(storeDir, session)) {
560
+ return false;
561
+ }
562
+ if (!session.last_transition_id) {
563
+ return true;
564
+ }
565
+ try {
566
+ const transition = loadNativeThreadTransition(storeDir, session.last_transition_id);
567
+ return ["committed", "aborted"].includes(transition.status) &&
568
+ (transition.source_session_id === session.session_id ||
569
+ transition.target_session_id === session.session_id);
570
+ }
571
+ catch {
572
+ return false;
573
+ }
574
+ }
575
+ export function deferredCodexForegroundDispatchSnapshot(ports, terminalControl) {
576
+ const ledger = ports.ledger.load(terminalControl);
577
+ return deferredCodexForegroundDispatchSnapshotForLedger(ports, terminalControl, ledger);
578
+ }
579
+ function deferredCodexForegroundDispatchSnapshotForLedger(ports, terminalControl, ledger) {
580
+ if (!ledger) {
581
+ return {
582
+ status: "none",
583
+ fingerprint: terminalActionFingerprint({
584
+ kind: "deferred_codex_foreground_terminal_dispatch",
585
+ status: "none"
586
+ })
587
+ };
588
+ }
589
+ const currentAnchor = terminalEndpointFromControlRef(terminalControl).processAnchorPid;
590
+ const ledgerAnchor = ports.ledger.processAnchor(ledger);
591
+ if (ledger.status !== "resolved" ||
592
+ !Number.isSafeInteger(currentAnchor) ||
593
+ Number(currentAnchor) < 1 ||
594
+ ledgerAnchor !== currentAnchor ||
595
+ !ports.ledger.matchesControl(ledger, terminalControl, {
596
+ requireCurrentRoute: false,
597
+ requireProcessAnchor: true
598
+ })) {
599
+ throw new Error(`terminal ${terminalControl.target} does not have exact resolved ` +
600
+ "dispatch authority");
601
+ }
602
+ const resolvedAt = stringValue(ledger.resolved_at);
603
+ if (!resolvedAt || !Number.isFinite(Date.parse(resolvedAt))) {
604
+ throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has no ` +
605
+ "valid resolved_at");
606
+ }
607
+ const statePath = stringValue(ledger.state_path);
608
+ const ledgerStoreDir = stringValue(ledger.store_dir);
609
+ if (ledgerStoreDir && !path.isAbsolute(ledgerStoreDir)) {
610
+ throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has a ` +
611
+ "nonabsolute Store owner");
612
+ }
613
+ if (statePath) {
614
+ if (!ledgerStoreDir || !path.isAbsolute(statePath) ||
615
+ !path.isAbsolute(ledgerStoreDir)) {
616
+ throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has ` +
617
+ "incomplete Store authority");
618
+ }
619
+ const canonicalStatePath = path.resolve(statePath);
620
+ const canonicalStoreDir = path.resolve(ledgerStoreDir);
621
+ const canonical = pathsForConversationDir(path.dirname(canonicalStatePath));
622
+ if (path.resolve(canonical.statePath) !== canonicalStatePath ||
623
+ path.resolve(canonical.storeDir) !== canonicalStoreDir) {
624
+ throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has a ` +
625
+ "noncanonical Store/state owner");
626
+ }
627
+ const conversationId = stringValue(ledger.conversation_id);
628
+ if (conversationId &&
629
+ path.resolve(pathsForConversation(conversationId, canonicalStoreDir).statePath) !== canonicalStatePath) {
630
+ throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has a ` +
631
+ "mismatched conversation owner");
632
+ }
633
+ }
634
+ return {
635
+ status: "resolved",
636
+ fingerprint: terminalActionFingerprint({
637
+ kind: "deferred_codex_foreground_terminal_dispatch",
638
+ status: "resolved",
639
+ ledger
640
+ })
641
+ };
642
+ }
643
+ export function deferredCodexPreviousDispatchSnapshotMatches(ports, { transfer, terminalControl, ledger }) {
644
+ let snapshot;
645
+ try {
646
+ snapshot = deferredCodexForegroundDispatchSnapshotForLedger(ports, terminalControl, ledger);
647
+ }
648
+ catch {
649
+ return false;
650
+ }
651
+ return snapshot.status === transfer.previous_dispatch_status &&
652
+ snapshot.fingerprint === transfer.previous_dispatch_fingerprint;
653
+ }
654
+ function tryDeferredCodexForegroundDispatchSnapshot(ports, terminalControl) {
655
+ try {
656
+ return deferredCodexForegroundDispatchSnapshot(ports, terminalControl);
657
+ }
658
+ catch {
659
+ return undefined;
660
+ }
661
+ }
662
+ function sourceTurnHistoryForAuthorityObservation(ports, { mode, storeDir, sourceSession, sourceKind, candidateInventory }) {
663
+ const candidateHistoryNeeded = sourceKind ===
664
+ "candidate_rollout_quiescent" &&
665
+ (mode !== "list" || candidateInventory !== undefined);
666
+ if (!candidateHistoryNeeded) {
667
+ return undefined;
668
+ }
669
+ return mode === "boundary_transitioning"
670
+ ? frozenCandidateSourceTurnHistory(ports, storeDir, sourceSession)
671
+ : deferredCandidateSourceTurnHistory(ports, storeDir, sourceSession);
672
+ }
673
+ function candidateRootIsExplicitlyAbandoned(sourceKind, abandonment, candidateInventory, binding) {
674
+ if (sourceKind !== "candidate_rollout_quiescent") {
675
+ return false;
676
+ }
677
+ if (abandonment !== "missing_rollout" &&
678
+ (abandonment !== "missing_inventory_rollout" || !candidateInventory)) {
679
+ return false;
680
+ }
681
+ return candidateSourceRootAuthorityMatches(candidateInventory?.roots ?? [], binding.native_thread_id, binding.native_process.rollout, "explicitly_abandoned_predecessor");
682
+ }
683
+ function sourceAbandonmentFingerprintForObservation(ports, { mode, storeDir, context, sourceSession, sourceRolloutAuthority, sourceTurnHistory, dispatchSnapshot, sourceRevision, sourceBindingToken }) {
684
+ if (sourceRolloutAuthority !== "explicitly_abandoned_predecessor" ||
685
+ !sourceTurnHistory || !dispatchSnapshot) {
686
+ return undefined;
687
+ }
688
+ return explicitlyAbandonedCandidateSourceFingerprint(ports, {
689
+ storeDir,
690
+ session: sourceSession,
691
+ sourceTurnHistory,
692
+ dispatchSnapshot,
693
+ sourceRevision,
694
+ sourceBindingToken,
695
+ ...(mode === "boundary_transitioning"
696
+ ? {
697
+ ledgerOverride: ports.ledger.load(context.terminalControl),
698
+ requireResolvedTopLevel: false
699
+ }
700
+ : {})
701
+ });
702
+ }
703
+ function exactDeferredCodexSourceForObservation(ports, { mode, storeDir, context, sourceSession, candidateInventory, sourceKind, sourceTurnHistory, sourceRolloutAuthority, sourceAbandonmentFingerprint, requireUnclaimedCandidate }) {
704
+ if (sourceKind === "status_card_only") {
705
+ return Boolean(exactBoundCodexSendSource({
706
+ kind: "status_card",
707
+ sourceSession,
708
+ context
709
+ }) &&
710
+ ports.turn.turnsForSession(storeDir, sourceSession.session_id).length === 0 &&
711
+ !sourceSession.last_transition_id &&
712
+ !ports.transition.hasAny(storeDir, sourceSession));
713
+ }
714
+ if (!candidateInventory || !sourceTurnHistory) {
715
+ return false;
716
+ }
717
+ const exactCandidate = () => exactBoundCodexSendSource({
718
+ kind: "candidate",
719
+ sourceSession,
720
+ context,
721
+ inventory: candidateInventory,
722
+ sourceRolloutAuthority
723
+ });
724
+ const sourceAuthority = sourceRolloutAuthority === "present" ||
725
+ Boolean(sourceAbandonmentFingerprint);
726
+ if (mode === "prepare") {
727
+ return candidateSourceTransitionHistoryIsTerminal(ports, storeDir, sourceSession) && exactCandidate() && sourceAuthority;
728
+ }
729
+ return exactCandidate() && sourceAuthority &&
730
+ (!requireUnclaimedCandidate ||
731
+ codexCandidateInventoryHasNoOtherManagedClaim(ports, {
732
+ storeDir,
733
+ inventory: candidateInventory,
734
+ sourceSessionId: sourceSession.session_id,
735
+ includeDetached: sourceRolloutAuthority === "explicitly_abandoned_predecessor"
736
+ })) &&
737
+ candidateSourceTransitionHistoryIsTerminal(ports, storeDir, sourceSession);
738
+ }
739
+ export function observeDeferredCodexAuthority(ports, { mode, storeDir, context, sourceSession, candidateInventory, abandonment, fixedSourceRolloutAuthority, fixedDispatchSnapshot, sourceRevision, sourceBindingToken, requireUnclaimedCandidate = false }) {
740
+ let dispatchSnapshot = fixedDispatchSnapshot;
741
+ if (mode === "list") {
742
+ dispatchSnapshot = tryDeferredCodexForegroundDispatchSnapshot(ports, context.terminalControl);
743
+ }
744
+ const binding = sourceSession?.binding;
745
+ if (!sourceSession || !binding)
746
+ return undefined;
747
+ const sourceKind = binding.native_process.rollout
748
+ ? "candidate_rollout_quiescent"
749
+ : "status_card_only";
750
+ const sourceTurnHistory = sourceTurnHistoryForAuthorityObservation(ports, {
751
+ mode,
752
+ storeDir,
753
+ sourceSession,
754
+ sourceKind,
755
+ candidateInventory
756
+ });
757
+ if (mode === "prepare") {
758
+ dispatchSnapshot = deferredCodexForegroundDispatchSnapshot(ports, context.terminalControl);
759
+ }
760
+ const explicitlyAbandoned = candidateRootIsExplicitlyAbandoned(sourceKind, abandonment, candidateInventory, binding);
761
+ const sourceRolloutAuthority = fixedSourceRolloutAuthority ??
762
+ (explicitlyAbandoned ? "explicitly_abandoned_predecessor" : "present");
763
+ const sourceAbandonmentFingerprint = sourceAbandonmentFingerprintForObservation(ports, {
764
+ mode,
765
+ storeDir,
766
+ context,
767
+ sourceSession,
768
+ sourceRolloutAuthority,
769
+ sourceTurnHistory,
770
+ dispatchSnapshot,
771
+ sourceRevision,
772
+ sourceBindingToken
773
+ });
774
+ const exactSource = exactDeferredCodexSourceForObservation(ports, {
775
+ mode,
776
+ storeDir,
777
+ context,
778
+ sourceSession,
779
+ candidateInventory,
780
+ sourceKind,
781
+ sourceTurnHistory,
782
+ sourceRolloutAuthority,
783
+ sourceAbandonmentFingerprint,
784
+ requireUnclaimedCandidate
785
+ });
786
+ return {
787
+ sourceKind,
788
+ sourceRolloutAuthority,
789
+ sourceTurnHistory,
790
+ dispatchSnapshot,
791
+ sourceAbandonmentFingerprint,
792
+ exactSource
793
+ };
794
+ }
795
+ //# sourceMappingURL=deferred-foreground-authority-cli-adapter.js.map