@iowarp/clio-coder 0.3.1 → 0.3.3

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 (601) hide show
  1. package/CHANGELOG.md +233 -373
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
  8. package/dist/chunk-2DJ2KNFG.js +2095 -0
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
  12. package/dist/chunk-2VTFPG5O.js +48 -0
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4VP4KH3K.js +962 -0
  16. package/dist/chunk-4XUGQOHA.js +797 -0
  17. package/dist/chunk-4ZG3XFUR.js +77 -0
  18. package/dist/chunk-5B2AEOW5.js +5407 -0
  19. package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
  20. package/dist/{chunk-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
  21. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  22. package/dist/chunk-65DEGPJ6.js +52 -0
  23. package/dist/chunk-6EJMN2Y3.js +17 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6SGHMWE3.js +277 -0
  26. package/dist/chunk-6XLNIQDB.js +27 -0
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/chunk-7MNJORFF.js +22 -0
  29. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  30. package/dist/chunk-AGYYIBLL.js +1069 -0
  31. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  32. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  33. package/dist/chunk-CBCAPZAA.js +229 -0
  34. package/dist/chunk-CMZWFGD2.js +352 -0
  35. package/dist/chunk-COU2UHX6.js +400 -0
  36. package/dist/chunk-DSELYM6W.js +1077 -0
  37. package/dist/chunk-DUYJ5IO6.js +644 -0
  38. package/dist/chunk-ECH6PKUQ.js +39 -0
  39. package/dist/chunk-ED4KHGC3.js +143 -0
  40. package/dist/chunk-EKMEHE4H.js +340 -0
  41. package/dist/chunk-FCSXB6T2.js +338 -0
  42. package/dist/chunk-FJ3H4MN5.js +48 -0
  43. package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G4BMMOKF.js +182 -0
  46. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  47. package/dist/chunk-HC4CLZ2Y.js +68 -0
  48. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  49. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  50. package/dist/chunk-I4HZDVNP.js +73 -0
  51. package/dist/chunk-IKCO5N3L.js +162 -0
  52. package/dist/chunk-IR4CFBFN.js +56 -0
  53. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  54. package/dist/chunk-J7CWMCQD.js +255 -0
  55. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  56. package/dist/chunk-KZWTDYJF.js +217 -0
  57. package/dist/chunk-LBMZMYH2.js +285 -0
  58. package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
  59. package/dist/chunk-LW6DSM3M.js +5135 -0
  60. package/dist/chunk-LWLEKMDQ.js +3482 -0
  61. package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
  62. package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
  63. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  64. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  65. package/dist/chunk-OAO4GE4M.js +619 -0
  66. package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
  67. package/dist/chunk-OKGUZO2U.js +34 -0
  68. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  69. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  70. package/dist/chunk-OQE5J4C6.js +73 -0
  71. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  72. package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
  73. package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
  74. package/dist/chunk-POHLU5DW.js +1186 -0
  75. package/dist/chunk-QKMUKYO7.js +4961 -0
  76. package/dist/chunk-SRDMMSEP.js +16405 -0
  77. package/dist/chunk-SST6Z5JA.js +80 -0
  78. package/dist/chunk-STBPMHSX.js +2456 -0
  79. package/dist/chunk-T6YILFSB.js +80 -0
  80. package/dist/chunk-TZK7PACC.js +174 -0
  81. package/dist/chunk-TZTZS7QK.js +227 -0
  82. package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
  83. package/dist/chunk-UOV2BYIW.js +107 -0
  84. package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
  85. package/dist/chunk-VAKQQHWR.js +434 -0
  86. package/dist/chunk-VG7TBQIY.js +128 -0
  87. package/dist/chunk-VJWL6YS5.js +244 -0
  88. package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-X4RCMKVQ.js +641 -0
  91. package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
  92. package/dist/chunk-XBXAASKX.js +18 -0
  93. package/dist/chunk-XN3L4EYL.js +46 -0
  94. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  95. package/dist/chunk-YHZX5GEU.js +193 -0
  96. package/dist/chunk-YXLYO42X.js +91 -0
  97. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  98. package/dist/chunk-ZI647VB5.js +37 -0
  99. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  100. package/dist/chunk-ZWMF7253.js +1882 -0
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-JOU4FXVA.js +25 -0
  103. package/dist/code-nav-7AX6FYE6.js +600 -0
  104. package/dist/codewiki/build-worker.js +66 -0
  105. package/dist/compile-cache-CVJMMODC.js +18 -0
  106. package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
  107. package/dist/{config-IRUQ7SE4.js → config-XCDVKR23.js} +92 -55
  108. package/dist/configure-4GAP54ZW.js +42 -0
  109. package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
  110. package/dist/context-5VKGUVJJ.js +866 -0
  111. package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
  126. package/dist/monitor-GE4ID3IA.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
  128. package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
  129. package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
  130. package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
  131. package/dist/{run-YTPEYQOH.js → run-ZU3QMZPZ.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
  137. package/dist/terminal-lease-BNAHVHBS.js +395 -0
  138. package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
  139. package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
  140. package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
  141. package/dist/{upgrade-33G2LMM5.js → upgrade-JQHHPQ4K.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
  143. package/dist/verify-375KUB3Y.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.js} +74 -34
  146. package/dist/worker/entry.js +221 -36
  147. package/dist/workspace-G4ZWUIPR.js +22 -0
  148. package/docs/README.md +22 -17
  149. package/docs/acp.md +168 -16
  150. package/docs/alcf-provider.md +1 -1
  151. package/docs/architecture.md +136 -7
  152. package/docs/artifact-versions.md +1 -1
  153. package/docs/built-in-agents.md +1 -1
  154. package/docs/capacity-and-scheduling.md +1 -1
  155. package/docs/commands-and-modes.md +114 -71
  156. package/docs/config-knobs-audit.md +1 -3
  157. package/docs/configuration-and-targets.md +174 -46
  158. package/docs/context-engine.md +29 -6
  159. package/docs/development-pipeline.md +26 -1
  160. package/docs/dispatch-architecture-rationale.md +1 -1
  161. package/docs/documentation-coverage.md +2 -2
  162. package/docs/documentation-guide.md +1 -1
  163. package/docs/environment-variables.md +13 -5
  164. package/docs/eval-runner.md +1 -1
  165. package/docs/evals-internal.md +1 -1
  166. package/docs/evidence-and-memory.md +6 -2
  167. package/docs/evolution.md +2 -2
  168. package/docs/exit-codes-and-output.md +15 -9
  169. package/docs/extensions-and-sharing.md +9 -9
  170. package/docs/fleet-dispatch.md +7 -5
  171. package/docs/git-commit-provenance.md +120 -0
  172. package/docs/glossary.md +1 -1
  173. package/docs/installation-and-lifecycle.md +34 -27
  174. package/docs/middleware-and-components.md +1 -1
  175. package/docs/model-catalog.md +45 -14
  176. package/docs/observability.md +8 -5
  177. package/docs/performance-methodology.md +491 -0
  178. package/docs/pi-boundary.md +72 -0
  179. package/docs/proactive-memory.md +3 -3
  180. package/docs/prompt-envelope-and-tools.md +24 -3
  181. package/docs/provider-adapter-cookbook.md +57 -4
  182. package/docs/release-cut-checklist.md +129 -115
  183. package/docs/safety-model.md +9 -5
  184. package/docs/scientific-validation.md +3 -3
  185. package/docs/session-lifecycle.md +55 -12
  186. package/docs/skills-marketplace.md +12 -8
  187. package/docs/time-conventions.md +1 -1
  188. package/docs/tool-usage.md +3 -3
  189. package/docs/trace-store.md +1 -1
  190. package/docs/troubleshooting.md +10 -7
  191. package/docs/tui-design.md +47 -10
  192. package/docs/worker-dispatch-mechanics.md +1 -1
  193. package/package.json +19 -22
  194. package/skills/coding/ast-grep/SKILL.md +136 -0
  195. package/skills/coding/ast-grep/evals.md +56 -0
  196. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  197. package/skills/coding/coding-standards/SKILL.md +113 -0
  198. package/skills/coding/coding-standards/evals.md +34 -0
  199. package/skills/coding/prototype/SKILL.md +86 -0
  200. package/skills/coding/prototype/evals.md +42 -0
  201. package/skills/coding/prototype/references/LOGIC.md +67 -0
  202. package/skills/coding/prototype/references/UI.md +112 -0
  203. package/skills/coding/tdd/SKILL.md +101 -0
  204. package/skills/coding/tdd/evals.md +41 -0
  205. package/skills/coding/tdd/references/mocking.md +59 -0
  206. package/skills/coding/tdd/references/tests.md +77 -0
  207. package/skills/context/context-handoff/SKILL.md +126 -0
  208. package/skills/context/context-handoff/evals.md +57 -0
  209. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  210. package/skills/context/context-prime/SKILL.md +95 -0
  211. package/skills/context/context-prime/evals.md +54 -0
  212. package/skills/meta/clio-dev/SKILL.md +91 -0
  213. package/skills/meta/clio-dev/evals.md +45 -0
  214. package/skills/meta/clio-test/SKILL.md +130 -0
  215. package/skills/meta/clio-test/evals.md +43 -0
  216. package/skills/meta/clio-test/references/harness.md +97 -0
  217. package/skills/meta/clio-test/references/test-map.md +59 -0
  218. package/skills/meta/credentials/SKILL.md +125 -0
  219. package/skills/meta/credentials/evals.md +104 -0
  220. package/skills/meta/find-skills/SKILL.md +72 -0
  221. package/skills/meta/find-skills/evals.md +47 -0
  222. package/skills/meta/herdr/SKILL.md +127 -0
  223. package/skills/meta/herdr/evals.md +38 -0
  224. package/skills/meta/skill-craft/SKILL.md +102 -0
  225. package/skills/meta/skill-craft/evals.md +41 -0
  226. package/skills/planning/architecture/SKILL.md +129 -0
  227. package/skills/planning/architecture/evals.md +36 -0
  228. package/skills/planning/backlog/SKILL.md +90 -0
  229. package/skills/planning/backlog/evals.md +43 -0
  230. package/skills/planning/prd/SKILL.md +82 -0
  231. package/skills/planning/prd/evals.md +49 -0
  232. package/skills/planning/product-intent/SKILL.md +112 -0
  233. package/skills/planning/product-intent/evals.md +36 -0
  234. package/skills/planning/tech-spec/SKILL.md +115 -0
  235. package/skills/planning/tech-spec/evals.md +47 -0
  236. package/skills/registry.yaml +136 -0
  237. package/skills/research/arxiv-literature/SKILL.md +104 -0
  238. package/skills/research/arxiv-literature/evals.md +58 -0
  239. package/skills/research/experiment-protocol/SKILL.md +122 -0
  240. package/skills/research/experiment-protocol/evals.md +91 -0
  241. package/skills/research/scientific-debugging/SKILL.md +119 -0
  242. package/skills/research/scientific-debugging/evals.md +138 -0
  243. package/skills/research/scientific-modernization/SKILL.md +138 -0
  244. package/skills/research/scientific-modernization/evals.md +84 -0
  245. package/skills/workflow/design-council/SKILL.md +139 -0
  246. package/skills/workflow/design-council/evals.md +97 -0
  247. package/skills/workflow/grill-me/SKILL.md +186 -0
  248. package/skills/workflow/grill-me/evals.md +78 -0
  249. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  250. package/skills/workflow/workflow-distiller/evals.md +107 -0
  251. package/src/cli/acp.ts +31 -4
  252. package/src/cli/clio.ts +68 -6
  253. package/src/cli/config-inspect.ts +28 -22
  254. package/src/cli/configure.ts +47 -9
  255. package/src/cli/context-clear.ts +2 -2
  256. package/src/cli/context-index.ts +21 -23
  257. package/src/cli/context.ts +13 -8
  258. package/src/cli/default-target.ts +9 -17
  259. package/src/cli/docs.ts +11 -5
  260. package/src/cli/evidence.ts +4 -1
  261. package/src/cli/extensions.ts +10 -1
  262. package/src/cli/fleet.ts +47 -6
  263. package/src/cli/index.ts +55 -26
  264. package/src/cli/memory.ts +3 -1
  265. package/src/cli/models.ts +1 -1
  266. package/src/cli/modes/json-stream.ts +37 -1
  267. package/src/cli/modes/print.ts +24 -9
  268. package/src/cli/run.ts +2 -2
  269. package/src/cli/skills-eval.ts +23 -8
  270. package/src/cli/skills.ts +19 -4
  271. package/src/cli/targets.ts +4 -0
  272. package/src/cli/text-layout.ts +15 -5
  273. package/src/cli/trace.ts +62 -14
  274. package/src/cli/upgrade.ts +18 -2
  275. package/src/cli/usage.ts +10 -3
  276. package/src/cli/wiki-generate.ts +2 -1
  277. package/src/core/agent-environment.ts +7 -0
  278. package/src/core/bash-exec.ts +72 -1
  279. package/src/core/boot-trace.ts +9 -4
  280. package/src/core/bus-events.ts +20 -4
  281. package/src/core/commit-attribution.ts +157 -0
  282. package/src/core/compile-cache.ts +159 -0
  283. package/src/core/config.ts +131 -2
  284. package/src/core/defaults.ts +39 -5
  285. package/src/core/domain-loader.ts +12 -5
  286. package/src/core/git-commit-attribution.ts +387 -0
  287. package/src/core/incomplete-installation.ts +45 -0
  288. package/src/core/response-schema.ts +1 -1
  289. package/src/core/safe-exec.ts +13 -1
  290. package/src/core/settings-layers.ts +155 -21
  291. package/src/core/skill-activation.ts +1 -1
  292. package/src/core/startup-timer.ts +3 -3
  293. package/src/core/state-file-lock.ts +13 -1
  294. package/src/core/termination.ts +78 -5
  295. package/src/domains/config/classify.ts +15 -3
  296. package/src/domains/config/extension.ts +19 -13
  297. package/src/domains/config/index.ts +10 -0
  298. package/src/domains/config/keybindings.ts +45 -9
  299. package/src/domains/context/bootstrap-prompt.ts +1 -1
  300. package/src/domains/context/bootstrap.ts +111 -18
  301. package/src/domains/context/clear.ts +16 -11
  302. package/src/domains/context/clio-md.ts +111 -9
  303. package/src/domains/context/codewiki/artifact.ts +400 -0
  304. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  305. package/src/domains/context/codewiki/build-worker.ts +54 -0
  306. package/src/domains/context/codewiki/coordinator.ts +182 -0
  307. package/src/domains/context/codewiki/indexer.ts +59 -144
  308. package/src/domains/context/codewiki/paths.ts +67 -0
  309. package/src/domains/context/codewiki/schema.ts +80 -0
  310. package/src/domains/context/codewiki/tree-sitter.ts +1 -1
  311. package/src/domains/context/contract.ts +11 -5
  312. package/src/domains/context/extension.ts +94 -143
  313. package/src/domains/context/fingerprint.ts +3 -1
  314. package/src/domains/context/index.ts +12 -22
  315. package/src/domains/context/project-metadata.ts +19 -0
  316. package/src/domains/context/prompt-context.ts +9 -10
  317. package/src/domains/context/refresh.ts +29 -21
  318. package/src/domains/context/runtime.ts +17 -0
  319. package/src/domains/context/wiki/generate.ts +39 -34
  320. package/src/domains/context/wiki/plan.ts +1 -1
  321. package/src/domains/context/wiki/prompts.ts +21 -8
  322. package/src/domains/dispatch/code-step.ts +20 -1
  323. package/src/domains/dispatch/extension.ts +158 -21
  324. package/src/domains/dispatch/failure-classification.ts +6 -0
  325. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  326. package/src/domains/dispatch/orphan-recovery.ts +50 -8
  327. package/src/domains/dispatch/receipt-integrity.ts +5 -0
  328. package/src/domains/dispatch/state.ts +31 -6
  329. package/src/domains/dispatch/transport.ts +2 -1
  330. package/src/domains/dispatch/types.ts +14 -0
  331. package/src/domains/dispatch/worker-spawn.ts +21 -2
  332. package/src/domains/eval/metrics/context.ts +1 -1
  333. package/src/domains/eval/types.ts +0 -1
  334. package/src/domains/evidence/build.ts +41 -1
  335. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  336. package/src/domains/lifecycle/migrations/index.ts +24 -4
  337. package/src/domains/middleware/hooks-io.ts +12 -0
  338. package/src/domains/middleware/skills-reminder.ts +30 -15
  339. package/src/domains/prompts/compiler.ts +142 -84
  340. package/src/domains/prompts/contract.ts +18 -2
  341. package/src/domains/prompts/extension.ts +39 -7
  342. package/src/domains/prompts/fragment-loader.ts +0 -1
  343. package/src/domains/prompts/fragments/identity/clio.md +2 -4
  344. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  345. package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
  346. package/src/domains/prompts/fragments/operating/contract.md +4 -50
  347. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  348. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  349. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  350. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  351. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  352. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  353. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  354. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  355. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  356. package/src/domains/prompts/preload.ts +3 -3
  357. package/src/domains/providers/auth/api-key.ts +1 -1
  358. package/src/domains/providers/auth/backend-file.ts +20 -10
  359. package/src/domains/providers/auth/backend-memory.ts +59 -4
  360. package/src/domains/providers/auth/boot-status.ts +65 -0
  361. package/src/domains/providers/auth/oauth.ts +2 -1
  362. package/src/domains/providers/auth/storage.ts +97 -38
  363. package/src/domains/providers/capabilities.ts +12 -4
  364. package/src/domains/providers/contract.ts +15 -4
  365. package/src/domains/providers/extension.ts +18 -6
  366. package/src/domains/providers/model-runtime-capabilities.ts +15 -4
  367. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
  368. package/src/domains/providers/plugins.ts +5 -3
  369. package/src/domains/providers/probe/fingerprint.ts +25 -5
  370. package/src/domains/providers/registry.ts +31 -10
  371. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  372. package/src/domains/providers/runtimes/builtins.ts +2 -2
  373. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  374. package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
  375. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  376. package/src/domains/providers/support.ts +6 -3
  377. package/src/domains/providers/types/local-model-quirks.ts +7 -9
  378. package/src/domains/providers/types/runtime-descriptor.ts +12 -1
  379. package/src/domains/providers/types/target-descriptor.ts +22 -0
  380. package/src/domains/resources/contract.ts +0 -1
  381. package/src/domains/resources/extension.ts +1 -3
  382. package/src/domains/resources/loader.ts +3 -4
  383. package/src/domains/resources/prompts/loader.ts +16 -2
  384. package/src/domains/resources/prompts/substitute.ts +1 -65
  385. package/src/domains/resources/skills/content-hash.ts +2 -0
  386. package/src/domains/resources/skills/install.ts +17 -0
  387. package/src/domains/resources/skills/loader.ts +17 -10
  388. package/src/domains/resources/skills/marketplace.ts +55 -9
  389. package/src/domains/safety/action-classifier.ts +4 -2
  390. package/src/domains/safety/audit.ts +8 -2
  391. package/src/domains/safety/extension.ts +1 -1
  392. package/src/domains/session/compaction/branch-summary.ts +3 -2
  393. package/src/domains/session/compaction/cut-point.ts +2 -1
  394. package/src/domains/session/compaction/tokens.ts +2 -1
  395. package/src/domains/session/context-ledger.ts +14 -0
  396. package/src/domains/session/contract.ts +15 -0
  397. package/src/domains/session/decision-board.ts +190 -0
  398. package/src/domains/session/entries.ts +66 -3
  399. package/src/domains/session/extension.ts +93 -12
  400. package/src/domains/session/retry.ts +10 -18
  401. package/src/domains/session/session-artifacts.ts +107 -0
  402. package/src/domains/session/task-board.ts +207 -13
  403. package/src/domains/session/tree/active-path.ts +44 -5
  404. package/src/domains/session/tree/fork.ts +26 -27
  405. package/src/domains/session/tree/preview.ts +2 -2
  406. package/src/domains/session/workspace/git-probe.ts +17 -11
  407. package/src/domains/user-tasks/store.ts +297 -0
  408. package/src/engine/acp/errors.ts +96 -0
  409. package/src/engine/acp/server.ts +1728 -146
  410. package/src/engine/acp/transport.ts +135 -14
  411. package/src/engine/acp/types.ts +26 -0
  412. package/src/engine/agent.ts +3 -3
  413. package/src/engine/ai.ts +32 -27
  414. package/src/engine/alcf-oauth.ts +26 -19
  415. package/src/engine/api-registry.ts +223 -0
  416. package/src/engine/apis/index.ts +3 -7
  417. package/src/engine/apis/llamacpp-residency.ts +49 -9
  418. package/src/engine/apis/lmstudio-residency.ts +5 -21
  419. package/src/engine/apis/lmstudio.ts +243 -0
  420. package/src/engine/apis/ollama-native.ts +24 -3
  421. package/src/engine/apis/openai-completions.ts +170 -91
  422. package/src/engine/apis/residency.ts +139 -3
  423. package/src/engine/apis/types.ts +16 -0
  424. package/src/engine/env-api-keys.ts +98 -0
  425. package/src/engine/gemma-channel-filter.ts +223 -0
  426. package/src/engine/instrumented-tui.ts +192 -0
  427. package/src/engine/messages.ts +14 -0
  428. package/src/engine/models.ts +42 -0
  429. package/src/engine/oauth.ts +16 -12
  430. package/src/engine/prompt-templates.ts +1 -0
  431. package/src/engine/provider-payload.ts +16 -59
  432. package/src/engine/strip-tokenizer-sentinels.ts +1 -1
  433. package/src/engine/truncate.ts +9 -0
  434. package/src/engine/tui.ts +17 -9
  435. package/src/engine/types.ts +3 -6
  436. package/src/engine/worker-runtime-capabilities.ts +5 -0
  437. package/src/engine/worker-runtime.ts +1 -1
  438. package/src/engine/worker-tools.ts +9 -4
  439. package/src/entry/boot-options.ts +50 -0
  440. package/src/entry/orchestrator.ts +288 -150
  441. package/src/interactive/application-controller.ts +89 -2
  442. package/src/interactive/chat-loop.ts +266 -41
  443. package/src/interactive/chat-panel.ts +715 -278
  444. package/src/interactive/chat-renderer.ts +306 -85
  445. package/src/interactive/clio-editor.ts +3 -8
  446. package/src/interactive/command-fallbacks.ts +2 -2
  447. package/src/interactive/context-overlay.ts +27 -1
  448. package/src/interactive/editor-submit.ts +253 -24
  449. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  450. package/src/interactive/export-html/index.ts +51 -0
  451. package/src/interactive/export-html/template.ts +45 -0
  452. package/src/interactive/export-html/tool-renderer.ts +54 -0
  453. package/src/interactive/footer/dashboard.ts +4 -0
  454. package/src/interactive/footer/notifications.ts +1 -1
  455. package/src/interactive/footer/widgets.ts +42 -22
  456. package/src/interactive/footer-panel.ts +8 -3
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +203 -17
  459. package/src/interactive/interactive-event-projection.ts +18 -1
  460. package/src/interactive/interactive-input-runtime.ts +50 -4
  461. package/src/interactive/interactive-presentation.ts +151 -19
  462. package/src/interactive/interactive-shell.ts +268 -14
  463. package/src/interactive/interactive-slash-runtime.ts +184 -117
  464. package/src/interactive/interactive-tickers.ts +38 -7
  465. package/src/interactive/keybinding-manager.ts +1 -1
  466. package/src/interactive/layout.ts +40 -3
  467. package/src/interactive/overlay-frame.ts +1 -1
  468. package/src/interactive/overlay-general-openers.ts +58 -1
  469. package/src/interactive/overlay-key-routing.ts +3 -0
  470. package/src/interactive/overlay-lifecycle.ts +13 -0
  471. package/src/interactive/overlay-permission-lifecycle.ts +2 -1
  472. package/src/interactive/overlay-session-lifecycle.ts +69 -12
  473. package/src/interactive/overlays/ask-user.ts +146 -24
  474. package/src/interactive/overlays/decisions.ts +300 -0
  475. package/src/interactive/overlays/help-reference.ts +15 -10
  476. package/src/interactive/overlays/model-selector.ts +34 -16
  477. package/src/interactive/overlays/session-selector.ts +18 -0
  478. package/src/interactive/overlays/settings.ts +105 -17
  479. package/src/interactive/overlays/skills-hub.ts +4 -4
  480. package/src/interactive/overlays/tree-selector.ts +41 -6
  481. package/src/interactive/render-trace.ts +499 -90
  482. package/src/interactive/renderers/compaction-summary.ts +2 -2
  483. package/src/interactive/renderers/diff.ts +115 -104
  484. package/src/interactive/renderers/mermaid.ts +53 -0
  485. package/src/interactive/renderers/tool-execution.ts +516 -168
  486. package/src/interactive/renderers/worker-entry.ts +20 -4
  487. package/src/interactive/session-switch-settlement.ts +10 -0
  488. package/src/interactive/slash-autocomplete.ts +6 -114
  489. package/src/interactive/slash-commands.ts +135 -47
  490. package/src/interactive/slash-spec.ts +9 -38
  491. package/src/interactive/status/controller.ts +5 -1
  492. package/src/interactive/status/index.ts +12 -1
  493. package/src/interactive/status/reasoning.ts +87 -0
  494. package/src/interactive/status/summary.ts +13 -2
  495. package/src/interactive/stdout-backpressure.ts +99 -0
  496. package/src/interactive/stream-pacer.ts +530 -0
  497. package/src/interactive/stream-pacing-policy.ts +66 -0
  498. package/src/interactive/tasks-overlay.ts +368 -14
  499. package/src/interactive/terminal-lease.ts +485 -0
  500. package/src/interactive/theme/tokens.ts +1 -1
  501. package/src/interactive/transcript-detail.ts +120 -0
  502. package/src/interactive/turn-context.ts +4 -3
  503. package/src/interactive/turn-persistence.ts +30 -13
  504. package/src/interactive/turn-queues.ts +12 -0
  505. package/src/interactive/turn-recovery.ts +25 -8
  506. package/src/interactive/turn-runtime.ts +79 -12
  507. package/src/interactive/turn-state.ts +10 -0
  508. package/src/interactive/view/artifacts.ts +114 -4
  509. package/src/interactive/view/view-overlay.ts +3 -0
  510. package/src/interactive/welcome-dashboard.ts +17 -16
  511. package/src/interactive/worker-receipts.ts +52 -3
  512. package/src/interactive/worker-stream.ts +5 -1
  513. package/src/tools/agent-tools.ts +23 -3
  514. package/src/tools/artifact.ts +2 -2
  515. package/src/tools/ask-user.ts +23 -13
  516. package/src/tools/bash.ts +30 -2
  517. package/src/tools/bootstrap.ts +34 -431
  518. package/src/tools/builtin-tool-catalog.ts +271 -0
  519. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  520. package/src/tools/codewiki/code-nav.ts +8 -22
  521. package/src/tools/codewiki/shared.ts +41 -38
  522. package/src/tools/context/docs-engine.ts +14 -3
  523. package/src/tools/context/index.ts +107 -28
  524. package/src/tools/context/surface.ts +19 -0
  525. package/src/tools/core-bootstrap.ts +168 -0
  526. package/src/tools/credential-present.ts +5 -5
  527. package/src/tools/dispatch-admission.ts +533 -0
  528. package/src/tools/dispatch-background.ts +54 -0
  529. package/src/tools/dispatch-event-text.ts +6 -0
  530. package/src/tools/dispatch-plan.ts +9 -4
  531. package/src/tools/dispatch-run-events.ts +238 -0
  532. package/src/tools/dispatch-runner.ts +2370 -0
  533. package/src/tools/dispatch-scout-admission.ts +295 -0
  534. package/src/tools/dispatch-types.ts +77 -0
  535. package/src/tools/dispatch.ts +67 -3161
  536. package/src/tools/find.ts +4 -2
  537. package/src/tools/grep.ts +2 -2
  538. package/src/tools/lazy-tool.ts +60 -0
  539. package/src/tools/ledger.ts +3 -3
  540. package/src/tools/monitor-surface.ts +36 -0
  541. package/src/tools/monitor.ts +2 -32
  542. package/src/tools/observers.ts +2 -2
  543. package/src/tools/presentation.ts +107 -0
  544. package/src/tools/registry.ts +45 -27
  545. package/src/tools/safe-exec.ts +2 -2
  546. package/src/tools/steer-surface.ts +17 -0
  547. package/src/tools/steer.ts +2 -13
  548. package/src/tools/tasks.ts +108 -11
  549. package/src/tools/truncate.ts +25 -184
  550. package/src/tools/verify/frontend.ts +3 -1
  551. package/src/tools/verify/index.ts +3 -38
  552. package/src/tools/verify/surface.ts +46 -0
  553. package/src/tools/web-fetch-surface.ts +23 -0
  554. package/src/tools/web-fetch.ts +2 -20
  555. package/src/tools/write.ts +7 -2
  556. package/src/worker/entry.ts +39 -2
  557. package/src/worker/spec-contract.ts +26 -5
  558. package/dist/chunk-7SS2CTV2.js +0 -61361
  559. package/dist/chunk-DKGKUHFA.js +0 -924
  560. package/dist/chunk-GEP36Y4X.js +0 -12796
  561. package/dist/chunk-XYWBQRDM.js +0 -137
  562. package/dist/clio-BZVGEUFJ.js +0 -58
  563. package/dist/configure-S7S6F6CL.js +0 -32
  564. package/docs/html/agents_blueprint.html +0 -936
  565. package/docs/html/alcf_blueprint.html +0 -324
  566. package/docs/html/architecture_blueprint.html +0 -850
  567. package/docs/html/commands_blueprint.html +0 -939
  568. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  569. package/docs/html/configuration_blueprint.html +0 -1080
  570. package/docs/html/context_blueprint.html +0 -603
  571. package/docs/html/documentation_blueprint.html +0 -832
  572. package/docs/html/environment_blueprint.html +0 -404
  573. package/docs/html/eval_blueprint.html +0 -743
  574. package/docs/html/evals_internal_blueprint.html +0 -190
  575. package/docs/html/evolution_blueprint.html +0 -674
  576. package/docs/html/extensions_blueprint.html +0 -2065
  577. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  578. package/docs/html/index.html +0 -919
  579. package/docs/html/lifecycle_blueprint.html +0 -723
  580. package/docs/html/memory_blueprint.html +0 -699
  581. package/docs/html/middleware_blueprint.html +0 -664
  582. package/docs/html/models_blueprint.html +0 -2366
  583. package/docs/html/observability_blueprint.html +0 -683
  584. package/docs/html/provider_adapter_blueprint.html +0 -245
  585. package/docs/html/safety_blueprint.html +0 -1386
  586. package/docs/html/shared.css +0 -571
  587. package/docs/html/shared.js +0 -143
  588. package/docs/html/skills_blueprint.html +0 -671
  589. package/docs/html/soak_blueprint.html +0 -182
  590. package/docs/html/tool_usage_blueprint.html +0 -350
  591. package/docs/html/tools_blueprint.html +0 -2249
  592. package/docs/html/trace_blueprint.html +0 -235
  593. package/docs/html/tui_design_blueprint.html +0 -374
  594. package/docs/html/validation_blueprint.html +0 -961
  595. package/docs/html/worker_dispatch_blueprint.html +0 -231
  596. package/src/core/release.ts +0 -2
  597. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  598. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  599. package/src/engine/apis/lmstudio-native.ts +0 -1438
  600. package/src/engine/apis/thinking-replay.ts +0 -11
  601. package/src/tools/string-enum.ts +0 -15
@@ -0,0 +1,866 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ checkSkillDrift
4
+ } from "./chunk-MFFY33HR.js";
5
+ import {
6
+ discoverMarketplaceSkills,
7
+ loadSkills,
8
+ modelVisibleSkills
9
+ } from "./chunk-4BPJXDWC.js";
10
+ import "./chunk-2SFS6XQE.js";
11
+ import "./chunk-ZWLZP4ZT.js";
12
+ import {
13
+ contextToolSurface
14
+ } from "./chunk-OKGUZO2U.js";
15
+ import {
16
+ SKILL_SUGGESTION_ANCHOR
17
+ } from "./chunk-T6YILFSB.js";
18
+ import {
19
+ OBSERVE_SELF_CAPS,
20
+ finalizeObservation,
21
+ observationBudgetExhausted,
22
+ reserveObservation,
23
+ truncateHead
24
+ } from "./chunk-VAKQQHWR.js";
25
+ import "./chunk-6XLNIQDB.js";
26
+ import "./chunk-5B2AEOW5.js";
27
+ import {
28
+ ToolNames
29
+ } from "./chunk-CGKSTWHD.js";
30
+ import "./chunk-IHXBNWMM.js";
31
+ import "./chunk-SST6Z5JA.js";
32
+ import "./chunk-4ZG3XFUR.js";
33
+ import "./chunk-APJ265NV.js";
34
+ import "./chunk-FCSXB6T2.js";
35
+ import "./chunk-YXLYO42X.js";
36
+ import "./chunk-BNAZZHFG.js";
37
+ import "./chunk-WEPFGWHJ.js";
38
+ import {
39
+ resolvePackageRoot
40
+ } from "./chunk-IWHMRKLL.js";
41
+ import {
42
+ init_esm_shims
43
+ } from "./chunk-3R73A4XB.js";
44
+
45
+ // src/tools/context/index.ts
46
+ init_esm_shims();
47
+ import { readdirSync as readdirSync2 } from "node:fs";
48
+ import path from "node:path";
49
+
50
+ // src/tools/context/docs-engine.ts
51
+ init_esm_shims();
52
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
53
+ import { basename, join, resolve } from "node:path";
54
+ var DEFAULT_LIMIT = 5;
55
+ var MAX_LIMIT = 12;
56
+ var SNIPPET_MAX = 360;
57
+ var SNIPPET_CONTEXT_LINES = 2;
58
+ var BODY_K1 = 1.2;
59
+ var BODY_B = 0.75;
60
+ var HEADING_WEIGHT = 3.5;
61
+ var TITLE_WEIGHT = 2;
62
+ var PHRASE_BODY_BOOST = 3;
63
+ var PHRASE_HEADING_BOOST = 7;
64
+ var COVERAGE_BOOST = 4;
65
+ var EXPANDED_TERM_WEIGHT = 0.45;
66
+ var STOP_WORDS = /* @__PURE__ */ new Set([
67
+ "a",
68
+ "an",
69
+ "and",
70
+ "are",
71
+ "as",
72
+ "at",
73
+ "be",
74
+ "by",
75
+ "can",
76
+ "for",
77
+ "from",
78
+ "how",
79
+ "in",
80
+ "into",
81
+ "is",
82
+ "it",
83
+ "of",
84
+ "on",
85
+ "or",
86
+ "that",
87
+ "the",
88
+ "this",
89
+ "to",
90
+ "what",
91
+ "when",
92
+ "where",
93
+ "with"
94
+ ]);
95
+ var VOCABULARY_ALIASES = [
96
+ {
97
+ triggers: ["approval", "confirm", "confirmation", "deny", "permission", "permissions", "prompt"],
98
+ expansions: ["autonomy", "ask", "deny", "safety", "policy", "full-auto", "read-only"]
99
+ },
100
+ {
101
+ triggers: ["agent", "agents", "dispatch", "fleet", "worker", "workers", "run"],
102
+ expansions: ["agent", "dispatch", "fleet", "profile", "worker", "receipt", "run"]
103
+ },
104
+ {
105
+ triggers: ["model", "models", "provider", "runtime", "target", "targets", "endpoint"],
106
+ expansions: ["catalog", "model", "probe", "provider", "runtime", "target", "wireModels"]
107
+ },
108
+ {
109
+ triggers: ["auth", "credential", "credentials", "login", "oauth", "subscription"],
110
+ expansions: ["auth", "credential", "login", "oauth", "target", "runtime"]
111
+ },
112
+ {
113
+ triggers: ["memory", "evidence", "receipt", "receipts", "audit", "accountability", "provenance"],
114
+ expansions: ["accountability", "evidence", "findings", "memory", "receipt", "run", "audit"]
115
+ },
116
+ {
117
+ triggers: ["validate", "validated", "validation", "verify", "verified", "test", "tests", "rigor"],
118
+ expansions: ["validation", "verify", "evidence", "rigor", "finish", "contract", "check"]
119
+ },
120
+ {
121
+ triggers: ["bash", "command", "commands", "shell", "terminal", "tool", "tools"],
122
+ expansions: ["bash", "command", "tool", "registry", "safety", "result", "cap"]
123
+ },
124
+ {
125
+ triggers: ["context", "compact", "compaction", "token", "tokens", "cache", "prompt"],
126
+ expansions: ["context", "compaction", "prompt", "token", "cache", "window"]
127
+ },
128
+ {
129
+ triggers: ["hook", "hooks", "middleware", "component", "components", "budget"],
130
+ expansions: ["middleware", "hook", "effect", "component", "budget", "registration"]
131
+ },
132
+ {
133
+ triggers: ["install", "upgrade", "uninstall", "doctor", "lifecycle", "reset", "paths"],
134
+ expansions: ["install", "lifecycle", "doctor", "reset", "state", "config", "paths"]
135
+ },
136
+ {
137
+ triggers: ["skill", "skills", "marketplace"],
138
+ expansions: ["skill", "skills", "marketplace", "discovery", "context"]
139
+ },
140
+ {
141
+ triggers: ["docs", "documentation", "manual", "self"],
142
+ expansions: ["documentation", "docs", "context", "blueprint", "guide"]
143
+ }
144
+ ];
145
+ var cachedIndex = null;
146
+ function normalizeText(text) {
147
+ return text.toLowerCase().replace(/[`'"’]/g, "").replace(/[^a-z0-9]+/g, " ").replace(/\s+/g, " ").trim();
148
+ }
149
+ function rawTokens(text) {
150
+ return normalizeText(text).split(" ").filter(Boolean);
151
+ }
152
+ function stemToken(token) {
153
+ if (token.length <= 3) return token;
154
+ if (token.endsWith("ies") && token.length > 4) return `${token.slice(0, -3)}y`;
155
+ if (token.endsWith("ing") && token.length > 5) return token.slice(0, -3);
156
+ if (token.endsWith("ed") && token.length > 4) return token.slice(0, -2);
157
+ if (token.endsWith("es") && token.length > 4) return token.slice(0, -2);
158
+ if (token.endsWith("s") && token.length > 4) return token.slice(0, -1);
159
+ return token;
160
+ }
161
+ function tokenize(text, options = {}) {
162
+ const tokens = rawTokens(text).map(stemToken);
163
+ return options.keepStopWords ? tokens : tokens.filter((token) => !STOP_WORDS.has(token));
164
+ }
165
+ function countTerms(tokens) {
166
+ const counts = /* @__PURE__ */ new Map();
167
+ for (const token of tokens) counts.set(token, (counts.get(token) ?? 0) + 1);
168
+ return counts;
169
+ }
170
+ function unique(items) {
171
+ return [...new Set(items)];
172
+ }
173
+ function slugify(heading) {
174
+ return normalizeText(heading).replace(/\s+/g, "-") || "section";
175
+ }
176
+ function titleFromFile(name) {
177
+ return basename(name, ".md").split(/[-_]+/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
178
+ }
179
+ function parseSections(file, markdown) {
180
+ const lines = markdown.split(/\r?\n/);
181
+ const sections = [];
182
+ let title = titleFromFile(file);
183
+ let heading = "(overview)";
184
+ let level = 0;
185
+ let headingLine = 1;
186
+ let bodyStartLine = 1;
187
+ let buffer = [];
188
+ let inFence = false;
189
+ const stack = [];
190
+ const breadcrumbFor = () => {
191
+ const parts = stack.map((entry) => entry.text);
192
+ if (heading === "(overview)") return title;
193
+ return parts.length > 0 ? parts.join(" > ") : heading;
194
+ };
195
+ const flush = (endLine) => {
196
+ const body = buffer.join("\n").trim();
197
+ if (body.length > 0 || heading !== "(overview)") {
198
+ sections.push({
199
+ file,
200
+ title,
201
+ heading,
202
+ breadcrumb: breadcrumbFor(),
203
+ level,
204
+ anchor: heading === "(overview)" ? "" : `#${slugify(heading)}`,
205
+ startLine: headingLine,
206
+ bodyStartLine,
207
+ endLine: Math.max(headingLine, endLine),
208
+ body,
209
+ bodyLines: [...buffer]
210
+ });
211
+ }
212
+ buffer = [];
213
+ };
214
+ for (let i = 0; i < lines.length; i += 1) {
215
+ const line = lines[i] ?? "";
216
+ if (/^\s*(```|~~~)/.test(line)) inFence = !inFence;
217
+ const headingMatch = inFence ? null : /^(#{1,6})\s+(.+?)\s*#*\s*$/.exec(line);
218
+ if (headingMatch) {
219
+ flush(i);
220
+ level = (headingMatch[1] ?? "").length;
221
+ heading = (headingMatch[2] ?? "").trim();
222
+ if (level === 1) title = heading;
223
+ while (stack.length > 0 && (stack[stack.length - 1]?.level ?? 0) >= level) stack.pop();
224
+ stack.push({ level, text: heading });
225
+ headingLine = i + 1;
226
+ bodyStartLine = i + 2;
227
+ continue;
228
+ }
229
+ buffer.push(line);
230
+ }
231
+ flush(lines.length);
232
+ return sections;
233
+ }
234
+ function indexSection(section) {
235
+ const headingText = `${section.title} ${section.breadcrumb} ${section.heading}`;
236
+ const bodyTokens = tokenize(section.body);
237
+ const headingTokens = tokenize(headingText);
238
+ const titleTokens = tokenize(section.title);
239
+ const bodyCounts = countTerms(bodyTokens);
240
+ const headingCounts = countTerms(headingTokens);
241
+ const titleCounts = countTerms(titleTokens);
242
+ const terms = /* @__PURE__ */ new Set([...bodyCounts.keys(), ...headingCounts.keys(), ...titleCounts.keys()]);
243
+ return {
244
+ ...section,
245
+ bodyCounts,
246
+ headingCounts,
247
+ titleCounts,
248
+ bodyLength: Math.max(1, bodyTokens.length),
249
+ terms,
250
+ normalizedBody: normalizeText(section.body),
251
+ normalizedHeading: normalizeText(headingText)
252
+ };
253
+ }
254
+ function candidateDocFiles(root) {
255
+ const docsDir = join(root, "docs");
256
+ const files = [];
257
+ try {
258
+ for (const name of readdirSync(docsDir).sort((a, b) => a.localeCompare(b))) {
259
+ if (name.toLowerCase().endsWith(".md")) files.push(join("docs", name));
260
+ }
261
+ } catch {
262
+ }
263
+ for (const name of ["README.md", "CHANGELOG.md", "CLIO-CODER.md"]) {
264
+ if (existsSync(join(root, name))) files.push(name);
265
+ }
266
+ return files;
267
+ }
268
+ function buildDocumentFrequency(sections) {
269
+ const df = /* @__PURE__ */ new Map();
270
+ for (const section of sections) {
271
+ for (const term of section.terms) df.set(term, (df.get(term) ?? 0) + 1);
272
+ }
273
+ return df;
274
+ }
275
+ function loadDocsIndex() {
276
+ let root;
277
+ try {
278
+ const override = process.env.CLIO_CODER_PACKAGE_ROOT?.trim();
279
+ if (override) {
280
+ root = resolve(override);
281
+ } else {
282
+ root = resolvePackageRoot();
283
+ }
284
+ } catch (err) {
285
+ return { ok: false, message: err instanceof Error ? err.message : String(err) };
286
+ }
287
+ const docsDir = join(root, "docs");
288
+ if (cachedIndex && cachedIndex.dir === docsDir) return { ok: true, index: cachedIndex };
289
+ const files = candidateDocFiles(root);
290
+ if (files.length === 0) return { ok: false, message: `bundled docs directory not found at ${docsDir}` };
291
+ const sections = [];
292
+ const indexedFiles = [];
293
+ let docCount = 0;
294
+ for (const file of files) {
295
+ let raw;
296
+ try {
297
+ raw = readFileSync(join(root, file), "utf8");
298
+ } catch {
299
+ continue;
300
+ }
301
+ docCount += 1;
302
+ indexedFiles.push(file);
303
+ for (const section of parseSections(file, raw)) sections.push(indexSection(section));
304
+ }
305
+ if (sections.length === 0) return { ok: false, message: `no markdown sections found under ${docsDir}` };
306
+ const totalLength = sections.reduce((sum, section) => sum + section.bodyLength, 0);
307
+ cachedIndex = {
308
+ dir: docsDir,
309
+ files: indexedFiles,
310
+ sections,
311
+ docCount,
312
+ avgBodyLength: totalLength / sections.length,
313
+ documentFrequency: buildDocumentFrequency(sections)
314
+ };
315
+ return { ok: true, index: cachedIndex };
316
+ }
317
+ function makeQueryPlan(query) {
318
+ const originalTokens = unique(tokenize(query));
319
+ const originalSet = new Set(originalTokens);
320
+ const expanded = [];
321
+ for (const rule of VOCABULARY_ALIASES) {
322
+ const triggerTokens = rule.triggers.flatMap((trigger) => tokenize(trigger));
323
+ if (!triggerTokens.some((token) => originalSet.has(token))) continue;
324
+ expanded.push(...rule.expansions.flatMap((term) => tokenize(term)));
325
+ }
326
+ const expandedTerms = unique(expanded).filter((term) => !originalSet.has(term));
327
+ const weightedTerms = [
328
+ ...originalTokens.map((term) => ({ term, source: "query", weight: 1 })),
329
+ ...expandedTerms.map((term) => ({ term, source: "alias", weight: EXPANDED_TERM_WEIGHT }))
330
+ ];
331
+ const normalizedQuery = normalizeText(query);
332
+ const phraseCandidates = [
333
+ normalizedQuery,
334
+ ...rawTokens(query).slice(0, -1).map((token, index, tokens) => `${token} ${tokens[index + 1] ?? ""}`.trim())
335
+ ];
336
+ const phrases = unique(phraseCandidates.filter((phrase) => phrase.includes(" ") && phrase.length >= 5));
337
+ return { query, originalTokens, weightedTerms, expandedTerms, phrases };
338
+ }
339
+ function idf(index, term) {
340
+ const df = index.documentFrequency.get(term) ?? 0;
341
+ return Math.log(1 + (index.sections.length - df + 0.5) / (df + 0.5));
342
+ }
343
+ function bm25(count, sectionLength, avgLength) {
344
+ if (count <= 0) return 0;
345
+ return count * (BODY_K1 + 1) / (count + BODY_K1 * (1 - BODY_B + BODY_B * (sectionLength / avgLength)));
346
+ }
347
+ function phraseSignals(section, phrases) {
348
+ let score = 0;
349
+ const signals = [];
350
+ for (const phrase of phrases) {
351
+ if (section.normalizedHeading.includes(phrase)) {
352
+ score += PHRASE_HEADING_BOOST;
353
+ signals.push(`heading phrase: ${phrase}`);
354
+ }
355
+ if (section.normalizedBody.includes(phrase)) {
356
+ score += PHRASE_BODY_BOOST;
357
+ signals.push(`body phrase: ${phrase}`);
358
+ }
359
+ }
360
+ return { score, signals };
361
+ }
362
+ function scoreSection(index, section, plan) {
363
+ let score = 0;
364
+ const matchedTerms = [];
365
+ const signals = [];
366
+ let originalHits = 0;
367
+ for (const weighted of plan.weightedTerms) {
368
+ const bodyCount = section.bodyCounts.get(weighted.term) ?? 0;
369
+ const headingCount = section.headingCounts.get(weighted.term) ?? 0;
370
+ const titleCount = section.titleCounts.get(weighted.term) ?? 0;
371
+ if (bodyCount + headingCount + titleCount === 0) continue;
372
+ const termIdf = idf(index, weighted.term);
373
+ const bodyScore = termIdf * bm25(bodyCount, section.bodyLength, index.avgBodyLength);
374
+ const headingScore = headingCount > 0 ? termIdf * HEADING_WEIGHT : 0;
375
+ const titleScore = titleCount > 0 ? termIdf * TITLE_WEIGHT : 0;
376
+ score += weighted.weight * (bodyScore + headingScore + titleScore);
377
+ matchedTerms.push(weighted.term);
378
+ if (weighted.source === "query") originalHits += 1;
379
+ if (headingCount > 0) signals.push(`heading: ${weighted.term}`);
380
+ else if (titleCount > 0) signals.push(`title: ${weighted.term}`);
381
+ }
382
+ const phrases = phraseSignals(section, plan.phrases);
383
+ score += phrases.score;
384
+ signals.push(...phrases.signals);
385
+ const coverage = plan.originalTokens.length === 0 ? 0 : originalHits / plan.originalTokens.length;
386
+ score += coverage * COVERAGE_BOOST;
387
+ if (score <= 0) return null;
388
+ return {
389
+ section,
390
+ score,
391
+ matchedTerms: unique(matchedTerms).slice(0, 12),
392
+ signals: unique(signals).slice(0, 6),
393
+ coverage
394
+ };
395
+ }
396
+ function cleanSnippet(text) {
397
+ return text.replace(/^\s{0,3}#{1,6}\s+/gm, "").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/`([^`]+)`/g, "$1").replace(/\s+/g, " ").trim();
398
+ }
399
+ function snippetFor(section, plan) {
400
+ const needles = unique([...plan.phrases, ...plan.originalTokens, ...plan.expandedTerms.slice(0, 8)]).filter(
401
+ (needle) => needle.length > 0
402
+ );
403
+ let hitLine = -1;
404
+ let bestNeedleCount = 0;
405
+ for (let i = 0; i < section.bodyLines.length; i += 1) {
406
+ const normalized = normalizeText(section.bodyLines[i] ?? "");
407
+ let needleCount = 0;
408
+ for (const needle of needles) {
409
+ if (normalized.includes(needle)) needleCount += 1;
410
+ }
411
+ if (needleCount > bestNeedleCount) {
412
+ bestNeedleCount = needleCount;
413
+ hitLine = i;
414
+ }
415
+ }
416
+ if (hitLine < 0) hitLine = section.bodyLines.findIndex((line) => line.trim().length > 0);
417
+ if (hitLine < 0) {
418
+ return {
419
+ text: section.heading === "(overview)" ? section.title : section.heading,
420
+ startLine: section.startLine,
421
+ endLine: section.startLine
422
+ };
423
+ }
424
+ const from = Math.max(0, hitLine - SNIPPET_CONTEXT_LINES);
425
+ const to = Math.min(section.bodyLines.length - 1, hitLine + SNIPPET_CONTEXT_LINES);
426
+ let snippet = cleanSnippet(section.bodyLines.slice(from, to + 1).join(" "));
427
+ if (snippet.length > SNIPPET_MAX) snippet = `${snippet.slice(0, SNIPPET_MAX - 3).trimEnd()}...`;
428
+ return {
429
+ text: snippet,
430
+ startLine: section.bodyStartLine + from,
431
+ endLine: section.bodyStartLine + to
432
+ };
433
+ }
434
+ function clampDocsLimit(value) {
435
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) return Math.min(Math.floor(value), MAX_LIMIT);
436
+ return DEFAULT_LIMIT;
437
+ }
438
+ function resultPayload(index, plan, scored) {
439
+ const results = scored.map((entry, i) => {
440
+ const snippet = snippetFor(entry.section, plan);
441
+ return {
442
+ rank: i + 1,
443
+ file: entry.section.file,
444
+ heading: entry.section.heading,
445
+ breadcrumb: entry.section.breadcrumb,
446
+ anchor: entry.section.anchor,
447
+ lines: { start: entry.section.startLine, end: entry.section.endLine },
448
+ snippetLines: { start: snippet.startLine, end: snippet.endLine },
449
+ snippet: snippet.text,
450
+ score: Number(entry.score.toFixed(3)),
451
+ coverage: Number(entry.coverage.toFixed(2)),
452
+ matchedTerms: entry.matchedTerms,
453
+ signals: entry.signals
454
+ };
455
+ });
456
+ return {
457
+ version: 2,
458
+ query: plan.query,
459
+ corpus: {
460
+ docs: index.docCount,
461
+ sections: index.sections.length,
462
+ files: index.files,
463
+ excludes: ["docs/html/**"]
464
+ },
465
+ terms: {
466
+ query: plan.originalTokens,
467
+ expanded: plan.expandedTerms,
468
+ phrases: plan.phrases
469
+ },
470
+ resultCount: results.length,
471
+ results,
472
+ followUp: results.length > 0 ? "Cited files are Clio's bundled docs: read them from the installed documentation path named in your prompt, never by searching the workspace for them. For more depth, run another context scope=docs query with more specific terms." : "Try Clio vocabulary such as target, autonomy, dispatch, evidence, middleware, context, validation, install, or model catalog."
473
+ };
474
+ }
475
+ function listDocsCorpus() {
476
+ const loaded = loadDocsIndex();
477
+ if (!loaded.ok) return { ok: false, message: loaded.message };
478
+ const index = loaded.index;
479
+ const payload = {
480
+ version: 2,
481
+ corpus: {
482
+ docs: index.docCount,
483
+ sections: index.sections.length,
484
+ files: index.files,
485
+ excludes: ["docs/html/**"]
486
+ },
487
+ followUp: "Pass query=<terms> to search these bundled docs; they ship with Clio and are not workspace files. Try Clio vocabulary such as target, autonomy, dispatch, evidence, middleware, context, validation, install, or model catalog."
488
+ };
489
+ return { ok: true, payload, fileCount: index.files.length };
490
+ }
491
+ function searchDocs(query, limitArg) {
492
+ const plan = makeQueryPlan(query);
493
+ if (plan.originalTokens.length === 0) return { ok: false, message: "query has no searchable terms" };
494
+ const loaded = loadDocsIndex();
495
+ if (!loaded.ok) return { ok: false, message: loaded.message };
496
+ const limit = clampDocsLimit(limitArg);
497
+ const ranked = loaded.index.sections.map((section) => scoreSection(loaded.index, section, plan)).filter((entry) => entry !== null).sort(
498
+ (a, b) => b.score - a.score || b.coverage - a.coverage || a.section.file.localeCompare(b.section.file) || a.section.startLine - b.section.startLine || a.section.heading.localeCompare(b.section.heading)
499
+ );
500
+ const shown = ranked.slice(0, limit);
501
+ const next = shown.length === 0 ? `query=${plan.expandedTerms[0] ?? "overview"}` : null;
502
+ const payload = {
503
+ ...resultPayload(loaded.index, plan, shown),
504
+ omitted: ranked.length - shown.length,
505
+ ...next !== null ? { next } : {}
506
+ };
507
+ return { ok: true, payload, resultCount: shown.length, rankedTotal: ranked.length, next };
508
+ }
509
+
510
+ // src/tools/context/index.ts
511
+ var DEFAULT_TREE_ENTRIES = 50;
512
+ function cwdFromDeps(deps) {
513
+ return deps?.getCwd?.() ?? process.cwd();
514
+ }
515
+ function buildResourceTree(baseDir, maxEntries) {
516
+ const out = [];
517
+ const walk = (dir) => {
518
+ if (out.length >= maxEntries) return;
519
+ let entries;
520
+ try {
521
+ entries = readdirSync2(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
522
+ } catch {
523
+ return;
524
+ }
525
+ for (const entry of entries) {
526
+ if (out.length >= maxEntries) return;
527
+ if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
528
+ const full = path.join(dir, entry.name);
529
+ const rel = path.relative(baseDir, full).split(path.sep).join("/");
530
+ if (entry.isDirectory()) {
531
+ out.push(`${rel}/`);
532
+ walk(full);
533
+ } else if (entry.isFile()) {
534
+ out.push(rel);
535
+ }
536
+ }
537
+ };
538
+ walk(baseDir);
539
+ return out;
540
+ }
541
+ function skillSourceOrigin(skill) {
542
+ return skill.sourceInfo.source ?? `${skill.source}-${skill.scope}`;
543
+ }
544
+ function skillExecutionFrame(skill, workspaceRoot) {
545
+ return [
546
+ "How to read this skill:",
547
+ `- Workspace root: ${workspaceRoot}. Run every command and resolve every repository path there. ${skill.baseDir} holds only this skill's own resource files; it is never the working directory.`,
548
+ "- This skill may name tools, subagents, or commands from another harness. Use Clio's equivalent from your own tool list; if there is no equivalent, say so and continue without that step. Never invent one, and never substitute repeated calls to a different agent for an agent the skill named.",
549
+ "- The skill describes a workflow. Your safety policy, permissions, and tool surface still bind it.",
550
+ ""
551
+ ];
552
+ }
553
+ function renderSkillBody(skill, tree) {
554
+ const sourceOrigin = skillSourceOrigin(skill);
555
+ const lines = [
556
+ `<skill name="${skill.name}" scope="${skill.scope}" source="${skill.source}" origin="${sourceOrigin}" hash="${skill.hash}">`,
557
+ `path: ${skill.filePath}`,
558
+ `base_dir: ${skill.baseDir}`,
559
+ `source_origin: ${sourceOrigin}`,
560
+ `disable_model_invocation: ${skill.disableModelInvocation}`
561
+ ];
562
+ if (skill.allowedTools) lines.push(`allowed_tools: ${skill.allowedTools.join(", ")}`);
563
+ if (skill.disallowedTools) lines.push(`disallowed_tools: ${skill.disallowedTools.join(", ")}`);
564
+ if (skill.diagnostics.length > 0) {
565
+ lines.push(`diagnostics: ${skill.diagnostics.map((d) => d.message).join("; ")}`);
566
+ }
567
+ const metadataKeys = Object.keys(skill.metadata);
568
+ if (metadataKeys.length > 0) lines.push(`metadata: ${metadataKeys.join(", ")}`);
569
+ if (tree) {
570
+ lines.push("resources:");
571
+ for (const entry of tree) lines.push(` ${entry}`);
572
+ }
573
+ lines.push("", skill.content, "</skill>");
574
+ return lines.join("\n");
575
+ }
576
+ function policyIsRecipeBound(policy) {
577
+ return policy.requests.length > 0 && policy.requests.every((request) => request.source === "recipe");
578
+ }
579
+ var NO_PENDING_SKILL_DENIAL = `context: no pending skill request is active this turn; only the operator can activate a skill, so do not retry this load. If a listed skill matches the task, open your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` and wait for the operator to run it; otherwise continue without skills.`;
580
+ function pendingSkillPolicyError(name, options) {
581
+ const policy = options?.pendingSkillPolicy;
582
+ if (!policy) {
583
+ return NO_PENDING_SKILL_DENIAL;
584
+ }
585
+ const allowed = [...new Set(policy.allowedSkillNames.map((entry) => entry.trim()).filter(Boolean))];
586
+ if (allowed.length === 0) {
587
+ return NO_PENDING_SKILL_DENIAL;
588
+ }
589
+ const recipeBound = policyIsRecipeBound(policy);
590
+ if (!allowed.includes(name)) {
591
+ return recipeBound ? `context: this agent run may load only its declared skill(s): ${allowed.join(", ")}.` : `context: this turn has pending skill request(s): ${allowed.join(", ")}. Load only those before doing anything else.`;
592
+ }
593
+ if (policy.loadedSkillNames.has(name)) {
594
+ return recipeBound ? `context: skill ${name} is already loaded in this run; continue with its workflow.` : `context: pending skill ${name} already loaded this turn; continue with the loaded workflow and call ask_user if an interview/choice is needed.`;
595
+ }
596
+ return null;
597
+ }
598
+ function pendingSkillRequestFor(name, options) {
599
+ return options?.pendingSkillPolicy?.requests.find((request) => request.name === name) ?? null;
600
+ }
601
+ function renderPendingSkillTask(name, options) {
602
+ const request = pendingSkillRequestFor(name, options);
603
+ if (!request) return [];
604
+ if (request.source === "recipe") return [];
605
+ const task = request.args.trim();
606
+ const lines = [
607
+ "Pending skill request",
608
+ `name: ${request.name}`,
609
+ `source: ${request.source}`,
610
+ `task: ${task.length > 0 ? task : "(none supplied)"}`
611
+ ];
612
+ if (task.length > 0) {
613
+ lines.push(
614
+ "",
615
+ "Treat task as the user's starting subject for this skill workflow. Do not ask what the subject is again; ask_user only for missing follow-up decisions."
616
+ );
617
+ }
618
+ lines.push("");
619
+ return lines;
620
+ }
621
+ function marketplaceRowsFor(deps, installed, options) {
622
+ if (deps.skillMarketplace === false) return [];
623
+ if (deps.getSkillLoaderOptions?.().disableDiscovery === true) return [];
624
+ const policy = options?.pendingSkillPolicy;
625
+ if (policy && policyIsRecipeBound(policy)) return [];
626
+ const installedNames = new Set(installed.map((skill) => skill.name));
627
+ try {
628
+ return discoverMarketplaceSkills({ cwd: cwdFromDeps(deps) }).skills.filter(
629
+ (entry) => !installedNames.has(entry.name)
630
+ );
631
+ } catch {
632
+ return [];
633
+ }
634
+ }
635
+ function renderSkillsList(skills, marketplace, marketplaceOffered) {
636
+ if (skills.length === 0 && marketplace.length === 0) {
637
+ return marketplaceOffered ? "No skills are installed and no marketplace is configured." : "No skills are installed.";
638
+ }
639
+ const lines = [
640
+ "Available skills. Match the current task against the descriptions below: when one fits, suggest the operator run /skill <name>; when several compose, suggest the sequence in order. Skill bodies load only after an explicit operator request; never load one without it.",
641
+ ""
642
+ ];
643
+ if (skills.length > 0) {
644
+ lines.push("Installed:");
645
+ for (const skill of skills) {
646
+ lines.push(`- ${skill.name} (${skill.scope}): ${skill.description}`);
647
+ }
648
+ } else {
649
+ lines.push("Installed: none.");
650
+ }
651
+ if (marketplace.length > 0) {
652
+ lines.push(
653
+ "",
654
+ "Marketplace (not installed; /skill <name> offers to install, or `clio-coder skills install <name>`). Suggest these the same way when one matches; their bodies cannot be loaded until the operator installs them:"
655
+ );
656
+ for (const entry of marketplace) {
657
+ const category = entry.category ? ` [${entry.category}]` : "";
658
+ lines.push(`- ${entry.name}${category}: ${entry.description}`);
659
+ }
660
+ }
661
+ lines.push(
662
+ "",
663
+ `If one skill above matches the current task, begin your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose) and wait for the operator to run it. If none match, do not mention skills.`
664
+ );
665
+ return lines.join("\n");
666
+ }
667
+ function runWorkspaceScope(deps, reservation, options) {
668
+ const workspace = deps.workspace;
669
+ if (!workspace?.hasSession()) {
670
+ return { kind: "error", message: "context: workspace scope requires a bound session; none is active here" };
671
+ }
672
+ let snap = workspace.getSnapshot();
673
+ if (!snap) {
674
+ snap = workspace.probeWorkspace();
675
+ workspace.saveSnapshot(snap);
676
+ }
677
+ const payload = withSkillsPointer(deps, snap);
678
+ return finalizeObservation({
679
+ tool: ToolNames.Context,
680
+ unit: "results",
681
+ format: "json",
682
+ output: JSON.stringify(payload, null, 2),
683
+ shownCount: 1,
684
+ totalCount: 1,
685
+ truncated: false,
686
+ reservation,
687
+ ...options ? { options } : {}
688
+ });
689
+ }
690
+ function withSkillsPointer(deps, snap) {
691
+ let installed = 0;
692
+ let installable = 0;
693
+ try {
694
+ const list = loadSkills({ cwd: cwdFromDeps(deps), ...deps.getSkillLoaderOptions?.() ?? {} });
695
+ const visible = modelVisibleSkills(list.items);
696
+ installed = visible.length;
697
+ installable = marketplaceRowsFor(deps, visible, void 0).length;
698
+ } catch {
699
+ return { ...snap };
700
+ }
701
+ if (installed === 0 && installable === 0) return { ...snap };
702
+ return {
703
+ ...snap,
704
+ skills: `Skills: ${installed} installed, ${installable} installable from the marketplace. If one matches this task, or the operator names a skill, list them with context(scope="skills") and suggest /skill <name> to the operator; load only on operator request.`
705
+ };
706
+ }
707
+ function runDocsScope(args, reservation, options) {
708
+ const query = typeof args.query === "string" ? args.query.trim() : "";
709
+ if (query.length === 0) {
710
+ const corpus = listDocsCorpus();
711
+ if (!corpus.ok) return { kind: "error", message: `context: ${corpus.message}` };
712
+ return finalizeObservation({
713
+ tool: ToolNames.Context,
714
+ unit: "entries",
715
+ format: "json",
716
+ output: JSON.stringify(corpus.payload),
717
+ shownCount: corpus.fileCount,
718
+ totalCount: corpus.fileCount,
719
+ truncated: false,
720
+ reservation,
721
+ ...options ? { options } : {}
722
+ });
723
+ }
724
+ const outcome = searchDocs(query, args.limit);
725
+ if (!outcome.ok) return { kind: "error", message: `context: ${outcome.message}` };
726
+ return finalizeObservation({
727
+ tool: ToolNames.Context,
728
+ unit: "sections",
729
+ format: "json",
730
+ output: JSON.stringify(outcome.payload),
731
+ shownCount: outcome.resultCount,
732
+ totalCount: outcome.rankedTotal,
733
+ truncated: outcome.resultCount < outcome.rankedTotal,
734
+ ...outcome.next !== null ? { next: outcome.next } : {},
735
+ reservation,
736
+ ...options ? { options } : {}
737
+ });
738
+ }
739
+ function runSkillsScope(deps, args, reservation, options) {
740
+ const name = typeof args.name === "string" ? args.name.trim() : "";
741
+ if (name.length === 0) {
742
+ const list2 = loadSkills({ cwd: cwdFromDeps(deps), ...deps.getSkillLoaderOptions?.() ?? {} });
743
+ const visible2 = modelVisibleSkills(list2.items);
744
+ const marketplace = marketplaceRowsFor(deps, visible2, options);
745
+ const rendered = renderSkillsList(visible2, marketplace, deps.skillMarketplace !== false);
746
+ const truncation2 = truncateHead(rendered, { maxBytes: reservation.callCapBytes, maxLines: Number.MAX_SAFE_INTEGER });
747
+ const total = visible2.length + marketplace.length;
748
+ return finalizeObservation({
749
+ tool: ToolNames.Context,
750
+ unit: "entries",
751
+ output: truncation2.content,
752
+ ...truncation2.truncated ? { fullOutput: rendered } : {},
753
+ shownCount: total,
754
+ totalCount: total,
755
+ truncated: truncation2.truncated,
756
+ details: {
757
+ skills: visible2.map((skill2) => ({ name: skill2.name, scope: skill2.scope })),
758
+ marketplace: marketplace.map((entry) => ({
759
+ name: entry.name,
760
+ ...entry.category ? { category: entry.category } : {}
761
+ }))
762
+ },
763
+ reservation,
764
+ ...options ? { options } : {}
765
+ });
766
+ }
767
+ const policyError = pendingSkillPolicyError(name, options);
768
+ if (policyError) return { kind: "error", message: policyError };
769
+ const list = loadSkills({ cwd: cwdFromDeps(deps), ...deps.getSkillLoaderOptions?.() ?? {} });
770
+ const visible = modelVisibleSkills(list.items);
771
+ const skill = visible.find((item) => item.name === name);
772
+ if (!skill) {
773
+ const installable = marketplaceRowsFor(deps, visible, options).some((entry) => entry.name === name);
774
+ if (installable) {
775
+ return {
776
+ kind: "error",
777
+ message: `context: skill "${name}" is not installed; it is available in the marketplace. Ask the operator to run /skill ${name}, which offers to install it, and wait. Do not retry this load.`
778
+ };
779
+ }
780
+ const available = visible.map((item) => item.name).join(", ");
781
+ const suffix = available.length > 0 ? ` Available skills: ${available}.` : " No skills are currently available.";
782
+ return { kind: "error", message: `context: unknown skill "${name}".${suffix}` };
783
+ }
784
+ const includeTree = args.include_tree === true;
785
+ const tree = includeTree ? buildResourceTree(skill.baseDir, DEFAULT_TREE_ENTRIES) : null;
786
+ const pendingRequest = pendingSkillRequestFor(name, options);
787
+ const pendingTask = pendingRequest?.args.trim() ?? "";
788
+ const driftReport = checkSkillDrift(skill, cwdFromDeps(deps));
789
+ const drift = driftReport?.verdict ?? null;
790
+ const driftWarning = driftReport?.verdict === "mismatch" ? `WARNING skill_drift: '${skill.name}' content (sha256 ${skill.hash.slice(0, 12)}\u2026) no longer matches the hash recorded for it ${driftReport.authority === "pinned-manifest" ? "in the audited skill catalog" : "when it was installed on this machine"} (expected ${driftReport.expected.slice(0, 12)}\u2026); the installed skill drifted from the content it claims to be.` : null;
791
+ const body = [
792
+ ...driftWarning !== null ? [driftWarning] : [],
793
+ ...renderPendingSkillTask(name, options),
794
+ ...skillExecutionFrame(skill, cwdFromDeps(deps)),
795
+ renderSkillBody(skill, tree)
796
+ ].join("\n");
797
+ const pendingPolicy = options?.pendingSkillPolicy;
798
+ if (pendingPolicy) {
799
+ pendingPolicy.loadedSkillNames.add(name);
800
+ pendingPolicy.loadedSkillPolicies.set(name, {
801
+ ...skill.allowedTools ? { allowedTools: skill.allowedTools } : {},
802
+ ...skill.disallowedTools ? { disallowedTools: skill.disallowedTools } : {}
803
+ });
804
+ }
805
+ const truncation = truncateHead(body, { maxBytes: reservation.callCapBytes, maxLines: Number.MAX_SAFE_INTEGER });
806
+ return finalizeObservation({
807
+ tool: ToolNames.Context,
808
+ unit: "sections",
809
+ output: truncation.content,
810
+ ...truncation.truncated ? { fullOutput: body } : {},
811
+ shownCount: 1,
812
+ totalCount: 1,
813
+ truncated: truncation.truncated,
814
+ details: {
815
+ name: skill.name,
816
+ description: skill.description,
817
+ ...pendingTask.length > 0 ? { pendingTask } : {},
818
+ path: skill.filePath,
819
+ baseDir: skill.baseDir,
820
+ hash: skill.hash,
821
+ source: skill.source,
822
+ sourceOrigin: skillSourceOrigin(skill),
823
+ sourceInfo: skill.sourceInfo,
824
+ scope: skill.scope,
825
+ disableModelInvocation: skill.disableModelInvocation,
826
+ ...skill.allowedTools ? { allowedTools: skill.allowedTools } : {},
827
+ ...skill.disallowedTools ? { disallowedTools: skill.disallowedTools } : {},
828
+ diagnostics: skill.diagnostics.map((d) => d.message),
829
+ metadata: skill.metadata,
830
+ ...skill.provenance ? { provenance: skill.provenance } : {},
831
+ ...drift !== null ? { drift } : {},
832
+ ...tree ? { tree } : {}
833
+ },
834
+ reservation,
835
+ ...options ? { options } : {}
836
+ });
837
+ }
838
+ function createContextTool(deps = {}) {
839
+ return {
840
+ ...contextToolSurface,
841
+ async run(args, options) {
842
+ const scope = typeof args.scope === "string" ? args.scope : "";
843
+ if (scope !== "workspace" && scope !== "docs" && scope !== "skills") {
844
+ return { kind: "error", message: `context: scope must be workspace, docs, or skills; got '${scope}'` };
845
+ }
846
+ const selfCap = scope === "docs" ? OBSERVE_SELF_CAPS.contextDocs : scope === "skills" ? OBSERVE_SELF_CAPS.contextSkills : OBSERVE_SELF_CAPS.contextWorkspace;
847
+ const reservation = reserveObservation(selfCap, options);
848
+ if (reservation.exhausted) {
849
+ return observationBudgetExhausted({
850
+ tool: ToolNames.Context,
851
+ unit: scope === "docs" ? "sections" : scope === "skills" ? "entries" : "results",
852
+ reservation,
853
+ subject: `scope=${scope}`,
854
+ hint: "Continue in a follow-up turn."
855
+ });
856
+ }
857
+ if (scope === "workspace") return runWorkspaceScope(deps, reservation, options);
858
+ if (scope === "docs") return runDocsScope(args, reservation, options);
859
+ return runSkillsScope(deps, args, reservation, options);
860
+ }
861
+ };
862
+ }
863
+ export {
864
+ createContextTool
865
+ };
866
+ //# sourceMappingURL=context-5VKGUVJJ.js.map