cloving 0.3.20 → 1.1.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 (515) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +606 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +271 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +29 -0
  32. package/dist/src/authority/reconciliation.js +156 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +124 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +67 -0
  78. package/dist/src/broker/actor/authority-session.js +251 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/analysis-batches.d.ts +24 -0
  138. package/dist/src/chats/analysis-batches.js +83 -0
  139. package/dist/src/chats/analysis-contract.d.ts +80 -0
  140. package/dist/src/chats/analysis-contract.js +16 -0
  141. package/dist/src/chats/analysis-data.d.ts +3 -0
  142. package/dist/src/chats/analysis-data.js +85 -0
  143. package/dist/src/chats/analysis-input.d.ts +12 -0
  144. package/dist/src/chats/analysis-input.js +83 -0
  145. package/dist/src/chats/analysis-links.d.ts +2 -0
  146. package/dist/src/chats/analysis-links.js +25 -0
  147. package/dist/src/chats/analysis-prompt.d.ts +10 -0
  148. package/dist/src/chats/analysis-prompt.js +16 -0
  149. package/dist/src/chats/analysis-proposal.d.ts +2 -0
  150. package/dist/src/chats/analysis-proposal.js +32 -0
  151. package/dist/src/chats/analysis-provenance.d.ts +4 -0
  152. package/dist/src/chats/analysis-provenance.js +99 -0
  153. package/dist/src/chats/analysis-shape.d.ts +3 -0
  154. package/dist/src/chats/analysis-shape.js +228 -0
  155. package/dist/src/chats/analysis.d.ts +3 -0
  156. package/dist/src/chats/analysis.js +42 -0
  157. package/dist/src/chats/corpus-input.d.ts +5 -0
  158. package/dist/src/chats/corpus-input.js +288 -0
  159. package/dist/src/chats/destination.d.ts +4 -0
  160. package/dist/src/chats/destination.js +96 -0
  161. package/dist/src/chats/import.d.ts +15 -0
  162. package/dist/src/chats/import.js +243 -0
  163. package/dist/src/chats/input-file.d.ts +3 -0
  164. package/dist/src/chats/input-file.js +32 -0
  165. package/dist/src/chats/normalize.d.ts +29 -0
  166. package/dist/src/chats/normalize.js +155 -0
  167. package/dist/src/chats/previous-import.d.ts +5 -0
  168. package/dist/src/chats/previous-import.js +34 -0
  169. package/dist/src/chats/reader.d.ts +21 -0
  170. package/dist/src/chats/reader.js +118 -0
  171. package/dist/src/chats/redact-import.d.ts +14 -0
  172. package/dist/src/chats/redact-import.js +141 -0
  173. package/dist/src/chats/redaction.d.ts +41 -0
  174. package/dist/src/chats/redaction.js +161 -0
  175. package/dist/src/chats/revision-input.d.ts +3 -0
  176. package/dist/src/chats/revision-input.js +180 -0
  177. package/dist/src/chats/revision.d.ts +48 -0
  178. package/dist/src/chats/revision.js +94 -0
  179. package/dist/src/chats/selection.d.ts +25 -0
  180. package/dist/src/chats/selection.js +109 -0
  181. package/dist/src/chats/source.d.ts +23 -0
  182. package/dist/src/chats/source.js +135 -0
  183. package/dist/src/chats/structure.d.ts +57 -0
  184. package/dist/src/chats/structure.js +216 -0
  185. package/dist/src/cli/arguments.d.ts +31 -0
  186. package/dist/src/cli/arguments.js +235 -0
  187. package/dist/src/cli/client.d.ts +16 -0
  188. package/dist/src/cli/client.js +159 -0
  189. package/dist/src/cli/commands.d.ts +17 -0
  190. package/dist/src/cli/commands.js +271 -0
  191. package/dist/src/cli/main.d.ts +2 -0
  192. package/dist/src/cli/main.js +127 -0
  193. package/dist/src/cli/render.d.ts +10 -0
  194. package/dist/src/cli/render.js +254 -0
  195. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  196. package/dist/src/cli/runtime-arguments.js +248 -0
  197. package/dist/src/cli/runtime-directory.d.ts +4 -0
  198. package/dist/src/cli/runtime-directory.js +25 -0
  199. package/dist/src/cli/toolchain.d.ts +3 -0
  200. package/dist/src/cli/toolchain.js +74 -0
  201. package/dist/src/cli/usage-render.d.ts +3 -0
  202. package/dist/src/cli/usage-render.js +28 -0
  203. package/dist/src/cli/usage.d.ts +5 -0
  204. package/dist/src/cli/usage.js +156 -0
  205. package/dist/src/cli/validate.d.ts +38 -0
  206. package/dist/src/cli/validate.js +116 -0
  207. package/dist/src/cli/watch-actions.d.ts +10 -0
  208. package/dist/src/cli/watch-actions.js +58 -0
  209. package/dist/src/cli/watch-board-view.d.ts +54 -0
  210. package/dist/src/cli/watch-board-view.js +201 -0
  211. package/dist/src/cli/watch-board.d.ts +15 -0
  212. package/dist/src/cli/watch-board.js +179 -0
  213. package/dist/src/cli/watch-card-client.d.ts +1 -0
  214. package/dist/src/cli/watch-card-client.js +44 -0
  215. package/dist/src/cli/watch-card-forms.d.ts +2 -0
  216. package/dist/src/cli/watch-card-forms.js +33 -0
  217. package/dist/src/cli/watch-card-reply.d.ts +5 -0
  218. package/dist/src/cli/watch-card-reply.js +34 -0
  219. package/dist/src/cli/watch-card-view.d.ts +40 -0
  220. package/dist/src/cli/watch-card-view.js +86 -0
  221. package/dist/src/cli/watch-client.d.ts +1 -0
  222. package/dist/src/cli/watch-client.js +118 -0
  223. package/dist/src/cli/watch-element.d.ts +11 -0
  224. package/dist/src/cli/watch-element.js +6 -0
  225. package/dist/src/cli/watch-model.d.ts +29 -0
  226. package/dist/src/cli/watch-model.js +278 -0
  227. package/dist/src/cli/watch-navigation.d.ts +9 -0
  228. package/dist/src/cli/watch-navigation.js +40 -0
  229. package/dist/src/cli/watch-page.d.ts +1 -0
  230. package/dist/src/cli/watch-page.js +258 -0
  231. package/dist/src/cli/watch-paths.d.ts +2 -0
  232. package/dist/src/cli/watch-paths.js +52 -0
  233. package/dist/src/cli/watch-phases.d.ts +7 -0
  234. package/dist/src/cli/watch-phases.js +148 -0
  235. package/dist/src/cli/watch-pr-board.d.ts +3 -0
  236. package/dist/src/cli/watch-pr-board.js +26 -0
  237. package/dist/src/cli/watch-pr-command.d.ts +15 -0
  238. package/dist/src/cli/watch-pr-command.js +37 -0
  239. package/dist/src/cli/watch-pr-identity.d.ts +20 -0
  240. package/dist/src/cli/watch-pr-identity.js +62 -0
  241. package/dist/src/cli/watch-pr-observer.d.ts +19 -0
  242. package/dist/src/cli/watch-pr-observer.js +108 -0
  243. package/dist/src/cli/watch-pr-settings.d.ts +8 -0
  244. package/dist/src/cli/watch-pr-settings.js +47 -0
  245. package/dist/src/cli/watch-reads.d.ts +28 -0
  246. package/dist/src/cli/watch-reads.js +248 -0
  247. package/dist/src/cli/watch-render.d.ts +153 -0
  248. package/dist/src/cli/watch-render.js +102 -0
  249. package/dist/src/cli/watch-run-input.d.ts +14 -0
  250. package/dist/src/cli/watch-run-input.js +49 -0
  251. package/dist/src/cli/watch-server.d.ts +13 -0
  252. package/dist/src/cli/watch-server.js +214 -0
  253. package/dist/src/cli/watch-start-view.d.ts +18 -0
  254. package/dist/src/cli/watch-start-view.js +77 -0
  255. package/dist/src/cli/watch-stream.d.ts +11 -0
  256. package/dist/src/cli/watch-stream.js +128 -0
  257. package/dist/src/cli/watch-turn.d.ts +30 -0
  258. package/dist/src/cli/watch-turn.js +135 -0
  259. package/dist/src/cli/watch-usage.d.ts +6 -0
  260. package/dist/src/cli/watch-usage.js +65 -0
  261. package/dist/src/cli/watch-view.d.ts +54 -0
  262. package/dist/src/cli/watch-view.js +267 -0
  263. package/dist/src/cli.d.ts +2 -0
  264. package/dist/src/cli.js +104 -0
  265. package/dist/src/daemon/analysis-launch.d.ts +5 -0
  266. package/dist/src/daemon/analysis-launch.js +81 -0
  267. package/dist/src/daemon/analysis-token.d.ts +6 -0
  268. package/dist/src/daemon/analysis-token.js +88 -0
  269. package/dist/src/daemon/analysis-worker.d.ts +22 -0
  270. package/dist/src/daemon/analysis-worker.js +219 -0
  271. package/dist/src/daemon/chats-files.d.ts +15 -0
  272. package/dist/src/daemon/chats-files.js +113 -0
  273. package/dist/src/daemon/chats-worker.d.ts +12 -0
  274. package/dist/src/daemon/chats-worker.js +200 -0
  275. package/dist/src/daemon/claude-turn.d.ts +38 -0
  276. package/dist/src/daemon/claude-turn.js +216 -0
  277. package/dist/src/daemon/claude-worker.d.ts +29 -0
  278. package/dist/src/daemon/claude-worker.js +276 -0
  279. package/dist/src/daemon/codex-stream.d.ts +4 -0
  280. package/dist/src/daemon/codex-stream.js +129 -0
  281. package/dist/src/daemon/daemon.d.ts +49 -0
  282. package/dist/src/daemon/daemon.js +195 -0
  283. package/dist/src/daemon/delivery-router.d.ts +10 -0
  284. package/dist/src/daemon/delivery-router.js +34 -0
  285. package/dist/src/daemon/github-calls.d.ts +29 -0
  286. package/dist/src/daemon/github-calls.js +127 -0
  287. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  288. package/dist/src/daemon/github-issue-methods.js +99 -0
  289. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  290. package/dist/src/daemon/github-issue-privacy.js +131 -0
  291. package/dist/src/daemon/github-merge.d.ts +18 -0
  292. package/dist/src/daemon/github-merge.js +259 -0
  293. package/dist/src/daemon/github-methods.d.ts +5 -0
  294. package/dist/src/daemon/github-methods.js +202 -0
  295. package/dist/src/daemon/github-operation.d.ts +38 -0
  296. package/dist/src/daemon/github-operation.js +57 -0
  297. package/dist/src/daemon/github-ticket-status.d.ts +3 -0
  298. package/dist/src/daemon/github-ticket-status.js +268 -0
  299. package/dist/src/daemon/github-worker.d.ts +17 -0
  300. package/dist/src/daemon/github-worker.js +281 -0
  301. package/dist/src/daemon/host-environment.d.ts +8 -0
  302. package/dist/src/daemon/host-environment.js +14 -0
  303. package/dist/src/daemon/issue-queue.d.ts +10 -0
  304. package/dist/src/daemon/issue-queue.js +254 -0
  305. package/dist/src/daemon/notify-message.d.ts +14 -0
  306. package/dist/src/daemon/notify-message.js +48 -0
  307. package/dist/src/daemon/notify.d.ts +12 -0
  308. package/dist/src/daemon/notify.js +161 -0
  309. package/dist/src/daemon/operation-journal.d.ts +43 -0
  310. package/dist/src/daemon/operation-journal.js +55 -0
  311. package/dist/src/daemon/retrying-turn.d.ts +9 -0
  312. package/dist/src/daemon/retrying-turn.js +185 -0
  313. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  314. package/dist/src/daemon/ticket-registration.js +177 -0
  315. package/dist/src/daemon/ticket-source.d.ts +17 -0
  316. package/dist/src/daemon/ticket-source.js +36 -0
  317. package/dist/src/daemon/work-tree.d.ts +26 -0
  318. package/dist/src/daemon/work-tree.js +206 -0
  319. package/dist/src/effect-authorization.d.ts +21 -0
  320. package/dist/src/effect-authorization.js +14 -0
  321. package/dist/src/execution-pin.d.ts +4 -0
  322. package/dist/src/execution-pin.js +68 -0
  323. package/dist/src/host/start-delivery.d.ts +41 -0
  324. package/dist/src/host/start-delivery.js +68 -0
  325. package/dist/src/host/step-bridge-host.d.ts +79 -0
  326. package/dist/src/host/step-bridge-host.js +205 -0
  327. package/dist/src/host/step-claims.d.ts +31 -0
  328. package/dist/src/host/step-claims.js +85 -0
  329. package/dist/src/host/world-host.d.ts +21 -0
  330. package/dist/src/host/world-host.js +51 -0
  331. package/dist/src/host/world-reconciliation.d.ts +39 -0
  332. package/dist/src/host/world-reconciliation.js +81 -0
  333. package/dist/src/host/world-runs.d.ts +14 -0
  334. package/dist/src/host/world-runs.js +69 -0
  335. package/dist/src/operation-identity.d.ts +7 -0
  336. package/dist/src/operation-identity.js +59 -0
  337. package/dist/src/protocol.d.ts +35 -0
  338. package/dist/src/protocol.js +64 -0
  339. package/dist/src/resource-files.d.ts +1 -0
  340. package/dist/src/resource-files.js +29 -0
  341. package/dist/src/service/changes.d.ts +11 -0
  342. package/dist/src/service/changes.js +32 -0
  343. package/dist/src/service/decision-handler.d.ts +9 -0
  344. package/dist/src/service/decision-handler.js +233 -0
  345. package/dist/src/service/event-handler.d.ts +10 -0
  346. package/dist/src/service/event-handler.js +70 -0
  347. package/dist/src/service/expiry.d.ts +13 -0
  348. package/dist/src/service/expiry.js +53 -0
  349. package/dist/src/service/gateway.d.ts +21 -0
  350. package/dist/src/service/gateway.js +120 -0
  351. package/dist/src/service/registry.d.ts +40 -0
  352. package/dist/src/service/registry.js +13 -0
  353. package/dist/src/service/replies.d.ts +26 -0
  354. package/dist/src/service/replies.js +56 -0
  355. package/dist/src/service/run-handlers.d.ts +4 -0
  356. package/dist/src/service/run-handlers.js +263 -0
  357. package/dist/src/service/service.d.ts +58 -0
  358. package/dist/src/service/service.js +212 -0
  359. package/dist/src/service/submission-handler.d.ts +4 -0
  360. package/dist/src/service/submission-handler.js +206 -0
  361. package/dist/src/service/transport.d.ts +16 -0
  362. package/dist/src/service/transport.js +141 -0
  363. package/dist/src/service/worker-port.d.ts +85 -0
  364. package/dist/src/service/worker-port.js +126 -0
  365. package/dist/src/service/worker-totals.d.ts +3 -0
  366. package/dist/src/service/worker-totals.js +28 -0
  367. package/dist/src/step-bridge.d.ts +57 -0
  368. package/dist/src/step-bridge.js +4 -0
  369. package/dist/src/steps/decision-gate.d.ts +2 -0
  370. package/dist/src/steps/decision-gate.js +8 -0
  371. package/dist/src/steps/load-cycle.d.ts +10 -0
  372. package/dist/src/steps/load-cycle.js +11 -0
  373. package/dist/src/steps/protected-effect.d.ts +2 -0
  374. package/dist/src/steps/protected-effect.js +8 -0
  375. package/dist/src/storage/decision-rows.d.ts +54 -0
  376. package/dist/src/storage/decision-rows.js +72 -0
  377. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  378. package/dist/src/storage/decision-snapshots.js +25 -0
  379. package/dist/src/storage/domain-changes.d.ts +48 -0
  380. package/dist/src/storage/domain-changes.js +213 -0
  381. package/dist/src/storage/domain-rows.d.ts +85 -0
  382. package/dist/src/storage/domain-rows.js +129 -0
  383. package/dist/src/storage/domain-schema.d.ts +32 -0
  384. package/dist/src/storage/domain-schema.js +193 -0
  385. package/dist/src/storage/effect-changes.d.ts +5 -0
  386. package/dist/src/storage/effect-changes.js +105 -0
  387. package/dist/src/storage/effect-rows.d.ts +67 -0
  388. package/dist/src/storage/effect-rows.js +74 -0
  389. package/dist/src/storage/effect-schema.d.ts +1 -0
  390. package/dist/src/storage/effect-schema.js +59 -0
  391. package/dist/src/storage/statements.d.ts +9 -0
  392. package/dist/src/storage/statements.js +8 -0
  393. package/dist/src/submission.d.ts +42 -0
  394. package/dist/src/submission.js +71 -0
  395. package/dist/src/ticket-status.d.ts +8 -0
  396. package/dist/src/ticket-status.js +45 -0
  397. package/dist/src/token-prices.d.ts +19 -0
  398. package/dist/src/token-prices.js +76 -0
  399. package/dist/src/turn-profile.d.ts +13 -0
  400. package/dist/src/turn-profile.js +100 -0
  401. package/dist/src/worker-usage.d.ts +22 -0
  402. package/dist/src/worker-usage.js +44 -0
  403. package/dist/src/workflow-admission.d.ts +45 -0
  404. package/dist/src/workflow-admission.js +151 -0
  405. package/dist/src/workflow-candidate.d.ts +29 -0
  406. package/dist/src/workflow-candidate.js +59 -0
  407. package/dist/src/workflow-contracts.d.ts +29 -0
  408. package/dist/src/workflow-contracts.js +110 -0
  409. package/dist/src/workflow-declaration.d.ts +11 -0
  410. package/dist/src/workflow-declaration.js +59 -0
  411. package/dist/src/workflow-resources.d.ts +8 -0
  412. package/dist/src/workflow-resources.js +14 -0
  413. package/dist/src/workflows.d.ts +6 -0
  414. package/dist/src/workflows.js +4 -0
  415. package/dist/tools/compile-workflows.d.ts +1 -0
  416. package/dist/tools/compile-workflows.js +33 -0
  417. package/dist/tools/self-host-processes.d.ts +10 -0
  418. package/dist/tools/self-host-processes.js +156 -0
  419. package/dist/tools/self-host-workflows.d.ts +15 -0
  420. package/dist/tools/self-host-workflows.js +78 -0
  421. package/dist/tools/self-host.d.ts +1 -0
  422. package/dist/tools/self-host.js +261 -0
  423. package/dist/tools/self-update-host.d.ts +13 -0
  424. package/dist/tools/self-update-host.js +88 -0
  425. package/dist/tools/self-update.d.ts +11 -0
  426. package/dist/tools/self-update.js +177 -0
  427. package/dist/tools/workflow-manifest.d.ts +3 -0
  428. package/dist/tools/workflow-manifest.js +34 -0
  429. package/dist/workflows/analyze-chats.d.ts +10 -0
  430. package/dist/workflows/analyze-chats.declaration.json +9 -0
  431. package/dist/workflows/analyze-chats.js +73 -0
  432. package/dist/workflows/develop-prd.d.ts +7 -0
  433. package/dist/workflows/develop-prd.js +97 -0
  434. package/dist/workflows/develop-ticket.d.ts +9 -0
  435. package/dist/workflows/develop-ticket.js +202 -0
  436. package/dist/workflows/issue-labels.d.ts +16 -0
  437. package/dist/workflows/issue-labels.js +70 -0
  438. package/dist/workflows/ticket-prompts.d.ts +35 -0
  439. package/dist/workflows/ticket-prompts.js +133 -0
  440. package/package.json +84 -75
  441. package/dist/abstract_gpt/index.js +0 -55
  442. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  443. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  444. package/dist/cloving_gpt/adapters/claude.js +0 -128
  445. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  446. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  447. package/dist/cloving_gpt/adapters/index.js +0 -2
  448. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  449. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  450. package/dist/cloving_gpt/adapters/openai.js +0 -100
  451. package/dist/cloving_gpt/index.js +0 -192
  452. package/dist/commands/analyze.js +0 -47
  453. package/dist/commands/chat.js +0 -14
  454. package/dist/commands/check.js +0 -7
  455. package/dist/commands/commit.js +0 -44
  456. package/dist/commands/config.js +0 -167
  457. package/dist/commands/describe.js +0 -235
  458. package/dist/commands/generate/code.js +0 -21
  459. package/dist/commands/generate/commit.js +0 -11
  460. package/dist/commands/generate/context.js +0 -82
  461. package/dist/commands/generate/docs.js +0 -11
  462. package/dist/commands/generate/documentation.js +0 -11
  463. package/dist/commands/generate/fizzbuzz.js +0 -35
  464. package/dist/commands/generate/init.js +0 -15
  465. package/dist/commands/generate/review.js +0 -11
  466. package/dist/commands/generate/sh.js +0 -95
  467. package/dist/commands/generate/shell.js +0 -11
  468. package/dist/commands/generate/unit_tests.js +0 -11
  469. package/dist/commands/init.js +0 -13
  470. package/dist/commands/models.js +0 -22
  471. package/dist/commands/project/build.js +0 -88
  472. package/dist/commands/project/complete.js +0 -12
  473. package/dist/commands/project/init.js +0 -82
  474. package/dist/commands/project/plan.js +0 -108
  475. package/dist/commands/proxy.js +0 -11
  476. package/dist/commands/review.js +0 -50
  477. package/dist/commands/tokens.js +0 -75
  478. package/dist/commands/unit_tests.js +0 -150
  479. package/dist/commands/update.js +0 -7
  480. package/dist/file2.js +0 -4
  481. package/dist/index.js +0 -136
  482. package/dist/managers/BlockManager.js +0 -120
  483. package/dist/managers/ChatManager.js +0 -653
  484. package/dist/managers/ChunkManager.js +0 -32
  485. package/dist/managers/CodeManager.js +0 -185
  486. package/dist/managers/CommitManager.js +0 -78
  487. package/dist/managers/DocsManager.js +0 -88
  488. package/dist/managers/DocumentationManager.js +0 -114
  489. package/dist/managers/InitManager.js +0 -230
  490. package/dist/managers/ProxyManager.js +0 -210
  491. package/dist/managers/ReviewManager.js +0 -131
  492. package/dist/managers/ShellManager.js +0 -163
  493. package/dist/managers/StreamManager.js +0 -308
  494. package/dist/managers/UnitTestManager.js +0 -243
  495. package/dist/managers/src/managers/ProxyManager.js +0 -1
  496. package/dist/newfile.js +0 -2
  497. package/dist/package.json +0 -86
  498. package/dist/utils/command_utils.js +0 -384
  499. package/dist/utils/config_utils.js +0 -249
  500. package/dist/utils/gitUtils.js +0 -42
  501. package/dist/utils/git_utils.js +0 -217
  502. package/dist/utils/modelUtils.js +0 -7
  503. package/dist/utils/model_utils.js +0 -7
  504. package/dist/utils/prompt_utils.js +0 -333
  505. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  506. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  507. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  508. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  509. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  510. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  511. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  512. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  513. package/dist/utils/prompts/index.js +0 -27
  514. package/dist/utils/string_utils.js +0 -505
  515. package/dist/utils/types.js +0 -2
@@ -0,0 +1,108 @@
1
+ import { prArguments, prCommandResult, } from "./watch-pr-command.js";
2
+ import { prIdentity, } from "./watch-pr-identity.js";
3
+ const systemClock = {
4
+ now: Date.now,
5
+ after: (expired, milliseconds) => {
6
+ const timer = setTimeout(expired, milliseconds);
7
+ return () => {
8
+ clearTimeout(timer);
9
+ };
10
+ },
11
+ };
12
+ async function readPr(state, attempt) {
13
+ const { entry, controller } = attempt;
14
+ const deadline = { expired: false };
15
+ const timeout = { status: "unavailable", failure: "timeout" };
16
+ const cancel = state.clock.after(() => {
17
+ deadline.expired = true;
18
+ entry.result = timeout;
19
+ controller.abort();
20
+ }, 5000);
21
+ controller.signal.addEventListener("abort", cancel, { once: true });
22
+ try {
23
+ const output = await Promise.resolve().then(() => state.settings.execute({
24
+ command: [
25
+ ...(state.settings.command ?? []),
26
+ ...prArguments(entry.identity),
27
+ ],
28
+ directory: state.settings.directory,
29
+ signal: controller.signal,
30
+ }));
31
+ return deadline.expired ? timeout : prCommandResult(entry.identity, output);
32
+ }
33
+ catch {
34
+ return deadline.expired
35
+ ? timeout
36
+ : { status: "unavailable", failure: "command" };
37
+ }
38
+ finally {
39
+ cancel();
40
+ controller.signal.removeEventListener("abort", cancel);
41
+ }
42
+ }
43
+ function pump(state) {
44
+ if (state.closed || state.active !== null)
45
+ return;
46
+ const entry = state.queue.shift();
47
+ if (entry === undefined)
48
+ return;
49
+ const controller = new AbortController();
50
+ state.active = controller;
51
+ entry.started = state.clock.now();
52
+ const completed = (result) => {
53
+ entry.result = result;
54
+ entry.pending = false;
55
+ state.active = null;
56
+ pump(state);
57
+ };
58
+ readPr(state, { entry, controller }).then(completed, () => {
59
+ completed({ status: "unavailable", failure: "command" });
60
+ });
61
+ }
62
+ function needsRead(entry, now) {
63
+ if (entry === undefined)
64
+ return true;
65
+ if (entry.pending || entry.result?.status === "merged")
66
+ return false;
67
+ return now - entry.started >= 60000;
68
+ }
69
+ export function prObserver(settings) {
70
+ const state = {
71
+ settings,
72
+ clock: settings.clock ?? systemClock,
73
+ cache: new Map(),
74
+ queue: [],
75
+ active: null,
76
+ closed: false,
77
+ };
78
+ const configured = settings.repository !== null && Boolean(settings.command?.[0]?.trim());
79
+ const observe = (pullRequest) => {
80
+ if (!configured)
81
+ return { status: "unavailable", failure: "configuration" };
82
+ const identity = prIdentity(settings.repository, pullRequest);
83
+ if (identity === null)
84
+ return { status: "unavailable", failure: "identity" };
85
+ const key = JSON.stringify(identity);
86
+ const known = state.cache.get(key);
87
+ if (state.closed || !needsRead(known, state.clock.now()))
88
+ return known?.result ?? null;
89
+ const entry = {
90
+ identity,
91
+ result: known?.result ?? null,
92
+ started: Infinity,
93
+ pending: true,
94
+ };
95
+ state.cache.set(key, entry);
96
+ state.queue.push(entry);
97
+ pump(state);
98
+ return entry.result;
99
+ };
100
+ return {
101
+ observe,
102
+ close: () => {
103
+ state.closed = true;
104
+ state.queue.length = 0;
105
+ state.active?.abort();
106
+ },
107
+ };
108
+ }
@@ -0,0 +1,8 @@
1
+ import type { WatchCommandRunner } from "./watch-pr-command.ts";
2
+ import { type PrObserver } from "./watch-pr-observer.ts";
3
+ export interface WatchPrSettings {
4
+ readonly repository: string | undefined;
5
+ readonly githubCommand: string | undefined;
6
+ readonly execute: WatchCommandRunner;
7
+ }
8
+ export declare function watchPrObserver(settings: WatchPrSettings): Promise<PrObserver>;
@@ -0,0 +1,47 @@
1
+ import { prRepository } from "./watch-pr-identity.js";
2
+ import { prObserver } from "./watch-pr-observer.js";
3
+ function githubCommand(given) {
4
+ if (given === undefined)
5
+ return ["gh"];
6
+ try {
7
+ const parsed = JSON.parse(given);
8
+ if (!Array.isArray(parsed) ||
9
+ !parsed.every((part) => typeof part === "string"))
10
+ return null;
11
+ return parsed.map(String);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ export async function watchPrObserver(settings) {
18
+ const directory = settings.repository;
19
+ const command = githubCommand(settings.githubCommand);
20
+ const output = directory === undefined
21
+ ? null
22
+ : await settings
23
+ .execute({
24
+ command: [
25
+ "git",
26
+ "config",
27
+ "--local",
28
+ "--get-all",
29
+ "remote.origin.url",
30
+ ],
31
+ directory,
32
+ signal: AbortSignal.timeout(5000),
33
+ })
34
+ .catch(() => null);
35
+ if (output?.errorCode === "ENOENT" || output?.errorCode === "EACCES")
36
+ return {
37
+ observe: () => ({ status: "unavailable", failure: "command" }),
38
+ close: () => undefined,
39
+ };
40
+ const repository = output?.status === 0 ? prRepository(output.stdout) : null;
41
+ return prObserver({
42
+ repository,
43
+ directory: directory ?? "",
44
+ command,
45
+ execute: settings.execute,
46
+ });
47
+ }
@@ -0,0 +1,28 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ interface ReadStatus extends Fields {
3
+ readonly runId: string;
4
+ readonly latestSequence: number;
5
+ readonly state: string;
6
+ readonly latestAt: string | null;
7
+ }
8
+ interface ReadEvent extends Fields {
9
+ readonly sequence: number;
10
+ }
11
+ interface ReadRun {
12
+ readonly status: ReadStatus;
13
+ readonly events: readonly ReadEvent[];
14
+ }
15
+ export interface WatchRead {
16
+ readonly service: string;
17
+ readonly workflows: readonly string[];
18
+ readonly summaries: readonly ReadStatus[];
19
+ readonly runs: readonly ReadRun[];
20
+ readonly completionCandidates: readonly ReadRun[];
21
+ readonly decisions: readonly unknown[];
22
+ }
23
+ export interface WatchReader {
24
+ readonly read: (now: string) => Promise<WatchRead>;
25
+ readonly run: (runId: string) => Promise<WatchRead>;
26
+ }
27
+ export declare function watchReader(runtimeDirectory: string): WatchReader;
28
+ export {};
@@ -0,0 +1,248 @@
1
+ import { record } from "../protocol.js";
2
+ import { send } from "./client.js";
3
+ import { activeRun, recentRun } from "./watch-board.js";
4
+ const unavailable = {
5
+ service: "down",
6
+ workflows: [],
7
+ summaries: [],
8
+ runs: [],
9
+ completionCandidates: [],
10
+ decisions: [],
11
+ };
12
+ function list(value) {
13
+ return Array.isArray(value) ? value.map((item) => item) : [];
14
+ }
15
+ function statusOf(value) {
16
+ const fields = record(value);
17
+ const runId = fields?.["runId"];
18
+ const latestSequence = fields?.["latestSequence"];
19
+ const state = fields?.["state"];
20
+ const latestAt = fields?.["latestAt"];
21
+ if (typeof runId !== "string" ||
22
+ typeof latestSequence !== "number" ||
23
+ typeof state !== "string")
24
+ throw new Error("invalid-run-status");
25
+ return {
26
+ ...fields,
27
+ runId,
28
+ latestSequence,
29
+ state,
30
+ latestAt: typeof latestAt === "string" ? latestAt : null,
31
+ };
32
+ }
33
+ function eventOf(value) {
34
+ const fields = record(value);
35
+ const sequence = fields?.["sequence"];
36
+ if (typeof sequence !== "number")
37
+ throw new Error("invalid-event-page");
38
+ return { ...fields, sequence };
39
+ }
40
+ async function asked(reader, request) {
41
+ const reply = await send(reader.runtimeDirectory, request);
42
+ if (reply.kind === "error")
43
+ throw new Error(reply.error.code);
44
+ return reply.result;
45
+ }
46
+ async function* eventPages(reader, cursor) {
47
+ let after = 0;
48
+ for (;;) {
49
+ const limit = after === 0 ? (cursor.firstLimit ?? 1000) : 1000;
50
+ const page = await asked(reader, {
51
+ operation: "events",
52
+ parameters: { runId: cursor.runId, after, limit },
53
+ });
54
+ const batch = list(page["events"]).map(eventOf);
55
+ yield batch;
56
+ if (batch.length < limit)
57
+ return;
58
+ const next = batch.at(-1)?.sequence;
59
+ if (next === undefined || next <= after)
60
+ throw new Error("invalid-event-page");
61
+ after = next;
62
+ }
63
+ }
64
+ async function eventsOf(reader, runId) {
65
+ const events = [];
66
+ for await (const batch of eventPages(reader, { runId }))
67
+ events.push(...batch);
68
+ return events;
69
+ }
70
+ async function creationOf(reader, runId) {
71
+ for await (const batch of eventPages(reader, { runId, firstLimit: 1 })) {
72
+ const event = batch.find((value) => value["type"] === "run.created");
73
+ if (event !== undefined)
74
+ return {
75
+ sequence: event.sequence,
76
+ type: event["type"],
77
+ recordedAt: event["recordedAt"],
78
+ };
79
+ }
80
+ return null;
81
+ }
82
+ function matchingCompletion(status, ticketIds) {
83
+ const ticketId = status["ticketId"];
84
+ return (status.state === "completed" &&
85
+ status["workflowId"] === "develop-issue" &&
86
+ record(status["outcome"])?.["kind"] === "handoff_requested" &&
87
+ record(status["outcome"])?.["ticketStatus"] !== "partial" &&
88
+ record(status["outcome"])?.["issueUpdate"] !== "failed" &&
89
+ typeof ticketId === "string" &&
90
+ ticketIds.has(ticketId));
91
+ }
92
+ async function completionOf(reader, search) {
93
+ const { runId, latestSequence } = search.summary;
94
+ let known = reader.completions.get(runId);
95
+ if (known?.status.latestSequence !== latestSequence) {
96
+ const shown = await asked(reader, {
97
+ operation: "status",
98
+ parameters: { runId },
99
+ });
100
+ const status = statusOf(shown["run"]);
101
+ known = {
102
+ status: {
103
+ runId,
104
+ latestSequence: status.latestSequence,
105
+ latestAt: status.latestAt,
106
+ state: status.state,
107
+ workflowId: status["workflowId"],
108
+ ticketId: status["ticketId"],
109
+ outcome: status["outcome"],
110
+ },
111
+ };
112
+ reader.completions.set(runId, known);
113
+ }
114
+ if (!matchingCompletion(known.status, search.ticketIds))
115
+ return null;
116
+ const creation = known.creation === undefined
117
+ ? await creationOf(reader, runId)
118
+ : known.creation;
119
+ reader.completions.set(runId, { ...known, creation });
120
+ return { status: known.status, events: creation === null ? [] : [creation] };
121
+ }
122
+ async function detailed(reader, summary) {
123
+ const { runId, latestSequence: sequence } = summary;
124
+ const known = reader.details.get(runId);
125
+ if (known !== undefined && known.sequence === sequence)
126
+ return known.value;
127
+ const shown = await asked(reader, {
128
+ operation: "status",
129
+ parameters: { runId },
130
+ });
131
+ return remember(reader, statusOf(shown["run"]));
132
+ }
133
+ async function remember(reader, status) {
134
+ const { runId, latestSequence: sequence } = status;
135
+ const value = { status, events: await eventsOf(reader, runId) };
136
+ reader.details.set(runId, { sequence, value });
137
+ return value;
138
+ }
139
+ async function allRuns(reader, first) {
140
+ const runs = list(first["runs"]).map(statusOf);
141
+ let next = first["next"];
142
+ const visited = new Set();
143
+ while (typeof next === "string") {
144
+ if (visited.has(next))
145
+ throw new Error("invalid-run-page");
146
+ visited.add(next);
147
+ const page = await asked(reader, {
148
+ operation: "status",
149
+ parameters: { after: next },
150
+ });
151
+ runs.push(...list(page["runs"]).map(statusOf));
152
+ next = page["next"];
153
+ }
154
+ return runs;
155
+ }
156
+ async function decisionsOf(reader) {
157
+ const questions = await asked(reader, {
158
+ operation: "questions",
159
+ parameters: {},
160
+ });
161
+ return list(questions["decisions"]);
162
+ }
163
+ function stoppedTicketIds(runs, now) {
164
+ const stopped = runs
165
+ .map((run) => run.status)
166
+ .filter((status) => recentRun(status.latestAt, now) &&
167
+ status["workflowId"] === "develop-issue" &&
168
+ (["failed", "cancelled"].includes(status.state) ||
169
+ (status.state === "completed" &&
170
+ record(status["outcome"])?.["kind"] === "blocked")))
171
+ .toSorted((first, second) => Date.parse(second.latestAt ?? "") - Date.parse(first.latestAt ?? ""))
172
+ .slice(0, 20);
173
+ return new Set(stopped.flatMap((status) => {
174
+ const ticketId = status["ticketId"];
175
+ return status.state === "completed" &&
176
+ record(status["outcome"])?.["ticketStatus"] !== "partial" &&
177
+ record(status["outcome"])?.["issueUpdate"] !== "failed" &&
178
+ typeof ticketId === "string" &&
179
+ ticketId !== ""
180
+ ? [ticketId]
181
+ : [];
182
+ }));
183
+ }
184
+ async function service(reader, now) {
185
+ const status = await asked(reader, {
186
+ operation: "status",
187
+ parameters: {},
188
+ }).catch(() => null);
189
+ if (status === null || !Array.isArray(status["runs"]))
190
+ return unavailable;
191
+ const summaries = await allRuns(reader, status);
192
+ const runs = [];
193
+ const completionCandidates = [];
194
+ const current = summaries.filter((summary) => activeRun(summary.state) || recentRun(summary.latestAt, now));
195
+ for (const summary of current)
196
+ runs.push(await detailed(reader, summary));
197
+ const ticketIds = stoppedTicketIds(runs, now);
198
+ const older = ticketIds.size === 0
199
+ ? []
200
+ : summaries.filter((summary) => !recentRun(summary.latestAt, now) &&
201
+ summary["workflowId"] === "develop-issue" &&
202
+ summary.state === "completed");
203
+ for (const summary of older) {
204
+ const candidate = await completionOf(reader, { summary, ticketIds });
205
+ if (candidate !== null)
206
+ completionCandidates.push(candidate);
207
+ }
208
+ return {
209
+ service: "up",
210
+ workflows: list(status["workflows"]).filter((value) => typeof value === "string"),
211
+ summaries,
212
+ runs,
213
+ completionCandidates,
214
+ decisions: await decisionsOf(reader),
215
+ };
216
+ }
217
+ async function singleRun(reader, runId) {
218
+ const reply = await send(reader.runtimeDirectory, {
219
+ operation: "status",
220
+ parameters: { runId },
221
+ });
222
+ if (reply.kind === "error" && reply.error.code === "unknown-run")
223
+ return unavailable;
224
+ if (reply.kind === "error")
225
+ throw new Error(reply.error.code);
226
+ const status = statusOf(reply.result["run"]);
227
+ const known = reader.details.get(runId);
228
+ const value = known !== undefined && known.sequence === status.latestSequence
229
+ ? known.value
230
+ : await remember(reader, status);
231
+ return {
232
+ ...unavailable,
233
+ service: "up",
234
+ runs: [value],
235
+ decisions: await decisionsOf(reader),
236
+ };
237
+ }
238
+ export function watchReader(runtimeDirectory) {
239
+ const reader = {
240
+ runtimeDirectory,
241
+ details: new Map(),
242
+ completions: new Map(),
243
+ };
244
+ return {
245
+ read: (now) => service(reader, now),
246
+ run: (runId) => singleRun(reader, runId),
247
+ };
248
+ }
@@ -0,0 +1,153 @@
1
+ import type { CardForm } from "./watch-run-input.ts";
2
+ import type { WorkerUsage } from "../worker-usage.ts";
3
+ import type { PrObservation } from "./watch-pr-identity.ts";
4
+ export interface WatchItem {
5
+ readonly kind: string;
6
+ readonly text: string;
7
+ readonly costUsd?: number;
8
+ }
9
+ export interface WatchTurn {
10
+ readonly estimatedCostUsd: number | null;
11
+ readonly operationId: string;
12
+ readonly usage: WorkerUsage;
13
+ readonly key: string;
14
+ readonly runId: string;
15
+ readonly target: string;
16
+ readonly branch: string;
17
+ readonly worktree: string;
18
+ readonly startedAt: string;
19
+ readonly endedAt: string | null;
20
+ readonly activeAt: string | null;
21
+ readonly outcome: string;
22
+ readonly costUsd: number | null;
23
+ readonly activity: readonly WatchItem[];
24
+ readonly commits: readonly string[];
25
+ readonly files: readonly string[];
26
+ readonly uncommitted: readonly string[];
27
+ readonly summary: string;
28
+ }
29
+ export interface WatchDecision {
30
+ readonly decisionId: string;
31
+ readonly type: string;
32
+ readonly prompt: string;
33
+ readonly approve: string;
34
+ readonly deny: string;
35
+ }
36
+ export interface WatchEvent {
37
+ readonly sequence: number;
38
+ readonly recordedAt: string;
39
+ readonly type: string;
40
+ }
41
+ export interface WatchPhase {
42
+ readonly name: string;
43
+ readonly state: string;
44
+ readonly startedAt: string | null;
45
+ readonly endedAt: string | null;
46
+ }
47
+ export interface WatchFeedback {
48
+ readonly decisionId: string;
49
+ readonly text: string;
50
+ }
51
+ export interface WatchPullRequest {
52
+ readonly number: number;
53
+ readonly url: string;
54
+ }
55
+ export interface WatchReview {
56
+ readonly round: number;
57
+ readonly commit: string;
58
+ readonly score: number;
59
+ }
60
+ export interface WatchStep {
61
+ readonly name: string;
62
+ readonly startedAt: string | null;
63
+ }
64
+ export interface WatchCard {
65
+ readonly estimatedCostUsd: number | null;
66
+ readonly runId: string;
67
+ readonly title: string | null;
68
+ readonly claudeCostUsd: number | null;
69
+ readonly usage: WorkerUsage;
70
+ readonly currentStep: WatchStep | null;
71
+ readonly endedAt: string | null;
72
+ readonly decisionWaiting: boolean;
73
+ readonly round: number | null;
74
+ readonly greptileScore: number | null;
75
+ readonly pullRequestNumber: number | null;
76
+ readonly completionMark: WatchCompletionMark | null;
77
+ readonly pullRequestObservation: PrObservation | null;
78
+ }
79
+ export interface WatchCompletionMark {
80
+ readonly text: string;
81
+ readonly laterRunId: string | null;
82
+ }
83
+ export interface WatchColumn {
84
+ readonly name: string;
85
+ readonly cards: readonly WatchCard[];
86
+ }
87
+ export interface WatchWorkflow {
88
+ readonly workflowId: string;
89
+ readonly activeCount: number;
90
+ readonly waitingCount: number;
91
+ readonly latestAt: string | null;
92
+ readonly columns: readonly WatchColumn[];
93
+ }
94
+ export interface WatchRun {
95
+ readonly issueUpdate?: "failed";
96
+ readonly ticketStatus?: "complete" | "partial";
97
+ readonly estimatedCostUsd: number | null;
98
+ readonly ticketId: string | null;
99
+ readonly title: string | null;
100
+ readonly outcome: string | null;
101
+ readonly latestAt: string | null;
102
+ readonly claudeCostUsd: number | null;
103
+ readonly usage: WorkerUsage;
104
+ readonly currentStep: WatchStep;
105
+ readonly round: number;
106
+ readonly runId: string;
107
+ readonly workflowId: string;
108
+ readonly state: string;
109
+ readonly code: string;
110
+ readonly detail: string;
111
+ readonly spent: number | null;
112
+ readonly limit: number | null;
113
+ readonly decisions: readonly WatchDecision[];
114
+ readonly events: readonly WatchEvent[];
115
+ readonly turns: readonly WatchTurn[];
116
+ readonly phases: readonly WatchPhase[];
117
+ readonly decision: string;
118
+ readonly feedback: readonly WatchFeedback[];
119
+ readonly pullRequest: WatchPullRequest | null;
120
+ readonly reviews: readonly WatchReview[];
121
+ readonly mergeCommit: string | null;
122
+ }
123
+ export interface WatchModel {
124
+ readonly cardForms?: readonly CardForm[];
125
+ readonly workflows: readonly WatchWorkflow[];
126
+ readonly startWorkflowId: string | null;
127
+ readonly updatedAt: string;
128
+ readonly service: string;
129
+ readonly runs: readonly WatchRun[];
130
+ }
131
+ export interface WatchTone {
132
+ readonly tone: string;
133
+ readonly icon: string;
134
+ readonly label: string;
135
+ }
136
+ export interface Copying {
137
+ readonly command: string;
138
+ readonly label: string;
139
+ readonly onCopy: (command: string) => void;
140
+ }
141
+ export declare function counted(count: number, noun: string): string;
142
+ export declare function elapsed(from: string, to: string): string;
143
+ export declare function clockTime(time: string): string;
144
+ export declare function groupActivity(activity: readonly WatchItem[]): WatchItem[][];
145
+ export declare function turnTime(turn: WatchTurn, now: string): string;
146
+ export declare function toneOf(state: string): WatchTone;
147
+ export declare function runTone(run: WatchRun): WatchTone;
148
+ export declare function runName(run: WatchRun): string;
149
+ export declare function waitingDetail(run: WatchRun, now: string): string;
150
+ export declare function completedDetail(run: WatchRun): string;
151
+ export declare function phaseTime(phase: WatchPhase, now: string): string;
152
+ export declare function selectedRun(model: WatchModel, selected: string): WatchRun | undefined;
153
+ export declare function pageTitle(model: WatchModel, selected: string): string;
@@ -0,0 +1,102 @@
1
+ import { priceText } from "./usage-render.js";
2
+ export function counted(count, noun) {
3
+ return `${String(count)} ${noun}${count === 1 ? "" : "s"}`;
4
+ }
5
+ export function elapsed(from, to) {
6
+ const span = Math.round((Date.parse(to) - Date.parse(from)) / 1000);
7
+ if (Number.isNaN(span))
8
+ return "";
9
+ const seconds = Math.max(0, span);
10
+ const minutes = Math.floor(seconds / 60);
11
+ if (minutes === 0)
12
+ return `${String(seconds)} s`;
13
+ if (minutes < 60)
14
+ return `${String(minutes)} min ${String(seconds % 60)} s`;
15
+ return `${String(Math.floor(minutes / 60))} h ${String(minutes % 60)} min`;
16
+ }
17
+ export function clockTime(time) {
18
+ const moment = new Date(time);
19
+ return Number.isNaN(moment.getTime()) ? "" : moment.toLocaleTimeString();
20
+ }
21
+ export function groupActivity(activity) {
22
+ const routine = (item) => item?.kind === "tool" || item?.kind === "error";
23
+ return activity.reduce((groups, item) => {
24
+ const last = groups.at(-1) ?? [];
25
+ if (routine(item) && routine(last[0]))
26
+ return [...groups.slice(0, -1), [...last, item]];
27
+ return [...groups, [item]];
28
+ }, []);
29
+ }
30
+ export function turnTime(turn, now) {
31
+ if (turn.outcome === "in work")
32
+ return elapsed(turn.startedAt, now);
33
+ return turn.endedAt === null ? "" : elapsed(turn.startedAt, turn.endedAt);
34
+ }
35
+ export function toneOf(state) {
36
+ const tones = {
37
+ waiting_gate: ["attention", "!", "Needs your decision"],
38
+ running: ["working", "●", "In work"],
39
+ paused: ["attention", "Ⅱ", "Paused"],
40
+ completed: ["good", "✓", "Completed"],
41
+ failed: ["bad", "✕", "Failed"],
42
+ cancelled: ["bad", "✕", "Dropped"],
43
+ };
44
+ const [tone, icon, label] = tones[state] ?? ["idle", "○", state];
45
+ return { tone, icon, label };
46
+ }
47
+ export function runTone(run) {
48
+ if (run.state === "completed" && run.decision === "denied")
49
+ return { tone: "idle", icon: "✕", label: "Denied" };
50
+ return toneOf(run.state);
51
+ }
52
+ export function runName(run) {
53
+ return run.turns[0]?.target || run.runId.slice(0, 12);
54
+ }
55
+ export function waitingDetail(run, now) {
56
+ const opened = run.phases.find((phase) => phase.state === "active");
57
+ const since = opened?.startedAt ?? null;
58
+ const waited = since === null ? "" : ` for ${elapsed(since, now)}`;
59
+ return `A decision waits for you${waited}. Examine the work, then approve or deny.`;
60
+ }
61
+ export function completedDetail(run) {
62
+ const [first] = run.events;
63
+ const last = run.events.at(-1);
64
+ const cost = priceText(run.claudeCostUsd, run.estimatedCostUsd);
65
+ const time = first === undefined || last === undefined
66
+ ? ""
67
+ : ` in ${elapsed(first.recordedAt, last.recordedAt)}`;
68
+ const verdicts = {
69
+ approved: "You approved the work. ",
70
+ denied: "You denied the work. ",
71
+ };
72
+ const ticket = run.ticketStatus === undefined
73
+ ? ""
74
+ : ` Ticket status: ${run.ticketStatus}.`;
75
+ const update = run.issueUpdate === "failed"
76
+ ? " Issue status update failed; check the GitHub operation."
77
+ : "";
78
+ return `${verdicts[run.decision] ?? ""}The run completed${time} · cost ${cost}.${ticket}${update}`;
79
+ }
80
+ export function phaseTime(phase, now) {
81
+ if (phase.startedAt === null)
82
+ return "";
83
+ if (phase.endedAt === null)
84
+ return phase.state === "active" ? elapsed(phase.startedAt, now) : "";
85
+ return phase.startedAt === phase.endedAt
86
+ ? clockTime(phase.startedAt)
87
+ : elapsed(phase.startedAt, phase.endedAt);
88
+ }
89
+ export function selectedRun(model, selected) {
90
+ if (selected === "")
91
+ return model.runs[0];
92
+ return model.runs.find((run) => run.runId === selected);
93
+ }
94
+ export function pageTitle(model, selected) {
95
+ const run = selectedRun(model, selected);
96
+ if (run === undefined)
97
+ return "Cloving";
98
+ const waiting = model.runs.filter((item) => item.state === "waiting_gate");
99
+ const count = waiting.length === 0 ? "" : `(${String(waiting.length)}) `;
100
+ const { icon, label } = runTone(run);
101
+ return `${count}${icon} ${label} · ${runName(run)} · Cloving`;
102
+ }