@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,641 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ computeFingerprint,
4
+ computeFingerprintAsync
5
+ } from "./chunk-VJWL6YS5.js";
6
+ import {
7
+ require_dist
8
+ } from "./chunk-APJ265NV.js";
9
+ import {
10
+ safeResourceWrite
11
+ } from "./chunk-WEPFGWHJ.js";
12
+ import {
13
+ __toESM,
14
+ init_esm_shims
15
+ } from "./chunk-3R73A4XB.js";
16
+
17
+ // src/domains/context/wiki/frontmatter.ts
18
+ init_esm_shims();
19
+ var import_yaml = __toESM(require_dist(), 1);
20
+ import { existsSync } from "node:fs";
21
+ import { isAbsolute, join, normalize, relative } from "node:path";
22
+ var FRONTMATTER_BLOCK = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;
23
+ var LIST_FIELDS = ["sources", "symbols", "tests", "invariants", "validate"];
24
+ var SUMMARY_MAX_CHARS = 240;
25
+ function isRecord(value) {
26
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27
+ }
28
+ function usableString(value) {
29
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
30
+ }
31
+ function stringList(value) {
32
+ if (!Array.isArray(value)) return [];
33
+ const seen = /* @__PURE__ */ new Set();
34
+ for (const entry of value) {
35
+ const usable = usableString(entry);
36
+ if (usable) seen.add(usable);
37
+ }
38
+ return [...seen];
39
+ }
40
+ function wikiPageHeading(text) {
41
+ return usableString(/^#\s+(.+?)\s*$/m.exec(stripFrontmatter(text).body)?.[1]);
42
+ }
43
+ function titleFromPagePath(pagePath) {
44
+ const base = pagePath.replace(/^.*\//, "").replace(/\.md$/i, "");
45
+ const spaced = base.replace(/[-_]+/g, " ").trim();
46
+ return spaced.length > 0 ? spaced.charAt(0).toUpperCase() + spaced.slice(1) : base;
47
+ }
48
+ function stripFrontmatter(content) {
49
+ const match = FRONTMATTER_BLOCK.exec(content);
50
+ if (!match) return { block: null, body: content };
51
+ return { block: match[1] ?? "", body: content.slice(match[0].length) };
52
+ }
53
+ function summaryFromBody(body) {
54
+ const skipped = ["#", "|", "```", "-", "*", ">", "<!--"];
55
+ const paragraphs = body.split(/\r?\n\s*\r?\n/).map((paragraph) => paragraph.replace(/\s+/g, " ").trim()).filter((paragraph) => paragraph.length > 0 && !skipped.some((prefix) => paragraph.startsWith(prefix)));
56
+ const first = paragraphs[0] ?? "";
57
+ return first.length > SUMMARY_MAX_CHARS ? `${first.slice(0, SUMMARY_MAX_CHARS - 1).trimEnd()}\u2026` : first;
58
+ }
59
+ function isWithin(root, candidate) {
60
+ const rel = relative(root, candidate);
61
+ return rel.length === 0 || !rel.startsWith("..") && !isAbsolute(rel);
62
+ }
63
+ function resolveSourcePath(sourceRoot, cited) {
64
+ if (cited.length === 0 || isAbsolute(cited) || /[*?{}<>]/.test(cited)) return null;
65
+ const direct = normalize(join(sourceRoot, cited));
66
+ if (!isWithin(sourceRoot, direct)) return null;
67
+ if (existsSync(direct)) return direct;
68
+ if (cited.endsWith(".js")) {
69
+ for (const extension of [".ts", ".tsx"]) {
70
+ const authored = normalize(join(sourceRoot, `${cited.slice(0, -3)}${extension}`));
71
+ if (isWithin(sourceRoot, authored) && existsSync(authored)) return authored;
72
+ }
73
+ }
74
+ return null;
75
+ }
76
+ function readWikiPage(input) {
77
+ const { block, body } = stripFrontmatter(input.content);
78
+ let fields;
79
+ if (block !== null) {
80
+ try {
81
+ fields = (0, import_yaml.parse)(`
82
+ ${block}`, { schema: "core", uniqueKeys: true });
83
+ } catch {
84
+ fields = void 0;
85
+ }
86
+ }
87
+ const authored = isRecord(fields) ? fields : {};
88
+ const metadata = {
89
+ title: usableString(authored.title) ?? wikiPageHeading(body) ?? titleFromPagePath(input.pagePath),
90
+ summary: usableString(authored.summary) ?? summaryFromBody(body),
91
+ sources: [],
92
+ symbols: stringList(authored.symbols),
93
+ tests: [],
94
+ invariants: stringList(authored.invariants),
95
+ validate: stringList(authored.validate)
96
+ };
97
+ const unresolvedPaths = [];
98
+ for (const field of ["sources", "tests"]) {
99
+ for (const cited of stringList(authored[field])) {
100
+ if (input.sourceRoot === void 0 || resolveSourcePath(input.sourceRoot, cited) !== null) {
101
+ metadata[field].push(cited);
102
+ } else {
103
+ unresolvedPaths.push(cited);
104
+ }
105
+ }
106
+ }
107
+ return { metadata, body, unresolvedPaths };
108
+ }
109
+ function renderList(name, values) {
110
+ if (values.length === 0) return [];
111
+ return [`${name}:`, ...values.map((value) => ` - ${JSON.stringify(value)}`)];
112
+ }
113
+ function renderFrontmatter(metadata) {
114
+ const lines = [`title: ${JSON.stringify(metadata.title)}`];
115
+ if (metadata.summary.length > 0) lines.push(`summary: ${JSON.stringify(metadata.summary)}`);
116
+ for (const field of LIST_FIELDS) lines.push(...renderList(field, metadata[field]));
117
+ return `---
118
+ ${lines.join("\n")}
119
+ ---
120
+ `;
121
+ }
122
+ function renderWikiPage(metadata, body) {
123
+ const trimmed = body.replace(/^\s+/, "").replace(/\s+$/, "");
124
+ const hasHeading = /^#\s+\S/m.test(trimmed);
125
+ const withHeading = hasHeading ? trimmed : `# ${metadata.title}
126
+
127
+ ${trimmed}`;
128
+ return `${renderFrontmatter(metadata)}
129
+ ${withHeading}
130
+ `;
131
+ }
132
+
133
+ // src/domains/context/wiki/layout.ts
134
+ init_esm_shims();
135
+ import { readdirSync, readFileSync } from "node:fs";
136
+ import { join as join2 } from "node:path";
137
+ var WIKI_QUICKSTART = "quickstart.md";
138
+ var WIKI_INDEX = "index.md";
139
+ var WIKI_PLAN_FILE = "_plan.json";
140
+ var NON_PAGE_FILES = /* @__PURE__ */ new Set(["meta.json", WIKI_PLAN_FILE]);
141
+ function compareStrings(a, b) {
142
+ return a.localeCompare(b);
143
+ }
144
+ function wikiDir(cwd) {
145
+ return join2(cwd, ".clio-coder", "wiki");
146
+ }
147
+ function wikiMarkdownFilesInDir(dir, prefix = "") {
148
+ let entries;
149
+ try {
150
+ entries = readdirSync(join2(dir, prefix), { withFileTypes: true });
151
+ } catch {
152
+ return [];
153
+ }
154
+ const files = [];
155
+ for (const entry of entries) {
156
+ if (entry.name.startsWith(".")) continue;
157
+ const relPath = prefix.length > 0 ? `${prefix}/${entry.name}` : entry.name;
158
+ if (entry.isDirectory()) {
159
+ files.push(...wikiMarkdownFilesInDir(dir, relPath));
160
+ continue;
161
+ }
162
+ if (entry.isFile() && entry.name.endsWith(".md") && !NON_PAGE_FILES.has(entry.name)) {
163
+ files.push(relPath);
164
+ }
165
+ }
166
+ return files.sort(compareStrings);
167
+ }
168
+ function isGeneratedWikiFile(relPath) {
169
+ return relPath === WIKI_QUICKSTART || relPath === WIKI_INDEX || relPath.endsWith(`/${WIKI_INDEX}`);
170
+ }
171
+ function listWikiPagesInDir(dir) {
172
+ const pages = [];
173
+ for (const relPath of wikiMarkdownFilesInDir(dir)) {
174
+ if (relPath !== WIKI_QUICKSTART && isGeneratedWikiFile(relPath)) continue;
175
+ let content = "";
176
+ try {
177
+ content = readFileSync(join2(dir, relPath), "utf8");
178
+ } catch {
179
+ content = "";
180
+ }
181
+ const { metadata } = readWikiPage({ pagePath: relPath, content });
182
+ pages.push({
183
+ path: relPath,
184
+ title: metadata.title,
185
+ ...metadata.summary.length > 0 ? { summary: metadata.summary } : {}
186
+ });
187
+ }
188
+ return pages;
189
+ }
190
+ function listWikiPages(cwd) {
191
+ return listWikiPagesInDir(wikiDir(cwd));
192
+ }
193
+
194
+ // src/domains/context/wiki/plan-store.ts
195
+ init_esm_shims();
196
+ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
197
+ import { join as join3 } from "node:path";
198
+ var MAX_PAGE_ATTEMPTS = 3;
199
+ var MAX_INTENT_CHARS = 600;
200
+ var MAX_PLAN_PAGES = 200;
201
+ function isRecord2(value) {
202
+ return typeof value === "object" && value !== null && !Array.isArray(value);
203
+ }
204
+ function usableString2(value) {
205
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
206
+ }
207
+ function stringList2(value, limit) {
208
+ if (!Array.isArray(value)) return [];
209
+ const out = [];
210
+ for (const entry of value) {
211
+ const usable = usableString2(entry);
212
+ if (usable && !out.includes(usable)) out.push(usable);
213
+ if (out.length >= limit) break;
214
+ }
215
+ return out;
216
+ }
217
+ function sanitizePagePath(value) {
218
+ const raw = usableString2(value);
219
+ if (raw === null) return null;
220
+ const normalized = raw.replace(/\\/g, "/").replace(/^\.\//, "").replace(/^\/+/, "");
221
+ if (!normalized.endsWith(".md") || normalized.length > 200) return null;
222
+ const segments = normalized.split("/");
223
+ if (segments.some((segment) => segment.length === 0 || segment === "." || segment === ".." || segment.startsWith("."))) {
224
+ return null;
225
+ }
226
+ if (isGeneratedWikiFile(normalized)) return null;
227
+ return normalized;
228
+ }
229
+ function wikiPlanPath(dir) {
230
+ return join3(dir, WIKI_PLAN_FILE);
231
+ }
232
+ function parsedStatus(value) {
233
+ return value === "written" || value === "pending" ? value : null;
234
+ }
235
+ function parsedAttempts(value) {
236
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
237
+ }
238
+ function sanitizeWikiPlan(value, previous, options = { trustStatus: true }) {
239
+ if (!isRecord2(value) || !Array.isArray(value.pages)) return null;
240
+ const priorByPath = new Map((previous?.pages ?? []).map((page) => [page.path, page]));
241
+ const pages = [];
242
+ const seen = /* @__PURE__ */ new Set();
243
+ for (const entry of value.pages) {
244
+ if (pages.length >= MAX_PLAN_PAGES) break;
245
+ if (!isRecord2(entry)) continue;
246
+ const path = sanitizePagePath(entry.path);
247
+ if (path === null || seen.has(path)) continue;
248
+ const intent = usableString2(entry.intent);
249
+ const prior = priorByPath.get(path);
250
+ const recorded = options.trustStatus ? parsedStatus(entry.status) : null;
251
+ const recordedAttempts = options.trustStatus ? parsedAttempts(entry.attempts) : null;
252
+ seen.add(path);
253
+ pages.push({
254
+ path,
255
+ title: usableString2(entry.title) ?? path.replace(/\.md$/, ""),
256
+ intent: intent === null ? "" : intent.slice(0, MAX_INTENT_CHARS),
257
+ sources: stringList2(entry.sources, 16),
258
+ status: prior?.status ?? recorded ?? "pending",
259
+ attempts: prior?.attempts ?? recordedAttempts ?? 0
260
+ });
261
+ }
262
+ if (pages.length === 0) return null;
263
+ return { version: 1, overview: usableString2(value.overview) ?? previous?.overview ?? "", pages };
264
+ }
265
+ function readPlanDocument(dir) {
266
+ const filePath = wikiPlanPath(dir);
267
+ if (!existsSync2(filePath)) return void 0;
268
+ try {
269
+ return JSON.parse(readFileSync2(filePath, "utf8"));
270
+ } catch {
271
+ return void 0;
272
+ }
273
+ }
274
+ function readWikiPlanFile(dir, previous) {
275
+ const document = readPlanDocument(dir);
276
+ return document === void 0 ? null : sanitizeWikiPlan(document, previous, { trustStatus: true });
277
+ }
278
+ function readAuthoredWikiPlan(dir, previous) {
279
+ const document = readPlanDocument(dir);
280
+ return document === void 0 ? null : sanitizeWikiPlan(document, previous, { trustStatus: false });
281
+ }
282
+ function writeWikiPlanFile(dir, plan) {
283
+ safeResourceWrite(wikiPlanPath(dir), `${JSON.stringify(plan, null, 2)}
284
+ `, { encoding: "utf8" });
285
+ }
286
+ function unclaimedCandidates(plan, candidate, pageSources = /* @__PURE__ */ new Map()) {
287
+ const knownPaths = new Set(plan.pages.map((page) => page.path));
288
+ const claimed = /* @__PURE__ */ new Set();
289
+ for (const page of plan.pages) {
290
+ for (const source of [...page.sources, ...pageSources.get(page.path) ?? []]) claimed.add(source);
291
+ }
292
+ return candidate.pages.filter(
293
+ (page) => !knownPaths.has(page.path) && !page.sources.some((source) => claimed.has(source))
294
+ );
295
+ }
296
+ function scopePlanForUpdate(input) {
297
+ const changedPrefixes = [...input.changedPaths];
298
+ const pages = input.plan.pages.map((page) => {
299
+ if (!input.existingPages.has(page.path)) return { ...page, status: "pending", attempts: 0 };
300
+ const claimed = [...input.pageSources.get(page.path) ?? [], ...page.sources];
301
+ const touched = claimed.some(
302
+ (source) => changedPrefixes.some((changed) => changed === source || changed.startsWith(`${source}/`))
303
+ );
304
+ return touched ? { ...page, status: "pending", attempts: 0 } : { ...page, status: "written" };
305
+ });
306
+ return { ...input.plan, pages };
307
+ }
308
+ function pendingPages(plan) {
309
+ return plan.pages.filter((page) => page.status !== "written" && page.attempts < MAX_PAGE_ATTEMPTS);
310
+ }
311
+
312
+ // src/domains/context/wiki/meta.ts
313
+ init_esm_shims();
314
+ import { execFileSync } from "node:child_process";
315
+ import { createHash } from "node:crypto";
316
+ import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
317
+ import { join as join4 } from "node:path";
318
+ function compareStrings2(a, b) {
319
+ return a.localeCompare(b);
320
+ }
321
+ function isRecord3(value) {
322
+ return typeof value === "object" && value !== null && !Array.isArray(value);
323
+ }
324
+ function stringValue(value) {
325
+ return typeof value === "string" && value.trim().length > 0 ? value : null;
326
+ }
327
+ function nonNegativeSafeInteger(value) {
328
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
329
+ }
330
+ var REQUESTED_DEPTHS = ["auto", "simple", "medium", "detailed"];
331
+ var RESOLVED_DEPTHS = ["simple", "medium", "detailed"];
332
+ function parseGeneration(value) {
333
+ if (!isRecord3(value)) return void 0;
334
+ const { requestedDepth, depth, sourceFiles, sourceLines, pagesPlanned, pagesWritten } = value;
335
+ if (!REQUESTED_DEPTHS.includes(requestedDepth) || !RESOLVED_DEPTHS.includes(depth) || !nonNegativeSafeInteger(sourceFiles) || !nonNegativeSafeInteger(sourceLines) || !nonNegativeSafeInteger(pagesPlanned) || !nonNegativeSafeInteger(pagesWritten)) {
336
+ return void 0;
337
+ }
338
+ return {
339
+ requestedDepth,
340
+ depth,
341
+ sourceFiles,
342
+ sourceLines,
343
+ pagesPlanned,
344
+ pagesWritten
345
+ };
346
+ }
347
+ function normalizePages(pages) {
348
+ return pages.map((page) => ({ path: page.path, title: page.title, ...page.summary ? { summary: page.summary } : {} })).sort((a, b) => a.path.localeCompare(b.path));
349
+ }
350
+ function wikiMetaPath(cwd) {
351
+ return join4(wikiDir(cwd), "meta.json");
352
+ }
353
+ function currentWikiGitHead(cwd) {
354
+ try {
355
+ return execFileSync("git", ["rev-parse", "--verify", "HEAD"], {
356
+ cwd,
357
+ encoding: "utf8",
358
+ stdio: ["ignore", "pipe", "ignore"]
359
+ }).trim();
360
+ } catch {
361
+ return null;
362
+ }
363
+ }
364
+ function validateWikiMeta(value) {
365
+ const problems = [];
366
+ if (!isRecord3(value)) {
367
+ return { ok: false, problems: ["meta must be a JSON object"] };
368
+ }
369
+ if (value.version !== 1) problems.push("version must be 1");
370
+ const updatedAt = stringValue(value.updatedAt);
371
+ if (!updatedAt) problems.push("updatedAt must be a non-empty string");
372
+ const gitHead = value.gitHead;
373
+ if (gitHead !== null && typeof gitHead !== "string") problems.push("gitHead must be a string or null");
374
+ const sourceTreeHash = value.sourceTreeHash;
375
+ if (sourceTreeHash !== void 0 && (typeof sourceTreeHash !== "string" || !/^[a-f0-9]{64}$/.test(sourceTreeHash))) {
376
+ problems.push("sourceTreeHash must be a sha256 hex string when present");
377
+ }
378
+ const model = stringValue(value.model);
379
+ if (!model) problems.push("model must be a non-empty string");
380
+ const contentHash = stringValue(value.contentHash);
381
+ if (!contentHash || !/^[a-f0-9]{64}$/.test(contentHash)) {
382
+ problems.push("contentHash must be a sha256 hex string");
383
+ }
384
+ if (!Array.isArray(value.pages)) {
385
+ problems.push("pages must be an array");
386
+ } else {
387
+ for (const [index, page] of value.pages.entries()) {
388
+ if (!isRecord3(page)) {
389
+ problems.push(`pages[${index}] must be an object`);
390
+ continue;
391
+ }
392
+ if (!stringValue(page.path)) problems.push(`pages[${index}].path must be a non-empty string`);
393
+ if (!stringValue(page.title)) problems.push(`pages[${index}].title must be a non-empty string`);
394
+ }
395
+ }
396
+ if (problems.length > 0) return { ok: false, problems };
397
+ const generation = parseGeneration(value.generation);
398
+ const plan = sanitizeWikiPlan(value.plan, void 0, { trustStatus: true });
399
+ return {
400
+ ok: true,
401
+ value: {
402
+ version: 1,
403
+ updatedAt,
404
+ gitHead,
405
+ ...sourceTreeHash !== void 0 ? { sourceTreeHash } : {},
406
+ model,
407
+ contentHash,
408
+ pages: normalizePages(value.pages),
409
+ ...generation !== void 0 ? { generation } : {},
410
+ ...plan !== null ? { plan } : {}
411
+ }
412
+ };
413
+ }
414
+ function isWikiMeta(value) {
415
+ return validateWikiMeta(value).ok;
416
+ }
417
+ function readWikiMeta(cwd) {
418
+ const filePath = wikiMetaPath(cwd);
419
+ if (!existsSync3(filePath)) return null;
420
+ let parsed;
421
+ try {
422
+ parsed = JSON.parse(readFileSync3(filePath, "utf8"));
423
+ } catch {
424
+ return null;
425
+ }
426
+ const validation = validateWikiMeta(parsed);
427
+ return validation.ok ? validation.value : null;
428
+ }
429
+ function writeWikiMeta(cwd, meta) {
430
+ const normalized = {
431
+ version: 1,
432
+ updatedAt: meta.updatedAt,
433
+ gitHead: meta.gitHead,
434
+ ...meta.sourceTreeHash ? { sourceTreeHash: meta.sourceTreeHash } : {},
435
+ model: meta.model,
436
+ contentHash: meta.contentHash,
437
+ pages: normalizePages(meta.pages),
438
+ ...meta.generation !== void 0 ? { generation: { ...meta.generation } } : {},
439
+ ...meta.plan !== void 0 ? { plan: meta.plan } : {}
440
+ };
441
+ safeResourceWrite(wikiMetaPath(cwd), `${JSON.stringify(normalized)}
442
+ `, { encoding: "utf8" });
443
+ }
444
+ function computeWikiContentHashOfDir(dir) {
445
+ const hash = createHash("sha256");
446
+ for (const relPath of wikiMarkdownFilesInDir(dir).sort(compareStrings2)) {
447
+ let text = "";
448
+ try {
449
+ text = readFileSync3(join4(dir, relPath), "utf8");
450
+ } catch {
451
+ text = "";
452
+ }
453
+ hash.update(`${relPath}\0${text.length}\0`);
454
+ hash.update(text);
455
+ hash.update("\0");
456
+ }
457
+ return hash.digest("hex");
458
+ }
459
+ function computeWikiContentHash(cwd) {
460
+ return computeWikiContentHashOfDir(wikiDir(cwd));
461
+ }
462
+
463
+ // src/domains/context/wiki/staleness.ts
464
+ init_esm_shims();
465
+ import { execFile, execFileSync as execFileSync2 } from "node:child_process";
466
+ import { promisify } from "node:util";
467
+ var execFileAsync = promisify(execFile);
468
+ var GIT_DIFF_LINE_CAP = 200;
469
+ function splitNullTerminatedPaths(output) {
470
+ return output.split("\0").filter((path) => path.length > 0);
471
+ }
472
+ function currentGitHead(cwd) {
473
+ try {
474
+ const out = execFileSync2("git", ["rev-parse", "--verify", "HEAD"], {
475
+ cwd,
476
+ encoding: "utf8",
477
+ stdio: ["ignore", "pipe", "ignore"]
478
+ }).trim();
479
+ return out.length > 0 ? out : null;
480
+ } catch {
481
+ return null;
482
+ }
483
+ }
484
+ async function currentGitHeadAsync(cwd) {
485
+ try {
486
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--verify", "HEAD"], { cwd, encoding: "utf8" });
487
+ const out = stdout.trim();
488
+ return out.length > 0 ? out : null;
489
+ } catch {
490
+ return null;
491
+ }
492
+ }
493
+ function collectChangedPaths(cwd, gitHead) {
494
+ const committed = execFileSync2("git", ["diff", "--name-only", "-z", `${gitHead}..HEAD`], {
495
+ cwd,
496
+ encoding: "utf8",
497
+ stdio: ["ignore", "pipe", "ignore"]
498
+ });
499
+ const trackedWorking = execFileSync2("git", ["diff", "--name-only", "-z", "HEAD"], {
500
+ cwd,
501
+ encoding: "utf8",
502
+ stdio: ["ignore", "pipe", "ignore"]
503
+ });
504
+ const untracked = execFileSync2("git", ["ls-files", "--others", "--exclude-standard", "-z"], {
505
+ cwd,
506
+ encoding: "utf8",
507
+ stdio: ["ignore", "pipe", "ignore"]
508
+ });
509
+ return /* @__PURE__ */ new Set([
510
+ ...splitNullTerminatedPaths(committed),
511
+ ...splitNullTerminatedPaths(trackedWorking),
512
+ ...splitNullTerminatedPaths(untracked)
513
+ ]);
514
+ }
515
+ function changedPathsSince(cwd, gitHead) {
516
+ if (!gitHead) return [];
517
+ try {
518
+ return [...collectChangedPaths(cwd, gitHead)];
519
+ } catch {
520
+ return [];
521
+ }
522
+ }
523
+ async function collectChangedPathsAsync(cwd, gitHead) {
524
+ const run = async (args) => {
525
+ const { stdout } = await execFileAsync("git", args, { cwd, encoding: "utf8" });
526
+ return stdout;
527
+ };
528
+ const [committed, trackedWorking, untracked] = await Promise.all([
529
+ run(["diff", "--name-only", "-z", `${gitHead}..HEAD`]),
530
+ run(["diff", "--name-only", "-z", "HEAD"]),
531
+ run(["ls-files", "--others", "--exclude-standard", "-z"])
532
+ ]);
533
+ return /* @__PURE__ */ new Set([
534
+ ...splitNullTerminatedPaths(committed),
535
+ ...splitNullTerminatedPaths(trackedWorking),
536
+ ...splitNullTerminatedPaths(untracked)
537
+ ]);
538
+ }
539
+ function capChangedPaths(paths) {
540
+ const capped = [...paths].slice(0, GIT_DIFF_LINE_CAP);
541
+ return {
542
+ count: capped.length,
543
+ ...paths.size > capped.length ? { warning: `changed file count capped at ${GIT_DIFF_LINE_CAP}` } : {}
544
+ };
545
+ }
546
+ var CHANGED_COUNT_FAILURE = "wiki staleness unavailable: git diff failed for the recorded wiki gitHead";
547
+ function changedFileCount(cwd, gitHead) {
548
+ try {
549
+ return capChangedPaths(collectChangedPaths(cwd, gitHead));
550
+ } catch {
551
+ return { warning: CHANGED_COUNT_FAILURE };
552
+ }
553
+ }
554
+ async function changedFileCountAsync(cwd, gitHead) {
555
+ try {
556
+ return capChangedPaths(await collectChangedPathsAsync(cwd, gitHead));
557
+ } catch {
558
+ return { warning: CHANGED_COUNT_FAILURE };
559
+ }
560
+ }
561
+ function wikiCompletenessFromMeta(meta) {
562
+ const generation = meta?.generation;
563
+ if (!generation) return null;
564
+ return {
565
+ pagesPlanned: generation.pagesPlanned,
566
+ pagesWritten: generation.pagesWritten,
567
+ owed: Math.max(0, generation.pagesPlanned - generation.pagesWritten)
568
+ };
569
+ }
570
+ function wikiCompleteness(cwd) {
571
+ return wikiCompletenessFromMeta(readWikiMeta(cwd));
572
+ }
573
+ var MISSING_RECORDED_HEAD = "wiki staleness unavailable: recorded gitHead is missing";
574
+ var MISSING_CURRENT_HEAD = "wiki staleness unavailable: current git HEAD is missing";
575
+ function wikiStaleness(cwd) {
576
+ const meta = readWikiMeta(cwd);
577
+ if (!meta) return { state: "absent" };
578
+ if (!meta.gitHead) return { state: "fresh", warning: MISSING_RECORDED_HEAD };
579
+ const head = currentGitHead(cwd);
580
+ if (!head) return { state: "fresh", warning: MISSING_CURRENT_HEAD };
581
+ if (meta.sourceTreeHash && computeFingerprint(cwd).treeHash === meta.sourceTreeHash && head === meta.gitHead) {
582
+ return { state: "fresh" };
583
+ }
584
+ if (!meta.sourceTreeHash && head === meta.gitHead) return { state: "fresh" };
585
+ const diff = changedFileCount(cwd, meta.gitHead);
586
+ if (!("count" in diff)) return { state: "fresh", warning: diff.warning };
587
+ return { state: "stale", changedFiles: diff.count, ...diff.warning ? { warning: diff.warning } : {} };
588
+ }
589
+ async function wikiStalenessAsync(cwd) {
590
+ const meta = readWikiMeta(cwd);
591
+ if (!meta) return { state: "absent" };
592
+ if (!meta.gitHead) return { state: "fresh", warning: MISSING_RECORDED_HEAD };
593
+ const head = await currentGitHeadAsync(cwd);
594
+ if (!head) return { state: "fresh", warning: MISSING_CURRENT_HEAD };
595
+ if (meta.sourceTreeHash) {
596
+ const fingerprint = await computeFingerprintAsync(cwd);
597
+ if (fingerprint.treeHash === meta.sourceTreeHash && head === meta.gitHead) return { state: "fresh" };
598
+ } else if (head === meta.gitHead) {
599
+ return { state: "fresh" };
600
+ }
601
+ const diff = await changedFileCountAsync(cwd, meta.gitHead);
602
+ if (!("count" in diff)) return { state: "fresh", warning: diff.warning };
603
+ return { state: "stale", changedFiles: diff.count, ...diff.warning ? { warning: diff.warning } : {} };
604
+ }
605
+
606
+ export {
607
+ resolveSourcePath,
608
+ readWikiPage,
609
+ renderWikiPage,
610
+ WIKI_QUICKSTART,
611
+ WIKI_INDEX,
612
+ WIKI_PLAN_FILE,
613
+ wikiDir,
614
+ wikiMarkdownFilesInDir,
615
+ isGeneratedWikiFile,
616
+ listWikiPagesInDir,
617
+ listWikiPages,
618
+ MAX_PAGE_ATTEMPTS,
619
+ sanitizePagePath,
620
+ sanitizeWikiPlan,
621
+ readWikiPlanFile,
622
+ readAuthoredWikiPlan,
623
+ writeWikiPlanFile,
624
+ unclaimedCandidates,
625
+ scopePlanForUpdate,
626
+ pendingPages,
627
+ wikiMetaPath,
628
+ currentWikiGitHead,
629
+ validateWikiMeta,
630
+ isWikiMeta,
631
+ readWikiMeta,
632
+ writeWikiMeta,
633
+ computeWikiContentHashOfDir,
634
+ computeWikiContentHash,
635
+ changedPathsSince,
636
+ wikiCompletenessFromMeta,
637
+ wikiCompleteness,
638
+ wikiStaleness,
639
+ wikiStalenessAsync
640
+ };
641
+ //# sourceMappingURL=chunk-X4RCMKVQ.js.map