@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
@@ -1,17 +1,30 @@
1
1
  import { type ChildProcessByStdio, spawn } from "node:child_process";
2
- import { createInterface } from "node:readline";
3
- import type { Readable } from "node:stream";
2
+ import type { Readable, Writable } from "node:stream";
4
3
 
4
+ import { boundedExternalDiagnostic } from "../../core/external-diagnostic.js";
5
+ import { buildSafeToolEnv, resolveSafeCwd } from "../../core/safe-exec.js";
5
6
  import type { AutonomyLevel } from "../../domains/safety/autonomy.js";
6
7
  import { assertToolProfileEnforceable } from "../../tools/profiles.js";
7
- import { readStderr, waitForClose } from "../external-subprocess.js";
8
+ import { createProcessTreeTerminator, readBoundedLines, readStderr, waitForClose } from "../external-subprocess.js";
8
9
  import type { AgentEvent, AgentMessage, Usage } from "../types.js";
9
10
  import type { WorkerEventEmit, WorkerRunHandle, WorkerRunInput, WorkerRunResult } from "../worker-runtime.js";
10
11
  import { isClaudeCodeSessionId } from "./session-id.js";
11
12
 
12
13
  const READ_ONLY_CLAUDE_TOOLS = ["Read", "Grep", "Glob", "LS", "WebFetch", "WebSearch"] as const;
13
14
 
14
- type ClaudeChildProcess = ChildProcessByStdio<null, Readable, Readable>;
15
+ /** Official CLI binary, resolved from the operator's PATH. */
16
+ const CLAUDE_BINARY = "claude";
17
+ export const CLAUDE_MAX_STREAM_LINE_BYTES = 1024 * 1024;
18
+ export const CLAUDE_MAX_STREAM_BYTES = 8 * 1024 * 1024;
19
+
20
+ type ClaudeChildProcess = ChildProcessByStdio<Writable, Readable, Readable>;
21
+
22
+ export interface ClaudeRuntimeDependencies {
23
+ binary?: string;
24
+ workspaceRoot?: string;
25
+ environment?: NodeJS.ProcessEnv;
26
+ killGraceMs?: number;
27
+ }
15
28
 
16
29
  export interface ClaudeSubprocessPermissionConfig {
17
30
  permissionMode: "plan" | "dontAsk" | "acceptEdits" | "default" | "bypassPermissions";
@@ -48,15 +61,20 @@ export function claudeSubprocessPermissionConfigForAutonomy(
48
61
  return { permissionMode: "default", extraArgs: [], dangerousBypass: false };
49
62
  }
50
63
 
51
- function buildClaudeCodePrompt(input: WorkerRunInput): string {
64
+ export function buildClaudeCodePrompt(input: WorkerRunInput): string {
52
65
  const parts = (input.dynamicPromptMessages ?? []).map((message) => message.body.trim()).filter(Boolean);
53
66
  parts.push(input.task);
54
67
  return parts.join("\n\n");
55
68
  }
56
69
 
57
- function buildClaudeCodeArgs(input: WorkerRunInput): string[] {
70
+ /**
71
+ * `claude -p` reads the user prompt from stdin when no positional prompt is
72
+ * given, so the prompt never appears in argv. The system prompt stays on
73
+ * `--append-system-prompt`: stdin carries only the user turn.
74
+ */
75
+ export function buildClaudeCodeArgs(input: WorkerRunInput, gateEnv: NodeJS.ProcessEnv = process.env): string[] {
58
76
  assertToolProfileEnforceable(input.toolProfile, "claude-code");
59
- const permission = claudeSubprocessPermissionConfigForAutonomy(input.autonomy);
77
+ const permission = claudeSubprocessPermissionConfigForAutonomy(input.autonomy, gateEnv);
60
78
  const args = [
61
79
  "-p",
62
80
  "--output-format",
@@ -71,7 +89,6 @@ function buildClaudeCodeArgs(input: WorkerRunInput): string[] {
71
89
  const systemPrompt = input.systemPrompt.trim();
72
90
  if (systemPrompt.length > 0) args.push("--append-system-prompt", systemPrompt);
73
91
  if (isClaudeCodeSessionId(input.sessionId)) args.push("--session-id", input.sessionId.trim());
74
- args.push(buildClaudeCodePrompt(input));
75
92
  return args;
76
93
  }
77
94
 
@@ -170,8 +187,11 @@ function buildAssistantMessage(input: {
170
187
  exitCode: number;
171
188
  aborted: boolean;
172
189
  stderr: string;
190
+ transportError?: string;
173
191
  }): AgentMessage & { role: "assistant" } {
174
- const errorMessage = input.exitCode === 0 ? "" : resultError(input.result, input.stderr);
192
+ const transportError = input.transportError ?? "";
193
+ const failed = input.exitCode !== 0 || transportError.length > 0;
194
+ const errorMessage = !failed ? "" : transportError || resultError(input.result, input.stderr);
175
195
  const message: AgentMessage & { role: "assistant" } = {
176
196
  role: "assistant",
177
197
  content: [{ type: "text", text: input.text }],
@@ -179,12 +199,12 @@ function buildAssistantMessage(input: {
179
199
  provider: "anthropic",
180
200
  model: input.model,
181
201
  usage: normalizeUsage(input.result?.usage, finite(input.result?.total_cost_usd)),
182
- stopReason: input.aborted ? "aborted" : input.exitCode === 0 ? "stop" : "error",
202
+ stopReason: input.aborted ? "aborted" : failed ? "error" : "stop",
183
203
  timestamp: Date.now(),
184
204
  } as AgentMessage & { role: "assistant" };
185
205
  if (typeof input.result?.request_id === "string") message.responseId = input.result.request_id;
186
206
  if (typeof input.result?.model === "string") message.responseModel = input.result.model;
187
- if (errorMessage.length > 0) message.errorMessage = errorMessage;
207
+ if (errorMessage.length > 0) message.errorMessage = boundedExternalDiagnostic(errorMessage);
188
208
  return message;
189
209
  }
190
210
 
@@ -224,9 +244,14 @@ async function readJsonLines(
224
244
  emit: WorkerEventEmit,
225
245
  state: { started: boolean; text: string; model: string; result: Record<string, unknown> | null },
226
246
  ): Promise<void> {
227
- const rl = createInterface({ input: child.stdout });
228
- for await (const line of rl) {
229
- const trimmed = line.trim();
247
+ for await (const bounded of readBoundedLines(child.stdout, {
248
+ maxLineBytes: CLAUDE_MAX_STREAM_LINE_BYTES,
249
+ maxTotalBytes: CLAUDE_MAX_STREAM_BYTES,
250
+ })) {
251
+ if (bounded.kind === "oversized") {
252
+ throw new Error(`claude stream-json line exceeded ${CLAUDE_MAX_STREAM_LINE_BYTES} bytes`);
253
+ }
254
+ const trimmed = bounded.line.trim();
230
255
  if (trimmed.length === 0) continue;
231
256
  let parsed: unknown;
232
257
  try {
@@ -250,12 +275,21 @@ async function readJsonLines(
250
275
  }
251
276
  }
252
277
 
253
- export function startClaudeCodeWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): WorkerRunHandle {
254
- const args = buildClaudeCodeArgs(input);
255
- const child = spawn("claude", args, {
256
- cwd: process.cwd(),
257
- env: process.env,
258
- stdio: ["ignore", "pipe", "pipe"],
278
+ export function startClaudeCodeWorkerRun(
279
+ input: WorkerRunInput,
280
+ emit: WorkerEventEmit,
281
+ dependencies: ClaudeRuntimeDependencies = {},
282
+ ): WorkerRunHandle {
283
+ const sourceEnv = dependencies.environment ?? process.env;
284
+ const args = buildClaudeCodeArgs(input, sourceEnv);
285
+ const prompt = buildClaudeCodePrompt(input);
286
+ const workspaceRoot = dependencies.workspaceRoot ?? process.cwd();
287
+ const cwd = resolveSafeCwd(input.cwd, workspaceRoot);
288
+ const child: ClaudeChildProcess = spawn(dependencies.binary ?? CLAUDE_BINARY, args, {
289
+ cwd,
290
+ env: buildSafeToolEnv({}, sourceEnv),
291
+ detached: process.platform !== "win32",
292
+ stdio: ["pipe", "pipe", "pipe"],
259
293
  });
260
294
  const streamState = {
261
295
  started: false,
@@ -264,53 +298,66 @@ export function startClaudeCodeWorkerRun(input: WorkerRunInput, emit: WorkerEven
264
298
  result: null as Record<string, unknown> | null,
265
299
  };
266
300
  let aborted = false;
267
- let killTimer: NodeJS.Timeout | null = null;
268
-
301
+ let settled = false;
302
+ let transportError = "";
303
+ const terminator = createProcessTreeTerminator(child, dependencies.killGraceMs ?? 1500);
269
304
  const abort = (): void => {
305
+ if (settled) return;
270
306
  aborted = true;
271
- if (child.killed) return;
272
- child.kill("SIGTERM");
273
- killTimer = setTimeout(() => {
274
- if (!child.killed) child.kill("SIGKILL");
275
- }, 1500);
307
+ terminator.terminate();
276
308
  };
277
- if (input.signal) {
278
- if (input.signal.aborted) abort();
279
- else input.signal.addEventListener("abort", abort, { once: true });
280
- }
309
+ const onAbort = (): void => abort();
310
+ if (input.signal?.aborted) abort();
311
+ else input.signal?.addEventListener("abort", onAbort, { once: true });
312
+ child.once("error", (cause) => {
313
+ transportError ||=
314
+ (cause as NodeJS.ErrnoException).code === "ENOENT"
315
+ ? "Claude Code CLI (`claude`) is not installed or not on PATH."
316
+ : cause.message;
317
+ });
318
+ child.stdin.on("error", (cause) => {
319
+ if (!aborted) transportError ||= `could not send prompt to Claude Code CLI: ${cause.message}`;
320
+ });
321
+ child.stdin.end(prompt);
281
322
 
282
323
  const promise = (async (): Promise<WorkerRunResult> => {
283
324
  emit({ type: "agent_start" } as AgentEvent);
284
- const stderrPromise = readStderr(child);
285
- const stdoutPromise = readJsonLines(child, emit, streamState);
286
- const exitCode = await waitForClose(child);
287
- await stdoutPromise.catch(() => {});
288
- const stderr = await stderrPromise.catch(() => "");
289
- if (killTimer) clearTimeout(killTimer);
290
- const finalText =
291
- streamState.text ||
292
- resultText(streamState.result) ||
293
- (exitCode === 0 ? "" : resultError(streamState.result, stderr));
294
- const finalMessage = buildAssistantMessage({
295
- model: streamState.model,
296
- text: finalText,
297
- result: streamState.result,
298
- exitCode,
299
- aborted,
300
- stderr,
301
- });
302
- if (!streamState.started) emit({ type: "message_start", message: finalMessage } as AgentEvent);
303
- emit({ type: "message_end", message: finalMessage } as AgentEvent);
304
- const messages: AgentMessage[] = [finalMessage];
305
- emit({ type: "agent_end", messages } as AgentEvent);
306
- if (exitCode !== 0 && stderr.trim().length > 0 && !aborted) {
307
- process.stderr.write(`[worker:claude-code] ${stderr.trim()}\n`);
325
+ try {
326
+ const stderrPromise = readStderr(child);
327
+ const stdoutPromise = readJsonLines(child, emit, streamState).catch((cause) => {
328
+ transportError ||= cause instanceof Error ? cause.message : String(cause);
329
+ terminator.terminate();
330
+ });
331
+ const exitCode = await waitForClose(child);
332
+ await stdoutPromise;
333
+ const stderr = await stderrPromise.catch(() => "");
334
+ const finalText =
335
+ streamState.text ||
336
+ resultText(streamState.result) ||
337
+ (exitCode === 0 ? "" : resultError(streamState.result, stderr));
338
+ const finalMessage = buildAssistantMessage({
339
+ model: streamState.model,
340
+ text: finalText,
341
+ result: streamState.result,
342
+ exitCode,
343
+ aborted,
344
+ stderr,
345
+ transportError,
346
+ });
347
+ if (!streamState.started) emit({ type: "message_start", message: finalMessage } as AgentEvent);
348
+ emit({ type: "message_end", message: finalMessage } as AgentEvent);
349
+ const messages: AgentMessage[] = [finalMessage];
350
+ emit({ type: "agent_end", messages } as AgentEvent);
351
+ if (finalMessage.stopReason === "error" && finalMessage.errorMessage && !aborted) {
352
+ process.stderr.write(`[worker:claude-code] ${finalMessage.errorMessage}\n`);
353
+ }
354
+ return { messages, exitCode: finalMessage.stopReason === "stop" ? 0 : 1 };
355
+ } finally {
356
+ settled = true;
357
+ terminator.cleanup();
358
+ input.signal?.removeEventListener("abort", onAbort);
308
359
  }
309
- return { messages, exitCode: exitCode === 0 ? 0 : 1 };
310
360
  })();
311
361
 
312
- return {
313
- promise,
314
- abort,
315
- };
362
+ return { promise, abort };
316
363
  }
@@ -89,7 +89,6 @@ export function createProcessTreeTerminator(
89
89
  let sent = false;
90
90
  let timer: ReturnType<typeof setTimeout> | null = null;
91
91
  const signal = (name: NodeJS.Signals): void => {
92
- if (child.exitCode !== null) return;
93
92
  if (child.pid && process.platform !== "win32") {
94
93
  try {
95
94
  process.kill(-child.pid, name);
@@ -98,6 +97,7 @@ export function createProcessTreeTerminator(
98
97
  // The child may not have established its group yet.
99
98
  }
100
99
  }
100
+ if (child.exitCode !== null) return;
101
101
  child.kill(name);
102
102
  };
103
103
  return {
@@ -105,11 +105,19 @@ export function createProcessTreeTerminator(
105
105
  if (sent) return;
106
106
  sent = true;
107
107
  signal("SIGTERM");
108
- timer = setTimeout(() => signal("SIGKILL"), graceMs);
108
+ timer = setTimeout(() => {
109
+ timer = null;
110
+ signal("SIGKILL");
111
+ }, graceMs);
109
112
  },
110
113
  cleanup() {
111
- if (timer) clearTimeout(timer);
112
- timer = null;
114
+ if (timer) {
115
+ clearTimeout(timer);
116
+ timer = null;
117
+ // A closed leader can leave descendants with independent stdio.
118
+ // Finish the requested cancellation before releasing its escalation.
119
+ signal("SIGKILL");
120
+ }
113
121
  },
114
122
  };
115
123
  }
@@ -12,7 +12,7 @@ import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../core/defaults.js";
12
12
  import { loadDomains } from "../core/domain-loader.js";
13
13
  import type { SafeEventBus } from "../core/event-bus.js";
14
14
  import { expandInlineFileReferencesAsync } from "../core/file-references.js";
15
- import { setGitCommitAttributionEnabled } from "../core/git-commit-attribution.js";
15
+ import { setCommitDecisionRefsProvider, setGitCommitAttributionEnabled } from "../core/git-commit-attribution.js";
16
16
  import { configureGuardrails, guardrailValuesFromSettings } from "../core/guardrails.js";
17
17
  import { HEADLESS_PERMISSION_DENIED_REASON } from "../core/headless-permission.js";
18
18
  import { rememberRecentModel } from "../core/recent-models.js";
@@ -162,7 +162,7 @@ import { collectSessionEntries } from "../domains/session/compaction/session-ent
162
162
  import { estimateTokens } from "../domains/session/compaction/tokens.js";
163
163
  import { ceilChars } from "../domains/session/context-accounting.js";
164
164
  import type { SessionContract, SessionMeta } from "../domains/session/contract.js";
165
- import { createDecisionBoardStore } from "../domains/session/decision-board.js";
165
+ import { activeDecisionRefs, createDecisionBoardStore } from "../domains/session/decision-board.js";
166
166
  import type { CompactionSummaryEntry, CompactionTrigger, SessionEntry } from "../domains/session/entries.js";
167
167
  import { SessionDomainModule } from "../domains/session/index.js";
168
168
  import {
@@ -178,6 +178,7 @@ import { createTaskBoardStore } from "../domains/session/task-board.js";
178
178
  import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
179
179
  import { type ShareContract, ShareDomainModule } from "../domains/share/index.js";
180
180
  import { ToolchainDomainModule } from "../domains/toolchain/index.js";
181
+ import { activeUserTaskAcceptance } from "../domains/user-tasks/active-acceptance.js";
181
182
  import { createUserTasksStore } from "../domains/user-tasks/store.js";
182
183
  import { type AcpSafeSettingsPatch, type AcpSafeSettingsSnapshot, serveClioAcpAgent } from "../engine/acp/server.js";
183
184
  import { createStdioServerTransport } from "../engine/acp/transport.js";
@@ -1550,6 +1551,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1550
1551
  if (resources) {
1551
1552
  middleware.registerHook(
1552
1553
  createMarketplaceOfferRegistration({
1554
+ interactive,
1553
1555
  listInstalledSkillNames: () => resources.skills(process.cwd()).items.map((skill) => skill.name),
1554
1556
  listMarketplaceEntries: () => discoverMarketplaceSkills({ cwd: process.cwd() }).skills,
1555
1557
  installEntry: (entry, scope) => {
@@ -1627,6 +1629,9 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1627
1629
  session.appendEntry(entry);
1628
1630
  },
1629
1631
  });
1632
+ // Every Clio-spawned commit from this session is stamped with the decisions
1633
+ // active on the board at spawn time, the same way it is stamped as assisted.
1634
+ setCommitDecisionRefsProvider(() => activeDecisionRefs(decisionBoard.snapshot()));
1630
1635
  // getSessionId alone never notices a /tree switch: it moves the active
1631
1636
  // append point inside the same session, so the id-keyed cache above kept
1632
1637
  // showing the abandoned branch's board (issue #94). SessionTurnSwitched is
@@ -1686,6 +1691,8 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1686
1691
  }
1687
1692
  : {}),
1688
1693
  taskBoard,
1694
+ decisionBoard,
1695
+ getDecisionBoard: () => decisionBoard.snapshot(),
1689
1696
  userTasks,
1690
1697
  dispatch,
1691
1698
  bus,
@@ -2016,6 +2023,8 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2016
2023
  },
2017
2024
  resolveRigor: () =>
2018
2025
  resolveRigor({ cwd: process.cwd(), override: parseRigorOverride(process.env.CLIO_CODER_RIGOR) }),
2026
+ readActiveAcceptance: (window) =>
2027
+ activeUserTaskAcceptance(userTasks.snapshot(), taskBoard.snapshot(), session.current()?.id ?? null, window),
2019
2028
  recordDecision: (record) => safety.audit.recordCompletionContract?.(record),
2020
2029
  }),
2021
2030
  );