@sns-myagent/cli 0.2.0

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 (1320) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +603 -0
  3. package/bin/snscoder.js +98 -0
  4. package/package.json +117 -0
  5. package/scripts/apply-pi-natives-patch.js +86 -0
  6. package/scripts/bench-guard.ts +71 -0
  7. package/scripts/build-binary.ts +108 -0
  8. package/scripts/bundle-dist.ts +117 -0
  9. package/scripts/cron-daily.sh +69 -0
  10. package/scripts/diagnose.sh +183 -0
  11. package/scripts/embed-mupdf-wasm.ts +67 -0
  12. package/scripts/fetch-binary.mjs +359 -0
  13. package/scripts/format-prompts.ts +68 -0
  14. package/scripts/generate-aria-snapshot.ts +134 -0
  15. package/scripts/generate-docs-index.ts +56 -0
  16. package/scripts/generate-share-viewer.ts +36 -0
  17. package/scripts/measure-prompt-tokens.ts +63 -0
  18. package/scripts/omp +42 -0
  19. package/scripts/omp.ts +19 -0
  20. package/scripts/pre-commit.sh +85 -0
  21. package/src/adapters/telegram/bot.ts +181 -0
  22. package/src/adapters/telegram/format.ts +215 -0
  23. package/src/adapters/telegram/handler.ts +128 -0
  24. package/src/adapters/telegram/index.ts +73 -0
  25. package/src/advisor/__tests__/advisor.test.ts +1133 -0
  26. package/src/advisor/advise-tool.ts +165 -0
  27. package/src/advisor/index.ts +4 -0
  28. package/src/advisor/runtime.ts +434 -0
  29. package/src/advisor/transcript-recorder.ts +136 -0
  30. package/src/advisor/watchdog.ts +83 -0
  31. package/src/async/index.ts +1 -0
  32. package/src/async/job-manager.ts +674 -0
  33. package/src/auto-thinking/classifier.ts +190 -0
  34. package/src/autolearn/controller.ts +139 -0
  35. package/src/autolearn/managed-skills.ts +255 -0
  36. package/src/autoresearch/command-resume.md +14 -0
  37. package/src/autoresearch/dashboard.ts +436 -0
  38. package/src/autoresearch/git.ts +331 -0
  39. package/src/autoresearch/helpers.ts +218 -0
  40. package/src/autoresearch/index.ts +536 -0
  41. package/src/autoresearch/prompt-setup.md +43 -0
  42. package/src/autoresearch/prompt.md +103 -0
  43. package/src/autoresearch/resume-message.md +10 -0
  44. package/src/autoresearch/state.ts +273 -0
  45. package/src/autoresearch/storage.ts +700 -0
  46. package/src/autoresearch/tools/init-experiment.ts +269 -0
  47. package/src/autoresearch/tools/log-experiment.ts +521 -0
  48. package/src/autoresearch/tools/run-experiment.ts +407 -0
  49. package/src/autoresearch/tools/update-notes.ts +109 -0
  50. package/src/autoresearch/types.ts +168 -0
  51. package/src/capability/context-file.ts +44 -0
  52. package/src/capability/extension-module.ts +34 -0
  53. package/src/capability/extension.ts +47 -0
  54. package/src/capability/fs.ts +117 -0
  55. package/src/capability/hook.ts +40 -0
  56. package/src/capability/index.ts +436 -0
  57. package/src/capability/instruction.ts +37 -0
  58. package/src/capability/mcp.ts +76 -0
  59. package/src/capability/prompt.ts +35 -0
  60. package/src/capability/rule-buckets.ts +66 -0
  61. package/src/capability/rule.ts +261 -0
  62. package/src/capability/settings.ts +34 -0
  63. package/src/capability/skill.ts +63 -0
  64. package/src/capability/slash-command.ts +40 -0
  65. package/src/capability/ssh.ts +41 -0
  66. package/src/capability/system-prompt.ts +34 -0
  67. package/src/capability/tool.ts +38 -0
  68. package/src/capability/types.ts +168 -0
  69. package/src/cli/agents-cli.ts +138 -0
  70. package/src/cli/args.ts +360 -0
  71. package/src/cli/auth-broker-cli.ts +893 -0
  72. package/src/cli/auth-gateway-cli.ts +608 -0
  73. package/src/cli/bench-cli.ts +552 -0
  74. package/src/cli/classify-install-target.ts +76 -0
  75. package/src/cli/claude-trace-cli.ts +795 -0
  76. package/src/cli/commands/init-xdg.ts +27 -0
  77. package/src/cli/completion-gen.ts +550 -0
  78. package/src/cli/config-cli.ts +418 -0
  79. package/src/cli/dry-balance-cli.ts +858 -0
  80. package/src/cli/entry.ts +40 -0
  81. package/src/cli/extension-flags.ts +48 -0
  82. package/src/cli/file-processor.ts +133 -0
  83. package/src/cli/flag-tables.ts +322 -0
  84. package/src/cli/gallery-cli.ts +231 -0
  85. package/src/cli/gallery-fixtures/agentic.ts +407 -0
  86. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  87. package/src/cli/gallery-fixtures/edit.ts +194 -0
  88. package/src/cli/gallery-fixtures/fs.ts +220 -0
  89. package/src/cli/gallery-fixtures/index.ts +40 -0
  90. package/src/cli/gallery-fixtures/interaction.ts +49 -0
  91. package/src/cli/gallery-fixtures/memory.ts +81 -0
  92. package/src/cli/gallery-fixtures/misc.ts +250 -0
  93. package/src/cli/gallery-fixtures/search.ts +213 -0
  94. package/src/cli/gallery-fixtures/shell.ts +167 -0
  95. package/src/cli/gallery-fixtures/types.ts +57 -0
  96. package/src/cli/gallery-fixtures/web.ts +158 -0
  97. package/src/cli/gallery-screenshot.ts +279 -0
  98. package/src/cli/grep-cli.ts +160 -0
  99. package/src/cli/grievances-cli.ts +256 -0
  100. package/src/cli/index.ts +416 -0
  101. package/src/cli/initial-message.ts +58 -0
  102. package/src/cli/models-cli.ts +427 -0
  103. package/src/cli/plugin-cli.ts +996 -0
  104. package/src/cli/profile-alias.ts +338 -0
  105. package/src/cli/profile-bootstrap.ts +233 -0
  106. package/src/cli/read-cli.ts +57 -0
  107. package/src/cli/session-picker.ts +79 -0
  108. package/src/cli/setup-cli.ts +332 -0
  109. package/src/cli/setup-model-picker.ts +43 -0
  110. package/src/cli/shell-cli.ts +176 -0
  111. package/src/cli/ssh-cli.ts +179 -0
  112. package/src/cli/startup-cwd.ts +58 -0
  113. package/src/cli/stats-cli.ts +229 -0
  114. package/src/cli/tiny-models-cli.ts +132 -0
  115. package/src/cli/ttsr-cli.ts +995 -0
  116. package/src/cli/update-cli.ts +671 -0
  117. package/src/cli/usage-cli.ts +774 -0
  118. package/src/cli/web-search-cli.ts +132 -0
  119. package/src/cli/worktree-cli.ts +291 -0
  120. package/src/cli-commands.ts +131 -0
  121. package/src/cli.ts +326 -0
  122. package/src/collab/crypto.ts +63 -0
  123. package/src/collab/guest.ts +602 -0
  124. package/src/collab/host.ts +619 -0
  125. package/src/collab/protocol.ts +289 -0
  126. package/src/collab/relay-client.ts +216 -0
  127. package/src/commands/acp.ts +24 -0
  128. package/src/commands/agents.ts +57 -0
  129. package/src/commands/auth-broker.ts +99 -0
  130. package/src/commands/auth-gateway.ts +69 -0
  131. package/src/commands/bench.ts +42 -0
  132. package/src/commands/chat.ts +24 -0
  133. package/src/commands/commit.ts +46 -0
  134. package/src/commands/complete.ts +66 -0
  135. package/src/commands/completions.ts +60 -0
  136. package/src/commands/config.ts +51 -0
  137. package/src/commands/dry-balance.ts +43 -0
  138. package/src/commands/gallery.ts +52 -0
  139. package/src/commands/grep.ts +48 -0
  140. package/src/commands/grievances.ts +51 -0
  141. package/src/commands/install.ts +107 -0
  142. package/src/commands/join.ts +39 -0
  143. package/src/commands/launch.ts +182 -0
  144. package/src/commands/models.ts +61 -0
  145. package/src/commands/plugin.ts +78 -0
  146. package/src/commands/read.ts +38 -0
  147. package/src/commands/say.ts +102 -0
  148. package/src/commands/setup.ts +67 -0
  149. package/src/commands/shell.ts +29 -0
  150. package/src/commands/ssh.ts +60 -0
  151. package/src/commands/stats.ts +29 -0
  152. package/src/commands/tiny-models.ts +36 -0
  153. package/src/commands/token.ts +108 -0
  154. package/src/commands/ttsr.ts +125 -0
  155. package/src/commands/update.ts +21 -0
  156. package/src/commands/usage.ts +43 -0
  157. package/src/commands/web-search.ts +42 -0
  158. package/src/commands/worktree.ts +56 -0
  159. package/src/commit/agentic/agent.ts +318 -0
  160. package/src/commit/agentic/fallback.ts +96 -0
  161. package/src/commit/agentic/index.ts +355 -0
  162. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  163. package/src/commit/agentic/prompts/session-user.md +25 -0
  164. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  165. package/src/commit/agentic/prompts/system.md +38 -0
  166. package/src/commit/agentic/state.ts +60 -0
  167. package/src/commit/agentic/tools/analyze-file.ts +149 -0
  168. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  169. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  170. package/src/commit/agentic/tools/git-overview.ts +81 -0
  171. package/src/commit/agentic/tools/index.ts +54 -0
  172. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  173. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  174. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  175. package/src/commit/agentic/tools/schemas.ts +11 -0
  176. package/src/commit/agentic/tools/split-commit.ts +241 -0
  177. package/src/commit/agentic/topo-sort.ts +44 -0
  178. package/src/commit/agentic/trivial.ts +51 -0
  179. package/src/commit/agentic/validation.ts +183 -0
  180. package/src/commit/analysis/conventional.ts +64 -0
  181. package/src/commit/analysis/index.ts +4 -0
  182. package/src/commit/analysis/scope.ts +242 -0
  183. package/src/commit/analysis/summary.ts +107 -0
  184. package/src/commit/analysis/validation.ts +66 -0
  185. package/src/commit/changelog/detect.ts +40 -0
  186. package/src/commit/changelog/generate.ts +101 -0
  187. package/src/commit/changelog/index.ts +234 -0
  188. package/src/commit/changelog/parse.ts +44 -0
  189. package/src/commit/cli.ts +85 -0
  190. package/src/commit/git/diff.ts +148 -0
  191. package/src/commit/index.ts +5 -0
  192. package/src/commit/map-reduce/index.ts +69 -0
  193. package/src/commit/map-reduce/map-phase.ts +193 -0
  194. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  195. package/src/commit/map-reduce/utils.ts +9 -0
  196. package/src/commit/message.ts +11 -0
  197. package/src/commit/model-selection.ts +89 -0
  198. package/src/commit/pipeline.ts +243 -0
  199. package/src/commit/prompts/analysis-system.md +148 -0
  200. package/src/commit/prompts/analysis-user.md +38 -0
  201. package/src/commit/prompts/changelog-system.md +50 -0
  202. package/src/commit/prompts/changelog-user.md +18 -0
  203. package/src/commit/prompts/file-observer-system.md +24 -0
  204. package/src/commit/prompts/file-observer-user.md +8 -0
  205. package/src/commit/prompts/reduce-system.md +50 -0
  206. package/src/commit/prompts/reduce-user.md +17 -0
  207. package/src/commit/prompts/summary-retry.md +3 -0
  208. package/src/commit/prompts/summary-system.md +38 -0
  209. package/src/commit/prompts/summary-user.md +13 -0
  210. package/src/commit/prompts/types-description.md +2 -0
  211. package/src/commit/shared-llm.ts +70 -0
  212. package/src/commit/types.ts +118 -0
  213. package/src/commit/utils/exclusions.ts +42 -0
  214. package/src/commit/utils.ts +58 -0
  215. package/src/config/api-key-resolver.ts +67 -0
  216. package/src/config/append-only-context-mode.ts +76 -0
  217. package/src/config/config-file.ts +315 -0
  218. package/src/config/defaults.ts +55 -0
  219. package/src/config/file-lock.ts +164 -0
  220. package/src/config/index.ts +105 -0
  221. package/src/config/keybindings.ts +634 -0
  222. package/src/config/loader.ts +93 -0
  223. package/src/config/mcp-schema.json +238 -0
  224. package/src/config/model-discovery.ts +589 -0
  225. package/src/config/model-registry.ts +2267 -0
  226. package/src/config/model-resolver.ts +1819 -0
  227. package/src/config/model-roles.ts +99 -0
  228. package/src/config/models-config-schema.ts +266 -0
  229. package/src/config/models-config.ts +131 -0
  230. package/src/config/prompt-templates.ts +185 -0
  231. package/src/config/resolve-config-value.ts +94 -0
  232. package/src/config/schema.ts +139 -0
  233. package/src/config/settings-schema.ts +4903 -0
  234. package/src/config/settings.ts +1248 -0
  235. package/src/config/sns-config.ts +126 -0
  236. package/src/config.ts +242 -0
  237. package/src/cron/__tests__/cron-parser.test.ts +147 -0
  238. package/src/cron/cron-parser.ts +228 -0
  239. package/src/cron/cron-scheduler.ts +260 -0
  240. package/src/cron/cron-store.ts +275 -0
  241. package/src/cron/index.ts +21 -0
  242. package/src/cron/types.ts +65 -0
  243. package/src/cursor.ts +340 -0
  244. package/src/dap/client.ts +666 -0
  245. package/src/dap/config.ts +189 -0
  246. package/src/dap/defaults.json +212 -0
  247. package/src/dap/index.ts +4 -0
  248. package/src/dap/session.ts +1441 -0
  249. package/src/dap/types.ts +610 -0
  250. package/src/debug/index.ts +559 -0
  251. package/src/debug/log-formatting.ts +58 -0
  252. package/src/debug/log-viewer.ts +908 -0
  253. package/src/debug/profiler.ts +162 -0
  254. package/src/debug/protocol-probe.ts +267 -0
  255. package/src/debug/raw-sse-buffer.ts +294 -0
  256. package/src/debug/raw-sse.ts +292 -0
  257. package/src/debug/remote-debugger.ts +151 -0
  258. package/src/debug/report-bundle.ts +375 -0
  259. package/src/debug/system-info.ts +111 -0
  260. package/src/debug/terminal-info.ts +124 -0
  261. package/src/discovery/agents-md.ts +67 -0
  262. package/src/discovery/agents.ts +230 -0
  263. package/src/discovery/at-imports.ts +273 -0
  264. package/src/discovery/builtin-defaults.ts +39 -0
  265. package/src/discovery/builtin-rules/index.ts +56 -0
  266. package/src/discovery/builtin-rules/rs-box-leak.md +48 -0
  267. package/src/discovery/builtin-rules/rs-future-prelude.md +23 -0
  268. package/src/discovery/builtin-rules/rs-lazylock.md +51 -0
  269. package/src/discovery/builtin-rules/rs-match-ergonomics.md +67 -0
  270. package/src/discovery/builtin-rules/rs-parking-lot.md +44 -0
  271. package/src/discovery/builtin-rules/rs-result-type.md +19 -0
  272. package/src/discovery/builtin-rules/ts-bare-catch.md +38 -0
  273. package/src/discovery/builtin-rules/ts-import-type.md +42 -0
  274. package/src/discovery/builtin-rules/ts-no-any.md +65 -0
  275. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
  276. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +39 -0
  277. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +55 -0
  278. package/src/discovery/builtin-rules/ts-no-return-type.md +44 -0
  279. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  280. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  281. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +65 -0
  282. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  283. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  284. package/src/discovery/builtin.ts +934 -0
  285. package/src/discovery/claude-plugins.ts +386 -0
  286. package/src/discovery/claude.ts +584 -0
  287. package/src/discovery/cline.ts +83 -0
  288. package/src/discovery/codex.ts +522 -0
  289. package/src/discovery/cursor.ts +220 -0
  290. package/src/discovery/gemini.ts +383 -0
  291. package/src/discovery/github.ts +337 -0
  292. package/src/discovery/helpers.ts +1092 -0
  293. package/src/discovery/index.ts +81 -0
  294. package/src/discovery/mcp-json.ts +172 -0
  295. package/src/discovery/omp-extension-roots.ts +190 -0
  296. package/src/discovery/omp-plugins.ts +383 -0
  297. package/src/discovery/opencode.ts +441 -0
  298. package/src/discovery/plugin-dir-roots.ts +28 -0
  299. package/src/discovery/ssh.ts +153 -0
  300. package/src/discovery/substitute-plugin-root.ts +29 -0
  301. package/src/discovery/vscode.ts +105 -0
  302. package/src/discovery/windsurf.ts +147 -0
  303. package/src/edit/apply-patch/index.ts +87 -0
  304. package/src/edit/apply-patch/parser.ts +174 -0
  305. package/src/edit/diff.ts +999 -0
  306. package/src/edit/file-snapshot-store.ts +143 -0
  307. package/src/edit/hashline/block-resolver.ts +33 -0
  308. package/src/edit/hashline/diff.ts +290 -0
  309. package/src/edit/hashline/execute.ts +237 -0
  310. package/src/edit/hashline/filesystem.ts +138 -0
  311. package/src/edit/hashline/index.ts +5 -0
  312. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  313. package/src/edit/hashline/params.ts +19 -0
  314. package/src/edit/index.ts +620 -0
  315. package/src/edit/modes/apply-patch.lark +19 -0
  316. package/src/edit/modes/apply-patch.ts +53 -0
  317. package/src/edit/modes/patch.ts +1904 -0
  318. package/src/edit/modes/replace.ts +1136 -0
  319. package/src/edit/normalize.ts +345 -0
  320. package/src/edit/notebook.ts +242 -0
  321. package/src/edit/read-file.ts +25 -0
  322. package/src/edit/renderer.ts +819 -0
  323. package/src/edit/streaming.ts +517 -0
  324. package/src/eval/__tests__/agent-bridge.test.ts +769 -0
  325. package/src/eval/__tests__/bridge-timeout.test.ts +64 -0
  326. package/src/eval/__tests__/budget-bridge.test.ts +69 -0
  327. package/src/eval/__tests__/completion-bridge.test.ts +412 -0
  328. package/src/eval/__tests__/helpers-local-roots.test.ts +58 -0
  329. package/src/eval/__tests__/idle-timeout.test.ts +80 -0
  330. package/src/eval/__tests__/js-context-manager.test.ts +291 -0
  331. package/src/eval/__tests__/julia-prelude.test.ts +77 -0
  332. package/src/eval/__tests__/kernel-spawn.test.ts +103 -0
  333. package/src/eval/__tests__/prelude-agent.test.ts +73 -0
  334. package/src/eval/agent-bridge.ts +319 -0
  335. package/src/eval/backend-helpers.ts +48 -0
  336. package/src/eval/backend.ts +71 -0
  337. package/src/eval/bridge-timeout.ts +44 -0
  338. package/src/eval/budget-bridge.ts +48 -0
  339. package/src/eval/completion-bridge.ts +211 -0
  340. package/src/eval/concurrency-bridge.ts +34 -0
  341. package/src/eval/executor-base.ts +425 -0
  342. package/src/eval/idle-timeout.ts +91 -0
  343. package/src/eval/index.ts +6 -0
  344. package/src/eval/jl/executor.ts +540 -0
  345. package/src/eval/jl/index.ts +54 -0
  346. package/src/eval/jl/kernel.ts +235 -0
  347. package/src/eval/jl/prelude.jl +930 -0
  348. package/src/eval/jl/prelude.ts +3 -0
  349. package/src/eval/jl/runner.jl +634 -0
  350. package/src/eval/jl/runtime.ts +118 -0
  351. package/src/eval/js/context-manager.ts +621 -0
  352. package/src/eval/js/executor.ts +173 -0
  353. package/src/eval/js/index.ts +40 -0
  354. package/src/eval/js/shared/helpers.ts +283 -0
  355. package/src/eval/js/shared/indirect-eval.ts +30 -0
  356. package/src/eval/js/shared/local-module-loader.ts +342 -0
  357. package/src/eval/js/shared/prelude.ts +2 -0
  358. package/src/eval/js/shared/prelude.txt +307 -0
  359. package/src/eval/js/shared/rewrite-imports.ts +532 -0
  360. package/src/eval/js/shared/runtime.ts +580 -0
  361. package/src/eval/js/shared/types.ts +18 -0
  362. package/src/eval/js/tool-bridge.ts +163 -0
  363. package/src/eval/js/worker-core.ts +151 -0
  364. package/src/eval/js/worker-entry.ts +37 -0
  365. package/src/eval/js/worker-protocol.ts +47 -0
  366. package/src/eval/kernel-base.ts +569 -0
  367. package/src/eval/py/__tests__/prelude.test.ts +19 -0
  368. package/src/eval/py/display.ts +71 -0
  369. package/src/eval/py/executor.ts +533 -0
  370. package/src/eval/py/index.ts +57 -0
  371. package/src/eval/py/kernel.ts +233 -0
  372. package/src/eval/py/prelude.py +683 -0
  373. package/src/eval/py/prelude.ts +3 -0
  374. package/src/eval/py/runner.py +1177 -0
  375. package/src/eval/py/runtime.ts +276 -0
  376. package/src/eval/py/spawn-options.ts +126 -0
  377. package/src/eval/py/tool-bridge.ts +182 -0
  378. package/src/eval/rb/executor.ts +504 -0
  379. package/src/eval/rb/index.ts +54 -0
  380. package/src/eval/rb/kernel.ts +230 -0
  381. package/src/eval/rb/prelude.rb +721 -0
  382. package/src/eval/rb/prelude.ts +3 -0
  383. package/src/eval/rb/runner.rb +474 -0
  384. package/src/eval/rb/runtime.ts +132 -0
  385. package/src/eval/runtime-env.ts +104 -0
  386. package/src/eval/session-id.ts +8 -0
  387. package/src/eval/types.ts +48 -0
  388. package/src/exa/index.ts +2 -0
  389. package/src/exa/mcp-client.ts +370 -0
  390. package/src/exa/types.ts +69 -0
  391. package/src/exec/bash-executor.ts +478 -0
  392. package/src/exec/exec.ts +53 -0
  393. package/src/exec/non-interactive-env.ts +119 -0
  394. package/src/export/custom-share.ts +65 -0
  395. package/src/export/html/index.ts +308 -0
  396. package/src/export/html/share-loader.js +102 -0
  397. package/src/export/html/template.css +1337 -0
  398. package/src/export/html/template.html +49 -0
  399. package/src/export/html/template.js +1626 -0
  400. package/src/export/html/tool-views.generated.js +37 -0
  401. package/src/export/html/vendor/highlight.min.js +1213 -0
  402. package/src/export/html/vendor/marked.min.js +6 -0
  403. package/src/export/html/web-palette.ts +142 -0
  404. package/src/export/share.ts +481 -0
  405. package/src/export/ttsr.ts +583 -0
  406. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  407. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  408. package/src/extensibility/custom-commands/index.ts +2 -0
  409. package/src/extensibility/custom-commands/loader.ts +242 -0
  410. package/src/extensibility/custom-commands/types.ts +119 -0
  411. package/src/extensibility/custom-tools/index.ts +7 -0
  412. package/src/extensibility/custom-tools/loader.ts +268 -0
  413. package/src/extensibility/custom-tools/types.ts +277 -0
  414. package/src/extensibility/custom-tools/wrapper.ts +47 -0
  415. package/src/extensibility/extensions/compact-handler.ts +40 -0
  416. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  417. package/src/extensibility/extensions/index.ts +16 -0
  418. package/src/extensibility/extensions/loader.ts +587 -0
  419. package/src/extensibility/extensions/model-api.ts +41 -0
  420. package/src/extensibility/extensions/runner.ts +982 -0
  421. package/src/extensibility/extensions/types.ts +1394 -0
  422. package/src/extensibility/extensions/wrapper.ts +259 -0
  423. package/src/extensibility/hooks/index.ts +6 -0
  424. package/src/extensibility/hooks/loader.ts +244 -0
  425. package/src/extensibility/hooks/runner.ts +425 -0
  426. package/src/extensibility/hooks/tool-wrapper.ts +107 -0
  427. package/src/extensibility/hooks/types.ts +613 -0
  428. package/src/extensibility/legacy-pi-ai-shim.ts +73 -0
  429. package/src/extensibility/legacy-pi-coding-agent-shim.ts +128 -0
  430. package/src/extensibility/plugins/doctor.ts +65 -0
  431. package/src/extensibility/plugins/git-url.ts +367 -0
  432. package/src/extensibility/plugins/index.ts +9 -0
  433. package/src/extensibility/plugins/installer.ts +192 -0
  434. package/src/extensibility/plugins/legacy-pi-compat.ts +712 -0
  435. package/src/extensibility/plugins/loader.ts +458 -0
  436. package/src/extensibility/plugins/manager.ts +1026 -0
  437. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  438. package/src/extensibility/plugins/marketplace/fetcher.ts +315 -0
  439. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  440. package/src/extensibility/plugins/marketplace/manager.ts +770 -0
  441. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  442. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  443. package/src/extensibility/plugins/marketplace/types.ts +191 -0
  444. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  445. package/src/extensibility/plugins/parser.ts +105 -0
  446. package/src/extensibility/plugins/runtime-config.ts +9 -0
  447. package/src/extensibility/plugins/types.ts +194 -0
  448. package/src/extensibility/session-handler-types.ts +21 -0
  449. package/src/extensibility/shared-events.ts +367 -0
  450. package/src/extensibility/skills.ts +408 -0
  451. package/src/extensibility/slash-commands.ts +131 -0
  452. package/src/extensibility/tool-proxy.ts +28 -0
  453. package/src/extensibility/typebox.ts +945 -0
  454. package/src/extensibility/utils.ts +44 -0
  455. package/src/global.d.ts +57 -0
  456. package/src/goals/guided-setup.ts +142 -0
  457. package/src/goals/index.ts +3 -0
  458. package/src/goals/runtime.ts +521 -0
  459. package/src/goals/state.ts +37 -0
  460. package/src/goals/tools/goal-tool.ts +251 -0
  461. package/src/hindsight/backend.ts +354 -0
  462. package/src/hindsight/bank.ts +156 -0
  463. package/src/hindsight/client.ts +623 -0
  464. package/src/hindsight/config.ts +175 -0
  465. package/src/hindsight/content.ts +226 -0
  466. package/src/hindsight/index.ts +8 -0
  467. package/src/hindsight/mental-models.ts +429 -0
  468. package/src/hindsight/seeds.json +32 -0
  469. package/src/hindsight/state.ts +492 -0
  470. package/src/hindsight/transcript.ts +71 -0
  471. package/src/index.ts +66 -0
  472. package/src/internal-urls/agent-protocol.ts +146 -0
  473. package/src/internal-urls/artifact-protocol.ts +107 -0
  474. package/src/internal-urls/docs-index.generated.txt +2 -0
  475. package/src/internal-urls/docs-index.ts +102 -0
  476. package/src/internal-urls/filesystem-resource.ts +34 -0
  477. package/src/internal-urls/history-protocol.ts +118 -0
  478. package/src/internal-urls/index.ts +25 -0
  479. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  480. package/src/internal-urls/json-query.ts +126 -0
  481. package/src/internal-urls/local-protocol.ts +315 -0
  482. package/src/internal-urls/mcp-protocol.ts +151 -0
  483. package/src/internal-urls/memory-protocol.ts +173 -0
  484. package/src/internal-urls/omp-protocol.ts +94 -0
  485. package/src/internal-urls/parse.ts +72 -0
  486. package/src/internal-urls/registry-helpers.ts +25 -0
  487. package/src/internal-urls/router.ts +105 -0
  488. package/src/internal-urls/rule-protocol.ts +45 -0
  489. package/src/internal-urls/skill-protocol.ts +112 -0
  490. package/src/internal-urls/types.ts +152 -0
  491. package/src/internal-urls/vault-protocol.ts +939 -0
  492. package/src/irc/bus.ts +311 -0
  493. package/src/jsonrpc/message-framing.ts +142 -0
  494. package/src/lib/xai-http.ts +124 -0
  495. package/src/lsp/client.ts +1135 -0
  496. package/src/lsp/clients/biome-client.ts +264 -0
  497. package/src/lsp/clients/index.ts +50 -0
  498. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  499. package/src/lsp/clients/swiftlint-client.ts +120 -0
  500. package/src/lsp/config.ts +502 -0
  501. package/src/lsp/defaults.json +499 -0
  502. package/src/lsp/diagnostics-ledger.ts +51 -0
  503. package/src/lsp/edits.ts +267 -0
  504. package/src/lsp/format-options.ts +119 -0
  505. package/src/lsp/index.ts +2480 -0
  506. package/src/lsp/lspmux.ts +233 -0
  507. package/src/lsp/render.ts +668 -0
  508. package/src/lsp/startup-events.ts +13 -0
  509. package/src/lsp/types.ts +444 -0
  510. package/src/lsp/utils.ts +718 -0
  511. package/src/main.ts +1429 -0
  512. package/src/markit/NOTICE +32 -0
  513. package/src/markit/converters/docx.ts +56 -0
  514. package/src/markit/converters/epub.ts +136 -0
  515. package/src/markit/converters/mammoth.d.ts +24 -0
  516. package/src/markit/converters/pdf/columns.ts +103 -0
  517. package/src/markit/converters/pdf/extract.ts +574 -0
  518. package/src/markit/converters/pdf/grid.ts +780 -0
  519. package/src/markit/converters/pdf/headers.ts +106 -0
  520. package/src/markit/converters/pdf/index.ts +146 -0
  521. package/src/markit/converters/pdf/render.ts +501 -0
  522. package/src/markit/converters/pdf/types.ts +84 -0
  523. package/src/markit/converters/pptx.ts +325 -0
  524. package/src/markit/converters/xlsx.ts +173 -0
  525. package/src/markit/index.ts +2 -0
  526. package/src/markit/registry.ts +59 -0
  527. package/src/markit/types.ts +35 -0
  528. package/src/mcp/client.ts +509 -0
  529. package/src/mcp/config-writer.ts +229 -0
  530. package/src/mcp/config.ts +365 -0
  531. package/src/mcp/index.ts +29 -0
  532. package/src/mcp/json-rpc.ts +122 -0
  533. package/src/mcp/loader.ts +125 -0
  534. package/src/mcp/manager.ts +1346 -0
  535. package/src/mcp/oauth-credentials.ts +104 -0
  536. package/src/mcp/oauth-discovery.ts +467 -0
  537. package/src/mcp/oauth-flow.ts +555 -0
  538. package/src/mcp/render.ts +155 -0
  539. package/src/mcp/smithery-auth.ts +104 -0
  540. package/src/mcp/smithery-connect.ts +145 -0
  541. package/src/mcp/smithery-registry.ts +477 -0
  542. package/src/mcp/startup-events.ts +116 -0
  543. package/src/mcp/timeout.ts +59 -0
  544. package/src/mcp/tool-bridge.ts +429 -0
  545. package/src/mcp/tool-cache.ts +117 -0
  546. package/src/mcp/transports/http.ts +519 -0
  547. package/src/mcp/transports/index.ts +6 -0
  548. package/src/mcp/transports/stdio.ts +622 -0
  549. package/src/mcp/types.ts +427 -0
  550. package/src/memories/index.ts +1281 -0
  551. package/src/memories/storage.ts +578 -0
  552. package/src/memory-backend/index.ts +18 -0
  553. package/src/memory-backend/lcm-backend.ts +385 -0
  554. package/src/memory-backend/local-backend.ts +45 -0
  555. package/src/memory-backend/mem0-backend.ts +326 -0
  556. package/src/memory-backend/mnemosyne-backend.ts +462 -0
  557. package/src/memory-backend/off-backend.ts +25 -0
  558. package/src/memory-backend/resolve.ts +28 -0
  559. package/src/memory-backend/runtime.ts +66 -0
  560. package/src/memory-backend/types.ts +166 -0
  561. package/src/mnemopi/backend.ts +612 -0
  562. package/src/mnemopi/config.ts +267 -0
  563. package/src/mnemopi/embed-client.ts +246 -0
  564. package/src/mnemopi/embed-protocol.ts +35 -0
  565. package/src/mnemopi/embed-worker.ts +113 -0
  566. package/src/mnemopi/index.ts +3 -0
  567. package/src/mnemopi/state.ts +659 -0
  568. package/src/modes/acp/acp-agent.ts +2362 -0
  569. package/src/modes/acp/acp-client-bridge.ts +154 -0
  570. package/src/modes/acp/acp-event-mapper.ts +933 -0
  571. package/src/modes/acp/acp-mode.ts +23 -0
  572. package/src/modes/acp/index.ts +2 -0
  573. package/src/modes/acp/terminal-auth.ts +37 -0
  574. package/src/modes/components/__tests__/skill-message.test.ts +92 -0
  575. package/src/modes/components/advisor-message.ts +99 -0
  576. package/src/modes/components/agent-dashboard.ts +1183 -0
  577. package/src/modes/components/agent-hub.ts +570 -0
  578. package/src/modes/components/agent-transcript-viewer.ts +463 -0
  579. package/src/modes/components/assistant-message.ts +811 -0
  580. package/src/modes/components/background-tan-message.ts +36 -0
  581. package/src/modes/components/bash-execution.ts +220 -0
  582. package/src/modes/components/bordered-loader.ts +41 -0
  583. package/src/modes/components/btw-panel.ts +124 -0
  584. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  585. package/src/modes/components/chat-block.ts +111 -0
  586. package/src/modes/components/chat-transcript-builder.ts +398 -0
  587. package/src/modes/components/collab-prompt-message.ts +32 -0
  588. package/src/modes/components/compaction-summary-message.ts +215 -0
  589. package/src/modes/components/copy-selector.ts +206 -0
  590. package/src/modes/components/countdown-timer.ts +75 -0
  591. package/src/modes/components/custom-editor.test.ts +164 -0
  592. package/src/modes/components/custom-editor.ts +648 -0
  593. package/src/modes/components/custom-message.ts +67 -0
  594. package/src/modes/components/diff.ts +254 -0
  595. package/src/modes/components/dynamic-border.ts +34 -0
  596. package/src/modes/components/error-banner.ts +33 -0
  597. package/src/modes/components/eval-execution.ts +158 -0
  598. package/src/modes/components/execution-shared.ts +101 -0
  599. package/src/modes/components/extensions/extension-dashboard.ts +390 -0
  600. package/src/modes/components/extensions/extension-list.ts +474 -0
  601. package/src/modes/components/extensions/index.ts +9 -0
  602. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  603. package/src/modes/components/extensions/state-manager.ts +627 -0
  604. package/src/modes/components/extensions/types.ts +186 -0
  605. package/src/modes/components/footer.ts +276 -0
  606. package/src/modes/components/history-search.ts +268 -0
  607. package/src/modes/components/hook-editor.ts +170 -0
  608. package/src/modes/components/hook-input.ts +87 -0
  609. package/src/modes/components/hook-message.ts +67 -0
  610. package/src/modes/components/hook-selector.ts +659 -0
  611. package/src/modes/components/index.ts +38 -0
  612. package/src/modes/components/keybinding-hints.ts +65 -0
  613. package/src/modes/components/late-diagnostics-message.ts +60 -0
  614. package/src/modes/components/login-dialog.ts +164 -0
  615. package/src/modes/components/logout-account-selector.ts +130 -0
  616. package/src/modes/components/mcp-add-wizard.ts +1360 -0
  617. package/src/modes/components/message-frame.ts +92 -0
  618. package/src/modes/components/model-selector.ts +1378 -0
  619. package/src/modes/components/oauth-selector.ts +457 -0
  620. package/src/modes/components/omfg-panel.ts +141 -0
  621. package/src/modes/components/overlay-box.ts +109 -0
  622. package/src/modes/components/plan-review-overlay.ts +847 -0
  623. package/src/modes/components/plan-toc.ts +138 -0
  624. package/src/modes/components/plugin-selector.ts +95 -0
  625. package/src/modes/components/plugin-settings.ts +739 -0
  626. package/src/modes/components/queue-mode-selector.ts +56 -0
  627. package/src/modes/components/read-tool-group.ts +676 -0
  628. package/src/modes/components/reset-usage-selector.ts +161 -0
  629. package/src/modes/components/segment-track.ts +89 -0
  630. package/src/modes/components/selector-helpers.ts +129 -0
  631. package/src/modes/components/session-selector.ts +629 -0
  632. package/src/modes/components/settings-defs.ts +225 -0
  633. package/src/modes/components/settings-selector.ts +1097 -0
  634. package/src/modes/components/show-images-selector.ts +45 -0
  635. package/src/modes/components/skill-message.ts +110 -0
  636. package/src/modes/components/snapcompact-shape-preview-doc.md +18 -0
  637. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  638. package/src/modes/components/status-line/component.ts +1005 -0
  639. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  640. package/src/modes/components/status-line/git-utils.ts +42 -0
  641. package/src/modes/components/status-line/index.ts +5 -0
  642. package/src/modes/components/status-line/presets.ts +106 -0
  643. package/src/modes/components/status-line/segments.ts +616 -0
  644. package/src/modes/components/status-line/separators.ts +55 -0
  645. package/src/modes/components/status-line/token-rate.ts +66 -0
  646. package/src/modes/components/status-line/types.ts +125 -0
  647. package/src/modes/components/theme-selector.ts +63 -0
  648. package/src/modes/components/thinking-selector.ts +52 -0
  649. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  650. package/src/modes/components/tips.txt +24 -0
  651. package/src/modes/components/todo-reminder.ts +39 -0
  652. package/src/modes/components/tool-execution.ts +1173 -0
  653. package/src/modes/components/transcript-container.ts +806 -0
  654. package/src/modes/components/tree-selector.ts +989 -0
  655. package/src/modes/components/ttsr-notification.ts +123 -0
  656. package/src/modes/components/usage-row.ts +18 -0
  657. package/src/modes/components/user-message-selector.ts +227 -0
  658. package/src/modes/components/user-message.ts +68 -0
  659. package/src/modes/components/visual-truncate.ts +63 -0
  660. package/src/modes/components/welcome.ts +581 -0
  661. package/src/modes/controllers/btw-controller.ts +198 -0
  662. package/src/modes/controllers/command-controller-shared.ts +109 -0
  663. package/src/modes/controllers/command-controller.ts +1669 -0
  664. package/src/modes/controllers/event-controller.ts +1191 -0
  665. package/src/modes/controllers/extension-ui-controller.ts +897 -0
  666. package/src/modes/controllers/input-controller.ts +1627 -0
  667. package/src/modes/controllers/mcp-command-controller.ts +2190 -0
  668. package/src/modes/controllers/omfg-controller.ts +283 -0
  669. package/src/modes/controllers/omfg-rule.ts +647 -0
  670. package/src/modes/controllers/selector-controller.ts +1293 -0
  671. package/src/modes/controllers/session-focus-controller.ts +112 -0
  672. package/src/modes/controllers/ssh-command-controller.ts +384 -0
  673. package/src/modes/controllers/streaming-reveal.ts +353 -0
  674. package/src/modes/controllers/tan-command-controller.ts +190 -0
  675. package/src/modes/controllers/todo-command-controller.ts +484 -0
  676. package/src/modes/controllers/tool-args-reveal.ts +174 -0
  677. package/src/modes/data/emojis.json +1 -0
  678. package/src/modes/emoji-autocomplete.ts +285 -0
  679. package/src/modes/gradient-highlight.ts +99 -0
  680. package/src/modes/image-references.ts +137 -0
  681. package/src/modes/index.ts +17 -0
  682. package/src/modes/interactive-mode.ts +4053 -0
  683. package/src/modes/internal-url-autocomplete.ts +143 -0
  684. package/src/modes/loop-limit.ts +192 -0
  685. package/src/modes/magic-keywords.ts +42 -0
  686. package/src/modes/markdown-prose.ts +247 -0
  687. package/src/modes/oauth-manual-input.ts +69 -0
  688. package/src/modes/orchestrate.ts +42 -0
  689. package/src/modes/print-mode.ts +130 -0
  690. package/src/modes/prompt-action-autocomplete.ts +260 -0
  691. package/src/modes/rpc/host-tools.ts +186 -0
  692. package/src/modes/rpc/host-uris.ts +235 -0
  693. package/src/modes/rpc/rpc-client.ts +995 -0
  694. package/src/modes/rpc/rpc-mode.ts +1156 -0
  695. package/src/modes/rpc/rpc-subagents.ts +265 -0
  696. package/src/modes/rpc/rpc-types.ts +487 -0
  697. package/src/modes/runtime-init.ts +142 -0
  698. package/src/modes/session-observer-registry.ts +215 -0
  699. package/src/modes/setup-version.ts +11 -0
  700. package/src/modes/setup-wizard/index.ts +101 -0
  701. package/src/modes/setup-wizard/lazy.ts +16 -0
  702. package/src/modes/setup-wizard/scenes/glyph.ts +114 -0
  703. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  704. package/src/modes/setup-wizard/scenes/providers.ts +103 -0
  705. package/src/modes/setup-wizard/scenes/sign-in.ts +286 -0
  706. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  707. package/src/modes/setup-wizard/scenes/theme.ts +326 -0
  708. package/src/modes/setup-wizard/scenes/types.ts +57 -0
  709. package/src/modes/setup-wizard/scenes/web-search.ts +145 -0
  710. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  711. package/src/modes/setup-wizard/wizard-overlay.ts +334 -0
  712. package/src/modes/shared.ts +49 -0
  713. package/src/modes/theme/dark.json +95 -0
  714. package/src/modes/theme/defaults/alabaster.json +93 -0
  715. package/src/modes/theme/defaults/amethyst.json +96 -0
  716. package/src/modes/theme/defaults/anthracite.json +93 -0
  717. package/src/modes/theme/defaults/basalt.json +91 -0
  718. package/src/modes/theme/defaults/birch.json +95 -0
  719. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  720. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  721. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  722. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  723. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  724. package/src/modes/theme/defaults/dark-copper.json +95 -0
  725. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  726. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  727. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  728. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  729. package/src/modes/theme/defaults/dark-ember.json +95 -0
  730. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  731. package/src/modes/theme/defaults/dark-forest.json +96 -0
  732. package/src/modes/theme/defaults/dark-github.json +105 -0
  733. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  734. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  735. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  736. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  737. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  738. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  739. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  740. package/src/modes/theme/defaults/dark-nord.json +97 -0
  741. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  742. package/src/modes/theme/defaults/dark-one.json +100 -0
  743. package/src/modes/theme/defaults/dark-poimandres.json +142 -0
  744. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  745. package/src/modes/theme/defaults/dark-reef.json +91 -0
  746. package/src/modes/theme/defaults/dark-retro.json +92 -0
  747. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  748. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  749. package/src/modes/theme/defaults/dark-slate.json +95 -0
  750. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  751. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  752. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  753. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  754. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  755. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  756. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  757. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  758. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  759. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  760. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  761. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  762. package/src/modes/theme/defaults/graphite.json +92 -0
  763. package/src/modes/theme/defaults/index.ts +199 -0
  764. package/src/modes/theme/defaults/light-arctic.json +107 -0
  765. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  766. package/src/modes/theme/defaults/light-canyon.json +91 -0
  767. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  768. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  769. package/src/modes/theme/defaults/light-coral.json +95 -0
  770. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  771. package/src/modes/theme/defaults/light-dawn.json +90 -0
  772. package/src/modes/theme/defaults/light-dunes.json +91 -0
  773. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  774. package/src/modes/theme/defaults/light-forest.json +100 -0
  775. package/src/modes/theme/defaults/light-frost.json +95 -0
  776. package/src/modes/theme/defaults/light-github.json +115 -0
  777. package/src/modes/theme/defaults/light-glacier.json +91 -0
  778. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  779. package/src/modes/theme/defaults/light-haze.json +90 -0
  780. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  781. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  782. package/src/modes/theme/defaults/light-lavender.json +95 -0
  783. package/src/modes/theme/defaults/light-meadow.json +91 -0
  784. package/src/modes/theme/defaults/light-mint.json +95 -0
  785. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  786. package/src/modes/theme/defaults/light-ocean.json +99 -0
  787. package/src/modes/theme/defaults/light-one.json +99 -0
  788. package/src/modes/theme/defaults/light-opal.json +91 -0
  789. package/src/modes/theme/defaults/light-orchard.json +91 -0
  790. package/src/modes/theme/defaults/light-paper.json +95 -0
  791. package/src/modes/theme/defaults/light-poimandres.json +142 -0
  792. package/src/modes/theme/defaults/light-prism.json +90 -0
  793. package/src/modes/theme/defaults/light-retro.json +98 -0
  794. package/src/modes/theme/defaults/light-sand.json +95 -0
  795. package/src/modes/theme/defaults/light-savanna.json +91 -0
  796. package/src/modes/theme/defaults/light-solarized.json +102 -0
  797. package/src/modes/theme/defaults/light-soleil.json +90 -0
  798. package/src/modes/theme/defaults/light-sunset.json +99 -0
  799. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  800. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  801. package/src/modes/theme/defaults/light-wetland.json +91 -0
  802. package/src/modes/theme/defaults/light-zenith.json +89 -0
  803. package/src/modes/theme/defaults/limestone.json +94 -0
  804. package/src/modes/theme/defaults/mahogany.json +97 -0
  805. package/src/modes/theme/defaults/marble.json +93 -0
  806. package/src/modes/theme/defaults/obsidian.json +91 -0
  807. package/src/modes/theme/defaults/onyx.json +91 -0
  808. package/src/modes/theme/defaults/pearl.json +93 -0
  809. package/src/modes/theme/defaults/porcelain.json +91 -0
  810. package/src/modes/theme/defaults/quartz.json +96 -0
  811. package/src/modes/theme/defaults/sandstone.json +95 -0
  812. package/src/modes/theme/defaults/titanium.json +90 -0
  813. package/src/modes/theme/light.json +93 -0
  814. package/src/modes/theme/mermaid-cache.ts +92 -0
  815. package/src/modes/theme/shimmer.ts +235 -0
  816. package/src/modes/theme/theme-schema.json +459 -0
  817. package/src/modes/theme/theme.ts +2950 -0
  818. package/src/modes/turn-budget.ts +31 -0
  819. package/src/modes/types.ts +425 -0
  820. package/src/modes/ultrathink.ts +41 -0
  821. package/src/modes/utils/context-usage.ts +432 -0
  822. package/src/modes/utils/copy-targets.ts +361 -0
  823. package/src/modes/utils/hotkeys-markdown.ts +62 -0
  824. package/src/modes/utils/interactive-context-helpers.ts +27 -0
  825. package/src/modes/utils/keybinding-matchers.ts +86 -0
  826. package/src/modes/utils/tools-markdown.ts +27 -0
  827. package/src/modes/utils/transcript-render-helpers.ts +157 -0
  828. package/src/modes/utils/ui-helpers.ts +783 -0
  829. package/src/modes/workflow.ts +42 -0
  830. package/src/plan-mode/approved-plan.ts +186 -0
  831. package/src/plan-mode/plan-handoff.ts +37 -0
  832. package/src/plan-mode/plan-protection.ts +31 -0
  833. package/src/plan-mode/state.ts +6 -0
  834. package/src/priority.json +45 -0
  835. package/src/prompts/advisor/advise-tool.md +3 -0
  836. package/src/prompts/advisor/system.md +75 -0
  837. package/src/prompts/agents/designer.md +74 -0
  838. package/src/prompts/agents/explore.md +58 -0
  839. package/src/prompts/agents/frontmatter.md +11 -0
  840. package/src/prompts/agents/init.md +33 -0
  841. package/src/prompts/agents/librarian.md +119 -0
  842. package/src/prompts/agents/oracle.md +54 -0
  843. package/src/prompts/agents/plan.md +48 -0
  844. package/src/prompts/agents/reviewer.md +139 -0
  845. package/src/prompts/agents/task.md +17 -0
  846. package/src/prompts/bench.md +12 -0
  847. package/src/prompts/ci-green-request.md +36 -0
  848. package/src/prompts/dry-balance-bench.md +8 -0
  849. package/src/prompts/goals/goal-budget-limit.md +16 -0
  850. package/src/prompts/goals/goal-continuation.md +28 -0
  851. package/src/prompts/goals/goal-mode-active.md +23 -0
  852. package/src/prompts/goals/guided-goal-interview.md +8 -0
  853. package/src/prompts/goals/guided-goal-system.md +12 -0
  854. package/src/prompts/memories/consolidation.md +30 -0
  855. package/src/prompts/memories/consolidation_system.md +4 -0
  856. package/src/prompts/memories/read-path.md +17 -0
  857. package/src/prompts/memories/stage_one_input.md +6 -0
  858. package/src/prompts/memories/stage_one_system.md +21 -0
  859. package/src/prompts/review-custom-request.md +22 -0
  860. package/src/prompts/review-headless-request.md +16 -0
  861. package/src/prompts/review-request.md +69 -0
  862. package/src/prompts/steering/user-interjection.md +9 -0
  863. package/src/prompts/system/agent-creation-architect.md +50 -0
  864. package/src/prompts/system/agent-creation-user.md +6 -0
  865. package/src/prompts/system/auto-continue.md +1 -0
  866. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  867. package/src/prompts/system/auto-thinking-difficulty.md +12 -0
  868. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  869. package/src/prompts/system/autolearn-guidance.md +7 -0
  870. package/src/prompts/system/autolearn-nudge.md +3 -0
  871. package/src/prompts/system/background-tan-dispatch.md +8 -0
  872. package/src/prompts/system/btw-user.md +8 -0
  873. package/src/prompts/system/commit-message-system.md +14 -0
  874. package/src/prompts/system/custom-system-prompt.md +64 -0
  875. package/src/prompts/system/eager-task.md +7 -0
  876. package/src/prompts/system/eager-todo.md +18 -0
  877. package/src/prompts/system/empty-stop-retry.md +4 -0
  878. package/src/prompts/system/irc-autoreply.md +6 -0
  879. package/src/prompts/system/irc-incoming.md +7 -0
  880. package/src/prompts/system/manual-continue.md +7 -0
  881. package/src/prompts/system/memory-consolidation-system.md +8 -0
  882. package/src/prompts/system/memory-extraction-system.md +26 -0
  883. package/src/prompts/system/omfg-user.md +50 -0
  884. package/src/prompts/system/orchestrate-notice.md +40 -0
  885. package/src/prompts/system/personalities/default.md +18 -0
  886. package/src/prompts/system/personalities/friendly.md +17 -0
  887. package/src/prompts/system/personalities/pragmatic.md +15 -0
  888. package/src/prompts/system/plan-mode-active.md +109 -0
  889. package/src/prompts/system/plan-mode-approved.md +25 -0
  890. package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
  891. package/src/prompts/system/plan-mode-reference.md +11 -0
  892. package/src/prompts/system/plan-mode-subagent.md +33 -0
  893. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  894. package/src/prompts/system/project-prompt.md +54 -0
  895. package/src/prompts/system/side-channel-no-tools.md +3 -0
  896. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  897. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  898. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  899. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  900. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  901. package/src/prompts/system/subagent-system-prompt.md +71 -0
  902. package/src/prompts/system/subagent-user-prompt.md +3 -0
  903. package/src/prompts/system/subagent-yield-reminder.md +12 -0
  904. package/src/prompts/system/system-prompt.md +250 -0
  905. package/src/prompts/system/tiny-title-system.md +8 -0
  906. package/src/prompts/system/title-marker-instruction.md +1 -0
  907. package/src/prompts/system/title-system-marker.md +16 -0
  908. package/src/prompts/system/title-system.md +16 -0
  909. package/src/prompts/system/ttsr-interrupt.md +7 -0
  910. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  911. package/src/prompts/system/ultrathink-notice.md +3 -0
  912. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  913. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  914. package/src/prompts/system/web-search.md +25 -0
  915. package/src/prompts/system/workflow-notice.md +70 -0
  916. package/src/prompts/tools/apply-patch.md +65 -0
  917. package/src/prompts/tools/ask.md +22 -0
  918. package/src/prompts/tools/ast-edit.md +22 -0
  919. package/src/prompts/tools/ast-grep.md +25 -0
  920. package/src/prompts/tools/async-result.md +8 -0
  921. package/src/prompts/tools/bash.md +44 -0
  922. package/src/prompts/tools/browser.md +45 -0
  923. package/src/prompts/tools/checkpoint.md +15 -0
  924. package/src/prompts/tools/debug.md +17 -0
  925. package/src/prompts/tools/eval.md +72 -0
  926. package/src/prompts/tools/find.md +15 -0
  927. package/src/prompts/tools/github.md +17 -0
  928. package/src/prompts/tools/goal.md +11 -0
  929. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  930. package/src/prompts/tools/image-attachment-describe.md +10 -0
  931. package/src/prompts/tools/image-gen.md +7 -0
  932. package/src/prompts/tools/inspect-image-system.md +20 -0
  933. package/src/prompts/tools/inspect-image.md +22 -0
  934. package/src/prompts/tools/irc.md +33 -0
  935. package/src/prompts/tools/job.md +17 -0
  936. package/src/prompts/tools/learn.md +7 -0
  937. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  938. package/src/prompts/tools/lsp.md +39 -0
  939. package/src/prompts/tools/manage-skill.md +9 -0
  940. package/src/prompts/tools/memory-edit.md +8 -0
  941. package/src/prompts/tools/patch.md +57 -0
  942. package/src/prompts/tools/read.md +75 -0
  943. package/src/prompts/tools/recall.md +5 -0
  944. package/src/prompts/tools/reflect.md +5 -0
  945. package/src/prompts/tools/replace.md +29 -0
  946. package/src/prompts/tools/resolve.md +4 -0
  947. package/src/prompts/tools/retain.md +6 -0
  948. package/src/prompts/tools/rewind.md +13 -0
  949. package/src/prompts/tools/search-tool-bm25.md +32 -0
  950. package/src/prompts/tools/search.md +22 -0
  951. package/src/prompts/tools/ssh.md +22 -0
  952. package/src/prompts/tools/task-summary.md +17 -0
  953. package/src/prompts/tools/task.md +91 -0
  954. package/src/prompts/tools/todo.md +39 -0
  955. package/src/prompts/tools/web-search.md +6 -0
  956. package/src/prompts/tools/write.md +14 -0
  957. package/src/registry/agent-lifecycle.ts +270 -0
  958. package/src/registry/agent-registry.ts +190 -0
  959. package/src/sdk.ts +2948 -0
  960. package/src/secrets/index.ts +123 -0
  961. package/src/secrets/obfuscator.ts +441 -0
  962. package/src/secrets/regex.ts +21 -0
  963. package/src/session/agent-session.ts +12886 -0
  964. package/src/session/agent-storage.ts +478 -0
  965. package/src/session/artifacts.ts +153 -0
  966. package/src/session/auth-broker-config.ts +92 -0
  967. package/src/session/auth-storage.ts +24 -0
  968. package/src/session/blob-store.ts +255 -0
  969. package/src/session/client-bridge.ts +85 -0
  970. package/src/session/codex-auto-reset.ts +202 -0
  971. package/src/session/compact-modes.ts +105 -0
  972. package/src/session/history-storage.ts +360 -0
  973. package/src/session/indexed-session-storage.ts +427 -0
  974. package/src/session/messages.ts +546 -0
  975. package/src/session/redis-session-storage.ts +170 -0
  976. package/src/session/session-context.ts +404 -0
  977. package/src/session/session-dump-format.ts +216 -0
  978. package/src/session/session-entries.ts +204 -0
  979. package/src/session/session-history-format.ts +348 -0
  980. package/src/session/session-listing.ts +588 -0
  981. package/src/session/session-loader.ts +93 -0
  982. package/src/session/session-manager.ts +1750 -0
  983. package/src/session/session-migrations.ts +78 -0
  984. package/src/session/session-paths.ts +193 -0
  985. package/src/session/session-persistence.ts +147 -0
  986. package/src/session/session-storage.ts +590 -0
  987. package/src/session/shake-types.ts +43 -0
  988. package/src/session/snapcompact-inline.ts +545 -0
  989. package/src/session/snapcompact-savings-journal.ts +113 -0
  990. package/src/session/sql-session-storage.ts +314 -0
  991. package/src/session/streaming-output.ts +1330 -0
  992. package/src/session/tool-choice-queue.ts +290 -0
  993. package/src/session/unexpected-stop-classifier.ts +129 -0
  994. package/src/session/yield-queue.ts +183 -0
  995. package/src/slash-commands/acp-builtins.ts +70 -0
  996. package/src/slash-commands/available-commands.ts +105 -0
  997. package/src/slash-commands/builtin-registry.ts +2433 -0
  998. package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
  999. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  1000. package/src/slash-commands/helpers/context-report.ts +66 -0
  1001. package/src/slash-commands/helpers/cron.ts +331 -0
  1002. package/src/slash-commands/helpers/format.ts +46 -0
  1003. package/src/slash-commands/helpers/logout.ts +88 -0
  1004. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  1005. package/src/slash-commands/helpers/mcp.ts +532 -0
  1006. package/src/slash-commands/helpers/parse.ts +85 -0
  1007. package/src/slash-commands/helpers/reset-usage.ts +66 -0
  1008. package/src/slash-commands/helpers/ssh.ts +195 -0
  1009. package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
  1010. package/src/slash-commands/helpers/todo.ts +285 -0
  1011. package/src/slash-commands/helpers/usage-report.ts +128 -0
  1012. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  1013. package/src/slash-commands/types.ts +137 -0
  1014. package/src/ssh/config-writer.ts +183 -0
  1015. package/src/ssh/connection-manager.ts +510 -0
  1016. package/src/ssh/ssh-executor.ts +189 -0
  1017. package/src/ssh/sshfs-mount.ts +140 -0
  1018. package/src/ssh/utils.ts +8 -0
  1019. package/src/startup-splash.ts +19 -0
  1020. package/src/stt/asr-client.ts +341 -0
  1021. package/src/stt/asr-protocol.ts +65 -0
  1022. package/src/stt/asr-worker.ts +638 -0
  1023. package/src/stt/downloader.ts +138 -0
  1024. package/src/stt/endpointer.ts +259 -0
  1025. package/src/stt/index.ts +7 -0
  1026. package/src/stt/models.ts +150 -0
  1027. package/src/stt/recorder.ts +538 -0
  1028. package/src/stt/stt-controller.ts +380 -0
  1029. package/src/stt/transcriber.ts +60 -0
  1030. package/src/stt/wav.ts +173 -0
  1031. package/src/subprocess/worker-client.ts +297 -0
  1032. package/src/subprocess/worker-runtime.ts +277 -0
  1033. package/src/system-prompt.ts +698 -0
  1034. package/src/task/agents.ts +166 -0
  1035. package/src/task/commands.ts +132 -0
  1036. package/src/task/discovery.ts +122 -0
  1037. package/src/task/executor.ts +2356 -0
  1038. package/src/task/index.ts +1580 -0
  1039. package/src/task/name-generator.ts +1577 -0
  1040. package/src/task/omp-command.ts +26 -0
  1041. package/src/task/output-manager.ts +93 -0
  1042. package/src/task/parallel.ts +116 -0
  1043. package/src/task/persisted-revive.ts +128 -0
  1044. package/src/task/render.ts +1558 -0
  1045. package/src/task/repair-args.ts +129 -0
  1046. package/src/task/subprocess-tool-registry.ts +88 -0
  1047. package/src/task/types.ts +401 -0
  1048. package/src/task/worktree.ts +522 -0
  1049. package/src/telemetry-export.ts +144 -0
  1050. package/src/thinking.ts +187 -0
  1051. package/src/tiny/device.ts +111 -0
  1052. package/src/tiny/dtype.ts +101 -0
  1053. package/src/tiny/models.ts +256 -0
  1054. package/src/tiny/text.ts +169 -0
  1055. package/src/tiny/title-client.ts +378 -0
  1056. package/src/tiny/title-protocol.ts +56 -0
  1057. package/src/tiny/worker.ts +341 -0
  1058. package/src/tool-discovery/mode.ts +24 -0
  1059. package/src/tool-discovery/tool-index.ts +271 -0
  1060. package/src/tools/__tests__/json-tree.test.ts +35 -0
  1061. package/src/tools/acp-bridge.ts +66 -0
  1062. package/src/tools/approval.ts +189 -0
  1063. package/src/tools/ask.ts +977 -0
  1064. package/src/tools/ast-edit.ts +700 -0
  1065. package/src/tools/ast-grep.ts +483 -0
  1066. package/src/tools/auto-generated-guard.ts +322 -0
  1067. package/src/tools/bash-command-fixup.ts +37 -0
  1068. package/src/tools/bash-interactive.ts +408 -0
  1069. package/src/tools/bash-interceptor.ts +67 -0
  1070. package/src/tools/bash-pty-selection.ts +14 -0
  1071. package/src/tools/bash-skill-urls.ts +248 -0
  1072. package/src/tools/bash.ts +1405 -0
  1073. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  1074. package/src/tools/browser/aria/aria-snapshot.ts +103 -0
  1075. package/src/tools/browser/attach.ts +194 -0
  1076. package/src/tools/browser/cmux/cmux-tab.ts +1336 -0
  1077. package/src/tools/browser/cmux/rpc.ts +156 -0
  1078. package/src/tools/browser/cmux/socket-client.ts +309 -0
  1079. package/src/tools/browser/launch.ts +749 -0
  1080. package/src/tools/browser/readable.ts +112 -0
  1081. package/src/tools/browser/registry.ts +241 -0
  1082. package/src/tools/browser/render.ts +221 -0
  1083. package/src/tools/browser/tab-protocol.ts +107 -0
  1084. package/src/tools/browser/tab-supervisor.ts +799 -0
  1085. package/src/tools/browser/tab-worker-entry.ts +29 -0
  1086. package/src/tools/browser/tab-worker.ts +1421 -0
  1087. package/src/tools/browser.ts +408 -0
  1088. package/src/tools/builtin-names.ts +34 -0
  1089. package/src/tools/checkpoint.ts +136 -0
  1090. package/src/tools/conflict-detect.ts +718 -0
  1091. package/src/tools/context.ts +39 -0
  1092. package/src/tools/debug.ts +1087 -0
  1093. package/src/tools/eval-backends.ts +34 -0
  1094. package/src/tools/eval-render.ts +771 -0
  1095. package/src/tools/eval.ts +765 -0
  1096. package/src/tools/fetch.ts +1902 -0
  1097. package/src/tools/file-recorder.ts +35 -0
  1098. package/src/tools/find.ts +628 -0
  1099. package/src/tools/fs-cache-invalidation.ts +28 -0
  1100. package/src/tools/gh-cache-invalidation.ts +255 -0
  1101. package/src/tools/gh-format.ts +12 -0
  1102. package/src/tools/gh-renderer.ts +481 -0
  1103. package/src/tools/gh.ts +3752 -0
  1104. package/src/tools/github-cache.ts +663 -0
  1105. package/src/tools/grouped-file-output.ts +210 -0
  1106. package/src/tools/image-gen.ts +1586 -0
  1107. package/src/tools/index.ts +672 -0
  1108. package/src/tools/inspect-image-renderer.ts +132 -0
  1109. package/src/tools/inspect-image.ts +260 -0
  1110. package/src/tools/irc.ts +788 -0
  1111. package/src/tools/job.ts +612 -0
  1112. package/src/tools/json-tree.ts +260 -0
  1113. package/src/tools/jtd-to-json-schema.ts +219 -0
  1114. package/src/tools/jtd-to-typescript.ts +136 -0
  1115. package/src/tools/jtd-utils.ts +102 -0
  1116. package/src/tools/learn.ts +141 -0
  1117. package/src/tools/list-limit.ts +40 -0
  1118. package/src/tools/manage-skill.ts +100 -0
  1119. package/src/tools/match-line-format.ts +20 -0
  1120. package/src/tools/memory-edit.ts +59 -0
  1121. package/src/tools/memory-recall.ts +102 -0
  1122. package/src/tools/memory-reflect.ts +88 -0
  1123. package/src/tools/memory-render.ts +202 -0
  1124. package/src/tools/memory-retain.ts +89 -0
  1125. package/src/tools/output-meta.ts +768 -0
  1126. package/src/tools/output-schema-validator.ts +132 -0
  1127. package/src/tools/path-utils.ts +1116 -0
  1128. package/src/tools/plan-mode-guard.ts +142 -0
  1129. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  1130. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  1131. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  1132. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  1133. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  1134. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  1135. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  1136. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  1137. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  1138. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  1139. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  1140. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  1141. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  1142. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  1143. package/src/tools/read.ts +3124 -0
  1144. package/src/tools/render-utils.ts +895 -0
  1145. package/src/tools/renderers.ts +86 -0
  1146. package/src/tools/report-tool-issue.ts +530 -0
  1147. package/src/tools/resolve.ts +302 -0
  1148. package/src/tools/review.ts +251 -0
  1149. package/src/tools/search-tool-bm25.ts +351 -0
  1150. package/src/tools/search.ts +1592 -0
  1151. package/src/tools/sqlite-reader.ts +884 -0
  1152. package/src/tools/ssh.ts +369 -0
  1153. package/src/tools/todo.ts +944 -0
  1154. package/src/tools/tool-errors.ts +62 -0
  1155. package/src/tools/tool-result.ts +102 -0
  1156. package/src/tools/tool-timeouts.ts +30 -0
  1157. package/src/tools/tts.ts +265 -0
  1158. package/src/tools/write.ts +1156 -0
  1159. package/src/tools/yield.ts +269 -0
  1160. package/src/tts/downloader.ts +64 -0
  1161. package/src/tts/index.ts +8 -0
  1162. package/src/tts/models.ts +137 -0
  1163. package/src/tts/player.ts +137 -0
  1164. package/src/tts/runtime.ts +21 -0
  1165. package/src/tts/streaming-player.ts +266 -0
  1166. package/src/tts/tts-client.ts +474 -0
  1167. package/src/tts/tts-protocol.ts +60 -0
  1168. package/src/tts/tts-worker.ts +431 -0
  1169. package/src/tts/vocalizer.ts +162 -0
  1170. package/src/tts/wav.ts +58 -0
  1171. package/src/tui/code-cell.ts +268 -0
  1172. package/src/tui/file-list.ts +55 -0
  1173. package/src/tui/hyperlink.ts +178 -0
  1174. package/src/tui/index.ts +13 -0
  1175. package/src/tui/output-block.ts +240 -0
  1176. package/src/tui/status-line.ts +54 -0
  1177. package/src/tui/tree-list.ts +133 -0
  1178. package/src/tui/types.ts +15 -0
  1179. package/src/tui/utils.ts +103 -0
  1180. package/src/tui/width-aware-text.ts +58 -0
  1181. package/src/ui/banner.ts +41 -0
  1182. package/src/ui/chat-prompt.ts +34 -0
  1183. package/src/ui/colors.ts +37 -0
  1184. package/src/ui/index.ts +6 -0
  1185. package/src/ui/spinner.ts +15 -0
  1186. package/src/ui/status-bar.ts +57 -0
  1187. package/src/utils/block-context.ts +312 -0
  1188. package/src/utils/changelog.ts +132 -0
  1189. package/src/utils/clipboard.ts +262 -0
  1190. package/src/utils/command-args.ts +76 -0
  1191. package/src/utils/commit-message-generator.ts +147 -0
  1192. package/src/utils/edit-mode.ts +41 -0
  1193. package/src/utils/enhanced-paste.ts +230 -0
  1194. package/src/utils/event-bus.ts +33 -0
  1195. package/src/utils/external-editor.ts +78 -0
  1196. package/src/utils/file-display-mode.ts +44 -0
  1197. package/src/utils/file-mentions.ts +284 -0
  1198. package/src/utils/git.ts +1839 -0
  1199. package/src/utils/image-loading.ts +231 -0
  1200. package/src/utils/image-resize.ts +309 -0
  1201. package/src/utils/image-vision-fallback.ts +197 -0
  1202. package/src/utils/ipc.ts +38 -0
  1203. package/src/utils/jj.ts +295 -0
  1204. package/src/utils/lang-from-path.ts +244 -0
  1205. package/src/utils/markit.ts +143 -0
  1206. package/src/utils/mupdf-wasm-embed.ts +12 -0
  1207. package/src/utils/open.ts +55 -0
  1208. package/src/utils/qrcode.ts +535 -0
  1209. package/src/utils/session-color.ts +142 -0
  1210. package/src/utils/shell-snapshot.ts +249 -0
  1211. package/src/utils/sixel.ts +69 -0
  1212. package/src/utils/thinking-display.ts +89 -0
  1213. package/src/utils/title-generator.ts +348 -0
  1214. package/src/utils/tool-choice.ts +49 -0
  1215. package/src/utils/tools-manager.ts +372 -0
  1216. package/src/utils/turndown.ts +83 -0
  1217. package/src/utils/zip.ts +1091 -0
  1218. package/src/web/kagi.ts +304 -0
  1219. package/src/web/parallel.ts +354 -0
  1220. package/src/web/scrapers/artifacthub.ts +207 -0
  1221. package/src/web/scrapers/arxiv.ts +83 -0
  1222. package/src/web/scrapers/aur.ts +162 -0
  1223. package/src/web/scrapers/biorxiv.ts +133 -0
  1224. package/src/web/scrapers/bluesky.ts +262 -0
  1225. package/src/web/scrapers/brew.ts +172 -0
  1226. package/src/web/scrapers/cheatsh.ts +68 -0
  1227. package/src/web/scrapers/chocolatey.ts +196 -0
  1228. package/src/web/scrapers/choosealicense.ts +95 -0
  1229. package/src/web/scrapers/cisa-kev.ts +87 -0
  1230. package/src/web/scrapers/clojars.ts +154 -0
  1231. package/src/web/scrapers/coingecko.ts +177 -0
  1232. package/src/web/scrapers/crates-io.ts +97 -0
  1233. package/src/web/scrapers/crossref.ts +136 -0
  1234. package/src/web/scrapers/devto.ts +147 -0
  1235. package/src/web/scrapers/discogs.ts +306 -0
  1236. package/src/web/scrapers/discourse.ts +197 -0
  1237. package/src/web/scrapers/dockerhub.ts +138 -0
  1238. package/src/web/scrapers/docs-rs.ts +652 -0
  1239. package/src/web/scrapers/fdroid.ts +134 -0
  1240. package/src/web/scrapers/firefox-addons.ts +191 -0
  1241. package/src/web/scrapers/flathub.ts +223 -0
  1242. package/src/web/scrapers/github-gist.ts +58 -0
  1243. package/src/web/scrapers/github.ts +800 -0
  1244. package/src/web/scrapers/gitlab.ts +401 -0
  1245. package/src/web/scrapers/go-pkg.ts +266 -0
  1246. package/src/web/scrapers/hackage.ts +140 -0
  1247. package/src/web/scrapers/hackernews.ts +189 -0
  1248. package/src/web/scrapers/hex.ts +105 -0
  1249. package/src/web/scrapers/huggingface.ts +321 -0
  1250. package/src/web/scrapers/iacr.ts +89 -0
  1251. package/src/web/scrapers/index.ts +252 -0
  1252. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1253. package/src/web/scrapers/lemmy.ts +203 -0
  1254. package/src/web/scrapers/lobsters.ts +175 -0
  1255. package/src/web/scrapers/mastodon.ts +292 -0
  1256. package/src/web/scrapers/maven.ts +138 -0
  1257. package/src/web/scrapers/mdn.ts +173 -0
  1258. package/src/web/scrapers/metacpan.ts +222 -0
  1259. package/src/web/scrapers/musicbrainz.ts +250 -0
  1260. package/src/web/scrapers/npm.ts +98 -0
  1261. package/src/web/scrapers/nuget.ts +183 -0
  1262. package/src/web/scrapers/nvd.ts +222 -0
  1263. package/src/web/scrapers/ollama.ts +239 -0
  1264. package/src/web/scrapers/open-vsx.ts +106 -0
  1265. package/src/web/scrapers/opencorporates.ts +292 -0
  1266. package/src/web/scrapers/openlibrary.ts +336 -0
  1267. package/src/web/scrapers/orcid.ts +286 -0
  1268. package/src/web/scrapers/osv.ts +176 -0
  1269. package/src/web/scrapers/packagist.ts +160 -0
  1270. package/src/web/scrapers/pub-dev.ts +143 -0
  1271. package/src/web/scrapers/pubmed.ts +211 -0
  1272. package/src/web/scrapers/pypi.ts +112 -0
  1273. package/src/web/scrapers/rawg.ts +110 -0
  1274. package/src/web/scrapers/readthedocs.ts +120 -0
  1275. package/src/web/scrapers/reddit.ts +95 -0
  1276. package/src/web/scrapers/repology.ts +251 -0
  1277. package/src/web/scrapers/rfc.ts +201 -0
  1278. package/src/web/scrapers/rubygems.ts +103 -0
  1279. package/src/web/scrapers/searchcode.ts +189 -0
  1280. package/src/web/scrapers/sec-edgar.ts +261 -0
  1281. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1282. package/src/web/scrapers/snapcraft.ts +187 -0
  1283. package/src/web/scrapers/sourcegraph.ts +336 -0
  1284. package/src/web/scrapers/spdx.ts +108 -0
  1285. package/src/web/scrapers/spotify.ts +198 -0
  1286. package/src/web/scrapers/stackoverflow.ts +120 -0
  1287. package/src/web/scrapers/terraform.ts +277 -0
  1288. package/src/web/scrapers/tldr.ts +47 -0
  1289. package/src/web/scrapers/twitter.ts +94 -0
  1290. package/src/web/scrapers/types.ts +354 -0
  1291. package/src/web/scrapers/utils.ts +109 -0
  1292. package/src/web/scrapers/vimeo.ts +133 -0
  1293. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  1294. package/src/web/scrapers/w3c.ts +156 -0
  1295. package/src/web/scrapers/wikidata.ts +344 -0
  1296. package/src/web/scrapers/wikipedia.ts +84 -0
  1297. package/src/web/scrapers/youtube.ts +325 -0
  1298. package/src/web/search/index.ts +317 -0
  1299. package/src/web/search/provider.ts +169 -0
  1300. package/src/web/search/providers/anthropic.ts +343 -0
  1301. package/src/web/search/providers/base.ts +90 -0
  1302. package/src/web/search/providers/brave.ts +152 -0
  1303. package/src/web/search/providers/codex.ts +593 -0
  1304. package/src/web/search/providers/exa.ts +400 -0
  1305. package/src/web/search/providers/gemini.ts +518 -0
  1306. package/src/web/search/providers/jina.ts +111 -0
  1307. package/src/web/search/providers/kagi.ts +86 -0
  1308. package/src/web/search/providers/kimi.ts +196 -0
  1309. package/src/web/search/providers/parallel.ts +136 -0
  1310. package/src/web/search/providers/perplexity-auth.ts +133 -0
  1311. package/src/web/search/providers/perplexity.ts +878 -0
  1312. package/src/web/search/providers/searxng.ts +325 -0
  1313. package/src/web/search/providers/synthetic.ts +114 -0
  1314. package/src/web/search/providers/tavily.ts +176 -0
  1315. package/src/web/search/providers/utils.ts +128 -0
  1316. package/src/web/search/providers/zai.ts +333 -0
  1317. package/src/web/search/render.ts +262 -0
  1318. package/src/web/search/types.ts +462 -0
  1319. package/src/web/search/utils.ts +17 -0
  1320. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,811 @@
1
+ import type { AssistantMessage, ImageContent } from "@oh-my-pi/pi-ai";
2
+ import { Container, Image, type ImageBudget, ImageProtocol, Markdown, Spacer, TERMINAL, Text } from "@oh-my-pi/pi-tui";
3
+ import { formatNumber } from "@oh-my-pi/pi-utils";
4
+ import chalk from "chalk";
5
+ import type { AssistantThinkingRenderer } from "../../extensibility/extensions/types";
6
+ import { getMarkdownTheme, theme } from "../../modes/theme/theme";
7
+ import { resolveAbortLabel, shouldRenderAbortReason } from "../../session/messages";
8
+ import { getPreviewLines, resolveImageOptions, TRUNCATE_LENGTHS } from "../../tools/render-utils";
9
+ import { canonicalizeMessage, formatThinkingForDisplay, hasDisplayableThinking } from "../../utils/thinking-display";
10
+ import { type CacheInvalidation, CacheInvalidationMarkerComponent } from "./cache-invalidation-marker";
11
+
12
+ /**
13
+ * Max lines of a turn-ending provider error rendered inline in the transcript.
14
+ * Bounds pathological error bodies — e.g. a proxy 502 whose body is a full HTML
15
+ * page — so they can't flood the scrollback. Blank lines are dropped and each
16
+ * line is width-truncated by {@link getPreviewLines}. Full text is still kept in
17
+ * the persisted session.
18
+ */
19
+ const MAX_TRANSCRIPT_ERROR_LINES = 8;
20
+
21
+ /**
22
+ * A GFM table delimiter row (`| --- | :--: |`, with or without bounding pipes).
23
+ * The header row alone does not render a table — this delimiter is what makes
24
+ * Markdown lay one out, and a streaming table re-aligns its columns as rows
25
+ * arrive. Requires at least one column pipe so a bare thematic break (`---`)
26
+ * does not match.
27
+ */
28
+ const MARKDOWN_TABLE_DELIMITER = /^ {0,3}\|?(?:[ \t]*:?-+:?[ \t]*\|)+[ \t]*:?-*:?[ \t]*$/;
29
+
30
+ /** Opening or closing fence of a code block: ≥3 backticks/tildes plus info string. */
31
+ const CODE_FENCE_LINE = /^ {0,3}(`{3,}|~{3,})(.*)$/;
32
+
33
+ type ThinkingContentBlock = Extract<AssistantMessage["content"][number], { type: "thinking" }>;
34
+ type DisplayThinkingContentBlock = ThinkingContentBlock & { rawThinking?: string };
35
+
36
+ function resolveThinkingDisplay(block: ThinkingContentBlock, proseOnly: boolean): { text: string; visible: boolean } {
37
+ const rawThinking = (block as DisplayThinkingContentBlock).rawThinking ?? block.thinking;
38
+ const formatted = formatThinkingForDisplay(block.thinking, proseOnly);
39
+ return {
40
+ text: formatted.trim(),
41
+ visible: hasDisplayableThinking(rawThinking, formatted),
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Whether `text` currently contains reflowing Markdown whose layout is not yet
47
+ * permanent: an open ` ```mermaid ` fence (the diagram reshapes as source
48
+ * arrives) or a GFM table (columns re-align as rows arrive). Used by
49
+ * {@link AssistantMessageComponent.isTranscriptBlockCommitStable}.
50
+ *
51
+ * Fence-aware: a mermaid block is detected by its opener, and table delimiters
52
+ * inside ordinary fenced code (shell pipes, ASCII separators, doc examples) are
53
+ * ignored so a long streamed code block is never held out of native scrollback.
54
+ * A delimiter counts only directly under a pipe-bearing header row, outside any
55
+ * code fence.
56
+ */
57
+ function detectLiveReflowingMarkdown(text: string): boolean {
58
+ let fence: string | null = null;
59
+ let prevLine = "";
60
+ for (const line of text.split("\n")) {
61
+ const fenceMatch = CODE_FENCE_LINE.exec(line);
62
+ if (fence !== null) {
63
+ // Inside a code block: only a bare matching closing fence ends it.
64
+ if (
65
+ fenceMatch &&
66
+ fenceMatch[2]!.trim() === "" &&
67
+ fenceMatch[1]![0] === fence[0] &&
68
+ fenceMatch[1]!.length >= fence.length
69
+ ) {
70
+ fence = null;
71
+ }
72
+ continue;
73
+ }
74
+ if (fenceMatch) {
75
+ if (/^mermaid\b/.test(fenceMatch[2]!.trim())) return true;
76
+ fence = fenceMatch[1]!;
77
+ prevLine = "";
78
+ continue;
79
+ }
80
+ if (prevLine.includes("|") && MARKDOWN_TABLE_DELIMITER.test(line)) return true;
81
+ prevLine = line;
82
+ }
83
+ return false;
84
+ }
85
+
86
+ /**
87
+ * Frames for the streaming "thinking" pulse rendered in place of a hidden
88
+ * thinking block while the model is still producing it. A single fixed-width
89
+ * starburst cycles through facets (✻ ✼ ❉ ❊ ✺ ✹ ✸ ✶) so the indicator animates
90
+ * in place without shifting the line or the trailing speed badge. The dwell per
91
+ * frame eases between {@link THINKING_DOTS_FRAME_MS_MIN} and
92
+ * {@link THINKING_DOTS_FRAME_MS_MAX} across each revolution (see
93
+ * {@link AssistantMessageComponent.thinkingDotsFrameDelay}).
94
+ */
95
+ const THINKING_DOTS_FRAMES = ["✻", "✼", "❉", "❊", "✺", "✹", "✸", "✶"] as const;
96
+ /**
97
+ * Pulse cadence bounds (ms). Each frame's dwell eases between these on a
98
+ * raised-cosine "breath" — quickest at the cycle start, slowest at its midpoint —
99
+ * so the starburst accelerates and slows instead of ticking at one fixed rate.
100
+ * Mean ≈ 150ms, snappier than the previous flat 320ms.
101
+ */
102
+ const THINKING_DOTS_FRAME_MS_MIN = 70;
103
+ const THINKING_DOTS_FRAME_MS_MAX = 230;
104
+
105
+ /** Rolling window (ms) over which streaming-rate observations are averaged. */
106
+ const SPEED_WINDOW_MS = 3000;
107
+ /** Color/clamp ceiling: a rate at or above this maps to the full accent color. */
108
+ const SPEED_MAX = 200;
109
+
110
+ /**
111
+ * Session-wide streaming-speed gauge. Only one thinking indicator animates at a
112
+ * time, so a single shared instance accumulates instantaneous tok/s observations
113
+ * and reports their windowed average — smoothing the jumpy per-delta numbers.
114
+ * Each thinking block resets the gauge on its first live sample (see
115
+ * {@link AssistantMessageComponent.updateContent}) so the average reflects only
116
+ * the active block, never a previous turn's trailing rate. Components feed it
117
+ * deltas (not cumulative totals), so a fresh turn restarting its token count at
118
+ * zero never produces a spike.
119
+ */
120
+ class SpeedTracker {
121
+ #observations: Array<{ time: number; rate: number }> = [];
122
+
123
+ #prune(now: number): void {
124
+ const threshold = now - SPEED_WINDOW_MS;
125
+ while (this.#observations.length > 0 && this.#observations[0]!.time < threshold) {
126
+ this.#observations.shift();
127
+ }
128
+ }
129
+
130
+ /** Record one instantaneous tok/s reading, clamped to {@link SPEED_MAX} so a
131
+ * single oversized delta (e.g. a buffered reflow tick) can't poison the
132
+ * windowed average. Non-finite/negative rates ignored. */
133
+ observe(rate: number, now = performance.now()): void {
134
+ if (!Number.isFinite(rate) || rate < 0) return;
135
+ this.#observations.push({ time: now, rate: Math.min(rate, SPEED_MAX) });
136
+ this.#prune(now);
137
+ }
138
+
139
+ /** Windowed-average tok/s; 0 once observations age out of the window. */
140
+ getSpeed(now = performance.now()): number {
141
+ this.#prune(now);
142
+ if (this.#observations.length === 0) return 0;
143
+ let sum = 0;
144
+ for (const o of this.#observations) sum += o.rate;
145
+ return sum / this.#observations.length;
146
+ }
147
+
148
+ reset(): void {
149
+ this.#observations = [];
150
+ }
151
+ }
152
+
153
+ /** One gauge for the whole session — see {@link SpeedTracker}. */
154
+ const sharedSpeedTracker = new SpeedTracker();
155
+
156
+ /** Test-only: clear the shared gauge so observations don't leak across cases. */
157
+ export function resetThinkingSpeedTracker(): void {
158
+ sharedSpeedTracker.reset();
159
+ }
160
+
161
+ /**
162
+ * Linear-interpolate two `#rrggbb` colors in sRGB space. `t` clamps to [0,1]:
163
+ * `t = 0` → `from`, `t = 1` → `to`. Drives the streaming speed badge, fading
164
+ * from a dim gray toward the theme accent as tok/s rises.
165
+ */
166
+ function lerpHex(from: string, to: string, t: number): string {
167
+ const k = t < 0 ? 0 : t > 1 ? 1 : t;
168
+ const fr = Number.parseInt(from.slice(1, 3), 16);
169
+ const fg = Number.parseInt(from.slice(3, 5), 16);
170
+ const fb = Number.parseInt(from.slice(5, 7), 16);
171
+ const tr = Number.parseInt(to.slice(1, 3), 16);
172
+ const tg = Number.parseInt(to.slice(3, 5), 16);
173
+ const tb = Number.parseInt(to.slice(5, 7), 16);
174
+ const r = Math.round(fr + (tr - fr) * k);
175
+ const g = Math.round(fg + (tg - fg) * k);
176
+ const b = Math.round(fb + (tb - fb) * k);
177
+ return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
178
+ }
179
+
180
+ /**
181
+ * Component that renders a complete assistant message
182
+ */
183
+ export class AssistantMessageComponent extends Container {
184
+ #contentContainer: Container;
185
+ #markerSlot: Container;
186
+ #lastMessage?: AssistantMessage;
187
+ #toolImagesByCallId = new Map<string, ImageContent[]>();
188
+ #convertedKittyImages = new Map<string, ImageContent>();
189
+ #kittyConversionsInFlight = new Set<string>();
190
+ #transcriptBlockFinalized: boolean;
191
+ /**
192
+ * True while a non-finalized text item carries reflowing Markdown — a
193
+ * ` ```mermaid ` fence or a GFM table — whose layout re-flows every frame as
194
+ * source arrives (a diagram reshaping, a table re-aligning its columns), so
195
+ * no prefix is byte-stable until the message finalizes. See
196
+ * {@link isTranscriptBlockCommitStable}. Recomputed in {@link updateContent}
197
+ * ahead of the fast-path return, so it tracks every stream tick.
198
+ */
199
+ #hasLiveReflowingMarkdown = false;
200
+ /**
201
+ * When true, the turn-ending `Error: …` line for `stopReason === "error"` is
202
+ * suppressed because the same error is currently shown in the pinned banner
203
+ * above the editor (see `EventController` + `ErrorBannerComponent`). Avoids
204
+ * rendering the identical error twice (inline + banner) at the error moment.
205
+ * Restored to `false` when the banner is cleared at the next turn so the
206
+ * transcript keeps the error in history.
207
+ */
208
+ #errorPinned = false;
209
+ /**
210
+ * Monotonic content version reported to the transcript container via
211
+ * {@link getTranscriptBlockVersion}. Bumped by {@link updateContent} — the
212
+ * choke point every mutator funnels through, including post-finalize changes
213
+ * such as `setErrorPinned(false)` restoring the inline error at the next
214
+ * turn's `agent_start`, late tool-result images, and async Kitty conversions.
215
+ */
216
+ #blockVersion = 0;
217
+ /** Whether the last updateContent carried an in-flight streaming partial; such
218
+ * renders bypass the markdown module LRU (see Markdown.transientRenderCache). */
219
+ #lastUpdateTransient = false;
220
+ // Fast-path state: reuse Markdown children when message shape is stable during streaming.
221
+ #fastPathKey: string | undefined;
222
+ #fastPathItems:
223
+ | Array<{ md: Markdown; contentIndex: number; blockType: "text" | "thinking"; lastText: string }>
224
+ | undefined;
225
+ /** Live "thinking" pulse shown in place of a hidden thinking block while it
226
+ * streams; undefined when not animating. Driven by {@link #thinkingDotsTimer}. */
227
+ #thinkingDots: Text | undefined;
228
+ #thinkingDotsTimer: NodeJS.Timeout | undefined;
229
+ #thinkingDotsFrame = 0;
230
+ /** Previous cumulative provider token count + timestamp, for deriving this
231
+ * block's instantaneous streaming rate fed into {@link sharedSpeedTracker}.
232
+ * Undefined until the first thinking update of this block. */
233
+ #lastTokenCount: number | undefined;
234
+ #lastTokenTime = 0;
235
+ /** Provider-reported tokens in the live thinking block — reasoning tokens when
236
+ * the provider streams them, else total output — shown dimmed beside the
237
+ * speed badge. 0 when no thinking is streaming. */
238
+ #thinkingTokens = 0;
239
+ /** Whether this block has observed a positive provider-token delta — i.e. it is
240
+ * genuinely streaming tokens right now. Gates the numeric speed badge so the
241
+ * session-wide {@link sharedSpeedTracker} can't surface a previous turn's rate
242
+ * on a fresh block that has no live token throughput of its own. */
243
+ #thinkingRateLive = false;
244
+
245
+ constructor(
246
+ message?: AssistantMessage,
247
+ private hideThinkingBlock = false,
248
+ private readonly onImageUpdate?: () => void,
249
+ private readonly thinkingRenderers: readonly AssistantThinkingRenderer[] = [],
250
+ private readonly imageBudget?: ImageBudget,
251
+ private proseOnlyThinking = true,
252
+ ) {
253
+ super();
254
+ this.#transcriptBlockFinalized = message !== undefined;
255
+
256
+ // Slim cache-invalidation divider, populated above the content when this
257
+ // turn's request lost the prompt cache (see setCacheInvalidation).
258
+ this.#markerSlot = new Container();
259
+ this.addChild(this.#markerSlot);
260
+
261
+ // Container for text/thinking content
262
+ this.#contentContainer = new Container();
263
+ this.addChild(this.#contentContainer);
264
+
265
+ if (message) {
266
+ this.updateContent(message);
267
+ }
268
+ }
269
+
270
+ /**
271
+ * Show or clear the slim cache-invalidation divider above this turn. Set at
272
+ * `message_end` (live) or during rebuild, once the turn's usage is known and
273
+ * compared against the previous turn's cache footprint. Bumps the transcript
274
+ * block version so the change repaints even after content finalized.
275
+ */
276
+ setCacheInvalidation(info: CacheInvalidation | undefined): void {
277
+ this.#markerSlot.clear();
278
+ if (info) {
279
+ this.#markerSlot.addChild(new CacheInvalidationMarkerComponent(info));
280
+ }
281
+ this.#blockVersion++;
282
+ }
283
+
284
+ override invalidate(): void {
285
+ super.invalidate();
286
+ // Theme/symbol changes arrive via invalidate(). Fast-path children captured
287
+ // getMarkdownTheme() at construction, so drop them and force the teardown
288
+ // path to rebuild with the current theme. Streaming updates call
289
+ // updateContent() directly and keep the fast path.
290
+ this.#fastPathKey = undefined;
291
+ this.#fastPathItems = undefined;
292
+ if (this.#lastMessage) {
293
+ this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
294
+ }
295
+ }
296
+
297
+ setHideThinkingBlock(hide: boolean): void {
298
+ this.hideThinkingBlock = hide;
299
+ }
300
+
301
+ setProseOnlyThinking(proseOnly: boolean): void {
302
+ this.proseOnlyThinking = proseOnly;
303
+ }
304
+
305
+ override dispose(): void {
306
+ this.#stopThinkingAnimation();
307
+ super.dispose();
308
+ }
309
+
310
+ /**
311
+ * Whether to render the animated "thinking" pulse in place of the suppressed
312
+ * reasoning: only while this block is still streaming (not yet finalized — the
313
+ * in-flight message always carries `stopReason: "stop"`, so finalization is the
314
+ * only reliable live signal), thinking is hidden, no tool call has started, and
315
+ * the active tail block is a thinking block (the model is reasoning right now).
316
+ * Once text starts, a tool call streams, or the block is sealed, the pulse ends.
317
+ */
318
+ #shouldAnimateThinking(message: AssistantMessage): boolean {
319
+ if (!this.hideThinkingBlock || this.#transcriptBlockFinalized) return false;
320
+ let tail: "text" | "thinking" | undefined;
321
+ for (const content of message.content) {
322
+ if (content.type === "toolCall") return false;
323
+ if (content.type === "text" && canonicalizeMessage(content.text)) tail = "text";
324
+ else if (content.type === "thinking" && canonicalizeMessage(content.thinking)) tail = "thinking";
325
+ }
326
+ return tail === "thinking";
327
+ }
328
+
329
+ #thinkingDotsLabel(): string {
330
+ const glyph = THINKING_DOTS_FRAMES[this.#thinkingDotsFrame % THINKING_DOTS_FRAMES.length] ?? "…";
331
+ const coloredGlyph = theme.fg("thinkingText", glyph);
332
+ const rate = Math.min(SPEED_MAX, sharedSpeedTracker.getSpeed());
333
+ // The numeric badge ("<total> · <rate> toks/s") only renders while this block
334
+ // is genuinely streaming provider tokens. A block that has observed no token
335
+ // delta (e.g. a provider that reports usage only at turn end) or whose rate
336
+ // has decayed to zero (a streaming lull) drops it entirely — the bare pulse
337
+ // keeps signalling that the model is thinking. The liveness flag also stops
338
+ // the session-wide gauge from leaking a previous turn's rate onto a fresh
339
+ // token-less block.
340
+ if (!this.#thinkingRateLive || rate < 0.05) return coloredGlyph;
341
+ // Total provider tokens, dimmed, sit next to the pulse.
342
+ const totalSpan = this.#thinkingTokens > 0 ? theme.fg("dim", ` ${formatNumber(this.#thinkingTokens)}`) : "";
343
+ // Speed badge color: dim gray at rest, brightening toward the theme accent as
344
+ // streaming speed climbs (gray → bright accent). Ease (sqrt) so typical
345
+ // mid-stream rates already read as clearly accent-tinted instead of staying
346
+ // gray until the rarely-hit SPEED_MAX ceiling.
347
+ const ratio = Math.sqrt(rate / SPEED_MAX);
348
+ const hex = lerpHex(theme.getColorHex("dim"), theme.getAccentColorHex(), ratio);
349
+ const rateText = ` · ${rate.toFixed(1)} toks/s`;
350
+ const rateSpan = theme.getColorMode() === "truecolor" ? chalk.hex(hex)(rateText) : theme.fg("muted", rateText);
351
+ return coloredGlyph + totalSpan + rateSpan;
352
+ }
353
+
354
+ #startThinkingAnimation(): void {
355
+ if (this.#thinkingDotsTimer) return;
356
+ this.#scheduleThinkingFrame();
357
+ }
358
+
359
+ /** Eased dwell (ms) for the current pulse frame: a raised cosine over the
360
+ * 8-frame cycle, continuous across the wrap, so the rotation breathes rather
361
+ * than advancing at a fixed interval. */
362
+ #thinkingDotsFrameDelay(): number {
363
+ const phase = (1 - Math.cos((2 * Math.PI * this.#thinkingDotsFrame) / THINKING_DOTS_FRAMES.length)) / 2;
364
+ return THINKING_DOTS_FRAME_MS_MIN + (THINKING_DOTS_FRAME_MS_MAX - THINKING_DOTS_FRAME_MS_MIN) * phase;
365
+ }
366
+
367
+ /** Self-rescheduling timeout (not a fixed interval) so each frame can pick its
368
+ * own eased dwell. */
369
+ #scheduleThinkingFrame(): void {
370
+ this.#thinkingDotsTimer = setTimeout(() => this.#advanceThinkingDots(), this.#thinkingDotsFrameDelay());
371
+ this.#thinkingDotsTimer.unref?.();
372
+ }
373
+
374
+ #advanceThinkingDots(): void {
375
+ this.#thinkingDotsTimer = undefined;
376
+ if (!this.#thinkingDots) {
377
+ this.#stopThinkingAnimation();
378
+ return;
379
+ }
380
+ this.#thinkingDotsFrame = (this.#thinkingDotsFrame + 1) % THINKING_DOTS_FRAMES.length;
381
+ if (this.#thinkingDots.setText(this.#thinkingDotsLabel())) {
382
+ this.onImageUpdate?.();
383
+ }
384
+ this.#scheduleThinkingFrame();
385
+ }
386
+
387
+ #stopThinkingAnimation(): void {
388
+ if (this.#thinkingDotsTimer) {
389
+ clearTimeout(this.#thinkingDotsTimer);
390
+ this.#thinkingDotsTimer = undefined;
391
+ }
392
+ this.#thinkingDotsFrame = 0;
393
+ }
394
+
395
+ /**
396
+ * Toggle suppression of the inline `Error: …` line while the same error is
397
+ * pinned in the banner above the editor. Re-renders so the change is visible.
398
+ */
399
+ setErrorPinned(pinned: boolean): void {
400
+ if (this.#errorPinned === pinned) return;
401
+ this.#errorPinned = pinned;
402
+ if (this.#lastMessage) {
403
+ this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
404
+ }
405
+ }
406
+
407
+ isTranscriptBlockFinalized(): boolean {
408
+ return this.#transcriptBlockFinalized;
409
+ }
410
+
411
+ /**
412
+ * Whether this still-live block's scrolled-off rows may be committed to
413
+ * immutable native scrollback (the {@link TranscriptContainer} durable-
414
+ * snapshot path). Reflowing Markdown — a streaming mermaid diagram or a GFM
415
+ * table — re-lays-out its body as source arrives (the diagram reshapes, the
416
+ * table re-aligns its columns), so committing an intermediate layout strands
417
+ * a stale fragment in native scrollback that only a full repaint (Ctrl+L) can
418
+ * clear. While such content is still streaming the block therefore stays
419
+ * wholly in the repaintable live region and commits once, at its final
420
+ * layout, when the turn finalizes.
421
+ */
422
+ isTranscriptBlockCommitStable(): boolean {
423
+ return this.#transcriptBlockFinalized || !this.#hasLiveReflowingMarkdown;
424
+ }
425
+
426
+ getTranscriptBlockVersion(): number {
427
+ return this.#blockVersion;
428
+ }
429
+
430
+ markTranscriptBlockFinalized(): void {
431
+ this.#transcriptBlockFinalized = true;
432
+ this.#stopThinkingAnimation();
433
+ // If the live pulse was on screen when the block sealed, drop the fast path
434
+ // and rebuild so the placeholder is removed — finalized blocks never animate.
435
+ if (this.#thinkingDots) {
436
+ this.#fastPathKey = undefined;
437
+ this.#fastPathItems = undefined;
438
+ if (this.#lastMessage) this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
439
+ }
440
+ }
441
+
442
+ /**
443
+ * Render a turn-ending provider error inline. Drops blank lines, clamps the
444
+ * line count to {@link MAX_TRANSCRIPT_ERROR_LINES}, and width-truncates each
445
+ * line so a pathological body — e.g. the HTML page a proxy returns on a 502 —
446
+ * can't flood the transcript. Mirrors {@link ErrorBannerComponent}.
447
+ */
448
+ #appendErrorBlock(message: string): void {
449
+ const lines = getPreviewLines(message, MAX_TRANSCRIPT_ERROR_LINES, TRUNCATE_LENGTHS.LINE);
450
+ if (lines.length === 0) lines.push("Unknown error");
451
+ this.#contentContainer.addChild(new Spacer(1));
452
+ this.#contentContainer.addChild(new Text(theme.fg("error", `Error: ${lines[0]}`), 1, 0));
453
+ for (const line of lines.slice(1)) {
454
+ this.#contentContainer.addChild(new Text(theme.fg("error", ` ${line}`), 1, 0));
455
+ }
456
+ }
457
+
458
+ setToolResultImages(toolCallId: string, images: ImageContent[]): void {
459
+ if (!toolCallId) return;
460
+ const validImages = images.filter(img => img.type === "image" && img.data && img.mimeType);
461
+ for (const key of Array.from(this.#convertedKittyImages.keys())) {
462
+ if (key.startsWith(`${toolCallId}:`)) {
463
+ this.#convertedKittyImages.delete(key);
464
+ }
465
+ }
466
+ for (const key of Array.from(this.#kittyConversionsInFlight)) {
467
+ if (key.startsWith(`${toolCallId}:`)) {
468
+ this.#kittyConversionsInFlight.delete(key);
469
+ }
470
+ }
471
+ if (validImages.length === 0) {
472
+ this.#toolImagesByCallId.delete(toolCallId);
473
+ } else {
474
+ this.#toolImagesByCallId.set(toolCallId, validImages);
475
+ this.#convertToolImagesForKitty(toolCallId, validImages);
476
+ }
477
+ if (this.#lastMessage) {
478
+ this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
479
+ }
480
+ }
481
+
482
+ #convertToolImagesForKitty(toolCallId: string, images: ImageContent[]): void {
483
+ if (TERMINAL.imageProtocol !== ImageProtocol.Kitty) return;
484
+ for (let index = 0; index < images.length; index++) {
485
+ const image = images[index];
486
+ if (!image || image.mimeType === "image/png") continue;
487
+ const key = `${toolCallId}:${index}`;
488
+ if (this.#convertedKittyImages.has(key) || this.#kittyConversionsInFlight.has(key)) continue;
489
+ this.#kittyConversionsInFlight.add(key);
490
+ new Bun.Image(Buffer.from(image.data, "base64"))
491
+ .png()
492
+ .toBase64()
493
+ .then(data => {
494
+ this.#kittyConversionsInFlight.delete(key);
495
+ this.#convertedKittyImages.set(key, {
496
+ type: "image",
497
+ data,
498
+ mimeType: "image/png",
499
+ });
500
+ if (this.#lastMessage) {
501
+ this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
502
+ }
503
+ this.onImageUpdate?.();
504
+ })
505
+ .catch(() => {
506
+ this.#kittyConversionsInFlight.delete(key);
507
+ });
508
+ }
509
+ }
510
+
511
+ #renderToolImages(): void {
512
+ const imageEntries = Array.from(this.#toolImagesByCallId.entries()).flatMap(([toolCallId, images]) =>
513
+ images.map((image, index) => ({ image, key: `${toolCallId}:${index}` })),
514
+ );
515
+ if (imageEntries.length === 0) return;
516
+
517
+ this.#contentContainer.addChild(new Spacer(1));
518
+ for (const { image, key } of imageEntries) {
519
+ const displayImage =
520
+ TERMINAL.imageProtocol === ImageProtocol.Kitty && image.mimeType !== "image/png"
521
+ ? this.#convertedKittyImages.get(key)
522
+ : image;
523
+ if (TERMINAL.imageProtocol && displayImage) {
524
+ this.#contentContainer.addChild(
525
+ new Image(
526
+ displayImage.data,
527
+ displayImage.mimeType,
528
+ { fallbackColor: (text: string) => theme.fg("toolOutput", text) },
529
+ { ...resolveImageOptions(), budget: this.imageBudget, imageKey: key },
530
+ ),
531
+ );
532
+ continue;
533
+ }
534
+ this.#contentContainer.addChild(new Text(theme.fg("toolOutput", `[Image: ${image.mimeType}]`), 1, 0));
535
+ }
536
+ }
537
+
538
+ #appendThinkingExtensions(contentIndex: number, thinkingIndex: number, text: string): void {
539
+ for (const renderer of this.thinkingRenderers) {
540
+ try {
541
+ const component = renderer(
542
+ {
543
+ contentIndex,
544
+ thinkingIndex,
545
+ text,
546
+ requestRender: () => this.onImageUpdate?.(),
547
+ },
548
+ theme,
549
+ );
550
+ if (component) {
551
+ this.#contentContainer.addChild(component);
552
+ }
553
+ } catch {
554
+ // Ignore extension renderer failures and keep the original thinking block visible.
555
+ }
556
+ }
557
+ }
558
+
559
+ #computeShapeKey(message: AssistantMessage): string {
560
+ const parts: string[] = [`htb:${this.hideThinkingBlock ? 1 : 0}|pot:${this.proseOnlyThinking ? 1 : 0}`];
561
+ for (const content of message.content) {
562
+ if (content.type === "text") {
563
+ parts.push(canonicalizeMessage(content.text) ? "T1" : "T0");
564
+ } else if (content.type === "thinking") {
565
+ const display = resolveThinkingDisplay(content, this.proseOnlyThinking);
566
+ if (!display.visible) parts.push("K0");
567
+ else if (this.hideThinkingBlock) parts.push("KH");
568
+ else parts.push("KV");
569
+ } else {
570
+ // Non-rendered blocks (toolCall, redactedThinking, …) still occupy a
571
+ // content index. Encode their position so an inserted/removed one shifts
572
+ // the key and forces the teardown path instead of mis-indexing children.
573
+ parts.push(`O:${content.type}`);
574
+ }
575
+ }
576
+ return parts.join("|");
577
+ }
578
+
579
+ #canFastPath(message: AssistantMessage): boolean {
580
+ for (const content of message.content) {
581
+ if (content.type === "toolCall") return false;
582
+ }
583
+ if (this.#toolImagesByCallId.size > 0) return false;
584
+ if (message.stopReason === "aborted" && shouldRenderAbortReason(message.errorMessage)) return false;
585
+ if (message.stopReason === "error" && !this.#errorPinned) return false;
586
+ if (
587
+ message.errorMessage &&
588
+ shouldRenderAbortReason(message.errorMessage) &&
589
+ message.stopReason !== "aborted" &&
590
+ message.stopReason !== "error"
591
+ )
592
+ return false;
593
+ // Extension stability: if thinking renderers exist and any tracked thinking
594
+ // block's text changed, extensions may produce a different child count.
595
+ if (this.thinkingRenderers.length > 0 && this.#fastPathItems) {
596
+ for (const item of this.#fastPathItems) {
597
+ if (item.blockType === "thinking") {
598
+ const content = message.content[item.contentIndex];
599
+ if (content?.type === "thinking") {
600
+ const display = resolveThinkingDisplay(content, this.proseOnlyThinking);
601
+ if (display.text !== item.lastText) return false;
602
+ }
603
+ }
604
+ }
605
+ }
606
+ return true;
607
+ }
608
+
609
+ #tryFastPathUpdate(message: AssistantMessage, opts?: { transient?: boolean }): boolean {
610
+ if (!this.#fastPathKey || !this.#fastPathItems) return false;
611
+ if (!this.#canFastPath(message)) {
612
+ this.#fastPathKey = undefined;
613
+ this.#fastPathItems = undefined;
614
+ return false;
615
+ }
616
+ if (this.#computeShapeKey(message) !== this.#fastPathKey) {
617
+ this.#fastPathKey = undefined;
618
+ this.#fastPathItems = undefined;
619
+ return false;
620
+ }
621
+ const transient = opts?.transient === true;
622
+ // Shape is identical — setText only on Markdown children whose source changed.
623
+ for (const item of this.#fastPathItems) {
624
+ item.md.transientRenderCache = transient;
625
+ const content = message.content[item.contentIndex];
626
+ if (!content) {
627
+ this.#fastPathKey = undefined;
628
+ this.#fastPathItems = undefined;
629
+ return false;
630
+ }
631
+ let newText: string;
632
+ if (item.blockType === "text" && content.type === "text") {
633
+ newText = content.text.trim();
634
+ } else if (item.blockType === "thinking" && content.type === "thinking") {
635
+ newText = resolveThinkingDisplay(content, this.proseOnlyThinking).text;
636
+ } else {
637
+ this.#fastPathKey = undefined;
638
+ this.#fastPathItems = undefined;
639
+ return false;
640
+ }
641
+ if (newText !== item.lastText) {
642
+ item.md.setText(newText);
643
+ item.lastText = newText;
644
+ }
645
+ }
646
+ if (this.#thinkingDots) {
647
+ if (this.#thinkingDots.setText(this.#thinkingDotsLabel())) {
648
+ this.onImageUpdate?.();
649
+ }
650
+ }
651
+ return true;
652
+ }
653
+
654
+ updateContent(message: AssistantMessage, opts?: { transient?: boolean }): void {
655
+ this.#blockVersion++;
656
+ this.#lastMessage = message;
657
+ this.#lastUpdateTransient = opts?.transient === true;
658
+
659
+ // Streaming-speed gauge: only a live, in-flight render of the single
660
+ // animating hidden-thinking block feeds the shared session tracker. The
661
+ // token count is the provider's own cumulative output — reasoning tokens when
662
+ // reported (Gemini's thoughtsTokenCount, OpenAI's reasoning_tokens), else
663
+ // total output tokens — never a character estimate, which undercounts when
664
+ // the provider streams a summarized reasoning trace. An instantaneous tok/s
665
+ // is derived from this block's delta and handed to the windowed averager.
666
+ // Only transient renders count: the final non-transient render at
667
+ // message_end carries the turn's end-of-stream usage, whose jump would spike
668
+ // the gauge and pollute the next block. Providers that report usage only at
669
+ // turn end leave the live count flat, so the rate stays 0 and the badge
670
+ // self-suppresses (see #thinkingDotsLabel).
671
+ const isThinkingNow = this.#lastUpdateTransient && this.#shouldAnimateThinking(message);
672
+ if (isThinkingNow) {
673
+ const currentTokens = message.usage.reasoningTokens ?? message.usage.output;
674
+ this.#thinkingTokens = currentTokens;
675
+ const now = performance.now();
676
+ if (this.#lastTokenCount !== undefined) {
677
+ const tokenDelta = currentTokens - this.#lastTokenCount;
678
+ const elapsedMs = now - this.#lastTokenTime;
679
+ if (tokenDelta > 0 && elapsedMs > 0) {
680
+ // First live sample of this block: drop the session gauge's prior-turn
681
+ // observations so the windowed average reflects only this block.
682
+ if (!this.#thinkingRateLive) sharedSpeedTracker.reset();
683
+ sharedSpeedTracker.observe((tokenDelta / elapsedMs) * 1000, now);
684
+ this.#thinkingRateLive = true;
685
+ }
686
+ }
687
+ this.#lastTokenCount = currentTokens;
688
+ this.#lastTokenTime = now;
689
+ } else {
690
+ this.#lastTokenCount = undefined;
691
+ this.#thinkingTokens = 0;
692
+ this.#thinkingRateLive = false;
693
+ }
694
+
695
+ // Streaming reflowing Markdown (a mermaid diagram reshaping, a GFM table
696
+ // re-aligning columns) re-lays-out its body each frame; see
697
+ // isTranscriptBlockCommitStable. Detect it from raw text — a Markdown
698
+ // parser only resolves these once the closing fence / delimiter row
699
+ // arrives, but the stale native-scrollback commits happen mid-stream.
700
+ this.#hasLiveReflowingMarkdown = message.content.some(
701
+ content => content.type === "text" && detectLiveReflowingMarkdown(content.text),
702
+ );
703
+
704
+ // Fast path: reuse Markdown children when shape is stable during streaming
705
+ if (this.#tryFastPathUpdate(message)) return;
706
+
707
+ // Clear content container
708
+ this.#contentContainer.clear();
709
+ this.#thinkingDots = undefined;
710
+
711
+ // Determine if we should capture Markdown instances for next fast path
712
+ const shouldCapture = this.#canFastPath(message);
713
+ const captureItems:
714
+ | Array<{ md: Markdown; contentIndex: number; blockType: "text" | "thinking"; lastText: string }>
715
+ | undefined = shouldCapture ? [] : undefined;
716
+
717
+ const hasVisibleContent = message.content.some(
718
+ c =>
719
+ (c.type === "text" && canonicalizeMessage(c.text)) ||
720
+ (!this.hideThinkingBlock &&
721
+ c.type === "thinking" &&
722
+ resolveThinkingDisplay(c, this.proseOnlyThinking).visible),
723
+ );
724
+
725
+ // Render content in order
726
+ let thinkingIndex = 0;
727
+ for (let i = 0; i < message.content.length; i++) {
728
+ const content = message.content[i];
729
+ if (content.type === "text" && canonicalizeMessage(content.text)) {
730
+ // Set paddingY=0 to avoid extra spacing before tool executions
731
+ const trimmed = content.text.trim();
732
+ const md = new Markdown(trimmed, 1, 0, getMarkdownTheme());
733
+ md.transientRenderCache = this.#lastUpdateTransient;
734
+ this.#contentContainer.addChild(md);
735
+ captureItems?.push({ md, contentIndex: i, blockType: "text", lastText: trimmed });
736
+ } else if (content.type === "thinking" && resolveThinkingDisplay(content, this.proseOnlyThinking).visible) {
737
+ const thinkingText = resolveThinkingDisplay(content, this.proseOnlyThinking).text;
738
+ if (this.hideThinkingBlock) {
739
+ thinkingIndex += 1;
740
+ continue;
741
+ }
742
+ // Add spacing only when another visible assistant content block follows.
743
+ // This avoids a superfluous blank line before separately-rendered tool execution blocks.
744
+ const hasVisibleContentAfter = message.content
745
+ .slice(i + 1)
746
+ .some(
747
+ c =>
748
+ (c.type === "text" && canonicalizeMessage(c.text)) ||
749
+ (c.type === "thinking" && resolveThinkingDisplay(c, this.proseOnlyThinking).visible),
750
+ );
751
+
752
+ // Thinking traces in thinkingText color, italic
753
+ const md = new Markdown(thinkingText, 1, 0, getMarkdownTheme(), {
754
+ color: (text: string) => theme.fg("thinkingText", text),
755
+ italic: true,
756
+ });
757
+ md.transientRenderCache = this.#lastUpdateTransient;
758
+ this.#contentContainer.addChild(md);
759
+ captureItems?.push({ md, contentIndex: i, blockType: "thinking", lastText: thinkingText });
760
+ this.#appendThinkingExtensions(i, thinkingIndex, thinkingText);
761
+ thinkingIndex += 1;
762
+ if (hasVisibleContentAfter) {
763
+ this.#contentContainer.addChild(new Spacer(1));
764
+ }
765
+ }
766
+ }
767
+
768
+ if (this.#shouldAnimateThinking(message)) {
769
+ if (hasVisibleContent) this.#contentContainer.addChild(new Spacer(1));
770
+ this.#thinkingDots = new Text(this.#thinkingDotsLabel(), 1, 0);
771
+ this.#contentContainer.addChild(this.#thinkingDots);
772
+ this.#startThinkingAnimation();
773
+ } else {
774
+ this.#stopThinkingAnimation();
775
+ }
776
+
777
+ this.#renderToolImages();
778
+ // Check if aborted - show after partial content
779
+ // But only if there are no tool calls (tool execution components will show the error)
780
+ const hasToolCalls = message.content.some(c => c.type === "toolCall");
781
+ if (!hasToolCalls) {
782
+ if (message.stopReason === "aborted" && shouldRenderAbortReason(message.errorMessage)) {
783
+ const abortMessage = resolveAbortLabel(message.errorMessage);
784
+ if (hasVisibleContent) {
785
+ this.#contentContainer.addChild(new Spacer(1));
786
+ } else {
787
+ this.#contentContainer.addChild(new Spacer(1));
788
+ }
789
+ this.#contentContainer.addChild(new Text(theme.fg("error", abortMessage), 1, 0));
790
+ } else if (message.stopReason === "error" && !this.#errorPinned) {
791
+ this.#appendErrorBlock(message.errorMessage || "Unknown error");
792
+ }
793
+ }
794
+ if (
795
+ message.errorMessage &&
796
+ shouldRenderAbortReason(message.errorMessage) &&
797
+ message.stopReason !== "aborted" &&
798
+ message.stopReason !== "error"
799
+ ) {
800
+ this.#appendErrorBlock(message.errorMessage);
801
+ }
802
+ // Store fast-path state for next call
803
+ if (shouldCapture) {
804
+ this.#fastPathItems = captureItems;
805
+ this.#fastPathKey = this.#computeShapeKey(message);
806
+ } else {
807
+ this.#fastPathKey = undefined;
808
+ this.#fastPathItems = undefined;
809
+ }
810
+ }
811
+ }