@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,4 +1,7 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ getVersionInfo
4
+ } from "./chunk-XPLRXC72.js";
2
5
  import {
3
6
  require_dist
4
7
  } from "./chunk-APJ265NV.js";
@@ -16,8 +19,222 @@ import {
16
19
  // src/domains/extensions/discovery.ts
17
20
  init_esm_shims();
18
21
  var import_yaml = __toESM(require_dist(), 1);
19
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
22
+ import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
20
23
  import path from "node:path";
24
+
25
+ // src/domains/extensions/compatibility.ts
26
+ init_esm_shims();
27
+ var MAX_RANGE_CHARS = 256;
28
+ var NUMERIC = "(?:0|[1-9]\\d*)";
29
+ var IDENTIFIER = "[0-9A-Za-z-]+";
30
+ var VERSION_RE = new RegExp(
31
+ `^v?(${NUMERIC})\\.(${NUMERIC})\\.(${NUMERIC})(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
32
+ );
33
+ var PARTIAL_RE = new RegExp(
34
+ `^v?(${NUMERIC}|[xX*])(?:\\.(${NUMERIC}|[xX*]))?(?:\\.(${NUMERIC}|[xX*]))?(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
35
+ );
36
+ function prerelease(value) {
37
+ if (value === void 0) return [];
38
+ const out = [];
39
+ for (const identifier of value.split(".")) {
40
+ if (identifier.length === 0) return null;
41
+ if (/^\d+$/u.test(identifier)) {
42
+ if (identifier.length > 1 && identifier.startsWith("0")) return null;
43
+ const parsed = Number(identifier);
44
+ if (!Number.isSafeInteger(parsed)) return null;
45
+ out.push(parsed);
46
+ } else {
47
+ out.push(identifier);
48
+ }
49
+ }
50
+ return out;
51
+ }
52
+ function parseSemVer(value) {
53
+ const match = VERSION_RE.exec(value);
54
+ if (match === null) return null;
55
+ const parsedPrerelease = prerelease(match[4]);
56
+ if (parsedPrerelease === null) return null;
57
+ const major = Number(match[1]);
58
+ const minor = Number(match[2]);
59
+ const patch = Number(match[3]);
60
+ if (![major, minor, patch].every(Number.isSafeInteger)) return null;
61
+ return { major, minor, patch, prerelease: parsedPrerelease };
62
+ }
63
+ function parsePart(value) {
64
+ if (value === void 0 || value === "x" || value === "X" || value === "*") return null;
65
+ const parsed = Number(value);
66
+ return Number.isSafeInteger(parsed) ? parsed : null;
67
+ }
68
+ function parsePartial(value) {
69
+ const match = PARTIAL_RE.exec(value);
70
+ if (match === null) return null;
71
+ for (const part of match.slice(1, 4)) {
72
+ if (part === void 0 || part === "x" || part === "X" || part === "*") continue;
73
+ if (!Number.isSafeInteger(Number(part))) return null;
74
+ }
75
+ const major = parsePart(match[1]);
76
+ const minor = parsePart(match[2]);
77
+ const patch = parsePart(match[3]);
78
+ if (major === null && (match[2] !== void 0 || match[3] !== void 0) || minor === null && match[3] !== void 0) {
79
+ return null;
80
+ }
81
+ const parsedPrerelease = prerelease(match[4]);
82
+ if (parsedPrerelease === null) return null;
83
+ if (parsedPrerelease.length > 0 && (major === null || minor === null || patch === null)) return null;
84
+ return { major, minor, patch, prerelease: parsedPrerelease };
85
+ }
86
+ function compareIdentifiers(left, right) {
87
+ if (left === right) return 0;
88
+ if (typeof left === "number" && typeof right === "number") return left < right ? -1 : 1;
89
+ if (typeof left === "number") return -1;
90
+ if (typeof right === "number") return 1;
91
+ return left < right ? -1 : 1;
92
+ }
93
+ function compare(left, right) {
94
+ for (const key of ["major", "minor", "patch"]) {
95
+ if (left[key] !== right[key]) return left[key] < right[key] ? -1 : 1;
96
+ }
97
+ if (left.prerelease.length === 0 || right.prerelease.length === 0) {
98
+ if (left.prerelease.length === right.prerelease.length) return 0;
99
+ return left.prerelease.length === 0 ? 1 : -1;
100
+ }
101
+ const length = Math.max(left.prerelease.length, right.prerelease.length);
102
+ for (let index = 0; index < length; index += 1) {
103
+ const leftPart = left.prerelease[index];
104
+ const rightPart = right.prerelease[index];
105
+ if (leftPart === void 0 || rightPart === void 0) {
106
+ if (leftPart === rightPart) return 0;
107
+ return leftPart === void 0 ? -1 : 1;
108
+ }
109
+ const order = compareIdentifiers(leftPart, rightPart);
110
+ if (order !== 0) return order;
111
+ }
112
+ return 0;
113
+ }
114
+ function floor(partial) {
115
+ return {
116
+ major: partial.major ?? 0,
117
+ minor: partial.minor ?? 0,
118
+ patch: partial.patch ?? 0,
119
+ prerelease: partial.prerelease
120
+ };
121
+ }
122
+ function nextWildcard(partial) {
123
+ if (partial.major === null) return null;
124
+ if (partial.minor === null) return { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] };
125
+ if (partial.patch === null) return { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
126
+ return null;
127
+ }
128
+ function lowerBound(version, inclusive) {
129
+ return (candidate) => inclusive ? compare(candidate, version) >= 0 : compare(candidate, version) > 0;
130
+ }
131
+ function upperBound(version, inclusive) {
132
+ return (candidate) => inclusive ? compare(candidate, version) <= 0 : compare(candidate, version) < 0;
133
+ }
134
+ function core(version) {
135
+ return `${version.major}.${version.minor}.${version.patch}`;
136
+ }
137
+ function predicatesForToken(token) {
138
+ const match = /^(<=|>=|<|>|=|~|\^)?(.+)$/u.exec(token);
139
+ if (match === null) return null;
140
+ const operator = match[1] ?? "";
141
+ const partial = parsePartial(match[2] ?? "");
142
+ if (partial === null) return null;
143
+ const base = floor(partial);
144
+ const wildcardUpper = nextWildcard(partial);
145
+ const prereleaseCore = partial.prerelease.length > 0 ? core(base) : null;
146
+ if (operator === "" || operator === "=") {
147
+ if (partial.major === null) return { predicates: [], prereleaseCore };
148
+ if (wildcardUpper !== null) {
149
+ return { predicates: [lowerBound(base, true), upperBound(wildcardUpper, false)], prereleaseCore };
150
+ }
151
+ return { predicates: [(candidate) => compare(candidate, base) === 0], prereleaseCore };
152
+ }
153
+ if (operator === ">=") return { predicates: [lowerBound(base, true)], prereleaseCore };
154
+ if (operator === "<") return { predicates: [upperBound(base, false)], prereleaseCore };
155
+ if (operator === ">") {
156
+ return {
157
+ predicates: [wildcardUpper === null ? lowerBound(base, false) : lowerBound(wildcardUpper, true)],
158
+ prereleaseCore
159
+ };
160
+ }
161
+ if (operator === "<=") {
162
+ return {
163
+ predicates: [wildcardUpper === null ? upperBound(base, true) : upperBound(wildcardUpper, false)],
164
+ prereleaseCore
165
+ };
166
+ }
167
+ if (partial.major === null) return { predicates: [], prereleaseCore };
168
+ if (operator === "~") {
169
+ const upper2 = partial.minor === null ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
170
+ return { predicates: [lowerBound(base, true), upperBound(upper2, false)], prereleaseCore };
171
+ }
172
+ const upper = partial.major > 0 ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : partial.minor === null ? { major: 1, minor: 0, patch: 0, prerelease: [] } : (partial.minor ?? 0) > 0 ? { major: 0, minor: (partial.minor ?? 0) + 1, patch: 0, prerelease: [] } : partial.patch === null ? { major: 0, minor: 1, patch: 0, prerelease: [] } : { major: 0, minor: 0, patch: (partial.patch ?? 0) + 1, prerelease: [] };
173
+ return { predicates: [lowerBound(base, true), upperBound(upper, false)], prereleaseCore };
174
+ }
175
+ function predicatesForSet(raw) {
176
+ const hyphen = /^(\S+)\s+-\s+(\S+)$/u.exec(raw);
177
+ if (hyphen !== null) {
178
+ const left = parsePartial(hyphen[1] ?? "");
179
+ const right = parsePartial(hyphen[2] ?? "");
180
+ if (left === null || right === null || left.major === null || right.major === null) return null;
181
+ const rightUpper = nextWildcard(right);
182
+ return {
183
+ predicates: [
184
+ lowerBound(floor(left), true),
185
+ rightUpper === null ? upperBound(floor(right), true) : upperBound(rightUpper, false)
186
+ ],
187
+ prereleaseCores: new Set(
188
+ [
189
+ left.prerelease.length > 0 ? core(floor(left)) : null,
190
+ right.prerelease.length > 0 ? core(floor(right)) : null
191
+ ].filter((entry) => entry !== null)
192
+ )
193
+ };
194
+ }
195
+ const normalized = raw.replace(/(<=|>=|<|>|=|~|\^)\s+/gu, "$1");
196
+ const tokens = normalized.split(/\s+/u).filter((entry) => entry.length > 0);
197
+ if (tokens.length === 0) return null;
198
+ const predicates = [];
199
+ const prereleaseCores = /* @__PURE__ */ new Set();
200
+ for (const token of tokens) {
201
+ const parsed = predicatesForToken(token);
202
+ if (parsed === null) return null;
203
+ predicates.push(...parsed.predicates);
204
+ if (parsed.prereleaseCore !== null) prereleaseCores.add(parsed.prereleaseCore);
205
+ }
206
+ return { predicates, prereleaseCores };
207
+ }
208
+ function parseRange(range) {
209
+ const trimmed = range.trim();
210
+ if (trimmed.length === 0 || trimmed.length > MAX_RANGE_CHARS) return null;
211
+ const sets = trimmed.split("||");
212
+ if (sets.some((set) => set.trim().length === 0)) return null;
213
+ const parsed = sets.map((set) => predicatesForSet(set.trim()));
214
+ return parsed.every((set) => set !== null) ? parsed : null;
215
+ }
216
+ function isValidSemVerRange(range) {
217
+ return parseRange(range) !== null;
218
+ }
219
+ function satisfiesSemVerRange(version, range) {
220
+ const candidate = parseSemVer(version);
221
+ const sets = parseRange(range);
222
+ if (candidate === null || sets === null) return false;
223
+ return sets.some((set) => {
224
+ if (candidate.prerelease.length > 0 && !set.prereleaseCores.has(core(candidate))) return false;
225
+ return set.predicates.every((predicate) => predicate(candidate));
226
+ });
227
+ }
228
+ function evaluateClioCompatibility(range, runningVersion = getVersionInfo().clio) {
229
+ const rangeValid = isValidSemVerRange(range);
230
+ return {
231
+ rangeValid,
232
+ satisfied: rangeValid && satisfiesSemVerRange(runningVersion, range),
233
+ runningVersion
234
+ };
235
+ }
236
+
237
+ // src/domains/extensions/discovery.ts
21
238
  var MANIFEST_NAMES = ["clio-coder-extension.yaml", "clio-coder-extension.yml", "clio-coder-extension.json"];
22
239
  function isRecord(value) {
23
240
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -44,12 +261,85 @@ function normalizeResources(value) {
44
261
  const out = {};
45
262
  const skills = trimString(value.skills);
46
263
  const prompts = trimString(value.prompts);
264
+ const agents = trimString(value.agents);
265
+ const fleets = trimString(value.fleets);
47
266
  const themes = trimString(value.themes);
48
267
  if (skills) out.skills = skills;
49
268
  if (prompts) out.prompts = prompts;
269
+ if (agents) out.agents = agents;
270
+ if (fleets) out.fleets = fleets;
50
271
  if (themes) out.themes = themes;
51
272
  return out;
52
273
  }
274
+ function contained(root, candidate) {
275
+ const relative = path.relative(root, candidate);
276
+ return relative === "" || !relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative);
277
+ }
278
+ function validateResourceTree(root, resourcePath, kind, diagnostics) {
279
+ if (path.isAbsolute(resourcePath)) {
280
+ diagnostics.push({ type: "error", message: `resources.${kind} must be relative`, path: resourcePath });
281
+ return;
282
+ }
283
+ const resolvedRoot = path.resolve(root);
284
+ const resolved = path.resolve(resolvedRoot, resourcePath);
285
+ if (!contained(resolvedRoot, resolved) || resolved === resolvedRoot) {
286
+ diagnostics.push({ type: "error", message: `resources.${kind} escapes the extension root`, path: resourcePath });
287
+ return;
288
+ }
289
+ let canonicalRoot;
290
+ let canonicalResource;
291
+ try {
292
+ canonicalRoot = realpathSync(resolvedRoot);
293
+ canonicalResource = realpathSync(resolved);
294
+ if (!lstatSync(resolved).isDirectory()) {
295
+ diagnostics.push({ type: "error", message: `resources.${kind} is not a directory`, path: resolved });
296
+ return;
297
+ }
298
+ } catch (error) {
299
+ diagnostics.push({
300
+ type: "error",
301
+ message: `resources.${kind} cannot be resolved: ${error instanceof Error ? error.message : String(error)}`,
302
+ path: resolved
303
+ });
304
+ return;
305
+ }
306
+ if (!contained(canonicalRoot, canonicalResource)) {
307
+ diagnostics.push({ type: "error", message: `resources.${kind} escapes through a symbolic link`, path: resolved });
308
+ return;
309
+ }
310
+ const pending = [resolved];
311
+ while (pending.length > 0) {
312
+ const directory = pending.pop();
313
+ if (!directory) continue;
314
+ for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
315
+ const candidate = path.join(directory, entry.name);
316
+ if (entry.isSymbolicLink()) {
317
+ try {
318
+ if (!contained(canonicalRoot, realpathSync(candidate))) {
319
+ diagnostics.push({
320
+ type: "error",
321
+ message: `resources.${kind} contains an escaping symbolic link`,
322
+ path: candidate
323
+ });
324
+ }
325
+ } catch (error) {
326
+ diagnostics.push({
327
+ type: "error",
328
+ message: `resources.${kind} contains an unresolved symbolic link: ${error instanceof Error ? error.message : String(error)}`,
329
+ path: candidate
330
+ });
331
+ }
332
+ } else if (entry.isDirectory()) {
333
+ pending.push(candidate);
334
+ }
335
+ }
336
+ }
337
+ }
338
+ function validateResourceRoots(root, resources, diagnostics) {
339
+ for (const [kind, resourcePath] of Object.entries(resources)) {
340
+ if (resourcePath) validateResourceTree(root, resourcePath, kind, diagnostics);
341
+ }
342
+ }
53
343
  function stringArray(value) {
54
344
  if (!Array.isArray(value)) return void 0;
55
345
  const out = value.map((entry) => trimString(entry)).filter((entry) => entry !== void 0);
@@ -77,7 +367,32 @@ function parseExtensionManifest(value, manifestPath) {
77
367
  const resources = normalizeResources(value.resources);
78
368
  const tools = stringArray(value.tools);
79
369
  const settings = stringArray(value.settings);
80
- const compatibility = isRecord(value.compatibility) ? { ...trimString(value.compatibility.clio) ? { clio: trimString(value.compatibility.clio) } : {} } : void 0;
370
+ let compatibility;
371
+ if (value.compatibility !== void 0) {
372
+ if (!isRecord(value.compatibility)) {
373
+ diagnostics.push({ type: "error", message: "compatibility must be an object", path: manifestPath });
374
+ } else if ("clio" in value.compatibility) {
375
+ const range = trimString(value.compatibility.clio);
376
+ if (range === void 0) {
377
+ diagnostics.push({
378
+ type: "error",
379
+ message: "compatibility.clio must be a non-empty semver range",
380
+ path: manifestPath
381
+ });
382
+ } else {
383
+ const evaluation = evaluateClioCompatibility(range);
384
+ if (!evaluation.rangeValid) {
385
+ diagnostics.push({
386
+ type: "error",
387
+ message: `extension ${id ?? "<unknown>"} declares malformed compatibility.clio range '${range}'`,
388
+ path: manifestPath
389
+ });
390
+ } else {
391
+ compatibility = { clio: range };
392
+ }
393
+ }
394
+ }
395
+ }
81
396
  if (!id || !name || !version || !description || diagnostics.some((diag) => diag.type === "error")) {
82
397
  return { diagnostics };
83
398
  }
@@ -92,6 +407,17 @@ function parseExtensionManifest(value, manifestPath) {
92
407
  if (tools) manifest.tools = tools;
93
408
  if (settings) manifest.settings = settings;
94
409
  if (compatibility && Object.keys(compatibility).length > 0) manifest.compatibility = compatibility;
410
+ const clioRange = manifest.compatibility?.clio;
411
+ if (clioRange !== void 0) {
412
+ const evaluation = evaluateClioCompatibility(clioRange);
413
+ if (!evaluation.satisfied) {
414
+ diagnostics.push({
415
+ type: "error",
416
+ message: `extension ${manifest.id} requires Clio '${clioRange}', but running Clio version is '${evaluation.runningVersion}'`,
417
+ path: manifestPath
418
+ });
419
+ }
420
+ }
95
421
  return { manifest, diagnostics };
96
422
  }
97
423
  function findExtensionManifestPath(root) {
@@ -115,6 +441,7 @@ function loadManifestFromRoot(root) {
115
441
  }
116
442
  try {
117
443
  const parsed = parseExtensionManifest(readJsonOrYaml(manifestPath), manifestPath);
444
+ if (parsed.manifest) validateResourceRoots(root, parsed.manifest.resources, parsed.diagnostics);
118
445
  return {
119
446
  path: root,
120
447
  manifestPath,
@@ -222,6 +549,8 @@ function installedFromRoot(root, scope, state) {
222
549
  const candidate = loadManifestFromRoot(root);
223
550
  const manifest = candidate.manifest;
224
551
  if (!manifest || !candidate.manifestPath) return null;
552
+ const clioRange = manifest.compatibility?.clio;
553
+ const compatible = clioRange === void 0 || evaluateClioCompatibility(clioRange).satisfied;
225
554
  return {
226
555
  id: manifest.id,
227
556
  name: manifest.name,
@@ -231,6 +560,7 @@ function installedFromRoot(root, scope, state) {
231
560
  rootPath: root,
232
561
  manifestPath: candidate.manifestPath,
233
562
  enabled: !state.disabled.includes(manifest.id),
563
+ compatible,
234
564
  effective: false,
235
565
  resources: manifest.resources,
236
566
  diagnostics: candidate.diagnostics
@@ -259,13 +589,13 @@ function listInstalledExtensions(cwd = process.cwd(), options = {}) {
259
589
  byId.set(entry.id, list);
260
590
  }
261
591
  for (const group of byId.values()) {
262
- const winner = [...group].sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope)).at(-1);
592
+ const winner = group.filter((entry) => entry.compatible).sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope)).at(-1);
263
593
  for (const entry of group) {
264
594
  entry.effective = entry === winner;
265
- if (!entry.effective && winner) entry.overriddenBy = winner.scope;
595
+ if (entry.compatible && !entry.effective && winner) entry.overriddenBy = winner.scope;
266
596
  }
267
597
  }
268
- const all = options.all === true ? entries : entries.filter((entry) => entry.effective);
598
+ const all = options.all === true ? entries : entries.filter((entry) => entry.effective || !entry.compatible);
269
599
  return all.sort((a, b) => {
270
600
  const id = a.id.localeCompare(b.id);
271
601
  if (id !== 0) return id;
@@ -284,7 +614,7 @@ function installExtension(sourcePath, options = {}) {
284
614
  const cwd = options.cwd ?? process.cwd();
285
615
  const source = path2.resolve(sourcePath);
286
616
  const candidate = loadManifestFromRoot(source);
287
- if (!candidate.manifest) return { diagnostics: candidate.diagnostics };
617
+ if (!candidate.manifest || !candidate.valid) return { diagnostics: candidate.diagnostics };
288
618
  const targetRoot = path2.join(extensionBaseDir(scope, cwd), candidate.manifest.id);
289
619
  if (existsSync2(targetRoot)) {
290
620
  if (!options.force) {
@@ -307,7 +637,11 @@ function installExtension(sourcePath, options = {}) {
307
637
  rmSync(backupRoot, { recursive: true, force: true });
308
638
  cpSync(source, stagingRoot, {
309
639
  recursive: true,
310
- filter: (src) => path2.basename(src) !== "state.json"
640
+ // `state.json` beside the installed extension directories belongs to
641
+ // Clio's extension manager. An extension may legitimately ship nested
642
+ // resources with the same basename (for example a project-state JSON
643
+ // template), so exclude only a bookkeeping file at the package root.
644
+ filter: (src) => path2.relative(source, src) !== "state.json"
311
645
  });
312
646
  if (existsSync2(targetRoot)) {
313
647
  renameSync(targetRoot, backupRoot);
@@ -379,32 +713,40 @@ init_esm_shims();
379
713
 
380
714
  // src/domains/extensions/resources.ts
381
715
  init_esm_shims();
382
- import { statSync as statSync2 } from "node:fs";
716
+ import { lstatSync as lstatSync2, realpathSync as realpathSync2 } from "node:fs";
383
717
  import path3 from "node:path";
384
718
  function extensionResourcePath(rootPath, resourcePath) {
385
719
  const root = path3.resolve(rootPath);
386
720
  const full = path3.resolve(root, resourcePath);
387
721
  const relative = path3.relative(root, full);
388
- if (relative === "" || !relative.startsWith("..") && !path3.isAbsolute(relative)) return full;
389
- return null;
722
+ if (relative === "" || relative === ".." || relative.startsWith(`..${path3.sep}`) || path3.isAbsolute(relative))
723
+ return null;
724
+ try {
725
+ const rootReal = realpathSync2(root);
726
+ const fullReal = realpathSync2(full);
727
+ const canonicalRelative = path3.relative(rootReal, fullReal);
728
+ if (canonicalRelative === ".." || canonicalRelative.startsWith(`..${path3.sep}`) || path3.isAbsolute(canonicalRelative)) {
729
+ return null;
730
+ }
731
+ if (!lstatSync2(full).isDirectory()) return null;
732
+ return full;
733
+ } catch {
734
+ return null;
735
+ }
390
736
  }
391
737
  function enabledExtensionResourceRoots(kind, cwd = process.cwd()) {
392
738
  const roots = [];
393
739
  for (const entry of listInstalledExtensions(cwd)) {
394
- if (!entry.enabled || !entry.effective) continue;
740
+ if (!entry.enabled || !entry.compatible || !entry.effective) continue;
395
741
  const rel = entry.resources[kind];
396
742
  if (!rel) continue;
397
743
  const full = extensionResourcePath(entry.rootPath, rel);
398
744
  if (!full) continue;
399
- try {
400
- if (!statSync2(full).isDirectory()) continue;
401
- } catch {
402
- continue;
403
- }
404
745
  roots.push({
405
746
  id: entry.id,
406
747
  scope: entry.scope,
407
748
  path: full,
749
+ rootPath: entry.rootPath,
408
750
  source: `extension:${entry.scope}:${entry.id}`
409
751
  });
410
752
  }
@@ -474,4 +816,4 @@ export {
474
816
  enabledExtensionResourceRoots,
475
817
  ExtensionsDomainModule
476
818
  };
477
- //# sourceMappingURL=chunk-ZWLZP4ZT.js.map
819
+ //# sourceMappingURL=chunk-5QKCQQ3E.js.map
@@ -1,12 +1,14 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
3
  inspectEvidence
4
- } from "./chunk-UUANF5CR.js";
4
+ } from "./chunk-TEO2TLVN.js";
5
5
  import {
6
6
  TASK_MEMORY_CONTENT_MAX_CHARS,
7
7
  TASK_MEMORY_DEFAULT_KNOWLEDGE_CAP,
8
- TASK_MEMORY_DEFAULT_PROCEDURAL_CAP
9
- } from "./chunk-WHGPSPT5.js";
8
+ TASK_MEMORY_DEFAULT_PROCEDURAL_CAP,
9
+ TASK_MEMORY_TELEMETRY_FILE,
10
+ parseTaskMemoryTelemetryRecord
11
+ } from "./chunk-O6I4CIEU.js";
10
12
  import {
11
13
  createRedactionTally,
12
14
  redactSecretsText
@@ -16,7 +18,10 @@ import {
16
18
  } from "./chunk-ECH6PKUQ.js";
17
19
  import {
18
20
  ceilChars
19
- } from "./chunk-GEYXPTRF.js";
21
+ } from "./chunk-AEYBF3TB.js";
22
+ import {
23
+ clioStateDir
24
+ } from "./chunk-BNAZZHFG.js";
20
25
  import {
21
26
  safeResourceWrite
22
27
  } from "./chunk-WEPFGWHJ.js";
@@ -1116,6 +1121,30 @@ function compareStrings3(a, b) {
1116
1121
  return a.localeCompare(b);
1117
1122
  }
1118
1123
 
1124
+ // src/domains/memory/task-bank-promotion.ts
1125
+ init_esm_shims();
1126
+ async function proposeInjectedTaskMemory(dataDir, input) {
1127
+ const result = { records: [], errors: [] };
1128
+ const sessionId = input.sessionId;
1129
+ const repository = canonicalMemoryRepositoryIdentity(input.cwd);
1130
+ if (sessionId === null || sessionId.length === 0 || repository === null) return result;
1131
+ for (const entry of input.entries) {
1132
+ if (entry.kind === "status") continue;
1133
+ try {
1134
+ const proposal = await proposeMemoryPromotion(
1135
+ dataDir,
1136
+ { kind: "task-bank-entry", sessionId, evidenceRefs: [`session:${sessionId}`], entry },
1137
+ { scope: "repo", repository },
1138
+ input.now ?? /* @__PURE__ */ new Date()
1139
+ );
1140
+ result.records.push(proposal.record);
1141
+ } catch (error) {
1142
+ result.errors.push(`${entry.id}: ${error instanceof Error ? error.message : String(error)}`);
1143
+ }
1144
+ }
1145
+ return result;
1146
+ }
1147
+
1119
1148
  // src/domains/memory/task-memory-handoff.ts
1120
1149
  init_esm_shims();
1121
1150
  import { existsSync, readdirSync, readFileSync as readFileSync2, statSync } from "node:fs";
@@ -1367,6 +1396,80 @@ function compareStrings4(left, right) {
1367
1396
  return left < right ? -1 : left > right ? 1 : 0;
1368
1397
  }
1369
1398
 
1399
+ // src/domains/memory/task-memory-spend.ts
1400
+ init_esm_shims();
1401
+ import { readFileSync as readFileSync3, statSync as statSync2 } from "node:fs";
1402
+ import { join as join3 } from "node:path";
1403
+ function taskMemoryStepsPath(stateDir = clioStateDir()) {
1404
+ return join3(stateDir, "memory", TASK_MEMORY_TELEMETRY_FILE);
1405
+ }
1406
+ function emptyTaskMemorySpendSummary() {
1407
+ return {
1408
+ llmSteps: 0,
1409
+ injections: 0,
1410
+ hitRate: 0,
1411
+ inputTokens: 0,
1412
+ outputTokens: 0,
1413
+ totalTokens: 0,
1414
+ modelMs: 0,
1415
+ slowestStepMs: 0,
1416
+ timeouts: 0,
1417
+ endpointBusySkips: 0,
1418
+ firstAt: null,
1419
+ lastAt: null
1420
+ };
1421
+ }
1422
+ function foldTaskMemorySpend(lines) {
1423
+ const summary = emptyTaskMemorySpendSummary();
1424
+ for (const line of lines) {
1425
+ if (line.trim().length === 0) continue;
1426
+ let parsed;
1427
+ try {
1428
+ parsed = JSON.parse(line);
1429
+ } catch {
1430
+ continue;
1431
+ }
1432
+ const record = parseTaskMemoryTelemetryRecord(parsed);
1433
+ if (record === null) continue;
1434
+ if (summary.firstAt === null || record.at < summary.firstAt) summary.firstAt = record.at;
1435
+ if (summary.lastAt === null || record.at > summary.lastAt) summary.lastAt = record.at;
1436
+ if (record.reason === "endpoint_busy") summary.endpointBusySkips += 1;
1437
+ if (record.tier !== "llm") continue;
1438
+ summary.llmSteps += 1;
1439
+ if (record.decision === "injected") summary.injections += 1;
1440
+ if (record.decision === "timeout") summary.timeouts += 1;
1441
+ summary.inputTokens += record.tokenCost.input;
1442
+ summary.outputTokens += record.tokenCost.output;
1443
+ summary.totalTokens += record.tokenCost.total;
1444
+ summary.modelMs += record.latencyMs;
1445
+ summary.slowestStepMs = Math.max(summary.slowestStepMs, record.latencyMs);
1446
+ }
1447
+ summary.hitRate = summary.llmSteps === 0 ? 0 : summary.injections / summary.llmSteps;
1448
+ return summary;
1449
+ }
1450
+ var spendCache = /* @__PURE__ */ new Map();
1451
+ function readTaskMemorySpendSummary(stateDir = clioStateDir()) {
1452
+ const path = taskMemoryStepsPath(stateDir);
1453
+ try {
1454
+ const info = statSync2(path);
1455
+ const cached = spendCache.get(path);
1456
+ if (cached !== void 0 && cached.mtimeMs === info.mtimeMs && cached.size === info.size) return cached.summary;
1457
+ const summary = foldTaskMemorySpend(readFileSync3(path, "utf8").split("\n"));
1458
+ spendCache.set(path, { mtimeMs: info.mtimeMs, size: info.size, summary });
1459
+ return summary;
1460
+ } catch {
1461
+ return emptyTaskMemorySpendSummary();
1462
+ }
1463
+ }
1464
+ function formatTaskMemorySpend(summary) {
1465
+ if (summary.llmSteps === 0) return "";
1466
+ const tokens = summary.totalTokens >= 1e3 ? `${(summary.totalTokens / 1e3).toFixed(1)}k tok` : `${summary.totalTokens} tok`;
1467
+ const seconds = summary.modelMs / 1e3;
1468
+ const time = seconds >= 60 ? `${(seconds / 60).toFixed(1)}m` : `${seconds.toFixed(1)}s`;
1469
+ const rate = `${Math.round(summary.hitRate * 100)}%`;
1470
+ return `spend ${summary.llmSteps} steps \xB7 ${tokens} \xB7 ${time} \xB7 hit ${summary.injections}/${summary.llmSteps} (${rate})`;
1471
+ }
1472
+
1370
1473
  // src/domains/memory/task-memory-status.ts
1371
1474
  init_esm_shims();
1372
1475
  function describeTaskMemoryActivity(event) {
@@ -1441,13 +1544,16 @@ export {
1441
1544
  proposeMemoryPromotion,
1442
1545
  buildMemoryPromptSection,
1443
1546
  proposeMemoryFromEvidence,
1547
+ proposeInjectedTaskMemory,
1444
1548
  renderTaskMemoryHandoffSource,
1445
1549
  parseTaskMemoryHandoffSnapshot,
1446
1550
  taskMemoryHandoffSeedOffer,
1447
1551
  seedTaskMemoryFromNewestHandoff,
1552
+ readTaskMemorySpendSummary,
1553
+ formatTaskMemorySpend,
1448
1554
  describeTaskMemoryActivity,
1449
1555
  taskMemoryBankSize,
1450
1556
  taskMemoryTracePath,
1451
1557
  createTaskMemoryTrace
1452
1558
  };
1453
- //# sourceMappingURL=chunk-6M7VS3J3.js.map
1559
+ //# sourceMappingURL=chunk-5T7RBWN2.js.map