@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
@@ -7,19 +7,19 @@ import { type Component, Markdown, truncateToWidth, wrapTextWithAnsi } from "../
7
7
  import type { AgentMessage } from "../engine/types.js";
8
8
  import type { ChatLoopEvent, RetryStatusPayload } from "./chat-loop.js";
9
9
  import { extractText, isSelfExplainingAbort } from "./chat-loop-messages.js";
10
+ import type { ApprovalRequestView } from "./permission-overlay.js";
10
11
  import { codeInk } from "./renderers/code-ink.js";
12
+ import { createMermaidMarkdownTransform } from "./renderers/mermaid.js";
11
13
  import { styleTaggedNotice } from "./renderers/notice.js";
12
14
  import { formatRetryStatus } from "./renderers/retry-status.js";
13
15
  import {
14
16
  classifyResourceRead,
15
- previewResult,
16
17
  renderToolAwaitingApproval,
17
18
  renderToolCallHeader,
18
19
  renderToolExecution,
19
20
  renderToolRunningStatus,
20
21
  renderToolStreamingExecution,
21
22
  renderToolSubline,
22
- unwrapResultEnvelope,
23
23
  } from "./renderers/tool-execution.js";
24
24
  import { renderWorkerEntryLines } from "./renderers/worker-entry.js";
25
25
  import { INLINE_STATUS_INDENT_COLS, type StatusPhase, type VerbRender } from "./status/index.js";
@@ -33,6 +33,13 @@ import { type WorkerEntryState, workerAskedByModel } from "./worker-stream.js";
33
33
  // indentation, and width behavior stay pi-tui's and nothing post-processes
34
34
  // already-rendered output.
35
35
  const CHAT_MARKDOWN_THEME = markdownTheme(clioTheme(), (code, lang) => codeInk(lang, code.split("\n")));
36
+ const CHAT_MARKDOWN_OPTIONS = {
37
+ transform: createMermaidMarkdownTransform(clioTheme()),
38
+ renderLatex: true,
39
+ } as const;
40
+ // TuiAltScreen uses Pi's OSC 133 prompt-start marker for semantic prompt
41
+ // navigation. The sequence is zero-width and stripped before terminal output.
42
+ const OSC133_PROMPT_START = "\x1b]133;A\x07";
36
43
 
37
44
  // Prefix and rail SGR constants, previously re-exported by the deleted
38
45
  // palette.ts. Composing them from fgSequence/GLYPH here yields byte-identical
@@ -49,10 +56,10 @@ const USER_GLYPH = GLYPH.user;
49
56
 
50
57
  /**
51
58
  * An assistant turn is a sequence of text and tool segments interleaved in
52
- * pi-agent-core event order. pi-agent-core emits: `message_start`
53
- * `text_delta`+ `message_end` `tool_execution_*` (next) `message_start`
54
- * `text_delta`+ `message_end`, so tool calls always sit BETWEEN the
55
- * assistant's pre-tool narration and the post-tool summary. Storing a flat
59
+ * pi-agent-core event order. A tool turn emits assistant `message_update`
60
+ * events carrying `toolcall_*` formation, then `message_end`, then the
61
+ * `tool_execution_*` lifecycle before the next assistant message. Tool calls
62
+ * therefore sit BETWEEN the assistant's pre-tool narration and the post-tool summary. Storing a flat
56
63
  * `text` buffer + `tools[]` array (pre-refactor) collapsed that order: all
57
64
  * text across the turn concatenated into one line with every tool block
58
65
  * appended at the end. The segment list preserves the stream order instead.
@@ -117,6 +124,10 @@ type ToolSegment = {
117
124
  result?: unknown;
118
125
  /** True once `tool_execution_end` has landed (success or error). */
119
126
  finished: boolean;
127
+ /** Pi streamed the call row before execution and later starts this same row. */
128
+ executionStarted: boolean;
129
+ /** The assistant stream closed this call's argument block. */
130
+ argsComplete: boolean;
120
131
  /**
121
132
  * True when the segment was force-settled without its own end event
122
133
  * (blocked at admission, aborted mid-batch, id reused). A late
@@ -137,13 +148,14 @@ type ToolSegment = {
137
148
  /** Persisted result summary (bytes, truncated, offloadPath, observation) from the chat loop. */
138
149
  resultSummary?: Record<string, unknown> | undefined;
139
150
  /**
140
- * Latest cumulative partial output from `tool_execution_update`. Cleared
151
+ * Latest cumulative Pi result from `tool_execution_update`, including the
152
+ * display content and structured progress details. Cleared
141
153
  * back to `undefined` on `tool_execution_end` so the finished `result`
142
154
  * takes over. Only consumed when `!finished && expanded`. The explicit
143
155
  * `| undefined` is required under `exactOptionalPropertyTypes: true` so
144
156
  * the clear path can re-assign `undefined` without a `delete`.
145
157
  */
146
- partialOutput?: string | undefined;
158
+ partialResult?: unknown;
147
159
  /**
148
160
  * True while the call is parked at the permission gate. Set/cleared by
149
161
  * `tool_approval_state` events and cleared by any settle so a denied or
@@ -151,6 +163,8 @@ type ToolSegment = {
151
163
  * while `!finished`.
152
164
  */
153
165
  awaitingApproval?: boolean | undefined;
166
+ /** Live, redacted approval facts. Never reconstructed during replay. */
167
+ approvalView?: ApprovalRequestView | undefined;
154
168
  settlement?: "blocked" | "aborted" | "orphaned" | undefined;
155
169
  /**
156
170
  * The admission verdict's short reason, present only on a settlement the
@@ -158,6 +172,8 @@ type ToolSegment = {
158
172
  * was refused and leaves the operator no way to learn why.
159
173
  */
160
174
  blockReason?: string | undefined;
175
+ /** View-only marker: historical calls render mutation diffs without live color. */
176
+ replayed?: true;
161
177
  };
162
178
  /**
163
179
  * A turn's terminal-error marker (`[error] ...`, `[aborted] ...`,
@@ -210,14 +226,28 @@ type TranscriptEntry =
210
226
  * The panel is told when that happened through `applyWorkerState`.
211
227
  */
212
228
  | { role: "worker"; state: WorkerEntryState; folded: boolean }
213
- | { role: "replayBlock"; renderBlock: ReplayBlockRenderer };
229
+ /**
230
+ * A block the caller renders itself. Most are settled the moment they are
231
+ * appended, but a few (the operator's `!` bash row) keep mutating the state
232
+ * their closure reads until the work behind them finishes. Such a block
233
+ * declares `isLive`, which keeps it out of the frozen prefix and keeps the
234
+ * panel's time-keyed tick running while it is unsettled.
235
+ */
236
+ | { role: "replayBlock"; renderBlock: ReplayBlockRenderer; isLive?: (() => boolean) | undefined };
214
237
 
215
238
  type WorkerTranscriptEntry = Extract<TranscriptEntry, { role: "worker" }>;
216
239
 
217
240
  export interface ChatPanel extends Component {
218
241
  appendUser(text: string): void;
219
- appendReplayBlock(renderBlock: ReplayBlockRenderer): void;
242
+ /**
243
+ * Append a caller-rendered block. Pass `isLive` when the closure reads state
244
+ * that keeps changing after the append, so the panel keeps re-rendering it
245
+ * instead of treating the first frame as final.
246
+ */
247
+ appendReplayBlock(renderBlock: ReplayBlockRenderer, isLive?: () => boolean): void;
220
248
  applyEvent(event: ChatLoopEvent): void;
249
+ /** Mark a just-rehydrated tool segment so its mutation diff remains plain. */
250
+ markToolReplayed?(toolCallId: string): void;
221
251
  /**
222
252
  * Place or refresh a worker's block. The first call for an assignment
223
253
  * inserts the entry (agent origin nests under the tool segment named by
@@ -237,8 +267,8 @@ export interface ChatPanel extends Component {
237
267
  /**
238
268
  * Force every tool segment into its collapsed one-line form. Replay
239
269
  * (`rehydrateChatPanelFromTurns`) calls this so a resumed or forked
240
- * transcript reproduces the settled live view, where tools are collapsed to
241
- * their ledger summary rather than the expanded body. Idempotent.
270
+ * transcript uses compact ledger summaries instead of auto-expanding every
271
+ * historical non-resource call. Idempotent.
242
272
  */
243
273
  collapseAllTools(): void;
244
274
  /**
@@ -249,6 +279,8 @@ export interface ChatPanel extends Component {
249
279
  */
250
280
  toggleLastThinking(): boolean;
251
281
  toggleAllThinking(): boolean;
282
+ /** Current panel-level live-thinking visibility used by presentation pacing. */
283
+ isThinkingExpanded(): boolean;
252
284
  /** Toggle whether expanded live tool bodies include cumulative partial output. */
253
285
  toggleLiveToolOutput(): boolean;
254
286
  /** Clears the visible transcript. /new uses this after rotating the session. */
@@ -510,7 +542,7 @@ function renderTextSegmentLines(seg: TextSegment, width: number): string[] {
510
542
  return wrapped;
511
543
  }
512
544
  if (!seg.md) {
513
- seg.md = new Markdown(seg.text, 0, 0, CHAT_MARKDOWN_THEME);
545
+ seg.md = new Markdown(seg.text, 0, 0, CHAT_MARKDOWN_THEME, undefined, CHAT_MARKDOWN_OPTIONS);
514
546
  }
515
547
  // pi-tui Markdown right-pads lines to the render width. If a long streaming
516
548
  // reply has already scrolled, flipping the finalized segment from unpadded
@@ -698,11 +730,20 @@ function renderToolSegmentLines(
698
730
  const hintKey = seg.id === latestHintToolId ? expandKey : undefined;
699
731
  const expanded = verbosity === "verbose" || (verbosity !== "minimal" && seg.expanded);
700
732
  const elapsedMs = seg.startedAtMs !== undefined ? Math.max(0, rawDurationMs(seg.startedAtMs, nowMs)) : undefined;
733
+ const phase: "forming" | "ready" | "running" = seg.executionStarted
734
+ ? "running"
735
+ : seg.argsComplete
736
+ ? "ready"
737
+ : "forming";
701
738
  // A parked call is not executing: the awaiting-approval line replaces the
702
739
  // counting elapsed spinner in both collapsed and expanded form (there is no
703
740
  // body or partial output to expand while the call sits at the gate).
704
741
  if (!seg.finished && seg.awaitingApproval === true) {
705
- return renderToolAwaitingApproval({ toolCallId: seg.id, toolName: seg.name, args: seg.args }, width);
742
+ return renderToolAwaitingApproval(
743
+ { toolCallId: seg.id, toolName: seg.name, args: seg.args },
744
+ width,
745
+ seg.approvalView,
746
+ );
706
747
  }
707
748
  if (!expanded) {
708
749
  return renderToolSubline(
@@ -718,20 +759,20 @@ function renderToolSegmentLines(
718
759
  outcome: seg.settlement,
719
760
  blockReason: seg.blockReason,
720
761
  }
721
- : { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs },
762
+ : { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs, phase },
722
763
  width,
723
764
  hintKey,
724
765
  );
725
766
  }
726
767
  if (!seg.finished) {
727
- if (liveToolOutput && seg.partialOutput !== undefined) {
768
+ if (liveToolOutput && seg.partialResult !== undefined) {
728
769
  return renderToolStreamingExecution(
729
- { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs },
770
+ { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs, phase },
730
771
  width,
731
- seg.partialOutput,
772
+ seg.partialResult,
732
773
  );
733
774
  }
734
- const call = { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs };
775
+ const call = { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs, phase };
735
776
  return liveToolOutput ? renderToolCallHeader(call, width) : renderToolRunningStatus(call, width);
736
777
  }
737
778
  return renderToolExecution(
@@ -747,7 +788,7 @@ function renderToolSegmentLines(
747
788
  blockReason: seg.blockReason,
748
789
  },
749
790
  width,
750
- { unbounded: unboundedToolBodies },
791
+ { unbounded: unboundedToolBodies, diffStyle: seg.replayed === true ? "plain" : "color" },
751
792
  );
752
793
  }
753
794
 
@@ -780,7 +821,9 @@ function renderEntryLines(
780
821
  const contentWidth = Math.max(1, width - PROSE_GUTTER_WIDTH);
781
822
  const lines: string[] = [];
782
823
  for (const sourceLine of entry.text.split("\n")) lines.push(...wrapTextWithAnsi(sourceLine, contentWidth));
783
- return hangProseLines(lines, USER_PREFIX);
824
+ const rendered = hangProseLines(lines, USER_PREFIX);
825
+ if (rendered[0] !== undefined) rendered[0] = `${OSC133_PROMPT_START}${rendered[0]}`;
826
+ return rendered;
784
827
  }
785
828
  if (entry.role === "retryStatus") {
786
829
  return wrapTextWithAnsi(formatRetryStatus(entry.status), width);
@@ -921,14 +964,14 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
921
964
  const entryCacheCapacity = (): number =>
922
965
  Math.max(MIN_ENTRY_RENDER_CACHE, Math.min(MAX_ENTRY_RENDER_CACHE, transcript.length));
923
966
  /**
924
- * Windowed-tail build (F19 on pi-tui 0.83 terms): the lines of every settled
967
+ * Regular-screen windowed-tail build: the lines of every settled
925
968
  * leading entry are baked into one frozen prefix, so a dirty frame re-renders
926
- * only the live tail and re-emits the prefix by reference. pi-tui still
927
- * receives the full line array, deliberately: the 0.83 renderer keeps every
969
+ * only the live tail and re-emits the prefix by reference. TuiMainScreen still
970
+ * receives the full line array, deliberately: the renderer keeps every
928
971
  * line in `previousLines` and full-redraws (clearing scrollback) when the
929
- * head shrinks, so a real shrinking window needs the 0.84 ScrollView
930
- * architecture. The freeze is dropped whenever a frozen entry is invalidated
931
- * or the render key changes.
972
+ * head shrinks. Fullscreen mode instead gives the transcript its own pi-tui
973
+ * ScrollView. The freeze is dropped whenever a frozen entry is invalidated or
974
+ * the render key changes.
932
975
  */
933
976
  let frozen: { lines: string[]; through: number; key: string } | null = null;
934
977
  let thinkingExpanded = false;
@@ -983,8 +1026,9 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
983
1026
  if (seg.result === undefined)
984
1027
  seg.result = "(no result: the call did not complete; execution was aborted, blocked, or orphaned)";
985
1028
  seg.settlement = settlement;
986
- seg.partialOutput = undefined;
1029
+ seg.partialResult = undefined;
987
1030
  seg.awaitingApproval = undefined;
1031
+ seg.approvalView = undefined;
988
1032
  };
989
1033
 
990
1034
  /**
@@ -1142,18 +1186,22 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1142
1186
 
1143
1187
  /** True when the entry renders at least one counting elapsed line this frame. */
1144
1188
  const entryHasRunningTool = (entry: TranscriptEntry): boolean =>
1145
- entry.role === "assistant" &&
1146
- entry.segments.some((segment) => segment.kind === "tool" && !segment.finished && segment.startedAtMs !== undefined);
1189
+ (entry.role === "assistant" &&
1190
+ entry.segments.some(
1191
+ (segment) => segment.kind === "tool" && !segment.finished && segment.startedAtMs !== undefined,
1192
+ )) ||
1193
+ (entry.role === "replayBlock" && entry.isLive?.() === true);
1147
1194
 
1148
1195
  /**
1149
1196
  * Settled entries whose render is a pure function of the base key. A live
1150
1197
  * worker block is excluded for the same reason a running tool is: the
1151
1198
  * reducer mutates its state object in place, so a cached render would keep
1152
- * serving the answer as it looked several deltas ago.
1199
+ * serving the answer as it looked several deltas ago. A replay block that
1200
+ * declares itself live is excluded on the same grounds.
1153
1201
  */
1154
1202
  const entryIsStable = (entry: TranscriptEntry): boolean =>
1155
1203
  entry.role === "user" ||
1156
- entry.role === "replayBlock" ||
1204
+ (entry.role === "replayBlock" && entry.isLive?.() !== true) ||
1157
1205
  (entry.role === "worker" && !entry.state.pending) ||
1158
1206
  (entry.role === "assistant" &&
1159
1207
  !entry.pending &&
@@ -1283,8 +1331,8 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1283
1331
  transcript.push({ role: "user", text });
1284
1332
  markDirty();
1285
1333
  },
1286
- appendReplayBlock(renderBlock: ReplayBlockRenderer): void {
1287
- transcript.push({ role: "replayBlock", renderBlock });
1334
+ appendReplayBlock(renderBlock: ReplayBlockRenderer, isLive?: () => boolean): void {
1335
+ transcript.push({ role: "replayBlock", renderBlock, isLive });
1288
1336
  markDirty();
1289
1337
  },
1290
1338
  applyWorkerState(state: WorkerEntryState): void {
@@ -1404,6 +1452,7 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1404
1452
  markDirty();
1405
1453
  return true;
1406
1454
  },
1455
+ isThinkingExpanded: () => thinkingExpanded,
1407
1456
  toggleLiveToolOutput(): boolean {
1408
1457
  liveToolOutput = !liveToolOutput;
1409
1458
  markDirty();
@@ -1415,6 +1464,13 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1415
1464
  clearRenderCaches();
1416
1465
  markDirty();
1417
1466
  },
1467
+ markToolReplayed(toolCallId: string): void {
1468
+ const owner = findToolSegmentOwner(toolCallId);
1469
+ if (!owner || owner.segment.finished) return;
1470
+ invalidateEntryCache(owner.entry);
1471
+ owner.segment.replayed = true;
1472
+ markDirty();
1473
+ },
1418
1474
  applyEvent(event: ChatLoopEvent): void {
1419
1475
  if (event.type === "agent_status") {
1420
1476
  return;
@@ -1439,6 +1495,50 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1439
1495
  markDirty();
1440
1496
  return;
1441
1497
  }
1498
+ if (event.type === "message_update") {
1499
+ const assistantEvent = event.assistantMessageEvent as {
1500
+ type?: unknown;
1501
+ contentIndex?: unknown;
1502
+ partial?: { content?: unknown };
1503
+ };
1504
+ if (
1505
+ assistantEvent.type !== "toolcall_start" &&
1506
+ assistantEvent.type !== "toolcall_delta" &&
1507
+ assistantEvent.type !== "toolcall_end"
1508
+ ) {
1509
+ return;
1510
+ }
1511
+ const index = typeof assistantEvent.contentIndex === "number" ? assistantEvent.contentIndex : -1;
1512
+ const content = Array.isArray(assistantEvent.partial?.content) ? assistantEvent.partial.content : [];
1513
+ const block = content[index];
1514
+ if (block === null || typeof block !== "object" || Array.isArray(block)) return;
1515
+ const streamed = block as { type?: unknown; id?: unknown; name?: unknown; arguments?: unknown };
1516
+ if (streamed.type !== "toolCall" || typeof streamed.id !== "string" || streamed.id.length === 0) return;
1517
+ const owner = findToolSegmentOwner(streamed.id);
1518
+ const existing = owner?.segment;
1519
+ if (existing && !existing.finished && !existing.executionStarted) {
1520
+ if (owner) invalidateEntryCache(owner.entry);
1521
+ existing.name = typeof streamed.name === "string" && streamed.name.length > 0 ? streamed.name : existing.name;
1522
+ existing.args = streamed.arguments ?? existing.args;
1523
+ existing.argsComplete = assistantEvent.type === "toolcall_end";
1524
+ } else if (existing === undefined) {
1525
+ const assistant = ensureAssistant();
1526
+ assistant.pending = true;
1527
+ assistant.segments.push({
1528
+ kind: "tool",
1529
+ id: streamed.id,
1530
+ name: typeof streamed.name === "string" && streamed.name.length > 0 ? streamed.name : "tool",
1531
+ args: streamed.arguments ?? {},
1532
+ finished: false,
1533
+ executionStarted: false,
1534
+ argsComplete: assistantEvent.type === "toolcall_end",
1535
+ isError: false,
1536
+ expanded: false,
1537
+ });
1538
+ }
1539
+ markDirty();
1540
+ return;
1541
+ }
1442
1542
  if (event.type === "text_delta") {
1443
1543
  const assistant = ensureAssistant();
1444
1544
  assistant.pending = true;
@@ -1461,6 +1561,19 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1461
1561
  return;
1462
1562
  }
1463
1563
  if (event.type === "tool_execution_start") {
1564
+ const streamedOwner = findToolSegmentOwner(event.toolCallId);
1565
+ if (streamedOwner !== undefined && !streamedOwner.segment.finished && !streamedOwner.segment.executionStarted) {
1566
+ invalidateEntryCache(streamedOwner.entry);
1567
+ const streamed = streamedOwner.segment;
1568
+ streamed.name = event.toolName;
1569
+ streamed.args = event.args;
1570
+ streamed.executionStarted = true;
1571
+ streamed.argsComplete = true;
1572
+ streamed.startedAtMs = now();
1573
+ streamed.expanded = classifyResourceRead(event.toolName, event.args) === null;
1574
+ markDirty();
1575
+ return;
1576
+ }
1464
1577
  // A model that reuses a tool-call id across calls would leave the
1465
1578
  // prior same-id segment unsettled (its end matches the first segment
1466
1579
  // on lookup). Settle any such orphan now, wherever it lives, so it
@@ -1474,7 +1587,7 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1474
1587
  const assistant = ensureAssistant();
1475
1588
  // Compact resource reads (SKILL.md, CLIO-CODER.md, AGENTS.md, docs/) stay
1476
1589
  // collapsed to one labeled line until explicitly expanded.
1477
- const expanded = assistant.pending === false && classifyResourceRead(event.toolName, event.args) === null;
1590
+ const expanded = classifyResourceRead(event.toolName, event.args) === null;
1478
1591
  assistant.pending = true;
1479
1592
  assistant.segments.push({
1480
1593
  kind: "tool",
@@ -1482,6 +1595,8 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1482
1595
  name: event.toolName,
1483
1596
  args: event.args,
1484
1597
  finished: false,
1598
+ executionStarted: true,
1599
+ argsComplete: true,
1485
1600
  isError: false,
1486
1601
  expanded,
1487
1602
  startedAtMs: now(),
@@ -1499,24 +1614,22 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1499
1614
  const tool = owner?.segment;
1500
1615
  if (tool && !tool.finished) {
1501
1616
  tool.awaitingApproval = event.state === "awaiting-approval" ? true : undefined;
1617
+ tool.approvalView = event.state === "awaiting-approval" ? event.view : undefined;
1502
1618
  markDirty();
1503
1619
  }
1504
1620
  return;
1505
1621
  }
1506
1622
  if (event.type === "tool_execution_update") {
1507
- // pi-agent emits `partialResult` as a cumulative tool-result envelope
1508
- // (the bash tool concatenates its rolling tail buffer on every tick).
1509
- // Unwrap with the same helper the finished-result path uses, then
1510
- // REPLACE `partialOutput` rather than appending: the upstream
1511
- // semantics are cumulative, so appending would double-print every
1512
- // snapshot. Render dispatch picks up the new buffer on the next
1513
- // frame via `renderToolSegmentLines`.
1623
+ // pi-agent emits `partialResult` as a cumulative AgentToolResult.
1624
+ // Preserve that full envelope so the renderer can use structured
1625
+ // progress details as well as content. Replace rather than append:
1626
+ // Pi's update semantics are cumulative, and appending would duplicate
1627
+ // every earlier snapshot.
1514
1628
  const owner = findToolSegmentOwner(event.toolCallId);
1515
1629
  if (owner) invalidateEntryCache(owner.entry);
1516
1630
  const tool = owner?.segment;
1517
1631
  if (tool && !tool.finished) {
1518
- const unwrapped = unwrapResultEnvelope(event.partialResult);
1519
- tool.partialOutput = typeof unwrapped === "string" ? unwrapped : previewResult(unwrapped);
1632
+ tool.partialResult = event.partialResult;
1520
1633
  }
1521
1634
  markDirty();
1522
1635
  return;
@@ -1568,23 +1681,36 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
1568
1681
  // expanded render switches to `renderToolExecution` and stays
1569
1682
  // stable instead of churning through partial-frame layout. A
1570
1683
  // denied park settles here too, so the awaiting styling must go.
1571
- tool.partialOutput = undefined;
1684
+ tool.partialResult = undefined;
1572
1685
  tool.awaitingApproval = undefined;
1686
+ tool.approvalView = undefined;
1573
1687
  }
1574
1688
  markDirty();
1575
1689
  return;
1576
1690
  }
1577
1691
  if (event.type === "message_end") {
1692
+ const current = transcript[transcript.length - 1];
1693
+ let completedStreamedArgs = false;
1694
+ if (current?.role === "assistant") {
1695
+ for (const segment of current.segments) {
1696
+ if (segment.kind !== "tool" || segment.finished || segment.executionStarted || segment.argsComplete) continue;
1697
+ segment.argsComplete = true;
1698
+ completedStreamedArgs = true;
1699
+ }
1700
+ if (completedStreamedArgs) invalidateEntryCache(current);
1701
+ }
1578
1702
  const text = extractAssistantText(event.message);
1579
1703
  const thinking = extractAssistantThinking(event.message);
1580
1704
  const extractedTerminalError = extractAssistantTerminalError(event.message);
1581
- const current = transcript[transcript.length - 1];
1582
1705
  const terminalError =
1583
1706
  current?.role === "assistant"
1584
1707
  ? scopeTerminalErrorAfterSuccessfulTool(current, extractedTerminalError)
1585
1708
  : extractedTerminalError;
1586
1709
  const usage = assistantUsage(event.message);
1587
- if (text.length === 0 && thinking.length === 0 && terminalError.length === 0 && usage === undefined) return;
1710
+ if (text.length === 0 && thinking.length === 0 && terminalError.length === 0 && usage === undefined) {
1711
+ if (completedStreamedArgs) markDirty();
1712
+ return;
1713
+ }
1588
1714
  const assistant = ensureAssistant();
1589
1715
  // message_end rewrites exactly one entry: the assistant it lands on.
1590
1716
  invalidateEntryCache(assistant);