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,242 @@
1
+ import { isRecordKey } from "../authority/commands.js";
2
+ import { record, } from "../protocol.js";
3
+ import { mutate } from "./client.js";
4
+ import { commandJson, decisionRequest, readCommandReply, readCommandRequest, runCommandRequest, runRequest, } from "./command-requests.js";
5
+ import { argumentRules, } from "./runtime-arguments.js";
6
+ const identifierSchema = {
7
+ type: "string",
8
+ minLength: 1,
9
+ maxLength: 128,
10
+ pattern: "^[A-Za-z0-9._:/-]+$",
11
+ };
12
+ function matching(pattern, schema) {
13
+ return {
14
+ schema,
15
+ valid: (value) => typeof value === "string" && pattern.test(value),
16
+ };
17
+ }
18
+ function whole(range) {
19
+ return {
20
+ schema: { type: "integer", ...range },
21
+ valid: (value) => typeof value === "number" &&
22
+ Number.isSafeInteger(value) &&
23
+ value >= range.minimum &&
24
+ value <= range.maximum,
25
+ };
26
+ }
27
+ const key = { schema: identifierSchema, valid: isRecordKey };
28
+ const identifier = matching(argumentRules.identifier, identifierSchema);
29
+ const reference = matching(argumentRules.decisionReference, {
30
+ ...identifierSchema,
31
+ maxLength: 256,
32
+ });
33
+ const digest = matching(argumentRules.sha256Digest, {
34
+ type: "string",
35
+ pattern: "^sha256:[0-9a-f]{64}$",
36
+ });
37
+ const revision = whole(argumentRules.revisions);
38
+ const words = matching(/\S/, { type: "string", pattern: "\\S" });
39
+ const limit = whole({ minimum: 1, maximum: 500 });
40
+ const object = {
41
+ schema: { type: "object" },
42
+ valid: (value) => record(value) !== undefined,
43
+ };
44
+ function commandInput(kind, values) {
45
+ const { runId, limit, after } = values;
46
+ return {
47
+ kind,
48
+ ...(typeof runId === "string" ? { runId } : {}),
49
+ ...(typeof limit === "number" ? { limit } : {}),
50
+ ...(typeof after === "string" || typeof after === "number"
51
+ ? { after }
52
+ : {}),
53
+ };
54
+ }
55
+ function read(kind, properties) {
56
+ return {
57
+ name: `cloving_${kind}`,
58
+ arguments: properties,
59
+ required: [],
60
+ annotations: { readOnlyHint: true },
61
+ call: (values) => ({
62
+ kind: "read",
63
+ request: readCommandRequest(commandInput(kind, values)),
64
+ }),
65
+ };
66
+ }
67
+ const mutation = { readOnlyHint: false, idempotentHint: true };
68
+ const repeat = "If the reply is lost, send the same commandId again.";
69
+ const decisionDescriptions = {
70
+ answer: "Answer an open question.",
71
+ approve: "Approve an open approval.",
72
+ deny: "Deny an open approval. A feedback text is optional.",
73
+ };
74
+ const runCommandDescriptions = {
75
+ pause: "Pause a run.",
76
+ resume: "Resume a paused run.",
77
+ drop: "Drop a run. A dropped run does not continue.",
78
+ };
79
+ function mutationCall(values, request) {
80
+ const commandId = String(values["commandId"]);
81
+ return { kind: "mutation", commandId, request: request(commandId) };
82
+ }
83
+ function decisionCall(command, values) {
84
+ const { text } = values;
85
+ return mutationCall(values, (commandId) => decisionRequest({
86
+ command,
87
+ reference: String(values["reference"]),
88
+ text: typeof text === "string" ? text : null,
89
+ expectedRevision: Number(values["expectedRevision"]),
90
+ generation: Number(values["generation"]),
91
+ subjectDigest: String(values["subjectDigest"]),
92
+ commandId,
93
+ }));
94
+ }
95
+ function decision(command) {
96
+ const binding = {
97
+ expectedRevision: revision,
98
+ generation: revision,
99
+ subjectDigest: digest,
100
+ commandId: key,
101
+ };
102
+ return {
103
+ name: `cloving_${command}`,
104
+ description: `${decisionDescriptions[command]} Read the values from cloving_questions. ${repeat}`,
105
+ arguments: {
106
+ reference,
107
+ ...(command === "approve" ? {} : { text: words }),
108
+ ...binding,
109
+ },
110
+ required: [
111
+ "reference",
112
+ ...(command === "answer" ? ["text"] : []),
113
+ ...Object.keys(binding),
114
+ ],
115
+ annotations: mutation,
116
+ call: (values) => decisionCall(command, values),
117
+ };
118
+ }
119
+ function runCommand(command) {
120
+ return {
121
+ name: `cloving_${command}`,
122
+ description: `${runCommandDescriptions[command]} Read expectedRevision from cloving_status. ${repeat}`,
123
+ arguments: { runId: key, expectedRevision: revision, commandId: key },
124
+ required: ["runId", "expectedRevision", "commandId"],
125
+ annotations: command === "drop" ? { ...mutation, destructiveHint: true } : mutation,
126
+ call: (values) => mutationCall(values, (commandId) => runCommandRequest({
127
+ command,
128
+ runId: String(values["runId"]),
129
+ expectedRevision: Number(values["expectedRevision"]),
130
+ commandId,
131
+ })),
132
+ };
133
+ }
134
+ function runSource(values) {
135
+ const { prompt, ticket, input } = values;
136
+ const given = [prompt, ticket, input].filter((value) => value !== undefined);
137
+ if (given.length !== 1)
138
+ return undefined;
139
+ if (typeof prompt === "string")
140
+ return { kind: "prompt", text: prompt };
141
+ if (typeof ticket === "string")
142
+ return { kind: "ticket", id: ticket };
143
+ const submission = record(input);
144
+ return submission === undefined ? undefined : { kind: "input", submission };
145
+ }
146
+ function runCall(values) {
147
+ const source = runSource(values);
148
+ if (source === undefined)
149
+ return undefined;
150
+ return mutationCall(values, (commandId) => runRequest({ workflowId: String(values["workflowId"]), source, commandId }));
151
+ }
152
+ const tools = [
153
+ read("status", { runId: key, limit, after: identifier }),
154
+ read("questions", { runId: key }),
155
+ read("events", {
156
+ runId: key,
157
+ after: whole({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }),
158
+ limit: whole({ minimum: 1, maximum: 1000 }),
159
+ }),
160
+ {
161
+ name: "cloving_run",
162
+ description: `Submit a run of a workflow. Give exactly one of prompt, ticket and input. A ticket can be next. ${repeat}`,
163
+ arguments: {
164
+ workflowId: identifier,
165
+ prompt: words,
166
+ ticket: key,
167
+ input: object,
168
+ commandId: key,
169
+ },
170
+ required: ["workflowId", "commandId"],
171
+ annotations: mutation,
172
+ call: runCall,
173
+ },
174
+ decision("answer"),
175
+ decision("approve"),
176
+ decision("deny"),
177
+ runCommand("pause"),
178
+ runCommand("resume"),
179
+ runCommand("drop"),
180
+ ];
181
+ function listing(tool) {
182
+ return {
183
+ name: tool.name,
184
+ ...(tool.description === undefined
185
+ ? {}
186
+ : { description: tool.description }),
187
+ inputSchema: {
188
+ type: "object",
189
+ properties: Object.fromEntries(Object.entries(tool.arguments).map(([name, argument]) => [
190
+ name,
191
+ argument.schema,
192
+ ])),
193
+ ...(tool.required.length === 0 ? {} : { required: tool.required }),
194
+ additionalProperties: false,
195
+ },
196
+ annotations: tool.annotations,
197
+ };
198
+ }
199
+ export const mcpTools = tools.map(listing);
200
+ function validArguments(values, tool) {
201
+ if (tool.required.some((name) => !Object.hasOwn(values, name)))
202
+ return false;
203
+ return Object.entries(values).every(([name, value]) => Object.hasOwn(tool.arguments, name) &&
204
+ tool.arguments[name]?.valid(value) === true);
205
+ }
206
+ export function mcpToolCall(parameters) {
207
+ const selected = tools.find((tool) => tool.name === parameters["name"]);
208
+ if (selected === undefined)
209
+ return undefined;
210
+ const values = parameters["arguments"] === undefined
211
+ ? {}
212
+ : record(parameters["arguments"]);
213
+ if (values === undefined || !validArguments(values, selected))
214
+ return undefined;
215
+ return selected.call(values);
216
+ }
217
+ function aborted(signal) {
218
+ return new Promise((settle) => {
219
+ signal.addEventListener("abort", () => {
220
+ settle();
221
+ }, { once: true });
222
+ });
223
+ }
224
+ function toolReply(runtimeDirectory, exchange) {
225
+ const { call, signal } = exchange;
226
+ if (call.kind === "read")
227
+ return readCommandReply(runtimeDirectory, { ...call.request, signal });
228
+ return mutate(runtimeDirectory, {
229
+ request: call.request,
230
+ signal: aborted(signal),
231
+ });
232
+ }
233
+ export async function callMcpTool(runtimeDirectory, exchange) {
234
+ const { call } = exchange;
235
+ const reply = await toolReply(runtimeDirectory, exchange);
236
+ const structuredContent = commandJson(reply, call.kind === "mutation" ? { commandId: call.commandId } : {});
237
+ return {
238
+ structuredContent,
239
+ content: [{ type: "text", text: JSON.stringify(structuredContent) }],
240
+ ...(reply.kind === "error" ? { isError: true } : {}),
241
+ };
242
+ }
@@ -0,0 +1,15 @@
1
+ import type { ServiceRequest } from "../protocol.ts";
2
+ export interface QueueInvocation {
3
+ readonly kind: "queue";
4
+ readonly action: "show" | "resume" | "drain";
5
+ readonly commandId: string | null;
6
+ readonly json: boolean;
7
+ }
8
+ export declare function queueInvocation(request: {
9
+ readonly positionals: readonly string[];
10
+ readonly options: readonly {
11
+ readonly name: string;
12
+ readonly value: string | undefined;
13
+ }[];
14
+ }): QueueInvocation | string;
15
+ export declare function queueServiceRequest(invocation: QueueInvocation, commandId: string): ServiceRequest;
@@ -0,0 +1,31 @@
1
+ import { isRecordKey } from "../authority/commands.js";
2
+ function givenCommandId(options) {
3
+ const value = options.find((option) => option.name === "command-id")?.value;
4
+ if (value === undefined)
5
+ return null;
6
+ return isRecordKey(value) ? value : undefined;
7
+ }
8
+ export function queueInvocation(request) {
9
+ const [action, ...rest] = request.positionals;
10
+ const names = request.options.map((option) => option.name);
11
+ const allowed = action === undefined ? ["json"] : ["command-id", "json"];
12
+ if (names.some((name) => !allowed.includes(name)))
13
+ return "unexpected-option";
14
+ const json = names.includes("json");
15
+ if (action === undefined)
16
+ return { kind: "queue", action: "show", commandId: null, json };
17
+ if (action !== "resume" && action !== "drain")
18
+ return "invalid-queue-action";
19
+ if (rest.length > 0)
20
+ return "unexpected-argument";
21
+ const commandId = givenCommandId(request.options);
22
+ if (commandId === undefined)
23
+ return "invalid-option-value";
24
+ return { kind: "queue", action, commandId, json };
25
+ }
26
+ export function queueServiceRequest(invocation, commandId) {
27
+ return {
28
+ operation: "queue-command",
29
+ parameters: { command: invocation.action, commandId },
30
+ };
31
+ }
@@ -0,0 +1,3 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ export declare function queueHeadline(queue: Fields): string;
3
+ export declare function queueStateLines(queue: Fields): readonly string[];
@@ -0,0 +1,26 @@
1
+ import { record } from "../protocol.js";
2
+ import { visible } from "./terminal-text.js";
3
+ function instant(value) {
4
+ return typeof value === "number" && Number.isFinite(value)
5
+ ? new Date(value).toISOString()
6
+ : undefined;
7
+ }
8
+ export function queueHeadline(queue) {
9
+ const state = typeof queue["state"] === "string" ? `${visible(queue["state"])}, ` : "";
10
+ return `Queue: ${state}${visible(queue["busy"])} of ${visible(queue["lanes"])} lanes busy`;
11
+ }
12
+ export function queueStateLines(queue) {
13
+ const reason = record(queue["stop"])?.["reason"];
14
+ const failed = queue["failedRunIds"];
15
+ const drain = record(queue["drain"]);
16
+ const started = instant(drain?.["startedAt"]);
17
+ const drained = instant(drain?.["drainedAt"]);
18
+ return [
19
+ ...(reason === undefined ? [] : [`Stop reason: ${visible(reason)}`]),
20
+ ...(Array.isArray(failed) && failed.length > 0
21
+ ? [`Failed runs in a row: ${failed.map(visible).join(", ")}`]
22
+ : []),
23
+ ...(started === undefined ? [] : [`Drain started: ${started}`]),
24
+ ...(drained === undefined ? [] : [`Drained: ${drained}`]),
25
+ ];
26
+ }
@@ -0,0 +1,2 @@
1
+ import type { Fields } from "../protocol.ts";
2
+ export declare function reloadFieldLines(result: Fields): readonly string[];
@@ -0,0 +1,12 @@
1
+ import { show, visible } from "./terminal-text.js";
2
+ function fieldLine(label, value) {
3
+ return Array.isArray(value) && value.length > 0
4
+ ? [`${label}: ${visible(value.map(show).join(", "))}`]
5
+ : [];
6
+ }
7
+ export function reloadFieldLines(result) {
8
+ return [
9
+ ...fieldLine("Reloaded fields", result["reloadedFields"]),
10
+ ...fieldLine("Fields that need a restart", result["restartFields"]),
11
+ ];
12
+ }
@@ -1,5 +1,5 @@
1
1
  import { type Fields } from "../protocol.ts";
2
- export declare function oneLine(value: unknown): string;
2
+ export { oneLine } from "./terminal-text.ts";
3
3
  export declare function errorText(error: Fields): string;
4
4
  export declare function runOverview(result: Fields): Fields;
5
5
  export declare function queueLines(value: unknown): readonly string[];
@@ -1,35 +1,13 @@
1
- import { priceText, usageText, totalsSuffix, attemptTexts, } from "./usage-render.js";
1
+ import { shownCommandWaits, commandWaitText } from "./command-waits.js";
2
+ import { priceText, queueSpendLines, usageText, totalsSuffix, attemptTexts, } from "./usage-render.js";
2
3
  import { record } from "../protocol.js";
3
4
  import { workflowRefusals } from "../workflow-refusals.js";
4
5
  import { commandText, shownCommands } from "./command-effects.js";
5
- function show(value) {
6
- return typeof value === "string" ? value : JSON.stringify(value);
7
- }
8
- function escaped(character) {
9
- return `\\u${(character.codePointAt(0) ?? 0).toString(16).padStart(4, "0")}`;
10
- }
11
- const hiddenRanges = [
12
- [0x00, 0x1f],
13
- [0x7f, 0x9f],
14
- [0x061c, 0x061c],
15
- [0x200b, 0x200f],
16
- [0x2028, 0x202e],
17
- [0x2060, 0x2069],
18
- [0xfeff, 0xfeff],
19
- ];
20
- function hidden(character) {
21
- const code = character.codePointAt(0) ?? 0;
22
- return hiddenRanges.some(([first, last]) => code >= first && code <= last);
23
- }
24
- export function oneLine(value) {
25
- return Array.from(show(value), (character) => hidden(character) ? escaped(character) : character).join("");
26
- }
27
- function visible(value) {
28
- return show(value)
29
- .split("\n")
30
- .map((line) => Array.from(line, (character) => hidden(character) ? escaped(character) : character).join(""))
31
- .join("\n ");
32
- }
6
+ import { scheduledText, statusScheduleLines, scheduleLines, } from "./schedule-render.js";
7
+ import { show, oneLine, visible } from "./terminal-text.js";
8
+ import { queueHeadline, queueStateLines } from "./queue-render.js";
9
+ import { reloadFieldLines } from "./reload-render.js";
10
+ export { oneLine } from "./terminal-text.js";
33
11
  export function errorText(error) {
34
12
  const { candidates } = error;
35
13
  const lines = [`${visible(error["code"])}: ${visible(error["detail"])}`];
@@ -62,7 +40,7 @@ function admitted(result) {
62
40
  ];
63
41
  }
64
42
  function runLine(run) {
65
- const line = ` ${show(part(run, "runId"))} ${show(part(run, "workflowId"))} ${show(part(run, "condition"))} revision ${show(part(run, "revision"))} latest at ${show(part(run, "latestAt") ?? "none")}`;
43
+ const line = ` ${show(part(run, "runId"))} ${show(part(run, "workflowId"))} ${show(part(run, "condition"))} revision ${show(part(run, "revision"))} latest at ${show(part(run, "latestAt") ?? "none")}${part(run, "scheduled") === undefined ? "" : ` ${scheduledText(part(run, "scheduled"))}`}`;
66
44
  return [
67
45
  line,
68
46
  ...ciLines(run).map((notice) => ` ${notice}`),
@@ -102,20 +80,33 @@ export function runOverview(result) {
102
80
  hiddenRuns: Math.max(0, finished.length - 20),
103
81
  };
104
82
  }
83
+ function refusalLines(value) {
84
+ const refusals = workflowRefusals(value);
85
+ if (refusals.length === 0)
86
+ return [];
87
+ return [
88
+ "Refused workflows:",
89
+ ...refusals.map((entry) => ` ${entry.scope} ${entry.label}: ${entry.codes.join(", ")}`),
90
+ ];
91
+ }
92
+ function reloadLines(result) {
93
+ return [
94
+ `Reload: ${show(result["status"])}`,
95
+ `Bundle digest: ${show(result["previousBundleDigest"])} -> ${show(result["bundleDigest"])}`,
96
+ `Workflows: ${visible(listing(result["workflows"]))}`,
97
+ ...reloadFieldLines(result),
98
+ ...refusalLines(result["workflowRefusals"]),
99
+ ];
100
+ }
105
101
  function runList(result) {
106
102
  const runs = result["runs"];
107
103
  const lines = Array.isArray(runs) ? runs.map(runLine) : [];
108
104
  const hiddenRuns = result["hiddenRuns"];
109
- const refusals = workflowRefusals(result["workflowRefusals"]);
110
105
  return [
111
106
  `Workflows: ${visible(listing(result["workflows"]))}`,
112
107
  ...queueLines(result["queue"]),
113
- ...(refusals.length === 0
114
- ? []
115
- : [
116
- "Refused workflows:",
117
- ...refusals.map((entry) => ` ${entry.scope} ${entry.label}: ${entry.codes.join(", ")}`),
118
- ]),
108
+ ...statusScheduleLines(result["schedules"]).map(oneLine),
109
+ ...refusalLines(result["workflowRefusals"]),
119
110
  "Runs:",
120
111
  ...(lines.length === 0 ? [" none"] : lines),
121
112
  ...(typeof hiddenRuns === "number" && hiddenRuns > 0
@@ -131,7 +122,9 @@ export function queueLines(value) {
131
122
  return [];
132
123
  const skipped = queue["skipped"];
133
124
  return [
134
- `Queue: ${visible(queue["busy"])} of ${visible(queue["lanes"])} lanes busy`,
125
+ queueHeadline(queue),
126
+ ...queueStateLines(queue),
127
+ ...queueSpendLines(queue["spend"]),
135
128
  ...(Array.isArray(skipped)
136
129
  ? skipped.map((item) => {
137
130
  const dependencies = part(item, "dependencies");
@@ -194,6 +187,16 @@ function modelLines(attempts) {
194
187
  });
195
188
  }
196
189
  export { statusJson } from "./usage-render.js";
190
+ function turnDetailsLines(value) {
191
+ const state = part(value, "state");
192
+ if (state === "deleted")
193
+ return ["Turn details were deleted by the retention rule"];
194
+ if (state !== "archived")
195
+ return [];
196
+ return [
197
+ `Turn details are archived in the journal folder of the archive: ${visible(part(value, "folder"))}`,
198
+ ];
199
+ }
197
200
  function inputText(value) {
198
201
  const text = visible(record(value) ?? null);
199
202
  const characters = Array.from(text);
@@ -209,6 +212,7 @@ export function runStatus(result) {
209
212
  const suffix = totalsSuffix(part(run, "state"));
210
213
  return [
211
214
  `Run ${show(part(run, "runId"))} (${show(part(run, "workflowId"))})`,
215
+ ...[scheduledText(part(run, "scheduled"))].filter((mark) => mark !== ""),
212
216
  `Title: ${visible(part(run, "title") ?? "none")}`,
213
217
  `State: ${show(part(run, "state"))}`,
214
218
  ...outcomeLines(part(run, "outcome")),
@@ -225,6 +229,13 @@ export function runStatus(result) {
225
229
  `Cost${suffix}: ${priceText(part(run, "claudeCostUsd"), part(run, "estimatedCostUsd"))}`,
226
230
  `Token usage${suffix}: ${usageText(part(run, "usage"))}`,
227
231
  ...workerLines(part(run, "workerTurns")),
232
+ ...turnDetailsLines(part(run, "turnDetails")),
233
+ ...shownCommandWaits(part(run, "commandWaits")).map((wait) => visible(commandWaitText(wait))),
234
+ ...(record(part(run, "budget")) === undefined
235
+ ? []
236
+ : [
237
+ `Effects: ${show(part(part(run, "budget"), "spent"))} of ${show(part(part(run, "budget"), "limit"))}`,
238
+ ]),
228
239
  ...shownCommands(part(run, "commandEffects")).map((effect) => visible(commandText(effect))),
229
240
  `Next action: ${show(part(run, "nextAction") ?? "none")}${at === null ? "" : ` at ${show(at)}`}`,
230
241
  `Human input can help: ${part(run, "humanInputCanHelp") === true ? "yes" : "no"}`,
@@ -296,13 +307,18 @@ function eventPage(result) {
296
307
  return (Array.isArray(events) ? events : []).map((event) => eventText(record(event) ?? {}));
297
308
  }
298
309
  const renderers = new Map([
310
+ ["schedules", scheduleLines],
311
+ ["schedule", scheduleLines],
299
312
  ["run-admitted", admitted],
300
313
  ["run-list", runList],
301
314
  ["run-status", runStatus],
302
315
  ["decision-list", decisionList],
303
316
  ["decision-recorded", decisionRecorded],
304
317
  ["run-command", runCommand],
318
+ ["queue", (result) => queueLines(result["queue"])],
319
+ ["queue-command", (result) => queueLines(result["queue"])],
305
320
  ["event-page", eventPage],
321
+ ["reload", reloadLines],
306
322
  ]);
307
323
  export function rendered(result) {
308
324
  const lines = renderers.get(show(result["kind"]))?.(result) ?? [];
@@ -0,0 +1,23 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import { type Reader } from "./report-github-reader.ts";
3
+ export interface ReportJob {
4
+ readonly details: Fields;
5
+ readonly id: number;
6
+ readonly runId: number;
7
+ readonly commit: string;
8
+ readonly name: string;
9
+ readonly attempt: number;
10
+ readonly at: number;
11
+ readonly conclusion: string | null;
12
+ }
13
+ export declare function ciJobs(reader: Reader, runs: readonly Fields[]): Promise<ReportJob[]>;
14
+ export declare function readCiJobs(reader: Reader, runs: readonly Fields[]): Promise<{
15
+ jobs: ReportJob[];
16
+ names: Record<number, readonly string[]>;
17
+ jobLogs: {
18
+ read: number;
19
+ notRead: number;
20
+ limit: number;
21
+ maximumBytes: number;
22
+ };
23
+ }>;
@@ -0,0 +1,103 @@
1
+ import { record } from "../protocol.js";
2
+ import { rows, timestamp } from "./report-github-reader.js";
3
+ import { positiveInteger } from "./report-ci.js";
4
+ function parsedJob(row, run) {
5
+ const name = row["name"];
6
+ const commit = run["head_sha"];
7
+ const conclusion = jobConclusion(row["conclusion"]);
8
+ if (typeof name !== "string" ||
9
+ name === "" ||
10
+ typeof commit !== "string" ||
11
+ !/^[a-f0-9]{40,64}$/i.test(commit) ||
12
+ row["head_sha"] !== commit ||
13
+ row["run_id"] !== run["id"])
14
+ throw new Error("response");
15
+ return {
16
+ details: row,
17
+ id: positiveInteger(row["id"]),
18
+ name,
19
+ commit,
20
+ conclusion,
21
+ runId: positiveInteger(run["id"]),
22
+ attempt: positiveInteger(run["run_attempt"]),
23
+ at: timestamp(row["completed_at"] ?? row["started_at"] ?? run["created_at"]),
24
+ };
25
+ }
26
+ async function attemptJobs(reader, run) {
27
+ const result = [];
28
+ const seen = new Set();
29
+ for (let page = 1;; page += 1) {
30
+ const response = record(await reader.read(`actions/runs/${String(run["id"])}/attempts/${String(run["run_attempt"])}/jobs?per_page=100&page=${String(page)}`));
31
+ const values = rows(response?.["jobs"]);
32
+ for (const row of values) {
33
+ const job = parsedJob(row, run);
34
+ if (seen.has(job.id))
35
+ throw new Error("response");
36
+ seen.add(job.id);
37
+ result.push(job);
38
+ }
39
+ if (values.length < 100)
40
+ return result;
41
+ }
42
+ }
43
+ export async function ciJobs(reader, runs) {
44
+ const jobs = [];
45
+ for (const run of runs) {
46
+ const attempts = positiveInteger(run["run_attempt"]);
47
+ for (let attempt = 1; attempt <= attempts; attempt += 1)
48
+ jobs.push(...(await attemptJobs(reader, { ...run, run_attempt: attempt })));
49
+ }
50
+ return jobs;
51
+ }
52
+ export async function readCiJobs(reader, runs) {
53
+ const jobs = await ciJobs(reader, runs);
54
+ const names = {};
55
+ const failed = [
56
+ ...new Map(jobs
57
+ .filter((item) => item.conclusion === "failure")
58
+ .map((job) => [job.id, job])).values(),
59
+ ];
60
+ for (const job of failed.slice(0, 50)) {
61
+ const log = await reader
62
+ .readLog(`actions/jobs/${String(job.id)}/logs`)
63
+ .catch(() => "");
64
+ names[job.id] = failedTestNames(log);
65
+ }
66
+ return {
67
+ jobs,
68
+ names,
69
+ jobLogs: {
70
+ read: Math.min(failed.length, 50),
71
+ notRead: Math.max(0, failed.length - 50),
72
+ limit: 50,
73
+ maximumBytes: 2 * 1024 * 1024,
74
+ },
75
+ };
76
+ }
77
+ function failedTestNames(log) {
78
+ const lines = log
79
+ .split(/\r?\n/)
80
+ .map((line) => line.replace(/^\d{4}-\d{2}-\d{2}T\S+ /, ""));
81
+ const names = new Set();
82
+ let reading = false;
83
+ for (const line of lines) {
84
+ if (line === "Failed tests:") {
85
+ reading = true;
86
+ continue;
87
+ }
88
+ if (!reading || /^\s/.test(line))
89
+ continue;
90
+ if (line === "" ||
91
+ /^(?:\d+ failures not shown\.|Error: test-report-failure\. Full test report:)/.test(line)) {
92
+ reading = false;
93
+ continue;
94
+ }
95
+ names.add(line);
96
+ }
97
+ return names.size === 0 ? ["unknown"] : [...names];
98
+ }
99
+ function jobConclusion(value) {
100
+ if (value === null || typeof value === "string")
101
+ return value;
102
+ throw new Error("response");
103
+ }
@@ -0,0 +1,9 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import { type ReportCiData } from "../report-ci.ts";
3
+ import { reportSource, type Reader } from "./report-github-reader.ts";
4
+ interface CiUsageRead {
5
+ readonly data: ReportCiData;
6
+ readonly sources: Readonly<Record<"ciUsageJobs" | "ciUsageWorkflows", ReturnType<typeof reportSource>>>;
7
+ }
8
+ export declare function readCiUsage(reader: Reader, runs: readonly Fields[]): Promise<CiUsageRead>;
9
+ export {};