cloving 1.3.0 → 1.5.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 (484) hide show
  1. package/README.md +329 -215
  2. package/dist/src/agent-harness-shell.d.ts +2 -1
  3. package/dist/src/agent-harness-shell.js +8 -5
  4. package/dist/src/authority/command-wait-checks.d.ts +8 -0
  5. package/dist/src/authority/command-wait-checks.js +88 -0
  6. package/dist/src/authority/command-wait-results.d.ts +15 -0
  7. package/dist/src/authority/command-wait-results.js +73 -0
  8. package/dist/src/authority/command-wait-view.d.ts +21 -0
  9. package/dist/src/authority/command-wait-view.js +34 -0
  10. package/dist/src/authority/command-waits.d.ts +39 -0
  11. package/dist/src/authority/command-waits.js +97 -0
  12. package/dist/src/authority/commands.js +22 -1
  13. package/dist/src/authority/dispatch-decision.d.ts +8 -0
  14. package/dist/src/authority/dispatch-decision.js +26 -1
  15. package/dist/src/authority/effect-requests.js +6 -3
  16. package/dist/src/authority/effect-results.js +4 -2
  17. package/dist/src/authority/history-state.d.ts +2 -0
  18. package/dist/src/authority/history-state.js +13 -1
  19. package/dist/src/authority/instants.d.ts +1 -0
  20. package/dist/src/authority/instants.js +21 -0
  21. package/dist/src/authority/reduction-state.d.ts +2 -0
  22. package/dist/src/authority/reduction-state.js +5 -0
  23. package/dist/src/authority/reduction.js +24 -0
  24. package/dist/src/authority/status-input.d.ts +2 -0
  25. package/dist/src/authority/status.d.ts +2 -0
  26. package/dist/src/authority/status.js +1 -0
  27. package/dist/src/authority/stop-sequence.d.ts +1 -0
  28. package/dist/src/authority/stop-sequence.js +2 -1
  29. package/dist/src/authority/transitions.d.ts +6 -4
  30. package/dist/src/authority/transitions.js +7 -0
  31. package/dist/src/broker/actor/authority-health.d.ts +9 -0
  32. package/dist/src/broker/actor/authority-health.js +24 -0
  33. package/dist/src/broker/actor/authority-queries.d.ts +2 -1
  34. package/dist/src/broker/actor/authority-queries.js +14 -5
  35. package/dist/src/broker/actor/authority-receipts.js +1 -1
  36. package/dist/src/broker/actor/authority-runtime.d.ts +4 -2
  37. package/dist/src/broker/actor/authority-runtime.js +29 -20
  38. package/dist/src/broker/actor/authority-session.d.ts +6 -19
  39. package/dist/src/broker/actor/authority-session.js +66 -88
  40. package/dist/src/broker/actor/authority-settings.d.ts +2 -1
  41. package/dist/src/broker/actor/authority-settings.js +6 -3
  42. package/dist/src/broker/actor/authority-upgrades.d.ts +23 -2
  43. package/dist/src/broker/actor/authority-upgrades.js +8 -2
  44. package/dist/src/broker/actor/authority-watchdog.d.ts +6 -2
  45. package/dist/src/broker/actor/authority-watchdog.js +31 -9
  46. package/dist/src/broker/actor/authority.js +3 -1
  47. package/dist/src/broker/actor/delivery-intents.js +2 -0
  48. package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
  49. package/dist/src/broker/actor/effect-delivery.js +15 -2
  50. package/dist/src/broker/actor/effect-plan.js +11 -2
  51. package/dist/src/broker/actor/effect-queries.d.ts +4 -0
  52. package/dist/src/broker/actor/effect-queries.js +9 -1
  53. package/dist/src/broker/actor/effect-turn.js +2 -0
  54. package/dist/src/broker/actor/projection-memory.d.ts +43 -0
  55. package/dist/src/broker/actor/projection-memory.js +207 -0
  56. package/dist/src/broker/actor/runtime-parts.d.ts +5 -0
  57. package/dist/src/broker/actor/runtime-parts.js +8 -3
  58. package/dist/src/broker/actor/stop-plan.js +9 -3
  59. package/dist/src/broker/actor/stop-turn.d.ts +2 -0
  60. package/dist/src/broker/actor/stop-turn.js +24 -11
  61. package/dist/src/broker/actor/turn-draft.d.ts +1 -0
  62. package/dist/src/broker/actor/turn-draft.js +4 -0
  63. package/dist/src/broker/actor/turn-state.js +5 -1
  64. package/dist/src/broker/authority-admission.js +60 -0
  65. package/dist/src/broker/authority-restore.d.ts +2 -0
  66. package/dist/src/broker/authority-restore.js +35 -1
  67. package/dist/src/broker/command-wait-restore.d.ts +31 -0
  68. package/dist/src/broker/command-wait-restore.js +86 -0
  69. package/dist/src/broker/decision-restore.d.ts +1 -1
  70. package/dist/src/broker/decision-restore.js +1 -0
  71. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  72. package/dist/src/broker/effect-upgrade.js +11 -2
  73. package/dist/src/cli/arguments.d.ts +13 -0
  74. package/dist/src/cli/arguments.js +43 -3
  75. package/dist/src/cli/chat-stores.d.ts +2 -0
  76. package/dist/src/cli/chat-stores.js +113 -0
  77. package/dist/src/cli/client.d.ts +7 -2
  78. package/dist/src/cli/client.js +13 -7
  79. package/dist/src/cli/command-requests.d.ts +46 -0
  80. package/dist/src/cli/command-requests.js +84 -0
  81. package/dist/src/cli/command-waits.d.ts +9 -0
  82. package/dist/src/cli/command-waits.js +51 -0
  83. package/dist/src/cli/commands.js +70 -88
  84. package/dist/src/cli/config-file.d.ts +2 -2
  85. package/dist/src/cli/config-file.js +4 -2
  86. package/dist/src/cli/config-notice.js +5 -2
  87. package/dist/src/cli/doctor-retention.d.ts +2 -0
  88. package/dist/src/cli/doctor-retention.js +93 -0
  89. package/dist/src/cli/doctor-workflows.d.ts +5 -2
  90. package/dist/src/cli/doctor-workflows.js +12 -7
  91. package/dist/src/cli/doctor.js +11 -9
  92. package/dist/src/cli/harness-probes.d.ts +2 -0
  93. package/dist/src/cli/harness-probes.js +1 -1
  94. package/dist/src/cli/harness-processes.d.ts +6 -0
  95. package/dist/src/cli/harness-processes.js +36 -0
  96. package/dist/src/cli/init-command.d.ts +9 -0
  97. package/dist/src/cli/init-command.js +52 -0
  98. package/dist/src/cli/init-prompt-command.d.ts +10 -0
  99. package/dist/src/cli/init-prompt-command.js +145 -0
  100. package/dist/src/cli/init-prompt.d.ts +35 -0
  101. package/dist/src/cli/init-prompt.js +74 -0
  102. package/dist/src/cli/init-selection.d.ts +13 -0
  103. package/dist/src/cli/init-selection.js +75 -0
  104. package/dist/src/cli/main.d.ts +2 -0
  105. package/dist/src/cli/main.js +37 -7
  106. package/dist/src/cli/mcp-server.d.ts +1 -0
  107. package/dist/src/cli/mcp-server.js +156 -0
  108. package/dist/src/cli/mcp-tools.d.ts +15 -0
  109. package/dist/src/cli/mcp-tools.js +242 -0
  110. package/dist/src/cli/queue-arguments.d.ts +15 -0
  111. package/dist/src/cli/queue-arguments.js +31 -0
  112. package/dist/src/cli/queue-render.d.ts +3 -0
  113. package/dist/src/cli/queue-render.js +26 -0
  114. package/dist/src/cli/reload-render.d.ts +2 -0
  115. package/dist/src/cli/reload-render.js +12 -0
  116. package/dist/src/cli/render.d.ts +1 -1
  117. package/dist/src/cli/render.js +54 -38
  118. package/dist/src/cli/report-ci-jobs.d.ts +23 -0
  119. package/dist/src/cli/report-ci-jobs.js +103 -0
  120. package/dist/src/cli/report-ci-usage.d.ts +9 -0
  121. package/dist/src/cli/report-ci-usage.js +185 -0
  122. package/dist/src/cli/report-ci.d.ts +13 -0
  123. package/dist/src/cli/report-ci.js +74 -0
  124. package/dist/src/cli/report-closures.d.ts +6 -0
  125. package/dist/src/cli/report-closures.js +97 -0
  126. package/dist/src/cli/report-flow.d.ts +7 -0
  127. package/dist/src/cli/report-flow.js +122 -0
  128. package/dist/src/cli/report-github-reader.d.ts +29 -0
  129. package/dist/src/cli/report-github-reader.js +157 -0
  130. package/dist/src/cli/report-github.d.ts +15 -8
  131. package/dist/src/cli/report-github.js +131 -150
  132. package/dist/src/cli/report-operator.d.ts +3 -0
  133. package/dist/src/cli/report-operator.js +40 -0
  134. package/dist/src/cli/report-ready.d.ts +3 -0
  135. package/dist/src/cli/report-ready.js +96 -0
  136. package/dist/src/cli/report-text.d.ts +9 -0
  137. package/dist/src/cli/report-text.js +33 -0
  138. package/dist/src/cli/report.d.ts +1 -0
  139. package/dist/src/cli/report.js +104 -27
  140. package/dist/src/cli/runtime-arguments.d.ts +18 -3
  141. package/dist/src/cli/runtime-arguments.js +29 -20
  142. package/dist/src/cli/schedule-arguments.d.ts +14 -0
  143. package/dist/src/cli/schedule-arguments.js +26 -0
  144. package/dist/src/cli/schedule-render.d.ts +22 -0
  145. package/dist/src/cli/schedule-render.js +73 -0
  146. package/dist/src/cli/terminal-text.d.ts +3 -0
  147. package/dist/src/cli/terminal-text.js +28 -0
  148. package/dist/src/cli/toolchain.d.ts +1 -0
  149. package/dist/src/cli/toolchain.js +1 -0
  150. package/dist/src/cli/usage-render.d.ts +1 -0
  151. package/dist/src/cli/usage-render.js +28 -1
  152. package/dist/src/cli/usage.d.ts +2 -2
  153. package/dist/src/cli/usage.js +89 -11
  154. package/dist/src/cli/watch-actions.js +2 -2
  155. package/dist/src/cli/watch-api-document.d.ts +430 -0
  156. package/dist/src/cli/watch-api-document.js +291 -0
  157. package/dist/src/cli/watch-api-run.d.ts +56 -0
  158. package/dist/src/cli/watch-api-run.js +112 -0
  159. package/dist/src/cli/watch-api.d.ts +17 -0
  160. package/dist/src/cli/watch-api.js +230 -0
  161. package/dist/src/cli/watch-board-view.js +19 -2
  162. package/dist/src/cli/watch-board.d.ts +4 -2
  163. package/dist/src/cli/watch-board.js +53 -43
  164. package/dist/src/cli/watch-card-forms.d.ts +1 -1
  165. package/dist/src/cli/watch-card-forms.js +11 -10
  166. package/dist/src/cli/watch-client.d.ts +1 -1
  167. package/dist/src/cli/watch-client.js +2 -11
  168. package/dist/src/cli/watch-header-view.d.ts +1 -5
  169. package/dist/src/cli/watch-header-view.js +17 -21
  170. package/dist/src/cli/watch-model.d.ts +5 -1
  171. package/dist/src/cli/watch-model.js +20 -11
  172. package/dist/src/cli/watch-page.js +15 -15
  173. package/dist/src/cli/watch-phases.d.ts +12 -3
  174. package/dist/src/cli/watch-phases.js +68 -11
  175. package/dist/src/cli/watch-pr-board.js +1 -1
  176. package/dist/src/cli/watch-pr-command.d.ts +1 -0
  177. package/dist/src/cli/watch-pull-request.js +18 -8
  178. package/dist/src/cli/watch-reads.d.ts +3 -0
  179. package/dist/src/cli/watch-reads.js +22 -20
  180. package/dist/src/cli/watch-render.d.ts +15 -0
  181. package/dist/src/cli/watch-run-input.d.ts +0 -1
  182. package/dist/src/cli/watch-run-input.js +0 -13
  183. package/dist/src/cli/watch-server.js +24 -10
  184. package/dist/src/cli/watch-view.d.ts +0 -3
  185. package/dist/src/cli/watch-view.js +13 -13
  186. package/dist/src/cli.js +73 -12
  187. package/dist/src/command-wait.d.ts +4 -0
  188. package/dist/src/command-wait.js +45 -0
  189. package/dist/src/configuration-change.d.ts +7 -0
  190. package/dist/src/configuration-change.js +14 -0
  191. package/dist/src/configuration-display.js +2 -0
  192. package/dist/src/configuration-schema.d.ts +14 -0
  193. package/dist/src/configuration-schema.js +6 -2
  194. package/dist/src/daemon/attachment-file.d.ts +6 -0
  195. package/dist/src/daemon/attachment-file.js +86 -0
  196. package/dist/src/daemon/attachments.d.ts +14 -0
  197. package/dist/src/daemon/attachments.js +17 -0
  198. package/dist/src/daemon/claude-recovery.d.ts +50 -0
  199. package/dist/src/daemon/claude-recovery.js +208 -0
  200. package/dist/src/daemon/claude-stream.d.ts +27 -0
  201. package/dist/src/daemon/claude-stream.js +63 -0
  202. package/dist/src/daemon/claude-turn.d.ts +11 -25
  203. package/dist/src/daemon/claude-turn.js +64 -81
  204. package/dist/src/daemon/claude-worker.d.ts +5 -4
  205. package/dist/src/daemon/claude-worker.js +127 -126
  206. package/dist/src/daemon/daemon-adapters.d.ts +9 -0
  207. package/dist/src/daemon/daemon-adapters.js +33 -5
  208. package/dist/src/daemon/daemon-loops.d.ts +5 -1
  209. package/dist/src/daemon/daemon-loops.js +18 -10
  210. package/dist/src/daemon/daemon.js +80 -61
  211. package/dist/src/daemon/github-attach.d.ts +2 -0
  212. package/dist/src/daemon/github-attach.js +222 -0
  213. package/dist/src/daemon/github-calls.js +1 -1
  214. package/dist/src/daemon/github-ci-filters.d.ts +6 -0
  215. package/dist/src/daemon/github-ci-filters.js +138 -0
  216. package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
  217. package/dist/src/daemon/github-ci-workflows.js +148 -0
  218. package/dist/src/daemon/github-ci.js +22 -4
  219. package/dist/src/daemon/github-issue-methods.d.ts +2 -0
  220. package/dist/src/daemon/github-issue-methods.js +37 -2
  221. package/dist/src/daemon/github-merge-call.d.ts +2 -1
  222. package/dist/src/daemon/github-merge-call.js +10 -3
  223. package/dist/src/daemon/github-merge.js +52 -24
  224. package/dist/src/daemon/github-methods.js +18 -4
  225. package/dist/src/daemon/github-operation.d.ts +4 -0
  226. package/dist/src/daemon/github-operation.js +6 -0
  227. package/dist/src/daemon/github-worker.d.ts +4 -0
  228. package/dist/src/daemon/github-worker.js +6 -0
  229. package/dist/src/daemon/issue-queue.d.ts +4 -1
  230. package/dist/src/daemon/issue-queue.js +76 -78
  231. package/dist/src/daemon/merge-turns.d.ts +10 -0
  232. package/dist/src/daemon/merge-turns.js +37 -0
  233. package/dist/src/daemon/notify-events.d.ts +6 -0
  234. package/dist/src/daemon/notify-events.js +84 -0
  235. package/dist/src/daemon/notify-journal.js +1 -1
  236. package/dist/src/daemon/notify-message.d.ts +4 -1
  237. package/dist/src/daemon/notify-message.js +36 -0
  238. package/dist/src/daemon/notify.d.ts +1 -1
  239. package/dist/src/daemon/notify.js +5 -77
  240. package/dist/src/daemon/operation-journal.d.ts +1 -0
  241. package/dist/src/daemon/queue-control.d.ts +13 -0
  242. package/dist/src/daemon/queue-control.js +86 -0
  243. package/dist/src/daemon/queue-journal.d.ts +20 -0
  244. package/dist/src/daemon/queue-journal.js +89 -0
  245. package/dist/src/daemon/queue-status.d.ts +9 -3
  246. package/dist/src/daemon/queue-status.js +17 -4
  247. package/dist/src/daemon/record-archive.d.ts +19 -0
  248. package/dist/src/daemon/record-archive.js +82 -0
  249. package/dist/src/daemon/record-sweep.d.ts +24 -0
  250. package/dist/src/daemon/record-sweep.js +147 -0
  251. package/dist/src/daemon/resume-index-lock.d.ts +13 -0
  252. package/dist/src/daemon/resume-index-lock.js +160 -0
  253. package/dist/src/daemon/resume-worktree.d.ts +7 -0
  254. package/dist/src/daemon/resume-worktree.js +29 -0
  255. package/dist/src/daemon/retrying-turn.d.ts +2 -12
  256. package/dist/src/daemon/retrying-turn.js +98 -172
  257. package/dist/src/daemon/schedule-control.d.ts +26 -0
  258. package/dist/src/daemon/schedule-control.js +110 -0
  259. package/dist/src/daemon/schedule-journal.d.ts +2 -15
  260. package/dist/src/daemon/schedule-journal.js +67 -4
  261. package/dist/src/daemon/settings-reload.d.ts +26 -0
  262. package/dist/src/daemon/settings-reload.js +82 -0
  263. package/dist/src/daemon/ticket-registration.d.ts +2 -7
  264. package/dist/src/daemon/ticket-registration.js +15 -81
  265. package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
  266. package/dist/src/daemon/turn-attempt-journal.js +136 -0
  267. package/dist/src/daemon/turn-attempts.d.ts +47 -0
  268. package/dist/src/daemon/turn-attempts.js +166 -0
  269. package/dist/src/daemon/turn-details.d.ts +4 -0
  270. package/dist/src/daemon/turn-details.js +33 -0
  271. package/dist/src/daemon/turn-report.d.ts +8 -1
  272. package/dist/src/daemon/turn-report.js +39 -0
  273. package/dist/src/daemon/work-tree.d.ts +9 -0
  274. package/dist/src/daemon/work-tree.js +20 -0
  275. package/dist/src/daemon/worker-profile.d.ts +9 -0
  276. package/dist/src/daemon/worker-profile.js +44 -0
  277. package/dist/src/daemon/workflow-generations.d.ts +7 -4
  278. package/dist/src/daemon/workflow-generations.js +22 -14
  279. package/dist/src/daemon/workflow-reload.d.ts +41 -0
  280. package/dist/src/daemon/workflow-reload.js +244 -0
  281. package/dist/src/daemon/workflow-replay.d.ts +2 -1
  282. package/dist/src/daemon/workflow-replay.js +7 -3
  283. package/dist/src/daemon/workflow-schedules.d.ts +3 -0
  284. package/dist/src/daemon/workflow-schedules.js +98 -45
  285. package/dist/src/daemon/worktree-processes.d.ts +9 -0
  286. package/dist/src/daemon/worktree-processes.js +151 -0
  287. package/dist/src/doctor-report.d.ts +4 -6
  288. package/dist/src/doctor-report.js +8 -13
  289. package/dist/src/harness-start.d.ts +15 -0
  290. package/dist/src/harness-start.js +37 -0
  291. package/dist/src/host/command-wait.d.ts +38 -0
  292. package/dist/src/host/command-wait.js +115 -0
  293. package/dist/src/host/start-delivery.d.ts +5 -7
  294. package/dist/src/host/start-delivery.js +3 -15
  295. package/dist/src/host/step-bridge-host.d.ts +2 -0
  296. package/dist/src/host/step-bridge-host.js +21 -0
  297. package/dist/src/operation-identity.d.ts +1 -0
  298. package/dist/src/operation-identity.js +4 -0
  299. package/dist/src/private-config.schema.json +71 -0
  300. package/dist/src/project-config.schema.json +40 -0
  301. package/dist/src/project-settings.d.ts +16 -2
  302. package/dist/src/project-settings.js +35 -1
  303. package/dist/src/queue-spend.d.ts +4 -0
  304. package/dist/src/queue-spend.js +21 -0
  305. package/dist/src/queue-state.d.ts +26 -0
  306. package/dist/src/queue-state.js +34 -0
  307. package/dist/src/record-retention.d.ts +46 -0
  308. package/dist/src/record-retention.js +81 -0
  309. package/dist/src/relay/relay-service.d.ts +3 -0
  310. package/dist/src/relay/relay-service.js +5 -3
  311. package/dist/src/report-ci.d.ts +164 -0
  312. package/dist/src/report-ci.js +32 -0
  313. package/dist/src/report-effects.d.ts +15 -0
  314. package/dist/src/report-effects.js +212 -0
  315. package/dist/src/report-flow-types.d.ts +38 -0
  316. package/dist/src/report-flow-types.js +7 -0
  317. package/dist/src/report-flow.d.ts +43 -0
  318. package/dist/src/report-flow.js +193 -0
  319. package/dist/src/report-operator.d.ts +67 -0
  320. package/dist/src/report-operator.js +25 -0
  321. package/dist/src/report-quality.d.ts +221 -0
  322. package/dist/src/report-quality.js +94 -0
  323. package/dist/src/report-ready.d.ts +23 -0
  324. package/dist/src/report-ready.js +117 -0
  325. package/dist/src/report-statistics.d.ts +2 -1
  326. package/dist/src/report-statistics.js +40 -4
  327. package/dist/src/report.d.ts +588 -47
  328. package/dist/src/report.js +156 -41
  329. package/dist/src/schedule-progress.d.ts +33 -0
  330. package/dist/src/schedule-progress.js +45 -0
  331. package/dist/src/service/active-tickets.js +11 -6
  332. package/dist/src/service/command-waits.d.ts +34 -0
  333. package/dist/src/service/command-waits.js +86 -0
  334. package/dist/src/service/dispatcher.d.ts +4 -0
  335. package/dist/src/service/dispatcher.js +33 -0
  336. package/dist/src/service/expiry.js +2 -0
  337. package/dist/src/service/gateway.js +3 -1
  338. package/dist/src/service/queue-handlers.d.ts +4 -0
  339. package/dist/src/service/queue-handlers.js +32 -0
  340. package/dist/src/service/queue-spend.d.ts +6 -0
  341. package/dist/src/service/queue-spend.js +68 -0
  342. package/dist/src/service/registry.d.ts +28 -2
  343. package/dist/src/service/registry.js +48 -0
  344. package/dist/src/service/replies.d.ts +22 -8
  345. package/dist/src/service/replies.js +16 -2
  346. package/dist/src/service/run-handlers.js +37 -12
  347. package/dist/src/service/run-metadata.d.ts +15 -1
  348. package/dist/src/service/run-metadata.js +93 -8
  349. package/dist/src/service/service.d.ts +11 -3
  350. package/dist/src/service/service.js +22 -37
  351. package/dist/src/service/submission-handler.js +18 -4
  352. package/dist/src/service/worker-port.js +9 -1
  353. package/dist/src/service/worker-totals.d.ts +6 -0
  354. package/dist/src/service/worker-totals.js +8 -1
  355. package/dist/src/service/workflow-reload.d.ts +35 -0
  356. package/dist/src/service/workflow-reload.js +52 -0
  357. package/dist/src/step-bridge.d.ts +20 -0
  358. package/dist/src/steps/command-wait.d.ts +12 -0
  359. package/dist/src/steps/command-wait.js +26 -0
  360. package/dist/src/steps/open-decision-wait.d.ts +2 -0
  361. package/dist/src/steps/{decision-gate.js → open-decision-wait.js} +0 -7
  362. package/dist/src/steps/review-by-person.js +4 -1
  363. package/dist/src/steps/wait-for-command.d.ts +3 -0
  364. package/dist/src/steps/wait-for-command.js +17 -0
  365. package/dist/src/steps/wait-for-decision.js +1 -1
  366. package/dist/src/storage/command-wait-rows.d.ts +30 -0
  367. package/dist/src/storage/command-wait-rows.js +96 -0
  368. package/dist/src/storage/decision-snapshots.d.ts +8 -2
  369. package/dist/src/storage/decision-snapshots.js +16 -8
  370. package/dist/src/storage/domain-changes.d.ts +3 -1
  371. package/dist/src/storage/domain-changes.js +4 -0
  372. package/dist/src/storage/domain-schema.d.ts +16 -1
  373. package/dist/src/storage/domain-schema.js +35 -4
  374. package/dist/src/storage/effect-schema.d.ts +2 -0
  375. package/dist/src/storage/effect-schema.js +9 -0
  376. package/dist/src/storage/projection-changes.d.ts +12 -0
  377. package/dist/src/storage/projection-changes.js +194 -0
  378. package/dist/src/storage/projection-lookups.d.ts +7 -0
  379. package/dist/src/storage/projection-lookups.js +30 -0
  380. package/dist/src/testing-requests.d.ts +15 -0
  381. package/dist/src/testing-requests.js +93 -0
  382. package/dist/src/testing.d.ts +4 -10
  383. package/dist/src/testing.js +33 -86
  384. package/dist/src/worker-usage.d.ts +1 -0
  385. package/dist/src/worker-usage.js +3 -0
  386. package/dist/src/workflow-candidate.d.ts +1 -0
  387. package/dist/src/workflow-candidate.js +12 -1
  388. package/dist/src/workflow-contracts.d.ts +1 -0
  389. package/dist/src/workflow-contracts.js +9 -2
  390. package/dist/src/workflow-declaration.d.ts +1 -0
  391. package/dist/src/workflow-declaration.js +3 -0
  392. package/dist/src/workflow-discovery.d.ts +2 -13
  393. package/dist/src/workflow-discovery.js +1 -13
  394. package/dist/src/workflow-refusals.js +0 -1
  395. package/dist/src/workflows.d.ts +1 -1
  396. package/dist/src/workflows.js +1 -1
  397. package/dist/tools/compile-workflows.js +3 -0
  398. package/dist/tools/project-configuration.d.ts +7 -2
  399. package/dist/tools/project-configuration.js +30 -1
  400. package/dist/tools/red-green-command.d.ts +1 -0
  401. package/dist/tools/red-green-command.js +174 -0
  402. package/dist/tools/red-green-process.d.ts +10 -0
  403. package/dist/tools/red-green-process.js +59 -0
  404. package/dist/tools/self-host-processes.d.ts +2 -0
  405. package/dist/tools/self-host-processes.js +69 -26
  406. package/dist/tools/self-host-project.d.ts +2 -0
  407. package/dist/tools/self-host-project.js +30 -77
  408. package/dist/tools/self-host-runtime.js +1 -1
  409. package/dist/tools/self-host.js +76 -34
  410. package/dist/tools/template-command.d.ts +1 -0
  411. package/dist/tools/template-command.js +160 -0
  412. package/dist/tools/template-copy.d.ts +11 -0
  413. package/dist/tools/template-copy.js +130 -0
  414. package/dist/tools/template-files.d.ts +17 -0
  415. package/dist/tools/template-files.js +74 -0
  416. package/dist/tools/workflow-bundles.js +1 -0
  417. package/dist/tools/workflow-candidate-counts.js +2 -2
  418. package/dist/tools/workflow-candidate-program.d.ts +4 -2
  419. package/dist/tools/workflow-candidate-program.js +30 -11
  420. package/dist/tools/workflow-candidate-shape.d.ts +3 -0
  421. package/dist/tools/workflow-candidate-shape.js +90 -0
  422. package/dist/tools/workflow-candidate-source.d.ts +1 -0
  423. package/dist/tools/workflow-candidate-source.js +26 -4
  424. package/dist/tools/workflow-candidate-syntax.d.ts +2 -2
  425. package/dist/tools/workflow-candidate-syntax.js +24 -94
  426. package/dist/tools/workflow-command.js +1 -2
  427. package/dist/tools/workflow-folders.d.ts +2 -3
  428. package/dist/tools/workflow-folders.js +1 -1
  429. package/package.json +17 -9
  430. package/templates/develop/README.md +93 -4
  431. package/templates/develop/develop/flow-tests.ts +38 -1
  432. package/templates/develop/develop/interruption-tests.ts +157 -0
  433. package/templates/develop/develop/local.ts +1 -0
  434. package/templates/develop/develop/option-tests.ts +138 -9
  435. package/templates/develop/develop/pull.ts +5 -1
  436. package/templates/develop/develop/red-green.ts +55 -0
  437. package/templates/develop/develop/refusal-tests.ts +77 -0
  438. package/templates/develop/develop/report.ts +31 -11
  439. package/templates/develop/develop/round.ts +1 -0
  440. package/templates/develop/develop/scenarios.ts +27 -0
  441. package/templates/develop/develop/turn.ts +28 -7
  442. package/templates/develop/develop.declaration.json +1 -1
  443. package/templates/develop/develop.test.ts +4 -0
  444. package/templates/develop/template.json +29 -2
  445. package/templates/idea-to-issue/README.md +27 -0
  446. package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
  447. package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
  448. package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
  449. package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
  450. package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
  451. package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
  452. package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
  453. package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
  454. package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
  455. package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
  456. package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
  457. package/templates/idea-to-issue/idea-to-issue.ts +49 -0
  458. package/templates/idea-to-issue/template.json +81 -0
  459. package/templates/review-day/README.md +97 -0
  460. package/templates/review-day/review-day/critique.ts +58 -0
  461. package/templates/review-day/review-day/decision.ts +29 -0
  462. package/templates/review-day/review-day/facts.ts +69 -0
  463. package/templates/review-day/review-day/label.ts +29 -0
  464. package/templates/review-day/review-day/next.ts +28 -0
  465. package/templates/review-day/review-day/post.ts +27 -0
  466. package/templates/review-day/review-day/report.ts +98 -0
  467. package/templates/review-day/review-day/rules.ts +12 -0
  468. package/templates/review-day/review-day/scenarios.ts +76 -0
  469. package/templates/review-day/review-day/turn.ts +73 -0
  470. package/templates/review-day/review-day.declaration.json +16 -0
  471. package/templates/review-day/review-day.test.ts +362 -0
  472. package/templates/review-day/review-day.ts +37 -0
  473. package/templates/review-day/template.json +56 -0
  474. package/dist/src/cli/watch-start-view.d.ts +0 -18
  475. package/dist/src/cli/watch-start-view.js +0 -77
  476. package/dist/src/steps/decision-gate.d.ts +0 -3
  477. package/dist/workflows/develop-prd.d.ts +0 -7
  478. package/dist/workflows/develop-prd.js +0 -165
  479. package/dist/workflows/develop-ticket.d.ts +0 -9
  480. package/dist/workflows/develop-ticket.js +0 -207
  481. package/dist/workflows/issue-labels.d.ts +0 -16
  482. package/dist/workflows/issue-labels.js +0 -70
  483. package/dist/workflows/ticket-prompts.d.ts +0 -35
  484. package/dist/workflows/ticket-prompts.js +0 -147
@@ -0,0 +1,86 @@
1
+ import { commandWaitKey, } from "../authority/command-waits.js";
2
+ import { operationPhase } from "../operation-identity.js";
3
+ import { documentDigest } from "./decision-restore.js";
4
+ import { readExecutionManifest } from "../execution-pin.js";
5
+ import { text } from "../storage/domain-rows.js";
6
+ import { commandWaitStatements, loadCommandWaits, } from "../storage/command-wait-rows.js";
7
+ import { checkedVersion, waitingVersion, upgradeSchema, } from "../storage/domain-schema.js";
8
+ export function commandWaitRows(waits) {
9
+ return Object.values(waits).sort((left, right) => {
10
+ if (left.runId !== right.runId)
11
+ return left.runId < right.runId ? -1 : 1;
12
+ return left.name < right.name ? -1 : 1;
13
+ });
14
+ }
15
+ export function commandWaitState(rows) {
16
+ const waits = {};
17
+ for (const row of rows) {
18
+ const state = [
19
+ "waiting",
20
+ "timed-out",
21
+ "cancelled",
22
+ "completed",
23
+ "failed",
24
+ ];
25
+ const kind = state.find((candidate) => candidate === row.state);
26
+ if (kind === undefined)
27
+ throw new Error("invalid-command-wait-state");
28
+ waits[commandWaitKey(row.runId, row.name)] = { ...row, state: kind };
29
+ }
30
+ return rows.length === 0 ? {} : { commandWaits: waits };
31
+ }
32
+ export async function readCommandWaits(connection, runId) {
33
+ return commandWaitState(await loadCommandWaits(connection, { runId }));
34
+ }
35
+ export async function upgradeCommandWaits(database, state) {
36
+ await database.transaction(async (connection) => {
37
+ await upgradeSchema(connection, waitingVersion);
38
+ for (const statement of commandWaitStatements(commandWaitRows(state.commandWaits ?? {}), { version: "opened" }))
39
+ await connection.run(statement.sql, statement.parameters);
40
+ });
41
+ }
42
+ export async function upgradeCommandWaitChecks(database) {
43
+ await database.transaction(async (connection) => {
44
+ await upgradeSchema(connection, checkedVersion);
45
+ });
46
+ }
47
+ export function commandWaitDeadline(waits, operationId) {
48
+ const wait = Object.values(waits).find((wait) => wait.checkOperation === operationId);
49
+ return wait === undefined
50
+ ? {}
51
+ : { commandDeadline: new Date(wait.deadline).toISOString() };
52
+ }
53
+ export async function dispatchCommandWait(connection, check) {
54
+ if (operationPhase(check.operationId) !== "command-wait")
55
+ return {};
56
+ const state = await readCommandWaits(connection, check.runId);
57
+ const wait = Object.values(state.commandWaits ?? {}).find((wait) => wait.checkOperation === check.operationId);
58
+ if (wait === undefined)
59
+ return {};
60
+ const row = await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [check.workflow]);
61
+ const declarations = readExecutionManifest(JSON.parse(text(row, "manifest"))).commandWaits ?? {};
62
+ const permission = Object.hasOwn(declarations, wait.name)
63
+ ? declarations[wait.name]
64
+ : undefined;
65
+ return { commandWait: { wait, declared: declaredWait(wait, permission) } };
66
+ }
67
+ function declaredWait(wait, permission) {
68
+ return (permission !== undefined &&
69
+ permission.command === wait.command &&
70
+ permission.maximumWaitSeconds === wait.maximumWaitSeconds &&
71
+ permission.pollEverySeconds === wait.pollEverySeconds);
72
+ }
73
+ export function commandOutputsIntact(events) {
74
+ return events.every((event) => {
75
+ const output = event.payload["commandOutput"];
76
+ return (output === undefined ||
77
+ (event.payload["worker"] === "command" &&
78
+ documentDigest(output) === event.payload["result"]));
79
+ });
80
+ }
81
+ export async function readCommandWaitDeadline(connection, scope) {
82
+ if (operationPhase(scope.operationId) !== "command-wait")
83
+ return {};
84
+ const state = await readCommandWaits(connection, scope.runId);
85
+ return commandWaitDeadline(state.commandWaits ?? {}, scope.operationId);
86
+ }
@@ -2,7 +2,7 @@ import type { RunDetails } from "../authority/details.ts";
2
2
  import { type GateState } from "../authority/gates.ts";
3
3
  import type { AuthorityState } from "../authority/reducer.ts";
4
4
  import type { DecisionRows, DetailRow, DocumentRow, GateRow } from "../storage/decision-rows.ts";
5
- export type DecisionState = Pick<AuthorityState, "gates" | "details" | "questions">;
5
+ export type DecisionState = Pick<AuthorityState, "gates" | "details" | "questions" | "commandWaits">;
6
6
  export declare function documentDigest(body: string): string;
7
7
  export declare function gateRecord(gate: GateState): GateRow;
8
8
  export declare function detailRecord(details: RunDetails): DetailRow;
@@ -141,6 +141,7 @@ export function decisionRows(state) {
141
141
  }
142
142
  export function referencedDigests(state) {
143
143
  return [
144
+ ...Object.values(state.commandWaits ?? {}).map((wait) => wait.inputDigest),
144
145
  ...Object.values(state.gates).flatMap((gate) => [
145
146
  gate.prompt,
146
147
  gate.outcome?.answer ?? null,
@@ -1,3 +1,6 @@
1
1
  import type { Database } from "solid-objects";
2
2
  import type { AuthorityState } from "../authority/reducer.ts";
3
3
  export declare function upgradeEffects(database: Database, state: AuthorityState): Promise<void>;
4
+ export declare function upgradeSpendingIndexes(database: Database): Promise<void>;
5
+ export declare function upgradeEventIndexes(database: Database): Promise<void>;
6
+ export declare function upgradeRunIndexes(database: Database): Promise<void>;
@@ -1,9 +1,18 @@
1
- import { currentVersion, upgradeSchema } from "../storage/domain-schema.js";
1
+ import { currentVersion, effectedVersion, eventIndexVersion, spendingVersion, upgradeSchema, } from "../storage/domain-schema.js";
2
2
  import { persistEffects } from "../storage/effect-changes.js";
3
3
  import { effectRows } from "./effect-restore.js";
4
4
  export async function upgradeEffects(database, state) {
5
5
  await database.transaction(async (connection) => {
6
- await upgradeSchema(connection, currentVersion);
6
+ await upgradeSchema(connection, effectedVersion);
7
7
  await persistEffects(connection, effectRows(state.effects, []));
8
8
  });
9
9
  }
10
+ export async function upgradeSpendingIndexes(database) {
11
+ await database.transaction((connection) => upgradeSchema(connection, spendingVersion));
12
+ }
13
+ export async function upgradeEventIndexes(database) {
14
+ await database.transaction((connection) => upgradeSchema(connection, eventIndexVersion));
15
+ }
16
+ export async function upgradeRunIndexes(database) {
17
+ await database.transaction((connection) => upgradeSchema(connection, currentVersion));
18
+ }
@@ -9,6 +9,19 @@ export type Invocation = {
9
9
  readonly kind: "help";
10
10
  } | {
11
11
  readonly kind: "version";
12
+ } | {
13
+ readonly kind: "mcp";
14
+ } | {
15
+ readonly kind: "mcp-help";
16
+ } | {
17
+ readonly kind: "init-prompt";
18
+ } | {
19
+ readonly kind: "init";
20
+ readonly harness: string | undefined;
21
+ } | {
22
+ readonly kind: "init-prompt-help";
23
+ } | {
24
+ readonly kind: "init-help";
12
25
  } | {
13
26
  readonly kind: "doctor-help";
14
27
  } | {
@@ -12,6 +12,7 @@ const options = {
12
12
  version: { type: "boolean", short: "v" },
13
13
  input: { type: "string" },
14
14
  json: { type: "boolean" },
15
+ active: { type: "boolean" },
15
16
  prompt: { type: "string" },
16
17
  ticket: { type: "string" },
17
18
  next: { type: "boolean" },
@@ -26,6 +27,7 @@ const options = {
26
27
  follow: { type: "boolean" },
27
28
  since: { type: "string" },
28
29
  repository: { type: "string" },
30
+ harness: { type: "string" },
29
31
  };
30
32
  const textOptions = ["--prompt", "--text"];
31
33
  function knownFlag(token) {
@@ -83,8 +85,9 @@ function selectedInvocation(given) {
83
85
  const [command, ...remaining] = positionals;
84
86
  if (command === undefined)
85
87
  return topLevel(values);
86
- if (command === "doctor")
87
- return doctorInvocation(values, remaining);
88
+ const inspection = inspectionInvocation(command, { values, remaining });
89
+ if (inspection !== undefined)
90
+ return inspection;
88
91
  if (command === "workflows" && remaining[0] === "validate")
89
92
  return validation(values, remaining.slice(1));
90
93
  const outcome = runtimeInvocation({
@@ -96,6 +99,43 @@ function selectedInvocation(given) {
96
99
  return { kind: "usage-error", code: outcome, json };
97
100
  return outcome;
98
101
  }
102
+ function inspectionInvocation(command, input) {
103
+ const { values, remaining } = input;
104
+ if (command === "init") {
105
+ if (unexpected(values, ["harness", "help"]))
106
+ return { kind: "usage-error", code: "unexpected-option", json: false };
107
+ if (remaining.length > 0)
108
+ return { kind: "usage-error", code: "unexpected-argument", json: false };
109
+ return values.help
110
+ ? { kind: "init-help" }
111
+ : { kind: "init", harness: values.harness };
112
+ }
113
+ if (command === "doctor")
114
+ return doctorInvocation(values, remaining);
115
+ if (command === "mcp")
116
+ return mcpInvocation(values, remaining);
117
+ if (command === "init-prompt")
118
+ return promptInvocation(values, remaining);
119
+ return undefined;
120
+ }
121
+ function mcpInvocation(values, remaining) {
122
+ if (unexpected(values, ["help"]))
123
+ return { kind: "usage-error", code: "unexpected-option", json: false };
124
+ if (remaining.length > 0)
125
+ return { kind: "usage-error", code: "unexpected-argument", json: false };
126
+ return { kind: values.help ? "mcp-help" : "mcp" };
127
+ }
128
+ function promptInvocation(values, remaining) {
129
+ if (unexpected(values, ["help"]))
130
+ return {
131
+ kind: "usage-error",
132
+ code: "unexpected-option",
133
+ json: values.json === true,
134
+ };
135
+ if (remaining.length > 0)
136
+ return { kind: "usage-error", code: "unexpected-argument", json: false };
137
+ return { kind: values.help ? "init-prompt-help" : "init-prompt" };
138
+ }
99
139
  function doctorInvocation(values, remaining) {
100
140
  const json = values.json === true;
101
141
  if (unexpected(values, ["help", "json"]))
@@ -134,7 +174,7 @@ function knownCommand(positionals) {
134
174
  return true;
135
175
  if (command === "workflows")
136
176
  return subcommand === "validate";
137
- if (command === "doctor")
177
+ if (["doctor", "init-prompt", "init", "mcp"].includes(command))
138
178
  return true;
139
179
  return isRuntimeCommand(command);
140
180
  }
@@ -0,0 +1,2 @@
1
+ import type { ChatStore } from "./init-prompt.ts";
2
+ export declare function chatStores(home: string | undefined): Promise<readonly ChatStore[]>;
@@ -0,0 +1,113 @@
1
+ import { lstat, opendir } from "node:fs/promises";
2
+ import { isAbsolute, join } from "node:path";
3
+ const knownStores = [
4
+ {
5
+ name: "Claude Code",
6
+ folder: ".claude/projects",
7
+ format: "JSONL",
8
+ documentation: "https://code.claude.com/docs/en/claude-directory",
9
+ },
10
+ {
11
+ name: "Codex",
12
+ folder: ".codex/sessions",
13
+ format: "JSONL, including zstd-compressed .jsonl.zst (read with zstd -dc)",
14
+ documentation: "https://learn.chatgpt.com/docs/security/sdk",
15
+ },
16
+ {
17
+ name: "Gemini CLI",
18
+ folder: ".gemini",
19
+ format: "JSON conversation history and checkpoints under tmp/<project>/",
20
+ documentation: "https://geminicli.com/docs/cli/checkpointing/",
21
+ },
22
+ {
23
+ name: "opencode",
24
+ folder: ".local/share/opencode",
25
+ format: "SQLite (opencode.db); older versions use JSON files under storage/",
26
+ documentation: "https://docs.opencode.ai/docs/troubleshooting/",
27
+ },
28
+ {
29
+ name: "grok",
30
+ folder: ".grok",
31
+ format: "JSONL ACP events in sessions/<encoded-cwd>/<session-id>/updates.jsonl; raw messages in chat_history.jsonl; JSON metadata",
32
+ documentation: "https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/17-sessions.md",
33
+ },
34
+ {
35
+ name: "Cursor Agent",
36
+ folder: ".cursor",
37
+ format: "JSONL under projects/<project>/agent-transcripts/ (older transcripts may be text)",
38
+ documentation: "https://forum.cursor.com/t/accessing-the-full-agent-transcript-in-cursor/157311/5",
39
+ },
40
+ ];
41
+ async function metadata(path) {
42
+ return lstat(path).catch((error) => {
43
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
44
+ return null;
45
+ throw error;
46
+ });
47
+ }
48
+ async function* storeFiles(path) {
49
+ const pending = [path];
50
+ for (let folder = pending.pop(); folder !== undefined; folder = pending.pop()) {
51
+ const directory = await opendir(folder);
52
+ for await (const entry of directory) {
53
+ const file = join(folder, entry.name);
54
+ if (entry.isDirectory())
55
+ pending.push(file);
56
+ if (!entry.isFile())
57
+ continue;
58
+ const info = await metadata(file);
59
+ if (info?.isFile())
60
+ yield info;
61
+ }
62
+ }
63
+ }
64
+ async function measure(path) {
65
+ let fileCount = 0;
66
+ let totalBytes = 0;
67
+ let oldest = null;
68
+ let newest = null;
69
+ for await (const info of storeFiles(path)) {
70
+ fileCount += 1;
71
+ totalBytes += info.size;
72
+ oldest = Math.min(oldest ?? info.mtimeMs, info.mtimeMs);
73
+ newest = Math.max(newest ?? info.mtimeMs, info.mtimeMs);
74
+ }
75
+ return {
76
+ fileCount,
77
+ totalBytes,
78
+ oldestFileDate: oldest === null ? null : new Date(oldest).toISOString(),
79
+ newestFileDate: newest === null ? null : new Date(newest).toISOString(),
80
+ };
81
+ }
82
+ async function inspectStore(path) {
83
+ try {
84
+ if (!(await metadata(path))?.isDirectory())
85
+ return null;
86
+ return await measure(path);
87
+ }
88
+ catch (error) {
89
+ return {
90
+ unavailable: error instanceof Error &&
91
+ "code" in error &&
92
+ typeof error.code === "string"
93
+ ? error.code
94
+ : "scan-failed",
95
+ fileCount: null,
96
+ totalBytes: null,
97
+ oldestFileDate: null,
98
+ newestFileDate: null,
99
+ };
100
+ }
101
+ }
102
+ export async function chatStores(home) {
103
+ if (!home || !isAbsolute(home))
104
+ return [];
105
+ const stores = [];
106
+ for (const { folder, ...store } of knownStores) {
107
+ const path = join(home, folder);
108
+ const facts = await inspectStore(path);
109
+ if (facts)
110
+ stores.push({ ...store, path, ...facts });
111
+ }
112
+ return stores;
113
+ }
@@ -3,8 +3,13 @@ export interface Interruption {
3
3
  readonly signal: Promise<void>;
4
4
  readonly reply: Reply;
5
5
  }
6
- export declare function send(runtimeDirectory: string, request: ServiceRequest): Promise<Reply>;
7
- export declare function listRuns(runtimeDirectory: string): Promise<Reply>;
6
+ export interface ClientRequest extends ServiceRequest {
7
+ readonly signal?: AbortSignal;
8
+ }
9
+ export declare function send(runtimeDirectory: string, input: ClientRequest): Promise<Reply>;
10
+ export declare function listRuns(runtimeDirectory: string, selection?: {
11
+ readonly active?: true;
12
+ }): Promise<Reply>;
8
13
  export declare function mutate(runtimeDirectory: string, mutation: {
9
14
  readonly request: ServiceRequest;
10
15
  readonly signal: Promise<void>;
@@ -2,7 +2,7 @@ import net from "node:net";
2
2
  import { join } from "node:path";
3
3
  import { socketAddress } from "../broker/socket-address.js";
4
4
  import { parseReplyLine, record, requestLine, } from "../protocol.js";
5
- const mutations = ["run", "decision", "run-command"];
5
+ const mutations = ["run", "decision", "run-command", "queue-command"];
6
6
  function unavailable(runtimeDirectory) {
7
7
  return {
8
8
  kind: "error",
@@ -41,7 +41,7 @@ function exchange(context) {
41
41
  error: { code: address.reason, detail: address.detail },
42
42
  });
43
43
  return new Promise((settle) => {
44
- const socket = net.connect(address.path);
44
+ const socket = net.connect({ path: address.path, signal: context.signal });
45
45
  let buffered = "";
46
46
  let written = false;
47
47
  socket.setEncoding("utf8");
@@ -86,8 +86,14 @@ function exchange(context) {
86
86
  });
87
87
  }
88
88
  const unobserved = () => undefined;
89
- export function send(runtimeDirectory, request) {
90
- return exchange({ runtimeDirectory, request, onEvent: unobserved });
89
+ export function send(runtimeDirectory, input) {
90
+ const { signal, ...request } = input;
91
+ return exchange({
92
+ runtimeDirectory,
93
+ request,
94
+ onEvent: unobserved,
95
+ ...(signal === undefined ? {} : { signal }),
96
+ });
91
97
  }
92
98
  function listedRuns(result) {
93
99
  const runs = result["runs"];
@@ -95,10 +101,10 @@ function listedRuns(result) {
95
101
  ? runs.map(record).filter((run) => run !== undefined)
96
102
  : [];
97
103
  }
98
- export async function listRuns(runtimeDirectory) {
104
+ export async function listRuns(runtimeDirectory, selection = {}) {
99
105
  const first = await send(runtimeDirectory, {
100
106
  operation: "status",
101
- parameters: { limit: 500 },
107
+ parameters: { ...selection, limit: 500 },
102
108
  });
103
109
  if (first.kind === "error")
104
110
  return first;
@@ -117,7 +123,7 @@ export async function listRuns(runtimeDirectory) {
117
123
  after = next;
118
124
  const page = await send(runtimeDirectory, {
119
125
  operation: "status",
120
- parameters: { limit: 500, after },
126
+ parameters: { ...selection, limit: 500, after },
121
127
  });
122
128
  if (page.kind === "error")
123
129
  return page;
@@ -0,0 +1,46 @@
1
+ import { type Fields, type Reply, type ServiceError, type ServiceRequest } from "../protocol.ts";
2
+ import { type ClientRequest } from "./client.ts";
3
+ import type { DecisionCommand, RunCommand, RunSource } from "./runtime-arguments.ts";
4
+ export interface ReadCommand {
5
+ readonly kind: "status" | "questions" | "events" | "reload";
6
+ readonly runId?: string | null;
7
+ readonly limit?: number | null;
8
+ readonly after?: string | number | null;
9
+ readonly active?: boolean;
10
+ readonly follow?: boolean;
11
+ }
12
+ export type SubmittedSource = Exclude<RunSource, {
13
+ readonly kind: "input";
14
+ }> | {
15
+ readonly kind: "input";
16
+ readonly submission: Fields;
17
+ };
18
+ export declare function runRequest(run: {
19
+ readonly workflowId: string;
20
+ readonly source: SubmittedSource;
21
+ readonly commandId: string;
22
+ }): ServiceRequest;
23
+ export interface DecisionRequest {
24
+ readonly command: DecisionCommand;
25
+ readonly reference: string;
26
+ readonly text: string | null;
27
+ readonly expectedRevision: number;
28
+ readonly generation: number;
29
+ readonly subjectDigest: string;
30
+ readonly commandId: string;
31
+ }
32
+ export declare function decisionRequest(decision: DecisionRequest): ServiceRequest;
33
+ export declare function runCommandRequest(request: {
34
+ readonly command: RunCommand;
35
+ readonly runId: string;
36
+ readonly expectedRevision: number;
37
+ readonly commandId: string;
38
+ }): ServiceRequest;
39
+ export declare function readCommandRequest(command: ReadCommand): ServiceRequest;
40
+ export declare function readCommandReply(runtimeDirectory: string, request: ClientRequest): Promise<Reply>;
41
+ export declare function errorObject(error: ServiceError, format?: {
42
+ readonly commandId?: string;
43
+ }): Fields;
44
+ export declare function commandJson(reply: Reply, format?: {
45
+ readonly commandId?: string;
46
+ }): Fields;
@@ -0,0 +1,84 @@
1
+ import {} from "../protocol.js";
2
+ import { send } from "./client.js";
3
+ import { withCiReruns } from "./github-ci-progress.js";
4
+ import { statusJson } from "./render.js";
5
+ function submission(source) {
6
+ if (source.kind === "input")
7
+ return source.submission;
8
+ return source.kind === "prompt"
9
+ ? { prompt: source.text }
10
+ : { ticket: source.id };
11
+ }
12
+ export function runRequest(run) {
13
+ return {
14
+ operation: "run",
15
+ parameters: {
16
+ workflowId: run.workflowId,
17
+ source: run.source.kind,
18
+ submission: submission(run.source),
19
+ commandId: run.commandId,
20
+ },
21
+ };
22
+ }
23
+ export function decisionRequest(decision) {
24
+ return {
25
+ operation: "decision",
26
+ parameters: Object.fromEntries(Object.entries(decision).filter(([, value]) => value !== null)),
27
+ };
28
+ }
29
+ export function runCommandRequest(request) {
30
+ return {
31
+ operation: "run-command",
32
+ parameters: {
33
+ command: request.command,
34
+ runId: request.runId,
35
+ expectedRevision: request.expectedRevision,
36
+ commandId: request.commandId,
37
+ },
38
+ };
39
+ }
40
+ export function readCommandRequest(command) {
41
+ const { kind, runId, limit, after, active, follow } = command;
42
+ const parameters = kind === "questions"
43
+ ? { runId }
44
+ : {
45
+ runId,
46
+ limit,
47
+ after,
48
+ ...(active === true ? { active } : {}),
49
+ ...(follow === undefined ? {} : { follow }),
50
+ };
51
+ return {
52
+ operation: kind,
53
+ parameters: Object.fromEntries(Object.entries(parameters).filter(([, value]) => value !== null && value !== undefined)),
54
+ };
55
+ }
56
+ export async function readCommandReply(runtimeDirectory, request) {
57
+ const reply = await send(runtimeDirectory, request);
58
+ return request.operation === "status"
59
+ ? await withCiReruns(runtimeDirectory, reply)
60
+ : reply;
61
+ }
62
+ export function errorObject(error, format = {}) {
63
+ if (error.code === "event-gap")
64
+ return {
65
+ schemaVersion: 1,
66
+ kind: "event-gap",
67
+ after: error["after"],
68
+ earliestAvailable: error["earliestAvailable"],
69
+ latestSequence: error["latestSequence"],
70
+ };
71
+ return {
72
+ schemaVersion: 1,
73
+ kind: "error",
74
+ ...error,
75
+ commandId: error["commandId"] ?? format.commandId ?? null,
76
+ runId: error["runId"] ?? null,
77
+ currentRevision: error["currentRevision"] ?? null,
78
+ };
79
+ }
80
+ export function commandJson(reply, format = {}) {
81
+ return reply.kind === "error"
82
+ ? errorObject(reply.error, format)
83
+ : statusJson(reply.result);
84
+ }
@@ -0,0 +1,9 @@
1
+ import { type Shown } from "./watch-element.ts";
2
+ import type { CommandWaitView } from "../authority/command-wait-view.ts";
3
+ export declare function shownCommandWaits(value: unknown): readonly CommandWaitView[];
4
+ export declare function commandWaitText(wait: CommandWaitView): string;
5
+ export declare function CommandWaits(props: {
6
+ readonly waits: readonly CommandWaitView[];
7
+ }): Shown;
8
+ export declare function effectBudgetText(spent: number | null | undefined, limit: number | null | undefined): string;
9
+ export declare function activeCommandWait(waits: readonly CommandWaitView[]): boolean;
@@ -0,0 +1,51 @@
1
+ import { element } from "./watch-element.js";
2
+ import { record } from "../protocol.js";
3
+ function waitTime(value) {
4
+ return typeof value === "string" ? value : null;
5
+ }
6
+ export function shownCommandWaits(value) {
7
+ if (!Array.isArray(value))
8
+ return [];
9
+ return value.flatMap((entry) => {
10
+ const fields = record(entry);
11
+ if (typeof fields?.["name"] !== "string" ||
12
+ typeof fields["command"] !== "string" ||
13
+ typeof fields["state"] !== "string" ||
14
+ typeof fields["maximumWaitSeconds"] !== "number" ||
15
+ typeof fields["remainingSeconds"] !== "number" ||
16
+ typeof fields["checkCount"] !== "number")
17
+ return [];
18
+ return [
19
+ {
20
+ name: fields["name"],
21
+ command: fields["command"],
22
+ state: fields["state"],
23
+ maximumWaitSeconds: fields["maximumWaitSeconds"],
24
+ remainingSeconds: fields["remainingSeconds"],
25
+ checkCount: fields["checkCount"],
26
+ startedAt: waitTime(fields["startedAt"]),
27
+ deadline: waitTime(fields["deadline"]),
28
+ nextCheckAt: waitTime(fields["nextCheckAt"]),
29
+ reason: waitTime(fields["reason"]),
30
+ },
31
+ ];
32
+ });
33
+ }
34
+ export function commandWaitText(wait) {
35
+ const reason = wait.reason === null ? "" : ` · ${wait.reason}`;
36
+ return `Command wait ${wait.name} · ${wait.command} · ${wait.state} · ${String(wait.remainingSeconds)} s left · deadline ${wait.deadline ?? "none"} · next check ${wait.nextCheckAt ?? "none"} · checks ${String(wait.checkCount)}${reason}`;
37
+ }
38
+ export function CommandWaits(props) {
39
+ return props.waits.map((wait) => element("p", {
40
+ class: "meta command-wait",
41
+ children: commandWaitText(wait),
42
+ }));
43
+ }
44
+ export function effectBudgetText(spent, limit) {
45
+ return spent == null || limit == null
46
+ ? ""
47
+ : `${String(spent)} of ${String(limit)} effect units`;
48
+ }
49
+ export function activeCommandWait(waits) {
50
+ return waits.some((wait) => wait.state === "waiting");
51
+ }