@kr78/pi-coding-agent 17.2.10

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 (1593) hide show
  1. package/CHANGELOG.md +14861 -0
  2. package/README.md +35 -0
  3. package/dist/CHANGELOG-chtdxh1z.md +14861 -0
  4. package/dist/cli.js +20483 -0
  5. package/dist/template-c2hyaytt.js +1653 -0
  6. package/dist/template-f8wx9vfn.css +1355 -0
  7. package/dist/template-qat058wr.html +55 -0
  8. package/dist/tool-views.generated-jdfmzwmn.js +35 -0
  9. package/examples/README.md +21 -0
  10. package/examples/custom-tools/README.md +104 -0
  11. package/examples/custom-tools/hello/index.ts +20 -0
  12. package/examples/extensions/README.md +142 -0
  13. package/examples/extensions/api-demo.ts +78 -0
  14. package/examples/extensions/chalk-logger.ts +25 -0
  15. package/examples/extensions/hello.ts +31 -0
  16. package/examples/extensions/pirate.ts +43 -0
  17. package/examples/extensions/plan-mode.ts +549 -0
  18. package/examples/extensions/reload-runtime.ts +38 -0
  19. package/examples/extensions/thinking-note.ts +13 -0
  20. package/examples/extensions/tools.ts +145 -0
  21. package/examples/extensions/with-deps/index.ts +36 -0
  22. package/examples/extensions/with-deps/package-lock.json +31 -0
  23. package/examples/extensions/with-deps/package.json +17 -0
  24. package/examples/hooks/README.md +56 -0
  25. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  26. package/examples/hooks/confirm-destructive.ts +58 -0
  27. package/examples/hooks/custom-compaction.ts +115 -0
  28. package/examples/hooks/dirty-repo-guard.ts +51 -0
  29. package/examples/hooks/file-trigger.ts +40 -0
  30. package/examples/hooks/git-checkpoint.ts +52 -0
  31. package/examples/hooks/handoff.ts +149 -0
  32. package/examples/hooks/permission-gate.ts +33 -0
  33. package/examples/hooks/protected-paths.ts +29 -0
  34. package/examples/hooks/qna.ts +118 -0
  35. package/examples/hooks/status-line.ts +39 -0
  36. package/examples/sdk/01-minimal.ts +21 -0
  37. package/examples/sdk/02-custom-model.ts +49 -0
  38. package/examples/sdk/03-custom-prompt.ts +46 -0
  39. package/examples/sdk/04-skills.ts +43 -0
  40. package/examples/sdk/06-extensions.ts +82 -0
  41. package/examples/sdk/06-hooks.ts +61 -0
  42. package/examples/sdk/07-context-files.ts +35 -0
  43. package/examples/sdk/08-prompt-templates.ts +41 -0
  44. package/examples/sdk/08-slash-commands.ts +46 -0
  45. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  46. package/examples/sdk/11-sessions.ts +47 -0
  47. package/examples/sdk/12-redis-sessions.ts +54 -0
  48. package/examples/sdk/13-sql-sessions.ts +61 -0
  49. package/examples/sdk/README.md +169 -0
  50. package/package.json +587 -0
  51. package/scripts/bench-guard.ts +71 -0
  52. package/scripts/bench-title-models.ts +332 -0
  53. package/scripts/build-binary.ts +117 -0
  54. package/scripts/bundle-dist.ts +123 -0
  55. package/scripts/compile-binary.ts +69 -0
  56. package/scripts/embed-mupdf-wasm.ts +67 -0
  57. package/scripts/format-prompts.ts +68 -0
  58. package/scripts/generate-aria-snapshot.ts +134 -0
  59. package/scripts/generate-docs-index.ts +58 -0
  60. package/scripts/generate-share-viewer.ts +34 -0
  61. package/scripts/legacy-pi-virtual-module.ts +205 -0
  62. package/scripts/measure-prompt-tokens.ts +63 -0
  63. package/scripts/omp +51 -0
  64. package/scripts/omp.ts +19 -0
  65. package/scripts/security-compare.ts +40 -0
  66. package/src/advisor/advise-tool.ts +234 -0
  67. package/src/advisor/config.ts +341 -0
  68. package/src/advisor/emission-guard.ts +172 -0
  69. package/src/advisor/index.ts +6 -0
  70. package/src/advisor/runtime.ts +1412 -0
  71. package/src/advisor/transcript-recorder.ts +215 -0
  72. package/src/advisor/watchdog.ts +135 -0
  73. package/src/async/index.ts +1 -0
  74. package/src/async/job-manager.ts +847 -0
  75. package/src/auto-thinking/classifier.ts +220 -0
  76. package/src/autolearn/controller.ts +152 -0
  77. package/src/autolearn/managed-skills.ts +255 -0
  78. package/src/autoresearch/command-resume.md +14 -0
  79. package/src/autoresearch/dashboard.ts +436 -0
  80. package/src/autoresearch/git.ts +331 -0
  81. package/src/autoresearch/helpers.ts +218 -0
  82. package/src/autoresearch/index.ts +541 -0
  83. package/src/autoresearch/prompt-setup.md +43 -0
  84. package/src/autoresearch/prompt.md +103 -0
  85. package/src/autoresearch/resume-message.md +10 -0
  86. package/src/autoresearch/state.ts +273 -0
  87. package/src/autoresearch/storage.ts +700 -0
  88. package/src/autoresearch/tools/init-experiment.ts +268 -0
  89. package/src/autoresearch/tools/log-experiment.ts +520 -0
  90. package/src/autoresearch/tools/run-experiment.ts +407 -0
  91. package/src/autoresearch/tools/update-notes.ts +109 -0
  92. package/src/autoresearch/types.ts +168 -0
  93. package/src/capability/context-file.ts +44 -0
  94. package/src/capability/extension-module.ts +34 -0
  95. package/src/capability/extension.ts +47 -0
  96. package/src/capability/fs.ts +117 -0
  97. package/src/capability/hook.ts +40 -0
  98. package/src/capability/index.ts +467 -0
  99. package/src/capability/instruction.ts +37 -0
  100. package/src/capability/mcp.ts +115 -0
  101. package/src/capability/prompt.ts +35 -0
  102. package/src/capability/rule-buckets.ts +66 -0
  103. package/src/capability/rule.ts +298 -0
  104. package/src/capability/settings.ts +34 -0
  105. package/src/capability/skill.ts +69 -0
  106. package/src/capability/slash-command.ts +40 -0
  107. package/src/capability/ssh.ts +41 -0
  108. package/src/capability/system-prompt.ts +34 -0
  109. package/src/capability/tool.ts +38 -0
  110. package/src/capability/types.ts +187 -0
  111. package/src/cleanse/agent.ts +226 -0
  112. package/src/cleanse/balance.ts +79 -0
  113. package/src/cleanse/checkers.ts +996 -0
  114. package/src/cleanse/index.ts +190 -0
  115. package/src/cleanse/loop.ts +51 -0
  116. package/src/cleanse/parsers.ts +726 -0
  117. package/src/cleanse/progress.ts +50 -0
  118. package/src/cleanse/prompts/assignment.md +47 -0
  119. package/src/cleanse/types.ts +72 -0
  120. package/src/cli/agents-cli.ts +138 -0
  121. package/src/cli/args.ts +368 -0
  122. package/src/cli/auth-broker-cli.ts +940 -0
  123. package/src/cli/auth-gateway-cli.ts +674 -0
  124. package/src/cli/bench-cli.ts +990 -0
  125. package/src/cli/browser-relay-cli.ts +119 -0
  126. package/src/cli/classify-install-target.ts +76 -0
  127. package/src/cli/claude-trace-cli.ts +795 -0
  128. package/src/cli/command-help.ts +107 -0
  129. package/src/cli/commands/init-xdg.ts +27 -0
  130. package/src/cli/completion-gen.ts +550 -0
  131. package/src/cli/config-cli.ts +459 -0
  132. package/src/cli/dry-balance-cli.ts +864 -0
  133. package/src/cli/extension-flags.ts +48 -0
  134. package/src/cli/file-processor.ts +132 -0
  135. package/src/cli/flag-tables.ts +367 -0
  136. package/src/cli/gallery-cli.ts +272 -0
  137. package/src/cli/gallery-fixtures/agentic.ts +420 -0
  138. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  139. package/src/cli/gallery-fixtures/edit.ts +254 -0
  140. package/src/cli/gallery-fixtures/fs.ts +245 -0
  141. package/src/cli/gallery-fixtures/index.ts +40 -0
  142. package/src/cli/gallery-fixtures/interaction.ts +46 -0
  143. package/src/cli/gallery-fixtures/memory.ts +81 -0
  144. package/src/cli/gallery-fixtures/misc.ts +177 -0
  145. package/src/cli/gallery-fixtures/search.ts +135 -0
  146. package/src/cli/gallery-fixtures/shell.ts +241 -0
  147. package/src/cli/gallery-fixtures/types.ts +57 -0
  148. package/src/cli/gallery-fixtures/web.ts +158 -0
  149. package/src/cli/gallery-screenshot.ts +279 -0
  150. package/src/cli/gc-cli.ts +1566 -0
  151. package/src/cli/grep-cli.ts +161 -0
  152. package/src/cli/grievances-cli.ts +256 -0
  153. package/src/cli/help-extra.ts +89 -0
  154. package/src/cli/initial-message.ts +58 -0
  155. package/src/cli/models-cli.ts +385 -0
  156. package/src/cli/plugin-cli.ts +996 -0
  157. package/src/cli/profile-alias.ts +369 -0
  158. package/src/cli/profile-bootstrap.ts +233 -0
  159. package/src/cli/read-cli.ts +99 -0
  160. package/src/cli/session-picker.ts +110 -0
  161. package/src/cli/setup-cli.ts +312 -0
  162. package/src/cli/setup-model-picker.ts +43 -0
  163. package/src/cli/shell-cli.ts +176 -0
  164. package/src/cli/ssh-cli.ts +179 -0
  165. package/src/cli/startup-cwd.ts +58 -0
  166. package/src/cli/stats-cli.ts +229 -0
  167. package/src/cli/thinking-levels.ts +7 -0
  168. package/src/cli/tiny-models-cli.ts +153 -0
  169. package/src/cli/ttsr-cli.ts +1013 -0
  170. package/src/cli/update-cli.ts +1184 -0
  171. package/src/cli/usage-cli.ts +1084 -0
  172. package/src/cli/usage-error.ts +7 -0
  173. package/src/cli/web-search-cli.ts +144 -0
  174. package/src/cli/worktree-cli.ts +311 -0
  175. package/src/cli-commands.ts +308 -0
  176. package/src/cli.ts +428 -0
  177. package/src/collab/crypto.ts +63 -0
  178. package/src/collab/display-name.ts +13 -0
  179. package/src/collab/guest.ts +764 -0
  180. package/src/collab/host.ts +692 -0
  181. package/src/collab/protocol.ts +296 -0
  182. package/src/collab/relay-client.ts +282 -0
  183. package/src/collab/replication-shrink.ts +111 -0
  184. package/src/commands/acp.ts +35 -0
  185. package/src/commands/agents.ts +58 -0
  186. package/src/commands/auth-broker.ts +100 -0
  187. package/src/commands/auth-gateway.ts +70 -0
  188. package/src/commands/bench.ts +64 -0
  189. package/src/commands/browser-relay.ts +53 -0
  190. package/src/commands/cleanse.ts +45 -0
  191. package/src/commands/commit.ts +47 -0
  192. package/src/commands/complete.ts +67 -0
  193. package/src/commands/completions.ts +61 -0
  194. package/src/commands/config.ts +52 -0
  195. package/src/commands/dry-balance.ts +43 -0
  196. package/src/commands/gallery.ts +61 -0
  197. package/src/commands/gc.ts +47 -0
  198. package/src/commands/grep.ts +49 -0
  199. package/src/commands/grievances.ts +52 -0
  200. package/src/commands/install.ts +107 -0
  201. package/src/commands/join.ts +40 -0
  202. package/src/commands/launch-help.ts +116 -0
  203. package/src/commands/launch.ts +34 -0
  204. package/src/commands/models.ts +61 -0
  205. package/src/commands/plugin.ts +79 -0
  206. package/src/commands/read.ts +39 -0
  207. package/src/commands/say.ts +146 -0
  208. package/src/commands/setup.ts +68 -0
  209. package/src/commands/share.ts +71 -0
  210. package/src/commands/shell.ts +30 -0
  211. package/src/commands/ssh.ts +61 -0
  212. package/src/commands/stats.ts +30 -0
  213. package/src/commands/tiny-models.ts +36 -0
  214. package/src/commands/token.ts +164 -0
  215. package/src/commands/ttsr.ts +125 -0
  216. package/src/commands/update.ts +34 -0
  217. package/src/commands/usage.ts +55 -0
  218. package/src/commands/web-search.ts +43 -0
  219. package/src/commands/worktree.ts +63 -0
  220. package/src/commit/agentic/agent.ts +322 -0
  221. package/src/commit/agentic/fallback.ts +96 -0
  222. package/src/commit/agentic/index.ts +383 -0
  223. package/src/commit/agentic/lock-files.ts +107 -0
  224. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  225. package/src/commit/agentic/prompts/session-user.md +25 -0
  226. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  227. package/src/commit/agentic/prompts/system.md +38 -0
  228. package/src/commit/agentic/state.ts +60 -0
  229. package/src/commit/agentic/tools/analyze-file.ts +148 -0
  230. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  231. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  232. package/src/commit/agentic/tools/git-overview.ts +62 -0
  233. package/src/commit/agentic/tools/index.ts +54 -0
  234. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  235. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  236. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  237. package/src/commit/agentic/tools/schemas.ts +11 -0
  238. package/src/commit/agentic/tools/split-commit.ts +241 -0
  239. package/src/commit/agentic/topo-sort.ts +44 -0
  240. package/src/commit/agentic/trivial.ts +51 -0
  241. package/src/commit/agentic/validation.ts +183 -0
  242. package/src/commit/analysis/conventional.ts +64 -0
  243. package/src/commit/analysis/index.ts +4 -0
  244. package/src/commit/analysis/scope.ts +242 -0
  245. package/src/commit/analysis/summary.ts +107 -0
  246. package/src/commit/analysis/validation.ts +66 -0
  247. package/src/commit/changelog/detect.ts +40 -0
  248. package/src/commit/changelog/generate.ts +101 -0
  249. package/src/commit/changelog/index.ts +234 -0
  250. package/src/commit/changelog/parse.ts +44 -0
  251. package/src/commit/cli.ts +85 -0
  252. package/src/commit/git/diff.ts +148 -0
  253. package/src/commit/index.ts +5 -0
  254. package/src/commit/map-reduce/index.ts +69 -0
  255. package/src/commit/map-reduce/map-phase.ts +193 -0
  256. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  257. package/src/commit/map-reduce/utils.ts +9 -0
  258. package/src/commit/message.ts +11 -0
  259. package/src/commit/model-selection.ts +95 -0
  260. package/src/commit/pipeline.ts +244 -0
  261. package/src/commit/prompts/analysis-system.md +148 -0
  262. package/src/commit/prompts/analysis-user.md +38 -0
  263. package/src/commit/prompts/changelog-system.md +50 -0
  264. package/src/commit/prompts/changelog-user.md +18 -0
  265. package/src/commit/prompts/file-observer-system.md +24 -0
  266. package/src/commit/prompts/file-observer-user.md +8 -0
  267. package/src/commit/prompts/reduce-system.md +50 -0
  268. package/src/commit/prompts/reduce-user.md +17 -0
  269. package/src/commit/prompts/summary-retry.md +3 -0
  270. package/src/commit/prompts/summary-system.md +38 -0
  271. package/src/commit/prompts/summary-user.md +13 -0
  272. package/src/commit/prompts/types-description.md +2 -0
  273. package/src/commit/shared-llm.ts +70 -0
  274. package/src/commit/types.ts +118 -0
  275. package/src/commit/utils/exclusions.ts +42 -0
  276. package/src/commit/utils.ts +58 -0
  277. package/src/config/api-key-resolver.ts +81 -0
  278. package/src/config/append-only-context-mode.ts +76 -0
  279. package/src/config/config-file.ts +347 -0
  280. package/src/config/inline-tool-descriptors-mode.ts +26 -0
  281. package/src/config/keybindings.ts +703 -0
  282. package/src/config/mcp-schema.json +252 -0
  283. package/src/config/model-discovery.ts +1077 -0
  284. package/src/config/model-registry.ts +2822 -0
  285. package/src/config/model-resolver.ts +2115 -0
  286. package/src/config/model-roles.ts +113 -0
  287. package/src/config/models-config-schema-bundle.ts +315 -0
  288. package/src/config/models-config-schema.ts +14 -0
  289. package/src/config/models-config.ts +130 -0
  290. package/src/config/prompt-templates.ts +205 -0
  291. package/src/config/provider-globals.ts +25 -0
  292. package/src/config/resolve-config-value.ts +95 -0
  293. package/src/config/service-tier.ts +146 -0
  294. package/src/config/settings-schema.ts +5887 -0
  295. package/src/config/settings.ts +2394 -0
  296. package/src/config.ts +242 -0
  297. package/src/cursor-bridge-tools.ts +81 -0
  298. package/src/cursor.ts +960 -0
  299. package/src/dap/client.ts +1043 -0
  300. package/src/dap/config.ts +480 -0
  301. package/src/dap/defaults.json +212 -0
  302. package/src/dap/index.ts +4 -0
  303. package/src/dap/session.ts +1841 -0
  304. package/src/dap/types.ts +611 -0
  305. package/src/debug/index.ts +584 -0
  306. package/src/debug/log-formatting.ts +58 -0
  307. package/src/debug/log-viewer.ts +966 -0
  308. package/src/debug/profiler.ts +168 -0
  309. package/src/debug/protocol-probe.ts +267 -0
  310. package/src/debug/raw-sse-buffer.ts +421 -0
  311. package/src/debug/raw-sse.ts +312 -0
  312. package/src/debug/remote-debugger.ts +151 -0
  313. package/src/debug/report-bundle.ts +411 -0
  314. package/src/debug/system-info.ts +111 -0
  315. package/src/debug/terminal-info.ts +124 -0
  316. package/src/discovery/agent-plugin-format.ts +551 -0
  317. package/src/discovery/agent-plugins.ts +341 -0
  318. package/src/discovery/agents-md.ts +67 -0
  319. package/src/discovery/agents.ts +300 -0
  320. package/src/discovery/at-imports.ts +273 -0
  321. package/src/discovery/builtin-defaults.ts +39 -0
  322. package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
  323. package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
  324. package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
  325. package/src/discovery/builtin-rules/go-ioutil.md +37 -0
  326. package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
  327. package/src/discovery/builtin-rules/go-new-expr.md +44 -0
  328. package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
  329. package/src/discovery/builtin-rules/go-range-int.md +45 -0
  330. package/src/discovery/builtin-rules/index.ts +74 -0
  331. package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
  332. package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
  333. package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
  334. package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
  335. package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
  336. package/src/discovery/builtin-rules/rs-result-type.md +20 -0
  337. package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
  338. package/src/discovery/builtin-rules/ts-import-type.md +43 -0
  339. package/src/discovery/builtin-rules/ts-no-any.md +66 -0
  340. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
  341. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
  342. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
  343. package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
  344. package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
  345. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  346. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  347. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
  348. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  349. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  350. package/src/discovery/builtin.ts +945 -0
  351. package/src/discovery/claude-plugins.ts +640 -0
  352. package/src/discovery/claude.ts +591 -0
  353. package/src/discovery/cline.ts +83 -0
  354. package/src/discovery/codex.ts +553 -0
  355. package/src/discovery/contained-path.ts +78 -0
  356. package/src/discovery/cursor.ts +223 -0
  357. package/src/discovery/gemini.ts +386 -0
  358. package/src/discovery/github.ts +337 -0
  359. package/src/discovery/helpers.ts +1183 -0
  360. package/src/discovery/index.ts +82 -0
  361. package/src/discovery/mcp-json.ts +182 -0
  362. package/src/discovery/omp-extension-roots.ts +272 -0
  363. package/src/discovery/omp-plugins.ts +409 -0
  364. package/src/discovery/opencode.ts +441 -0
  365. package/src/discovery/plugin-dir-roots.ts +28 -0
  366. package/src/discovery/ssh.ts +153 -0
  367. package/src/discovery/substitute-plugin-root.ts +77 -0
  368. package/src/discovery/vscode.ts +106 -0
  369. package/src/discovery/windsurf.ts +149 -0
  370. package/src/edit/apply-patch/index.ts +87 -0
  371. package/src/edit/apply-patch/parser.ts +174 -0
  372. package/src/edit/diff.ts +1008 -0
  373. package/src/edit/edit-clipboard.ts +23 -0
  374. package/src/edit/file-snapshot-store.ts +148 -0
  375. package/src/edit/hashline/block-resolver.ts +33 -0
  376. package/src/edit/hashline/diff.ts +402 -0
  377. package/src/edit/hashline/execute.ts +313 -0
  378. package/src/edit/hashline/filesystem.ts +247 -0
  379. package/src/edit/hashline/index.ts +5 -0
  380. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  381. package/src/edit/hashline/params.ts +12 -0
  382. package/src/edit/index.ts +699 -0
  383. package/src/edit/modes/apply-patch.lark +19 -0
  384. package/src/edit/modes/apply-patch.ts +53 -0
  385. package/src/edit/modes/patch.ts +1958 -0
  386. package/src/edit/modes/replace.ts +1191 -0
  387. package/src/edit/normalize.ts +345 -0
  388. package/src/edit/notebook.ts +242 -0
  389. package/src/edit/read-file.ts +25 -0
  390. package/src/edit/renderer.ts +998 -0
  391. package/src/edit/snapshot-details.ts +77 -0
  392. package/src/edit/streaming.ts +710 -0
  393. package/src/eval/agent-bridge.ts +224 -0
  394. package/src/eval/backend-helpers.ts +48 -0
  395. package/src/eval/backend.ts +71 -0
  396. package/src/eval/bridge-timeout.ts +65 -0
  397. package/src/eval/budget-bridge.ts +48 -0
  398. package/src/eval/completion-bridge.ts +212 -0
  399. package/src/eval/concurrency-bridge.ts +34 -0
  400. package/src/eval/executor-base.ts +562 -0
  401. package/src/eval/idle-timeout.ts +91 -0
  402. package/src/eval/index.ts +6 -0
  403. package/src/eval/jl/executor.ts +551 -0
  404. package/src/eval/jl/index.ts +54 -0
  405. package/src/eval/jl/kernel.ts +236 -0
  406. package/src/eval/jl/prelude.jl +736 -0
  407. package/src/eval/jl/prelude.ts +3 -0
  408. package/src/eval/jl/runner.jl +666 -0
  409. package/src/eval/jl/runtime.ts +118 -0
  410. package/src/eval/js/context-manager.ts +872 -0
  411. package/src/eval/js/executor.ts +178 -0
  412. package/src/eval/js/index.ts +41 -0
  413. package/src/eval/js/process-entry.ts +31 -0
  414. package/src/eval/js/shared/helpers.ts +170 -0
  415. package/src/eval/js/shared/indirect-eval.ts +30 -0
  416. package/src/eval/js/shared/local-module-loader.ts +364 -0
  417. package/src/eval/js/shared/prelude.ts +2 -0
  418. package/src/eval/js/shared/prelude.txt +294 -0
  419. package/src/eval/js/shared/rewrite-imports.ts +550 -0
  420. package/src/eval/js/shared/runtime.ts +590 -0
  421. package/src/eval/js/shared/types.ts +18 -0
  422. package/src/eval/js/tool-bridge.ts +163 -0
  423. package/src/eval/js/worker-core.ts +380 -0
  424. package/src/eval/js/worker-entry.ts +37 -0
  425. package/src/eval/js/worker-protocol.ts +47 -0
  426. package/src/eval/kernel-base.ts +569 -0
  427. package/src/eval/py/display.ts +71 -0
  428. package/src/eval/py/executor.ts +643 -0
  429. package/src/eval/py/index.ts +57 -0
  430. package/src/eval/py/kernel.ts +235 -0
  431. package/src/eval/py/prelude.py +673 -0
  432. package/src/eval/py/prelude.ts +3 -0
  433. package/src/eval/py/runner.py +1425 -0
  434. package/src/eval/py/runtime.ts +276 -0
  435. package/src/eval/py/spawn-options.ts +134 -0
  436. package/src/eval/py/tool-bridge.ts +201 -0
  437. package/src/eval/rb/executor.ts +511 -0
  438. package/src/eval/rb/index.ts +54 -0
  439. package/src/eval/rb/kernel.ts +231 -0
  440. package/src/eval/rb/prelude.rb +551 -0
  441. package/src/eval/rb/prelude.ts +3 -0
  442. package/src/eval/rb/runner.rb +581 -0
  443. package/src/eval/rb/runtime.ts +132 -0
  444. package/src/eval/runtime-env.ts +104 -0
  445. package/src/eval/session-id.ts +8 -0
  446. package/src/eval/types.ts +48 -0
  447. package/src/exa/index.ts +2 -0
  448. package/src/exa/mcp-client.ts +370 -0
  449. package/src/exa/types.ts +69 -0
  450. package/src/exec/bash-executor.ts +627 -0
  451. package/src/exec/direnv.ts +145 -0
  452. package/src/exec/exec.ts +53 -0
  453. package/src/exec/non-interactive-env.ts +118 -0
  454. package/src/export/custom-share.ts +65 -0
  455. package/src/export/html/args.ts +20 -0
  456. package/src/export/html/index.ts +320 -0
  457. package/src/export/html/share-loader.js +102 -0
  458. package/src/export/html/template.css +1355 -0
  459. package/src/export/html/template.html +55 -0
  460. package/src/export/html/template.js +1653 -0
  461. package/src/export/html/tool-views.generated.js +35 -0
  462. package/src/export/html/vendor/highlight.min.js +1213 -0
  463. package/src/export/html/vendor/marked.min.js +6 -0
  464. package/src/export/html/web-palette.ts +126 -0
  465. package/src/export/share.ts +686 -0
  466. package/src/export/ttsr.ts +590 -0
  467. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  468. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  469. package/src/extensibility/custom-commands/index.ts +2 -0
  470. package/src/extensibility/custom-commands/loader.ts +242 -0
  471. package/src/extensibility/custom-commands/types.ts +119 -0
  472. package/src/extensibility/custom-tools/index.ts +7 -0
  473. package/src/extensibility/custom-tools/loader.ts +301 -0
  474. package/src/extensibility/custom-tools/types.ts +287 -0
  475. package/src/extensibility/custom-tools/wrapper.ts +50 -0
  476. package/src/extensibility/extensions/compact-handler.ts +40 -0
  477. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  478. package/src/extensibility/extensions/index.ts +16 -0
  479. package/src/extensibility/extensions/load-errors.ts +13 -0
  480. package/src/extensibility/extensions/loader.ts +663 -0
  481. package/src/extensibility/extensions/managed-timers.ts +83 -0
  482. package/src/extensibility/extensions/model-api.ts +39 -0
  483. package/src/extensibility/extensions/runner.ts +1396 -0
  484. package/src/extensibility/extensions/types.ts +1603 -0
  485. package/src/extensibility/extensions/wrapper.ts +395 -0
  486. package/src/extensibility/hooks/index.ts +6 -0
  487. package/src/extensibility/hooks/loader.ts +243 -0
  488. package/src/extensibility/hooks/runner.ts +425 -0
  489. package/src/extensibility/hooks/tool-wrapper.ts +124 -0
  490. package/src/extensibility/hooks/types.ts +612 -0
  491. package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
  492. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
  493. package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
  494. package/src/extensibility/legacy-typebox.ts +101 -0
  495. package/src/extensibility/plugins/bun-git-cache.ts +91 -0
  496. package/src/extensibility/plugins/doctor.ts +65 -0
  497. package/src/extensibility/plugins/git-url.ts +367 -0
  498. package/src/extensibility/plugins/index.ts +9 -0
  499. package/src/extensibility/plugins/installer.ts +201 -0
  500. package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
  501. package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
  502. package/src/extensibility/plugins/loader.ts +535 -0
  503. package/src/extensibility/plugins/manager.ts +1142 -0
  504. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  505. package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
  506. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  507. package/src/extensibility/plugins/marketplace/manager.ts +927 -0
  508. package/src/extensibility/plugins/marketplace/registry.ts +192 -0
  509. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  510. package/src/extensibility/plugins/marketplace/types.ts +192 -0
  511. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  512. package/src/extensibility/plugins/parser.ts +107 -0
  513. package/src/extensibility/plugins/runtime-config.ts +9 -0
  514. package/src/extensibility/plugins/types.ts +194 -0
  515. package/src/extensibility/session-handler-types.ts +21 -0
  516. package/src/extensibility/shared-events.ts +401 -0
  517. package/src/extensibility/skills.ts +531 -0
  518. package/src/extensibility/slash-commands.ts +131 -0
  519. package/src/extensibility/tool-event-input.ts +80 -0
  520. package/src/extensibility/tool-proxy.ts +28 -0
  521. package/src/extensibility/utils.ts +192 -0
  522. package/src/goals/index.ts +3 -0
  523. package/src/goals/runtime.ts +521 -0
  524. package/src/goals/state.ts +37 -0
  525. package/src/goals/tools/goal-tool.ts +251 -0
  526. package/src/hindsight/backend.ts +354 -0
  527. package/src/hindsight/bank.ts +156 -0
  528. package/src/hindsight/client.ts +680 -0
  529. package/src/hindsight/config.ts +193 -0
  530. package/src/hindsight/content.ts +266 -0
  531. package/src/hindsight/index.ts +8 -0
  532. package/src/hindsight/mental-models.ts +429 -0
  533. package/src/hindsight/seeds.json +32 -0
  534. package/src/hindsight/state.ts +530 -0
  535. package/src/hindsight/transcript.ts +71 -0
  536. package/src/index.ts +66 -0
  537. package/src/internal-urls/agent-protocol.ts +180 -0
  538. package/src/internal-urls/artifact-protocol.ts +151 -0
  539. package/src/internal-urls/docs-index.ts +102 -0
  540. package/src/internal-urls/filesystem-resource.ts +34 -0
  541. package/src/internal-urls/history-protocol.ts +198 -0
  542. package/src/internal-urls/index.ts +28 -0
  543. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  544. package/src/internal-urls/json-query.ts +126 -0
  545. package/src/internal-urls/local-protocol.ts +471 -0
  546. package/src/internal-urls/mcp-protocol.ts +168 -0
  547. package/src/internal-urls/memory-protocol.ts +380 -0
  548. package/src/internal-urls/omp-protocol.ts +94 -0
  549. package/src/internal-urls/parse.ts +103 -0
  550. package/src/internal-urls/registry-helpers.ts +132 -0
  551. package/src/internal-urls/router.ts +153 -0
  552. package/src/internal-urls/rule-protocol.ts +45 -0
  553. package/src/internal-urls/security-protocol.ts +261 -0
  554. package/src/internal-urls/skill-protocol.ts +131 -0
  555. package/src/internal-urls/ssh-protocol.ts +368 -0
  556. package/src/internal-urls/types.ts +196 -0
  557. package/src/internal-urls/vault-protocol.ts +940 -0
  558. package/src/internal-urls/xd-protocol.ts +46 -0
  559. package/src/irc/bus.ts +380 -0
  560. package/src/jsonrpc/message-framing.ts +142 -0
  561. package/src/launch/broker.ts +1368 -0
  562. package/src/launch/client.ts +521 -0
  563. package/src/launch/ensure.ts +73 -0
  564. package/src/launch/paths.ts +14 -0
  565. package/src/launch/presence.ts +82 -0
  566. package/src/launch/protocol.ts +448 -0
  567. package/src/launch/spawn-options.ts +17 -0
  568. package/src/launch/terminal-output-worker-client.ts +53 -0
  569. package/src/launch/terminal-output-worker-protocol.ts +11 -0
  570. package/src/launch/terminal-output-worker.ts +23 -0
  571. package/src/launch/terminal-output.ts +46 -0
  572. package/src/lib/xai-http.ts +150 -0
  573. package/src/live/attestation.ts +91 -0
  574. package/src/live/controller.ts +517 -0
  575. package/src/live/prompts/agent-final-message.md +3 -0
  576. package/src/live/prompts/live-instructions.md +23 -0
  577. package/src/live/protocol.ts +233 -0
  578. package/src/live/transport.ts +422 -0
  579. package/src/live/visualizer.ts +221 -0
  580. package/src/live/voices.ts +18 -0
  581. package/src/lsp/client.ts +1465 -0
  582. package/src/lsp/clients/biome-client.ts +263 -0
  583. package/src/lsp/clients/index.ts +50 -0
  584. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  585. package/src/lsp/clients/swiftlint-client.ts +120 -0
  586. package/src/lsp/config.ts +549 -0
  587. package/src/lsp/defaults.json +499 -0
  588. package/src/lsp/deferred-diagnostics.ts +66 -0
  589. package/src/lsp/diagnostics-ledger.ts +51 -0
  590. package/src/lsp/edits.ts +288 -0
  591. package/src/lsp/format-options.ts +119 -0
  592. package/src/lsp/index.ts +2821 -0
  593. package/src/lsp/lspmux.ts +233 -0
  594. package/src/lsp/mux/daemon.ts +348 -0
  595. package/src/lsp/mux/protocol.ts +96 -0
  596. package/src/lsp/mux/server.ts +797 -0
  597. package/src/lsp/render.ts +668 -0
  598. package/src/lsp/startup-events.ts +13 -0
  599. package/src/lsp/types.ts +479 -0
  600. package/src/lsp/utils.ts +747 -0
  601. package/src/main.ts +1799 -0
  602. package/src/markit/NOTICE +32 -0
  603. package/src/markit/converters/docx.ts +56 -0
  604. package/src/markit/converters/epub.ts +136 -0
  605. package/src/markit/converters/pdf/columns.ts +103 -0
  606. package/src/markit/converters/pdf/extract.ts +598 -0
  607. package/src/markit/converters/pdf/grid.ts +780 -0
  608. package/src/markit/converters/pdf/headers.ts +106 -0
  609. package/src/markit/converters/pdf/index.ts +146 -0
  610. package/src/markit/converters/pdf/render.ts +501 -0
  611. package/src/markit/converters/pdf/types.ts +84 -0
  612. package/src/markit/converters/pptx.ts +325 -0
  613. package/src/markit/converters/xlsx.ts +173 -0
  614. package/src/markit/index.ts +2 -0
  615. package/src/markit/registry.ts +59 -0
  616. package/src/markit/types.ts +35 -0
  617. package/src/mcp/client.ts +511 -0
  618. package/src/mcp/config-writer.ts +377 -0
  619. package/src/mcp/config.ts +385 -0
  620. package/src/mcp/index.ts +29 -0
  621. package/src/mcp/json-rpc.ts +122 -0
  622. package/src/mcp/loader.ts +125 -0
  623. package/src/mcp/manager.ts +1524 -0
  624. package/src/mcp/oauth-credentials.ts +104 -0
  625. package/src/mcp/oauth-discovery.ts +587 -0
  626. package/src/mcp/oauth-flow.ts +830 -0
  627. package/src/mcp/render.ts +214 -0
  628. package/src/mcp/request-id.ts +24 -0
  629. package/src/mcp/smithery-auth.ts +108 -0
  630. package/src/mcp/smithery-connect.ts +154 -0
  631. package/src/mcp/smithery-registry.ts +500 -0
  632. package/src/mcp/startup-events.ts +116 -0
  633. package/src/mcp/timeout.ts +59 -0
  634. package/src/mcp/tool-bridge.ts +691 -0
  635. package/src/mcp/tool-cache.ts +117 -0
  636. package/src/mcp/transports/header-policy.ts +95 -0
  637. package/src/mcp/transports/http.ts +508 -0
  638. package/src/mcp/transports/index.ts +7 -0
  639. package/src/mcp/transports/sse.ts +372 -0
  640. package/src/mcp/transports/stdio.ts +905 -0
  641. package/src/mcp/types.ts +467 -0
  642. package/src/memories/index.ts +1434 -0
  643. package/src/memories/storage.ts +578 -0
  644. package/src/memory-backend/index.ts +19 -0
  645. package/src/memory-backend/local-backend.ts +47 -0
  646. package/src/memory-backend/messages.ts +19 -0
  647. package/src/memory-backend/off-backend.ts +25 -0
  648. package/src/memory-backend/resolve.ts +25 -0
  649. package/src/memory-backend/runtime.ts +66 -0
  650. package/src/memory-backend/tool-names.ts +2 -0
  651. package/src/memory-backend/types.ts +166 -0
  652. package/src/mnemopi/backend.ts +629 -0
  653. package/src/mnemopi/config.ts +267 -0
  654. package/src/mnemopi/embed-client.ts +293 -0
  655. package/src/mnemopi/embed-protocol.ts +35 -0
  656. package/src/mnemopi/embed-worker.ts +114 -0
  657. package/src/mnemopi/index.ts +3 -0
  658. package/src/mnemopi/state.ts +940 -0
  659. package/src/modes/acp/acp-agent.ts +2595 -0
  660. package/src/modes/acp/acp-client-bridge.ts +154 -0
  661. package/src/modes/acp/acp-event-mapper.ts +1084 -0
  662. package/src/modes/acp/acp-mode.ts +48 -0
  663. package/src/modes/acp/index.ts +2 -0
  664. package/src/modes/acp/terminal-auth.ts +37 -0
  665. package/src/modes/components/advisor-config.ts +635 -0
  666. package/src/modes/components/advisor-message.ts +109 -0
  667. package/src/modes/components/agent-dashboard.ts +1252 -0
  668. package/src/modes/components/agent-hub-projection.ts +248 -0
  669. package/src/modes/components/agent-hub-renderer.ts +194 -0
  670. package/src/modes/components/agent-hub.ts +1126 -0
  671. package/src/modes/components/agent-transcript-viewer.ts +647 -0
  672. package/src/modes/components/ask-dialog.ts +1017 -0
  673. package/src/modes/components/assistant-message.ts +978 -0
  674. package/src/modes/components/background-tan-message.ts +36 -0
  675. package/src/modes/components/bash-execution.ts +233 -0
  676. package/src/modes/components/bordered-loader.ts +41 -0
  677. package/src/modes/components/btw-panel.ts +161 -0
  678. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  679. package/src/modes/components/chat-block.ts +111 -0
  680. package/src/modes/components/chat-transcript-builder.ts +518 -0
  681. package/src/modes/components/codex-reset-fireworks.ts +369 -0
  682. package/src/modes/components/collab-prompt-message.ts +32 -0
  683. package/src/modes/components/compaction-summary-message.ts +221 -0
  684. package/src/modes/components/copy-selector.ts +218 -0
  685. package/src/modes/components/countdown-timer.ts +75 -0
  686. package/src/modes/components/custom-editor.ts +1036 -0
  687. package/src/modes/components/custom-message.ts +70 -0
  688. package/src/modes/components/diff.ts +254 -0
  689. package/src/modes/components/dynamic-border.ts +37 -0
  690. package/src/modes/components/error-banner.ts +33 -0
  691. package/src/modes/components/eval-execution.ts +169 -0
  692. package/src/modes/components/execution-shared.ts +101 -0
  693. package/src/modes/components/extensions/extension-dashboard.ts +492 -0
  694. package/src/modes/components/extensions/extension-list.ts +507 -0
  695. package/src/modes/components/extensions/index.ts +9 -0
  696. package/src/modes/components/extensions/inspector-panel.ts +326 -0
  697. package/src/modes/components/extensions/state-manager.ts +648 -0
  698. package/src/modes/components/extensions/types.ts +186 -0
  699. package/src/modes/components/footer.ts +274 -0
  700. package/src/modes/components/history-search.ts +268 -0
  701. package/src/modes/components/hook-editor.ts +213 -0
  702. package/src/modes/components/hook-input.ts +87 -0
  703. package/src/modes/components/hook-message.ts +67 -0
  704. package/src/modes/components/hook-selector.ts +691 -0
  705. package/src/modes/components/index.ts +42 -0
  706. package/src/modes/components/keybinding-hints.ts +56 -0
  707. package/src/modes/components/late-diagnostics-message.ts +60 -0
  708. package/src/modes/components/login-dialog.ts +197 -0
  709. package/src/modes/components/logout-account-selector.ts +130 -0
  710. package/src/modes/components/mcp-add-wizard.ts +1413 -0
  711. package/src/modes/components/message-frame.ts +98 -0
  712. package/src/modes/components/model-browser.ts +888 -0
  713. package/src/modes/components/model-hub.ts +2014 -0
  714. package/src/modes/components/model-picker.ts +237 -0
  715. package/src/modes/components/move-overlay.ts +293 -0
  716. package/src/modes/components/oauth-selector.ts +474 -0
  717. package/src/modes/components/omfg-panel.ts +141 -0
  718. package/src/modes/components/overlay-box.ts +109 -0
  719. package/src/modes/components/pause-screen.ts +208 -0
  720. package/src/modes/components/plan-review-overlay.ts +1226 -0
  721. package/src/modes/components/plan-toc.ts +138 -0
  722. package/src/modes/components/plugin-selector.ts +100 -0
  723. package/src/modes/components/plugin-settings.ts +745 -0
  724. package/src/modes/components/queue-mode-selector.ts +61 -0
  725. package/src/modes/components/read-tool-group.ts +856 -0
  726. package/src/modes/components/reset-usage-selector.ts +161 -0
  727. package/src/modes/components/segment-track.ts +89 -0
  728. package/src/modes/components/select-list-mouse-routing.ts +35 -0
  729. package/src/modes/components/selector-helpers.ts +129 -0
  730. package/src/modes/components/session-account-selector.ts +62 -0
  731. package/src/modes/components/session-selector.ts +1035 -0
  732. package/src/modes/components/settings-defs.ts +267 -0
  733. package/src/modes/components/settings-selector.ts +1445 -0
  734. package/src/modes/components/show-images-selector.ts +50 -0
  735. package/src/modes/components/skill-message.ts +110 -0
  736. package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
  737. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  738. package/src/modes/components/status-line/component.ts +1843 -0
  739. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  740. package/src/modes/components/status-line/git-utils.ts +42 -0
  741. package/src/modes/components/status-line/index.ts +5 -0
  742. package/src/modes/components/status-line/presets.ts +106 -0
  743. package/src/modes/components/status-line/segments.ts +710 -0
  744. package/src/modes/components/status-line/separators.ts +55 -0
  745. package/src/modes/components/status-line/types.ts +159 -0
  746. package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
  747. package/src/modes/components/theme-selector.ts +68 -0
  748. package/src/modes/components/thinking-selector.ts +57 -0
  749. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  750. package/src/modes/components/tips.txt +26 -0
  751. package/src/modes/components/todo-reminder.ts +43 -0
  752. package/src/modes/components/tool-execution.ts +1467 -0
  753. package/src/modes/components/transcript-container.ts +527 -0
  754. package/src/modes/components/tree-selector.ts +1006 -0
  755. package/src/modes/components/ttsr-notification.ts +123 -0
  756. package/src/modes/components/usage-row.ts +52 -0
  757. package/src/modes/components/user-message-selector.ts +227 -0
  758. package/src/modes/components/user-message.ts +167 -0
  759. package/src/modes/components/visual-truncate.ts +63 -0
  760. package/src/modes/components/welcome.ts +578 -0
  761. package/src/modes/controllers/btw-controller.ts +246 -0
  762. package/src/modes/controllers/command-controller-shared.ts +109 -0
  763. package/src/modes/controllers/command-controller.ts +2024 -0
  764. package/src/modes/controllers/event-controller.ts +2173 -0
  765. package/src/modes/controllers/extension-ui-controller.ts +1243 -0
  766. package/src/modes/controllers/input-controller.ts +2037 -0
  767. package/src/modes/controllers/live-command-controller.ts +261 -0
  768. package/src/modes/controllers/mcp-command-controller.ts +2552 -0
  769. package/src/modes/controllers/omfg-controller.ts +287 -0
  770. package/src/modes/controllers/omfg-rule.ts +647 -0
  771. package/src/modes/controllers/selector-controller.ts +2058 -0
  772. package/src/modes/controllers/session-focus-controller.ts +117 -0
  773. package/src/modes/controllers/ssh-command-controller.ts +385 -0
  774. package/src/modes/controllers/streaming-reveal.ts +399 -0
  775. package/src/modes/controllers/tan-command-controller.ts +243 -0
  776. package/src/modes/controllers/todo-command-controller.ts +487 -0
  777. package/src/modes/controllers/tool-args-reveal.ts +591 -0
  778. package/src/modes/data/emojis.json +1 -0
  779. package/src/modes/emoji-autocomplete.ts +285 -0
  780. package/src/modes/github-ref-autocomplete.ts +75 -0
  781. package/src/modes/gradient-highlight.ts +99 -0
  782. package/src/modes/image-references.ts +137 -0
  783. package/src/modes/index.ts +10 -0
  784. package/src/modes/interactive-mode.ts +5055 -0
  785. package/src/modes/internal-url-autocomplete.ts +158 -0
  786. package/src/modes/loop-limit.ts +192 -0
  787. package/src/modes/magic-keyword-boundary.ts +23 -0
  788. package/src/modes/magic-keywords.ts +42 -0
  789. package/src/modes/markdown-prose.ts +247 -0
  790. package/src/modes/oauth-manual-input.ts +69 -0
  791. package/src/modes/orchestrate.ts +43 -0
  792. package/src/modes/print-mode.ts +282 -0
  793. package/src/modes/prompt-action-autocomplete.ts +322 -0
  794. package/src/modes/queue-input.ts +132 -0
  795. package/src/modes/rpc/host-tools.ts +204 -0
  796. package/src/modes/rpc/host-uris.ts +241 -0
  797. package/src/modes/rpc/rpc-client.ts +1213 -0
  798. package/src/modes/rpc/rpc-frame.ts +316 -0
  799. package/src/modes/rpc/rpc-input.ts +38 -0
  800. package/src/modes/rpc/rpc-messages.ts +127 -0
  801. package/src/modes/rpc/rpc-mode.ts +1519 -0
  802. package/src/modes/rpc/rpc-subagents.ts +265 -0
  803. package/src/modes/rpc/rpc-types.ts +544 -0
  804. package/src/modes/running-subagent-badge.ts +13 -0
  805. package/src/modes/runtime-init.ts +144 -0
  806. package/src/modes/session-observer-registry.ts +223 -0
  807. package/src/modes/session-teardown.ts +82 -0
  808. package/src/modes/setup-version.ts +11 -0
  809. package/src/modes/setup-wizard/index.ts +103 -0
  810. package/src/modes/setup-wizard/lazy.ts +16 -0
  811. package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
  812. package/src/modes/setup-wizard/scenes/model.ts +132 -0
  813. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  814. package/src/modes/setup-wizard/scenes/providers.ts +105 -0
  815. package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
  816. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  817. package/src/modes/setup-wizard/scenes/theme.ts +330 -0
  818. package/src/modes/setup-wizard/scenes/types.ts +65 -0
  819. package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
  820. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  821. package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
  822. package/src/modes/shared.ts +49 -0
  823. package/src/modes/skill-command.ts +91 -0
  824. package/src/modes/theme/dark.json +95 -0
  825. package/src/modes/theme/defaults/alabaster.json +93 -0
  826. package/src/modes/theme/defaults/amethyst.json +96 -0
  827. package/src/modes/theme/defaults/anthracite.json +93 -0
  828. package/src/modes/theme/defaults/basalt.json +91 -0
  829. package/src/modes/theme/defaults/birch.json +95 -0
  830. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  831. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  832. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  833. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  834. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  835. package/src/modes/theme/defaults/dark-copper.json +95 -0
  836. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  837. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  838. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  839. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  840. package/src/modes/theme/defaults/dark-ember.json +95 -0
  841. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  842. package/src/modes/theme/defaults/dark-forest.json +96 -0
  843. package/src/modes/theme/defaults/dark-github.json +105 -0
  844. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  845. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  846. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  847. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  848. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  849. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  850. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  851. package/src/modes/theme/defaults/dark-nord.json +97 -0
  852. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  853. package/src/modes/theme/defaults/dark-one.json +100 -0
  854. package/src/modes/theme/defaults/dark-poimandres.json +143 -0
  855. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  856. package/src/modes/theme/defaults/dark-reef.json +91 -0
  857. package/src/modes/theme/defaults/dark-retro.json +92 -0
  858. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  859. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  860. package/src/modes/theme/defaults/dark-slate.json +95 -0
  861. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  862. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  863. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  864. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  865. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  866. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  867. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  868. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  869. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  870. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  871. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  872. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  873. package/src/modes/theme/defaults/graphite.json +92 -0
  874. package/src/modes/theme/defaults/index.ts +199 -0
  875. package/src/modes/theme/defaults/light-arctic.json +107 -0
  876. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  877. package/src/modes/theme/defaults/light-canyon.json +91 -0
  878. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  879. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  880. package/src/modes/theme/defaults/light-coral.json +95 -0
  881. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  882. package/src/modes/theme/defaults/light-dawn.json +90 -0
  883. package/src/modes/theme/defaults/light-dunes.json +91 -0
  884. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  885. package/src/modes/theme/defaults/light-forest.json +100 -0
  886. package/src/modes/theme/defaults/light-frost.json +95 -0
  887. package/src/modes/theme/defaults/light-github.json +115 -0
  888. package/src/modes/theme/defaults/light-glacier.json +91 -0
  889. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  890. package/src/modes/theme/defaults/light-haze.json +90 -0
  891. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  892. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  893. package/src/modes/theme/defaults/light-lavender.json +95 -0
  894. package/src/modes/theme/defaults/light-meadow.json +91 -0
  895. package/src/modes/theme/defaults/light-mint.json +95 -0
  896. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  897. package/src/modes/theme/defaults/light-ocean.json +99 -0
  898. package/src/modes/theme/defaults/light-one.json +99 -0
  899. package/src/modes/theme/defaults/light-opal.json +91 -0
  900. package/src/modes/theme/defaults/light-orchard.json +91 -0
  901. package/src/modes/theme/defaults/light-paper.json +95 -0
  902. package/src/modes/theme/defaults/light-poimandres.json +143 -0
  903. package/src/modes/theme/defaults/light-prism.json +90 -0
  904. package/src/modes/theme/defaults/light-retro.json +98 -0
  905. package/src/modes/theme/defaults/light-sand.json +95 -0
  906. package/src/modes/theme/defaults/light-savanna.json +91 -0
  907. package/src/modes/theme/defaults/light-solarized.json +102 -0
  908. package/src/modes/theme/defaults/light-soleil.json +90 -0
  909. package/src/modes/theme/defaults/light-sunset.json +99 -0
  910. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  911. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  912. package/src/modes/theme/defaults/light-wetland.json +91 -0
  913. package/src/modes/theme/defaults/light-zenith.json +89 -0
  914. package/src/modes/theme/defaults/limestone.json +94 -0
  915. package/src/modes/theme/defaults/mahogany.json +97 -0
  916. package/src/modes/theme/defaults/marble.json +93 -0
  917. package/src/modes/theme/defaults/obsidian.json +91 -0
  918. package/src/modes/theme/defaults/onyx.json +91 -0
  919. package/src/modes/theme/defaults/pearl.json +93 -0
  920. package/src/modes/theme/defaults/porcelain.json +91 -0
  921. package/src/modes/theme/defaults/quartz.json +96 -0
  922. package/src/modes/theme/defaults/sandstone.json +95 -0
  923. package/src/modes/theme/defaults/titanium.json +90 -0
  924. package/src/modes/theme/light.json +93 -0
  925. package/src/modes/theme/mermaid-cache.ts +92 -0
  926. package/src/modes/theme/shimmer.ts +305 -0
  927. package/src/modes/theme/theme-schema.json +463 -0
  928. package/src/modes/theme/theme.ts +3171 -0
  929. package/src/modes/turn-budget.ts +31 -0
  930. package/src/modes/types.ts +494 -0
  931. package/src/modes/ultrathink.ts +42 -0
  932. package/src/modes/utils/context-usage.ts +518 -0
  933. package/src/modes/utils/copy-targets.ts +378 -0
  934. package/src/modes/utils/hotkeys-markdown.ts +65 -0
  935. package/src/modes/utils/interactive-context-helpers.ts +31 -0
  936. package/src/modes/utils/keybinding-matchers.ts +86 -0
  937. package/src/modes/utils/tools-markdown.ts +31 -0
  938. package/src/modes/utils/transcript-render-helpers.ts +253 -0
  939. package/src/modes/utils/ui-helpers.ts +976 -0
  940. package/src/modes/warp-events.ts +232 -0
  941. package/src/modes/workflow.ts +55 -0
  942. package/src/plan-mode/approved-plan.ts +194 -0
  943. package/src/plan-mode/model-transition.ts +51 -0
  944. package/src/plan-mode/plan-files.ts +40 -0
  945. package/src/plan-mode/plan-handoff.ts +37 -0
  946. package/src/plan-mode/plan-protection.ts +31 -0
  947. package/src/plan-mode/state.ts +6 -0
  948. package/src/priority.json +60 -0
  949. package/src/prompts/advisor/active-repo-watchdog.md +6 -0
  950. package/src/prompts/advisor/advise-tool.md +3 -0
  951. package/src/prompts/advisor/context-files.md +8 -0
  952. package/src/prompts/advisor/system.md +98 -0
  953. package/src/prompts/agents/designer.md +74 -0
  954. package/src/prompts/agents/frontmatter.md +12 -0
  955. package/src/prompts/agents/init.md +33 -0
  956. package/src/prompts/agents/librarian.md +119 -0
  957. package/src/prompts/agents/reviewer.md +139 -0
  958. package/src/prompts/agents/scout.md +58 -0
  959. package/src/prompts/agents/security-reviewer.md +75 -0
  960. package/src/prompts/agents/task.md +17 -0
  961. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  962. package/src/prompts/bench/cache-prefix.md +3 -0
  963. package/src/prompts/bench/cache-suffix.md +1 -0
  964. package/src/prompts/bench.md +6 -0
  965. package/src/prompts/ci-green-request.md +36 -0
  966. package/src/prompts/dry-balance-bench.md +8 -0
  967. package/src/prompts/goals/goal-budget-limit.md +16 -0
  968. package/src/prompts/goals/goal-continuation.md +28 -0
  969. package/src/prompts/goals/goal-mode-active.md +23 -0
  970. package/src/prompts/goals/goal-mode-context.md +4 -0
  971. package/src/prompts/goals/goal-todo-context.md +12 -0
  972. package/src/prompts/goals/guided-goal-interview.md +43 -0
  973. package/src/prompts/memories/consolidation.md +30 -0
  974. package/src/prompts/memories/consolidation_system.md +4 -0
  975. package/src/prompts/memories/read-path.md +17 -0
  976. package/src/prompts/memories/stage_one_input.md +6 -0
  977. package/src/prompts/memories/stage_one_system.md +21 -0
  978. package/src/prompts/review-custom-request.md +21 -0
  979. package/src/prompts/review-headless-request.md +16 -0
  980. package/src/prompts/review-request.md +68 -0
  981. package/src/prompts/security/scan-coordinator.md +7 -0
  982. package/src/prompts/security/scan-request.md +21 -0
  983. package/src/prompts/security/validate-request.md +8 -0
  984. package/src/prompts/session/launch-completion.md +1 -0
  985. package/src/prompts/skills/autoload.md +8 -0
  986. package/src/prompts/skills/user-invocation.md +11 -0
  987. package/src/prompts/steering/parent-irc.md +5 -0
  988. package/src/prompts/steering/user-interjection.md +6 -0
  989. package/src/prompts/system/active-repo-context.md +4 -0
  990. package/src/prompts/system/agent-creation-architect.md +50 -0
  991. package/src/prompts/system/agent-creation-user.md +6 -0
  992. package/src/prompts/system/auto-continue.md +1 -0
  993. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  994. package/src/prompts/system/auto-thinking-difficulty.md +14 -0
  995. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  996. package/src/prompts/system/autolearn-guidance.md +7 -0
  997. package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
  998. package/src/prompts/system/background-tan-dispatch.md +8 -0
  999. package/src/prompts/system/btw-user.md +8 -0
  1000. package/src/prompts/system/commit-message-system.md +14 -0
  1001. package/src/prompts/system/computer-safety.md +14 -0
  1002. package/src/prompts/system/custom-system-prompt.md +64 -0
  1003. package/src/prompts/system/eager-task.md +7 -0
  1004. package/src/prompts/system/eager-todo.md +18 -0
  1005. package/src/prompts/system/empty-stop-retry.md +4 -0
  1006. package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
  1007. package/src/prompts/system/interrupted-thinking.md +7 -0
  1008. package/src/prompts/system/irc-autoreply.md +6 -0
  1009. package/src/prompts/system/irc-incoming.md +9 -0
  1010. package/src/prompts/system/manual-continue.md +7 -0
  1011. package/src/prompts/system/mcp-xdev-guidance.md +11 -0
  1012. package/src/prompts/system/memory-consolidation-system.md +8 -0
  1013. package/src/prompts/system/memory-extraction-system.md +26 -0
  1014. package/src/prompts/system/mid-run-todo-nudge.md +3 -0
  1015. package/src/prompts/system/omfg-user.md +50 -0
  1016. package/src/prompts/system/orchestrate-notice.md +40 -0
  1017. package/src/prompts/system/personalities/default.md +18 -0
  1018. package/src/prompts/system/personalities/friendly.md +17 -0
  1019. package/src/prompts/system/personalities/pragmatic.md +15 -0
  1020. package/src/prompts/system/plan-mode-active.md +125 -0
  1021. package/src/prompts/system/plan-mode-approved.md +22 -0
  1022. package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
  1023. package/src/prompts/system/plan-mode-reference.md +10 -0
  1024. package/src/prompts/system/plan-mode-subagent.md +33 -0
  1025. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  1026. package/src/prompts/system/plan-yolo-handoff.md +5 -0
  1027. package/src/prompts/system/prewalk-checklist.md +7 -0
  1028. package/src/prompts/system/prewalk-continue.md +1 -0
  1029. package/src/prompts/system/prewalk-plan.md +13 -0
  1030. package/src/prompts/system/project-prompt.md +61 -0
  1031. package/src/prompts/system/recap-user.md +9 -0
  1032. package/src/prompts/system/resolve-device-reminder.md +3 -0
  1033. package/src/prompts/system/rewind-report.md +6 -0
  1034. package/src/prompts/system/side-channel-no-tools.md +3 -0
  1035. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  1036. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  1037. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  1038. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  1039. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  1040. package/src/prompts/system/speech-rewrite.md +15 -0
  1041. package/src/prompts/system/subagent-async-pending.md +6 -0
  1042. package/src/prompts/system/subagent-system-prompt.md +73 -0
  1043. package/src/prompts/system/subagent-user-prompt.md +3 -0
  1044. package/src/prompts/system/subagent-yield-reminder.md +23 -0
  1045. package/src/prompts/system/system-prompt.md +263 -0
  1046. package/src/prompts/system/tan-context-switch.md +17 -0
  1047. package/src/prompts/system/task-label.md +23 -0
  1048. package/src/prompts/system/thinking-loop-redirect.md +10 -0
  1049. package/src/prompts/system/title-marker-instruction.md +1 -0
  1050. package/src/prompts/system/title-system.md +16 -0
  1051. package/src/prompts/system/tool-call-loop-redirect.md +8 -0
  1052. package/src/prompts/system/ttsr-interrupt.md +7 -0
  1053. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  1054. package/src/prompts/system/ultrathink-notice.md +3 -0
  1055. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  1056. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  1057. package/src/prompts/system/vibe-mode-active.md +26 -0
  1058. package/src/prompts/system/web-search.md +25 -0
  1059. package/src/prompts/system/workflow-notice.md +112 -0
  1060. package/src/prompts/system/xdev-mount-notice.md +20 -0
  1061. package/src/prompts/tools/apply-patch.md +65 -0
  1062. package/src/prompts/tools/ask.md +22 -0
  1063. package/src/prompts/tools/ast-edit.md +11 -0
  1064. package/src/prompts/tools/ast-grep.md +19 -0
  1065. package/src/prompts/tools/async-result.md +8 -0
  1066. package/src/prompts/tools/bash.md +23 -0
  1067. package/src/prompts/tools/browser.md +29 -0
  1068. package/src/prompts/tools/checkpoint.md +15 -0
  1069. package/src/prompts/tools/computer.md +26 -0
  1070. package/src/prompts/tools/debug.md +3 -0
  1071. package/src/prompts/tools/eval.md +45 -0
  1072. package/src/prompts/tools/github.md +22 -0
  1073. package/src/prompts/tools/glob.md +16 -0
  1074. package/src/prompts/tools/goal.md +11 -0
  1075. package/src/prompts/tools/grep.md +13 -0
  1076. package/src/prompts/tools/hub.md +34 -0
  1077. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  1078. package/src/prompts/tools/image-attachment-describe.md +10 -0
  1079. package/src/prompts/tools/image-gen.md +7 -0
  1080. package/src/prompts/tools/inspect-image-system.md +20 -0
  1081. package/src/prompts/tools/inspect-image.md +22 -0
  1082. package/src/prompts/tools/learn.md +7 -0
  1083. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  1084. package/src/prompts/tools/lsp.md +19 -0
  1085. package/src/prompts/tools/manage-skill.md +9 -0
  1086. package/src/prompts/tools/memory-edit.md +12 -0
  1087. package/src/prompts/tools/patch.md +57 -0
  1088. package/src/prompts/tools/read.md +27 -0
  1089. package/src/prompts/tools/recall.md +7 -0
  1090. package/src/prompts/tools/reflect.md +5 -0
  1091. package/src/prompts/tools/replace.md +30 -0
  1092. package/src/prompts/tools/retain.md +6 -0
  1093. package/src/prompts/tools/rewind.md +14 -0
  1094. package/src/prompts/tools/security-publish.md +1 -0
  1095. package/src/prompts/tools/security-scan.md +1 -0
  1096. package/src/prompts/tools/task-async-contract.md +1 -0
  1097. package/src/prompts/tools/task-summary.md +20 -0
  1098. package/src/prompts/tools/task.md +83 -0
  1099. package/src/prompts/tools/todo.md +42 -0
  1100. package/src/prompts/tools/vibe-kill.md +3 -0
  1101. package/src/prompts/tools/vibe-list.md +3 -0
  1102. package/src/prompts/tools/vibe-send.md +9 -0
  1103. package/src/prompts/tools/vibe-spawn.md +10 -0
  1104. package/src/prompts/tools/vibe-turn-result.md +19 -0
  1105. package/src/prompts/tools/vibe-wait.md +8 -0
  1106. package/src/prompts/tools/web-search.md +8 -0
  1107. package/src/prompts/tools/write.md +14 -0
  1108. package/src/registry/agent-lifecycle.ts +505 -0
  1109. package/src/registry/agent-registry.ts +287 -0
  1110. package/src/registry/persisted-agents.ts +423 -0
  1111. package/src/sdk.ts +3820 -0
  1112. package/src/secrets/index.ts +375 -0
  1113. package/src/secrets/obfuscator.ts +2629 -0
  1114. package/src/secrets/regex.ts +21 -0
  1115. package/src/security/auth.ts +98 -0
  1116. package/src/security/cloud.ts +686 -0
  1117. package/src/security/comparison.ts +255 -0
  1118. package/src/security/contracts/ids.ts +111 -0
  1119. package/src/security/contracts/index.ts +4 -0
  1120. package/src/security/contracts/schemas.ts +219 -0
  1121. package/src/security/contracts/types.ts +254 -0
  1122. package/src/security/contracts/validation.ts +69 -0
  1123. package/src/security/coordinator.ts +708 -0
  1124. package/src/security/importers/codex-security.ts +387 -0
  1125. package/src/security/importers/index.ts +2 -0
  1126. package/src/security/importers/sarif.ts +357 -0
  1127. package/src/security/index.ts +13 -0
  1128. package/src/security/preflight.ts +405 -0
  1129. package/src/security/provenance.ts +106 -0
  1130. package/src/security/publication.ts +326 -0
  1131. package/src/security/remediation.ts +93 -0
  1132. package/src/security/resource-output.ts +50 -0
  1133. package/src/security/sarif.ts +78 -0
  1134. package/src/security/store.ts +430 -0
  1135. package/src/session/acp-permission-gate.ts +165 -0
  1136. package/src/session/agent-session-events.ts +67 -0
  1137. package/src/session/agent-session-types.ts +407 -0
  1138. package/src/session/agent-session.ts +9000 -0
  1139. package/src/session/agent-storage.ts +807 -0
  1140. package/src/session/artifacts.ts +154 -0
  1141. package/src/session/async-job-delivery.ts +82 -0
  1142. package/src/session/auth-broker-config.ts +92 -0
  1143. package/src/session/auth-storage.ts +25 -0
  1144. package/src/session/bash-runner.ts +326 -0
  1145. package/src/session/blob-store.ts +295 -0
  1146. package/src/session/checkpoint-entries.ts +81 -0
  1147. package/src/session/claude-session-store.ts +426 -0
  1148. package/src/session/client-bridge.ts +85 -0
  1149. package/src/session/codex-auto-reset.ts +673 -0
  1150. package/src/session/codex-session-store.ts +673 -0
  1151. package/src/session/compact-modes.ts +105 -0
  1152. package/src/session/credential-pin.ts +93 -0
  1153. package/src/session/eval-runner.ts +219 -0
  1154. package/src/session/exit-diagnostics.ts +310 -0
  1155. package/src/session/foreign-session-import.ts +52 -0
  1156. package/src/session/foreign-session-jsonl.ts +29 -0
  1157. package/src/session/foreign-session-store.ts +26 -0
  1158. package/src/session/history-storage.ts +329 -0
  1159. package/src/session/indexed-session-storage.ts +553 -0
  1160. package/src/session/irc-bridge.ts +203 -0
  1161. package/src/session/launch-completion.ts +37 -0
  1162. package/src/session/messages.ts +1304 -0
  1163. package/src/session/model-controls.ts +757 -0
  1164. package/src/session/prewalk.ts +279 -0
  1165. package/src/session/provider-image-budget.ts +86 -0
  1166. package/src/session/queued-messages.ts +99 -0
  1167. package/src/session/redis-session-storage.ts +257 -0
  1168. package/src/session/retry-fallback-chains.ts +455 -0
  1169. package/src/session/role-models.ts +85 -0
  1170. package/src/session/session-advisors.ts +1896 -0
  1171. package/src/session/session-context.ts +584 -0
  1172. package/src/session/session-dump-format.ts +216 -0
  1173. package/src/session/session-entries.ts +306 -0
  1174. package/src/session/session-handoff.ts +325 -0
  1175. package/src/session/session-history-format.ts +459 -0
  1176. package/src/session/session-listing.ts +715 -0
  1177. package/src/session/session-loader.ts +362 -0
  1178. package/src/session/session-maintenance.ts +3115 -0
  1179. package/src/session/session-manager.ts +2747 -0
  1180. package/src/session/session-memory.ts +222 -0
  1181. package/src/session/session-metadata.ts +53 -0
  1182. package/src/session/session-migrations.ts +78 -0
  1183. package/src/session/session-paths.ts +280 -0
  1184. package/src/session/session-persistence.ts +293 -0
  1185. package/src/session/session-provider-boundary.ts +306 -0
  1186. package/src/session/session-stats.ts +349 -0
  1187. package/src/session/session-storage.ts +774 -0
  1188. package/src/session/session-title-slot.ts +141 -0
  1189. package/src/session/session-tools.ts +1385 -0
  1190. package/src/session/session-workspace.ts +53 -0
  1191. package/src/session/settings-stream-fn.ts +79 -0
  1192. package/src/session/shake-types.ts +43 -0
  1193. package/src/session/snapcompact-inline.ts +545 -0
  1194. package/src/session/snapcompact-savings-journal.ts +113 -0
  1195. package/src/session/sql-session-storage.ts +374 -0
  1196. package/src/session/stream-guards.ts +417 -0
  1197. package/src/session/streaming-output.ts +1459 -0
  1198. package/src/session/todo-tracker.ts +380 -0
  1199. package/src/session/tool-choice-queue.ts +305 -0
  1200. package/src/session/ttsr-coordinator.ts +496 -0
  1201. package/src/session/turn-persistence.ts +142 -0
  1202. package/src/session/turn-recovery.ts +2005 -0
  1203. package/src/session/unexpected-stop-classifier.ts +141 -0
  1204. package/src/session/yield-queue.ts +288 -0
  1205. package/src/slash-commands/acp-builtins.ts +70 -0
  1206. package/src/slash-commands/available-commands.ts +105 -0
  1207. package/src/slash-commands/builtin-registry.ts +3149 -0
  1208. package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
  1209. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  1210. package/src/slash-commands/helpers/context-report.ts +66 -0
  1211. package/src/slash-commands/helpers/format.ts +46 -0
  1212. package/src/slash-commands/helpers/logout.ts +108 -0
  1213. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  1214. package/src/slash-commands/helpers/mcp.ts +533 -0
  1215. package/src/slash-commands/helpers/parse.ts +85 -0
  1216. package/src/slash-commands/helpers/reset-usage.ts +68 -0
  1217. package/src/slash-commands/helpers/security.ts +451 -0
  1218. package/src/slash-commands/helpers/session-pin.ts +44 -0
  1219. package/src/slash-commands/helpers/ssh.ts +196 -0
  1220. package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
  1221. package/src/slash-commands/helpers/todo.ts +285 -0
  1222. package/src/slash-commands/helpers/usage-report.ts +198 -0
  1223. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  1224. package/src/slash-commands/types.ts +139 -0
  1225. package/src/ssh/config-writer.ts +183 -0
  1226. package/src/ssh/connection-manager.ts +667 -0
  1227. package/src/ssh/file-transfer.ts +214 -0
  1228. package/src/ssh/sshfs-mount.ts +163 -0
  1229. package/src/ssh/utils.ts +51 -0
  1230. package/src/startup-splash.ts +19 -0
  1231. package/src/stt/asr-client.ts +401 -0
  1232. package/src/stt/asr-protocol.ts +65 -0
  1233. package/src/stt/asr-worker.ts +603 -0
  1234. package/src/stt/downloader.ts +142 -0
  1235. package/src/stt/endpointer.ts +259 -0
  1236. package/src/stt/index.ts +6 -0
  1237. package/src/stt/models.ts +150 -0
  1238. package/src/stt/sherpa-runtime.ts +71 -0
  1239. package/src/stt/stt-controller.ts +320 -0
  1240. package/src/stt/submit-trigger.ts +74 -0
  1241. package/src/subprocess/worker-client.ts +463 -0
  1242. package/src/subprocess/worker-runtime.ts +494 -0
  1243. package/src/system-prompt.ts +921 -0
  1244. package/src/task/agents.ts +170 -0
  1245. package/src/task/commands.ts +132 -0
  1246. package/src/task/discovery.ts +145 -0
  1247. package/src/task/executor.ts +3431 -0
  1248. package/src/task/index.ts +1515 -0
  1249. package/src/task/isolation-ownership.ts +106 -0
  1250. package/src/task/isolation-runner.ts +444 -0
  1251. package/src/task/label.ts +40 -0
  1252. package/src/task/name-generator.ts +1577 -0
  1253. package/src/task/omp-command.ts +26 -0
  1254. package/src/task/output-manager.ts +115 -0
  1255. package/src/task/parallel.ts +221 -0
  1256. package/src/task/persisted-revive.ts +173 -0
  1257. package/src/task/prewalk.ts +6 -0
  1258. package/src/task/prompt-policy.ts +8 -0
  1259. package/src/task/provider-concurrency.ts +100 -0
  1260. package/src/task/read-only-policy.ts +27 -0
  1261. package/src/task/render.ts +1830 -0
  1262. package/src/task/renderer.ts +14 -0
  1263. package/src/task/repair-args.ts +118 -0
  1264. package/src/task/spawn-policy.ts +72 -0
  1265. package/src/task/structured-subagent.ts +676 -0
  1266. package/src/task/subprocess-tool-registry.ts +88 -0
  1267. package/src/task/types.ts +555 -0
  1268. package/src/task/worktree.ts +967 -0
  1269. package/src/task/yield-assembly.ts +198 -0
  1270. package/src/telemetry-export.ts +504 -0
  1271. package/src/thinking.ts +377 -0
  1272. package/src/tiny/device.ts +111 -0
  1273. package/src/tiny/dtype.ts +101 -0
  1274. package/src/tiny/message-preproc.ts +155 -0
  1275. package/src/tiny/models.ts +268 -0
  1276. package/src/tiny/text.ts +290 -0
  1277. package/src/tiny/title-client.ts +460 -0
  1278. package/src/tiny/title-protocol.ts +56 -0
  1279. package/src/tiny/worker.ts +354 -0
  1280. package/src/tools/acp-bridge.ts +125 -0
  1281. package/src/tools/approval.ts +245 -0
  1282. package/src/tools/ask.ts +1459 -0
  1283. package/src/tools/ast-edit.ts +718 -0
  1284. package/src/tools/ast-grep.ts +526 -0
  1285. package/src/tools/auto-generated-guard.ts +335 -0
  1286. package/src/tools/bash-interactive.ts +435 -0
  1287. package/src/tools/bash-interceptor.ts +148 -0
  1288. package/src/tools/bash-pty-selection.ts +14 -0
  1289. package/src/tools/bash-skill-urls.ts +350 -0
  1290. package/src/tools/bash.ts +1826 -0
  1291. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  1292. package/src/tools/browser/aria/aria-snapshot.ts +131 -0
  1293. package/src/tools/browser/attach.ts +219 -0
  1294. package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
  1295. package/src/tools/browser/cmux/rpc.ts +200 -0
  1296. package/src/tools/browser/cmux/socket-client.ts +445 -0
  1297. package/src/tools/browser/launch.ts +939 -0
  1298. package/src/tools/browser/readable.ts +112 -0
  1299. package/src/tools/browser/registry.ts +447 -0
  1300. package/src/tools/browser/relay/bridge.ts +945 -0
  1301. package/src/tools/browser/relay/daemon.ts +117 -0
  1302. package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
  1303. package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
  1304. package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
  1305. package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
  1306. package/src/tools/browser/relay/kind.ts +41 -0
  1307. package/src/tools/browser/relay/protocol.ts +54 -0
  1308. package/src/tools/browser/relay/server.ts +141 -0
  1309. package/src/tools/browser/render.ts +229 -0
  1310. package/src/tools/browser/run-output.ts +76 -0
  1311. package/src/tools/browser/shared-daemon.ts +139 -0
  1312. package/src/tools/browser/tab-protocol.ts +123 -0
  1313. package/src/tools/browser/tab-supervisor.ts +1077 -0
  1314. package/src/tools/browser/tab-worker-entry.ts +29 -0
  1315. package/src/tools/browser/tab-worker.ts +1982 -0
  1316. package/src/tools/browser.ts +487 -0
  1317. package/src/tools/builtin-names.ts +67 -0
  1318. package/src/tools/checkpoint.ts +137 -0
  1319. package/src/tools/computer/exposure.ts +14 -0
  1320. package/src/tools/computer/protocol.ts +69 -0
  1321. package/src/tools/computer/supervisor.ts +409 -0
  1322. package/src/tools/computer/worker-entry.ts +39 -0
  1323. package/src/tools/computer/worker.ts +745 -0
  1324. package/src/tools/computer-renderer.ts +147 -0
  1325. package/src/tools/computer.ts +222 -0
  1326. package/src/tools/conflict-detect.ts +815 -0
  1327. package/src/tools/context.ts +49 -0
  1328. package/src/tools/debug.ts +1121 -0
  1329. package/src/tools/default-renderer.ts +154 -0
  1330. package/src/tools/essential-tools.ts +46 -0
  1331. package/src/tools/eval-backends.ts +34 -0
  1332. package/src/tools/eval-format/index.ts +24 -0
  1333. package/src/tools/eval-format/javascript.ts +952 -0
  1334. package/src/tools/eval-format/julia.ts +446 -0
  1335. package/src/tools/eval-format/python.ts +544 -0
  1336. package/src/tools/eval-format/ruby.ts +380 -0
  1337. package/src/tools/eval-render.ts +784 -0
  1338. package/src/tools/eval.ts +774 -0
  1339. package/src/tools/fetch.ts +1889 -0
  1340. package/src/tools/file-recorder.ts +35 -0
  1341. package/src/tools/fs-cache-invalidation.ts +28 -0
  1342. package/src/tools/gh-cache-invalidation.ts +175 -0
  1343. package/src/tools/gh-format.ts +12 -0
  1344. package/src/tools/gh-renderer.ts +484 -0
  1345. package/src/tools/gh.ts +3958 -0
  1346. package/src/tools/github-cache.ts +663 -0
  1347. package/src/tools/glob.ts +691 -0
  1348. package/src/tools/grep.ts +1920 -0
  1349. package/src/tools/grouped-file-output.ts +210 -0
  1350. package/src/tools/hub/index.ts +579 -0
  1351. package/src/tools/hub/jobs.ts +714 -0
  1352. package/src/tools/hub/launch.ts +690 -0
  1353. package/src/tools/hub/messaging.ts +735 -0
  1354. package/src/tools/hub/types.ts +117 -0
  1355. package/src/tools/image-gen.ts +1689 -0
  1356. package/src/tools/image-providers.ts +50 -0
  1357. package/src/tools/index.ts +736 -0
  1358. package/src/tools/inspect-image-renderer.ts +133 -0
  1359. package/src/tools/inspect-image.ts +316 -0
  1360. package/src/tools/json-tree.ts +260 -0
  1361. package/src/tools/jtd-to-json-schema.ts +219 -0
  1362. package/src/tools/jtd-to-typescript.ts +136 -0
  1363. package/src/tools/jtd-utils.ts +102 -0
  1364. package/src/tools/learn.ts +141 -0
  1365. package/src/tools/list-limit.ts +40 -0
  1366. package/src/tools/manage-skill.ts +102 -0
  1367. package/src/tools/match-line-format.ts +20 -0
  1368. package/src/tools/memory-edit.ts +61 -0
  1369. package/src/tools/memory-recall.ts +102 -0
  1370. package/src/tools/memory-reflect.ts +88 -0
  1371. package/src/tools/memory-render.ts +211 -0
  1372. package/src/tools/memory-retain.ts +89 -0
  1373. package/src/tools/output-meta.ts +860 -0
  1374. package/src/tools/output-schema-validator.ts +307 -0
  1375. package/src/tools/path-utils.ts +1489 -0
  1376. package/src/tools/plan-mode-guard.ts +155 -0
  1377. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  1378. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  1379. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  1380. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  1381. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  1382. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  1383. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  1384. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  1385. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  1386. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  1387. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  1388. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  1389. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  1390. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  1391. package/src/tools/read.ts +3762 -0
  1392. package/src/tools/render-utils.ts +926 -0
  1393. package/src/tools/renderers.ts +133 -0
  1394. package/src/tools/report-tool-issue.ts +568 -0
  1395. package/src/tools/resolve.ts +423 -0
  1396. package/src/tools/review.ts +103 -0
  1397. package/src/tools/run-scope.ts +417 -0
  1398. package/src/tools/security-scan.ts +287 -0
  1399. package/src/tools/shell-tokenize.ts +213 -0
  1400. package/src/tools/sqlite-reader.ts +884 -0
  1401. package/src/tools/terminal-output.ts +141 -0
  1402. package/src/tools/todo.ts +1226 -0
  1403. package/src/tools/tool-errors.ts +62 -0
  1404. package/src/tools/tool-result.ts +102 -0
  1405. package/src/tools/tool-timeouts.ts +38 -0
  1406. package/src/tools/tts.ts +266 -0
  1407. package/src/tools/vibe.ts +608 -0
  1408. package/src/tools/write.ts +1646 -0
  1409. package/src/tools/xdev.ts +560 -0
  1410. package/src/tools/yield.ts +486 -0
  1411. package/src/tts/downloader.ts +64 -0
  1412. package/src/tts/index.ts +10 -0
  1413. package/src/tts/models.ts +137 -0
  1414. package/src/tts/runtime.ts +21 -0
  1415. package/src/tts/speakable.ts +392 -0
  1416. package/src/tts/speech-enhancer.ts +206 -0
  1417. package/src/tts/streaming-player.ts +120 -0
  1418. package/src/tts/tts-client.ts +475 -0
  1419. package/src/tts/tts-protocol.ts +69 -0
  1420. package/src/tts/tts-worker.ts +434 -0
  1421. package/src/tts/vocalizer.ts +419 -0
  1422. package/src/tts/wav.ts +58 -0
  1423. package/src/tui/code-cell.ts +268 -0
  1424. package/src/tui/file-list.ts +55 -0
  1425. package/src/tui/hyperlink.ts +178 -0
  1426. package/src/tui/index.ts +13 -0
  1427. package/src/tui/output-block.ts +268 -0
  1428. package/src/tui/status-line.ts +54 -0
  1429. package/src/tui/tree-list.ts +172 -0
  1430. package/src/tui/types.ts +15 -0
  1431. package/src/tui/utils.ts +103 -0
  1432. package/src/tui/width-aware-text.ts +58 -0
  1433. package/src/utils/active-repo-context.ts +143 -0
  1434. package/src/utils/block-context.ts +312 -0
  1435. package/src/utils/changelog.ts +373 -0
  1436. package/src/utils/clipboard.ts +361 -0
  1437. package/src/utils/command-args.ts +74 -0
  1438. package/src/utils/commit-message-generator.ts +148 -0
  1439. package/src/utils/cpuprofile.ts +235 -0
  1440. package/src/utils/edit-mode.ts +61 -0
  1441. package/src/utils/enhanced-paste.ts +230 -0
  1442. package/src/utils/event-bus.ts +33 -0
  1443. package/src/utils/external-editor.ts +80 -0
  1444. package/src/utils/fetch-timeout.ts +10 -0
  1445. package/src/utils/file-display-mode.ts +44 -0
  1446. package/src/utils/file-mentions.ts +293 -0
  1447. package/src/utils/git.ts +2472 -0
  1448. package/src/utils/image-loading.ts +236 -0
  1449. package/src/utils/image-resize.ts +420 -0
  1450. package/src/utils/image-vision-fallback.ts +196 -0
  1451. package/src/utils/inspect-image-mode.ts +39 -0
  1452. package/src/utils/ipc.ts +38 -0
  1453. package/src/utils/jj.ts +422 -0
  1454. package/src/utils/lang-from-path.ts +251 -0
  1455. package/src/utils/late-cleanup.ts +17 -0
  1456. package/src/utils/local-date.ts +7 -0
  1457. package/src/utils/mac-file-urls.applescript +37 -0
  1458. package/src/utils/markit-cache.ts +166 -0
  1459. package/src/utils/markit.ts +223 -0
  1460. package/src/utils/mupdf-wasm-embed.ts +12 -0
  1461. package/src/utils/open.ts +126 -0
  1462. package/src/utils/profile-tree.ts +111 -0
  1463. package/src/utils/prompt-path.ts +3 -0
  1464. package/src/utils/qrcode.ts +535 -0
  1465. package/src/utils/sample-profile.ts +437 -0
  1466. package/src/utils/session-color.ts +142 -0
  1467. package/src/utils/shell-snapshot-fn-env.sh +63 -0
  1468. package/src/utils/shell-snapshot.ts +326 -0
  1469. package/src/utils/sixel.ts +69 -0
  1470. package/src/utils/thinking-display.ts +163 -0
  1471. package/src/utils/title-generator.ts +597 -0
  1472. package/src/utils/token-rate.ts +72 -0
  1473. package/src/utils/tool-choice.ts +50 -0
  1474. package/src/utils/tools-manager.ts +411 -0
  1475. package/src/utils/turndown.ts +82 -0
  1476. package/src/utils/zip.ts +1106 -0
  1477. package/src/vibe/runtime.ts +1684 -0
  1478. package/src/vibe/state.ts +4 -0
  1479. package/src/web/kagi.ts +305 -0
  1480. package/src/web/parallel.ts +354 -0
  1481. package/src/web/scrapers/artifacthub.ts +207 -0
  1482. package/src/web/scrapers/arxiv.ts +83 -0
  1483. package/src/web/scrapers/aur.ts +162 -0
  1484. package/src/web/scrapers/biorxiv.ts +133 -0
  1485. package/src/web/scrapers/bluesky.ts +262 -0
  1486. package/src/web/scrapers/brew.ts +172 -0
  1487. package/src/web/scrapers/cheatsh.ts +68 -0
  1488. package/src/web/scrapers/chocolatey.ts +196 -0
  1489. package/src/web/scrapers/choosealicense.ts +95 -0
  1490. package/src/web/scrapers/cisa-kev.ts +87 -0
  1491. package/src/web/scrapers/clojars.ts +154 -0
  1492. package/src/web/scrapers/coingecko.ts +177 -0
  1493. package/src/web/scrapers/crates-io.ts +97 -0
  1494. package/src/web/scrapers/crossref.ts +136 -0
  1495. package/src/web/scrapers/devto.ts +147 -0
  1496. package/src/web/scrapers/discogs.ts +306 -0
  1497. package/src/web/scrapers/discourse.ts +197 -0
  1498. package/src/web/scrapers/dockerhub.ts +138 -0
  1499. package/src/web/scrapers/docs-rs.ts +663 -0
  1500. package/src/web/scrapers/fdroid.ts +134 -0
  1501. package/src/web/scrapers/firefox-addons.ts +191 -0
  1502. package/src/web/scrapers/flathub.ts +223 -0
  1503. package/src/web/scrapers/github-gist.ts +58 -0
  1504. package/src/web/scrapers/github.ts +800 -0
  1505. package/src/web/scrapers/gitlab.ts +401 -0
  1506. package/src/web/scrapers/go-pkg.ts +266 -0
  1507. package/src/web/scrapers/hackage.ts +129 -0
  1508. package/src/web/scrapers/hackernews.ts +189 -0
  1509. package/src/web/scrapers/hex.ts +105 -0
  1510. package/src/web/scrapers/huggingface.ts +321 -0
  1511. package/src/web/scrapers/iacr.ts +89 -0
  1512. package/src/web/scrapers/index.ts +252 -0
  1513. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1514. package/src/web/scrapers/lemmy.ts +203 -0
  1515. package/src/web/scrapers/lobsters.ts +175 -0
  1516. package/src/web/scrapers/mastodon.ts +292 -0
  1517. package/src/web/scrapers/maven.ts +138 -0
  1518. package/src/web/scrapers/mdn.ts +173 -0
  1519. package/src/web/scrapers/metacpan.ts +222 -0
  1520. package/src/web/scrapers/musicbrainz.ts +250 -0
  1521. package/src/web/scrapers/npm.ts +98 -0
  1522. package/src/web/scrapers/nuget.ts +183 -0
  1523. package/src/web/scrapers/nvd.ts +222 -0
  1524. package/src/web/scrapers/ollama.ts +239 -0
  1525. package/src/web/scrapers/open-vsx.ts +106 -0
  1526. package/src/web/scrapers/opencorporates.ts +292 -0
  1527. package/src/web/scrapers/openlibrary.ts +336 -0
  1528. package/src/web/scrapers/orcid.ts +286 -0
  1529. package/src/web/scrapers/osv.ts +176 -0
  1530. package/src/web/scrapers/packagist.ts +160 -0
  1531. package/src/web/scrapers/pub-dev.ts +143 -0
  1532. package/src/web/scrapers/pubmed.ts +211 -0
  1533. package/src/web/scrapers/pypi.ts +112 -0
  1534. package/src/web/scrapers/rawg.ts +110 -0
  1535. package/src/web/scrapers/readthedocs.ts +121 -0
  1536. package/src/web/scrapers/reddit.ts +95 -0
  1537. package/src/web/scrapers/repology.ts +251 -0
  1538. package/src/web/scrapers/rfc.ts +201 -0
  1539. package/src/web/scrapers/rubygems.ts +103 -0
  1540. package/src/web/scrapers/searchcode.ts +189 -0
  1541. package/src/web/scrapers/sec-edgar.ts +261 -0
  1542. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1543. package/src/web/scrapers/snapcraft.ts +187 -0
  1544. package/src/web/scrapers/sourcegraph.ts +336 -0
  1545. package/src/web/scrapers/spdx.ts +108 -0
  1546. package/src/web/scrapers/spotify.ts +198 -0
  1547. package/src/web/scrapers/stackoverflow.ts +120 -0
  1548. package/src/web/scrapers/terraform.ts +277 -0
  1549. package/src/web/scrapers/tldr.ts +47 -0
  1550. package/src/web/scrapers/twitter.ts +94 -0
  1551. package/src/web/scrapers/types.ts +354 -0
  1552. package/src/web/scrapers/utils.ts +109 -0
  1553. package/src/web/scrapers/vimeo.ts +133 -0
  1554. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  1555. package/src/web/scrapers/w3c.ts +156 -0
  1556. package/src/web/scrapers/wikidata.ts +344 -0
  1557. package/src/web/scrapers/wikipedia.ts +84 -0
  1558. package/src/web/scrapers/youtube.ts +325 -0
  1559. package/src/web/search/index.ts +393 -0
  1560. package/src/web/search/provider.ts +272 -0
  1561. package/src/web/search/providers/anthropic.ts +406 -0
  1562. package/src/web/search/providers/base.ts +112 -0
  1563. package/src/web/search/providers/brave.ts +181 -0
  1564. package/src/web/search/providers/browser-headers.ts +82 -0
  1565. package/src/web/search/providers/browser-page.ts +125 -0
  1566. package/src/web/search/providers/codex.ts +788 -0
  1567. package/src/web/search/providers/duckduckgo.ts +382 -0
  1568. package/src/web/search/providers/ecosia.ts +183 -0
  1569. package/src/web/search/providers/exa.ts +513 -0
  1570. package/src/web/search/providers/firecrawl.ts +213 -0
  1571. package/src/web/search/providers/gemini.ts +634 -0
  1572. package/src/web/search/providers/google.ts +195 -0
  1573. package/src/web/search/providers/jina.ts +144 -0
  1574. package/src/web/search/providers/kagi.ts +98 -0
  1575. package/src/web/search/providers/kimi.ts +221 -0
  1576. package/src/web/search/providers/mojeek.ts +220 -0
  1577. package/src/web/search/providers/parallel.ts +186 -0
  1578. package/src/web/search/providers/perplexity-auth.ts +142 -0
  1579. package/src/web/search/providers/perplexity.ts +997 -0
  1580. package/src/web/search/providers/public.ts +199 -0
  1581. package/src/web/search/providers/searxng.ts +467 -0
  1582. package/src/web/search/providers/startpage.ts +225 -0
  1583. package/src/web/search/providers/synthetic.ts +126 -0
  1584. package/src/web/search/providers/tavily.ts +244 -0
  1585. package/src/web/search/providers/tinyfish.ts +166 -0
  1586. package/src/web/search/providers/utils.ts +130 -0
  1587. package/src/web/search/providers/xai.ts +372 -0
  1588. package/src/web/search/providers/zai.ts +452 -0
  1589. package/src/web/search/query.ts +850 -0
  1590. package/src/web/search/render.ts +262 -0
  1591. package/src/web/search/types.ts +518 -0
  1592. package/src/web/search/utils.ts +17 -0
  1593. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,1304 @@
1
+ /**
2
+ * Custom message types and transformers for the coding agent.
3
+ *
4
+ * Extends the base AgentMessage type with coding-agent specific message types,
5
+ * and provides a transformer to convert them to LLM-compatible messages.
6
+ */
7
+ import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
8
+ import {
9
+ invalidateMessageCache,
10
+ registerMessageCacheInvalidator,
11
+ } from "@oh-my-pi/pi-agent-core/compaction/message-cache";
12
+ import {
13
+ type BranchSummaryMessage,
14
+ type CompactionSummaryMessage,
15
+ convertMessageToLlm,
16
+ } from "@oh-my-pi/pi-agent-core/compaction/messages";
17
+ import type {
18
+ AssistantMessage,
19
+ ImageContent,
20
+ Message,
21
+ MessageAttribution,
22
+ TextContent,
23
+ UserMessage,
24
+ } from "@oh-my-pi/pi-ai";
25
+ import * as AIError from "@oh-my-pi/pi-ai/error";
26
+ import { isRecord, logger, prompt } from "@oh-my-pi/pi-utils";
27
+ import { COLLAB_PROMPT_MESSAGE_TYPE } from "@oh-my-pi/pi-wire";
28
+ import userInterjectionTemplate from "../prompts/steering/user-interjection.md" with { type: "text" };
29
+ import { formatTitleConversationContext, type TitleConversationTurn } from "../tiny/message-preproc";
30
+
31
+ export {
32
+ type BranchSummaryMessage,
33
+ type CompactionSummaryMessage,
34
+ createBranchSummaryMessage,
35
+ createCompactionSummaryMessage,
36
+ createCustomMessage,
37
+ } from "@oh-my-pi/pi-agent-core/compaction/messages";
38
+
39
+ import type { OutputMeta } from "../tools/output-meta";
40
+ import { formatOutputNotice } from "../tools/output-meta";
41
+
42
+ export const SKILL_PROMPT_MESSAGE_TYPE = "skill-prompt";
43
+ export const LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE = "lsp-late-diagnostic";
44
+ export const BACKGROUND_TAN_DISPATCH_MESSAGE_TYPE = "background-tan-dispatch";
45
+
46
+ /**
47
+ * Logs provider-error turns so their actual cause is available outside the
48
+ * session transcript. No-op for non-error stop reasons.
49
+ */
50
+ export function logProviderTurnError(msg: AssistantMessage): void {
51
+ if (msg.stopReason !== "error") return;
52
+ logger.warn("agent turn ended with provider error", {
53
+ provider: msg.provider,
54
+ model: msg.model,
55
+ errorMessage: msg.errorMessage,
56
+ errorStatus: msg.errorStatus,
57
+ errorId: msg.errorId,
58
+ });
59
+ }
60
+
61
+ const EPHEMERAL_REPLY_MAX_BYTES = 4096;
62
+ const REPLAN_TITLE_CONTEXT_TURN_LIMIT = 6;
63
+
64
+ /**
65
+ * Removes replay-bound provider state before reparenting an assistant message
66
+ * under a different user turn.
67
+ */
68
+ export function sanitizeAssistantForReparentedHistory(message: AssistantMessage): AssistantMessage {
69
+ const content: AssistantMessage["content"] = [];
70
+ for (const block of message.content) {
71
+ if (block.type === "redactedThinking" || block.type === "anthropicServerTool") continue;
72
+ if (block.type === "thinking") {
73
+ content.push({ type: "thinking", thinking: block.thinking });
74
+ continue;
75
+ }
76
+ content.push(block);
77
+ }
78
+ return { ...message, content, providerPayload: undefined };
79
+ }
80
+
81
+ /**
82
+ * Collapses degenerate repeated lines and bounds an ephemeral side-channel
83
+ * reply to 4 KiB.
84
+ */
85
+ export function dedupeEphemeralReply(text: string): string {
86
+ if (!text) return text;
87
+ const lines = text.split("\n");
88
+ const out: string[] = [];
89
+ let i = 0;
90
+ while (i < lines.length) {
91
+ let j = i + 1;
92
+ while (j < lines.length && lines[j] === lines[i]) j++;
93
+ const runLen = j - i;
94
+ if (runLen > 3) {
95
+ out.push(lines[i], `[…${runLen}×]`);
96
+ } else {
97
+ for (let k = 0; k < runLen; k++) out.push(lines[i]);
98
+ }
99
+ i = j;
100
+ }
101
+ let result = out.join("\n");
102
+ if (Buffer.byteLength(result, "utf8") > EPHEMERAL_REPLY_MAX_BYTES) {
103
+ const suffix = "\n[…truncated]";
104
+ const budget = EPHEMERAL_REPLY_MAX_BYTES - Buffer.byteLength(suffix, "utf8");
105
+ while (Buffer.byteLength(result, "utf8") > budget) {
106
+ result = result.slice(0, -1);
107
+ }
108
+ result += suffix;
109
+ }
110
+ return result;
111
+ }
112
+
113
+ /** Builds the recent user/assistant context supplied to title regeneration. */
114
+ export function buildReplanTitleContext(messages: AgentMessage[]): string {
115
+ const turns: TitleConversationTurn[] = [];
116
+ for (let i = messages.length - 1; i >= 0 && turns.length < REPLAN_TITLE_CONTEXT_TURN_LIMIT; i--) {
117
+ const message = messages[i];
118
+ if (!message) continue;
119
+ const turn = titleConversationTurnFromMessage(message);
120
+ if (turn) turns.push(turn);
121
+ }
122
+ turns.reverse();
123
+ return formatTitleConversationContext(turns);
124
+ }
125
+
126
+ /**
127
+ * Compares session messages by provider-replay semantics, ignoring runtime-only
128
+ * fields that do not change a restored request.
129
+ */
130
+ export function didSessionMessagesChange(previousMessages: AgentMessage[], nextMessages: AgentMessage[]): boolean {
131
+ if (previousMessages.length !== nextMessages.length) return true;
132
+ return previousMessages.some(
133
+ (message, i) =>
134
+ !Bun.deepEquals(
135
+ normalizeSessionMessageForProviderReplay(message),
136
+ normalizeSessionMessageForProviderReplay(nextMessages[i]),
137
+ ),
138
+ );
139
+ }
140
+
141
+ function textFromContent(content: unknown): string {
142
+ if (typeof content === "string") return content.trim();
143
+ if (!Array.isArray(content)) return "";
144
+ const parts: string[] = [];
145
+ for (const block of content) {
146
+ if (!isRecord(block) || block.type !== "text" || typeof block.text !== "string") continue;
147
+ const text = block.text.trim();
148
+ if (text) parts.push(text);
149
+ }
150
+ return parts.join("\n\n");
151
+ }
152
+
153
+ function thinkingFromContent(content: unknown): string {
154
+ if (!Array.isArray(content)) return "";
155
+ const parts: string[] = [];
156
+ for (const block of content) {
157
+ if (!isRecord(block) || block.type !== "thinking" || typeof block.thinking !== "string") continue;
158
+ const thinking = block.thinking.trim();
159
+ if (thinking) parts.push(thinking);
160
+ }
161
+ return parts.join("\n\n");
162
+ }
163
+
164
+ function titleConversationTurnFromMessage(message: AgentMessage): TitleConversationTurn | undefined {
165
+ if (message.role !== "user" && message.role !== "assistant") return undefined;
166
+ const text = textFromContent(message.content);
167
+ const thinking = message.role === "assistant" ? thinkingFromContent(message.content) : undefined;
168
+ if (!text && !thinking) return undefined;
169
+ return { role: message.role, ...(text ? { text } : {}), ...(thinking ? { thinking } : {}) };
170
+ }
171
+
172
+ function normalizeProviderReplayValue(value: unknown): unknown {
173
+ if (Array.isArray(value)) {
174
+ return value.map(normalizeProviderReplayValue);
175
+ }
176
+ if (value && typeof value === "object") {
177
+ return Object.fromEntries(
178
+ Object.entries(value).map(([key, entryValue]) => [key, normalizeProviderReplayValue(entryValue)]),
179
+ );
180
+ }
181
+ return value;
182
+ }
183
+
184
+ function normalizeSessionMessageForProviderReplay(message: AgentMessage): unknown {
185
+ switch (message.role) {
186
+ case "user":
187
+ case "developer":
188
+ return {
189
+ role: message.role,
190
+ content: normalizeProviderReplayValue(message.content),
191
+ providerPayload: message.providerPayload,
192
+ };
193
+ case "assistant": {
194
+ const isResponsesFamilyMessage =
195
+ message.api === "openai-responses" || message.api === "openai-codex-responses";
196
+ return {
197
+ role: message.role,
198
+ content:
199
+ isResponsesFamilyMessage && Array.isArray(message.content)
200
+ ? message.content.flatMap(block => {
201
+ if (block.type === "thinking") {
202
+ return [];
203
+ }
204
+ if (block.type === "toolCall") {
205
+ return [
206
+ {
207
+ type: block.type,
208
+ id: block.id,
209
+ name: block.name,
210
+ arguments: block.arguments,
211
+ },
212
+ ];
213
+ }
214
+ if (block.type === "text") {
215
+ return [{ type: block.type, text: block.text, textSignature: block.textSignature }];
216
+ }
217
+ return [normalizeProviderReplayValue(block)];
218
+ })
219
+ : normalizeProviderReplayValue(message.content),
220
+ api: message.api,
221
+ provider: message.provider,
222
+ model: message.model,
223
+ stopReason: message.stopReason,
224
+ errorMessage: message.errorMessage,
225
+ providerPayload: isResponsesFamilyMessage ? undefined : message.providerPayload,
226
+ };
227
+ }
228
+ case "toolResult":
229
+ return {
230
+ role: message.role,
231
+ toolName: message.toolName,
232
+ toolCallId: message.toolCallId,
233
+ isError: message.isError,
234
+ content: normalizeProviderReplayValue(message.content),
235
+ };
236
+ case "bashExecution":
237
+ return {
238
+ role: message.role,
239
+ command: message.command,
240
+ output: message.output,
241
+ exitCode: message.exitCode,
242
+ cancelled: message.cancelled,
243
+ meta: message.meta
244
+ ? {
245
+ truncation: normalizeProviderReplayValue(message.meta.truncation),
246
+ limits: normalizeProviderReplayValue(message.meta.limits),
247
+ diagnostics: message.meta.diagnostics
248
+ ? normalizeProviderReplayValue({
249
+ summary: message.meta.diagnostics.summary,
250
+ messages: message.meta.diagnostics.messages,
251
+ })
252
+ : undefined,
253
+ }
254
+ : undefined,
255
+ excludeFromContext: message.excludeFromContext,
256
+ };
257
+ case "pythonExecution":
258
+ return {
259
+ role: message.role,
260
+ code: message.code,
261
+ output: message.output,
262
+ exitCode: message.exitCode,
263
+ cancelled: message.cancelled,
264
+ meta: message.meta
265
+ ? {
266
+ truncation: normalizeProviderReplayValue(message.meta.truncation),
267
+ limits: normalizeProviderReplayValue(message.meta.limits),
268
+ diagnostics: message.meta.diagnostics
269
+ ? normalizeProviderReplayValue({
270
+ summary: message.meta.diagnostics.summary,
271
+ messages: message.meta.diagnostics.messages,
272
+ })
273
+ : undefined,
274
+ }
275
+ : undefined,
276
+ excludeFromContext: message.excludeFromContext,
277
+ };
278
+ case "custom":
279
+ case "hookMessage":
280
+ return {
281
+ role: message.role,
282
+ customType: message.customType,
283
+ content: normalizeProviderReplayValue(message.content),
284
+ };
285
+ case "branchSummary":
286
+ return { role: message.role, summary: message.summary };
287
+ case "compactionSummary":
288
+ return {
289
+ role: message.role,
290
+ summary: message.summary,
291
+ providerPayload: message.providerPayload,
292
+ };
293
+ case "fileMention":
294
+ return {
295
+ role: message.role,
296
+ files: message.files.map(file => ({
297
+ path: file.path,
298
+ content: file.content,
299
+ image: file.image,
300
+ })),
301
+ };
302
+ default:
303
+ return normalizeProviderReplayValue(message);
304
+ }
305
+ }
306
+
307
+ /** Fallback type for extension-injected messages that omit a custom type. */
308
+ export const DEFAULT_CUSTOM_MESSAGE_TYPE = "custom-message";
309
+
310
+ /** Custom message carrying a coding request delegated by the live voice model. */
311
+ export const LIVE_DELEGATION_MESSAGE_TYPE = "live-delegation";
312
+
313
+ /** Content shape accepted for extension-injected messages. */
314
+ export type CustomMessageContent = string | (TextContent | ImageContent)[];
315
+
316
+ /** Public input accepted by `pi.sendMessage` and `AgentSession.sendCustomMessage`. */
317
+ export type CustomMessagePayload<T = unknown> =
318
+ | string
319
+ | Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">>;
320
+
321
+ /** Custom message payload after applying runtime defaults. */
322
+ export type NormalizedCustomMessagePayload<T = unknown> = Pick<
323
+ CustomMessage<T>,
324
+ "customType" | "content" | "display" | "details" | "attribution"
325
+ >;
326
+
327
+ /** Custom message type for hidden interrupted-thinking continuity context. */
328
+ export const INTERRUPTED_THINKING_MESSAGE_TYPE = "interrupted-thinking";
329
+
330
+ /** Metadata persisted with a hidden interrupted-thinking continuity message. */
331
+ export interface InterruptedThinkingDetails {
332
+ interruptedAt: number;
333
+ provider: AssistantMessage["provider"];
334
+ model: string;
335
+ blockCount: number;
336
+ }
337
+
338
+ /** Pure helper result for persisting interrupted thinking outside the assistant turn. */
339
+ export interface DemotedInterruptedThinking {
340
+ reasoning: string;
341
+ strippedContent: AssistantMessage["content"];
342
+ blockCount: number;
343
+ }
344
+
345
+ /**
346
+ * Demote a trailing run of *incomplete* interrupted-thinking from an assistant
347
+ * message — reasoning that was still streaming when the user aborted.
348
+ *
349
+ * A block joins the run only when it is a non-empty `thinking` block with no
350
+ * `thinkingSignature`. A signed/complete thinking block (Anthropic signature,
351
+ * OpenAI reasoning item id) is safely replayable, so it ends the run and stays
352
+ * in place — as do `redactedThinking` encrypted blobs, text, tool calls,
353
+ * empty-thinking blocks, and trailing empty text placeholders.
354
+ */
355
+ export function demoteInterruptedThinking(
356
+ message: Pick<AssistantMessage, "content">,
357
+ ): DemotedInterruptedThinking | undefined {
358
+ const content = message.content;
359
+ let scanEnd = content.length;
360
+ while (scanEnd > 0) {
361
+ const block = content[scanEnd - 1]!;
362
+ if (block.type !== "text" || block.text.trim().length > 0) {
363
+ break;
364
+ }
365
+ scanEnd--;
366
+ }
367
+
368
+ let runStart = scanEnd;
369
+ while (runStart > 0) {
370
+ const block = content[runStart - 1]!;
371
+ if (block.type !== "thinking" || block.thinking.trim().length === 0 || block.thinkingSignature) {
372
+ break;
373
+ }
374
+ runStart--;
375
+ }
376
+
377
+ const blockCount = scanEnd - runStart;
378
+ if (blockCount === 0) {
379
+ return undefined;
380
+ }
381
+
382
+ const reasoningBlocks: string[] = [];
383
+ for (let index = runStart; index < scanEnd; index++) {
384
+ const block = content[index]!;
385
+ if (block.type === "thinking") {
386
+ reasoningBlocks.push(block.thinking.trim());
387
+ }
388
+ }
389
+
390
+ return {
391
+ reasoning: reasoningBlocks.join("\n\n"),
392
+ strippedContent: content.slice(0, runStart),
393
+ blockCount,
394
+ };
395
+ }
396
+
397
+ /**
398
+ * True when the assistant turn at `messages[index]` is immediately followed by
399
+ * its hidden `interrupted-thinking` continuity message — the marker that a
400
+ * trailing thinking run was demoted on user interrupt. The run stays on the
401
+ * persisted/displayed assistant message; this flag tells the LLM path to drop it.
402
+ */
403
+ function followedByInterruptedThinking(messages: AgentMessage[], index: number): boolean {
404
+ const next = messages[index + 1];
405
+ return next !== undefined && next.role === "custom" && next.customType === INTERRUPTED_THINKING_MESSAGE_TYPE;
406
+ }
407
+
408
+ /**
409
+ * Drop the demoted trailing thinking run from an assistant message for the LLM
410
+ * view only. The run is incomplete and unsigned, so providers reject it; the
411
+ * continuity message that follows carries the reasoning instead.
412
+ */
413
+ function stripDemotedThinkingForLlm(message: AssistantMessage): AssistantMessage {
414
+ const demoted = demoteInterruptedThinking(message);
415
+ return demoted ? { ...message, content: demoted.strippedContent } : message;
416
+ }
417
+
418
+ /** Details persisted on a `/tan` background-dispatch breadcrumb. */
419
+ export interface BackgroundTanDispatchDetails {
420
+ jobId: string;
421
+ work: string;
422
+ /** Forked clone session file, named `<agentId>.jsonl`; the Agent Hub reads its transcript. */
423
+ sessionFile: string;
424
+ }
425
+
426
+ export interface SkillPromptDetails {
427
+ name: string;
428
+ path: string;
429
+ args?: string;
430
+ lineCount: number;
431
+ /** Internal: compact label shown for a queued custom message. Optional —
432
+ * non-streaming skill prompts never set it. Stripped from persisted
433
+ * `details` by `SessionManager.appendCustomMessageEntry` via the
434
+ * `INTERNAL_DETAILS_FIELDS` allowlist below. */
435
+ __queueChipText?: string;
436
+ }
437
+
438
+ /** Sentinel value for `AssistantMessage.errorMessage` indicating that the abort
439
+ * was an *expected internal transition* (plan-mode → execution compaction)
440
+ * and must NOT surface as a red "Operation aborted" line. Distinct from
441
+ * `undefined` (default) so user-cancel aborts with no errorMessage still
442
+ * render normally. Persists through SessionManager so history replay
443
+ * branches identically.
444
+ *
445
+ * Consumers: `AgentSession.#handleAgentEvent` (stamper) writes this value;
446
+ * `EventController.#handleMessageEnd`, `AssistantMessageComponent`,
447
+ * `ui-helpers.addMessageToChat` (renderers), `AgentHubOverlayComponent
448
+ * #buildTranscriptLines`, `runPrintMode`, and `AcpAgent#replayAssistantMessage`
449
+ * (fallback error emission) read it via `isSilentAbort`. */
450
+ export const SILENT_ABORT_MARKER = "__omp.silent_abort__";
451
+
452
+ /** Type-guard for silent aborts. Renderers MUST call this helper so structured
453
+ * `errorId` and legacy persisted marker messages stay in lockstep. */
454
+ export function isSilentAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
455
+ return AIError.is(message.errorId, AIError.Flag.SilentAbort) || message.errorMessage === SILENT_ABORT_MARKER;
456
+ }
457
+
458
+ /** Reason threaded through `AbortController.abort(reason)` when the user aborts
459
+ * the turn with Esc (see `AgentSession.abort`). The agent keeps it on the
460
+ * aborted assistant message's `errorMessage` so queued follow-ups/tool-result
461
+ * placeholders can distinguish a deliberate interrupt from a bare lifecycle
462
+ * abort, but interactive renderers suppress this redundant transcript line. */
463
+ export const USER_INTERRUPT_LABEL = "Interrupted by user";
464
+
465
+ export function isUserInterruptAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
466
+ return AIError.is(message.errorId, AIError.Flag.UserInterrupt) || message.errorMessage === USER_INTERRUPT_LABEL;
467
+ }
468
+
469
+ export function shouldRenderAbortReason(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
470
+ return !isSilentAbort(message) && !isUserInterruptAbort(message);
471
+ }
472
+
473
+ /** A provider-rejection turn carrying nothing but the error flag: stopReason
474
+ * "error" with no text, thinking, or tool calls — e.g. a request the provider
475
+ * rejected before any output (an oversized 413 payload). Persisting it writes an
476
+ * empty assistant turn that replays on reload and re-sends the rejected context;
477
+ * the error is surfaced live (pinned) instead. A turn that streamed partial text,
478
+ * reasoning, or tool calls is NOT empty and stays in history. */
479
+ export function isEmptyErrorTurn(message: Pick<AssistantMessage, "stopReason" | "content">): boolean {
480
+ if (message.stopReason !== "error") return false;
481
+ return !message.content.some(block => {
482
+ switch (block.type) {
483
+ case "text":
484
+ return block.text.trim().length > 0;
485
+ case "thinking":
486
+ return block.thinking.trim().length > 0 || (block.thinkingSignature?.trim().length ?? 0) > 0;
487
+ case "redactedThinking":
488
+ return block.data.trim().length > 0;
489
+ case "toolCall":
490
+ return true;
491
+ case "fallback":
492
+ return false;
493
+ // Unknown/new block kinds count as content: never silently discard a turn.
494
+ default:
495
+ return true;
496
+ }
497
+ });
498
+ }
499
+
500
+ /** Sentinel `errorMessage` the agent stamps on any abort that carried no custom
501
+ * reason (bare `abort()`). Renderers treat it as "no specific reason given". */
502
+ export const GENERIC_ABORT_SENTINEL = "Request was aborted";
503
+
504
+ /** Resolve the operator-facing label for an aborted assistant turn. A custom
505
+ * abort reason threaded onto `errorMessage` is returned verbatim; aborts with
506
+ * no threaded reason fall back to the retry-aware generic label. Call
507
+ * `shouldRenderAbortReason` before rendering when user interrupts should stay
508
+ * visually quiet. */
509
+ export function resolveAbortLabel(
510
+ message: Pick<AssistantMessage, "errorId" | "errorMessage">,
511
+ retryAttempt = 0,
512
+ ): string {
513
+ const genericAbort =
514
+ AIError.is(message.errorId, AIError.Flag.Abort) ||
515
+ !message.errorMessage ||
516
+ message.errorMessage === GENERIC_ABORT_SENTINEL ||
517
+ isSilentAbort(message);
518
+ if (!genericAbort) {
519
+ return message.errorMessage!;
520
+ }
521
+ if (retryAttempt > 0) {
522
+ return `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? "s" : ""}`;
523
+ }
524
+ return "Operation aborted";
525
+ }
526
+
527
+ /** Extract the optional `__queueChipText` field from a CustomMessage's
528
+ * `details` blob. Safe over `unknown`; returns undefined when the field is
529
+ * absent or non-string. */
530
+ export function readQueueChipText(details: unknown): string | undefined {
531
+ if (typeof details !== "object" || details === null) return undefined;
532
+ const candidate = (details as { __queueChipText?: unknown }).__queueChipText;
533
+ return typeof candidate === "string" ? candidate : undefined;
534
+ }
535
+
536
+ /** Explicit allowlist of `details` field names that are AgentSession-internal
537
+ * transient bookkeeping and MUST be removed before SessionManager persists
538
+ * the CustomMessageEntry to disk. Scoped intentionally narrow: only fields
539
+ * declared here are stripped. Adding a new entry is a deliberate, reviewed
540
+ * change — unrelated future payload fields are never silently dropped. */
541
+ export const INTERNAL_DETAILS_FIELDS = ["__queueChipText"] as const;
542
+
543
+ /** Return a `details` copy with every key in `INTERNAL_DETAILS_FIELDS`
544
+ * removed. Returns the input unchanged when there is nothing to strip
545
+ * (null/non-object, or no listed fields present) so callers don't pay a
546
+ * clone cost on the common path. */
547
+ export function stripInternalDetailsFields<T>(details: T | undefined): T | undefined {
548
+ if (details == null || typeof details !== "object") return details;
549
+ const obj = details as Record<string, unknown>;
550
+ let hit = false;
551
+ for (const key of INTERNAL_DETAILS_FIELDS) {
552
+ if (key in obj) {
553
+ hit = true;
554
+ break;
555
+ }
556
+ }
557
+ if (!hit) return details;
558
+ const cleaned: Record<string, unknown> = { ...obj };
559
+ for (const key of INTERNAL_DETAILS_FIELDS) {
560
+ delete cleaned[key];
561
+ }
562
+ return cleaned as T;
563
+ }
564
+
565
+ /** True when a persisted or extension-supplied value can be sent as custom-message content. */
566
+ export function isCustomMessageContent(content: unknown): content is CustomMessageContent {
567
+ return typeof content === "string" || Array.isArray(content);
568
+ }
569
+
570
+ function normalizeCustomMessageContent(content: unknown): CustomMessageContent {
571
+ return isCustomMessageContent(content) ? content : "";
572
+ }
573
+
574
+ function normalizeCustomMessageType(customType: unknown): string {
575
+ return typeof customType === "string" && customType.length > 0 ? customType : DEFAULT_CUSTOM_MESSAGE_TYPE;
576
+ }
577
+
578
+ function normalizeCustomMessageAttribution(attribution: unknown): MessageAttribution {
579
+ return attribution === "user" ? "user" : "agent";
580
+ }
581
+
582
+ function isCustomMessagePayloadObject<T>(
583
+ payload: unknown,
584
+ ): payload is Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">> {
585
+ return payload !== null && typeof payload === "object" && !Array.isArray(payload);
586
+ }
587
+
588
+ /** Normalizes extension-provided custom message input before it reaches session state or disk. */
589
+ export function normalizeCustomMessagePayload<T = unknown>(
590
+ payload: CustomMessagePayload<T> | unknown,
591
+ ): NormalizedCustomMessagePayload<T> {
592
+ if (typeof payload === "string") {
593
+ return {
594
+ customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
595
+ content: payload,
596
+ display: true,
597
+ attribution: "agent",
598
+ };
599
+ }
600
+ if (!isCustomMessagePayloadObject<T>(payload)) {
601
+ const content = payload === undefined || payload === null ? "" : String(payload);
602
+ return {
603
+ customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
604
+ content,
605
+ display: content.length > 0,
606
+ attribution: "agent",
607
+ };
608
+ }
609
+ return {
610
+ customType: normalizeCustomMessageType(payload.customType),
611
+ content: normalizeCustomMessageContent(payload.content),
612
+ display: typeof payload.display === "boolean" ? payload.display : false,
613
+ details: payload.details,
614
+ attribution: normalizeCustomMessageAttribution(payload.attribution),
615
+ };
616
+ }
617
+
618
+ type SteeringUserMessage =
619
+ | (UserMessage & { steering: true })
620
+ | (CustomMessage & {
621
+ customType: typeof COLLAB_PROMPT_MESSAGE_TYPE;
622
+ attribution: "user";
623
+ });
624
+
625
+ function isSteeringUserMessage(message: AgentMessage | undefined): message is SteeringUserMessage {
626
+ if (message?.role === "user") return message.steering === true;
627
+ return (
628
+ message?.role === "custom" && message.customType === COLLAB_PROMPT_MESSAGE_TYPE && message.attribution === "user"
629
+ );
630
+ }
631
+
632
+ function userMessageWithoutSteering(message: UserMessage): UserMessage {
633
+ const { steering, ...rest } = message;
634
+ void steering;
635
+ return rest;
636
+ }
637
+
638
+ function renderSteeringEnvelope(message: string): string {
639
+ return prompt.render(userInterjectionTemplate, { message });
640
+ }
641
+
642
+ function getArrayContentText(content: (TextContent | ImageContent)[]): string {
643
+ let firstText: string | undefined;
644
+ let textParts: string[] | undefined;
645
+ for (const part of content) {
646
+ if (part.type !== "text") continue;
647
+ if (firstText === undefined) {
648
+ firstText = part.text;
649
+ continue;
650
+ }
651
+ if (textParts === undefined) {
652
+ textParts = [firstText];
653
+ }
654
+ textParts.push(part.text);
655
+ }
656
+ return textParts === undefined ? (firstText ?? "") : textParts.join("\n");
657
+ }
658
+
659
+ function getArrayContentImages(content: (TextContent | ImageContent)[]): ImageContent[] {
660
+ let images: ImageContent[] | undefined;
661
+ for (const part of content) {
662
+ if (part.type !== "image") continue;
663
+ if (images === undefined) images = [];
664
+ images.push(part);
665
+ }
666
+ return images ?? [];
667
+ }
668
+
669
+ function wrapSteeringUserMessage(message: SteeringUserMessage): UserMessage {
670
+ const userMessage: UserMessage =
671
+ message.role === "user"
672
+ ? userMessageWithoutSteering(message)
673
+ : {
674
+ role: "user",
675
+ content: message.content,
676
+ attribution: "user",
677
+ timestamp: message.timestamp,
678
+ };
679
+ if (typeof message.content === "string") {
680
+ if (message.content.length === 0) return message.role === "user" ? message : userMessage;
681
+ return { ...userMessage, content: renderSteeringEnvelope(message.content) };
682
+ }
683
+
684
+ const text = getArrayContentText(message.content);
685
+ if (text.length === 0) return message.role === "user" ? message : userMessage;
686
+ const content: (TextContent | ImageContent)[] = [{ type: "text", text: renderSteeringEnvelope(text) }];
687
+ content.push(...getArrayContentImages(message.content));
688
+ return { ...userMessage, content };
689
+ }
690
+
691
+ export function wrapSteeringForModel(messages: AgentMessage[]): AgentMessage[] {
692
+ // Wrap EVERY steering message, not just a trailing run. The wire bytes of a
693
+ // steering message must be a pure function of the message itself, independent
694
+ // of its position in the array. When only the trailing steer was wrapped, the
695
+ // same persisted message was sent enveloped while it was the tail and raw once
696
+ // the assistant's reply buried it — rewriting already-cached prefix bytes and
697
+ // busting the provider prompt cache from that message onward on the next turn.
698
+ let wrappedMessages: AgentMessage[] | undefined;
699
+ for (let i = 0; i < messages.length; i++) {
700
+ const message = messages[i];
701
+ if (!isSteeringUserMessage(message)) continue;
702
+ const wrappedMessage = wrapSteeringUserMessage(message);
703
+ if (wrappedMessage === message) continue;
704
+ if (wrappedMessages === undefined) {
705
+ wrappedMessages = messages.slice();
706
+ }
707
+ wrappedMessages[i] = wrappedMessage;
708
+ }
709
+ return wrappedMessages ?? messages;
710
+ }
711
+
712
+ /** Result of filtering image blocks out of a `(TextContent | ImageContent)[]` array. */
713
+ interface StripContentResult {
714
+ content: (TextContent | ImageContent)[];
715
+ removed: number;
716
+ }
717
+
718
+ function stripImagesFromArrayContent(content: (TextContent | ImageContent)[]): StripContentResult {
719
+ let removed = 0;
720
+ const kept: (TextContent | ImageContent)[] = [];
721
+ for (const part of content) {
722
+ if (part.type === "image") {
723
+ removed++;
724
+ } else {
725
+ kept.push(part);
726
+ }
727
+ }
728
+ if (removed === 0) {
729
+ return { content, removed };
730
+ }
731
+ // Avoid emitting an empty `content` array — providers reject zero-block user/tool
732
+ // messages and the LLM still needs to see *something* where the image used to be.
733
+ if (kept.length === 0) {
734
+ kept.push({ type: "text", text: "[image removed]" });
735
+ }
736
+ return { content: kept, removed };
737
+ }
738
+
739
+ /**
740
+ * Strip image content blocks from `message` in place. Returns the count of
741
+ * images removed across `content` (every role that carries `ImageContent`) and
742
+ * any tool-result `details.images` payload. Callers MUST rewrite session
743
+ * entries (`SessionManager.rewriteEntries`) and replay them through
744
+ * `Agent.replaceMessages` afterwards so persisted state and provider-side
745
+ * caches stay aligned with the mutated tree — `stripImagesFromMessage` is a
746
+ * pure local mutation and intentionally does neither.
747
+ */
748
+ export function stripImagesFromMessage(message: AgentMessage): number {
749
+ const removed = stripImagesFromMessageContent(message);
750
+ // The mutated message keeps its identity across context rebuilds, so drop its
751
+ // cached estimate/convert before the next pass counts/converts the new shape.
752
+ if (removed > 0) invalidateMessageCache(message);
753
+ return removed;
754
+ }
755
+
756
+ function stripImagesFromMessageContent(message: AgentMessage): number {
757
+ switch (message.role) {
758
+ case "user":
759
+ case "developer":
760
+ case "custom":
761
+ case "hookMessage": {
762
+ if (typeof message.content === "string") return 0;
763
+ const { content, removed } = stripImagesFromArrayContent(message.content);
764
+ if (removed > 0) {
765
+ // All four roles type `content` as `string | (TextContent | ImageContent)[]`;
766
+ // TypeScript can't narrow the assignment across the union, so cast once.
767
+ (message as { content: typeof content }).content = content;
768
+ }
769
+ return removed;
770
+ }
771
+ case "toolResult": {
772
+ let removed = 0;
773
+ const { content, removed: contentRemoved } = stripImagesFromArrayContent(message.content);
774
+ if (contentRemoved > 0) {
775
+ message.content = content;
776
+ removed += contentRemoved;
777
+ }
778
+ const details = message.details as { images?: unknown } | null | undefined;
779
+ if (details && Array.isArray(details.images)) {
780
+ const original = details.images as unknown[];
781
+ const kept: unknown[] = [];
782
+ for (const candidate of original) {
783
+ const looksLikeImageBlock =
784
+ !!candidate && typeof candidate === "object" && (candidate as { type?: unknown }).type === "image";
785
+ if (looksLikeImageBlock) {
786
+ removed++;
787
+ } else {
788
+ kept.push(candidate);
789
+ }
790
+ }
791
+ if (kept.length !== original.length) {
792
+ details.images = kept;
793
+ }
794
+ }
795
+ return removed;
796
+ }
797
+ case "fileMention": {
798
+ let removed = 0;
799
+ for (const file of message.files) {
800
+ if (file.image) {
801
+ file.image = undefined;
802
+ removed++;
803
+ }
804
+ }
805
+ return removed;
806
+ }
807
+ default:
808
+ return 0;
809
+ }
810
+ }
811
+
812
+ /**
813
+ * Replace every `ImageContent` block in already-converted LLM {@link Message}s
814
+ * with a text placeholder, returning a new array only when something changed.
815
+ *
816
+ * Unlike {@link stripImagesFromMessage} (which mutates persisted `AgentMessage`s
817
+ * in place), this operates on the ephemeral provider-request view produced by
818
+ * {@link convertToLlm}, so history on disk keeps its images while the outbound
819
+ * request is scrubbed. Used to keep image blocks off the wire when the active
820
+ * model has no vision support (or `images.blockImages` is set) — e.g. after
821
+ * switching from a vision model to a text-only one mid-session (#5400).
822
+ *
823
+ * Consecutive placeholder texts collapse into one so a message that was nothing
824
+ * but images does not balloon into a run of identical notes.
825
+ */
826
+ export function replaceLlmImagesWithText(messages: Message[], placeholder: string): Message[] {
827
+ let out: Message[] | undefined;
828
+ for (let i = 0; i < messages.length; i++) {
829
+ const msg = messages[i];
830
+ if (msg.role !== "user" && msg.role !== "developer" && msg.role !== "toolResult") continue;
831
+ const content = msg.content;
832
+ if (!Array.isArray(content) || !content.some(part => part.type === "image")) continue;
833
+ const replaced: (TextContent | ImageContent)[] = [];
834
+ for (const part of content) {
835
+ if (part.type !== "image") {
836
+ replaced.push(part);
837
+ continue;
838
+ }
839
+ const prev = replaced[replaced.length - 1];
840
+ if (prev?.type === "text" && prev.text === placeholder) continue;
841
+ replaced.push({ type: "text", text: placeholder });
842
+ }
843
+ if (out === undefined) out = messages.slice();
844
+ out[i] = { ...msg, content: replaced } as Message;
845
+ }
846
+ return out ?? messages;
847
+ }
848
+
849
+ /**
850
+ * Message type for bash executions via the ! command.
851
+ */
852
+ export interface BashExecutionMessage {
853
+ role: "bashExecution";
854
+ command: string;
855
+ output: string;
856
+ exitCode: number | undefined;
857
+ cancelled: boolean;
858
+ truncated: boolean;
859
+ meta?: OutputMeta;
860
+ timestamp: number;
861
+ /** If true, this message is excluded from LLM context (!! prefix) */
862
+ excludeFromContext?: boolean;
863
+ }
864
+
865
+ /**
866
+ * Message type for user-initiated Python executions via the $ command.
867
+ * Shares the same kernel session as eval's Python backend.
868
+ */
869
+ export interface PythonExecutionMessage {
870
+ role: "pythonExecution";
871
+ code: string;
872
+ output: string;
873
+ exitCode: number | undefined;
874
+ cancelled: boolean;
875
+ truncated: boolean;
876
+ meta?: OutputMeta;
877
+ timestamp: number;
878
+ /** If true, this message is excluded from LLM context ($$ prefix) */
879
+ excludeFromContext?: boolean;
880
+ }
881
+
882
+ /**
883
+ * Message type for extension-injected messages via sendMessage().
884
+ */
885
+ export interface CustomMessage<T = unknown> {
886
+ role: "custom";
887
+ customType: string;
888
+ content: CustomMessageContent;
889
+ display: boolean;
890
+ details?: T;
891
+ /** Who initiated this message for billing/attribution semantics. */
892
+ attribution?: MessageAttribution;
893
+ timestamp: number;
894
+ }
895
+
896
+ /**
897
+ * Legacy hook message type (pre-extensions). Kept for session migration.
898
+ */
899
+ export interface HookMessage<T = unknown> {
900
+ role: "hookMessage";
901
+ customType: string;
902
+ content: CustomMessageContent;
903
+ display: boolean;
904
+ details?: T;
905
+ /** Who initiated this message for billing/attribution semantics. */
906
+ attribution?: MessageAttribution;
907
+ timestamp: number;
908
+ }
909
+
910
+ /**
911
+ * Message type for auto-read file mentions via @filepath syntax.
912
+ */
913
+ export interface FileMentionMessage {
914
+ role: "fileMention";
915
+ files: Array<{
916
+ path: string;
917
+ content: string;
918
+ lineCount?: number;
919
+ /** File size in bytes, if known. */
920
+ byteSize?: number;
921
+ /** Why the file contents were omitted from auto-read. */
922
+ skippedReason?: "tooLarge" | "binary";
923
+ image?: ImageContent;
924
+ }>;
925
+ timestamp: number;
926
+ }
927
+
928
+ // Extend CustomAgentMessages via declaration merging
929
+ // Legacy hookMessage is kept for migration; new code should use custom.
930
+ declare module "@oh-my-pi/pi-agent-core" {
931
+ interface CustomAgentMessages {
932
+ bashExecution: BashExecutionMessage;
933
+ pythonExecution: PythonExecutionMessage;
934
+ custom: CustomMessage;
935
+ hookMessage: HookMessage;
936
+ branchSummary: BranchSummaryMessage;
937
+ compactionSummary: CompactionSummaryMessage;
938
+ fileMention: FileMentionMessage;
939
+ }
940
+ }
941
+
942
+ /**
943
+ * Convert a BashExecutionMessage to user message text for LLM context.
944
+ */
945
+ export function bashExecutionToText(msg: BashExecutionMessage): string {
946
+ let text = `Ran \`${msg.command}\`\n`;
947
+ if (msg.output) {
948
+ text += `\`\`\`\n${msg.output}\n\`\`\``;
949
+ } else {
950
+ text += "(no output)";
951
+ }
952
+ if (msg.cancelled) {
953
+ text += "\n\n(command cancelled)";
954
+ } else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {
955
+ text += `\n\nCommand exited with code ${msg.exitCode}`;
956
+ }
957
+ text += formatOutputNotice(msg.meta);
958
+ return text;
959
+ }
960
+
961
+ /**
962
+ * Convert a PythonExecutionMessage to user message text for LLM context.
963
+ */
964
+ export function pythonExecutionToText(msg: PythonExecutionMessage): string {
965
+ let text = `Ran Python:\n\`\`\`python\n${msg.code}\n\`\`\`\n`;
966
+ if (msg.output) {
967
+ text += `Output:\n\`\`\`\n${msg.output}\n\`\`\``;
968
+ } else {
969
+ text += "(no output)";
970
+ }
971
+ if (msg.cancelled) {
972
+ text += "\n\n(execution cancelled)";
973
+ } else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {
974
+ text += `\n\nExecution failed with code ${msg.exitCode}`;
975
+ }
976
+ text += formatOutputNotice(msg.meta);
977
+ return text;
978
+ }
979
+
980
+ export function sanitizeRehydratedOpenAIResponsesAssistantMessage(message: AssistantMessage): AssistantMessage {
981
+ if (message.providerPayload?.type !== "openaiResponsesHistory") {
982
+ return message;
983
+ }
984
+ // Only GitHub Copilot rejects replayed assistant-side native history on a
985
+ // warmed (resumed) session with HTTP 401 — that is the sole reason this strip
986
+ // exists. For every other Responses-family provider (OpenAI, OpenAI-Codex,
987
+ // Azure) the encrypted reasoning and native response items are self-contained
988
+ // and MUST survive rehydration: remote compaction replays them to rebuild
989
+ // faithful native history (user + assistant turns + encrypted reasoning), and
990
+ // same-model live turns reuse them for prompt-cache continuity. Stripping them
991
+ // for all providers is what left resumed sessions compacting tool-call-only
992
+ // history with no reasoning and no assistant prose.
993
+ if (message.provider !== "github-copilot") {
994
+ return message;
995
+ }
996
+
997
+ let didSanitizeContent = false;
998
+ const sanitizedContent = message.content.map(block => {
999
+ if (block.type !== "thinking" || block.thinkingSignature === undefined) {
1000
+ return block;
1001
+ }
1002
+ didSanitizeContent = true;
1003
+ return { ...block, thinkingSignature: undefined };
1004
+ });
1005
+
1006
+ // Strip the assistant-side native replay payload entirely. After rehydration
1007
+ // it belongs to a previous live Copilot connection and replaying it on a
1008
+ // warmed session causes 401 rejections. User/developer payloads are preserved
1009
+ // separately by the caller.
1010
+ return {
1011
+ ...message,
1012
+ ...(didSanitizeContent ? { content: sanitizedContent } : {}),
1013
+ providerPayload: undefined,
1014
+ };
1015
+ }
1016
+
1017
+ function customMessageContentToLlmContent(content: CustomMessage["content"]): (TextContent | ImageContent)[] {
1018
+ return typeof content === "string" ? [{ type: "text", text: content }] : content;
1019
+ }
1020
+
1021
+ function isUserInvokedSkillPrompt(message: CustomMessage): boolean {
1022
+ return message.customType === SKILL_PROMPT_MESSAGE_TYPE && message.attribution === "user";
1023
+ }
1024
+
1025
+ function convertImageBearingCustomMessage(message: CustomMessage | HookMessage): Message[] | undefined {
1026
+ if (!isCustomMessageContent(message.content)) return undefined;
1027
+ if (typeof message.content === "string") return undefined;
1028
+ const textBlocks = message.content.filter((content): content is TextContent => content.type === "text");
1029
+ const imageBlocks = message.content.filter((content): content is ImageContent => content.type === "image");
1030
+ if (imageBlocks.length === 0) return undefined;
1031
+
1032
+ const converted: Message[] = [];
1033
+ if (textBlocks.length > 0) {
1034
+ converted.push({
1035
+ role: "developer",
1036
+ content: textBlocks,
1037
+ attribution: message.attribution,
1038
+ timestamp: message.timestamp,
1039
+ });
1040
+ }
1041
+ converted.push({
1042
+ role: "user",
1043
+ content: [{ type: "text", text: `Images attached to ${message.customType}.` }, ...imageBlocks],
1044
+ attribution: message.attribution,
1045
+ timestamp: message.timestamp,
1046
+ });
1047
+ return converted;
1048
+ }
1049
+
1050
+ /**
1051
+ * Per-message conversion result, keyed by message identity. `interruptedNext`
1052
+ * records the neighbor state the fragment was built against so an assistant
1053
+ * whose following {@link INTERRUPTED_THINKING_MESSAGE_TYPE} marker appears or
1054
+ * disappears is recomputed (its LLM view strips the trailing thinking run only
1055
+ * while that marker follows).
1056
+ *
1057
+ * WeakMap (not a symbol tag) is deliberate: `wrapSteeringForModel` and
1058
+ * `deobfuscateAgentMessages` spread messages into fresh variants with different
1059
+ * content; a symbol-keyed fragment would ride that spread and mis-convert the
1060
+ * copy. Identity keying keeps the cache off spread copies.
1061
+ */
1062
+ interface ConvertMemoEntry {
1063
+ interruptedNext: boolean;
1064
+ fragment: Message[];
1065
+ }
1066
+ const convertCache = new WeakMap<AgentMessage, ConvertMemoEntry>();
1067
+
1068
+ // Array-level shortcuts over the per-message memo. The live agent mutates one
1069
+ // `AgentMessage[]` identity across a turn: appending new messages and swapping
1070
+ // the streaming tail (`context.messages[len-1] = partial → trailing`). Between
1071
+ // owner invalidations (prune/shake/strip bump `convertGeneration`) and for a
1072
+ // given array identity, only the last index is ever swapped and the array only
1073
+ // grows — interior prefix messages are immutable. That invariant lets two
1074
+ // shortcuts skip the O(N) re-walk:
1075
+ // - exact-repeat: same array, same length, same generation, same tail identity
1076
+ // → hand back the same outer array.
1077
+ // - slice-on-growth: same array, same generation, length grew → copy the
1078
+ // unchanged prefix output and reconvert only the neighbor-sensitive boundary
1079
+ // message plus the appended suffix.
1080
+ // The tail-identity guard on exact-repeat catches the streaming snapshot swap
1081
+ // (partial → trailing is a fresh identity), so a settled tail is never served
1082
+ // from a stale mid-stream fragment.
1083
+ let convertGeneration = 0;
1084
+ let lastConvertInput: AgentMessage[] | undefined;
1085
+ let lastConvertLength = 0;
1086
+ let lastConvertOutput: Message[] | undefined;
1087
+ let lastConvertGeneration = -1;
1088
+ let lastConvertTail: AgentMessage | undefined;
1089
+ // Output-message count contributed by messages[0 .. lastConvertLength-1), i.e.
1090
+ // every message except the last. The last message is neighbor-sensitive (its LLM
1091
+ // view drops the trailing thinking run only while an interrupted-thinking marker
1092
+ // follows), so growth reconverts it rather than reusing its old fragment.
1093
+ let lastConvertPrefixOutputLen = 0;
1094
+
1095
+ registerMessageCacheInvalidator(message => {
1096
+ convertCache.delete(message);
1097
+ convertGeneration++;
1098
+ });
1099
+
1100
+ /** Convert one message to its LLM fragment. `interruptedNext` is true only for an
1101
+ * assistant turn immediately followed by its interrupted-thinking marker. */
1102
+ function convertOne(m: AgentMessage, interruptedNext: boolean): Message[] {
1103
+ switch (m.role) {
1104
+ case "bashExecution":
1105
+ if (m.excludeFromContext) {
1106
+ return [];
1107
+ }
1108
+ return [
1109
+ {
1110
+ role: "user",
1111
+ content: [{ type: "text", text: bashExecutionToText(m) }],
1112
+ attribution: "user",
1113
+ timestamp: m.timestamp,
1114
+ },
1115
+ ];
1116
+ case "pythonExecution":
1117
+ if (m.excludeFromContext) {
1118
+ return [];
1119
+ }
1120
+ return [
1121
+ {
1122
+ role: "user",
1123
+ content: [{ type: "text", text: pythonExecutionToText(m) }],
1124
+ attribution: "user",
1125
+ timestamp: m.timestamp,
1126
+ },
1127
+ ];
1128
+ case "fileMention": {
1129
+ // One `fileMention` can mix `@notes.md` (text) and `@screenshot.png` (image)
1130
+ // in the same turn (`generateFileMentionMessages` packs every `@…` into a
1131
+ // single message). Splitting by image presence keeps text-only mentions on
1132
+ // the higher-priority `developer` slot while routing image attachments
1133
+ // through `user`, the only Responses content slot that legitimately accepts
1134
+ // `input_image` (Codex chatgpt.com /codex/responses rejects everything else
1135
+ // with `Invalid value: 'input_image'`, #3443).
1136
+ const wrap = (file: FileMentionMessage["files"][number]): string => {
1137
+ const inner = file.content ? `\n${file.content}\n` : "\n";
1138
+ return `<file path="${file.path}">${inner}</file>`;
1139
+ };
1140
+ const textFiles = m.files.filter(file => !file.image);
1141
+ const imageFiles = m.files.filter(file => file.image);
1142
+ const out: Message[] = [];
1143
+ if (textFiles.length > 0) {
1144
+ out.push({
1145
+ role: "developer",
1146
+ content: [{ type: "text" as const, text: textFiles.map(wrap).join("\n") }],
1147
+ attribution: "user",
1148
+ timestamp: m.timestamp,
1149
+ });
1150
+ }
1151
+ if (imageFiles.length > 0) {
1152
+ const content: (TextContent | ImageContent)[] = [
1153
+ { type: "text" as const, text: imageFiles.map(wrap).join("\n") },
1154
+ ];
1155
+ for (const file of imageFiles) {
1156
+ if (file.image) content.push(file.image);
1157
+ }
1158
+ out.push({
1159
+ role: "user",
1160
+ content,
1161
+ attribution: "user",
1162
+ timestamp: m.timestamp,
1163
+ });
1164
+ }
1165
+ return out;
1166
+ }
1167
+ case "custom": {
1168
+ if (!isCustomMessageContent(m.content)) return [];
1169
+ if (isSteeringUserMessage(m)) {
1170
+ const converted = convertMessageToLlm(wrapSteeringUserMessage(m));
1171
+ return converted ? [converted] : [];
1172
+ }
1173
+ if (isUserInvokedSkillPrompt(m)) {
1174
+ return [
1175
+ {
1176
+ role: "user",
1177
+ content: customMessageContentToLlmContent(m.content),
1178
+ attribution: "user",
1179
+ timestamp: m.timestamp,
1180
+ },
1181
+ ];
1182
+ }
1183
+ const split = convertImageBearingCustomMessage(m);
1184
+ if (split) return split;
1185
+ const converted = convertMessageToLlm(m);
1186
+ return converted ? [converted] : [];
1187
+ }
1188
+ case "hookMessage": {
1189
+ if (!isCustomMessageContent(m.content)) return [];
1190
+ const split = convertImageBearingCustomMessage(m);
1191
+ if (split) return split;
1192
+ const converted = convertMessageToLlm(m);
1193
+ return converted ? [converted] : [];
1194
+ }
1195
+ case "assistant": {
1196
+ // A user-interrupted turn keeps its trailing thinking run on the
1197
+ // persisted/displayed message so reload and display-reset rebuilds still
1198
+ // show it. That run is incomplete/unsigned and gets rejected on
1199
+ // resend, so strip it here — LLM path only — when the hidden
1200
+ // interrupted-thinking continuity message follows.
1201
+ const source = interruptedNext ? stripDemotedThinkingForLlm(m) : m;
1202
+ const converted = convertMessageToLlm(source);
1203
+ return converted ? [converted] : [];
1204
+ }
1205
+ case "branchSummary":
1206
+ case "compactionSummary":
1207
+ case "user":
1208
+ case "developer":
1209
+ case "toolResult": {
1210
+ // Core roles share one transformer with agent-core —
1211
+ // duplicating them here is how snapcompact frames once
1212
+ // silently fell off the provider request.
1213
+ const converted = convertMessageToLlm(m);
1214
+ return converted ? [converted] : [];
1215
+ }
1216
+ default:
1217
+ m satisfies never;
1218
+ return [];
1219
+ }
1220
+ }
1221
+
1222
+ /** Cached per-message conversion. Reuses the stored fragment while identity and
1223
+ * `interruptedNext` neighbor state hold; recomputes on a neighbor flip. */
1224
+ function convertOneCached(m: AgentMessage, interruptedNext: boolean): Message[] {
1225
+ const cached = convertCache.get(m);
1226
+ if (cached !== undefined && cached.interruptedNext === interruptedNext) return cached.fragment;
1227
+ const fragment = convertOne(m, interruptedNext);
1228
+ convertCache.set(m, { interruptedNext, fragment });
1229
+ return fragment;
1230
+ }
1231
+
1232
+ /**
1233
+ * Transform AgentMessages (including custom types) to LLM-compatible Messages.
1234
+ *
1235
+ * This is used by:
1236
+ * - Agent's transormToLlm option (for prompt calls and queued messages)
1237
+ * - Compaction's generateSummary (for summarization)
1238
+ * - Custom extensions and tools
1239
+ *
1240
+ * Settled history converts once and is reused per message identity: an
1241
+ * append-only turn on the same array re-pays only the new suffix, and an
1242
+ * unchanged re-convert of the same array hands back the same outer `Message[]`.
1243
+ * Owner mutations (prune/shake/strip-images) invalidate the affected message
1244
+ * through the shared registry before the next pass.
1245
+ */
1246
+ export function convertToLlm(messages: AgentMessage[]): Message[] {
1247
+ const len = messages.length;
1248
+ const sameArray = messages === lastConvertInput && lastConvertGeneration === convertGeneration;
1249
+ const tail = len > 0 ? messages[len - 1] : undefined;
1250
+
1251
+ // Exact-repeat: same array, same length, same trailing identity → reuse the
1252
+ // outer array. The tail-identity check rejects the streaming snapshot swap
1253
+ // (partial → settled trailing keeps array identity/length but mints a fresh
1254
+ // tail), so a settled tail never reads a stale mid-stream fragment.
1255
+ if (sameArray && lastConvertOutput !== undefined && len === lastConvertLength && tail === lastConvertTail) {
1256
+ return lastConvertOutput;
1257
+ }
1258
+
1259
+ // Slice-on-growth: same array grew by append. Every interior message is
1260
+ // immutable under one array identity, so copy the unchanged prefix output
1261
+ // (messages[0 .. lastLen-1)) and reconvert only the old boundary message
1262
+ // (neighbor-sensitive: a following interrupted-thinking marker may now exist)
1263
+ // plus the appended suffix. The boundary-identity check (old tail still sits
1264
+ // at its old index) rejects an in-place interior splice-replace that grew the
1265
+ // array while swapping earlier identities, forcing a full rebuild.
1266
+ let out: Message[];
1267
+ let start: number;
1268
+ if (
1269
+ sameArray &&
1270
+ lastConvertOutput !== undefined &&
1271
+ len > lastConvertLength &&
1272
+ lastConvertLength > 0 &&
1273
+ messages[lastConvertLength - 1] === lastConvertTail &&
1274
+ lastConvertPrefixOutputLen <= lastConvertOutput.length
1275
+ ) {
1276
+ out = lastConvertOutput.slice(0, lastConvertPrefixOutputLen);
1277
+ start = lastConvertLength - 1;
1278
+ } else {
1279
+ out = [];
1280
+ start = 0;
1281
+ }
1282
+
1283
+ // Output length contributed by messages[0 .. len-1), captured when the loop
1284
+ // reaches the final index so the next growth can reuse this prefix.
1285
+ let prefixOutputLen = 0;
1286
+ for (let i = start; i < len; i++) {
1287
+ if (i === len - 1) prefixOutputLen = out.length;
1288
+ const m = messages[i];
1289
+ const interruptedNext = m.role === "assistant" && followedByInterruptedThinking(messages, i);
1290
+ const fragment = convertOneCached(m, interruptedNext);
1291
+ for (const msg of fragment) out.push(msg);
1292
+ }
1293
+ if (len === 0) prefixOutputLen = 0;
1294
+
1295
+ // Record for the next call's shortcuts. `out` is a fresh array (slice or new),
1296
+ // so a prior caller holding the previous `lastConvertOutput` never sees it grow.
1297
+ lastConvertInput = messages;
1298
+ lastConvertLength = len;
1299
+ lastConvertOutput = out;
1300
+ lastConvertGeneration = convertGeneration;
1301
+ lastConvertTail = tail;
1302
+ lastConvertPrefixOutputLen = prefixOutputLen;
1303
+ return out;
1304
+ }