cloving 1.1.0 → 1.3.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 (568) hide show
  1. package/README.md +584 -144
  2. package/assets/watch-fonts/fira-code-OFL.md +93 -0
  3. package/assets/watch-fonts/fira-code-latin-400-normal.woff2 +0 -0
  4. package/assets/watch-fonts/fira-code-latin-500-normal.woff2 +0 -0
  5. package/assets/watch-fonts/heebo-OFL.md +93 -0
  6. package/assets/watch-fonts/heebo-latin-500-normal.woff2 +0 -0
  7. package/assets/watch-fonts/heebo-latin-700-normal.woff2 +0 -0
  8. package/assets/watch-fonts/heebo-latin-800-normal.woff2 +0 -0
  9. package/assets/watch-fonts/manifest.json +112 -0
  10. package/assets/watch-fonts/space-grotesk-OFL.md +93 -0
  11. package/assets/watch-fonts/space-grotesk-latin-400-normal.woff2 +0 -0
  12. package/assets/watch-fonts/space-grotesk-latin-500-normal.woff2 +0 -0
  13. package/assets/watch-fonts/space-grotesk-latin-600-normal.woff2 +0 -0
  14. package/assets/watch-fonts/space-grotesk-latin-700-normal.woff2 +0 -0
  15. package/dist/src/agent-harness-shell.d.ts +12 -0
  16. package/dist/src/agent-harness-shell.js +90 -0
  17. package/dist/src/agent-harness-versions.d.ts +8 -0
  18. package/dist/src/agent-harness-versions.js +49 -0
  19. package/dist/src/agent-harnesses.d.ts +4 -0
  20. package/dist/src/agent-harnesses.js +13 -0
  21. package/dist/src/authority/commands.d.ts +2 -0
  22. package/dist/src/authority/commands.js +49 -8
  23. package/dist/src/authority/dispatch-decision.d.ts +1 -0
  24. package/dist/src/authority/dispatch-decision.js +7 -4
  25. package/dist/src/authority/events.js +2 -2
  26. package/dist/src/authority/gate-reduction.d.ts +1 -0
  27. package/dist/src/authority/gate-reduction.js +18 -3
  28. package/dist/src/authority/gates.d.ts +2 -1
  29. package/dist/src/authority/gates.js +5 -1
  30. package/dist/src/authority/handoff-chain.d.ts +24 -0
  31. package/dist/src/authority/handoff-chain.js +46 -0
  32. package/dist/src/authority/operations.js +1 -1
  33. package/dist/src/authority/reconciliation.d.ts +1 -0
  34. package/dist/src/authority/reconciliation.js +18 -11
  35. package/dist/src/authority/reduction.d.ts +1 -1
  36. package/dist/src/authority/reduction.js +6 -1
  37. package/dist/src/authority/status-input.d.ts +1 -1
  38. package/dist/src/authority/status.d.ts +1 -0
  39. package/dist/src/authority/status.js +27 -3
  40. package/dist/src/authority/transitions.d.ts +5 -5
  41. package/dist/src/authority/transitions.js +9 -0
  42. package/dist/src/broker/actor/authority-delivery.js +1 -0
  43. package/dist/src/broker/actor/authority-queries.d.ts +11 -1
  44. package/dist/src/broker/actor/authority-queries.js +67 -3
  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/delivery-intents.d.ts +3 -1
  49. package/dist/src/broker/actor/delivery-intents.js +4 -4
  50. package/dist/src/broker/actor/effect-delivery.js +13 -1
  51. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  52. package/dist/src/broker/actor/effect-queries.js +7 -0
  53. package/dist/src/broker/actor/pin-check.js +1 -1
  54. package/dist/src/broker/actor/stop-plan.js +1 -1
  55. package/dist/src/broker/actor/turn-state.js +1 -1
  56. package/dist/src/broker/authority-admission.js +26 -5
  57. package/dist/src/broker/authority-restore.js +1 -0
  58. package/dist/src/broker/decision-restore.js +4 -4
  59. package/dist/src/broker/socket-address.d.ts +3 -1
  60. package/dist/src/broker/socket-address.js +2 -2
  61. package/dist/src/cli/arguments.d.ts +11 -13
  62. package/dist/src/cli/arguments.js +37 -107
  63. package/dist/src/cli/command-effects.d.ts +7 -0
  64. package/dist/src/cli/command-effects.js +39 -0
  65. package/dist/src/cli/commands.js +11 -4
  66. package/dist/src/cli/config-arguments.d.ts +11 -0
  67. package/dist/src/cli/config-arguments.js +59 -0
  68. package/dist/src/cli/config-command.d.ts +2 -0
  69. package/dist/src/cli/config-command.js +105 -0
  70. package/dist/src/cli/config-file.d.ts +3 -0
  71. package/dist/src/cli/config-file.js +50 -0
  72. package/dist/src/cli/config-lock.d.ts +7 -0
  73. package/dist/src/cli/config-lock.js +61 -0
  74. package/dist/src/cli/config-notice.d.ts +5 -0
  75. package/dist/src/cli/config-notice.js +46 -0
  76. package/dist/src/cli/doctor-github.d.ts +9 -0
  77. package/dist/src/cli/doctor-github.js +138 -0
  78. package/dist/src/cli/doctor-harness.d.ts +13 -0
  79. package/dist/src/cli/doctor-harness.js +242 -0
  80. package/dist/src/cli/doctor-local.d.ts +18 -0
  81. package/dist/src/cli/doctor-local.js +77 -0
  82. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  83. package/dist/src/cli/doctor-runtime.js +176 -0
  84. package/dist/src/cli/doctor-service.d.ts +1 -0
  85. package/dist/src/cli/doctor-service.js +11 -0
  86. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  87. package/dist/src/cli/doctor-workflows.js +45 -0
  88. package/dist/src/cli/doctor.d.ts +15 -0
  89. package/dist/src/cli/doctor.js +190 -0
  90. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  91. package/dist/src/cli/github-ci-progress.js +83 -0
  92. package/dist/src/cli/github-retry.d.ts +6 -0
  93. package/dist/src/cli/github-retry.js +47 -0
  94. package/dist/src/cli/harness-probes.d.ts +22 -0
  95. package/dist/src/cli/harness-probes.js +183 -0
  96. package/dist/src/cli/main.d.ts +7 -1
  97. package/dist/src/cli/main.js +39 -61
  98. package/dist/src/cli/phone-arguments.d.ts +14 -0
  99. package/dist/src/cli/phone-arguments.js +37 -0
  100. package/dist/src/cli/phone-client.d.ts +2 -0
  101. package/dist/src/cli/phone-client.js +32 -0
  102. package/dist/src/cli/phone-command.d.ts +13 -0
  103. package/dist/src/cli/phone-command.js +101 -0
  104. package/dist/src/cli/probe-command.d.ts +36 -0
  105. package/dist/src/cli/probe-command.js +59 -0
  106. package/dist/src/cli/project-settings.d.ts +4 -0
  107. package/dist/src/cli/project-settings.js +33 -0
  108. package/dist/src/cli/render.d.ts +3 -1
  109. package/dist/src/cli/render.js +102 -39
  110. package/dist/src/cli/report-github.d.ts +18 -0
  111. package/dist/src/cli/report-github.js +200 -0
  112. package/dist/src/cli/report.d.ts +17 -0
  113. package/dist/src/cli/report.js +192 -0
  114. package/dist/src/cli/repository-arguments.d.ts +5 -0
  115. package/dist/src/cli/repository-arguments.js +34 -0
  116. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  117. package/dist/src/cli/runtime-arguments.js +15 -0
  118. package/dist/src/cli/runtime-directory.d.ts +6 -2
  119. package/dist/src/cli/runtime-directory.js +72 -14
  120. package/dist/src/cli/toolchain.d.ts +2 -0
  121. package/dist/src/cli/toolchain.js +22 -2
  122. package/dist/src/cli/usage-render.d.ts +5 -0
  123. package/dist/src/cli/usage-render.js +40 -1
  124. package/dist/src/cli/usage.d.ts +3 -3
  125. package/dist/src/cli/usage.js +74 -45
  126. package/dist/src/cli/watch-actions.d.ts +2 -0
  127. package/dist/src/cli/watch-actions.js +4 -4
  128. package/dist/src/cli/watch-board-view.d.ts +12 -1
  129. package/dist/src/cli/watch-board-view.js +64 -12
  130. package/dist/src/cli/watch-board.d.ts +7 -1
  131. package/dist/src/cli/watch-board.js +61 -16
  132. package/dist/src/cli/watch-card-forms.js +2 -2
  133. package/dist/src/cli/watch-client.d.ts +1 -1
  134. package/dist/src/cli/watch-client.js +12 -3
  135. package/dist/src/cli/watch-header-view.d.ts +27 -0
  136. package/dist/src/cli/watch-header-view.js +116 -0
  137. package/dist/src/cli/watch-model.d.ts +10 -4
  138. package/dist/src/cli/watch-model.js +49 -59
  139. package/dist/src/cli/watch-page.js +67 -14
  140. package/dist/src/cli/watch-phases.js +3 -3
  141. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  142. package/dist/src/cli/watch-phone-client.js +84 -0
  143. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  144. package/dist/src/cli/watch-phone-view.js +113 -0
  145. package/dist/src/cli/watch-phone.d.ts +5 -0
  146. package/dist/src/cli/watch-phone.js +53 -0
  147. package/dist/src/cli/watch-pr-command.d.ts +5 -2
  148. package/dist/src/cli/watch-pr-command.js +41 -4
  149. package/dist/src/cli/watch-pr-identity.d.ts +14 -2
  150. package/dist/src/cli/watch-pr-identity.js +25 -0
  151. package/dist/src/cli/watch-pr-observer.d.ts +1 -0
  152. package/dist/src/cli/watch-pr-observer.js +48 -6
  153. package/dist/src/cli/watch-pull-request.d.ts +12 -0
  154. package/dist/src/cli/watch-pull-request.js +134 -0
  155. package/dist/src/cli/watch-reads.d.ts +7 -1
  156. package/dist/src/cli/watch-reads.js +42 -20
  157. package/dist/src/cli/watch-render.d.ts +23 -2
  158. package/dist/src/cli/watch-render.js +2 -1
  159. package/dist/src/cli/watch-server.js +56 -7
  160. package/dist/src/cli/watch-turn.d.ts +4 -1
  161. package/dist/src/cli/watch-turn.js +38 -2
  162. package/dist/src/cli/watch-usage.js +5 -1
  163. package/dist/src/cli/watch-view.d.ts +10 -17
  164. package/dist/src/cli/watch-view.js +33 -77
  165. package/dist/src/cli.js +106 -23
  166. package/dist/src/command-settings.d.ts +16 -0
  167. package/dist/src/command-settings.js +42 -0
  168. package/dist/src/configuration-change.d.ts +11 -0
  169. package/dist/src/configuration-change.js +62 -0
  170. package/dist/src/configuration-display.d.ts +21 -0
  171. package/dist/src/configuration-display.js +69 -0
  172. package/dist/src/configuration-schema.d.ts +49 -0
  173. package/dist/src/configuration-schema.js +159 -0
  174. package/dist/src/daemon/claude-turn.d.ts +20 -5
  175. package/dist/src/daemon/claude-turn.js +116 -53
  176. package/dist/src/daemon/claude-worker.d.ts +3 -5
  177. package/dist/src/daemon/claude-worker.js +64 -80
  178. package/dist/src/daemon/command-journal.d.ts +5 -0
  179. package/dist/src/daemon/command-journal.js +50 -0
  180. package/dist/src/daemon/command-process.d.ts +28 -0
  181. package/dist/src/daemon/command-process.js +164 -0
  182. package/dist/src/daemon/command-worker.d.ts +19 -0
  183. package/dist/src/daemon/command-worker.js +182 -0
  184. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  185. package/dist/src/daemon/cursor-stream.js +154 -0
  186. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  187. package/dist/src/daemon/daemon-adapters.js +102 -0
  188. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  189. package/dist/src/daemon/daemon-loops.js +39 -0
  190. package/dist/src/daemon/daemon.d.ts +3 -30
  191. package/dist/src/daemon/daemon.js +132 -110
  192. package/dist/src/daemon/declared-input.d.ts +3 -0
  193. package/dist/src/daemon/declared-input.js +9 -0
  194. package/dist/src/daemon/delivery-router.js +7 -1
  195. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  196. package/dist/src/daemon/gemini-stream.js +129 -0
  197. package/dist/src/daemon/github-calls.d.ts +4 -0
  198. package/dist/src/daemon/github-calls.js +16 -7
  199. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  200. package/dist/src/daemon/github-ci-rerun.js +92 -0
  201. package/dist/src/daemon/github-ci.d.ts +6 -0
  202. package/dist/src/daemon/github-ci.js +251 -0
  203. package/dist/src/daemon/github-merge-call.d.ts +16 -0
  204. package/dist/src/daemon/github-merge-call.js +73 -0
  205. package/dist/src/daemon/github-merge.d.ts +3 -5
  206. package/dist/src/daemon/github-merge.js +59 -98
  207. package/dist/src/daemon/github-methods.d.ts +28 -0
  208. package/dist/src/daemon/github-methods.js +90 -16
  209. package/dist/src/daemon/github-operation.d.ts +3 -0
  210. package/dist/src/daemon/github-retry.d.ts +6 -0
  211. package/dist/src/daemon/github-retry.js +13 -0
  212. package/dist/src/daemon/github-ticket-status.js +27 -1
  213. package/dist/src/daemon/github-worker.js +2 -1
  214. package/dist/src/daemon/handoff-worker.d.ts +10 -0
  215. package/dist/src/daemon/handoff-worker.js +232 -0
  216. package/dist/src/daemon/issue-queue.d.ts +2 -0
  217. package/dist/src/daemon/issue-queue.js +92 -63
  218. package/dist/src/daemon/notify-journal.d.ts +18 -0
  219. package/dist/src/daemon/notify-journal.js +108 -0
  220. package/dist/src/daemon/notify-message.js +2 -1
  221. package/dist/src/daemon/notify.js +177 -37
  222. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  223. package/dist/src/daemon/opencode-stream.js +87 -0
  224. package/dist/src/daemon/queue-status.d.ts +4 -0
  225. package/dist/src/daemon/queue-status.js +38 -0
  226. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  227. package/dist/src/daemon/retry-worktree.js +139 -0
  228. package/dist/src/daemon/retrying-turn.d.ts +5 -0
  229. package/dist/src/daemon/retrying-turn.js +145 -21
  230. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  231. package/dist/src/daemon/schedule-journal.js +57 -0
  232. package/dist/src/daemon/text-output.d.ts +18 -0
  233. package/dist/src/daemon/text-output.js +44 -0
  234. package/dist/src/daemon/ticket-dependency-waits.d.ts +18 -0
  235. package/dist/src/daemon/ticket-dependency-waits.js +60 -0
  236. package/dist/src/daemon/ticket-registration.d.ts +10 -8
  237. package/dist/src/daemon/ticket-registration.js +146 -47
  238. package/dist/src/daemon/ticket-source.d.ts +4 -1
  239. package/dist/src/daemon/ticket-source.js +8 -2
  240. package/dist/src/daemon/turn-command.d.ts +10 -0
  241. package/dist/src/daemon/turn-command.js +33 -0
  242. package/dist/src/daemon/turn-report.d.ts +18 -0
  243. package/dist/src/daemon/turn-report.js +79 -0
  244. package/dist/src/daemon/work-tree.d.ts +2 -1
  245. package/dist/src/daemon/work-tree.js +15 -12
  246. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  247. package/dist/src/daemon/workflow-generations.js +57 -0
  248. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  249. package/dist/src/daemon/workflow-replay.js +58 -0
  250. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  251. package/dist/src/daemon/workflow-schedules.js +185 -0
  252. package/dist/src/decision-visibility.d.ts +2 -0
  253. package/dist/src/decision-visibility.js +10 -0
  254. package/dist/src/decision-wait.d.ts +1 -0
  255. package/dist/src/decision-wait.js +3 -0
  256. package/dist/src/delivery-backoff.d.ts +1 -0
  257. package/dist/src/delivery-backoff.js +3 -0
  258. package/dist/src/doctor-report.d.ts +24 -0
  259. package/dist/src/doctor-report.js +70 -0
  260. package/dist/src/execution-pin.d.ts +9 -0
  261. package/dist/src/execution-pin.js +86 -2
  262. package/dist/src/grok-result.d.ts +12 -0
  263. package/dist/src/grok-result.js +61 -0
  264. package/dist/src/harness-defaults.d.ts +35 -0
  265. package/dist/src/harness-defaults.js +121 -0
  266. package/dist/src/host/decision-resume.d.ts +35 -0
  267. package/dist/src/host/decision-resume.js +86 -0
  268. package/dist/src/host/gate-bridge.d.ts +48 -0
  269. package/dist/src/host/gate-bridge.js +124 -0
  270. package/dist/src/host/run-wait.d.ts +26 -0
  271. package/dist/src/host/run-wait.js +37 -0
  272. package/dist/src/host/start-delivery.d.ts +3 -2
  273. package/dist/src/host/start-delivery.js +11 -4
  274. package/dist/src/host/step-bridge-host.d.ts +6 -19
  275. package/dist/src/host/step-bridge-host.js +57 -55
  276. package/dist/src/host/world-reconciliation.d.ts +1 -0
  277. package/dist/src/host/world-reconciliation.js +3 -0
  278. package/dist/src/host/world-runs.js +5 -0
  279. package/dist/src/issue-identity.d.ts +6 -0
  280. package/dist/src/issue-identity.js +23 -0
  281. package/dist/src/merge-request.d.ts +19 -0
  282. package/dist/src/merge-request.js +32 -0
  283. package/dist/src/phone/canonical-json.d.ts +1 -0
  284. package/dist/src/phone/canonical-json.js +16 -0
  285. package/dist/src/phone/phone-link.d.ts +7 -0
  286. package/dist/src/phone/phone-link.js +21 -0
  287. package/dist/src/phone/qr-data.d.ts +8 -0
  288. package/dist/src/phone/qr-data.js +133 -0
  289. package/dist/src/phone/qr-matrix.d.ts +6 -0
  290. package/dist/src/phone/qr-matrix.js +175 -0
  291. package/dist/src/phone/qr-penalty.d.ts +3 -0
  292. package/dist/src/phone/qr-penalty.js +67 -0
  293. package/dist/src/phone/qr-picture.d.ts +5 -0
  294. package/dist/src/phone/qr-picture.js +24 -0
  295. package/dist/src/private-config.schema.json +263 -0
  296. package/dist/src/project-config.schema.json +65 -0
  297. package/dist/src/project-settings.d.ts +19 -0
  298. package/dist/src/project-settings.js +131 -0
  299. package/dist/src/relay/answer-check.d.ts +24 -0
  300. package/dist/src/relay/answer-check.js +145 -0
  301. package/dist/src/relay/answer-inbox.d.ts +15 -0
  302. package/dist/src/relay/answer-inbox.js +173 -0
  303. package/dist/src/relay/daemon-keys.d.ts +16 -0
  304. package/dist/src/relay/daemon-keys.js +75 -0
  305. package/dist/src/relay/decision-check.d.ts +3 -0
  306. package/dist/src/relay/decision-check.js +77 -0
  307. package/dist/src/relay/decision-close.d.ts +6 -0
  308. package/dist/src/relay/decision-close.js +72 -0
  309. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  310. package/dist/src/relay/decision-envelopes.js +93 -0
  311. package/dist/src/relay/decision-watch.d.ts +14 -0
  312. package/dist/src/relay/decision-watch.js +68 -0
  313. package/dist/src/relay/envelope-post.d.ts +8 -0
  314. package/dist/src/relay/envelope-post.js +71 -0
  315. package/dist/src/relay/envelope.d.ts +28 -0
  316. package/dist/src/relay/envelope.js +53 -0
  317. package/dist/src/relay/hpke.d.ts +25 -0
  318. package/dist/src/relay/hpke.js +108 -0
  319. package/dist/src/relay/pairing-checks.d.ts +42 -0
  320. package/dist/src/relay/pairing-checks.js +172 -0
  321. package/dist/src/relay/pairing-follow.d.ts +8 -0
  322. package/dist/src/relay/pairing-follow.js +95 -0
  323. package/dist/src/relay/pairing-session.d.ts +29 -0
  324. package/dist/src/relay/pairing-session.js +87 -0
  325. package/dist/src/relay/phone-delivery.d.ts +51 -0
  326. package/dist/src/relay/phone-delivery.js +139 -0
  327. package/dist/src/relay/phone-devices.d.ts +36 -0
  328. package/dist/src/relay/phone-devices.js +46 -0
  329. package/dist/src/relay/phone-inbox.d.ts +18 -0
  330. package/dist/src/relay/phone-inbox.js +17 -0
  331. package/dist/src/relay/phone-operations.d.ts +18 -0
  332. package/dist/src/relay/phone-operations.js +121 -0
  333. package/dist/src/relay/phone-outbox.d.ts +21 -0
  334. package/dist/src/relay/phone-outbox.js +25 -0
  335. package/dist/src/relay/phone-socket.d.ts +6 -0
  336. package/dist/src/relay/phone-socket.js +63 -0
  337. package/dist/src/relay/relay-control.d.ts +7 -0
  338. package/dist/src/relay/relay-control.js +24 -0
  339. package/dist/src/relay/relay-files.d.ts +2 -0
  340. package/dist/src/relay/relay-files.js +23 -0
  341. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  342. package/dist/src/relay/relay-heartbeat.js +81 -0
  343. package/dist/src/relay/relay-http.d.ts +14 -0
  344. package/dist/src/relay/relay-http.js +63 -0
  345. package/dist/src/relay/relay-registration.d.ts +15 -0
  346. package/dist/src/relay/relay-registration.js +63 -0
  347. package/dist/src/relay/relay-service.d.ts +25 -0
  348. package/dist/src/relay/relay-service.js +216 -0
  349. package/dist/src/relay/relay-store.d.ts +48 -0
  350. package/dist/src/relay/relay-store.js +131 -0
  351. package/dist/src/relay/sealed-post.d.ts +25 -0
  352. package/dist/src/relay/sealed-post.js +52 -0
  353. package/dist/src/relay.d.ts +1 -0
  354. package/dist/src/relay.js +8 -0
  355. package/dist/src/report-statistics.d.ts +50 -0
  356. package/dist/src/report-statistics.js +70 -0
  357. package/dist/src/report.d.ts +171 -0
  358. package/dist/src/report.js +119 -0
  359. package/dist/src/repository-identity.d.ts +4 -0
  360. package/dist/src/repository-identity.js +4 -0
  361. package/dist/src/review-subject.d.ts +41 -0
  362. package/dist/src/review-subject.js +91 -0
  363. package/dist/src/run-wait.d.ts +23 -0
  364. package/dist/src/run-wait.js +20 -0
  365. package/dist/src/service/active-tickets.d.ts +4 -0
  366. package/dist/src/service/active-tickets.js +49 -0
  367. package/dist/src/service/command-effects.d.ts +4 -0
  368. package/dist/src/service/command-effects.js +16 -0
  369. package/dist/src/service/decision-handler.d.ts +4 -0
  370. package/dist/src/service/decision-handler.js +39 -4
  371. package/dist/src/service/gateway.js +18 -3
  372. package/dist/src/service/queue-runs.d.ts +3 -0
  373. package/dist/src/service/queue-runs.js +39 -0
  374. package/dist/src/service/registry.d.ts +22 -3
  375. package/dist/src/service/registry.js +51 -8
  376. package/dist/src/service/replies.d.ts +10 -0
  377. package/dist/src/service/replies.js +12 -0
  378. package/dist/src/service/run-handlers.js +45 -54
  379. package/dist/src/service/run-metadata.d.ts +8 -0
  380. package/dist/src/service/run-metadata.js +53 -0
  381. package/dist/src/service/run-waits.d.ts +3 -0
  382. package/dist/src/service/run-waits.js +41 -0
  383. package/dist/src/service/service.d.ts +21 -2
  384. package/dist/src/service/service.js +23 -5
  385. package/dist/src/service/submission-handler.js +70 -19
  386. package/dist/src/service/worker-port.d.ts +1 -0
  387. package/dist/src/service/worker-totals.js +10 -1
  388. package/dist/src/step-bridge.d.ts +32 -0
  389. package/dist/src/steps/decision-gate.d.ts +2 -1
  390. package/dist/src/steps/decision-gate.js +7 -0
  391. package/dist/src/steps/handoff.d.ts +2 -0
  392. package/dist/src/steps/handoff.js +13 -0
  393. package/dist/src/steps/merge-by-person.d.ts +2 -0
  394. package/dist/src/steps/merge-by-person.js +18 -0
  395. package/dist/src/steps/merge-when-green.d.ts +2 -0
  396. package/dist/src/steps/merge-when-green.js +62 -0
  397. package/dist/src/steps/review-by-agent.d.ts +5 -0
  398. package/dist/src/steps/review-by-agent.js +124 -0
  399. package/dist/src/steps/review-by-person.d.ts +4 -0
  400. package/dist/src/steps/review-by-person.js +16 -0
  401. package/dist/src/steps/review-subject.d.ts +2 -0
  402. package/dist/src/steps/review-subject.js +11 -0
  403. package/dist/src/steps/run-command.d.ts +2 -0
  404. package/dist/src/steps/run-command.js +15 -0
  405. package/dist/src/steps/sleep.d.ts +3 -0
  406. package/dist/src/steps/sleep.js +19 -0
  407. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  408. package/dist/src/steps/wait-for-decision.js +71 -0
  409. package/dist/src/steps/wait-for-run.d.ts +5 -0
  410. package/dist/src/steps/wait-for-run.js +9 -0
  411. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  412. package/dist/src/storage/decision-snapshots.js +7 -1
  413. package/dist/src/submission.d.ts +4 -0
  414. package/dist/src/submission.js +6 -2
  415. package/dist/src/testing.d.ts +29 -0
  416. package/dist/src/testing.js +264 -0
  417. package/dist/src/ticket-dependencies.d.ts +1 -0
  418. package/dist/src/ticket-dependencies.js +15 -0
  419. package/dist/src/ticket-status-stream.d.ts +9 -0
  420. package/dist/src/ticket-status-stream.js +94 -0
  421. package/dist/src/ticket-status.js +7 -4
  422. package/dist/src/token-prices.d.ts +14 -4
  423. package/dist/src/token-prices.js +56 -11
  424. package/dist/src/turn-profile.d.ts +1 -0
  425. package/dist/src/turn-profile.js +8 -1
  426. package/dist/src/worker-usage.d.ts +25 -0
  427. package/dist/src/worker-usage.js +58 -1
  428. package/dist/src/workflow-admission.d.ts +6 -0
  429. package/dist/src/workflow-candidate.d.ts +7 -2
  430. package/dist/src/workflow-candidate.js +48 -5
  431. package/dist/src/workflow-contracts.d.ts +2 -0
  432. package/dist/src/workflow-contracts.js +8 -3
  433. package/dist/src/workflow-declaration.d.ts +31 -2
  434. package/dist/src/workflow-declaration.js +140 -16
  435. package/dist/src/workflow-discovery.d.ts +19 -0
  436. package/dist/src/workflow-discovery.js +36 -0
  437. package/dist/src/workflow-refusals.d.ts +6 -0
  438. package/dist/src/workflow-refusals.js +42 -0
  439. package/dist/src/workflow-schedule.d.ts +22 -0
  440. package/dist/src/workflow-schedule.js +53 -0
  441. package/dist/src/workflows.d.ts +12 -1
  442. package/dist/src/workflows.js +9 -0
  443. package/dist/tools/admit-workflow.d.ts +14 -0
  444. package/dist/tools/admit-workflow.js +107 -0
  445. package/dist/tools/doctor-adoption.d.ts +1 -0
  446. package/dist/tools/doctor-adoption.js +11 -0
  447. package/dist/tools/project-configuration.d.ts +4 -0
  448. package/dist/tools/project-configuration.js +47 -0
  449. package/dist/tools/self-host-processes.d.ts +1 -0
  450. package/dist/tools/self-host-processes.js +33 -22
  451. package/dist/tools/self-host-project.d.ts +21 -0
  452. package/dist/tools/self-host-project.js +224 -0
  453. package/dist/tools/self-host-runtime.d.ts +16 -0
  454. package/dist/tools/self-host-runtime.js +60 -0
  455. package/dist/tools/self-host-workflows.d.ts +1 -0
  456. package/dist/tools/self-host-workflows.js +36 -1
  457. package/dist/tools/self-host.js +106 -135
  458. package/dist/tools/workflow-bundle-dependencies.d.ts +5 -0
  459. package/dist/tools/workflow-bundle-dependencies.js +93 -0
  460. package/dist/tools/workflow-bundles.d.ts +20 -0
  461. package/dist/tools/workflow-bundles.js +173 -0
  462. package/dist/tools/workflow-candidate-counts.d.ts +12 -0
  463. package/dist/tools/workflow-candidate-counts.js +266 -0
  464. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  465. package/dist/tools/workflow-candidate-fields.js +24 -0
  466. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  467. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  468. package/dist/tools/workflow-candidate-program.d.ts +13 -0
  469. package/dist/tools/workflow-candidate-program.js +106 -0
  470. package/dist/tools/workflow-candidate-source.d.ts +6 -0
  471. package/dist/tools/workflow-candidate-source.js +169 -0
  472. package/dist/tools/workflow-candidate-syntax.d.ts +21 -0
  473. package/dist/tools/workflow-candidate-syntax.js +263 -0
  474. package/dist/tools/workflow-command.d.ts +1 -0
  475. package/dist/tools/workflow-command.js +143 -0
  476. package/dist/tools/workflow-folder-capture.d.ts +18 -0
  477. package/dist/tools/workflow-folder-capture.js +261 -0
  478. package/dist/tools/workflow-folders.d.ts +49 -0
  479. package/dist/tools/workflow-folders.js +203 -0
  480. package/dist/tools/workflow-source-effects.d.ts +10 -0
  481. package/dist/tools/workflow-source-effects.js +213 -0
  482. package/dist/tools/workflow-test-hook.d.ts +7 -0
  483. package/dist/tools/workflow-test-hook.js +16 -0
  484. package/dist/tools/workflow-test-loader.d.ts +1 -0
  485. package/dist/tools/workflow-test-loader.js +10 -0
  486. package/dist/workflows/develop-prd.js +71 -3
  487. package/dist/workflows/develop-ticket.js +6 -1
  488. package/dist/workflows/ticket-prompts.js +17 -3
  489. package/package.json +66 -6
  490. package/templates/develop/README.md +78 -0
  491. package/templates/develop/develop/accept.ts +11 -0
  492. package/templates/develop/develop/flow-tests.ts +357 -0
  493. package/templates/develop/develop/local.ts +40 -0
  494. package/templates/develop/develop/option-tests.ts +174 -0
  495. package/templates/develop/develop/partial-choice.ts +29 -0
  496. package/templates/develop/develop/partial.ts +28 -0
  497. package/templates/develop/develop/pull.ts +152 -0
  498. package/templates/develop/develop/queue-partial.ts +39 -0
  499. package/templates/develop/develop/refusal-tests.ts +174 -0
  500. package/templates/develop/develop/report.ts +156 -0
  501. package/templates/develop/develop/round.ts +40 -0
  502. package/templates/develop/develop/scenarios.ts +87 -0
  503. package/templates/develop/develop/turn.ts +67 -0
  504. package/templates/develop/develop.declaration.json +24 -0
  505. package/templates/develop/develop.test.ts +287 -0
  506. package/templates/develop/develop.ts +30 -0
  507. package/templates/develop/template.json +153 -0
  508. package/dist/src/chats/analysis-batches.d.ts +0 -24
  509. package/dist/src/chats/analysis-batches.js +0 -83
  510. package/dist/src/chats/analysis-contract.d.ts +0 -80
  511. package/dist/src/chats/analysis-contract.js +0 -16
  512. package/dist/src/chats/analysis-data.d.ts +0 -3
  513. package/dist/src/chats/analysis-data.js +0 -85
  514. package/dist/src/chats/analysis-input.d.ts +0 -12
  515. package/dist/src/chats/analysis-input.js +0 -83
  516. package/dist/src/chats/analysis-links.d.ts +0 -2
  517. package/dist/src/chats/analysis-links.js +0 -25
  518. package/dist/src/chats/analysis-prompt.d.ts +0 -10
  519. package/dist/src/chats/analysis-prompt.js +0 -16
  520. package/dist/src/chats/analysis-proposal.d.ts +0 -2
  521. package/dist/src/chats/analysis-proposal.js +0 -32
  522. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  523. package/dist/src/chats/analysis-provenance.js +0 -99
  524. package/dist/src/chats/analysis-shape.d.ts +0 -3
  525. package/dist/src/chats/analysis-shape.js +0 -228
  526. package/dist/src/chats/analysis.d.ts +0 -3
  527. package/dist/src/chats/analysis.js +0 -42
  528. package/dist/src/chats/corpus-input.d.ts +0 -5
  529. package/dist/src/chats/corpus-input.js +0 -288
  530. package/dist/src/chats/destination.d.ts +0 -4
  531. package/dist/src/chats/destination.js +0 -96
  532. package/dist/src/chats/import.d.ts +0 -15
  533. package/dist/src/chats/import.js +0 -243
  534. package/dist/src/chats/input-file.d.ts +0 -3
  535. package/dist/src/chats/input-file.js +0 -32
  536. package/dist/src/chats/normalize.d.ts +0 -29
  537. package/dist/src/chats/normalize.js +0 -155
  538. package/dist/src/chats/previous-import.d.ts +0 -5
  539. package/dist/src/chats/previous-import.js +0 -34
  540. package/dist/src/chats/reader.d.ts +0 -21
  541. package/dist/src/chats/reader.js +0 -118
  542. package/dist/src/chats/redact-import.d.ts +0 -14
  543. package/dist/src/chats/redact-import.js +0 -141
  544. package/dist/src/chats/redaction.d.ts +0 -41
  545. package/dist/src/chats/redaction.js +0 -161
  546. package/dist/src/chats/revision-input.d.ts +0 -3
  547. package/dist/src/chats/revision-input.js +0 -180
  548. package/dist/src/chats/revision.d.ts +0 -48
  549. package/dist/src/chats/revision.js +0 -94
  550. package/dist/src/chats/selection.d.ts +0 -25
  551. package/dist/src/chats/selection.js +0 -109
  552. package/dist/src/chats/source.d.ts +0 -23
  553. package/dist/src/chats/source.js +0 -135
  554. package/dist/src/chats/structure.d.ts +0 -57
  555. package/dist/src/chats/structure.js +0 -216
  556. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  557. package/dist/src/daemon/analysis-launch.js +0 -81
  558. package/dist/src/daemon/analysis-token.d.ts +0 -6
  559. package/dist/src/daemon/analysis-token.js +0 -88
  560. package/dist/src/daemon/analysis-worker.d.ts +0 -22
  561. package/dist/src/daemon/analysis-worker.js +0 -219
  562. package/dist/src/daemon/chats-files.d.ts +0 -15
  563. package/dist/src/daemon/chats-files.js +0 -113
  564. package/dist/src/daemon/chats-worker.d.ts +0 -12
  565. package/dist/src/daemon/chats-worker.js +0 -200
  566. package/dist/workflows/analyze-chats.d.ts +0 -10
  567. package/dist/workflows/analyze-chats.declaration.json +0 -9
  568. package/dist/workflows/analyze-chats.js +0 -73
@@ -0,0 +1,34 @@
1
+ import { parseArgs } from "node:util";
2
+ export function repositoryArguments(argumentsList, options) {
3
+ if (!argumentsList.some((argument) => argument === "--repository" || argument.startsWith("--repository=")))
4
+ return { argumentsList, repository: undefined };
5
+ try {
6
+ const parsed = parseArgs({
7
+ args: [...argumentsList],
8
+ options: {
9
+ ...options,
10
+ repository: { type: "string" },
11
+ },
12
+ tokens: true,
13
+ allowPositionals: true,
14
+ strict: false,
15
+ });
16
+ const selectors = parsed.tokens.filter((token) => token.kind === "option" && token.name === "repository");
17
+ if (selectors.length > 1)
18
+ return "repeated-option";
19
+ const removed = new Set(selectors.flatMap((token) => token.kind === "option" && !token.inlineValue
20
+ ? [token.index, token.index + 1]
21
+ : [token.index]));
22
+ const repository = parsed.values["repository"];
23
+ if (selectors.length > 0 &&
24
+ (typeof repository !== "string" || repository === ""))
25
+ return "missing-value";
26
+ return {
27
+ argumentsList: argumentsList.filter((_, index) => !removed.has(index)),
28
+ repository: typeof repository === "string" ? repository : undefined,
29
+ };
30
+ }
31
+ catch {
32
+ return "missing-value";
33
+ }
34
+ }
@@ -11,6 +11,10 @@ export type RunSource = {
11
11
  type DecisionCommand = "answer" | "approve" | "deny";
12
12
  type RunCommand = "pause" | "resume" | "drop";
13
13
  export type RuntimeInvocation = {
14
+ readonly kind: "report";
15
+ readonly since: number;
16
+ readonly json: boolean;
17
+ } | {
14
18
  readonly kind: "command-help";
15
19
  readonly command: string;
16
20
  } | {
@@ -51,6 +51,15 @@ const shapes = new Map([
51
51
  build: events,
52
52
  },
53
53
  ],
54
+ [
55
+ "report",
56
+ {
57
+ subject: "none",
58
+ required: [],
59
+ allowed: () => ["since", "json"],
60
+ build: report,
61
+ },
62
+ ],
54
63
  [
55
64
  "watch",
56
65
  {
@@ -246,3 +255,9 @@ function events(request) {
246
255
  const json = given(request, "json");
247
256
  return { kind: "events", runId, after: after ?? 0, limit, follow, json };
248
257
  }
258
+ function report(request) {
259
+ const since = whole(valueOf(request, "since"), { minimum: 1, maximum: 168 });
260
+ if (since === invalid)
261
+ return "invalid-option-value";
262
+ return { kind: "report", since: since ?? 24, json: given(request, "json") };
263
+ }
@@ -1,4 +1,8 @@
1
1
  type Environment = Readonly<Record<string, string | undefined>>;
2
- export declare function clientCommand(environment: Environment): string;
3
- export declare function runtimeDirectory(environment: Environment): string | undefined;
2
+ export declare function shellArgument(value: string): string;
3
+ export declare function clientCommand(environment: Environment, repository?: string): string;
4
+ export declare function repositoryRuntimeName(repository: string): string;
5
+ export declare function adoptionRecordPath(environment: Environment, repository: string): string | undefined;
6
+ export declare function legacyRuntimeDirectory(environment: Environment): string | undefined;
7
+ export declare function runtimeDirectory(environment: Environment, repository?: string): string | undefined;
4
8
  export {};
@@ -1,25 +1,83 @@
1
- import { join } from "node:path";
1
+ import { repositoryFileName } from "../repository-identity.js";
2
+ import { createHash } from "node:crypto";
3
+ import { readFileSync, realpathSync } from "node:fs";
4
+ import { basename, isAbsolute, join } from "node:path";
5
+ import { record } from "../protocol.js";
2
6
  function given(value) {
3
7
  return value !== undefined && value.length > 0;
4
8
  }
5
- export function clientCommand(environment) {
9
+ export function shellArgument(value) {
10
+ return /^[A-Za-z0-9_./-]+$/.test(value)
11
+ ? value
12
+ : `'${value.replaceAll("'", "'\\''")}'`;
13
+ }
14
+ export function clientCommand(environment, repository) {
6
15
  const explicit = environment["CLOVING_RUNTIME_DIR"];
7
16
  return given(explicit)
8
- ? `CLOVING_RUNTIME_DIR=${explicit} cloving`
9
- : "cloving";
17
+ ? `CLOVING_RUNTIME_DIR=${shellArgument(explicit)} cloving`
18
+ : `cloving${repository === undefined ? "" : ` --repository ${shellArgument(repository)}`}`;
19
+ }
20
+ function stateRoot(environment) {
21
+ const state = environment["XDG_STATE_HOME"];
22
+ if (given(state))
23
+ return state;
24
+ const home = environment["HOME"];
25
+ return given(home) ? join(home, ".local", "state") : undefined;
26
+ }
27
+ export function repositoryRuntimeName(repository) {
28
+ const canonical = realpathSync(repository);
29
+ return repositoryFileName({
30
+ name: basename(canonical),
31
+ sha256: createHash("sha256").update(canonical).digest("hex"),
32
+ });
33
+ }
34
+ export function adoptionRecordPath(environment, repository) {
35
+ const state = stateRoot(environment);
36
+ return state === undefined
37
+ ? undefined
38
+ : join(state, "cloving", "adopted-runtime", `${repositoryRuntimeName(repository)}.json`);
39
+ }
40
+ export function legacyRuntimeDirectory(environment) {
41
+ const runtime = environment["XDG_RUNTIME_DIR"];
42
+ if (given(runtime))
43
+ return join(runtime, "cloving");
44
+ const state = stateRoot(environment);
45
+ return state === undefined ? undefined : join(state, "cloving", "run");
46
+ }
47
+ function adoptedRuntime(environment, repository) {
48
+ const path = adoptionRecordPath(environment, repository);
49
+ if (path === undefined)
50
+ return undefined;
51
+ try {
52
+ return runtimeRecord(path, repository);
53
+ }
54
+ catch (error) {
55
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
56
+ return undefined;
57
+ throw error;
58
+ }
10
59
  }
11
- export function runtimeDirectory(environment) {
60
+ function runtimeRecord(path, repository) {
61
+ const value = record(JSON.parse(readFileSync(path, "utf8")));
62
+ if (value?.["schemaVersion"] === 1 &&
63
+ value["repository"] === realpathSync(repository) &&
64
+ typeof value["runtimeDirectory"] === "string" &&
65
+ isAbsolute(value["runtimeDirectory"]))
66
+ return value["runtimeDirectory"];
67
+ throw new Error("invalid-runtime-record");
68
+ }
69
+ export function runtimeDirectory(environment, repository) {
12
70
  const explicit = environment["CLOVING_RUNTIME_DIR"];
13
71
  if (given(explicit))
14
72
  return explicit;
73
+ if (repository === undefined)
74
+ return undefined;
75
+ const adopted = adoptedRuntime(environment, repository);
76
+ if (adopted !== undefined)
77
+ return adopted;
15
78
  const runtime = environment["XDG_RUNTIME_DIR"];
16
- if (given(runtime))
17
- return join(runtime, "cloving");
18
- const state = environment["XDG_STATE_HOME"];
19
- if (given(state))
20
- return join(state, "cloving", "run");
21
- const home = environment["HOME"];
22
- return given(home)
23
- ? join(home, ".local", "state", "cloving", "run")
24
- : undefined;
79
+ const root = given(runtime) ? runtime : stateRoot(environment);
80
+ return root === undefined
81
+ ? undefined
82
+ : join(root, "cloving", repositoryRuntimeName(repository), "run");
25
83
  }
@@ -1,3 +1,5 @@
1
1
  import type { ToolchainIdentity } from "../workflow-admission.ts";
2
+ export declare const supportedNodes: string;
3
+ export declare function supportedNode(version: string): boolean;
2
4
  export declare function observedToolchain(start: string): Promise<ToolchainIdentity>;
3
5
  export declare function qualifiedToolchain(observed: ToolchainIdentity, start: string): Promise<ToolchainIdentity>;
@@ -3,7 +3,27 @@ import { createHash } from "node:crypto";
3
3
  import { access, readFile, realpath } from "node:fs/promises";
4
4
  import { dirname, join } from "node:path";
5
5
  import packageMetadata from "#package" with { type: "json" };
6
- const qualifiedNode = "v26.9.0";
6
+ export const supportedNodes = packageMetadata.engines.node;
7
+ export function supportedNode(version) {
8
+ const release = /^v(\d+)\.(\d+)\.(\d+)$/.exec(version);
9
+ if (release === null)
10
+ return false;
11
+ const observed = release.slice(1).map(Number);
12
+ return supportedNodes.split(" || ").some((range) => {
13
+ const bounds = /^>=(\d+)\.(\d+)\.(\d+) <(\d+)$/
14
+ .exec(range)
15
+ ?.slice(1)
16
+ .map(Number);
17
+ if (bounds === undefined)
18
+ return false;
19
+ return (atLeast(observed, bounds.slice(0, 3)) &&
20
+ (observed[0] ?? 0) < (bounds[3] ?? 0));
21
+ });
22
+ }
23
+ function atLeast(observed, minimum) {
24
+ const index = observed.findIndex((part, position) => part !== minimum[position]);
25
+ return index === -1 || (observed[index] ?? 0) > (minimum[index] ?? 0);
26
+ }
7
27
  export async function observedToolchain(start) {
8
28
  const root = await projectRoot(start);
9
29
  const sdk = await packageDirectory(start, "workflow");
@@ -29,7 +49,7 @@ export async function qualifiedToolchain(observed, start) {
29
49
  sdk: `workflow@${packageMetadata.dependencies.workflow}`,
30
50
  world: `@workflow/world-local@${typeof declared === "string" ? declared : "undeclared"}`,
31
51
  builder: `@workflow/builders@${packageMetadata.dependencies["@workflow/builders"]}`,
32
- node: qualifiedNode,
52
+ node: supportedNode(observed.node) ? observed.node : supportedNodes,
33
53
  dependencies: observed.dependencies,
34
54
  };
35
55
  }
@@ -1,3 +1,8 @@
1
+ import { type WorkerAttemptUsage } from "../worker-usage.ts";
1
2
  export declare function priceText(value: unknown, estimate?: unknown): string;
2
3
  export declare function usageText(value: unknown): string;
3
4
  export declare function totalsSuffix(state: unknown): string;
5
+ export declare function statusJson(result: Fields): Fields;
6
+ import { type Fields } from "../protocol.ts";
7
+ export declare function attemptText(attempt: WorkerAttemptUsage): string;
8
+ export declare function attemptTexts(value: unknown): readonly string[];
@@ -1,4 +1,4 @@
1
- import { priceOf, usageOf } from "../worker-usage.js";
1
+ import { attemptsOf, priceOf, usageOf, } from "../worker-usage.js";
2
2
  export function priceText(value, estimate) {
3
3
  const price = priceOf(value);
4
4
  if (price === null && priceOf(estimate) !== null)
@@ -16,6 +16,9 @@ export function usageText(value) {
16
16
  return [
17
17
  ["Input tokens", usage.input_tokens],
18
18
  ["Cache read tokens", usage.cache_read_input_tokens],
19
+ ...(usage.cache_creation_input_tokens === undefined
20
+ ? []
21
+ : [["Cache write tokens", usage.cache_creation_input_tokens]]),
19
22
  ["Output tokens", usage.output_tokens],
20
23
  ]
21
24
  .map(([label, count]) => `${String(label)}: ${count === null ? "Token usage not known" : String(count)}`)
@@ -26,3 +29,39 @@ export function totalsSuffix(state) {
26
29
  ? ""
27
30
  : " so far";
28
31
  }
32
+ export function statusJson(result) {
33
+ const run = record(result["run"]);
34
+ if (result["kind"] !== "run-status" || run === undefined)
35
+ return result;
36
+ const turns = run["workerTurns"];
37
+ return {
38
+ ...result,
39
+ run: {
40
+ ...run,
41
+ costDisplay: priceText(run["claudeCostUsd"], run["estimatedCostUsd"]),
42
+ ...(Array.isArray(turns)
43
+ ? {
44
+ workerTurns: turns.map((turn) => {
45
+ const fields = record(turn);
46
+ if (fields === undefined)
47
+ return turn;
48
+ return {
49
+ ...fields,
50
+ costDisplay: priceText(fields["costUsd"], fields["estimatedCostUsd"]),
51
+ };
52
+ }),
53
+ }
54
+ : {}),
55
+ },
56
+ };
57
+ }
58
+ import { record } from "../protocol.js";
59
+ export function attemptText(attempt) {
60
+ const kind = attempt.retryKind === undefined
61
+ ? ""
62
+ : ` · retryKind: ${String(attempt.retryKind)}`;
63
+ return `Attempt ${String(attempt.attempt)} · ${attempt.model ?? "Model not known"}${kind} · ${priceText(attempt.costUsd, attempt.estimatedCostUsd)}`;
64
+ }
65
+ export function attemptTexts(value) {
66
+ return (attemptsOf(value) ?? []).map(attemptText);
67
+ }
@@ -1,5 +1,5 @@
1
+ export declare const configUsage = "Usage: cloving config list [--json]\n cloving config get <field> [--json]\n cloving config set <field> <value> [--private] [--json]\n cloving config unset <field> [--private] [--json]\n\nReads and changes settings for the current repository; --repository selects another repository.\nValues use JSON when valid, otherwise text. Every change is checked before writing.\nFields use their default project or private file; --private selects the private file.\nlist and get show the effective source and hidden file values. Unconfigured values use defaults; null means no value.\nChanges keep the previous file as .bak and replace the file atomically under a lock.\nA live lock waits at most ten seconds, then exits with settings-locked.\nPrivate files, backups and temporary files have mode 0600. Changes require a service restart.\n";
1
2
  export declare const commandUsage: Readonly<Record<string, string>>;
2
- export declare const usage = "Usage: cloving [--help] [--version]\n cloving workflows validate <manifest-path> [--input <json-file>] [--json]\n cloving <command> [--help]\n\nCommands:\n workflows validate Check a compiled workflow manifest, its artifacts and optional runtime input.\n chats redact Redact one imported chat corpus into private runtime files.\n chats import Import explicitly selected Claude Code transcripts into private runtime files.\n run Submit one run of an admitted workflow.\n status List the runs or show one run.\n questions List the pending decisions.\n answer Answer one design question.\n approve Approve one pending approval.\n deny Deny one pending approval.\n pause Stop new dispatch for a run.\n resume Resume a paused run.\n drop Cancel a run and keep its files.\n events Print the committed events.\n watch Serve a page that shows the runs live.\n start Start the service for a repository.\n\nThe runtime commands need a Cloving service. CLOVING_RUNTIME_DIR names its runtime directory.\nUse npm exec -- cloving ... for a project-local installation.\n";
3
- export declare const chatsImportUsage = "Usage: cloving chats import [--] <path> [<path> ...]\n cloving chats import --root <projects-folder> [--root <projects-folder> ...] [--exclude-project <name> ...] [-- <path> ...]\n\nImports only the selected Claude Code JSONL files. Relative paths use the current directory.\nThis local command needs no service. It scans only explicitly named roots and does not expand globs or discover configuration.\nPositional files come first, retaining order and repetitions. Roots sort by canonical path, then entries by relative path in JavaScript string order.\nExclusions match direct project folder names exactly and prune their children. Exclusions require a root.\nScans accept lowercase .jsonl filenames, attempt at most 100 eligible files across roots, and stop before entering folders at depth four.\nLater file candidates and depth-limited folders are pending. Select pending files explicitly in a later import.\nLinked components, containment changes and roots in Git repositories are refused. Scan protections require the supported macOS kernel.\nThe file limit is 10 MiB (10,485,760 bytes). Links and nonregular files are refused.\nThe total normalized corpus limit is 50 MiB (52,428,800 UTF-8 bytes), including newlines and repeated selections.\nExceeding that total returns output-failed with exit code 1 and no completed coverage manifest; partial files may remain.\n--previous-import <IMPORT_ID> compares against one explicitly named UUID v4 import before --.\nThe earlier coverage and optional revision must be valid, completed private metadata; otherwise previous-import-refused returns exit 1 with no new import.\nA comparison writes private revision.json with ordered selection evidence and six status counts. Matching uses source path and selected root path; repetitions pair in order.\nByte-verified extensions are extended; shorter sources are truncated. Legacy imports without sizes can establish unchanged digests but cannot prove extension or truncation.\nMissing or truncated evidence makes the import partial. History completeness remains unknown.\nPrivate corpus.jsonl, structure.json and coverage.json files go into a new import directory under the runtime directory's chats directory.\nThe runtime selection is CLOVING_RUNTIME_DIR, XDG_RUNTIME_DIR, XDG_STATE_HOME, then HOME.\nOutput contains only counts, fixed codes and an opaque import ID. Source paths stay in the private manifest.\nStructure preserves branches and marks known copies without removing records. History completeness remains unknown.\nRoot imports write coverage version 2 and add excluded and pending entry counts; positional-only imports retain coverage version 1.\nExit codes: 0 for no refused, pending, missing or truncated entries (exclusions alone permit success without comparison), 1 for partial coverage or processing failure, 2 for invalid usage.\n";
3
+ export declare const usage = "Usage: cloving [--help] [--version]\n cloving workflows list [--json] [--repository <directory>]\n cloving workflows test [<id>] [--repository <directory>]\n cloving workflows validate <manifest-path> [--input <json-file>] [--json]\n cloving templates list [--json]\n cloving templates show <name> [--json]\n cloving templates copy <name> [--id <workflow-id>] [--json] [--repository <directory>]\n cloving <command> [--help]\n\nCommands:\n workflows list List bundled, project and user workflows and refusal codes.\n workflows test Run project and user workflow tests without a service.\n workflows validate Check a compiled workflow manifest, its artifacts and optional runtime input.\n templates list List the workflow templates of the package.\n templates show Show the decision points and the files of one template.\n templates copy Copy one template into .cloving/workflows of the repository.\n doctor Check repository requirements before starting or submitting work.\n run Submit one run of an admitted workflow.\n status List the runs or show one run.\n report Report loop facts and seven-day baselines.\n questions List the pending decisions.\n answer Answer one design question.\n approve Approve one pending approval.\n deny Deny one pending approval.\n pause Stop new dispatch for a run.\n resume Resume a paused run.\n drop Cancel a run and keep its files.\n events Print the committed events.\n watch Serve a page that shows the runs live.\n phone Show, list, remove and reset the connected phones.\n config Read and change repository settings.\n start Start the service for a repository.\n\nThe runtime commands need a Cloving service. They use the current git repository; --repository <directory> selects another repository. CLOVING_RUNTIME_DIR overrides its runtime directory.\nUse npm exec -- cloving ... for a project-local installation.\n";
4
4
  export declare const validateUsage = "Usage: cloving workflows validate <manifest-path> [--input <json-file>] [--json]\n\nChecks a Cloving workflow manifest, its compiled SDK artifacts, declared resources and toolchain, and an optional runtime input file. Relative paths resolve against the current directory.\n\nOptions:\n --input <json-file> Validate this runtime input file.\n --json Print one versioned JSON result on stdout.\n\nValidation does not admit a run, dispatch effects, import workflow code or call a model.\n\nExample:\n cloving workflows validate cloving.workflow.json --input input.json\n";
5
- export declare const chatsRedactUsage = "Usage: cloving chats redact <IMPORT_ID>\n\nRedact one existing import selected by its UUID v4 import ID. No service is required.\nWrite redacted.jsonl and redaction.json beside the original corpus with mode 0600.\nHOME supplies the home folder. CLOVING_PRIVATE_TEXTS is an optional JSON list of nonblank strings.\nOriginals and metadata remain private. Redaction does not authorize model use or guarantee removal of every private value.\nExit codes: 0 complete, 1 processing failure, 2 invalid usage.\n";
5
+ export declare const phoneUsage = "Usage: cloving phone status [--json]\n cloving phone list [--json]\n cloving phone remove <device-id> [--json]\n cloving phone reset [--json]\n\nShows and changes the phones that answer the questions of this computer.\nstatus shows the registration with cloving.ai and the number of phones.\nlist shows each phone with its device ID, name, platform, state and pairing time.\nremove marks one phone removed on this computer, then asks cloving.ai to remove it. A failure at cloving.ai keeps the phone removed and shows a warning.\nreset removes the registration with cloving.ai, marks all phones removed and deletes phone/link.json and phone/daemon-keys.json.\nConnect a phone with the Connect a phone button of the watch page.\ncloving start runs the phone relay as a child process. With CLOVING_PHONE_RELAY=off, the relay does not start, and status says that the relay is off or not started.\n";
@@ -1,10 +1,34 @@
1
1
  const binding = "--expected-revision <n> --generation <n> --subject-digest <digest>";
2
+ export const configUsage = `Usage: cloving config list [--json]
3
+ cloving config get <field> [--json]
4
+ cloving config set <field> <value> [--private] [--json]
5
+ cloving config unset <field> [--private] [--json]
6
+
7
+ Reads and changes settings for the current repository; --repository selects another repository.
8
+ Values use JSON when valid, otherwise text. Every change is checked before writing.
9
+ Fields use their default project or private file; --private selects the private file.
10
+ list and get show the effective source and hidden file values. Unconfigured values use defaults; null means no value.
11
+ Changes keep the previous file as .bak and replace the file atomically under a lock.
12
+ A live lock waits at most ten seconds, then exits with settings-locked.
13
+ Private files, backups and temporary files have mode 0600. Changes require a service restart.
14
+ `;
2
15
  export const commandUsage = {
16
+ doctor: `Usage: cloving doctor [--json] [--repository <directory>]
17
+
18
+ Checks repository requirements without repairs, model turns or GitHub writes.
19
+ Required failures or skipped prerequisites exit with status 1.
20
+ `,
21
+ report: `Usage: cloving report [--since <hours>] [--json]
22
+
23
+ Reads loop facts without writing state. Hours are a whole number from 1 to 168; default 24.
24
+ Reports run outcomes, throughput and ended-run costs with seven-day medians and MAD bands.
25
+ Unsupported facts and unreadable sources are unavailable.
26
+ `,
3
27
  run: `Usage: cloving run <workflow-id> (--prompt <text> | --ticket <id> | --next | --input <json-file>) [--command-id <id>] [--json]
4
28
 
5
29
  Submits one run of an admitted workflow. Use exactly one input source.
6
- With --ticket, the workflow gets the ticket ID and reads the ticket itself.
7
- With --next (the same as --ticket next), develop-issue and develop-ticket select a ready ticket through CLOVING_NEXT_COMMAND.
30
+ With --ticket, the daemon reads the ticket at admission. A declared ticket field receives { id, text } inside input.
31
+ With --next (the same as --ticket next), ticket workflows select a ready ticket through CLOVING_NEXT_COMMAND.
8
32
  Success means a committed receipt. It does not mean completed work.
9
33
  `,
10
34
  status: `Usage: cloving status [<run-id>] [--limit <n>] [--after <cursor>] [--json]
@@ -47,14 +71,14 @@ Prints the committed events after a sequence. With --json, each line is one even
47
71
  watch: `Usage: cloving watch [--port <n>]
48
72
 
49
73
  Serves a page on http://127.0.0.1:<port>/ that shows the runs live: the state,
50
- the events, the work of the Claude worker and each pending decision.
74
+ the events, the work of the worker and each pending decision.
51
75
  The default port is 3663. The page is read only. Stop it with Control-C.
52
76
  `,
53
77
  start: `Usage: cloving start [--repository <directory>] [--reset-queue]
54
78
 
55
79
  Starts the Cloving service for one git repository, with the workflow host,
56
- the Claude worker and the watch page. The default repository is the current
57
- directory. This command works in a development checkout of Cloving.
80
+ the worker and the watch page. The default repository is the current
81
+ directory.
58
82
  Stop it with Control-C.
59
83
 
60
84
  The queue continues after unsuccessful runs and stops after three runs in a row
@@ -62,38 +86,61 @@ without a successful handoff. A successful handoff resets the count; ordinary re
62
86
  Stop the service, inspect the failures and reconcile affected issues, then start with --reset-queue and the same queue settings to clear the failure streak once. Tracked commands are preserved.
63
87
 
64
88
  The command reads these settings from the environment:
65
- CLOVING_RUNTIME_DIR The path of the runtime directory. The default is ~/.local/state/cloving/run, if XDG_RUNTIME_DIR and XDG_STATE_HOME are not set.
89
+ Settings files: .cloving/config.json in the repository and <config>/cloving/projects/<name>-<id>.json for private settings. Both require version 1. Precedence: environment, private, project, defaults. <config> is an absolute XDG_CONFIG_HOME or ~/.config. The start guide shows each configured field's source. See the packaged project-config.schema.json and private-config.schema.json in dist/src.
90
+
91
+ CLOVING_RUNTIME_DIR The path of the runtime directory. The default is ~/.local/state/cloving/<name>-<id>/run, if XDG_RUNTIME_DIR and XDG_STATE_HOME are not set. A recorded legacy adoption takes priority.
66
92
  CLOVING_TICKET_COMMAND A JSON list of a command and its arguments. The command gets a ticket ID as its last argument and prints the ticket. The setting has no default, and a run with --ticket needs it.
67
93
  CLOVING_NOTIFY_COMMAND A JSON list of a command and its arguments. Every 15 seconds, new decisions, blocked runs and failed runs send JSON on standard input with no added argument. The setting has no default.
68
- CLOVING_NEXT_COMMAND A JSON list of a command and its arguments. The command runs with no added argument and prints one ready ticket ID for --next. The setting has no default.
69
- CLOVING_QUEUE_SECONDS A whole number from 10 to 3600 seconds between develop-issue queue checks; requires CLOVING_NEXT_COMMAND and CLOVING_TICKET_COMMAND. Unset means no queue. The queue stops after three runs in a row without a successful handoff; manual develop-issue submissions are refused with workflow-active while an issue run is active.
94
+ CLOVING_NEXT_COMMAND A JSON list of a command and its arguments. The command runs with no added argument and prints one ready ticket ID for --next. It must exclude the space-separated ticket IDs in CLOVING_SKIP_TICKETS. The setting has no default.
95
+ CLOVING_QUEUE_SECONDS A whole number from 10 to 3600 seconds between develop-issue queue checks; requires CLOVING_NEXT_COMMAND and CLOVING_TICKET_COMMAND. Unset means no queue. The queue stops after three runs in a row without a successful handoff; manual develop-issue submissions are refused with workflow-active when all lanes are busy.
96
+ CLOVING_QUEUE_LANES A whole number from 1 to 4; the default is 1. Requires CLOVING_QUEUE_SECONDS. Active tickets are refused with ticket-active. Needs #N sentences in the ticket's ## Dependencies section refuse admission with ticket-dependency-open while issue #N is open.
97
+ CLOVING_WORKFLOW_FOLDER An absolute folder path; when set, it replaces the user workflow folder. The private setting workflows.folder sets it. The folder itself must not be a symbolic link.
98
+ CLOVING_SCHEDULES A JSON object mapping declared workflow IDs to {everySeconds, input}; replaces declaration schedules. Intervals are whole seconds from 60 to 86400. Unset keeps declaration schedules. Scheduled runs skip overlapping slots and retain their progress across restart.
70
99
  CLOVING_SELF_UPDATE_SECONDS A whole number from 30 to 3600 seconds between checks of the own checkout; unset means no update. An update stops the daemon and restarts with new code. A change of package-lock.json needs the operator to update and install by hand.
71
- CLOVING_ANALYSIS_TOKEN_COMMAND A JSON list of a program and its nonempty string arguments, run without a shell just before analysis. It has limits of 10 seconds and 4096 combined stdout/stderr bytes; stdout must be one printable ASCII token without spaces, at most 512 bytes after one final line break. Only analysis receives CLAUDE_CODE_OAUTH_TOKEN; API keys are excluded. There is no default.
100
+ CLOVING_GROK_COMMAND A JSON list of a command and its arguments for Grok. The default uses streaming-messages-json, --always-approve and -p; the turn text follows -p or --single as one argument, or is appended if neither flag is present.
72
101
  CLOVING_CLAUDE_COMMAND A JSON list of a command and its arguments for the Claude worker. The default is the claude command with a limit of 5 USD for each turn.
73
102
  CLOVING_PROFILES The path of a JSON file of operator-defined Claude turn profiles, read once at start. The setting has no default.
103
+ CLOVING_COMMANDS A JSON object mapping names to argument arrays with an absolute executable path. Invalid values refuse startup with invalid-commands. Unset means no commands. Command execution is not available yet.
104
+ CLOVING_COMMAND_SECONDS A whole number from 1 to 3600 seconds; the default is 60. Invalid values refuse startup with invalid-command-seconds. Reserved for command execution.
74
105
  CLOVING_TOKEN_PRICES A JSON object from model names to input, cachedInput and output USD prices per million tokens for estimates; entries override matching built-in prices.
75
- CLOVING_WORKER The worker for each turn: claude or codex. The default is claude. Other values stop the start with invalid-worker.
106
+ CLOVING_FALLBACK_MODELS A JSON array of at most three nonempty model names; the default is no fallback. After capacity refusals the first retry keeps the main model and the third attempt uses the first fallback, with the same waits and attempt limit. Requires an explicit -m, --model or --model= argument. A fallback can have a higher price.
107
+ CLOVING_WORKER The worker for each turn: claude, codex, gemini, grok, cursor-agent or opencode. The default is claude. Other values stop the start with harness-no-worker.
76
108
  CLOVING_CODEX_COMMAND A JSON list of a command and its arguments, used only when CLOVING_WORKER is codex; CLOVING_CLAUDE_COMMAND is then ignored. The default is codex exec --json --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check -, with no sandbox and no approval prompts.
109
+ CLOVING_GEMINI_COMMAND A JSON list of a command and its arguments for the gemini worker. The default is gemini --output-format stream-json --approval-mode yolo; Cloving appends -p and the turn text; turn text of 64 KiB or more in UTF-8 goes through standard input instead. No approval prompts or capacity retries.
110
+ CLOVING_OPENCODE_COMMAND A JSON list of a command and its arguments for opencode. The default is opencode run --format json; the turn text is appended as one argument. OPENCODE_PERMISSION permits unattended tools.
77
111
  CLOVING_WATCH_REPOSITORY The service repository context for the watch board, set by start from --repository. Its local origin supplies the GitHub identity. There is no current-directory default.
78
112
  CLOVING_WATCH_ACTIONS The value off removes the board run form and its write endpoint. The default is on.
79
113
  CLOVING_WATCH_PORT The port number of the watch page. The value off starts no watch page. The default is 3663.
114
+ CLOVING_PHONE_RELAY The phone relay child, which connects phones through cloving.ai. The value off starts no phone relay. The default is on.
115
+ CLOVING_RELAY_ORIGIN The origin of the phone relay server. Only https origins are accepted. The default is https://cloving.ai.
80
116
  CLOVING_OWNERSHIP_LEASE_SECONDS The time in seconds of the ownership lease of a started workflow step. The default is 15.
81
117
  CLOVING_HOST_BOUND The largest number of queue messages that the workflow host handles at one time, from 1 to 64. The default is 8.
82
118
  CLOVING_GH_COMMAND A JSON list of a command and its arguments for the GitHub CLI, which the workflow develop-issue uses for pull requests and develop-prd uses for issues. The watch board also uses it to read pull request status. The default is gh.
83
119
  CLOVING_CHECK_COMMAND A JSON list of a command and its arguments that the workflow develop-issue runs in the work tree before a merge. A merge does not occur if the command fails. The setting has no default, and with no setting the merge occurs with no check.
120
+ CLOVING_REQUIRED_CHECKS A JSON list of required check run names before a develop-issue merge. Unset requires all GitHub Actions checks; a repository with no CI can merge after 60 seconds. The latest run of each name decides. The CI wait limit is 90 minutes.
84
121
  CLOVING_PRIVATE_TEXTS A JSON list of texts that the workflow develop-issue does not push in a file or in a commit message. The workflow develop-prd requires the list before posting an issue. The list adds to the path of the home folder, and the case of the letters does not matter. The setting has no default.
85
122
  `,
86
123
  };
87
124
  export const usage = `Usage: cloving [--help] [--version]
125
+ cloving workflows list [--json] [--repository <directory>]
126
+ cloving workflows test [<id>] [--repository <directory>]
88
127
  cloving workflows validate <manifest-path> [--input <json-file>] [--json]
128
+ cloving templates list [--json]
129
+ cloving templates show <name> [--json]
130
+ cloving templates copy <name> [--id <workflow-id>] [--json] [--repository <directory>]
89
131
  cloving <command> [--help]
90
132
 
91
133
  Commands:
134
+ workflows list List bundled, project and user workflows and refusal codes.
135
+ workflows test Run project and user workflow tests without a service.
92
136
  workflows validate Check a compiled workflow manifest, its artifacts and optional runtime input.
93
- chats redact Redact one imported chat corpus into private runtime files.
94
- chats import Import explicitly selected Claude Code transcripts into private runtime files.
137
+ templates list List the workflow templates of the package.
138
+ templates show Show the decision points and the files of one template.
139
+ templates copy Copy one template into .cloving/workflows of the repository.
140
+ doctor Check repository requirements before starting or submitting work.
95
141
  run Submit one run of an admitted workflow.
96
142
  status List the runs or show one run.
143
+ report Report loop facts and seven-day baselines.
97
144
  questions List the pending decisions.
98
145
  answer Answer one design question.
99
146
  approve Approve one pending approval.
@@ -103,36 +150,13 @@ Commands:
103
150
  drop Cancel a run and keep its files.
104
151
  events Print the committed events.
105
152
  watch Serve a page that shows the runs live.
153
+ phone Show, list, remove and reset the connected phones.
154
+ config Read and change repository settings.
106
155
  start Start the service for a repository.
107
156
 
108
- The runtime commands need a Cloving service. CLOVING_RUNTIME_DIR names its runtime directory.
157
+ The runtime commands need a Cloving service. They use the current git repository; --repository <directory> selects another repository. CLOVING_RUNTIME_DIR overrides its runtime directory.
109
158
  Use npm exec -- cloving ... for a project-local installation.
110
159
  `;
111
- export const chatsImportUsage = `Usage: cloving chats import [--] <path> [<path> ...]
112
- cloving chats import --root <projects-folder> [--root <projects-folder> ...] [--exclude-project <name> ...] [-- <path> ...]
113
-
114
- Imports only the selected Claude Code JSONL files. Relative paths use the current directory.
115
- This local command needs no service. It scans only explicitly named roots and does not expand globs or discover configuration.
116
- Positional files come first, retaining order and repetitions. Roots sort by canonical path, then entries by relative path in JavaScript string order.
117
- Exclusions match direct project folder names exactly and prune their children. Exclusions require a root.
118
- Scans accept lowercase .jsonl filenames, attempt at most 100 eligible files across roots, and stop before entering folders at depth four.
119
- Later file candidates and depth-limited folders are pending. Select pending files explicitly in a later import.
120
- Linked components, containment changes and roots in Git repositories are refused. Scan protections require the supported macOS kernel.
121
- The file limit is 10 MiB (10,485,760 bytes). Links and nonregular files are refused.
122
- The total normalized corpus limit is 50 MiB (52,428,800 UTF-8 bytes), including newlines and repeated selections.
123
- Exceeding that total returns output-failed with exit code 1 and no completed coverage manifest; partial files may remain.
124
- --previous-import <IMPORT_ID> compares against one explicitly named UUID v4 import before --.
125
- The earlier coverage and optional revision must be valid, completed private metadata; otherwise previous-import-refused returns exit 1 with no new import.
126
- A comparison writes private revision.json with ordered selection evidence and six status counts. Matching uses source path and selected root path; repetitions pair in order.
127
- Byte-verified extensions are extended; shorter sources are truncated. Legacy imports without sizes can establish unchanged digests but cannot prove extension or truncation.
128
- Missing or truncated evidence makes the import partial. History completeness remains unknown.
129
- Private corpus.jsonl, structure.json and coverage.json files go into a new import directory under the runtime directory's chats directory.
130
- The runtime selection is CLOVING_RUNTIME_DIR, XDG_RUNTIME_DIR, XDG_STATE_HOME, then HOME.
131
- Output contains only counts, fixed codes and an opaque import ID. Source paths stay in the private manifest.
132
- Structure preserves branches and marks known copies without removing records. History completeness remains unknown.
133
- Root imports write coverage version 2 and add excluded and pending entry counts; positional-only imports retain coverage version 1.
134
- Exit codes: 0 for no refused, pending, missing or truncated entries (exclusions alone permit success without comparison), 1 for partial coverage or processing failure, 2 for invalid usage.
135
- `;
136
160
  export const validateUsage = `Usage: cloving workflows validate <manifest-path> [--input <json-file>] [--json]
137
161
 
138
162
  Checks a Cloving workflow manifest, its compiled SDK artifacts, declared resources and toolchain, and an optional runtime input file. Relative paths resolve against the current directory.
@@ -146,11 +170,16 @@ Validation does not admit a run, dispatch effects, import workflow code or call
146
170
  Example:
147
171
  cloving workflows validate cloving.workflow.json --input input.json
148
172
  `;
149
- export const chatsRedactUsage = `Usage: cloving chats redact <IMPORT_ID>
150
-
151
- Redact one existing import selected by its UUID v4 import ID. No service is required.
152
- Write redacted.jsonl and redaction.json beside the original corpus with mode 0600.
153
- HOME supplies the home folder. CLOVING_PRIVATE_TEXTS is an optional JSON list of nonblank strings.
154
- Originals and metadata remain private. Redaction does not authorize model use or guarantee removal of every private value.
155
- Exit codes: 0 complete, 1 processing failure, 2 invalid usage.
173
+ export const phoneUsage = `Usage: cloving phone status [--json]
174
+ cloving phone list [--json]
175
+ cloving phone remove <device-id> [--json]
176
+ cloving phone reset [--json]
177
+
178
+ Shows and changes the phones that answer the questions of this computer.
179
+ status shows the registration with cloving.ai and the number of phones.
180
+ list shows each phone with its device ID, name, platform, state and pairing time.
181
+ remove marks one phone removed on this computer, then asks cloving.ai to remove it. A failure at cloving.ai keeps the phone removed and shows a warning.
182
+ reset removes the registration with cloving.ai, marks all phones removed and deletes phone/link.json and phone/daemon-keys.json.
183
+ Connect a phone with the Connect a phone button of the watch page.
184
+ cloving start runs the phone relay as a child process. With CLOVING_PHONE_RELAY=off, the relay does not start, and status says that the relay is off or not started.
156
185
  `;
@@ -7,4 +7,6 @@ export interface WatchActions {
7
7
  }
8
8
  export declare function watchActions(runtimeDirectory: string): Promise<WatchActions>;
9
9
  export declare function watchHost(request: IncomingMessage): boolean;
10
+ export declare function actionAllowed(actions: WatchActions, request: IncomingMessage): boolean;
11
+ export declare function actionBody(request: IncomingMessage): Promise<unknown>;
10
12
  export declare function watchAction(actions: WatchActions, request: IncomingMessage): Promise<string | null>;
@@ -14,13 +14,13 @@ export function watchHost(request) {
14
14
  const port = request.socket.localPort;
15
15
  return [`127.0.0.1:${String(port)}`, `localhost:${String(port)}`].includes(request.headers.host ?? "");
16
16
  }
17
- function authorized(actions, request) {
17
+ export function actionAllowed(actions, request) {
18
18
  return (watchHost(request) &&
19
19
  request.headers.origin === `http://${request.headers.host ?? ""}` &&
20
20
  request.headers["x-cloving-token"] === actions.token &&
21
21
  /^application\/json(?:\s*;\s*charset=utf-8)?$/i.test(request.headers["content-type"] ?? ""));
22
22
  }
23
- async function bodyOf(request) {
23
+ export async function actionBody(request) {
24
24
  const chunks = [];
25
25
  let size = 0;
26
26
  for await (const chunk of request) {
@@ -39,9 +39,9 @@ async function bodyOf(request) {
39
39
  }
40
40
  }
41
41
  export async function watchAction(actions, request) {
42
- if (!authorized(actions, request))
42
+ if (!actionAllowed(actions, request))
43
43
  return null;
44
- const given = cardRunRequest(actions.forms, await bodyOf(request));
44
+ const given = cardRunRequest(actions.forms, await actionBody(request));
45
45
  if (given === null)
46
46
  return null;
47
47
  const status = await send(actions.runtimeDirectory, {
@@ -21,11 +21,20 @@ export declare function CardReview(props: {
21
21
  readonly card: WatchCard;
22
22
  readonly workflowId: string;
23
23
  }): Shown;
24
- export declare function completionMark(card: WatchCard, workflowId: string): Shown;
24
+ export declare function staleObservation(card: WatchCard, now: string): Shown;
25
+ export declare function observationText(card: WatchCard, fallback: string): string;
26
+ export declare function completionMark(card: WatchCard, context: {
27
+ readonly workflowId: string;
28
+ readonly now: string;
29
+ }): Shown;
25
30
  export declare function Card(props: {
26
31
  readonly card: WatchCard;
27
32
  readonly workflowId: string;
28
33
  readonly now: string;
34
+ readonly observationNow?: string | undefined;
35
+ }): Shown;
36
+ export declare function HandoffLinks(props: {
37
+ readonly run: Pick<WatchCard, "parentRunId" | "childRunIds" | "awaitedRunId">;
29
38
  }): Shown;
30
39
  export declare function WorkflowList(props: {
31
40
  readonly workflows: readonly WatchWorkflow[];
@@ -43,6 +52,7 @@ export declare function Column(props: {
43
52
  readonly addCard?: Shown;
44
53
  readonly workflowId: string;
45
54
  readonly now: string;
55
+ readonly observationNow?: string | undefined;
46
56
  readonly controls?: ColumnControls | undefined;
47
57
  }): Shown;
48
58
  export declare function Board(props: {
@@ -50,5 +60,6 @@ export declare function Board(props: {
50
60
  readonly cardForm?: CardForm | undefined;
51
61
  readonly cards?: CardControls | undefined;
52
62
  readonly now: string;
63
+ readonly observationNow?: string | undefined;
53
64
  readonly controls?: ColumnControls | undefined;
54
65
  }): Shown;