@iowarp/clio-coder 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/CHANGELOG.md +90 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.js} +43 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
  8. package/dist/{chunk-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/chunk-2VTFPG5O.js +48 -0
  12. package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4KLWL3UC.js +18 -0
  16. package/dist/chunk-4VP4KH3K.js +962 -0
  17. package/dist/chunk-4ZG3XFUR.js +77 -0
  18. package/dist/chunk-5B2AEOW5.js +5407 -0
  19. package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
  20. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  21. package/dist/chunk-65DEGPJ6.js +52 -0
  22. package/dist/chunk-6EJMN2Y3.js +17 -0
  23. package/dist/chunk-6EJV5X2W.js +16405 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6XLNIQDB.js +27 -0
  26. package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
  29. package/dist/chunk-7MNJORFF.js +22 -0
  30. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  31. package/dist/chunk-AGYYIBLL.js +1069 -0
  32. package/dist/chunk-AO4RKG4M.js +277 -0
  33. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  34. package/dist/chunk-ARBGF5F7.js +174 -0
  35. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  36. package/dist/chunk-CBCAPZAA.js +229 -0
  37. package/dist/chunk-CMZWFGD2.js +352 -0
  38. package/dist/chunk-ECH6PKUQ.js +39 -0
  39. package/dist/chunk-ED4KHGC3.js +143 -0
  40. package/dist/chunk-EKMEHE4H.js +340 -0
  41. package/dist/{chunk-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
  42. package/dist/chunk-FCSXB6T2.js +338 -0
  43. package/dist/chunk-FJ3H4MN5.js +48 -0
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G2DE3C7R.js +644 -0
  46. package/dist/chunk-G4BMMOKF.js +182 -0
  47. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  48. package/dist/chunk-HC4CLZ2Y.js +68 -0
  49. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  50. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  51. package/dist/chunk-I4HZDVNP.js +73 -0
  52. package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
  53. package/dist/chunk-IKCO5N3L.js +162 -0
  54. package/dist/chunk-IR4CFBFN.js +56 -0
  55. package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
  56. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  57. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  58. package/dist/chunk-KJ5LWLOE.js +1077 -0
  59. package/dist/chunk-LBMZMYH2.js +285 -0
  60. package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
  61. package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
  62. package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
  63. package/dist/chunk-MAW544W2.js +1882 -0
  64. package/dist/chunk-MBS4V7ZP.js +217 -0
  65. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  66. package/dist/chunk-MNA4JGU4.js +255 -0
  67. package/dist/chunk-MQSRRFWA.js +3428 -0
  68. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  69. package/dist/chunk-OAO4GE4M.js +619 -0
  70. package/dist/chunk-OHHN2SO4.js +5135 -0
  71. package/dist/chunk-OKGUZO2U.js +34 -0
  72. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  73. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  74. package/dist/chunk-OQE5J4C6.js +73 -0
  75. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  76. package/dist/chunk-POHLU5DW.js +1186 -0
  77. package/dist/chunk-QKMUKYO7.js +4961 -0
  78. package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
  79. package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
  80. package/dist/chunk-SST6Z5JA.js +80 -0
  81. package/dist/chunk-STBPMHSX.js +2456 -0
  82. package/dist/chunk-T6YILFSB.js +80 -0
  83. package/dist/chunk-TZTZS7QK.js +227 -0
  84. package/dist/chunk-UOV2BYIW.js +107 -0
  85. package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
  86. package/dist/chunk-VAKQQHWR.js +434 -0
  87. package/dist/chunk-VG7TBQIY.js +128 -0
  88. package/dist/chunk-VJWL6YS5.js +244 -0
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-WMSVI4G2.js +2095 -0
  91. package/dist/chunk-WVO7V2QY.js +797 -0
  92. package/dist/chunk-X4RCMKVQ.js +641 -0
  93. package/dist/chunk-X75S7HFS.js +374 -0
  94. package/dist/chunk-XN3L4EYL.js +46 -0
  95. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  96. package/dist/chunk-YHZX5GEU.js +193 -0
  97. package/dist/chunk-YXLYO42X.js +91 -0
  98. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  99. package/dist/chunk-ZI647VB5.js +37 -0
  100. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-4LY5K2AC.js +25 -0
  103. package/dist/code-nav-7AX6FYE6.js +600 -0
  104. package/dist/codewiki/build-worker.js +66 -0
  105. package/dist/compile-cache-CVJMMODC.js +18 -0
  106. package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
  107. package/dist/{config-IRUQ7SE4.js → config-GTLUW2PR.js} +92 -55
  108. package/dist/configure-R6A64DHX.js +42 -0
  109. package/dist/context-5VKGUVJJ.js +866 -0
  110. package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
  111. package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
  126. package/dist/monitor-MEQA5C3I.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
  128. package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
  129. package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
  130. package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
  131. package/dist/{run-YTPEYQOH.js → run-IV4Q6RLN.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
  137. package/dist/terminal-lease-IT5JW2NR.js +395 -0
  138. package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
  139. package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
  140. package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
  141. package/dist/{upgrade-33G2LMM5.js → upgrade-7TT7SQ3G.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
  143. package/dist/verify-G6V4D2G7.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.js} +74 -34
  146. package/dist/worker/entry.js +221 -36
  147. package/dist/workspace-G4ZWUIPR.js +22 -0
  148. package/docs/README.md +22 -17
  149. package/docs/acp.md +168 -16
  150. package/docs/alcf-provider.md +1 -1
  151. package/docs/architecture.md +136 -7
  152. package/docs/artifact-versions.md +1 -1
  153. package/docs/built-in-agents.md +1 -1
  154. package/docs/capacity-and-scheduling.md +1 -1
  155. package/docs/commands-and-modes.md +114 -71
  156. package/docs/config-knobs-audit.md +1 -3
  157. package/docs/configuration-and-targets.md +174 -46
  158. package/docs/context-engine.md +29 -6
  159. package/docs/development-pipeline.md +26 -1
  160. package/docs/dispatch-architecture-rationale.md +1 -1
  161. package/docs/documentation-coverage.md +2 -2
  162. package/docs/documentation-guide.md +1 -1
  163. package/docs/environment-variables.md +13 -5
  164. package/docs/eval-runner.md +1 -1
  165. package/docs/evals-internal.md +1 -1
  166. package/docs/evidence-and-memory.md +6 -2
  167. package/docs/evolution.md +2 -2
  168. package/docs/exit-codes-and-output.md +15 -9
  169. package/docs/extensions-and-sharing.md +9 -9
  170. package/docs/fleet-dispatch.md +7 -5
  171. package/docs/git-commit-provenance.md +120 -0
  172. package/docs/glossary.md +1 -1
  173. package/docs/installation-and-lifecycle.md +34 -27
  174. package/docs/middleware-and-components.md +1 -1
  175. package/docs/model-catalog.md +45 -14
  176. package/docs/observability.md +8 -5
  177. package/docs/performance-methodology.md +491 -0
  178. package/docs/pi-boundary.md +72 -0
  179. package/docs/proactive-memory.md +3 -3
  180. package/docs/prompt-envelope-and-tools.md +24 -3
  181. package/docs/provider-adapter-cookbook.md +57 -4
  182. package/docs/release-cut-checklist.md +129 -115
  183. package/docs/safety-model.md +9 -5
  184. package/docs/scientific-validation.md +3 -3
  185. package/docs/session-lifecycle.md +55 -12
  186. package/docs/skills-marketplace.md +12 -8
  187. package/docs/time-conventions.md +1 -1
  188. package/docs/tool-usage.md +3 -3
  189. package/docs/trace-store.md +1 -1
  190. package/docs/troubleshooting.md +10 -7
  191. package/docs/tui-design.md +47 -10
  192. package/docs/worker-dispatch-mechanics.md +1 -1
  193. package/package.json +19 -22
  194. package/skills/coding/ast-grep/SKILL.md +136 -0
  195. package/skills/coding/ast-grep/evals.md +56 -0
  196. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  197. package/skills/coding/coding-standards/SKILL.md +113 -0
  198. package/skills/coding/coding-standards/evals.md +34 -0
  199. package/skills/coding/prototype/SKILL.md +86 -0
  200. package/skills/coding/prototype/evals.md +42 -0
  201. package/skills/coding/prototype/references/LOGIC.md +67 -0
  202. package/skills/coding/prototype/references/UI.md +112 -0
  203. package/skills/coding/tdd/SKILL.md +101 -0
  204. package/skills/coding/tdd/evals.md +41 -0
  205. package/skills/coding/tdd/references/mocking.md +59 -0
  206. package/skills/coding/tdd/references/tests.md +77 -0
  207. package/skills/context/context-handoff/SKILL.md +126 -0
  208. package/skills/context/context-handoff/evals.md +57 -0
  209. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  210. package/skills/context/context-prime/SKILL.md +95 -0
  211. package/skills/context/context-prime/evals.md +54 -0
  212. package/skills/meta/clio-dev/SKILL.md +91 -0
  213. package/skills/meta/clio-dev/evals.md +45 -0
  214. package/skills/meta/clio-test/SKILL.md +130 -0
  215. package/skills/meta/clio-test/evals.md +43 -0
  216. package/skills/meta/clio-test/references/harness.md +97 -0
  217. package/skills/meta/clio-test/references/test-map.md +59 -0
  218. package/skills/meta/credentials/SKILL.md +125 -0
  219. package/skills/meta/credentials/evals.md +104 -0
  220. package/skills/meta/find-skills/SKILL.md +72 -0
  221. package/skills/meta/find-skills/evals.md +47 -0
  222. package/skills/meta/herdr/SKILL.md +127 -0
  223. package/skills/meta/herdr/evals.md +38 -0
  224. package/skills/meta/skill-craft/SKILL.md +102 -0
  225. package/skills/meta/skill-craft/evals.md +41 -0
  226. package/skills/planning/architecture/SKILL.md +129 -0
  227. package/skills/planning/architecture/evals.md +36 -0
  228. package/skills/planning/backlog/SKILL.md +90 -0
  229. package/skills/planning/backlog/evals.md +43 -0
  230. package/skills/planning/prd/SKILL.md +82 -0
  231. package/skills/planning/prd/evals.md +49 -0
  232. package/skills/planning/product-intent/SKILL.md +112 -0
  233. package/skills/planning/product-intent/evals.md +36 -0
  234. package/skills/planning/tech-spec/SKILL.md +115 -0
  235. package/skills/planning/tech-spec/evals.md +47 -0
  236. package/skills/registry.yaml +136 -0
  237. package/skills/research/arxiv-literature/SKILL.md +104 -0
  238. package/skills/research/arxiv-literature/evals.md +58 -0
  239. package/skills/research/experiment-protocol/SKILL.md +122 -0
  240. package/skills/research/experiment-protocol/evals.md +91 -0
  241. package/skills/research/scientific-debugging/SKILL.md +119 -0
  242. package/skills/research/scientific-debugging/evals.md +138 -0
  243. package/skills/research/scientific-modernization/SKILL.md +138 -0
  244. package/skills/research/scientific-modernization/evals.md +84 -0
  245. package/skills/workflow/design-council/SKILL.md +139 -0
  246. package/skills/workflow/design-council/evals.md +97 -0
  247. package/skills/workflow/grill-me/SKILL.md +186 -0
  248. package/skills/workflow/grill-me/evals.md +78 -0
  249. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  250. package/skills/workflow/workflow-distiller/evals.md +107 -0
  251. package/src/cli/acp.ts +31 -4
  252. package/src/cli/clio.ts +68 -6
  253. package/src/cli/config-inspect.ts +28 -22
  254. package/src/cli/configure.ts +47 -9
  255. package/src/cli/context-clear.ts +2 -2
  256. package/src/cli/context-index.ts +21 -23
  257. package/src/cli/context.ts +13 -8
  258. package/src/cli/default-target.ts +9 -17
  259. package/src/cli/docs.ts +11 -5
  260. package/src/cli/evidence.ts +4 -1
  261. package/src/cli/extensions.ts +10 -1
  262. package/src/cli/fleet.ts +47 -6
  263. package/src/cli/index.ts +55 -26
  264. package/src/cli/memory.ts +3 -1
  265. package/src/cli/models.ts +1 -1
  266. package/src/cli/modes/json-stream.ts +37 -1
  267. package/src/cli/modes/print.ts +24 -9
  268. package/src/cli/run.ts +2 -2
  269. package/src/cli/skills-eval.ts +23 -8
  270. package/src/cli/skills.ts +19 -4
  271. package/src/cli/targets.ts +4 -0
  272. package/src/cli/text-layout.ts +15 -5
  273. package/src/cli/trace.ts +62 -14
  274. package/src/cli/upgrade.ts +18 -2
  275. package/src/cli/usage.ts +10 -3
  276. package/src/cli/wiki-generate.ts +2 -1
  277. package/src/core/agent-environment.ts +7 -0
  278. package/src/core/bash-exec.ts +72 -1
  279. package/src/core/boot-trace.ts +9 -4
  280. package/src/core/bus-events.ts +20 -4
  281. package/src/core/commit-attribution.ts +157 -0
  282. package/src/core/compile-cache.ts +159 -0
  283. package/src/core/config.ts +131 -2
  284. package/src/core/defaults.ts +39 -5
  285. package/src/core/domain-loader.ts +12 -5
  286. package/src/core/git-commit-attribution.ts +362 -0
  287. package/src/core/incomplete-installation.ts +45 -0
  288. package/src/core/response-schema.ts +1 -1
  289. package/src/core/safe-exec.ts +13 -1
  290. package/src/core/settings-layers.ts +155 -21
  291. package/src/core/skill-activation.ts +1 -1
  292. package/src/core/startup-timer.ts +3 -3
  293. package/src/core/state-file-lock.ts +13 -1
  294. package/src/core/termination.ts +78 -5
  295. package/src/domains/config/classify.ts +15 -3
  296. package/src/domains/config/extension.ts +19 -13
  297. package/src/domains/config/index.ts +10 -0
  298. package/src/domains/config/keybindings.ts +42 -6
  299. package/src/domains/context/bootstrap-prompt.ts +1 -1
  300. package/src/domains/context/bootstrap.ts +111 -18
  301. package/src/domains/context/clear.ts +16 -11
  302. package/src/domains/context/clio-md.ts +111 -9
  303. package/src/domains/context/codewiki/artifact.ts +400 -0
  304. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  305. package/src/domains/context/codewiki/build-worker.ts +54 -0
  306. package/src/domains/context/codewiki/coordinator.ts +182 -0
  307. package/src/domains/context/codewiki/indexer.ts +59 -144
  308. package/src/domains/context/codewiki/paths.ts +67 -0
  309. package/src/domains/context/codewiki/schema.ts +80 -0
  310. package/src/domains/context/codewiki/tree-sitter.ts +1 -1
  311. package/src/domains/context/contract.ts +11 -5
  312. package/src/domains/context/extension.ts +94 -143
  313. package/src/domains/context/fingerprint.ts +3 -1
  314. package/src/domains/context/index.ts +12 -22
  315. package/src/domains/context/project-metadata.ts +19 -0
  316. package/src/domains/context/prompt-context.ts +9 -10
  317. package/src/domains/context/refresh.ts +29 -21
  318. package/src/domains/context/runtime.ts +17 -0
  319. package/src/domains/context/wiki/generate.ts +39 -34
  320. package/src/domains/context/wiki/plan.ts +1 -1
  321. package/src/domains/context/wiki/prompts.ts +21 -8
  322. package/src/domains/dispatch/code-step.ts +20 -1
  323. package/src/domains/dispatch/extension.ts +158 -21
  324. package/src/domains/dispatch/failure-classification.ts +6 -0
  325. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  326. package/src/domains/dispatch/orphan-recovery.ts +50 -8
  327. package/src/domains/dispatch/receipt-integrity.ts +5 -0
  328. package/src/domains/dispatch/state.ts +31 -6
  329. package/src/domains/dispatch/transport.ts +2 -1
  330. package/src/domains/dispatch/types.ts +14 -0
  331. package/src/domains/dispatch/worker-spawn.ts +21 -2
  332. package/src/domains/eval/metrics/context.ts +1 -1
  333. package/src/domains/eval/types.ts +0 -1
  334. package/src/domains/evidence/build.ts +41 -1
  335. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  336. package/src/domains/lifecycle/migrations/index.ts +24 -4
  337. package/src/domains/middleware/hooks-io.ts +12 -0
  338. package/src/domains/middleware/skills-reminder.ts +30 -15
  339. package/src/domains/prompts/compiler.ts +142 -84
  340. package/src/domains/prompts/contract.ts +18 -2
  341. package/src/domains/prompts/extension.ts +39 -7
  342. package/src/domains/prompts/fragment-loader.ts +0 -1
  343. package/src/domains/prompts/fragments/identity/clio.md +2 -4
  344. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  345. package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
  346. package/src/domains/prompts/fragments/operating/contract.md +4 -50
  347. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  348. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  349. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  350. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  351. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  352. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  353. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  354. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  355. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  356. package/src/domains/prompts/preload.ts +3 -3
  357. package/src/domains/providers/auth/api-key.ts +1 -1
  358. package/src/domains/providers/auth/backend-file.ts +20 -10
  359. package/src/domains/providers/auth/backend-memory.ts +59 -4
  360. package/src/domains/providers/auth/boot-status.ts +65 -0
  361. package/src/domains/providers/auth/oauth.ts +2 -1
  362. package/src/domains/providers/auth/storage.ts +97 -38
  363. package/src/domains/providers/capabilities.ts +12 -4
  364. package/src/domains/providers/contract.ts +15 -4
  365. package/src/domains/providers/extension.ts +18 -6
  366. package/src/domains/providers/model-runtime-capabilities.ts +15 -4
  367. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
  368. package/src/domains/providers/plugins.ts +5 -3
  369. package/src/domains/providers/probe/fingerprint.ts +25 -5
  370. package/src/domains/providers/registry.ts +31 -10
  371. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  372. package/src/domains/providers/runtimes/builtins.ts +2 -2
  373. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  374. package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
  375. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  376. package/src/domains/providers/support.ts +6 -3
  377. package/src/domains/providers/types/local-model-quirks.ts +7 -9
  378. package/src/domains/providers/types/runtime-descriptor.ts +12 -1
  379. package/src/domains/providers/types/target-descriptor.ts +22 -0
  380. package/src/domains/resources/contract.ts +0 -1
  381. package/src/domains/resources/extension.ts +1 -3
  382. package/src/domains/resources/loader.ts +3 -4
  383. package/src/domains/resources/prompts/loader.ts +16 -2
  384. package/src/domains/resources/prompts/substitute.ts +1 -65
  385. package/src/domains/resources/skills/content-hash.ts +2 -0
  386. package/src/domains/resources/skills/install.ts +17 -0
  387. package/src/domains/resources/skills/loader.ts +17 -10
  388. package/src/domains/resources/skills/marketplace.ts +55 -9
  389. package/src/domains/safety/action-classifier.ts +4 -2
  390. package/src/domains/safety/audit.ts +8 -2
  391. package/src/domains/safety/extension.ts +1 -1
  392. package/src/domains/session/compaction/branch-summary.ts +3 -2
  393. package/src/domains/session/compaction/cut-point.ts +2 -1
  394. package/src/domains/session/compaction/tokens.ts +2 -1
  395. package/src/domains/session/context-ledger.ts +14 -0
  396. package/src/domains/session/contract.ts +15 -0
  397. package/src/domains/session/decision-board.ts +190 -0
  398. package/src/domains/session/entries.ts +66 -3
  399. package/src/domains/session/extension.ts +93 -12
  400. package/src/domains/session/retry.ts +10 -18
  401. package/src/domains/session/session-artifacts.ts +107 -0
  402. package/src/domains/session/task-board.ts +207 -13
  403. package/src/domains/session/tree/active-path.ts +44 -5
  404. package/src/domains/session/tree/fork.ts +26 -27
  405. package/src/domains/session/tree/preview.ts +2 -2
  406. package/src/domains/session/workspace/git-probe.ts +17 -11
  407. package/src/domains/user-tasks/store.ts +297 -0
  408. package/src/engine/acp/errors.ts +96 -0
  409. package/src/engine/acp/server.ts +1728 -146
  410. package/src/engine/acp/transport.ts +135 -14
  411. package/src/engine/acp/types.ts +26 -0
  412. package/src/engine/agent.ts +3 -3
  413. package/src/engine/ai.ts +32 -27
  414. package/src/engine/alcf-oauth.ts +26 -19
  415. package/src/engine/api-registry.ts +223 -0
  416. package/src/engine/apis/index.ts +3 -7
  417. package/src/engine/apis/llamacpp-residency.ts +49 -9
  418. package/src/engine/apis/lmstudio-residency.ts +5 -21
  419. package/src/engine/apis/lmstudio.ts +243 -0
  420. package/src/engine/apis/ollama-native.ts +24 -3
  421. package/src/engine/apis/openai-completions.ts +170 -91
  422. package/src/engine/apis/residency.ts +139 -3
  423. package/src/engine/apis/types.ts +16 -0
  424. package/src/engine/env-api-keys.ts +98 -0
  425. package/src/engine/gemma-channel-filter.ts +223 -0
  426. package/src/engine/instrumented-tui.ts +192 -0
  427. package/src/engine/messages.ts +14 -0
  428. package/src/engine/models.ts +42 -0
  429. package/src/engine/oauth.ts +16 -12
  430. package/src/engine/prompt-templates.ts +1 -0
  431. package/src/engine/provider-payload.ts +16 -59
  432. package/src/engine/strip-tokenizer-sentinels.ts +1 -1
  433. package/src/engine/truncate.ts +9 -0
  434. package/src/engine/tui.ts +17 -9
  435. package/src/engine/types.ts +3 -6
  436. package/src/engine/worker-runtime-capabilities.ts +5 -0
  437. package/src/engine/worker-runtime.ts +1 -1
  438. package/src/engine/worker-tools.ts +9 -4
  439. package/src/entry/boot-options.ts +50 -0
  440. package/src/entry/orchestrator.ts +288 -150
  441. package/src/interactive/application-controller.ts +89 -2
  442. package/src/interactive/chat-loop.ts +266 -41
  443. package/src/interactive/chat-panel.ts +173 -47
  444. package/src/interactive/chat-renderer.ts +262 -72
  445. package/src/interactive/clio-editor.ts +3 -8
  446. package/src/interactive/command-fallbacks.ts +2 -2
  447. package/src/interactive/context-overlay.ts +27 -1
  448. package/src/interactive/editor-submit.ts +228 -24
  449. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  450. package/src/interactive/export-html/index.ts +51 -0
  451. package/src/interactive/export-html/template.ts +45 -0
  452. package/src/interactive/export-html/tool-renderer.ts +54 -0
  453. package/src/interactive/footer/dashboard.ts +4 -0
  454. package/src/interactive/footer/notifications.ts +1 -1
  455. package/src/interactive/footer/widgets.ts +20 -2
  456. package/src/interactive/footer-panel.ts +2 -2
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +201 -17
  459. package/src/interactive/interactive-event-projection.ts +6 -1
  460. package/src/interactive/interactive-input-runtime.ts +50 -4
  461. package/src/interactive/interactive-presentation.ts +151 -19
  462. package/src/interactive/interactive-shell.ts +268 -14
  463. package/src/interactive/interactive-slash-runtime.ts +176 -114
  464. package/src/interactive/interactive-tickers.ts +38 -7
  465. package/src/interactive/keybinding-manager.ts +1 -1
  466. package/src/interactive/layout.ts +40 -3
  467. package/src/interactive/overlay-frame.ts +1 -1
  468. package/src/interactive/overlay-general-openers.ts +58 -1
  469. package/src/interactive/overlay-key-routing.ts +3 -0
  470. package/src/interactive/overlay-lifecycle.ts +13 -0
  471. package/src/interactive/overlay-permission-lifecycle.ts +2 -1
  472. package/src/interactive/overlay-session-lifecycle.ts +69 -12
  473. package/src/interactive/overlays/decisions.ts +300 -0
  474. package/src/interactive/overlays/help-reference.ts +15 -10
  475. package/src/interactive/overlays/model-selector.ts +34 -16
  476. package/src/interactive/overlays/session-selector.ts +18 -0
  477. package/src/interactive/overlays/settings.ts +105 -17
  478. package/src/interactive/overlays/skills-hub.ts +4 -4
  479. package/src/interactive/overlays/tree-selector.ts +41 -6
  480. package/src/interactive/render-trace.ts +499 -90
  481. package/src/interactive/renderers/compaction-summary.ts +2 -2
  482. package/src/interactive/renderers/diff.ts +115 -104
  483. package/src/interactive/renderers/mermaid.ts +53 -0
  484. package/src/interactive/renderers/tool-execution.ts +386 -133
  485. package/src/interactive/renderers/worker-entry.ts +20 -4
  486. package/src/interactive/session-switch-settlement.ts +10 -0
  487. package/src/interactive/slash-autocomplete.ts +6 -114
  488. package/src/interactive/slash-commands.ts +135 -47
  489. package/src/interactive/slash-spec.ts +9 -38
  490. package/src/interactive/status/controller.ts +5 -1
  491. package/src/interactive/stdout-backpressure.ts +99 -0
  492. package/src/interactive/stream-pacer.ts +530 -0
  493. package/src/interactive/stream-pacing-policy.ts +66 -0
  494. package/src/interactive/tasks-overlay.ts +368 -14
  495. package/src/interactive/terminal-lease.ts +485 -0
  496. package/src/interactive/theme/tokens.ts +1 -1
  497. package/src/interactive/turn-context.ts +4 -3
  498. package/src/interactive/turn-persistence.ts +30 -13
  499. package/src/interactive/turn-queues.ts +12 -0
  500. package/src/interactive/turn-recovery.ts +25 -8
  501. package/src/interactive/turn-runtime.ts +79 -12
  502. package/src/interactive/turn-state.ts +10 -0
  503. package/src/interactive/view/artifacts.ts +114 -4
  504. package/src/interactive/view/view-overlay.ts +3 -0
  505. package/src/interactive/welcome-dashboard.ts +17 -16
  506. package/src/interactive/worker-receipts.ts +52 -3
  507. package/src/interactive/worker-stream.ts +5 -1
  508. package/src/tools/agent-tools.ts +23 -3
  509. package/src/tools/artifact.ts +2 -2
  510. package/src/tools/ask-user.ts +23 -13
  511. package/src/tools/bash.ts +30 -2
  512. package/src/tools/bootstrap.ts +34 -431
  513. package/src/tools/builtin-tool-catalog.ts +265 -0
  514. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  515. package/src/tools/codewiki/code-nav.ts +8 -22
  516. package/src/tools/codewiki/shared.ts +41 -38
  517. package/src/tools/context/docs-engine.ts +14 -3
  518. package/src/tools/context/index.ts +107 -28
  519. package/src/tools/context/surface.ts +19 -0
  520. package/src/tools/core-bootstrap.ts +168 -0
  521. package/src/tools/credential-present.ts +5 -5
  522. package/src/tools/dispatch-admission.ts +533 -0
  523. package/src/tools/dispatch-background.ts +54 -0
  524. package/src/tools/dispatch-event-text.ts +6 -0
  525. package/src/tools/dispatch-plan.ts +9 -4
  526. package/src/tools/dispatch-run-events.ts +238 -0
  527. package/src/tools/dispatch-runner.ts +2370 -0
  528. package/src/tools/dispatch-scout-admission.ts +295 -0
  529. package/src/tools/dispatch-types.ts +77 -0
  530. package/src/tools/dispatch.ts +67 -3161
  531. package/src/tools/find.ts +4 -2
  532. package/src/tools/grep.ts +2 -2
  533. package/src/tools/lazy-tool.ts +60 -0
  534. package/src/tools/ledger.ts +3 -3
  535. package/src/tools/monitor-surface.ts +36 -0
  536. package/src/tools/monitor.ts +2 -32
  537. package/src/tools/observers.ts +2 -2
  538. package/src/tools/registry.ts +39 -27
  539. package/src/tools/safe-exec.ts +2 -2
  540. package/src/tools/steer-surface.ts +17 -0
  541. package/src/tools/steer.ts +2 -13
  542. package/src/tools/tasks.ts +108 -11
  543. package/src/tools/truncate.ts +25 -184
  544. package/src/tools/verify/frontend.ts +3 -1
  545. package/src/tools/verify/index.ts +3 -38
  546. package/src/tools/verify/surface.ts +46 -0
  547. package/src/tools/web-fetch-surface.ts +23 -0
  548. package/src/tools/web-fetch.ts +2 -20
  549. package/src/tools/write.ts +7 -2
  550. package/src/worker/entry.ts +39 -2
  551. package/src/worker/spec-contract.ts +26 -5
  552. package/dist/chunk-7SS2CTV2.js +0 -61361
  553. package/dist/chunk-DKGKUHFA.js +0 -924
  554. package/dist/chunk-GEP36Y4X.js +0 -12796
  555. package/dist/chunk-XYWBQRDM.js +0 -137
  556. package/dist/clio-BZVGEUFJ.js +0 -58
  557. package/dist/configure-S7S6F6CL.js +0 -32
  558. package/docs/html/agents_blueprint.html +0 -936
  559. package/docs/html/alcf_blueprint.html +0 -324
  560. package/docs/html/architecture_blueprint.html +0 -850
  561. package/docs/html/commands_blueprint.html +0 -939
  562. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  563. package/docs/html/configuration_blueprint.html +0 -1080
  564. package/docs/html/context_blueprint.html +0 -603
  565. package/docs/html/documentation_blueprint.html +0 -832
  566. package/docs/html/environment_blueprint.html +0 -404
  567. package/docs/html/eval_blueprint.html +0 -743
  568. package/docs/html/evals_internal_blueprint.html +0 -190
  569. package/docs/html/evolution_blueprint.html +0 -674
  570. package/docs/html/extensions_blueprint.html +0 -2065
  571. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  572. package/docs/html/index.html +0 -919
  573. package/docs/html/lifecycle_blueprint.html +0 -723
  574. package/docs/html/memory_blueprint.html +0 -699
  575. package/docs/html/middleware_blueprint.html +0 -664
  576. package/docs/html/models_blueprint.html +0 -2366
  577. package/docs/html/observability_blueprint.html +0 -683
  578. package/docs/html/provider_adapter_blueprint.html +0 -245
  579. package/docs/html/safety_blueprint.html +0 -1386
  580. package/docs/html/shared.css +0 -571
  581. package/docs/html/shared.js +0 -143
  582. package/docs/html/skills_blueprint.html +0 -671
  583. package/docs/html/soak_blueprint.html +0 -182
  584. package/docs/html/tool_usage_blueprint.html +0 -350
  585. package/docs/html/tools_blueprint.html +0 -2249
  586. package/docs/html/trace_blueprint.html +0 -235
  587. package/docs/html/tui_design_blueprint.html +0 -374
  588. package/docs/html/validation_blueprint.html +0 -961
  589. package/docs/html/worker_dispatch_blueprint.html +0 -231
  590. package/src/core/release.ts +0 -2
  591. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  592. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  593. package/src/engine/apis/lmstudio-native.ts +0 -1438
  594. package/src/engine/apis/thinking-replay.ts +0 -11
  595. package/src/tools/string-enum.ts +0 -15
@@ -6,7 +6,7 @@ import {
6
6
  import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
7
7
  import { performCheckpoint } from "./checkpoint.js";
8
8
  import type { DeleteSessionOptions, SessionContract, SessionEntryInput, SessionMeta, TurnInput } from "./contract.js";
9
- import type { LabelEntry, SessionEntry } from "./entries.js";
9
+ import type { LabelEntry, SessionEntry, SessionInfoEntry } from "./entries.js";
10
10
  import { listSessionsForCwd } from "./history.js";
11
11
  import {
12
12
  appendEntry,
@@ -48,6 +48,26 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
48
48
  context.bus.emit(BusChannels.SessionResumed, { sessionId, via, at: Date.now() });
49
49
  }
50
50
 
51
+ function emitTurnSwitched(sessionId: string, turnId: string): void {
52
+ context.bus.emit(BusChannels.SessionTurnSwitched, { sessionId, turnId, at: Date.now() });
53
+ }
54
+
55
+ /**
56
+ * The leaf to resume onto: the persisted `/tree` pin when it still names a
57
+ * real turn in this session's tree, otherwise the inferred newest-node leaf.
58
+ * A pin surviving here is what makes a `/tree` switch made without a
59
+ * follow-up message survive quit + resume instead of silently reverting to
60
+ * the abandoned tip (issue #94).
61
+ */
62
+ function resolveLeafOnOpen(resumed: {
63
+ state: SessionManagerState;
64
+ nodes: ReadonlyArray<TreeInputNode>;
65
+ }): string | null {
66
+ const pinned = resumed.state.meta.pinnedLeafTurnId;
67
+ if (pinned && resumed.nodes.some((node) => node.id === pinned)) return pinned;
68
+ return computeLeafId(resumed.nodes);
69
+ }
70
+
51
71
  async function closeCurrent(reason: ParkReason = "close"): Promise<void> {
52
72
  if (!state) return;
53
73
  const s = state;
@@ -118,6 +138,10 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
118
138
  // to a previewless snapshot. The overlay handles missing previews
119
139
  // gracefully via its kind-label fallback.
120
140
  }
141
+ const persistedLeaf =
142
+ bundle.meta.pinnedLeafTurnId && bundle.nodes.some((node) => node.id === bundle.meta.pinnedLeafTurnId)
143
+ ? bundle.meta.pinnedLeafTurnId
144
+ : computeLeafId(bundle.nodes);
121
145
  return buildTreeSnapshot({
122
146
  meta,
123
147
  nodes: [...bundle.nodes, ...structural],
@@ -126,7 +150,7 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
126
150
  // The leaf is the next append point, so it is computed over turn nodes
127
151
  // only: a structural node marks a moment in the timeline, never a place
128
152
  // the session continues from.
129
- leafId: state?.meta.id === sessionId ? currentTurnId : computeLeafId(bundle.nodes),
153
+ leafId: state?.meta.id === sessionId ? currentTurnId : persistedLeaf,
130
154
  });
131
155
  }
132
156
 
@@ -156,8 +180,28 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
156
180
  },
157
181
  append(turn: TurnInput) {
158
182
  if (!state) throw new Error("session.append: no current session");
183
+ // Invariant: a turn can only extend this session's own current leaf.
184
+ // The interactive layer tracks its own copy of "the last turn id"
185
+ // (turn-persistence.ts) and normally keeps it in lockstep with
186
+ // currentTurnId via chat.resetForSession after every switch; when a
187
+ // failed resume/fork/switchBranch left that copy pointing at a turn
188
+ // from a session that was never actually opened here, this is the
189
+ // one place that catches it before a foreign parent id reaches disk.
190
+ if (turn.parentId !== currentTurnId) {
191
+ throw new Error(
192
+ `session.append: turn parentId ${turn.parentId ?? "null"} is not this session's current leaf (expected ${currentTurnId ?? "null"}); refusing to parent a turn onto another session's turn`,
193
+ );
194
+ }
159
195
  const record = appendTurn(state, turn);
160
196
  currentTurnId = record.id;
197
+ // A fresh append moves the leaf past whatever /tree pinned earlier
198
+ // (or this append could not have been made: see the invariant above),
199
+ // so the persisted pin is stale and must not outlive it. Once cleared,
200
+ // resolveLeafOnOpen's timestamp inference is trustworthy again.
201
+ if (state.meta.pinnedLeafTurnId !== undefined && state.meta.pinnedLeafTurnId !== null) {
202
+ state.meta.pinnedLeafTurnId = null;
203
+ persistSessionMeta(state);
204
+ }
161
205
  return record;
162
206
  },
163
207
  appendEntry(entry: SessionEntryInput) {
@@ -190,29 +234,37 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
190
234
  },
191
235
  resume(sessionId) {
192
236
  if (state && state.meta.id === sessionId) return state.meta;
237
+ // Open the target before touching the current session: resumeSessionState
238
+ // reads and migrates the target's meta.json and can throw (unsupported
239
+ // format version, unreadable entries, missing files). Closing or nulling
240
+ // the prior session ahead of that risk is how a failed switch used to
241
+ // orphan the operator with no current session (issue #93); on success,
242
+ // the prior is parked and closed only now that the successor is known good.
243
+ const resumed = resumeSessionState(sessionId);
193
244
  if (state) {
194
- // best-effort close of prior session before switching
195
245
  const prior = state;
196
246
  emitPark(prior.meta.id, "resume_other");
197
- state = null;
198
247
  void prior.writer.close();
199
248
  }
200
- const resumed = resumeSessionState(sessionId);
201
249
  state = resumed.state;
202
- currentTurnId = computeLeafId(resumed.nodes);
250
+ currentTurnId = resolveLeafOnOpen(resumed);
203
251
  emitResume(resumed.state.meta.id, "resume");
204
252
  return resumed.state.meta;
205
253
  },
206
254
  fork(parentTurnId, input) {
207
255
  if (!state) throw new Error("session.fork: no current session to fork from");
208
256
  const prior = state;
209
- emitPark(prior.meta.id, "fork");
210
- state = null;
257
+ // forkFromState reads and validates the parent's own ancestry chain
258
+ // and can throw (unknown or broken parent turn) before it ever creates
259
+ // the child session; it closes `prior.writer` itself, and only once the
260
+ // child is known good (see tree/fork.ts). Do not null or park `state`
261
+ // until forkFromState returns, for the same reason as resume() above.
211
262
  const { next, nodes } = forkFromState({
212
263
  from: prior,
213
264
  parentTurnId,
214
265
  ...(input?.cwd !== undefined ? { cwd: input.cwd } : {}),
215
266
  });
267
+ emitPark(prior.meta.id, "fork");
216
268
  state = next;
217
269
  currentTurnId = computeLeafId(nodes);
218
270
  return next.meta;
@@ -232,17 +284,17 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
232
284
  switchBranch(sessionId) {
233
285
  // /tree-driven branch switch currently delegates to resume. Kept as a
234
286
  // distinct contract method so later slices can layer telemetry or
235
- // chat-loop rewiring without changing resume's semantics.
287
+ // chat-loop rewiring without changing resume's semantics. Same
288
+ // open-before-close ordering as resume() above and for the same reason.
236
289
  if (state?.meta.id === sessionId) return state.meta;
290
+ const resumed = resumeSessionState(sessionId);
237
291
  if (state) {
238
292
  const prior = state;
239
293
  emitPark(prior.meta.id, "switch_branch");
240
- state = null;
241
294
  void prior.writer.close();
242
295
  }
243
- const resumed = resumeSessionState(sessionId);
244
296
  state = resumed.state;
245
- currentTurnId = computeLeafId(resumed.nodes);
297
+ currentTurnId = resolveLeafOnOpen(resumed);
246
298
  emitResume(resumed.state.meta.id, "switch_branch");
247
299
  return resumed.state.meta;
248
300
  },
@@ -254,6 +306,13 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
254
306
  throw new Error(`session.switchTurn: turn not found: ${turnId}`);
255
307
  }
256
308
  currentTurnId = turnId;
309
+ // Persist the pin immediately, not just in memory: without this, a
310
+ // switch made without a follow-up message was silently lost on quit
311
+ // because resume() had nothing but timestamp inference to fall back
312
+ // on and always landed back on the abandoned tip (issue #94).
313
+ state.meta.pinnedLeafTurnId = turnId;
314
+ persistSessionMeta(state);
315
+ emitTurnSwitched(state.meta.id, turnId);
257
316
  return state.meta;
258
317
  },
259
318
  editLabel(turnId, label, sessionId) {
@@ -281,6 +340,28 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
281
340
  };
282
341
  appendEntryToSessionFile(targetId, entry);
283
342
  },
343
+ setName(name, sessionId) {
344
+ const targetId = sessionId ?? state?.meta.id;
345
+ if (!targetId) throw new Error("session.setName: no sessionId provided and no current session");
346
+ // A name is session-wide metadata rather than a turn label. Keep it
347
+ // unanchored and let history's last-wins SessionInfoEntry fold resolve it.
348
+ if (state && state.meta.id === targetId) {
349
+ appendEntry(state, {
350
+ kind: "sessionInfo",
351
+ parentTurnId: null,
352
+ name,
353
+ } as SessionEntryInput);
354
+ return;
355
+ }
356
+ const entry: SessionInfoEntry = {
357
+ kind: "sessionInfo",
358
+ turnId: newTurnId(),
359
+ parentTurnId: null,
360
+ timestamp: new Date().toISOString(),
361
+ name,
362
+ };
363
+ appendEntryToSessionFile(targetId, entry);
364
+ },
284
365
  deleteSession(id, opts) {
285
366
  if (state?.meta.id === id) {
286
367
  throw new Error("session.deleteSession: refusing to delete the currently open session; close() first");
@@ -10,16 +10,17 @@
10
10
  *
11
11
  * This module is the pure building block for the Clio equivalent. It:
12
12
  * 1. Declares the RetrySettings shape and sensible defaults.
13
- * 2. Exposes a deterministic heuristic (`isRetryableErrorMessage`) that
14
- * matches the transient error strings pi-ai providers actually emit.
13
+ * 2. Routes generic provider classification through pi-ai 0.84's
14
+ * `isRetryableAssistantError`, retaining only Clio's local-model delta.
15
15
  * 3. Computes the backoff delay for a given attempt (`computeRetryDelayMs`)
16
16
  * with the cap the settings declare; callers schedule the wait.
17
17
  * 4. Provides `createRetryCountdown` so the TUI can show seconds remaining
18
18
  * and cancel a pending retry on `Esc` without coupling to a specific
19
19
  * timer abstraction.
20
20
  *
21
- * No I/O, no pi-agent-core/pi-ai imports. The chat-loop wiring (which decides
22
- * whether an agent_end with stopReason "error" triggers a retry) lives in
21
+ * No I/O. The only engine dependency is the classifier re-exported by
22
+ * `src/engine/ai.ts`. The chat-loop wiring (which decides whether an
23
+ * agent_end with stopReason "error" triggers a retry) lives in
23
24
  * `src/interactive/chat-loop.ts` and consumes this module; keeping the two
24
25
  * split so the countdown can be exercised in unit tests without spinning up a
25
26
  * runtime.
@@ -27,6 +28,7 @@
27
28
 
28
29
  import { performance } from "node:perf_hooks";
29
30
  import type { RetrySettings } from "../../core/defaults.js";
31
+ import { isEngineRetryableAssistantError } from "../../engine/ai.js";
30
32
 
31
33
  export type { RetrySettings } from "../../core/defaults.js";
32
34
 
@@ -42,16 +44,6 @@ export const DEFAULT_RETRY_SETTINGS: RetrySettings = {
42
44
  streamStallMs: 180000,
43
45
  };
44
46
 
45
- /**
46
- * Pattern list built from pi-mono's `_isRetryableError` regex (agent-session.ts).
47
- * Kept as a plain RegExp so the check is `O(1)` per assistant error message.
48
- * The match is case-insensitive: providers phrase the same error in mixed
49
- * case (Anthropic: "Overloaded", OpenRouter: "rate limited", Fireworks:
50
- * "connection error"), and we want all of them classified as transient.
51
- */
52
- const RETRYABLE_PATTERN =
53
- /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|timed? out|timeout|terminated|retry delay/i;
54
-
55
47
  /**
56
48
  * A self-hosted server refusing a request because the model is not resident.
57
49
  *
@@ -61,7 +53,7 @@ const RETRYABLE_PATTERN =
61
53
  * llama-swap and Ollama phrase the same condition differently, so the pattern
62
54
  * covers the family rather than one vendor's wording.
63
55
  *
64
- * Deliberately not folded into {@link RETRYABLE_PATTERN}: this is transient in
56
+ * Deliberately kept outside pi's generic classifier: this is transient in
65
57
  * a different unit. A rate limit clears in a second or two; a 35B model loads
66
58
  * off disk in twenty to sixty, and retrying it on a rate limit's backoff burns
67
59
  * every attempt before the server is ready. `clio-coder run --target node-a --model
@@ -95,7 +87,7 @@ export function isModelLoadingErrorMessage(errorMessage: string | null | undefin
95
87
  */
96
88
  export function isRetryableErrorMessage(errorMessage: string | null | undefined): boolean {
97
89
  if (!errorMessage || errorMessage.length === 0) return false;
98
- return RETRYABLE_PATTERN.test(errorMessage) || MODEL_LOADING_PATTERN.test(errorMessage);
90
+ return isEngineRetryableAssistantError(errorMessage) || MODEL_LOADING_PATTERN.test(errorMessage);
99
91
  }
100
92
 
101
93
  /**
@@ -125,7 +117,7 @@ export function computeRetryDelayMs(
125
117
  * initial delay; `done` flips true when the deadline is reached; `cancelled`
126
118
  * flips true when a caller aborts via `cancel()` before the deadline.
127
119
  */
128
- export interface RetryCountdownState {
120
+ interface RetryCountdownState {
129
121
  attempt: number;
130
122
  maxAttempts: number;
131
123
  seconds: number;
@@ -133,7 +125,7 @@ export interface RetryCountdownState {
133
125
  cancelled: boolean;
134
126
  }
135
127
 
136
- export interface RetryCountdownOptions {
128
+ interface RetryCountdownOptions {
137
129
  /** 1-indexed attempt id displayed to the user, e.g. "Retrying (1/3)". */
138
130
  attempt: number;
139
131
  /** Upper bound displayed alongside `attempt`. */
@@ -0,0 +1,107 @@
1
+ import { isAbsolute, relative, resolve } from "node:path";
2
+
3
+ export type SessionArtifactTool = "artifact" | "write" | "edit";
4
+ export type SessionArtifactKind = "plan" | "review" | "report";
5
+
6
+ export interface SessionArtifact {
7
+ /** Path exactly as the successful tool result recorded it. */
8
+ path: string;
9
+ tool: SessionArtifactTool;
10
+ artifactKind?: SessionArtifactKind;
11
+ turnId: string;
12
+ timestamp: string;
13
+ /** Number of earlier successful writes to this normalized path. */
14
+ overwrites: number;
15
+ }
16
+
17
+ export interface FoldSessionArtifactsOptions {
18
+ /** Recorded session cwd. Paths outside this root are rejected. */
19
+ workspace?: string;
20
+ }
21
+
22
+ function isRecord(value: unknown): value is Record<string, unknown> {
23
+ return !!value && typeof value === "object" && !Array.isArray(value);
24
+ }
25
+
26
+ function isSessionArtifactTool(value: unknown): value is SessionArtifactTool {
27
+ return value === "artifact" || value === "write" || value === "edit";
28
+ }
29
+
30
+ function isSessionArtifactKind(value: unknown): value is SessionArtifactKind {
31
+ return value === "plan" || value === "review" || value === "report";
32
+ }
33
+
34
+ function normalizedWorkspacePath(path: string, workspace: string): string | null {
35
+ const root = resolve(workspace);
36
+ const target = isAbsolute(path) ? resolve(path) : resolve(root, path);
37
+ const rel = relative(root, target);
38
+ if (rel === "" || (!rel.startsWith("..") && !isAbsolute(rel))) return target;
39
+ return null;
40
+ }
41
+
42
+ interface IndexedArtifact extends SessionArtifact {
43
+ index: number;
44
+ }
45
+
46
+ /**
47
+ * Fold durable tool-result facts into the files produced in one active-path
48
+ * session. This function never stats or reads a path; missing files remain
49
+ * visible facts and are handled by the `/view workspace` loader.
50
+ */
51
+ export function foldSessionArtifacts(
52
+ entries: ReadonlyArray<unknown>,
53
+ options: FoldSessionArtifactsOptions = {},
54
+ ): SessionArtifact[] {
55
+ const workspace = resolve(options.workspace ?? process.cwd());
56
+ const lastByPath = new Map<string, IndexedArtifact>();
57
+ const writeCounts = new Map<string, number>();
58
+ let writeIndex = 0;
59
+
60
+ for (const raw of entries) {
61
+ if (!isRecord(raw) || raw.kind !== "message" || raw.role !== "tool_result") continue;
62
+ if (typeof raw.turnId !== "string" || typeof raw.timestamp !== "string") continue;
63
+ const payload = raw.payload;
64
+ if (!isRecord(payload) || !isSessionArtifactTool(payload.toolName)) continue;
65
+ if (
66
+ payload.isError === true ||
67
+ payload.outcome === "error" ||
68
+ payload.outcome === "blocked" ||
69
+ payload.outcome === "aborted" ||
70
+ payload.outcome === "orphaned"
71
+ ) {
72
+ continue;
73
+ }
74
+ const result = payload.result;
75
+ if (!isRecord(result) || !isRecord(result.details) || !Array.isArray(result.details.paths)) continue;
76
+ const artifactKind =
77
+ payload.toolName === "artifact" && isSessionArtifactKind(result.details.kind) ? result.details.kind : undefined;
78
+ const pathsSeenInResult = new Set<string>();
79
+ for (const recordedPath of result.details.paths) {
80
+ if (typeof recordedPath !== "string" || recordedPath.trim().length === 0) continue;
81
+ const normalized = normalizedWorkspacePath(recordedPath, workspace);
82
+ if (normalized === null || pathsSeenInResult.has(normalized)) continue;
83
+ pathsSeenInResult.add(normalized);
84
+ const priorWrites = writeCounts.get(normalized) ?? 0;
85
+ writeCounts.set(normalized, priorWrites + 1);
86
+ writeIndex += 1;
87
+ lastByPath.set(normalized, {
88
+ path: recordedPath,
89
+ tool: payload.toolName,
90
+ ...(artifactKind ? { artifactKind } : {}),
91
+ turnId: raw.turnId,
92
+ timestamp: raw.timestamp,
93
+ overwrites: priorWrites,
94
+ index: writeIndex,
95
+ });
96
+ }
97
+ }
98
+
99
+ return [...lastByPath.values()]
100
+ .sort((left, right) => right.index - left.index)
101
+ .map(({ index: _index, ...artifact }) => artifact);
102
+ }
103
+
104
+ /** Resolve a recorded, already-validated artifact path for loading. */
105
+ export function resolveSessionArtifactPath(path: string, workspace: string): string | null {
106
+ return normalizedWorkspacePath(path, workspace);
107
+ }