@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
@@ -3,7 +3,7 @@ import {
3
3
  gitCommitAttributionEnabled,
4
4
  reportCommitAttributionDiagnostic,
5
5
  withManagedGitCommitAttributionEnvironment
6
- } from "./chunk-JIEGK6UF.js";
6
+ } from "./chunk-U6TMQNSI.js";
7
7
  import {
8
8
  clampTimerDelayMs
9
9
  } from "./chunk-EBY63B7G.js";
@@ -193,4 +193,4 @@ export {
193
193
  runCommandVector,
194
194
  combineSafeOutput
195
195
  };
196
- //# sourceMappingURL=chunk-JSC3U7TI.js.map
196
+ //# sourceMappingURL=chunk-TOIVGRUX.js.map
@@ -357,4 +357,4 @@ export {
357
357
  enabledExtensionResourceRoots,
358
358
  ExtensionsDomainModule
359
359
  };
360
- //# sourceMappingURL=chunk-7DRAWPTZ.js.map
360
+ //# sourceMappingURL=chunk-TQAHXW6Y.js.map
@@ -34,6 +34,9 @@ var CLIO_COMMIT_TRAILERS = {
34
34
  reviewed: `Reviewed-by: ${CLIO_COMMIT_IDENTITY}`,
35
35
  coAuthored: `Co-authored-by: ${CLIO_COMMIT_IDENTITY}`
36
36
  };
37
+ var CLIO_DECISION_TRAILER_KEY = "Clio-Decision";
38
+ var CLIO_DECISION_TRAILER_CAP = 32;
39
+ var DECISION_REF_PATTERN = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,127}\/[a-z0-9]+(?:[_-][a-z0-9]+)*$/u;
37
40
  var TRAILER_LINE = /^([A-Za-z0-9][A-Za-z0-9-]*):[ \t]+(.+)$/u;
38
41
  var SHA256 = /^[0-9a-f]{64}$/u;
39
42
  function normalizedTrailer(line) {
@@ -45,7 +48,18 @@ var KNOWN_CLIO_TRAILERS = new Set(
45
48
  Object.values(CLIO_COMMIT_TRAILERS).map((line) => normalizedTrailer(line)).filter((line) => line !== null)
46
49
  );
47
50
  function isClioTrailer(key) {
48
- return KNOWN_CLIO_TRAILERS.has(key) || key.startsWith("clio-evidence:receipt-v20/sha256:");
51
+ return KNOWN_CLIO_TRAILERS.has(key) || key.startsWith("clio-evidence:receipt-v20/sha256:") || key.startsWith(`${CLIO_DECISION_TRAILER_KEY.toLowerCase()}:`);
52
+ }
53
+ function decisionTrailerRefs(decisions) {
54
+ if (decisions === void 0) return [];
55
+ const refs = /* @__PURE__ */ new Set();
56
+ for (const ref of decisions) {
57
+ if (typeof ref === "string" && DECISION_REF_PATTERN.test(ref)) refs.add(ref);
58
+ }
59
+ return [...refs].sort().slice(0, CLIO_DECISION_TRAILER_CAP);
60
+ }
61
+ function decisionTrailer(ref) {
62
+ return `${CLIO_DECISION_TRAILER_KEY}: ${ref}`;
49
63
  }
50
64
  function trailerBlockStart(lines) {
51
65
  if (lines.length < 2) return null;
@@ -92,6 +106,7 @@ function attributeCommitMessage(originalMessage, evidence, enabled = true) {
92
106
  if (evidence.materiallyAuthored === true) desired.push(CLIO_COMMIT_TRAILERS.coAuthored);
93
107
  const receipt = receiptTrailer(evidence.receipt);
94
108
  if (receipt !== null) desired.push(receipt);
109
+ for (const ref of decisionTrailerRefs(evidence.decisions)) desired.push(decisionTrailer(ref));
95
110
  const existing = new Set(
96
111
  (blockStart === null ? [] : retained.slice(blockStart)).map((line) => normalizedTrailer(line)).filter((line) => line !== null)
97
112
  );
@@ -112,9 +127,10 @@ function attributeCommitMessage(originalMessage, evidence, enabled = true) {
112
127
  var CLIO_GIT_COMMITS_ENABLED_ENV = "CLIO_CODER_GIT_COMMITS_ENABLED";
113
128
  var ASSISTED_ENV = "CLIO_CODER_COMMIT_ASSISTED";
114
129
  var AUTHORED_ENV = "CLIO_CODER_COMMIT_AUTHORED";
130
+ var DECISIONS_ENV = "CLIO_CODER_COMMIT_DECISIONS";
115
131
  var CONFIG_BASE_COUNT_ENV = "CLIO_CODER_GIT_CONFIG_BASE_COUNT";
116
132
  var DEFAULT_HOOKS_EQUIVALENT_ENV = "CLIO_CODER_GIT_DEFAULT_HOOKS_EQUIVALENT";
117
- var MANAGED_HOOK_VERSION = 2;
133
+ var MANAGED_HOOK_VERSION = 3;
118
134
  var DIAGNOSTIC_MAX_CHARS = 300;
119
135
  var COUNT = /^(?:0|[1-9][0-9]*)$/u;
120
136
  var reportedDiagnostics = /* @__PURE__ */ new Set();
@@ -122,7 +138,24 @@ var PROBE_CACHE_TTL_MS = 1e4;
122
138
  var PROBE_CACHE_MAX_ENTRIES = 32;
123
139
  var probeCache = /* @__PURE__ */ new Map();
124
140
  var installedHooksDirectory = null;
125
- var PER_SPAWN_ENV_NAMES = [ASSISTED_ENV, AUTHORED_ENV, CONFIG_BASE_COUNT_ENV, DEFAULT_HOOKS_EQUIVALENT_ENV];
141
+ var PER_SPAWN_ENV_NAMES = [
142
+ ASSISTED_ENV,
143
+ AUTHORED_ENV,
144
+ DECISIONS_ENV,
145
+ CONFIG_BASE_COUNT_ENV,
146
+ DEFAULT_HOOKS_EQUIVALENT_ENV
147
+ ];
148
+ var decisionRefsProvider = null;
149
+ function setCommitDecisionRefsProvider(provider) {
150
+ decisionRefsProvider = provider;
151
+ }
152
+ function providedDecisionRefs() {
153
+ try {
154
+ return decisionRefsProvider?.() ?? [];
155
+ } catch {
156
+ return [];
157
+ }
158
+ }
126
159
  function reportCommitAttributionDiagnostic(diagnostic) {
127
160
  if (diagnostic === null || reportedDiagnostics.has(diagnostic)) return;
128
161
  reportedDiagnostics.add(diagnostic);
@@ -279,6 +312,14 @@ if [ "$${ASSISTED_ENV}" = '1' ] || [ "$${AUTHORED_ENV}" = '1' ]; then
279
312
  append_trailer '${CLIO_COMMIT_TRAILERS.assisted}'
280
313
  fi
281
314
  if [ "$${AUTHORED_ENV}" = '1' ]; then append_trailer '${CLIO_COMMIT_TRAILERS.coAuthored}'; fi
315
+ # Decision refs are validated again here: only <id>/<key> shapes become
316
+ # trailers, so a stray value cannot inject a second line into the message.
317
+ for decision_ref in $${DECISIONS_ENV}; do
318
+ case "$decision_ref" in
319
+ *[!A-Za-z0-9:._/-]* | */*/* | /* | */ | *-*-) continue ;;
320
+ */*) append_trailer "${CLIO_DECISION_TRAILER_KEY}: $decision_ref" ;;
321
+ esac
322
+ done
282
323
  exit 0
283
324
  `;
284
325
  function installManagedHook(directory, name) {
@@ -358,6 +399,8 @@ function withManagedGitCommitAttributionEnvironment(source, options = {}) {
358
399
  const evidence = options.evidence ?? { materiallyAssisted: true, materiallyAuthored: true };
359
400
  env[ASSISTED_ENV] = evidence.materiallyAssisted === true ? "1" : "0";
360
401
  env[AUTHORED_ENV] = evidence.materiallyAuthored === true ? "1" : "0";
402
+ const decisions = decisionTrailerRefs(evidence.decisions ?? providedDecisionRefs());
403
+ if (decisions.length > 0) env[DECISIONS_ENV] = decisions.join(" ");
361
404
  const countRaw = env.GIT_CONFIG_COUNT;
362
405
  const count = countRaw === void 0 ? 0 : COUNT.test(countRaw) ? Number(countRaw) : Number.NaN;
363
406
  if (!Number.isSafeInteger(count) || count > 1024) {
@@ -394,9 +437,10 @@ function withManagedGitCommitAttributionEnvironment(source, options = {}) {
394
437
 
395
438
  export {
396
439
  attributeCommitMessage,
440
+ setCommitDecisionRefsProvider,
397
441
  reportCommitAttributionDiagnostic,
398
442
  setGitCommitAttributionEnabled,
399
443
  gitCommitAttributionEnabled,
400
444
  withManagedGitCommitAttributionEnvironment
401
445
  };
402
- //# sourceMappingURL=chunk-JIEGK6UF.js.map
446
+ //# sourceMappingURL=chunk-U6TMQNSI.js.map
@@ -159,7 +159,7 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
159
159
  } else if (verdict.kind !== "usable") {
160
160
  process.stdout.write(`${describeVerdict(verdict)} Starting \`clio-coder configure\`.
161
161
  `);
162
- const { runConfigureCommand } = await import("./configure-LE3IK2TJ.js");
162
+ const { runConfigureCommand } = await import("./configure-VEPX4NMX.js");
163
163
  const configured = await runConfigureCommand([]);
164
164
  if (configured !== 0) return configured;
165
165
  startupSettings = readStrictLayeredSettings(process.cwd()).settings;
@@ -174,7 +174,7 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
174
174
  let terminalLease;
175
175
  try {
176
176
  if (terminalLeaseEligible(options)) {
177
- const { createProcessTerminalLease, instantShellEnabled } = await import("./terminal-lease-TUHIJ6Y2.js");
177
+ const { createProcessTerminalLease, instantShellEnabled } = await import("./terminal-lease-C2J3JYRE.js");
178
178
  if (instantShellEnabled()) {
179
179
  let stage0FrameId = null;
180
180
  terminalLease = createProcessTerminalLease({
@@ -197,7 +197,7 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
197
197
  throw new Error("injected Stage 1 hydration failure");
198
198
  }
199
199
  }
200
- const { bootOrchestrator } = await import("./orchestrator-VDFAEFAI.js");
200
+ const { bootOrchestrator } = await import("./orchestrator-J4BSH4WQ.js");
201
201
  const result = await bootOrchestrator({
202
202
  ...options,
203
203
  ...startupSettings ? { startupSettings } : {},
@@ -220,4 +220,4 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
220
220
  export {
221
221
  runClioCommand
222
222
  };
223
- //# sourceMappingURL=chunk-AX2THNSA.js.map
223
+ //# sourceMappingURL=chunk-UEPWCCTY.js.map
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-5ICU3EUH.js";
5
5
  import {
6
6
  parseAgentRecipeSchema
7
- } from "./chunk-RRNP2ANY.js";
7
+ } from "./chunk-7UGL4MB5.js";
8
8
  import {
9
9
  parseFleetContract
10
- } from "./chunk-2VIKGWFZ.js";
10
+ } from "./chunk-OEJSLEPW.js";
11
11
  import {
12
12
  parseFrontmatter
13
13
  } from "./chunk-RKKLTLYB.js";
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  assertAgentSpecPolicy,
23
23
  normalizeAgentSpec
24
- } from "./chunk-B4OAX3SI.js";
24
+ } from "./chunk-KFV5L5SK.js";
25
25
  import {
26
26
  readSettings,
27
27
  settingsPath,
@@ -792,4 +792,4 @@ export {
792
792
  importShareArchive,
793
793
  ShareDomainModule
794
794
  };
795
- //# sourceMappingURL=chunk-QWGDJJYJ.js.map
795
+ //# sourceMappingURL=chunk-USR47QNF.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
3
  sha256
4
- } from "./chunk-IWT4SF4R.js";
4
+ } from "./chunk-CUSRQKPU.js";
5
5
  import {
6
6
  resolvePackageRoot
7
7
  } from "./chunk-IWHMRKLL.js";
@@ -225,4 +225,4 @@ export {
225
225
  renderCodewikiDigest,
226
226
  loadFragments
227
227
  };
228
- //# sourceMappingURL=chunk-Y3CBHOR6.js.map
228
+ //# sourceMappingURL=chunk-V6HJFQZE.js.map
@@ -0,0 +1,318 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ compareCodepoints
4
+ } from "./chunk-I5FWO7L5.js";
5
+ import {
6
+ byteLength
7
+ } from "./chunk-6XLNIQDB.js";
8
+ import {
9
+ resolveSafeCwd
10
+ } from "./chunk-TOIVGRUX.js";
11
+ import {
12
+ require_dist
13
+ } from "./chunk-APJ265NV.js";
14
+ import {
15
+ __toESM,
16
+ init_esm_shims
17
+ } from "./chunk-3R73A4XB.js";
18
+
19
+ // src/domains/safety/validation-contract.ts
20
+ init_esm_shims();
21
+ var import_yaml = __toESM(require_dist(), 1);
22
+ import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
23
+ import path from "node:path";
24
+ var VALIDATION_CONTRACT_VERSION = 1;
25
+ var VALIDATION_CONTRACT_YAML_PATHS = [
26
+ ".clio-coder/validation.yaml",
27
+ ".clio-coder/validation.yml",
28
+ "validation.yaml",
29
+ "validation.yml"
30
+ ];
31
+ var VALIDATION_CONTRACT_MARKDOWN_PATH = "VALIDATION.md";
32
+ var VALIDATION_CONTRACT_CAPS = Object.freeze({
33
+ fileBytes: 256 * 1024,
34
+ textBytes: 4096,
35
+ notesBytes: 16 * 1024,
36
+ artifacts: 256,
37
+ validators: 128,
38
+ modules: 64,
39
+ mapEntries: 256,
40
+ mapKeyBytes: 256
41
+ });
42
+ var RUNTIME_KINDS = ["local", "slurm", "mpi", "other"];
43
+ var ROOT_FIELDS = /* @__PURE__ */ new Set(["version", "task", "runtime", "artifacts", "validators", "notes"]);
44
+ var RUNTIME_FIELDS = /* @__PURE__ */ new Set(["kind", "nodes", "ranks", "walltime", "modules"]);
45
+ var ARTIFACT_FIELDS = /* @__PURE__ */ new Set([
46
+ "path",
47
+ "format",
48
+ "expected_dimensions",
49
+ "expected_attributes",
50
+ "numerical_tolerances",
51
+ "preserve"
52
+ ]);
53
+ var TOLERANCE_FIELDS = /* @__PURE__ */ new Set(["relative", "absolute", "ulp"]);
54
+ function isRecord(value) {
55
+ return value !== null && typeof value === "object" && !Array.isArray(value);
56
+ }
57
+ function unknownFields(record, allowed) {
58
+ return Object.keys(record).filter((key) => !allowed.has(key)).sort(compareCodepoints);
59
+ }
60
+ function boundedText(value, location, cap) {
61
+ if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
62
+ if (value.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
63
+ if (byteLength(value) > cap) return new Error(`${location} exceeds the ${cap}-byte cap`);
64
+ return value;
65
+ }
66
+ function positiveInteger(value, location) {
67
+ if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
68
+ return new Error(`${location} must be a positive integer`);
69
+ }
70
+ return value;
71
+ }
72
+ function nonNegativeNumber(value, location) {
73
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
74
+ return new Error(`${location} must be a finite non-negative number`);
75
+ }
76
+ return value;
77
+ }
78
+ function boundedStringList(value, location, cap) {
79
+ if (!Array.isArray(value)) return new Error(`${location} must be an array of strings`);
80
+ if (value.length > cap) return new Error(`${location} exceeds the ${cap}-entry cap`);
81
+ const items = [];
82
+ for (const [index, entry] of value.entries()) {
83
+ const text = boundedText(entry, `${location}[${index}]`, VALIDATION_CONTRACT_CAPS.textBytes);
84
+ if (text instanceof Error) return text;
85
+ items.push(text);
86
+ }
87
+ return items;
88
+ }
89
+ function boundedMap(value, location, validateEntry) {
90
+ if (!isRecord(value)) return new Error(`${location} must be a map`);
91
+ const keys = Object.keys(value);
92
+ if (keys.length > VALIDATION_CONTRACT_CAPS.mapEntries) {
93
+ return new Error(`${location} exceeds the ${VALIDATION_CONTRACT_CAPS.mapEntries}-entry cap`);
94
+ }
95
+ const out = {};
96
+ for (const key of keys.sort(compareCodepoints)) {
97
+ const entryLocation = `${location}.${key}`;
98
+ if (key.length === 0) return new Error(`${location} has an empty key`);
99
+ if (byteLength(key) > VALIDATION_CONTRACT_CAPS.mapKeyBytes) {
100
+ return new Error(`${entryLocation} key exceeds the ${VALIDATION_CONTRACT_CAPS.mapKeyBytes}-byte cap`);
101
+ }
102
+ const entry = validateEntry(value[key], entryLocation);
103
+ if (entry instanceof Error) return entry;
104
+ out[key] = entry;
105
+ }
106
+ return out;
107
+ }
108
+ function validateRuntime(value, location) {
109
+ if (!isRecord(value)) return new Error(`${location} must be an object with a kind field`);
110
+ const unknown = unknownFields(value, RUNTIME_FIELDS);
111
+ if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
112
+ if (!Object.hasOwn(value, "kind")) return new Error(`${location}.kind is required`);
113
+ const kind = value.kind;
114
+ if (typeof kind !== "string" || !RUNTIME_KINDS.includes(kind)) {
115
+ return new Error(`${location}.kind must be one of ${RUNTIME_KINDS.join(", ")}`);
116
+ }
117
+ const runtime = { kind };
118
+ if (Object.hasOwn(value, "nodes")) {
119
+ const nodes = positiveInteger(value.nodes, `${location}.nodes`);
120
+ if (nodes instanceof Error) return nodes;
121
+ runtime.nodes = nodes;
122
+ }
123
+ if (Object.hasOwn(value, "ranks")) {
124
+ const ranks = positiveInteger(value.ranks, `${location}.ranks`);
125
+ if (ranks instanceof Error) return ranks;
126
+ runtime.ranks = ranks;
127
+ }
128
+ if (Object.hasOwn(value, "walltime")) {
129
+ const walltime = boundedText(value.walltime, `${location}.walltime`, VALIDATION_CONTRACT_CAPS.textBytes);
130
+ if (walltime instanceof Error) return walltime;
131
+ runtime.walltime = walltime;
132
+ }
133
+ if (Object.hasOwn(value, "modules")) {
134
+ const modules = boundedStringList(value.modules, `${location}.modules`, VALIDATION_CONTRACT_CAPS.modules);
135
+ if (modules instanceof Error) return modules;
136
+ runtime.modules = modules;
137
+ }
138
+ return runtime;
139
+ }
140
+ function validateTolerances(value, location) {
141
+ if (!isRecord(value)) return new Error(`${location} must be an object`);
142
+ const unknown = unknownFields(value, TOLERANCE_FIELDS);
143
+ if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
144
+ const tolerances = {};
145
+ if (Object.hasOwn(value, "relative")) {
146
+ const relative = nonNegativeNumber(value.relative, `${location}.relative`);
147
+ if (relative instanceof Error) return relative;
148
+ tolerances.relative = relative;
149
+ }
150
+ if (Object.hasOwn(value, "absolute")) {
151
+ const absolute = nonNegativeNumber(value.absolute, `${location}.absolute`);
152
+ if (absolute instanceof Error) return absolute;
153
+ tolerances.absolute = absolute;
154
+ }
155
+ if (Object.hasOwn(value, "ulp")) {
156
+ const ulp = value.ulp;
157
+ if (typeof ulp !== "number" || !Number.isInteger(ulp) || ulp < 0) {
158
+ return new Error(`${location}.ulp must be a non-negative integer`);
159
+ }
160
+ tolerances.ulp = ulp;
161
+ }
162
+ return tolerances;
163
+ }
164
+ function validateArtifact(value, location) {
165
+ if (!isRecord(value)) return new Error(`${location} must be an object with a path field`);
166
+ const unknown = unknownFields(value, ARTIFACT_FIELDS);
167
+ if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
168
+ if (!Object.hasOwn(value, "path")) return new Error(`${location}.path is required`);
169
+ const artifactPath = boundedText(value.path, `${location}.path`, VALIDATION_CONTRACT_CAPS.textBytes);
170
+ if (artifactPath instanceof Error) return artifactPath;
171
+ const artifact = { path: artifactPath };
172
+ if (Object.hasOwn(value, "format")) {
173
+ const format = boundedText(value.format, `${location}.format`, VALIDATION_CONTRACT_CAPS.textBytes);
174
+ if (format instanceof Error) return format;
175
+ artifact.format = format;
176
+ }
177
+ if (Object.hasOwn(value, "expected_dimensions")) {
178
+ const dimensions = boundedMap(
179
+ value.expected_dimensions,
180
+ `${location}.expected_dimensions`,
181
+ (entry, entryLocation) => typeof entry === "number" && Number.isInteger(entry) && entry >= 0 ? entry : new Error(`${entryLocation} must be a non-negative integer`)
182
+ );
183
+ if (dimensions instanceof Error) return dimensions;
184
+ artifact.expected_dimensions = dimensions;
185
+ }
186
+ if (Object.hasOwn(value, "expected_attributes")) {
187
+ const attributes = boundedMap(
188
+ value.expected_attributes,
189
+ `${location}.expected_attributes`,
190
+ (entry, entryLocation) => typeof entry === "string" ? boundedText(entry, entryLocation, VALIDATION_CONTRACT_CAPS.textBytes) : new Error(`${entryLocation} must be a string`)
191
+ );
192
+ if (attributes instanceof Error) return attributes;
193
+ artifact.expected_attributes = attributes;
194
+ }
195
+ if (Object.hasOwn(value, "numerical_tolerances")) {
196
+ const tolerances = validateTolerances(value.numerical_tolerances, `${location}.numerical_tolerances`);
197
+ if (tolerances instanceof Error) return tolerances;
198
+ artifact.numerical_tolerances = tolerances;
199
+ }
200
+ if (Object.hasOwn(value, "preserve")) {
201
+ if (typeof value.preserve !== "boolean") return new Error(`${location}.preserve must be a boolean`);
202
+ artifact.preserve = value.preserve;
203
+ }
204
+ return artifact;
205
+ }
206
+ function parseValidationContractText(text, contractPath) {
207
+ const invalid = (reason) => ({ ok: false, path: contractPath, reason });
208
+ const document = (0, import_yaml.parseDocument)(text, { prettyErrors: false, strict: true, uniqueKeys: true });
209
+ if (document.errors.length > 0) {
210
+ return invalid(`invalid YAML: ${document.errors.map((error) => error.message).join("; ")}`);
211
+ }
212
+ let parsed;
213
+ try {
214
+ parsed = document.toJS({ maxAliasCount: 0 });
215
+ } catch (error) {
216
+ return invalid(`invalid YAML: ${error instanceof Error ? error.message : String(error)}`);
217
+ }
218
+ if (!isRecord(parsed)) return invalid("root must be an object with a version field");
219
+ const rootUnknown = unknownFields(parsed, ROOT_FIELDS);
220
+ if (rootUnknown.length > 0) return invalid(`root has unknown field(s): ${rootUnknown.join(", ")}`);
221
+ if (!Object.hasOwn(parsed, "version")) return invalid("root.version is required");
222
+ if (parsed.version !== VALIDATION_CONTRACT_VERSION) {
223
+ return invalid(
224
+ `unsupported version ${JSON.stringify(parsed.version)}; supported version is ${VALIDATION_CONTRACT_VERSION}`
225
+ );
226
+ }
227
+ const contract = { version: VALIDATION_CONTRACT_VERSION };
228
+ if (Object.hasOwn(parsed, "task")) {
229
+ const task = boundedText(parsed.task, "root.task", VALIDATION_CONTRACT_CAPS.textBytes);
230
+ if (task instanceof Error) return invalid(task.message);
231
+ contract.task = task;
232
+ }
233
+ if (Object.hasOwn(parsed, "runtime")) {
234
+ const runtime = validateRuntime(parsed.runtime, "root.runtime");
235
+ if (runtime instanceof Error) return invalid(runtime.message);
236
+ contract.runtime = runtime;
237
+ }
238
+ if (Object.hasOwn(parsed, "artifacts")) {
239
+ if (!Array.isArray(parsed.artifacts)) return invalid("root.artifacts must be an array");
240
+ if (parsed.artifacts.length > VALIDATION_CONTRACT_CAPS.artifacts) {
241
+ return invalid(`root.artifacts exceeds the ${VALIDATION_CONTRACT_CAPS.artifacts}-entry cap`);
242
+ }
243
+ const artifacts = [];
244
+ for (const [index, value] of parsed.artifacts.entries()) {
245
+ const artifact = validateArtifact(value, `artifacts[${index}]`);
246
+ if (artifact instanceof Error) return invalid(artifact.message);
247
+ artifacts.push(artifact);
248
+ }
249
+ contract.artifacts = artifacts;
250
+ }
251
+ if (Object.hasOwn(parsed, "validators")) {
252
+ const validators = boundedStringList(parsed.validators, "root.validators", VALIDATION_CONTRACT_CAPS.validators);
253
+ if (validators instanceof Error) return invalid(validators.message);
254
+ contract.validators = validators;
255
+ }
256
+ if (Object.hasOwn(parsed, "notes")) {
257
+ const notes = boundedText(parsed.notes, "root.notes", VALIDATION_CONTRACT_CAPS.notesBytes);
258
+ if (notes instanceof Error) return invalid(notes.message);
259
+ contract.notes = notes;
260
+ }
261
+ return { ok: true, contract, path: contractPath };
262
+ }
263
+ function readContractText(absolutePath, workspaceRoot) {
264
+ let realPath;
265
+ try {
266
+ const realRoot = realpathSync(workspaceRoot);
267
+ realPath = realpathSync(absolutePath);
268
+ resolveSafeCwd(realPath, realRoot);
269
+ } catch (error) {
270
+ const message = error instanceof Error ? error.message : String(error);
271
+ return new Error(`contract file must resolve inside the workspace root (${message})`);
272
+ }
273
+ try {
274
+ const stats = statSync(realPath);
275
+ if (!stats.isFile()) return new Error("contract path must be a regular file");
276
+ if (stats.size > VALIDATION_CONTRACT_CAPS.fileBytes) {
277
+ return new Error(`file exceeds the ${VALIDATION_CONTRACT_CAPS.fileBytes}-byte cap`);
278
+ }
279
+ return readFileSync(realPath, "utf8");
280
+ } catch (error) {
281
+ return new Error(`cannot read contract (${error instanceof Error ? error.message : String(error)})`);
282
+ }
283
+ }
284
+ function loadValidationContract(workspaceRoot) {
285
+ let contractPath = null;
286
+ try {
287
+ contractPath = VALIDATION_CONTRACT_YAML_PATHS.find((relative) => existsSync(path.join(workspaceRoot, relative))) ?? null;
288
+ if (contractPath === null) {
289
+ if (existsSync(path.join(workspaceRoot, VALIDATION_CONTRACT_MARKDOWN_PATH))) {
290
+ return { ok: true, contract: null, path: VALIDATION_CONTRACT_MARKDOWN_PATH, advisory: true };
291
+ }
292
+ return { ok: true, contract: null };
293
+ }
294
+ } catch (error) {
295
+ return {
296
+ ok: false,
297
+ path: contractPath ?? VALIDATION_CONTRACT_YAML_PATHS[0] ?? "validation.yaml",
298
+ reason: `cannot inspect workspace root (${error instanceof Error ? error.message : String(error)})`
299
+ };
300
+ }
301
+ const text = readContractText(path.join(workspaceRoot, contractPath), workspaceRoot);
302
+ if (text instanceof Error) return { ok: false, path: contractPath, reason: text.message };
303
+ return parseValidationContractText(text, contractPath);
304
+ }
305
+ function describeValidationContract(result) {
306
+ if (!result.ok) return `${result.path}: ${result.reason}`;
307
+ if (result.contract === null) {
308
+ return "advisory" in result ? `${result.path} is advisory prose and does not raise rigor; add a version-1 validation.yaml to raise the default to high` : null;
309
+ }
310
+ return null;
311
+ }
312
+
313
+ export {
314
+ VALIDATION_CONTRACT_MARKDOWN_PATH,
315
+ loadValidationContract,
316
+ describeValidationContract
317
+ };
318
+ //# sourceMappingURL=chunk-V76WTFTW.js.map
@@ -3,7 +3,7 @@ import {
3
3
  gitCommitAttributionEnabled,
4
4
  reportCommitAttributionDiagnostic,
5
5
  withManagedGitCommitAttributionEnvironment
6
- } from "./chunk-JIEGK6UF.js";
6
+ } from "./chunk-U6TMQNSI.js";
7
7
  import {
8
8
  clampTimerDelayMs
9
9
  } from "./chunk-EBY63B7G.js";
@@ -280,4 +280,4 @@ export {
280
280
  combineBashOutput,
281
281
  runBashCommand
282
282
  };
283
- //# sourceMappingURL=chunk-NMJXSHBJ.js.map
283
+ //# sourceMappingURL=chunk-W54I7H25.js.map
@@ -7,17 +7,17 @@ import {
7
7
  } from "./chunk-2WZ546HR.js";
8
8
  import {
9
9
  isTerminalRunEnvelope
10
- } from "./chunk-PAJQJ7BS.js";
11
- import {
12
- taskBoardCounts
13
- } from "./chunk-L47TF46W.js";
10
+ } from "./chunk-75W7L2E2.js";
14
11
  import {
15
12
  hashToolCall
16
- } from "./chunk-RSJ25QSL.js";
13
+ } from "./chunk-6QOTUPRG.js";
14
+ import {
15
+ taskBoardCounts
16
+ } from "./chunk-6PAZTBPA.js";
17
17
  import {
18
18
  legacyToolResultDigest,
19
19
  sanitizeToolResultDigest
20
- } from "./chunk-JDAY6FIL.js";
20
+ } from "./chunk-NAI6ZFCY.js";
21
21
  import {
22
22
  SKILL_INSTALL_OFFER_OPTION_NEVER,
23
23
  SKILL_INSTALL_OFFER_OPTION_NOT_NOW,
@@ -25,13 +25,13 @@ import {
25
25
  SKILL_INSTALL_OFFER_OPTION_USER,
26
26
  SKILL_SUGGESTION_ANCHOR,
27
27
  SKILL_SUGGESTION_PREFIX
28
- } from "./chunk-JGRC33J2.js";
28
+ } from "./chunk-54X7T7DK.js";
29
29
  import {
30
30
  ToolNames
31
- } from "./chunk-K6BSR66V.js";
31
+ } from "./chunk-4NSRCOYP.js";
32
32
  import {
33
33
  registerForegroundStream
34
- } from "./chunk-XPWWI35G.js";
34
+ } from "./chunk-JSD46VO2.js";
35
35
  import {
36
36
  ceilChars
37
37
  } from "./chunk-NZMNUPZZ.js";
@@ -41,7 +41,7 @@ import {
41
41
  import {
42
42
  reportCommitAttributionDiagnostic,
43
43
  withManagedGitCommitAttributionEnvironment
44
- } from "./chunk-JIEGK6UF.js";
44
+ } from "./chunk-U6TMQNSI.js";
45
45
  import {
46
46
  require_dist
47
47
  } from "./chunk-APJ265NV.js";
@@ -1217,8 +1217,11 @@ var NO_EFFECTS2 = [];
1217
1217
  function offerBindingTag(offerTag) {
1218
1218
  return `[clio-install:${offerTag}]`;
1219
1219
  }
1220
+ function boundedDescription(text) {
1221
+ return text.replace(/\[[^[\]]*\]/gu, " ").replace(/\s+/gu, " ").trim().slice(0, 200);
1222
+ }
1220
1223
  function marketplaceOfferReminder(entry, offerTag) {
1221
- return `[Marketplace] This request may need expertise no installed skill covers. The local marketplace has "${entry.name}" (not installed): ${entry.description} First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") whether to install ${entry.name}, offering exactly these options in this order: "${SKILL_INSTALL_OFFER_OPTION_PROJECT}", "${SKILL_INSTALL_OFFER_OPTION_USER}", "${SKILL_INSTALL_OFFER_OPTION_NOT_NOW}", "${SKILL_INSTALL_OFFER_OPTION_NEVER}". Include the exact tag ${offerBindingTag(offerTag)} verbatim in that question's text so the harness can bind the answer to this offer; the harness acts only on an answer carrying this tag. Then continue the task in the same turn. The harness handles the answer; never install or load a skill yourself. If it is not actually needed, do not mention it.`;
1224
+ return `[Marketplace] This request may need expertise no installed skill covers. The local marketplace has "${entry.name}" (not installed): ${boundedDescription(entry.description)} First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") whether to install ${entry.name}, offering exactly these options in this order: "${SKILL_INSTALL_OFFER_OPTION_PROJECT}", "${SKILL_INSTALL_OFFER_OPTION_USER}", "${SKILL_INSTALL_OFFER_OPTION_NOT_NOW}", "${SKILL_INSTALL_OFFER_OPTION_NEVER}". Include the exact tag ${offerBindingTag(offerTag)} verbatim in that question's text so the harness can bind the answer to this offer; the harness acts only on an answer carrying this tag. Then continue the task in the same turn. The harness handles the answer; never install or load a skill yourself. If it is not actually needed, do not mention it.`;
1222
1225
  }
1223
1226
  function answersFromDetails(details) {
1224
1227
  const raw = details?.answers;
@@ -1366,6 +1369,15 @@ function createMarketplaceOfferRegistration(deps) {
1366
1369
  const match = bestMatch(input.text ?? "");
1367
1370
  if (!match) return NO_EFFECTS2;
1368
1371
  offeredNames.add(match.entry.name);
1372
+ if (deps.interactive === false) {
1373
+ return [
1374
+ {
1375
+ kind: "inject_reminder",
1376
+ severity: "info",
1377
+ message: `[Marketplace] Skill "${match.entry.name}" matches this request; install with clio-coder skills install ${match.entry.name}.`
1378
+ }
1379
+ ];
1380
+ }
1369
1381
  const tag = newOfferTag();
1370
1382
  pendingOffer = { entry: match.entry, tag };
1371
1383
  return [{ kind: "inject_reminder", severity: "info", message: marketplaceOfferReminder(match.entry, tag) }];
@@ -3084,4 +3096,4 @@ export {
3084
3096
  createWatchdogRegistration,
3085
3097
  MiddlewareDomainModule
3086
3098
  };
3087
- //# sourceMappingURL=chunk-2UG5F4C5.js.map
3099
+ //# sourceMappingURL=chunk-XULDXHTN.js.map