cloving 1.2.0 → 1.4.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 (752) hide show
  1. package/README.md +700 -331
  2. package/dist/src/agent-harness-shell.d.ts +13 -0
  3. package/dist/src/agent-harness-shell.js +93 -0
  4. package/dist/src/agent-harness-versions.d.ts +8 -0
  5. package/dist/src/agent-harness-versions.js +49 -0
  6. package/dist/src/agent-harnesses.d.ts +4 -0
  7. package/dist/src/agent-harnesses.js +13 -0
  8. package/dist/src/authority/command-wait-checks.d.ts +8 -0
  9. package/dist/src/authority/command-wait-checks.js +88 -0
  10. package/dist/src/authority/command-wait-results.d.ts +15 -0
  11. package/dist/src/authority/command-wait-results.js +73 -0
  12. package/dist/src/authority/command-wait-view.d.ts +21 -0
  13. package/dist/src/authority/command-wait-view.js +34 -0
  14. package/dist/src/authority/command-waits.d.ts +39 -0
  15. package/dist/src/authority/command-waits.js +97 -0
  16. package/dist/src/authority/commands.d.ts +1 -0
  17. package/dist/src/authority/commands.js +46 -5
  18. package/dist/src/authority/dispatch-decision.d.ts +8 -0
  19. package/dist/src/authority/dispatch-decision.js +26 -1
  20. package/dist/src/authority/effect-requests.js +6 -3
  21. package/dist/src/authority/effect-results.js +4 -2
  22. package/dist/src/authority/gate-reduction.d.ts +1 -0
  23. package/dist/src/authority/gate-reduction.js +18 -3
  24. package/dist/src/authority/gates.d.ts +2 -1
  25. package/dist/src/authority/gates.js +5 -1
  26. package/dist/src/authority/history-state.d.ts +2 -0
  27. package/dist/src/authority/history-state.js +13 -1
  28. package/dist/src/authority/instants.d.ts +1 -0
  29. package/dist/src/authority/instants.js +21 -0
  30. package/dist/src/authority/operations.js +1 -1
  31. package/dist/src/authority/reduction-state.d.ts +2 -0
  32. package/dist/src/authority/reduction-state.js +5 -0
  33. package/dist/src/authority/reduction.d.ts +1 -1
  34. package/dist/src/authority/reduction.js +30 -1
  35. package/dist/src/authority/status-input.d.ts +3 -1
  36. package/dist/src/authority/status.d.ts +3 -0
  37. package/dist/src/authority/status.js +28 -3
  38. package/dist/src/authority/stop-sequence.d.ts +1 -0
  39. package/dist/src/authority/stop-sequence.js +2 -1
  40. package/dist/src/authority/transitions.d.ts +7 -5
  41. package/dist/src/authority/transitions.js +13 -0
  42. package/dist/src/broker/actor/authority-delivery.js +1 -0
  43. package/dist/src/broker/actor/authority-queries.d.ts +9 -2
  44. package/dist/src/broker/actor/authority-queries.js +29 -5
  45. package/dist/src/broker/actor/authority-receipts.js +11 -1
  46. package/dist/src/broker/actor/authority-session.js +2 -2
  47. package/dist/src/broker/actor/authority-settings.js +4 -0
  48. package/dist/src/broker/actor/authority-upgrades.d.ts +19 -2
  49. package/dist/src/broker/actor/authority-upgrades.js +7 -2
  50. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  51. package/dist/src/broker/actor/delivery-intents.js +6 -4
  52. package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
  53. package/dist/src/broker/actor/effect-delivery.js +18 -2
  54. package/dist/src/broker/actor/effect-plan.js +11 -2
  55. package/dist/src/broker/actor/effect-queries.d.ts +5 -0
  56. package/dist/src/broker/actor/effect-queries.js +16 -1
  57. package/dist/src/broker/actor/effect-turn.js +2 -0
  58. package/dist/src/broker/actor/pin-check.js +1 -1
  59. package/dist/src/broker/actor/stop-plan.js +10 -4
  60. package/dist/src/broker/actor/stop-turn.d.ts +2 -0
  61. package/dist/src/broker/actor/stop-turn.js +24 -11
  62. package/dist/src/broker/actor/turn-draft.d.ts +1 -0
  63. package/dist/src/broker/actor/turn-draft.js +4 -0
  64. package/dist/src/broker/actor/turn-state.js +6 -2
  65. package/dist/src/broker/authority-admission.js +80 -7
  66. package/dist/src/broker/authority-restore.d.ts +2 -0
  67. package/dist/src/broker/authority-restore.js +36 -1
  68. package/dist/src/broker/command-wait-restore.d.ts +31 -0
  69. package/dist/src/broker/command-wait-restore.js +86 -0
  70. package/dist/src/broker/decision-restore.d.ts +1 -1
  71. package/dist/src/broker/decision-restore.js +5 -4
  72. package/dist/src/broker/effect-upgrade.d.ts +2 -0
  73. package/dist/src/broker/effect-upgrade.js +8 -2
  74. package/dist/src/broker/socket-address.d.ts +3 -1
  75. package/dist/src/broker/socket-address.js +2 -2
  76. package/dist/src/cli/arguments.d.ts +22 -11
  77. package/dist/src/cli/arguments.js +73 -104
  78. package/dist/src/cli/chat-stores.d.ts +2 -0
  79. package/dist/src/cli/chat-stores.js +113 -0
  80. package/dist/src/cli/client.d.ts +4 -1
  81. package/dist/src/cli/client.js +9 -3
  82. package/dist/src/cli/command-effects.d.ts +7 -0
  83. package/dist/src/cli/command-effects.js +39 -0
  84. package/dist/src/cli/command-requests.d.ts +17 -0
  85. package/dist/src/cli/command-requests.js +43 -0
  86. package/dist/src/cli/command-waits.d.ts +9 -0
  87. package/dist/src/cli/command-waits.js +51 -0
  88. package/dist/src/cli/commands.js +21 -41
  89. package/dist/src/cli/config-arguments.d.ts +11 -0
  90. package/dist/src/cli/config-arguments.js +59 -0
  91. package/dist/src/cli/config-command.d.ts +2 -0
  92. package/dist/src/cli/config-command.js +105 -0
  93. package/dist/src/cli/config-file.d.ts +3 -0
  94. package/dist/src/cli/config-file.js +52 -0
  95. package/dist/src/cli/config-lock.d.ts +7 -0
  96. package/dist/src/cli/config-lock.js +61 -0
  97. package/dist/src/cli/config-notice.d.ts +5 -0
  98. package/dist/src/cli/config-notice.js +46 -0
  99. package/dist/src/cli/doctor-github.d.ts +9 -0
  100. package/dist/src/cli/doctor-github.js +138 -0
  101. package/dist/src/cli/doctor-harness.d.ts +13 -0
  102. package/dist/src/cli/doctor-harness.js +242 -0
  103. package/dist/src/cli/doctor-local.d.ts +18 -0
  104. package/dist/src/cli/doctor-local.js +77 -0
  105. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  106. package/dist/src/cli/doctor-runtime.js +176 -0
  107. package/dist/src/cli/doctor-service.d.ts +1 -0
  108. package/dist/src/cli/doctor-service.js +11 -0
  109. package/dist/src/cli/doctor-workflows.d.ts +6 -0
  110. package/dist/src/cli/doctor-workflows.js +50 -0
  111. package/dist/src/cli/doctor.d.ts +15 -0
  112. package/dist/src/cli/doctor.js +187 -0
  113. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  114. package/dist/src/cli/github-ci-progress.js +83 -0
  115. package/dist/src/cli/github-retry.d.ts +6 -0
  116. package/dist/src/cli/github-retry.js +47 -0
  117. package/dist/src/cli/harness-probes.d.ts +24 -0
  118. package/dist/src/cli/harness-probes.js +183 -0
  119. package/dist/src/cli/harness-processes.d.ts +6 -0
  120. package/dist/src/cli/harness-processes.js +36 -0
  121. package/dist/src/cli/init-command.d.ts +9 -0
  122. package/dist/src/cli/init-command.js +52 -0
  123. package/dist/src/cli/init-prompt-command.d.ts +10 -0
  124. package/dist/src/cli/init-prompt-command.js +145 -0
  125. package/dist/src/cli/init-prompt.d.ts +35 -0
  126. package/dist/src/cli/init-prompt.js +74 -0
  127. package/dist/src/cli/init-selection.d.ts +13 -0
  128. package/dist/src/cli/init-selection.js +75 -0
  129. package/dist/src/cli/main.d.ts +9 -1
  130. package/dist/src/cli/main.js +69 -61
  131. package/dist/src/cli/mcp-server.d.ts +1 -0
  132. package/dist/src/cli/mcp-server.js +156 -0
  133. package/dist/src/cli/mcp-tools.d.ts +15 -0
  134. package/dist/src/cli/mcp-tools.js +80 -0
  135. package/dist/src/cli/phone-arguments.d.ts +14 -0
  136. package/dist/src/cli/phone-arguments.js +37 -0
  137. package/dist/src/cli/phone-client.d.ts +2 -0
  138. package/dist/src/cli/phone-client.js +32 -0
  139. package/dist/src/cli/phone-command.d.ts +13 -0
  140. package/dist/src/cli/phone-command.js +101 -0
  141. package/dist/src/cli/probe-command.d.ts +36 -0
  142. package/dist/src/cli/probe-command.js +59 -0
  143. package/dist/src/cli/project-settings.d.ts +4 -0
  144. package/dist/src/cli/project-settings.js +33 -0
  145. package/dist/src/cli/render.d.ts +2 -1
  146. package/dist/src/cli/render.js +57 -54
  147. package/dist/src/cli/report-ci-jobs.d.ts +23 -0
  148. package/dist/src/cli/report-ci-jobs.js +103 -0
  149. package/dist/src/cli/report-ci-usage.d.ts +9 -0
  150. package/dist/src/cli/report-ci-usage.js +185 -0
  151. package/dist/src/cli/report-ci.d.ts +13 -0
  152. package/dist/src/cli/report-ci.js +74 -0
  153. package/dist/src/cli/report-closures.d.ts +6 -0
  154. package/dist/src/cli/report-closures.js +97 -0
  155. package/dist/src/cli/report-flow.d.ts +7 -0
  156. package/dist/src/cli/report-flow.js +122 -0
  157. package/dist/src/cli/report-github-reader.d.ts +29 -0
  158. package/dist/src/cli/report-github-reader.js +157 -0
  159. package/dist/src/cli/report-github.d.ts +25 -0
  160. package/dist/src/cli/report-github.js +181 -0
  161. package/dist/src/cli/report-operator.d.ts +3 -0
  162. package/dist/src/cli/report-operator.js +40 -0
  163. package/dist/src/cli/report-ready.d.ts +3 -0
  164. package/dist/src/cli/report-ready.js +96 -0
  165. package/dist/src/cli/report-text.d.ts +9 -0
  166. package/dist/src/cli/report-text.js +33 -0
  167. package/dist/src/cli/report.d.ts +18 -0
  168. package/dist/src/cli/report.js +269 -0
  169. package/dist/src/cli/repository-arguments.d.ts +5 -0
  170. package/dist/src/cli/repository-arguments.js +34 -0
  171. package/dist/src/cli/runtime-arguments.d.ts +6 -1
  172. package/dist/src/cli/runtime-arguments.js +22 -2
  173. package/dist/src/cli/runtime-directory.d.ts +6 -2
  174. package/dist/src/cli/runtime-directory.js +72 -14
  175. package/dist/src/cli/schedule-arguments.d.ts +14 -0
  176. package/dist/src/cli/schedule-arguments.js +26 -0
  177. package/dist/src/cli/schedule-render.d.ts +22 -0
  178. package/dist/src/cli/schedule-render.js +73 -0
  179. package/dist/src/cli/terminal-text.d.ts +3 -0
  180. package/dist/src/cli/terminal-text.js +28 -0
  181. package/dist/src/cli/toolchain.d.ts +2 -0
  182. package/dist/src/cli/toolchain.js +22 -2
  183. package/dist/src/cli/usage-render.d.ts +6 -0
  184. package/dist/src/cli/usage-render.js +67 -1
  185. package/dist/src/cli/usage.d.ts +3 -3
  186. package/dist/src/cli/usage.js +119 -50
  187. package/dist/src/cli/watch-actions.d.ts +2 -0
  188. package/dist/src/cli/watch-actions.js +6 -6
  189. package/dist/src/cli/watch-board-view.d.ts +1 -1
  190. package/dist/src/cli/watch-board-view.js +27 -4
  191. package/dist/src/cli/watch-board.d.ts +4 -2
  192. package/dist/src/cli/watch-board.js +58 -35
  193. package/dist/src/cli/watch-card-forms.d.ts +1 -1
  194. package/dist/src/cli/watch-card-forms.js +13 -12
  195. package/dist/src/cli/watch-client.d.ts +1 -1
  196. package/dist/src/cli/watch-client.js +7 -11
  197. package/dist/src/cli/watch-header-view.d.ts +22 -0
  198. package/dist/src/cli/watch-header-view.js +104 -0
  199. package/dist/src/cli/watch-model.d.ts +4 -1
  200. package/dist/src/cli/watch-model.js +34 -15
  201. package/dist/src/cli/watch-page.js +57 -23
  202. package/dist/src/cli/watch-phases.d.ts +12 -3
  203. package/dist/src/cli/watch-phases.js +68 -11
  204. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  205. package/dist/src/cli/watch-phone-client.js +84 -0
  206. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  207. package/dist/src/cli/watch-phone-view.js +113 -0
  208. package/dist/src/cli/watch-phone.d.ts +5 -0
  209. package/dist/src/cli/watch-phone.js +53 -0
  210. package/dist/src/cli/watch-pr-board.js +1 -1
  211. package/dist/src/cli/watch-pr-command.d.ts +1 -0
  212. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  213. package/dist/src/cli/watch-pull-request.js +22 -8
  214. package/dist/src/cli/watch-reads.d.ts +2 -0
  215. package/dist/src/cli/watch-reads.js +17 -16
  216. package/dist/src/cli/watch-render.d.ts +23 -1
  217. package/dist/src/cli/watch-run-input.d.ts +0 -1
  218. package/dist/src/cli/watch-run-input.js +0 -13
  219. package/dist/src/cli/watch-server.js +29 -11
  220. package/dist/src/cli/watch-turn.d.ts +4 -1
  221. package/dist/src/cli/watch-turn.js +37 -1
  222. package/dist/src/cli/watch-usage.js +5 -1
  223. package/dist/src/cli/watch-view.d.ts +4 -21
  224. package/dist/src/cli/watch-view.js +26 -118
  225. package/dist/src/cli.js +165 -28
  226. package/dist/src/command-settings.d.ts +16 -0
  227. package/dist/src/command-settings.js +42 -0
  228. package/dist/src/command-wait.d.ts +4 -0
  229. package/dist/src/command-wait.js +45 -0
  230. package/dist/src/configuration-change.d.ts +18 -0
  231. package/dist/src/configuration-change.js +76 -0
  232. package/dist/src/configuration-display.d.ts +21 -0
  233. package/dist/src/configuration-display.js +69 -0
  234. package/dist/src/configuration-schema.d.ts +58 -0
  235. package/dist/src/configuration-schema.js +163 -0
  236. package/dist/src/daemon/attachment-file.d.ts +6 -0
  237. package/dist/src/daemon/attachment-file.js +86 -0
  238. package/dist/src/daemon/attachments.d.ts +14 -0
  239. package/dist/src/daemon/attachments.js +17 -0
  240. package/dist/src/daemon/claude-recovery.d.ts +50 -0
  241. package/dist/src/daemon/claude-recovery.js +204 -0
  242. package/dist/src/daemon/claude-stream.d.ts +27 -0
  243. package/dist/src/daemon/claude-stream.js +63 -0
  244. package/dist/src/daemon/claude-turn.d.ts +18 -18
  245. package/dist/src/daemon/claude-turn.js +151 -105
  246. package/dist/src/daemon/claude-worker.d.ts +5 -4
  247. package/dist/src/daemon/claude-worker.js +149 -158
  248. package/dist/src/daemon/command-journal.d.ts +5 -0
  249. package/dist/src/daemon/command-journal.js +50 -0
  250. package/dist/src/daemon/command-process.d.ts +28 -0
  251. package/dist/src/daemon/command-process.js +164 -0
  252. package/dist/src/daemon/command-worker.d.ts +19 -0
  253. package/dist/src/daemon/command-worker.js +182 -0
  254. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  255. package/dist/src/daemon/cursor-stream.js +154 -0
  256. package/dist/src/daemon/daemon-adapters.d.ts +60 -0
  257. package/dist/src/daemon/daemon-adapters.js +126 -0
  258. package/dist/src/daemon/daemon-loops.d.ts +16 -0
  259. package/dist/src/daemon/daemon-loops.js +41 -0
  260. package/dist/src/daemon/daemon.d.ts +2 -33
  261. package/dist/src/daemon/daemon.js +133 -131
  262. package/dist/src/daemon/declared-input.d.ts +3 -0
  263. package/dist/src/daemon/declared-input.js +9 -0
  264. package/dist/src/daemon/delivery-router.js +1 -1
  265. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  266. package/dist/src/daemon/gemini-stream.js +129 -0
  267. package/dist/src/daemon/github-attach.d.ts +2 -0
  268. package/dist/src/daemon/github-attach.js +149 -0
  269. package/dist/src/daemon/github-ci-filters.d.ts +6 -0
  270. package/dist/src/daemon/github-ci-filters.js +138 -0
  271. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  272. package/dist/src/daemon/github-ci-rerun.js +92 -0
  273. package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
  274. package/dist/src/daemon/github-ci-workflows.js +148 -0
  275. package/dist/src/daemon/github-ci.js +109 -10
  276. package/dist/src/daemon/github-issue-methods.d.ts +2 -0
  277. package/dist/src/daemon/github-issue-methods.js +37 -2
  278. package/dist/src/daemon/github-merge-call.d.ts +4 -1
  279. package/dist/src/daemon/github-merge-call.js +10 -3
  280. package/dist/src/daemon/github-merge.js +58 -26
  281. package/dist/src/daemon/github-methods.js +22 -2
  282. package/dist/src/daemon/github-operation.d.ts +5 -0
  283. package/dist/src/daemon/github-operation.js +6 -0
  284. package/dist/src/daemon/github-retry.js +8 -44
  285. package/dist/src/daemon/github-worker.d.ts +4 -0
  286. package/dist/src/daemon/github-worker.js +6 -0
  287. package/dist/src/daemon/issue-queue.d.ts +1 -0
  288. package/dist/src/daemon/issue-queue.js +16 -34
  289. package/dist/src/daemon/notify-events.d.ts +6 -0
  290. package/dist/src/daemon/notify-events.js +84 -0
  291. package/dist/src/daemon/notify-journal.js +1 -1
  292. package/dist/src/daemon/notify-message.d.ts +4 -1
  293. package/dist/src/daemon/notify-message.js +36 -0
  294. package/dist/src/daemon/notify.d.ts +1 -1
  295. package/dist/src/daemon/notify.js +7 -78
  296. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  297. package/dist/src/daemon/opencode-stream.js +87 -0
  298. package/dist/src/daemon/operation-journal.d.ts +1 -0
  299. package/dist/src/daemon/queue-status.d.ts +10 -0
  300. package/dist/src/daemon/queue-status.js +51 -0
  301. package/dist/src/daemon/resume-index-lock.d.ts +13 -0
  302. package/dist/src/daemon/resume-index-lock.js +160 -0
  303. package/dist/src/daemon/resume-worktree.d.ts +7 -0
  304. package/dist/src/daemon/resume-worktree.js +29 -0
  305. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  306. package/dist/src/daemon/retry-worktree.js +139 -0
  307. package/dist/src/daemon/retrying-turn.d.ts +2 -10
  308. package/dist/src/daemon/retrying-turn.js +145 -141
  309. package/dist/src/daemon/schedule-control.d.ts +26 -0
  310. package/dist/src/daemon/schedule-control.js +110 -0
  311. package/dist/src/daemon/schedule-journal.d.ts +6 -0
  312. package/dist/src/daemon/schedule-journal.js +120 -0
  313. package/dist/src/daemon/text-output.d.ts +18 -0
  314. package/dist/src/daemon/text-output.js +44 -0
  315. package/dist/src/daemon/ticket-registration.d.ts +7 -14
  316. package/dist/src/daemon/ticket-registration.js +93 -114
  317. package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
  318. package/dist/src/daemon/turn-attempt-journal.js +136 -0
  319. package/dist/src/daemon/turn-attempts.d.ts +47 -0
  320. package/dist/src/daemon/turn-attempts.js +166 -0
  321. package/dist/src/daemon/turn-command.d.ts +10 -0
  322. package/dist/src/daemon/turn-command.js +33 -0
  323. package/dist/src/daemon/turn-report.d.ts +25 -0
  324. package/dist/src/daemon/turn-report.js +118 -0
  325. package/dist/src/daemon/work-tree.d.ts +11 -1
  326. package/dist/src/daemon/work-tree.js +35 -12
  327. package/dist/src/daemon/worker-profile.d.ts +8 -0
  328. package/dist/src/daemon/worker-profile.js +40 -0
  329. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  330. package/dist/src/daemon/workflow-generations.js +57 -0
  331. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  332. package/dist/src/daemon/workflow-replay.js +58 -0
  333. package/dist/src/daemon/workflow-schedules.d.ts +30 -0
  334. package/dist/src/daemon/workflow-schedules.js +238 -0
  335. package/dist/src/daemon/worktree-processes.d.ts +9 -0
  336. package/dist/src/daemon/worktree-processes.js +151 -0
  337. package/dist/src/decision-wait.d.ts +1 -0
  338. package/dist/src/decision-wait.js +3 -0
  339. package/dist/src/delivery-backoff.d.ts +1 -0
  340. package/dist/src/delivery-backoff.js +3 -0
  341. package/dist/src/doctor-report.d.ts +22 -0
  342. package/dist/src/doctor-report.js +63 -0
  343. package/dist/src/execution-pin.d.ts +5 -0
  344. package/dist/src/execution-pin.js +67 -4
  345. package/dist/src/grok-result.d.ts +12 -0
  346. package/dist/src/grok-result.js +61 -0
  347. package/dist/src/harness-defaults.d.ts +35 -0
  348. package/dist/src/harness-defaults.js +121 -0
  349. package/dist/src/harness-start.d.ts +15 -0
  350. package/dist/src/harness-start.js +37 -0
  351. package/dist/src/host/command-wait.d.ts +38 -0
  352. package/dist/src/host/command-wait.js +115 -0
  353. package/dist/src/host/decision-resume.d.ts +35 -0
  354. package/dist/src/host/decision-resume.js +86 -0
  355. package/dist/src/host/gate-bridge.d.ts +48 -0
  356. package/dist/src/host/gate-bridge.js +124 -0
  357. package/dist/src/host/run-wait.d.ts +26 -0
  358. package/dist/src/host/run-wait.js +37 -0
  359. package/dist/src/host/start-delivery.d.ts +6 -8
  360. package/dist/src/host/start-delivery.js +13 -18
  361. package/dist/src/host/step-bridge-host.d.ts +8 -20
  362. package/dist/src/host/step-bridge-host.js +65 -58
  363. package/dist/src/merge-request.d.ts +19 -0
  364. package/dist/src/merge-request.js +32 -0
  365. package/dist/src/operation-identity.d.ts +1 -0
  366. package/dist/src/operation-identity.js +4 -0
  367. package/dist/src/phone/canonical-json.d.ts +1 -0
  368. package/dist/src/phone/canonical-json.js +16 -0
  369. package/dist/src/phone/phone-link.d.ts +7 -0
  370. package/dist/src/phone/phone-link.js +21 -0
  371. package/dist/src/phone/qr-data.d.ts +8 -0
  372. package/dist/src/phone/qr-data.js +133 -0
  373. package/dist/src/phone/qr-matrix.d.ts +6 -0
  374. package/dist/src/phone/qr-matrix.js +175 -0
  375. package/dist/src/phone/qr-penalty.d.ts +3 -0
  376. package/dist/src/phone/qr-penalty.js +67 -0
  377. package/dist/src/phone/qr-picture.d.ts +5 -0
  378. package/dist/src/phone/qr-picture.js +24 -0
  379. package/dist/src/private-config.schema.json +303 -0
  380. package/dist/src/project-config.schema.json +105 -0
  381. package/dist/src/project-settings.d.ts +19 -0
  382. package/dist/src/project-settings.js +133 -0
  383. package/dist/src/queue-spend.d.ts +4 -0
  384. package/dist/src/queue-spend.js +21 -0
  385. package/dist/src/relay/answer-check.d.ts +24 -0
  386. package/dist/src/relay/answer-check.js +145 -0
  387. package/dist/src/relay/answer-inbox.d.ts +15 -0
  388. package/dist/src/relay/answer-inbox.js +173 -0
  389. package/dist/src/relay/daemon-keys.d.ts +16 -0
  390. package/dist/src/relay/daemon-keys.js +75 -0
  391. package/dist/src/relay/decision-check.d.ts +3 -0
  392. package/dist/src/relay/decision-check.js +77 -0
  393. package/dist/src/relay/decision-close.d.ts +6 -0
  394. package/dist/src/relay/decision-close.js +72 -0
  395. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  396. package/dist/src/relay/decision-envelopes.js +93 -0
  397. package/dist/src/relay/decision-watch.d.ts +14 -0
  398. package/dist/src/relay/decision-watch.js +68 -0
  399. package/dist/src/relay/envelope-post.d.ts +8 -0
  400. package/dist/src/relay/envelope-post.js +71 -0
  401. package/dist/src/relay/envelope.d.ts +28 -0
  402. package/dist/src/relay/envelope.js +53 -0
  403. package/dist/src/relay/hpke.d.ts +25 -0
  404. package/dist/src/relay/hpke.js +108 -0
  405. package/dist/src/relay/pairing-checks.d.ts +42 -0
  406. package/dist/src/relay/pairing-checks.js +172 -0
  407. package/dist/src/relay/pairing-follow.d.ts +8 -0
  408. package/dist/src/relay/pairing-follow.js +95 -0
  409. package/dist/src/relay/pairing-session.d.ts +29 -0
  410. package/dist/src/relay/pairing-session.js +87 -0
  411. package/dist/src/relay/phone-delivery.d.ts +51 -0
  412. package/dist/src/relay/phone-delivery.js +139 -0
  413. package/dist/src/relay/phone-devices.d.ts +36 -0
  414. package/dist/src/relay/phone-devices.js +46 -0
  415. package/dist/src/relay/phone-inbox.d.ts +18 -0
  416. package/dist/src/relay/phone-inbox.js +17 -0
  417. package/dist/src/relay/phone-operations.d.ts +18 -0
  418. package/dist/src/relay/phone-operations.js +121 -0
  419. package/dist/src/relay/phone-outbox.d.ts +21 -0
  420. package/dist/src/relay/phone-outbox.js +25 -0
  421. package/dist/src/relay/phone-socket.d.ts +6 -0
  422. package/dist/src/relay/phone-socket.js +63 -0
  423. package/dist/src/relay/relay-control.d.ts +7 -0
  424. package/dist/src/relay/relay-control.js +24 -0
  425. package/dist/src/relay/relay-files.d.ts +2 -0
  426. package/dist/src/relay/relay-files.js +23 -0
  427. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  428. package/dist/src/relay/relay-heartbeat.js +81 -0
  429. package/dist/src/relay/relay-http.d.ts +14 -0
  430. package/dist/src/relay/relay-http.js +63 -0
  431. package/dist/src/relay/relay-registration.d.ts +15 -0
  432. package/dist/src/relay/relay-registration.js +63 -0
  433. package/dist/src/relay/relay-service.d.ts +28 -0
  434. package/dist/src/relay/relay-service.js +218 -0
  435. package/dist/src/relay/relay-store.d.ts +48 -0
  436. package/dist/src/relay/relay-store.js +131 -0
  437. package/dist/src/relay/sealed-post.d.ts +25 -0
  438. package/dist/src/relay/sealed-post.js +52 -0
  439. package/dist/src/relay.d.ts +1 -0
  440. package/dist/src/relay.js +8 -0
  441. package/dist/src/report-ci.d.ts +164 -0
  442. package/dist/src/report-ci.js +32 -0
  443. package/dist/src/report-effects.d.ts +15 -0
  444. package/dist/src/report-effects.js +212 -0
  445. package/dist/src/report-flow-types.d.ts +38 -0
  446. package/dist/src/report-flow-types.js +7 -0
  447. package/dist/src/report-flow.d.ts +43 -0
  448. package/dist/src/report-flow.js +193 -0
  449. package/dist/src/report-operator.d.ts +67 -0
  450. package/dist/src/report-operator.js +25 -0
  451. package/dist/src/report-quality.d.ts +221 -0
  452. package/dist/src/report-quality.js +94 -0
  453. package/dist/src/report-ready.d.ts +23 -0
  454. package/dist/src/report-ready.js +117 -0
  455. package/dist/src/report-statistics.d.ts +51 -0
  456. package/dist/src/report-statistics.js +106 -0
  457. package/dist/src/report.d.ts +712 -0
  458. package/dist/src/report.js +234 -0
  459. package/dist/src/repository-identity.d.ts +4 -0
  460. package/dist/src/repository-identity.js +4 -0
  461. package/dist/src/review-subject.d.ts +41 -0
  462. package/dist/src/review-subject.js +91 -0
  463. package/dist/src/run-wait.d.ts +23 -0
  464. package/dist/src/run-wait.js +20 -0
  465. package/dist/src/schedule-progress.d.ts +33 -0
  466. package/dist/src/schedule-progress.js +45 -0
  467. package/dist/src/service/active-tickets.d.ts +4 -0
  468. package/dist/src/service/active-tickets.js +49 -0
  469. package/dist/src/service/command-effects.d.ts +4 -0
  470. package/dist/src/service/command-effects.js +16 -0
  471. package/dist/src/service/command-waits.d.ts +34 -0
  472. package/dist/src/service/command-waits.js +86 -0
  473. package/dist/src/service/decision-handler.d.ts +4 -0
  474. package/dist/src/service/decision-handler.js +39 -4
  475. package/dist/src/service/expiry.js +2 -0
  476. package/dist/src/service/gateway.js +21 -4
  477. package/dist/src/service/queue-spend.d.ts +6 -0
  478. package/dist/src/service/queue-spend.js +68 -0
  479. package/dist/src/service/registry.d.ts +16 -3
  480. package/dist/src/service/registry.js +34 -3
  481. package/dist/src/service/replies.d.ts +16 -1
  482. package/dist/src/service/replies.js +23 -0
  483. package/dist/src/service/run-handlers.js +35 -56
  484. package/dist/src/service/run-metadata.d.ts +22 -0
  485. package/dist/src/service/run-metadata.js +138 -0
  486. package/dist/src/service/run-waits.d.ts +3 -0
  487. package/dist/src/service/run-waits.js +41 -0
  488. package/dist/src/service/service.d.ts +22 -2
  489. package/dist/src/service/service.js +29 -13
  490. package/dist/src/service/submission-handler.d.ts +0 -1
  491. package/dist/src/service/submission-handler.js +22 -36
  492. package/dist/src/service/worker-port.d.ts +1 -0
  493. package/dist/src/service/worker-port.js +9 -1
  494. package/dist/src/service/worker-totals.d.ts +2 -0
  495. package/dist/src/service/worker-totals.js +9 -24
  496. package/dist/src/step-bridge.d.ts +43 -0
  497. package/dist/src/steps/command-wait.d.ts +12 -0
  498. package/dist/src/steps/command-wait.js +26 -0
  499. package/dist/src/steps/merge-by-person.d.ts +2 -0
  500. package/dist/src/steps/merge-by-person.js +18 -0
  501. package/dist/src/steps/merge-when-green.d.ts +2 -0
  502. package/dist/src/steps/merge-when-green.js +62 -0
  503. package/dist/src/steps/open-decision-wait.d.ts +2 -0
  504. package/dist/src/steps/open-decision-wait.js +8 -0
  505. package/dist/src/steps/review-by-agent.d.ts +5 -0
  506. package/dist/src/steps/review-by-agent.js +124 -0
  507. package/dist/src/steps/review-by-person.d.ts +4 -0
  508. package/dist/src/steps/review-by-person.js +19 -0
  509. package/dist/src/steps/review-subject.d.ts +2 -0
  510. package/dist/src/steps/review-subject.js +11 -0
  511. package/dist/src/steps/run-command.d.ts +2 -0
  512. package/dist/src/steps/run-command.js +15 -0
  513. package/dist/src/steps/sleep.d.ts +3 -0
  514. package/dist/src/steps/sleep.js +19 -0
  515. package/dist/src/steps/wait-for-command.d.ts +3 -0
  516. package/dist/src/steps/wait-for-command.js +17 -0
  517. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  518. package/dist/src/steps/wait-for-decision.js +71 -0
  519. package/dist/src/steps/wait-for-run.d.ts +5 -0
  520. package/dist/src/steps/wait-for-run.js +9 -0
  521. package/dist/src/storage/command-wait-rows.d.ts +30 -0
  522. package/dist/src/storage/command-wait-rows.js +96 -0
  523. package/dist/src/storage/decision-snapshots.d.ts +9 -1
  524. package/dist/src/storage/decision-snapshots.js +22 -2
  525. package/dist/src/storage/domain-changes.d.ts +2 -0
  526. package/dist/src/storage/domain-changes.js +3 -0
  527. package/dist/src/storage/domain-schema.d.ts +13 -1
  528. package/dist/src/storage/domain-schema.js +31 -4
  529. package/dist/src/storage/effect-schema.d.ts +1 -0
  530. package/dist/src/storage/effect-schema.js +5 -0
  531. package/dist/src/submission.d.ts +4 -0
  532. package/dist/src/submission.js +6 -2
  533. package/dist/src/testing-requests.d.ts +15 -0
  534. package/dist/src/testing-requests.js +93 -0
  535. package/dist/src/testing.d.ts +23 -0
  536. package/dist/src/testing.js +211 -0
  537. package/dist/src/ticket-status-stream.d.ts +9 -0
  538. package/dist/src/ticket-status-stream.js +94 -0
  539. package/dist/src/token-prices.d.ts +12 -4
  540. package/dist/src/token-prices.js +15 -2
  541. package/dist/src/turn-profile.d.ts +1 -0
  542. package/dist/src/turn-profile.js +8 -1
  543. package/dist/src/worker-usage.d.ts +17 -0
  544. package/dist/src/worker-usage.js +60 -0
  545. package/dist/src/workflow-admission.d.ts +5 -0
  546. package/dist/src/workflow-candidate.d.ts +8 -2
  547. package/dist/src/workflow-candidate.js +59 -6
  548. package/dist/src/workflow-contracts.d.ts +1 -0
  549. package/dist/src/workflow-contracts.js +9 -2
  550. package/dist/src/workflow-declaration.d.ts +21 -3
  551. package/dist/src/workflow-declaration.js +77 -9
  552. package/dist/src/workflow-discovery.d.ts +3 -13
  553. package/dist/src/workflow-discovery.js +5 -14
  554. package/dist/src/workflow-refusals.js +3 -1
  555. package/dist/src/workflow-schedule.d.ts +22 -0
  556. package/dist/src/workflow-schedule.js +53 -0
  557. package/dist/src/workflows.d.ts +12 -2
  558. package/dist/src/workflows.js +9 -1
  559. package/dist/tools/admit-workflow.d.ts +1 -0
  560. package/dist/tools/admit-workflow.js +18 -5
  561. package/dist/tools/doctor-adoption.d.ts +1 -0
  562. package/dist/tools/doctor-adoption.js +11 -0
  563. package/dist/tools/project-configuration.d.ts +4 -0
  564. package/dist/tools/project-configuration.js +47 -0
  565. package/dist/tools/red-green-command.d.ts +1 -0
  566. package/dist/tools/red-green-command.js +174 -0
  567. package/dist/tools/red-green-process.d.ts +10 -0
  568. package/dist/tools/red-green-process.js +59 -0
  569. package/dist/tools/self-host-processes.d.ts +3 -0
  570. package/dist/tools/self-host-processes.js +63 -33
  571. package/dist/tools/self-host-project.d.ts +4 -0
  572. package/dist/tools/self-host-project.js +42 -60
  573. package/dist/tools/self-host-runtime.d.ts +16 -0
  574. package/dist/tools/self-host-runtime.js +60 -0
  575. package/dist/tools/self-host-workflows.d.ts +1 -0
  576. package/dist/tools/self-host-workflows.js +36 -1
  577. package/dist/tools/self-host.js +128 -71
  578. package/dist/tools/template-command.d.ts +1 -0
  579. package/dist/tools/template-command.js +160 -0
  580. package/dist/tools/template-copy.d.ts +11 -0
  581. package/dist/tools/template-copy.js +130 -0
  582. package/dist/tools/template-files.d.ts +17 -0
  583. package/dist/tools/template-files.js +74 -0
  584. package/dist/tools/workflow-bundles.js +1 -0
  585. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  586. package/dist/tools/workflow-candidate-counts.js +31 -16
  587. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  588. package/dist/tools/workflow-candidate-fields.js +24 -0
  589. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  590. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  591. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  592. package/dist/tools/workflow-candidate-program.js +36 -8
  593. package/dist/tools/workflow-candidate-shape.d.ts +3 -0
  594. package/dist/tools/workflow-candidate-shape.js +90 -0
  595. package/dist/tools/workflow-candidate-source.js +92 -16
  596. package/dist/tools/workflow-candidate-syntax.d.ts +9 -3
  597. package/dist/tools/workflow-candidate-syntax.js +83 -109
  598. package/dist/tools/workflow-command.d.ts +1 -0
  599. package/dist/tools/workflow-command.js +142 -0
  600. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  601. package/dist/tools/workflow-folder-capture.js +47 -2
  602. package/dist/tools/workflow-folders.d.ts +18 -3
  603. package/dist/tools/workflow-folders.js +60 -7
  604. package/dist/tools/workflow-test-hook.d.ts +7 -0
  605. package/dist/tools/workflow-test-hook.js +16 -0
  606. package/dist/tools/workflow-test-loader.d.ts +1 -0
  607. package/dist/tools/workflow-test-loader.js +10 -0
  608. package/package.json +60 -10
  609. package/templates/develop/README.md +90 -0
  610. package/templates/develop/develop/accept.ts +11 -0
  611. package/templates/develop/develop/flow-tests.ts +394 -0
  612. package/templates/develop/develop/local.ts +40 -0
  613. package/templates/develop/develop/option-tests.ts +174 -0
  614. package/templates/develop/develop/partial-choice.ts +29 -0
  615. package/templates/develop/develop/partial.ts +28 -0
  616. package/templates/develop/develop/pull.ts +156 -0
  617. package/templates/develop/develop/queue-partial.ts +39 -0
  618. package/templates/develop/develop/refusal-tests.ts +251 -0
  619. package/templates/develop/develop/report.ts +156 -0
  620. package/templates/develop/develop/round.ts +40 -0
  621. package/templates/develop/develop/scenarios.ts +87 -0
  622. package/templates/develop/develop/turn.ts +68 -0
  623. package/templates/develop/develop.declaration.json +24 -0
  624. package/templates/develop/develop.test.ts +287 -0
  625. package/templates/develop/develop.ts +30 -0
  626. package/templates/develop/template.json +153 -0
  627. package/templates/idea-to-issue/README.md +27 -0
  628. package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
  629. package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
  630. package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
  631. package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
  632. package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
  633. package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
  634. package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
  635. package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
  636. package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
  637. package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
  638. package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
  639. package/templates/idea-to-issue/idea-to-issue.ts +49 -0
  640. package/templates/idea-to-issue/template.json +81 -0
  641. package/templates/review-day/README.md +97 -0
  642. package/templates/review-day/review-day/critique.ts +58 -0
  643. package/templates/review-day/review-day/decision.ts +29 -0
  644. package/templates/review-day/review-day/facts.ts +69 -0
  645. package/templates/review-day/review-day/label.ts +29 -0
  646. package/templates/review-day/review-day/next.ts +28 -0
  647. package/templates/review-day/review-day/post.ts +27 -0
  648. package/templates/review-day/review-day/report.ts +98 -0
  649. package/templates/review-day/review-day/rules.ts +12 -0
  650. package/templates/review-day/review-day/scenarios.ts +76 -0
  651. package/templates/review-day/review-day/turn.ts +73 -0
  652. package/templates/review-day/review-day.declaration.json +16 -0
  653. package/templates/review-day/review-day.test.ts +362 -0
  654. package/templates/review-day/review-day.ts +37 -0
  655. package/templates/review-day/template.json +56 -0
  656. package/dist/src/chats/analysis-batches.d.ts +0 -42
  657. package/dist/src/chats/analysis-batches.js +0 -97
  658. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  659. package/dist/src/chats/analysis-checkpoint.js +0 -31
  660. package/dist/src/chats/analysis-contract.d.ts +0 -80
  661. package/dist/src/chats/analysis-contract.js +0 -16
  662. package/dist/src/chats/analysis-data.d.ts +0 -3
  663. package/dist/src/chats/analysis-data.js +0 -85
  664. package/dist/src/chats/analysis-input.d.ts +0 -18
  665. package/dist/src/chats/analysis-input.js +0 -97
  666. package/dist/src/chats/analysis-links.d.ts +0 -2
  667. package/dist/src/chats/analysis-links.js +0 -25
  668. package/dist/src/chats/analysis-merge.d.ts +0 -16
  669. package/dist/src/chats/analysis-merge.js +0 -134
  670. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  671. package/dist/src/chats/analysis-prompt.js +0 -42
  672. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  673. package/dist/src/chats/analysis-proposal.js +0 -41
  674. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  675. package/dist/src/chats/analysis-provenance.js +0 -99
  676. package/dist/src/chats/analysis-shape.d.ts +0 -4
  677. package/dist/src/chats/analysis-shape.js +0 -235
  678. package/dist/src/chats/analysis.d.ts +0 -3
  679. package/dist/src/chats/analysis.js +0 -42
  680. package/dist/src/chats/corpus-input.d.ts +0 -5
  681. package/dist/src/chats/corpus-input.js +0 -288
  682. package/dist/src/chats/destination.d.ts +0 -4
  683. package/dist/src/chats/destination.js +0 -96
  684. package/dist/src/chats/import.d.ts +0 -15
  685. package/dist/src/chats/import.js +0 -243
  686. package/dist/src/chats/input-file.d.ts +0 -3
  687. package/dist/src/chats/input-file.js +0 -32
  688. package/dist/src/chats/normalize.d.ts +0 -29
  689. package/dist/src/chats/normalize.js +0 -155
  690. package/dist/src/chats/previous-import.d.ts +0 -5
  691. package/dist/src/chats/previous-import.js +0 -34
  692. package/dist/src/chats/reader.d.ts +0 -21
  693. package/dist/src/chats/reader.js +0 -118
  694. package/dist/src/chats/redact-import.d.ts +0 -14
  695. package/dist/src/chats/redact-import.js +0 -141
  696. package/dist/src/chats/redaction.d.ts +0 -41
  697. package/dist/src/chats/redaction.js +0 -161
  698. package/dist/src/chats/reference-mapping.d.ts +0 -16
  699. package/dist/src/chats/reference-mapping.js +0 -153
  700. package/dist/src/chats/revision-input.d.ts +0 -3
  701. package/dist/src/chats/revision-input.js +0 -180
  702. package/dist/src/chats/revision.d.ts +0 -48
  703. package/dist/src/chats/revision.js +0 -94
  704. package/dist/src/chats/selection.d.ts +0 -25
  705. package/dist/src/chats/selection.js +0 -109
  706. package/dist/src/chats/source.d.ts +0 -23
  707. package/dist/src/chats/source.js +0 -135
  708. package/dist/src/chats/structure.d.ts +0 -57
  709. package/dist/src/chats/structure.js +0 -216
  710. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  711. package/dist/src/chats/workflow-generation-projection.js +0 -75
  712. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  713. package/dist/src/chats/workflow-generation-source.js +0 -124
  714. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  715. package/dist/src/chats/workflow-generation-text.js +0 -74
  716. package/dist/src/chats/workflow-generation.d.ts +0 -69
  717. package/dist/src/chats/workflow-generation.js +0 -142
  718. package/dist/src/cli/watch-start-view.d.ts +0 -18
  719. package/dist/src/cli/watch-start-view.js +0 -77
  720. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  721. package/dist/src/daemon/analysis-launch.js +0 -81
  722. package/dist/src/daemon/analysis-token.d.ts +0 -6
  723. package/dist/src/daemon/analysis-token.js +0 -88
  724. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  725. package/dist/src/daemon/analysis-worker.js +0 -271
  726. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  727. package/dist/src/daemon/chats-batch-binding.js +0 -99
  728. package/dist/src/daemon/chats-capture.d.ts +0 -18
  729. package/dist/src/daemon/chats-capture.js +0 -194
  730. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  731. package/dist/src/daemon/chats-checkpoints.js +0 -186
  732. package/dist/src/daemon/chats-files.d.ts +0 -42
  733. package/dist/src/daemon/chats-files.js +0 -252
  734. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  735. package/dist/src/daemon/chats-follow-up.js +0 -180
  736. package/dist/src/daemon/chats-question.d.ts +0 -15
  737. package/dist/src/daemon/chats-question.js +0 -93
  738. package/dist/src/daemon/chats-worker.d.ts +0 -13
  739. package/dist/src/daemon/chats-worker.js +0 -201
  740. package/dist/src/steps/decision-gate.d.ts +0 -2
  741. package/dist/src/steps/decision-gate.js +0 -8
  742. package/dist/workflows/analyze-chats.d.ts +0 -15
  743. package/dist/workflows/analyze-chats.declaration.json +0 -22
  744. package/dist/workflows/analyze-chats.js +0 -250
  745. package/dist/workflows/develop-prd.d.ts +0 -7
  746. package/dist/workflows/develop-prd.js +0 -165
  747. package/dist/workflows/develop-ticket.d.ts +0 -9
  748. package/dist/workflows/develop-ticket.js +0 -207
  749. package/dist/workflows/issue-labels.d.ts +0 -16
  750. package/dist/workflows/issue-labels.js +0 -70
  751. package/dist/workflows/ticket-prompts.d.ts +0 -35
  752. package/dist/workflows/ticket-prompts.js +0 -143
@@ -0,0 +1,113 @@
1
+ import { component, element } from "./watch-element.js";
2
+ export function timeLeft(expiresAt, now) {
3
+ const seconds = Math.max(0, Math.ceil((Date.parse(expiresAt) - Date.parse(now)) / 1000));
4
+ return `${String(Math.floor(seconds / 60))}:${String(seconds % 60).padStart(2, "0")} left`;
5
+ }
6
+ export function refusalText(code) {
7
+ const texts = {
8
+ "pairing-mac-invalid": "The phone sent a request that does not agree with the QR code.",
9
+ "pairing-key-invalid": "The phone sent a key that is not valid.",
10
+ "pairing-request-invalid": "The phone sent a request that is not valid.",
11
+ "pairing-device-revoked": "This phone was removed. Connect it again as a new phone.",
12
+ "pairing-expired": "The connection request expired. Click Connect a phone again.",
13
+ "pairing-check-invalid": "The phone did not confirm the connection. Remove it and connect again.",
14
+ };
15
+ return texts[code] ?? `The connection did not work (${code}).`;
16
+ }
17
+ export function PhoneCode(props) {
18
+ const { size, path } = props.picture;
19
+ return element("svg", {
20
+ xmlns: "http://www.w3.org/2000/svg",
21
+ class: "phone-qr",
22
+ viewBox: `0 0 ${String(size)} ${String(size)}`,
23
+ role: "img",
24
+ "aria-label": "Pairing QR code",
25
+ "shape-rendering": "crispEdges",
26
+ children: [
27
+ element("rect", { width: size, height: size, fill: "#ffffff" }),
28
+ element("path", { d: path, fill: "#000000" }),
29
+ ],
30
+ });
31
+ }
32
+ export function phoneButton(label, onClick) {
33
+ return element("button", { type: "button", onClick, children: label });
34
+ }
35
+ export function PhoneAsk(props) {
36
+ const { phone } = props;
37
+ const request = phone.request;
38
+ if (request === null)
39
+ return null;
40
+ if (phone.stage === "checking")
41
+ return element("p", { children: `Checking ${request.name}` });
42
+ return element("div", {
43
+ class: "phone-ask",
44
+ children: [
45
+ element("strong", {
46
+ children: `Connect "${request.name}" (${request.platform})? Code ${request.code}`,
47
+ }),
48
+ phoneButton("Accept", phone.onAccept),
49
+ phoneButton("Deny", phone.onDeny),
50
+ ],
51
+ });
52
+ }
53
+ export function PhoneList(props) {
54
+ const { phone } = props;
55
+ if (phone.devices.length === 0)
56
+ return null;
57
+ return element("ul", {
58
+ class: "phone-list",
59
+ children: phone.devices.map((device) => element("li", {
60
+ key: device.deviceId,
61
+ children: [
62
+ `${device.name} (${device.platform}) ${device.removedAt === null ? device.state : "removed"}`,
63
+ device.removedAt === null
64
+ ? phoneButton("Remove", () => {
65
+ phone.onRemove(device.deviceId);
66
+ })
67
+ : null,
68
+ ],
69
+ })),
70
+ });
71
+ }
72
+ export function phoneNotices(phone) {
73
+ const lines = [
74
+ phone.reason === "registration-lost" ? "Connect your phones again." : null,
75
+ phone.connected === null ? null : `Connected: ${phone.connected}`,
76
+ phone.refusal === null ? null : refusalText(phone.refusal),
77
+ phone.message === "" ? null : phone.message,
78
+ ];
79
+ return lines.map((line) => line === null ? null : element("p", { role: "status", children: line }));
80
+ }
81
+ export function PhonePanel(props) {
82
+ const { phone, now } = props;
83
+ const waiting = phone.request === null ? phone.pairing : null;
84
+ return element("section", {
85
+ class: waiting === null ? "phone" : "phone phone-pairing",
86
+ children: [
87
+ waiting === null
88
+ ? null
89
+ : component(PhoneCode, { picture: waiting.picture }),
90
+ element("div", {
91
+ children: [
92
+ waiting === null
93
+ ? null
94
+ : [
95
+ element("strong", { children: "Scan with your phone camera" }),
96
+ element("span", { children: timeLeft(waiting.expiresAt, now) }),
97
+ ],
98
+ component(PhoneAsk, { phone }),
99
+ phone.pairing === null
100
+ ? element("button", {
101
+ type: "button",
102
+ disabled: phone.busy,
103
+ onClick: phone.onPair,
104
+ children: "Connect a phone",
105
+ })
106
+ : phoneButton("Cancel", phone.onCancel),
107
+ phoneNotices(phone),
108
+ ],
109
+ }),
110
+ component(PhoneList, { phone }),
111
+ ],
112
+ });
113
+ }
@@ -0,0 +1,5 @@
1
+ import type { IncomingMessage } from "node:http";
2
+ import { type WatchActions } from "./watch-actions.ts";
3
+ export declare function isPhoneAction(path: string): boolean;
4
+ export declare function phoneAction(actions: WatchActions, request: IncomingMessage): Promise<string | null>;
5
+ export declare function phoneRead(runtimeDirectory: string): Promise<string>;
@@ -0,0 +1,53 @@
1
+ import { qrMatrix } from "../phone/qr-matrix.js";
2
+ import { qrPicture } from "../phone/qr-picture.js";
3
+ import { phoneRequest } from "./phone-client.js";
4
+ import { actionAllowed, actionBody, } from "./watch-actions.js";
5
+ const operations = {
6
+ "/actions/phone/pair": "phone-pair-start",
7
+ "/actions/phone/cancel": "phone-pair-cancel",
8
+ "/actions/phone/accept": "phone-pair-accept",
9
+ "/actions/phone/deny": "phone-pair-deny",
10
+ "/actions/phone/remove": "phone-remove",
11
+ };
12
+ export function isPhoneAction(path) {
13
+ return Object.hasOwn(operations, path);
14
+ }
15
+ function withPicture(result) {
16
+ const link = result["link"];
17
+ return typeof link === "string"
18
+ ? { ...result, picture: qrPicture(qrMatrix(link).modules) }
19
+ : result;
20
+ }
21
+ export async function phoneAction(actions, request) {
22
+ const operation = operations[new URL(String(request.url), "http://localhost").pathname];
23
+ if (operation === undefined || !actionAllowed(actions, request))
24
+ return null;
25
+ const body = await actionBody(request);
26
+ if (typeof body !== "object" || body === null || Array.isArray(body))
27
+ return null;
28
+ const reply = await phoneRequest(actions.runtimeDirectory, {
29
+ operation,
30
+ parameters: { ...body },
31
+ });
32
+ if (reply === undefined)
33
+ return JSON.stringify({
34
+ error: {
35
+ code: "phone-relay-off",
36
+ detail: "The phone relay is off or not started.",
37
+ },
38
+ });
39
+ return JSON.stringify(reply.kind === "result"
40
+ ? withPicture(reply.result)
41
+ : { error: reply.error });
42
+ }
43
+ export async function phoneRead(runtimeDirectory) {
44
+ const reply = await phoneRequest(runtimeDirectory, {
45
+ operation: "phone-state",
46
+ parameters: {},
47
+ });
48
+ if (reply === undefined)
49
+ return JSON.stringify({ relay: "off" });
50
+ return JSON.stringify(reply.kind === "result"
51
+ ? { relay: "on", ...reply.result }
52
+ : { relay: "on", error: reply.error });
53
+ }
@@ -2,7 +2,7 @@ function observedCard(context, card) {
2
2
  if (card.completionMark?.text !== "Needs attention")
3
3
  return card;
4
4
  const run = context.model.runs.find((run) => run.runId === card.runId);
5
- if (run?.workflowId !== "develop-issue" ||
5
+ if (run === undefined ||
6
6
  run.state !== "completed" ||
7
7
  run.outcome !== "blocked" ||
8
8
  run.pullRequest === null)
@@ -6,6 +6,7 @@ export interface WatchCommandOutput {
6
6
  readonly errorCode: string | null;
7
7
  }
8
8
  export interface WatchCommandRequest {
9
+ readonly outputBytes?: number;
9
10
  readonly command: readonly string[];
10
11
  readonly directory: string;
11
12
  readonly signal: AbortSignal;
@@ -1,10 +1,12 @@
1
+ import type { CiRerunNotice } from "./github-ci-progress.ts";
1
2
  import type { WatchRun } from "./watch-render.ts";
2
3
  import { type PrRepository } from "./watch-pr-identity.ts";
3
4
  export interface GithubRecords {
4
5
  readonly started: unknown;
5
6
  readonly result: unknown;
7
+ readonly ciReruns?: readonly CiRerunNotice[];
6
8
  }
7
9
  export declare function pullOf(inputs: {
8
10
  readonly records: readonly GithubRecords[];
9
11
  readonly repository: PrRepository | null;
10
- }, runId: string): Pick<WatchRun, "pullRequest" | "reviews" | "mergeCommit" | "mergeProof">;
12
+ }, runId: string): Pick<WatchRun, "pullRequest" | "reviews" | "mergeCommit" | "mergeProof" | "ciReruns">;
@@ -23,6 +23,11 @@ function list(value) {
23
23
  function count(value) {
24
24
  return typeof value === "number" ? value : null;
25
25
  }
26
+ function methodScope(method, operation) {
27
+ if (operation[3] === "pull-request")
28
+ return operation[4] === `github-${method}`;
29
+ return (method === "merge" && operation[3] === "merge" && operation[4] === "merge");
30
+ }
26
31
  function attributed(started, operation) {
27
32
  const stage = list(operation[5]);
28
33
  const checked = operationIdentity({
@@ -37,8 +42,7 @@ function attributed(started, operation) {
37
42
  });
38
43
  return (checked.kind === "valid" &&
39
44
  checked.value === JSON.stringify(operation) &&
40
- operation[3] === "pull-request" &&
41
- operation[4] === `github-${text(started["method"])}` &&
45
+ methodScope(text(started["method"]), operation) &&
42
46
  (started["runId"] === undefined || started["runId"] === operation[2]));
43
47
  }
44
48
  function githubOf(records) {
@@ -47,22 +51,28 @@ function githubOf(records) {
47
51
  const result = record(records.result);
48
52
  const completed = result["outcome"] === "completed";
49
53
  return {
50
- runId: text(operation[2]),
54
+ runId: started["runId"] === undefined || started["runId"] === operation[2]
55
+ ? text(operation[2])
56
+ : "",
51
57
  round: Number(operation[1]),
58
+ startedAt: Date.parse(text(started["startedAt"])) || 0,
52
59
  method: text(started["method"]),
53
60
  completed,
54
61
  attributed: attributed(started, operation) && !Object.hasOwn(result, "reason"),
55
62
  report: completed ? record(parsed(text(result["result"]))) : {},
56
63
  };
57
64
  }
58
- function pullRequestOf(results) {
65
+ function pullRequestOf(results, repository) {
59
66
  const opened = results
60
- .filter((item) => item.method === "open-pr")
67
+ .filter((item) => item.method === "open-pr" && item.completed)
61
68
  .map((item) => item.report)
62
69
  .findLast((report) => text(report["url"]).startsWith("https://"));
63
70
  if (opened === undefined)
64
71
  return null;
65
- return { number: Number(opened["number"]), url: text(opened["url"]) };
72
+ const pull = { number: Number(opened["number"]), url: text(opened["url"]) };
73
+ return repository === null || prIdentity(repository, pull) !== null
74
+ ? pull
75
+ : null;
66
76
  }
67
77
  function reviewsOf(results) {
68
78
  return results
@@ -115,16 +125,20 @@ export function pullOf(inputs, runId) {
115
125
  const results = inputs.records
116
126
  .map(githubOf)
117
127
  .filter((item) => item.runId === runId)
118
- .toSorted((first, second) => first.round - second.round);
119
- const pullRequest = pullRequestOf(results);
128
+ .toSorted((first, second) => first.round - second.round || first.startedAt - second.startedAt);
129
+ const pullRequest = pullRequestOf(results, inputs.repository);
120
130
  const mergeProof = mergeProofOf(results, {
121
131
  repository: inputs.repository,
122
132
  pullRequest,
123
133
  });
134
+ const ciReruns = inputs.records
135
+ .filter((item) => record(item.started)["runId"] === runId)
136
+ .flatMap((item) => item.ciReruns ?? []);
124
137
  return {
125
138
  pullRequest,
126
139
  reviews: reviewsOf(results),
127
140
  mergeCommit: mergeCommitOf(results),
141
+ ...(ciReruns.length === 0 ? {} : { ciReruns }),
128
142
  ...(mergeProof === null ? {} : { mergeProof }),
129
143
  };
130
144
  }
@@ -1,4 +1,5 @@
1
1
  import { type PrRepository } from "./watch-pr-identity.ts";
2
+ import { type ShownSchedules } from "./schedule-render.ts";
2
3
  import { type WorkflowStages } from "../workflow-declaration.ts";
3
4
  import { type Fields } from "../protocol.ts";
4
5
  import { type WorkflowRefusal } from "../workflow-refusals.ts";
@@ -16,6 +17,7 @@ interface ReadRun {
16
17
  readonly events: readonly ReadEvent[];
17
18
  }
18
19
  export interface WatchRead {
20
+ readonly schedules?: ShownSchedules;
19
21
  readonly queue?: Fields;
20
22
  readonly service: string;
21
23
  readonly workflows: readonly string[];
@@ -1,4 +1,5 @@
1
1
  import { establishedIssue } from "./watch-pr-identity.js";
2
+ import { shownSchedules } from "./schedule-render.js";
2
3
  import { isWorkflowStages, } from "../workflow-declaration.js";
3
4
  import { record } from "../protocol.js";
4
5
  import { send } from "./client.js";
@@ -86,7 +87,6 @@ async function creationOf(reader, runId) {
86
87
  function matchingCompletion(status, context) {
87
88
  const issue = establishedIssue(context.repository, status["issueIdentity"]);
88
89
  return (status.state === "completed" &&
89
- status["workflowId"] === "develop-issue" &&
90
90
  record(status["outcome"])?.["kind"] === "handoff_requested" &&
91
91
  record(status["outcome"])?.["ticketStatus"] !== "partial" &&
92
92
  record(status["outcome"])?.["issueUpdate"] !== "failed" &&
@@ -127,20 +127,17 @@ async function completionOf(reader, search) {
127
127
  reader.completions.set(runId, { ...known, creation });
128
128
  return { status: known.status, events: creation === null ? [] : [creation] };
129
129
  }
130
- function refreshedLinks(run, status) {
131
- const links = Object.fromEntries(["parentRunId", "chainId", "childRunIds"]
130
+ function refreshedStatus(run, status) {
131
+ const links = Object.fromEntries(["parentRunId", "chainId", "childRunIds", "commandWaits"]
132
132
  .filter((name) => Object.hasOwn(status, name))
133
133
  .map((name) => [name, status[name]]));
134
- return {
135
- ...run,
136
- status: { ...run.status, ...links },
137
- };
134
+ return { ...run, status: { ...run.status, ...links } };
138
135
  }
139
136
  async function detailed(reader, summary) {
140
137
  const { runId, latestSequence: sequence } = summary;
141
138
  const known = reader.details.get(runId);
142
139
  if (known !== undefined && known.sequence === sequence)
143
- return refreshedLinks(known.value, summary);
140
+ return refreshedStatus(known.value, summary);
144
141
  const shown = await asked(reader, {
145
142
  operation: "status",
146
143
  parameters: { runId },
@@ -181,13 +178,14 @@ function stoppedIssues(runs, context) {
181
178
  const stopped = runs
182
179
  .map((run) => run.status)
183
180
  .filter((status) => recentRun(status.latestAt, context.now) &&
184
- status["workflowId"] === "develop-issue" &&
185
181
  (["failed", "cancelled"].includes(status.state) ||
186
182
  (status.state === "completed" &&
187
183
  record(status["outcome"])?.["kind"] === "blocked")))
188
- .toSorted((first, second) => Date.parse(second.latestAt ?? "") - Date.parse(first.latestAt ?? ""))
189
- .slice(0, 20);
190
- return new Set(stopped.flatMap((status) => {
184
+ .toSorted((first, second) => Date.parse(second.latestAt ?? "") - Date.parse(first.latestAt ?? ""));
185
+ const retained = [
186
+ ...Map.groupBy(stopped, (status) => status["workflowId"]).values(),
187
+ ].flatMap((group) => group.slice(0, 20));
188
+ return new Set(retained.flatMap((status) => {
191
189
  const issue = establishedIssue(context.repository, status["issueIdentity"]);
192
190
  return status.state === "completed" && issue !== null
193
191
  ? [JSON.stringify(issue)]
@@ -213,9 +211,7 @@ async function service(reader, now) {
213
211
  const issues = stoppedIssues(runs, { now, repository: reader.repository });
214
212
  const older = issues.size === 0
215
213
  ? []
216
- : summaries.filter((summary) => !recentRun(summary.latestAt, now) &&
217
- summary["workflowId"] === "develop-issue" &&
218
- summary.state === "completed");
214
+ : summaries.filter((summary) => !recentRun(summary.latestAt, now) && summary.state === "completed");
219
215
  for (const summary of older) {
220
216
  const candidate = await completionOf(reader, { summary, issues });
221
217
  if (candidate !== null)
@@ -223,6 +219,9 @@ async function service(reader, now) {
223
219
  }
224
220
  return {
225
221
  service: "up",
222
+ ...("schedules" in status
223
+ ? { schedules: shownSchedules(status["schedules"]) }
224
+ : {}),
226
225
  ...(record(status["queue"]) === undefined
227
226
  ? {}
228
227
  : { queue: record(status["queue"]) ?? {} }),
@@ -247,11 +246,13 @@ async function singleRun(reader, runId) {
247
246
  const status = statusOf(reply.result["run"]);
248
247
  const known = reader.details.get(runId);
249
248
  const value = known !== undefined && known.sequence === status.latestSequence
250
- ? refreshedLinks(known.value, status)
249
+ ? refreshedStatus(known.value, status)
251
250
  : await remember(reader, status);
251
+ const metadata = await asked(reader, { operation: "status", parameters: {} });
252
252
  return {
253
253
  ...unavailable,
254
254
  service: "up",
255
+ workflowStages: stageMetadata(metadata["workflowStages"]),
255
256
  runs: [value],
256
257
  decisions: await decisionsOf(reader),
257
258
  };
@@ -1,5 +1,9 @@
1
+ import type { ShownSchedule, ShownSchedules } from "./schedule-render.ts";
2
+ import type { CommandWaitView } from "../authority/command-wait-view.ts";
3
+ import type { CommandEffect } from "../command-settings.ts";
1
4
  import type { CardForm } from "./watch-run-input.ts";
2
- import type { WorkerUsage } from "../worker-usage.ts";
5
+ import type { CiRerunNotice } from "./github-ci-progress.ts";
6
+ import type { WorkerUsage, WorkerAttemptUsage } from "../worker-usage.ts";
3
7
  import type { PrIdentity, PrObservation } from "./watch-pr-identity.ts";
4
8
  import type { WorkflowRefusal } from "../workflow-refusals.ts";
5
9
  import type { Fields } from "../protocol.ts";
@@ -9,6 +13,8 @@ export interface WatchItem {
9
13
  readonly costUsd?: number;
10
14
  }
11
15
  export interface WatchTurn {
16
+ readonly attempts?: readonly WorkerAttemptUsage[];
17
+ readonly harness?: string;
12
18
  readonly estimatedCostUsd: number | null;
13
19
  readonly operationId: string;
14
20
  readonly usage: WorkerUsage;
@@ -64,6 +70,13 @@ export interface WatchStep {
64
70
  readonly startedAt: string | null;
65
71
  }
66
72
  export interface WatchCard {
73
+ readonly scheduled?: {
74
+ readonly slot: number;
75
+ };
76
+ readonly commandWaits?: readonly CommandWaitView[];
77
+ readonly spent?: number | null;
78
+ readonly limit?: number | null;
79
+ readonly awaitedRunId?: string | null;
67
80
  readonly parentRunId?: string | null;
68
81
  readonly chainId?: string;
69
82
  readonly childRunIds?: readonly string[];
@@ -90,6 +103,7 @@ export interface WatchColumn {
90
103
  readonly cards: readonly WatchCard[];
91
104
  }
92
105
  export interface WatchWorkflow {
106
+ readonly schedule?: ShownSchedule;
93
107
  readonly workflowId: string;
94
108
  readonly activeCount: number;
95
109
  readonly waitingCount: number;
@@ -97,6 +111,13 @@ export interface WatchWorkflow {
97
111
  readonly columns: readonly WatchColumn[];
98
112
  }
99
113
  export interface WatchRun {
114
+ readonly scheduled?: {
115
+ readonly slot: number;
116
+ };
117
+ readonly commandWaits?: readonly CommandWaitView[];
118
+ readonly awaitedRunId?: string | null;
119
+ readonly commandEffects?: readonly CommandEffect[];
120
+ readonly ciReruns?: readonly CiRerunNotice[];
100
121
  readonly parentRunId?: string | null;
101
122
  readonly chainId?: string;
102
123
  readonly childRunIds?: readonly string[];
@@ -132,6 +153,7 @@ export interface WatchRun {
132
153
  readonly mergeCommit: string | null;
133
154
  }
134
155
  export interface WatchModel {
156
+ readonly schedules?: ShownSchedules;
135
157
  readonly queue?: Fields;
136
158
  readonly workflowRefusals?: readonly WorkflowRefusal[];
137
159
  readonly cardForms?: readonly CardForm[];
@@ -10,5 +10,4 @@ export interface CardForm {
10
10
  readonly source: "ticket" | "prompt" | "input";
11
11
  readonly fields: readonly CardField[];
12
12
  }
13
- export declare function builtinCardForms(): readonly CardForm[];
14
13
  export declare function cardRunRequest(forms: readonly CardForm[], value: unknown): ServiceRequest | null;
@@ -1,17 +1,4 @@
1
1
  import { record } from "../protocol.js";
2
- export function builtinCardForms() {
3
- const entries = [
4
- ["develop-issue", "ticket", "Issue number"],
5
- ["develop-ticket", "ticket", "Ticket ID"],
6
- ["develop-prd", "prompt", "Idea"],
7
- ["develop-prompt", "prompt", "Task"],
8
- ];
9
- return entries.map(([workflowId, name, label]) => ({
10
- workflowId,
11
- source: name === "ticket" ? "ticket" : "prompt",
12
- fields: [{ name, label, multiline: name === "prompt", optional: false }],
13
- }));
14
- }
15
2
  function validFields(form, fields) {
16
3
  if (Object.keys(fields).some((name) => !form.fields.some((field) => field.name === name)))
17
4
  return false;
@@ -1,5 +1,6 @@
1
1
  import { watchAction, watchActions, watchHost, } from "./watch-actions.js";
2
2
  import { observedBoard } from "./watch-pr-board.js";
3
+ import { isPhoneAction, phoneAction, phoneRead } from "./watch-phone.js";
3
4
  import { watchPrObserver } from "./watch-pr-settings.js";
4
5
  import { readdir, readFile, stat } from "node:fs/promises";
5
6
  import { createServer, } from "node:http";
@@ -7,7 +8,8 @@ import { homedir } from "node:os";
7
8
  import { dirname, join } from "node:path";
8
9
  import { fileURLToPath } from "node:url";
9
10
  import { watchReader } from "./watch-reads.js";
10
- import { turnOf, watchModel } from "./watch-model.js";
11
+ import { ciRerunNotices } from "./github-ci-progress.js";
12
+ import { turnActivity, turnOf, watchModel, } from "./watch-model.js";
11
13
  import { pageDocument } from "./watch-page.js";
12
14
  import { watchStream } from "./watch-stream.js";
13
15
  export const defaultWatchPort = 3663;
@@ -37,7 +39,7 @@ function parsed(text) {
37
39
  return null;
38
40
  }
39
41
  }
40
- const noStream = { size: 0, lines: [], activeAt: null };
42
+ const noStream = { size: 0, activity: [], activeAt: null };
41
43
  async function streamed(watch, file) {
42
44
  const found = await stat(file).catch(() => null);
43
45
  if (found === null)
@@ -46,9 +48,9 @@ async function streamed(watch, file) {
46
48
  const activeAt = found.mtime.toISOString();
47
49
  if (known?.size === found.size)
48
50
  return { ...known, activeAt };
49
- const lines = (await readFile(file, "utf8").catch(() => "")).split("\n");
50
- watch.streams.set(file, { size: found.size, lines });
51
- return { size: found.size, lines, activeAt };
51
+ const activity = turnActivity((await readFile(file, "utf8").catch(() => "")).split("\n"));
52
+ watch.streams.set(file, { size: found.size, activity });
53
+ return { size: found.size, activity, activeAt };
52
54
  }
53
55
  async function stored(file) {
54
56
  return parsed(await readFile(file, "utf8").catch(() => "null"));
@@ -65,7 +67,7 @@ async function turns(watch) {
65
67
  key,
66
68
  started,
67
69
  result: await stored(join(journal, key, "result.json")),
68
- lines: stream.lines,
70
+ activity: stream.activity,
69
71
  activeAt: stream.activeAt,
70
72
  }));
71
73
  }
@@ -82,7 +84,11 @@ async function githubRecords(watch) {
82
84
  if (started === null)
83
85
  continue;
84
86
  const result = await stored(join(journal, key, "result.json"));
85
- watch.github.set(key, { started, result });
87
+ watch.github.set(key, {
88
+ started,
89
+ result,
90
+ ciReruns: await ciRerunNotices(join(journal, key)),
91
+ });
86
92
  }
87
93
  return keys.flatMap((key) => watch.github.get(key) ?? []);
88
94
  }
@@ -121,6 +127,11 @@ async function fontReply(request) {
121
127
  cache: "public, max-age=31536000, immutable",
122
128
  };
123
129
  }
130
+ function routedAction(path) {
131
+ if (isPhoneAction(path))
132
+ return phoneAction;
133
+ return path === "/actions/run" ? watchAction : null;
134
+ }
124
135
  async function answered(watch, request) {
125
136
  if (!watchHost(request))
126
137
  return forbidden;
@@ -130,11 +141,12 @@ async function answered(watch, request) {
130
141
  const url = new URL(String(request.url), "http://localhost");
131
142
  if (request.method === "GET")
132
143
  return readReply(watch, url);
133
- if (request.method !== "POST" ||
134
- url.pathname !== "/actions/run" ||
135
- watch.actions === null)
144
+ if (request.method !== "POST" || watch.actions === null)
145
+ return notFound;
146
+ const act = routedAction(url.pathname);
147
+ if (act === null)
136
148
  return notFound;
137
- const body = await watchAction(watch.actions, request).catch(() => null);
149
+ const body = await act(watch.actions, request).catch(() => null);
138
150
  return body === null
139
151
  ? forbidden
140
152
  : { status: 200, type: "application/json", body };
@@ -153,6 +165,12 @@ async function readReply(watch, url) {
153
165
  type: "text/javascript; charset=utf-8",
154
166
  body: await readFile(libraryFile, "utf8"),
155
167
  };
168
+ if (path === "/phone.json")
169
+ return {
170
+ status: 200,
171
+ type: "application/json",
172
+ body: await phoneRead(watch.settings.runtimeDirectory),
173
+ };
156
174
  if (path !== "/data.json")
157
175
  return notFound;
158
176
  const runId = url.searchParams.get("runId");
@@ -1,5 +1,5 @@
1
1
  import { type Shown } from "./watch-element.ts";
2
- import { type Copying, type WatchDecision, type WatchEvent, type WatchItem, type WatchTurn } from "./watch-render.ts";
2
+ import { type Copying, type WatchDecision, type WatchEvent, type WatchItem, type WatchRun, type WatchTurn } from "./watch-render.ts";
3
3
  export declare function Item(props: {
4
4
  readonly item: WatchItem;
5
5
  }): Shown;
@@ -28,3 +28,6 @@ export declare function Decision(props: {
28
28
  export declare function Events(props: {
29
29
  readonly events: readonly WatchEvent[];
30
30
  }): Shown;
31
+ export declare function PullRequest(props: {
32
+ readonly run: WatchRun;
33
+ }): Shown;
@@ -1,4 +1,4 @@
1
- import { priceText, usageText } from "./usage-render.js";
1
+ import { priceText, usageText, attemptText } from "./usage-render.js";
2
2
  import { component, element } from "./watch-element.js";
3
3
  import { clockTime, counted, groupActivity, turnTime, } from "./watch-render.js";
4
4
  export function Item(props) {
@@ -43,10 +43,17 @@ export function Turn(props) {
43
43
  children: heading.filter((part) => part !== "").join(" · "),
44
44
  }),
45
45
  element("p", { class: "meta", children: place }),
46
+ turn.harness === undefined
47
+ ? null
48
+ : element("p", { class: "meta", children: `Harness: ${turn.harness}` }),
46
49
  element("p", {
47
50
  class: "turn-usage",
48
51
  children: usageText(turn.usage),
49
52
  }),
53
+ ...(turn.attempts ?? []).map((attempt) => element("p", {
54
+ class: "turn-attempt",
55
+ children: attemptText(attempt),
56
+ })),
50
57
  element("div", { class: "activity", children: activity }),
51
58
  ],
52
59
  });
@@ -133,3 +140,32 @@ export function Events(props) {
133
140
  ],
134
141
  });
135
142
  }
143
+ export function PullRequest(props) {
144
+ const { pullRequest, reviews, mergeCommit } = props.run;
145
+ if (pullRequest === null)
146
+ return null;
147
+ const link = element("a", {
148
+ href: pullRequest.url,
149
+ children: `#${String(pullRequest.number)}`,
150
+ });
151
+ const scores = reviews.map((review) => element("li", {
152
+ children: `Round ${String(review.round)} · Review ${String(review.score)}/5 · commit ${review.commit.slice(0, 7)}`,
153
+ }));
154
+ const merge = mergeCommit === null
155
+ ? null
156
+ : element("p", {
157
+ class: "meta",
158
+ children: [
159
+ "Merge commit ",
160
+ element("code", { children: mergeCommit }),
161
+ ],
162
+ });
163
+ return element("section", {
164
+ class: "pull",
165
+ children: [
166
+ element("h3", { children: ["Pull request ", link] }),
167
+ element("ul", { class: "reviews", children: scores }),
168
+ merge,
169
+ ],
170
+ });
171
+ }