@iowarp/clio-coder 0.4.3 → 0.4.4

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 (340) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/dist/{acp-H2NGRPWO.js → acp-WNAYYF4F.js} +4 -5
  4. package/dist/{agents-TL5LLUQP.js → agents-3OKXHLOI.js} +33 -31
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-E5SW4HMS.js → auth-VKNNMGPU.js} +10 -11
  7. package/dist/{builtins-IA7V7FUC.js → builtins-WGALA46I.js} +4 -4
  8. package/dist/{chunk-F5JHEYZM.js → chunk-23L32XTI.js} +10 -7
  9. package/dist/{chunk-DWUOQKRU.js → chunk-25QBEXRS.js} +2 -2
  10. package/dist/{chunk-LLDJM5XK.js → chunk-26QSH3EJ.js} +2 -2
  11. package/dist/{chunk-N2Z7HLVY.js → chunk-2ASED4PZ.js} +10 -10
  12. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  13. package/dist/chunk-2DSOYNFC.js +108 -0
  14. package/dist/{chunk-LDJG7DW3.js → chunk-2ZSONWVL.js} +4 -4
  15. package/dist/{chunk-GI7YYQ3F.js → chunk-36CT5VVL.js} +324 -41
  16. package/dist/{chunk-4UVU7BJ5.js → chunk-3GY4F45V.js} +2 -2
  17. package/dist/{chunk-PUVDKJ2Y.js → chunk-3ODX73FK.js} +3 -5
  18. package/dist/{chunk-IUE3Y34X.js → chunk-3UNOLWNZ.js} +2 -2
  19. package/dist/{chunk-6PTFB5VS.js → chunk-3UUXNFEX.js} +8 -4
  20. package/dist/{chunk-2APPQIER.js → chunk-4M6Z5QVF.js} +4 -4
  21. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  22. package/dist/{chunk-JGRC33J2.js → chunk-54X7T7DK.js} +12 -3
  23. package/dist/{chunk-YQWYVTMC.js → chunk-5636DCO5.js} +4 -4
  24. package/dist/{chunk-7E7I3WLS.js → chunk-57XXR6DR.js} +23 -22
  25. package/dist/{chunk-7ZYNNDKC.js → chunk-5TUB6SLS.js} +2 -2
  26. package/dist/{chunk-VW6DOEDG.js → chunk-6OSVSQL5.js} +11 -2
  27. package/dist/{chunk-L47TF46W.js → chunk-6PAZTBPA.js} +14 -2
  28. package/dist/{chunk-XIVNBFZS.js → chunk-6Q3CYFD3.js} +34 -16
  29. package/dist/{chunk-RSJ25QSL.js → chunk-6QOTUPRG.js} +155 -36
  30. package/dist/{chunk-JKKCYP3C.js → chunk-6UINWWS6.js} +10 -4
  31. package/dist/{chunk-WBKFA554.js → chunk-72YIHOZQ.js} +2 -2
  32. package/dist/{chunk-PAJQJ7BS.js → chunk-75W7L2E2.js} +246 -697
  33. package/dist/{chunk-RRNP2ANY.js → chunk-7UGL4MB5.js} +4 -4
  34. package/dist/{chunk-EKCHAPYA.js → chunk-AUPNRN7C.js} +2 -2
  35. package/dist/{chunk-ZDN3Y73Y.js → chunk-BJVFZO5U.js} +6 -48
  36. package/dist/{chunk-IWT4SF4R.js → chunk-CUSRQKPU.js} +64 -2
  37. package/dist/{chunk-SKHCAU7K.js → chunk-DQOVN6KV.js} +3 -2
  38. package/dist/{chunk-ZWPRK62N.js → chunk-DT3LWJOB.js} +4 -4
  39. package/dist/chunk-DXKJURES.js +671 -0
  40. package/dist/{chunk-BEPZRGGU.js → chunk-EL24TAU4.js} +2 -2
  41. package/dist/{chunk-OML5D5V5.js → chunk-ELWDPP3Y.js} +5 -5
  42. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  43. package/dist/chunk-EXLD33WO.js +381 -0
  44. package/dist/{chunk-IJNZMHLA.js → chunk-FEAXX7B6.js} +2 -2
  45. package/dist/{chunk-TM6LQDI3.js → chunk-FFUPXJC4.js} +74 -323
  46. package/dist/chunk-GX5WYQO4.js +59 -0
  47. package/dist/chunk-I2DWJ4GM.js +390 -0
  48. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  49. package/dist/chunk-IRXAATOX.js +539 -0
  50. package/dist/chunk-IXIY2H4R.js +44 -0
  51. package/dist/{chunk-KK4JZPBQ.js → chunk-IZXGRF7P.js} +76 -10
  52. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  53. package/dist/{chunk-INY6HTFL.js → chunk-JEIYHLOR.js} +2 -2
  54. package/dist/{chunk-MUW2BDDH.js → chunk-JQLNNIKT.js} +2 -2
  55. package/dist/{chunk-XPWWI35G.js → chunk-JSD46VO2.js} +19 -8
  56. package/dist/{chunk-VA5FNYMT.js → chunk-JT2RFCC5.js} +39 -2
  57. package/dist/{chunk-V2ANDPVT.js → chunk-K6T2ZAMZ.js} +168 -6
  58. package/dist/{chunk-B4OAX3SI.js → chunk-KFV5L5SK.js} +13 -6
  59. package/dist/{chunk-JEQ3XTHC.js → chunk-LLXSDWXS.js} +2 -2
  60. package/dist/{chunk-E3TPLWFX.js → chunk-LTIKRKFL.js} +3 -3
  61. package/dist/{chunk-NIQJ66N4.js → chunk-N56KALIC.js} +17 -17
  62. package/dist/{chunk-JDAY6FIL.js → chunk-NAI6ZFCY.js} +13 -9
  63. package/dist/{chunk-AF4YM7Z4.js → chunk-NRO2BJRH.js} +2490 -2182
  64. package/dist/{chunk-WRBAGUNF.js → chunk-NXIMQY5W.js} +2 -2
  65. package/dist/{chunk-I7ZPNEJM.js → chunk-NXYCB2VD.js} +5 -5
  66. package/dist/chunk-ODGTEFFI.js +50 -0
  67. package/dist/{chunk-2VIKGWFZ.js → chunk-OEJSLEPW.js} +2 -2
  68. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  69. package/dist/{chunk-54CBCGIR.js → chunk-Q4WO54TA.js} +132 -77
  70. package/dist/{chunk-B4VEBZKF.js → chunk-QUFRYSWI.js} +12 -6
  71. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  72. package/dist/{chunk-HEQY7ZFI.js → chunk-RAY4OVGZ.js} +2 -2
  73. package/dist/{chunk-G76U63X4.js → chunk-RQCKCSRL.js} +7 -7
  74. package/dist/{chunk-64I3JVYM.js → chunk-RXTN6AKH.js} +2 -2
  75. package/dist/{chunk-UPZU6GE4.js → chunk-RZDWV63N.js} +3 -3
  76. package/dist/{chunk-2UH2KFUP.js → chunk-S6PYF2XF.js} +2 -2
  77. package/dist/{chunk-JSC3U7TI.js → chunk-TOIVGRUX.js} +2 -2
  78. package/dist/{chunk-7DRAWPTZ.js → chunk-TQAHXW6Y.js} +1 -1
  79. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  80. package/dist/{chunk-AX2THNSA.js → chunk-UEPWCCTY.js} +4 -4
  81. package/dist/{chunk-QWGDJJYJ.js → chunk-USR47QNF.js} +4 -4
  82. package/dist/{chunk-Y3CBHOR6.js → chunk-V6HJFQZE.js} +2 -2
  83. package/dist/chunk-V76WTFTW.js +318 -0
  84. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  85. package/dist/{chunk-2UG5F4C5.js → chunk-XULDXHTN.js} +24 -12
  86. package/dist/chunk-XXYSBZIQ.js +283 -0
  87. package/dist/{chunk-MWUZBSAQ.js → chunk-Y55JBDO5.js} +331 -51
  88. package/dist/{chunk-W6RRQCPQ.js → chunk-YD5GIKET.js} +4 -4
  89. package/dist/{chunk-CE5AX47J.js → chunk-YECAMM3D.js} +2 -2
  90. package/dist/{chunk-WCXUNS7U.js → chunk-YNFKXPEC.js} +6 -6
  91. package/dist/cli/index.js +36 -35
  92. package/dist/{clio-CMMK4KRR.js → clio-QLICPCF5.js} +2 -2
  93. package/dist/{code-nav-MDZNQS33.js → code-nav-IJR2DBPR.js} +6 -6
  94. package/dist/{components-UCUQ4QXW.js → components-2TGAI2RC.js} +3 -4
  95. package/dist/{config-SVM5P5YI.js → config-IUA6OYNS.js} +52 -47
  96. package/dist/{configure-LE3IK2TJ.js → configure-VEPX4NMX.js} +14 -15
  97. package/dist/{context-VNCR7KAG.js → context-2DKHWH2T.js} +23 -23
  98. package/dist/{context-2OHRKS42.js → context-4MPR7WKB.js} +48 -42
  99. package/dist/{context-E3VC7RX5.js → context-BOYF5EJM.js} +11 -11
  100. package/dist/{context-clear-BW4O37TG.js → context-clear-S4ZJCQUX.js} +48 -42
  101. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-3I3FYX6Y.js} +8 -8
  102. package/dist/detail-A7JAVSIG.js +98 -0
  103. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-RJ5I2F2O.js} +71 -58
  104. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  105. package/dist/{doctor-WNNVO6FY.js → doctor-DKICC2SN.js} +54 -31
  106. package/dist/{eval-7G7SGAYO.js → eval-OQOQUDHK.js} +47 -56
  107. package/dist/{evidence-VD6736FQ.js → evidence-4DQ25GUQ.js} +53 -150
  108. package/dist/evidence-4F5USFKH.js +208 -0
  109. package/dist/{evolve-AL3NGVRL.js → evolve-GSS52E5J.js} +44 -41
  110. package/dist/{extensions-MOVJ32NM.js → extensions-G7MFLYHT.js} +4 -5
  111. package/dist/{fleet-QZHUMAGI.js → fleet-Q37YHHAQ.js} +74 -68
  112. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-G7E4N7SM.js} +14 -11
  113. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-O7M6QBA2.js} +6 -6
  114. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-TOUBW6OW.js} +13 -13
  115. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-SW33JJNI.js} +43 -39
  116. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-CV2655TW.js} +2 -3
  117. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-KESZX2YH.js} +16 -16
  118. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-UQPMTVE3.js} +42 -38
  119. package/dist/{fleet-view-SWBR3VGQ.js → fleet-view-MN2VG4MR.js} +43 -39
  120. package/dist/{init-J477LKZH.js → init-PXEXQSBF.js} +60 -54
  121. package/dist/{interop-3FCM6XLG.js → interop-ZG5T62U3.js} +6 -7
  122. package/dist/inventory-C26CFDRR.js +101 -0
  123. package/dist/{library-QUQEIUG6.js → library-B2W4N74O.js} +16 -17
  124. package/dist/{memory-SGGSEP65.js → memory-YCANYS5A.js} +45 -42
  125. package/dist/{models-HEKUAXXK.js → models-GERTU3YI.js} +20 -22
  126. package/dist/{monitor-HKU57TYQ.js → monitor-CPNIUULB.js} +50 -44
  127. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-J4BSH4WQ.js} +491 -1182
  128. package/dist/{panes-DN2SSFOH.js → panes-BOHAEGYC.js} +3 -3
  129. package/dist/{panes-TALGNPZT.js → panes-NXSLDQZ2.js} +5 -6
  130. package/dist/{paths-NBMFAIEZ.js → paths-VSUWNC22.js} +3 -4
  131. package/dist/{reset-EAJFFJVB.js → reset-TNWTB5LU.js} +5 -6
  132. package/dist/{resources-OVKSEFVE.js → resources-4PXNMD5G.js} +14 -14
  133. package/dist/{run-7DP7ZF2J.js → run-D6XJ34CN.js} +79 -83
  134. package/dist/{share-WML67FT3.js → share-2NWMJJEE.js} +14 -15
  135. package/dist/{skills-SG662R2K.js → skills-KR7WON5G.js} +18 -19
  136. package/dist/{skills-eval-VVZEUU46.js → skills-eval-O2ZNOLDS.js} +49 -46
  137. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-ZZOUBK7O.js} +14 -14
  138. package/dist/{slash-commands-S7MBJDQK.js → slash-commands-ZXPJD64J.js} +32 -23
  139. package/dist/{steer-2LQOMCPB.js → steer-XA25PSCS.js} +3 -3
  140. package/dist/{support-CC2UJBJ6.js → support-7EMVWYG2.js} +2 -2
  141. package/dist/{targets-4QC3HIEW.js → targets-OMH2XCSN.js} +25 -27
  142. package/dist/tasks-IPAGMEIX.js +36 -0
  143. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-C2J3JYRE.js} +4 -4
  144. package/dist/{tools-TFGJICCU.js → tools-EFFEAIDP.js} +5 -6
  145. package/dist/{uninstall-5PEVOE5B.js → uninstall-HALS6BLF.js} +7 -8
  146. package/dist/{upgrade-M4WXY6KN.js → upgrade-MS72RJEP.js} +14 -11
  147. package/dist/{usage-N7ZNVLEM.js → usage-NHG6MCJM.js} +60 -51
  148. package/dist/{verifiers-DJTP4XX6.js → verifiers-7AUNVXDY.js} +150 -17
  149. package/dist/{verify-RWE4PPEK.js → verify-FWYGPKMR.js} +12 -10
  150. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  151. package/dist/{wiki-generate-C7IQOXSP.js → wiki-generate-743CIGJW.js} +63 -56
  152. package/dist/{with-panes-4GCGSL7J.js → with-panes-BDQEWBRT.js} +2 -2
  153. package/dist/worker/entry.js +36 -33
  154. package/docs/README.md +3 -2
  155. package/docs/architecture/acp.md +17 -0
  156. package/docs/architecture/artifact-versions.md +1 -1
  157. package/docs/architecture/dispatch-typed-intent.md +1 -1
  158. package/docs/architecture/evidence-and-memory.md +1 -1
  159. package/docs/architecture/observability.md +7 -1
  160. package/docs/architecture/prompt-envelope-and-tools.md +15 -5
  161. package/docs/architecture/safety-model.md +10 -17
  162. package/docs/architecture/tui-design.md +1 -1
  163. package/docs/guide/built-in-agents.md +8 -8
  164. package/docs/guide/commands-and-modes.md +17 -2
  165. package/docs/guide/configuration-and-targets.md +3 -1
  166. package/docs/guide/configuration-reference.md +10 -5
  167. package/docs/guide/environment-variables.md +2 -2
  168. package/docs/guide/tool-usage.md +78 -3
  169. package/docs/history/config-knobs-audit.md +2 -2
  170. package/docs/process/development-pipeline.md +6 -1
  171. package/docs/process/git-commit-provenance.md +15 -0
  172. package/docs/process/release-cut-checklist.md +207 -0
  173. package/docs/process/scientific-validation.md +18 -17
  174. package/evals/behavioral-machinery-support.ts +1 -0
  175. package/evals/behavioral-machinery.yaml +1 -1
  176. package/package.json +1 -1
  177. package/skills/coding/coding-standards/SKILL.md +14 -4
  178. package/skills/context/context-handoff/SKILL.md +3 -3
  179. package/skills/context/context-prime/SKILL.md +3 -3
  180. package/skills/planning/architecture/SKILL.md +5 -5
  181. package/skills/planning/backlog/SKILL.md +4 -4
  182. package/skills/planning/prd/SKILL.md +4 -3
  183. package/skills/planning/product-intent/SKILL.md +8 -8
  184. package/skills/planning/tech-spec/SKILL.md +4 -4
  185. package/skills/registry.yaml +32 -32
  186. package/skills/research/arxiv-literature/SKILL.md +3 -3
  187. package/skills/research/experiment-protocol/SKILL.md +3 -3
  188. package/skills/research/scientific-debugging/SKILL.md +3 -2
  189. package/skills/research/scientific-modernization/SKILL.md +3 -3
  190. package/skills/skill-marketplace.json +16 -16
  191. package/skills/workflow/cut-it/SKILL.md +3 -4
  192. package/skills/workflow/design-council/SKILL.md +5 -10
  193. package/skills/workflow/grill-me/SKILL.md +14 -15
  194. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  195. package/src/cli/args.ts +0 -8
  196. package/src/cli/configure.ts +2 -1
  197. package/src/cli/doctor-state-size.ts +1 -12
  198. package/src/cli/doctor-validation-contract.ts +28 -0
  199. package/src/cli/doctor.ts +5 -0
  200. package/src/cli/evidence-detail.ts +1 -75
  201. package/src/cli/evidence-inventory.ts +1 -167
  202. package/src/cli/index.ts +2 -0
  203. package/src/cli/run.ts +0 -2
  204. package/src/cli/targets.ts +1 -1
  205. package/src/cli/tasks.ts +84 -0
  206. package/src/cli/upgrade.ts +10 -5
  207. package/src/cli/usage.ts +6 -0
  208. package/src/cli/verifiers.ts +147 -1
  209. package/src/cli/wiki-generate.ts +1 -0
  210. package/src/core/commit-attribution.ts +41 -1
  211. package/src/core/git-commit-attribution.ts +46 -3
  212. package/src/core/run-overrides.ts +0 -5
  213. package/src/core/skill-activation.ts +3 -0
  214. package/src/core/tool-names.ts +5 -2
  215. package/src/domains/agents/builtins/architect.md +1 -1
  216. package/src/domains/agents/builtins/coder.md +1 -1
  217. package/src/domains/agents/builtins/documenter.md +1 -1
  218. package/src/domains/agents/builtins/git-master.md +1 -1
  219. package/src/domains/agents/builtins/provenance.md +7 -7
  220. package/src/domains/agents/builtins/tester.md +1 -1
  221. package/src/domains/agents/builtins/verifier.md +2 -2
  222. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  223. package/src/domains/context/extension.ts +31 -7
  224. package/src/domains/context/refresh.ts +3 -0
  225. package/src/domains/context/wiki/frontmatter.ts +5 -2
  226. package/src/domains/context/wiki/generate.ts +6 -0
  227. package/src/domains/context/wiki/prompts.ts +43 -0
  228. package/src/domains/dispatch/active-route-planner.ts +4 -0
  229. package/src/domains/dispatch/code-step.ts +11 -4
  230. package/src/domains/dispatch/contract.ts +31 -7
  231. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  232. package/src/domains/dispatch/extension.ts +50 -27
  233. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  234. package/src/domains/dispatch/fleet-run.ts +1 -0
  235. package/src/domains/dispatch/host-verification.ts +114 -13
  236. package/src/domains/dispatch/intent.ts +28 -18
  237. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  238. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  239. package/src/domains/dispatch/reservation-store.ts +5 -3
  240. package/src/domains/dispatch/state.ts +15 -2
  241. package/src/domains/dispatch/types.ts +17 -2
  242. package/src/domains/eval/runners/clio-run.ts +12 -9
  243. package/src/domains/eval/runners/context-index.ts +2 -7
  244. package/src/domains/eval/runners/context-init.ts +3 -6
  245. package/src/domains/eval/runners/external-command.ts +29 -11
  246. package/src/domains/evidence/build.ts +102 -15
  247. package/src/domains/evidence/detail.ts +69 -0
  248. package/src/domains/evidence/eval.ts +13 -1
  249. package/src/domains/evidence/finish-contract-map.ts +5 -1
  250. package/src/domains/evidence/inventory.ts +167 -0
  251. package/src/domains/evidence/store.ts +16 -0
  252. package/src/domains/evidence/types.ts +12 -0
  253. package/src/domains/extensions/resources.ts +7 -0
  254. package/src/domains/middleware/marketplace-offer.ts +20 -1
  255. package/src/domains/middleware/runtime.ts +7 -3
  256. package/src/domains/mux/detect.ts +3 -6
  257. package/src/domains/observability/accountability.ts +15 -1
  258. package/src/domains/observability/contract.ts +52 -7
  259. package/src/domains/observability/evidence-index.ts +10 -0
  260. package/src/domains/observability/extension.ts +9 -5
  261. package/src/domains/observability/projection.ts +394 -45
  262. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  263. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  264. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  265. package/src/domains/providers/model-discovery.ts +1 -4
  266. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  267. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  268. package/src/domains/providers/support.ts +1 -1
  269. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  270. package/src/domains/safety/action-classifier.ts +7 -0
  271. package/src/domains/safety/default-path-policy.ts +2 -0
  272. package/src/domains/safety/finish-contract-registration.ts +29 -14
  273. package/src/domains/safety/finish-contract.ts +252 -40
  274. package/src/domains/safety/index.ts +20 -1
  275. package/src/domains/safety/policy-engine.ts +26 -6
  276. package/src/domains/safety/rigor.ts +53 -39
  277. package/src/domains/safety/validation-contract.ts +388 -0
  278. package/src/domains/session/archive-readers.ts +10 -1
  279. package/src/domains/session/decision-board.ts +101 -2
  280. package/src/domains/session/entries.ts +44 -7
  281. package/src/domains/session/extension.ts +4 -4
  282. package/src/domains/session/handoff.ts +2 -1
  283. package/src/domains/session/manager.ts +2 -3
  284. package/src/domains/session/task-board.ts +14 -1
  285. package/src/domains/session/tree/fork.ts +1 -2
  286. package/src/domains/session/tree/navigator.ts +1 -1
  287. package/src/domains/user-tasks/acceptance.ts +56 -0
  288. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  289. package/src/domains/user-tasks/store.ts +34 -3
  290. package/src/engine/acp/adapter.ts +24 -6
  291. package/src/engine/acp/server.ts +21 -4
  292. package/src/engine/acp/transport.ts +53 -8
  293. package/src/engine/acp/types.ts +4 -0
  294. package/src/engine/apis/ollama-native.ts +15 -0
  295. package/src/engine/claude/subprocess-runtime.ts +107 -60
  296. package/src/engine/external-subprocess.ts +12 -4
  297. package/src/entry/orchestrator.ts +11 -2
  298. package/src/interactive/dispatch-board.ts +46 -717
  299. package/src/interactive/fleet-run-preview.ts +2 -1
  300. package/src/interactive/interactive-application.ts +3 -2
  301. package/src/interactive/interactive-presentation.ts +55 -12
  302. package/src/interactive/interactive-slash-runtime.ts +2 -1
  303. package/src/interactive/oracle.ts +5 -2
  304. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  305. package/src/interactive/overlays/message-picker.ts +2 -2
  306. package/src/interactive/overlays/settings.ts +2 -2
  307. package/src/interactive/overlays/tree-selector.ts +2 -2
  308. package/src/interactive/renderers/branch-summary.ts +1 -1
  309. package/src/interactive/slash-autocomplete.ts +4 -6
  310. package/src/interactive/slash-commands.ts +25 -39
  311. package/src/interactive/slash-spec.ts +28 -0
  312. package/src/interactive/view/artifacts.ts +2 -0
  313. package/src/interactive/worker-stream.ts +7 -3
  314. package/src/tools/bootstrap.ts +4 -0
  315. package/src/tools/builtin-tool-catalog.ts +31 -0
  316. package/src/tools/compete-worktrees.ts +7 -1
  317. package/src/tools/core-bootstrap.ts +16 -0
  318. package/src/tools/decide.ts +136 -0
  319. package/src/tools/dispatch-admission.ts +21 -0
  320. package/src/tools/dispatch-plan.ts +5 -2
  321. package/src/tools/dispatch-runner.ts +15 -1
  322. package/src/tools/dispatch-types.ts +6 -0
  323. package/src/tools/evidence.ts +96 -0
  324. package/src/tools/limitation.ts +76 -0
  325. package/src/tools/policy.ts +9 -0
  326. package/src/tools/presentation.ts +3 -0
  327. package/src/tools/registry.ts +1 -1
  328. package/src/tools/result-shaping.ts +17 -5
  329. package/src/tools/task-worktree.ts +13 -3
  330. package/src/tools/tasks.ts +10 -1
  331. package/src/tools/verify/authoring.ts +170 -83
  332. package/src/tools/verify/catalog.ts +122 -5
  333. package/src/tools/verify/index.ts +2 -1
  334. package/src/tools/verify/numeric.ts +298 -0
  335. package/src/tools/verify/perf.ts +143 -0
  336. package/src/tools/verify/scripts.ts +229 -2
  337. package/dist/chunk-7DICMOS6.js +0 -313
  338. package/dist/chunk-RVG5JXAL.js +0 -41
  339. package/dist/chunk-T56WDKA5.js +0 -183
  340. package/dist/chunk-VPKWYKEY.js +0 -169
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Pure tolerance math for `kind: numeric-compare` verifier checks. A check's
3
+ * command prints a JSON object of `string -> number | number[]`; the catalog
4
+ * names a reference file of the same shape and a tolerance. This module
5
+ * decides pass or fail and writes the structured report; it reads no file and
6
+ * runs nothing.
7
+ */
8
+
9
+ export type NumericToleranceKind = "relative" | "absolute" | "ulp";
10
+
11
+ export interface NumericTolerance {
12
+ /** |actual - expected| / |expected| must not exceed this. Zero expected passes only on exact equality. */
13
+ relative?: number;
14
+ /** |actual - expected| must not exceed this. */
15
+ absolute?: number;
16
+ /** Distance in representable doubles between actual and expected must not exceed this integer. */
17
+ ulp?: number;
18
+ }
19
+
20
+ export type NumericValue = number | number[];
21
+ export type NumericPayload = Record<string, NumericValue>;
22
+
23
+ export type NumericFailureReason =
24
+ | "missing-actual"
25
+ | "missing-reference"
26
+ | "shape-mismatch"
27
+ | "length-mismatch"
28
+ | "not-finite"
29
+ | NumericToleranceKind;
30
+
31
+ export interface NumericDeviation {
32
+ /** Array index of the worst element; absent for a scalar. */
33
+ index?: number;
34
+ actual: number;
35
+ expected: number;
36
+ absolute: number;
37
+ /** Relative deviation, or null when it is undefined (expected is zero and actual is not). */
38
+ relative: number | null;
39
+ /** Distance in representable doubles, or null when either side is not finite. */
40
+ ulp: number | null;
41
+ }
42
+
43
+ export interface NumericKeyReport {
44
+ key: string;
45
+ passed: boolean;
46
+ /** The tolerances the worst element failed, in schema order; empty on pass. */
47
+ failed: NumericFailureReason[];
48
+ /** Worst deviation for the key, present whenever both sides had a comparable value. */
49
+ worst?: NumericDeviation;
50
+ /** One line a reader can act on. */
51
+ detail: string;
52
+ }
53
+
54
+ export interface NumericCompareReport {
55
+ kind: "numeric-compare";
56
+ passed: boolean;
57
+ tolerance: NumericTolerance;
58
+ keys: NumericKeyReport[];
59
+ /** The keys that failed, sorted; empty on pass. */
60
+ failedKeys: string[];
61
+ summary: string;
62
+ }
63
+
64
+ export const NUMERIC_PAYLOAD_CAPS = Object.freeze({
65
+ keys: 4096,
66
+ elements: 1_000_000,
67
+ });
68
+
69
+ /** True when the tolerance names at least one bound and every named bound is usable. */
70
+ export function normalizeNumericTolerance(value: unknown): NumericTolerance | Error {
71
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
72
+ return new Error("tolerance must be an object with relative, absolute, or ulp");
73
+ }
74
+ const record = value as Record<string, unknown>;
75
+ const unknown = Object.keys(record).filter((key) => key !== "relative" && key !== "absolute" && key !== "ulp");
76
+ if (unknown.length > 0) return new Error(`tolerance has unknown field(s): ${unknown.sort().join(", ")}`);
77
+ const tolerance: NumericTolerance = {};
78
+ for (const kind of ["relative", "absolute"] as const) {
79
+ if (!Object.hasOwn(record, kind)) continue;
80
+ const bound = record[kind];
81
+ if (typeof bound !== "number" || !Number.isFinite(bound) || bound < 0) {
82
+ return new Error(`tolerance.${kind} must be a finite non-negative number`);
83
+ }
84
+ tolerance[kind] = bound;
85
+ }
86
+ if (Object.hasOwn(record, "ulp")) {
87
+ const bound = record.ulp;
88
+ if (typeof bound !== "number" || !Number.isInteger(bound) || bound < 0) {
89
+ return new Error("tolerance.ulp must be a non-negative integer");
90
+ }
91
+ tolerance.ulp = bound;
92
+ }
93
+ if (tolerance.relative === undefined && tolerance.absolute === undefined && tolerance.ulp === undefined) {
94
+ return new Error("tolerance must name at least one of relative, absolute, or ulp");
95
+ }
96
+ return tolerance;
97
+ }
98
+
99
+ const ORDERED_VIEW = new DataView(new ArrayBuffer(8));
100
+
101
+ /** A double as an integer whose ordering matches the ordering of doubles. */
102
+ function orderedBits(value: number): bigint {
103
+ ORDERED_VIEW.setFloat64(0, value);
104
+ const bits = ORDERED_VIEW.getBigInt64(0);
105
+ return bits < 0n ? -(bits & 0x7fffffffffffffffn) : bits;
106
+ }
107
+
108
+ /**
109
+ * Distance in representable doubles between two finite numbers. Adjacent
110
+ * doubles are 1 apart, +0 and -0 are 0 apart, and a sign crossing counts every
111
+ * double in between. Returns Infinity when the distance exceeds the safe
112
+ * integer range or either side is not finite.
113
+ */
114
+ export function ulpDistance(actual: number, expected: number): number {
115
+ if (!Number.isFinite(actual) || !Number.isFinite(expected)) return Number.POSITIVE_INFINITY;
116
+ const distance = orderedBits(actual) - orderedBits(expected);
117
+ const magnitude = distance < 0n ? -distance : distance;
118
+ return magnitude > BigInt(Number.MAX_SAFE_INTEGER) ? Number.POSITIVE_INFINITY : Number(magnitude);
119
+ }
120
+
121
+ /** Parse command stdout or a reference file as a numeric payload, naming the fault when it is not one. */
122
+ export function parseNumericPayload(text: string, label: string): NumericPayload | Error {
123
+ let parsed: unknown;
124
+ try {
125
+ parsed = JSON.parse(text) as unknown;
126
+ } catch (error) {
127
+ return new Error(`${label} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
128
+ }
129
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
130
+ return new Error(`${label} must be a JSON object of string -> number | number[]`);
131
+ }
132
+ const record = parsed as Record<string, unknown>;
133
+ const keys = Object.keys(record);
134
+ if (keys.length > NUMERIC_PAYLOAD_CAPS.keys)
135
+ return new Error(`${label} exceeds the ${NUMERIC_PAYLOAD_CAPS.keys}-key cap`);
136
+ const payload: NumericPayload = {};
137
+ let elements = 0;
138
+ for (const key of keys) {
139
+ const value = record[key];
140
+ if (typeof value === "number") {
141
+ payload[key] = value;
142
+ elements += 1;
143
+ } else if (Array.isArray(value) && value.every((entry) => typeof entry === "number")) {
144
+ payload[key] = [...(value as number[])];
145
+ elements += value.length;
146
+ } else {
147
+ return new Error(`${label}.${key} must be a number or an array of numbers`);
148
+ }
149
+ if (elements > NUMERIC_PAYLOAD_CAPS.elements) {
150
+ return new Error(`${label} exceeds the ${NUMERIC_PAYLOAD_CAPS.elements}-element cap`);
151
+ }
152
+ }
153
+ return payload;
154
+ }
155
+
156
+ function deviation(actual: number, expected: number, index?: number): NumericDeviation {
157
+ const finite = Number.isFinite(actual) && Number.isFinite(expected);
158
+ const absolute = finite ? Math.abs(actual - expected) : Number.POSITIVE_INFINITY;
159
+ const relative = !finite ? null : expected === 0 ? (absolute === 0 ? 0 : null) : absolute / Math.abs(expected);
160
+ return {
161
+ ...(index !== undefined ? { index } : {}),
162
+ actual,
163
+ expected,
164
+ absolute,
165
+ relative,
166
+ ulp: finite ? ulpDistance(actual, expected) : null,
167
+ };
168
+ }
169
+
170
+ /** Tolerances the deviation violates, in schema order. Every named tolerance must hold. */
171
+ function violatedTolerances(item: NumericDeviation, tolerance: NumericTolerance): NumericToleranceKind[] {
172
+ const failed: NumericToleranceKind[] = [];
173
+ if (tolerance.relative !== undefined && (item.relative === null || item.relative > tolerance.relative)) {
174
+ failed.push("relative");
175
+ }
176
+ if (tolerance.absolute !== undefined && item.absolute > tolerance.absolute) failed.push("absolute");
177
+ if (tolerance.ulp !== undefined && (item.ulp === null || item.ulp > tolerance.ulp)) failed.push("ulp");
178
+ return failed;
179
+ }
180
+
181
+ function formatNumber(value: number): string {
182
+ return Number.isFinite(value) ? value.toPrecision(6).replace(/\.?0+(e|$)/u, "$1") : String(value);
183
+ }
184
+
185
+ function describeDeviation(item: NumericDeviation): string {
186
+ const where = item.index === undefined ? "" : `[${item.index}]`;
187
+ const relative = item.relative === null ? "undefined" : formatNumber(item.relative);
188
+ const ulp = item.ulp === null ? "undefined" : String(item.ulp);
189
+ return `${where} actual=${formatNumber(item.actual)} expected=${formatNumber(item.expected)} abs=${formatNumber(item.absolute)} rel=${relative} ulp=${ulp}`;
190
+ }
191
+
192
+ function compareElements(
193
+ key: string,
194
+ actual: number[],
195
+ expected: number[],
196
+ tolerance: NumericTolerance,
197
+ ): NumericKeyReport {
198
+ let worst: NumericDeviation | undefined;
199
+ let worstFailed: NumericFailureReason[] = [];
200
+ for (let index = 0; index < expected.length; index += 1) {
201
+ const item = deviation(
202
+ actual[index] as number,
203
+ expected[index] as number,
204
+ expected.length === 1 && actual.length === 1 ? undefined : index,
205
+ );
206
+ const failed: NumericFailureReason[] =
207
+ !Number.isFinite(item.actual) || !Number.isFinite(item.expected)
208
+ ? ["not-finite"]
209
+ : violatedTolerances(item, tolerance);
210
+ const worse =
211
+ worst === undefined ||
212
+ (failed.length > 0 && worstFailed.length === 0) ||
213
+ (failed.length > 0 === worstFailed.length > 0 && item.absolute > worst.absolute);
214
+ if (worse) {
215
+ worst = item;
216
+ worstFailed = failed;
217
+ }
218
+ }
219
+ if (worst === undefined) return { key, passed: true, failed: [], detail: `${key}: empty array matches` };
220
+ const passed = worstFailed.length === 0;
221
+ return {
222
+ key,
223
+ passed,
224
+ failed: worstFailed,
225
+ worst,
226
+ detail: passed
227
+ ? `${key}: within tolerance, worst${describeDeviation(worst)}`
228
+ : `${key}: failed ${worstFailed.join(", ")} at worst${describeDeviation(worst)}`,
229
+ };
230
+ }
231
+
232
+ /**
233
+ * Compare a command's payload against the reference. Every key on either side
234
+ * is judged: a key missing on one side fails and names the side, a scalar
235
+ * against an array fails, arrays compare elementwise and fail on length
236
+ * mismatch, and any NaN or infinity fails as not finite. A value passes only
237
+ * when it satisfies every tolerance the catalog named.
238
+ */
239
+ export function compareNumeric(
240
+ actual: NumericPayload,
241
+ reference: NumericPayload,
242
+ tolerance: NumericTolerance,
243
+ ): NumericCompareReport {
244
+ const keys = [...new Set([...Object.keys(reference), ...Object.keys(actual)])].sort();
245
+ const reports: NumericKeyReport[] = [];
246
+ for (const key of keys) {
247
+ const got = actual[key];
248
+ const want = reference[key];
249
+ if (got === undefined) {
250
+ reports.push({ key, passed: false, failed: ["missing-actual"], detail: `${key}: missing from the command output` });
251
+ continue;
252
+ }
253
+ if (want === undefined) {
254
+ reports.push({ key, passed: false, failed: ["missing-reference"], detail: `${key}: missing from the reference` });
255
+ continue;
256
+ }
257
+ if (Array.isArray(got) !== Array.isArray(want)) {
258
+ reports.push({
259
+ key,
260
+ passed: false,
261
+ failed: ["shape-mismatch"],
262
+ detail: `${key}: ${Array.isArray(got) ? "array" : "scalar"} in the command output but ${Array.isArray(want) ? "array" : "scalar"} in the reference`,
263
+ });
264
+ continue;
265
+ }
266
+ const gotList = Array.isArray(got) ? got : [got];
267
+ const wantList = Array.isArray(want) ? want : [want];
268
+ if (gotList.length !== wantList.length) {
269
+ reports.push({
270
+ key,
271
+ passed: false,
272
+ failed: ["length-mismatch"],
273
+ detail: `${key}: ${gotList.length} element(s) in the command output but ${wantList.length} in the reference`,
274
+ });
275
+ continue;
276
+ }
277
+ reports.push(compareElements(key, gotList, wantList, tolerance));
278
+ }
279
+ const failedKeys = reports.filter((report) => !report.passed).map((report) => report.key);
280
+ const passed = failedKeys.length === 0;
281
+ return {
282
+ kind: "numeric-compare",
283
+ passed,
284
+ tolerance: { ...tolerance },
285
+ keys: reports,
286
+ failedKeys,
287
+ summary: passed
288
+ ? `numeric-compare passed: ${reports.length} key(s) within tolerance`
289
+ : `numeric-compare failed: ${failedKeys.length} of ${reports.length} key(s) out of tolerance (${failedKeys.join(", ")})`,
290
+ };
291
+ }
292
+
293
+ /** The report as lines for a tool result or a receipt tail. */
294
+ export function renderNumericReport(report: NumericCompareReport): string {
295
+ const lines = [report.summary, `tolerance: ${JSON.stringify(report.tolerance)}`];
296
+ for (const key of report.keys) lines.push(`- ${key.detail}`);
297
+ return lines.join("\n");
298
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Pure budget math for `kind: perf-budget` verifier checks. The harness
3
+ * measures the command's wall time; this module decides pass or fail against
4
+ * a declared budget or a recorded baseline and writes the structured report.
5
+ * It reads no file and runs nothing.
6
+ */
7
+
8
+ export interface PerfBudgetSpec {
9
+ wallTimeMs: number;
10
+ tolerance?: { relative?: number };
11
+ }
12
+
13
+ export interface PerfBaseline {
14
+ wallTimeMs: number;
15
+ /** ISO time the baseline was recorded; informational. */
16
+ recordedAt?: string;
17
+ /** Check id the baseline was recorded for; informational. */
18
+ check?: string;
19
+ }
20
+
21
+ export interface PerfBudgetReport {
22
+ kind: "perf-budget";
23
+ passed: boolean;
24
+ measuredMs: number;
25
+ /** The effective bound the measurement was judged against, tolerance applied. */
26
+ budgetMs: number;
27
+ /** measuredMs / budgetMs, rounded to three decimals. */
28
+ ratio: number;
29
+ source: "budget" | "baseline";
30
+ /** The declared or recorded figure before tolerance. */
31
+ referenceMs: number;
32
+ relative: number;
33
+ summary: string;
34
+ }
35
+
36
+ export const PERF_BASELINE_VERSION = 1;
37
+
38
+ export function normalizePerfBudget(value: unknown): PerfBudgetSpec | Error {
39
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
40
+ return new Error("budget must be an object with wallTimeMs");
41
+ }
42
+ const record = value as Record<string, unknown>;
43
+ const unknown = Object.keys(record).filter((key) => key !== "wallTimeMs" && key !== "tolerance");
44
+ if (unknown.length > 0) return new Error(`budget has unknown field(s): ${unknown.sort().join(", ")}`);
45
+ if (typeof record.wallTimeMs !== "number" || !Number.isFinite(record.wallTimeMs) || record.wallTimeMs <= 0) {
46
+ return new Error("budget.wallTimeMs must be a positive number of milliseconds");
47
+ }
48
+ const spec: PerfBudgetSpec = { wallTimeMs: record.wallTimeMs };
49
+ if (Object.hasOwn(record, "tolerance")) {
50
+ const tolerance = normalizePerfTolerance(record.tolerance, "budget.tolerance");
51
+ if (tolerance instanceof Error) return tolerance;
52
+ spec.tolerance = tolerance;
53
+ }
54
+ return spec;
55
+ }
56
+
57
+ export function normalizePerfTolerance(value: unknown, location: string): { relative?: number } | Error {
58
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
59
+ return new Error(`${location} must be an object with relative`);
60
+ }
61
+ const record = value as Record<string, unknown>;
62
+ const unknown = Object.keys(record).filter((key) => key !== "relative");
63
+ if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.sort().join(", ")}`);
64
+ if (!Object.hasOwn(record, "relative")) return {};
65
+ if (typeof record.relative !== "number" || !Number.isFinite(record.relative) || record.relative < 0) {
66
+ return new Error(`${location}.relative must be a finite non-negative number`);
67
+ }
68
+ return { relative: record.relative };
69
+ }
70
+
71
+ /** Parse a baseline file written by `clio-coder verifiers baseline <id>`. */
72
+ export function parsePerfBaseline(text: string, label: string): PerfBaseline | Error {
73
+ let parsed: unknown;
74
+ try {
75
+ parsed = JSON.parse(text) as unknown;
76
+ } catch (error) {
77
+ return new Error(`${label} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
78
+ }
79
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
80
+ return new Error(`${label} must be a JSON object with wallTimeMs`);
81
+ }
82
+ const record = parsed as Record<string, unknown>;
83
+ if (typeof record.wallTimeMs !== "number" || !Number.isFinite(record.wallTimeMs) || record.wallTimeMs <= 0) {
84
+ return new Error(`${label}.wallTimeMs must be a positive number of milliseconds`);
85
+ }
86
+ const baseline: PerfBaseline = { wallTimeMs: record.wallTimeMs };
87
+ if (typeof record.recordedAt === "string") baseline.recordedAt = record.recordedAt;
88
+ if (typeof record.check === "string") baseline.check = record.check;
89
+ return baseline;
90
+ }
91
+
92
+ /** The JSON text a baseline file holds; stable key order so a re-record is a clean diff. */
93
+ export function renderPerfBaseline(input: { wallTimeMs: number; check: string; recordedAt: string }): string {
94
+ return `${JSON.stringify(
95
+ { version: PERF_BASELINE_VERSION, check: input.check, wallTimeMs: input.wallTimeMs, recordedAt: input.recordedAt },
96
+ null,
97
+ 2,
98
+ )}\n`;
99
+ }
100
+
101
+ /**
102
+ * Judge a measurement. A declared budget bounds the time at
103
+ * `wallTimeMs * (1 + tolerance.relative)`; a baseline bounds it at
104
+ * `baseline.wallTimeMs * (1 + relative)`. Measured time above the bound fails.
105
+ */
106
+ export function evaluatePerfBudget(
107
+ measuredMs: number,
108
+ spec: { budget?: PerfBudgetSpec; baseline?: PerfBaseline; relative?: number },
109
+ ): PerfBudgetReport | Error {
110
+ if (!Number.isFinite(measuredMs) || measuredMs < 0)
111
+ return new Error("measured wall time must be a non-negative number");
112
+ let source: PerfBudgetReport["source"];
113
+ let referenceMs: number;
114
+ let relative: number;
115
+ if (spec.budget !== undefined) {
116
+ source = "budget";
117
+ referenceMs = spec.budget.wallTimeMs;
118
+ relative = spec.budget.tolerance?.relative ?? 0;
119
+ } else if (spec.baseline !== undefined) {
120
+ source = "baseline";
121
+ referenceMs = spec.baseline.wallTimeMs;
122
+ relative = spec.relative ?? 0;
123
+ } else {
124
+ return new Error("perf-budget needs a budget or a recorded baseline");
125
+ }
126
+ const budgetMs = referenceMs * (1 + relative);
127
+ const ratio = Math.round((measuredMs / budgetMs) * 1000) / 1000;
128
+ const passed = measuredMs <= budgetMs;
129
+ const bound = `${Math.round(budgetMs)}ms (${source} ${Math.round(referenceMs)}ms${relative > 0 ? ` +${Math.round(relative * 100)}%` : ""})`;
130
+ return {
131
+ kind: "perf-budget",
132
+ passed,
133
+ measuredMs,
134
+ budgetMs,
135
+ ratio,
136
+ source,
137
+ referenceMs,
138
+ relative,
139
+ summary: passed
140
+ ? `perf-budget passed: measured ${Math.round(measuredMs)}ms within ${bound}, ratio ${ratio}`
141
+ : `perf-budget failed: measured ${Math.round(measuredMs)}ms exceeds ${bound}, ratio ${ratio}`,
142
+ };
143
+ }