@iowarp/clio-coder 0.3.7 → 0.3.9

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 (400) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +13 -4
  3. package/dist/{acp-SK4MD6MM.js → acp-7LOELQFP.js} +13 -13
  4. package/dist/{agents-2FN2K6ME.js → agents-FIBG2SHA.js} +41 -37
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-QIYZWM5I.js → auth-OI4LIH2I.js} +31 -24
  7. package/dist/builtins-AD25UL3C.js +17 -0
  8. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  9. package/dist/chunk-3DPEIQKN.js +113 -0
  10. package/dist/{chunk-EOOQZZDE.js → chunk-3DUR4WUA.js} +19 -19
  11. package/dist/{chunk-WHJYKASB.js → chunk-3MRC2YSQ.js} +2 -2
  12. package/dist/{chunk-EBEFWSGL.js → chunk-3UUY7R3Z.js} +14 -10
  13. package/dist/{chunk-LADCF22A.js → chunk-3V5AYSEQ.js} +113 -54
  14. package/dist/{chunk-BMWK7ZIZ.js → chunk-465CC7FK.js} +16 -13
  15. package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
  16. package/dist/{chunk-CEYBNUGC.js → chunk-4H6ULJ3H.js} +378 -36
  17. package/dist/{chunk-YTYFXUI3.js → chunk-4LJX2PUC.js} +9 -9
  18. package/dist/{chunk-DOOEX22V.js → chunk-56KB5IJP.js} +5 -5
  19. package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
  20. package/dist/{chunk-TSHXZTOQ.js → chunk-5HFBWUMU.js} +23 -11
  21. package/dist/{chunk-5UJ6ECTS.js → chunk-5PVQ4SRS.js} +80 -8
  22. package/dist/{chunk-ZWLZP4ZT.js → chunk-5QKCQQ3E.js} +359 -17
  23. package/dist/{chunk-6M7VS3J3.js → chunk-5T7RBWN2.js} +111 -5
  24. package/dist/chunk-774ILSRL.js +172 -0
  25. package/dist/chunk-7C6RYZGQ.js +391 -0
  26. package/dist/{chunk-GH5622CP.js → chunk-A2NJGIB3.js} +2 -2
  27. package/dist/{chunk-C4JBQ5SR.js → chunk-AD7Y7STJ.js} +6 -6
  28. package/dist/{chunk-GEYXPTRF.js → chunk-AEYBF3TB.js} +33 -12
  29. package/dist/{chunk-2SFS6XQE.js → chunk-AMKHQW3C.js} +3 -2
  30. package/dist/{chunk-D4MDIG46.js → chunk-B5CSFE7B.js} +7 -7
  31. package/dist/{chunk-MXI6J5JF.js → chunk-B5XRQOLB.js} +10 -10
  32. package/dist/{chunk-X2KV5FXT.js → chunk-BVDVID7E.js} +2 -2
  33. package/dist/{chunk-JNXPYBB4.js → chunk-CA42X6KT.js} +3 -3
  34. package/dist/{chunk-VREKEFLL.js → chunk-D73KXYPF.js} +3 -3
  35. package/dist/{chunk-JTSEDYVQ.js → chunk-DG4M6ZUE.js} +7 -7
  36. package/dist/{chunk-DQA7QLMD.js → chunk-EBOC7MT3.js} +10 -25
  37. package/dist/{chunk-KZ2H5X4G.js → chunk-ECUO3KDP.js} +129 -14
  38. package/dist/{chunk-JRIO5UD2.js → chunk-EQ63NRB7.js} +5 -5
  39. package/dist/{chunk-YD734TPH.js → chunk-FALJGAWU.js} +2 -2
  40. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  41. package/dist/{chunk-XEGB6BCN.js → chunk-GAYUJ7LE.js} +68 -14
  42. package/dist/{chunk-UND3GU2L.js → chunk-H7IXIC72.js} +2 -2
  43. package/dist/{chunk-IR4CFBFN.js → chunk-HAY4ZE2P.js} +12 -12
  44. package/dist/{chunk-UVDSQ6LW.js → chunk-HCBCAYZU.js} +74 -147
  45. package/dist/{chunk-4DWFMQDR.js → chunk-HJB5IUKP.js} +89 -145
  46. package/dist/{chunk-M4AKACEO.js → chunk-HKO36JWF.js} +33 -5
  47. package/dist/{chunk-KCMKRQX4.js → chunk-HPCTNZM2.js} +45 -82
  48. package/dist/{chunk-465YSENW.js → chunk-IFBNV6H6.js} +3 -3
  49. package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
  50. package/dist/chunk-JEQQR47K.js +3025 -0
  51. package/dist/{chunk-FO5ZOVUY.js → chunk-KV2AOLDF.js} +27 -7
  52. package/dist/chunk-LU7P4LHA.js +33 -0
  53. package/dist/{chunk-6TUKSZVF.js → chunk-LXPJXFM5.js} +11 -11
  54. package/dist/{chunk-VQNODYQ4.js → chunk-MIX5N5AC.js} +488 -3668
  55. package/dist/chunk-MLOK6ZOS.js +2888 -0
  56. package/dist/{chunk-ZZMN5OM4.js → chunk-MV2VUEJC.js} +2 -2
  57. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  58. package/dist/{chunk-OBMAI2DP.js → chunk-N3PBVRTZ.js} +12 -388
  59. package/dist/{chunk-WJHBC77E.js → chunk-N5XKWMDW.js} +17 -7
  60. package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
  61. package/dist/{chunk-UFQ3F4FW.js → chunk-NQ6UCCOD.js} +4 -4
  62. package/dist/chunk-NUGM5KR6.js +165 -0
  63. package/dist/{chunk-DMD2AGVS.js → chunk-NZU6YDNV.js} +20 -18
  64. package/dist/{chunk-WHGPSPT5.js → chunk-O6I4CIEU.js} +151 -13
  65. package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
  66. package/dist/{chunk-PD3MESLB.js → chunk-P3JGPQFL.js} +4 -4
  67. package/dist/{chunk-UHXRNZ2J.js → chunk-PNY46YEY.js} +23 -6
  68. package/dist/{chunk-THKY7CD7.js → chunk-PZ4I4JE2.js} +134 -29
  69. package/dist/{chunk-SROCI7ZU.js → chunk-QQ7EKM72.js} +5 -5
  70. package/dist/{chunk-QCTRSGHQ.js → chunk-R7LNVMCS.js} +91 -53
  71. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  72. package/dist/chunk-RKKLTLYB.js +45 -0
  73. package/dist/{chunk-OB5HIGJY.js → chunk-RKRLDWD3.js} +4 -1
  74. package/dist/{chunk-DJNLUABN.js → chunk-S4COXYBG.js} +588 -32
  75. package/dist/{chunk-3HAPLH5M.js → chunk-T3Z6VAAF.js} +172 -11
  76. package/dist/{chunk-FOT2FX5J.js → chunk-TD7UE2L5.js} +12 -10
  77. package/dist/{chunk-UUANF5CR.js → chunk-TEO2TLVN.js} +856 -967
  78. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  79. package/dist/{chunk-EELBMBT6.js → chunk-VKBMFOYV.js} +74 -15
  80. package/dist/chunk-VO2LKSTM.js +165 -0
  81. package/dist/{chunk-5C77SEEY.js → chunk-VPTUJU4P.js} +3 -3
  82. package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
  83. package/dist/{chunk-J7PIKKWC.js → chunk-WXCJ7VME.js} +8 -8
  84. package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
  85. package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
  86. package/dist/{chunk-AB4XIIVB.js → chunk-YKOFT37S.js} +6 -6
  87. package/dist/chunk-YSEHGPCT.js +127 -0
  88. package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
  89. package/dist/cli/index.js +32 -32
  90. package/dist/{clio-WBVQEBKO.js → clio-LT5V7SSZ.js} +9 -9
  91. package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +5 -5
  92. package/dist/codewiki/build-worker.js +4 -4
  93. package/dist/{components-F7OEATSO.js → components-ZFA3SAER.js} +8 -8
  94. package/dist/{config-TRBL3RCF.js → config-RXS5T3JT.js} +98 -65
  95. package/dist/{configure-OLCVPHNM.js → configure-2WYWSCSD.js} +26 -22
  96. package/dist/{context-MJIJ6GOX.js → context-I3BTOTCS.js} +12 -12
  97. package/dist/{context-XEWE3MOJ.js → context-MVOORGMF.js} +54 -47
  98. package/dist/{context-WFPKQSM6.js → context-PALKKQYL.js} +28 -28
  99. package/dist/{context-clear-KNOS2JPB.js → context-clear-N2WOYZ2K.js} +53 -46
  100. package/dist/{context-index-SSR5ECNE.js → context-index-HNG3MOME.js} +6 -6
  101. package/dist/{context-working-set-EUXAZI6N.js → context-working-set-MIEVECVZ.js} +17 -18
  102. package/dist/{dispatch-runner-B7MTOVKL.js → dispatch-runner-VVA4SRRH.js} +90 -61
  103. package/dist/{docs-FLJTIDSE.js → docs-7LQ23DLM.js} +8 -8
  104. package/dist/doctor-TWBWFK5V.js +165 -0
  105. package/dist/eval-IJ5VEZDJ.js +4483 -0
  106. package/dist/{evidence-JZNBUOQZ.js → evidence-L5APPXNV.js} +68 -61
  107. package/dist/{evolve-FJVC4KKI.js → evolve-RGNKFJ52.js} +47 -40
  108. package/dist/{extensions-IQL36S7K.js → extensions-7WYWUX5A.js} +13 -7
  109. package/dist/{fleet-BDKYJFCP.js → fleet-6CNVBZZP.js} +113 -76
  110. package/dist/{fleet-commands-ZFIWZSB3.js → fleet-commands-L2SXSYEI.js} +10 -10
  111. package/dist/{fleet-graph-Y6HPXIVF.js → fleet-graph-2J3OOIPO.js} +17 -15
  112. package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-CZRJ4JP5.js} +5 -6
  113. package/dist/{fleet-validate-BIYREGIK.js → fleet-validate-C5RI6DP7.js} +20 -19
  114. package/dist/{init-LQUB5COQ.js → init-VBN2ACVA.js} +70 -63
  115. package/dist/{library-NJAHIGG4.js → library-JHGUMLY2.js} +22 -20
  116. package/dist/{memory-OG6HOYKM.js → memory-K4OQIYWG.js} +49 -42
  117. package/dist/{models-5ZG5XY7J.js → models-2NCZUWDD.js} +35 -29
  118. package/dist/{monitor-TJ7AMTGB.js → monitor-MMVTJABD.js} +64 -45
  119. package/dist/{orchestrator-WZYB54DM.js → orchestrator-ZKBPCHW6.js} +1971 -520
  120. package/dist/{paths-XUC7GS6E.js → paths-DBXMZMDU.js} +5 -5
  121. package/dist/registry-LG64LTF4.js +11 -0
  122. package/dist/{reset-PXQT45IY.js → reset-DD5JGOY3.js} +11 -11
  123. package/dist/{run-FQ74YF62.js → run-QEGNX7FL.js} +89 -83
  124. package/dist/{share-FW7SVCL3.js → share-JKD3BQMW.js} +20 -18
  125. package/dist/{skills-7E7IRB3R.js → skills-LMQIKDOZ.js} +23 -21
  126. package/dist/{skills-eval-LI75W6OK.js → skills-eval-I7X2774U.js} +59 -52
  127. package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
  128. package/dist/support-I7LOJLIF.js +38 -0
  129. package/dist/{targets-4CIFKCTW.js → targets-RUSR6B5Z.js} +77 -42
  130. package/dist/{terminal-lease-WUZY7ZV5.js → terminal-lease-QYVORFR4.js} +6 -4
  131. package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
  132. package/dist/{uninstall-7FV7IP4E.js → uninstall-ZJF5H5ZN.js} +8 -8
  133. package/dist/{upgrade-K2HVIVMQ.js → upgrade-XANW3FXB.js} +29 -26
  134. package/dist/{usage-GTZELZQX.js → usage-4H7ZRXQT.js} +110 -61
  135. package/dist/{verifiers-RLAHT27O.js → verifiers-UZXNBZEB.js} +13 -13
  136. package/dist/{verify-BX3BRKH5.js → verify-BVKWTNDL.js} +9 -9
  137. package/dist/{wiki-generate-ASIFASCN.js → wiki-generate-MY7WV2QI.js} +76 -69
  138. package/dist/worker/entry.js +69 -66
  139. package/docs/alcf-provider.md +1 -1
  140. package/docs/architecture.md +1 -1
  141. package/docs/artifact-versions.md +11 -5
  142. package/docs/built-in-agents.md +1 -1
  143. package/docs/capacity-and-scheduling.md +23 -2
  144. package/docs/commands-and-modes.md +2 -2
  145. package/docs/configuration-and-targets.md +37 -5
  146. package/docs/context-engine.md +63 -4
  147. package/docs/documentation-coverage.md +3 -3
  148. package/docs/documentation-guide.md +1 -1
  149. package/docs/environment-variables.md +2 -0
  150. package/docs/eval-runner.md +262 -11
  151. package/docs/evals-internal.md +72 -2
  152. package/docs/evidence-and-memory.md +77 -12
  153. package/docs/evolution.md +1 -1
  154. package/docs/extensions-and-sharing.md +3 -1
  155. package/docs/fleet-dispatch.md +34 -9
  156. package/docs/glossary.md +21 -1
  157. package/docs/installation-and-lifecycle.md +1 -1
  158. package/docs/middleware-and-components.md +1 -1
  159. package/docs/model-catalog.md +1 -1
  160. package/docs/observability.md +54 -3
  161. package/docs/proactive-memory.md +127 -14
  162. package/docs/prompt-envelope-and-tools.md +22 -2
  163. package/docs/provider-adapter-cookbook.md +1 -1
  164. package/docs/release-cut-checklist.md +60 -41
  165. package/docs/safety-model.md +1 -1
  166. package/docs/scientific-validation.md +1 -1
  167. package/docs/skills-marketplace.md +1 -1
  168. package/docs/tool-usage.md +1 -1
  169. package/docs/trace-store.md +1 -1
  170. package/docs/troubleshooting.md +87 -0
  171. package/docs/tui-design.md +1 -1
  172. package/docs/worker-dispatch-mechanics.md +1 -1
  173. package/package.json +2 -2
  174. package/src/cli/agents.ts +1 -1
  175. package/src/cli/argv.ts +5 -0
  176. package/src/cli/config-inspect.ts +33 -6
  177. package/src/cli/config.ts +1 -1
  178. package/src/cli/configure.ts +107 -23
  179. package/src/cli/doctor-state-size.ts +82 -0
  180. package/src/cli/doctor.ts +7 -1
  181. package/src/cli/eval.ts +80 -16
  182. package/src/cli/evidence.ts +30 -25
  183. package/src/cli/extensions.ts +5 -1
  184. package/src/cli/fleet-preflight.ts +2 -12
  185. package/src/cli/fleet.ts +32 -3
  186. package/src/cli/shared.ts +1 -0
  187. package/src/cli/targets.ts +45 -11
  188. package/src/cli/trace.ts +63 -4
  189. package/src/cli/usage.ts +63 -14
  190. package/src/cli/validate-model.ts +60 -5
  191. package/src/core/bus-events.ts +54 -1
  192. package/src/core/cache-telemetry.ts +42 -0
  193. package/src/core/commit-attribution.ts +4 -4
  194. package/src/core/config.ts +18 -0
  195. package/src/core/defaults.ts +36 -6
  196. package/src/core/endpoint-key.ts +27 -0
  197. package/src/core/path-boundary.ts +100 -0
  198. package/src/core/residency-target-key.ts +25 -0
  199. package/src/core/response-schema.ts +36 -2
  200. package/src/domains/agents/extension.ts +2 -11
  201. package/src/domains/agents/fleet-contract.ts +30 -12
  202. package/src/domains/agents/recipe.ts +7 -1
  203. package/src/domains/agents/registry.ts +73 -5
  204. package/src/domains/agents/result-contract.ts +128 -17
  205. package/src/domains/agents/write-boundary.ts +15 -50
  206. package/src/domains/config/classify.ts +3 -0
  207. package/src/domains/context/codewiki/coordinator.ts +12 -4
  208. package/src/domains/context/project-rules.ts +51 -1
  209. package/src/domains/dispatch/admission.ts +40 -3
  210. package/src/domains/dispatch/assignment-reconcile.ts +22 -5
  211. package/src/domains/dispatch/assignment-store.ts +151 -14
  212. package/src/domains/dispatch/capacity-lease.ts +98 -9
  213. package/src/domains/dispatch/contract.ts +26 -1
  214. package/src/domains/dispatch/delegation-plan.ts +2 -5
  215. package/src/domains/dispatch/execution-plan.ts +44 -4
  216. package/src/domains/dispatch/execution-role.ts +9 -1
  217. package/src/domains/dispatch/extension.ts +309 -96
  218. package/src/domains/dispatch/fleet-run.ts +78 -4
  219. package/src/domains/dispatch/gate-role-prompts.ts +38 -0
  220. package/src/domains/dispatch/heartbeat.ts +32 -8
  221. package/src/domains/dispatch/index.ts +6 -1
  222. package/src/domains/dispatch/intent-requirements.ts +40 -0
  223. package/src/domains/dispatch/intent.ts +84 -8
  224. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  225. package/src/domains/dispatch/path-scope.ts +370 -0
  226. package/src/domains/dispatch/receipt-integrity.ts +2 -1
  227. package/src/domains/dispatch/reservation-store.ts +116 -8
  228. package/src/domains/dispatch/state.ts +4 -0
  229. package/src/domains/dispatch/types.ts +14 -7
  230. package/src/domains/dispatch/validation.ts +6 -3
  231. package/src/domains/dispatch/worker-spawn.ts +25 -11
  232. package/src/domains/dispatch/write-boundary-enforcer.ts +62 -0
  233. package/src/domains/dispatch/write-boundary.ts +262 -22
  234. package/src/domains/eval/artifacts/store.ts +62 -0
  235. package/src/domains/eval/compare/behavioral.ts +224 -0
  236. package/src/domains/eval/compare/compare.ts +355 -2
  237. package/src/domains/eval/compare/envelope.ts +128 -0
  238. package/src/domains/eval/compare/gates.ts +24 -6
  239. package/src/domains/eval/compare/thresholds.ts +30 -3
  240. package/src/domains/eval/execution-provenance.ts +240 -0
  241. package/src/domains/eval/metrics/aggregate.ts +136 -0
  242. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  243. package/src/domains/eval/metrics/evidence.ts +79 -2
  244. package/src/domains/eval/metrics/tracked.ts +413 -0
  245. package/src/domains/eval/provenance.ts +117 -0
  246. package/src/domains/eval/reports/comparison.ts +128 -0
  247. package/src/domains/eval/reports/junit.ts +17 -3
  248. package/src/domains/eval/reports/markdown.ts +3 -3
  249. package/src/domains/eval/reports/text.ts +14 -0
  250. package/src/domains/eval/run-compare.ts +20 -0
  251. package/src/domains/eval/runners/clio-run.ts +139 -2
  252. package/src/domains/eval/runners/external-command.ts +28 -3
  253. package/src/domains/eval/schema/adapter.ts +111 -0
  254. package/src/domains/eval/schema/artifact.ts +20 -0
  255. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  256. package/src/domains/eval/schema/behavioral.ts +520 -0
  257. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  258. package/src/domains/eval/schema/serving.ts +74 -0
  259. package/src/domains/eval/schema/suite.ts +38 -8
  260. package/src/domains/eval/schema/validate.ts +58 -3
  261. package/src/domains/eval/schema/verdict.ts +237 -0
  262. package/src/domains/eval/suites/resolve.ts +2 -0
  263. package/src/domains/eval/suites/run.ts +264 -33
  264. package/src/domains/eval/verifiers/command.ts +2 -1
  265. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  266. package/src/domains/evidence/build.ts +68 -21
  267. package/src/domains/evidence/eval.ts +2 -12
  268. package/src/domains/evidence/findings-markdown.ts +33 -0
  269. package/src/domains/evidence/index.ts +21 -0
  270. package/src/domains/evidence/provenance.ts +46 -11
  271. package/src/domains/evidence/run-trust.ts +7 -113
  272. package/src/domains/evidence/trust-projection.ts +274 -0
  273. package/src/domains/evidence/trust-status.ts +145 -17
  274. package/src/domains/evidence/types.ts +4 -0
  275. package/src/domains/extensions/compatibility.ts +285 -0
  276. package/src/domains/extensions/discovery.ts +126 -4
  277. package/src/domains/extensions/resources.ts +21 -9
  278. package/src/domains/extensions/state.ts +18 -5
  279. package/src/domains/extensions/types.ts +6 -1
  280. package/src/domains/lifecycle/doctor.ts +209 -2
  281. package/src/domains/memory/index.ts +14 -0
  282. package/src/domains/memory/task-bank-promotion.ts +64 -0
  283. package/src/domains/memory/task-memory-policy.ts +77 -8
  284. package/src/domains/memory/task-memory-spend.ts +131 -0
  285. package/src/domains/memory/task-memory-status.ts +7 -0
  286. package/src/domains/memory/task-memory-telemetry.ts +2 -0
  287. package/src/domains/middleware/index.ts +1 -0
  288. package/src/domains/middleware/memory-intervention.ts +69 -5
  289. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  290. package/src/domains/observability/background-memory-usage.ts +140 -0
  291. package/src/domains/observability/cost.ts +1 -1
  292. package/src/domains/observability/index.ts +7 -0
  293. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  294. package/src/domains/observability/trace-store.ts +192 -2
  295. package/src/domains/prompts/compiler.ts +100 -13
  296. package/src/domains/prompts/contract.ts +3 -5
  297. package/src/domains/providers/endpoint-capacity.ts +96 -0
  298. package/src/domains/providers/extension.ts +30 -2
  299. package/src/domains/providers/index.ts +10 -0
  300. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  301. package/src/domains/providers/runtime-resolution.ts +8 -1
  302. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  303. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  304. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  305. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  306. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  307. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  308. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  309. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  310. package/src/domains/providers/types/capability-flags.ts +2 -0
  311. package/src/domains/providers/types/target-descriptor.ts +2 -0
  312. package/src/domains/resources/common-loader.ts +3 -0
  313. package/src/domains/resources/prompts/loader.ts +184 -17
  314. package/src/domains/safety/call-target.ts +52 -0
  315. package/src/domains/safety/policy-engine.ts +5 -5
  316. package/src/domains/safety/run-effects.ts +96 -2
  317. package/src/domains/safety/scope.ts +7 -12
  318. package/src/domains/session/context-accounting.ts +52 -1
  319. package/src/domains/session/context-ledger.ts +37 -13
  320. package/src/domains/session/index.ts +6 -0
  321. package/src/domains/session/prompt-cache.ts +140 -0
  322. package/src/domains/session/prompt-manifest.ts +42 -0
  323. package/src/engine/acp/adapter.ts +18 -3
  324. package/src/engine/acp/server.ts +4 -1
  325. package/src/engine/ai.ts +35 -0
  326. package/src/engine/apis/llamacpp-residency.ts +55 -3
  327. package/src/engine/apis/lmstudio.ts +25 -5
  328. package/src/engine/apis/ollama-native.ts +2 -1
  329. package/src/engine/apis/openai-completions.ts +80 -17
  330. package/src/engine/apis/residency-lock.ts +3 -1
  331. package/src/engine/apis/residency.ts +34 -1
  332. package/src/engine/prompt-templates.ts +18 -1
  333. package/src/engine/provider-payload.ts +29 -1
  334. package/src/engine/worker-runtime.ts +6 -3
  335. package/src/entry/orchestrator.ts +176 -30
  336. package/src/interactive/chat-loop-messages.ts +26 -7
  337. package/src/interactive/chat-loop.ts +318 -41
  338. package/src/interactive/chat-panel.ts +62 -8
  339. package/src/interactive/clio-editor.ts +45 -8
  340. package/src/interactive/context-activity.ts +5 -1
  341. package/src/interactive/context-meter.ts +1 -1
  342. package/src/interactive/context-overlay.ts +40 -10
  343. package/src/interactive/cost-overlay.ts +64 -6
  344. package/src/interactive/dispatch-board.ts +127 -5
  345. package/src/interactive/fleet-run-preview.ts +41 -15
  346. package/src/interactive/handoff-round.ts +41 -2
  347. package/src/interactive/interactive-application.ts +24 -1
  348. package/src/interactive/interactive-event-projection.ts +14 -0
  349. package/src/interactive/interactive-input-runtime.ts +8 -0
  350. package/src/interactive/interactive-presentation.ts +4 -0
  351. package/src/interactive/interactive-shell.ts +20 -17
  352. package/src/interactive/interactive-slash-runtime.ts +27 -4
  353. package/src/interactive/memory-overlay.ts +8 -0
  354. package/src/interactive/mutation-preview.ts +295 -0
  355. package/src/interactive/overlay-general-openers.ts +16 -0
  356. package/src/interactive/overlay-key-routing.ts +38 -0
  357. package/src/interactive/overlay-lifecycle.ts +38 -5
  358. package/src/interactive/overlay-permission-lifecycle.ts +22 -2
  359. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  360. package/src/interactive/overlays/ask-user.ts +91 -19
  361. package/src/interactive/overlays/help-reference.ts +4 -0
  362. package/src/interactive/overlays/prompts.ts +11 -1
  363. package/src/interactive/overlays/settings.ts +176 -48
  364. package/src/interactive/permission-hint.ts +34 -2
  365. package/src/interactive/permission-overlay.ts +159 -9
  366. package/src/interactive/prewarm.ts +197 -0
  367. package/src/interactive/render-trace.ts +162 -15
  368. package/src/interactive/renderers/tool-execution.ts +4 -0
  369. package/src/interactive/side-question.ts +58 -1
  370. package/src/interactive/slash-commands.ts +7 -2
  371. package/src/interactive/status/controller.ts +11 -0
  372. package/src/interactive/status/state-machine.ts +54 -2
  373. package/src/interactive/status/types.ts +7 -0
  374. package/src/interactive/terminal-lease.ts +2 -0
  375. package/src/interactive/turn-context.ts +299 -31
  376. package/src/interactive/turn-persistence.ts +14 -4
  377. package/src/interactive/turn-prewarm.ts +364 -0
  378. package/src/interactive/turn-queues.ts +7 -4
  379. package/src/interactive/turn-runtime.ts +8 -1
  380. package/src/interactive/turn-state.ts +23 -0
  381. package/src/interactive/view/artifacts.ts +42 -9
  382. package/src/interactive/view/view-overlay.ts +43 -6
  383. package/src/interactive/worker-receipts.ts +14 -2
  384. package/src/interactive/worker-stream.ts +8 -0
  385. package/src/tools/ask-user.ts +43 -2
  386. package/src/tools/dispatch-admission.ts +12 -13
  387. package/src/tools/dispatch-arguments.ts +27 -0
  388. package/src/tools/dispatch-plan.ts +46 -9
  389. package/src/tools/dispatch-runner.ts +48 -13
  390. package/src/tools/dispatch-scout.ts +1 -1
  391. package/src/tools/monitor.ts +13 -0
  392. package/src/tools/registry.ts +16 -0
  393. package/src/tools/worker-evidence.ts +19 -13
  394. package/src/worker/spec-contract.ts +2 -1
  395. package/dist/chunk-AOCYTWAV.js +0 -449
  396. package/dist/chunk-HWUFFB6L.js +0 -83
  397. package/dist/chunk-R346GLFC.js +0 -31
  398. package/dist/chunk-ZGH7FGS5.js +0 -1079
  399. package/dist/doctor-RN4YKO2X.js +0 -87
  400. package/dist/eval-RUBJVSNQ.js +0 -2557
@@ -1,7 +1,16 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
- AGENT_AUTOMATION_AUTHORITIES
4
- } from "./chunk-AOCYTWAV.js";
3
+ artifactDefaultPath,
4
+ extractCommandCdTargets,
5
+ extractCommandWriteTargets
6
+ } from "./chunk-MV3K5QF2.js";
7
+ import {
8
+ canonicalizeExistingPath
9
+ } from "./chunk-ECH6PKUQ.js";
10
+ import {
11
+ ToolNames,
12
+ isBuiltinToolName
13
+ } from "./chunk-CGKSTWHD.js";
5
14
  import {
6
15
  init_esm_shims
7
16
  } from "./chunk-3R73A4XB.js";
@@ -34,10 +43,425 @@ function parseJsonObjectPayload(text) {
34
43
  return { ok: false, reason: parsedSomething ? "not-object" : "not-json" };
35
44
  }
36
45
 
37
- // src/domains/agents/result-contract.ts
46
+ // src/domains/agents/spec.ts
38
47
  init_esm_shims();
39
48
  import { createHash } from "node:crypto";
49
+
50
+ // src/domains/safety/action-classifier.ts
51
+ init_esm_shims();
40
52
  import path from "node:path";
53
+ var GIT_DESTRUCTIVE_PATTERNS = [
54
+ { name: "git-push-force-long", re: /\bgit\s+push\s+--force\b/i },
55
+ { name: "git-push-force-short", re: /\bgit\s+push\s+-f\b/i },
56
+ { name: "git-reset-hard", re: /\bgit\s+reset\s+--hard\b/i },
57
+ { name: "git-clean-fd", re: /\bgit\s+clean\s+-fd?\b/i },
58
+ { name: "git-checkout-dot", re: /\bgit\s+checkout\s+--\s+\./i },
59
+ { name: "git-branch-D", re: /\bgit\s+branch\s+-D\b/i },
60
+ { name: "git-restore-source", re: /\bgit\s+restore\s+--source\b/i }
61
+ ];
62
+ var SYSTEM_MODIFY_PATTERNS = [
63
+ { name: "sudo-or-doas", re: /\b(sudo|doas)\b/i },
64
+ // allow rm -rf /tmp/... and /var/tmp/... but flag everything else rooted at /
65
+ { name: "rm-rf-root", re: /\brm\s+-rf?\s+\/(?!(tmp|var\/tmp)(?:\/|\s|$))/i },
66
+ { name: "apt-install", re: /\bapt(-get)?\s+(install|remove|purge)/i },
67
+ { name: "brew-install", re: /\bbrew\s+(install|uninstall|reinstall)/i },
68
+ { name: "npm-install-global", re: /\bnpm\s+install\s+-g\b/i },
69
+ { name: "pip-install", re: /\bpip\s+install\b/i },
70
+ { name: "systemctl", re: /\bsystemctl\s+/i },
71
+ { name: "chmod-root", re: /\bchmod\s+[0-7]{3,4}\s+\//i },
72
+ { name: "chown", re: /\bchown\s+/i }
73
+ ];
74
+ var SYSTEM_WRITE_ROOT_PREFIXES = ["/etc", "/usr", "/var", "/bin", "/sbin", "/run"];
75
+ var SYSTEM_WRITE_EXEMPT_PREFIXES = ["/var/tmp", "/var/folders"];
76
+ function isUnderPrefix(abs, prefix) {
77
+ return abs === prefix || abs.startsWith(`${prefix}/`);
78
+ }
79
+ function baseClassify(tool) {
80
+ switch (tool) {
81
+ case ToolNames.Read:
82
+ case ToolNames.Grep:
83
+ case ToolNames.Find:
84
+ case ToolNames.Ls:
85
+ case ToolNames.WebFetch:
86
+ case ToolNames.Git:
87
+ case ToolNames.CodeNav:
88
+ case ToolNames.Context:
89
+ case ToolNames.Monitor:
90
+ case ToolNames.AskUser:
91
+ case ToolNames.CredentialPresent:
92
+ // tasks pick mutates only Clio-owned session-ledger and project-local
93
+ // .clio-coder runtime state, never source-workspace files. By intentional
94
+ // policy it stays read class and ungated; the tool itself still requires
95
+ // a durable operator task id before it can mutate either store.
96
+ case ToolNames.Tasks:
97
+ // ledger posts a typed contribution to a coordination board and reads a
98
+ // local mirror. Neither touches the workspace, so it is never gated
99
+ // behind a confirmation.
100
+ case ToolNames.Ledger:
101
+ return "read";
102
+ case ToolNames.Write:
103
+ case ToolNames.Edit:
104
+ case ToolNames.Artifact:
105
+ return "write";
106
+ case ToolNames.Bash:
107
+ case ToolNames.Verify:
108
+ return "execute";
109
+ case ToolNames.Dispatch:
110
+ case ToolNames.Steer:
111
+ return "dispatch";
112
+ default:
113
+ return null;
114
+ }
115
+ }
116
+ function scanStringOf(args) {
117
+ if (!args) return "";
118
+ const parts = [];
119
+ for (const value of Object.values(args)) {
120
+ if (value == null) continue;
121
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
122
+ parts.push(String(value));
123
+ } else {
124
+ try {
125
+ parts.push(JSON.stringify(value));
126
+ } catch {
127
+ }
128
+ }
129
+ }
130
+ return parts.join(" ");
131
+ }
132
+ function matchFirst(patterns, haystack) {
133
+ for (const p of patterns) {
134
+ if (p.re.test(haystack)) return p;
135
+ }
136
+ return null;
137
+ }
138
+ function resolveCandidate(p, baseCwd) {
139
+ if (p.startsWith("~")) return p;
140
+ const base = canonicalizeExistingPath(path.resolve(baseCwd ?? process.cwd()));
141
+ const resolved = path.isAbsolute(p) ? path.resolve(p) : path.resolve(base, p);
142
+ return canonicalizeExistingPath(resolved);
143
+ }
144
+ function isInsideCwd(abs) {
145
+ const cwd = canonicalizeExistingPath(path.resolve(process.cwd()));
146
+ const candidate = canonicalizeExistingPath(abs);
147
+ const rel = path.relative(cwd, candidate);
148
+ return rel === "" || !rel.startsWith("..") && !path.isAbsolute(rel);
149
+ }
150
+ function writePathClass(pathArg, baseCwd) {
151
+ if (pathArg.startsWith("~")) {
152
+ return { cls: "system_modify", reason: `write-path-home-escape: ${pathArg}` };
153
+ }
154
+ const abs = resolveCandidate(pathArg, baseCwd);
155
+ const exempt = SYSTEM_WRITE_EXEMPT_PREFIXES.some((prefix) => isUnderPrefix(abs, prefix));
156
+ if (!exempt) {
157
+ for (const prefix of SYSTEM_WRITE_ROOT_PREFIXES) {
158
+ if (isUnderPrefix(abs, prefix)) {
159
+ return { cls: "system_modify", reason: `write-path-system-root: ${prefix}` };
160
+ }
161
+ }
162
+ }
163
+ if (!isInsideCwd(abs)) {
164
+ return { cls: "system_modify", reason: `write-path-outside-cwd: ${abs}` };
165
+ }
166
+ return { cls: "write" };
167
+ }
168
+ function extractWritePath(tool, args) {
169
+ const candidate = args?.path ?? args?.file_path ?? args?.filePath;
170
+ if (typeof candidate === "string" && candidate.length > 0) return candidate;
171
+ return tool === ToolNames.Artifact ? artifactDefaultPath(args?.kind) : null;
172
+ }
173
+ function classify(call) {
174
+ const base = baseClassify(call.tool);
175
+ if (base === null) {
176
+ return { actionClass: "unknown", reasons: [`unknown tool: ${call.tool}`] };
177
+ }
178
+ const reasons = [];
179
+ if (call.tool === ToolNames.Bash) {
180
+ const scan = scanStringOf(call.args);
181
+ const gitHit = matchFirst(GIT_DESTRUCTIVE_PATTERNS, scan);
182
+ if (gitHit) {
183
+ return { actionClass: "git_destructive", reasons: [`pattern:${gitHit.name}`] };
184
+ }
185
+ const sysHit = matchFirst(SYSTEM_MODIFY_PATTERNS, scan);
186
+ if (sysHit) {
187
+ return { actionClass: "system_modify", reasons: [`pattern:${sysHit.name}`] };
188
+ }
189
+ const command = typeof call.args?.command === "string" ? call.args.command : null;
190
+ const argCwd = typeof call.args?.cwd === "string" && call.args.cwd.length > 0 ? call.args.cwd : void 0;
191
+ if (command !== null) {
192
+ const targetReasons = [];
193
+ for (const target of extractCommandWriteTargets(command)) {
194
+ const decision = writePathClass(target, argCwd);
195
+ if (decision.cls === "system_modify") {
196
+ targetReasons.push(decision.reason ?? `bash-write-target: ${target}`);
197
+ }
198
+ }
199
+ for (const target of extractCommandCdTargets(command)) {
200
+ if (target.startsWith("~")) {
201
+ targetReasons.push(`bash-cd-home-escape: ${target}`);
202
+ continue;
203
+ }
204
+ const abs = resolveCandidate(target, argCwd);
205
+ if (!isInsideCwd(abs)) {
206
+ targetReasons.push(`bash-cd-outside-workspace: ${abs}`);
207
+ }
208
+ }
209
+ if (targetReasons.length > 0) {
210
+ return { actionClass: "system_modify", reasons: targetReasons };
211
+ }
212
+ }
213
+ return { actionClass: "execute", reasons };
214
+ }
215
+ if (base === "write") {
216
+ const pathArg = extractWritePath(call.tool, call.args);
217
+ if (pathArg) {
218
+ const decision = writePathClass(pathArg);
219
+ if (decision.cls === "system_modify") {
220
+ return { actionClass: "system_modify", reasons: decision.reason ? [decision.reason] : [] };
221
+ }
222
+ }
223
+ return { actionClass: "write", reasons };
224
+ }
225
+ return { actionClass: base, reasons };
226
+ }
227
+
228
+ // src/domains/agents/spec.ts
229
+ var AGENT_AUTOMATION_AUTHORITIES = ["read-only", "verification", "artifact-write", "workspace-edit"];
230
+ var AGENT_PRODUCTS = ["orientation"];
231
+ var AGENT_CATEGORIES = [
232
+ "explore",
233
+ "plan",
234
+ "research",
235
+ "implement",
236
+ "quality",
237
+ "science",
238
+ "evolution",
239
+ "operations",
240
+ "internal"
241
+ ];
242
+ var AGENT_CAPABILITY_CLASSES = [
243
+ "read-only",
244
+ "artifact-write",
245
+ "workspace-edit",
246
+ "verification",
247
+ "orchestration",
248
+ "internal"
249
+ ];
250
+ var AGENT_LATENCY_CLASSES = ["fast", "balanced", "deep"];
251
+ var AGENT_AUDIENCES = ["base", "shadow", "custom", "internal"];
252
+ var AGENT_PROJECT_CONTEXT_TIERS = ["none", "bounded"];
253
+ function includes(values, value) {
254
+ return typeof value === "string" && values.includes(value);
255
+ }
256
+ function isAgentCategory(value) {
257
+ return includes(AGENT_CATEGORIES, value);
258
+ }
259
+ function isAgentCapabilityClass(value) {
260
+ return includes(AGENT_CAPABILITY_CLASSES, value);
261
+ }
262
+ function isAgentLatencyClass(value) {
263
+ return includes(AGENT_LATENCY_CLASSES, value);
264
+ }
265
+ function isAgentAudience(value) {
266
+ return includes(AGENT_AUDIENCES, value);
267
+ }
268
+ function isAgentProjectContextTier(value) {
269
+ return includes(AGENT_PROJECT_CONTEXT_TIERS, value);
270
+ }
271
+ function isAgentProduct(value) {
272
+ return includes(AGENT_PRODUCTS, value);
273
+ }
274
+ function actionClassesForTools(tools) {
275
+ const actions = /* @__PURE__ */ new Set();
276
+ for (const tool of tools) actions.add(classify({ tool }).actionClass);
277
+ return actions;
278
+ }
279
+ function normalizeTools(recipe) {
280
+ const seen = /* @__PURE__ */ new Set();
281
+ const tools = [];
282
+ for (const tool of recipe.tools) {
283
+ if (typeof tool !== "string" || tool.trim().length === 0) {
284
+ throw new Error(`agent recipe '${recipe.id}' declares an invalid tool name`);
285
+ }
286
+ if (seen.has(tool)) continue;
287
+ seen.add(tool);
288
+ tools.push(isBuiltinToolName(tool) ? tool : tool);
289
+ }
290
+ return tools;
291
+ }
292
+ function asToolName(tool) {
293
+ return isBuiltinToolName(tool) ? tool : tool;
294
+ }
295
+ function normalizeToolRequirements(recipe, tools) {
296
+ if (!recipe.toolRequirements) {
297
+ throw new Error(`agent recipe '${recipe.id}' must declare tools.required and tools.optional`);
298
+ }
299
+ const declared = new Set(tools);
300
+ const required = recipe.toolRequirements.required.map((requirement, index) => {
301
+ if (typeof requirement === "string") return asToolName(requirement);
302
+ if (!Array.isArray(requirement.anyOf) || requirement.anyOf.length === 0) {
303
+ throw new Error(`agent recipe '${recipe.id}' tools.required[${index}].anyOf must be non-empty`);
304
+ }
305
+ return { anyOf: requirement.anyOf.map(asToolName) };
306
+ });
307
+ const optional = recipe.toolRequirements.optional.map(asToolName);
308
+ const mentioned = required.flatMap(
309
+ (requirement) => typeof requirement === "string" ? [requirement] : requirement.anyOf
310
+ );
311
+ for (const tool of [...mentioned, ...optional]) {
312
+ if (!declared.has(tool)) throw new Error(`agent recipe '${recipe.id}' requirement '${tool}' is not declared`);
313
+ }
314
+ if ((/* @__PURE__ */ new Set([...mentioned, ...optional])).size !== mentioned.length + optional.length) {
315
+ throw new Error(`agent recipe '${recipe.id}' contains duplicate tool requirements`);
316
+ }
317
+ if ((/* @__PURE__ */ new Set([...mentioned, ...optional])).size !== tools.length) {
318
+ throw new Error(`agent recipe '${recipe.id}' has declared tools without required/optional semantics`);
319
+ }
320
+ return { required, optional };
321
+ }
322
+ function resolveAgentToolCompatibility(spec, effectiveTools, options) {
323
+ const available = new Set(effectiveTools);
324
+ const missingRequired = [];
325
+ for (const requirement of spec.toolRequirements.required) {
326
+ if (typeof requirement === "string") {
327
+ if (!available.has(requirement)) missingRequired.push(requirement);
328
+ continue;
329
+ }
330
+ if (!requirement.anyOf.some((tool) => available.has(tool))) {
331
+ missingRequired.push(`anyOf(${requirement.anyOf.join("|")})`);
332
+ }
333
+ }
334
+ if (available.has(ToolNames.Dispatch) && !options.mediatesDispatch) {
335
+ missingRequired.push("dispatch(runtime mediation unavailable)");
336
+ }
337
+ return {
338
+ compatible: missingRequired.length === 0,
339
+ missingRequired,
340
+ lostOptional: spec.toolRequirements.optional.filter((tool) => !available.has(tool))
341
+ };
342
+ }
343
+ function normalizeAgentSpec(recipe) {
344
+ const tools = normalizeTools(recipe);
345
+ const toolRequirements = normalizeToolRequirements(recipe, tools);
346
+ return {
347
+ version: recipe.version,
348
+ id: recipe.id,
349
+ name: recipe.name,
350
+ description: recipe.description,
351
+ source: recipe.source,
352
+ filepath: recipe.filepath,
353
+ tools,
354
+ toolRequirements,
355
+ category: recipe.category,
356
+ capabilityClass: recipe.capabilityClass,
357
+ latencyClass: recipe.latencyClass,
358
+ projectContextTier: recipe.projectContextTier,
359
+ audience: recipe.audience,
360
+ tags: recipe.tags,
361
+ skills: recipe.skills,
362
+ resultContract: recipe.resultContract,
363
+ ...recipe.product !== void 0 ? { product: recipe.product } : {},
364
+ budget: recipe.budget,
365
+ body: recipe.body
366
+ };
367
+ }
368
+ function agentSpecFingerprint(spec) {
369
+ const requirement = (entry) => typeof entry === "string" ? entry : `anyOf(${[...entry.anyOf].sort().join("|")})`;
370
+ const payload = JSON.stringify({
371
+ id: spec.id,
372
+ tools: [...spec.tools].sort(),
373
+ required: spec.toolRequirements.required.map(requirement).sort(),
374
+ optional: [...spec.toolRequirements.optional].sort(),
375
+ capabilityClass: spec.capabilityClass,
376
+ latencyClass: spec.latencyClass,
377
+ projectContextTier: spec.projectContextTier,
378
+ audience: spec.audience,
379
+ skills: [...spec.skills].sort(),
380
+ resultContract: spec.resultContract,
381
+ budget: spec.budget,
382
+ body: createHash("sha256").update(spec.body, "utf8").digest("hex")
383
+ });
384
+ return createHash("sha256").update(payload, "utf8").digest("hex");
385
+ }
386
+ function isUserVisibleAgent(spec) {
387
+ return spec.audience === "base" || spec.audience === "custom";
388
+ }
389
+ function isShadowAgent(spec) {
390
+ return spec.audience === "shadow" || spec.audience === "internal";
391
+ }
392
+ function agentSpecPolicyErrors(spec) {
393
+ const errors = [];
394
+ const actions = actionClassesForTools(spec.tools);
395
+ const requiredGroups = spec.toolRequirements.required.map(
396
+ (requirement) => typeof requirement === "string" ? [requirement] : requirement.anyOf
397
+ );
398
+ const requiresTool = (tool) => requiredGroups.some((group) => group.length > 0 && group.every((candidate) => candidate === tool));
399
+ const requiresMutation = requiredGroups.some(
400
+ (group) => group.length > 0 && group.every((tool) => tool === ToolNames.Write || tool === ToolNames.Edit)
401
+ );
402
+ if (spec.capabilityClass === "workspace-edit" && (!requiresTool(ToolNames.Read) || !requiresMutation)) {
403
+ errors.push(`workspace-edit agent '${spec.id}' must require read and write|edit`);
404
+ }
405
+ if (spec.capabilityClass === "verification" && !requiresTool(ToolNames.Verify)) {
406
+ errors.push(`verification agent '${spec.id}' must require verify`);
407
+ }
408
+ if (spec.capabilityClass === "artifact-write" && !requiresTool(ToolNames.Artifact)) {
409
+ errors.push(`artifact-write agent '${spec.id}' must require artifact`);
410
+ }
411
+ if (spec.skills.length > 0 && !requiresTool(ToolNames.Context)) {
412
+ errors.push(`agent '${spec.id}' must require context for bound skills`);
413
+ }
414
+ if (spec.capabilityClass === "orchestration" && spec.tools.includes(ToolNames.Dispatch) && !requiresTool(ToolNames.Dispatch)) {
415
+ errors.push(`orchestration agent '${spec.id}' must require dispatch when it is declared`);
416
+ }
417
+ const toolList = spec.tools.join(", ");
418
+ if (spec.capabilityClass === "read-only") {
419
+ for (const action of actions) {
420
+ if (action !== "read") errors.push(`read-only agent '${spec.id}' requests ${action} tools (${toolList})`);
421
+ }
422
+ }
423
+ if (spec.capabilityClass === "artifact-write") {
424
+ for (const tool of spec.tools) {
425
+ const action = classify({ tool }).actionClass;
426
+ if (action === "execute" || action === "dispatch" || action === "system_modify" || action === "git_destructive") {
427
+ errors.push(`artifact-write agent '${spec.id}' requests ${action} tool '${tool}'`);
428
+ }
429
+ if (action === "write" && tool !== ToolNames.Artifact) {
430
+ errors.push(`artifact-write agent '${spec.id}' can only write terminal artifacts; got '${tool}'`);
431
+ }
432
+ }
433
+ }
434
+ if (spec.capabilityClass === "verification") {
435
+ for (const tool of spec.tools) {
436
+ const action = classify({ tool }).actionClass;
437
+ if (action === "write" || action === "dispatch" || action === "system_modify" || action === "git_destructive") {
438
+ errors.push(`verification agent '${spec.id}' must not request ${action} tool '${tool}'`);
439
+ }
440
+ if (tool === ToolNames.Bash)
441
+ errors.push(`verification agent '${spec.id}' must use typed validation tools, not bash`);
442
+ }
443
+ }
444
+ if (spec.capabilityClass !== "orchestration" && spec.tools.includes(ToolNames.Dispatch)) {
445
+ errors.push(`agent '${spec.id}' exposes dispatch without orchestration capability`);
446
+ }
447
+ if (spec.tools.includes(ToolNames.AskUser)) {
448
+ errors.push(`agent '${spec.id}' exposes ask_user, which is only available to the orchestrator`);
449
+ }
450
+ if (spec.skills.length > 0 && !spec.tools.includes(ToolNames.Context)) {
451
+ errors.push(`agent '${spec.id}' declares skills but does not expose context`);
452
+ }
453
+ return errors;
454
+ }
455
+ function assertAgentSpecPolicy(spec) {
456
+ const errors = agentSpecPolicyErrors(spec);
457
+ if (errors.length > 0) throw new Error(`agent policy violation:
458
+ ${errors.map((error) => `- ${error}`).join("\n")}`);
459
+ }
460
+
461
+ // src/domains/agents/result-contract.ts
462
+ init_esm_shims();
463
+ import { createHash as createHash2 } from "node:crypto";
464
+ import path2 from "node:path";
41
465
  function parseDelegationPlanResult(output) {
42
466
  const parsed = parseJson(output);
43
467
  if (!parsed.ok || !hasOnlyKeys(parsed.value, ["tasks"]) || !Array.isArray(parsed.value.tasks) || parsed.value.tasks.length === 0)
@@ -59,6 +483,30 @@ function parseDelegationPlanResult(output) {
59
483
  }
60
484
  return { tasks };
61
485
  }
486
+ var COUNCIL_BALLOT_VERDICT_MAX_BYTES = 64;
487
+ var COUNCIL_BALLOT_SHAPE = '{"verdict":"yes","text":"the answer and the evidence behind it"}';
488
+ function parseCouncilBallot(output) {
489
+ const parsed = parseJson(output);
490
+ if (!parsed.ok) return null;
491
+ const value = parsed.value;
492
+ if (!hasOnlyKeys(value, ["verdict", "text"]) || !string(value.verdict) || !string(value.text)) return null;
493
+ const verdict = value.verdict.trim();
494
+ if (verdict.includes("\n") || Buffer.byteLength(verdict, "utf8") > COUNCIL_BALLOT_VERDICT_MAX_BYTES) return null;
495
+ return { verdict, text: value.text.trim() };
496
+ }
497
+ function validateCouncilBallot(contract, output) {
498
+ const parsed = parseJson(output);
499
+ if (!parsed.ok) return failure(contract, "unmeasured", parsed.reason);
500
+ const ballot = parseCouncilBallot(output);
501
+ if (ballot === null) {
502
+ return failure(
503
+ contract,
504
+ "unmeasured",
505
+ `A council ballot must carry only verdict and text, both non-empty strings, with verdict a single line of at most ${COUNCIL_BALLOT_VERDICT_MAX_BYTES} bytes so the tally can match it against the other members`
506
+ );
507
+ }
508
+ return success(contract, "unmeasured", ballot);
509
+ }
62
510
  function parseCouncilReport(output) {
63
511
  if (output === null) return null;
64
512
  const parsed = parseJsonObjectPayload(output);
@@ -131,7 +579,7 @@ function canonical(value) {
131
579
  throw new Error(`result contract cannot digest ${typeof value}`);
132
580
  }
133
581
  function digest(value) {
134
- return createHash("sha256").update(canonical(value), "utf8").digest("hex");
582
+ return createHash2("sha256").update(canonical(value), "utf8").digest("hex");
135
583
  }
136
584
  function resultContractDigest(contract) {
137
585
  return digest(contract);
@@ -335,10 +783,10 @@ function parseChecks(value) {
335
783
  return checks;
336
784
  }
337
785
  function validateScoutCitation(input, citation) {
338
- const cwd = path.resolve(input.cwd);
339
- const citedPath = path.resolve(cwd, citation.path);
340
- const relative = path.relative(cwd, citedPath);
341
- if (relative === "" || relative.startsWith(`..${path.sep}`) || relative === ".." || path.isAbsolute(relative)) {
786
+ const cwd = path2.resolve(input.cwd);
787
+ const citedPath = path2.resolve(cwd, citation.path);
788
+ const relative = path2.relative(cwd, citedPath);
789
+ if (relative === "" || relative.startsWith(`..${path2.sep}`) || relative === ".." || path2.isAbsolute(relative)) {
342
790
  return { ok: false, reason: `Scout citation path escapes the workspace: ${citation.path}` };
343
791
  }
344
792
  const content = input.filesystem.readFile(citedPath);
@@ -359,7 +807,7 @@ function validateScoutCitation(input, citation) {
359
807
  }
360
808
  return {
361
809
  ok: true,
362
- evidence: { ...citation, contentDigest: createHash("sha256").update(content, "utf8").digest("hex") }
810
+ evidence: { ...citation, contentDigest: createHash2("sha256").update(content, "utf8").digest("hex") }
363
811
  };
364
812
  }
365
813
  function validateScoutCitations(input, citations) {
@@ -534,7 +982,7 @@ function validateResearch(contract, output, networkAllowed) {
534
982
  }
535
983
  function describeWriteSet(effects, cwd) {
536
984
  if (effects.mutatedPaths.size === 0) return "this run wrote nothing";
537
- const written = [...effects.mutatedPaths].map((target) => path.relative(cwd, target) || target).sort().slice(0, MUTATION_WRITE_SET_REASON_LIMIT);
985
+ const written = [...effects.mutatedPaths].map((target) => path2.relative(cwd, target) || target).sort().slice(0, MUTATION_WRITE_SET_REASON_LIMIT);
538
986
  const more = effects.mutatedPaths.size - written.length;
539
987
  return `this run wrote ${written.join(", ")}${more > 0 ? ` (+${more} more)` : ""}`;
540
988
  }
@@ -565,10 +1013,10 @@ function validateMutation(contract, input) {
565
1013
  const reportedFailure = !validations.every((check) => check.passed);
566
1014
  const effects = input.observedRunEffects;
567
1015
  if (effects === void 0) return success(contract, reportedFailure ? "fail" : "pass", value);
568
- const cwd = path.resolve(input.cwd);
1016
+ const cwd = path2.resolve(input.cwd);
569
1017
  let unverifiedMutation = false;
570
1018
  for (const reported of value.mutatedPaths) {
571
- const target = path.resolve(cwd, reported);
1019
+ const target = path2.resolve(cwd, reported);
572
1020
  if (effects.mutatedPaths.has(target)) continue;
573
1021
  if (effects.failedMutationPaths.has(target)) {
574
1022
  return failure(
@@ -607,14 +1055,14 @@ function validateProvenance(contract, output) {
607
1055
  return success(contract, "unmeasured", value);
608
1056
  }
609
1057
  function validateArchitect(contract, input) {
610
- const artifactPath = path.resolve(input.cwd, contract.path);
1058
+ const artifactPath = path2.resolve(input.cwd, contract.path);
611
1059
  const content = input.filesystem.readFile(artifactPath);
612
1060
  if (content === null || content.trim().length === 0) {
613
1061
  return failure(contract, "unmeasured", `required plan artifact is missing or empty: ${contract.path}`);
614
1062
  }
615
1063
  return success(contract, "unmeasured", {
616
1064
  path: contract.path,
617
- artifactDigest: createHash("sha256").update(content, "utf8").digest("hex")
1065
+ artifactDigest: createHash2("sha256").update(content, "utf8").digest("hex")
618
1066
  });
619
1067
  }
620
1068
  function parseScoutResult(output) {
@@ -647,6 +1095,8 @@ function validateResultContract(input) {
647
1095
  const report = parseCouncilReport(input.output);
648
1096
  return report === null ? failure(input.contract, "fail", "council-report is malformed") : success(input.contract, "unmeasured", { council: report });
649
1097
  }
1098
+ case "council-ballot":
1099
+ return validateCouncilBallot(input.contract, input.output);
650
1100
  case "debugger-report":
651
1101
  return validateDebugger(input.contract, input.output);
652
1102
  case "research-report":
@@ -719,6 +1169,8 @@ function resultContractShape(contract) {
719
1169
  return '{"verdict":"pass","checks":[{"name":"npm run typecheck","passed":true,"evidence":"exit 0"}]}';
720
1170
  case "council-report":
721
1171
  return '{"members":[{"label":"alpha","runId":"run-1","round":1,"answer":"..."}],"synthesis":{"kind":"none"}}';
1172
+ case "council-ballot":
1173
+ return COUNCIL_BALLOT_SHAPE;
722
1174
  case "debugger-report":
723
1175
  return '{"diagnosis":"...","reproduction":"reproduced","evidence":["..."]}';
724
1176
  case "research-report":
@@ -789,7 +1241,22 @@ function resultContractRepairMessages(input, origin) {
789
1241
  }
790
1242
  ];
791
1243
  }
792
- function parseResultContract(value, sourcePath) {
1244
+ var RECIPE_DECLARABLE_KINDS = [
1245
+ "scout-report",
1246
+ "verifier-report",
1247
+ "council-report",
1248
+ "debugger-report",
1249
+ "research-report",
1250
+ "mutation-report",
1251
+ "provenance-report",
1252
+ "oracle-report",
1253
+ "external-delegation",
1254
+ "artifact-report",
1255
+ "context-handbook",
1256
+ "delegation-plan"
1257
+ ];
1258
+ var COORDINATOR_AUTHORED_KINDS = ["council-ballot"];
1259
+ function parseContract(value, sourcePath, kinds) {
793
1260
  if (value === null || typeof value !== "object" || Array.isArray(value)) {
794
1261
  throw new Error(`agent recipe: ${sourcePath}: resultContract must be an object`);
795
1262
  }
@@ -801,33 +1268,113 @@ function parseResultContract(value, sourcePath) {
801
1268
  if (!only("kind", "path") || !string(record.path)) {
802
1269
  throw new Error(`agent recipe: ${sourcePath}: architect-plan requires only non-empty path`);
803
1270
  }
804
- if (path.isAbsolute(record.path) || record.path.split(/[\\/]/u).includes("..")) {
1271
+ if (path2.isAbsolute(record.path) || record.path.split(/[\\/]/u).includes("..")) {
805
1272
  throw new Error(`agent recipe: ${sourcePath}: architect-plan path must be workspace-relative`);
806
1273
  }
807
1274
  return { kind: "architect-plan", path: record.path };
808
1275
  }
809
- const kinds = [
810
- "scout-report",
811
- "verifier-report",
812
- "council-report",
813
- "debugger-report",
814
- "research-report",
815
- "mutation-report",
816
- "provenance-report",
817
- "oracle-report",
818
- "external-delegation",
819
- "artifact-report",
820
- "context-handbook",
821
- "delegation-plan"
822
- ];
823
1276
  if (!kinds.includes(record.kind) || !only("kind")) {
824
1277
  throw new Error(`agent recipe: ${sourcePath}: resultContract.kind is unsupported or has unknown keys`);
825
1278
  }
826
1279
  return { kind: record.kind };
827
1280
  }
1281
+ function parseResultContract(value, sourcePath) {
1282
+ return parseContract(value, sourcePath, RECIPE_DECLARABLE_KINDS);
1283
+ }
1284
+ function parseWorkerResultContract(value, sourcePath) {
1285
+ return parseContract(value, sourcePath, [...RECIPE_DECLARABLE_KINDS, ...COORDINATOR_AUTHORED_KINDS]);
1286
+ }
1287
+
1288
+ // src/core/path-boundary.ts
1289
+ init_esm_shims();
1290
+ import path3 from "node:path";
1291
+ var PATH_BOUNDARY_MAX_ENTRIES = 32;
1292
+ var PathBoundaryError = class extends Error {
1293
+ code;
1294
+ constructor(code, message) {
1295
+ super(message);
1296
+ this.name = "PathBoundaryError";
1297
+ this.code = code;
1298
+ }
1299
+ };
1300
+ var GLOB_CHARACTERS = /[*?[\]{}]/u;
1301
+ function normalizePathBoundaryEntry(entry) {
1302
+ const raw = entry.trim();
1303
+ if (raw.length === 0) throw new PathBoundaryError("empty", "write boundary: entry must be a non-empty path");
1304
+ if (raw.includes("\\")) {
1305
+ throw new PathBoundaryError("separator", `write boundary: entry '${entry}' must use '/' separators`);
1306
+ }
1307
+ if (GLOB_CHARACTERS.test(raw)) {
1308
+ throw new PathBoundaryError("glob", `write boundary: entry '${entry}' looks like a glob, which v1 does not support`);
1309
+ }
1310
+ if (raw.startsWith("/") || /^[A-Za-z]:/u.test(raw)) {
1311
+ throw new PathBoundaryError("absolute", `write boundary: entry '${entry}' must be repository-relative, not absolute`);
1312
+ }
1313
+ const subtree = raw.endsWith("/");
1314
+ const segments = raw.split("/").filter((segment) => segment.length > 0);
1315
+ if (segments.length === 0) {
1316
+ throw new PathBoundaryError("empty", `write boundary: entry '${entry}' must name a path inside the repository`);
1317
+ }
1318
+ for (const segment of segments) {
1319
+ if (segment === "..") {
1320
+ throw new PathBoundaryError("parent", `write boundary: entry '${entry}' must not contain '..'`);
1321
+ }
1322
+ if (segment === ".") {
1323
+ throw new PathBoundaryError("dot", `write boundary: entry '${entry}' must not contain '.' segments`);
1324
+ }
1325
+ }
1326
+ const joined = segments.join("/");
1327
+ return subtree ? `${joined}/` : joined;
1328
+ }
1329
+ function normalizePathBoundary(entries) {
1330
+ if (entries.length > PATH_BOUNDARY_MAX_ENTRIES) {
1331
+ throw new Error(`write boundary: at most ${PATH_BOUNDARY_MAX_ENTRIES} entries may be declared`);
1332
+ }
1333
+ return [...new Set(entries.map(normalizePathBoundaryEntry))].sort();
1334
+ }
1335
+ function toPosixBoundaryPath(value) {
1336
+ return value.split("\\").join("/");
1337
+ }
1338
+ function isDirectoryPathBoundary(entry) {
1339
+ return toPosixBoundaryPath(entry).endsWith("/");
1340
+ }
1341
+ function asDirectoryPathBoundary(entry) {
1342
+ const normalized = toPosixBoundaryPath(entry);
1343
+ return normalized.endsWith("/") ? normalized : `${normalized}/`;
1344
+ }
1345
+ function resolvePathBoundary(cwd, entry) {
1346
+ const directory = isDirectoryPathBoundary(entry);
1347
+ const withoutMarker = directory ? entry.slice(0, -1) : entry;
1348
+ const resolved = toPosixBoundaryPath(path3.resolve(cwd, withoutMarker));
1349
+ return directory ? asDirectoryPathBoundary(resolved) : resolved;
1350
+ }
1351
+ function pathBoundaryEntryCovers(outer, inner) {
1352
+ const normalizedOuter = toPosixBoundaryPath(outer);
1353
+ const normalizedInner = toPosixBoundaryPath(inner);
1354
+ return normalizedOuter.endsWith("/") ? normalizedInner.startsWith(normalizedOuter) : !normalizedInner.endsWith("/") && normalizedInner === normalizedOuter;
1355
+ }
1356
+ function pathBoundaryCovers(boundary, candidate) {
1357
+ return boundary.some((entry) => pathBoundaryEntryCovers(entry, candidate));
1358
+ }
828
1359
 
829
1360
  export {
830
1361
  parseJsonObjectPayload,
1362
+ classify,
1363
+ AGENT_AUTOMATION_AUTHORITIES,
1364
+ isAgentCategory,
1365
+ isAgentCapabilityClass,
1366
+ isAgentLatencyClass,
1367
+ isAgentAudience,
1368
+ isAgentProjectContextTier,
1369
+ isAgentProduct,
1370
+ resolveAgentToolCompatibility,
1371
+ normalizeAgentSpec,
1372
+ agentSpecFingerprint,
1373
+ isUserVisibleAgent,
1374
+ isShadowAgent,
1375
+ assertAgentSpecPolicy,
1376
+ COUNCIL_BALLOT_VERDICT_MAX_BYTES,
1377
+ COUNCIL_BALLOT_SHAPE,
831
1378
  parseCouncilReport,
832
1379
  resultContractSourceId,
833
1380
  parseVerifierResult,
@@ -838,6 +1385,15 @@ export {
838
1385
  validateRecipeResult,
839
1386
  RESULT_CONTRACT_REPAIR_LIMIT,
840
1387
  resultContractRepairMessages,
841
- parseResultContract
1388
+ parseResultContract,
1389
+ parseWorkerResultContract,
1390
+ PATH_BOUNDARY_MAX_ENTRIES,
1391
+ PathBoundaryError,
1392
+ normalizePathBoundaryEntry,
1393
+ normalizePathBoundary,
1394
+ asDirectoryPathBoundary,
1395
+ resolvePathBoundary,
1396
+ pathBoundaryEntryCovers,
1397
+ pathBoundaryCovers
842
1398
  };
843
- //# sourceMappingURL=chunk-DJNLUABN.js.map
1399
+ //# sourceMappingURL=chunk-S4COXYBG.js.map