@iowarp/clio-coder 0.3.1 → 0.3.2

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 (595) hide show
  1. package/CHANGELOG.md +90 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.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-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/chunk-2VTFPG5O.js +48 -0
  12. package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4KLWL3UC.js +18 -0
  16. package/dist/chunk-4VP4KH3K.js +962 -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-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  21. package/dist/chunk-65DEGPJ6.js +52 -0
  22. package/dist/chunk-6EJMN2Y3.js +17 -0
  23. package/dist/chunk-6EJV5X2W.js +16405 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6XLNIQDB.js +27 -0
  26. package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
  29. package/dist/chunk-7MNJORFF.js +22 -0
  30. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  31. package/dist/chunk-AGYYIBLL.js +1069 -0
  32. package/dist/chunk-AO4RKG4M.js +277 -0
  33. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  34. package/dist/chunk-ARBGF5F7.js +174 -0
  35. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  36. package/dist/chunk-CBCAPZAA.js +229 -0
  37. package/dist/chunk-CMZWFGD2.js +352 -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-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
  42. package/dist/chunk-FCSXB6T2.js +338 -0
  43. package/dist/chunk-FJ3H4MN5.js +48 -0
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G2DE3C7R.js +644 -0
  46. package/dist/chunk-G4BMMOKF.js +182 -0
  47. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  48. package/dist/chunk-HC4CLZ2Y.js +68 -0
  49. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  50. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  51. package/dist/chunk-I4HZDVNP.js +73 -0
  52. package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
  53. package/dist/chunk-IKCO5N3L.js +162 -0
  54. package/dist/chunk-IR4CFBFN.js +56 -0
  55. package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
  56. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  57. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  58. package/dist/chunk-KJ5LWLOE.js +1077 -0
  59. package/dist/chunk-LBMZMYH2.js +285 -0
  60. package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
  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-MAW544W2.js +1882 -0
  64. package/dist/chunk-MBS4V7ZP.js +217 -0
  65. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  66. package/dist/chunk-MNA4JGU4.js +255 -0
  67. package/dist/chunk-MQSRRFWA.js +3428 -0
  68. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  69. package/dist/chunk-OAO4GE4M.js +619 -0
  70. package/dist/chunk-OHHN2SO4.js +5135 -0
  71. package/dist/chunk-OKGUZO2U.js +34 -0
  72. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  73. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  74. package/dist/chunk-OQE5J4C6.js +73 -0
  75. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  76. package/dist/chunk-POHLU5DW.js +1186 -0
  77. package/dist/chunk-QKMUKYO7.js +4961 -0
  78. package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
  79. package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
  80. package/dist/chunk-SST6Z5JA.js +80 -0
  81. package/dist/chunk-STBPMHSX.js +2456 -0
  82. package/dist/chunk-T6YILFSB.js +80 -0
  83. package/dist/chunk-TZTZS7QK.js +227 -0
  84. package/dist/chunk-UOV2BYIW.js +107 -0
  85. package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
  86. package/dist/chunk-VAKQQHWR.js +434 -0
  87. package/dist/chunk-VG7TBQIY.js +128 -0
  88. package/dist/chunk-VJWL6YS5.js +244 -0
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-WMSVI4G2.js +2095 -0
  91. package/dist/chunk-WVO7V2QY.js +797 -0
  92. package/dist/chunk-X4RCMKVQ.js +641 -0
  93. package/dist/chunk-X75S7HFS.js +374 -0
  94. package/dist/chunk-XN3L4EYL.js +46 -0
  95. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  96. package/dist/chunk-YHZX5GEU.js +193 -0
  97. package/dist/chunk-YXLYO42X.js +91 -0
  98. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  99. package/dist/chunk-ZI647VB5.js +37 -0
  100. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-4LY5K2AC.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-GTLUW2PR.js} +92 -55
  108. package/dist/configure-R6A64DHX.js +42 -0
  109. package/dist/context-5VKGUVJJ.js +866 -0
  110. package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
  111. package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
  126. package/dist/monitor-MEQA5C3I.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
  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-IV4Q6RLN.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
  137. package/dist/terminal-lease-IT5JW2NR.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-7TT7SQ3G.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
  143. package/dist/verify-G6V4D2G7.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.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 +362 -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 +42 -6
  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 +173 -47
  444. package/src/interactive/chat-renderer.ts +262 -72
  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 +228 -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 +20 -2
  456. package/src/interactive/footer-panel.ts +2 -2
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +201 -17
  459. package/src/interactive/interactive-event-projection.ts +6 -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 +176 -114
  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/decisions.ts +300 -0
  474. package/src/interactive/overlays/help-reference.ts +15 -10
  475. package/src/interactive/overlays/model-selector.ts +34 -16
  476. package/src/interactive/overlays/session-selector.ts +18 -0
  477. package/src/interactive/overlays/settings.ts +105 -17
  478. package/src/interactive/overlays/skills-hub.ts +4 -4
  479. package/src/interactive/overlays/tree-selector.ts +41 -6
  480. package/src/interactive/render-trace.ts +499 -90
  481. package/src/interactive/renderers/compaction-summary.ts +2 -2
  482. package/src/interactive/renderers/diff.ts +115 -104
  483. package/src/interactive/renderers/mermaid.ts +53 -0
  484. package/src/interactive/renderers/tool-execution.ts +386 -133
  485. package/src/interactive/renderers/worker-entry.ts +20 -4
  486. package/src/interactive/session-switch-settlement.ts +10 -0
  487. package/src/interactive/slash-autocomplete.ts +6 -114
  488. package/src/interactive/slash-commands.ts +135 -47
  489. package/src/interactive/slash-spec.ts +9 -38
  490. package/src/interactive/status/controller.ts +5 -1
  491. package/src/interactive/stdout-backpressure.ts +99 -0
  492. package/src/interactive/stream-pacer.ts +530 -0
  493. package/src/interactive/stream-pacing-policy.ts +66 -0
  494. package/src/interactive/tasks-overlay.ts +368 -14
  495. package/src/interactive/terminal-lease.ts +485 -0
  496. package/src/interactive/theme/tokens.ts +1 -1
  497. package/src/interactive/turn-context.ts +4 -3
  498. package/src/interactive/turn-persistence.ts +30 -13
  499. package/src/interactive/turn-queues.ts +12 -0
  500. package/src/interactive/turn-recovery.ts +25 -8
  501. package/src/interactive/turn-runtime.ts +79 -12
  502. package/src/interactive/turn-state.ts +10 -0
  503. package/src/interactive/view/artifacts.ts +114 -4
  504. package/src/interactive/view/view-overlay.ts +3 -0
  505. package/src/interactive/welcome-dashboard.ts +17 -16
  506. package/src/interactive/worker-receipts.ts +52 -3
  507. package/src/interactive/worker-stream.ts +5 -1
  508. package/src/tools/agent-tools.ts +23 -3
  509. package/src/tools/artifact.ts +2 -2
  510. package/src/tools/ask-user.ts +23 -13
  511. package/src/tools/bash.ts +30 -2
  512. package/src/tools/bootstrap.ts +34 -431
  513. package/src/tools/builtin-tool-catalog.ts +265 -0
  514. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  515. package/src/tools/codewiki/code-nav.ts +8 -22
  516. package/src/tools/codewiki/shared.ts +41 -38
  517. package/src/tools/context/docs-engine.ts +14 -3
  518. package/src/tools/context/index.ts +107 -28
  519. package/src/tools/context/surface.ts +19 -0
  520. package/src/tools/core-bootstrap.ts +168 -0
  521. package/src/tools/credential-present.ts +5 -5
  522. package/src/tools/dispatch-admission.ts +533 -0
  523. package/src/tools/dispatch-background.ts +54 -0
  524. package/src/tools/dispatch-event-text.ts +6 -0
  525. package/src/tools/dispatch-plan.ts +9 -4
  526. package/src/tools/dispatch-run-events.ts +238 -0
  527. package/src/tools/dispatch-runner.ts +2370 -0
  528. package/src/tools/dispatch-scout-admission.ts +295 -0
  529. package/src/tools/dispatch-types.ts +77 -0
  530. package/src/tools/dispatch.ts +67 -3161
  531. package/src/tools/find.ts +4 -2
  532. package/src/tools/grep.ts +2 -2
  533. package/src/tools/lazy-tool.ts +60 -0
  534. package/src/tools/ledger.ts +3 -3
  535. package/src/tools/monitor-surface.ts +36 -0
  536. package/src/tools/monitor.ts +2 -32
  537. package/src/tools/observers.ts +2 -2
  538. package/src/tools/registry.ts +39 -27
  539. package/src/tools/safe-exec.ts +2 -2
  540. package/src/tools/steer-surface.ts +17 -0
  541. package/src/tools/steer.ts +2 -13
  542. package/src/tools/tasks.ts +108 -11
  543. package/src/tools/truncate.ts +25 -184
  544. package/src/tools/verify/frontend.ts +3 -1
  545. package/src/tools/verify/index.ts +3 -38
  546. package/src/tools/verify/surface.ts +46 -0
  547. package/src/tools/web-fetch-surface.ts +23 -0
  548. package/src/tools/web-fetch.ts +2 -20
  549. package/src/tools/write.ts +7 -2
  550. package/src/worker/entry.ts +39 -2
  551. package/src/worker/spec-contract.ts +26 -5
  552. package/dist/chunk-7SS2CTV2.js +0 -61361
  553. package/dist/chunk-DKGKUHFA.js +0 -924
  554. package/dist/chunk-GEP36Y4X.js +0 -12796
  555. package/dist/chunk-XYWBQRDM.js +0 -137
  556. package/dist/clio-BZVGEUFJ.js +0 -58
  557. package/dist/configure-S7S6F6CL.js +0 -32
  558. package/docs/html/agents_blueprint.html +0 -936
  559. package/docs/html/alcf_blueprint.html +0 -324
  560. package/docs/html/architecture_blueprint.html +0 -850
  561. package/docs/html/commands_blueprint.html +0 -939
  562. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  563. package/docs/html/configuration_blueprint.html +0 -1080
  564. package/docs/html/context_blueprint.html +0 -603
  565. package/docs/html/documentation_blueprint.html +0 -832
  566. package/docs/html/environment_blueprint.html +0 -404
  567. package/docs/html/eval_blueprint.html +0 -743
  568. package/docs/html/evals_internal_blueprint.html +0 -190
  569. package/docs/html/evolution_blueprint.html +0 -674
  570. package/docs/html/extensions_blueprint.html +0 -2065
  571. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  572. package/docs/html/index.html +0 -919
  573. package/docs/html/lifecycle_blueprint.html +0 -723
  574. package/docs/html/memory_blueprint.html +0 -699
  575. package/docs/html/middleware_blueprint.html +0 -664
  576. package/docs/html/models_blueprint.html +0 -2366
  577. package/docs/html/observability_blueprint.html +0 -683
  578. package/docs/html/provider_adapter_blueprint.html +0 -245
  579. package/docs/html/safety_blueprint.html +0 -1386
  580. package/docs/html/shared.css +0 -571
  581. package/docs/html/shared.js +0 -143
  582. package/docs/html/skills_blueprint.html +0 -671
  583. package/docs/html/soak_blueprint.html +0 -182
  584. package/docs/html/tool_usage_blueprint.html +0 -350
  585. package/docs/html/tools_blueprint.html +0 -2249
  586. package/docs/html/trace_blueprint.html +0 -235
  587. package/docs/html/tui_design_blueprint.html +0 -374
  588. package/docs/html/validation_blueprint.html +0 -961
  589. package/docs/html/worker_dispatch_blueprint.html +0 -231
  590. package/src/core/release.ts +0 -2
  591. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  592. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  593. package/src/engine/apis/lmstudio-native.ts +0 -1438
  594. package/src/engine/apis/thinking-replay.ts +0 -11
  595. package/src/tools/string-enum.ts +0 -15
@@ -0,0 +1,485 @@
1
+ /**
2
+ * Single-owner Stage 0 -> Stage 1 terminal transaction.
3
+ *
4
+ * This module is deliberately a leaf of the interactive graph. It constructs
5
+ * the one terminal, renderer, root host, editor, input listener, and SIGINT
6
+ * listener used for the entire interactive process. Hydration swaps delegates
7
+ * and the root host synchronously; it never starts a second terminal or copies
8
+ * editor text into a replacement editor.
9
+ */
10
+
11
+ import type { ClioSettings } from "../core/config.js";
12
+ import { getTerminationCoordinator } from "../core/termination.js";
13
+ import { type Component, Container, matchesKey, ScrollView, Text, type TUI, VStack } from "../engine/tui.js";
14
+ import { ClioEditor, type EditorChrome } from "./clio-editor.js";
15
+ import { createProcessInteractiveShell } from "./interactive-shell.js";
16
+ import { type ClioKeybindingManager, createKeybindingManager } from "./keybinding-manager.js";
17
+ import { clioTheme, GLYPH } from "./theme/index.js";
18
+
19
+ export const INSTANT_SHELL_ENV = "CLIO_CODER_INSTANT_SHELL";
20
+ const DOUBLE_TAP_MS = 500;
21
+ const DIAGNOSTIC_LIMIT_BYTES = 64 * 1024;
22
+
23
+ export type TerminalLeaseState = "created" | "mounted" | "adopting" | "adopted" | "closing" | "closed";
24
+
25
+ export interface BootSubmission {
26
+ readonly sequence: number;
27
+ readonly rawText: string;
28
+ readonly submittedAt: number;
29
+ }
30
+
31
+ export interface BootDiagnostic {
32
+ readonly stream: "stdout" | "stderr";
33
+ readonly text: string;
34
+ }
35
+
36
+ export type TuiInputDelegate = (data: string) => { consume?: boolean; data?: string } | undefined;
37
+
38
+ export interface TerminalLeaseSignalCoordinator {
39
+ takeInterruptOwnership(): () => void;
40
+ on(signal: "SIGINT", listener: () => void): void;
41
+ off(signal: "SIGINT", listener: () => void): void;
42
+ }
43
+
44
+ export interface TerminalLeaseAdoption {
45
+ root: Component;
46
+ editorChrome: EditorChrome;
47
+ admitSubmission: (submission: BootSubmission) => Promise<void>;
48
+ onHydratedFrame?: (frameId: number | null) => void;
49
+ }
50
+
51
+ export interface TerminalLease {
52
+ readonly shell: ReturnType<typeof createProcessInteractiveShell>;
53
+ readonly terminal: ReturnType<typeof createProcessInteractiveShell>["terminal"];
54
+ readonly tui: TUI;
55
+ readonly editor: ClioEditor;
56
+ readonly keybindings: ClioKeybindingManager;
57
+ readonly pending: Component;
58
+ readonly state: TerminalLeaseState;
59
+ readonly epoch: number;
60
+ readonly abortSignal: AbortSignal;
61
+ writeDiagnostic(stream: "stdout" | "stderr", text: string): void;
62
+ /** Trace-only output held until after terminal restoration. */
63
+ deferDiagnostic(stream: "stdout" | "stderr", text: string): void;
64
+ takeDiagnostics(): BootDiagnostic[];
65
+ registerApplicationInput(delegate: TuiInputDelegate): () => void;
66
+ readonly applicationSignals: TerminalLeaseSignalCoordinator;
67
+ adopt(adoption: TerminalLeaseAdoption): boolean;
68
+ close(options?: { recoverInput?: boolean }): Promise<void>;
69
+ fail(): Promise<void>;
70
+ }
71
+
72
+ export interface CreateProcessTerminalLeaseOptions {
73
+ settings: Readonly<ClioSettings>;
74
+ onStage0Commit?: (frameId: number) => void;
75
+ shutdown?: (code: number) => void | Promise<void>;
76
+ /** Narrow construction seams used by deterministic ownership contracts. */
77
+ testing?: {
78
+ shell?: ReturnType<typeof createProcessInteractiveShell>;
79
+ termination?: {
80
+ installSignalHandlers(): void;
81
+ releaseInterruptOwnership(): () => void;
82
+ onDrain(hook: () => void | Promise<void>): void;
83
+ shutdown(code: number): Promise<void>;
84
+ };
85
+ signals?: Pick<NodeJS.Process, "on" | "off">;
86
+ write?: (stream: "stdout" | "stderr", text: string) => void;
87
+ now?: () => number;
88
+ };
89
+ }
90
+
91
+ /** `0` is the immediate rollback. Unset and `1` enable the accepted default. */
92
+ export function instantShellEnabled(env: Readonly<Record<string, string | undefined>> = process.env): boolean {
93
+ return env[INSTANT_SHELL_ENV] !== "0";
94
+ }
95
+
96
+ class RootHost extends VStack {
97
+ constructor(current: Component) {
98
+ super();
99
+ this.replace(current);
100
+ }
101
+
102
+ replace(next: Component): void {
103
+ this.clear();
104
+ this.addChild(next, { grow: 1, shrink: 1, minSize: 1 });
105
+ }
106
+ }
107
+
108
+ class BootSubmissionPanel implements Component {
109
+ private records: BootSubmission[] = [];
110
+
111
+ set(records: ReadonlyArray<BootSubmission>): void {
112
+ this.records = [...records];
113
+ }
114
+
115
+ render(width: number): string[] {
116
+ if (this.records.length === 0) return [];
117
+ const theme = clioTheme();
118
+ return this.records.map((record) => {
119
+ const oneLine = record.rawText.replace(/\s+/gu, " ").trim();
120
+ const room = Math.max(0, width - 11);
121
+ const preview = oneLine.length > room ? `${oneLine.slice(0, Math.max(0, room - 1))}…` : oneLine;
122
+ return `${theme.fg("action", `${GLYPH.queued} queued`)} ${theme.fg("muted", preview)}`;
123
+ });
124
+ }
125
+
126
+ invalidate(): void {}
127
+ }
128
+
129
+ function stageZeroRoot(
130
+ mode: Readonly<ClioSettings>["terminal"]["tuiMode"],
131
+ editor: ClioEditor,
132
+ pending: Component,
133
+ shutdownArmed: () => boolean,
134
+ ): Component {
135
+ const theme = clioTheme();
136
+ const heading = new Text(
137
+ `${theme.style("title", ">C_ Clio Coder", { bold: true })}\n${theme.fg("muted", "Hydrating session services…")}`,
138
+ 0,
139
+ 0,
140
+ );
141
+ const footer: Component = {
142
+ render: () => [
143
+ shutdownArmed()
144
+ ? theme.fg("warning", "Ctrl+C again to exit · typed input will be recovered")
145
+ : theme.fg("dim", "Warming up · typing and submit are ready"),
146
+ ],
147
+ invalidate: () => {},
148
+ };
149
+ if (mode === "fullscreen") {
150
+ const document = new Container();
151
+ document.addChild(heading);
152
+ const transcript = new ScrollView(document, { follow: "end", primary: true, overscroll: "chain" });
153
+ const dock = new VStack();
154
+ dock.addChild(pending, { shrink: 1, minSize: 0 });
155
+ dock.addChild(editor, { shrink: 1, minSize: 3 });
156
+ dock.addChild(footer, { shrink: 1, minSize: 1 });
157
+ const root = new VStack();
158
+ root.addChild(transcript, { basis: 0, grow: 1, shrink: 1, minSize: 1 });
159
+ root.addChild(dock, { basis: "auto", grow: 0, shrink: 1, minSize: 1 });
160
+ return root;
161
+ }
162
+ const root = new Container();
163
+ root.addChild(heading);
164
+ root.addChild(pending);
165
+ root.addChild(editor);
166
+ root.addChild(footer);
167
+ return root;
168
+ }
169
+
170
+ function recoveryText(records: ReadonlyArray<BootSubmission>, draft: string): string | null {
171
+ if (records.length === 0 && draft.length === 0) return null;
172
+ const sections = records.map((record) => `[queued ${record.sequence}] ${record.rawText}`);
173
+ if (draft.length > 0) sections.push(`[draft] ${draft}`);
174
+ return `Clio Coder recovered input from an interrupted boot; copy and resubmit after restart:\n${sections.join("\n")}`;
175
+ }
176
+
177
+ export function createProcessTerminalLease(options: CreateProcessTerminalLeaseOptions): TerminalLease {
178
+ const settings = options.settings;
179
+ const keybindings = createKeybindingManager(settings);
180
+ let editorChrome: EditorChrome = {
181
+ getModelLabel: () =>
182
+ [settings.orchestrator.target, settings.orchestrator.model].filter((part) => part && part.length > 0).join("·") ||
183
+ "starting",
184
+ getThinkingLabel: () => settings.orchestrator.thinkingLevel ?? "off",
185
+ getSubmitKeyLabel: () => keybindings.getKeys("tui.input.submit")[0] ?? "Enter",
186
+ getNewlineKeyLabel: () => keybindings.getKeys("tui.input.newLine")[0] ?? "Shift+Enter",
187
+ };
188
+ const editorChromeProxy: EditorChrome = {
189
+ getModelLabel: () => editorChrome.getModelLabel(),
190
+ getThinkingLabel: () => editorChrome.getThinkingLabel(),
191
+ isStreaming: () => editorChrome.isStreaming?.() ?? false,
192
+ willEnterSteer: (text) => editorChrome.willEnterSteer?.(text) ?? false,
193
+ getSubmitKeyLabel: () => editorChrome.getSubmitKeyLabel?.() ?? "Enter",
194
+ getNewlineKeyLabel: () => editorChrome.getNewlineKeyLabel?.() ?? "Shift+Enter",
195
+ };
196
+ const shell =
197
+ options.testing?.shell ??
198
+ createProcessInteractiveShell({
199
+ tuiMode: settings.terminal.tuiMode,
200
+ ...(options.onStage0Commit ? { onFirstFrameCommit: options.onStage0Commit } : {}),
201
+ });
202
+ const tui = shell.tui as TUI;
203
+ const editor = new ClioEditor(tui, editorChromeProxy);
204
+ editor.focused = true;
205
+ const pendingPanel = new BootSubmissionPanel();
206
+ let shutdownArmed = false;
207
+ const stage0 = stageZeroRoot(settings.terminal.tuiMode, editor, pendingPanel, () => shutdownArmed);
208
+ const host = new RootHost(stage0);
209
+
210
+ let state: TerminalLeaseState = "created";
211
+ let epoch = 0;
212
+ const bootAbort = new AbortController();
213
+ let sequence = 0;
214
+ const submissions: BootSubmission[] = [];
215
+ const diagnostics: BootDiagnostic[] = [];
216
+ const deferredDiagnostics: BootDiagnostic[] = [];
217
+ let diagnosticBytes = 0;
218
+ let deferredDiagnosticBytes = 0;
219
+ let diagnosticsTruncated = false;
220
+ let deferredDiagnosticsTruncated = false;
221
+ let inputDelegate: TuiInputDelegate;
222
+ let applicationInput: TuiInputDelegate | null = null;
223
+ let applicationSignal: (() => void) | null = null;
224
+ let lastCtrlCAt = 0;
225
+ let closePromise: Promise<void> | null = null;
226
+ let inputDisposed = false;
227
+ let signalDisposed = false;
228
+
229
+ const termination = options.testing?.termination ?? getTerminationCoordinator();
230
+ const signals = options.testing?.signals ?? process;
231
+ const now = options.testing?.now ?? Date.now;
232
+ const write =
233
+ options.testing?.write ??
234
+ ((stream: "stdout" | "stderr", text: string): void => {
235
+ (stream === "stdout" ? process.stdout : process.stderr).write(text);
236
+ });
237
+ termination.installSignalHandlers();
238
+ const restoreInterruptOwner = termination.releaseInterruptOwnership();
239
+
240
+ const requestShutdown = (): void => {
241
+ void (async () => {
242
+ let cleanupError: unknown;
243
+ try {
244
+ await lease.close({ recoverInput: state !== "adopted" });
245
+ } catch (error) {
246
+ cleanupError = error;
247
+ }
248
+ if (options.shutdown) await options.shutdown(0);
249
+ else await termination.shutdown(0);
250
+ if (cleanupError) throw cleanupError;
251
+ })().catch((error) => {
252
+ try {
253
+ write(
254
+ "stderr",
255
+ `Clio Coder: terminal shutdown failed: ${error instanceof Error ? error.message : String(error)}\n`,
256
+ );
257
+ } catch {
258
+ // Every restoration path was already attempted; there is no safer sink.
259
+ }
260
+ });
261
+ };
262
+
263
+ const handleStage0CtrlC = (): void => {
264
+ const text = editor.getText();
265
+ if (text.length > 0) {
266
+ editor.setText("");
267
+ shutdownArmed = false;
268
+ lastCtrlCAt = 0;
269
+ tui.requestRender();
270
+ return;
271
+ }
272
+ const pressedAt = now();
273
+ if (lastCtrlCAt > 0 && pressedAt - lastCtrlCAt <= DOUBLE_TAP_MS) {
274
+ lastCtrlCAt = 0;
275
+ requestShutdown();
276
+ return;
277
+ }
278
+ lastCtrlCAt = pressedAt;
279
+ shutdownArmed = true;
280
+ tui.requestRender();
281
+ };
282
+
283
+ inputDelegate = (data) => {
284
+ if (matchesKey(data, "ctrl+c")) {
285
+ handleStage0CtrlC();
286
+ return { consume: true };
287
+ }
288
+ if (keybindings.matches(data, "clio.exit") && editor.getText().length === 0) {
289
+ requestShutdown();
290
+ return { consume: true };
291
+ }
292
+ return undefined;
293
+ };
294
+
295
+ editor.onSubmit = (rawText) => {
296
+ const record = Object.freeze({ sequence: ++sequence, rawText, submittedAt: performance.now() });
297
+ submissions.push(record);
298
+ pendingPanel.set(submissions);
299
+ tui.requestRender();
300
+ };
301
+
302
+ const stableInput = (data: string) => inputDelegate(data);
303
+ const removeStableInput = tui.addInputListener(stableInput);
304
+ const stableSignal = (): void => {
305
+ if (applicationSignal) applicationSignal();
306
+ else handleStage0CtrlC();
307
+ };
308
+ signals.on("SIGINT", stableSignal);
309
+
310
+ const disposeStableOwners = (): void => {
311
+ if (!inputDisposed) {
312
+ inputDisposed = true;
313
+ removeStableInput();
314
+ }
315
+ if (!signalDisposed) {
316
+ signalDisposed = true;
317
+ signals.off("SIGINT", stableSignal);
318
+ restoreInterruptOwner();
319
+ }
320
+ };
321
+
322
+ const flushDiagnostics = (): void => {
323
+ for (const diagnostic of [...diagnostics.splice(0), ...deferredDiagnostics.splice(0)]) {
324
+ write(diagnostic.stream, diagnostic.text);
325
+ }
326
+ };
327
+ const enqueueDiagnostic = (stream: "stdout" | "stderr", text: string, deferred: boolean): void => {
328
+ const target = deferred ? deferredDiagnostics : diagnostics;
329
+ const bytes = Buffer.byteLength(text, "utf8");
330
+ const used = deferred ? deferredDiagnosticBytes : diagnosticBytes;
331
+ if (used + bytes <= DIAGNOSTIC_LIMIT_BYTES) {
332
+ target.push(Object.freeze({ stream, text }));
333
+ if (deferred) deferredDiagnosticBytes += bytes;
334
+ else diagnosticBytes += bytes;
335
+ return;
336
+ }
337
+ const alreadyTruncated = deferred ? deferredDiagnosticsTruncated : diagnosticsTruncated;
338
+ if (alreadyTruncated) return;
339
+ if (deferred) deferredDiagnosticsTruncated = true;
340
+ else diagnosticsTruncated = true;
341
+ target.push({ stream: "stderr", text: "Clio Coder: additional boot diagnostics were truncated.\n" });
342
+ };
343
+
344
+ const lease: TerminalLease = {
345
+ shell,
346
+ terminal: shell.terminal,
347
+ tui,
348
+ editor,
349
+ keybindings,
350
+ pending: pendingPanel,
351
+ get state() {
352
+ return state;
353
+ },
354
+ get epoch() {
355
+ return epoch;
356
+ },
357
+ get abortSignal() {
358
+ return bootAbort.signal;
359
+ },
360
+ writeDiagnostic(stream, text): void {
361
+ if (state === "closed") {
362
+ write(stream, text);
363
+ return;
364
+ }
365
+ enqueueDiagnostic(stream, text, false);
366
+ },
367
+ deferDiagnostic(stream, text): void {
368
+ if (state === "closed") {
369
+ write(stream, text);
370
+ return;
371
+ }
372
+ enqueueDiagnostic(stream, text, true);
373
+ },
374
+ takeDiagnostics(): BootDiagnostic[] {
375
+ const taken = diagnostics.splice(0);
376
+ diagnosticBytes = 0;
377
+ return taken;
378
+ },
379
+ registerApplicationInput(delegate): () => void {
380
+ applicationInput = delegate;
381
+ return () => {
382
+ if (applicationInput === delegate) applicationInput = null;
383
+ };
384
+ },
385
+ applicationSignals: {
386
+ takeInterruptOwnership: () => () => {},
387
+ on: (_signal, listener) => {
388
+ applicationSignal = listener;
389
+ },
390
+ off: (_signal, listener) => {
391
+ if (applicationSignal === listener) applicationSignal = null;
392
+ },
393
+ },
394
+ adopt(adoption): boolean {
395
+ if (state !== "mounted" || bootAbort.signal.aborted || !applicationInput) return false;
396
+ state = "adopting";
397
+ const adoptedEpoch = epoch;
398
+ // No await is permitted in this transaction: editor callbacks, root,
399
+ // input, and SIGINT become Stage 1 as one JavaScript turn.
400
+ editorChrome = adoption.editorChrome;
401
+ inputDelegate = applicationInput;
402
+ host.replace(adoption.root);
403
+ tui.setFocus(editor);
404
+ state = "adopted";
405
+ const hydratedFrame = shell.nextCommittedFrame();
406
+ tui.requestRender();
407
+ void hydratedFrame.then((frameId) => {
408
+ if (epoch === adoptedEpoch && state === "adopted") adoption.onHydratedFrame?.(frameId);
409
+ });
410
+ void (async () => {
411
+ for (const record of [...submissions]) {
412
+ if (epoch !== adoptedEpoch || state !== "adopted") return;
413
+ await adoption.admitSubmission(record);
414
+ if (epoch !== adoptedEpoch || state !== "adopted") return;
415
+ const index = submissions.findIndex((entry) => entry.sequence === record.sequence);
416
+ if (index >= 0) submissions.splice(index, 1);
417
+ pendingPanel.set(submissions);
418
+ tui.requestRender();
419
+ }
420
+ })().catch((error) => {
421
+ if (bootAbort.signal.aborted) return;
422
+ lease.writeDiagnostic(
423
+ "stderr",
424
+ `Clio Coder: queued boot submission failed: ${error instanceof Error ? error.message : String(error)}\n`,
425
+ );
426
+ });
427
+ return true;
428
+ },
429
+ close(closeOptions = {}): Promise<void> {
430
+ if (closePromise) return closePromise;
431
+ state = "closing";
432
+ epoch += 1;
433
+ closePromise = (async () => {
434
+ const errors: unknown[] = [];
435
+ const attempt = (operation: () => void): void => {
436
+ try {
437
+ operation();
438
+ } catch (error) {
439
+ errors.push(error);
440
+ }
441
+ };
442
+ try {
443
+ attempt(() => bootAbort.abort());
444
+ attempt(() => disposeStableOwners());
445
+ attempt(() => shell.releaseAnchor());
446
+ attempt(() => shell.stop());
447
+ try {
448
+ await shell.settle();
449
+ } catch (error) {
450
+ errors.push(error);
451
+ }
452
+ attempt(() => flushDiagnostics());
453
+ if (closeOptions.recoverInput || submissions.length > 0 || editor.getText().length > 0) {
454
+ attempt(() => {
455
+ const recovered = recoveryText(submissions, editor.getText());
456
+ if (recovered) write("stderr", `${recovered}\n`);
457
+ });
458
+ }
459
+ } finally {
460
+ state = "closed";
461
+ }
462
+ if (errors.length > 0) throw new AggregateError(errors, "terminal lease cleanup failed");
463
+ })();
464
+ return closePromise;
465
+ },
466
+ fail(): Promise<void> {
467
+ return lease.close({ recoverInput: true });
468
+ },
469
+ };
470
+
471
+ termination.onDrain(() => lease.close({ recoverInput: state !== "adopted" }));
472
+ try {
473
+ shell.mount(host, editor);
474
+ state = "mounted";
475
+ // TuiBase.start() schedules its initial frame. The orchestrator import that
476
+ // follows is synchronous module evaluation and would starve that callback,
477
+ // turning Stage 0 into a label on the eventual Stage 1 paint. Commit the
478
+ // shell now so the terminal write actually precedes heavyweight hydration.
479
+ tui.renderNow(false);
480
+ } catch (error) {
481
+ void lease.close({ recoverInput: true }).catch(() => {});
482
+ throw error;
483
+ }
484
+ return lease;
485
+ }
@@ -116,6 +116,6 @@ export function createClioTheme(options: { truecolor?: boolean; color?: boolean
116
116
  fg: (token, text) => paint(text, { fg: token }),
117
117
  bg: (token, text) => paint(text, { bg: token }),
118
118
  style: (token, text, mods = {}) => paint(text, { ...mods, fg: token }),
119
- fgSequence: (token) => (color ? fgSequence(token, truecolor) : ""),
119
+ fgSequence: (token) => (color ? `\u001b[${fgCode(TOKENS[token], truecolor)}m` : ""),
120
120
  };
121
121
  }
@@ -2,7 +2,7 @@
2
2
  * Turn context ownership: the session-prompt compile cache, context-snapshot
3
3
  * accounting, prompt-cache honesty, and compaction. `runAutoCompact` is the
4
4
  * one compaction entry point; the pre-submit trigger, the preflight overflow
5
- * guard, overflow recovery, `/compact`, and the post-tool continuation guard
5
+ * guard, overflow recovery, `/context compact`, and the post-tool continuation guard
6
6
  * all flow through it.
7
7
  */
8
8
 
@@ -345,7 +345,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
345
345
  * compaction summary entry, then replay from the session view.
346
346
  *
347
347
  * `force = true` skips the pressure check and the mask pre-stage and runs
348
- * the LLM summary directly. Used for `/compact`, CLIO_CODER_FORCE_COMPACT=1,
348
+ * the LLM summary directly. Used for `/context compact`, CLIO_CODER_FORCE_COMPACT=1,
349
349
  * and overflow recovery.
350
350
  */
351
351
  const runAutoCompact = async (
@@ -692,7 +692,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
692
692
  const after = liveContextEstimate(agentRuntime);
693
693
  if (after.tokens >= after.contextWindow) {
694
694
  throw new Error(
695
- `[Clio Coder] post-tool context guard stopped continuation before provider call: estimated ${after.tokens} tokens exceeds reported context window ${after.contextWindow}. Use /compact, narrower reads, or a follow-up turn with smaller observations.`,
695
+ `[Clio Coder] post-tool context guard stopped continuation before provider call: estimated ${after.tokens} tokens exceeds reported context window ${after.contextWindow}. Use /context compact, narrower reads, or a follow-up turn with smaller observations.`,
696
696
  );
697
697
  }
698
698
  return compacted ? continuationContextUpdate(agentRuntime) : undefined;
@@ -771,6 +771,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
771
771
  memoryTokens: currentContextSnapshot.categories.memory,
772
772
  projectTokens: currentContextSnapshot.categories.project,
773
773
  projectPreload: sessionPrompt?.projectPreload?.label ?? null,
774
+ projectHandbookFiles: sessionPrompt?.projectHandbookFiles ?? null,
774
775
  pendingTokens,
775
776
  streamingTokens: streamingOutput,
776
777
  liveTotalTokens: totalUsed > 0 ? totalUsed : null,
@@ -9,7 +9,8 @@ import type { ClioSettings } from "../core/config.js";
9
9
  import type { MiddlewareToolChoiceControl } from "../domains/middleware/index.js";
10
10
  import type { ObservabilityContract } from "../domains/observability/contract.js";
11
11
  import type { SessionTurnUsage } from "../domains/observability/trace-store.js";
12
- import type { SessionContract } from "../domains/session/contract.js";
12
+ import type { SessionContract, TurnInput } from "../domains/session/contract.js";
13
+ import type { ClioTurnRecord } from "../engine/session.js";
13
14
  import type { AgentEvent, AgentMessage, Usage } from "../engine/types.js";
14
15
  import {
15
16
  type AssistantCallTiming,
@@ -98,6 +99,28 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
98
99
  const { state } = deps;
99
100
  const persistedAssistantMessages = new WeakSet<object>();
100
101
 
102
+ // --- ledger appends -------------------------------------------------------
103
+ // Every turn this loop writes parents onto `state.lastTurnId`, the loop's own
104
+ // copy of the session leaf. session.append refuses a parent that is not the
105
+ // session's current leaf, and a refusal used to leave that copy stale, so
106
+ // every later submit failed the same way until the operator ran /resume.
107
+ // A stale copy has one known producer: a caller of resetForSession that
108
+ // passed a leaf captured before another turn landed. Whatever produced it,
109
+ // the right parent is the session's real leaf, so re-sync to it and append
110
+ // once more; a second refusal is a genuine session fault and propagates.
111
+ const appendTurn = (session: SessionContract, turn: Omit<TurnInput, "parentId">): ClioTurnRecord => {
112
+ try {
113
+ return session.append({ ...turn, parentId: state.lastTurnId } as TurnInput);
114
+ } catch (err) {
115
+ const current = session.current();
116
+ if (!current) throw err;
117
+ const leaf = session.tree(current.id).leafId;
118
+ if (leaf === state.lastTurnId) throw err;
119
+ state.lastTurnId = leaf;
120
+ return session.append({ ...turn, parentId: leaf } as TurnInput);
121
+ }
122
+ };
123
+
101
124
  // --- trace mirror ---------------------------------------------------------
102
125
  // One open runs/phases pair per operator turn, opened by the user row that
103
126
  // starts the turn and closed by the assistant row that ends it. Every helper
@@ -227,9 +250,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
227
250
  return;
228
251
  }
229
252
  if (message && typeof message === "object") persistedAssistantMessages.add(message as object);
230
- const turn = deps.session.append({
253
+ const turn = appendTurn(deps.session, {
231
254
  kind: "assistant",
232
- parentId: state.lastTurnId,
233
255
  payload,
234
256
  });
235
257
  state.lastTurnId = turn.id;
@@ -268,9 +290,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
268
290
  if (settings.orchestrator.model) input.model = settings.orchestrator.model;
269
291
  deps.session.create(input);
270
292
  }
271
- const userTurn = deps.session.append({
293
+ const userTurn = appendTurn(deps.session, {
272
294
  kind: "user",
273
- parentId: state.lastTurnId,
274
295
  payload: { text },
275
296
  });
276
297
  state.lastTurnId = userTurn.id;
@@ -282,9 +303,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
282
303
 
283
304
  appendToolCallTurn(event): void {
284
305
  if (!deps.session) return;
285
- const turn = deps.session.append({
306
+ const turn = appendTurn(deps.session, {
286
307
  kind: "tool_call",
287
- parentId: state.lastTurnId,
288
308
  payload: {
289
309
  toolCallId: event.toolCallId,
290
310
  name: event.toolName,
@@ -318,9 +338,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
318
338
  // instead of re-deriving it from result text.
319
339
  if (event.outcome !== undefined) payload.outcome = event.outcome;
320
340
  if (event.blockReason !== undefined) payload.blockReason = event.blockReason;
321
- const turn = deps.session.append({
341
+ const turn = appendTurn(deps.session, {
322
342
  kind: "tool_result",
323
- parentId: state.lastTurnId,
324
343
  payload,
325
344
  });
326
345
  state.lastTurnId = turn.id;
@@ -350,9 +369,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
350
369
 
351
370
  appendTerminalToolAssistantTurn(terminal): void {
352
371
  if (!deps.session) return;
353
- const turn = deps.session.append({
372
+ const turn = appendTurn(deps.session, {
354
373
  kind: "assistant",
355
- parentId: state.lastTurnId,
356
374
  payload: {
357
375
  text: "",
358
376
  stopReason: "stop",
@@ -385,9 +403,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
385
403
  payload.synthetic = true;
386
404
  payload.source = "middleware_request_continuation";
387
405
  }
388
- const userTurn = deps.session.append({
406
+ const userTurn = appendTurn(deps.session, {
389
407
  kind: "user",
390
- parentId: state.lastTurnId,
391
408
  payload,
392
409
  });
393
410
  state.lastTurnId = userTurn.id;
@@ -10,8 +10,20 @@
10
10
  import type { AgentMessage } from "../engine/types.js";
11
11
  import type { ChatTurnState } from "./turn-state.js";
12
12
 
13
+ /** Which engine queue a queued message rides: the steering queue or the follow-up queue. */
13
14
  export type QueuedMessageKind = "steer" | "follow-up";
14
15
 
16
+ /**
17
+ * Operator-chosen delivery point for a message submitted while a run is
18
+ * active. `next-slot` rides the steering queue and lands between tool batches,
19
+ * mid-run. `end-of-turn` rides the follow-up queue and lands when the whole run
20
+ * settles and the agent would hand control back. `interrupt` cancels the
21
+ * in-flight work and delivers now; it never enters a queue.
22
+ */
23
+ export type SteeringMode = "interrupt" | "next-slot" | "end-of-turn";
24
+
25
+ export const DEFAULT_STEERING_MODE: SteeringMode = "next-slot";
26
+
15
27
  export interface QueuedChatMessage {
16
28
  text: string;
17
29
  kind: QueuedMessageKind;