cloving 1.1.0 → 1.3.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 (568) hide show
  1. package/README.md +584 -144
  2. package/assets/watch-fonts/fira-code-OFL.md +93 -0
  3. package/assets/watch-fonts/fira-code-latin-400-normal.woff2 +0 -0
  4. package/assets/watch-fonts/fira-code-latin-500-normal.woff2 +0 -0
  5. package/assets/watch-fonts/heebo-OFL.md +93 -0
  6. package/assets/watch-fonts/heebo-latin-500-normal.woff2 +0 -0
  7. package/assets/watch-fonts/heebo-latin-700-normal.woff2 +0 -0
  8. package/assets/watch-fonts/heebo-latin-800-normal.woff2 +0 -0
  9. package/assets/watch-fonts/manifest.json +112 -0
  10. package/assets/watch-fonts/space-grotesk-OFL.md +93 -0
  11. package/assets/watch-fonts/space-grotesk-latin-400-normal.woff2 +0 -0
  12. package/assets/watch-fonts/space-grotesk-latin-500-normal.woff2 +0 -0
  13. package/assets/watch-fonts/space-grotesk-latin-600-normal.woff2 +0 -0
  14. package/assets/watch-fonts/space-grotesk-latin-700-normal.woff2 +0 -0
  15. package/dist/src/agent-harness-shell.d.ts +12 -0
  16. package/dist/src/agent-harness-shell.js +90 -0
  17. package/dist/src/agent-harness-versions.d.ts +8 -0
  18. package/dist/src/agent-harness-versions.js +49 -0
  19. package/dist/src/agent-harnesses.d.ts +4 -0
  20. package/dist/src/agent-harnesses.js +13 -0
  21. package/dist/src/authority/commands.d.ts +2 -0
  22. package/dist/src/authority/commands.js +49 -8
  23. package/dist/src/authority/dispatch-decision.d.ts +1 -0
  24. package/dist/src/authority/dispatch-decision.js +7 -4
  25. package/dist/src/authority/events.js +2 -2
  26. package/dist/src/authority/gate-reduction.d.ts +1 -0
  27. package/dist/src/authority/gate-reduction.js +18 -3
  28. package/dist/src/authority/gates.d.ts +2 -1
  29. package/dist/src/authority/gates.js +5 -1
  30. package/dist/src/authority/handoff-chain.d.ts +24 -0
  31. package/dist/src/authority/handoff-chain.js +46 -0
  32. package/dist/src/authority/operations.js +1 -1
  33. package/dist/src/authority/reconciliation.d.ts +1 -0
  34. package/dist/src/authority/reconciliation.js +18 -11
  35. package/dist/src/authority/reduction.d.ts +1 -1
  36. package/dist/src/authority/reduction.js +6 -1
  37. package/dist/src/authority/status-input.d.ts +1 -1
  38. package/dist/src/authority/status.d.ts +1 -0
  39. package/dist/src/authority/status.js +27 -3
  40. package/dist/src/authority/transitions.d.ts +5 -5
  41. package/dist/src/authority/transitions.js +9 -0
  42. package/dist/src/broker/actor/authority-delivery.js +1 -0
  43. package/dist/src/broker/actor/authority-queries.d.ts +11 -1
  44. package/dist/src/broker/actor/authority-queries.js +67 -3
  45. package/dist/src/broker/actor/authority-receipts.js +11 -1
  46. package/dist/src/broker/actor/authority-session.js +2 -2
  47. package/dist/src/broker/actor/authority-settings.js +4 -0
  48. package/dist/src/broker/actor/delivery-intents.d.ts +3 -1
  49. package/dist/src/broker/actor/delivery-intents.js +4 -4
  50. package/dist/src/broker/actor/effect-delivery.js +13 -1
  51. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  52. package/dist/src/broker/actor/effect-queries.js +7 -0
  53. package/dist/src/broker/actor/pin-check.js +1 -1
  54. package/dist/src/broker/actor/stop-plan.js +1 -1
  55. package/dist/src/broker/actor/turn-state.js +1 -1
  56. package/dist/src/broker/authority-admission.js +26 -5
  57. package/dist/src/broker/authority-restore.js +1 -0
  58. package/dist/src/broker/decision-restore.js +4 -4
  59. package/dist/src/broker/socket-address.d.ts +3 -1
  60. package/dist/src/broker/socket-address.js +2 -2
  61. package/dist/src/cli/arguments.d.ts +11 -13
  62. package/dist/src/cli/arguments.js +37 -107
  63. package/dist/src/cli/command-effects.d.ts +7 -0
  64. package/dist/src/cli/command-effects.js +39 -0
  65. package/dist/src/cli/commands.js +11 -4
  66. package/dist/src/cli/config-arguments.d.ts +11 -0
  67. package/dist/src/cli/config-arguments.js +59 -0
  68. package/dist/src/cli/config-command.d.ts +2 -0
  69. package/dist/src/cli/config-command.js +105 -0
  70. package/dist/src/cli/config-file.d.ts +3 -0
  71. package/dist/src/cli/config-file.js +50 -0
  72. package/dist/src/cli/config-lock.d.ts +7 -0
  73. package/dist/src/cli/config-lock.js +61 -0
  74. package/dist/src/cli/config-notice.d.ts +5 -0
  75. package/dist/src/cli/config-notice.js +46 -0
  76. package/dist/src/cli/doctor-github.d.ts +9 -0
  77. package/dist/src/cli/doctor-github.js +138 -0
  78. package/dist/src/cli/doctor-harness.d.ts +13 -0
  79. package/dist/src/cli/doctor-harness.js +242 -0
  80. package/dist/src/cli/doctor-local.d.ts +18 -0
  81. package/dist/src/cli/doctor-local.js +77 -0
  82. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  83. package/dist/src/cli/doctor-runtime.js +176 -0
  84. package/dist/src/cli/doctor-service.d.ts +1 -0
  85. package/dist/src/cli/doctor-service.js +11 -0
  86. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  87. package/dist/src/cli/doctor-workflows.js +45 -0
  88. package/dist/src/cli/doctor.d.ts +15 -0
  89. package/dist/src/cli/doctor.js +190 -0
  90. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  91. package/dist/src/cli/github-ci-progress.js +83 -0
  92. package/dist/src/cli/github-retry.d.ts +6 -0
  93. package/dist/src/cli/github-retry.js +47 -0
  94. package/dist/src/cli/harness-probes.d.ts +22 -0
  95. package/dist/src/cli/harness-probes.js +183 -0
  96. package/dist/src/cli/main.d.ts +7 -1
  97. package/dist/src/cli/main.js +39 -61
  98. package/dist/src/cli/phone-arguments.d.ts +14 -0
  99. package/dist/src/cli/phone-arguments.js +37 -0
  100. package/dist/src/cli/phone-client.d.ts +2 -0
  101. package/dist/src/cli/phone-client.js +32 -0
  102. package/dist/src/cli/phone-command.d.ts +13 -0
  103. package/dist/src/cli/phone-command.js +101 -0
  104. package/dist/src/cli/probe-command.d.ts +36 -0
  105. package/dist/src/cli/probe-command.js +59 -0
  106. package/dist/src/cli/project-settings.d.ts +4 -0
  107. package/dist/src/cli/project-settings.js +33 -0
  108. package/dist/src/cli/render.d.ts +3 -1
  109. package/dist/src/cli/render.js +102 -39
  110. package/dist/src/cli/report-github.d.ts +18 -0
  111. package/dist/src/cli/report-github.js +200 -0
  112. package/dist/src/cli/report.d.ts +17 -0
  113. package/dist/src/cli/report.js +192 -0
  114. package/dist/src/cli/repository-arguments.d.ts +5 -0
  115. package/dist/src/cli/repository-arguments.js +34 -0
  116. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  117. package/dist/src/cli/runtime-arguments.js +15 -0
  118. package/dist/src/cli/runtime-directory.d.ts +6 -2
  119. package/dist/src/cli/runtime-directory.js +72 -14
  120. package/dist/src/cli/toolchain.d.ts +2 -0
  121. package/dist/src/cli/toolchain.js +22 -2
  122. package/dist/src/cli/usage-render.d.ts +5 -0
  123. package/dist/src/cli/usage-render.js +40 -1
  124. package/dist/src/cli/usage.d.ts +3 -3
  125. package/dist/src/cli/usage.js +74 -45
  126. package/dist/src/cli/watch-actions.d.ts +2 -0
  127. package/dist/src/cli/watch-actions.js +4 -4
  128. package/dist/src/cli/watch-board-view.d.ts +12 -1
  129. package/dist/src/cli/watch-board-view.js +64 -12
  130. package/dist/src/cli/watch-board.d.ts +7 -1
  131. package/dist/src/cli/watch-board.js +61 -16
  132. package/dist/src/cli/watch-card-forms.js +2 -2
  133. package/dist/src/cli/watch-client.d.ts +1 -1
  134. package/dist/src/cli/watch-client.js +12 -3
  135. package/dist/src/cli/watch-header-view.d.ts +27 -0
  136. package/dist/src/cli/watch-header-view.js +116 -0
  137. package/dist/src/cli/watch-model.d.ts +10 -4
  138. package/dist/src/cli/watch-model.js +49 -59
  139. package/dist/src/cli/watch-page.js +67 -14
  140. package/dist/src/cli/watch-phases.js +3 -3
  141. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  142. package/dist/src/cli/watch-phone-client.js +84 -0
  143. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  144. package/dist/src/cli/watch-phone-view.js +113 -0
  145. package/dist/src/cli/watch-phone.d.ts +5 -0
  146. package/dist/src/cli/watch-phone.js +53 -0
  147. package/dist/src/cli/watch-pr-command.d.ts +5 -2
  148. package/dist/src/cli/watch-pr-command.js +41 -4
  149. package/dist/src/cli/watch-pr-identity.d.ts +14 -2
  150. package/dist/src/cli/watch-pr-identity.js +25 -0
  151. package/dist/src/cli/watch-pr-observer.d.ts +1 -0
  152. package/dist/src/cli/watch-pr-observer.js +48 -6
  153. package/dist/src/cli/watch-pull-request.d.ts +12 -0
  154. package/dist/src/cli/watch-pull-request.js +134 -0
  155. package/dist/src/cli/watch-reads.d.ts +7 -1
  156. package/dist/src/cli/watch-reads.js +42 -20
  157. package/dist/src/cli/watch-render.d.ts +23 -2
  158. package/dist/src/cli/watch-render.js +2 -1
  159. package/dist/src/cli/watch-server.js +56 -7
  160. package/dist/src/cli/watch-turn.d.ts +4 -1
  161. package/dist/src/cli/watch-turn.js +38 -2
  162. package/dist/src/cli/watch-usage.js +5 -1
  163. package/dist/src/cli/watch-view.d.ts +10 -17
  164. package/dist/src/cli/watch-view.js +33 -77
  165. package/dist/src/cli.js +106 -23
  166. package/dist/src/command-settings.d.ts +16 -0
  167. package/dist/src/command-settings.js +42 -0
  168. package/dist/src/configuration-change.d.ts +11 -0
  169. package/dist/src/configuration-change.js +62 -0
  170. package/dist/src/configuration-display.d.ts +21 -0
  171. package/dist/src/configuration-display.js +69 -0
  172. package/dist/src/configuration-schema.d.ts +49 -0
  173. package/dist/src/configuration-schema.js +159 -0
  174. package/dist/src/daemon/claude-turn.d.ts +20 -5
  175. package/dist/src/daemon/claude-turn.js +116 -53
  176. package/dist/src/daemon/claude-worker.d.ts +3 -5
  177. package/dist/src/daemon/claude-worker.js +64 -80
  178. package/dist/src/daemon/command-journal.d.ts +5 -0
  179. package/dist/src/daemon/command-journal.js +50 -0
  180. package/dist/src/daemon/command-process.d.ts +28 -0
  181. package/dist/src/daemon/command-process.js +164 -0
  182. package/dist/src/daemon/command-worker.d.ts +19 -0
  183. package/dist/src/daemon/command-worker.js +182 -0
  184. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  185. package/dist/src/daemon/cursor-stream.js +154 -0
  186. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  187. package/dist/src/daemon/daemon-adapters.js +102 -0
  188. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  189. package/dist/src/daemon/daemon-loops.js +39 -0
  190. package/dist/src/daemon/daemon.d.ts +3 -30
  191. package/dist/src/daemon/daemon.js +132 -110
  192. package/dist/src/daemon/declared-input.d.ts +3 -0
  193. package/dist/src/daemon/declared-input.js +9 -0
  194. package/dist/src/daemon/delivery-router.js +7 -1
  195. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  196. package/dist/src/daemon/gemini-stream.js +129 -0
  197. package/dist/src/daemon/github-calls.d.ts +4 -0
  198. package/dist/src/daemon/github-calls.js +16 -7
  199. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  200. package/dist/src/daemon/github-ci-rerun.js +92 -0
  201. package/dist/src/daemon/github-ci.d.ts +6 -0
  202. package/dist/src/daemon/github-ci.js +251 -0
  203. package/dist/src/daemon/github-merge-call.d.ts +16 -0
  204. package/dist/src/daemon/github-merge-call.js +73 -0
  205. package/dist/src/daemon/github-merge.d.ts +3 -5
  206. package/dist/src/daemon/github-merge.js +59 -98
  207. package/dist/src/daemon/github-methods.d.ts +28 -0
  208. package/dist/src/daemon/github-methods.js +90 -16
  209. package/dist/src/daemon/github-operation.d.ts +3 -0
  210. package/dist/src/daemon/github-retry.d.ts +6 -0
  211. package/dist/src/daemon/github-retry.js +13 -0
  212. package/dist/src/daemon/github-ticket-status.js +27 -1
  213. package/dist/src/daemon/github-worker.js +2 -1
  214. package/dist/src/daemon/handoff-worker.d.ts +10 -0
  215. package/dist/src/daemon/handoff-worker.js +232 -0
  216. package/dist/src/daemon/issue-queue.d.ts +2 -0
  217. package/dist/src/daemon/issue-queue.js +92 -63
  218. package/dist/src/daemon/notify-journal.d.ts +18 -0
  219. package/dist/src/daemon/notify-journal.js +108 -0
  220. package/dist/src/daemon/notify-message.js +2 -1
  221. package/dist/src/daemon/notify.js +177 -37
  222. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  223. package/dist/src/daemon/opencode-stream.js +87 -0
  224. package/dist/src/daemon/queue-status.d.ts +4 -0
  225. package/dist/src/daemon/queue-status.js +38 -0
  226. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  227. package/dist/src/daemon/retry-worktree.js +139 -0
  228. package/dist/src/daemon/retrying-turn.d.ts +5 -0
  229. package/dist/src/daemon/retrying-turn.js +145 -21
  230. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  231. package/dist/src/daemon/schedule-journal.js +57 -0
  232. package/dist/src/daemon/text-output.d.ts +18 -0
  233. package/dist/src/daemon/text-output.js +44 -0
  234. package/dist/src/daemon/ticket-dependency-waits.d.ts +18 -0
  235. package/dist/src/daemon/ticket-dependency-waits.js +60 -0
  236. package/dist/src/daemon/ticket-registration.d.ts +10 -8
  237. package/dist/src/daemon/ticket-registration.js +146 -47
  238. package/dist/src/daemon/ticket-source.d.ts +4 -1
  239. package/dist/src/daemon/ticket-source.js +8 -2
  240. package/dist/src/daemon/turn-command.d.ts +10 -0
  241. package/dist/src/daemon/turn-command.js +33 -0
  242. package/dist/src/daemon/turn-report.d.ts +18 -0
  243. package/dist/src/daemon/turn-report.js +79 -0
  244. package/dist/src/daemon/work-tree.d.ts +2 -1
  245. package/dist/src/daemon/work-tree.js +15 -12
  246. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  247. package/dist/src/daemon/workflow-generations.js +57 -0
  248. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  249. package/dist/src/daemon/workflow-replay.js +58 -0
  250. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  251. package/dist/src/daemon/workflow-schedules.js +185 -0
  252. package/dist/src/decision-visibility.d.ts +2 -0
  253. package/dist/src/decision-visibility.js +10 -0
  254. package/dist/src/decision-wait.d.ts +1 -0
  255. package/dist/src/decision-wait.js +3 -0
  256. package/dist/src/delivery-backoff.d.ts +1 -0
  257. package/dist/src/delivery-backoff.js +3 -0
  258. package/dist/src/doctor-report.d.ts +24 -0
  259. package/dist/src/doctor-report.js +70 -0
  260. package/dist/src/execution-pin.d.ts +9 -0
  261. package/dist/src/execution-pin.js +86 -2
  262. package/dist/src/grok-result.d.ts +12 -0
  263. package/dist/src/grok-result.js +61 -0
  264. package/dist/src/harness-defaults.d.ts +35 -0
  265. package/dist/src/harness-defaults.js +121 -0
  266. package/dist/src/host/decision-resume.d.ts +35 -0
  267. package/dist/src/host/decision-resume.js +86 -0
  268. package/dist/src/host/gate-bridge.d.ts +48 -0
  269. package/dist/src/host/gate-bridge.js +124 -0
  270. package/dist/src/host/run-wait.d.ts +26 -0
  271. package/dist/src/host/run-wait.js +37 -0
  272. package/dist/src/host/start-delivery.d.ts +3 -2
  273. package/dist/src/host/start-delivery.js +11 -4
  274. package/dist/src/host/step-bridge-host.d.ts +6 -19
  275. package/dist/src/host/step-bridge-host.js +57 -55
  276. package/dist/src/host/world-reconciliation.d.ts +1 -0
  277. package/dist/src/host/world-reconciliation.js +3 -0
  278. package/dist/src/host/world-runs.js +5 -0
  279. package/dist/src/issue-identity.d.ts +6 -0
  280. package/dist/src/issue-identity.js +23 -0
  281. package/dist/src/merge-request.d.ts +19 -0
  282. package/dist/src/merge-request.js +32 -0
  283. package/dist/src/phone/canonical-json.d.ts +1 -0
  284. package/dist/src/phone/canonical-json.js +16 -0
  285. package/dist/src/phone/phone-link.d.ts +7 -0
  286. package/dist/src/phone/phone-link.js +21 -0
  287. package/dist/src/phone/qr-data.d.ts +8 -0
  288. package/dist/src/phone/qr-data.js +133 -0
  289. package/dist/src/phone/qr-matrix.d.ts +6 -0
  290. package/dist/src/phone/qr-matrix.js +175 -0
  291. package/dist/src/phone/qr-penalty.d.ts +3 -0
  292. package/dist/src/phone/qr-penalty.js +67 -0
  293. package/dist/src/phone/qr-picture.d.ts +5 -0
  294. package/dist/src/phone/qr-picture.js +24 -0
  295. package/dist/src/private-config.schema.json +263 -0
  296. package/dist/src/project-config.schema.json +65 -0
  297. package/dist/src/project-settings.d.ts +19 -0
  298. package/dist/src/project-settings.js +131 -0
  299. package/dist/src/relay/answer-check.d.ts +24 -0
  300. package/dist/src/relay/answer-check.js +145 -0
  301. package/dist/src/relay/answer-inbox.d.ts +15 -0
  302. package/dist/src/relay/answer-inbox.js +173 -0
  303. package/dist/src/relay/daemon-keys.d.ts +16 -0
  304. package/dist/src/relay/daemon-keys.js +75 -0
  305. package/dist/src/relay/decision-check.d.ts +3 -0
  306. package/dist/src/relay/decision-check.js +77 -0
  307. package/dist/src/relay/decision-close.d.ts +6 -0
  308. package/dist/src/relay/decision-close.js +72 -0
  309. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  310. package/dist/src/relay/decision-envelopes.js +93 -0
  311. package/dist/src/relay/decision-watch.d.ts +14 -0
  312. package/dist/src/relay/decision-watch.js +68 -0
  313. package/dist/src/relay/envelope-post.d.ts +8 -0
  314. package/dist/src/relay/envelope-post.js +71 -0
  315. package/dist/src/relay/envelope.d.ts +28 -0
  316. package/dist/src/relay/envelope.js +53 -0
  317. package/dist/src/relay/hpke.d.ts +25 -0
  318. package/dist/src/relay/hpke.js +108 -0
  319. package/dist/src/relay/pairing-checks.d.ts +42 -0
  320. package/dist/src/relay/pairing-checks.js +172 -0
  321. package/dist/src/relay/pairing-follow.d.ts +8 -0
  322. package/dist/src/relay/pairing-follow.js +95 -0
  323. package/dist/src/relay/pairing-session.d.ts +29 -0
  324. package/dist/src/relay/pairing-session.js +87 -0
  325. package/dist/src/relay/phone-delivery.d.ts +51 -0
  326. package/dist/src/relay/phone-delivery.js +139 -0
  327. package/dist/src/relay/phone-devices.d.ts +36 -0
  328. package/dist/src/relay/phone-devices.js +46 -0
  329. package/dist/src/relay/phone-inbox.d.ts +18 -0
  330. package/dist/src/relay/phone-inbox.js +17 -0
  331. package/dist/src/relay/phone-operations.d.ts +18 -0
  332. package/dist/src/relay/phone-operations.js +121 -0
  333. package/dist/src/relay/phone-outbox.d.ts +21 -0
  334. package/dist/src/relay/phone-outbox.js +25 -0
  335. package/dist/src/relay/phone-socket.d.ts +6 -0
  336. package/dist/src/relay/phone-socket.js +63 -0
  337. package/dist/src/relay/relay-control.d.ts +7 -0
  338. package/dist/src/relay/relay-control.js +24 -0
  339. package/dist/src/relay/relay-files.d.ts +2 -0
  340. package/dist/src/relay/relay-files.js +23 -0
  341. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  342. package/dist/src/relay/relay-heartbeat.js +81 -0
  343. package/dist/src/relay/relay-http.d.ts +14 -0
  344. package/dist/src/relay/relay-http.js +63 -0
  345. package/dist/src/relay/relay-registration.d.ts +15 -0
  346. package/dist/src/relay/relay-registration.js +63 -0
  347. package/dist/src/relay/relay-service.d.ts +25 -0
  348. package/dist/src/relay/relay-service.js +216 -0
  349. package/dist/src/relay/relay-store.d.ts +48 -0
  350. package/dist/src/relay/relay-store.js +131 -0
  351. package/dist/src/relay/sealed-post.d.ts +25 -0
  352. package/dist/src/relay/sealed-post.js +52 -0
  353. package/dist/src/relay.d.ts +1 -0
  354. package/dist/src/relay.js +8 -0
  355. package/dist/src/report-statistics.d.ts +50 -0
  356. package/dist/src/report-statistics.js +70 -0
  357. package/dist/src/report.d.ts +171 -0
  358. package/dist/src/report.js +119 -0
  359. package/dist/src/repository-identity.d.ts +4 -0
  360. package/dist/src/repository-identity.js +4 -0
  361. package/dist/src/review-subject.d.ts +41 -0
  362. package/dist/src/review-subject.js +91 -0
  363. package/dist/src/run-wait.d.ts +23 -0
  364. package/dist/src/run-wait.js +20 -0
  365. package/dist/src/service/active-tickets.d.ts +4 -0
  366. package/dist/src/service/active-tickets.js +49 -0
  367. package/dist/src/service/command-effects.d.ts +4 -0
  368. package/dist/src/service/command-effects.js +16 -0
  369. package/dist/src/service/decision-handler.d.ts +4 -0
  370. package/dist/src/service/decision-handler.js +39 -4
  371. package/dist/src/service/gateway.js +18 -3
  372. package/dist/src/service/queue-runs.d.ts +3 -0
  373. package/dist/src/service/queue-runs.js +39 -0
  374. package/dist/src/service/registry.d.ts +22 -3
  375. package/dist/src/service/registry.js +51 -8
  376. package/dist/src/service/replies.d.ts +10 -0
  377. package/dist/src/service/replies.js +12 -0
  378. package/dist/src/service/run-handlers.js +45 -54
  379. package/dist/src/service/run-metadata.d.ts +8 -0
  380. package/dist/src/service/run-metadata.js +53 -0
  381. package/dist/src/service/run-waits.d.ts +3 -0
  382. package/dist/src/service/run-waits.js +41 -0
  383. package/dist/src/service/service.d.ts +21 -2
  384. package/dist/src/service/service.js +23 -5
  385. package/dist/src/service/submission-handler.js +70 -19
  386. package/dist/src/service/worker-port.d.ts +1 -0
  387. package/dist/src/service/worker-totals.js +10 -1
  388. package/dist/src/step-bridge.d.ts +32 -0
  389. package/dist/src/steps/decision-gate.d.ts +2 -1
  390. package/dist/src/steps/decision-gate.js +7 -0
  391. package/dist/src/steps/handoff.d.ts +2 -0
  392. package/dist/src/steps/handoff.js +13 -0
  393. package/dist/src/steps/merge-by-person.d.ts +2 -0
  394. package/dist/src/steps/merge-by-person.js +18 -0
  395. package/dist/src/steps/merge-when-green.d.ts +2 -0
  396. package/dist/src/steps/merge-when-green.js +62 -0
  397. package/dist/src/steps/review-by-agent.d.ts +5 -0
  398. package/dist/src/steps/review-by-agent.js +124 -0
  399. package/dist/src/steps/review-by-person.d.ts +4 -0
  400. package/dist/src/steps/review-by-person.js +16 -0
  401. package/dist/src/steps/review-subject.d.ts +2 -0
  402. package/dist/src/steps/review-subject.js +11 -0
  403. package/dist/src/steps/run-command.d.ts +2 -0
  404. package/dist/src/steps/run-command.js +15 -0
  405. package/dist/src/steps/sleep.d.ts +3 -0
  406. package/dist/src/steps/sleep.js +19 -0
  407. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  408. package/dist/src/steps/wait-for-decision.js +71 -0
  409. package/dist/src/steps/wait-for-run.d.ts +5 -0
  410. package/dist/src/steps/wait-for-run.js +9 -0
  411. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  412. package/dist/src/storage/decision-snapshots.js +7 -1
  413. package/dist/src/submission.d.ts +4 -0
  414. package/dist/src/submission.js +6 -2
  415. package/dist/src/testing.d.ts +29 -0
  416. package/dist/src/testing.js +264 -0
  417. package/dist/src/ticket-dependencies.d.ts +1 -0
  418. package/dist/src/ticket-dependencies.js +15 -0
  419. package/dist/src/ticket-status-stream.d.ts +9 -0
  420. package/dist/src/ticket-status-stream.js +94 -0
  421. package/dist/src/ticket-status.js +7 -4
  422. package/dist/src/token-prices.d.ts +14 -4
  423. package/dist/src/token-prices.js +56 -11
  424. package/dist/src/turn-profile.d.ts +1 -0
  425. package/dist/src/turn-profile.js +8 -1
  426. package/dist/src/worker-usage.d.ts +25 -0
  427. package/dist/src/worker-usage.js +58 -1
  428. package/dist/src/workflow-admission.d.ts +6 -0
  429. package/dist/src/workflow-candidate.d.ts +7 -2
  430. package/dist/src/workflow-candidate.js +48 -5
  431. package/dist/src/workflow-contracts.d.ts +2 -0
  432. package/dist/src/workflow-contracts.js +8 -3
  433. package/dist/src/workflow-declaration.d.ts +31 -2
  434. package/dist/src/workflow-declaration.js +140 -16
  435. package/dist/src/workflow-discovery.d.ts +19 -0
  436. package/dist/src/workflow-discovery.js +36 -0
  437. package/dist/src/workflow-refusals.d.ts +6 -0
  438. package/dist/src/workflow-refusals.js +42 -0
  439. package/dist/src/workflow-schedule.d.ts +22 -0
  440. package/dist/src/workflow-schedule.js +53 -0
  441. package/dist/src/workflows.d.ts +12 -1
  442. package/dist/src/workflows.js +9 -0
  443. package/dist/tools/admit-workflow.d.ts +14 -0
  444. package/dist/tools/admit-workflow.js +107 -0
  445. package/dist/tools/doctor-adoption.d.ts +1 -0
  446. package/dist/tools/doctor-adoption.js +11 -0
  447. package/dist/tools/project-configuration.d.ts +4 -0
  448. package/dist/tools/project-configuration.js +47 -0
  449. package/dist/tools/self-host-processes.d.ts +1 -0
  450. package/dist/tools/self-host-processes.js +33 -22
  451. package/dist/tools/self-host-project.d.ts +21 -0
  452. package/dist/tools/self-host-project.js +224 -0
  453. package/dist/tools/self-host-runtime.d.ts +16 -0
  454. package/dist/tools/self-host-runtime.js +60 -0
  455. package/dist/tools/self-host-workflows.d.ts +1 -0
  456. package/dist/tools/self-host-workflows.js +36 -1
  457. package/dist/tools/self-host.js +106 -135
  458. package/dist/tools/workflow-bundle-dependencies.d.ts +5 -0
  459. package/dist/tools/workflow-bundle-dependencies.js +93 -0
  460. package/dist/tools/workflow-bundles.d.ts +20 -0
  461. package/dist/tools/workflow-bundles.js +173 -0
  462. package/dist/tools/workflow-candidate-counts.d.ts +12 -0
  463. package/dist/tools/workflow-candidate-counts.js +266 -0
  464. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  465. package/dist/tools/workflow-candidate-fields.js +24 -0
  466. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  467. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  468. package/dist/tools/workflow-candidate-program.d.ts +13 -0
  469. package/dist/tools/workflow-candidate-program.js +106 -0
  470. package/dist/tools/workflow-candidate-source.d.ts +6 -0
  471. package/dist/tools/workflow-candidate-source.js +169 -0
  472. package/dist/tools/workflow-candidate-syntax.d.ts +21 -0
  473. package/dist/tools/workflow-candidate-syntax.js +263 -0
  474. package/dist/tools/workflow-command.d.ts +1 -0
  475. package/dist/tools/workflow-command.js +143 -0
  476. package/dist/tools/workflow-folder-capture.d.ts +18 -0
  477. package/dist/tools/workflow-folder-capture.js +261 -0
  478. package/dist/tools/workflow-folders.d.ts +49 -0
  479. package/dist/tools/workflow-folders.js +203 -0
  480. package/dist/tools/workflow-source-effects.d.ts +10 -0
  481. package/dist/tools/workflow-source-effects.js +213 -0
  482. package/dist/tools/workflow-test-hook.d.ts +7 -0
  483. package/dist/tools/workflow-test-hook.js +16 -0
  484. package/dist/tools/workflow-test-loader.d.ts +1 -0
  485. package/dist/tools/workflow-test-loader.js +10 -0
  486. package/dist/workflows/develop-prd.js +71 -3
  487. package/dist/workflows/develop-ticket.js +6 -1
  488. package/dist/workflows/ticket-prompts.js +17 -3
  489. package/package.json +66 -6
  490. package/templates/develop/README.md +78 -0
  491. package/templates/develop/develop/accept.ts +11 -0
  492. package/templates/develop/develop/flow-tests.ts +357 -0
  493. package/templates/develop/develop/local.ts +40 -0
  494. package/templates/develop/develop/option-tests.ts +174 -0
  495. package/templates/develop/develop/partial-choice.ts +29 -0
  496. package/templates/develop/develop/partial.ts +28 -0
  497. package/templates/develop/develop/pull.ts +152 -0
  498. package/templates/develop/develop/queue-partial.ts +39 -0
  499. package/templates/develop/develop/refusal-tests.ts +174 -0
  500. package/templates/develop/develop/report.ts +156 -0
  501. package/templates/develop/develop/round.ts +40 -0
  502. package/templates/develop/develop/scenarios.ts +87 -0
  503. package/templates/develop/develop/turn.ts +67 -0
  504. package/templates/develop/develop.declaration.json +24 -0
  505. package/templates/develop/develop.test.ts +287 -0
  506. package/templates/develop/develop.ts +30 -0
  507. package/templates/develop/template.json +153 -0
  508. package/dist/src/chats/analysis-batches.d.ts +0 -24
  509. package/dist/src/chats/analysis-batches.js +0 -83
  510. package/dist/src/chats/analysis-contract.d.ts +0 -80
  511. package/dist/src/chats/analysis-contract.js +0 -16
  512. package/dist/src/chats/analysis-data.d.ts +0 -3
  513. package/dist/src/chats/analysis-data.js +0 -85
  514. package/dist/src/chats/analysis-input.d.ts +0 -12
  515. package/dist/src/chats/analysis-input.js +0 -83
  516. package/dist/src/chats/analysis-links.d.ts +0 -2
  517. package/dist/src/chats/analysis-links.js +0 -25
  518. package/dist/src/chats/analysis-prompt.d.ts +0 -10
  519. package/dist/src/chats/analysis-prompt.js +0 -16
  520. package/dist/src/chats/analysis-proposal.d.ts +0 -2
  521. package/dist/src/chats/analysis-proposal.js +0 -32
  522. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  523. package/dist/src/chats/analysis-provenance.js +0 -99
  524. package/dist/src/chats/analysis-shape.d.ts +0 -3
  525. package/dist/src/chats/analysis-shape.js +0 -228
  526. package/dist/src/chats/analysis.d.ts +0 -3
  527. package/dist/src/chats/analysis.js +0 -42
  528. package/dist/src/chats/corpus-input.d.ts +0 -5
  529. package/dist/src/chats/corpus-input.js +0 -288
  530. package/dist/src/chats/destination.d.ts +0 -4
  531. package/dist/src/chats/destination.js +0 -96
  532. package/dist/src/chats/import.d.ts +0 -15
  533. package/dist/src/chats/import.js +0 -243
  534. package/dist/src/chats/input-file.d.ts +0 -3
  535. package/dist/src/chats/input-file.js +0 -32
  536. package/dist/src/chats/normalize.d.ts +0 -29
  537. package/dist/src/chats/normalize.js +0 -155
  538. package/dist/src/chats/previous-import.d.ts +0 -5
  539. package/dist/src/chats/previous-import.js +0 -34
  540. package/dist/src/chats/reader.d.ts +0 -21
  541. package/dist/src/chats/reader.js +0 -118
  542. package/dist/src/chats/redact-import.d.ts +0 -14
  543. package/dist/src/chats/redact-import.js +0 -141
  544. package/dist/src/chats/redaction.d.ts +0 -41
  545. package/dist/src/chats/redaction.js +0 -161
  546. package/dist/src/chats/revision-input.d.ts +0 -3
  547. package/dist/src/chats/revision-input.js +0 -180
  548. package/dist/src/chats/revision.d.ts +0 -48
  549. package/dist/src/chats/revision.js +0 -94
  550. package/dist/src/chats/selection.d.ts +0 -25
  551. package/dist/src/chats/selection.js +0 -109
  552. package/dist/src/chats/source.d.ts +0 -23
  553. package/dist/src/chats/source.js +0 -135
  554. package/dist/src/chats/structure.d.ts +0 -57
  555. package/dist/src/chats/structure.js +0 -216
  556. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  557. package/dist/src/daemon/analysis-launch.js +0 -81
  558. package/dist/src/daemon/analysis-token.d.ts +0 -6
  559. package/dist/src/daemon/analysis-token.js +0 -88
  560. package/dist/src/daemon/analysis-worker.d.ts +0 -22
  561. package/dist/src/daemon/analysis-worker.js +0 -219
  562. package/dist/src/daemon/chats-files.d.ts +0 -15
  563. package/dist/src/daemon/chats-files.js +0 -113
  564. package/dist/src/daemon/chats-worker.d.ts +0 -12
  565. package/dist/src/daemon/chats-worker.js +0 -200
  566. package/dist/workflows/analyze-chats.d.ts +0 -10
  567. package/dist/workflows/analyze-chats.declaration.json +0 -9
  568. package/dist/workflows/analyze-chats.js +0 -73
@@ -1,6 +1,8 @@
1
1
  import type { Database } from "solid-objects";
2
- import type { AuthorityCommand, AuthorityEvent } from "../../authority/transitions.ts";
2
+ import type { ExecutionManifest } from "../../workflow-admission.ts";
3
+ import type { AuthorityCommand, AuthorityEvent, RunState } from "../../authority/transitions.ts";
3
4
  import { type SqlConnection } from "../../storage/domain-rows.ts";
5
+ import { type RunLinks, type RunOrigins } from "../../authority/handoff-chain.ts";
4
6
  export interface CommandRecord {
5
7
  readonly commandId: string;
6
8
  readonly sequence: number;
@@ -28,14 +30,22 @@ export interface Sequences {
28
30
  export interface CompletionCursor {
29
31
  readonly runId: string;
30
32
  readonly atOrBefore: number;
33
+ readonly terminal?: boolean;
34
+ }
35
+ export interface RunRecord extends RunState {
36
+ readonly sequence: number;
31
37
  }
32
38
  export interface AuthorityQueries {
39
+ readonly run: (runId: string) => Promise<RunRecord | undefined>;
40
+ readonly manifest: (runId: string) => Promise<ExecutionManifest | undefined>;
33
41
  readonly document: (digest: string) => Promise<string | undefined>;
34
42
  readonly receipt: (commandId: string) => Promise<CommandRecord | undefined>;
35
43
  readonly eventsAfter: (cursor: EventCursor) => Promise<EventPage>;
36
44
  readonly latestCompletion: (cursor: CompletionCursor) => Promise<PublishedEvent | undefined>;
37
45
  readonly sequences: () => Promise<Sequences>;
38
46
  readonly workflowIds: () => Promise<Readonly<Record<string, string>>>;
47
+ readonly runOrigins: () => Promise<RunOrigins>;
48
+ readonly runLinks: () => Promise<Readonly<Record<string, RunLinks>>>;
39
49
  }
40
50
  export type Read = <Value>(query: (connection: SqlConnection) => Promise<Value>) => Promise<Value>;
41
51
  export declare function guardedRead(access: {
@@ -1,8 +1,27 @@
1
+ import { readExecutionManifest } from "../../execution-pin.js";
1
2
  import { parseCommand } from "../../authority/commands.js";
2
3
  import { documentBody } from "../../storage/decision-rows.js";
3
- import { integer, latestSequence, text, } from "../../storage/domain-rows.js";
4
- import { storedEvents } from "../authority-restore.js";
4
+ import { integer, optionalText, latestSequence, runRow, text, } from "../../storage/domain-rows.js";
5
+ import { storedEvents, storedRun } from "../authority-restore.js";
5
6
  import { documentDigest } from "../decision-restore.js";
7
+ import { runLinks, } from "../../authority/handoff-chain.js";
8
+ async function run(connection, runId) {
9
+ const row = await connection.get("SELECT run_id, status, revision, workflow, paused_from, gates, sequence FROM runs WHERE run_id = ?", [runId]);
10
+ if (row === undefined)
11
+ return undefined;
12
+ const record = runRow(row);
13
+ return { ...storedRun(record), sequence: record.sequence };
14
+ }
15
+ async function runOrigins(connection, cursor) {
16
+ const rows = await connection.all("SELECT run_id, json_extract(payload, '$.parentRunId') AS parent_run_id, coalesce(json_extract(payload, '$.chainId'), run_id) AS chain_id FROM events WHERE type = 'run.created' AND sequence > ? AND sequence <= ? ORDER BY sequence", [cursor.after, cursor.through]);
17
+ return Object.fromEntries(rows.map((row) => [
18
+ text(row, "run_id"),
19
+ {
20
+ parentRunId: optionalText(row, "parent_run_id"),
21
+ chainId: text(row, "chain_id"),
22
+ },
23
+ ]));
24
+ }
6
25
  async function receipt(connection, commandId) {
7
26
  const row = await connection.get("SELECT c.request, c.sequence, e.run_id, e.recorded_at FROM commands c JOIN events e ON e.sequence = c.sequence WHERE c.command_id = ?", [commandId]);
8
27
  if (row === undefined)
@@ -51,7 +70,10 @@ function publishedEvents(rows) {
51
70
  }));
52
71
  }
53
72
  async function latestCompletion(connection, cursor) {
54
- const row = await connection.get("SELECT sequence, type, run_id, command_id, recorded_at, payload FROM events WHERE run_id = ? AND type = 'run.completed' AND sequence <= ? ORDER BY sequence DESC LIMIT 1", [cursor.runId, cursor.atOrBefore]);
73
+ const types = cursor.terminal === true
74
+ ? "type IN ('run.completed', 'run.failed', 'run.cancelled')"
75
+ : "type = 'run.completed'";
76
+ const row = await connection.get(`SELECT sequence, type, run_id, command_id, recorded_at, payload FROM events WHERE run_id = ? AND ${types} AND sequence <= ? ORDER BY sequence DESC LIMIT 1`, [cursor.runId, cursor.atOrBefore]);
55
77
  return row === undefined ? undefined : publishedEvents([row])[0];
56
78
  }
57
79
  async function sequences(connection) {
@@ -66,6 +88,28 @@ async function workflowIds(connection) {
66
88
  const rows = await connection.all("SELECT d.run_id, json_extract(s.body, '$.workflowId') AS workflow_id FROM run_details d JOIN documents s ON s.digest = d.submission WHERE json_valid(s.body) AND json_type(s.body, '$.workflowId') = 'text'");
67
89
  return Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "workflow_id")]));
68
90
  }
91
+ function cachedOrigins(read) {
92
+ let sequence = 0;
93
+ let origins = {};
94
+ let pending = Promise.resolve();
95
+ return () => {
96
+ const result = pending.then(() => read(async (connection) => {
97
+ const through = await latestSequence(connection);
98
+ if (through === sequence)
99
+ return origins;
100
+ const added = await runOrigins(connection, {
101
+ after: sequence,
102
+ through,
103
+ });
104
+ if (Object.keys(added).length > 0)
105
+ origins = { ...origins, ...added };
106
+ sequence = through;
107
+ return origins;
108
+ }));
109
+ pending = result.then(() => undefined, () => undefined);
110
+ return result;
111
+ };
112
+ }
69
113
  export function guardedRead(access) {
70
114
  const { reader, ready } = access;
71
115
  return async (query) => {
@@ -74,12 +118,32 @@ export function guardedRead(access) {
74
118
  };
75
119
  }
76
120
  export function authorityQueries(read) {
121
+ const origins = cachedOrigins(read);
122
+ let linkedOrigins;
123
+ let links = {};
124
+ const currentLinks = async () => {
125
+ const current = await origins();
126
+ if (current !== linkedOrigins) {
127
+ links = runLinks(current);
128
+ linkedOrigins = current;
129
+ }
130
+ return links;
131
+ };
77
132
  return {
133
+ run: (runId) => read((connection) => run(connection, runId)),
134
+ manifest: (runId) => read(async (connection) => {
135
+ const row = await connection.get("SELECT d.manifest FROM runs r JOIN definitions d ON d.pin = r.workflow WHERE r.run_id = ?", [runId]);
136
+ return row === undefined
137
+ ? undefined
138
+ : readExecutionManifest(JSON.parse(text(row, "manifest")));
139
+ }),
78
140
  document: (digest) => read((connection) => documentBody(connection, digest)),
79
141
  receipt: (commandId) => read((connection) => receipt(connection, commandId)),
80
142
  eventsAfter: (cursor) => read((connection) => eventsAfter(connection, cursor)),
81
143
  latestCompletion: (cursor) => read((connection) => latestCompletion(connection, cursor)),
82
144
  sequences: () => read(sequences),
83
145
  workflowIds: () => read(workflowIds),
146
+ runOrigins: origins,
147
+ runLinks: currentLinks,
84
148
  };
85
149
  }
@@ -1,5 +1,6 @@
1
1
  import { integer, text } from "../../storage/domain-rows.js";
2
2
  import { intentKind } from "../authority-restore.js";
3
+ import { commandLimits } from "../../command-settings.js";
3
4
  export const unserializable = {
4
5
  kind: "rejected",
5
6
  reason: "invalid-command",
@@ -16,7 +17,16 @@ export const tooLarge = {
16
17
  detail: `A request has at most ${String(maximumRequestBytes)} bytes.`,
17
18
  };
18
19
  export function oversized(request) {
19
- return Buffer.byteLength(JSON.stringify(request)) > maximumRequestBytes;
20
+ const command = request["command"];
21
+ const report = typeof command === "object" &&
22
+ command !== null &&
23
+ !Array.isArray(command) &&
24
+ command["kind"] === "report-effect" &&
25
+ command["worker"] === "command";
26
+ const limit = report
27
+ ? maximumRequestBytes + commandLimits.stdoutBytes * 6
28
+ : maximumRequestBytes;
29
+ return Buffer.byteLength(JSON.stringify(request)) > limit;
20
30
  }
21
31
  export function failed(error) {
22
32
  const name = String(Reflect.get(Object(error), "name"));
@@ -1,5 +1,5 @@
1
1
  import { eligibleIntents, } from "../../authority/reducer.js";
2
- import { loadProjections, } from "../../storage/decision-snapshots.js";
2
+ import { loadOperationSnapshot, loadProjections, } from "../../storage/decision-snapshots.js";
3
3
  import { loadEvents } from "../../storage/domain-rows.js";
4
4
  import { pinnedResumption } from "../authority-admission.js";
5
5
  import { currentState, intentKind, storedDefinitions, storedEvents, } from "../authority-restore.js";
@@ -40,7 +40,7 @@ export function authoritySession(parts) {
40
40
  return storedEvents(await parts.reader.connection(loadEvents));
41
41
  },
42
42
  eligibleIntents: async () => eligible(await projected(session)),
43
- operations: async () => operationRecords(await projected(session)),
43
+ operations: async () => operationRecords(await read(loadOperationSnapshot)),
44
44
  resumePinned: async (runId, manifest) => {
45
45
  const snapshot = await projected(session);
46
46
  return pinnedResumption(currentState(snapshot), {
@@ -1,5 +1,6 @@
1
1
  import { recoveryBound } from "../../authority/commands.js";
2
2
  import { lineLogger } from "./authority-logger.js";
3
+ import { commandLimits } from "../../command-settings.js";
3
4
  export const authorityTiming = {
4
5
  leaseMilliseconds: 2_000,
5
6
  renewalMilliseconds: 500,
@@ -50,6 +51,9 @@ export function librarySettings(timing, log) {
50
51
  return {
51
52
  tableNamePrefix: "solid_",
52
53
  maxAttempts: 1,
54
+ maxActivationDurationMilliseconds: 50,
55
+ maxPayloadBytes: 900_000 + commandLimits.stdoutBytes * 6,
56
+ maxResultBytes: 900_000 + commandLimits.stdoutBytes * 6,
53
57
  logger: lineLogger(log ?? standardError),
54
58
  leaseDurationMilliseconds: timing.leaseMilliseconds,
55
59
  leaseRenewalIntervalMilliseconds: timing.renewalMilliseconds,
@@ -18,6 +18,7 @@ export interface DeliveryIntent extends EffectIntent, Partial<DeliveryDecision>,
18
18
  readonly workflow: string;
19
19
  readonly inputDigest: string;
20
20
  readonly purpose: Purpose;
21
+ readonly commandDeadline?: string;
21
22
  }
22
23
  export type ProtectedIntent = DeliveryIntent & EffectArguments;
23
24
  export type Undigested = Omit<DeliveryIntent, "inputDigest" | "purpose">;
@@ -51,9 +52,10 @@ export interface Delivery {
51
52
  readonly worker?: string;
52
53
  } | AdapterOutcome>;
53
54
  readonly reconcile: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
55
+ readonly retry?: Delivery["reconcile"];
54
56
  readonly stop?: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
55
57
  }
56
- export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined;
58
+ export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined | Promise<ExecutionManifest | undefined>;
57
59
  export declare function intentDigest(intent: Undigested): string;
58
60
  export declare function deliveryIntent(intent: Undigested): DeliveryIntent;
59
61
  export declare function protectedIntent(state: AuthorityState, attempt: {
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
- import { continues, isSettled } from "../../authority/gates.js";
2
+ import { delivers, isSettled } from "../../authority/gates.js";
3
3
  import { eligibleIntents, } from "../../authority/reducer.js";
4
- import { gateContinuation } from "../../authority/reduction.js";
4
+ import { gateDelivery } from "../../authority/reduction.js";
5
5
  export function intentDigest(intent) {
6
6
  const base = [intent.kind, intent.runId, intent.operationId, intent.workflow];
7
7
  const bound = intent.gateId === undefined
@@ -37,7 +37,7 @@ export function protectedIntent(state, attempt) {
37
37
  })));
38
38
  }
39
39
  export function gateDecision(gate) {
40
- if (gate === undefined || gate.kind === "untyped" || !continues(gate))
40
+ if (gate === undefined || gate.kind === "untyped" || !delivers(gate))
41
41
  return null;
42
42
  return {
43
43
  gateId: gate.gateId,
@@ -51,7 +51,7 @@ function workflowOf(state, runId) {
51
51
  function decisionOf(state, intent) {
52
52
  return gateDecision(Object.values(state.gates).find((gate) => gate.runId === intent.runId &&
53
53
  isSettled(gate) &&
54
- gateContinuation(gate).operationId === intent.operationId));
54
+ gateDelivery(gate).operationId === intent.operationId));
55
55
  }
56
56
  export function observingIntent(state, attempt) {
57
57
  const { intent, purpose } = attempt;
@@ -4,6 +4,7 @@ import { budgetRow } from "../../storage/effect-rows.js";
4
4
  import { effectInputDigest, storedBudget } from "../effect-restore.js";
5
5
  import { settlement } from "./adapter-outcomes.js";
6
6
  import { pinned } from "./pin-check.js";
7
+ import { commandLimits } from "../../command-settings.js";
7
8
  const absent = {
8
9
  attempt: undefined,
9
10
  released: false,
@@ -51,7 +52,9 @@ async function called(parts, call) {
51
52
  const adapterCall = parts.delivery[name]?.bind(parts.delivery);
52
53
  if (adapterCall === undefined)
53
54
  return { kind: "unknown", reason: "stop-not-supported" };
54
- return settlement(await parts.calls.call(intent.operationId, (signal) => adapterCall(intent, signal)), parts.effects.resultBytes);
55
+ return settlement(await parts.calls.call(intent.operationId, (signal) => adapterCall(intent, signal)), intent.capability === "command"
56
+ ? commandLimits.resultBytes
57
+ : parts.effects.resultBytes);
55
58
  }
56
59
  const confirmations = ["stopped", "completed", "failed"];
57
60
  async function stopRequested(parts, intent) {
@@ -69,9 +72,16 @@ function decided(parts, attempt) {
69
72
  }), {
70
73
  intent: { ...intent, computedDigest: effectInputDigest(intent) },
71
74
  now,
75
+ ...(attempt.mode === undefined ? {} : { mode: attempt.mode }),
72
76
  }));
73
77
  }
74
78
  const withheld = { kind: "withheld" };
79
+ async function retryEffect(parts, attempt) {
80
+ const retry = await decided(parts, { ...attempt, mode: "retry" });
81
+ return retry === "send"
82
+ ? called(parts, { intent: attempt.intent, name: "retry" })
83
+ : attempt.known;
84
+ }
75
85
  function unsent(decision) {
76
86
  return decision === "stale" ? withheld : { kind: decision };
77
87
  }
@@ -83,6 +93,8 @@ async function attempted(parts, attempt) {
83
93
  if (intent.purpose === "stop")
84
94
  return stopRequested(parts, intent);
85
95
  const known = await called(parts, { intent, name: "reconcile" });
96
+ if (known.kind === "unknown" && parts.delivery.retry !== undefined)
97
+ return retryEffect(parts, { ...attempt, known });
86
98
  if (known.kind !== "absent" || intent.purpose === "reconcile")
87
99
  return known;
88
100
  if (first !== "send")
@@ -16,6 +16,7 @@ export interface EffectQueries {
16
16
  readonly dueLeases: (instant: string) => Promise<readonly DueLease[]>;
17
17
  readonly stops: (runId: string) => Promise<readonly string[]>;
18
18
  readonly closure: (runId: string) => Promise<RunClosure>;
19
+ readonly settledAt: (runId: string) => Promise<number | null>;
19
20
  }
20
21
  export interface DueLease {
21
22
  readonly runId: string;
@@ -3,6 +3,12 @@ import { integer, optionalInteger, optionalText, text, } from "../../storage/dom
3
3
  import { budgetColumns, budgetRow, evidenceColumns, evidenceRow, operationColumns, operationRow, } from "../../storage/effect-rows.js";
4
4
  import { storedBudget } from "../effect-restore.js";
5
5
  import { stopping } from "./stop-turn.js";
6
+ async function settledAt(connection, runId) {
7
+ const rows = await connection.all("SELECT recorded_at FROM events WHERE sequence IN (SELECT settled_sequence FROM operations WHERE run_id = ? UNION ALL SELECT min(e.sequence) FROM events e JOIN stopped_operations s ON s.run_id = e.run_id AND s.operation_id = json_extract(e.payload, '$.operationId') WHERE e.run_id = ? AND (EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = s.operation_id AND d.outcome = 'sent') OR (SELECT d.outcome FROM deliveries d WHERE d.operation_id = s.operation_id ORDER BY d.staged_sequence DESC, d.rowid DESC LIMIT 1) NOT IN ('withheld', 'blocked', 'absent')) AND ((e.type = 'run.observed' AND json_extract(e.payload, '$.condition') = 'stopped') OR (e.type = 'operation.reconciled' AND json_extract(e.payload, '$.outcome') = 'stopped')) GROUP BY s.operation_id)", [runId, runId]);
8
+ if (rows.length === 0)
9
+ return null;
10
+ return rows.reduce((latest, row) => Math.max(latest, Date.parse(text(row, "recorded_at"))), -Infinity);
11
+ }
6
12
  async function storedClosure(connection, scope) {
7
13
  const { subjects, cancelledSequence } = await stopping(connection, scope.runId);
8
14
  return runClosure(subjects, {
@@ -70,6 +76,7 @@ export function effectQueries(read, settings) {
70
76
  return {
71
77
  stops: (runId) => read((connection) => stops(connection, runId)),
72
78
  closure: (runId) => read((connection) => storedClosure(connection, { runId, stopLimit: settings.stopLimit })),
79
+ settledAt: (runId) => read((connection) => settledAt(connection, runId)),
73
80
  budget: (runId) => read((connection) => budget(connection, runId)),
74
81
  dueLeases: (instant) => read((connection) => dueLeases(connection, instant)),
75
82
  operation: (operationId) => read((connection) => operation(connection, operationId)),
@@ -7,6 +7,6 @@ export async function pinned(connection, check) {
7
7
  const stored = readExecutionManifest(JSON.parse(text(await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [
8
8
  workflow,
9
9
  ]), "manifest")));
10
- const current = available(stored);
10
+ const current = await available(stored);
11
11
  return (current !== undefined && resumePinned(stored, current).kind === "admitted");
12
12
  }
@@ -15,7 +15,7 @@ function present(state, planning) {
15
15
  stopped: subject.stopped || state.effects.stops[subject.operationId] !== undefined,
16
16
  };
17
17
  }
18
- const kinds = ["start-run", "continue-run"];
18
+ const kinds = ["start-run", "continue-run", "resume-hook"];
19
19
  function intentOf(state, attempt) {
20
20
  const { runId, operationId, purpose } = attempt;
21
21
  const kind = kinds.find((candidate) => candidate === attempt.kind);
@@ -76,7 +76,7 @@ export async function adoptionTurn(connection) {
76
76
  return latest;
77
77
  }
78
78
  export async function recoverableIntents(connection) {
79
- const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind = 'continue-run' AND r.status = 'running') OR (o.kind = 'protected-effect' AND r.status = 'running' AND EXISTS (SELECT 1 FROM operations p WHERE p.operation_id = o.operation_id AND p.status = 'dispatch-pending'))) ORDER BY o.created_sequence, o.rowid LIMIT ?", [recoveryBatch]);
79
+ const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind IN ('continue-run', 'resume-hook') AND r.status = 'running') OR (o.kind = 'protected-effect' AND r.status = 'running' AND EXISTS (SELECT 1 FROM operations p WHERE p.operation_id = o.operation_id AND p.status = 'dispatch-pending'))) ORDER BY o.created_sequence, o.rowid LIMIT ?", [recoveryBatch]);
80
80
  const intents = [];
81
81
  for (const row of rows) {
82
82
  const intent = {
@@ -1,5 +1,5 @@
1
1
  import { parseCommand } from "../authority/commands.js";
2
- import { readExecutionManifest, resumePinned } from "../execution-pin.js";
2
+ import { executionCapabilities, readExecutionManifest, resumePinned, } from "../execution-pin.js";
3
3
  import { effectInputDigest } from "./effect-restore.js";
4
4
  import { workflowPin } from "./workflow-pin.js";
5
5
  const admissible = { kind: "admissible", definitions: new Map() };
@@ -15,7 +15,7 @@ const admission = (command, context) => {
15
15
  const pin = workflowPin(stored);
16
16
  if (command.workflow !== pin)
17
17
  return { kind: "rejected", reason: "workflow-pin-mismatch" };
18
- const capabilities = JSON.stringify([...stored.capabilities].sort());
18
+ const capabilities = executionCapabilities(stored);
19
19
  if ((command.capabilities ?? capabilities) !== capabilities)
20
20
  return { kind: "rejected", reason: "capability-pin-mismatch" };
21
21
  return { kind: "admissible", definitions: new Map([[pin, stored]]) };
@@ -33,6 +33,25 @@ const resumption = (command, context) => {
33
33
  ? resumed
34
34
  : admissible;
35
35
  };
36
+ const commandEffect = (command, context) => {
37
+ const pin = context.state.runs[command.runId]?.workflow ?? "";
38
+ const names = context.definitions.get(pin)?.commands ?? [];
39
+ const method = String(command.method);
40
+ if (!method.startsWith("run:") || !names.includes(method.slice(4)))
41
+ return { kind: "rejected", reason: "command-not-declared" };
42
+ return unpinned(command, context);
43
+ };
44
+ const handoffEffect = (command, context) => {
45
+ if (command.capability !== "handoff")
46
+ return unpinned(command, context);
47
+ const pin = context.state.runs[command.runId]?.workflow ?? "";
48
+ const declaration = context.definitions.get(pin);
49
+ if (!declaration?.handoffs?.includes(String(command.target)))
50
+ return { kind: "rejected", reason: "handoff-not-declared" };
51
+ if (command.units !== 1 || command.method !== "run")
52
+ return { kind: "rejected", reason: "invalid-handoff-request" };
53
+ return unpinned(command, context);
54
+ };
36
55
  const effectRequest = (command, context) => {
37
56
  const computed = effectInputDigest({
38
57
  capability: String(command.capability),
@@ -40,9 +59,11 @@ const effectRequest = (command, context) => {
40
59
  target: String(command.target),
41
60
  payload: String(command.payload),
42
61
  });
43
- return computed === command.inputDigest
44
- ? unpinned(command, context)
45
- : { kind: "rejected", reason: "input-digest-mismatch" };
62
+ if (computed !== command.inputDigest)
63
+ return { kind: "rejected", reason: "input-digest-mismatch" };
64
+ return command.capability === "command"
65
+ ? commandEffect(command, context)
66
+ : handoffEffect(command, context);
46
67
  };
47
68
  const rules = {
48
69
  "request-effect": effectRequest,
@@ -122,6 +122,7 @@ export function projectedState(snapshot) {
122
122
  const intentKinds = [
123
123
  "start-run",
124
124
  "continue-run",
125
+ "resume-hook",
125
126
  "protected-effect",
126
127
  ];
127
128
  export function intentKind(value) {
@@ -1,8 +1,8 @@
1
1
  import { createHash } from "node:crypto";
2
- import { continues, gateKey } from "../authority/gates.js";
3
- import { gateContinuation } from "../authority/reduction.js";
2
+ import { delivers, gateKey } from "../authority/gates.js";
3
+ import { gateDelivery } from "../authority/reduction.js";
4
4
  const kinds = ["question", "approval", "untyped"];
5
- const waits = ["registered", "pending"];
5
+ const waits = ["registered", "pending", "hook"];
6
6
  export function documentDigest(body) {
7
7
  return `sha256:${createHash("sha256").update(body).digest("hex")}`;
8
8
  }
@@ -22,7 +22,7 @@ export function gateRecord(gate) {
22
22
  answer: gate.outcome?.answer ?? null,
23
23
  decidedSequence: gate.outcome?.sequence ?? null,
24
24
  openedSequence: gate.openedSequence,
25
- continuation: continues(gate) ? gateContinuation(gate).operationId : null,
25
+ continuation: delivers(gate) ? gateDelivery(gate).operationId : null,
26
26
  };
27
27
  }
28
28
  const unobserved = {
@@ -6,4 +6,6 @@ export type SocketAddress = {
6
6
  readonly reason: "runtime-path-too-long";
7
7
  readonly detail: string;
8
8
  };
9
- export declare function socketAddress(path: string): SocketAddress;
9
+ export declare function socketAddress(path: string, options?: {
10
+ readonly directory: string;
11
+ }): SocketAddress;
@@ -1,7 +1,7 @@
1
1
  import { relative } from "node:path";
2
2
  const maximumBytes = 103;
3
- export function socketAddress(path) {
4
- const [shortest] = [path, relative(process.cwd(), path)]
3
+ export function socketAddress(path, options = { directory: process.cwd() }) {
4
+ const [shortest] = [path, relative(options.directory, path)]
5
5
  .filter((candidate) => candidate.length > 0)
6
6
  .sort((left, right) => Buffer.byteLength(left) - Buffer.byteLength(right));
7
7
  if (shortest === undefined || Buffer.byteLength(shortest) > maximumBytes)
@@ -1,23 +1,21 @@
1
+ import { type ConfigInvocation } from "./config-arguments.ts";
2
+ import { type PhoneInvocation } from "./phone-arguments.ts";
1
3
  import { type RuntimeInvocation } from "./runtime-arguments.ts";
2
4
  export type Invocation = {
5
+ readonly repository?: string;
6
+ } & (PhoneInvocation | ConfigInvocation | {
7
+ readonly kind: "config-help";
8
+ } | {
3
9
  readonly kind: "help";
4
10
  } | {
5
11
  readonly kind: "version";
6
12
  } | {
7
- readonly kind: "validate-help";
8
- } | {
9
- readonly kind: "chats-redact-help";
13
+ readonly kind: "doctor-help";
10
14
  } | {
11
- readonly kind: "chats-redact";
12
- readonly importId: string;
13
- } | {
14
- readonly kind: "chats-import-help";
15
+ readonly kind: "doctor";
16
+ readonly json: boolean;
15
17
  } | {
16
- readonly kind: "chats-import";
17
- readonly paths: readonly string[];
18
- readonly roots?: readonly string[];
19
- readonly excludeProjects?: readonly string[];
20
- readonly previousImportId?: string;
18
+ readonly kind: "validate-help";
21
19
  } | {
22
20
  readonly kind: "validate";
23
21
  readonly manifest: string;
@@ -27,5 +25,5 @@ export type Invocation = {
27
25
  readonly kind: "usage-error";
28
26
  readonly code: string;
29
27
  readonly json: boolean;
30
- };
28
+ });
31
29
  export declare function parseInvocation(given: readonly string[]): Invocation;