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,185 @@
1
+ import { record } from "../protocol.js";
2
+ import {} from "../report-ci.js";
3
+ import { ciJobs } from "./report-ci-jobs.js";
4
+ import { reportSource, timestamp, } from "./report-github-reader.js";
5
+ function groups() {
6
+ return { localMacos: [], localLinux: [], hostedMacos: [], hostedLinux: [] };
7
+ }
8
+ function workflowEndpoint(run) {
9
+ const path = run["path"];
10
+ const commit = run["head_sha"];
11
+ if (typeof path !== "string" ||
12
+ !path.startsWith(".github/workflows/") ||
13
+ typeof commit !== "string" ||
14
+ !/^[a-f0-9]{40,64}$/i.test(commit))
15
+ throw new Error("response");
16
+ const file = path.replace(/@.*$/, "");
17
+ return `contents/${file}?ref=${commit}`;
18
+ }
19
+ async function workflowJobs(reader, run) {
20
+ const response = record(await reader.read(workflowEndpoint(run)));
21
+ if (response?.["encoding"] !== "base64" ||
22
+ typeof response["content"] !== "string")
23
+ throw new Error("response");
24
+ const text = Buffer.from(response["content"], "base64").toString("utf8");
25
+ try {
26
+ return record(record(JSON.parse(text))?.["jobs"]) ?? {};
27
+ }
28
+ catch {
29
+ return {};
30
+ }
31
+ }
32
+ function definitionOf(jobs, name) {
33
+ const key = name.split(" (")[0] ?? name;
34
+ return (record(jobs[key]) ??
35
+ Object.values(jobs)
36
+ .map(record)
37
+ .find((job) => job?.["name"] === name) ??
38
+ {});
39
+ }
40
+ function runnerSystem(value) {
41
+ if (typeof value === "string")
42
+ return runnerSystem([value]);
43
+ if (!Array.isArray(value) ||
44
+ !value.every((item) => typeof item === "string"))
45
+ return null;
46
+ const description = value.join(" ").toLowerCase();
47
+ const macos = /\bmacos\b|\bosx\b/.test(description);
48
+ const linux = /\blinux\b|\bubuntu\b/.test(description);
49
+ if (macos === linux)
50
+ return null;
51
+ return macos ? "Macos" : "Linux";
52
+ }
53
+ function runnerKind(row, definition) {
54
+ const labels = row["labels"];
55
+ if (!Array.isArray(labels) ||
56
+ !labels.every((label) => typeof label === "string"))
57
+ throw new Error("response");
58
+ const local = labels.includes("self-hosted");
59
+ const system = runnerSystem(labels) ??
60
+ (local ? null : runnerSystem(definition["runs-on"]));
61
+ if (system === null)
62
+ throw new Error("runner-kind");
63
+ return `${local ? "local" : "hosted"}${system}`;
64
+ }
65
+ function jobValues(job, definition) {
66
+ const row = job.details;
67
+ const start = timestamp(row["started_at"]);
68
+ const end = row["completed_at"] === null ? null : timestamp(row["completed_at"]);
69
+ const created = timestamp(row["created_at"]);
70
+ if (created > start || (end !== null && start > end))
71
+ throw new Error("response");
72
+ const minutes = end === null ? null : (end - start) / 60_000;
73
+ const timeout = definition["timeout-minutes"];
74
+ const limit = typeof timeout === "number" && Number.isFinite(timeout) && timeout > 0
75
+ ? timeout
76
+ : null;
77
+ return {
78
+ kind: runnerKind(row, definition),
79
+ minutes,
80
+ wait: (start - created) / 60_000,
81
+ limit,
82
+ };
83
+ }
84
+ function appendJob(target, input) {
85
+ const { job, definitions } = input;
86
+ const definition = definitionOf(definitions.get(job.runId) ?? {}, job.name);
87
+ const values = jobValues(job, definition);
88
+ const evidence = {
89
+ jobId: job.id,
90
+ runId: job.runId,
91
+ attempt: job.attempt,
92
+ jobName: job.name,
93
+ minutes: values.minutes,
94
+ limitMinutes: values.limit,
95
+ };
96
+ const datum = { at: job.at, evidence };
97
+ if (values.minutes !== null)
98
+ target.jobMinutes[values.kind].push({ ...datum, value: values.minutes });
99
+ target.runnerWaitMinutes[values.kind].push({ ...datum, value: values.wait });
100
+ if (values.limit !== null && values.minutes !== null)
101
+ target.jobLimitShare[values.kind].push({
102
+ ...datum,
103
+ value: values.minutes / values.limit,
104
+ });
105
+ if (job.conclusion === "timed_out" ||
106
+ (values.limit !== null &&
107
+ values.minutes !== null &&
108
+ values.minutes >= values.limit))
109
+ target.timeouts.push({ ...datum, value: 1 });
110
+ }
111
+ function jobData(jobs, definitions) {
112
+ const jobMinutes = groups();
113
+ const jobLimitShare = groups();
114
+ const runnerWaitMinutes = groups();
115
+ const timeouts = [];
116
+ for (const job of jobs) {
117
+ if (job.details["started_at"] === null || job.conclusion === "skipped")
118
+ continue;
119
+ appendJob({ jobMinutes, jobLimitShare, runnerWaitMinutes, timeouts }, { job, definitions });
120
+ }
121
+ const limitsKnown = [...definitions.values()].every((value) => value !== null);
122
+ return {
123
+ jobMinutes,
124
+ runnerWaitMinutes,
125
+ jobLimitShare: limitsKnown ? jobLimitShare : null,
126
+ timeouts: limitsKnown ? timeouts : null,
127
+ };
128
+ }
129
+ async function workflowDefinitions(reader, runs) {
130
+ const results = [];
131
+ for (const run of runs)
132
+ results.push(...(await Promise.allSettled([workflowJobs(reader, run)])));
133
+ return {
134
+ definitions: new Map(runs.map((run, index) => {
135
+ const result = results[index];
136
+ return [
137
+ Number(run["id"]),
138
+ result?.status === "fulfilled" ? result.value : null,
139
+ ];
140
+ })),
141
+ source: reportSource(results.find((result) => result.status === "rejected") ?? {
142
+ status: "fulfilled",
143
+ value: null,
144
+ }),
145
+ };
146
+ }
147
+ export async function readCiUsage(reader, runs) {
148
+ const reruns = runs
149
+ .filter((run) => Number(run["run_attempt"]) > 1)
150
+ .map((run) => ({
151
+ at: timestamp(run["run_started_at"] ?? run["updated_at"]),
152
+ value: 1,
153
+ evidence: { runId: run["id"], attempt: run["run_attempt"] },
154
+ }));
155
+ const empty = {
156
+ jobMinutes: null,
157
+ jobLimitShare: null,
158
+ runnerWaitMinutes: null,
159
+ timeouts: null,
160
+ reruns,
161
+ };
162
+ const [jobs] = await Promise.allSettled([ciJobs(reader, runs)]);
163
+ const workflows = await workflowDefinitions(reader, runs);
164
+ const sources = {
165
+ ciUsageJobs: reportSource(jobs),
166
+ ciUsageWorkflows: workflows.source,
167
+ };
168
+ if (jobs.status === "rejected")
169
+ return { data: empty, sources };
170
+ try {
171
+ return {
172
+ data: { ...jobData(jobs.value, workflows.definitions), reruns },
173
+ sources,
174
+ };
175
+ }
176
+ catch (reason) {
177
+ return {
178
+ data: empty,
179
+ sources: {
180
+ ...sources,
181
+ ciUsageJobs: reportSource({ status: "rejected", reason }),
182
+ },
183
+ };
184
+ }
185
+ }
@@ -0,0 +1,13 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import type { ReportDatum } from "../report-statistics.ts";
3
+ import { type Reader } from "./report-github-reader.ts";
4
+ export declare function positiveInteger(value: unknown): number;
5
+ export declare function mainRuns(reader: Reader, input: {
6
+ readonly since: string;
7
+ readonly activity: "created" | "updated";
8
+ }): Promise<Readonly<Record<string, unknown>>[]>;
9
+ export declare function ciRuns(reader: Reader, input: {
10
+ readonly since: string;
11
+ readonly activity: "created" | "updated";
12
+ }): Promise<Readonly<Record<string, unknown>>[]>;
13
+ export declare function firstPassData(reader: Reader, runs: readonly Fields[]): Promise<ReportDatum[]>;
@@ -0,0 +1,74 @@
1
+ import { record } from "../protocol.js";
2
+ import { rows, timestamp } from "./report-github-reader.js";
3
+ export function positiveInteger(value) {
4
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 1)
5
+ throw new Error("response");
6
+ return value;
7
+ }
8
+ export async function mainRuns(reader, input) {
9
+ return (await ciRuns(reader, input)).filter((run) => run["head_branch"] === "main");
10
+ }
11
+ export async function ciRuns(reader, input) {
12
+ const filter = input.activity === "created"
13
+ ? `branch=main&created=%3E%3D${encodeURIComponent(input.since)}&`
14
+ : "";
15
+ const runs = await runPages(reader, {
16
+ filter,
17
+ maximum: input.activity === "created" ? 1000 : Infinity,
18
+ });
19
+ return runs.filter((run) => {
20
+ if (run["name"] !== "CI")
21
+ return false;
22
+ if (timestamp(run[`${input.activity}_at`]) < Date.parse(input.since))
23
+ return false;
24
+ timestamp(run["created_at"]);
25
+ positiveInteger(run["run_attempt"]);
26
+ return true;
27
+ });
28
+ }
29
+ async function runPages(reader, input) {
30
+ const result = [];
31
+ const seen = new Set();
32
+ for (let page = 1;; page += 1) {
33
+ const response = record(await reader.read(`actions/runs?${input.filter}per_page=100&page=${String(page)}`));
34
+ if (Number(response?.["total_count"]) > input.maximum)
35
+ throw new Error("response-truncated");
36
+ const values = rows(response?.["workflow_runs"]);
37
+ for (const run of values) {
38
+ const id = positiveInteger(run["id"]);
39
+ if (seen.has(id))
40
+ throw new Error("response");
41
+ seen.add(id);
42
+ result.push(run);
43
+ }
44
+ if (values.length < 100)
45
+ return result;
46
+ }
47
+ }
48
+ export async function firstPassData(reader, runs) {
49
+ const result = [];
50
+ for (const run of runs) {
51
+ const first = run["run_attempt"] === 1
52
+ ? run
53
+ : record(await reader.read(`actions/runs/${String(run["id"])}/attempts/1`));
54
+ if (first === undefined ||
55
+ first["id"] !== run["id"] ||
56
+ first["run_attempt"] !== 1 ||
57
+ first["head_sha"] !== run["head_sha"])
58
+ throw new Error("response");
59
+ const conclusion = first["conclusion"];
60
+ if (conclusion !== null && typeof conclusion !== "string")
61
+ throw new Error("response");
62
+ result.push({
63
+ at: timestamp(run["created_at"]),
64
+ value: conclusion === "success" ? 1 : 0,
65
+ evidence: {
66
+ runId: run["id"],
67
+ commit: run["head_sha"],
68
+ attempt: 1,
69
+ conclusion,
70
+ },
71
+ });
72
+ }
73
+ return result;
74
+ }
@@ -0,0 +1,6 @@
1
+ import type { ReportDatum } from "../report-statistics.ts";
2
+ import { type Reader } from "./report-github-reader.ts";
3
+ export declare function readClosureHistory(reader: Reader, since: string): Promise<{
4
+ completed: ReportDatum[];
5
+ reopened: ReportDatum[];
6
+ }>;
@@ -0,0 +1,97 @@
1
+ import { record } from "../protocol.js";
2
+ import { identity, rows, timestamp, } from "./report-github-reader.js";
3
+ async function issueNumbers(reader, since) {
4
+ const result = [];
5
+ const seen = new Set();
6
+ for (let page = 1;; page += 1) {
7
+ const values = rows(await reader.read(`issues?state=all&since=${encodeURIComponent(since)}&per_page=100&page=${String(page)}`, [
8
+ "--jq",
9
+ 'map({number, html_url, closed_at, state, state_reason} + (if has("pull_request") then {pull_request: {}} else {} end))',
10
+ ]));
11
+ for (const row of values) {
12
+ if (Object.hasOwn(row, "pull_request"))
13
+ continue;
14
+ const number = identity(row, {
15
+ repository: reader.repository,
16
+ kind: "issues",
17
+ });
18
+ if (seen.has(number))
19
+ throw new Error("response");
20
+ seen.add(number);
21
+ result.push(number);
22
+ }
23
+ if (values.length < 100)
24
+ return result;
25
+ }
26
+ }
27
+ async function closureEvents(reader, issue) {
28
+ const result = [];
29
+ const seen = new Set();
30
+ for (let page = 1;; page += 1) {
31
+ const values = rows(await reader.read(`issues/${String(issue)}/events?per_page=100&page=${String(page)}`));
32
+ const signature = JSON.stringify(values);
33
+ if (seen.has(signature))
34
+ throw new Error("response");
35
+ seen.add(signature);
36
+ for (const event of values.filter((item) => ["closed", "reopened"].includes(String(item["event"]))))
37
+ result.push(await withCloseReason(reader, event));
38
+ if (values.length < 100)
39
+ return result;
40
+ }
41
+ }
42
+ function historyData(events, issue) {
43
+ const completed = [];
44
+ const reopened = [];
45
+ let completedAt = null;
46
+ for (const event of events.toSorted((left, right) => timestamp(left["created_at"]) - timestamp(right["created_at"]))) {
47
+ const at = timestamp(event["created_at"]);
48
+ const evidence = {
49
+ issue,
50
+ ...(event["id"] === undefined ? {} : { eventId: event["id"] }),
51
+ };
52
+ if (event["event"] === "reopened" &&
53
+ completedAt !== null &&
54
+ completedAt <= at)
55
+ reopened.push({ at, value: 1, evidence: { ...evidence, completedAt } });
56
+ if (event["event"] === "reopened")
57
+ continue;
58
+ if (!["completed", "not_planned", "duplicate"].includes(String(event["state_reason"])))
59
+ throw new Error("response");
60
+ if (event["state_reason"] !== "completed")
61
+ continue;
62
+ completedAt = at;
63
+ completed.push({ at, value: 1, evidence });
64
+ }
65
+ return { completed, reopened };
66
+ }
67
+ export async function readClosureHistory(reader, since) {
68
+ const completed = [];
69
+ const reopened = [];
70
+ for (const issue of await issueNumbers(reader, since)) {
71
+ const history = historyData(await closureEvents(reader, issue), issue);
72
+ completed.push(...history.completed);
73
+ reopened.push(...history.reopened);
74
+ }
75
+ return { completed, reopened };
76
+ }
77
+ async function withCloseReason(reader, event) {
78
+ if (event["event"] !== "closed" || typeof event["state_reason"] === "string")
79
+ return event;
80
+ const nodeId = event["node_id"];
81
+ if (typeof nodeId !== "string")
82
+ throw new Error("response");
83
+ return {
84
+ ...event,
85
+ state_reason: nodeReason(await reader.readNode(nodeId), nodeId),
86
+ };
87
+ }
88
+ function nodeReason(value, nodeId) {
89
+ const response = record(value);
90
+ const node = record(record(response?.["data"])?.["node"]);
91
+ if (response?.["errors"] !== undefined ||
92
+ node === undefined ||
93
+ node["id"] !== nodeId ||
94
+ typeof node["stateReason"] !== "string")
95
+ throw new Error("response");
96
+ return node["stateReason"].toLowerCase();
97
+ }
@@ -0,0 +1,7 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import type { ReportFlow, ReportCompletion } from "../report-flow-types.ts";
3
+ export declare function readReportFlow(runtime: string, input: {
4
+ readonly events: readonly Fields[] | null;
5
+ readonly start: number;
6
+ readonly completions: readonly ReportCompletion[] | null;
7
+ }): Promise<ReportFlow>;
@@ -0,0 +1,122 @@
1
+ import { record } from "../protocol.js";
2
+ import { send } from "./client.js";
3
+ function queueOf(value) {
4
+ const queue = record(value);
5
+ const workflowId = queue?.["workflowId"];
6
+ const lanes = queue?.["lanes"];
7
+ return typeof workflowId === "string" &&
8
+ workflowId !== "" &&
9
+ typeof lanes === "number" &&
10
+ Number.isSafeInteger(lanes) &&
11
+ lanes > 0
12
+ ? { workflowId, lanes }
13
+ : null;
14
+ }
15
+ async function overview(runtime) {
16
+ const reply = await send(runtime, {
17
+ operation: "status",
18
+ parameters: { limit: 1 },
19
+ });
20
+ if (reply.kind === "error")
21
+ throw new Error("report-overview-unavailable");
22
+ const workflows = reply.result["workflows"];
23
+ return {
24
+ queue: queueOf(reply.result["queue"]),
25
+ workflows: Array.isArray(workflows)
26
+ ? workflows.filter((id) => typeof id === "string")
27
+ : [],
28
+ };
29
+ }
30
+ async function workflowIds(runtime, runIds) {
31
+ const identities = new Map();
32
+ for (let offset = 0; offset < runIds.length; offset += 500) {
33
+ const batch = runIds.slice(offset, offset + 500);
34
+ try {
35
+ const reply = await send(runtime, {
36
+ operation: "status",
37
+ parameters: { metadata: "workflows", runIds: batch },
38
+ });
39
+ if (reply.kind === "error")
40
+ continue;
41
+ appendWorkflowIds(identities, {
42
+ runIds: batch,
43
+ values: reply.result["runs"],
44
+ });
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ }
50
+ return identities;
51
+ }
52
+ function appendWorkflowIds(identities, batch) {
53
+ const { values, runIds } = batch;
54
+ if (!Array.isArray(values) || values.length !== runIds.length)
55
+ return;
56
+ const rows = values.map((value) => record(value));
57
+ if (rows.some((row, index) => row?.["runId"] !== runIds[index]))
58
+ return;
59
+ for (const row of rows) {
60
+ const id = row?.["workflowId"];
61
+ identities.set(String(row?.["runId"]), typeof id === "string" && id !== "" ? id : null);
62
+ }
63
+ }
64
+ function skipsOf(events) {
65
+ if (events === null)
66
+ return null;
67
+ const skips = [];
68
+ for (const event of events.filter((event) => event["type"] === "schedule.skipped")) {
69
+ const id = record(event["payload"])?.["workflowId"];
70
+ const at = Date.parse(String(event["recordedAt"]));
71
+ const sequence = event["sequence"];
72
+ if (typeof id !== "string" ||
73
+ id === "" ||
74
+ !Number.isFinite(at) ||
75
+ typeof sequence !== "number" ||
76
+ !Number.isSafeInteger(sequence) ||
77
+ sequence < 1)
78
+ return null;
79
+ skips.push({ workflowId: id, at, sequence });
80
+ }
81
+ return skips;
82
+ }
83
+ function runsOf(input) {
84
+ const runs = [];
85
+ const ended = new Map((input.completions ?? []).map((event) => [event.runId, event.at]));
86
+ const seen = new Set();
87
+ for (const event of input.events.filter((event) => event["type"] === "run.started")) {
88
+ const runId = event["runId"];
89
+ const at = Date.parse(String(event["recordedAt"]));
90
+ if (typeof runId !== "string" ||
91
+ !Number.isFinite(at) ||
92
+ seen.has(runId) ||
93
+ (ended.get(runId) ?? at) < at)
94
+ return null;
95
+ seen.add(runId);
96
+ runs.push({
97
+ runId,
98
+ workflowId: null,
99
+ start: at,
100
+ end: ended.get(runId) ?? null,
101
+ });
102
+ }
103
+ return runs.filter((run) => (run.end ?? Infinity) > input.start);
104
+ }
105
+ export async function readReportFlow(runtime, input) {
106
+ const settings = await overview(runtime).catch(() => ({
107
+ queue: null,
108
+ workflows: [],
109
+ }));
110
+ const runs = input.events === null ? null : runsOf({ ...input, events: input.events });
111
+ const identities = await workflowIds(runtime, (runs ?? []).map((run) => run.runId));
112
+ return {
113
+ ...settings,
114
+ skips: skipsOf(input.events),
115
+ runs: runs === null
116
+ ? null
117
+ : runs.map((run) => ({
118
+ ...run,
119
+ workflowId: identities.get(run.runId) ?? null,
120
+ })),
121
+ };
122
+ }
@@ -0,0 +1,29 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import type { WatchPrSettings } from "./watch-pr-settings.ts";
3
+ import { type PrRepository } from "./watch-pr-identity.ts";
4
+ export interface GithubReportInput {
5
+ readonly since: string;
6
+ readonly settings?: WatchPrSettings;
7
+ readonly retryMilliseconds?: number;
8
+ }
9
+ export declare function reportSource(result: PromiseSettledResult<unknown>): {
10
+ status: string;
11
+ reason?: never;
12
+ } | {
13
+ status: string;
14
+ reason: string;
15
+ };
16
+ export declare function rows(value: unknown): readonly Fields[];
17
+ export declare function identity(row: Fields, context: {
18
+ readonly repository: PrRepository;
19
+ readonly kind: "issues" | "pull";
20
+ }): number;
21
+ export declare function timestamp(value: unknown): number;
22
+ export interface Reader {
23
+ readonly repository: PrRepository;
24
+ readonly readNode: (nodeId: string) => Promise<unknown>;
25
+ readonly readLog: (endpoint: string) => Promise<string>;
26
+ readonly read: (endpoint: string, flags?: readonly string[]) => Promise<unknown>;
27
+ }
28
+ export declare function repositoryReader(input: GithubReportInput): Promise<Reader>;
29
+ export declare function issueTimeline(reader: Pick<Reader, "read">, issue: number): Promise<Fields[]>;