@iowarp/clio-coder 0.3.0 → 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 (1187) hide show
  1. package/CHANGELOG.md +123 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +295 -627
  4. package/dist/acp-BIYHVZIM.js +128 -0
  5. package/dist/{agents-Q4MYPMUW.js → agents-YT6SSRIT.js} +52 -27
  6. package/dist/assets/codewiki.json +1 -0
  7. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
  8. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
  9. package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
  10. package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
  11. package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
  12. package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
  13. package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
  14. package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
  15. package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
  16. package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
  17. package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
  18. package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
  19. package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
  20. package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
  21. package/dist/assets/grammars/tree-sitter.wasm +0 -0
  22. package/dist/{auth-O6HYIJ6J.js → auth-5TWEIYDN.js} +30 -15
  23. package/dist/chunk-2EHAIA3X.js +481 -0
  24. package/dist/{chunk-ME6DNWIU.js → chunk-2IR2NMPA.js} +12 -4
  25. package/dist/chunk-2SFS6XQE.js +122 -0
  26. package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
  27. package/dist/chunk-2VTFPG5O.js +48 -0
  28. package/dist/chunk-3I7MS7N2.js +40 -0
  29. package/dist/chunk-3R73A4XB.js +69 -0
  30. package/dist/{chunk-JPOWPFCU.js → chunk-3ZXDFGR5.js} +52 -23
  31. package/dist/chunk-4BJ5BYCE.js +61 -0
  32. package/dist/{chunk-26BZQOAD.js → chunk-4BPJXDWC.js} +161 -260
  33. package/dist/chunk-4KLWL3UC.js +18 -0
  34. package/dist/{chunk-5LDRNKX2.js → chunk-4VP4KH3K.js} +161 -262
  35. package/dist/chunk-4ZG3XFUR.js +77 -0
  36. package/dist/chunk-5B2AEOW5.js +5407 -0
  37. package/dist/chunk-5TSRNF4G.js +510 -0
  38. package/dist/{chunk-WD6AJM35.js → chunk-5UUP6MWO.js} +48 -69
  39. package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
  40. package/dist/chunk-65DEGPJ6.js +52 -0
  41. package/dist/chunk-6EJMN2Y3.js +17 -0
  42. package/dist/chunk-6EJV5X2W.js +16405 -0
  43. package/dist/chunk-6N5PTWMY.js +136 -0
  44. package/dist/chunk-6XLNIQDB.js +27 -0
  45. package/dist/{chunk-XNISANGE.js → chunk-77VKQEHF.js} +171 -74
  46. package/dist/chunk-7CR24IG7.js +242 -0
  47. package/dist/{chunk-UWIJNAOB.js → chunk-7EYHLWU7.js} +907 -638
  48. package/dist/chunk-7MNJORFF.js +22 -0
  49. package/dist/{chunk-JWHCJDCI.js → chunk-A3CYT5EX.js} +257 -79
  50. package/dist/chunk-AGYYIBLL.js +1069 -0
  51. package/dist/chunk-AO4RKG4M.js +277 -0
  52. package/dist/chunk-APJ265NV.js +7410 -0
  53. package/dist/chunk-ARBGF5F7.js +174 -0
  54. package/dist/{chunk-TFSSEXL6.js → chunk-BMEMKKIT.js} +14 -4
  55. package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
  56. package/dist/chunk-CBCAPZAA.js +229 -0
  57. package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
  58. package/dist/chunk-CMZWFGD2.js +352 -0
  59. package/dist/chunk-ECH6PKUQ.js +39 -0
  60. package/dist/{chunk-67MTHP2E.js → chunk-ED4KHGC3.js} +13 -5
  61. package/dist/chunk-EKMEHE4H.js +340 -0
  62. package/dist/{chunk-O4EJEDHO.js → chunk-EPVUXGXG.js} +50 -35
  63. package/dist/chunk-FCSXB6T2.js +338 -0
  64. package/dist/chunk-FJ3H4MN5.js +48 -0
  65. package/dist/chunk-FQ4SKYE4.js +29 -0
  66. package/dist/chunk-G2DE3C7R.js +644 -0
  67. package/dist/chunk-G4BMMOKF.js +182 -0
  68. package/dist/{chunk-7BHLZB3A.js → chunk-GGXXDWE4.js} +190 -1218
  69. package/dist/chunk-HC4CLZ2Y.js +68 -0
  70. package/dist/{chunk-E3NYWENM.js → chunk-HFSBBKSQ.js} +55 -61
  71. package/dist/chunk-HKIYEGME.js +30 -0
  72. package/dist/chunk-I4HZDVNP.js +73 -0
  73. package/dist/chunk-IGLFWIYI.js +161 -0
  74. package/dist/chunk-IHXBNWMM.js +137 -0
  75. package/dist/chunk-IKCO5N3L.js +162 -0
  76. package/dist/chunk-IR4CFBFN.js +56 -0
  77. package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
  78. package/dist/{chunk-VOO7NYPP.js → chunk-J5HN4RYU.js} +27 -9
  79. package/dist/{chunk-4UQA7NCT.js → chunk-J5Q24KAG.js} +7 -2
  80. package/dist/{chunk-KBR4MZZR.js → chunk-JVCV3ICN.js} +7 -1
  81. package/dist/chunk-KJ5LWLOE.js +1077 -0
  82. package/dist/chunk-LBMZMYH2.js +285 -0
  83. package/dist/{chunk-3DANZDGR.js → chunk-LBNRH5WM.js} +100 -161
  84. package/dist/{chunk-TKHQ4DGZ.js → chunk-LZSJBIVT.js} +7358 -7414
  85. package/dist/{chunk-UGYAX5YI.js → chunk-M6SHUN7Q.js} +13 -8
  86. package/dist/chunk-MAW544W2.js +1882 -0
  87. package/dist/chunk-MBS4V7ZP.js +217 -0
  88. package/dist/{chunk-2J63S4SF.js → chunk-MFFY33HR.js} +167 -140
  89. package/dist/chunk-MNA4JGU4.js +255 -0
  90. package/dist/chunk-MQSRRFWA.js +3428 -0
  91. package/dist/{chunk-RQDWMVRB.js → chunk-MVVUPGPW.js} +138 -137
  92. package/dist/chunk-OAO4GE4M.js +619 -0
  93. package/dist/chunk-OHHN2SO4.js +5135 -0
  94. package/dist/chunk-OKGUZO2U.js +34 -0
  95. package/dist/{chunk-BBUH4VAA.js → chunk-OOJYHWRB.js} +60 -361
  96. package/dist/{chunk-D5YD55AR.js → chunk-OQ33BKR3.js} +12 -1
  97. package/dist/chunk-OQE5J4C6.js +73 -0
  98. package/dist/{chunk-AMFR5YA3.js → chunk-ORBHGJC5.js} +26 -12
  99. package/dist/chunk-POHLU5DW.js +1186 -0
  100. package/dist/chunk-QKMUKYO7.js +4961 -0
  101. package/dist/{chunk-7RBKDI66.js → chunk-QTYWRVRA.js} +104 -12
  102. package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
  103. package/dist/chunk-SRF2PJNW.js +184 -0
  104. package/dist/chunk-SST6Z5JA.js +80 -0
  105. package/dist/{chunk-XV4ZJ6ZM.js → chunk-STBPMHSX.js} +473 -1194
  106. package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
  107. package/dist/chunk-T6YILFSB.js +80 -0
  108. package/dist/chunk-TXOTCRLG.js +15 -0
  109. package/dist/chunk-TZTZS7QK.js +227 -0
  110. package/dist/chunk-UOV2BYIW.js +107 -0
  111. package/dist/{chunk-527KG6XR.js → chunk-V4RXGQ5Q.js} +72 -185
  112. package/dist/chunk-VAKQQHWR.js +434 -0
  113. package/dist/chunk-VG7TBQIY.js +128 -0
  114. package/dist/chunk-VJWL6YS5.js +244 -0
  115. package/dist/chunk-WEH5XRJQ.js +32 -0
  116. package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
  117. package/dist/chunk-WMSVI4G2.js +2095 -0
  118. package/dist/chunk-WVO7V2QY.js +797 -0
  119. package/dist/chunk-X4RCMKVQ.js +641 -0
  120. package/dist/chunk-X75S7HFS.js +374 -0
  121. package/dist/chunk-XN3L4EYL.js +46 -0
  122. package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
  123. package/dist/{chunk-PIDUD6M2.js → chunk-YCWGATWI.js} +12 -5
  124. package/dist/chunk-YHZX5GEU.js +193 -0
  125. package/dist/chunk-YXLYO42X.js +91 -0
  126. package/dist/{chunk-UHTSULZS.js → chunk-ZDOOVTXZ.js} +38 -73
  127. package/dist/chunk-ZI647VB5.js +37 -0
  128. package/dist/{chunk-CLJ5HLUD.js → chunk-ZWLZP4ZT.js} +25 -6
  129. package/dist/cli/index.js +70 -56
  130. package/dist/clio-4LY5K2AC.js +25 -0
  131. package/dist/code-nav-7AX6FYE6.js +600 -0
  132. package/dist/codewiki/build-worker.js +66 -0
  133. package/dist/compile-cache-CVJMMODC.js +18 -0
  134. package/dist/{components-JVHMUBEB.js → components-KELWS457.js} +31 -9
  135. package/dist/{config-ZFCDBMDC.js → config-GTLUW2PR.js} +104 -56
  136. package/dist/configure-R6A64DHX.js +42 -0
  137. package/dist/context-5VKGUVJJ.js +866 -0
  138. package/dist/{context-CDXTP2MP.js → context-JFZEJ7W5.js} +21 -13
  139. package/dist/{context-E3KIFVXI.js → context-RW5HC47S.js} +77 -36
  140. package/dist/{context-clear-3F4PLXOS.js → context-clear-6ZHBAZZT.js} +64 -30
  141. package/dist/{context-index-Q7YSYTR3.js → context-index-BZ4UYMTC.js} +36 -24
  142. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  143. package/dist/{docs-YIETIWZI.js → docs-2C2LTVT2.js} +32 -13
  144. package/dist/doctor-KI767GSN.js +87 -0
  145. package/dist/{eval-B3KZZESM.js → eval-XSSNATB4.js} +93 -27
  146. package/dist/{evidence-V67CHM35.js → evidence-UA6AWDQQ.js} +55 -27
  147. package/dist/{evolve-YDZSUQYA.js → evolve-QNTFGV6Z.js} +59 -26
  148. package/dist/{extensions-SRG7XCAH.js → extensions-QVDOHDGJ.js} +23 -8
  149. package/dist/{fleet-CA2CRTVG.js → fleet-Q7UOMUSG.js} +173 -56
  150. package/dist/fleet-preflight-DDN536IT.js +26 -0
  151. package/dist/{init-2OZDJE2D.js → init-WBB65ZHQ.js} +79 -34
  152. package/dist/{memory-3PIQQAKX.js → memory-MD3O64RI.js} +57 -28
  153. package/dist/{models-DY35XI7Y.js → models-BZU34YWD.js} +49 -24
  154. package/dist/monitor-MEQA5C3I.js +661 -0
  155. package/dist/{chunk-PS4PFJQP.js → orchestrator-CGFKEP27.js} +22837 -18564
  156. package/dist/{paths-5OMXW7Z4.js → paths-UXLN5YYZ.js} +17 -6
  157. package/dist/preload-P6DGH2PZ.js +13 -0
  158. package/dist/{reset-PIFYNOS3.js → reset-L2FQEE3E.js} +25 -13
  159. package/dist/{run-3VSPP24F.js → run-IV4Q6RLN.js} +115 -63
  160. package/dist/{share-D36RQCXM.js → share-S5BZQC5I.js} +23 -10
  161. package/dist/{skills-F2MRLELY.js → skills-LQEKRDTN.js} +42 -15
  162. package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-3DC4HEWS.js} +90 -45
  163. package/dist/steer-GGWFUJUD.js +77 -0
  164. package/dist/{targets-DZMEZAH4.js → targets-C4SSGQOB.js} +78 -60
  165. package/dist/terminal-lease-IT5JW2NR.js +395 -0
  166. package/dist/{trace-7NYCUI2J.js → trace-PNCASAXC.js} +48 -17
  167. package/dist/tree-sitter-HGKH6LG4.js +4673 -0
  168. package/dist/{uninstall-AD3JWHBB.js → uninstall-FZCQCDKC.js} +19 -8
  169. package/dist/{upgrade-WYYBKGDY.js → upgrade-7TT7SQ3G.js} +66 -24
  170. package/dist/{usage-ULIDAGFF.js → usage-GV4PKT3M.js} +71 -32
  171. package/dist/verify-G6V4D2G7.js +716 -0
  172. package/dist/version-KGEG7EPO.js +21 -0
  173. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  174. package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-DQF6Z66B.js} +98 -48
  175. package/dist/worker/entry.js +297 -54
  176. package/dist/workspace-G4ZWUIPR.js +22 -0
  177. package/docs/README.md +29 -21
  178. package/docs/acp.md +191 -16
  179. package/docs/alcf-provider.md +1 -1
  180. package/docs/architecture.md +157 -7
  181. package/docs/artifact-placement.md +101 -0
  182. package/docs/artifact-versions.md +1 -1
  183. package/docs/built-in-agents.md +4 -2
  184. package/docs/capacity-and-scheduling.md +1 -1
  185. package/docs/commands-and-modes.md +224 -97
  186. package/docs/config-knobs-audit.md +1 -3
  187. package/docs/configuration-and-targets.md +236 -38
  188. package/docs/context-engine.md +34 -7
  189. package/docs/development-pipeline.md +102 -0
  190. package/docs/dispatch-architecture-rationale.md +1 -1
  191. package/docs/documentation-coverage.md +4 -4
  192. package/docs/documentation-guide.md +3 -3
  193. package/docs/environment-variables.md +15 -6
  194. package/docs/eval-runner.md +3 -3
  195. package/docs/evals-internal.md +2 -2
  196. package/docs/evidence-and-memory.md +10 -2
  197. package/docs/evolution.md +2 -2
  198. package/docs/exit-codes-and-output.md +15 -9
  199. package/docs/extensions-and-sharing.md +25 -18
  200. package/docs/fleet-demo-runbook.md +22 -23
  201. package/docs/fleet-dispatch.md +117 -16
  202. package/docs/git-commit-provenance.md +120 -0
  203. package/docs/glossary.md +107 -15
  204. package/docs/installation-and-lifecycle.md +75 -17
  205. package/docs/middleware-and-components.md +1 -1
  206. package/docs/model-catalog.md +46 -15
  207. package/docs/observability.md +8 -5
  208. package/docs/performance-methodology.md +491 -0
  209. package/docs/pi-boundary.md +72 -0
  210. package/docs/proactive-memory.md +14 -14
  211. package/docs/prompt-envelope-and-tools.md +25 -4
  212. package/docs/provider-adapter-cookbook.md +57 -4
  213. package/docs/release-cut-checklist.md +129 -111
  214. package/docs/safety-model.md +28 -8
  215. package/docs/scientific-validation.md +3 -3
  216. package/docs/session-lifecycle.md +55 -12
  217. package/docs/skills-marketplace.md +12 -8
  218. package/docs/time-conventions.md +101 -0
  219. package/docs/tool-usage.md +6 -5
  220. package/docs/trace-store.md +1 -1
  221. package/docs/troubleshooting.md +10 -7
  222. package/docs/tui-design.md +121 -28
  223. package/docs/worker-dispatch-mechanics.md +3 -3
  224. package/package.json +33 -36
  225. package/skills/README.md +5 -6
  226. package/skills/coding/ast-grep/SKILL.md +136 -0
  227. package/skills/coding/ast-grep/evals.md +56 -0
  228. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  229. package/skills/coding/coding-standards/SKILL.md +113 -0
  230. package/skills/coding/coding-standards/evals.md +34 -0
  231. package/skills/coding/prototype/SKILL.md +86 -0
  232. package/skills/coding/prototype/evals.md +42 -0
  233. package/skills/coding/prototype/references/LOGIC.md +67 -0
  234. package/skills/coding/prototype/references/UI.md +112 -0
  235. package/skills/coding/tdd/SKILL.md +101 -0
  236. package/skills/coding/tdd/evals.md +41 -0
  237. package/skills/coding/tdd/references/mocking.md +59 -0
  238. package/skills/coding/tdd/references/tests.md +77 -0
  239. package/skills/context/context-handoff/SKILL.md +126 -0
  240. package/skills/context/context-handoff/evals.md +57 -0
  241. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  242. package/skills/context/context-prime/SKILL.md +95 -0
  243. package/skills/context/context-prime/evals.md +54 -0
  244. package/skills/git/file-ticket/SKILL.md +107 -0
  245. package/skills/git/file-ticket/evals.md +54 -0
  246. package/skills/git/fix-issue/SKILL.md +106 -0
  247. package/skills/git/fix-issue/evals.md +71 -0
  248. package/skills/git/ship/SKILL.md +92 -0
  249. package/skills/git/ship/evals.md +72 -0
  250. package/skills/meta/clio-dev/SKILL.md +91 -0
  251. package/skills/meta/clio-dev/evals.md +45 -0
  252. package/skills/meta/clio-test/SKILL.md +130 -0
  253. package/skills/meta/clio-test/evals.md +43 -0
  254. package/skills/meta/clio-test/references/harness.md +97 -0
  255. package/skills/meta/clio-test/references/test-map.md +59 -0
  256. package/skills/meta/credentials/SKILL.md +125 -0
  257. package/skills/meta/credentials/evals.md +104 -0
  258. package/skills/meta/find-skills/SKILL.md +72 -0
  259. package/skills/meta/find-skills/evals.md +47 -0
  260. package/skills/meta/herdr/SKILL.md +127 -0
  261. package/skills/meta/herdr/evals.md +38 -0
  262. package/skills/meta/skill-craft/SKILL.md +102 -0
  263. package/skills/meta/skill-craft/evals.md +41 -0
  264. package/skills/planning/architecture/SKILL.md +129 -0
  265. package/skills/planning/architecture/evals.md +36 -0
  266. package/skills/planning/backlog/SKILL.md +90 -0
  267. package/skills/planning/backlog/evals.md +43 -0
  268. package/skills/planning/prd/SKILL.md +82 -0
  269. package/skills/planning/prd/evals.md +49 -0
  270. package/skills/planning/product-intent/SKILL.md +112 -0
  271. package/skills/planning/product-intent/evals.md +36 -0
  272. package/skills/planning/tech-spec/SKILL.md +115 -0
  273. package/skills/planning/tech-spec/evals.md +47 -0
  274. package/skills/registry.yaml +136 -0
  275. package/skills/research/arxiv-literature/SKILL.md +104 -0
  276. package/skills/research/arxiv-literature/evals.md +58 -0
  277. package/skills/research/experiment-protocol/SKILL.md +122 -0
  278. package/skills/research/experiment-protocol/evals.md +91 -0
  279. package/skills/research/scientific-debugging/SKILL.md +119 -0
  280. package/skills/research/scientific-debugging/evals.md +138 -0
  281. package/skills/research/scientific-modernization/SKILL.md +138 -0
  282. package/skills/research/scientific-modernization/evals.md +84 -0
  283. package/skills/skill-marketplace.json +12 -20
  284. package/skills/workflow/design-council/SKILL.md +139 -0
  285. package/skills/workflow/design-council/evals.md +97 -0
  286. package/skills/workflow/grill-me/SKILL.md +186 -0
  287. package/skills/workflow/grill-me/evals.md +78 -0
  288. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  289. package/skills/workflow/workflow-distiller/evals.md +107 -0
  290. package/src/cli/acp.ts +115 -0
  291. package/src/cli/agents.ts +60 -0
  292. package/src/cli/args.ts +280 -0
  293. package/src/cli/argv.ts +170 -0
  294. package/src/cli/ask.ts +34 -0
  295. package/src/cli/auth.ts +468 -0
  296. package/src/cli/bootstrap-generate.ts +498 -0
  297. package/src/cli/clio.ts +96 -0
  298. package/src/cli/components.ts +195 -0
  299. package/src/cli/config-inspect.ts +336 -0
  300. package/src/cli/config.ts +72 -0
  301. package/src/cli/configure-interop.ts +67 -0
  302. package/src/cli/configure-layout.ts +172 -0
  303. package/src/cli/configure.ts +1525 -0
  304. package/src/cli/context-clear.ts +76 -0
  305. package/src/cli/context-index.ts +100 -0
  306. package/src/cli/context.ts +321 -0
  307. package/src/cli/default-target.ts +55 -0
  308. package/src/cli/docs.ts +346 -0
  309. package/src/cli/doctor.ts +54 -0
  310. package/src/cli/eval.ts +315 -0
  311. package/src/cli/evidence.ts +225 -0
  312. package/src/cli/evolve.ts +219 -0
  313. package/src/cli/extensions.ts +214 -0
  314. package/src/cli/fleet.ts +868 -0
  315. package/src/cli/index.ts +338 -0
  316. package/src/cli/init.ts +219 -0
  317. package/src/cli/initial-message.ts +47 -0
  318. package/src/cli/internal-dispatch.ts +55 -0
  319. package/src/cli/memory.ts +182 -0
  320. package/src/cli/models.ts +257 -0
  321. package/src/cli/modes/json-stream.ts +121 -0
  322. package/src/cli/modes/jsonl.ts +9 -0
  323. package/src/cli/modes/print.ts +604 -0
  324. package/src/cli/oauth-manual-input.ts +72 -0
  325. package/src/cli/oauth-select.ts +36 -0
  326. package/src/cli/output-guard.ts +48 -0
  327. package/src/cli/paths.ts +44 -0
  328. package/src/cli/provider-target.ts +113 -0
  329. package/src/cli/removal.ts +72 -0
  330. package/src/cli/reset.ts +253 -0
  331. package/src/cli/run.ts +497 -0
  332. package/src/cli/share.ts +243 -0
  333. package/src/cli/shared.ts +60 -0
  334. package/src/cli/skills-eval.ts +1240 -0
  335. package/src/cli/skills.ts +485 -0
  336. package/src/cli/steer-channel.ts +86 -0
  337. package/src/cli/targets.ts +1154 -0
  338. package/src/cli/text-layout.ts +112 -0
  339. package/src/cli/trace.ts +322 -0
  340. package/src/cli/uninstall.ts +405 -0
  341. package/src/cli/upgrade.ts +286 -0
  342. package/src/cli/usage.ts +876 -0
  343. package/src/cli/validate-model.ts +28 -0
  344. package/src/cli/version.ts +7 -0
  345. package/src/cli/wiki-generate.ts +510 -0
  346. package/src/core/agent-environment.ts +7 -0
  347. package/src/core/artifact-paths.ts +43 -0
  348. package/src/core/bash-exec.ts +313 -0
  349. package/src/core/boot-trace.ts +42 -0
  350. package/src/core/bus-events.ts +744 -0
  351. package/src/core/bus-trace.ts +53 -0
  352. package/src/core/c-header-language.ts +265 -0
  353. package/src/core/clio-repo.ts +78 -0
  354. package/src/core/commit-attribution.ts +157 -0
  355. package/src/core/compile-cache.ts +159 -0
  356. package/src/core/config.ts +1722 -0
  357. package/src/core/context-floor.ts +33 -0
  358. package/src/core/defaults.ts +659 -0
  359. package/src/core/domain-loader.ts +177 -0
  360. package/src/core/event-bus.ts +94 -0
  361. package/src/core/file-references.ts +282 -0
  362. package/src/core/git-commit-attribution.ts +362 -0
  363. package/src/core/guardrails.ts +185 -0
  364. package/src/core/headless-permission.ts +21 -0
  365. package/src/core/incomplete-installation.ts +45 -0
  366. package/src/core/init.ts +223 -0
  367. package/src/core/json-payload.ts +58 -0
  368. package/src/core/package-root.ts +54 -0
  369. package/src/core/path-canonical.ts +37 -0
  370. package/src/core/process-identity.ts +41 -0
  371. package/src/core/recent-models.ts +91 -0
  372. package/src/core/residency-protection.ts +56 -0
  373. package/src/core/resolve-config-value.ts +88 -0
  374. package/src/core/response-schema.ts +279 -0
  375. package/src/core/run-overrides.ts +77 -0
  376. package/src/core/safe-exec.ts +205 -0
  377. package/src/core/safe-id.ts +37 -0
  378. package/src/core/safe-resource-write.ts +162 -0
  379. package/src/core/session-routing.ts +339 -0
  380. package/src/core/settings-layers.ts +354 -0
  381. package/src/core/shared-bus.ts +8 -0
  382. package/src/core/shell-quote.ts +26 -0
  383. package/src/core/skill-activation.ts +190 -0
  384. package/src/core/startup-timer.ts +37 -0
  385. package/src/core/state-file-lock.ts +219 -0
  386. package/src/core/termination.ts +275 -0
  387. package/src/core/timers.ts +38 -0
  388. package/src/core/tool-names.ts +65 -0
  389. package/src/core/verification-scripts.ts +13 -0
  390. package/src/core/workspace-files.ts +492 -0
  391. package/src/core/xdg.ts +177 -0
  392. package/src/domains/agents/builtins/architect.md +4 -4
  393. package/src/domains/agents/builtins/coder.md +3 -2
  394. package/src/domains/agents/builtins/debugger.md +1 -1
  395. package/src/domains/agents/builtins/documenter.md +1 -1
  396. package/src/domains/agents/builtins/git-master.md +3 -3
  397. package/src/domains/agents/builtins/provenance.md +1 -1
  398. package/src/domains/agents/builtins/researcher.md +1 -1
  399. package/src/domains/agents/builtins/scout.md +1 -1
  400. package/src/domains/agents/builtins/tester.md +1 -1
  401. package/src/domains/agents/builtins/verifier.md +1 -1
  402. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  403. package/src/domains/agents/catalog.ts +172 -0
  404. package/src/domains/agents/contract.ts +16 -0
  405. package/src/domains/agents/extension.ts +110 -0
  406. package/src/domains/agents/fleet-commands.ts +154 -0
  407. package/src/domains/agents/fleet-contract.ts +797 -0
  408. package/src/domains/agents/frontmatter.ts +40 -0
  409. package/src/domains/agents/index.ts +102 -0
  410. package/src/domains/agents/manifest.ts +6 -0
  411. package/src/domains/agents/recipe-schema.ts +202 -0
  412. package/src/domains/agents/recipe.ts +125 -0
  413. package/src/domains/agents/registry.ts +111 -0
  414. package/src/domains/agents/result-contract.ts +1265 -0
  415. package/src/domains/agents/spec.ts +371 -0
  416. package/src/domains/agents/write-boundary.ts +109 -0
  417. package/src/domains/components/diff.ts +99 -0
  418. package/src/domains/components/hash.ts +21 -0
  419. package/src/domains/components/index.ts +3 -0
  420. package/src/domains/components/scan.ts +304 -0
  421. package/src/domains/components/snapshot.ts +108 -0
  422. package/src/domains/components/types.ts +82 -0
  423. package/src/domains/config/agent-namespace.ts +13 -0
  424. package/src/domains/config/classify.ts +106 -0
  425. package/src/domains/config/contract.ts +22 -0
  426. package/src/domains/config/extension.ts +142 -0
  427. package/src/domains/config/index.ts +23 -0
  428. package/src/domains/config/keybindings.ts +200 -0
  429. package/src/domains/config/manifest.ts +6 -0
  430. package/src/domains/config/watcher.ts +41 -0
  431. package/src/domains/context/adoption.ts +880 -0
  432. package/src/domains/context/bootstrap-prompt.ts +273 -0
  433. package/src/domains/context/bootstrap.ts +1502 -0
  434. package/src/domains/context/clear.ts +91 -0
  435. package/src/domains/context/clio-md.ts +429 -0
  436. package/src/domains/context/codewiki/artifact.ts +400 -0
  437. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  438. package/src/domains/context/codewiki/build-worker.ts +54 -0
  439. package/src/domains/context/codewiki/cmake.ts +356 -0
  440. package/src/domains/context/codewiki/cooperative.ts +46 -0
  441. package/src/domains/context/codewiki/coordinator.ts +182 -0
  442. package/src/domains/context/codewiki/digest.ts +135 -0
  443. package/src/domains/context/codewiki/grammar-assets.ts +33 -0
  444. package/src/domains/context/codewiki/indexer.ts +1529 -0
  445. package/src/domains/context/codewiki/paths.ts +67 -0
  446. package/src/domains/context/codewiki/schema.ts +80 -0
  447. package/src/domains/context/codewiki/tree-sitter.ts +771 -0
  448. package/src/domains/context/contract.ts +68 -0
  449. package/src/domains/context/excluded-dirs.ts +1 -0
  450. package/src/domains/context/extension.ts +358 -0
  451. package/src/domains/context/fingerprint.ts +198 -0
  452. package/src/domains/context/index.ts +154 -0
  453. package/src/domains/context/init-options.ts +69 -0
  454. package/src/domains/context/manifest.ts +6 -0
  455. package/src/domains/context/operator-profile.ts +157 -0
  456. package/src/domains/context/project-metadata.ts +529 -0
  457. package/src/domains/context/project-rules.ts +227 -0
  458. package/src/domains/context/prompt-context.ts +61 -0
  459. package/src/domains/context/refresh.ts +178 -0
  460. package/src/domains/context/runtime.ts +17 -0
  461. package/src/domains/context/sibling-files.ts +10 -0
  462. package/src/domains/context/state.ts +237 -0
  463. package/src/domains/context/wiki/assemble.ts +303 -0
  464. package/src/domains/context/wiki/frontmatter.ts +210 -0
  465. package/src/domains/context/wiki/generate.ts +595 -0
  466. package/src/domains/context/wiki/layout.ts +111 -0
  467. package/src/domains/context/wiki/meta.ts +221 -0
  468. package/src/domains/context/wiki/plan-store.ts +217 -0
  469. package/src/domains/context/wiki/plan.ts +250 -0
  470. package/src/domains/context/wiki/prompts.ts +283 -0
  471. package/src/domains/context/wiki/staleness.ts +198 -0
  472. package/src/domains/dispatch/active-route-planner.ts +168 -0
  473. package/src/domains/dispatch/admission-queue.ts +150 -0
  474. package/src/domains/dispatch/admission.ts +334 -0
  475. package/src/domains/dispatch/agent-candidates.ts +307 -0
  476. package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
  477. package/src/domains/dispatch/agent-ledger-store.ts +257 -0
  478. package/src/domains/dispatch/agent-ledger.ts +212 -0
  479. package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
  480. package/src/domains/dispatch/assignment-events.ts +132 -0
  481. package/src/domains/dispatch/assignment-reconcile.ts +76 -0
  482. package/src/domains/dispatch/assignment-store.ts +162 -0
  483. package/src/domains/dispatch/assignment.ts +278 -0
  484. package/src/domains/dispatch/backoff.ts +59 -0
  485. package/src/domains/dispatch/batch-store.ts +134 -0
  486. package/src/domains/dispatch/batch-tracker.ts +66 -0
  487. package/src/domains/dispatch/capability-match.ts +155 -0
  488. package/src/domains/dispatch/capacity-lease.ts +413 -0
  489. package/src/domains/dispatch/code-step-store.ts +52 -0
  490. package/src/domains/dispatch/code-step.ts +387 -0
  491. package/src/domains/dispatch/contract.ts +278 -0
  492. package/src/domains/dispatch/dedup.ts +133 -0
  493. package/src/domains/dispatch/event-pump.ts +251 -0
  494. package/src/domains/dispatch/execution-handoff.ts +29 -0
  495. package/src/domains/dispatch/execution-plan.ts +328 -0
  496. package/src/domains/dispatch/execution-role.ts +277 -0
  497. package/src/domains/dispatch/execution-scheduler.ts +583 -0
  498. package/src/domains/dispatch/extension.ts +6006 -0
  499. package/src/domains/dispatch/failure-classification.ts +147 -0
  500. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  501. package/src/domains/dispatch/fleet-plan.ts +225 -0
  502. package/src/domains/dispatch/fleet-preflight.ts +394 -0
  503. package/src/domains/dispatch/gate-decisions.ts +1040 -0
  504. package/src/domains/dispatch/gate-role-prompts.ts +58 -0
  505. package/src/domains/dispatch/heartbeat.ts +27 -0
  506. package/src/domains/dispatch/index.ts +137 -0
  507. package/src/domains/dispatch/joint-route-adapter.ts +114 -0
  508. package/src/domains/dispatch/joint-route-resolver.ts +283 -0
  509. package/src/domains/dispatch/manifest.ts +6 -0
  510. package/src/domains/dispatch/orphan-recovery.ts +266 -0
  511. package/src/domains/dispatch/outcome.ts +109 -0
  512. package/src/domains/dispatch/phase-timing.ts +47 -0
  513. package/src/domains/dispatch/placement.ts +202 -0
  514. package/src/domains/dispatch/receipt-findings.ts +255 -0
  515. package/src/domains/dispatch/receipt-integrity.ts +383 -0
  516. package/src/domains/dispatch/recovery-candidates.ts +74 -0
  517. package/src/domains/dispatch/reproducibility.ts +48 -0
  518. package/src/domains/dispatch/reservation-store.ts +501 -0
  519. package/src/domains/dispatch/route-approval.ts +177 -0
  520. package/src/domains/dispatch/route-candidates.ts +57 -0
  521. package/src/domains/dispatch/route-decision.ts +1079 -0
  522. package/src/domains/dispatch/route-facts.ts +187 -0
  523. package/src/domains/dispatch/route-history.ts +238 -0
  524. package/src/domains/dispatch/route-observer.ts +488 -0
  525. package/src/domains/dispatch/route-policy.ts +327 -0
  526. package/src/domains/dispatch/route-quality.ts +256 -0
  527. package/src/domains/dispatch/route-readiness.ts +120 -0
  528. package/src/domains/dispatch/routing-intent.ts +287 -0
  529. package/src/domains/dispatch/run-identity.ts +56 -0
  530. package/src/domains/dispatch/scout-transition.ts +130 -0
  531. package/src/domains/dispatch/state.ts +302 -0
  532. package/src/domains/dispatch/tool-stats.ts +132 -0
  533. package/src/domains/dispatch/transport.ts +210 -0
  534. package/src/domains/dispatch/types.ts +799 -0
  535. package/src/domains/dispatch/validation-grounding.ts +154 -0
  536. package/src/domains/dispatch/validation.ts +721 -0
  537. package/src/domains/dispatch/worker-protocol.ts +275 -0
  538. package/src/domains/dispatch/worker-spawn.ts +585 -0
  539. package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
  540. package/src/domains/dispatch/write-boundary.ts +426 -0
  541. package/src/domains/eval/artifacts/redact.ts +42 -0
  542. package/src/domains/eval/artifacts/store.ts +173 -0
  543. package/src/domains/eval/compare/compare.ts +33 -0
  544. package/src/domains/eval/compare/gates.ts +66 -0
  545. package/src/domains/eval/compare/thresholds.ts +92 -0
  546. package/src/domains/eval/harness-metrics.ts +62 -0
  547. package/src/domains/eval/index.ts +66 -0
  548. package/src/domains/eval/metrics/chaos-stream.ts +93 -0
  549. package/src/domains/eval/metrics/context.ts +34 -0
  550. package/src/domains/eval/metrics/coverage.ts +21 -0
  551. package/src/domains/eval/metrics/evidence.ts +182 -0
  552. package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
  553. package/src/domains/eval/metrics/invariants.ts +736 -0
  554. package/src/domains/eval/metrics/latency.ts +4 -0
  555. package/src/domains/eval/metrics/token-stream.ts +139 -0
  556. package/src/domains/eval/metrics/tokens.ts +51 -0
  557. package/src/domains/eval/metrics/tool-calls.ts +7 -0
  558. package/src/domains/eval/proactive-memory.ts +279 -0
  559. package/src/domains/eval/provenance.ts +35 -0
  560. package/src/domains/eval/report.ts +234 -0
  561. package/src/domains/eval/reports/json.ts +5 -0
  562. package/src/domains/eval/reports/junit.ts +23 -0
  563. package/src/domains/eval/reports/markdown.ts +20 -0
  564. package/src/domains/eval/reports/swe-jsonl.ts +16 -0
  565. package/src/domains/eval/reports/text.ts +25 -0
  566. package/src/domains/eval/run-compare.ts +274 -0
  567. package/src/domains/eval/runner.ts +244 -0
  568. package/src/domains/eval/runners/clio-run.ts +148 -0
  569. package/src/domains/eval/runners/context-index.ts +56 -0
  570. package/src/domains/eval/runners/context-init.ts +203 -0
  571. package/src/domains/eval/runners/external-command.ts +350 -0
  572. package/src/domains/eval/runtime-paths.ts +171 -0
  573. package/src/domains/eval/schema/artifact.ts +75 -0
  574. package/src/domains/eval/schema/suite.ts +235 -0
  575. package/src/domains/eval/schema/validate.ts +339 -0
  576. package/src/domains/eval/store.ts +392 -0
  577. package/src/domains/eval/suites/load.ts +74 -0
  578. package/src/domains/eval/suites/matrix.ts +19 -0
  579. package/src/domains/eval/suites/resolve.ts +44 -0
  580. package/src/domains/eval/suites/run.ts +325 -0
  581. package/src/domains/eval/task-file.ts +186 -0
  582. package/src/domains/eval/types.ts +140 -0
  583. package/src/domains/eval/verifiers/command.ts +27 -0
  584. package/src/domains/eval/verifiers/file-exists.ts +6 -0
  585. package/src/domains/eval/verifiers/patch.ts +22 -0
  586. package/src/domains/eval/workspaces/git.ts +41 -0
  587. package/src/domains/eval/workspaces/local.ts +17 -0
  588. package/src/domains/eval/workspaces/temp-copy.ts +29 -0
  589. package/src/domains/evidence/build.ts +1754 -0
  590. package/src/domains/evidence/eval.ts +605 -0
  591. package/src/domains/evidence/failure-attribution.ts +54 -0
  592. package/src/domains/evidence/finish-contract-map.ts +42 -0
  593. package/src/domains/evidence/index.ts +55 -0
  594. package/src/domains/evidence/provenance.ts +200 -0
  595. package/src/domains/evidence/redact.ts +81 -0
  596. package/src/domains/evidence/store.ts +291 -0
  597. package/src/domains/evidence/types.ts +325 -0
  598. package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
  599. package/src/domains/evolution/index.ts +26 -0
  600. package/src/domains/evolution/manifest.ts +154 -0
  601. package/src/domains/evolution/validate.ts +304 -0
  602. package/src/domains/extensions/contract.ts +22 -0
  603. package/src/domains/extensions/discovery.ts +193 -0
  604. package/src/domains/extensions/extension.ts +46 -0
  605. package/src/domains/extensions/index.ts +34 -0
  606. package/src/domains/extensions/manager.ts +30 -0
  607. package/src/domains/extensions/manifest.ts +6 -0
  608. package/src/domains/extensions/resources.ts +38 -0
  609. package/src/domains/extensions/state.ts +224 -0
  610. package/src/domains/extensions/types.ts +83 -0
  611. package/src/domains/interop/consent.ts +185 -0
  612. package/src/domains/interop/contract.ts +29 -0
  613. package/src/domains/interop/detect.ts +173 -0
  614. package/src/domains/interop/extension.ts +59 -0
  615. package/src/domains/interop/index.ts +34 -0
  616. package/src/domains/interop/manifest.ts +6 -0
  617. package/src/domains/interop/registry.ts +139 -0
  618. package/src/domains/interop/state.ts +92 -0
  619. package/src/domains/interop/types.ts +109 -0
  620. package/src/domains/lifecycle/contract.ts +11 -0
  621. package/src/domains/lifecycle/doctor.ts +536 -0
  622. package/src/domains/lifecycle/extension.ts +23 -0
  623. package/src/domains/lifecycle/index.ts +21 -0
  624. package/src/domains/lifecycle/install-method.ts +51 -0
  625. package/src/domains/lifecycle/manifest.ts +6 -0
  626. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  627. package/src/domains/lifecycle/migrations/index.ts +114 -0
  628. package/src/domains/lifecycle/state.ts +93 -0
  629. package/src/domains/lifecycle/upgrade-notice.ts +35 -0
  630. package/src/domains/lifecycle/version.ts +35 -0
  631. package/src/domains/memory/index.ts +128 -0
  632. package/src/domains/memory/operations.ts +143 -0
  633. package/src/domains/memory/prompt-section.ts +86 -0
  634. package/src/domains/memory/proposal.ts +180 -0
  635. package/src/domains/memory/store.ts +163 -0
  636. package/src/domains/memory/task-bank.ts +229 -0
  637. package/src/domains/memory/task-memory-handoff.ts +222 -0
  638. package/src/domains/memory/task-memory-policy.ts +602 -0
  639. package/src/domains/memory/task-memory-status.ts +58 -0
  640. package/src/domains/memory/task-memory-telemetry.ts +346 -0
  641. package/src/domains/memory/task-memory-trace.ts +89 -0
  642. package/src/domains/memory/types.ts +74 -0
  643. package/src/domains/memory/validate.ts +297 -0
  644. package/src/domains/middleware/budget.ts +216 -0
  645. package/src/domains/middleware/contract.ts +35 -0
  646. package/src/domains/middleware/dispatch-nudge.ts +469 -0
  647. package/src/domains/middleware/extension.ts +129 -0
  648. package/src/domains/middleware/hook-receipts.ts +70 -0
  649. package/src/domains/middleware/hooks-io.ts +186 -0
  650. package/src/domains/middleware/hooks.ts +432 -0
  651. package/src/domains/middleware/index.ts +154 -0
  652. package/src/domains/middleware/manifest.ts +6 -0
  653. package/src/domains/middleware/memory-intervention.ts +701 -0
  654. package/src/domains/middleware/rules.ts +42 -0
  655. package/src/domains/middleware/runtime.ts +333 -0
  656. package/src/domains/middleware/skills-reminder.ts +202 -0
  657. package/src/domains/middleware/snapshot.ts +71 -0
  658. package/src/domains/middleware/stalled-turn.ts +71 -0
  659. package/src/domains/middleware/task-board-reminder.ts +87 -0
  660. package/src/domains/middleware/task-nudge.ts +77 -0
  661. package/src/domains/middleware/tool-choice-control.ts +42 -0
  662. package/src/domains/middleware/types.ts +131 -0
  663. package/src/domains/middleware/validate.ts +329 -0
  664. package/src/domains/observability/accountability.ts +67 -0
  665. package/src/domains/observability/contract.ts +168 -0
  666. package/src/domains/observability/cost.ts +206 -0
  667. package/src/domains/observability/evidence-index.ts +123 -0
  668. package/src/domains/observability/extension.ts +281 -0
  669. package/src/domains/observability/index.ts +78 -0
  670. package/src/domains/observability/manifest.ts +10 -0
  671. package/src/domains/observability/metrics.ts +37 -0
  672. package/src/domains/observability/projection.ts +477 -0
  673. package/src/domains/observability/telemetry.ts +89 -0
  674. package/src/domains/observability/trace-store.ts +1454 -0
  675. package/src/domains/prompts/compiler.ts +614 -0
  676. package/src/domains/prompts/contract.ts +46 -0
  677. package/src/domains/prompts/extension.ts +336 -0
  678. package/src/domains/prompts/fragment-loader.ts +138 -0
  679. package/src/domains/prompts/fragments/identity/clio.md +5 -6
  680. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  681. package/src/domains/prompts/fragments/identity/self-awareness.md +19 -0
  682. package/src/domains/prompts/fragments/operating/contract.md +4 -41
  683. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  684. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  685. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  686. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  687. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  688. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  689. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  690. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  691. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  692. package/src/domains/prompts/hash.ts +73 -0
  693. package/src/domains/prompts/index.ts +32 -0
  694. package/src/domains/prompts/manifest.ts +8 -0
  695. package/src/domains/prompts/memory-intervention.ts +57 -0
  696. package/src/domains/prompts/preload.ts +82 -0
  697. package/src/domains/providers/auth/api-key.ts +47 -0
  698. package/src/domains/providers/auth/backend-file.ts +79 -0
  699. package/src/domains/providers/auth/backend-memory.ts +72 -0
  700. package/src/domains/providers/auth/boot-status.ts +65 -0
  701. package/src/domains/providers/auth/index.ts +37 -0
  702. package/src/domains/providers/auth/oauth.ts +37 -0
  703. package/src/domains/providers/auth/storage.ts +726 -0
  704. package/src/domains/providers/capabilities.ts +58 -0
  705. package/src/domains/providers/catalog.ts +162 -0
  706. package/src/domains/providers/contract.ts +162 -0
  707. package/src/domains/providers/credentials.ts +20 -0
  708. package/src/domains/providers/eligibility.ts +24 -0
  709. package/src/domains/providers/errors.ts +64 -0
  710. package/src/domains/providers/extension.ts +548 -0
  711. package/src/domains/providers/index.ts +142 -0
  712. package/src/domains/providers/knowledge-base-path.ts +102 -0
  713. package/src/domains/providers/manifest.ts +6 -0
  714. package/src/domains/providers/model-capabilities.ts +136 -0
  715. package/src/domains/providers/model-discovery.ts +144 -0
  716. package/src/domains/providers/model-family.ts +32 -0
  717. package/src/domains/providers/model-runtime-capabilities.ts +723 -0
  718. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +120 -37
  719. package/src/domains/providers/plugins.ts +61 -0
  720. package/src/domains/providers/probe/fingerprint.ts +64 -0
  721. package/src/domains/providers/probe/http.ts +114 -0
  722. package/src/domains/providers/probe/reasoning.ts +111 -0
  723. package/src/domains/providers/registry.ts +187 -0
  724. package/src/domains/providers/resolver.ts +156 -0
  725. package/src/domains/providers/runtime-resolution.ts +720 -0
  726. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
  727. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  728. package/src/domains/providers/runtimes/builtins.ts +78 -0
  729. package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
  730. package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
  731. package/src/domains/providers/runtimes/claude/common.ts +55 -0
  732. package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
  733. package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
  734. package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
  735. package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
  736. package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
  737. package/src/domains/providers/runtimes/cloud/google.ts +41 -0
  738. package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
  739. package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
  740. package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
  741. package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
  742. package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
  743. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  744. package/src/domains/providers/runtimes/common/local-synth.ts +164 -0
  745. package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
  746. package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
  747. package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
  748. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
  749. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
  750. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
  751. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
  752. package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
  753. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  754. package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
  755. package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
  756. package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
  757. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
  758. package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
  759. package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
  760. package/src/domains/providers/runtimes/protocol/google.ts +27 -0
  761. package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
  762. package/src/domains/providers/support.ts +241 -0
  763. package/src/domains/providers/thinking-control-policy.ts +85 -0
  764. package/src/domains/providers/types/capability-flags.ts +114 -0
  765. package/src/domains/providers/types/cost-provenance.ts +7 -0
  766. package/src/domains/providers/types/inference.ts +41 -0
  767. package/src/domains/providers/types/knowledge-base.ts +156 -0
  768. package/src/domains/providers/types/local-model-quirks.ts +216 -0
  769. package/src/domains/providers/types/runtime-descriptor.ts +181 -0
  770. package/src/domains/providers/types/target-descriptor.ts +60 -0
  771. package/src/domains/resources/collision.ts +92 -0
  772. package/src/domains/resources/common-loader.ts +140 -0
  773. package/src/domains/resources/contract.ts +24 -0
  774. package/src/domains/resources/extension.ts +59 -0
  775. package/src/domains/resources/index.ts +74 -0
  776. package/src/domains/resources/loader.ts +85 -0
  777. package/src/domains/resources/manifest.ts +6 -0
  778. package/src/domains/resources/prompts/loader.ts +246 -0
  779. package/src/domains/resources/prompts/substitute.ts +1 -0
  780. package/src/domains/resources/skills/content-hash.ts +107 -0
  781. package/src/domains/resources/skills/evals.ts +175 -0
  782. package/src/domains/resources/skills/install.ts +427 -0
  783. package/src/domains/resources/skills/loader.ts +985 -0
  784. package/src/domains/resources/skills/marketplace.ts +301 -0
  785. package/src/domains/resources/skills/provenance-pin.ts +115 -0
  786. package/src/domains/safety/action-classifier.ts +270 -0
  787. package/src/domains/safety/approval-axis.ts +23 -0
  788. package/src/domains/safety/audit.ts +493 -0
  789. package/src/domains/safety/autonomy.ts +174 -0
  790. package/src/domains/safety/call-target.ts +59 -0
  791. package/src/domains/safety/contract.ts +65 -0
  792. package/src/domains/safety/damage-control.ts +44 -0
  793. package/src/domains/safety/default-path-policy.ts +117 -0
  794. package/src/domains/safety/extension.ts +383 -0
  795. package/src/domains/safety/finish-contract-registration.ts +128 -0
  796. package/src/domains/safety/finish-contract.ts +554 -0
  797. package/src/domains/safety/index.ts +44 -0
  798. package/src/domains/safety/loop-detector.ts +143 -0
  799. package/src/domains/safety/manifest.ts +6 -0
  800. package/src/domains/safety/path-policy.ts +164 -0
  801. package/src/domains/safety/policy-engine.ts +994 -0
  802. package/src/domains/safety/project-policy.ts +391 -0
  803. package/src/domains/safety/protected-artifacts-registration.ts +189 -0
  804. package/src/domains/safety/protected-artifacts.ts +993 -0
  805. package/src/domains/safety/rejection-feedback.ts +102 -0
  806. package/src/domains/safety/rigor.ts +72 -0
  807. package/src/domains/safety/rule-compiler.ts +48 -0
  808. package/src/domains/safety/rule-pack-loader.ts +92 -0
  809. package/src/domains/safety/run-effects.ts +197 -0
  810. package/src/domains/safety/scope.ts +61 -0
  811. package/src/domains/scheduling/budget.ts +35 -0
  812. package/src/domains/scheduling/cluster.ts +175 -0
  813. package/src/domains/scheduling/contract.ts +30 -0
  814. package/src/domains/scheduling/extension.ts +91 -0
  815. package/src/domains/scheduling/index.ts +12 -0
  816. package/src/domains/scheduling/manifest.ts +6 -0
  817. package/src/domains/session/archive-readers.ts +208 -0
  818. package/src/domains/session/checkpoint.ts +38 -0
  819. package/src/domains/session/compaction/auto.ts +89 -0
  820. package/src/domains/session/compaction/branch-summary.ts +187 -0
  821. package/src/domains/session/compaction/compact.ts +493 -0
  822. package/src/domains/session/compaction/cut-point.ts +172 -0
  823. package/src/domains/session/compaction/defaults.ts +34 -0
  824. package/src/domains/session/compaction/mask-observations.ts +265 -0
  825. package/src/domains/session/compaction/session-entries.ts +18 -0
  826. package/src/domains/session/compaction/tokens.ts +148 -0
  827. package/src/domains/session/context-accounting.ts +583 -0
  828. package/src/domains/session/context-ledger.ts +362 -0
  829. package/src/domains/session/contract.ts +159 -0
  830. package/src/domains/session/cwd-fallback.ts +65 -0
  831. package/src/domains/session/decision-board.ts +190 -0
  832. package/src/domains/session/entries.ts +572 -0
  833. package/src/domains/session/extension.ts +403 -0
  834. package/src/domains/session/history.ts +172 -0
  835. package/src/domains/session/index.ts +84 -0
  836. package/src/domains/session/manager.ts +128 -0
  837. package/src/domains/session/manifest.ts +6 -0
  838. package/src/domains/session/migrations/index.ts +27 -0
  839. package/src/domains/session/prompt-manifest.ts +173 -0
  840. package/src/domains/session/protected-artifact-journal.ts +241 -0
  841. package/src/domains/session/protected-artifacts.ts +90 -0
  842. package/src/domains/session/retry.ts +230 -0
  843. package/src/domains/session/session-artifacts.ts +107 -0
  844. package/src/domains/session/task-board.ts +569 -0
  845. package/src/domains/session/tree/active-path.ts +137 -0
  846. package/src/domains/session/tree/fork.ts +159 -0
  847. package/src/domains/session/tree/manager.ts +128 -0
  848. package/src/domains/session/tree/navigator.ts +177 -0
  849. package/src/domains/session/tree/preview.ts +259 -0
  850. package/src/domains/session/usage.ts +148 -0
  851. package/src/domains/session/workspace/git-probe.ts +167 -0
  852. package/src/domains/session/workspace/index.ts +4 -0
  853. package/src/domains/session/workspace/project-type.ts +217 -0
  854. package/src/domains/session/workspace/snapshot.ts +74 -0
  855. package/src/domains/share/archive.ts +684 -0
  856. package/src/domains/share/contract.ts +9 -0
  857. package/src/domains/share/extension.ts +26 -0
  858. package/src/domains/share/index.ts +28 -0
  859. package/src/domains/share/manifest.ts +6 -0
  860. package/src/domains/user-tasks/store.ts +297 -0
  861. package/src/engine/acp/adapter.ts +397 -0
  862. package/src/engine/acp/errors.ts +128 -0
  863. package/src/engine/acp/event-mapper.ts +154 -0
  864. package/src/engine/acp/server.ts +2238 -0
  865. package/src/engine/acp/tool-mediator.ts +686 -0
  866. package/src/engine/acp/transport.ts +775 -0
  867. package/src/engine/acp/types.ts +196 -0
  868. package/src/engine/agent.ts +29 -0
  869. package/src/engine/ai.ts +207 -0
  870. package/src/engine/alcf-oauth.ts +205 -0
  871. package/src/engine/antigravity/subprocess-runtime.ts +205 -0
  872. package/src/engine/api-registry.ts +223 -0
  873. package/src/engine/apis/degraded-inference.ts +95 -0
  874. package/src/engine/apis/index.ts +16 -0
  875. package/src/engine/apis/llamacpp-residency.ts +292 -0
  876. package/src/engine/apis/lmstudio-residency.ts +76 -0
  877. package/src/engine/apis/lmstudio.ts +243 -0
  878. package/src/engine/apis/ollama-native.ts +528 -0
  879. package/src/engine/apis/openai-completions.ts +795 -0
  880. package/src/engine/apis/output-budget.ts +99 -0
  881. package/src/engine/apis/residency-lock.ts +29 -0
  882. package/src/engine/apis/residency.ts +776 -0
  883. package/src/engine/apis/resident-models.ts +42 -0
  884. package/src/engine/apis/sampling-overrides.ts +38 -0
  885. package/src/engine/apis/types.ts +16 -0
  886. package/src/engine/claude/sdk-runtime.ts +685 -0
  887. package/src/engine/claude/session-id.ts +5 -0
  888. package/src/engine/claude/subprocess-runtime.ts +316 -0
  889. package/src/engine/claude/tool-safety.ts +400 -0
  890. package/src/engine/env-api-keys.ts +98 -0
  891. package/src/engine/external-subprocess.ts +23 -0
  892. package/src/engine/gemma-channel-filter.ts +223 -0
  893. package/src/engine/harmony-response.ts +165 -0
  894. package/src/engine/instrumented-tui.ts +192 -0
  895. package/src/engine/loop-guard.ts +1127 -0
  896. package/src/engine/messages.ts +14 -0
  897. package/src/engine/models.ts +42 -0
  898. package/src/engine/oauth.ts +196 -0
  899. package/src/engine/pi-mono-names.ts +13 -0
  900. package/src/engine/prompt-templates.ts +1 -0
  901. package/src/engine/provider-payload.ts +272 -0
  902. package/src/engine/select-list.ts +53 -0
  903. package/src/engine/session.ts +834 -0
  904. package/src/engine/strip-tokenizer-sentinels.ts +125 -0
  905. package/src/engine/truncate.ts +9 -0
  906. package/src/engine/tui.ts +111 -0
  907. package/src/engine/types.ts +63 -0
  908. package/src/engine/worker-events.ts +100 -0
  909. package/src/engine/worker-runtime-capabilities.ts +5 -0
  910. package/src/engine/worker-runtime.ts +1022 -0
  911. package/src/engine/worker-tools.ts +208 -0
  912. package/src/entry/boot-options.ts +50 -0
  913. package/src/entry/orchestrator.ts +2011 -0
  914. package/src/interactive/application-controller.ts +433 -0
  915. package/src/interactive/bus-notices.ts +265 -0
  916. package/src/interactive/chat-loop-messages.ts +626 -0
  917. package/src/interactive/chat-loop-policy.ts +18 -0
  918. package/src/interactive/chat-loop.ts +1090 -0
  919. package/src/interactive/chat-panel.ts +1820 -0
  920. package/src/interactive/chat-renderer.ts +1228 -0
  921. package/src/interactive/clio-editor.ts +161 -0
  922. package/src/interactive/command-fallbacks.ts +23 -0
  923. package/src/interactive/command-output.ts +85 -0
  924. package/src/interactive/context-activity.ts +203 -0
  925. package/src/interactive/context-meter.ts +223 -0
  926. package/src/interactive/context-overlay.ts +246 -0
  927. package/src/interactive/cost-overlay.ts +279 -0
  928. package/src/interactive/dispatch-board.ts +1319 -0
  929. package/src/interactive/dispatch-steering.ts +86 -0
  930. package/src/interactive/editor-bash.ts +46 -0
  931. package/src/interactive/editor-steer.ts +51 -0
  932. package/src/interactive/editor-submit.ts +507 -0
  933. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  934. package/src/interactive/export-html/index.ts +51 -0
  935. package/src/interactive/export-html/template.ts +45 -0
  936. package/src/interactive/export-html/tool-renderer.ts +54 -0
  937. package/src/interactive/external-editor.ts +67 -0
  938. package/src/interactive/follow-up-queue-panel.ts +75 -0
  939. package/src/interactive/footer/dashboard.ts +538 -0
  940. package/src/interactive/footer/notifications.ts +275 -0
  941. package/src/interactive/footer/widgets.ts +1264 -0
  942. package/src/interactive/footer-panel.ts +187 -0
  943. package/src/interactive/format-time.ts +97 -0
  944. package/src/interactive/index.ts +11 -0
  945. package/src/interactive/interactive-application.ts +939 -0
  946. package/src/interactive/interactive-event-projection.ts +385 -0
  947. package/src/interactive/interactive-input-runtime.ts +307 -0
  948. package/src/interactive/interactive-presentation.ts +584 -0
  949. package/src/interactive/interactive-shell.ts +388 -0
  950. package/src/interactive/interactive-slash-runtime.ts +554 -0
  951. package/src/interactive/interactive-subscriptions.ts +111 -0
  952. package/src/interactive/interactive-tickers.ts +183 -0
  953. package/src/interactive/keybinding-manager.ts +496 -0
  954. package/src/interactive/layout.ts +57 -0
  955. package/src/interactive/leader-key.ts +143 -0
  956. package/src/interactive/loop-guard-interrupt.ts +101 -0
  957. package/src/interactive/memory-overlay.ts +280 -0
  958. package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
  959. package/src/interactive/overlay-auth-lifecycle.ts +308 -0
  960. package/src/interactive/overlay-frame.ts +502 -0
  961. package/src/interactive/overlay-general-openers.ts +274 -0
  962. package/src/interactive/overlay-key-routing.ts +216 -0
  963. package/src/interactive/overlay-lifecycle.ts +426 -0
  964. package/src/interactive/overlay-model-selectors.ts +127 -0
  965. package/src/interactive/overlay-permission-lifecycle.ts +345 -0
  966. package/src/interactive/overlay-resource-openers.ts +112 -0
  967. package/src/interactive/overlay-session-lifecycle.ts +327 -0
  968. package/src/interactive/overlay-transitions.ts +57 -0
  969. package/src/interactive/overlays/agents.ts +69 -0
  970. package/src/interactive/overlays/ask-user.ts +921 -0
  971. package/src/interactive/overlays/auth-dialog.ts +221 -0
  972. package/src/interactive/overlays/context-reset.ts +108 -0
  973. package/src/interactive/overlays/cwd-fallback.ts +141 -0
  974. package/src/interactive/overlays/decisions.ts +300 -0
  975. package/src/interactive/overlays/extensions.ts +54 -0
  976. package/src/interactive/overlays/help-reference.ts +145 -0
  977. package/src/interactive/overlays/interop.ts +139 -0
  978. package/src/interactive/overlays/keybinding-detail.ts +90 -0
  979. package/src/interactive/overlays/list-overlay.ts +606 -0
  980. package/src/interactive/overlays/message-picker.ts +155 -0
  981. package/src/interactive/overlays/model-selector.ts +1109 -0
  982. package/src/interactive/overlays/prompts.ts +72 -0
  983. package/src/interactive/overlays/session-selector-search.ts +31 -0
  984. package/src/interactive/overlays/session-selector.ts +284 -0
  985. package/src/interactive/overlays/settings.ts +3451 -0
  986. package/src/interactive/overlays/skills-hub.ts +237 -0
  987. package/src/interactive/overlays/tree-selector.ts +422 -0
  988. package/src/interactive/permission-overlay.ts +170 -0
  989. package/src/interactive/render-trace.ts +534 -0
  990. package/src/interactive/renderers/branch-summary.ts +86 -0
  991. package/src/interactive/renderers/code-ink.ts +420 -0
  992. package/src/interactive/renderers/compaction-summary.ts +112 -0
  993. package/src/interactive/renderers/diff.ts +137 -0
  994. package/src/interactive/renderers/mermaid.ts +53 -0
  995. package/src/interactive/renderers/notice.ts +28 -0
  996. package/src/interactive/renderers/retry-status.ts +31 -0
  997. package/src/interactive/renderers/structured.ts +89 -0
  998. package/src/interactive/renderers/tool-execution.ts +1357 -0
  999. package/src/interactive/renderers/worker-entry.ts +280 -0
  1000. package/src/interactive/session-last-turn.ts +186 -0
  1001. package/src/interactive/session-switch-settlement.ts +10 -0
  1002. package/src/interactive/session-transcript.ts +105 -0
  1003. package/src/interactive/session-usage-reseed.ts +74 -0
  1004. package/src/interactive/slash-autocomplete.ts +256 -0
  1005. package/src/interactive/slash-commands.ts +1407 -0
  1006. package/src/interactive/slash-spec.ts +424 -0
  1007. package/src/interactive/status/controller.ts +260 -0
  1008. package/src/interactive/status/index.ts +23 -0
  1009. package/src/interactive/status/state-machine.ts +530 -0
  1010. package/src/interactive/status/summary.ts +170 -0
  1011. package/src/interactive/status/types.ts +121 -0
  1012. package/src/interactive/status/verbs.ts +163 -0
  1013. package/src/interactive/status/watchdog.ts +24 -0
  1014. package/src/interactive/stdout-backpressure.ts +99 -0
  1015. package/src/interactive/stream-pacer.ts +530 -0
  1016. package/src/interactive/stream-pacing-policy.ts +66 -0
  1017. package/src/interactive/tasks-overlay.ts +540 -0
  1018. package/src/interactive/terminal-lease.ts +485 -0
  1019. package/src/interactive/theme/components.ts +55 -0
  1020. package/src/interactive/theme/glyphs.ts +70 -0
  1021. package/src/interactive/theme/index.ts +15 -0
  1022. package/src/interactive/theme/labels.ts +88 -0
  1023. package/src/interactive/theme/rules.ts +138 -0
  1024. package/src/interactive/theme/segments.ts +88 -0
  1025. package/src/interactive/theme/tokens.ts +121 -0
  1026. package/src/interactive/thinking-level-policy.ts +6 -0
  1027. package/src/interactive/tool-prose-loop.ts +122 -0
  1028. package/src/interactive/tool-prose-registration.ts +48 -0
  1029. package/src/interactive/turn-context.ts +855 -0
  1030. package/src/interactive/turn-middleware.ts +283 -0
  1031. package/src/interactive/turn-persistence.ts +458 -0
  1032. package/src/interactive/turn-queues.ts +181 -0
  1033. package/src/interactive/turn-recovery.ts +323 -0
  1034. package/src/interactive/turn-runtime.ts +869 -0
  1035. package/src/interactive/turn-state.ts +133 -0
  1036. package/src/interactive/view/artifacts.ts +1452 -0
  1037. package/src/interactive/view/view-overlay.ts +735 -0
  1038. package/src/interactive/welcome-dashboard.ts +537 -0
  1039. package/src/interactive/worker-receipts.ts +143 -0
  1040. package/src/interactive/worker-replay.ts +111 -0
  1041. package/src/interactive/worker-share.ts +100 -0
  1042. package/src/interactive/worker-stream.ts +446 -0
  1043. package/src/interactive/workspace-facts.ts +141 -0
  1044. package/src/tools/agent-tools.ts +402 -0
  1045. package/src/tools/artifact.ts +103 -0
  1046. package/src/tools/ask-user.ts +666 -0
  1047. package/src/tools/bash.ts +204 -0
  1048. package/src/tools/bootstrap.ts +77 -0
  1049. package/src/tools/builtin-tool-catalog.ts +265 -0
  1050. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  1051. package/src/tools/codewiki/code-nav.ts +549 -0
  1052. package/src/tools/codewiki/shared.ts +118 -0
  1053. package/src/tools/compete-worktrees.ts +898 -0
  1054. package/src/tools/context/docs-engine.ts +630 -0
  1055. package/src/tools/context/index.ts +514 -0
  1056. package/src/tools/context/surface.ts +19 -0
  1057. package/src/tools/core-bootstrap.ts +168 -0
  1058. package/src/tools/credential-present.ts +151 -0
  1059. package/src/tools/dispatch-admission.ts +533 -0
  1060. package/src/tools/dispatch-arguments.ts +228 -0
  1061. package/src/tools/dispatch-background.ts +54 -0
  1062. package/src/tools/dispatch-event-text.ts +6 -0
  1063. package/src/tools/dispatch-plan.ts +746 -0
  1064. package/src/tools/dispatch-run-events.ts +238 -0
  1065. package/src/tools/dispatch-runner.ts +2370 -0
  1066. package/src/tools/dispatch-scout-admission.ts +295 -0
  1067. package/src/tools/dispatch-scout.ts +461 -0
  1068. package/src/tools/dispatch-types.ts +77 -0
  1069. package/src/tools/dispatch.ts +244 -0
  1070. package/src/tools/edit-diff.ts +534 -0
  1071. package/src/tools/edit.ts +128 -0
  1072. package/src/tools/executables.ts +22 -0
  1073. package/src/tools/file-mutation-queue.ts +35 -0
  1074. package/src/tools/find.ts +294 -0
  1075. package/src/tools/grep.ts +495 -0
  1076. package/src/tools/ignore-policy.ts +169 -0
  1077. package/src/tools/lazy-tool.ts +60 -0
  1078. package/src/tools/ledger.ts +206 -0
  1079. package/src/tools/ls.ts +110 -0
  1080. package/src/tools/monitor-surface.ts +36 -0
  1081. package/src/tools/monitor.ts +767 -0
  1082. package/src/tools/network-policy.ts +29 -0
  1083. package/src/tools/observation.ts +421 -0
  1084. package/src/tools/observers.ts +99 -0
  1085. package/src/tools/path-utils.ts +79 -0
  1086. package/src/tools/policy.ts +154 -0
  1087. package/src/tools/profiles.ts +108 -0
  1088. package/src/tools/read.ts +173 -0
  1089. package/src/tools/registry.ts +1169 -0
  1090. package/src/tools/result-shaping.ts +204 -0
  1091. package/src/tools/safe-exec.ts +128 -0
  1092. package/src/tools/spawn-hygiene.ts +182 -0
  1093. package/src/tools/steer-surface.ts +17 -0
  1094. package/src/tools/steer.ts +77 -0
  1095. package/src/tools/tasks.ts +265 -0
  1096. package/src/tools/truncate-utf8.ts +17 -0
  1097. package/src/tools/truncate.ts +43 -0
  1098. package/src/tools/verify/frontend.ts +687 -0
  1099. package/src/tools/verify/index.ts +31 -0
  1100. package/src/tools/verify/scripts.ts +108 -0
  1101. package/src/tools/verify/surface.ts +46 -0
  1102. package/src/tools/web-fetch-surface.ts +23 -0
  1103. package/src/tools/web-fetch.ts +759 -0
  1104. package/src/tools/worker-evidence.ts +215 -0
  1105. package/src/tools/write.ts +57 -0
  1106. package/src/utils/exif-orientation.ts +192 -0
  1107. package/src/utils/git.ts +24 -0
  1108. package/src/utils/image-resize.ts +148 -0
  1109. package/src/utils/photon.ts +103 -0
  1110. package/src/worker/control-lane.ts +22 -0
  1111. package/src/worker/entry.ts +294 -0
  1112. package/src/worker/event-projection.ts +56 -0
  1113. package/src/worker/heartbeat.ts +24 -0
  1114. package/src/worker/ledger-mirror.ts +95 -0
  1115. package/src/worker/ndjson.ts +40 -0
  1116. package/src/worker/protocol.ts +529 -0
  1117. package/src/worker/resource-facts.ts +79 -0
  1118. package/src/worker/runtime-registry.ts +12 -0
  1119. package/src/worker/spec-contract.ts +675 -0
  1120. package/src/worker/stdin-demux.ts +316 -0
  1121. package/dist/acp-UMLFVA3F.js +0 -92
  1122. package/dist/chunk-262G75JS.js +0 -35
  1123. package/dist/chunk-6CWDTGUC.js +0 -20
  1124. package/dist/chunk-BYEU76JP.js +0 -899
  1125. package/dist/chunk-GNGDQYDU.js +0 -34688
  1126. package/dist/chunk-GOTUR54M.js +0 -9
  1127. package/dist/chunk-NI4DEJMC.js +0 -88
  1128. package/dist/chunk-TPOCL34A.js +0 -2876
  1129. package/dist/chunk-UU3R62TT.js +0 -128
  1130. package/dist/clio-KIQ5SNDS.js +0 -53
  1131. package/dist/configure-G4E3A2PG.js +0 -27
  1132. package/dist/doctor-M5HJJZOL.js +0 -61
  1133. package/dist/domains/agents/builtins/architect.md +0 -33
  1134. package/dist/domains/agents/builtins/coder.md +0 -31
  1135. package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
  1136. package/dist/domains/agents/builtins/debugger.md +0 -30
  1137. package/dist/domains/agents/builtins/documenter.md +0 -31
  1138. package/dist/domains/agents/builtins/git-master.md +0 -30
  1139. package/dist/domains/agents/builtins/provenance.md +0 -30
  1140. package/dist/domains/agents/builtins/researcher.md +0 -71
  1141. package/dist/domains/agents/builtins/scout.md +0 -42
  1142. package/dist/domains/agents/builtins/tester.md +0 -31
  1143. package/dist/domains/agents/builtins/verifier.md +0 -30
  1144. package/dist/domains/agents/builtins/wiki-writer.md +0 -41
  1145. package/dist/fleet-preflight-CLIAX7YR.js +0 -21
  1146. package/dist/preload-KZVHET2B.js +0 -11
  1147. package/dist/version-ROZ6CZKH.js +0 -16
  1148. package/docs/html/agents_blueprint.html +0 -936
  1149. package/docs/html/alcf_blueprint.html +0 -324
  1150. package/docs/html/architecture_blueprint.html +0 -850
  1151. package/docs/html/commands_blueprint.html +0 -794
  1152. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  1153. package/docs/html/configuration_blueprint.html +0 -1080
  1154. package/docs/html/context_blueprint.html +0 -603
  1155. package/docs/html/documentation_blueprint.html +0 -832
  1156. package/docs/html/environment_blueprint.html +0 -404
  1157. package/docs/html/eval_blueprint.html +0 -743
  1158. package/docs/html/evals_internal_blueprint.html +0 -190
  1159. package/docs/html/evolution_blueprint.html +0 -674
  1160. package/docs/html/extensions_blueprint.html +0 -2065
  1161. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  1162. package/docs/html/index.html +0 -919
  1163. package/docs/html/lifecycle_blueprint.html +0 -723
  1164. package/docs/html/memory_blueprint.html +0 -699
  1165. package/docs/html/middleware_blueprint.html +0 -664
  1166. package/docs/html/models_blueprint.html +0 -2366
  1167. package/docs/html/observability_blueprint.html +0 -683
  1168. package/docs/html/provider_adapter_blueprint.html +0 -245
  1169. package/docs/html/safety_blueprint.html +0 -1386
  1170. package/docs/html/shared.css +0 -571
  1171. package/docs/html/shared.js +0 -143
  1172. package/docs/html/skills_blueprint.html +0 -671
  1173. package/docs/html/soak_blueprint.html +0 -182
  1174. package/docs/html/tool_usage_blueprint.html +0 -350
  1175. package/docs/html/tools_blueprint.html +0 -2249
  1176. package/docs/html/trace_blueprint.html +0 -235
  1177. package/docs/html/tui_design_blueprint.html +0 -314
  1178. package/docs/html/validation_blueprint.html +0 -961
  1179. package/docs/html/worker_dispatch_blueprint.html +0 -231
  1180. package/skills/git/commit-crafting/SKILL.md +0 -79
  1181. package/skills/git/commit-crafting/evals.md +0 -92
  1182. package/skills/git/create-pr/SKILL.md +0 -116
  1183. package/skills/git/create-pr/evals.md +0 -114
  1184. package/skills/git/investigate-issue/SKILL.md +0 -139
  1185. package/skills/git/investigate-issue/evals.md +0 -94
  1186. package/skills/git/review-changes/SKILL.md +0 -103
  1187. package/skills/git/review-changes/evals.md +0 -85
@@ -0,0 +1,1882 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-3R73A4XB.js";
5
+
6
+ // src/engine/tui.ts
7
+ init_esm_shims();
8
+ import {
9
+ Box,
10
+ CombinedAutocompleteProvider,
11
+ Container,
12
+ Editor,
13
+ fuzzyFilter,
14
+ getKeybindings,
15
+ Input,
16
+ isKeyRelease,
17
+ KeybindingsManager,
18
+ Markdown,
19
+ Marked,
20
+ matchesKey,
21
+ ProcessTerminal,
22
+ ScrollView,
23
+ setKeybindings,
24
+ stripTerminalSequences,
25
+ Text,
26
+ TUI_KEYBINDINGS,
27
+ TuiAltScreen as TuiAltScreen2,
28
+ TuiMainScreen as TuiMainScreen2,
29
+ truncateToWidth,
30
+ VStack,
31
+ visibleWidth,
32
+ wrapTextWithAnsi
33
+ } from "@earendil-works/pi-tui";
34
+
35
+ // src/engine/instrumented-tui.ts
36
+ init_esm_shims();
37
+ import { TuiAltScreen, TuiMainScreen } from "@earendil-works/pi-tui";
38
+ var DeferredRenderAdmission = class {
39
+ constructor(admission, render) {
40
+ this.admission = admission;
41
+ this.render = render;
42
+ }
43
+ admission;
44
+ render;
45
+ pending = false;
46
+ force = false;
47
+ release = null;
48
+ request(force) {
49
+ if (!this.admission?.blocked) return false;
50
+ this.pending = true;
51
+ this.force ||= force;
52
+ this.release ??= this.admission.onWritable(() => {
53
+ this.release?.();
54
+ this.release = null;
55
+ if (!this.pending) return;
56
+ const pendingForce = this.force;
57
+ this.pending = false;
58
+ this.force = false;
59
+ this.render(pendingForce);
60
+ });
61
+ return true;
62
+ }
63
+ /** A direct/final render supersedes any older request held behind the gate. */
64
+ settled() {
65
+ this.pending = false;
66
+ this.force = false;
67
+ this.release?.();
68
+ this.release = null;
69
+ }
70
+ };
71
+ var InstrumentedTuiMainScreen = class extends TuiMainScreen {
72
+ constructor(terminal, renderObserver, showHardwareCursor, logDirectory, renderAdmission) {
73
+ super(terminal, showHardwareCursor, logDirectory);
74
+ this.renderObserver = renderObserver;
75
+ this.deferredAdmission = new DeferredRenderAdmission(renderAdmission, (force) => super.requestRender(force));
76
+ }
77
+ renderObserver;
78
+ requestRender(force = false) {
79
+ if (!this.deferredAdmission.request(force)) super.requestRender(force);
80
+ }
81
+ doRender() {
82
+ this.deferredAdmission.settled();
83
+ if (this.renderObserver.isEnabled?.() === false) {
84
+ super.doRender();
85
+ return;
86
+ }
87
+ const frame2 = this.renderObserver.beginFrame({
88
+ mode: this.mode,
89
+ columns: this.terminal.columns,
90
+ rows: this.terminal.rows
91
+ });
92
+ this.currentFrame = frame2;
93
+ try {
94
+ super.doRender();
95
+ } finally {
96
+ this.currentFrame = void 0;
97
+ this.renderObserver.endFrame(frame2);
98
+ }
99
+ }
100
+ compositeOverlays(lines, termWidth, termHeight) {
101
+ return this.measure("overlay", () => super.compositeOverlays(lines, termWidth, termHeight));
102
+ }
103
+ applyLineResets(lines) {
104
+ return this.measure("normalization", () => super.applyLineResets(lines));
105
+ }
106
+ extractCursorPosition(lines, height) {
107
+ return this.measure("cursor", () => super.extractCursorPosition(lines, height));
108
+ }
109
+ measure(phase, operation) {
110
+ if (this.renderObserver.isEnabled?.() === false) return operation();
111
+ const frame2 = this.currentFrame;
112
+ if (frame2 === void 0) return operation();
113
+ const phaseToken = this.renderObserver.beginPhase(frame2, phase);
114
+ try {
115
+ return operation();
116
+ } finally {
117
+ this.renderObserver.endPhase(frame2, phase, phaseToken);
118
+ }
119
+ }
120
+ currentFrame;
121
+ deferredAdmission;
122
+ };
123
+ var InstrumentedTuiAltScreen = class extends TuiAltScreen {
124
+ constructor(terminal, renderObserver, showHardwareCursor, logDirectory, options, renderAdmission) {
125
+ super(terminal, showHardwareCursor, logDirectory, options);
126
+ this.renderObserver = renderObserver;
127
+ this.deferredAdmission = new DeferredRenderAdmission(renderAdmission, (force) => super.requestRender(force));
128
+ }
129
+ renderObserver;
130
+ currentFrame;
131
+ requestRender(force = false) {
132
+ if (!this.deferredAdmission.request(force)) super.requestRender(force);
133
+ }
134
+ doRender() {
135
+ this.deferredAdmission.settled();
136
+ if (this.renderObserver.isEnabled?.() === false) {
137
+ super.doRender();
138
+ return;
139
+ }
140
+ const frame2 = this.renderObserver.beginFrame({
141
+ mode: this.mode,
142
+ columns: this.terminal.columns,
143
+ rows: this.terminal.rows
144
+ });
145
+ this.currentFrame = frame2;
146
+ try {
147
+ super.doRender();
148
+ } finally {
149
+ this.currentFrame = void 0;
150
+ this.renderObserver.endFrame(frame2);
151
+ }
152
+ }
153
+ compositeOverlays(lines, termWidth, termHeight) {
154
+ return this.measure("overlay", () => super.compositeOverlays(lines, termWidth, termHeight));
155
+ }
156
+ applyLineResets(lines) {
157
+ return this.measure("normalization", () => super.applyLineResets(lines));
158
+ }
159
+ extractCursorPosition(lines, height) {
160
+ return this.measure("cursor", () => super.extractCursorPosition(lines, height));
161
+ }
162
+ measure(phase, operation) {
163
+ if (this.renderObserver.isEnabled?.() === false) return operation();
164
+ const frame2 = this.currentFrame;
165
+ if (frame2 === void 0) return operation();
166
+ const phaseToken = this.renderObserver.beginPhase(frame2, phase);
167
+ try {
168
+ return operation();
169
+ } finally {
170
+ this.renderObserver.endPhase(frame2, phase, phaseToken);
171
+ }
172
+ }
173
+ deferredAdmission;
174
+ };
175
+
176
+ // src/engine/select-list.ts
177
+ init_esm_shims();
178
+ import {
179
+ SelectList as EngineSelectList
180
+ } from "@earendil-works/pi-tui";
181
+ var PI_SELECT_CURSOR = "\u2192";
182
+ var ESC = String.fromCharCode(27);
183
+ var LEADING_CURSOR_PATTERN = new RegExp(`^((?:${ESC}\\[[0-9;]*m)*)${PI_SELECT_CURSOR} `);
184
+ var SelectList = class extends EngineSelectList {
185
+ designCursor;
186
+ constructor(items, maxVisible, theme, layout) {
187
+ super(items, maxVisible, theme, layout);
188
+ this.designCursor = theme.cursor;
189
+ }
190
+ render(width) {
191
+ const lines = super.render(width);
192
+ const cursor = this.designCursor;
193
+ if (!cursor || cursor === PI_SELECT_CURSOR) return lines;
194
+ return lines.map((line) => line.replace(LEADING_CURSOR_PATTERN, `$1${cursor} `));
195
+ }
196
+ };
197
+
198
+ // src/engine/tui.ts
199
+ function createAgentProgress(terminal) {
200
+ let active = false;
201
+ return {
202
+ start() {
203
+ if (active) return;
204
+ active = true;
205
+ terminal.setProgress(true);
206
+ },
207
+ stop() {
208
+ if (!active) return;
209
+ active = false;
210
+ terminal.setProgress(false);
211
+ },
212
+ isActive() {
213
+ return active;
214
+ }
215
+ };
216
+ }
217
+
218
+ // src/interactive/theme/glyphs.ts
219
+ init_esm_shims();
220
+ var GLYPH = {
221
+ // Clio wordmark, shown in the welcome and dashboard headers only.
222
+ brand: ">C_",
223
+ // Agent voice glyph for the chat reply prefix. It renders in accent on a
224
+ // normal turn and error red on a failed one. The `>C_` wordmark is no longer
225
+ // the reply prefix; it survives only in the two headers above.
226
+ agent: "\u2726",
227
+ user: "\u203A",
228
+ // Selection focus marker for list overlays. It is deliberately distinct from
229
+ // the tool ledger's toolHeader so a focused row never reads as a tool line.
230
+ cursor: "\u276F",
231
+ toolHeader: "\u25B8",
232
+ running: "\u25CF",
233
+ queued: "\u25CC",
234
+ speed: "\u26A1",
235
+ ok: "\u2713",
236
+ error: "\u2717",
237
+ cancelled: "\u2298",
238
+ active: "\u25C6",
239
+ scoped: "\u25C7",
240
+ up: "\u2191",
241
+ down: "\u2193",
242
+ rail: "\u2502",
243
+ innerDivider: "\u254C",
244
+ barFull: "\u2588",
245
+ barEmpty: "\u2591",
246
+ contextFull: "\u25B0",
247
+ contextFree: "\u25B1",
248
+ // Autocompact reserve cells: held-back headroom is neither used nor free,
249
+ // so it carries its own glyph and never reads as filled when only color is
250
+ // lost. The medium-shade block is single-width in the same fonts that carry
251
+ // the barFull/barEmpty fallbacks.
252
+ contextReserve: "\u2592",
253
+ info: "\u2139",
254
+ warn: "\u26A0",
255
+ warnInline: "!",
256
+ phaseWaiting: "\u25D4",
257
+ phaseThinking: "\u25D0",
258
+ phaseWriting: "\u25D1",
259
+ phaseTool: "\u2699",
260
+ phaseBlocked: "\u23F8",
261
+ phaseRetry: "\u21BB",
262
+ phaseCompact: "\u267B",
263
+ phaseDispatch: "\u21F2",
264
+ // Marks a run that Clio started for itself (a shadow worker or an internal
265
+ // harness run) so internal activity reads as a sub-process of the current
266
+ // turn. It replaces the old `sh:`/`in:` agent-name prefixes; the two
267
+ // audiences are told apart by tone, not by a second glyph.
268
+ subProcess: "\u21B3",
269
+ // Who asked for a dispatched run. Hollow is the operator's own (/run,
270
+ // /delegate); filled is one the model started by calling a dispatch tool.
271
+ // The transcript block, the board row, and the footer count share the pair,
272
+ // so a running ◇ anywhere is work the operator started themselves.
273
+ workerHuman: "\u25C7",
274
+ workerAgent: "\u25C6",
275
+ // A run neither the operator nor the model asked for: wiki documenting, a
276
+ // bootstrap scout, a judge. It stays off the transcript entirely, so the
277
+ // board is the only surface that shows it and it gets the quietest mark
278
+ // that still holds the origin column.
279
+ workerInternal: "\xB7",
280
+ ellipsis: "\u2026",
281
+ favorite: "\u2605"
282
+ };
283
+ var SPINNER_FRAMES = ["\u28FE", "\u28FD", "\u28FB", "\u28BF", "\u287F", "\u28DF", "\u28EF", "\u28F7"];
284
+ function spinnerFrame(tick) {
285
+ const index = (tick % SPINNER_FRAMES.length + SPINNER_FRAMES.length) % SPINNER_FRAMES.length;
286
+ return SPINNER_FRAMES[index] ?? SPINNER_FRAMES[0];
287
+ }
288
+
289
+ // src/interactive/theme/index.ts
290
+ init_esm_shims();
291
+
292
+ // src/interactive/theme/tokens.ts
293
+ init_esm_shims();
294
+ var TOKENS = {
295
+ accent: { rgb: [70, 229, 208], xterm: 80 },
296
+ accentDeep: { rgb: [31, 183, 166], xterm: 44 },
297
+ // Second brand color: neon orange. The token name teaches the rule: orange
298
+ // means Clio is acting. It fires only for Clio's signature actions
299
+ // (dispatching, queued and running fleet work, steering) and for the border
300
+ // of a prompt that has taken the keyboard and is waiting on a decision, never
301
+ // as decoration, and never a metric, at most one orange element per region of
302
+ // the screen. warning stays the soft amber for actual warnings.
303
+ action: { rgb: [255, 126, 41], xterm: 208 },
304
+ success: { rgb: [87, 227, 137], xterm: 114 },
305
+ warning: { rgb: [255, 180, 84], xterm: 221 },
306
+ error: { rgb: [255, 92, 102], xterm: 203 },
307
+ info: { rgb: [91, 168, 255], xterm: 75 },
308
+ reason: { rgb: [157, 140, 255], xterm: 141 },
309
+ dim: { rgb: [106, 122, 133], xterm: 59 },
310
+ muted: { rgb: [138, 153, 164], xterm: 102 },
311
+ title: { rgb: [70, 229, 208], xterm: 80 },
312
+ frame: { rgb: [47, 93, 90], xterm: 23 },
313
+ frameStrong: { rgb: [42, 171, 158], xterm: 37 }
314
+ };
315
+ var SGR_RESET = "\x1B[0m";
316
+ var SGR_DIM = "\x1B[2m";
317
+ function colorDisabled(env = process.env) {
318
+ const raw = env.NO_COLOR;
319
+ return typeof raw === "string" && raw.length > 0;
320
+ }
321
+ function detectTruecolor(env = process.env) {
322
+ const colorTerm = (env.COLORTERM ?? "").toLowerCase();
323
+ if (colorTerm.includes("truecolor") || colorTerm.includes("24bit")) return true;
324
+ const term = (env.TERM ?? "").toLowerCase();
325
+ return term.includes("truecolor") || term.includes("24bit");
326
+ }
327
+ function fgCode(color, truecolor) {
328
+ return truecolor ? `38;2;${color.rgb[0]};${color.rgb[1]};${color.rgb[2]}` : `38;5;${color.xterm}`;
329
+ }
330
+ function bgCode(color, truecolor) {
331
+ return truecolor ? `48;2;${color.rgb[0]};${color.rgb[1]};${color.rgb[2]}` : `48;5;${color.xterm}`;
332
+ }
333
+ function fgSequence(token, truecolor = detectTruecolor()) {
334
+ if (colorDisabled()) return "";
335
+ return `\x1B[${fgCode(TOKENS[token], truecolor)}m`;
336
+ }
337
+ function createClioTheme(options = {}) {
338
+ const truecolor = options.truecolor ?? detectTruecolor();
339
+ const color = options.color ?? !colorDisabled();
340
+ const paint = (text, mods) => {
341
+ const codes = [];
342
+ if (mods.bold) codes.push("1");
343
+ if (mods.dim) codes.push("2");
344
+ if (mods.italic) codes.push("3");
345
+ if (mods.underline) codes.push("4");
346
+ if (color && mods.fg) codes.push(fgCode(TOKENS[mods.fg], truecolor));
347
+ if (color && mods.bg) codes.push(bgCode(TOKENS[mods.bg], truecolor));
348
+ if (codes.length === 0) return text;
349
+ return `\x1B[${codes.join(";")}m${text}${SGR_RESET}`;
350
+ };
351
+ return {
352
+ truecolor,
353
+ paint,
354
+ fg: (token, text) => paint(text, { fg: token }),
355
+ bg: (token, text) => paint(text, { bg: token }),
356
+ style: (token, text, mods = {}) => paint(text, { ...mods, fg: token }),
357
+ fgSequence: (token) => color ? `\x1B[${fgCode(TOKENS[token], truecolor)}m` : ""
358
+ };
359
+ }
360
+
361
+ // src/interactive/theme/components.ts
362
+ init_esm_shims();
363
+
364
+ // src/interactive/theme/segments.ts
365
+ init_esm_shims();
366
+ function present(parts) {
367
+ return parts.filter((part) => typeof part === "string" && part.length > 0);
368
+ }
369
+ function brandMark(theme) {
370
+ const prompt = GLYPH.brand.slice(0, 1);
371
+ const initial = GLYPH.brand.slice(1, 2);
372
+ const cursor = GLYPH.brand.slice(2, 3);
373
+ return `${theme.fg("dim", prompt)}${theme.style("accent", initial, { bold: true })}${theme.fg("dim", cursor)}`;
374
+ }
375
+ function dotSep(theme) {
376
+ return theme.fg("dim", " \xB7 ");
377
+ }
378
+ function barSep(theme) {
379
+ return theme.fg("frame", " \u2502 ");
380
+ }
381
+ function sectionTag(theme, token, label, pad = 0) {
382
+ const text = pad > 0 ? label.padEnd(pad) : label;
383
+ return theme.style(token, text, { bold: true });
384
+ }
385
+ function screenTitle(theme, label) {
386
+ return theme.style("title", label, { bold: true });
387
+ }
388
+ function listGroupHeader(theme, label) {
389
+ return theme.fg("dim", `\u2500\u2500 ${label}`);
390
+ }
391
+ function joinChips(theme, parts) {
392
+ return present(parts).join(dotSep(theme));
393
+ }
394
+ function joinSections(theme, parts) {
395
+ return present(parts).join(barSep(theme));
396
+ }
397
+
398
+ // src/interactive/theme/components.ts
399
+ var identity = (text) => text;
400
+ function markdownTheme(theme, highlightCode) {
401
+ return {
402
+ heading: (text) => screenTitle(theme, text),
403
+ link: (text) => theme.fg("info", text),
404
+ linkUrl: (text) => theme.fg("dim", text),
405
+ code: (text) => theme.fg("muted", text),
406
+ codeBlock: (text) => text,
407
+ codeBlockBorder: (text) => theme.fg("frame", text),
408
+ quote: (text) => theme.fg("muted", text),
409
+ quoteBorder: (text) => theme.fg("frame", text),
410
+ hr: (text) => theme.fg("frame", text),
411
+ listBullet: (text) => theme.fg("accent", text),
412
+ bold: (text) => theme.paint(text, { bold: true }),
413
+ italic: (text) => theme.paint(text, { italic: true }),
414
+ strikethrough: identity,
415
+ underline: (text) => theme.paint(text, { underline: true }),
416
+ ...highlightCode ? { highlightCode } : {}
417
+ };
418
+ }
419
+ function selectListTheme(theme) {
420
+ return {
421
+ // The design cursor the engine SelectList swaps in for pi-tui's arrow.
422
+ cursor: GLYPH.cursor,
423
+ selectedPrefix: (text) => theme.fg("accent", text),
424
+ selectedText: (text) => theme.style("accent", text, { bold: true }),
425
+ description: (text) => theme.fg("muted", text),
426
+ scrollInfo: (text) => theme.fg("dim", text),
427
+ noMatch: (text) => theme.fg("warning", text)
428
+ };
429
+ }
430
+ function settingsListTheme(theme) {
431
+ return {
432
+ label: (text, selected) => selected ? theme.style("accent", text, { bold: true }) : text,
433
+ value: (text, selected) => selected ? theme.fg("success", text) : theme.fg("muted", text),
434
+ description: (text) => theme.fg("muted", text),
435
+ cursor: GLYPH.cursor,
436
+ hint: (text) => theme.fg("dim", text)
437
+ };
438
+ }
439
+ function editorTheme(theme) {
440
+ return {
441
+ borderColor: (text) => theme.style("frameStrong", text, { bold: true }),
442
+ selectList: selectListTheme(theme)
443
+ };
444
+ }
445
+
446
+ // src/interactive/theme/labels.ts
447
+ init_esm_shims();
448
+ function abbreviateModelId(modelId) {
449
+ const base = (modelId ?? "").trim().split("/").filter(Boolean).pop() ?? "";
450
+ if (base.length === 0) return "model";
451
+ const parts = base.split("-").filter((part) => part.length > 0);
452
+ if (parts.length <= 1) return base.length > 18 ? base.slice(0, 18) : base;
453
+ const kept = [];
454
+ for (const part of parts) {
455
+ const next = [...kept, part].join("-");
456
+ if (kept.length > 0 && next.length > 18) break;
457
+ kept.push(part);
458
+ }
459
+ const joined = kept.join("-");
460
+ return joined.length > 18 ? joined.slice(0, 18) : joined;
461
+ }
462
+ function formatTargetLabel(targetId, modelId, options = {}) {
463
+ const target = (targetId ?? "").trim();
464
+ const model = (modelId ?? "").trim();
465
+ if (target.length === 0 && model.length === 0) return "not configured";
466
+ const shown = options.abbreviate === false ? model : abbreviateModelId(model);
467
+ if (target.length === 0) return `no target \xB7 ${shown}`;
468
+ if (model.length === 0) return `${target} \xB7 no model`;
469
+ return `${target}${options.separator ?? " \xB7 "}${shown}`;
470
+ }
471
+ function formatCompactMs(value) {
472
+ const ms = Math.max(0, Math.round(value));
473
+ if (ms < 1e3) return `${ms}ms`;
474
+ const seconds = ms / 1e3;
475
+ return seconds < 60 ? `${seconds.toFixed(seconds >= 10 ? 0 : 1)}s` : `${Math.floor(seconds / 60)}m${Math.round(seconds % 60)}s`;
476
+ }
477
+ function formatContextPercent(percent) {
478
+ return typeof percent === "number" && Number.isFinite(percent) ? `${percent.toFixed(1)}%` : "?%";
479
+ }
480
+ function collapseHomePath(path) {
481
+ const home = process.env.HOME;
482
+ if (!home || home.length === 0) return path;
483
+ if (path === home) return "~";
484
+ return path.startsWith(`${home}/`) ? `~/${path.slice(home.length + 1)}` : path;
485
+ }
486
+
487
+ // src/interactive/theme/rules.ts
488
+ init_esm_shims();
489
+ function padAnsi(text, width, ellipsis = "") {
490
+ return truncateToWidth(text, Math.max(0, width), ellipsis, true);
491
+ }
492
+ function fitUnits(theme, prefix, units, maxWidth) {
493
+ const sep = " \xB7 ";
494
+ let line = prefix;
495
+ for (let index = 0; index < units.length; index += 1) {
496
+ const candidate = index === 0 ? `${line}${units[index]}` : `${line}${sep}${units[index]}`;
497
+ const reserve = index < units.length - 1 ? 2 : 0;
498
+ if (visibleWidth(candidate) + reserve > maxWidth) {
499
+ if (index === 0) return truncateToWidth(candidate, Math.max(0, maxWidth), "\u2026", false);
500
+ return `${line} ${theme.fg("dim", "\u2026")}`;
501
+ }
502
+ line = candidate;
503
+ }
504
+ return line;
505
+ }
506
+ function rule(theme, width, options = {}) {
507
+ const safeWidth = Math.max(0, width);
508
+ if (safeWidth === 0) return "";
509
+ const left = options.left ? `${theme.style(options.leftToken ?? "accent", options.left, { bold: true })} ` : "";
510
+ const rightBody = options.rightRaw ? options.right : theme.fg(options.rightToken ?? "muted", options.right ?? "");
511
+ const right = options.right ? ` ${rightBody} ${options.rightTail ?? ""}` : "";
512
+ const labelsWidth = visibleWidth(left) + visibleWidth(right);
513
+ if (labelsWidth >= safeWidth) return truncateToWidth(`${left}${right}`.trim(), safeWidth, "", true);
514
+ const fill = theme.style(options.fillToken ?? "frame", "\u2500".repeat(safeWidth - labelsWidth), {
515
+ bold: options.fillToken === "frameStrong"
516
+ });
517
+ return `${left}${fill}${right}`;
518
+ }
519
+ function frame(theme, title, lines, width, opts = {}) {
520
+ const safeWidth = Math.max(4, width);
521
+ const contentWidth = Math.max(0, safeWidth - 4);
522
+ const frameFg = (text) => theme.fg("frame", text);
523
+ const hasTitle = title.length > 0;
524
+ const styledTitle = !hasTitle ? "" : title.includes("\x1B") ? title : theme.style("title", title, { bold: true });
525
+ const titleWidth = visibleWidth(title);
526
+ const meta = opts.rightMeta ?? "";
527
+ const hasMeta = meta.length > 0;
528
+ const metaWidth = hasMeta ? visibleWidth(meta) : 0;
529
+ const leftVisible = 2 + (hasTitle ? titleWidth + 2 : 0);
530
+ const rightVisible = hasMeta ? metaWidth + 4 : 1;
531
+ const fillWidth = Math.max(0, safeWidth - leftVisible - rightVisible);
532
+ const leftStr = hasTitle ? `${frameFg("\u250C\u2500")} ${styledTitle} ` : frameFg("\u250C\u2500");
533
+ const rightStr = hasMeta ? ` ${theme.fg("dim", meta)} ${frameFg("\u2500\u2510")}` : frameFg("\u2510");
534
+ const top = `${leftStr}${frameFg("\u2500".repeat(fillWidth))}${rightStr}`;
535
+ const body = lines.map((line) => `${frameFg("\u2502")} ${padAnsi(line, contentWidth)} ${frameFg("\u2502")}`);
536
+ const bottom = `${frameFg("\u2514")}${frameFg("\u2500".repeat(safeWidth - 2))}${frameFg("\u2518")}`;
537
+ return [top, ...body, bottom];
538
+ }
539
+ function innerDivider(theme, width) {
540
+ return theme.fg("frame", GLYPH.innerDivider.repeat(Math.max(0, width)));
541
+ }
542
+
543
+ // src/interactive/theme/index.ts
544
+ var sharedTheme = null;
545
+ function clioTheme() {
546
+ sharedTheme ??= createClioTheme();
547
+ return sharedTheme;
548
+ }
549
+
550
+ // src/interactive/clio-editor.ts
551
+ init_esm_shims();
552
+ var REVERSE_VIDEO_BLANK = `${String.fromCharCode(27)}[7m ${String.fromCharCode(27)}[0m`;
553
+ var EMPTY_PROMPT = "Ask Clio\u2026 / for commands";
554
+ var MIN_HINT_WIDTH = 60;
555
+ function hasScrollIndicator(line) {
556
+ const stripped = stripTerminalSequences(line);
557
+ return stripped.includes(GLYPH.up) || stripped.includes(GLYPH.down);
558
+ }
559
+ function normalizeThinkingHint(value) {
560
+ return value.replace(/^think\s+/i, "").trim().toLowerCase();
561
+ }
562
+ function styledThinkingHint(theme, value) {
563
+ const hint = normalizeThinkingHint(value);
564
+ switch (hint) {
565
+ case "off":
566
+ return theme.fg("dim", hint);
567
+ case "minimal":
568
+ case "low":
569
+ return theme.fg("muted", hint);
570
+ case "xhigh":
571
+ case "max":
572
+ case "on":
573
+ return theme.style("reason", hint, { bold: true });
574
+ default:
575
+ return theme.fg("reason", hint);
576
+ }
577
+ }
578
+ function styledRailLabel(theme, chrome) {
579
+ return `${theme.fg("dim", chrome.getModelLabel())} ${theme.fg("dim", "\xB7")} ${styledThinkingHint(theme, chrome.getThinkingLabel())}`;
580
+ }
581
+ function composerMode(chrome, text) {
582
+ if (!(chrome.isStreaming?.() ?? false)) return "MESSAGE";
583
+ const willSteer = chrome.willEnterSteer?.(text) ?? text.trim().length > 0;
584
+ return willSteer ? "STEER" : "FOLLOW-UP";
585
+ }
586
+ function lowerRailHint(theme, chrome) {
587
+ return theme.fg(
588
+ "dim",
589
+ `${chrome.getSubmitKeyLabel?.() ?? "Enter"} send \xB7 ${chrome.getNewlineKeyLabel?.() ?? "Shift+Enter"} newline`
590
+ );
591
+ }
592
+ function renderEmptyPrompt(line, width, theme) {
593
+ const cursorAt = line.indexOf(REVERSE_VIDEO_BLANK);
594
+ if (cursorAt < 0) return line;
595
+ const afterCursorAt = cursorAt + REVERSE_VIDEO_BLANK.length;
596
+ const available = Math.max(0, width - 1);
597
+ const prompt = truncateToWidth(theme.fg("dim", EMPTY_PROMPT), available, "\u2026", false);
598
+ const consumed = visibleWidth(prompt);
599
+ return `${line.slice(0, afterCursorAt)}${prompt}${line.slice(afterCursorAt + consumed)}`;
600
+ }
601
+ function findBottomRail(lines, width) {
602
+ const rail = "\u2500".repeat(Math.max(0, width));
603
+ for (let index = 1; index < lines.length; index += 1) {
604
+ if (stripTerminalSequences(lines[index] ?? "") === rail) return index;
605
+ }
606
+ return -1;
607
+ }
608
+ var ClioEditor = class extends Editor {
609
+ constructor(tui, chrome) {
610
+ super(tui, editorTheme(clioTheme()));
611
+ this.chrome = chrome;
612
+ }
613
+ chrome;
614
+ render(width) {
615
+ const lines = super.render(width);
616
+ if (lines.length === 0) return lines;
617
+ const theme = clioTheme();
618
+ const safeWidth = Math.max(0, width);
619
+ const text = this.getText();
620
+ const mode = composerMode(this.chrome, text);
621
+ if (hasScrollIndicator(lines[0] ?? "")) {
622
+ const modeLabel = theme.style(mode === "STEER" ? "action" : "accentDeep", mode, { bold: true });
623
+ lines[0] = truncateToWidth(`${modeLabel} ${lines[0] ?? ""}`, safeWidth, "", true);
624
+ } else {
625
+ lines[0] = rule(theme, safeWidth, {
626
+ left: mode,
627
+ leftToken: mode === "STEER" ? "action" : "accentDeep",
628
+ right: styledRailLabel(theme, this.chrome),
629
+ fillToken: "frameStrong",
630
+ rightRaw: true,
631
+ rightTail: theme.style("frameStrong", "\u2500", { bold: true })
632
+ });
633
+ }
634
+ if (text.length === 0 && lines[1]) lines[1] = renderEmptyPrompt(lines[1], safeWidth, theme);
635
+ const bottomRail = findBottomRail(lines, safeWidth);
636
+ if (bottomRail >= 0 && safeWidth >= MIN_HINT_WIDTH) {
637
+ lines[bottomRail] = rule(theme, safeWidth, {
638
+ right: lowerRailHint(theme, this.chrome),
639
+ fillToken: "frameStrong",
640
+ rightRaw: true,
641
+ rightTail: theme.style("frameStrong", "\u2500", { bold: true })
642
+ });
643
+ }
644
+ return lines;
645
+ }
646
+ /**
647
+ * pi-tui's bracketed-paste handling inserts pasted text (including a
648
+ * trailing newline the paste carried) without submitting: a pasted
649
+ * `/model\n` lands as two lines in the buffer and just sits there. Once
650
+ * the base handler has applied a chunk that closed a paste, check whether
651
+ * the buffer now reads as a completed slash command and, if so, submit it
652
+ * through the same handler the typed-Enter path uses.
653
+ */
654
+ handleInput(data) {
655
+ const closedPaste = data.includes("\x1B[201~");
656
+ super.handleInput(data);
657
+ if (!closedPaste) return;
658
+ const text = this.getText();
659
+ if (!text.endsWith("\n")) return;
660
+ const command = text.trimEnd();
661
+ if (!command.startsWith("/")) return;
662
+ this.setText("");
663
+ this.onSubmit?.(command);
664
+ }
665
+ };
666
+
667
+ // src/interactive/interactive-shell.ts
668
+ init_esm_shims();
669
+
670
+ // src/interactive/render-trace.ts
671
+ init_esm_shims();
672
+ import { mkdirSync, writeFileSync } from "node:fs";
673
+ import { appendFile } from "node:fs/promises";
674
+ import { dirname } from "node:path";
675
+ var RENDER_TRACE_VERSION = 2;
676
+ function createAsyncTraceWriter(path, options = {}) {
677
+ const maxRecords = options.maxRecords ?? 4096;
678
+ const batchRecords = options.batchRecords ?? 128;
679
+ const append = options.append ?? ((target, payload) => appendFile(target, payload, "utf8"));
680
+ const recordTime = options.recordTime ?? (() => performance.now());
681
+ const appendTimeoutMs = options.appendTimeoutMs ?? 5e3;
682
+ const pending = [];
683
+ let dropped = 0;
684
+ let inFlight = false;
685
+ let scheduled = false;
686
+ let failed = false;
687
+ let closing = false;
688
+ let closePromise = null;
689
+ let resolveClose = null;
690
+ const settleClose = () => {
691
+ if (closing && !inFlight && pending.length === 0) resolveClose?.();
692
+ };
693
+ const pump = () => {
694
+ scheduled = false;
695
+ if (failed || inFlight || pending.length === 0) {
696
+ settleClose();
697
+ return;
698
+ }
699
+ inFlight = true;
700
+ const payload = pending.splice(0, batchRecords).join("");
701
+ let appendTimer = null;
702
+ const appendDeadline = new Promise((_resolve, reject) => {
703
+ appendTimer = setTimeout(() => reject(new Error("render trace append timed out")), appendTimeoutMs);
704
+ });
705
+ void Promise.race([append(path, payload), appendDeadline]).catch(() => {
706
+ failed = true;
707
+ pending.length = 0;
708
+ }).finally(() => {
709
+ if (appendTimer) clearTimeout(appendTimer);
710
+ inFlight = false;
711
+ if (pending.length > 0 && !failed) queueMicrotask(pump);
712
+ else settleClose();
713
+ });
714
+ };
715
+ const schedule = () => {
716
+ if (scheduled || inFlight || failed) return;
717
+ scheduled = true;
718
+ queueMicrotask(pump);
719
+ };
720
+ return {
721
+ enqueue(record) {
722
+ if (failed || closing) return;
723
+ if (pending.length >= maxRecords) {
724
+ pending.shift();
725
+ dropped += 1;
726
+ }
727
+ pending.push(`${JSON.stringify(record)}
728
+ `);
729
+ schedule();
730
+ },
731
+ close() {
732
+ if (closePromise) return closePromise;
733
+ if (dropped > 0 && !failed) {
734
+ pending.push(
735
+ `${JSON.stringify({ type: "trace_drop", version: RENDER_TRACE_VERSION, at: recordTime(), records: dropped })}
736
+ `
737
+ );
738
+ }
739
+ closing = true;
740
+ closePromise = new Promise((resolve) => {
741
+ resolveClose = resolve;
742
+ });
743
+ if (failed) {
744
+ pending.length = 0;
745
+ resolveClose?.();
746
+ } else {
747
+ schedule();
748
+ settleClose();
749
+ }
750
+ return closePromise;
751
+ }
752
+ };
753
+ }
754
+ function rounded(value) {
755
+ return Math.round(value * 1e3) / 1e3;
756
+ }
757
+ function graphemeCount(text) {
758
+ const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
759
+ let count = 0;
760
+ for (const _part of segmenter.segment(text)) count += 1;
761
+ return count;
762
+ }
763
+ function renderTracePath(env = process.env) {
764
+ const raw = env.CLIO_CODER_RENDER_TRACE?.trim();
765
+ return raw && raw.length > 0 ? raw : null;
766
+ }
767
+ function createRenderTrace(path, now = () => performance.now(), writerOptions = {}) {
768
+ mkdirSync(dirname(path), { recursive: true });
769
+ writeFileSync(path, "", "utf8");
770
+ const openedAt = now();
771
+ const at = () => rounded(now() - openedAt);
772
+ const writer = createAsyncTraceWriter(path, { ...writerOptions, recordTime: at });
773
+ let frameSeq = 0;
774
+ let writeSeq = 0;
775
+ let eventSeq = 0;
776
+ let inputSeq = 0;
777
+ let generation = 0;
778
+ let panelHighWater = 0;
779
+ let inputHighWater = 0;
780
+ let queueDepth = 0;
781
+ let currentFrame = null;
782
+ let pendingPanel = null;
783
+ let lastCommitAt = null;
784
+ let firstCommitListener = null;
785
+ let firstCommitDelivered = false;
786
+ const ranges = /* @__PURE__ */ new Map();
787
+ const pendingDrains = /* @__PURE__ */ new Map();
788
+ writer.enqueue({ type: "trace_start", version: RENDER_TRACE_VERSION, at: 0 });
789
+ const trace = {
790
+ recordPanelRender(metrics) {
791
+ pendingPanel = metrics;
792
+ },
793
+ beginGeneration() {
794
+ generation += 1;
795
+ ranges.clear();
796
+ },
797
+ recordVisibleEvent(fields) {
798
+ eventSeq += 1;
799
+ const key = `${generation}:${fields.kind}:${fields.contentIndex}`;
800
+ const previous = ranges.get(key) ?? { codeUnits: 0, graphemes: 0 };
801
+ const graphemes = graphemeCount(fields.delta);
802
+ const next = { codeUnits: previous.codeUnits + fields.delta.length, graphemes: previous.graphemes + graphemes };
803
+ ranges.set(key, next);
804
+ writer.enqueue({
805
+ type: "event_ingress",
806
+ version: RENDER_TRACE_VERSION,
807
+ eventSeq,
808
+ generation,
809
+ kind: fields.kind,
810
+ contentIndex: fields.contentIndex,
811
+ at: at(),
812
+ codeUnitStart: previous.codeUnits,
813
+ codeUnitEnd: next.codeUnits,
814
+ graphemeStart: previous.graphemes,
815
+ graphemeEnd: next.graphemes,
816
+ bytes: Buffer.byteLength(fields.delta, "utf8")
817
+ });
818
+ return eventSeq;
819
+ },
820
+ recordQueue(sequence, action) {
821
+ queueDepth = Math.max(0, queueDepth + (action === "admit" ? 1 : -1));
822
+ writer.enqueue({
823
+ type: "queue",
824
+ version: RENDER_TRACE_VERSION,
825
+ eventSeq: sequence,
826
+ action,
827
+ at: at(),
828
+ depth: queueDepth
829
+ });
830
+ },
831
+ recordPanelApplied(sequence) {
832
+ panelHighWater = Math.max(panelHighWater, sequence);
833
+ writer.enqueue({
834
+ type: "panel",
835
+ version: RENDER_TRACE_VERSION,
836
+ eventSeq: sequence,
837
+ at: at(),
838
+ highWater: panelHighWater
839
+ });
840
+ },
841
+ recordInputIngress(action, bytes, visualExpected = action !== "no-visual-change") {
842
+ inputSeq += 1;
843
+ if (visualExpected) inputHighWater = inputSeq;
844
+ writer.enqueue({
845
+ type: "input_ingress",
846
+ version: RENDER_TRACE_VERSION,
847
+ inputSeq,
848
+ action,
849
+ at: at(),
850
+ bytes,
851
+ visualExpected
852
+ });
853
+ return inputSeq;
854
+ },
855
+ beginFrame(fields) {
856
+ frameSeq += 1;
857
+ const frame2 = {
858
+ frameId: frameSeq,
859
+ ...fields,
860
+ beginAt: at(),
861
+ panelHighWater,
862
+ inputHighWater,
863
+ panel: pendingPanel,
864
+ phases: { component: 0, overlay: 0, normalization: 0, cursor: 0 },
865
+ commits: []
866
+ };
867
+ pendingPanel = null;
868
+ currentFrame = frame2;
869
+ return frame2;
870
+ },
871
+ endFrame(frameToken) {
872
+ const frame2 = frameToken;
873
+ const endAt = at();
874
+ const terminalEnqueueMs = frame2.commits.reduce((sum, commit) => sum + commit.enqueueMs, 0);
875
+ const measured = frame2.phases.component + frame2.phases.overlay + frame2.phases.normalization + frame2.phases.cursor + terminalEnqueueMs;
876
+ const record = {
877
+ type: "frame",
878
+ version: RENDER_TRACE_VERSION,
879
+ frameId: frame2.frameId,
880
+ mode: frame2.mode,
881
+ columns: frame2.columns,
882
+ rows: frame2.rows,
883
+ beginAt: frame2.beginAt,
884
+ endAt,
885
+ durationMs: rounded(Math.max(0, endAt - frame2.beginAt)),
886
+ sinceLastCommitMs: lastCommitAt === null || frame2.commits.length === 0 ? null : rounded(Math.max(0, (frame2.commits[0]?.at ?? endAt) - lastCommitAt)),
887
+ panelHighWater: frame2.panelHighWater,
888
+ inputHighWater: frame2.inputHighWater,
889
+ panel: frame2.panel,
890
+ pipeline: {
891
+ componentMs: rounded(frame2.phases.component),
892
+ overlayCompositionMs: rounded(frame2.phases.overlay),
893
+ normalizationMs: rounded(frame2.phases.normalization),
894
+ cursorExtractionMs: rounded(frame2.phases.cursor),
895
+ viewportDiffAnsiCursorMs: rounded(Math.max(0, endAt - frame2.beginAt - measured)),
896
+ terminalEnqueueMs: rounded(terminalEnqueueMs)
897
+ },
898
+ commits: frame2.commits
899
+ };
900
+ writer.enqueue(record);
901
+ if (frame2.commits.length > 0) {
902
+ lastCommitAt = frame2.commits.at(-1)?.at ?? endAt;
903
+ if (!firstCommitDelivered) {
904
+ firstCommitDelivered = true;
905
+ firstCommitListener?.(frame2.frameId);
906
+ }
907
+ }
908
+ if (currentFrame === frame2) currentFrame = null;
909
+ },
910
+ beginPhase(_frame, _phase) {
911
+ return now();
912
+ },
913
+ endPhase(frameToken, phase, phaseToken) {
914
+ const frame2 = frameToken;
915
+ frame2.phases[phase] += Math.max(0, now() - phaseToken);
916
+ },
917
+ beginComponentRender() {
918
+ return currentFrame ? now() : null;
919
+ },
920
+ endComponentRender(token) {
921
+ if (currentFrame === null || token === null) return;
922
+ currentFrame.phases.component += Math.max(0, now() - token);
923
+ },
924
+ recordTerminalWrite(fields) {
925
+ writeSeq += 1;
926
+ const frameId = currentFrame?.frameId ?? null;
927
+ const commit = {
928
+ writeId: writeSeq,
929
+ at: at(),
930
+ bytes: fields.bytes,
931
+ enqueueMs: rounded(fields.enqueueMs),
932
+ returned: fields.returned,
933
+ backpressured: !fields.returned
934
+ };
935
+ currentFrame?.commits.push(commit);
936
+ writer.enqueue({ type: "terminal_write", version: RENDER_TRACE_VERSION, frameId, ...commit });
937
+ if (!fields.returned) pendingDrains.set(writeSeq, { frameId, at: commit.at });
938
+ return writeSeq;
939
+ },
940
+ recordTerminalDrain(writeId) {
941
+ const pending = pendingDrains.get(writeId);
942
+ if (!pending) return;
943
+ pendingDrains.delete(writeId);
944
+ const drainAt = at();
945
+ writer.enqueue({
946
+ type: "terminal_drain",
947
+ version: RENDER_TRACE_VERSION,
948
+ writeId,
949
+ frameId: pending.frameId,
950
+ at: drainAt,
951
+ waitMs: rounded(Math.max(0, drainAt - pending.at))
952
+ });
953
+ },
954
+ currentFrameId: () => currentFrame?.frameId ?? null,
955
+ onFirstFrameCommit(listener) {
956
+ firstCommitListener = listener;
957
+ },
958
+ close: () => writer.close()
959
+ };
960
+ return trace;
961
+ }
962
+ function traceComponentRenders(component, trace) {
963
+ const original = component.render;
964
+ const wrapped = function(width) {
965
+ const token = trace.beginComponentRender();
966
+ try {
967
+ return original.call(this, width);
968
+ } finally {
969
+ trace.endComponentRender(token);
970
+ }
971
+ };
972
+ component.render = wrapped;
973
+ return () => {
974
+ if (component.render === wrapped) component.render = original;
975
+ };
976
+ }
977
+ function traceProcessStdout(trace, now = () => performance.now(), stdout = process.stdout) {
978
+ const original = stdout.write;
979
+ const pendingDrainWrites = [];
980
+ let drainListening = false;
981
+ const wrapped = function(...args) {
982
+ const chunk = args[0];
983
+ const start = now();
984
+ const returned = Reflect.apply(original, this, args);
985
+ const enqueueMs = Math.max(0, now() - start);
986
+ let bytes = 0;
987
+ try {
988
+ bytes = Buffer.isBuffer(chunk) ? chunk.byteLength : ArrayBuffer.isView(chunk) ? chunk.byteLength : Buffer.byteLength(String(chunk), typeof args[1] === "string" ? args[1] : "utf8");
989
+ } catch {
990
+ bytes = Buffer.byteLength(String(chunk), "utf8");
991
+ }
992
+ const writeId = trace.recordTerminalWrite({ bytes, enqueueMs, returned });
993
+ if (!returned) {
994
+ pendingDrainWrites.push(writeId);
995
+ if (!drainListening) {
996
+ drainListening = true;
997
+ stdout.once("drain", () => {
998
+ drainListening = false;
999
+ for (const pendingWriteId of pendingDrainWrites.splice(0)) trace.recordTerminalDrain(pendingWriteId);
1000
+ });
1001
+ }
1002
+ }
1003
+ return returned;
1004
+ };
1005
+ stdout.write = wrapped;
1006
+ return () => {
1007
+ if (stdout.write === wrapped) stdout.write = original;
1008
+ };
1009
+ }
1010
+
1011
+ // src/interactive/stdout-backpressure.ts
1012
+ init_esm_shims();
1013
+ function installStdoutBackpressureGate(stdout = process.stdout) {
1014
+ const original = stdout.write;
1015
+ const listeners = /* @__PURE__ */ new Set();
1016
+ let blocked = false;
1017
+ let observed = false;
1018
+ let restored = false;
1019
+ let drainListening = false;
1020
+ const notifyWritable = () => {
1021
+ drainListening = false;
1022
+ if (!blocked) return;
1023
+ blocked = false;
1024
+ for (const listener of [...listeners]) listener();
1025
+ };
1026
+ const listenForDrain = () => {
1027
+ if (drainListening || restored) return;
1028
+ drainListening = true;
1029
+ stdout.once("drain", notifyWritable);
1030
+ };
1031
+ const wrapped = function(...args) {
1032
+ const returned = Reflect.apply(original, this, args);
1033
+ if (!returned) {
1034
+ observed = true;
1035
+ blocked = true;
1036
+ listenForDrain();
1037
+ }
1038
+ return returned;
1039
+ };
1040
+ stdout.write = wrapped;
1041
+ return {
1042
+ get blocked() {
1043
+ return blocked;
1044
+ },
1045
+ get observed() {
1046
+ return observed;
1047
+ },
1048
+ onWritable(listener) {
1049
+ if (restored || !blocked) {
1050
+ queueMicrotask(listener);
1051
+ return () => {
1052
+ };
1053
+ }
1054
+ listeners.add(listener);
1055
+ return () => listeners.delete(listener);
1056
+ },
1057
+ whenWritable(timeoutMs) {
1058
+ if (restored || !blocked) return Promise.resolve(true);
1059
+ return new Promise((resolve) => {
1060
+ let timer;
1061
+ const release = this.onWritable(() => {
1062
+ if (timer) clearTimeout(timer);
1063
+ release();
1064
+ resolve(true);
1065
+ });
1066
+ if (timeoutMs !== void 0 && Number.isFinite(timeoutMs) && timeoutMs >= 0) {
1067
+ timer = setTimeout(() => {
1068
+ release();
1069
+ resolve(false);
1070
+ }, timeoutMs);
1071
+ }
1072
+ });
1073
+ },
1074
+ restore() {
1075
+ if (restored) return;
1076
+ restored = true;
1077
+ blocked = false;
1078
+ if (drainListening) {
1079
+ stdout.off("drain", notifyWritable);
1080
+ drainListening = false;
1081
+ }
1082
+ if (stdout.write === wrapped) stdout.write = original;
1083
+ for (const listener of [...listeners]) listener();
1084
+ listeners.clear();
1085
+ }
1086
+ };
1087
+ }
1088
+
1089
+ // src/interactive/interactive-shell.ts
1090
+ var KEEP_ALIVE_INTERVAL_MS = 1 << 30;
1091
+ function createInteractiveShell(deps) {
1092
+ const terminal = deps.createTerminal();
1093
+ const tui = deps.createTui(terminal);
1094
+ const scheduleInterval = deps.scheduleInterval ?? ((callback, intervalMs) => setInterval(callback, intervalMs));
1095
+ const clearScheduledInterval = deps.clearScheduledInterval ?? ((handle) => clearInterval(handle));
1096
+ let mounted = false;
1097
+ let keepAlive = null;
1098
+ let resolveRun = null;
1099
+ let run = null;
1100
+ let completedCode = null;
1101
+ let stopped = false;
1102
+ let stopSettlement = null;
1103
+ return {
1104
+ terminal,
1105
+ tui,
1106
+ mount(root, focus) {
1107
+ if (mounted) return;
1108
+ mounted = true;
1109
+ deps.prepareRoot?.(root);
1110
+ tui.addChild(root);
1111
+ if (tui.mode === "fullscreen") tui.setLayoutRoot?.(root);
1112
+ tui.setFocus(focus);
1113
+ tui.start();
1114
+ },
1115
+ anchor() {
1116
+ if (run) return run;
1117
+ run = new Promise((resolve) => {
1118
+ resolveRun = resolve;
1119
+ if (completedCode !== null) resolve(completedCode);
1120
+ });
1121
+ keepAlive = scheduleInterval(() => {
1122
+ }, KEEP_ALIVE_INTERVAL_MS);
1123
+ return run;
1124
+ },
1125
+ releaseAnchor() {
1126
+ if (!keepAlive) return;
1127
+ clearScheduledInterval(keepAlive);
1128
+ keepAlive = null;
1129
+ },
1130
+ stop() {
1131
+ if (stopped) return;
1132
+ stopped = true;
1133
+ try {
1134
+ tui.stop();
1135
+ } catch {
1136
+ } finally {
1137
+ try {
1138
+ stopSettlement = Promise.resolve(deps.onStop?.()).then(() => void 0);
1139
+ } catch {
1140
+ stopSettlement = Promise.resolve();
1141
+ }
1142
+ }
1143
+ },
1144
+ async commitCurrentFrame() {
1145
+ if (!tui.renderNow) {
1146
+ tui.requestRender();
1147
+ return null;
1148
+ }
1149
+ tui.renderNow(false);
1150
+ return null;
1151
+ },
1152
+ hasObservedBackpressure: () => false,
1153
+ setStreamPacingActive: () => {
1154
+ },
1155
+ settle() {
1156
+ return stopSettlement ?? Promise.resolve();
1157
+ },
1158
+ nextCommittedFrame() {
1159
+ return Promise.resolve(null);
1160
+ },
1161
+ complete(code) {
1162
+ if (completedCode !== null) return;
1163
+ completedCode = code;
1164
+ resolveRun?.(code);
1165
+ }
1166
+ };
1167
+ }
1168
+ var activeRenderTrace = null;
1169
+ function getActiveRenderTrace() {
1170
+ return activeRenderTrace;
1171
+ }
1172
+ async function settleLatestInteractiveFrame(gate, timeoutMs, renderFrame) {
1173
+ const writableBeforeRender = gate ? await gate.whenWritable(timeoutMs) : true;
1174
+ const frameId = await renderFrame();
1175
+ if (writableBeforeRender && gate) await gate.whenWritable(timeoutMs);
1176
+ return frameId;
1177
+ }
1178
+ function createProcessInteractiveShell(options = {}) {
1179
+ const tracePath = renderTracePath();
1180
+ let restoreStdout = null;
1181
+ let restoreFirstFrameStdout = null;
1182
+ let restoreRoot = null;
1183
+ let backpressure = null;
1184
+ let observedBackpressure = false;
1185
+ if (tracePath) {
1186
+ let candidate = null;
1187
+ try {
1188
+ candidate = createRenderTrace(tracePath);
1189
+ restoreStdout = traceProcessStdout(candidate);
1190
+ activeRenderTrace = candidate;
1191
+ } catch {
1192
+ restoreStdout?.();
1193
+ restoreStdout = null;
1194
+ void candidate?.close().catch(() => {
1195
+ });
1196
+ activeRenderTrace = null;
1197
+ }
1198
+ } else activeRenderTrace = null;
1199
+ const trace = activeRenderTrace;
1200
+ if (trace && options.onFirstFrameCommit) trace.onFirstFrameCommit(options.onFirstFrameCommit);
1201
+ let firstFrameDelivered = false;
1202
+ let firstFrameSeq = 0;
1203
+ let firstFrameActive = false;
1204
+ let firstFrameWrote = false;
1205
+ if (!trace && options.onFirstFrameCommit) {
1206
+ const stdout = process.stdout;
1207
+ const original = stdout.write;
1208
+ const wrapped = function(...args) {
1209
+ const returned = Reflect.apply(original, this, args);
1210
+ if (firstFrameActive) firstFrameWrote = true;
1211
+ return returned;
1212
+ };
1213
+ stdout.write = wrapped;
1214
+ restoreFirstFrameStdout = () => {
1215
+ if (stdout.write === wrapped) stdout.write = original;
1216
+ };
1217
+ }
1218
+ const firstFrameOnlyObserver = {
1219
+ isEnabled: () => !firstFrameDelivered,
1220
+ beginFrame: () => {
1221
+ firstFrameSeq += 1;
1222
+ firstFrameActive = true;
1223
+ firstFrameWrote = false;
1224
+ return firstFrameSeq;
1225
+ },
1226
+ endFrame: (frame2) => {
1227
+ firstFrameActive = false;
1228
+ if (firstFrameDelivered || !firstFrameWrote) return;
1229
+ firstFrameDelivered = true;
1230
+ options.onFirstFrameCommit?.(frame2);
1231
+ restoreFirstFrameStdout?.();
1232
+ restoreFirstFrameStdout = null;
1233
+ },
1234
+ beginPhase: () => null,
1235
+ endPhase: () => {
1236
+ }
1237
+ };
1238
+ const primaryObserver = trace ?? (options.onFirstFrameCommit ? firstFrameOnlyObserver : null);
1239
+ let committedFrameSequence = 0;
1240
+ const frameWaiters = [];
1241
+ const renderObserver = {
1242
+ isEnabled: () => frameWaiters.length > 0 || primaryObserver !== null && (primaryObserver.isEnabled?.() ?? true),
1243
+ beginFrame: (fields) => ({
1244
+ primary: primaryObserver?.beginFrame(fields),
1245
+ primaryActive: primaryObserver !== null && (primaryObserver.isEnabled?.() ?? true),
1246
+ frameId: ++committedFrameSequence
1247
+ }),
1248
+ endFrame: (token) => {
1249
+ const frame2 = token;
1250
+ if (frame2.primaryActive) primaryObserver?.endFrame(frame2.primary);
1251
+ for (const waiter of frameWaiters.splice(0)) waiter.resolve(frame2.frameId);
1252
+ },
1253
+ beginPhase: (token, phase) => {
1254
+ const frame2 = token;
1255
+ return frame2.primaryActive ? primaryObserver?.beginPhase(frame2.primary, phase) : null;
1256
+ },
1257
+ endPhase: (token, phase, phaseToken) => {
1258
+ const frame2 = token;
1259
+ if (frame2.primaryActive) primaryObserver?.endPhase(frame2.primary, phase, phaseToken);
1260
+ }
1261
+ };
1262
+ const renderAdmission = {
1263
+ get blocked() {
1264
+ return backpressure?.blocked ?? false;
1265
+ },
1266
+ onWritable(listener) {
1267
+ if (backpressure) return backpressure.onWritable(listener);
1268
+ queueMicrotask(listener);
1269
+ return () => {
1270
+ };
1271
+ }
1272
+ };
1273
+ const setStreamPacingActive = (active) => {
1274
+ if (active) {
1275
+ backpressure ??= installStdoutBackpressureGate();
1276
+ return;
1277
+ }
1278
+ if (!backpressure) return;
1279
+ observedBackpressure ||= backpressure.observed;
1280
+ backpressure.restore();
1281
+ backpressure = null;
1282
+ };
1283
+ let instrumentationCleanupStarted = false;
1284
+ let instrumentationCleanupPromise = Promise.resolve();
1285
+ const cleanupInstrumentation = () => {
1286
+ if (instrumentationCleanupStarted) return instrumentationCleanupPromise;
1287
+ instrumentationCleanupStarted = true;
1288
+ const errors = [];
1289
+ const attempt = (operation) => {
1290
+ try {
1291
+ operation();
1292
+ } catch (error) {
1293
+ errors.push(error);
1294
+ }
1295
+ };
1296
+ attempt(() => setStreamPacingActive(false));
1297
+ attempt(() => restoreRoot?.());
1298
+ restoreRoot = null;
1299
+ attempt(() => restoreStdout?.());
1300
+ restoreStdout = null;
1301
+ attempt(() => restoreFirstFrameStdout?.());
1302
+ restoreFirstFrameStdout = null;
1303
+ if (activeRenderTrace === trace) activeRenderTrace = null;
1304
+ instrumentationCleanupPromise = (async () => {
1305
+ if (trace) {
1306
+ try {
1307
+ await trace.close();
1308
+ } catch (error) {
1309
+ errors.push(error);
1310
+ }
1311
+ }
1312
+ if (errors.length > 0) throw new AggregateError(errors, "interactive shell instrumentation cleanup failed");
1313
+ })();
1314
+ return instrumentationCleanupPromise;
1315
+ };
1316
+ let shell;
1317
+ try {
1318
+ setStreamPacingActive(options.streamPacingActive === true);
1319
+ shell = createInteractiveShell({
1320
+ createTerminal: options.testing?.createTerminal ?? (() => new ProcessTerminal()),
1321
+ createTui: (terminal) => options.testing?.createTui?.(terminal) ?? (options.tuiMode === "fullscreen" ? new InstrumentedTuiAltScreen(terminal, renderObserver, void 0, void 0, void 0, renderAdmission) : new InstrumentedTuiMainScreen(terminal, renderObserver, void 0, void 0, renderAdmission)),
1322
+ prepareRoot: (root) => {
1323
+ if (trace) restoreRoot = traceComponentRenders(root, trace);
1324
+ },
1325
+ onStop: cleanupInstrumentation
1326
+ });
1327
+ } catch (error) {
1328
+ void cleanupInstrumentation().catch(() => {
1329
+ });
1330
+ throw error;
1331
+ }
1332
+ return {
1333
+ ...shell,
1334
+ nextCommittedFrame() {
1335
+ return new Promise((resolve) => {
1336
+ frameWaiters.push({ resolve });
1337
+ });
1338
+ },
1339
+ async commitCurrentFrame(timeoutMs = 3e4) {
1340
+ return await settleLatestInteractiveFrame(backpressure, timeoutMs, async () => {
1341
+ const tui = shell.tui;
1342
+ const waiter = { resolve: () => {
1343
+ } };
1344
+ const frame2 = new Promise((resolve) => {
1345
+ waiter.resolve = resolve;
1346
+ frameWaiters.push(waiter);
1347
+ });
1348
+ try {
1349
+ tui.renderNow(false);
1350
+ } catch (error) {
1351
+ const index = frameWaiters.indexOf(waiter);
1352
+ if (index >= 0) frameWaiters.splice(index, 1);
1353
+ throw error;
1354
+ }
1355
+ return await frame2;
1356
+ });
1357
+ },
1358
+ hasObservedBackpressure: () => observedBackpressure || backpressure?.observed === true,
1359
+ setStreamPacingActive
1360
+ };
1361
+ }
1362
+
1363
+ // src/interactive/keybinding-manager.ts
1364
+ init_esm_shims();
1365
+
1366
+ // src/domains/config/keybindings.ts
1367
+ init_esm_shims();
1368
+ var CLIO_APP_KEYBINDINGS = {
1369
+ "clio.thinking.cycle": {
1370
+ defaultKeys: "shift+tab",
1371
+ description: "Cycle orchestrator thinking level"
1372
+ },
1373
+ "clio.exit": {
1374
+ defaultKeys: "ctrl+d",
1375
+ description: "Exit when the editor is empty"
1376
+ },
1377
+ "clio.status.toggle": {
1378
+ defaultKeys: "alt+u",
1379
+ description: "Toggle the footer dashboard (compact / expanded)"
1380
+ },
1381
+ "clio.session.tree": {
1382
+ defaultKeys: "alt+t",
1383
+ description: "Open the /tree navigator"
1384
+ },
1385
+ "clio.dispatchBoard.toggle": {
1386
+ defaultKeys: "alt+w",
1387
+ description: "Toggle the dispatch (workers) board overlay"
1388
+ },
1389
+ "clio.tasks.open": {
1390
+ // Approved application-boundary override of pi-tui editor word-back.
1391
+ defaultKeys: "alt+b",
1392
+ description: "Open the composite session and operator task board"
1393
+ },
1394
+ "clio.decisions.open": {
1395
+ // Approved application-boundary override of pi-tui editor word-delete.
1396
+ defaultKeys: "alt+d",
1397
+ description: "Open the settled interview decision board"
1398
+ },
1399
+ "clio.dispatch.background": {
1400
+ // Ctrl+B alone is pi-tui's editor cursor-left, so the Claude Code chord
1401
+ // cannot be the primary here. Alt+S ("send to background") keeps the app
1402
+ // scheme and earns the Ctrl+G leader fallback, which only alt+<letter>
1403
+ // bindings get; Ctrl+Alt+B stays for the b-for-background muscle memory.
1404
+ defaultKeys: ["alt+s", "ctrl+alt+b"],
1405
+ description: "Send the running attached dispatch to the background as a detached batch"
1406
+ },
1407
+ "clio.model.select": {
1408
+ defaultKeys: "alt+l",
1409
+ description: "Open the model + targets selector"
1410
+ },
1411
+ "clio.model.cycleForward": {
1412
+ defaultKeys: "alt+j",
1413
+ description: "Cycle to next scoped model"
1414
+ },
1415
+ "clio.model.cycleBackward": {
1416
+ defaultKeys: "alt+k",
1417
+ description: "Cycle to previous scoped model"
1418
+ },
1419
+ "clio.tool.expand": {
1420
+ defaultKeys: "alt+o",
1421
+ description: "Fold or unfold the newest tool call or worker block between its one-line summary and full details (no effect while /output verbose pins them open)"
1422
+ },
1423
+ "clio.tool.expandAll": {
1424
+ // Alt+Shift+letter is commonly consumed by OS keyboard-layout switching.
1425
+ // Keep it discoverable, but pair it with the legacy-safe Ctrl+Alt form.
1426
+ defaultKeys: ["ctrl+alt+o", "alt+shift+o"],
1427
+ description: "Fold or unfold every tool call and worker block at once (no effect while /output verbose pins them open)"
1428
+ },
1429
+ "clio.tool.liveOutput": {
1430
+ defaultKeys: "alt+p",
1431
+ description: "Toggle streaming partial tool output in expanded tool bodies"
1432
+ },
1433
+ "clio.thinking.expand": {
1434
+ defaultKeys: "alt+r",
1435
+ description: "Toggle the latest thinking block between hidden marker and full body (no effect while /output verbose pins it open)"
1436
+ },
1437
+ "clio.thinking.expandAll": {
1438
+ // Ctrl+Alt+R is the fallback for terminals/OSes that do not forward
1439
+ // Alt+Shift+R as a distinct key event.
1440
+ defaultKeys: ["ctrl+alt+r", "alt+shift+r"],
1441
+ description: "Toggle all thinking blocks between hidden markers and full bodies (no effect while /output verbose pins them open)"
1442
+ },
1443
+ "clio.editor.external": {
1444
+ defaultKeys: "alt+g",
1445
+ description: "Open the current input in an external editor"
1446
+ },
1447
+ "clio.message.followUp": {
1448
+ defaultKeys: "alt+enter",
1449
+ description: "End of turn: queue the current input for delivery when the active run settles (Enter delivers it at the next slot, between tool batches)"
1450
+ },
1451
+ "clio.message.interrupt": {
1452
+ // Alt+I keeps the app scheme and earns the Ctrl+G leader fallback. A
1453
+ // Ctrl+Enter chord was rejected because legacy terminals send it as a
1454
+ // plain Enter, which would turn every send into a cancel.
1455
+ defaultKeys: "alt+i",
1456
+ description: "Interrupt: cancel the active run and deliver the current input now (refused while an attached dispatch runs or a permission ask is parked; the input then queues for the next slot)"
1457
+ },
1458
+ "clio.message.dequeue": {
1459
+ defaultKeys: "alt+up",
1460
+ description: "Restore queued steering and follow-up messages to the editor"
1461
+ },
1462
+ "clio.notifications.dismiss": {
1463
+ defaultKeys: "alt+x",
1464
+ description: "Dismiss footer notifications"
1465
+ },
1466
+ "clio.leader": {
1467
+ defaultKeys: "ctrl+g",
1468
+ description: "Start portable leader-key fallback for Alt shortcuts"
1469
+ }
1470
+ };
1471
+ var CLIO_KEYBINDINGS = {
1472
+ ...TUI_KEYBINDINGS,
1473
+ "tui.editor.historyPrevious": {
1474
+ ...TUI_KEYBINDINGS["tui.editor.historyPrevious"],
1475
+ defaultKeys: "ctrl+p"
1476
+ },
1477
+ "tui.editor.historyNext": {
1478
+ ...TUI_KEYBINDINGS["tui.editor.historyNext"],
1479
+ defaultKeys: "ctrl+n"
1480
+ },
1481
+ ...CLIO_APP_KEYBINDINGS
1482
+ };
1483
+ var CLIO_APP_KEYBINDING_IDS = Object.keys(CLIO_APP_KEYBINDINGS);
1484
+
1485
+ // src/interactive/keybinding-manager.ts
1486
+ var BASE_SPECIAL_KEYS = /* @__PURE__ */ new Set([
1487
+ "escape",
1488
+ "esc",
1489
+ "enter",
1490
+ "return",
1491
+ "tab",
1492
+ "space",
1493
+ "backspace",
1494
+ "delete",
1495
+ "insert",
1496
+ "clear",
1497
+ "home",
1498
+ "end",
1499
+ "pageup",
1500
+ "pagedown",
1501
+ "up",
1502
+ "down",
1503
+ "left",
1504
+ "right",
1505
+ "f1",
1506
+ "f2",
1507
+ "f3",
1508
+ "f4",
1509
+ "f5",
1510
+ "f6",
1511
+ "f7",
1512
+ "f8",
1513
+ "f9",
1514
+ "f10",
1515
+ "f11",
1516
+ "f12"
1517
+ ]);
1518
+ var BASE_SYMBOL_KEYS = /* @__PURE__ */ new Set([
1519
+ "`",
1520
+ "-",
1521
+ "=",
1522
+ "[",
1523
+ "]",
1524
+ "\\",
1525
+ ";",
1526
+ "'",
1527
+ ",",
1528
+ ".",
1529
+ "/",
1530
+ "!",
1531
+ "@",
1532
+ "#",
1533
+ "$",
1534
+ "%",
1535
+ "^",
1536
+ "&",
1537
+ "*",
1538
+ "(",
1539
+ ")",
1540
+ "_",
1541
+ "+",
1542
+ "|",
1543
+ "~",
1544
+ "{",
1545
+ "}",
1546
+ ":",
1547
+ "<",
1548
+ ">",
1549
+ "?"
1550
+ ]);
1551
+ var MODIFIERS = /* @__PURE__ */ new Set(["ctrl", "shift", "alt", "super"]);
1552
+ function isValidKeyId(keyId) {
1553
+ if (typeof keyId !== "string" || keyId.length === 0) return false;
1554
+ const parts = keyId.toLowerCase().split("+");
1555
+ if (parts.length === 0) return false;
1556
+ const base = parts[parts.length - 1];
1557
+ if (!base) return false;
1558
+ const mods = parts.slice(0, -1);
1559
+ const seen = /* @__PURE__ */ new Set();
1560
+ for (const mod of mods) {
1561
+ if (!MODIFIERS.has(mod)) return false;
1562
+ if (seen.has(mod)) return false;
1563
+ seen.add(mod);
1564
+ }
1565
+ if (base.length === 1) {
1566
+ const ch = base.charCodeAt(0);
1567
+ const isLetter = ch >= 97 && ch <= 122;
1568
+ const isDigit = ch >= 48 && ch <= 57;
1569
+ return isLetter || isDigit || BASE_SYMBOL_KEYS.has(base);
1570
+ }
1571
+ return BASE_SPECIAL_KEYS.has(base);
1572
+ }
1573
+ function validateKeybindings(raw) {
1574
+ const valid = {};
1575
+ const invalid = [];
1576
+ for (const [id, value] of Object.entries(raw)) {
1577
+ if (typeof value === "string") {
1578
+ if (value.length === 0) continue;
1579
+ if (isValidKeyId(value)) {
1580
+ valid[id] = value;
1581
+ } else {
1582
+ invalid.push({ id, keys: [value] });
1583
+ }
1584
+ continue;
1585
+ }
1586
+ if (Array.isArray(value)) {
1587
+ const accepted = [];
1588
+ const rejected = [];
1589
+ for (const entry of value) {
1590
+ if (typeof entry !== "string" || entry.length === 0) continue;
1591
+ if (isValidKeyId(entry)) {
1592
+ accepted.push(entry);
1593
+ } else {
1594
+ rejected.push(entry);
1595
+ }
1596
+ }
1597
+ if (accepted.length > 0) valid[id] = accepted;
1598
+ if (rejected.length > 0) invalid.push({ id, keys: rejected });
1599
+ }
1600
+ }
1601
+ return { valid, invalid };
1602
+ }
1603
+ function formatInvalidKeybindingNotice(invalid) {
1604
+ const count = invalid.reduce((sum, entry) => sum + entry.keys.length, 0);
1605
+ const detail = invalid.flatMap((entry) => entry.keys.map((key) => `${entry.id}="${key}"`)).join(", ");
1606
+ return `Clio Coder: ${count} invalid keybinding${count === 1 ? "" : "s"} in settings.yaml (defaults kept): ${detail}. Fix settings.yaml or run \`clio-coder doctor\`.
1607
+ `;
1608
+ }
1609
+ function envValue(env, key) {
1610
+ return env[key]?.trim() ?? "";
1611
+ }
1612
+ function detectTerminalKeySupport(env = process.env) {
1613
+ const term = envValue(env, "TERM");
1614
+ const termProgram = envValue(env, "TERM_PROGRAM");
1615
+ const kittyWindow = envValue(env, "KITTY_WINDOW_ID");
1616
+ const normalized = `${term} ${termProgram}`.toLowerCase();
1617
+ if (kittyWindow.length > 0 || normalized.includes("xterm-kitty") || normalized.includes("kitty")) {
1618
+ return { name: "kitty", supportsCsiU: true, reason: "Kitty keyboard protocol detected", altLetterMode: "meta" };
1619
+ }
1620
+ if (normalized.includes("wezterm") || normalized.includes("ghostty")) {
1621
+ return {
1622
+ name: termProgram || term || "modern terminal",
1623
+ supportsCsiU: true,
1624
+ reason: "CSI-u capable terminal",
1625
+ altLetterMode: "meta"
1626
+ };
1627
+ }
1628
+ if (termProgram === "Apple_Terminal") {
1629
+ return {
1630
+ name: termProgram,
1631
+ supportsCsiU: false,
1632
+ reason: "Terminal.app sends Option-letter as composed text unless Use Option as Meta key is enabled",
1633
+ altLetterMode: "text"
1634
+ };
1635
+ }
1636
+ if (termProgram === "iTerm.app") {
1637
+ return {
1638
+ name: termProgram,
1639
+ supportsCsiU: true,
1640
+ reason: "iTerm2 reports modified keys as Meta or CSI-u",
1641
+ altLetterMode: "meta"
1642
+ };
1643
+ }
1644
+ if (termProgram.toLowerCase() === "vscode") {
1645
+ return {
1646
+ name: "vscode",
1647
+ supportsCsiU: false,
1648
+ reason: "VS Code terminal does not reliably emit CSI-u",
1649
+ altLetterMode: "meta",
1650
+ ideReservedKeys: ["ctrl+p", "shift+ctrl+p", "ctrl+l"]
1651
+ };
1652
+ }
1653
+ if (term.startsWith("screen") || term.startsWith("tmux")) {
1654
+ return { name: term, supportsCsiU: false, reason: "terminal multiplexer may block CSI-u", altLetterMode: "meta" };
1655
+ }
1656
+ return {
1657
+ name: termProgram || term || "legacy terminal",
1658
+ supportsCsiU: false,
1659
+ reason: "CSI-u support not detected",
1660
+ altLetterMode: "meta"
1661
+ };
1662
+ }
1663
+ function keyRequiresCsiU(keyId) {
1664
+ const parts = keyId.toLowerCase().split("+");
1665
+ if (parts.length < 3) return false;
1666
+ const base = parts[parts.length - 1] ?? "";
1667
+ const modifiers = new Set(parts.slice(0, -1));
1668
+ if (!modifiers.has("shift") || !modifiers.has("ctrl")) return false;
1669
+ if (base.length !== 1) return false;
1670
+ const code = base.charCodeAt(0);
1671
+ const isLetter = code >= 97 && code <= 122;
1672
+ const isDigit = code >= 48 && code <= 57;
1673
+ return isLetter || isDigit || BASE_SYMBOL_KEYS.has(base);
1674
+ }
1675
+ function normalizeBindingValue(value) {
1676
+ if (value === void 0) return [];
1677
+ return (Array.isArray(value) ? value : [value]).map(String);
1678
+ }
1679
+ function defaultBindingValue(id) {
1680
+ const value = CLIO_APP_KEYBINDINGS[id].defaultKeys;
1681
+ return normalizeBindingValue(value);
1682
+ }
1683
+ function normalizeKeyForRisk(keyId) {
1684
+ return keyId.toLowerCase().replace(/^ctrl\+shift\+/, "shift+ctrl+");
1685
+ }
1686
+ function altLetterBase(keyId) {
1687
+ const parts = keyId.toLowerCase().split("+");
1688
+ if (parts.length !== 2 || parts[0] !== "alt") return null;
1689
+ const base = parts[1] ?? "";
1690
+ return base.length === 1 && base >= "a" && base <= "z" ? base : null;
1691
+ }
1692
+ function keyUsesAltLetter(keyId) {
1693
+ return altLetterBase(keyId) !== null;
1694
+ }
1695
+ function terminalReservedReason(keyId) {
1696
+ const key = normalizeKeyForRisk(keyId);
1697
+ if (key === "ctrl+s" || key === "ctrl+q") return "terminal flow control may intercept this chord";
1698
+ if (key === "ctrl+z") return "shell job control may suspend the process";
1699
+ return null;
1700
+ }
1701
+ function keyRiskReason(keyId, support) {
1702
+ const key = normalizeKeyForRisk(keyId);
1703
+ if (!support.supportsCsiU && keyRequiresCsiU(key)) return `needs CSI-u; ${support.reason}`;
1704
+ if (support.altLetterMode === "text" && keyUsesAltLetter(key)) return support.reason;
1705
+ if (support.ideReservedKeys?.map(normalizeKeyForRisk).includes(key)) return `${support.name} may reserve this chord`;
1706
+ return terminalReservedReason(key);
1707
+ }
1708
+ var MACOS_OPTION_DEFAULT_WARNING_ID = "clio.macos.option-letter.defaults";
1709
+ function detectPlatformKeybindingWarnings(userBindings, support = detectTerminalKeySupport()) {
1710
+ const warnings = [];
1711
+ const macosDefaultAltKeys = [];
1712
+ for (const id of CLIO_APP_KEYBINDING_IDS) {
1713
+ const userValue = userBindings[id];
1714
+ const source = userValue === void 0 ? "default" : "user";
1715
+ const keys = userValue === void 0 ? defaultBindingValue(id) : normalizeBindingValue(userValue);
1716
+ const risky = keys.filter((key) => keyRiskReason(key, support) !== null);
1717
+ if (risky.length === 0) continue;
1718
+ const firstReason = keyRiskReason(risky[0] ?? "", support) ?? support.reason;
1719
+ if (source === "default" && support.name === "Apple_Terminal" && risky.every(keyUsesAltLetter)) {
1720
+ macosDefaultAltKeys.push(...risky);
1721
+ continue;
1722
+ }
1723
+ warnings.push({ id, keys: risky, terminal: support.name, reason: firstReason, source });
1724
+ }
1725
+ if (macosDefaultAltKeys.length > 0) {
1726
+ warnings.unshift({
1727
+ id: MACOS_OPTION_DEFAULT_WARNING_ID,
1728
+ keys: [...new Set(macosDefaultAltKeys)],
1729
+ terminal: support.name,
1730
+ reason: support.reason,
1731
+ source: "default"
1732
+ });
1733
+ }
1734
+ return warnings;
1735
+ }
1736
+ function isMacosOptionDefaultWarning(warning) {
1737
+ return warning.id === MACOS_OPTION_DEFAULT_WARNING_ID;
1738
+ }
1739
+ function formatPlatformKeybindingNotice(warnings) {
1740
+ const macosOption = warnings.find(isMacosOptionDefaultWarning);
1741
+ if (macosOption && warnings.length === 1) {
1742
+ const keys = macosOption.keys.map((key) => {
1743
+ const base = altLetterBase(key);
1744
+ return base ? `Alt+${base.toUpperCase()}` : key;
1745
+ }).join(", ");
1746
+ return `Clio keybinding notice: Terminal.app may not send Option-letter shortcuts by default (${keys}). Enable Use Option as Meta key in Settings \u25B8 Profiles \u25B8 Keyboard for native Alt, or use Ctrl+G then the shortcut letter, slash commands (/help lists commands), and /help.
1747
+ `;
1748
+ }
1749
+ const count = warnings.reduce((sum, entry) => sum + entry.keys.length, 0);
1750
+ const detail = warnings.flatMap((entry) => entry.keys.map((key) => `${entry.id}="${key}" (${entry.source}, ${entry.reason})`)).join(", ");
1751
+ return `Clio keybinding notice: ${count} keybinding${count === 1 ? "" : "s"} may not fire reliably in this terminal: ${detail}. Rebind in settings.yaml or inspect /help.
1752
+ `;
1753
+ }
1754
+ function joinKeys(keys) {
1755
+ if (keys.length === 0) return "(unbound)";
1756
+ if (keys.length === 1) return String(keys[0]);
1757
+ return keys.join(" / ");
1758
+ }
1759
+ function deriveLeaderTargets(inner) {
1760
+ const targets = [];
1761
+ for (const id of CLIO_APP_KEYBINDING_IDS) {
1762
+ for (const key of inner.getKeys(id)) {
1763
+ const base = altLetterBase(String(key));
1764
+ if (base) targets.push({ key: base, id });
1765
+ }
1766
+ }
1767
+ return targets;
1768
+ }
1769
+ function buildManager(inner, invalid, platformWarnings) {
1770
+ const frozen = invalid.map((entry) => ({ id: entry.id, keys: [...entry.keys] }));
1771
+ const frozenPlatformWarnings = platformWarnings.map((entry) => ({
1772
+ id: entry.id,
1773
+ keys: [...entry.keys],
1774
+ terminal: entry.terminal,
1775
+ reason: entry.reason,
1776
+ source: entry.source
1777
+ }));
1778
+ const frozenLeaderTargets = deriveLeaderTargets(inner).map((entry) => ({ ...entry }));
1779
+ return {
1780
+ matches(data, id) {
1781
+ return inner.matches(data, id);
1782
+ },
1783
+ getKeys(id) {
1784
+ return inner.getKeys(id);
1785
+ },
1786
+ getDescription(id) {
1787
+ return inner.getDefinition(id).description ?? "";
1788
+ },
1789
+ getConflicts() {
1790
+ return inner.getConflicts();
1791
+ },
1792
+ overrideCount() {
1793
+ return Object.keys(inner.getUserBindings()).length;
1794
+ },
1795
+ invalidCount() {
1796
+ return frozen.reduce((sum, entry) => sum + entry.keys.length, 0);
1797
+ },
1798
+ invalidBindings() {
1799
+ return frozen;
1800
+ },
1801
+ platformWarnings() {
1802
+ return frozenPlatformWarnings;
1803
+ },
1804
+ leaderTargets() {
1805
+ return frozenLeaderTargets;
1806
+ },
1807
+ hotkeyEntries() {
1808
+ const userBindings = inner.getUserBindings();
1809
+ return CLIO_APP_KEYBINDING_IDS.map((id) => ({
1810
+ id,
1811
+ keys: joinKeys(inner.getKeys(id)),
1812
+ description: inner.getDefinition(id).description ?? "",
1813
+ source: userBindings[id] === void 0 ? "default" : "user"
1814
+ }));
1815
+ }
1816
+ };
1817
+ }
1818
+ function createKeybindingManager(settings, env = process.env) {
1819
+ const { valid, invalid } = validateKeybindings(settings.keybindings ?? {});
1820
+ const inner = new KeybindingsManager(CLIO_KEYBINDINGS, valid);
1821
+ setKeybindings(inner);
1822
+ return buildManager(inner, invalid, detectPlatformKeybindingWarnings(valid, detectTerminalKeySupport(env)));
1823
+ }
1824
+
1825
+ export {
1826
+ SelectList,
1827
+ createAgentProgress,
1828
+ Box,
1829
+ CombinedAutocompleteProvider,
1830
+ Container,
1831
+ fuzzyFilter,
1832
+ getKeybindings,
1833
+ Input,
1834
+ isKeyRelease,
1835
+ Markdown,
1836
+ Marked,
1837
+ matchesKey,
1838
+ ScrollView,
1839
+ stripTerminalSequences,
1840
+ Text,
1841
+ truncateToWidth,
1842
+ VStack,
1843
+ visibleWidth,
1844
+ wrapTextWithAnsi,
1845
+ SGR_RESET,
1846
+ SGR_DIM,
1847
+ fgSequence,
1848
+ GLYPH,
1849
+ spinnerFrame,
1850
+ brandMark,
1851
+ dotSep,
1852
+ barSep,
1853
+ sectionTag,
1854
+ screenTitle,
1855
+ listGroupHeader,
1856
+ joinChips,
1857
+ joinSections,
1858
+ markdownTheme,
1859
+ selectListTheme,
1860
+ settingsListTheme,
1861
+ abbreviateModelId,
1862
+ formatTargetLabel,
1863
+ formatCompactMs,
1864
+ formatContextPercent,
1865
+ collapseHomePath,
1866
+ padAnsi,
1867
+ fitUnits,
1868
+ rule,
1869
+ frame,
1870
+ innerDivider,
1871
+ clioTheme,
1872
+ ClioEditor,
1873
+ getActiveRenderTrace,
1874
+ createProcessInteractiveShell,
1875
+ validateKeybindings,
1876
+ formatInvalidKeybindingNotice,
1877
+ detectTerminalKeySupport,
1878
+ detectPlatformKeybindingWarnings,
1879
+ formatPlatformKeybindingNotice,
1880
+ createKeybindingManager
1881
+ };
1882
+ //# sourceMappingURL=chunk-MAW544W2.js.map