@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
package/src/cli/usage.ts CHANGED
@@ -203,9 +203,16 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
203
203
  process.stderr.write(HELP);
204
204
  return 2;
205
205
  }
206
- if (parsed.help || parsed.command === undefined) {
206
+ if (parsed.help) {
207
207
  process.stdout.write(HELP);
208
- return parsed.help ? 0 : 2;
208
+ return 0;
209
+ }
210
+ // A bare `clio-coder usage` already exited 2, but wrote its usage to stdout,
211
+ // which is where the report itself goes. Usage that stands in for output the
212
+ // caller asked for belongs on stderr.
213
+ if (parsed.command === undefined) {
214
+ process.stderr.write(HELP);
215
+ return 2;
209
216
  }
210
217
  if (parsed.command !== "report") {
211
218
  printError(`unknown usage command: ${parsed.command}`);
@@ -352,7 +359,7 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
352
359
  if (bareIds.length < 3) continue;
353
360
  opportunities.push({
354
361
  kind: "workflow-distiller",
355
- suggestion: `bash shape "${shape}" recurs with no skill activation; consider /skill:workflow-distiller to distill it`,
362
+ suggestion: `bash shape "${shape}" recurs with no skill activation; consider /skill workflow-distiller to distill it`,
356
363
  evidence: `${bareIds.length} sessions: ${bareIds.slice(0, 5).join(", ")}${bareIds.length > 5 ? ", ..." : ""}`,
357
364
  });
358
365
  }
@@ -6,7 +6,8 @@ import { ToolNames } from "../core/tool-names.js";
6
6
  import { AgentsDomainModule } from "../domains/agents/index.js";
7
7
  import type { ConfigContract } from "../domains/config/contract.js";
8
8
  import { ConfigDomainModule } from "../domains/config/index.js";
9
- import { ContextDomainModule, type WikiGenerate, type WikiGenerateInput } from "../domains/context/index.js";
9
+ import { ContextDomainModule } from "../domains/context/runtime.js";
10
+ import type { WikiGenerate, WikiGenerateInput } from "../domains/context/wiki/generate.js";
10
11
  import type { WikiPlan, WikiPlanPage } from "../domains/context/wiki/plan.js";
11
12
  import {
12
13
  MAX_PAGE_ATTEMPTS,
@@ -0,0 +1,7 @@
1
+ /** Generic child-process attribution used by agent-aware developer tools. */
2
+ export const AI_AGENT_NAME = "clio-coder";
3
+
4
+ /** Add Clio's attribution without admitting any other environment variables. */
5
+ export function withClioAgentEnvironment(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
6
+ return { ...source, AI_AGENT: AI_AGENT_NAME };
7
+ }
@@ -1,4 +1,10 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { AI_AGENT_NAME } from "./agent-environment.js";
3
+ import {
4
+ gitCommitAttributionEnabled,
5
+ reportCommitAttributionDiagnostic,
6
+ withManagedGitCommitAttributionEnvironment,
7
+ } from "./git-commit-attribution.js";
2
8
  import { clampTimerDelayMs } from "./timers.js";
3
9
 
4
10
  export { clampTimerDelayMs as clampTimeoutMs } from "./timers.js";
@@ -24,14 +30,28 @@ export interface BashCommandResult {
24
30
  outputCapped: boolean;
25
31
  }
26
32
 
33
+ export interface BashCommandProgress {
34
+ /** Cumulative stdout captured so far. */
35
+ stdout: string;
36
+ /** Cumulative stderr captured so far. */
37
+ stderr: string;
38
+ /** Total bytes accepted from both streams so far. */
39
+ outputBytes: number;
40
+ }
41
+
27
42
  export interface RunBashCommandOptions {
28
43
  cwd?: string;
29
44
  timeoutMs?: number;
30
45
  signal?: AbortSignal;
46
+ /** Cumulative snapshots, throttled to keep terminal rendering responsive. */
47
+ onUpdate?: (progress: BashCommandProgress) => void;
31
48
  }
32
49
 
50
+ const BASH_UPDATE_THROTTLE_MS = 100;
51
+
33
52
  function buildToolEnv(): NodeJS.ProcessEnv {
34
53
  const env = { ...process.env };
54
+ env.AI_AGENT = AI_AGENT_NAME;
35
55
  for (const key of CLIO_CONTROL_ENV_KEYS) {
36
56
  Reflect.deleteProperty(env, key);
37
57
  }
@@ -102,6 +122,7 @@ async function bashSpawnPlan(): Promise<BashSpawnPlan> {
102
122
  // the capture still flow through; the CLIO control keys are re-stripped
103
123
  // last so they never reach the child from either source.
104
124
  const env: NodeJS.ProcessEnv = { ...process.env, ...captured };
125
+ env.AI_AGENT = AI_AGENT_NAME;
105
126
  for (const key of CLIO_CONTROL_ENV_KEYS) {
106
127
  Reflect.deleteProperty(env, key);
107
128
  }
@@ -115,6 +136,11 @@ export function combineBashOutput(result: Pick<BashCommandResult, "stdout" | "st
115
136
 
116
137
  export async function runBashCommand(command: string, options: RunBashCommandOptions = {}): Promise<BashCommandResult> {
117
138
  const plan = await bashSpawnPlan();
139
+ const attribution = withManagedGitCommitAttributionEnvironment(plan.env, {
140
+ cwd: options.cwd ?? process.cwd(),
141
+ enabled: gitCommitAttributionEnabled(process.env),
142
+ });
143
+ reportCommitAttributionDiagnostic(attribution.diagnostic);
118
144
  return new Promise((resolve) => {
119
145
  const timeout = clampTimerDelayMs(options.timeoutMs ?? 300_000);
120
146
  let aborted = false;
@@ -127,14 +153,55 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
127
153
  let stderr = "";
128
154
  let outputBytes = 0;
129
155
  let outputCapped = false;
156
+ let updateTimer: ReturnType<typeof setTimeout> | null = null;
157
+ let updateDirty = false;
158
+ let lastUpdateAt = 0;
130
159
 
131
160
  const child = spawn("/bin/bash", [plan.mode, command], {
132
161
  ...(options.cwd === undefined ? {} : { cwd: options.cwd }),
133
- env: plan.env,
162
+ env: attribution.env,
134
163
  detached: process.platform !== "win32",
135
164
  stdio: ["ignore", "pipe", "pipe"],
136
165
  });
137
166
 
167
+ const emitUpdate = (): void => {
168
+ if (options.onUpdate === undefined || !updateDirty) return;
169
+ updateDirty = false;
170
+ lastUpdateAt = Date.now();
171
+ try {
172
+ options.onUpdate({ stdout, stderr, outputBytes: Math.min(outputBytes, BASH_HARD_CAP_BYTES) });
173
+ } catch {
174
+ // Rendering progress is advisory and must never change command execution.
175
+ }
176
+ };
177
+ const clearUpdateTimer = (): void => {
178
+ if (updateTimer === null) return;
179
+ clearTimeout(updateTimer);
180
+ updateTimer = null;
181
+ };
182
+ const scheduleUpdate = (): void => {
183
+ if (options.onUpdate === undefined) return;
184
+ updateDirty = true;
185
+ const delay = BASH_UPDATE_THROTTLE_MS - (Date.now() - lastUpdateAt);
186
+ if (delay <= 0) {
187
+ clearUpdateTimer();
188
+ emitUpdate();
189
+ return;
190
+ }
191
+ updateTimer ??= setTimeout(() => {
192
+ updateTimer = null;
193
+ emitUpdate();
194
+ }, delay);
195
+ };
196
+ const finishUpdates = (): void => {
197
+ clearUpdateTimer();
198
+ emitUpdate();
199
+ };
200
+ if (options.onUpdate !== undefined) {
201
+ updateDirty = true;
202
+ emitUpdate();
203
+ }
204
+
138
205
  const clearKillGraceTimer = (): void => {
139
206
  if (!killGraceTimer) return;
140
207
  clearTimeout(killGraceTimer);
@@ -195,11 +262,13 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
195
262
  else stderr += slice;
196
263
  }
197
264
  outputCapped = true;
265
+ scheduleUpdate();
198
266
  killChild();
199
267
  return;
200
268
  }
201
269
  if (target === "stdout") stdout += chunk.toString("utf8");
202
270
  else stderr += chunk.toString("utf8");
271
+ scheduleUpdate();
203
272
  };
204
273
 
205
274
  child.stdout?.on("data", (chunk: Buffer) => appendChunk("stdout", chunk));
@@ -209,6 +278,7 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
209
278
  settled = true;
210
279
  if (timeoutId) clearTimeout(timeoutId);
211
280
  clearKillGraceTimer();
281
+ finishUpdates();
212
282
  options.signal?.removeEventListener("abort", onAbort);
213
283
  resolve({
214
284
  error: error as NodeJS.ErrnoException,
@@ -226,6 +296,7 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
226
296
  settled = true;
227
297
  if (timeoutId) clearTimeout(timeoutId);
228
298
  clearKillGraceTimer();
299
+ finishUpdates();
229
300
  options.signal?.removeEventListener("abort", onAbort);
230
301
  const error =
231
302
  code === 0 && signalName === null
@@ -20,17 +20,22 @@ export function isBootTraceEnabled(): boolean {
20
20
  return process.env[BOOT_TRACE_ENV] === "1";
21
21
  }
22
22
 
23
+ /** Build one trace line without choosing an output owner. */
24
+ export function formatBootTrace(phase: string, detail?: string): string | null {
25
+ if (!isBootTraceEnabled()) return null;
26
+ const suffix = detail !== undefined && detail.length > 0 ? ` (${detail})` : "";
27
+ return `[clio:boot] +${performance.now().toFixed(1)}ms ${phase}${suffix}\n`;
28
+ }
29
+
23
30
  /**
24
31
  * Stamp a boot phase marker to stderr, e.g. `[clio:boot] +742.1ms cli entry`.
25
32
  * `detail` appends a parenthetical (module counts, ids). No-op unless
26
33
  * `CLIO_CODER_TRACE_BOOT=1`. Never throws: a diagnostic must not affect boot.
27
34
  */
28
35
  export function traceBoot(phase: string, detail?: string): void {
29
- if (!isBootTraceEnabled()) return;
30
36
  try {
31
- const elapsedMs = performance.now();
32
- const suffix = detail !== undefined && detail.length > 0 ? ` (${detail})` : "";
33
- process.stderr.write(`[clio:boot] +${elapsedMs.toFixed(1)}ms ${phase}${suffix}\n`);
37
+ const line = formatBootTrace(phase, detail);
38
+ if (line) process.stderr.write(line);
34
39
  } catch {
35
40
  // Tracing is best-effort; a write failure must never break boot.
36
41
  }
@@ -34,6 +34,7 @@ export const BusChannels = {
34
34
  SessionEnd: "session.end",
35
35
  SessionParked: "session.parked",
36
36
  SessionResumed: "session.resumed",
37
+ SessionTurnSwitched: "session.turn_switched",
37
38
  DomainLoaded: "domain.loaded",
38
39
  DomainFailed: "domain.failed",
39
40
  ConfigHotReload: "config.hotReload",
@@ -300,6 +301,20 @@ export interface SessionResumedPayload {
300
301
  at: number;
301
302
  }
302
303
 
304
+ /**
305
+ * Published on {@link BusChannels.SessionTurnSwitched} when `/tree` moves the
306
+ * active append point inside the current session without changing which
307
+ * session is open. Nothing else observes that move: unlike resume/fork, the
308
+ * session id in `getSessionId()` callbacks stays the same, so anything keyed
309
+ * on session id alone (the task board cache among them) needs this signal to
310
+ * know its fold is stale.
311
+ */
312
+ export interface SessionTurnSwitchedPayload {
313
+ sessionId: string;
314
+ turnId: string;
315
+ at: number;
316
+ }
317
+
303
318
  /** Published on {@link BusChannels.DomainLoaded} per successfully started domain. */
304
319
  export interface DomainLoadedPayload {
305
320
  name: string;
@@ -395,12 +410,12 @@ export interface PermissionRequestedPayload {
395
410
 
396
411
  /**
397
412
  * Published on {@link BusChannels.PermissionResolved} when a parked call is
398
- * granted or denied (operator decision, headless auto-deny, or a delegated
399
- * agent's denial relayed by dispatch). Only `status` is guaranteed; emitters
400
- * attach whatever provenance they have.
413
+ * granted, denied, or expires internally (operator decision, headless
414
+ * auto-deny, delegated-agent denial, or internal expiry). Only `status` is
415
+ * guaranteed; emitters attach whatever provenance they have.
401
416
  */
402
417
  export interface PermissionResolvedPayload {
403
- status: "granted" | "denied";
418
+ status: "granted" | "denied" | "expired";
404
419
  requestId?: string | undefined;
405
420
  origin?: string | undefined;
406
421
  decidedBy?: string | undefined;
@@ -685,6 +700,7 @@ export type BusPayloadMap = {
685
700
  [BusChannels.SessionEnd]: SessionEndPayload;
686
701
  [BusChannels.SessionParked]: SessionParkedPayload;
687
702
  [BusChannels.SessionResumed]: SessionResumedPayload;
703
+ [BusChannels.SessionTurnSwitched]: SessionTurnSwitchedPayload;
688
704
  [BusChannels.DomainLoaded]: DomainLoadedPayload;
689
705
  [BusChannels.DomainFailed]: DomainFailedPayload;
690
706
  [BusChannels.ConfigHotReload]: ConfigChangePayload;
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Pure Git commit-message attribution.
3
+ *
4
+ * Callers supply sealed facts, never model prose. This module only translates
5
+ * those facts into role trailers and has no filesystem, process, Git, or
6
+ * settings dependencies, so every controlled commit seam shares one policy.
7
+ */
8
+
9
+ export const CLIO_COMMIT_IDENTITY = "Clio Coder <clio-coder@iowarp.ai>";
10
+
11
+ export const CLIO_COMMIT_TRAILERS = {
12
+ assisted: `Assisted-by: ${CLIO_COMMIT_IDENTITY}`,
13
+ tested: `Tested-by: ${CLIO_COMMIT_IDENTITY}`,
14
+ reviewed: `Reviewed-by: ${CLIO_COMMIT_IDENTITY}`,
15
+ coAuthored: `Co-authored-by: ${CLIO_COMMIT_IDENTITY}`,
16
+ } as const;
17
+
18
+ export interface CommitReceiptEvidence {
19
+ version: 15;
20
+ algorithm: "sha256";
21
+ digest: string;
22
+ /** The receipt was checked against its run-ledger envelope. */
23
+ integrityValid: boolean;
24
+ /** The receipt describes work or a verdict directly relevant to this commit. */
25
+ directlyRelevant: boolean;
26
+ }
27
+
28
+ /** Trusted facts about the work recorded by one commit. */
29
+ export interface CommitAttributionEvidence {
30
+ /** Clio materially created or edited work recorded by this commit. */
31
+ materiallyAssisted?: boolean;
32
+ /** A real validation command completed successfully against the committed work. */
33
+ validationSucceeded?: boolean;
34
+ /** An independent verifier or reviewer produced a passing result. */
35
+ independentReviewPassed?: boolean;
36
+ /** Clio materially authored part of the committed change. */
37
+ materiallyAuthored?: boolean;
38
+ /** Optional sealed receipt for a directly relevant fact above. */
39
+ receipt?: CommitReceiptEvidence;
40
+ }
41
+
42
+ const TRAILER_LINE = /^([A-Za-z0-9][A-Za-z0-9-]*):[ \t]+(.+)$/u;
43
+ const SHA256 = /^[0-9a-f]{64}$/u;
44
+
45
+ function normalizedTrailer(line: string): string | null {
46
+ const match = TRAILER_LINE.exec(line);
47
+ if (match === null) return null;
48
+ return `${match[1]?.toLowerCase()}:${match[2]
49
+ ?.trim()
50
+ .replace(/[ \t]+/gu, " ")
51
+ .toLowerCase()}`;
52
+ }
53
+
54
+ const KNOWN_CLIO_TRAILERS = new Set(
55
+ Object.values(CLIO_COMMIT_TRAILERS)
56
+ .map((line) => normalizedTrailer(line))
57
+ .filter((line): line is string => line !== null),
58
+ );
59
+
60
+ function isClioTrailer(key: string): boolean {
61
+ return KNOWN_CLIO_TRAILERS.has(key) || key.startsWith("clio-evidence:receipt-v15/sha256:");
62
+ }
63
+
64
+ /**
65
+ * Return the first line of a conventional trailing trailer paragraph.
66
+ * Human continuation lines are recognized as part of the block but never
67
+ * interpreted or rewritten; Clio's own trailers are always one line.
68
+ */
69
+ function trailerBlockStart(lines: ReadonlyArray<string>): number | null {
70
+ if (lines.length < 2) return null;
71
+ const separator = lines.lastIndexOf("");
72
+ const first = separator + 1;
73
+ // A trailer paragraph is separated from subject/body by a blank line. This
74
+ // keeps a subject such as "Fix: parser" a subject rather than metadata.
75
+ if (separator < 0 || first >= lines.length) return null;
76
+ let sawTrailer = false;
77
+ for (const line of lines.slice(first)) {
78
+ if (TRAILER_LINE.test(line)) {
79
+ sawTrailer = true;
80
+ continue;
81
+ }
82
+ if (sawTrailer && /^[ \t]+/u.test(line)) continue;
83
+ return null;
84
+ }
85
+ return sawTrailer ? first : null;
86
+ }
87
+
88
+ function receiptTrailer(receipt: CommitReceiptEvidence | undefined): string | null {
89
+ if (
90
+ receipt?.version !== 15 ||
91
+ receipt.algorithm !== "sha256" ||
92
+ receipt.integrityValid !== true ||
93
+ receipt.directlyRelevant !== true ||
94
+ !SHA256.test(receipt.digest)
95
+ ) {
96
+ return null;
97
+ }
98
+ return `Clio-Evidence: receipt-v15/sha256:${receipt.digest}`;
99
+ }
100
+
101
+ /**
102
+ * Append only evidence-justified Clio trailers.
103
+ *
104
+ * Disabled attribution is the one byte-preserving path. When enabled, CRLF and
105
+ * lone CR are normalized to LF, the message ends with one newline, existing
106
+ * subject/body and human trailers remain in order, repeated Clio trailers are
107
+ * removed case-insensitively, and processing the result again is idempotent.
108
+ */
109
+ export function attributeCommitMessage(
110
+ originalMessage: string,
111
+ evidence: Readonly<CommitAttributionEvidence>,
112
+ enabled = true,
113
+ ): string {
114
+ if (!enabled) return originalMessage;
115
+
116
+ const normalized = originalMessage.replace(/\r\n?/gu, "\n");
117
+ const lines = normalized.replace(/\n+$/u, "").split("\n");
118
+ const blockStart = trailerBlockStart(lines);
119
+ const seenClio = new Set<string>();
120
+ const retained = lines.filter((line, index) => {
121
+ if (blockStart === null || index < blockStart) return true;
122
+ const key = normalizedTrailer(line);
123
+ if (key === null || !isClioTrailer(key)) return true;
124
+ if (seenClio.has(key)) return false;
125
+ seenClio.add(key);
126
+ return true;
127
+ });
128
+
129
+ const desired: string[] = [];
130
+ // Material authorship necessarily means material assistance too. Keeping the
131
+ // two facts separate lets Co-authored-by remain a platform compatibility
132
+ // marker rather than a substitute for the semantic role trailer.
133
+ if (evidence.materiallyAssisted === true || evidence.materiallyAuthored === true) {
134
+ desired.push(CLIO_COMMIT_TRAILERS.assisted);
135
+ }
136
+ if (evidence.validationSucceeded === true) desired.push(CLIO_COMMIT_TRAILERS.tested);
137
+ if (evidence.independentReviewPassed === true) desired.push(CLIO_COMMIT_TRAILERS.reviewed);
138
+ if (evidence.materiallyAuthored === true) desired.push(CLIO_COMMIT_TRAILERS.coAuthored);
139
+ const receipt = receiptTrailer(evidence.receipt);
140
+ if (receipt !== null) desired.push(receipt);
141
+
142
+ const existing = new Set(
143
+ (blockStart === null ? [] : retained.slice(blockStart))
144
+ .map((line) => normalizedTrailer(line))
145
+ .filter((line): line is string => line !== null),
146
+ );
147
+ const additions = desired.filter((line) => !existing.has(normalizedTrailer(line) ?? ""));
148
+ if (additions.length === 0) return `${retained.join("\n")}\n`;
149
+
150
+ if (blockStart === null) {
151
+ while (retained.at(-1) === "") retained.pop();
152
+ retained.push("", ...additions);
153
+ } else {
154
+ retained.push(...additions);
155
+ }
156
+ return `${retained.join("\n")}\n`;
157
+ }
@@ -0,0 +1,159 @@
1
+ /**
2
+ * V8 compile cache for the dynamically imported command graphs.
3
+ *
4
+ * The interactive chunk graph alone is ~1,400 ES modules, and V8 compilation
5
+ * of it measures ~227 ms per cold boot (CPU profile, compileSourceTextModule).
6
+ * Node's module compile cache persists the bytecode across processes and cuts
7
+ * that to ~70 ms. The cache is a pure optimization: enableCompileCache() never
8
+ * throws, and a failure to enable it must never affect a command.
9
+ *
10
+ * Enable order matters twice over. In this process, only modules loaded after
11
+ * the call are cached, so the CLI calls this before its per-command dynamic
12
+ * import and after the --help/--version fast paths (which keep their
13
+ * no-filesystem-write contract). Enablement is further gated on Clio's cache
14
+ * root already existing, because read-only commands (`paths`, bare `doctor`)
15
+ * promise to write nothing to a home Clio never set up; a pristine home pays
16
+ * one uncached boot and every initialized install caches from then on. In
17
+ * spawned native workers, the entry's whole
18
+ * static graph resolves before any application code runs, so the only lever
19
+ * that reaches them in time is the NODE_COMPILE_CACHE environment variable;
20
+ * the dispatch spawn path injects it alongside {@link INJECTED_COMPILE_CACHE_ENV}.
21
+ *
22
+ * The injection is for Clio's own worker entry, not for the worker's
23
+ * descendants: bash tool commands, middleware hooks, and external runtime
24
+ * subprocesses all copy the worker's process.env, and without consumption
25
+ * every user-launched Node process would silently write bytecode into Clio's
26
+ * cache. The marker records that Clio, not the operator, put
27
+ * NODE_COMPILE_CACHE in this environment; the worker entry calls
28
+ * {@link deleteInjectedCompileCacheFrom} on its own process.env immediately
29
+ * after Node's bootstrap read it, so no child of any kind can inherit the
30
+ * pair. An operator-supplied NODE_COMPILE_CACHE never carries the marker and
31
+ * always passes through.
32
+ *
33
+ * Operator controls win everywhere: NODE_DISABLE_COMPILE_CACHE turns this off
34
+ * entirely, and an existing NODE_COMPILE_CACHE names the directory (Node reads
35
+ * it when enableCompileCache is called with no argument).
36
+ */
37
+
38
+ import { existsSync } from "node:fs";
39
+ import { enableCompileCache } from "node:module";
40
+ import { join } from "node:path";
41
+ import { resolveClioDirs } from "./xdg.js";
42
+
43
+ /**
44
+ * Marks a NODE_COMPILE_CACHE value Clio itself injected into a child env. Its
45
+ * value is the injected directory, which is what lets the scrub distinguish
46
+ * Clio's injection from a NODE_COMPILE_CACHE the operator set.
47
+ */
48
+ export const INJECTED_COMPILE_CACHE_ENV = "CLIO_CODER_INJECTED_COMPILE_CACHE";
49
+
50
+ export interface CompileCacheHandle {
51
+ /**
52
+ * Enable the compile cache for this process. The first call settles the
53
+ * outcome, directory or null, and every later call returns that settled
54
+ * value: a run that started disabled or failed must not enable itself on a
55
+ * retry with a different environment.
56
+ */
57
+ enable(env?: NodeJS.ProcessEnv): string | null;
58
+ /** The settled directory, or null while unattempted, disabled, or failed. */
59
+ directory(): string | null;
60
+ }
61
+
62
+ /**
63
+ * Testable factory. Production uses the module-level instance below bound to
64
+ * Node's real enableCompileCache and existsSync; tests inject stubs so they
65
+ * exercise the settle semantics without flipping the real process-global
66
+ * cache.
67
+ */
68
+ export function createCompileCache(
69
+ enableFn: typeof enableCompileCache = enableCompileCache,
70
+ rootExists: (dir: string) => boolean = existsSync,
71
+ ): CompileCacheHandle {
72
+ let settled: string | null | undefined;
73
+ return {
74
+ enable(env = process.env) {
75
+ if (settled !== undefined) return settled;
76
+ if (env.NODE_DISABLE_COMPILE_CACHE !== undefined) {
77
+ settled = null;
78
+ return settled;
79
+ }
80
+ try {
81
+ if (env.NODE_COMPILE_CACHE !== undefined) {
82
+ // Presence is the operator speaking, even as an empty string,
83
+ // matching the worker boundary's presence check. No argument:
84
+ // Node interprets the operator's NODE_COMPILE_CACHE itself, and
85
+ // Clio's default must not override it.
86
+ settled = enableFn().directory ?? null;
87
+ return settled;
88
+ }
89
+ // Enabling creates the directory, and diagnostic commands carry a
90
+ // read-only contract: `paths` and `doctor` without --fix must write
91
+ // nothing to a home Clio never set up. Clio's cache root existing is
92
+ // the proof this install was set up, so only then is a write inside
93
+ // it a cache write rather than a first write to a pristine home.
94
+ const root = resolveClioDirs().cache;
95
+ if (!rootExists(root)) {
96
+ settled = null;
97
+ return settled;
98
+ }
99
+ settled = enableFn(join(root, "v8-compile-cache")).directory ?? null;
100
+ } catch {
101
+ settled = null;
102
+ }
103
+ return settled;
104
+ },
105
+ directory: () => settled ?? null,
106
+ };
107
+ }
108
+
109
+ const processCompileCache = createCompileCache();
110
+
111
+ /**
112
+ * Enable the cache for this process; see {@link CompileCacheHandle.enable}.
113
+ * The boot entrypoints call it for their own module graphs, and the native
114
+ * worker spawn path calls it so children receive a NODE_COMPILE_CACHE they
115
+ * can act on before their module graph resolves.
116
+ */
117
+ export function enableClioCompileCache(env?: NodeJS.ProcessEnv): string | null {
118
+ return processCompileCache.enable(env);
119
+ }
120
+
121
+ /**
122
+ * The environment a native worker spawn should hand its child. A preexisting
123
+ * marker never survives: the marker is Clio's own plumbing, and letting one
124
+ * ride into a worker beside operator controls is how a stale or spoofed
125
+ * marker whose value happens to equal the operator's NODE_COMPILE_CACHE
126
+ * would later make the worker-entry scrub delete that operator setting for
127
+ * every descendant. When the operator named or disabled the cache, their
128
+ * controls pass through alone; otherwise, if this process enabled the cache,
129
+ * the bound pair is injected so the worker's module graph compiles from it.
130
+ */
131
+ export function workerCompileCacheEnvironment(env: NodeJS.ProcessEnv, directory: string | null): NodeJS.ProcessEnv {
132
+ const operatorControlled = env.NODE_COMPILE_CACHE !== undefined || env.NODE_DISABLE_COMPILE_CACHE !== undefined;
133
+ if (operatorControlled || directory === null) {
134
+ if (env[INJECTED_COMPILE_CACHE_ENV] === undefined) return env;
135
+ const cleaned = { ...env };
136
+ Reflect.deleteProperty(cleaned, INJECTED_COMPILE_CACHE_ENV);
137
+ return cleaned;
138
+ }
139
+ return { ...env, NODE_COMPILE_CACHE: directory, [INJECTED_COMPILE_CACHE_ENV]: directory };
140
+ }
141
+
142
+ /**
143
+ * Consume a Clio-injected compile-cache pair from an env, in place. The
144
+ * marker carries the injected directory as its value, and NODE_COMPILE_CACHE
145
+ * is deleted only when it still equals that value: a stale or spoofed marker
146
+ * sitting next to some other NODE_COMPILE_CACHE removes only itself. The one
147
+ * production caller is the worker entry, on its own process.env, immediately
148
+ * after Node's bootstrap read the pair; by construction that pair came from
149
+ * {@link workerCompileCacheEnvironment}, which never lets a marker travel
150
+ * beside operator controls.
151
+ */
152
+ export function deleteInjectedCompileCacheFrom(env: NodeJS.ProcessEnv): void {
153
+ const injected = env[INJECTED_COMPILE_CACHE_ENV];
154
+ if (injected === undefined) return;
155
+ if (env.NODE_COMPILE_CACHE === injected) {
156
+ Reflect.deleteProperty(env, "NODE_COMPILE_CACHE");
157
+ }
158
+ Reflect.deleteProperty(env, INJECTED_COMPILE_CACHE_ENV);
159
+ }