@iowarp/clio-coder 0.3.0 → 0.3.1

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 (988) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +50 -53
  3. package/dist/acp-FPR54DGL.js +138 -0
  4. package/dist/{agents-Q4MYPMUW.js → agents-OGPIHPJH.js} +33 -25
  5. package/dist/assets/codewiki.json +1 -0
  6. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
  7. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
  8. package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
  9. package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
  10. package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
  11. package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
  12. package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
  13. package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
  14. package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
  15. package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
  16. package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
  17. package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
  18. package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
  19. package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
  20. package/dist/assets/grammars/tree-sitter.wasm +0 -0
  21. package/dist/{auth-O6HYIJ6J.js → auth-IC3K6NIZ.js} +22 -15
  22. package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
  23. package/dist/chunk-3I7MS7N2.js +40 -0
  24. package/dist/chunk-3R73A4XB.js +69 -0
  25. package/dist/{chunk-26BZQOAD.js → chunk-474KN5II.js} +86 -115
  26. package/dist/{chunk-NI4DEJMC.js → chunk-4QKXUHSR.js} +26 -3
  27. package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
  28. package/dist/{chunk-TFSSEXL6.js → chunk-673JJUWJ.js} +14 -4
  29. package/dist/{chunk-GNGDQYDU.js → chunk-7SS2CTV2.js} +27922 -1249
  30. package/dist/{chunk-7RBKDI66.js → chunk-ASND7OZK.js} +104 -12
  31. package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
  32. package/dist/{chunk-RQDWMVRB.js → chunk-BSU2YIWB.js} +9 -3
  33. package/dist/{chunk-CLJ5HLUD.js → chunk-C4PTHK7P.js} +24 -5
  34. package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
  35. package/dist/{chunk-BYEU76JP.js → chunk-DKGKUHFA.js} +34 -9
  36. package/dist/chunk-EYOKLTMF.js +170 -0
  37. package/dist/{chunk-PS4PFJQP.js → chunk-FCIH3BIZ.js} +15258 -14130
  38. package/dist/{chunk-2J63S4SF.js → chunk-FST4FYJB.js} +82 -14
  39. package/dist/{chunk-3DANZDGR.js → chunk-G34LV2PF.js} +34 -9
  40. package/dist/{chunk-BBUH4VAA.js → chunk-GAEBEQVI.js} +34 -21
  41. package/dist/chunk-GB6QRBXN.js +8543 -0
  42. package/dist/chunk-GEP36Y4X.js +12796 -0
  43. package/dist/{chunk-TKHQ4DGZ.js → chunk-H6F6BYOH.js} +496 -121
  44. package/dist/{chunk-UGYAX5YI.js → chunk-HQQID6OA.js} +10 -5
  45. package/dist/chunk-IHXBNWMM.js +137 -0
  46. package/dist/{chunk-ME6DNWIU.js → chunk-IS3ONKU3.js} +7 -1
  47. package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
  48. package/dist/chunk-K2ITRMHZ.js +642 -0
  49. package/dist/{chunk-KBR4MZZR.js → chunk-K5XEMXTI.js} +7 -1
  50. package/dist/{chunk-AMFR5YA3.js → chunk-KKNLWXI6.js} +24 -10
  51. package/dist/{chunk-JWHCJDCI.js → chunk-KY56HMHH.js} +145 -61
  52. package/dist/{chunk-E3NYWENM.js → chunk-LU4TK2PR.js} +52 -7
  53. package/dist/{chunk-UWIJNAOB.js → chunk-M5T5VO65.js} +109 -42
  54. package/dist/{chunk-JPOWPFCU.js → chunk-MAR7Y6HW.js} +38 -16
  55. package/dist/chunk-N6F52NLF.js +6951 -0
  56. package/dist/{chunk-UHTSULZS.js → chunk-NMOX6HFD.js} +20 -7
  57. package/dist/{chunk-WD6AJM35.js → chunk-OLBBMFRD.js} +30 -13
  58. package/dist/{chunk-VOO7NYPP.js → chunk-PFEFKVGL.js} +22 -6
  59. package/dist/{chunk-6CWDTGUC.js → chunk-PIUMUEMV.js} +7 -1
  60. package/dist/chunk-PV4JUBVJ.js +462 -0
  61. package/dist/{chunk-527KG6XR.js → chunk-Q3RUPKEJ.js} +22 -4
  62. package/dist/{chunk-D5YD55AR.js → chunk-Q5WJOSJ7.js} +11 -1
  63. package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
  64. package/dist/{chunk-4UQA7NCT.js → chunk-R5KLMSBV.js} +7 -2
  65. package/dist/{chunk-PIDUD6M2.js → chunk-RDLVBZEO.js} +11 -6
  66. package/dist/{chunk-O4EJEDHO.js → chunk-RPTR2H26.js} +40 -31
  67. package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
  68. package/dist/{chunk-XNISANGE.js → chunk-TEKV33Q5.js} +122 -57
  69. package/dist/chunk-TXOTCRLG.js +15 -0
  70. package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
  71. package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
  72. package/dist/{chunk-UU3R62TT.js → chunk-XYWBQRDM.js} +13 -4
  73. package/dist/{chunk-7BHLZB3A.js → chunk-ZPY3JZ5E.js} +32 -10
  74. package/dist/cli/index.js +39 -33
  75. package/dist/clio-BZVGEUFJ.js +58 -0
  76. package/dist/{components-JVHMUBEB.js → components-DMAOEKFB.js} +26 -9
  77. package/dist/{config-ZFCDBMDC.js → config-IRUQ7SE4.js} +42 -31
  78. package/dist/configure-S7S6F6CL.js +32 -0
  79. package/dist/{context-CDXTP2MP.js → context-3KWFLHJG.js} +17 -11
  80. package/dist/{context-E3KIFVXI.js → context-5RADCKTR.js} +33 -28
  81. package/dist/{context-clear-3F4PLXOS.js → context-clear-7TSNPAAI.js} +36 -28
  82. package/dist/{context-index-Q7YSYTR3.js → context-index-W4RLWOQH.js} +10 -4
  83. package/dist/{docs-YIETIWZI.js → docs-5AWSPS37.js} +16 -10
  84. package/dist/doctor-UC5NAJYQ.js +77 -0
  85. package/dist/{eval-B3KZZESM.js → eval-U6TJHRLX.js} +77 -24
  86. package/dist/{evidence-V67CHM35.js → evidence-YEGUW4L3.js} +34 -26
  87. package/dist/{evolve-YDZSUQYA.js → evolve-TXARCTPG.js} +39 -26
  88. package/dist/{extensions-SRG7XCAH.js → extensions-OZFJ3A3G.js} +13 -7
  89. package/dist/{fleet-CA2CRTVG.js → fleet-6G3DHNYE.js} +45 -37
  90. package/dist/fleet-preflight-DSNT37JK.js +23 -0
  91. package/dist/{init-2OZDJE2D.js → init-KZ5QTF6M.js} +42 -34
  92. package/dist/{memory-3PIQQAKX.js → memory-73ESV5YC.js} +35 -27
  93. package/dist/{models-DY35XI7Y.js → models-A4PVNWJK.js} +34 -23
  94. package/dist/{paths-5OMXW7Z4.js → paths-C4H6IV77.js} +12 -6
  95. package/dist/preload-6WVMHX3A.js +13 -0
  96. package/dist/{reset-PIFYNOS3.js → reset-BGW6OGMV.js} +17 -11
  97. package/dist/{run-3VSPP24F.js → run-YTPEYQOH.js} +60 -48
  98. package/dist/{share-D36RQCXM.js → share-YIFFV4NQ.js} +16 -10
  99. package/dist/{skills-F2MRLELY.js → skills-2V6RA3OQ.js} +18 -11
  100. package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-S2TVJO4F.js} +45 -36
  101. package/dist/{targets-DZMEZAH4.js → targets-TYXLPB23.js} +61 -59
  102. package/dist/{trace-7NYCUI2J.js → trace-GGOJ6Q6Z.js} +9 -3
  103. package/dist/{uninstall-AD3JWHBB.js → uninstall-LLLT4F4W.js} +14 -8
  104. package/dist/{upgrade-WYYBKGDY.js → upgrade-33G2LMM5.js} +45 -23
  105. package/dist/{usage-ULIDAGFF.js → usage-ZAFSXKKG.js} +35 -27
  106. package/dist/version-KGEG7EPO.js +21 -0
  107. package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-NUQCVOQ3.js} +55 -45
  108. package/dist/worker/entry.js +101 -43
  109. package/docs/README.md +12 -9
  110. package/docs/acp.md +28 -5
  111. package/docs/alcf-provider.md +1 -1
  112. package/docs/architecture.md +23 -2
  113. package/docs/artifact-placement.md +101 -0
  114. package/docs/artifact-versions.md +1 -1
  115. package/docs/built-in-agents.md +4 -2
  116. package/docs/capacity-and-scheduling.md +1 -1
  117. package/docs/commands-and-modes.md +125 -41
  118. package/docs/configuration-and-targets.md +88 -18
  119. package/docs/context-engine.md +6 -2
  120. package/docs/development-pipeline.md +77 -0
  121. package/docs/documentation-coverage.md +4 -4
  122. package/docs/documentation-guide.md +3 -3
  123. package/docs/environment-variables.md +2 -1
  124. package/docs/eval-runner.md +3 -3
  125. package/docs/evals-internal.md +2 -2
  126. package/docs/evidence-and-memory.md +6 -2
  127. package/docs/evolution.md +1 -1
  128. package/docs/exit-codes-and-output.md +1 -1
  129. package/docs/extensions-and-sharing.md +18 -11
  130. package/docs/fleet-demo-runbook.md +22 -23
  131. package/docs/fleet-dispatch.md +111 -12
  132. package/docs/glossary.md +107 -15
  133. package/docs/html/agents_blueprint.html +3 -3
  134. package/docs/html/alcf_blueprint.html +3 -3
  135. package/docs/html/architecture_blueprint.html +3 -3
  136. package/docs/html/commands_blueprint.html +187 -42
  137. package/docs/html/configuration_blueprint.html +7 -7
  138. package/docs/html/context_blueprint.html +3 -3
  139. package/docs/html/documentation_blueprint.html +1 -1
  140. package/docs/html/environment_blueprint.html +3 -3
  141. package/docs/html/eval_blueprint.html +4 -4
  142. package/docs/html/evals_internal_blueprint.html +3 -3
  143. package/docs/html/evolution_blueprint.html +3 -3
  144. package/docs/html/extensions_blueprint.html +3 -3
  145. package/docs/html/fleet_dispatch_blueprint.html +8 -8
  146. package/docs/html/index.html +5 -5
  147. package/docs/html/lifecycle_blueprint.html +4 -4
  148. package/docs/html/memory_blueprint.html +3 -3
  149. package/docs/html/middleware_blueprint.html +3 -3
  150. package/docs/html/models_blueprint.html +2 -2
  151. package/docs/html/observability_blueprint.html +2 -2
  152. package/docs/html/provider_adapter_blueprint.html +3 -3
  153. package/docs/html/safety_blueprint.html +3 -3
  154. package/docs/html/skills_blueprint.html +2 -2
  155. package/docs/html/soak_blueprint.html +3 -3
  156. package/docs/html/tool_usage_blueprint.html +4 -4
  157. package/docs/html/tools_blueprint.html +2 -2
  158. package/docs/html/trace_blueprint.html +3 -3
  159. package/docs/html/tui_design_blueprint.html +100 -40
  160. package/docs/html/validation_blueprint.html +1 -1
  161. package/docs/html/worker_dispatch_blueprint.html +3 -3
  162. package/docs/installation-and-lifecycle.md +62 -11
  163. package/docs/middleware-and-components.md +1 -1
  164. package/docs/model-catalog.md +2 -2
  165. package/docs/observability.md +3 -3
  166. package/docs/proactive-memory.md +12 -12
  167. package/docs/prompt-envelope-and-tools.md +2 -2
  168. package/docs/provider-adapter-cookbook.md +1 -1
  169. package/docs/release-cut-checklist.md +4 -0
  170. package/docs/safety-model.md +21 -5
  171. package/docs/scientific-validation.md +3 -3
  172. package/docs/session-lifecycle.md +2 -2
  173. package/docs/skills-marketplace.md +1 -1
  174. package/docs/time-conventions.md +101 -0
  175. package/docs/tool-usage.md +5 -4
  176. package/docs/trace-store.md +1 -1
  177. package/docs/troubleshooting.md +1 -1
  178. package/docs/tui-design.md +83 -27
  179. package/docs/worker-dispatch-mechanics.md +3 -3
  180. package/package.json +16 -16
  181. package/skills/README.md +5 -6
  182. package/skills/git/file-ticket/SKILL.md +107 -0
  183. package/skills/git/file-ticket/evals.md +54 -0
  184. package/skills/git/fix-issue/SKILL.md +106 -0
  185. package/skills/git/fix-issue/evals.md +71 -0
  186. package/skills/git/ship/SKILL.md +92 -0
  187. package/skills/git/ship/evals.md +72 -0
  188. package/skills/skill-marketplace.json +12 -20
  189. package/src/cli/acp.ts +88 -0
  190. package/src/cli/agents.ts +60 -0
  191. package/src/cli/args.ts +280 -0
  192. package/src/cli/argv.ts +170 -0
  193. package/src/cli/ask.ts +34 -0
  194. package/src/cli/auth.ts +468 -0
  195. package/src/cli/bootstrap-generate.ts +498 -0
  196. package/src/cli/clio.ts +34 -0
  197. package/src/cli/components.ts +195 -0
  198. package/src/cli/config-inspect.ts +330 -0
  199. package/src/cli/config.ts +72 -0
  200. package/src/cli/configure-interop.ts +67 -0
  201. package/src/cli/configure-layout.ts +172 -0
  202. package/src/cli/configure.ts +1487 -0
  203. package/src/cli/context-clear.ts +76 -0
  204. package/src/cli/context-index.ts +102 -0
  205. package/src/cli/context.ts +316 -0
  206. package/src/cli/default-target.ts +63 -0
  207. package/src/cli/docs.ts +340 -0
  208. package/src/cli/doctor.ts +54 -0
  209. package/src/cli/eval.ts +315 -0
  210. package/src/cli/evidence.ts +222 -0
  211. package/src/cli/evolve.ts +219 -0
  212. package/src/cli/extensions.ts +205 -0
  213. package/src/cli/fleet.ts +827 -0
  214. package/src/cli/index.ts +309 -0
  215. package/src/cli/init.ts +219 -0
  216. package/src/cli/initial-message.ts +47 -0
  217. package/src/cli/internal-dispatch.ts +55 -0
  218. package/src/cli/memory.ts +180 -0
  219. package/src/cli/models.ts +257 -0
  220. package/src/cli/modes/json-stream.ts +85 -0
  221. package/src/cli/modes/jsonl.ts +9 -0
  222. package/src/cli/modes/print.ts +589 -0
  223. package/src/cli/oauth-manual-input.ts +72 -0
  224. package/src/cli/oauth-select.ts +36 -0
  225. package/src/cli/output-guard.ts +48 -0
  226. package/src/cli/paths.ts +44 -0
  227. package/src/cli/provider-target.ts +113 -0
  228. package/src/cli/removal.ts +72 -0
  229. package/src/cli/reset.ts +253 -0
  230. package/src/cli/run.ts +497 -0
  231. package/src/cli/share.ts +243 -0
  232. package/src/cli/shared.ts +60 -0
  233. package/src/cli/skills-eval.ts +1225 -0
  234. package/src/cli/skills.ts +470 -0
  235. package/src/cli/steer-channel.ts +86 -0
  236. package/src/cli/targets.ts +1150 -0
  237. package/src/cli/text-layout.ts +102 -0
  238. package/src/cli/trace.ts +274 -0
  239. package/src/cli/uninstall.ts +405 -0
  240. package/src/cli/upgrade.ts +270 -0
  241. package/src/cli/usage.ts +869 -0
  242. package/src/cli/validate-model.ts +28 -0
  243. package/src/cli/version.ts +7 -0
  244. package/src/cli/wiki-generate.ts +509 -0
  245. package/src/core/artifact-paths.ts +43 -0
  246. package/src/core/bash-exec.ts +242 -0
  247. package/src/core/boot-trace.ts +37 -0
  248. package/src/core/bus-events.ts +728 -0
  249. package/src/core/bus-trace.ts +53 -0
  250. package/src/core/c-header-language.ts +265 -0
  251. package/src/core/clio-repo.ts +78 -0
  252. package/src/core/config.ts +1593 -0
  253. package/src/core/context-floor.ts +33 -0
  254. package/src/core/defaults.ts +625 -0
  255. package/src/core/domain-loader.ts +170 -0
  256. package/src/core/event-bus.ts +94 -0
  257. package/src/core/file-references.ts +282 -0
  258. package/src/core/guardrails.ts +185 -0
  259. package/src/core/headless-permission.ts +21 -0
  260. package/src/core/init.ts +223 -0
  261. package/src/core/json-payload.ts +58 -0
  262. package/src/core/package-root.ts +54 -0
  263. package/src/core/path-canonical.ts +37 -0
  264. package/src/core/process-identity.ts +41 -0
  265. package/src/core/recent-models.ts +91 -0
  266. package/src/core/release.ts +2 -0
  267. package/src/core/residency-protection.ts +56 -0
  268. package/src/core/resolve-config-value.ts +88 -0
  269. package/src/core/response-schema.ts +279 -0
  270. package/src/core/run-overrides.ts +77 -0
  271. package/src/core/safe-exec.ts +193 -0
  272. package/src/core/safe-id.ts +37 -0
  273. package/src/core/safe-resource-write.ts +162 -0
  274. package/src/core/session-routing.ts +339 -0
  275. package/src/core/settings-layers.ts +220 -0
  276. package/src/core/shared-bus.ts +8 -0
  277. package/src/core/shell-quote.ts +26 -0
  278. package/src/core/skill-activation.ts +190 -0
  279. package/src/core/startup-timer.ts +37 -0
  280. package/src/core/state-file-lock.ts +207 -0
  281. package/src/core/termination.ts +202 -0
  282. package/src/core/timers.ts +38 -0
  283. package/src/core/tool-names.ts +65 -0
  284. package/src/core/verification-scripts.ts +13 -0
  285. package/src/core/workspace-files.ts +492 -0
  286. package/src/core/xdg.ts +177 -0
  287. package/src/domains/agents/builtins/architect.md +4 -4
  288. package/src/domains/agents/builtins/coder.md +3 -2
  289. package/src/domains/agents/builtins/debugger.md +1 -1
  290. package/src/domains/agents/builtins/documenter.md +1 -1
  291. package/src/domains/agents/builtins/git-master.md +3 -3
  292. package/src/domains/agents/builtins/provenance.md +1 -1
  293. package/src/domains/agents/builtins/researcher.md +1 -1
  294. package/src/domains/agents/builtins/scout.md +1 -1
  295. package/src/domains/agents/builtins/tester.md +1 -1
  296. package/src/domains/agents/builtins/verifier.md +1 -1
  297. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  298. package/src/domains/agents/catalog.ts +172 -0
  299. package/src/domains/agents/contract.ts +16 -0
  300. package/src/domains/agents/extension.ts +110 -0
  301. package/src/domains/agents/fleet-commands.ts +154 -0
  302. package/src/domains/agents/fleet-contract.ts +797 -0
  303. package/src/domains/agents/frontmatter.ts +40 -0
  304. package/src/domains/agents/index.ts +102 -0
  305. package/src/domains/agents/manifest.ts +6 -0
  306. package/src/domains/agents/recipe-schema.ts +202 -0
  307. package/src/domains/agents/recipe.ts +125 -0
  308. package/src/domains/agents/registry.ts +111 -0
  309. package/src/domains/agents/result-contract.ts +1265 -0
  310. package/src/domains/agents/spec.ts +371 -0
  311. package/src/domains/agents/write-boundary.ts +109 -0
  312. package/src/domains/components/diff.ts +99 -0
  313. package/src/domains/components/hash.ts +21 -0
  314. package/src/domains/components/index.ts +3 -0
  315. package/src/domains/components/scan.ts +304 -0
  316. package/src/domains/components/snapshot.ts +108 -0
  317. package/src/domains/components/types.ts +82 -0
  318. package/src/domains/config/agent-namespace.ts +13 -0
  319. package/src/domains/config/classify.ts +94 -0
  320. package/src/domains/config/contract.ts +22 -0
  321. package/src/domains/config/extension.ts +136 -0
  322. package/src/domains/config/index.ts +13 -0
  323. package/src/domains/config/keybindings.ts +164 -0
  324. package/src/domains/config/manifest.ts +6 -0
  325. package/src/domains/config/watcher.ts +41 -0
  326. package/src/domains/context/adoption.ts +880 -0
  327. package/src/domains/context/bootstrap-prompt.ts +273 -0
  328. package/src/domains/context/bootstrap.ts +1409 -0
  329. package/src/domains/context/clear.ts +86 -0
  330. package/src/domains/context/clio-md.ts +327 -0
  331. package/src/domains/context/codewiki/cmake.ts +356 -0
  332. package/src/domains/context/codewiki/cooperative.ts +46 -0
  333. package/src/domains/context/codewiki/digest.ts +135 -0
  334. package/src/domains/context/codewiki/grammar-assets.ts +33 -0
  335. package/src/domains/context/codewiki/indexer.ts +1614 -0
  336. package/src/domains/context/codewiki/tree-sitter.ts +771 -0
  337. package/src/domains/context/contract.ts +62 -0
  338. package/src/domains/context/excluded-dirs.ts +1 -0
  339. package/src/domains/context/extension.ts +407 -0
  340. package/src/domains/context/fingerprint.ts +196 -0
  341. package/src/domains/context/index.ts +164 -0
  342. package/src/domains/context/init-options.ts +69 -0
  343. package/src/domains/context/manifest.ts +6 -0
  344. package/src/domains/context/operator-profile.ts +157 -0
  345. package/src/domains/context/project-metadata.ts +510 -0
  346. package/src/domains/context/project-rules.ts +227 -0
  347. package/src/domains/context/prompt-context.ts +62 -0
  348. package/src/domains/context/refresh.ts +170 -0
  349. package/src/domains/context/sibling-files.ts +10 -0
  350. package/src/domains/context/state.ts +237 -0
  351. package/src/domains/context/wiki/assemble.ts +303 -0
  352. package/src/domains/context/wiki/frontmatter.ts +210 -0
  353. package/src/domains/context/wiki/generate.ts +590 -0
  354. package/src/domains/context/wiki/layout.ts +111 -0
  355. package/src/domains/context/wiki/meta.ts +221 -0
  356. package/src/domains/context/wiki/plan-store.ts +217 -0
  357. package/src/domains/context/wiki/plan.ts +250 -0
  358. package/src/domains/context/wiki/prompts.ts +270 -0
  359. package/src/domains/context/wiki/staleness.ts +198 -0
  360. package/src/domains/dispatch/active-route-planner.ts +168 -0
  361. package/src/domains/dispatch/admission-queue.ts +150 -0
  362. package/src/domains/dispatch/admission.ts +334 -0
  363. package/src/domains/dispatch/agent-candidates.ts +307 -0
  364. package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
  365. package/src/domains/dispatch/agent-ledger-store.ts +257 -0
  366. package/src/domains/dispatch/agent-ledger.ts +212 -0
  367. package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
  368. package/src/domains/dispatch/assignment-events.ts +132 -0
  369. package/src/domains/dispatch/assignment-reconcile.ts +76 -0
  370. package/src/domains/dispatch/assignment-store.ts +162 -0
  371. package/src/domains/dispatch/assignment.ts +278 -0
  372. package/src/domains/dispatch/backoff.ts +59 -0
  373. package/src/domains/dispatch/batch-store.ts +134 -0
  374. package/src/domains/dispatch/batch-tracker.ts +66 -0
  375. package/src/domains/dispatch/capability-match.ts +155 -0
  376. package/src/domains/dispatch/capacity-lease.ts +413 -0
  377. package/src/domains/dispatch/code-step-store.ts +52 -0
  378. package/src/domains/dispatch/code-step.ts +368 -0
  379. package/src/domains/dispatch/contract.ts +278 -0
  380. package/src/domains/dispatch/dedup.ts +133 -0
  381. package/src/domains/dispatch/event-pump.ts +251 -0
  382. package/src/domains/dispatch/execution-handoff.ts +29 -0
  383. package/src/domains/dispatch/execution-plan.ts +328 -0
  384. package/src/domains/dispatch/execution-role.ts +277 -0
  385. package/src/domains/dispatch/execution-scheduler.ts +583 -0
  386. package/src/domains/dispatch/extension.ts +5869 -0
  387. package/src/domains/dispatch/failure-classification.ts +141 -0
  388. package/src/domains/dispatch/fleet-plan.ts +225 -0
  389. package/src/domains/dispatch/fleet-preflight.ts +394 -0
  390. package/src/domains/dispatch/gate-decisions.ts +1040 -0
  391. package/src/domains/dispatch/gate-role-prompts.ts +58 -0
  392. package/src/domains/dispatch/heartbeat.ts +27 -0
  393. package/src/domains/dispatch/index.ts +137 -0
  394. package/src/domains/dispatch/joint-route-adapter.ts +114 -0
  395. package/src/domains/dispatch/joint-route-resolver.ts +283 -0
  396. package/src/domains/dispatch/manifest.ts +6 -0
  397. package/src/domains/dispatch/orphan-recovery.ts +224 -0
  398. package/src/domains/dispatch/outcome.ts +109 -0
  399. package/src/domains/dispatch/phase-timing.ts +47 -0
  400. package/src/domains/dispatch/placement.ts +202 -0
  401. package/src/domains/dispatch/receipt-findings.ts +255 -0
  402. package/src/domains/dispatch/receipt-integrity.ts +378 -0
  403. package/src/domains/dispatch/recovery-candidates.ts +74 -0
  404. package/src/domains/dispatch/reproducibility.ts +48 -0
  405. package/src/domains/dispatch/reservation-store.ts +501 -0
  406. package/src/domains/dispatch/route-approval.ts +177 -0
  407. package/src/domains/dispatch/route-candidates.ts +57 -0
  408. package/src/domains/dispatch/route-decision.ts +1079 -0
  409. package/src/domains/dispatch/route-facts.ts +187 -0
  410. package/src/domains/dispatch/route-history.ts +238 -0
  411. package/src/domains/dispatch/route-observer.ts +488 -0
  412. package/src/domains/dispatch/route-policy.ts +327 -0
  413. package/src/domains/dispatch/route-quality.ts +256 -0
  414. package/src/domains/dispatch/route-readiness.ts +120 -0
  415. package/src/domains/dispatch/routing-intent.ts +287 -0
  416. package/src/domains/dispatch/run-identity.ts +56 -0
  417. package/src/domains/dispatch/scout-transition.ts +130 -0
  418. package/src/domains/dispatch/state.ts +277 -0
  419. package/src/domains/dispatch/tool-stats.ts +132 -0
  420. package/src/domains/dispatch/transport.ts +209 -0
  421. package/src/domains/dispatch/types.ts +785 -0
  422. package/src/domains/dispatch/validation-grounding.ts +154 -0
  423. package/src/domains/dispatch/validation.ts +721 -0
  424. package/src/domains/dispatch/worker-protocol.ts +275 -0
  425. package/src/domains/dispatch/worker-spawn.ts +566 -0
  426. package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
  427. package/src/domains/dispatch/write-boundary.ts +426 -0
  428. package/src/domains/eval/artifacts/redact.ts +42 -0
  429. package/src/domains/eval/artifacts/store.ts +173 -0
  430. package/src/domains/eval/compare/compare.ts +33 -0
  431. package/src/domains/eval/compare/gates.ts +66 -0
  432. package/src/domains/eval/compare/thresholds.ts +92 -0
  433. package/src/domains/eval/harness-metrics.ts +62 -0
  434. package/src/domains/eval/index.ts +66 -0
  435. package/src/domains/eval/metrics/chaos-stream.ts +93 -0
  436. package/src/domains/eval/metrics/context.ts +34 -0
  437. package/src/domains/eval/metrics/coverage.ts +21 -0
  438. package/src/domains/eval/metrics/evidence.ts +182 -0
  439. package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
  440. package/src/domains/eval/metrics/invariants.ts +736 -0
  441. package/src/domains/eval/metrics/latency.ts +4 -0
  442. package/src/domains/eval/metrics/token-stream.ts +139 -0
  443. package/src/domains/eval/metrics/tokens.ts +51 -0
  444. package/src/domains/eval/metrics/tool-calls.ts +7 -0
  445. package/src/domains/eval/proactive-memory.ts +279 -0
  446. package/src/domains/eval/provenance.ts +35 -0
  447. package/src/domains/eval/report.ts +234 -0
  448. package/src/domains/eval/reports/json.ts +5 -0
  449. package/src/domains/eval/reports/junit.ts +23 -0
  450. package/src/domains/eval/reports/markdown.ts +20 -0
  451. package/src/domains/eval/reports/swe-jsonl.ts +16 -0
  452. package/src/domains/eval/reports/text.ts +25 -0
  453. package/src/domains/eval/run-compare.ts +274 -0
  454. package/src/domains/eval/runner.ts +244 -0
  455. package/src/domains/eval/runners/clio-run.ts +148 -0
  456. package/src/domains/eval/runners/context-index.ts +56 -0
  457. package/src/domains/eval/runners/context-init.ts +203 -0
  458. package/src/domains/eval/runners/external-command.ts +350 -0
  459. package/src/domains/eval/runtime-paths.ts +171 -0
  460. package/src/domains/eval/schema/artifact.ts +75 -0
  461. package/src/domains/eval/schema/suite.ts +235 -0
  462. package/src/domains/eval/schema/validate.ts +339 -0
  463. package/src/domains/eval/store.ts +392 -0
  464. package/src/domains/eval/suites/load.ts +74 -0
  465. package/src/domains/eval/suites/matrix.ts +19 -0
  466. package/src/domains/eval/suites/resolve.ts +44 -0
  467. package/src/domains/eval/suites/run.ts +325 -0
  468. package/src/domains/eval/task-file.ts +186 -0
  469. package/src/domains/eval/types.ts +141 -0
  470. package/src/domains/eval/verifiers/command.ts +27 -0
  471. package/src/domains/eval/verifiers/file-exists.ts +6 -0
  472. package/src/domains/eval/verifiers/patch.ts +22 -0
  473. package/src/domains/eval/workspaces/git.ts +41 -0
  474. package/src/domains/eval/workspaces/local.ts +17 -0
  475. package/src/domains/eval/workspaces/temp-copy.ts +29 -0
  476. package/src/domains/evidence/build.ts +1714 -0
  477. package/src/domains/evidence/eval.ts +605 -0
  478. package/src/domains/evidence/failure-attribution.ts +54 -0
  479. package/src/domains/evidence/finish-contract-map.ts +42 -0
  480. package/src/domains/evidence/index.ts +55 -0
  481. package/src/domains/evidence/provenance.ts +200 -0
  482. package/src/domains/evidence/redact.ts +81 -0
  483. package/src/domains/evidence/store.ts +291 -0
  484. package/src/domains/evidence/types.ts +325 -0
  485. package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
  486. package/src/domains/evolution/index.ts +26 -0
  487. package/src/domains/evolution/manifest.ts +154 -0
  488. package/src/domains/evolution/validate.ts +304 -0
  489. package/src/domains/extensions/contract.ts +22 -0
  490. package/src/domains/extensions/discovery.ts +193 -0
  491. package/src/domains/extensions/extension.ts +46 -0
  492. package/src/domains/extensions/index.ts +34 -0
  493. package/src/domains/extensions/manager.ts +30 -0
  494. package/src/domains/extensions/manifest.ts +6 -0
  495. package/src/domains/extensions/resources.ts +38 -0
  496. package/src/domains/extensions/state.ts +224 -0
  497. package/src/domains/extensions/types.ts +83 -0
  498. package/src/domains/interop/consent.ts +185 -0
  499. package/src/domains/interop/contract.ts +29 -0
  500. package/src/domains/interop/detect.ts +173 -0
  501. package/src/domains/interop/extension.ts +59 -0
  502. package/src/domains/interop/index.ts +34 -0
  503. package/src/domains/interop/manifest.ts +6 -0
  504. package/src/domains/interop/registry.ts +139 -0
  505. package/src/domains/interop/state.ts +92 -0
  506. package/src/domains/interop/types.ts +109 -0
  507. package/src/domains/lifecycle/contract.ts +11 -0
  508. package/src/domains/lifecycle/doctor.ts +536 -0
  509. package/src/domains/lifecycle/extension.ts +23 -0
  510. package/src/domains/lifecycle/index.ts +21 -0
  511. package/src/domains/lifecycle/install-method.ts +51 -0
  512. package/src/domains/lifecycle/manifest.ts +6 -0
  513. package/src/domains/lifecycle/migrations/index.ts +94 -0
  514. package/src/domains/lifecycle/state.ts +93 -0
  515. package/src/domains/lifecycle/upgrade-notice.ts +35 -0
  516. package/src/domains/lifecycle/version.ts +35 -0
  517. package/src/domains/memory/index.ts +128 -0
  518. package/src/domains/memory/operations.ts +143 -0
  519. package/src/domains/memory/prompt-section.ts +86 -0
  520. package/src/domains/memory/proposal.ts +180 -0
  521. package/src/domains/memory/store.ts +163 -0
  522. package/src/domains/memory/task-bank.ts +229 -0
  523. package/src/domains/memory/task-memory-handoff.ts +222 -0
  524. package/src/domains/memory/task-memory-policy.ts +602 -0
  525. package/src/domains/memory/task-memory-status.ts +58 -0
  526. package/src/domains/memory/task-memory-telemetry.ts +346 -0
  527. package/src/domains/memory/task-memory-trace.ts +89 -0
  528. package/src/domains/memory/types.ts +74 -0
  529. package/src/domains/memory/validate.ts +297 -0
  530. package/src/domains/middleware/budget.ts +216 -0
  531. package/src/domains/middleware/contract.ts +35 -0
  532. package/src/domains/middleware/dispatch-nudge.ts +469 -0
  533. package/src/domains/middleware/extension.ts +129 -0
  534. package/src/domains/middleware/hook-receipts.ts +70 -0
  535. package/src/domains/middleware/hooks-io.ts +174 -0
  536. package/src/domains/middleware/hooks.ts +432 -0
  537. package/src/domains/middleware/index.ts +154 -0
  538. package/src/domains/middleware/manifest.ts +6 -0
  539. package/src/domains/middleware/memory-intervention.ts +701 -0
  540. package/src/domains/middleware/rules.ts +42 -0
  541. package/src/domains/middleware/runtime.ts +333 -0
  542. package/src/domains/middleware/skills-reminder.ts +187 -0
  543. package/src/domains/middleware/snapshot.ts +71 -0
  544. package/src/domains/middleware/stalled-turn.ts +71 -0
  545. package/src/domains/middleware/task-board-reminder.ts +87 -0
  546. package/src/domains/middleware/task-nudge.ts +77 -0
  547. package/src/domains/middleware/tool-choice-control.ts +42 -0
  548. package/src/domains/middleware/types.ts +131 -0
  549. package/src/domains/middleware/validate.ts +329 -0
  550. package/src/domains/observability/accountability.ts +67 -0
  551. package/src/domains/observability/contract.ts +168 -0
  552. package/src/domains/observability/cost.ts +206 -0
  553. package/src/domains/observability/evidence-index.ts +123 -0
  554. package/src/domains/observability/extension.ts +281 -0
  555. package/src/domains/observability/index.ts +78 -0
  556. package/src/domains/observability/manifest.ts +10 -0
  557. package/src/domains/observability/metrics.ts +37 -0
  558. package/src/domains/observability/projection.ts +477 -0
  559. package/src/domains/observability/telemetry.ts +89 -0
  560. package/src/domains/observability/trace-store.ts +1454 -0
  561. package/src/domains/prompts/compiler.ts +556 -0
  562. package/src/domains/prompts/contract.ts +30 -0
  563. package/src/domains/prompts/extension.ts +304 -0
  564. package/src/domains/prompts/fragment-loader.ts +139 -0
  565. package/src/domains/prompts/fragments/identity/clio.md +3 -2
  566. package/src/domains/prompts/fragments/identity/self-awareness.md +63 -0
  567. package/src/domains/prompts/fragments/operating/contract.md +10 -1
  568. package/src/domains/prompts/hash.ts +73 -0
  569. package/src/domains/prompts/index.ts +32 -0
  570. package/src/domains/prompts/manifest.ts +8 -0
  571. package/src/domains/prompts/memory-intervention.ts +57 -0
  572. package/src/domains/prompts/preload.ts +82 -0
  573. package/src/domains/providers/auth/api-key.ts +47 -0
  574. package/src/domains/providers/auth/backend-file.ts +69 -0
  575. package/src/domains/providers/auth/backend-memory.ts +17 -0
  576. package/src/domains/providers/auth/index.ts +37 -0
  577. package/src/domains/providers/auth/oauth.ts +36 -0
  578. package/src/domains/providers/auth/storage.ts +667 -0
  579. package/src/domains/providers/capabilities.ts +50 -0
  580. package/src/domains/providers/catalog.ts +162 -0
  581. package/src/domains/providers/contract.ts +151 -0
  582. package/src/domains/providers/credentials.ts +20 -0
  583. package/src/domains/providers/eligibility.ts +24 -0
  584. package/src/domains/providers/errors.ts +64 -0
  585. package/src/domains/providers/extension.ts +536 -0
  586. package/src/domains/providers/index.ts +142 -0
  587. package/src/domains/providers/knowledge-base-path.ts +102 -0
  588. package/src/domains/providers/manifest.ts +6 -0
  589. package/src/domains/providers/model-capabilities.ts +136 -0
  590. package/src/domains/providers/model-discovery.ts +144 -0
  591. package/src/domains/providers/model-family.ts +32 -0
  592. package/src/domains/providers/model-runtime-capabilities.ts +712 -0
  593. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +2 -2
  594. package/src/domains/providers/plugins.ts +59 -0
  595. package/src/domains/providers/probe/fingerprint.ts +44 -0
  596. package/src/domains/providers/probe/http.ts +114 -0
  597. package/src/domains/providers/probe/reasoning.ts +111 -0
  598. package/src/domains/providers/registry.ts +166 -0
  599. package/src/domains/providers/resolver.ts +156 -0
  600. package/src/domains/providers/runtime-resolution.ts +720 -0
  601. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
  602. package/src/domains/providers/runtimes/builtins.ts +78 -0
  603. package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
  604. package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
  605. package/src/domains/providers/runtimes/claude/common.ts +55 -0
  606. package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
  607. package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
  608. package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
  609. package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
  610. package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
  611. package/src/domains/providers/runtimes/cloud/google.ts +41 -0
  612. package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
  613. package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
  614. package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
  615. package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
  616. package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
  617. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +32 -0
  618. package/src/domains/providers/runtimes/common/local-synth.ts +165 -0
  619. package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
  620. package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
  621. package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
  622. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
  623. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
  624. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
  625. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
  626. package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
  627. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +491 -0
  628. package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
  629. package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
  630. package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
  631. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
  632. package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
  633. package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
  634. package/src/domains/providers/runtimes/protocol/google.ts +27 -0
  635. package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
  636. package/src/domains/providers/support.ts +238 -0
  637. package/src/domains/providers/thinking-control-policy.ts +85 -0
  638. package/src/domains/providers/types/capability-flags.ts +114 -0
  639. package/src/domains/providers/types/cost-provenance.ts +7 -0
  640. package/src/domains/providers/types/inference.ts +41 -0
  641. package/src/domains/providers/types/knowledge-base.ts +156 -0
  642. package/src/domains/providers/types/local-model-quirks.ts +218 -0
  643. package/src/domains/providers/types/runtime-descriptor.ts +170 -0
  644. package/src/domains/providers/types/target-descriptor.ts +38 -0
  645. package/src/domains/resources/collision.ts +92 -0
  646. package/src/domains/resources/common-loader.ts +140 -0
  647. package/src/domains/resources/contract.ts +25 -0
  648. package/src/domains/resources/extension.ts +61 -0
  649. package/src/domains/resources/index.ts +74 -0
  650. package/src/domains/resources/loader.ts +86 -0
  651. package/src/domains/resources/manifest.ts +6 -0
  652. package/src/domains/resources/prompts/loader.ts +232 -0
  653. package/src/domains/resources/prompts/substitute.ts +65 -0
  654. package/src/domains/resources/skills/content-hash.ts +105 -0
  655. package/src/domains/resources/skills/evals.ts +175 -0
  656. package/src/domains/resources/skills/install.ts +410 -0
  657. package/src/domains/resources/skills/loader.ts +978 -0
  658. package/src/domains/resources/skills/marketplace.ts +255 -0
  659. package/src/domains/resources/skills/provenance-pin.ts +115 -0
  660. package/src/domains/safety/action-classifier.ts +268 -0
  661. package/src/domains/safety/approval-axis.ts +23 -0
  662. package/src/domains/safety/audit.ts +487 -0
  663. package/src/domains/safety/autonomy.ts +174 -0
  664. package/src/domains/safety/call-target.ts +59 -0
  665. package/src/domains/safety/contract.ts +65 -0
  666. package/src/domains/safety/damage-control.ts +44 -0
  667. package/src/domains/safety/default-path-policy.ts +117 -0
  668. package/src/domains/safety/extension.ts +383 -0
  669. package/src/domains/safety/finish-contract-registration.ts +128 -0
  670. package/src/domains/safety/finish-contract.ts +554 -0
  671. package/src/domains/safety/index.ts +44 -0
  672. package/src/domains/safety/loop-detector.ts +143 -0
  673. package/src/domains/safety/manifest.ts +6 -0
  674. package/src/domains/safety/path-policy.ts +164 -0
  675. package/src/domains/safety/policy-engine.ts +994 -0
  676. package/src/domains/safety/project-policy.ts +391 -0
  677. package/src/domains/safety/protected-artifacts-registration.ts +189 -0
  678. package/src/domains/safety/protected-artifacts.ts +993 -0
  679. package/src/domains/safety/rejection-feedback.ts +102 -0
  680. package/src/domains/safety/rigor.ts +72 -0
  681. package/src/domains/safety/rule-compiler.ts +48 -0
  682. package/src/domains/safety/rule-pack-loader.ts +92 -0
  683. package/src/domains/safety/run-effects.ts +197 -0
  684. package/src/domains/safety/scope.ts +61 -0
  685. package/src/domains/scheduling/budget.ts +35 -0
  686. package/src/domains/scheduling/cluster.ts +175 -0
  687. package/src/domains/scheduling/contract.ts +30 -0
  688. package/src/domains/scheduling/extension.ts +91 -0
  689. package/src/domains/scheduling/index.ts +12 -0
  690. package/src/domains/scheduling/manifest.ts +6 -0
  691. package/src/domains/session/archive-readers.ts +208 -0
  692. package/src/domains/session/checkpoint.ts +38 -0
  693. package/src/domains/session/compaction/auto.ts +89 -0
  694. package/src/domains/session/compaction/branch-summary.ts +186 -0
  695. package/src/domains/session/compaction/compact.ts +493 -0
  696. package/src/domains/session/compaction/cut-point.ts +171 -0
  697. package/src/domains/session/compaction/defaults.ts +34 -0
  698. package/src/domains/session/compaction/mask-observations.ts +265 -0
  699. package/src/domains/session/compaction/session-entries.ts +18 -0
  700. package/src/domains/session/compaction/tokens.ts +147 -0
  701. package/src/domains/session/context-accounting.ts +583 -0
  702. package/src/domains/session/context-ledger.ts +348 -0
  703. package/src/domains/session/contract.ts +144 -0
  704. package/src/domains/session/cwd-fallback.ts +65 -0
  705. package/src/domains/session/entries.ts +509 -0
  706. package/src/domains/session/extension.ts +322 -0
  707. package/src/domains/session/history.ts +172 -0
  708. package/src/domains/session/index.ts +84 -0
  709. package/src/domains/session/manager.ts +128 -0
  710. package/src/domains/session/manifest.ts +6 -0
  711. package/src/domains/session/migrations/index.ts +27 -0
  712. package/src/domains/session/prompt-manifest.ts +173 -0
  713. package/src/domains/session/protected-artifact-journal.ts +241 -0
  714. package/src/domains/session/protected-artifacts.ts +90 -0
  715. package/src/domains/session/retry.ts +238 -0
  716. package/src/domains/session/task-board.ts +375 -0
  717. package/src/domains/session/tree/active-path.ts +98 -0
  718. package/src/domains/session/tree/fork.ts +160 -0
  719. package/src/domains/session/tree/manager.ts +128 -0
  720. package/src/domains/session/tree/navigator.ts +177 -0
  721. package/src/domains/session/tree/preview.ts +259 -0
  722. package/src/domains/session/usage.ts +148 -0
  723. package/src/domains/session/workspace/git-probe.ts +161 -0
  724. package/src/domains/session/workspace/index.ts +4 -0
  725. package/src/domains/session/workspace/project-type.ts +217 -0
  726. package/src/domains/session/workspace/snapshot.ts +74 -0
  727. package/src/domains/share/archive.ts +684 -0
  728. package/src/domains/share/contract.ts +9 -0
  729. package/src/domains/share/extension.ts +26 -0
  730. package/src/domains/share/index.ts +28 -0
  731. package/src/domains/share/manifest.ts +6 -0
  732. package/src/engine/acp/adapter.ts +397 -0
  733. package/src/engine/acp/errors.ts +32 -0
  734. package/src/engine/acp/event-mapper.ts +154 -0
  735. package/src/engine/acp/server.ts +656 -0
  736. package/src/engine/acp/tool-mediator.ts +686 -0
  737. package/src/engine/acp/transport.ts +654 -0
  738. package/src/engine/acp/types.ts +170 -0
  739. package/src/engine/agent.ts +29 -0
  740. package/src/engine/ai.ts +202 -0
  741. package/src/engine/alcf-oauth.ts +198 -0
  742. package/src/engine/antigravity/subprocess-runtime.ts +205 -0
  743. package/src/engine/apis/degraded-inference.ts +95 -0
  744. package/src/engine/apis/index.ts +20 -0
  745. package/src/engine/apis/llamacpp-residency.ts +252 -0
  746. package/src/engine/apis/lmstudio-native.ts +1438 -0
  747. package/src/engine/apis/lmstudio-residency.ts +92 -0
  748. package/src/engine/apis/ollama-native.ts +507 -0
  749. package/src/engine/apis/openai-completions.ts +716 -0
  750. package/src/engine/apis/output-budget.ts +99 -0
  751. package/src/engine/apis/residency-lock.ts +29 -0
  752. package/src/engine/apis/residency.ts +640 -0
  753. package/src/engine/apis/resident-models.ts +42 -0
  754. package/src/engine/apis/sampling-overrides.ts +38 -0
  755. package/src/engine/apis/thinking-replay.ts +11 -0
  756. package/src/engine/claude/sdk-runtime.ts +685 -0
  757. package/src/engine/claude/session-id.ts +5 -0
  758. package/src/engine/claude/subprocess-runtime.ts +316 -0
  759. package/src/engine/claude/tool-safety.ts +400 -0
  760. package/src/engine/external-subprocess.ts +23 -0
  761. package/src/engine/harmony-response.ts +165 -0
  762. package/src/engine/loop-guard.ts +1127 -0
  763. package/src/engine/oauth.ts +192 -0
  764. package/src/engine/pi-mono-names.ts +13 -0
  765. package/src/engine/provider-payload.ts +315 -0
  766. package/src/engine/select-list.ts +53 -0
  767. package/src/engine/session.ts +834 -0
  768. package/src/engine/strip-tokenizer-sentinels.ts +125 -0
  769. package/src/engine/tui.ts +103 -0
  770. package/src/engine/types.ts +66 -0
  771. package/src/engine/worker-events.ts +100 -0
  772. package/src/engine/worker-runtime.ts +1022 -0
  773. package/src/engine/worker-tools.ts +203 -0
  774. package/src/entry/orchestrator.ts +1873 -0
  775. package/src/interactive/application-controller.ts +346 -0
  776. package/src/interactive/bus-notices.ts +265 -0
  777. package/src/interactive/chat-loop-messages.ts +626 -0
  778. package/src/interactive/chat-loop-policy.ts +18 -0
  779. package/src/interactive/chat-loop.ts +865 -0
  780. package/src/interactive/chat-panel.ts +1694 -0
  781. package/src/interactive/chat-renderer.ts +1038 -0
  782. package/src/interactive/clio-editor.ts +166 -0
  783. package/src/interactive/command-fallbacks.ts +23 -0
  784. package/src/interactive/command-output.ts +85 -0
  785. package/src/interactive/context-activity.ts +203 -0
  786. package/src/interactive/context-meter.ts +223 -0
  787. package/src/interactive/context-overlay.ts +220 -0
  788. package/src/interactive/cost-overlay.ts +279 -0
  789. package/src/interactive/dispatch-board.ts +1319 -0
  790. package/src/interactive/dispatch-steering.ts +86 -0
  791. package/src/interactive/editor-bash.ts +46 -0
  792. package/src/interactive/editor-steer.ts +51 -0
  793. package/src/interactive/editor-submit.ts +303 -0
  794. package/src/interactive/external-editor.ts +67 -0
  795. package/src/interactive/follow-up-queue-panel.ts +75 -0
  796. package/src/interactive/footer/dashboard.ts +534 -0
  797. package/src/interactive/footer/notifications.ts +275 -0
  798. package/src/interactive/footer/widgets.ts +1246 -0
  799. package/src/interactive/footer-panel.ts +187 -0
  800. package/src/interactive/format-time.ts +85 -0
  801. package/src/interactive/index.ts +11 -0
  802. package/src/interactive/interactive-application.ts +755 -0
  803. package/src/interactive/interactive-event-projection.ts +380 -0
  804. package/src/interactive/interactive-input-runtime.ts +261 -0
  805. package/src/interactive/interactive-presentation.ts +452 -0
  806. package/src/interactive/interactive-shell.ts +134 -0
  807. package/src/interactive/interactive-slash-runtime.ts +492 -0
  808. package/src/interactive/interactive-subscriptions.ts +111 -0
  809. package/src/interactive/interactive-tickers.ts +152 -0
  810. package/src/interactive/keybinding-manager.ts +496 -0
  811. package/src/interactive/layout.ts +20 -0
  812. package/src/interactive/leader-key.ts +143 -0
  813. package/src/interactive/loop-guard-interrupt.ts +101 -0
  814. package/src/interactive/memory-overlay.ts +280 -0
  815. package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
  816. package/src/interactive/overlay-auth-lifecycle.ts +308 -0
  817. package/src/interactive/overlay-frame.ts +502 -0
  818. package/src/interactive/overlay-general-openers.ts +217 -0
  819. package/src/interactive/overlay-key-routing.ts +213 -0
  820. package/src/interactive/overlay-lifecycle.ts +413 -0
  821. package/src/interactive/overlay-model-selectors.ts +127 -0
  822. package/src/interactive/overlay-permission-lifecycle.ts +344 -0
  823. package/src/interactive/overlay-resource-openers.ts +112 -0
  824. package/src/interactive/overlay-session-lifecycle.ts +270 -0
  825. package/src/interactive/overlay-transitions.ts +57 -0
  826. package/src/interactive/overlays/agents.ts +69 -0
  827. package/src/interactive/overlays/ask-user.ts +921 -0
  828. package/src/interactive/overlays/auth-dialog.ts +221 -0
  829. package/src/interactive/overlays/context-reset.ts +108 -0
  830. package/src/interactive/overlays/cwd-fallback.ts +141 -0
  831. package/src/interactive/overlays/extensions.ts +54 -0
  832. package/src/interactive/overlays/help-reference.ts +140 -0
  833. package/src/interactive/overlays/interop.ts +139 -0
  834. package/src/interactive/overlays/keybinding-detail.ts +90 -0
  835. package/src/interactive/overlays/list-overlay.ts +606 -0
  836. package/src/interactive/overlays/message-picker.ts +155 -0
  837. package/src/interactive/overlays/model-selector.ts +1091 -0
  838. package/src/interactive/overlays/prompts.ts +72 -0
  839. package/src/interactive/overlays/session-selector-search.ts +31 -0
  840. package/src/interactive/overlays/session-selector.ts +266 -0
  841. package/src/interactive/overlays/settings.ts +3363 -0
  842. package/src/interactive/overlays/skills-hub.ts +237 -0
  843. package/src/interactive/overlays/tree-selector.ts +387 -0
  844. package/src/interactive/permission-overlay.ts +170 -0
  845. package/src/interactive/render-trace.ts +125 -0
  846. package/src/interactive/renderers/branch-summary.ts +86 -0
  847. package/src/interactive/renderers/code-ink.ts +420 -0
  848. package/src/interactive/renderers/compaction-summary.ts +112 -0
  849. package/src/interactive/renderers/diff.ts +126 -0
  850. package/src/interactive/renderers/notice.ts +28 -0
  851. package/src/interactive/renderers/retry-status.ts +31 -0
  852. package/src/interactive/renderers/structured.ts +89 -0
  853. package/src/interactive/renderers/tool-execution.ts +1104 -0
  854. package/src/interactive/renderers/worker-entry.ts +264 -0
  855. package/src/interactive/session-last-turn.ts +186 -0
  856. package/src/interactive/session-transcript.ts +105 -0
  857. package/src/interactive/session-usage-reseed.ts +74 -0
  858. package/src/interactive/slash-autocomplete.ts +364 -0
  859. package/src/interactive/slash-commands.ts +1319 -0
  860. package/src/interactive/slash-spec.ts +453 -0
  861. package/src/interactive/status/controller.ts +256 -0
  862. package/src/interactive/status/index.ts +23 -0
  863. package/src/interactive/status/state-machine.ts +530 -0
  864. package/src/interactive/status/summary.ts +170 -0
  865. package/src/interactive/status/types.ts +121 -0
  866. package/src/interactive/status/verbs.ts +163 -0
  867. package/src/interactive/status/watchdog.ts +24 -0
  868. package/src/interactive/tasks-overlay.ts +186 -0
  869. package/src/interactive/theme/components.ts +55 -0
  870. package/src/interactive/theme/glyphs.ts +70 -0
  871. package/src/interactive/theme/index.ts +15 -0
  872. package/src/interactive/theme/labels.ts +88 -0
  873. package/src/interactive/theme/rules.ts +138 -0
  874. package/src/interactive/theme/segments.ts +88 -0
  875. package/src/interactive/theme/tokens.ts +121 -0
  876. package/src/interactive/thinking-level-policy.ts +6 -0
  877. package/src/interactive/tool-prose-loop.ts +122 -0
  878. package/src/interactive/tool-prose-registration.ts +48 -0
  879. package/src/interactive/turn-context.ts +854 -0
  880. package/src/interactive/turn-middleware.ts +283 -0
  881. package/src/interactive/turn-persistence.ts +441 -0
  882. package/src/interactive/turn-queues.ts +169 -0
  883. package/src/interactive/turn-recovery.ts +306 -0
  884. package/src/interactive/turn-runtime.ts +802 -0
  885. package/src/interactive/turn-state.ts +123 -0
  886. package/src/interactive/view/artifacts.ts +1342 -0
  887. package/src/interactive/view/view-overlay.ts +732 -0
  888. package/src/interactive/welcome-dashboard.ts +536 -0
  889. package/src/interactive/worker-receipts.ts +94 -0
  890. package/src/interactive/worker-replay.ts +111 -0
  891. package/src/interactive/worker-share.ts +100 -0
  892. package/src/interactive/worker-stream.ts +442 -0
  893. package/src/interactive/workspace-facts.ts +141 -0
  894. package/src/tools/agent-tools.ts +382 -0
  895. package/src/tools/artifact.ts +103 -0
  896. package/src/tools/ask-user.ts +656 -0
  897. package/src/tools/bash.ts +176 -0
  898. package/src/tools/bootstrap.ts +474 -0
  899. package/src/tools/codewiki/code-nav.ts +563 -0
  900. package/src/tools/codewiki/shared.ts +115 -0
  901. package/src/tools/compete-worktrees.ts +898 -0
  902. package/src/tools/context/docs-engine.ts +619 -0
  903. package/src/tools/context/index.ts +435 -0
  904. package/src/tools/credential-present.ts +151 -0
  905. package/src/tools/dispatch-arguments.ts +228 -0
  906. package/src/tools/dispatch-plan.ts +741 -0
  907. package/src/tools/dispatch-scout.ts +461 -0
  908. package/src/tools/dispatch.ts +3338 -0
  909. package/src/tools/edit-diff.ts +534 -0
  910. package/src/tools/edit.ts +128 -0
  911. package/src/tools/executables.ts +22 -0
  912. package/src/tools/file-mutation-queue.ts +35 -0
  913. package/src/tools/find.ts +292 -0
  914. package/src/tools/grep.ts +495 -0
  915. package/src/tools/ignore-policy.ts +169 -0
  916. package/src/tools/ledger.ts +206 -0
  917. package/src/tools/ls.ts +110 -0
  918. package/src/tools/monitor.ts +797 -0
  919. package/src/tools/network-policy.ts +29 -0
  920. package/src/tools/observation.ts +421 -0
  921. package/src/tools/observers.ts +99 -0
  922. package/src/tools/path-utils.ts +79 -0
  923. package/src/tools/policy.ts +154 -0
  924. package/src/tools/profiles.ts +108 -0
  925. package/src/tools/read.ts +173 -0
  926. package/src/tools/registry.ts +1157 -0
  927. package/src/tools/result-shaping.ts +204 -0
  928. package/src/tools/safe-exec.ts +128 -0
  929. package/src/tools/spawn-hygiene.ts +182 -0
  930. package/src/tools/steer.ts +88 -0
  931. package/src/tools/string-enum.ts +15 -0
  932. package/src/tools/tasks.ts +168 -0
  933. package/src/tools/truncate-utf8.ts +17 -0
  934. package/src/tools/truncate.ts +202 -0
  935. package/src/tools/verify/frontend.ts +685 -0
  936. package/src/tools/verify/index.ts +66 -0
  937. package/src/tools/verify/scripts.ts +108 -0
  938. package/src/tools/web-fetch.ts +777 -0
  939. package/src/tools/worker-evidence.ts +215 -0
  940. package/src/tools/write.ts +52 -0
  941. package/src/utils/exif-orientation.ts +192 -0
  942. package/src/utils/git.ts +24 -0
  943. package/src/utils/image-resize.ts +148 -0
  944. package/src/utils/photon.ts +103 -0
  945. package/src/worker/control-lane.ts +22 -0
  946. package/src/worker/entry.ts +257 -0
  947. package/src/worker/event-projection.ts +56 -0
  948. package/src/worker/heartbeat.ts +24 -0
  949. package/src/worker/ledger-mirror.ts +95 -0
  950. package/src/worker/ndjson.ts +40 -0
  951. package/src/worker/protocol.ts +529 -0
  952. package/src/worker/resource-facts.ts +79 -0
  953. package/src/worker/runtime-registry.ts +12 -0
  954. package/src/worker/spec-contract.ts +654 -0
  955. package/src/worker/stdin-demux.ts +316 -0
  956. package/dist/acp-UMLFVA3F.js +0 -92
  957. package/dist/chunk-262G75JS.js +0 -35
  958. package/dist/chunk-5LDRNKX2.js +0 -1063
  959. package/dist/chunk-67MTHP2E.js +0 -135
  960. package/dist/chunk-GOTUR54M.js +0 -9
  961. package/dist/chunk-TPOCL34A.js +0 -2876
  962. package/dist/chunk-XV4ZJ6ZM.js +0 -3177
  963. package/dist/clio-KIQ5SNDS.js +0 -53
  964. package/dist/configure-G4E3A2PG.js +0 -27
  965. package/dist/doctor-M5HJJZOL.js +0 -61
  966. package/dist/domains/agents/builtins/architect.md +0 -33
  967. package/dist/domains/agents/builtins/coder.md +0 -31
  968. package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
  969. package/dist/domains/agents/builtins/debugger.md +0 -30
  970. package/dist/domains/agents/builtins/documenter.md +0 -31
  971. package/dist/domains/agents/builtins/git-master.md +0 -30
  972. package/dist/domains/agents/builtins/provenance.md +0 -30
  973. package/dist/domains/agents/builtins/researcher.md +0 -71
  974. package/dist/domains/agents/builtins/scout.md +0 -42
  975. package/dist/domains/agents/builtins/tester.md +0 -31
  976. package/dist/domains/agents/builtins/verifier.md +0 -30
  977. package/dist/domains/agents/builtins/wiki-writer.md +0 -41
  978. package/dist/fleet-preflight-CLIAX7YR.js +0 -21
  979. package/dist/preload-KZVHET2B.js +0 -11
  980. package/dist/version-ROZ6CZKH.js +0 -16
  981. package/skills/git/commit-crafting/SKILL.md +0 -79
  982. package/skills/git/commit-crafting/evals.md +0 -92
  983. package/skills/git/create-pr/SKILL.md +0 -116
  984. package/skills/git/create-pr/evals.md +0 -114
  985. package/skills/git/investigate-issue/SKILL.md +0 -139
  986. package/skills/git/investigate-issue/evals.md +0 -94
  987. package/skills/git/review-changes/SKILL.md +0 -103
  988. package/skills/git/review-changes/evals.md +0 -85
@@ -0,0 +1,255 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { clioConfigDir } from "../../../core/xdg.js";
4
+ import {
5
+ type InstallSkillInput,
6
+ type InstallSkillResult,
7
+ installSkillFromSource,
8
+ isSkillName,
9
+ parseSkillSourceSpec,
10
+ } from "./install.js";
11
+ import { loadSkills, type Skill } from "./loader.js";
12
+
13
+ /**
14
+ * Local skill marketplace. Entries come from two real sources only:
15
+ *
16
+ * 1. A catalog directory of actual SKILL.md packages (for example the
17
+ * repo-level skills/ folder, or CLIO_CODER_SKILL_CATALOG_DIR). Metadata is read
18
+ * from the packages themselves via the normal skill loader.
19
+ * 2. A JSON index file (CLIO_CODER_SKILL_MARKETPLACE_INDEX or
20
+ * <config>/skill-marketplace.json) whose entries point at installable
21
+ * sources.
22
+ *
23
+ * There is no synthetic or hardcoded marketplace data; an empty result means
24
+ * no marketplace is configured.
25
+ */
26
+
27
+ export type MarketplaceSkillOrigin = "catalog" | "index";
28
+
29
+ /**
30
+ * The diagnostic that means "nothing is wrong, nothing is configured". Callers
31
+ * that render an empty state of their own separate it from real failures (an
32
+ * unreadable index, a broken package) by identity rather than by string match.
33
+ */
34
+ export const MARKETPLACE_UNCONFIGURED = "no local skill marketplace catalog or index configured";
35
+
36
+ export interface MarketplaceSkill {
37
+ name: string;
38
+ description: string;
39
+ /** Local path or URL accepted by `clio-coder skills install`. */
40
+ sourceUrl: string;
41
+ version?: string;
42
+ audit?: "pass" | "warn" | "fail" | "unknown";
43
+ /** Catalog grouping ("git", "research", ...); absent in a flat catalog. */
44
+ category?: string;
45
+ origin: MarketplaceSkillOrigin;
46
+ }
47
+
48
+ export type MarketplaceStatus = "installed" | "installable" | "unavailable";
49
+
50
+ export interface MarketplaceDiscoveryResult {
51
+ status: MarketplaceStatus;
52
+ skills: MarketplaceSkill[];
53
+ diagnostics: string[];
54
+ }
55
+
56
+ export interface DiscoverMarketplaceOptions {
57
+ /** Working directory used to find a repo-level skills/ catalog. */
58
+ cwd?: string;
59
+ /** Override the JSON index path; null disables the JSON index source. */
60
+ indexPath?: string | null;
61
+ /** Override the catalog directory; null disables catalog discovery. */
62
+ catalogDir?: string | null;
63
+ }
64
+
65
+ function defaultIndexPath(): string | null {
66
+ try {
67
+ return path.join(clioConfigDir(), "skill-marketplace.json");
68
+ } catch {
69
+ return null;
70
+ }
71
+ }
72
+
73
+ function isIndexSkill(value: unknown): value is { name: string; description: string; sourceUrl: string } {
74
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
75
+ const record = value as Record<string, unknown>;
76
+ return (
77
+ typeof record.name === "string" &&
78
+ record.name.trim().length > 0 &&
79
+ typeof record.description === "string" &&
80
+ typeof record.sourceUrl === "string" &&
81
+ record.sourceUrl.trim().length > 0
82
+ );
83
+ }
84
+
85
+ function optionalString(value: unknown): string | undefined {
86
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
87
+ }
88
+
89
+ function indexAudit(value: unknown): MarketplaceSkill["audit"] {
90
+ return value === "pass" || value === "warn" || value === "fail" || value === "unknown" ? value : undefined;
91
+ }
92
+
93
+ function indexSkills(indexPath: string, diagnostics: string[]): MarketplaceSkill[] {
94
+ try {
95
+ const parsed = JSON.parse(readFileSync(indexPath, "utf8")) as unknown;
96
+ const rawSkills = Array.isArray(parsed)
97
+ ? parsed
98
+ : parsed && typeof parsed === "object" && Array.isArray((parsed as { skills?: unknown }).skills)
99
+ ? (parsed as { skills: unknown[] }).skills
100
+ : [];
101
+ return rawSkills.filter(isIndexSkill).map((skill) => {
102
+ const record = skill as unknown as Record<string, unknown>;
103
+ // Version, audit and category are published by `npm run skills:pin`.
104
+ // They are advisory display metadata; an index entry stays installable
105
+ // without them, which is why only name/description/sourceUrl gate.
106
+ const version = optionalString(record.version);
107
+ const audit = indexAudit(record.audit);
108
+ const category = optionalString(record.category);
109
+ return {
110
+ name: skill.name.trim(),
111
+ description: skill.description.trim(),
112
+ sourceUrl: skill.sourceUrl.trim(),
113
+ ...(version ? { version } : {}),
114
+ ...(audit ? { audit } : {}),
115
+ ...(category ? { category } : {}),
116
+ origin: "index" as const,
117
+ };
118
+ });
119
+ } catch (err) {
120
+ diagnostics.push(`skill marketplace index unreadable: ${err instanceof Error ? err.message : String(err)}`);
121
+ return [];
122
+ }
123
+ }
124
+
125
+ /**
126
+ * True when the directory contains a <pkg>/SKILL.md either immediately (flat
127
+ * catalog) or one category folder down (grouped catalog, e.g.
128
+ * skills/git/ship/SKILL.md). The loader itself recurses arbitrarily;
129
+ * this probe only decides whether a repo-level skills/ folder is a catalog.
130
+ */
131
+ function looksLikeSkillCatalog(dir: string): boolean {
132
+ if (!existsSync(dir)) return false;
133
+ try {
134
+ return readdirSync(dir, { withFileTypes: true }).some((entry) => {
135
+ if (!entry.isDirectory()) return false;
136
+ const child = path.join(dir, entry.name);
137
+ if (existsSync(path.join(child, "SKILL.md"))) return true;
138
+ try {
139
+ return readdirSync(child, { withFileTypes: true }).some(
140
+ (inner) => inner.isDirectory() && existsSync(path.join(child, inner.name, "SKILL.md")),
141
+ );
142
+ } catch {
143
+ return false;
144
+ }
145
+ });
146
+ } catch {
147
+ return false;
148
+ }
149
+ }
150
+
151
+ function resolveCatalogDir(options: DiscoverMarketplaceOptions): string | null {
152
+ if (options.catalogDir === null) return null;
153
+ if (options.catalogDir) return path.resolve(options.catalogDir);
154
+ const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
155
+ if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv.trim());
156
+ const repoCatalog = path.join(options.cwd ?? process.cwd(), "skills");
157
+ return looksLikeSkillCatalog(repoCatalog) ? repoCatalog : null;
158
+ }
159
+
160
+ /**
161
+ * The catalog folder a package sits in, which is the grouping `--category`
162
+ * installs by. A flat catalog has none, and a package outside the catalog dir
163
+ * (which `path.relative` reports with a leading "..") is not grouped by it.
164
+ */
165
+ function catalogCategory(catalogDir: string, baseDir: string): string | undefined {
166
+ const rel = path.relative(catalogDir, baseDir);
167
+ const category = path.dirname(rel);
168
+ if (rel.length === 0 || rel.startsWith("..") || category === "." || category.startsWith("..")) return undefined;
169
+ return category;
170
+ }
171
+
172
+ function catalogEntry(skill: Skill, catalogDir: string): MarketplaceSkill {
173
+ const version = typeof skill.metadata.version === "string" ? skill.metadata.version : undefined;
174
+ const category = catalogCategory(catalogDir, skill.baseDir);
175
+ return {
176
+ name: skill.name,
177
+ description: skill.description,
178
+ sourceUrl: skill.baseDir,
179
+ ...(version ? { version } : {}),
180
+ ...(skill.provenance?.audit ? { audit: skill.provenance.audit } : {}),
181
+ ...(category ? { category } : {}),
182
+ origin: "catalog",
183
+ };
184
+ }
185
+
186
+ function catalogSkills(dir: string, diagnostics: string[]): MarketplaceSkill[] {
187
+ const list = loadSkills({ disableDiscovery: true, explicitSkillPaths: [dir] });
188
+ for (const diag of list.diagnostics) {
189
+ if (diag.type === "warning" || diag.type === "error") diagnostics.push(diag.message);
190
+ }
191
+ return list.items.map((skill) => catalogEntry(skill, dir));
192
+ }
193
+
194
+ export function discoverMarketplaceSkills(options: DiscoverMarketplaceOptions = {}): MarketplaceDiscoveryResult {
195
+ const diagnostics: string[] = [];
196
+ const skills: MarketplaceSkill[] = [];
197
+ const seen = new Set<string>();
198
+
199
+ // Catalog packages first: real local files beat index pointers on name collisions.
200
+ const catalogDir = resolveCatalogDir(options);
201
+ if (catalogDir) {
202
+ for (const skill of catalogSkills(catalogDir, diagnostics)) {
203
+ if (seen.has(skill.name)) continue;
204
+ seen.add(skill.name);
205
+ skills.push(skill);
206
+ }
207
+ }
208
+
209
+ const indexPath =
210
+ options.indexPath === null ? null : (options.indexPath ?? process.env.CLIO_CODER_SKILL_MARKETPLACE_INDEX ?? null);
211
+ const resolvedIndexPath = indexPath ?? defaultIndexPath();
212
+ if (options.indexPath !== null && resolvedIndexPath && existsSync(resolvedIndexPath)) {
213
+ for (const skill of indexSkills(resolvedIndexPath, diagnostics)) {
214
+ if (seen.has(skill.name)) continue;
215
+ seen.add(skill.name);
216
+ skills.push(skill);
217
+ }
218
+ }
219
+
220
+ if (skills.length === 0 && diagnostics.length === 0) {
221
+ diagnostics.push(MARKETPLACE_UNCONFIGURED);
222
+ }
223
+ return { status: skills.length > 0 ? "installable" : "unavailable", skills, diagnostics };
224
+ }
225
+
226
+ export function getMarketplaceSkills(options: DiscoverMarketplaceOptions = {}): MarketplaceSkill[] {
227
+ return discoverMarketplaceSkills(options).skills;
228
+ }
229
+
230
+ /**
231
+ * The single install entry point for every frontend (headless CLI, TUI
232
+ * pending-skill prompt, skills hub). Source resolution, in precedence order:
233
+ *
234
+ * 1. A GitHub URL installs directly.
235
+ * 2. An existing local path installs directly; paths always beat same-named
236
+ * marketplace entries.
237
+ * 3. A bare skill name resolves through the local marketplace.
238
+ *
239
+ * Anything else is an error naming both failed interpretations. Overwriting
240
+ * an existing install always requires an explicit `force: true`.
241
+ */
242
+ export function installSkill(input: InstallSkillInput): InstallSkillResult {
243
+ const source = input.source.trim();
244
+ const spec = parseSkillSourceSpec(source);
245
+ if (spec?.kind === "local" && isSkillName(source) && !existsSync(spec.path)) {
246
+ const skill = getMarketplaceSkills({ ...(input.cwd ? { cwd: input.cwd } : {}) }).find(
247
+ (entry) => entry.name === source,
248
+ );
249
+ if (!skill) {
250
+ throw new Error(`"${source}" is neither an existing local path nor available in the local marketplace`);
251
+ }
252
+ return installSkillFromSource({ ...input, source: skill.sourceUrl });
253
+ }
254
+ return installSkillFromSource(input);
255
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Local-first skill provenance pinning.
3
+ *
4
+ * `skills/registry.yaml` (regenerated with `npm run skills:pin`) pins the
5
+ * provenance-stripped sha256 of every marketplace skill's SKILL.md. At
6
+ * activation time, a skill carrying marketplace provenance (`registry-id`
7
+ * frontmatter) is compared against the pinned entry on the same normalized
8
+ * hash, so install-lifecycle stamps (`installed-at`, `installed-hash`, ...)
9
+ * never read as drift while any content or registry-identity edit does. A
10
+ * mismatch means the installed content drifted from its audited form. Drift
11
+ * never blocks; skills still pass through the normal tool safety gates. No
12
+ * network, no remote registry, no signing; this is hash comparison against a
13
+ * local manifest.
14
+ */
15
+
16
+ import { existsSync, readFileSync } from "node:fs";
17
+ import path from "node:path";
18
+ import yaml from "yaml";
19
+
20
+ export const SKILL_PIN_MANIFEST_FILENAME = "registry.yaml";
21
+
22
+ export interface SkillPinEntry {
23
+ name: string;
24
+ version: string | null;
25
+ sha256: string;
26
+ }
27
+
28
+ export type SkillDriftVerdict = "match" | "mismatch";
29
+
30
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
31
+ return typeof value === "object" && value !== null && !Array.isArray(value);
32
+ }
33
+
34
+ /** Resolve the manifest path using the same catalog resolution as the marketplace. */
35
+ function resolveSkillPinManifestPath(cwd: string): string | null {
36
+ const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
37
+ const catalogDir = fromEnv && fromEnv.trim().length > 0 ? path.resolve(fromEnv.trim()) : path.join(cwd, "skills");
38
+ const manifestPath = path.join(catalogDir, SKILL_PIN_MANIFEST_FILENAME);
39
+ return existsSync(manifestPath) ? manifestPath : null;
40
+ }
41
+
42
+ function loadSkillPinManifest(manifestPath: string): Map<string, SkillPinEntry> | null {
43
+ let parsed: unknown;
44
+ try {
45
+ parsed = yaml.parse(readFileSync(manifestPath, "utf8"));
46
+ } catch {
47
+ return null;
48
+ }
49
+ if (!isPlainObject(parsed) || !Array.isArray(parsed.skills)) return null;
50
+ const entries = new Map<string, SkillPinEntry>();
51
+ for (const raw of parsed.skills) {
52
+ if (!isPlainObject(raw)) continue;
53
+ const name = typeof raw.name === "string" ? raw.name.trim() : "";
54
+ const sha256 = typeof raw.sha256 === "string" ? raw.sha256.trim().toLowerCase() : "";
55
+ if (name.length === 0 || !/^[0-9a-f]{64}$/.test(sha256)) continue;
56
+ entries.set(name, {
57
+ name,
58
+ version: typeof raw.version === "string" && raw.version.trim().length > 0 ? raw.version.trim() : null,
59
+ sha256,
60
+ });
61
+ }
62
+ return entries;
63
+ }
64
+
65
+ /** Which recorded hash the activated content was measured against. */
66
+ export type SkillDriftAuthority = "pinned-manifest" | "install-record";
67
+
68
+ export interface SkillDriftReport {
69
+ verdict: SkillDriftVerdict;
70
+ authority: SkillDriftAuthority;
71
+ /** The hash the content was compared against, for the operator's record. */
72
+ expected: string;
73
+ }
74
+
75
+ /**
76
+ * Compare an activated skill against whatever recorded hash can speak for it.
77
+ *
78
+ * Two independent authorities, tried in that order because they answer
79
+ * different questions. The pinned manifest says what the audited catalog
80
+ * entry's content is, so it wins wherever it has an entry. The skill's own
81
+ * `installed-hash` frontmatter says what this machine wrote at install time,
82
+ * which is the only evidence available for a skill installed straight from a
83
+ * URL, and it catches the case the manifest cannot see at all: content edited
84
+ * on disk after installation.
85
+ *
86
+ * Both compare on the provenance-stripped hash, so install-lifecycle stamps
87
+ * never read as drift while any content or registry-identity edit does. Null
88
+ * means nothing recorded a hash for this skill; drift evidence is opt-in and
89
+ * never a gate, and skills still pass the normal tool safety gates either way.
90
+ */
91
+ export function checkSkillDrift(
92
+ skill: { name: string; normalizedHash: string; provenance?: { installedHash?: string } },
93
+ cwd: string,
94
+ ): SkillDriftReport | null {
95
+ const actual = skill.normalizedHash.toLowerCase();
96
+ const manifestPath = resolveSkillPinManifestPath(cwd);
97
+ const manifest = manifestPath === null ? null : loadSkillPinManifest(manifestPath);
98
+ const pinned = manifest?.get(skill.name);
99
+ if (pinned !== undefined) {
100
+ return {
101
+ verdict: pinned.sha256 === actual ? "match" : "mismatch",
102
+ authority: "pinned-manifest",
103
+ expected: pinned.sha256,
104
+ };
105
+ }
106
+ const recorded = skill.provenance?.installedHash?.trim().toLowerCase();
107
+ if (recorded !== undefined && /^[0-9a-f]{64}$/.test(recorded)) {
108
+ return {
109
+ verdict: recorded === actual ? "match" : "mismatch",
110
+ authority: "install-record",
111
+ expected: recorded,
112
+ };
113
+ }
114
+ return null;
115
+ }
@@ -0,0 +1,268 @@
1
+ import path from "node:path";
2
+ import { artifactDefaultPath } from "../../core/artifact-paths.js";
3
+ import { canonicalizeExistingPath } from "../../core/path-canonical.js";
4
+ import { ToolNames } from "../../core/tool-names.js";
5
+ import { extractCommandCdTargets, extractCommandWriteTargets } from "./protected-artifacts.js";
6
+
7
+ /**
8
+ * Deterministic action classifier for tool calls. Pure function, no I/O, no
9
+ * state. Slice 3 wires it into dispatch admission and audit. This module only
10
+ * owns the mapping from (tool, args) to an ActionClass.
11
+ */
12
+
13
+ export type ActionClass = "read" | "write" | "execute" | "dispatch" | "system_modify" | "git_destructive" | "unknown";
14
+
15
+ export interface ClassifierCall {
16
+ tool: string;
17
+ args?: Record<string, unknown>;
18
+ }
19
+
20
+ export interface Classification {
21
+ actionClass: ActionClass;
22
+ reasons: ReadonlyArray<string>;
23
+ }
24
+
25
+ interface NamedPattern {
26
+ name: string;
27
+ re: RegExp;
28
+ }
29
+
30
+ const GIT_DESTRUCTIVE_PATTERNS: ReadonlyArray<NamedPattern> = [
31
+ { name: "git-push-force-long", re: /\bgit\s+push\s+--force\b/i },
32
+ { name: "git-push-force-short", re: /\bgit\s+push\s+-f\b/i },
33
+ { name: "git-reset-hard", re: /\bgit\s+reset\s+--hard\b/i },
34
+ { name: "git-clean-fd", re: /\bgit\s+clean\s+-fd?\b/i },
35
+ { name: "git-checkout-dot", re: /\bgit\s+checkout\s+--\s+\./i },
36
+ { name: "git-branch-D", re: /\bgit\s+branch\s+-D\b/i },
37
+ { name: "git-restore-source", re: /\bgit\s+restore\s+--source\b/i },
38
+ ];
39
+
40
+ const SYSTEM_MODIFY_PATTERNS: ReadonlyArray<NamedPattern> = [
41
+ { name: "sudo-or-doas", re: /\b(sudo|doas)\b/i },
42
+ // allow rm -rf /tmp/... and /var/tmp/... but flag everything else rooted at /
43
+ { name: "rm-rf-root", re: /\brm\s+-rf?\s+\/(?!(tmp|var\/tmp)(?:\/|\s|$))/i },
44
+ { name: "apt-install", re: /\bapt(-get)?\s+(install|remove|purge)/i },
45
+ { name: "brew-install", re: /\bbrew\s+(install|uninstall|reinstall)/i },
46
+ { name: "npm-install-global", re: /\bnpm\s+install\s+-g\b/i },
47
+ { name: "pip-install", re: /\bpip\s+install\b/i },
48
+ { name: "systemctl", re: /\bsystemctl\s+/i },
49
+ { name: "chmod-root", re: /\bchmod\s+[0-7]{3,4}\s+\//i },
50
+ { name: "chown", re: /\bchown\s+/i },
51
+ ];
52
+
53
+ /**
54
+ * `/run` is here because path resolution canonicalizes symlinks: on every
55
+ * systemd distribution `/var/run` is a symlink to `/run` and `/var/lock` to
56
+ * `/run/lock`, so a write aimed at either landed on a path no prefix covered
57
+ * and escaped the system-root rule whenever the workspace happened to sit
58
+ * under it. Found while auditing the `/var` subdirectories for the carve-out
59
+ * below.
60
+ */
61
+ const SYSTEM_WRITE_ROOT_PREFIXES: ReadonlyArray<string> = ["/etc", "/usr", "/var", "/bin", "/sbin", "/run"];
62
+
63
+ /**
64
+ * Temp trees that sit under a protected root but are ordinary scratch space,
65
+ * not system state. `/var/tmp` is the FHS's persistent temp directory and
66
+ * `/var/folders` is macOS's per-user temp tree, and both are where an operator
67
+ * or a harness puts a throwaway workspace. Classifying them as system_modify
68
+ * made every mutating call from a workspace there require a confirmation, which
69
+ * headless runs answer with a denial: a `clio-coder run` in a `/var/tmp` sandbox
70
+ * could not write one byte, and the model's recovery was to report work it had
71
+ * not done. The exemption is a carve-out rather than an enumeration of the
72
+ * system directories under `/var` on purpose: `/var/log`, `/var/lib`,
73
+ * `/var/spool`, `/var/db` and every other subdirectory, including ones this
74
+ * list has never heard of, stay exactly as protected as before.
75
+ *
76
+ * `rm -rf` already reads the same line (SYSTEM_MODIFY_PATTERNS rm-rf-root
77
+ * exempts `/tmp` and `/var/tmp`), so the two checks now agree.
78
+ */
79
+ const SYSTEM_WRITE_EXEMPT_PREFIXES: ReadonlyArray<string> = ["/var/tmp", "/var/folders"];
80
+
81
+ function isUnderPrefix(abs: string, prefix: string): boolean {
82
+ return abs === prefix || abs.startsWith(`${prefix}/`);
83
+ }
84
+
85
+ function baseClassify(tool: string): ActionClass | null {
86
+ switch (tool) {
87
+ case ToolNames.Read:
88
+ case ToolNames.Grep:
89
+ case ToolNames.Find:
90
+ case ToolNames.Ls:
91
+ case ToolNames.WebFetch:
92
+ case ToolNames.Git:
93
+ case ToolNames.CodeNav:
94
+ case ToolNames.Context:
95
+ case ToolNames.Monitor:
96
+ case ToolNames.AskUser:
97
+ case ToolNames.CredentialPresent:
98
+ // tasks mutates only the session's task ledger, never the workspace,
99
+ // so it stays read class and is never gated behind a confirmation.
100
+ case ToolNames.Tasks:
101
+ // ledger posts a typed contribution to a coordination board and reads a
102
+ // local mirror. Neither touches the workspace, so it is never gated
103
+ // behind a confirmation.
104
+ case ToolNames.Ledger:
105
+ return "read";
106
+ case ToolNames.Write:
107
+ case ToolNames.Edit:
108
+ case ToolNames.Artifact:
109
+ return "write";
110
+ case ToolNames.Bash:
111
+ case ToolNames.Verify:
112
+ return "execute";
113
+ case ToolNames.Dispatch:
114
+ case ToolNames.Steer:
115
+ return "dispatch";
116
+ default:
117
+ return null;
118
+ }
119
+ }
120
+
121
+ function scanStringOf(args: Record<string, unknown> | undefined): string {
122
+ if (!args) return "";
123
+ const parts: string[] = [];
124
+ for (const value of Object.values(args)) {
125
+ if (value == null) continue;
126
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
127
+ parts.push(String(value));
128
+ } else {
129
+ try {
130
+ parts.push(JSON.stringify(value));
131
+ } catch {
132
+ // ignore values that cannot be serialized
133
+ }
134
+ }
135
+ }
136
+ return parts.join(" ");
137
+ }
138
+
139
+ function matchFirst(patterns: ReadonlyArray<NamedPattern>, haystack: string): NamedPattern | null {
140
+ for (const p of patterns) {
141
+ if (p.re.test(haystack)) return p;
142
+ }
143
+ return null;
144
+ }
145
+
146
+ function resolveCandidate(p: string, baseCwd?: string): string {
147
+ // ~ expansion is not performed here; any ~-prefixed path is treated as an
148
+ // absolute user-home reference. We keep it as-is so the caller-visible
149
+ // string drives the escape check, and classify conservatively as modify.
150
+ if (p.startsWith("~")) return p;
151
+ const base = canonicalizeExistingPath(path.resolve(baseCwd ?? process.cwd()));
152
+ const resolved = path.isAbsolute(p) ? path.resolve(p) : path.resolve(base, p);
153
+ return canonicalizeExistingPath(resolved);
154
+ }
155
+
156
+ function isInsideCwd(abs: string): boolean {
157
+ const cwd = canonicalizeExistingPath(path.resolve(process.cwd()));
158
+ const candidate = canonicalizeExistingPath(abs);
159
+ const rel = path.relative(cwd, candidate);
160
+ return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
161
+ }
162
+
163
+ function writePathClass(pathArg: string, baseCwd?: string): { cls: "system_modify" | "write"; reason?: string } {
164
+ if (pathArg.startsWith("~")) {
165
+ return { cls: "system_modify", reason: `write-path-home-escape: ${pathArg}` };
166
+ }
167
+ const abs = resolveCandidate(pathArg, baseCwd);
168
+ const exempt = SYSTEM_WRITE_EXEMPT_PREFIXES.some((prefix) => isUnderPrefix(abs, prefix));
169
+ if (!exempt) {
170
+ for (const prefix of SYSTEM_WRITE_ROOT_PREFIXES) {
171
+ if (isUnderPrefix(abs, prefix)) {
172
+ return { cls: "system_modify", reason: `write-path-system-root: ${prefix}` };
173
+ }
174
+ }
175
+ }
176
+ if (!isInsideCwd(abs)) {
177
+ return { cls: "system_modify", reason: `write-path-outside-cwd: ${abs}` };
178
+ }
179
+ return { cls: "write" };
180
+ }
181
+
182
+ /**
183
+ * The artifact tool writes a default file name when the call names no path, so
184
+ * a classifier that only reads the path argument saw no target at all and
185
+ * returned plain write for a call that writes into whatever the cwd is. The
186
+ * live evidence: in a `/var/tmp` workspace where write, edit and every bash
187
+ * redirect were refused as system_modify, `artifact(kind:"report")` wrote a
188
+ * report into that same directory. The default now resolves through
189
+ * core/artifact-paths.ts, the one place the tool, the write-root check, and the
190
+ * protected-artifacts guard all read, so the four can never disagree.
191
+ */
192
+ function extractWritePath(tool: string, args: Record<string, unknown> | undefined): string | null {
193
+ const candidate = args?.path ?? args?.file_path ?? args?.filePath;
194
+ if (typeof candidate === "string" && candidate.length > 0) return candidate;
195
+ return tool === ToolNames.Artifact ? artifactDefaultPath(args?.kind) : null;
196
+ }
197
+
198
+ export function classify(call: ClassifierCall): Classification {
199
+ const base = baseClassify(call.tool);
200
+ if (base === null) {
201
+ return { actionClass: "unknown", reasons: [`unknown tool: ${call.tool}`] };
202
+ }
203
+
204
+ const reasons: string[] = [];
205
+
206
+ if (call.tool === ToolNames.Bash) {
207
+ const scan = scanStringOf(call.args);
208
+ const gitHit = matchFirst(GIT_DESTRUCTIVE_PATTERNS, scan);
209
+ if (gitHit) {
210
+ return { actionClass: "git_destructive", reasons: [`pattern:${gitHit.name}`] };
211
+ }
212
+ const sysHit = matchFirst(SYSTEM_MODIFY_PATTERNS, scan);
213
+ if (sysHit) {
214
+ return { actionClass: "system_modify", reasons: [`pattern:${sysHit.name}`] };
215
+ }
216
+ // Apply the same path-class gate we use for the write tool to every
217
+ // shell write-target the command exposes (redirects, tee, cp/mv
218
+ // destinations). Without this the model can dodge the write tool's
219
+ // confirmation gate by emitting `echo X > /tmp/foo.txt` after the user
220
+ // cancels the original write call. Relative write targets are
221
+ // resolved against the bash call's explicit cwd argument when
222
+ // supplied so a model cannot launder a write outside the workspace
223
+ // by combining a relative redirect with a cwd outside the workspace.
224
+ const command = typeof call.args?.command === "string" ? call.args.command : null;
225
+ const argCwd = typeof call.args?.cwd === "string" && call.args.cwd.length > 0 ? call.args.cwd : undefined;
226
+ if (command !== null) {
227
+ const targetReasons: string[] = [];
228
+ for (const target of extractCommandWriteTargets(command)) {
229
+ const decision = writePathClass(target, argCwd);
230
+ if (decision.cls === "system_modify") {
231
+ targetReasons.push(decision.reason ?? `bash-write-target: ${target}`);
232
+ }
233
+ }
234
+ // A `cd` outside the workspace re-bases every relative path after it,
235
+ // so static write-target extraction stops describing what the command
236
+ // touches. Escalate through the same system_modify confirm gate as an
237
+ // out-of-workspace write target; inside-workspace `cd` stays plain
238
+ // execute.
239
+ for (const target of extractCommandCdTargets(command)) {
240
+ if (target.startsWith("~")) {
241
+ targetReasons.push(`bash-cd-home-escape: ${target}`);
242
+ continue;
243
+ }
244
+ const abs = resolveCandidate(target, argCwd);
245
+ if (!isInsideCwd(abs)) {
246
+ targetReasons.push(`bash-cd-outside-workspace: ${abs}`);
247
+ }
248
+ }
249
+ if (targetReasons.length > 0) {
250
+ return { actionClass: "system_modify", reasons: targetReasons };
251
+ }
252
+ }
253
+ return { actionClass: "execute", reasons };
254
+ }
255
+
256
+ if (base === "write") {
257
+ const pathArg = extractWritePath(call.tool, call.args);
258
+ if (pathArg) {
259
+ const decision = writePathClass(pathArg);
260
+ if (decision.cls === "system_modify") {
261
+ return { actionClass: "system_modify", reasons: decision.reason ? [decision.reason] : [] };
262
+ }
263
+ }
264
+ return { actionClass: "write", reasons };
265
+ }
266
+
267
+ return { actionClass: base, reasons };
268
+ }
@@ -0,0 +1,23 @@
1
+ import type { AutonomyLevel } from "./autonomy.js";
2
+ import type { SafetyDecision } from "./contract.js";
3
+
4
+ /**
5
+ * Which axis produced an `ask`: a safety-net rail demands confirmation at
6
+ * every level, while an autonomy ask exists only because of the current level.
7
+ */
8
+ export type AskAxis = { kind: "autonomy" } | { kind: "net"; ruleId: string };
9
+
10
+ export function askAxis(decision: SafetyDecision): AskAxis {
11
+ if (decision.kind === "ask") {
12
+ if (decision.match) return { kind: "net", ruleId: decision.match.ruleId };
13
+ if (decision.policy?.kind === "ask") {
14
+ return { kind: "net", ruleId: decision.policy.ruleId ?? decision.policy.reasonCode };
15
+ }
16
+ }
17
+ return { kind: "autonomy" };
18
+ }
19
+
20
+ export function approvalAxisId(decision: SafetyDecision, level: AutonomyLevel): string {
21
+ const axis = askAxis(decision);
22
+ return axis.kind === "net" ? `net:${axis.ruleId}` : `autonomy:${level}`;
23
+ }