@iowarp/clio-coder 0.3.8 → 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 (333) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +7 -3
  3. package/dist/{acp-U67UHUK2.js → acp-7LOELQFP.js} +6 -6
  4. package/dist/{agents-YU6SGALZ.js → agents-FIBG2SHA.js} +27 -25
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-5ZPJOIVG.js → auth-OI4LIH2I.js} +11 -12
  7. package/dist/{builtins-C6JMZVV6.js → builtins-AD25UL3C.js} +5 -5
  8. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  9. package/dist/chunk-3DPEIQKN.js +113 -0
  10. package/dist/{chunk-4SPRNWDE.js → chunk-3DUR4WUA.js} +15 -15
  11. package/dist/{chunk-VHN4MY6O.js → chunk-3MRC2YSQ.js} +2 -2
  12. package/dist/{chunk-5DHKRSMQ.js → chunk-3UUY7R3Z.js} +11 -7
  13. package/dist/{chunk-IGWKHNIQ.js → chunk-3V5AYSEQ.js} +8 -8
  14. package/dist/{chunk-FHJEP5SW.js → chunk-465CC7FK.js} +8 -5
  15. package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
  16. package/dist/{chunk-A3WNZD3P.js → chunk-4H6ULJ3H.js} +67 -21
  17. package/dist/{chunk-TB5666IT.js → chunk-4LJX2PUC.js} +3 -3
  18. package/dist/{chunk-XWSF374K.js → chunk-56KB5IJP.js} +2 -2
  19. package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
  20. package/dist/{chunk-2HEJ2F35.js → chunk-5HFBWUMU.js} +20 -8
  21. package/dist/{chunk-WNIJTQQK.js → chunk-5PVQ4SRS.js} +78 -6
  22. package/dist/{chunk-DYIM5TJT.js → chunk-5QKCQQ3E.js} +262 -6
  23. package/dist/{chunk-TYPGUK6W.js → chunk-5T7RBWN2.js} +111 -5
  24. package/dist/{chunk-IIZWH4XA.js → chunk-774ILSRL.js} +2 -2
  25. package/dist/chunk-7C6RYZGQ.js +391 -0
  26. package/dist/{chunk-TANS5ZJS.js → chunk-AD7Y7STJ.js} +3 -3
  27. package/dist/{chunk-RWSI4YD7.js → chunk-AEYBF3TB.js} +33 -12
  28. package/dist/{chunk-DGSYXYMX.js → chunk-AMKHQW3C.js} +2 -2
  29. package/dist/{chunk-VWZOAB7K.js → chunk-B5XRQOLB.js} +7 -7
  30. package/dist/{chunk-WXY7KU3G.js → chunk-BVDVID7E.js} +2 -2
  31. package/dist/{chunk-PMDBGQSJ.js → chunk-CA42X6KT.js} +2 -2
  32. package/dist/{chunk-HLE42MG7.js → chunk-D73KXYPF.js} +3 -3
  33. package/dist/{chunk-5Q2VVUKB.js → chunk-DG4M6ZUE.js} +3 -3
  34. package/dist/{chunk-ME6CCNFO.js → chunk-EBOC7MT3.js} +6 -6
  35. package/dist/{chunk-MXKJU4JB.js → chunk-ECUO3KDP.js} +48 -7
  36. package/dist/{chunk-26LEYJZH.js → chunk-FALJGAWU.js} +2 -2
  37. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  38. package/dist/{chunk-7RGZWPB6.js → chunk-GAYUJ7LE.js} +67 -13
  39. package/dist/{chunk-VCBR6CU7.js → chunk-HAY4ZE2P.js} +2 -2
  40. package/dist/{chunk-FBVTI2TJ.js → chunk-HCBCAYZU.js} +11 -130
  41. package/dist/{chunk-WSB3FPX7.js → chunk-HJB5IUKP.js} +32 -136
  42. package/dist/{chunk-J3YUBZWY.js → chunk-HKO36JWF.js} +33 -5
  43. package/dist/{chunk-E77JEWSD.js → chunk-HPCTNZM2.js} +6 -36
  44. package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
  45. package/dist/{chunk-NMPKI6XL.js → chunk-JEQQR47K.js} +37 -18
  46. package/dist/{chunk-3BINW3FP.js → chunk-KV2AOLDF.js} +24 -4
  47. package/dist/{chunk-YS5VLNH5.js → chunk-LXPJXFM5.js} +7 -7
  48. package/dist/{chunk-7RFXX52T.js → chunk-MIX5N5AC.js} +271 -41
  49. package/dist/{chunk-K4XHGFR5.js → chunk-MLOK6ZOS.js} +1297 -218
  50. package/dist/{chunk-ZNLWCMVZ.js → chunk-MV2VUEJC.js} +2 -2
  51. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  52. package/dist/{chunk-5H3GB5BO.js → chunk-N3PBVRTZ.js} +4 -382
  53. package/dist/{chunk-2HFZQUHL.js → chunk-N5XKWMDW.js} +17 -7
  54. package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
  55. package/dist/{chunk-GU2UIAFZ.js → chunk-NQ6UCCOD.js} +3 -3
  56. package/dist/{chunk-N22QMJKY.js → chunk-NZU6YDNV.js} +4 -4
  57. package/dist/{chunk-ZVJ5BLO2.js → chunk-O6I4CIEU.js} +151 -13
  58. package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
  59. package/dist/{chunk-VAWNZU7Z.js → chunk-P3JGPQFL.js} +2 -2
  60. package/dist/{chunk-IJ7RPIYJ.js → chunk-PNY46YEY.js} +20 -3
  61. package/dist/{chunk-U6MBIEMB.js → chunk-PZ4I4JE2.js} +56 -35
  62. package/dist/{chunk-GPIEI3LY.js → chunk-QQ7EKM72.js} +2 -2
  63. package/dist/{chunk-WLFILSD5.js → chunk-R7LNVMCS.js} +66 -28
  64. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  65. package/dist/chunk-RKKLTLYB.js +45 -0
  66. package/dist/{chunk-TT36MB5S.js → chunk-RKRLDWD3.js} +3 -1
  67. package/dist/{chunk-TTHACPOM.js → chunk-S4COXYBG.js} +456 -18
  68. package/dist/{chunk-WWCZ5F23.js → chunk-T3Z6VAAF.js} +69 -10
  69. package/dist/{chunk-GN57SG4G.js → chunk-TD7UE2L5.js} +9 -7
  70. package/dist/{chunk-TLQJPP24.js → chunk-TEO2TLVN.js} +523 -322
  71. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  72. package/dist/{chunk-KTYTFRMB.js → chunk-VKBMFOYV.js} +17 -15
  73. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  74. package/dist/{chunk-P43ETTHK.js → chunk-VPTUJU4P.js} +2 -2
  75. package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
  76. package/dist/{chunk-EMYUUSFG.js → chunk-WXCJ7VME.js} +5 -5
  77. package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
  78. package/dist/{chunk-JOZYP4GM.js → chunk-YKOFT37S.js} +5 -5
  79. package/dist/chunk-YSEHGPCT.js +127 -0
  80. package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
  81. package/dist/cli/index.js +27 -27
  82. package/dist/{clio-QVTYJ57A.js → clio-LT5V7SSZ.js} +6 -6
  83. package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +4 -4
  84. package/dist/{config-LW5IJFQN.js → config-RXS5T3JT.js} +71 -43
  85. package/dist/{configure-7XIZCOU4.js → configure-2WYWSCSD.js} +14 -15
  86. package/dist/{context-Y6Y7QPR6.js → context-I3BTOTCS.js} +12 -12
  87. package/dist/{context-L3WL3X7K.js → context-MVOORGMF.js} +34 -33
  88. package/dist/{context-N52ZA626.js → context-PALKKQYL.js} +20 -20
  89. package/dist/{context-clear-MBQRLSDQ.js → context-clear-N2WOYZ2K.js} +34 -33
  90. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  91. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-MIEVECVZ.js} +10 -11
  92. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-VVA4SRRH.js} +34 -33
  93. package/dist/doctor-TWBWFK5V.js +165 -0
  94. package/dist/{eval-BEC2WHDA.js → eval-IJ5VEZDJ.js} +2016 -142
  95. package/dist/{evidence-REJUMSKM.js → evidence-L5APPXNV.js} +29 -28
  96. package/dist/{evolve-PY5ZBA5K.js → evolve-RGNKFJ52.js} +29 -28
  97. package/dist/{extensions-HVKU65YU.js → extensions-7WYWUX5A.js} +9 -3
  98. package/dist/{fleet-7WZEWRFA.js → fleet-6CNVBZZP.js} +87 -55
  99. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-L2SXSYEI.js} +6 -6
  100. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-2J3OOIPO.js} +14 -12
  101. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-CZRJ4JP5.js} +3 -4
  102. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-C5RI6DP7.js} +16 -15
  103. package/dist/{init-OG3TPGQG.js → init-VBN2ACVA.js} +50 -48
  104. package/dist/{library-CNTMPLRF.js → library-JHGUMLY2.js} +13 -11
  105. package/dist/{memory-6IS7F275.js → memory-K4OQIYWG.js} +31 -30
  106. package/dist/{models-ENRJDA5W.js → models-2NCZUWDD.js} +23 -22
  107. package/dist/{monitor-XLDVO7TN.js → monitor-MMVTJABD.js} +35 -34
  108. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-ZKBPCHW6.js} +1627 -294
  109. package/dist/{reset-RZ4ER727.js → reset-DD5JGOY3.js} +3 -3
  110. package/dist/{run-Y2CNK5RU.js → run-QEGNX7FL.js} +56 -55
  111. package/dist/{share-A55GYP6Z.js → share-JKD3BQMW.js} +13 -11
  112. package/dist/{skills-ALC5J6AT.js → skills-LMQIKDOZ.js} +14 -12
  113. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-I7X2774U.js} +34 -32
  114. package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
  115. package/dist/{support-MIETYA5E.js → support-I7LOJLIF.js} +4 -4
  116. package/dist/{targets-VGNXIR3S.js → targets-RUSR6B5Z.js} +58 -32
  117. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-QYVORFR4.js} +6 -4
  118. package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
  119. package/dist/{upgrade-FUSUAGHR.js → upgrade-XANW3FXB.js} +17 -16
  120. package/dist/{usage-N4MKVHKD.js → usage-4H7ZRXQT.js} +88 -44
  121. package/dist/{verifiers-YAWOJ3H2.js → verifiers-UZXNBZEB.js} +6 -6
  122. package/dist/{verify-LTDHYBGY.js → verify-BVKWTNDL.js} +5 -5
  123. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-MY7WV2QI.js} +49 -47
  124. package/dist/worker/entry.js +29 -33
  125. package/docs/alcf-provider.md +1 -1
  126. package/docs/architecture.md +1 -1
  127. package/docs/artifact-versions.md +6 -1
  128. package/docs/built-in-agents.md +1 -1
  129. package/docs/capacity-and-scheduling.md +23 -2
  130. package/docs/commands-and-modes.md +1 -1
  131. package/docs/configuration-and-targets.md +30 -3
  132. package/docs/context-engine.md +63 -4
  133. package/docs/documentation-coverage.md +3 -3
  134. package/docs/documentation-guide.md +1 -1
  135. package/docs/environment-variables.md +2 -0
  136. package/docs/eval-runner.md +262 -11
  137. package/docs/evals-internal.md +72 -2
  138. package/docs/evidence-and-memory.md +11 -10
  139. package/docs/evolution.md +1 -1
  140. package/docs/extensions-and-sharing.md +3 -1
  141. package/docs/fleet-dispatch.md +4 -4
  142. package/docs/installation-and-lifecycle.md +1 -1
  143. package/docs/middleware-and-components.md +1 -1
  144. package/docs/model-catalog.md +1 -1
  145. package/docs/observability.md +53 -2
  146. package/docs/proactive-memory.md +127 -14
  147. package/docs/prompt-envelope-and-tools.md +19 -1
  148. package/docs/provider-adapter-cookbook.md +1 -1
  149. package/docs/release-cut-checklist.md +19 -3
  150. package/docs/safety-model.md +1 -1
  151. package/docs/scientific-validation.md +1 -1
  152. package/docs/skills-marketplace.md +1 -1
  153. package/docs/tool-usage.md +1 -1
  154. package/docs/trace-store.md +1 -1
  155. package/docs/troubleshooting.md +87 -0
  156. package/docs/tui-design.md +1 -1
  157. package/docs/worker-dispatch-mechanics.md +1 -1
  158. package/package.json +2 -1
  159. package/src/cli/agents.ts +1 -1
  160. package/src/cli/config-inspect.ts +33 -6
  161. package/src/cli/config.ts +1 -1
  162. package/src/cli/doctor-state-size.ts +82 -0
  163. package/src/cli/doctor.ts +3 -1
  164. package/src/cli/eval.ts +80 -16
  165. package/src/cli/extensions.ts +5 -1
  166. package/src/cli/fleet.ts +32 -3
  167. package/src/cli/targets.ts +44 -13
  168. package/src/cli/trace.ts +63 -4
  169. package/src/cli/usage.ts +63 -14
  170. package/src/core/bus-events.ts +29 -1
  171. package/src/core/cache-telemetry.ts +42 -0
  172. package/src/core/config.ts +18 -0
  173. package/src/core/defaults.ts +36 -6
  174. package/src/core/endpoint-key.ts +27 -0
  175. package/src/core/residency-target-key.ts +25 -0
  176. package/src/core/response-schema.ts +36 -2
  177. package/src/domains/config/classify.ts +3 -0
  178. package/src/domains/context/codewiki/coordinator.ts +12 -4
  179. package/src/domains/dispatch/admission.ts +40 -3
  180. package/src/domains/dispatch/capacity-lease.ts +98 -9
  181. package/src/domains/dispatch/contract.ts +11 -0
  182. package/src/domains/dispatch/execution-plan.ts +44 -4
  183. package/src/domains/dispatch/extension.ts +166 -42
  184. package/src/domains/dispatch/fleet-run.ts +23 -3
  185. package/src/domains/dispatch/heartbeat.ts +32 -8
  186. package/src/domains/dispatch/index.ts +3 -0
  187. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  188. package/src/domains/dispatch/reservation-store.ts +116 -8
  189. package/src/domains/dispatch/state.ts +4 -0
  190. package/src/domains/dispatch/worker-spawn.ts +25 -11
  191. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  192. package/src/domains/dispatch/write-boundary.ts +62 -1
  193. package/src/domains/eval/artifacts/store.ts +62 -0
  194. package/src/domains/eval/compare/behavioral.ts +224 -0
  195. package/src/domains/eval/compare/compare.ts +355 -2
  196. package/src/domains/eval/compare/envelope.ts +128 -0
  197. package/src/domains/eval/compare/gates.ts +24 -6
  198. package/src/domains/eval/compare/thresholds.ts +30 -3
  199. package/src/domains/eval/execution-provenance.ts +240 -0
  200. package/src/domains/eval/metrics/aggregate.ts +136 -0
  201. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  202. package/src/domains/eval/metrics/tracked.ts +413 -0
  203. package/src/domains/eval/provenance.ts +117 -0
  204. package/src/domains/eval/reports/comparison.ts +128 -0
  205. package/src/domains/eval/reports/junit.ts +17 -3
  206. package/src/domains/eval/reports/markdown.ts +3 -3
  207. package/src/domains/eval/reports/text.ts +14 -0
  208. package/src/domains/eval/run-compare.ts +20 -0
  209. package/src/domains/eval/runners/clio-run.ts +127 -0
  210. package/src/domains/eval/runners/external-command.ts +28 -3
  211. package/src/domains/eval/schema/adapter.ts +111 -0
  212. package/src/domains/eval/schema/artifact.ts +20 -0
  213. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  214. package/src/domains/eval/schema/behavioral.ts +520 -0
  215. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  216. package/src/domains/eval/schema/serving.ts +74 -0
  217. package/src/domains/eval/schema/suite.ts +38 -8
  218. package/src/domains/eval/schema/validate.ts +58 -3
  219. package/src/domains/eval/schema/verdict.ts +237 -0
  220. package/src/domains/eval/suites/resolve.ts +2 -0
  221. package/src/domains/eval/suites/run.ts +264 -33
  222. package/src/domains/eval/verifiers/command.ts +2 -1
  223. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  224. package/src/domains/evidence/build.ts +2 -13
  225. package/src/domains/evidence/eval.ts +2 -12
  226. package/src/domains/evidence/findings-markdown.ts +33 -0
  227. package/src/domains/evidence/run-trust.ts +7 -113
  228. package/src/domains/evidence/trust-projection.ts +2 -2
  229. package/src/domains/extensions/compatibility.ts +285 -0
  230. package/src/domains/extensions/discovery.ts +38 -3
  231. package/src/domains/extensions/resources.ts +1 -1
  232. package/src/domains/extensions/state.ts +12 -3
  233. package/src/domains/extensions/types.ts +2 -0
  234. package/src/domains/lifecycle/doctor.ts +69 -1
  235. package/src/domains/memory/index.ts +14 -0
  236. package/src/domains/memory/task-bank-promotion.ts +64 -0
  237. package/src/domains/memory/task-memory-policy.ts +77 -8
  238. package/src/domains/memory/task-memory-spend.ts +131 -0
  239. package/src/domains/memory/task-memory-status.ts +7 -0
  240. package/src/domains/memory/task-memory-telemetry.ts +2 -0
  241. package/src/domains/middleware/index.ts +1 -0
  242. package/src/domains/middleware/memory-intervention.ts +69 -5
  243. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  244. package/src/domains/observability/background-memory-usage.ts +140 -0
  245. package/src/domains/observability/cost.ts +1 -1
  246. package/src/domains/observability/index.ts +7 -0
  247. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  248. package/src/domains/observability/trace-store.ts +192 -2
  249. package/src/domains/prompts/compiler.ts +100 -13
  250. package/src/domains/providers/endpoint-capacity.ts +96 -0
  251. package/src/domains/providers/index.ts +10 -0
  252. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  253. package/src/domains/providers/runtime-resolution.ts +8 -1
  254. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  255. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  256. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  257. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  258. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  259. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  260. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  261. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  262. package/src/domains/providers/types/capability-flags.ts +2 -0
  263. package/src/domains/providers/types/target-descriptor.ts +2 -0
  264. package/src/domains/resources/prompts/loader.ts +95 -33
  265. package/src/domains/safety/call-target.ts +52 -0
  266. package/src/domains/safety/run-effects.ts +35 -4
  267. package/src/domains/session/context-accounting.ts +52 -1
  268. package/src/domains/session/context-ledger.ts +37 -13
  269. package/src/domains/session/index.ts +6 -0
  270. package/src/domains/session/prompt-cache.ts +140 -0
  271. package/src/domains/session/prompt-manifest.ts +42 -0
  272. package/src/engine/acp/adapter.ts +18 -3
  273. package/src/engine/ai.ts +35 -0
  274. package/src/engine/apis/llamacpp-residency.ts +55 -3
  275. package/src/engine/apis/lmstudio.ts +25 -5
  276. package/src/engine/apis/ollama-native.ts +2 -1
  277. package/src/engine/apis/openai-completions.ts +80 -17
  278. package/src/engine/apis/residency-lock.ts +3 -1
  279. package/src/engine/apis/residency.ts +34 -1
  280. package/src/engine/provider-payload.ts +29 -1
  281. package/src/entry/orchestrator.ts +176 -30
  282. package/src/interactive/chat-loop-messages.ts +26 -7
  283. package/src/interactive/chat-loop.ts +318 -41
  284. package/src/interactive/chat-panel.ts +62 -8
  285. package/src/interactive/clio-editor.ts +45 -8
  286. package/src/interactive/context-activity.ts +5 -1
  287. package/src/interactive/context-meter.ts +1 -1
  288. package/src/interactive/context-overlay.ts +40 -10
  289. package/src/interactive/cost-overlay.ts +64 -6
  290. package/src/interactive/dispatch-board.ts +84 -12
  291. package/src/interactive/fleet-run-preview.ts +41 -15
  292. package/src/interactive/handoff-round.ts +41 -2
  293. package/src/interactive/interactive-application.ts +24 -1
  294. package/src/interactive/interactive-input-runtime.ts +8 -0
  295. package/src/interactive/interactive-presentation.ts +4 -0
  296. package/src/interactive/interactive-shell.ts +20 -17
  297. package/src/interactive/interactive-slash-runtime.ts +27 -4
  298. package/src/interactive/memory-overlay.ts +8 -0
  299. package/src/interactive/mutation-preview.ts +295 -0
  300. package/src/interactive/overlay-general-openers.ts +16 -0
  301. package/src/interactive/overlay-key-routing.ts +38 -0
  302. package/src/interactive/overlay-lifecycle.ts +38 -5
  303. package/src/interactive/overlay-permission-lifecycle.ts +22 -2
  304. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  305. package/src/interactive/overlays/ask-user.ts +91 -19
  306. package/src/interactive/overlays/help-reference.ts +4 -0
  307. package/src/interactive/overlays/prompts.ts +11 -1
  308. package/src/interactive/overlays/settings.ts +35 -1
  309. package/src/interactive/permission-hint.ts +34 -2
  310. package/src/interactive/permission-overlay.ts +159 -9
  311. package/src/interactive/prewarm.ts +197 -0
  312. package/src/interactive/render-trace.ts +162 -15
  313. package/src/interactive/renderers/tool-execution.ts +4 -0
  314. package/src/interactive/side-question.ts +58 -1
  315. package/src/interactive/status/controller.ts +11 -0
  316. package/src/interactive/status/state-machine.ts +54 -2
  317. package/src/interactive/status/types.ts +7 -0
  318. package/src/interactive/terminal-lease.ts +2 -0
  319. package/src/interactive/turn-context.ts +299 -31
  320. package/src/interactive/turn-persistence.ts +14 -4
  321. package/src/interactive/turn-prewarm.ts +364 -0
  322. package/src/interactive/turn-queues.ts +7 -4
  323. package/src/interactive/turn-runtime.ts +8 -1
  324. package/src/interactive/turn-state.ts +23 -0
  325. package/src/interactive/view/view-overlay.ts +28 -3
  326. package/src/tools/ask-user.ts +43 -2
  327. package/src/tools/dispatch-plan.ts +17 -9
  328. package/src/tools/dispatch-scout.ts +1 -1
  329. package/src/tools/registry.ts +16 -0
  330. package/dist/chunk-AOCYTWAV.js +0 -449
  331. package/dist/chunk-HWUFFB6L.js +0 -83
  332. package/dist/chunk-R346GLFC.js +0 -31
  333. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -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)
@@ -155,7 +579,7 @@ function canonical(value) {
155
579
  throw new Error(`result contract cannot digest ${typeof value}`);
156
580
  }
157
581
  function digest(value) {
158
- return createHash("sha256").update(canonical(value), "utf8").digest("hex");
582
+ return createHash2("sha256").update(canonical(value), "utf8").digest("hex");
159
583
  }
160
584
  function resultContractDigest(contract) {
161
585
  return digest(contract);
@@ -359,10 +783,10 @@ function parseChecks(value) {
359
783
  return checks;
360
784
  }
361
785
  function validateScoutCitation(input, citation) {
362
- const cwd = path.resolve(input.cwd);
363
- const citedPath = path.resolve(cwd, citation.path);
364
- const relative = path.relative(cwd, citedPath);
365
- 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)) {
366
790
  return { ok: false, reason: `Scout citation path escapes the workspace: ${citation.path}` };
367
791
  }
368
792
  const content = input.filesystem.readFile(citedPath);
@@ -383,7 +807,7 @@ function validateScoutCitation(input, citation) {
383
807
  }
384
808
  return {
385
809
  ok: true,
386
- evidence: { ...citation, contentDigest: createHash("sha256").update(content, "utf8").digest("hex") }
810
+ evidence: { ...citation, contentDigest: createHash2("sha256").update(content, "utf8").digest("hex") }
387
811
  };
388
812
  }
389
813
  function validateScoutCitations(input, citations) {
@@ -558,7 +982,7 @@ function validateResearch(contract, output, networkAllowed) {
558
982
  }
559
983
  function describeWriteSet(effects, cwd) {
560
984
  if (effects.mutatedPaths.size === 0) return "this run wrote nothing";
561
- 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);
562
986
  const more = effects.mutatedPaths.size - written.length;
563
987
  return `this run wrote ${written.join(", ")}${more > 0 ? ` (+${more} more)` : ""}`;
564
988
  }
@@ -589,10 +1013,10 @@ function validateMutation(contract, input) {
589
1013
  const reportedFailure = !validations.every((check) => check.passed);
590
1014
  const effects = input.observedRunEffects;
591
1015
  if (effects === void 0) return success(contract, reportedFailure ? "fail" : "pass", value);
592
- const cwd = path.resolve(input.cwd);
1016
+ const cwd = path2.resolve(input.cwd);
593
1017
  let unverifiedMutation = false;
594
1018
  for (const reported of value.mutatedPaths) {
595
- const target = path.resolve(cwd, reported);
1019
+ const target = path2.resolve(cwd, reported);
596
1020
  if (effects.mutatedPaths.has(target)) continue;
597
1021
  if (effects.failedMutationPaths.has(target)) {
598
1022
  return failure(
@@ -631,14 +1055,14 @@ function validateProvenance(contract, output) {
631
1055
  return success(contract, "unmeasured", value);
632
1056
  }
633
1057
  function validateArchitect(contract, input) {
634
- const artifactPath = path.resolve(input.cwd, contract.path);
1058
+ const artifactPath = path2.resolve(input.cwd, contract.path);
635
1059
  const content = input.filesystem.readFile(artifactPath);
636
1060
  if (content === null || content.trim().length === 0) {
637
1061
  return failure(contract, "unmeasured", `required plan artifact is missing or empty: ${contract.path}`);
638
1062
  }
639
1063
  return success(contract, "unmeasured", {
640
1064
  path: contract.path,
641
- artifactDigest: createHash("sha256").update(content, "utf8").digest("hex")
1065
+ artifactDigest: createHash2("sha256").update(content, "utf8").digest("hex")
642
1066
  });
643
1067
  }
644
1068
  function parseScoutResult(output) {
@@ -844,7 +1268,7 @@ function parseContract(value, sourcePath, kinds) {
844
1268
  if (!only("kind", "path") || !string(record.path)) {
845
1269
  throw new Error(`agent recipe: ${sourcePath}: architect-plan requires only non-empty path`);
846
1270
  }
847
- if (path.isAbsolute(record.path) || record.path.split(/[\\/]/u).includes("..")) {
1271
+ if (path2.isAbsolute(record.path) || record.path.split(/[\\/]/u).includes("..")) {
848
1272
  throw new Error(`agent recipe: ${sourcePath}: architect-plan path must be workspace-relative`);
849
1273
  }
850
1274
  return { kind: "architect-plan", path: record.path };
@@ -863,7 +1287,7 @@ function parseWorkerResultContract(value, sourcePath) {
863
1287
 
864
1288
  // src/core/path-boundary.ts
865
1289
  init_esm_shims();
866
- import path2 from "node:path";
1290
+ import path3 from "node:path";
867
1291
  var PATH_BOUNDARY_MAX_ENTRIES = 32;
868
1292
  var PathBoundaryError = class extends Error {
869
1293
  code;
@@ -921,7 +1345,7 @@ function asDirectoryPathBoundary(entry) {
921
1345
  function resolvePathBoundary(cwd, entry) {
922
1346
  const directory = isDirectoryPathBoundary(entry);
923
1347
  const withoutMarker = directory ? entry.slice(0, -1) : entry;
924
- const resolved = toPosixBoundaryPath(path2.resolve(cwd, withoutMarker));
1348
+ const resolved = toPosixBoundaryPath(path3.resolve(cwd, withoutMarker));
925
1349
  return directory ? asDirectoryPathBoundary(resolved) : resolved;
926
1350
  }
927
1351
  function pathBoundaryEntryCovers(outer, inner) {
@@ -935,6 +1359,20 @@ function pathBoundaryCovers(boundary, candidate) {
935
1359
 
936
1360
  export {
937
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,
938
1376
  COUNCIL_BALLOT_VERDICT_MAX_BYTES,
939
1377
  COUNCIL_BALLOT_SHAPE,
940
1378
  parseCouncilReport,
@@ -958,4 +1396,4 @@ export {
958
1396
  pathBoundaryEntryCovers,
959
1397
  pathBoundaryCovers
960
1398
  };
961
- //# sourceMappingURL=chunk-TTHACPOM.js.map
1399
+ //# sourceMappingURL=chunk-S4COXYBG.js.map