cloving 1.2.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 (518) hide show
  1. package/README.md +525 -185
  2. package/dist/src/agent-harness-shell.d.ts +12 -0
  3. package/dist/src/agent-harness-shell.js +90 -0
  4. package/dist/src/agent-harness-versions.d.ts +8 -0
  5. package/dist/src/agent-harness-versions.js +49 -0
  6. package/dist/src/agent-harnesses.d.ts +4 -0
  7. package/dist/src/agent-harnesses.js +13 -0
  8. package/dist/src/authority/commands.d.ts +1 -0
  9. package/dist/src/authority/commands.js +24 -4
  10. package/dist/src/authority/gate-reduction.d.ts +1 -0
  11. package/dist/src/authority/gate-reduction.js +18 -3
  12. package/dist/src/authority/gates.d.ts +2 -1
  13. package/dist/src/authority/gates.js +5 -1
  14. package/dist/src/authority/operations.js +1 -1
  15. package/dist/src/authority/reduction.d.ts +1 -1
  16. package/dist/src/authority/reduction.js +6 -1
  17. package/dist/src/authority/status-input.d.ts +1 -1
  18. package/dist/src/authority/status.d.ts +1 -0
  19. package/dist/src/authority/status.js +27 -3
  20. package/dist/src/authority/transitions.d.ts +5 -5
  21. package/dist/src/authority/transitions.js +6 -0
  22. package/dist/src/broker/actor/authority-delivery.js +1 -0
  23. package/dist/src/broker/actor/authority-queries.d.ts +7 -1
  24. package/dist/src/broker/actor/authority-queries.js +17 -2
  25. package/dist/src/broker/actor/authority-receipts.js +11 -1
  26. package/dist/src/broker/actor/authority-session.js +2 -2
  27. package/dist/src/broker/actor/authority-settings.js +4 -0
  28. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  29. package/dist/src/broker/actor/delivery-intents.js +4 -4
  30. package/dist/src/broker/actor/effect-delivery.js +4 -1
  31. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  32. package/dist/src/broker/actor/effect-queries.js +7 -0
  33. package/dist/src/broker/actor/pin-check.js +1 -1
  34. package/dist/src/broker/actor/stop-plan.js +1 -1
  35. package/dist/src/broker/actor/turn-state.js +1 -1
  36. package/dist/src/broker/authority-admission.js +22 -9
  37. package/dist/src/broker/authority-restore.js +1 -0
  38. package/dist/src/broker/decision-restore.js +4 -4
  39. package/dist/src/broker/socket-address.d.ts +3 -1
  40. package/dist/src/broker/socket-address.js +2 -2
  41. package/dist/src/cli/arguments.d.ts +11 -13
  42. package/dist/src/cli/arguments.js +37 -107
  43. package/dist/src/cli/command-effects.d.ts +7 -0
  44. package/dist/src/cli/command-effects.js +39 -0
  45. package/dist/src/cli/commands.js +11 -4
  46. package/dist/src/cli/config-arguments.d.ts +11 -0
  47. package/dist/src/cli/config-arguments.js +59 -0
  48. package/dist/src/cli/config-command.d.ts +2 -0
  49. package/dist/src/cli/config-command.js +105 -0
  50. package/dist/src/cli/config-file.d.ts +3 -0
  51. package/dist/src/cli/config-file.js +50 -0
  52. package/dist/src/cli/config-lock.d.ts +7 -0
  53. package/dist/src/cli/config-lock.js +61 -0
  54. package/dist/src/cli/config-notice.d.ts +5 -0
  55. package/dist/src/cli/config-notice.js +46 -0
  56. package/dist/src/cli/doctor-github.d.ts +9 -0
  57. package/dist/src/cli/doctor-github.js +138 -0
  58. package/dist/src/cli/doctor-harness.d.ts +13 -0
  59. package/dist/src/cli/doctor-harness.js +242 -0
  60. package/dist/src/cli/doctor-local.d.ts +18 -0
  61. package/dist/src/cli/doctor-local.js +77 -0
  62. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  63. package/dist/src/cli/doctor-runtime.js +176 -0
  64. package/dist/src/cli/doctor-service.d.ts +1 -0
  65. package/dist/src/cli/doctor-service.js +11 -0
  66. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  67. package/dist/src/cli/doctor-workflows.js +45 -0
  68. package/dist/src/cli/doctor.d.ts +15 -0
  69. package/dist/src/cli/doctor.js +190 -0
  70. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  71. package/dist/src/cli/github-ci-progress.js +83 -0
  72. package/dist/src/cli/github-retry.d.ts +6 -0
  73. package/dist/src/cli/github-retry.js +47 -0
  74. package/dist/src/cli/harness-probes.d.ts +22 -0
  75. package/dist/src/cli/harness-probes.js +183 -0
  76. package/dist/src/cli/main.d.ts +7 -1
  77. package/dist/src/cli/main.js +39 -61
  78. package/dist/src/cli/phone-arguments.d.ts +14 -0
  79. package/dist/src/cli/phone-arguments.js +37 -0
  80. package/dist/src/cli/phone-client.d.ts +2 -0
  81. package/dist/src/cli/phone-client.js +32 -0
  82. package/dist/src/cli/phone-command.d.ts +13 -0
  83. package/dist/src/cli/phone-command.js +101 -0
  84. package/dist/src/cli/probe-command.d.ts +36 -0
  85. package/dist/src/cli/probe-command.js +59 -0
  86. package/dist/src/cli/project-settings.d.ts +4 -0
  87. package/dist/src/cli/project-settings.js +33 -0
  88. package/dist/src/cli/render.d.ts +2 -1
  89. package/dist/src/cli/render.js +44 -28
  90. package/dist/src/cli/report-github.d.ts +18 -0
  91. package/dist/src/cli/report-github.js +200 -0
  92. package/dist/src/cli/report.d.ts +17 -0
  93. package/dist/src/cli/report.js +192 -0
  94. package/dist/src/cli/repository-arguments.d.ts +5 -0
  95. package/dist/src/cli/repository-arguments.js +34 -0
  96. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  97. package/dist/src/cli/runtime-arguments.js +15 -0
  98. package/dist/src/cli/runtime-directory.d.ts +6 -2
  99. package/dist/src/cli/runtime-directory.js +72 -14
  100. package/dist/src/cli/toolchain.d.ts +2 -0
  101. package/dist/src/cli/toolchain.js +22 -2
  102. package/dist/src/cli/usage-render.d.ts +5 -0
  103. package/dist/src/cli/usage-render.js +40 -1
  104. package/dist/src/cli/usage.d.ts +3 -3
  105. package/dist/src/cli/usage.js +70 -44
  106. package/dist/src/cli/watch-actions.d.ts +2 -0
  107. package/dist/src/cli/watch-actions.js +4 -4
  108. package/dist/src/cli/watch-board-view.d.ts +1 -1
  109. package/dist/src/cli/watch-board-view.js +8 -2
  110. package/dist/src/cli/watch-board.js +23 -10
  111. package/dist/src/cli/watch-card-forms.js +2 -2
  112. package/dist/src/cli/watch-client.d.ts +1 -1
  113. package/dist/src/cli/watch-client.js +7 -2
  114. package/dist/src/cli/watch-header-view.d.ts +27 -0
  115. package/dist/src/cli/watch-header-view.js +116 -0
  116. package/dist/src/cli/watch-model.js +17 -4
  117. package/dist/src/cli/watch-page.js +48 -12
  118. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  119. package/dist/src/cli/watch-phone-client.js +84 -0
  120. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  121. package/dist/src/cli/watch-phone-view.js +113 -0
  122. package/dist/src/cli/watch-phone.d.ts +5 -0
  123. package/dist/src/cli/watch-phone.js +53 -0
  124. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  125. package/dist/src/cli/watch-pull-request.js +4 -0
  126. package/dist/src/cli/watch-render.d.ts +9 -1
  127. package/dist/src/cli/watch-server.js +23 -5
  128. package/dist/src/cli/watch-turn.d.ts +4 -1
  129. package/dist/src/cli/watch-turn.js +37 -1
  130. package/dist/src/cli/watch-usage.js +5 -1
  131. package/dist/src/cli/watch-view.d.ts +6 -20
  132. package/dist/src/cli/watch-view.js +14 -106
  133. package/dist/src/cli.js +106 -23
  134. package/dist/src/command-settings.d.ts +16 -0
  135. package/dist/src/command-settings.js +42 -0
  136. package/dist/src/configuration-change.d.ts +11 -0
  137. package/dist/src/configuration-change.js +62 -0
  138. package/dist/src/configuration-display.d.ts +21 -0
  139. package/dist/src/configuration-display.js +69 -0
  140. package/dist/src/configuration-schema.d.ts +49 -0
  141. package/dist/src/configuration-schema.js +159 -0
  142. package/dist/src/daemon/claude-turn.d.ts +19 -5
  143. package/dist/src/daemon/claude-turn.js +116 -53
  144. package/dist/src/daemon/claude-worker.d.ts +3 -3
  145. package/dist/src/daemon/claude-worker.js +65 -76
  146. package/dist/src/daemon/command-journal.d.ts +5 -0
  147. package/dist/src/daemon/command-journal.js +50 -0
  148. package/dist/src/daemon/command-process.d.ts +28 -0
  149. package/dist/src/daemon/command-process.js +164 -0
  150. package/dist/src/daemon/command-worker.d.ts +19 -0
  151. package/dist/src/daemon/command-worker.js +182 -0
  152. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  153. package/dist/src/daemon/cursor-stream.js +154 -0
  154. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  155. package/dist/src/daemon/daemon-adapters.js +102 -0
  156. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  157. package/dist/src/daemon/daemon-loops.js +39 -0
  158. package/dist/src/daemon/daemon.d.ts +2 -33
  159. package/dist/src/daemon/daemon.js +126 -132
  160. package/dist/src/daemon/declared-input.d.ts +3 -0
  161. package/dist/src/daemon/declared-input.js +9 -0
  162. package/dist/src/daemon/delivery-router.js +1 -1
  163. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  164. package/dist/src/daemon/gemini-stream.js +129 -0
  165. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  166. package/dist/src/daemon/github-ci-rerun.js +92 -0
  167. package/dist/src/daemon/github-ci.js +89 -8
  168. package/dist/src/daemon/github-merge-call.d.ts +2 -0
  169. package/dist/src/daemon/github-merge.js +7 -3
  170. package/dist/src/daemon/github-methods.js +10 -0
  171. package/dist/src/daemon/github-operation.d.ts +1 -0
  172. package/dist/src/daemon/github-retry.js +8 -44
  173. package/dist/src/daemon/issue-queue.d.ts +1 -0
  174. package/dist/src/daemon/issue-queue.js +3 -26
  175. package/dist/src/daemon/notify.js +2 -1
  176. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  177. package/dist/src/daemon/opencode-stream.js +87 -0
  178. package/dist/src/daemon/queue-status.d.ts +4 -0
  179. package/dist/src/daemon/queue-status.js +38 -0
  180. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  181. package/dist/src/daemon/retry-worktree.js +139 -0
  182. package/dist/src/daemon/retrying-turn.d.ts +2 -0
  183. package/dist/src/daemon/retrying-turn.js +108 -30
  184. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  185. package/dist/src/daemon/schedule-journal.js +57 -0
  186. package/dist/src/daemon/text-output.d.ts +18 -0
  187. package/dist/src/daemon/text-output.js +44 -0
  188. package/dist/src/daemon/ticket-registration.d.ts +5 -7
  189. package/dist/src/daemon/ticket-registration.js +85 -40
  190. package/dist/src/daemon/turn-command.d.ts +10 -0
  191. package/dist/src/daemon/turn-command.js +33 -0
  192. package/dist/src/daemon/turn-report.d.ts +18 -0
  193. package/dist/src/daemon/turn-report.js +79 -0
  194. package/dist/src/daemon/work-tree.d.ts +2 -1
  195. package/dist/src/daemon/work-tree.js +15 -12
  196. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  197. package/dist/src/daemon/workflow-generations.js +57 -0
  198. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  199. package/dist/src/daemon/workflow-replay.js +58 -0
  200. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  201. package/dist/src/daemon/workflow-schedules.js +185 -0
  202. package/dist/src/decision-wait.d.ts +1 -0
  203. package/dist/src/decision-wait.js +3 -0
  204. package/dist/src/delivery-backoff.d.ts +1 -0
  205. package/dist/src/delivery-backoff.js +3 -0
  206. package/dist/src/doctor-report.d.ts +24 -0
  207. package/dist/src/doctor-report.js +70 -0
  208. package/dist/src/execution-pin.d.ts +5 -0
  209. package/dist/src/execution-pin.js +67 -4
  210. package/dist/src/grok-result.d.ts +12 -0
  211. package/dist/src/grok-result.js +61 -0
  212. package/dist/src/harness-defaults.d.ts +35 -0
  213. package/dist/src/harness-defaults.js +121 -0
  214. package/dist/src/host/decision-resume.d.ts +35 -0
  215. package/dist/src/host/decision-resume.js +86 -0
  216. package/dist/src/host/gate-bridge.d.ts +48 -0
  217. package/dist/src/host/gate-bridge.js +124 -0
  218. package/dist/src/host/run-wait.d.ts +26 -0
  219. package/dist/src/host/run-wait.js +37 -0
  220. package/dist/src/host/start-delivery.d.ts +1 -1
  221. package/dist/src/host/start-delivery.js +10 -3
  222. package/dist/src/host/step-bridge-host.d.ts +6 -20
  223. package/dist/src/host/step-bridge-host.js +44 -58
  224. package/dist/src/merge-request.d.ts +19 -0
  225. package/dist/src/merge-request.js +32 -0
  226. package/dist/src/phone/canonical-json.d.ts +1 -0
  227. package/dist/src/phone/canonical-json.js +16 -0
  228. package/dist/src/phone/phone-link.d.ts +7 -0
  229. package/dist/src/phone/phone-link.js +21 -0
  230. package/dist/src/phone/qr-data.d.ts +8 -0
  231. package/dist/src/phone/qr-data.js +133 -0
  232. package/dist/src/phone/qr-matrix.d.ts +6 -0
  233. package/dist/src/phone/qr-matrix.js +175 -0
  234. package/dist/src/phone/qr-penalty.d.ts +3 -0
  235. package/dist/src/phone/qr-penalty.js +67 -0
  236. package/dist/src/phone/qr-picture.d.ts +5 -0
  237. package/dist/src/phone/qr-picture.js +24 -0
  238. package/dist/src/private-config.schema.json +263 -0
  239. package/dist/src/project-config.schema.json +65 -0
  240. package/dist/src/project-settings.d.ts +19 -0
  241. package/dist/src/project-settings.js +131 -0
  242. package/dist/src/relay/answer-check.d.ts +24 -0
  243. package/dist/src/relay/answer-check.js +145 -0
  244. package/dist/src/relay/answer-inbox.d.ts +15 -0
  245. package/dist/src/relay/answer-inbox.js +173 -0
  246. package/dist/src/relay/daemon-keys.d.ts +16 -0
  247. package/dist/src/relay/daemon-keys.js +75 -0
  248. package/dist/src/relay/decision-check.d.ts +3 -0
  249. package/dist/src/relay/decision-check.js +77 -0
  250. package/dist/src/relay/decision-close.d.ts +6 -0
  251. package/dist/src/relay/decision-close.js +72 -0
  252. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  253. package/dist/src/relay/decision-envelopes.js +93 -0
  254. package/dist/src/relay/decision-watch.d.ts +14 -0
  255. package/dist/src/relay/decision-watch.js +68 -0
  256. package/dist/src/relay/envelope-post.d.ts +8 -0
  257. package/dist/src/relay/envelope-post.js +71 -0
  258. package/dist/src/relay/envelope.d.ts +28 -0
  259. package/dist/src/relay/envelope.js +53 -0
  260. package/dist/src/relay/hpke.d.ts +25 -0
  261. package/dist/src/relay/hpke.js +108 -0
  262. package/dist/src/relay/pairing-checks.d.ts +42 -0
  263. package/dist/src/relay/pairing-checks.js +172 -0
  264. package/dist/src/relay/pairing-follow.d.ts +8 -0
  265. package/dist/src/relay/pairing-follow.js +95 -0
  266. package/dist/src/relay/pairing-session.d.ts +29 -0
  267. package/dist/src/relay/pairing-session.js +87 -0
  268. package/dist/src/relay/phone-delivery.d.ts +51 -0
  269. package/dist/src/relay/phone-delivery.js +139 -0
  270. package/dist/src/relay/phone-devices.d.ts +36 -0
  271. package/dist/src/relay/phone-devices.js +46 -0
  272. package/dist/src/relay/phone-inbox.d.ts +18 -0
  273. package/dist/src/relay/phone-inbox.js +17 -0
  274. package/dist/src/relay/phone-operations.d.ts +18 -0
  275. package/dist/src/relay/phone-operations.js +121 -0
  276. package/dist/src/relay/phone-outbox.d.ts +21 -0
  277. package/dist/src/relay/phone-outbox.js +25 -0
  278. package/dist/src/relay/phone-socket.d.ts +6 -0
  279. package/dist/src/relay/phone-socket.js +63 -0
  280. package/dist/src/relay/relay-control.d.ts +7 -0
  281. package/dist/src/relay/relay-control.js +24 -0
  282. package/dist/src/relay/relay-files.d.ts +2 -0
  283. package/dist/src/relay/relay-files.js +23 -0
  284. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  285. package/dist/src/relay/relay-heartbeat.js +81 -0
  286. package/dist/src/relay/relay-http.d.ts +14 -0
  287. package/dist/src/relay/relay-http.js +63 -0
  288. package/dist/src/relay/relay-registration.d.ts +15 -0
  289. package/dist/src/relay/relay-registration.js +63 -0
  290. package/dist/src/relay/relay-service.d.ts +25 -0
  291. package/dist/src/relay/relay-service.js +216 -0
  292. package/dist/src/relay/relay-store.d.ts +48 -0
  293. package/dist/src/relay/relay-store.js +131 -0
  294. package/dist/src/relay/sealed-post.d.ts +25 -0
  295. package/dist/src/relay/sealed-post.js +52 -0
  296. package/dist/src/relay.d.ts +1 -0
  297. package/dist/src/relay.js +8 -0
  298. package/dist/src/report-statistics.d.ts +50 -0
  299. package/dist/src/report-statistics.js +70 -0
  300. package/dist/src/report.d.ts +171 -0
  301. package/dist/src/report.js +119 -0
  302. package/dist/src/repository-identity.d.ts +4 -0
  303. package/dist/src/repository-identity.js +4 -0
  304. package/dist/src/review-subject.d.ts +41 -0
  305. package/dist/src/review-subject.js +91 -0
  306. package/dist/src/run-wait.d.ts +23 -0
  307. package/dist/src/run-wait.js +20 -0
  308. package/dist/src/service/active-tickets.d.ts +4 -0
  309. package/dist/src/service/active-tickets.js +49 -0
  310. package/dist/src/service/command-effects.d.ts +4 -0
  311. package/dist/src/service/command-effects.js +16 -0
  312. package/dist/src/service/decision-handler.d.ts +4 -0
  313. package/dist/src/service/decision-handler.js +39 -4
  314. package/dist/src/service/gateway.js +18 -3
  315. package/dist/src/service/registry.d.ts +16 -3
  316. package/dist/src/service/registry.js +34 -3
  317. package/dist/src/service/replies.d.ts +9 -1
  318. package/dist/src/service/replies.js +12 -0
  319. package/dist/src/service/run-handlers.js +14 -55
  320. package/dist/src/service/run-metadata.d.ts +8 -0
  321. package/dist/src/service/run-metadata.js +53 -0
  322. package/dist/src/service/run-waits.d.ts +3 -0
  323. package/dist/src/service/run-waits.js +41 -0
  324. package/dist/src/service/service.d.ts +18 -2
  325. package/dist/src/service/service.js +23 -7
  326. package/dist/src/service/submission-handler.d.ts +0 -1
  327. package/dist/src/service/submission-handler.js +6 -34
  328. package/dist/src/service/worker-port.d.ts +1 -0
  329. package/dist/src/service/worker-totals.js +8 -23
  330. package/dist/src/step-bridge.d.ts +23 -0
  331. package/dist/src/steps/decision-gate.d.ts +2 -1
  332. package/dist/src/steps/decision-gate.js +7 -0
  333. package/dist/src/steps/merge-by-person.d.ts +2 -0
  334. package/dist/src/steps/merge-by-person.js +18 -0
  335. package/dist/src/steps/merge-when-green.d.ts +2 -0
  336. package/dist/src/steps/merge-when-green.js +62 -0
  337. package/dist/src/steps/review-by-agent.d.ts +5 -0
  338. package/dist/src/steps/review-by-agent.js +124 -0
  339. package/dist/src/steps/review-by-person.d.ts +4 -0
  340. package/dist/src/steps/review-by-person.js +16 -0
  341. package/dist/src/steps/review-subject.d.ts +2 -0
  342. package/dist/src/steps/review-subject.js +11 -0
  343. package/dist/src/steps/run-command.d.ts +2 -0
  344. package/dist/src/steps/run-command.js +15 -0
  345. package/dist/src/steps/sleep.d.ts +3 -0
  346. package/dist/src/steps/sleep.js +19 -0
  347. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  348. package/dist/src/steps/wait-for-decision.js +71 -0
  349. package/dist/src/steps/wait-for-run.d.ts +5 -0
  350. package/dist/src/steps/wait-for-run.js +9 -0
  351. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  352. package/dist/src/storage/decision-snapshots.js +7 -1
  353. package/dist/src/submission.d.ts +4 -0
  354. package/dist/src/submission.js +6 -2
  355. package/dist/src/testing.d.ts +29 -0
  356. package/dist/src/testing.js +264 -0
  357. package/dist/src/ticket-status-stream.d.ts +9 -0
  358. package/dist/src/ticket-status-stream.js +94 -0
  359. package/dist/src/token-prices.d.ts +12 -4
  360. package/dist/src/token-prices.js +15 -2
  361. package/dist/src/turn-profile.d.ts +1 -0
  362. package/dist/src/turn-profile.js +8 -1
  363. package/dist/src/worker-usage.d.ts +16 -0
  364. package/dist/src/worker-usage.js +57 -0
  365. package/dist/src/workflow-admission.d.ts +5 -0
  366. package/dist/src/workflow-candidate.d.ts +7 -2
  367. package/dist/src/workflow-candidate.js +47 -5
  368. package/dist/src/workflow-declaration.d.ts +21 -3
  369. package/dist/src/workflow-declaration.js +77 -9
  370. package/dist/src/workflow-discovery.d.ts +2 -1
  371. package/dist/src/workflow-discovery.js +4 -1
  372. package/dist/src/workflow-refusals.js +3 -0
  373. package/dist/src/workflow-schedule.d.ts +22 -0
  374. package/dist/src/workflow-schedule.js +53 -0
  375. package/dist/src/workflows.d.ts +11 -1
  376. package/dist/src/workflows.js +8 -0
  377. package/dist/tools/admit-workflow.d.ts +1 -0
  378. package/dist/tools/admit-workflow.js +18 -5
  379. package/dist/tools/doctor-adoption.d.ts +1 -0
  380. package/dist/tools/doctor-adoption.js +11 -0
  381. package/dist/tools/project-configuration.d.ts +4 -0
  382. package/dist/tools/project-configuration.js +47 -0
  383. package/dist/tools/self-host-processes.d.ts +1 -0
  384. package/dist/tools/self-host-processes.js +33 -22
  385. package/dist/tools/self-host-project.d.ts +4 -0
  386. package/dist/tools/self-host-project.js +61 -14
  387. package/dist/tools/self-host-runtime.d.ts +16 -0
  388. package/dist/tools/self-host-runtime.js +60 -0
  389. package/dist/tools/self-host-workflows.d.ts +1 -0
  390. package/dist/tools/self-host-workflows.js +36 -1
  391. package/dist/tools/self-host.js +86 -61
  392. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  393. package/dist/tools/workflow-candidate-counts.js +31 -16
  394. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  395. package/dist/tools/workflow-candidate-fields.js +24 -0
  396. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  397. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  398. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  399. package/dist/tools/workflow-candidate-program.js +36 -8
  400. package/dist/tools/workflow-candidate-source.js +77 -15
  401. package/dist/tools/workflow-candidate-syntax.d.ts +8 -2
  402. package/dist/tools/workflow-candidate-syntax.js +70 -26
  403. package/dist/tools/workflow-command.d.ts +1 -0
  404. package/dist/tools/workflow-command.js +143 -0
  405. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  406. package/dist/tools/workflow-folder-capture.js +47 -2
  407. package/dist/tools/workflow-folders.d.ts +17 -1
  408. package/dist/tools/workflow-folders.js +59 -6
  409. package/dist/tools/workflow-test-hook.d.ts +7 -0
  410. package/dist/tools/workflow-test-hook.js +16 -0
  411. package/dist/tools/workflow-test-loader.d.ts +1 -0
  412. package/dist/tools/workflow-test-loader.js +10 -0
  413. package/dist/workflows/develop-ticket.js +1 -1
  414. package/dist/workflows/ticket-prompts.js +5 -1
  415. package/package.json +46 -4
  416. package/templates/develop/README.md +78 -0
  417. package/templates/develop/develop/accept.ts +11 -0
  418. package/templates/develop/develop/flow-tests.ts +357 -0
  419. package/templates/develop/develop/local.ts +40 -0
  420. package/templates/develop/develop/option-tests.ts +174 -0
  421. package/templates/develop/develop/partial-choice.ts +29 -0
  422. package/templates/develop/develop/partial.ts +28 -0
  423. package/templates/develop/develop/pull.ts +152 -0
  424. package/templates/develop/develop/queue-partial.ts +39 -0
  425. package/templates/develop/develop/refusal-tests.ts +174 -0
  426. package/templates/develop/develop/report.ts +156 -0
  427. package/templates/develop/develop/round.ts +40 -0
  428. package/templates/develop/develop/scenarios.ts +87 -0
  429. package/templates/develop/develop/turn.ts +67 -0
  430. package/templates/develop/develop.declaration.json +24 -0
  431. package/templates/develop/develop.test.ts +287 -0
  432. package/templates/develop/develop.ts +30 -0
  433. package/templates/develop/template.json +153 -0
  434. package/dist/src/chats/analysis-batches.d.ts +0 -42
  435. package/dist/src/chats/analysis-batches.js +0 -97
  436. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  437. package/dist/src/chats/analysis-checkpoint.js +0 -31
  438. package/dist/src/chats/analysis-contract.d.ts +0 -80
  439. package/dist/src/chats/analysis-contract.js +0 -16
  440. package/dist/src/chats/analysis-data.d.ts +0 -3
  441. package/dist/src/chats/analysis-data.js +0 -85
  442. package/dist/src/chats/analysis-input.d.ts +0 -18
  443. package/dist/src/chats/analysis-input.js +0 -97
  444. package/dist/src/chats/analysis-links.d.ts +0 -2
  445. package/dist/src/chats/analysis-links.js +0 -25
  446. package/dist/src/chats/analysis-merge.d.ts +0 -16
  447. package/dist/src/chats/analysis-merge.js +0 -134
  448. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  449. package/dist/src/chats/analysis-prompt.js +0 -42
  450. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  451. package/dist/src/chats/analysis-proposal.js +0 -41
  452. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  453. package/dist/src/chats/analysis-provenance.js +0 -99
  454. package/dist/src/chats/analysis-shape.d.ts +0 -4
  455. package/dist/src/chats/analysis-shape.js +0 -235
  456. package/dist/src/chats/analysis.d.ts +0 -3
  457. package/dist/src/chats/analysis.js +0 -42
  458. package/dist/src/chats/corpus-input.d.ts +0 -5
  459. package/dist/src/chats/corpus-input.js +0 -288
  460. package/dist/src/chats/destination.d.ts +0 -4
  461. package/dist/src/chats/destination.js +0 -96
  462. package/dist/src/chats/import.d.ts +0 -15
  463. package/dist/src/chats/import.js +0 -243
  464. package/dist/src/chats/input-file.d.ts +0 -3
  465. package/dist/src/chats/input-file.js +0 -32
  466. package/dist/src/chats/normalize.d.ts +0 -29
  467. package/dist/src/chats/normalize.js +0 -155
  468. package/dist/src/chats/previous-import.d.ts +0 -5
  469. package/dist/src/chats/previous-import.js +0 -34
  470. package/dist/src/chats/reader.d.ts +0 -21
  471. package/dist/src/chats/reader.js +0 -118
  472. package/dist/src/chats/redact-import.d.ts +0 -14
  473. package/dist/src/chats/redact-import.js +0 -141
  474. package/dist/src/chats/redaction.d.ts +0 -41
  475. package/dist/src/chats/redaction.js +0 -161
  476. package/dist/src/chats/reference-mapping.d.ts +0 -16
  477. package/dist/src/chats/reference-mapping.js +0 -153
  478. package/dist/src/chats/revision-input.d.ts +0 -3
  479. package/dist/src/chats/revision-input.js +0 -180
  480. package/dist/src/chats/revision.d.ts +0 -48
  481. package/dist/src/chats/revision.js +0 -94
  482. package/dist/src/chats/selection.d.ts +0 -25
  483. package/dist/src/chats/selection.js +0 -109
  484. package/dist/src/chats/source.d.ts +0 -23
  485. package/dist/src/chats/source.js +0 -135
  486. package/dist/src/chats/structure.d.ts +0 -57
  487. package/dist/src/chats/structure.js +0 -216
  488. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  489. package/dist/src/chats/workflow-generation-projection.js +0 -75
  490. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  491. package/dist/src/chats/workflow-generation-source.js +0 -124
  492. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  493. package/dist/src/chats/workflow-generation-text.js +0 -74
  494. package/dist/src/chats/workflow-generation.d.ts +0 -69
  495. package/dist/src/chats/workflow-generation.js +0 -142
  496. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  497. package/dist/src/daemon/analysis-launch.js +0 -81
  498. package/dist/src/daemon/analysis-token.d.ts +0 -6
  499. package/dist/src/daemon/analysis-token.js +0 -88
  500. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  501. package/dist/src/daemon/analysis-worker.js +0 -271
  502. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  503. package/dist/src/daemon/chats-batch-binding.js +0 -99
  504. package/dist/src/daemon/chats-capture.d.ts +0 -18
  505. package/dist/src/daemon/chats-capture.js +0 -194
  506. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  507. package/dist/src/daemon/chats-checkpoints.js +0 -186
  508. package/dist/src/daemon/chats-files.d.ts +0 -42
  509. package/dist/src/daemon/chats-files.js +0 -252
  510. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  511. package/dist/src/daemon/chats-follow-up.js +0 -180
  512. package/dist/src/daemon/chats-question.d.ts +0 -15
  513. package/dist/src/daemon/chats-question.js +0 -93
  514. package/dist/src/daemon/chats-worker.d.ts +0 -13
  515. package/dist/src/daemon/chats-worker.js +0 -201
  516. package/dist/workflows/analyze-chats.d.ts +0 -15
  517. package/dist/workflows/analyze-chats.declaration.json +0 -22
  518. package/dist/workflows/analyze-chats.js +0 -250
@@ -0,0 +1,131 @@
1
+ import { chmod, open } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { createRuntime, Rejected, } from "solid-objects";
4
+ import { sqlite } from "solid-objects/database/sqlite";
5
+ import { postEnvelopes } from "./envelope-post.js";
6
+ import { deviceRemoved, PhoneDelivery, postEnvelopesEffect, } from "./phone-delivery.js";
7
+ import { PhoneDevices } from "./phone-devices.js";
8
+ import { PhoneInbox } from "./phone-inbox.js";
9
+ import { outboxIdentity, PhoneOutbox, } from "./phone-outbox.js";
10
+ const relayPrincipal = Object.freeze({ principal: "phone-relay" });
11
+ const devicesIdentity = "phone";
12
+ const inboxIdentity = "phone";
13
+ const relayActors = new Set([
14
+ PhoneDevices.actorType,
15
+ PhoneDelivery.actorType,
16
+ PhoneOutbox.actorType,
17
+ PhoneInbox.actorType,
18
+ ]);
19
+ function authorized(input) {
20
+ return (relayActors.has(input.actorType) &&
21
+ input.authorizationContext === relayPrincipal);
22
+ }
23
+ function destroyable(input) {
24
+ return (input.actorType === PhoneDelivery.actorType &&
25
+ input.authorizationContext === relayPrincipal);
26
+ }
27
+ function postRefusal(devices, deviceId) {
28
+ const device = devices.find((item) => item.deviceId === deviceId);
29
+ if (device === undefined || device.removedAt !== null)
30
+ return deviceRemoved;
31
+ return device.state === "connected" ? null : "device-not-connected";
32
+ }
33
+ function relayDeliveries(runtime) {
34
+ const outbox = runtime
35
+ .ref(PhoneOutbox, outboxIdentity)
36
+ .with({ authorizationContext: relayPrincipal });
37
+ const delivery = (decisionId) => runtime
38
+ .ref(PhoneDelivery, decisionId)
39
+ .with({ authorizationContext: relayPrincipal });
40
+ return {
41
+ offer: async (decisionId, offer) => {
42
+ await outbox.track({ decisionId, runId: offer.runId });
43
+ return delivery(decisionId).offer({
44
+ deviceId: offer.deviceId,
45
+ envelopes: offer.envelopes,
46
+ promptDigest: offer.promptDigest,
47
+ });
48
+ },
49
+ close: async (decisionId, closing) => {
50
+ const closed = await delivery(decisionId).close(closing);
51
+ await outbox.untrack({ decisionId });
52
+ return closed;
53
+ },
54
+ open: async () => [...(await outbox.decisions)],
55
+ list: async (decisionId) => [...(await delivery(decisionId).deliveries)],
56
+ promptDigest: async (decisionId) => delivery(decisionId).promptDigest,
57
+ sweep: async () => {
58
+ const retired = [...(await outbox.retired)];
59
+ for (const decisionId of retired) {
60
+ await runtime
61
+ .ref(PhoneDelivery, decisionId)
62
+ .destroy({ authorizationContext: relayPrincipal });
63
+ await outbox.forget({ decisionId });
64
+ }
65
+ return retired.length;
66
+ },
67
+ drainAt: async (now) => {
68
+ await runtime.testing.runDueReminders({ now });
69
+ await runtime.testing.drain({ roles: ["actors", "effects"] });
70
+ },
71
+ };
72
+ }
73
+ function relayInbox(runtime) {
74
+ const inbox = runtime
75
+ .ref(PhoneInbox, inboxIdentity)
76
+ .with({ authorizationContext: relayPrincipal });
77
+ return {
78
+ cursor: async () => inbox.cursor,
79
+ work: async (answerId) => (await inbox.work).find((item) => item.answerId === answerId),
80
+ record: (work) => inbox.record(work),
81
+ complete: (done) => inbox.complete(done),
82
+ };
83
+ }
84
+ export async function openRelayStore(phoneDirectory, options = {}) {
85
+ const path = join(phoneDirectory, "relay.sqlite3");
86
+ await (await open(path, "a", 0o600)).close();
87
+ await chmod(path, 0o600);
88
+ const runtime = createRuntime({
89
+ database: sqlite({ path }),
90
+ authorizeMessage: authorized,
91
+ authorizeQuery: authorized,
92
+ authorizeDestroy: destroyable,
93
+ });
94
+ await runtime.install();
95
+ runtime.register(PhoneDevices);
96
+ runtime.register(PhoneDelivery);
97
+ runtime.register(PhoneOutbox);
98
+ runtime.register(PhoneInbox);
99
+ const devices = runtime
100
+ .ref(PhoneDevices, devicesIdentity)
101
+ .with({ authorizationContext: relayPrincipal });
102
+ const now = options.now ?? (() => Date.now());
103
+ runtime.registerEffect(postEnvelopesEffect, async (request) => {
104
+ const refusal = postRefusal(await devices.devices, request["deviceId"]);
105
+ if (refusal !== null)
106
+ return { at: now(), failure: refusal };
107
+ return postEnvelopes({ phoneDirectory, now }, request);
108
+ });
109
+ return {
110
+ devices: async () => [...(await devices.devices)],
111
+ add: async (device) => {
112
+ try {
113
+ await devices.add({ device });
114
+ return undefined;
115
+ }
116
+ catch (error) {
117
+ if (error instanceof Rejected)
118
+ return error.code.replaceAll("_", "-");
119
+ throw error;
120
+ }
121
+ },
122
+ connect: (deviceId) => devices.connect({ deviceId }),
123
+ nextSequence: (deviceId) => devices.nextSequence({ deviceId }),
124
+ remove: (deviceId) => devices.remove({ deviceId, removedAt: new Date().toISOString() }),
125
+ removeAll: () => devices.removeAll({ removedAt: new Date().toISOString() }),
126
+ delivery: relayDeliveries(runtime),
127
+ inbox: relayInbox(runtime),
128
+ run: (signal) => runtime.run(signal),
129
+ close: () => runtime.close(),
130
+ };
131
+ }
@@ -0,0 +1,25 @@
1
+ import { type Fields, type Reply, type ServiceRequest } from "../protocol.ts";
2
+ import type { EnvelopeTarget } from "./decision-envelopes.ts";
3
+ import { type Envelope } from "./envelope.ts";
4
+ import type { PostedEnvelope } from "./phone-delivery.ts";
5
+ import type { PhoneDevice } from "./phone-devices.ts";
6
+ import type { Registration } from "./relay-registration.ts";
7
+ import type { RelayStore } from "./relay-store.ts";
8
+ export interface CheckContext {
9
+ readonly phoneDirectory: string;
10
+ readonly store: RelayStore;
11
+ readonly control: (request: ServiceRequest) => Promise<Reply>;
12
+ readonly now: () => number;
13
+ }
14
+ export interface Sealing {
15
+ readonly registration: Registration;
16
+ readonly device: PhoneDevice;
17
+ readonly decisionId: string;
18
+ readonly issuedAt: string;
19
+ readonly expiresAt: string;
20
+ readonly build: (target: EnvelopeTarget) => Envelope;
21
+ }
22
+ export declare function rows(value: unknown): readonly Fields[];
23
+ export declare function resultOf(context: CheckContext, request: ServiceRequest): Promise<Fields | undefined>;
24
+ export declare function envelopeExpiry(gateExpiry: unknown, issued: number): string;
25
+ export declare function sealedPost(context: CheckContext, sealing: Sealing): Promise<PostedEnvelope>;
@@ -0,0 +1,52 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { record, } from "../protocol.js";
3
+ import { collapseId, sealEnvelope, } from "./envelope.js";
4
+ const pushes = {
5
+ preview: "alert",
6
+ full: "none",
7
+ closed: "passive",
8
+ receipt: "none",
9
+ };
10
+ const collapsing = new Set(["preview", "closed"]);
11
+ const envelopeLifetimeMilliseconds = 7 * 86_400_000 - 3_600_000;
12
+ export function rows(value) {
13
+ if (!Array.isArray(value))
14
+ return [];
15
+ return value.flatMap((item) => {
16
+ const fields = record(item);
17
+ return fields === undefined ? [] : [fields];
18
+ });
19
+ }
20
+ export async function resultOf(context, request) {
21
+ const reply = await context.control(request);
22
+ return reply.kind === "result" ? reply.result : undefined;
23
+ }
24
+ export function envelopeExpiry(gateExpiry, issued) {
25
+ const limit = issued + envelopeLifetimeMilliseconds;
26
+ const gate = Date.parse(String(gateExpiry));
27
+ return new Date(Number.isNaN(gate) ? limit : Math.min(gate, limit)).toISOString();
28
+ }
29
+ export async function sealedPost(context, sealing) {
30
+ const { registration, device } = sealing;
31
+ const envelope = sealing.build({
32
+ daemonId: registration.link.daemonId,
33
+ deviceId: device.deviceId,
34
+ sequence: await context.store.nextSequence(device.deviceId),
35
+ issuedAt: sealing.issuedAt,
36
+ expiresAt: sealing.expiresAt,
37
+ });
38
+ const sealed = sealEnvelope(registration.keys, {
39
+ envelope,
40
+ agreementPublicKey: device.agreementPublicKey,
41
+ });
42
+ return {
43
+ envelopeId: randomBytes(16).toString("base64url"),
44
+ kind: envelope.kind,
45
+ ciphertext: sealed.toString("base64url"),
46
+ expiresAt: sealing.expiresAt,
47
+ push: pushes[envelope.kind],
48
+ collapseId: collapsing.has(envelope.kind)
49
+ ? collapseId(registration.keys, sealing.decisionId)
50
+ : null,
51
+ };
52
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { runRelay } from "./relay/relay-service.js";
2
+ process.exitCode = await runRelay(process.env, {
3
+ stopped: new Promise((settle) => {
4
+ process.once("SIGTERM", settle);
5
+ process.once("SIGINT", settle);
6
+ }),
7
+ error: (line) => process.stderr.write(line),
8
+ });
@@ -0,0 +1,50 @@
1
+ export interface ReportDatum {
2
+ readonly at: number;
3
+ readonly value: number | null;
4
+ readonly evidence: Readonly<Record<string, unknown>>;
5
+ }
6
+ export interface ReportWindow {
7
+ readonly start: number;
8
+ readonly end: number;
9
+ readonly observedSince: number | null;
10
+ }
11
+ interface MetricInput {
12
+ readonly data: readonly ReportDatum[] | null;
13
+ readonly window: ReportWindow;
14
+ readonly aggregation: "count" | "median";
15
+ }
16
+ export declare function reportMedian(values: readonly number[]): number | null;
17
+ export declare function reportMetric(input: MetricInput): {
18
+ evidence: Readonly<Record<string, unknown>>[];
19
+ mark?: string;
20
+ status: string;
21
+ value: number | null;
22
+ comparisonValue: number | null;
23
+ baseline: {
24
+ evidence: Readonly<Record<string, unknown>>[];
25
+ history: string;
26
+ days: number;
27
+ median: null;
28
+ band: null;
29
+ } | {
30
+ evidence: Readonly<Record<string, unknown>>[];
31
+ history: string;
32
+ days: number;
33
+ median: number;
34
+ band: null;
35
+ } | {
36
+ evidence: Readonly<Record<string, unknown>>[];
37
+ history: string;
38
+ days: number;
39
+ median: number;
40
+ band: {
41
+ low: number;
42
+ high: number;
43
+ };
44
+ };
45
+ };
46
+ export declare function outsideReportBand(value: number | null, band: {
47
+ readonly low: number;
48
+ readonly high: number;
49
+ } | null): boolean;
50
+ export {};
@@ -0,0 +1,70 @@
1
+ export function reportMedian(values) {
2
+ if (values.length === 0)
3
+ return null;
4
+ const sorted = values.toSorted((left, right) => left - right);
5
+ const middle = Math.floor(sorted.length / 2);
6
+ return ((sorted[middle] ?? 0) / 2 +
7
+ (sorted[Math.ceil(sorted.length / 2) - 1] ?? 0) / 2);
8
+ }
9
+ function selected(data, window) {
10
+ return data.filter((datum) => datum.at >= window.start && datum.at < window.end);
11
+ }
12
+ function aggregate(data, aggregation) {
13
+ if (data.some((datum) => datum.value === null))
14
+ return null;
15
+ const values = data.flatMap((datum) => datum.value === null ? [] : [datum.value]);
16
+ return aggregation === "count"
17
+ ? values.reduce((sum, value) => sum + value, 0)
18
+ : reportMedian(values);
19
+ }
20
+ function baseline(input) {
21
+ const day = 86_400_000;
22
+ const origin = input.window.observedSince;
23
+ const samples = [];
24
+ const evidence = [];
25
+ for (let index = 1; index <= 7; index += 1) {
26
+ const end = input.window.start - (index - 1) * day;
27
+ const start = end - day;
28
+ if (origin === null || origin > start || input.data === null)
29
+ continue;
30
+ const data = selected(input.data, { start, end });
31
+ const value = aggregate(data, input.aggregation);
32
+ if (value === null)
33
+ continue;
34
+ samples.push(value);
35
+ evidence.push(...data.map((datum) => datum.evidence));
36
+ }
37
+ return { ...historySummary(samples), evidence };
38
+ }
39
+ function historySummary(samples) {
40
+ const median = reportMedian(samples);
41
+ const deviation = median === null
42
+ ? null
43
+ : reportMedian(samples.map((value) => Math.abs(value - median)));
44
+ if (samples.length < 5 || median === null || deviation === null)
45
+ return { history: "short", days: samples.length, median: null, band: null };
46
+ const band = { low: median - 3 * deviation, high: median + 3 * deviation };
47
+ if (!Number.isFinite(band.low) || !Number.isFinite(band.high))
48
+ return { history: "unavailable", days: samples.length, median, band: null };
49
+ return { history: "available", days: samples.length, median, band };
50
+ }
51
+ export function reportMetric(input) {
52
+ const data = selected(input.data ?? [], input.window);
53
+ const value = input.data === null ? null : aggregate(data, input.aggregation);
54
+ const comparisonValue = value !== null && input.aggregation === "count"
55
+ ? (value * 86_400_000) / (input.window.end - input.window.start)
56
+ : value;
57
+ const history = baseline(input);
58
+ const outside = outsideReportBand(comparisonValue, history.band);
59
+ return {
60
+ status: value === null ? "unavailable" : "available",
61
+ value,
62
+ comparisonValue,
63
+ baseline: history,
64
+ ...(outside ? { mark: "outside" } : {}),
65
+ evidence: data.map((datum) => datum.evidence),
66
+ };
67
+ }
68
+ export function outsideReportBand(value, band) {
69
+ return (value !== null && band !== null && (value < band.low || value > band.high));
70
+ }
@@ -0,0 +1,171 @@
1
+ import { type ReportDatum } from "./report-statistics.ts";
2
+ import type { Fields } from "./protocol.ts";
3
+ export declare const reportOutcomes: readonly ["completed", "partial", "blocked", "failed", "cancelled"];
4
+ export type ReportOutcome = (typeof reportOutcomes)[number];
5
+ export interface ReportCompletion {
6
+ readonly runId: string;
7
+ readonly sequence: number;
8
+ readonly at: number;
9
+ readonly outcome: ReportOutcome;
10
+ }
11
+ export interface ReportCost {
12
+ readonly runId: string;
13
+ readonly turns: readonly {
14
+ readonly operationId: string;
15
+ readonly costUsd: number | null;
16
+ readonly estimatedCostUsd?: number;
17
+ }[] | null;
18
+ }
19
+ interface ReportInput {
20
+ readonly since: number;
21
+ readonly now: number;
22
+ readonly completions: readonly ReportCompletion[] | null;
23
+ readonly observedSince?: number | null;
24
+ readonly costs?: readonly ReportCost[];
25
+ readonly github?: {
26
+ readonly observedSince?: number | null;
27
+ readonly issues: readonly ReportDatum[] | null;
28
+ readonly pulls: readonly ReportDatum[] | null;
29
+ readonly sources: Fields;
30
+ };
31
+ }
32
+ export declare function loopReport(input: ReportInput): {
33
+ sources: {
34
+ daemon: {
35
+ status: string;
36
+ };
37
+ github: Readonly<Record<string, unknown>>;
38
+ };
39
+ coverage: {
40
+ ci: {
41
+ status: string;
42
+ reason: string;
43
+ };
44
+ flow: {
45
+ status: string;
46
+ reason: string;
47
+ };
48
+ quality: {
49
+ status: string;
50
+ reason: string;
51
+ };
52
+ operator: {
53
+ status: string;
54
+ reason: string;
55
+ };
56
+ phases: {
57
+ status: string;
58
+ reason: string;
59
+ };
60
+ fixRounds: {
61
+ status: string;
62
+ reason: string;
63
+ };
64
+ leadTime: {
65
+ status: string;
66
+ reason: string;
67
+ };
68
+ ticketClosureHistory: {
69
+ status: string;
70
+ reason: string;
71
+ };
72
+ completedTicketCosts: {
73
+ status: string;
74
+ reason: string;
75
+ };
76
+ };
77
+ metrics: Record<string, {
78
+ evidence: Readonly<Record<string, unknown>>[];
79
+ mark?: string;
80
+ status: string;
81
+ value: number | null;
82
+ comparisonValue: number | null;
83
+ baseline: {
84
+ evidence: Readonly<Record<string, unknown>>[];
85
+ history: string;
86
+ days: number;
87
+ median: null;
88
+ band: null;
89
+ } | {
90
+ evidence: Readonly<Record<string, unknown>>[];
91
+ history: string;
92
+ days: number;
93
+ median: number;
94
+ band: null;
95
+ } | {
96
+ evidence: Readonly<Record<string, unknown>>[];
97
+ history: string;
98
+ days: number;
99
+ median: number;
100
+ band: {
101
+ low: number;
102
+ high: number;
103
+ };
104
+ };
105
+ }>;
106
+ runCosts: {
107
+ mark?: string;
108
+ baseline: {
109
+ evidence: Readonly<Record<string, unknown>>[];
110
+ history: string;
111
+ days: number;
112
+ median: null;
113
+ band: null;
114
+ } | {
115
+ evidence: Readonly<Record<string, unknown>>[];
116
+ history: string;
117
+ days: number;
118
+ median: number;
119
+ band: null;
120
+ } | {
121
+ evidence: Readonly<Record<string, unknown>>[];
122
+ history: string;
123
+ days: number;
124
+ median: number;
125
+ band: {
126
+ low: number;
127
+ high: number;
128
+ };
129
+ };
130
+ runId: string;
131
+ outcome: "completed" | "failed" | "cancelled" | "partial" | "blocked";
132
+ completedAt: number;
133
+ costUsd: number | null;
134
+ turns: readonly {
135
+ readonly operationId: string;
136
+ readonly costUsd: number | null;
137
+ readonly estimatedCostUsd?: number;
138
+ }[] | null;
139
+ evidence: {
140
+ runId: string;
141
+ sequence: number;
142
+ };
143
+ }[];
144
+ schemaVersion: number;
145
+ kind: string;
146
+ window: {
147
+ start: number;
148
+ end: number;
149
+ hours: number;
150
+ };
151
+ semantics: {
152
+ tickets: string;
153
+ costs: string;
154
+ };
155
+ };
156
+ export declare function reportRunCosts(completions: readonly ReportCompletion[], costs: readonly ReportCost[]): {
157
+ runId: string;
158
+ outcome: "completed" | "failed" | "cancelled" | "partial" | "blocked";
159
+ completedAt: number;
160
+ costUsd: number | null;
161
+ turns: readonly {
162
+ readonly operationId: string;
163
+ readonly costUsd: number | null;
164
+ readonly estimatedCostUsd?: number;
165
+ }[] | null;
166
+ evidence: {
167
+ runId: string;
168
+ sequence: number;
169
+ };
170
+ }[];
171
+ export {};
@@ -0,0 +1,119 @@
1
+ import { reportMetric, outsideReportBand, } from "./report-statistics.js";
2
+ export const reportOutcomes = [
3
+ "completed",
4
+ "partial",
5
+ "blocked",
6
+ "failed",
7
+ "cancelled",
8
+ ];
9
+ function outcomeMetrics(input, window) {
10
+ return Object.fromEntries(reportOutcomes.map((outcome) => {
11
+ const data = input.completions === null
12
+ ? null
13
+ : input.completions
14
+ .filter((event) => event.outcome === outcome)
15
+ .map((event) => ({
16
+ at: event.at,
17
+ value: 1,
18
+ evidence: { runId: event.runId, sequence: event.sequence },
19
+ }));
20
+ return [
21
+ `runs.${outcome}`,
22
+ reportMetric({ data, window, aggregation: "count" }),
23
+ ];
24
+ }));
25
+ }
26
+ function metricCollection(input, window) {
27
+ const costs = reportRunCosts(input.completions ?? [], input.costs ?? []);
28
+ const metrics = outcomeMetrics(input, window);
29
+ const costMetric = reportMetric({
30
+ data: input.completions === null
31
+ ? null
32
+ : costs.map((cost) => ({
33
+ at: cost.completedAt,
34
+ value: cost.costUsd,
35
+ evidence: cost.evidence,
36
+ })),
37
+ window,
38
+ aggregation: "median",
39
+ });
40
+ metrics["cost.medianRunUsd"] = costMetric;
41
+ const githubWindow = {
42
+ ...window,
43
+ observedSince: input.github?.observedSince ?? null,
44
+ };
45
+ metrics["tickets.completed"] = reportMetric({
46
+ data: input.github?.issues ?? null,
47
+ window: githubWindow,
48
+ aggregation: "count",
49
+ });
50
+ metrics["pullRequests.merged"] = reportMetric({
51
+ data: input.github?.pulls ?? null,
52
+ window: githubWindow,
53
+ aggregation: "count",
54
+ });
55
+ const runCosts = costs
56
+ .filter((cost) => cost.completedAt >= window.start && cost.completedAt < window.end)
57
+ .map((cost) => ({
58
+ ...cost,
59
+ baseline: costMetric.baseline,
60
+ ...(outsideReportBand(cost.costUsd, costMetric.baseline.band)
61
+ ? { mark: "outside" }
62
+ : {}),
63
+ }));
64
+ return { metrics, runCosts };
65
+ }
66
+ export function loopReport(input) {
67
+ const end = input.now;
68
+ const start = end - input.since * 3_600_000;
69
+ const window = { start, end, observedSince: input.observedSince ?? null };
70
+ const unavailable = { status: "unavailable", reason: "not-implemented" };
71
+ return {
72
+ schemaVersion: 1,
73
+ kind: "loop-report",
74
+ window: { start, end, hours: input.since },
75
+ semantics: {
76
+ tickets: "currently-closed-completed",
77
+ costs: "lifetime-turn-cost-attributed-at-run-end",
78
+ },
79
+ ...metricCollection(input, window),
80
+ sources: {
81
+ daemon: {
82
+ status: input.completions === null ? "unavailable" : "available",
83
+ },
84
+ github: input.github?.sources ?? {
85
+ issues: { status: "unavailable" },
86
+ pulls: { status: "unavailable" },
87
+ history: { status: "unavailable" },
88
+ },
89
+ },
90
+ coverage: {
91
+ ci: unavailable,
92
+ flow: unavailable,
93
+ quality: unavailable,
94
+ operator: unavailable,
95
+ phases: unavailable,
96
+ fixRounds: unavailable,
97
+ leadTime: unavailable,
98
+ ticketClosureHistory: unavailable,
99
+ completedTicketCosts: unavailable,
100
+ },
101
+ };
102
+ }
103
+ export function reportRunCosts(completions, costs) {
104
+ return completions.map((event) => {
105
+ const turns = costs.find((cost) => cost.runId === event.runId)?.turns ?? null;
106
+ const known = turns !== null && turns.every((turn) => turn.costUsd !== null);
107
+ const total = known
108
+ ? turns.reduce((sum, turn) => sum + (turn.costUsd ?? 0), 0)
109
+ : null;
110
+ return {
111
+ runId: event.runId,
112
+ outcome: event.outcome,
113
+ completedAt: event.at,
114
+ costUsd: total !== null && Number.isFinite(total) ? total : null,
115
+ turns,
116
+ evidence: { runId: event.runId, sequence: event.sequence },
117
+ };
118
+ });
119
+ }
@@ -0,0 +1,4 @@
1
+ export declare function repositoryFileName(identity: {
2
+ readonly name: string;
3
+ readonly sha256: string;
4
+ }): string;
@@ -0,0 +1,4 @@
1
+ export function repositoryFileName(identity) {
2
+ const name = identity.name.replace(/[^A-Za-z0-9_-]/g, "").slice(0, 24);
3
+ return `${name}-${identity.sha256.slice(0, 8)}`;
4
+ }
@@ -0,0 +1,41 @@
1
+ export interface CommitReviewSubject {
2
+ readonly commit: string;
3
+ readonly target: string;
4
+ readonly number?: number;
5
+ }
6
+ export interface DraftReviewSubject {
7
+ readonly draft: string;
8
+ readonly commit?: string;
9
+ }
10
+ export type ReviewSubject = CommitReviewSubject | DraftReviewSubject;
11
+ export type Reviewer = {
12
+ readonly kind: "greptile";
13
+ } | {
14
+ readonly kind: "turn";
15
+ readonly profile: string;
16
+ };
17
+ export interface ReviewResult {
18
+ readonly accepted: boolean;
19
+ readonly feedback: string;
20
+ readonly commit: string | null;
21
+ readonly subjectDigest: string;
22
+ }
23
+ export declare function reviewSubjectText(subject: ReviewSubject): string;
24
+ export declare function commitId(value: unknown): value is string;
25
+ export interface ReviewSnapshot {
26
+ readonly commit: string | null;
27
+ readonly subjectDigest: string;
28
+ readonly prompt: string;
29
+ }
30
+ export type ReviewVerdict = "accept" | "change";
31
+ export declare function reviewReport(text: string): {
32
+ readonly reviewVerdict: ReviewVerdict | null;
33
+ readonly feedback: string;
34
+ };
35
+ export declare function reviewReportStream(limit: number): {
36
+ write: (chunk: string) => void;
37
+ result: () => {
38
+ reviewVerdict: ReviewVerdict | null;
39
+ feedback: string;
40
+ };
41
+ };