cloving 1.2.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 (518) hide show
  1. package/README.md +525 -185
  2. package/dist/src/agent-harness-shell.d.ts +12 -0
  3. package/dist/src/agent-harness-shell.js +90 -0
  4. package/dist/src/agent-harness-versions.d.ts +8 -0
  5. package/dist/src/agent-harness-versions.js +49 -0
  6. package/dist/src/agent-harnesses.d.ts +4 -0
  7. package/dist/src/agent-harnesses.js +13 -0
  8. package/dist/src/authority/commands.d.ts +1 -0
  9. package/dist/src/authority/commands.js +24 -4
  10. package/dist/src/authority/gate-reduction.d.ts +1 -0
  11. package/dist/src/authority/gate-reduction.js +18 -3
  12. package/dist/src/authority/gates.d.ts +2 -1
  13. package/dist/src/authority/gates.js +5 -1
  14. package/dist/src/authority/operations.js +1 -1
  15. package/dist/src/authority/reduction.d.ts +1 -1
  16. package/dist/src/authority/reduction.js +6 -1
  17. package/dist/src/authority/status-input.d.ts +1 -1
  18. package/dist/src/authority/status.d.ts +1 -0
  19. package/dist/src/authority/status.js +27 -3
  20. package/dist/src/authority/transitions.d.ts +5 -5
  21. package/dist/src/authority/transitions.js +6 -0
  22. package/dist/src/broker/actor/authority-delivery.js +1 -0
  23. package/dist/src/broker/actor/authority-queries.d.ts +7 -1
  24. package/dist/src/broker/actor/authority-queries.js +17 -2
  25. package/dist/src/broker/actor/authority-receipts.js +11 -1
  26. package/dist/src/broker/actor/authority-session.js +2 -2
  27. package/dist/src/broker/actor/authority-settings.js +4 -0
  28. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  29. package/dist/src/broker/actor/delivery-intents.js +4 -4
  30. package/dist/src/broker/actor/effect-delivery.js +4 -1
  31. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  32. package/dist/src/broker/actor/effect-queries.js +7 -0
  33. package/dist/src/broker/actor/pin-check.js +1 -1
  34. package/dist/src/broker/actor/stop-plan.js +1 -1
  35. package/dist/src/broker/actor/turn-state.js +1 -1
  36. package/dist/src/broker/authority-admission.js +22 -9
  37. package/dist/src/broker/authority-restore.js +1 -0
  38. package/dist/src/broker/decision-restore.js +4 -4
  39. package/dist/src/broker/socket-address.d.ts +3 -1
  40. package/dist/src/broker/socket-address.js +2 -2
  41. package/dist/src/cli/arguments.d.ts +11 -13
  42. package/dist/src/cli/arguments.js +37 -107
  43. package/dist/src/cli/command-effects.d.ts +7 -0
  44. package/dist/src/cli/command-effects.js +39 -0
  45. package/dist/src/cli/commands.js +11 -4
  46. package/dist/src/cli/config-arguments.d.ts +11 -0
  47. package/dist/src/cli/config-arguments.js +59 -0
  48. package/dist/src/cli/config-command.d.ts +2 -0
  49. package/dist/src/cli/config-command.js +105 -0
  50. package/dist/src/cli/config-file.d.ts +3 -0
  51. package/dist/src/cli/config-file.js +50 -0
  52. package/dist/src/cli/config-lock.d.ts +7 -0
  53. package/dist/src/cli/config-lock.js +61 -0
  54. package/dist/src/cli/config-notice.d.ts +5 -0
  55. package/dist/src/cli/config-notice.js +46 -0
  56. package/dist/src/cli/doctor-github.d.ts +9 -0
  57. package/dist/src/cli/doctor-github.js +138 -0
  58. package/dist/src/cli/doctor-harness.d.ts +13 -0
  59. package/dist/src/cli/doctor-harness.js +242 -0
  60. package/dist/src/cli/doctor-local.d.ts +18 -0
  61. package/dist/src/cli/doctor-local.js +77 -0
  62. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  63. package/dist/src/cli/doctor-runtime.js +176 -0
  64. package/dist/src/cli/doctor-service.d.ts +1 -0
  65. package/dist/src/cli/doctor-service.js +11 -0
  66. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  67. package/dist/src/cli/doctor-workflows.js +45 -0
  68. package/dist/src/cli/doctor.d.ts +15 -0
  69. package/dist/src/cli/doctor.js +190 -0
  70. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  71. package/dist/src/cli/github-ci-progress.js +83 -0
  72. package/dist/src/cli/github-retry.d.ts +6 -0
  73. package/dist/src/cli/github-retry.js +47 -0
  74. package/dist/src/cli/harness-probes.d.ts +22 -0
  75. package/dist/src/cli/harness-probes.js +183 -0
  76. package/dist/src/cli/main.d.ts +7 -1
  77. package/dist/src/cli/main.js +39 -61
  78. package/dist/src/cli/phone-arguments.d.ts +14 -0
  79. package/dist/src/cli/phone-arguments.js +37 -0
  80. package/dist/src/cli/phone-client.d.ts +2 -0
  81. package/dist/src/cli/phone-client.js +32 -0
  82. package/dist/src/cli/phone-command.d.ts +13 -0
  83. package/dist/src/cli/phone-command.js +101 -0
  84. package/dist/src/cli/probe-command.d.ts +36 -0
  85. package/dist/src/cli/probe-command.js +59 -0
  86. package/dist/src/cli/project-settings.d.ts +4 -0
  87. package/dist/src/cli/project-settings.js +33 -0
  88. package/dist/src/cli/render.d.ts +2 -1
  89. package/dist/src/cli/render.js +44 -28
  90. package/dist/src/cli/report-github.d.ts +18 -0
  91. package/dist/src/cli/report-github.js +200 -0
  92. package/dist/src/cli/report.d.ts +17 -0
  93. package/dist/src/cli/report.js +192 -0
  94. package/dist/src/cli/repository-arguments.d.ts +5 -0
  95. package/dist/src/cli/repository-arguments.js +34 -0
  96. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  97. package/dist/src/cli/runtime-arguments.js +15 -0
  98. package/dist/src/cli/runtime-directory.d.ts +6 -2
  99. package/dist/src/cli/runtime-directory.js +72 -14
  100. package/dist/src/cli/toolchain.d.ts +2 -0
  101. package/dist/src/cli/toolchain.js +22 -2
  102. package/dist/src/cli/usage-render.d.ts +5 -0
  103. package/dist/src/cli/usage-render.js +40 -1
  104. package/dist/src/cli/usage.d.ts +3 -3
  105. package/dist/src/cli/usage.js +70 -44
  106. package/dist/src/cli/watch-actions.d.ts +2 -0
  107. package/dist/src/cli/watch-actions.js +4 -4
  108. package/dist/src/cli/watch-board-view.d.ts +1 -1
  109. package/dist/src/cli/watch-board-view.js +8 -2
  110. package/dist/src/cli/watch-board.js +23 -10
  111. package/dist/src/cli/watch-card-forms.js +2 -2
  112. package/dist/src/cli/watch-client.d.ts +1 -1
  113. package/dist/src/cli/watch-client.js +7 -2
  114. package/dist/src/cli/watch-header-view.d.ts +27 -0
  115. package/dist/src/cli/watch-header-view.js +116 -0
  116. package/dist/src/cli/watch-model.js +17 -4
  117. package/dist/src/cli/watch-page.js +48 -12
  118. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  119. package/dist/src/cli/watch-phone-client.js +84 -0
  120. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  121. package/dist/src/cli/watch-phone-view.js +113 -0
  122. package/dist/src/cli/watch-phone.d.ts +5 -0
  123. package/dist/src/cli/watch-phone.js +53 -0
  124. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  125. package/dist/src/cli/watch-pull-request.js +4 -0
  126. package/dist/src/cli/watch-render.d.ts +9 -1
  127. package/dist/src/cli/watch-server.js +23 -5
  128. package/dist/src/cli/watch-turn.d.ts +4 -1
  129. package/dist/src/cli/watch-turn.js +37 -1
  130. package/dist/src/cli/watch-usage.js +5 -1
  131. package/dist/src/cli/watch-view.d.ts +6 -20
  132. package/dist/src/cli/watch-view.js +14 -106
  133. package/dist/src/cli.js +106 -23
  134. package/dist/src/command-settings.d.ts +16 -0
  135. package/dist/src/command-settings.js +42 -0
  136. package/dist/src/configuration-change.d.ts +11 -0
  137. package/dist/src/configuration-change.js +62 -0
  138. package/dist/src/configuration-display.d.ts +21 -0
  139. package/dist/src/configuration-display.js +69 -0
  140. package/dist/src/configuration-schema.d.ts +49 -0
  141. package/dist/src/configuration-schema.js +159 -0
  142. package/dist/src/daemon/claude-turn.d.ts +19 -5
  143. package/dist/src/daemon/claude-turn.js +116 -53
  144. package/dist/src/daemon/claude-worker.d.ts +3 -3
  145. package/dist/src/daemon/claude-worker.js +65 -76
  146. package/dist/src/daemon/command-journal.d.ts +5 -0
  147. package/dist/src/daemon/command-journal.js +50 -0
  148. package/dist/src/daemon/command-process.d.ts +28 -0
  149. package/dist/src/daemon/command-process.js +164 -0
  150. package/dist/src/daemon/command-worker.d.ts +19 -0
  151. package/dist/src/daemon/command-worker.js +182 -0
  152. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  153. package/dist/src/daemon/cursor-stream.js +154 -0
  154. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  155. package/dist/src/daemon/daemon-adapters.js +102 -0
  156. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  157. package/dist/src/daemon/daemon-loops.js +39 -0
  158. package/dist/src/daemon/daemon.d.ts +2 -33
  159. package/dist/src/daemon/daemon.js +126 -132
  160. package/dist/src/daemon/declared-input.d.ts +3 -0
  161. package/dist/src/daemon/declared-input.js +9 -0
  162. package/dist/src/daemon/delivery-router.js +1 -1
  163. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  164. package/dist/src/daemon/gemini-stream.js +129 -0
  165. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  166. package/dist/src/daemon/github-ci-rerun.js +92 -0
  167. package/dist/src/daemon/github-ci.js +89 -8
  168. package/dist/src/daemon/github-merge-call.d.ts +2 -0
  169. package/dist/src/daemon/github-merge.js +7 -3
  170. package/dist/src/daemon/github-methods.js +10 -0
  171. package/dist/src/daemon/github-operation.d.ts +1 -0
  172. package/dist/src/daemon/github-retry.js +8 -44
  173. package/dist/src/daemon/issue-queue.d.ts +1 -0
  174. package/dist/src/daemon/issue-queue.js +3 -26
  175. package/dist/src/daemon/notify.js +2 -1
  176. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  177. package/dist/src/daemon/opencode-stream.js +87 -0
  178. package/dist/src/daemon/queue-status.d.ts +4 -0
  179. package/dist/src/daemon/queue-status.js +38 -0
  180. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  181. package/dist/src/daemon/retry-worktree.js +139 -0
  182. package/dist/src/daemon/retrying-turn.d.ts +2 -0
  183. package/dist/src/daemon/retrying-turn.js +108 -30
  184. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  185. package/dist/src/daemon/schedule-journal.js +57 -0
  186. package/dist/src/daemon/text-output.d.ts +18 -0
  187. package/dist/src/daemon/text-output.js +44 -0
  188. package/dist/src/daemon/ticket-registration.d.ts +5 -7
  189. package/dist/src/daemon/ticket-registration.js +85 -40
  190. package/dist/src/daemon/turn-command.d.ts +10 -0
  191. package/dist/src/daemon/turn-command.js +33 -0
  192. package/dist/src/daemon/turn-report.d.ts +18 -0
  193. package/dist/src/daemon/turn-report.js +79 -0
  194. package/dist/src/daemon/work-tree.d.ts +2 -1
  195. package/dist/src/daemon/work-tree.js +15 -12
  196. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  197. package/dist/src/daemon/workflow-generations.js +57 -0
  198. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  199. package/dist/src/daemon/workflow-replay.js +58 -0
  200. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  201. package/dist/src/daemon/workflow-schedules.js +185 -0
  202. package/dist/src/decision-wait.d.ts +1 -0
  203. package/dist/src/decision-wait.js +3 -0
  204. package/dist/src/delivery-backoff.d.ts +1 -0
  205. package/dist/src/delivery-backoff.js +3 -0
  206. package/dist/src/doctor-report.d.ts +24 -0
  207. package/dist/src/doctor-report.js +70 -0
  208. package/dist/src/execution-pin.d.ts +5 -0
  209. package/dist/src/execution-pin.js +67 -4
  210. package/dist/src/grok-result.d.ts +12 -0
  211. package/dist/src/grok-result.js +61 -0
  212. package/dist/src/harness-defaults.d.ts +35 -0
  213. package/dist/src/harness-defaults.js +121 -0
  214. package/dist/src/host/decision-resume.d.ts +35 -0
  215. package/dist/src/host/decision-resume.js +86 -0
  216. package/dist/src/host/gate-bridge.d.ts +48 -0
  217. package/dist/src/host/gate-bridge.js +124 -0
  218. package/dist/src/host/run-wait.d.ts +26 -0
  219. package/dist/src/host/run-wait.js +37 -0
  220. package/dist/src/host/start-delivery.d.ts +1 -1
  221. package/dist/src/host/start-delivery.js +10 -3
  222. package/dist/src/host/step-bridge-host.d.ts +6 -20
  223. package/dist/src/host/step-bridge-host.js +44 -58
  224. package/dist/src/merge-request.d.ts +19 -0
  225. package/dist/src/merge-request.js +32 -0
  226. package/dist/src/phone/canonical-json.d.ts +1 -0
  227. package/dist/src/phone/canonical-json.js +16 -0
  228. package/dist/src/phone/phone-link.d.ts +7 -0
  229. package/dist/src/phone/phone-link.js +21 -0
  230. package/dist/src/phone/qr-data.d.ts +8 -0
  231. package/dist/src/phone/qr-data.js +133 -0
  232. package/dist/src/phone/qr-matrix.d.ts +6 -0
  233. package/dist/src/phone/qr-matrix.js +175 -0
  234. package/dist/src/phone/qr-penalty.d.ts +3 -0
  235. package/dist/src/phone/qr-penalty.js +67 -0
  236. package/dist/src/phone/qr-picture.d.ts +5 -0
  237. package/dist/src/phone/qr-picture.js +24 -0
  238. package/dist/src/private-config.schema.json +263 -0
  239. package/dist/src/project-config.schema.json +65 -0
  240. package/dist/src/project-settings.d.ts +19 -0
  241. package/dist/src/project-settings.js +131 -0
  242. package/dist/src/relay/answer-check.d.ts +24 -0
  243. package/dist/src/relay/answer-check.js +145 -0
  244. package/dist/src/relay/answer-inbox.d.ts +15 -0
  245. package/dist/src/relay/answer-inbox.js +173 -0
  246. package/dist/src/relay/daemon-keys.d.ts +16 -0
  247. package/dist/src/relay/daemon-keys.js +75 -0
  248. package/dist/src/relay/decision-check.d.ts +3 -0
  249. package/dist/src/relay/decision-check.js +77 -0
  250. package/dist/src/relay/decision-close.d.ts +6 -0
  251. package/dist/src/relay/decision-close.js +72 -0
  252. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  253. package/dist/src/relay/decision-envelopes.js +93 -0
  254. package/dist/src/relay/decision-watch.d.ts +14 -0
  255. package/dist/src/relay/decision-watch.js +68 -0
  256. package/dist/src/relay/envelope-post.d.ts +8 -0
  257. package/dist/src/relay/envelope-post.js +71 -0
  258. package/dist/src/relay/envelope.d.ts +28 -0
  259. package/dist/src/relay/envelope.js +53 -0
  260. package/dist/src/relay/hpke.d.ts +25 -0
  261. package/dist/src/relay/hpke.js +108 -0
  262. package/dist/src/relay/pairing-checks.d.ts +42 -0
  263. package/dist/src/relay/pairing-checks.js +172 -0
  264. package/dist/src/relay/pairing-follow.d.ts +8 -0
  265. package/dist/src/relay/pairing-follow.js +95 -0
  266. package/dist/src/relay/pairing-session.d.ts +29 -0
  267. package/dist/src/relay/pairing-session.js +87 -0
  268. package/dist/src/relay/phone-delivery.d.ts +51 -0
  269. package/dist/src/relay/phone-delivery.js +139 -0
  270. package/dist/src/relay/phone-devices.d.ts +36 -0
  271. package/dist/src/relay/phone-devices.js +46 -0
  272. package/dist/src/relay/phone-inbox.d.ts +18 -0
  273. package/dist/src/relay/phone-inbox.js +17 -0
  274. package/dist/src/relay/phone-operations.d.ts +18 -0
  275. package/dist/src/relay/phone-operations.js +121 -0
  276. package/dist/src/relay/phone-outbox.d.ts +21 -0
  277. package/dist/src/relay/phone-outbox.js +25 -0
  278. package/dist/src/relay/phone-socket.d.ts +6 -0
  279. package/dist/src/relay/phone-socket.js +63 -0
  280. package/dist/src/relay/relay-control.d.ts +7 -0
  281. package/dist/src/relay/relay-control.js +24 -0
  282. package/dist/src/relay/relay-files.d.ts +2 -0
  283. package/dist/src/relay/relay-files.js +23 -0
  284. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  285. package/dist/src/relay/relay-heartbeat.js +81 -0
  286. package/dist/src/relay/relay-http.d.ts +14 -0
  287. package/dist/src/relay/relay-http.js +63 -0
  288. package/dist/src/relay/relay-registration.d.ts +15 -0
  289. package/dist/src/relay/relay-registration.js +63 -0
  290. package/dist/src/relay/relay-service.d.ts +25 -0
  291. package/dist/src/relay/relay-service.js +216 -0
  292. package/dist/src/relay/relay-store.d.ts +48 -0
  293. package/dist/src/relay/relay-store.js +131 -0
  294. package/dist/src/relay/sealed-post.d.ts +25 -0
  295. package/dist/src/relay/sealed-post.js +52 -0
  296. package/dist/src/relay.d.ts +1 -0
  297. package/dist/src/relay.js +8 -0
  298. package/dist/src/report-statistics.d.ts +50 -0
  299. package/dist/src/report-statistics.js +70 -0
  300. package/dist/src/report.d.ts +171 -0
  301. package/dist/src/report.js +119 -0
  302. package/dist/src/repository-identity.d.ts +4 -0
  303. package/dist/src/repository-identity.js +4 -0
  304. package/dist/src/review-subject.d.ts +41 -0
  305. package/dist/src/review-subject.js +91 -0
  306. package/dist/src/run-wait.d.ts +23 -0
  307. package/dist/src/run-wait.js +20 -0
  308. package/dist/src/service/active-tickets.d.ts +4 -0
  309. package/dist/src/service/active-tickets.js +49 -0
  310. package/dist/src/service/command-effects.d.ts +4 -0
  311. package/dist/src/service/command-effects.js +16 -0
  312. package/dist/src/service/decision-handler.d.ts +4 -0
  313. package/dist/src/service/decision-handler.js +39 -4
  314. package/dist/src/service/gateway.js +18 -3
  315. package/dist/src/service/registry.d.ts +16 -3
  316. package/dist/src/service/registry.js +34 -3
  317. package/dist/src/service/replies.d.ts +9 -1
  318. package/dist/src/service/replies.js +12 -0
  319. package/dist/src/service/run-handlers.js +14 -55
  320. package/dist/src/service/run-metadata.d.ts +8 -0
  321. package/dist/src/service/run-metadata.js +53 -0
  322. package/dist/src/service/run-waits.d.ts +3 -0
  323. package/dist/src/service/run-waits.js +41 -0
  324. package/dist/src/service/service.d.ts +18 -2
  325. package/dist/src/service/service.js +23 -7
  326. package/dist/src/service/submission-handler.d.ts +0 -1
  327. package/dist/src/service/submission-handler.js +6 -34
  328. package/dist/src/service/worker-port.d.ts +1 -0
  329. package/dist/src/service/worker-totals.js +8 -23
  330. package/dist/src/step-bridge.d.ts +23 -0
  331. package/dist/src/steps/decision-gate.d.ts +2 -1
  332. package/dist/src/steps/decision-gate.js +7 -0
  333. package/dist/src/steps/merge-by-person.d.ts +2 -0
  334. package/dist/src/steps/merge-by-person.js +18 -0
  335. package/dist/src/steps/merge-when-green.d.ts +2 -0
  336. package/dist/src/steps/merge-when-green.js +62 -0
  337. package/dist/src/steps/review-by-agent.d.ts +5 -0
  338. package/dist/src/steps/review-by-agent.js +124 -0
  339. package/dist/src/steps/review-by-person.d.ts +4 -0
  340. package/dist/src/steps/review-by-person.js +16 -0
  341. package/dist/src/steps/review-subject.d.ts +2 -0
  342. package/dist/src/steps/review-subject.js +11 -0
  343. package/dist/src/steps/run-command.d.ts +2 -0
  344. package/dist/src/steps/run-command.js +15 -0
  345. package/dist/src/steps/sleep.d.ts +3 -0
  346. package/dist/src/steps/sleep.js +19 -0
  347. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  348. package/dist/src/steps/wait-for-decision.js +71 -0
  349. package/dist/src/steps/wait-for-run.d.ts +5 -0
  350. package/dist/src/steps/wait-for-run.js +9 -0
  351. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  352. package/dist/src/storage/decision-snapshots.js +7 -1
  353. package/dist/src/submission.d.ts +4 -0
  354. package/dist/src/submission.js +6 -2
  355. package/dist/src/testing.d.ts +29 -0
  356. package/dist/src/testing.js +264 -0
  357. package/dist/src/ticket-status-stream.d.ts +9 -0
  358. package/dist/src/ticket-status-stream.js +94 -0
  359. package/dist/src/token-prices.d.ts +12 -4
  360. package/dist/src/token-prices.js +15 -2
  361. package/dist/src/turn-profile.d.ts +1 -0
  362. package/dist/src/turn-profile.js +8 -1
  363. package/dist/src/worker-usage.d.ts +16 -0
  364. package/dist/src/worker-usage.js +57 -0
  365. package/dist/src/workflow-admission.d.ts +5 -0
  366. package/dist/src/workflow-candidate.d.ts +7 -2
  367. package/dist/src/workflow-candidate.js +47 -5
  368. package/dist/src/workflow-declaration.d.ts +21 -3
  369. package/dist/src/workflow-declaration.js +77 -9
  370. package/dist/src/workflow-discovery.d.ts +2 -1
  371. package/dist/src/workflow-discovery.js +4 -1
  372. package/dist/src/workflow-refusals.js +3 -0
  373. package/dist/src/workflow-schedule.d.ts +22 -0
  374. package/dist/src/workflow-schedule.js +53 -0
  375. package/dist/src/workflows.d.ts +11 -1
  376. package/dist/src/workflows.js +8 -0
  377. package/dist/tools/admit-workflow.d.ts +1 -0
  378. package/dist/tools/admit-workflow.js +18 -5
  379. package/dist/tools/doctor-adoption.d.ts +1 -0
  380. package/dist/tools/doctor-adoption.js +11 -0
  381. package/dist/tools/project-configuration.d.ts +4 -0
  382. package/dist/tools/project-configuration.js +47 -0
  383. package/dist/tools/self-host-processes.d.ts +1 -0
  384. package/dist/tools/self-host-processes.js +33 -22
  385. package/dist/tools/self-host-project.d.ts +4 -0
  386. package/dist/tools/self-host-project.js +61 -14
  387. package/dist/tools/self-host-runtime.d.ts +16 -0
  388. package/dist/tools/self-host-runtime.js +60 -0
  389. package/dist/tools/self-host-workflows.d.ts +1 -0
  390. package/dist/tools/self-host-workflows.js +36 -1
  391. package/dist/tools/self-host.js +86 -61
  392. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  393. package/dist/tools/workflow-candidate-counts.js +31 -16
  394. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  395. package/dist/tools/workflow-candidate-fields.js +24 -0
  396. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  397. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  398. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  399. package/dist/tools/workflow-candidate-program.js +36 -8
  400. package/dist/tools/workflow-candidate-source.js +77 -15
  401. package/dist/tools/workflow-candidate-syntax.d.ts +8 -2
  402. package/dist/tools/workflow-candidate-syntax.js +70 -26
  403. package/dist/tools/workflow-command.d.ts +1 -0
  404. package/dist/tools/workflow-command.js +143 -0
  405. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  406. package/dist/tools/workflow-folder-capture.js +47 -2
  407. package/dist/tools/workflow-folders.d.ts +17 -1
  408. package/dist/tools/workflow-folders.js +59 -6
  409. package/dist/tools/workflow-test-hook.d.ts +7 -0
  410. package/dist/tools/workflow-test-hook.js +16 -0
  411. package/dist/tools/workflow-test-loader.d.ts +1 -0
  412. package/dist/tools/workflow-test-loader.js +10 -0
  413. package/dist/workflows/develop-ticket.js +1 -1
  414. package/dist/workflows/ticket-prompts.js +5 -1
  415. package/package.json +46 -4
  416. package/templates/develop/README.md +78 -0
  417. package/templates/develop/develop/accept.ts +11 -0
  418. package/templates/develop/develop/flow-tests.ts +357 -0
  419. package/templates/develop/develop/local.ts +40 -0
  420. package/templates/develop/develop/option-tests.ts +174 -0
  421. package/templates/develop/develop/partial-choice.ts +29 -0
  422. package/templates/develop/develop/partial.ts +28 -0
  423. package/templates/develop/develop/pull.ts +152 -0
  424. package/templates/develop/develop/queue-partial.ts +39 -0
  425. package/templates/develop/develop/refusal-tests.ts +174 -0
  426. package/templates/develop/develop/report.ts +156 -0
  427. package/templates/develop/develop/round.ts +40 -0
  428. package/templates/develop/develop/scenarios.ts +87 -0
  429. package/templates/develop/develop/turn.ts +67 -0
  430. package/templates/develop/develop.declaration.json +24 -0
  431. package/templates/develop/develop.test.ts +287 -0
  432. package/templates/develop/develop.ts +30 -0
  433. package/templates/develop/template.json +153 -0
  434. package/dist/src/chats/analysis-batches.d.ts +0 -42
  435. package/dist/src/chats/analysis-batches.js +0 -97
  436. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  437. package/dist/src/chats/analysis-checkpoint.js +0 -31
  438. package/dist/src/chats/analysis-contract.d.ts +0 -80
  439. package/dist/src/chats/analysis-contract.js +0 -16
  440. package/dist/src/chats/analysis-data.d.ts +0 -3
  441. package/dist/src/chats/analysis-data.js +0 -85
  442. package/dist/src/chats/analysis-input.d.ts +0 -18
  443. package/dist/src/chats/analysis-input.js +0 -97
  444. package/dist/src/chats/analysis-links.d.ts +0 -2
  445. package/dist/src/chats/analysis-links.js +0 -25
  446. package/dist/src/chats/analysis-merge.d.ts +0 -16
  447. package/dist/src/chats/analysis-merge.js +0 -134
  448. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  449. package/dist/src/chats/analysis-prompt.js +0 -42
  450. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  451. package/dist/src/chats/analysis-proposal.js +0 -41
  452. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  453. package/dist/src/chats/analysis-provenance.js +0 -99
  454. package/dist/src/chats/analysis-shape.d.ts +0 -4
  455. package/dist/src/chats/analysis-shape.js +0 -235
  456. package/dist/src/chats/analysis.d.ts +0 -3
  457. package/dist/src/chats/analysis.js +0 -42
  458. package/dist/src/chats/corpus-input.d.ts +0 -5
  459. package/dist/src/chats/corpus-input.js +0 -288
  460. package/dist/src/chats/destination.d.ts +0 -4
  461. package/dist/src/chats/destination.js +0 -96
  462. package/dist/src/chats/import.d.ts +0 -15
  463. package/dist/src/chats/import.js +0 -243
  464. package/dist/src/chats/input-file.d.ts +0 -3
  465. package/dist/src/chats/input-file.js +0 -32
  466. package/dist/src/chats/normalize.d.ts +0 -29
  467. package/dist/src/chats/normalize.js +0 -155
  468. package/dist/src/chats/previous-import.d.ts +0 -5
  469. package/dist/src/chats/previous-import.js +0 -34
  470. package/dist/src/chats/reader.d.ts +0 -21
  471. package/dist/src/chats/reader.js +0 -118
  472. package/dist/src/chats/redact-import.d.ts +0 -14
  473. package/dist/src/chats/redact-import.js +0 -141
  474. package/dist/src/chats/redaction.d.ts +0 -41
  475. package/dist/src/chats/redaction.js +0 -161
  476. package/dist/src/chats/reference-mapping.d.ts +0 -16
  477. package/dist/src/chats/reference-mapping.js +0 -153
  478. package/dist/src/chats/revision-input.d.ts +0 -3
  479. package/dist/src/chats/revision-input.js +0 -180
  480. package/dist/src/chats/revision.d.ts +0 -48
  481. package/dist/src/chats/revision.js +0 -94
  482. package/dist/src/chats/selection.d.ts +0 -25
  483. package/dist/src/chats/selection.js +0 -109
  484. package/dist/src/chats/source.d.ts +0 -23
  485. package/dist/src/chats/source.js +0 -135
  486. package/dist/src/chats/structure.d.ts +0 -57
  487. package/dist/src/chats/structure.js +0 -216
  488. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  489. package/dist/src/chats/workflow-generation-projection.js +0 -75
  490. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  491. package/dist/src/chats/workflow-generation-source.js +0 -124
  492. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  493. package/dist/src/chats/workflow-generation-text.js +0 -74
  494. package/dist/src/chats/workflow-generation.d.ts +0 -69
  495. package/dist/src/chats/workflow-generation.js +0 -142
  496. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  497. package/dist/src/daemon/analysis-launch.js +0 -81
  498. package/dist/src/daemon/analysis-token.d.ts +0 -6
  499. package/dist/src/daemon/analysis-token.js +0 -88
  500. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  501. package/dist/src/daemon/analysis-worker.js +0 -271
  502. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  503. package/dist/src/daemon/chats-batch-binding.js +0 -99
  504. package/dist/src/daemon/chats-capture.d.ts +0 -18
  505. package/dist/src/daemon/chats-capture.js +0 -194
  506. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  507. package/dist/src/daemon/chats-checkpoints.js +0 -186
  508. package/dist/src/daemon/chats-files.d.ts +0 -42
  509. package/dist/src/daemon/chats-files.js +0 -252
  510. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  511. package/dist/src/daemon/chats-follow-up.js +0 -180
  512. package/dist/src/daemon/chats-question.d.ts +0 -15
  513. package/dist/src/daemon/chats-question.js +0 -93
  514. package/dist/src/daemon/chats-worker.d.ts +0 -13
  515. package/dist/src/daemon/chats-worker.js +0 -201
  516. package/dist/workflows/analyze-chats.d.ts +0 -15
  517. package/dist/workflows/analyze-chats.declaration.json +0 -22
  518. package/dist/workflows/analyze-chats.js +0 -250
@@ -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">;
@@ -54,7 +55,7 @@ export interface Delivery {
54
55
  readonly retry?: Delivery["reconcile"];
55
56
  readonly stop?: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
56
57
  }
57
- export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined;
58
+ export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined | Promise<ExecutionManifest | undefined>;
58
59
  export declare function intentDigest(intent: Undigested): string;
59
60
  export declare function deliveryIntent(intent: Undigested): DeliveryIntent;
60
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) {
@@ -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 = {
@@ -33,15 +33,15 @@ const resumption = (command, context) => {
33
33
  ? resumed
34
34
  : admissible;
35
35
  };
36
- const effectRequest = (command, context) => {
37
- const computed = effectInputDigest({
38
- capability: String(command.capability),
39
- method: String(command.method),
40
- target: String(command.target),
41
- payload: String(command.payload),
42
- });
43
- if (computed !== command.inputDigest)
44
- return { kind: "rejected", reason: "input-digest-mismatch" };
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
45
  if (command.capability !== "handoff")
46
46
  return unpinned(command, context);
47
47
  const pin = context.state.runs[command.runId]?.workflow ?? "";
@@ -52,6 +52,19 @@ const effectRequest = (command, context) => {
52
52
  return { kind: "rejected", reason: "invalid-handoff-request" };
53
53
  return unpinned(command, context);
54
54
  };
55
+ const effectRequest = (command, context) => {
56
+ const computed = effectInputDigest({
57
+ capability: String(command.capability),
58
+ method: String(command.method),
59
+ target: String(command.target),
60
+ payload: String(command.payload),
61
+ });
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);
67
+ };
55
68
  const rules = {
56
69
  "request-effect": effectRequest,
57
70
  "admit-run": admission,
@@ -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;
@@ -1,4 +1,7 @@
1
1
  import { parseArgs } from "node:util";
2
+ import { configInvocation } from "./config-arguments.js";
3
+ import { repositoryArguments } from "./repository-arguments.js";
4
+ import { phoneInvocation } from "./phone-arguments.js";
2
5
  import { isRuntimeCommand, runtimeInvocation, } from "./runtime-arguments.js";
3
6
  const errorCodes = {
4
7
  ERR_PARSE_ARGS_UNKNOWN_OPTION: "unknown-option",
@@ -21,6 +24,8 @@ const options = {
21
24
  limit: { type: "string" },
22
25
  after: { type: "string" },
23
26
  follow: { type: "boolean" },
27
+ since: { type: "string" },
28
+ repository: { type: "string" },
24
29
  };
25
30
  const textOptions = ["--prompt", "--text"];
26
31
  function knownFlag(token) {
@@ -48,10 +53,27 @@ function textValues(argumentsList) {
48
53
  return option === undefined ? joined : [...joined, option];
49
54
  }
50
55
  export function parseInvocation(given) {
51
- if (given[0] === "chats" && given[1] === "import")
52
- return chatsImport(given.slice(2));
53
- if (given[0] === "chats" && given[1] === "redact")
54
- return chatsRedact(given.slice(2));
56
+ const selected = repositoryArguments(given, options);
57
+ if (typeof selected === "string")
58
+ return {
59
+ kind: "usage-error",
60
+ code: selected,
61
+ json: given.includes("--json"),
62
+ };
63
+ const invocation = selectedInvocation(selected.argumentsList);
64
+ return selected.repository === undefined
65
+ ? invocation
66
+ : { ...invocation, repository: selected.repository };
67
+ }
68
+ function selectedInvocation(given) {
69
+ if (given[0] === "config") {
70
+ const outcome = configInvocation(given.slice(1));
71
+ return typeof outcome === "string"
72
+ ? { kind: "usage-error", code: outcome, json: given.includes("--json") }
73
+ : outcome;
74
+ }
75
+ if (given[0] === "phone")
76
+ return phoneInvocation(given.slice(1));
55
77
  const argumentsList = textValues(given);
56
78
  const json = given.includes("--json");
57
79
  const parsed = parsedArguments(argumentsList);
@@ -61,6 +83,8 @@ export function parseInvocation(given) {
61
83
  const [command, ...remaining] = positionals;
62
84
  if (command === undefined)
63
85
  return topLevel(values);
86
+ if (command === "doctor")
87
+ return doctorInvocation(values, remaining);
64
88
  if (command === "workflows" && remaining[0] === "validate")
65
89
  return validation(values, remaining.slice(1));
66
90
  const outcome = runtimeInvocation({
@@ -72,109 +96,13 @@ export function parseInvocation(given) {
72
96
  return { kind: "usage-error", code: outcome, json };
73
97
  return outcome;
74
98
  }
75
- function chatsRedact(argumentsList) {
76
- if (argumentsList.length === 1 &&
77
- ["--help", "-h"].includes(String(argumentsList[0])))
78
- return { kind: "chats-redact-help" };
79
- const importId = argumentsList[0];
80
- if (argumentsList.length !== 1 ||
81
- importId === undefined ||
82
- !/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(importId))
83
- return { kind: "usage-error", code: "invalid-import-id", json: false };
84
- return { kind: "chats-redact", importId };
85
- }
86
- function chatsImport(argumentsList) {
87
- const error = (code) => ({
88
- kind: "usage-error",
89
- code,
90
- json: false,
91
- });
92
- if (argumentsList.length === 1 &&
93
- ["--help", "-h"].includes(String(argumentsList[0])))
94
- return { kind: "chats-import-help" };
95
- const state = {
96
- paths: [],
97
- roots: [],
98
- excludeProjects: [],
99
- literal: false,
100
- option: undefined,
101
- previousImportId: undefined,
102
- };
103
- for (const argument of argumentsList) {
104
- const failure = importArgument(state, argument);
105
- if (failure !== undefined)
106
- return error(failure);
107
- }
108
- if (state.option !== undefined)
109
- return error("missing-value");
110
- if (state.excludeProjects.length > 0 && state.roots.length === 0)
111
- return error("roots-required");
112
- if (state.paths.length + state.roots.length === 0)
113
- return error("missing-argument");
114
- return importInvocation(state);
115
- }
116
- function importInvocation(state) {
117
- const previous = state.previousImportId === undefined
118
- ? {}
119
- : { previousImportId: state.previousImportId };
120
- return state.roots.length === 0
121
- ? { kind: "chats-import", paths: state.paths, ...previous }
122
- : {
123
- kind: "chats-import",
124
- paths: state.paths,
125
- ...previous,
126
- roots: state.roots,
127
- excludeProjects: state.excludeProjects,
128
- };
129
- }
130
- function importArgument(state, argument) {
131
- if (state.option !== undefined)
132
- return importValue(state, argument);
133
- if (argument === "")
134
- return "missing-argument";
135
- if (state.literal) {
136
- state.paths.push(argument);
137
- return;
138
- }
139
- if (argument === "--previous-import" && state.previousImportId !== undefined)
140
- return "repeated-previous-import";
141
- if (["--root", "--exclude-project", "--previous-import"].includes(argument)) {
142
- state.option = argument;
143
- return;
144
- }
145
- if (argument === "--") {
146
- state.literal = true;
147
- return;
148
- }
149
- if (argument.startsWith("-"))
150
- return "unexpected-option";
151
- state.paths.push(argument);
152
- return;
153
- }
154
- function importValue(state, argument) {
155
- if (argument === "" || argument.startsWith("-"))
156
- return "missing-value";
157
- const option = state.option;
158
- state.option = undefined;
159
- if (option === "--root") {
160
- state.roots.push(argument);
161
- return;
162
- }
163
- if (option === "--exclude-project" && !validProjectName(argument))
164
- return "invalid-exclusion";
165
- if (option === "--exclude-project") {
166
- state.excludeProjects.push(argument);
167
- return;
168
- }
169
- if (!/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(argument))
170
- return "invalid-import-id";
171
- state.previousImportId = argument;
172
- return;
173
- }
174
- function validProjectName(name) {
175
- return (name !== "." &&
176
- name !== ".." &&
177
- !["/", "\\", "\0", "*", "?", "[", "]"].some((character) => name.includes(character)));
99
+ function doctorInvocation(values, remaining) {
100
+ const json = values.json === true;
101
+ if (unexpected(values, ["help", "json"]))
102
+ return { kind: "usage-error", code: "unexpected-option", json };
103
+ if (remaining.length > 0)
104
+ return { kind: "usage-error", code: "unexpected-argument", json };
105
+ return values.help ? { kind: "doctor-help" } : { kind: "doctor", json };
178
106
  }
179
107
  function parsedArguments(argumentsList) {
180
108
  try {
@@ -206,6 +134,8 @@ function knownCommand(positionals) {
206
134
  return true;
207
135
  if (command === "workflows")
208
136
  return subcommand === "validate";
137
+ if (command === "doctor")
138
+ return true;
209
139
  return isRuntimeCommand(command);
210
140
  }
211
141
  function givenOptions(tokens) {
@@ -0,0 +1,7 @@
1
+ import type { CommandEffect } from "../command-settings.ts";
2
+ import { type Shown } from "./watch-element.ts";
3
+ export declare function shownCommands(value: unknown): readonly CommandEffect[];
4
+ export declare function commandText(effect: CommandEffect): string;
5
+ export declare function Commands(props: {
6
+ readonly effects: readonly CommandEffect[];
7
+ }): Shown;
@@ -0,0 +1,39 @@
1
+ import { record } from "../protocol.js";
2
+ import { element } from "./watch-element.js";
3
+ export function shownCommands(value) {
4
+ if (!Array.isArray(value))
5
+ return [];
6
+ return value.flatMap((entry) => {
7
+ const fields = record(entry);
8
+ if (typeof fields?.["operationId"] !== "string" ||
9
+ typeof fields["name"] !== "string" ||
10
+ typeof fields["state"] !== "string")
11
+ return [];
12
+ return [
13
+ {
14
+ operationId: fields["operationId"],
15
+ name: fields["name"],
16
+ state: fields["state"],
17
+ exitCode: typeof fields["exitCode"] === "number" ? fields["exitCode"] : null,
18
+ durationMilliseconds: typeof fields["durationMilliseconds"] === "number"
19
+ ? fields["durationMilliseconds"]
20
+ : null,
21
+ },
22
+ ];
23
+ });
24
+ }
25
+ export function commandText(effect) {
26
+ const duration = effect.durationMilliseconds === null
27
+ ? "duration unknown"
28
+ : `${String(effect.durationMilliseconds)} ms`;
29
+ return `Command ${effect.name} · ${effect.state} · exit ${effect.exitCode === null ? "unknown" : String(effect.exitCode)} · ${duration}`;
30
+ }
31
+ export function Commands(props) {
32
+ return props.effects.map((effect) => element("section", {
33
+ class: "command-effect code-window",
34
+ children: element("h3", {
35
+ class: "code-head",
36
+ children: commandText(effect),
37
+ }),
38
+ }));
39
+ }
@@ -1,3 +1,5 @@
1
+ import { reportCommand } from "./report.js";
2
+ import { withCiReruns } from "./github-ci-progress.js";
1
3
  import { readFile } from "node:fs/promises";
2
4
  import { resolve } from "node:path";
3
5
  import { record, } from "../protocol.js";
@@ -45,8 +47,11 @@ function presented(environment, outcome) {
45
47
  return 0;
46
48
  }
47
49
  async function requested(environment, exchange) {
50
+ const reply = await send(environment.runtimeDirectory, exchange.request);
48
51
  return presented(environment, {
49
- reply: await send(environment.runtimeDirectory, exchange.request),
52
+ reply: exchange.request.operation === "status"
53
+ ? await withCiReruns(environment.runtimeDirectory, reply)
54
+ : reply,
50
55
  format: exchange.format,
51
56
  });
52
57
  }
@@ -138,7 +143,7 @@ async function status(environment, invocation) {
138
143
  if (!json && runId === null)
139
144
  await summarized(environment);
140
145
  if (!json && runId === null && limit === null && after === null) {
141
- const reply = await listRuns(environment.runtimeDirectory);
146
+ const reply = await withCiReruns(environment.runtimeDirectory, await listRuns(environment.runtimeDirectory));
142
147
  return presented(environment, {
143
148
  format: { json },
144
149
  reply: reply.kind === "result"
@@ -227,14 +232,16 @@ export function runtimeCommand(invocation, environment) {
227
232
  if (runtimeDirectory === undefined)
228
233
  return Promise.resolve(failed(environment, {
229
234
  error: {
230
- code: "runtime-directory-unknown",
231
- detail: "No runtime directory is known. Set CLOVING_RUNTIME_DIR to the runtime directory of the service.",
235
+ code: "repository-unknown",
236
+ detail: "Change to the service repository, use --repository <directory>, or set CLOVING_RUNTIME_DIR.",
232
237
  },
233
238
  format: { json: invocation.json },
234
239
  }));
235
240
  return located(invocation, { ...environment, runtimeDirectory });
236
241
  }
237
242
  function located(invocation, environment) {
243
+ if (invocation.kind === "report")
244
+ return reportCommand(invocation, environment);
238
245
  if (invocation.kind === "run")
239
246
  return run(environment, invocation);
240
247
  if (invocation.kind === "status")
@@ -0,0 +1,11 @@
1
+ export interface ConfigInvocation {
2
+ readonly kind: "config";
3
+ readonly action: "list" | "get" | "set" | "unset";
4
+ readonly field?: string;
5
+ readonly value?: string;
6
+ readonly private: boolean;
7
+ readonly json: boolean;
8
+ }
9
+ export declare function configInvocation(argumentsList: readonly string[]): ConfigInvocation | {
10
+ readonly kind: "config-help";
11
+ } | string;