@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,1385 @@
1
+ import type { Agent, AgentTool } from "@oh-my-pi/pi-agent-core";
2
+ import type { Model } from "@oh-my-pi/pi-ai";
3
+ import { isRecord, logger, prompt, stringProperty } from "@oh-my-pi/pi-utils";
4
+ import { reset as resetCapabilities } from "../capability";
5
+ import type { ModelRegistry } from "../config/model-registry";
6
+ import { formatModelString } from "../config/model-resolver";
7
+ import type { Settings, SkillsSettings } from "../config/settings";
8
+ import type { CustomTool, CustomToolContext } from "../extensibility/custom-tools/types";
9
+ import { CustomToolAdapter } from "../extensibility/custom-tools/wrapper";
10
+ import type { ExtensionRunner, SourceInfo, ToolInfo } from "../extensibility/extensions";
11
+ import { ExtensionToolWrapper } from "../extensibility/extensions/wrapper";
12
+ import { loadSkills, type Skill, type SkillWarning, setActiveSkills } from "../extensibility/skills";
13
+ import { type LocalProtocolOptions, XD_URL_PREFIX } from "../internal-urls";
14
+ import { deduplicateMCPToolsByName } from "../mcp/tool-bridge";
15
+ import { resolveMemoryBackend } from "../memory-backend/resolve";
16
+ import { MEMORY_BACKEND_TOOL_NAMES } from "../memory-backend/tool-names";
17
+ import type { MemoryBackendStartOptions } from "../memory-backend/types";
18
+ import xdevMountNoticePrompt from "../prompts/system/xdev-mount-notice.md" with { type: "text" };
19
+ import { usesCodexTaskPrompt } from "../task/prompt-policy";
20
+ import { isMCPToolName, normalizeToolNames } from "../tools/builtin-names";
21
+ import { computerExposureMode } from "../tools/computer/exposure";
22
+ import { wrapToolWithMetaNotice } from "../tools/output-meta";
23
+ import { ToolAbortError, ToolError } from "../tools/tool-errors";
24
+ import { isMountableUnderXdev, listXdevTools, type XdevState, xdevDocsFor, xdevEntries } from "../tools/xdev";
25
+ import { type EditMode, resolveEditMode } from "../utils/edit-mode";
26
+ import { type InspectImageMode, isInspectImageToolActive } from "../utils/inspect-image-mode";
27
+ import { formatLocalCalendarDate } from "../utils/local-date";
28
+ import {
29
+ extractPermissionLocations,
30
+ getPermissionIntent,
31
+ PERMISSION_OPTIONS,
32
+ PERMISSION_OPTIONS_BY_ID,
33
+ PERMISSION_REQUIRED_TOOLS,
34
+ } from "./acp-permission-gate";
35
+ import type { ClientBridge, ClientBridgePermissionOutcome } from "./client-bridge";
36
+ import type { CustomMessage } from "./messages";
37
+ import type { SessionManager } from "./session-manager";
38
+
39
+ /** Capabilities borrowed from the owning AgentSession. */
40
+ export interface SessionToolsHost {
41
+ agent: Agent;
42
+ sessionManager: SessionManager;
43
+ settings: Settings;
44
+ modelRegistry: ModelRegistry;
45
+ extensionRunner(): ExtensionRunner | undefined;
46
+ clientBridge(): ClientBridge | undefined;
47
+ agentKind(): "main" | "sub";
48
+ isDisposed(): boolean;
49
+ isStreaming(): boolean;
50
+ queuedMessageCount(): number;
51
+ planModeEnabled(): boolean;
52
+ model(): Model | undefined;
53
+ memoryBackendSession(): MemoryBackendStartOptions["session"];
54
+ clearInheritedProviderPromptCacheKey(): void;
55
+ clearMemoryPromotionSnapshot(): void;
56
+ captureMemoryPromotionSnapshot(prompt: string[]): void;
57
+ emitNotice(level: "info" | "warning" | "error", message: string, source?: string): void;
58
+ notifyCommandMetadataChanged(): void;
59
+ localProtocolOptions(): LocalProtocolOptions;
60
+ /** Session-scoped `/vision` override; undefined means "follow the persisted setting". */
61
+ getInspectImageModeOverride(): InspectImageMode | undefined;
62
+ setInspectImageModeOverride(mode: InspectImageMode | undefined): void;
63
+ }
64
+
65
+ interface SessionToolsOptions {
66
+ autoApprove?: boolean;
67
+ toolRegistry?: Map<string, AgentTool>;
68
+ createVibeTools?: () => AgentTool[];
69
+ createComputerTool?: () => Promise<AgentTool | null>;
70
+ /** Creates the built-in `inspect_image` tool for session-scoped runtime enablement (see {@link SessionTools.setInspectImageMode}). */
71
+ createInspectImageTool?: () => Promise<AgentTool | null>;
72
+ builtInToolNames?: Iterable<string>;
73
+ presentationPinnedToolNames?: ReadonlySet<string>;
74
+ ensureWriteRegistered?: () => Promise<boolean>;
75
+ rebuildSystemPrompt?: (
76
+ toolNames: string[],
77
+ tools: Map<string, AgentTool>,
78
+ ) => Promise<{ systemPrompt: string[]; xdevCatalogNames?: readonly string[] }>;
79
+ getLocalCalendarDate?: () => string;
80
+ getMcpServerInstructions?: () => Map<string, string> | undefined;
81
+ xdev?: XdevState;
82
+ setActiveToolNames?: (names: Iterable<string>) => void;
83
+ baseSystemPrompt: string[];
84
+ skills?: Skill[];
85
+ skillWarnings?: SkillWarning[];
86
+ skillsSettings?: SkillsSettings;
87
+ skillsReloadable?: boolean;
88
+ }
89
+
90
+ export interface MountedMCPToolRouteSource {
91
+ readonly name: string;
92
+ readonly mcpServerName?: unknown;
93
+ readonly mcpToolName?: unknown;
94
+ }
95
+
96
+ export interface MountedMCPToolRoute {
97
+ readonly mcpServerName: string;
98
+ readonly mcpToolName: string;
99
+ readonly name: string;
100
+ }
101
+
102
+ export interface MCPXdevGuidanceMapping extends MountedMCPToolRoute {
103
+ readonly label: string;
104
+ readonly path: string;
105
+ }
106
+
107
+ export interface MCPXdevGuidanceProjection {
108
+ readonly mappings: readonly MCPXdevGuidanceMapping[];
109
+ readonly hasOmittedMappings: boolean;
110
+ }
111
+
112
+ const MAX_MCP_XDEV_GUIDANCE_MAPPING_DATA_LENGTH = 4000;
113
+ const MAX_MCP_XDEV_GUIDANCE_MAPPINGS = 64;
114
+
115
+ /** Yield exact mounted MCP ownership and route metadata. */
116
+ export function* collectMountedMCPToolRoutes(
117
+ tools: Iterable<MountedMCPToolRouteSource>,
118
+ ): Generator<MountedMCPToolRoute> {
119
+ for (const tool of tools) {
120
+ if (typeof tool.mcpServerName !== "string" || typeof tool.mcpToolName !== "string") continue;
121
+ yield {
122
+ mcpServerName: tool.mcpServerName,
123
+ mcpToolName: tool.mcpToolName,
124
+ name: tool.name,
125
+ };
126
+ }
127
+ }
128
+
129
+ function formatMCPXdevGuidanceLabel(label: string): string {
130
+ return (JSON.stringify(label) ?? '""')
131
+ .replaceAll("`", "\\u0060")
132
+ .replaceAll("\u2028", "\\u2028")
133
+ .replaceAll("\u2029", "\\u2029");
134
+ }
135
+
136
+ /**
137
+ * Project exact live MCP routes into the bounded, Markdown-safe mapping data
138
+ * rendered by the static MCP guidance prompt.
139
+ */
140
+ export function projectMountedMCPXdevGuidance(routes: Iterable<MountedMCPToolRoute>): MCPXdevGuidanceProjection {
141
+ const mappings: MCPXdevGuidanceMapping[] = [];
142
+ let remainingMappingDataLength = MAX_MCP_XDEV_GUIDANCE_MAPPING_DATA_LENGTH;
143
+ let hasOmittedMappings = false;
144
+ for (const route of routes) {
145
+ const rawMappingDataLength = route.mcpToolName.length + XD_URL_PREFIX.length + route.name.length;
146
+ if (mappings.length >= MAX_MCP_XDEV_GUIDANCE_MAPPINGS || rawMappingDataLength > remainingMappingDataLength) {
147
+ hasOmittedMappings = true;
148
+ continue;
149
+ }
150
+ const label = formatMCPXdevGuidanceLabel(route.mcpToolName);
151
+ const path = `${XD_URL_PREFIX}${route.name}`;
152
+ const mappingDataLength = label.length + path.length;
153
+ if (mappingDataLength > remainingMappingDataLength) {
154
+ hasOmittedMappings = true;
155
+ continue;
156
+ }
157
+ mappings.push({ ...route, label, path });
158
+ remainingMappingDataLength -= mappingDataLength;
159
+ }
160
+ return { mappings, hasOmittedMappings };
161
+ }
162
+
163
+ const XDEV_MOUNT_NOTICE_MESSAGE_TYPE = "xdev-mount-notice";
164
+
165
+ /**
166
+ * Structured payload persisted on each {@link XDEV_MOUNT_NOTICE_MESSAGE_TYPE}
167
+ * custom message. Lets a resumed session reconstruct which dynamic devices the
168
+ * model has already been told about, so reconnecting hosts do not re-announce
169
+ * (and re-splice a redundant developer message that busts the provider
170
+ * prompt-cache prefix).
171
+ */
172
+ interface XdevMountNoticeDetails {
173
+ added: string[];
174
+ removed: string[];
175
+ }
176
+
177
+ /** Owns tool registration, presentation, prompt rebuilding, skills, and permissions. */
178
+ export class SessionTools {
179
+ readonly #host: SessionToolsHost;
180
+ #autoApprove: boolean;
181
+ #toolRegistry: Map<string, AgentTool>;
182
+ #createVibeTools: (() => AgentTool[]) | undefined;
183
+ #createComputerTool: SessionToolsOptions["createComputerTool"];
184
+ #createInspectImageTool: SessionToolsOptions["createInspectImageTool"];
185
+ #installedVibeToolNames = new Set<string>();
186
+ #builtInToolNames: Set<string>;
187
+ #rpcHostToolNames = new Set<string>();
188
+ #xdev: XdevState | undefined;
189
+ #pendingXdevMountDelta: { added: Set<string>; removed: Set<string> } | undefined;
190
+ /**
191
+ * Dynamic (`xd://`) devices the model has already been told are mounted.
192
+ * Seeded lazily from persisted history on resume (see
193
+ * {@link #ensureAnnouncedMountsSeeded}) and updated as notices are emitted, so
194
+ * a host reconnect that re-mounts the same device does not re-announce it.
195
+ */
196
+ #announcedMounts = new Set<string>();
197
+ #announcedMountsSeeded = false;
198
+ #presentationPinnedToolNames: ReadonlySet<string> | undefined;
199
+ #runtimeSelectedToolNames: ReadonlySet<string> | undefined;
200
+ #baseSystemPrompt: string[];
201
+ #lastAppliedToolSignature: string | undefined;
202
+ /**
203
+ * `xd://` device names the current base system prompt renders in its catalog
204
+ * (the last rebuild's {@link BuildSystemPromptResult.xdevCatalogNames}). Consulted
205
+ * when a pending mount notice is delivered: a device the outgoing prompt already
206
+ * lists is recorded as announced without a redundant notice line. Empty when the
207
+ * prompt carries no catalog (no mounts, or a custom prompt that omits the section).
208
+ */
209
+ #basePromptXdevNames: ReadonlySet<string> = new Set();
210
+ #mcpRefreshTail: Promise<void> = Promise.resolve();
211
+ #promptModelKey: string | undefined;
212
+ #rebuildSystemPrompt: SessionToolsOptions["rebuildSystemPrompt"];
213
+ #getLocalCalendarDate: () => string;
214
+ #getMcpServerInstructions: SessionToolsOptions["getMcpServerInstructions"];
215
+ #setActiveToolNames: SessionToolsOptions["setActiveToolNames"];
216
+ #ensureWriteRegistered: SessionToolsOptions["ensureWriteRegistered"];
217
+ #skills: Skill[];
218
+ #skillWarnings: SkillWarning[];
219
+ #skillsSettings: SkillsSettings | undefined;
220
+ #skillsReloadable: boolean;
221
+ #acpPermissionDecisions = new Map<string, "allow_always" | "reject_always">();
222
+
223
+ constructor(host: SessionToolsHost, options: SessionToolsOptions) {
224
+ this.#host = host;
225
+ this.#autoApprove = options.autoApprove === true;
226
+ this.#toolRegistry = options.toolRegistry ?? new Map();
227
+ this.#createVibeTools = options.createVibeTools;
228
+ this.#createComputerTool = options.createComputerTool;
229
+ this.#createInspectImageTool = options.createInspectImageTool;
230
+ this.#builtInToolNames = new Set(options.builtInToolNames ?? []);
231
+ this.#presentationPinnedToolNames = options.presentationPinnedToolNames;
232
+ this.#ensureWriteRegistered = options.ensureWriteRegistered;
233
+ this.#rebuildSystemPrompt = options.rebuildSystemPrompt;
234
+ this.#getLocalCalendarDate = options.getLocalCalendarDate ?? formatLocalCalendarDate;
235
+ this.#getMcpServerInstructions = options.getMcpServerInstructions;
236
+ this.#xdev = options.xdev;
237
+ if (this.#xdev && this.#xdev.tools !== this.#toolRegistry) {
238
+ throw new Error("xd:// state must reference the canonical session tool map");
239
+ }
240
+ if (this.#xdev) this.#xdev.decorateExecution = tool => this.#wrapToolForAcpPermission(tool);
241
+ this.#setActiveToolNames = options.setActiveToolNames;
242
+ this.#baseSystemPrompt = options.baseSystemPrompt;
243
+ this.#skills = options.skills ?? [];
244
+ this.#skillWarnings = options.skillWarnings ?? [];
245
+ this.#skillsSettings = options.skillsSettings;
246
+ this.#skillsReloadable = options.skillsReloadable ?? true;
247
+ this.#promptModelKey = this.#currentPromptModelKey();
248
+ }
249
+
250
+ /** Mutable registry shared with controller hosts that inspect available tools. */
251
+ get registry(): Map<string, AgentTool> {
252
+ return this.#toolRegistry;
253
+ }
254
+
255
+ /** Current stable base system prompt. */
256
+ get baseSystemPrompt(): string[] {
257
+ return this.#baseSystemPrompt;
258
+ }
259
+
260
+ /** Replaces the controller-owned base prompt without applying it to the agent. */
261
+ setBaseSystemPrompt(prompt: string[]): void {
262
+ this.#baseSystemPrompt = prompt;
263
+ }
264
+
265
+ /** Skills currently rendered into the system prompt. */
266
+ get skills(): Skill[] {
267
+ return this.#skills;
268
+ }
269
+
270
+ /** Diagnostics produced while loading the current skills. */
271
+ get skillWarnings(): SkillWarning[] {
272
+ return this.#skillWarnings;
273
+ }
274
+
275
+ /** Settings snapshot used for the current skill discovery. */
276
+ get skillsSettings(): SkillsSettings | undefined {
277
+ return this.#skillsSettings;
278
+ }
279
+
280
+ /** Drops cached per-session ACP `allow_always`/`reject_always` decisions. */
281
+ clearAcpPermissionDecisions(): void {
282
+ this.#acpPermissionDecisions.clear();
283
+ }
284
+
285
+ /** Drops cached ACP decisions and re-wraps active tools after the client changes. */
286
+ refreshAcpPermissionGates(): void {
287
+ this.#acpPermissionDecisions.clear();
288
+ const activeTools = this.getActiveToolNames()
289
+ .map(name => this.#toolRegistry.get(name))
290
+ .filter((tool): tool is AgentTool => tool !== undefined)
291
+ .map(tool => this.#wrapToolForAcpPermission(tool));
292
+ this.#host.agent.setTools(activeTools);
293
+ }
294
+
295
+ #getActiveNonMCPToolNames(): string[] {
296
+ return this.getEnabledToolNames().filter(name => !isMCPToolName(name) && this.#toolRegistry.has(name));
297
+ }
298
+
299
+ /** Names of tools currently exposed at the top level. */
300
+ getActiveToolNames(): string[] {
301
+ return this.#host.agent.state.tools.map(t => t.name);
302
+ }
303
+
304
+ /** Enabled top-level and discoverable tool names. */
305
+ getEnabledToolNames(): string[] {
306
+ const mountedNames = this.#xdev?.mountedNames;
307
+ if (!mountedNames || mountedNames.size === 0) return this.getActiveToolNames();
308
+ return [...this.getActiveToolNames(), ...mountedNames];
309
+ }
310
+
311
+ /** Names currently presented as `xd://` devices. */
312
+ getMountedXdevToolNames(): string[] {
313
+ return [...(this.#xdev?.mountedNames ?? [])];
314
+ }
315
+
316
+ /** Whether the edit tool is registered. */
317
+ get hasEditTool(): boolean {
318
+ return this.#toolRegistry.has("edit");
319
+ }
320
+
321
+ /** Looks up a registered tool by name. */
322
+ getToolByName(name: string): AgentTool | undefined {
323
+ return this.#toolRegistry.get(name);
324
+ }
325
+
326
+ /** Whether a registry entry came from a built-in factory. */
327
+ hasBuiltInTool(name: string): boolean {
328
+ return this.#builtInToolNames.has(name);
329
+ }
330
+
331
+ /** Names of every registered tool. */
332
+ getAllToolNames(): string[] {
333
+ return Array.from(this.#toolRegistry.keys());
334
+ }
335
+
336
+ /**
337
+ * Full metadata for every registered tool, including source provenance.
338
+ *
339
+ * Backs the `getAllTools()` ExtensionAPI method. Returns {@link ToolInfo}
340
+ * objects (not bare names) so extensions authored against upstream
341
+ * `@earendil-works/pi-coding-agent` — which promises `ToolInfo[]` — can read
342
+ * `sourceInfo.source` unchanged.
343
+ */
344
+ getAllToolInfos(): ToolInfo[] {
345
+ return Array.from(this.#toolRegistry, ([name, tool]) => {
346
+ const source = this.#builtInToolNames.has(name)
347
+ ? "builtin"
348
+ : isMCPToolName(name)
349
+ ? "mcp"
350
+ : this.#rpcHostToolNames.has(name)
351
+ ? "sdk"
352
+ : "extension";
353
+ const sourceInfo: SourceInfo = {
354
+ path: `<${source}:${name}>`,
355
+ source,
356
+ scope: "temporary",
357
+ origin: "top-level",
358
+ };
359
+ return { name, description: tool.description, parameters: tool.parameters, sourceInfo };
360
+ });
361
+ }
362
+
363
+ #wrapRuntimeTool(tool: AgentTool): AgentTool {
364
+ const wrapped = wrapToolWithMetaNotice(tool);
365
+ const extensionRunner = this.#host.extensionRunner();
366
+ return extensionRunner ? new ExtensionToolWrapper(wrapped, extensionRunner) : wrapped;
367
+ }
368
+
369
+ /** Installs and activates the ephemeral vibe tool set. */
370
+ async activateVibeTools(baseToolNames: string[]): Promise<void> {
371
+ const createVibeTools = this.#createVibeTools;
372
+ if (!createVibeTools) {
373
+ throw new Error("Vibe tools are unavailable in this session.");
374
+ }
375
+
376
+ const tools = createVibeTools();
377
+ const vibeToolNames = tools.map(tool => tool.name);
378
+ if (new Set(vibeToolNames).size !== vibeToolNames.length) {
379
+ throw new Error("Vibe tool names must be unique.");
380
+ }
381
+
382
+ for (const tool of tools) {
383
+ if (this.#toolRegistry.has(tool.name)) continue;
384
+ this.#toolRegistry.set(tool.name, this.#wrapRuntimeTool(tool));
385
+ this.#builtInToolNames.add(tool.name);
386
+ this.#installedVibeToolNames.add(tool.name);
387
+ }
388
+
389
+ await this.applyActiveToolsByName([...new Set([...baseToolNames, ...vibeToolNames])]);
390
+ }
391
+
392
+ /** Uninstalls vibe tools and activates the replacement set. */
393
+ async deactivateVibeTools(nextToolNames: string[]): Promise<void> {
394
+ this.#uninstallVibeTools();
395
+ await this.applyActiveToolsByName(nextToolNames);
396
+ }
397
+
398
+ /** Removes vibe tools without restoring a source-session snapshot. */
399
+ async removeVibeToolsPreservingActive(): Promise<void> {
400
+ const removed = new Set(this.#installedVibeToolNames);
401
+ this.#uninstallVibeTools();
402
+ const nextActive = this.getActiveToolNames().filter(name => !removed.has(name));
403
+ await this.applyActiveToolsByName(nextActive);
404
+ }
405
+
406
+ #uninstallVibeTools(): void {
407
+ for (const name of this.#installedVibeToolNames) {
408
+ this.#toolRegistry.delete(name);
409
+ this.#builtInToolNames.delete(name);
410
+ }
411
+ this.#installedVibeToolNames.clear();
412
+ }
413
+
414
+ #getEditModeSession() {
415
+ return {
416
+ settings: this.#host.settings,
417
+ getActiveModelString: () => {
418
+ const model = this.#host.model();
419
+ return model ? formatModelString(model) : undefined;
420
+ },
421
+ } as const;
422
+ }
423
+
424
+ /** Resolves the edit mode for the active model and settings. */
425
+ resolveActiveEditMode(): EditMode {
426
+ return resolveEditMode(this.#getEditModeSession());
427
+ }
428
+
429
+ #currentPromptModelKey(): string | undefined {
430
+ const activeModel = this.#host.model();
431
+ const model = activeModel ? formatModelString(activeModel) : undefined;
432
+ if (!model || this.#host.settings.get("includeModelInPrompt")) return model;
433
+ return usesCodexTaskPrompt(model) ? "task-policy:gpt-5.6" : "task-policy:default";
434
+ }
435
+
436
+ #logComputerState(message: string, enabled: boolean): void {
437
+ const model = this.#host.model();
438
+ logger.debug(message, {
439
+ enabled,
440
+ active: this.getEnabledToolNames().includes("computer"),
441
+ model: model ? formatModelString(model) : undefined,
442
+ exposure: computerExposureMode(model),
443
+ });
444
+ }
445
+
446
+ /** Rebuilds model-dependent tool prompts after a model change. */
447
+ async syncAfterModelChange(previousEditMode: EditMode): Promise<void> {
448
+ const currentEditMode = this.resolveActiveEditMode();
449
+ const editModeChanged = previousEditMode !== currentEditMode && this.getActiveToolNames().includes("edit");
450
+ // The system prompt selects model-specific policy even when it does not display the model id.
451
+ const modelChanged = this.#currentPromptModelKey() !== this.#promptModelKey;
452
+ if (editModeChanged || modelChanged) {
453
+ await this.refreshBaseSystemPrompt();
454
+ }
455
+ const computerExpected = this.#host.settings.get("computer.enabled");
456
+ const computerActive = this.getEnabledToolNames().includes("computer");
457
+ if (computerExpected && !computerActive) {
458
+ const model = this.#host.model();
459
+ const modelName = model ? formatModelString(model) : "the current model";
460
+ logger.warn("Enabled computer tool missing after model change", { model: modelName });
461
+ this.#host.emitNotice(
462
+ "warning",
463
+ `Computer use remains enabled, but the computer tool is unavailable to ${modelName}.`,
464
+ "computer",
465
+ );
466
+ } else if (computerExpected) {
467
+ this.#logComputerState("Computer tool retained after model change", true);
468
+ }
469
+
470
+ // inspect_image auto mode keys off model image capability, so a model
471
+ // switch can flip the tool either way.
472
+ await this.reconcileInspectImageAfterModelChange();
473
+ }
474
+
475
+ /** Enabled MCP tools in their current presentation partition. */
476
+ getSelectedMCPToolNames(): string[] {
477
+ // Every connected MCP tool is enabled; presentation (top-level vs xd://) is
478
+ // decided by loadMode. Return the enabled MCP tools in the current set.
479
+ return this.getEnabledToolNames().filter(name => isMCPToolName(name) && this.#toolRegistry.has(name));
480
+ }
481
+
482
+ /**
483
+ * Wrap a tool with a permission-gate proxy when an ACP client is connected.
484
+ * Only wraps tools whose name is in PERMISSION_REQUIRED_TOOLS and only when
485
+ * the bridge exposes `requestPermission`. No-ops for all other cases.
486
+ *
487
+ * When the user has explicitly opted into `yolo` / auto-approve behavior (via
488
+ * the SDK/CLI `autoApprove` flag or a configured `tools.approvalMode: yolo`),
489
+ * skips the gate unless the per-tool policy explicitly requires a prompt or
490
+ * deny. The schema default is also `yolo`, so an explicit configuration or
491
+ * explicit session flag is required: default-config ACP sessions keep the
492
+ * client-side permission gate.
493
+ */
494
+ #wrapToolForAcpPermission<T extends AgentTool>(tool: T): T {
495
+ const bridge = this.#host.clientBridge();
496
+ // Match the capability+method gating pattern used by read/write/bash.
497
+ if (!bridge?.capabilities.requestPermission || !bridge.requestPermission) return tool;
498
+ if (PERMISSION_REQUIRED_TOOLS[tool.name] !== true) return tool;
499
+ // Skip the gate only on explicit yolo opt-in; honour per-tool policies
500
+ // that require a prompt or deny (matching the normal approval wrapper).
501
+ if (this.#isExplicitAutoApproveMode()) {
502
+ const userPolicies = (this.#host.settings.get("tools.approval") ?? {}) as Record<string, unknown>;
503
+ const toolPolicy = userPolicies[tool.name];
504
+ if (!toolPolicy || toolPolicy === "allow") return tool;
505
+ }
506
+ return new Proxy(tool, {
507
+ get: (target, prop) => {
508
+ if (prop !== "execute") return target[prop as keyof T];
509
+ return async (
510
+ toolCallId: string,
511
+ args: unknown,
512
+ signal: AbortSignal | undefined,
513
+ onUpdate: never,
514
+ ctx: never,
515
+ ) => {
516
+ const permissionIntent = getPermissionIntent(target.name, args);
517
+ if (!permissionIntent) {
518
+ return await target.execute(toolCallId, args as never, signal, onUpdate, ctx);
519
+ }
520
+ const command =
521
+ target.name === "bash" && args && typeof args === "object" && !Array.isArray(args)
522
+ ? stringProperty(args, "command")
523
+ : undefined;
524
+ const commandContent = command
525
+ ? [{ type: "content" as const, content: { type: "text" as const, text: `$ ${command}` } }]
526
+ : undefined;
527
+ // Short-circuit on persisted decisions.
528
+ const persisted = this.#acpPermissionDecisions.get(permissionIntent.cacheKey);
529
+ if (persisted === "allow_always") {
530
+ return await target.execute(toolCallId, args as never, signal, onUpdate, ctx);
531
+ }
532
+ if (persisted === "reject_always") {
533
+ throw new ToolError(`Tool call rejected by user (preference)`);
534
+ }
535
+ if (signal?.aborted) {
536
+ throw new ToolAbortError("Permission request cancelled");
537
+ }
538
+ type PermissionRaceResult =
539
+ | { kind: "permission"; outcome: ClientBridgePermissionOutcome }
540
+ | { kind: "aborted" };
541
+ const { promise: abortPromise, resolve: resolveAbort } = Promise.withResolvers<PermissionRaceResult>();
542
+ const onAbort = () => resolveAbort({ kind: "aborted" });
543
+ signal?.addEventListener("abort", onAbort, { once: true });
544
+ let raced: PermissionRaceResult;
545
+ try {
546
+ const permissionPromise = bridge.requestPermission!(
547
+ {
548
+ toolCallId,
549
+ toolName: target.name,
550
+ title: permissionIntent.title,
551
+ ...(target.name === "bash" ? { kind: "execute" } : {}),
552
+ status: "pending",
553
+ rawInput: args,
554
+ ...(commandContent ? { content: commandContent } : {}),
555
+ locations: extractPermissionLocations(
556
+ args,
557
+ this.#host.sessionManager.getCwd(),
558
+ permissionIntent.paths,
559
+ ),
560
+ },
561
+ PERMISSION_OPTIONS,
562
+ signal,
563
+ ).then(outcome => ({ kind: "permission" as const, outcome }));
564
+ raced = await Promise.race([permissionPromise, abortPromise]);
565
+ } finally {
566
+ signal?.removeEventListener("abort", onAbort);
567
+ }
568
+ if (raced.kind === "aborted" || signal?.aborted) {
569
+ throw new ToolAbortError("Permission request cancelled");
570
+ }
571
+ const outcome = raced.outcome;
572
+ if (outcome.outcome === "cancelled") {
573
+ throw new ToolAbortError("Permission request cancelled");
574
+ }
575
+ const selectedOption = PERMISSION_OPTIONS_BY_ID.get(outcome.optionId);
576
+ if (!selectedOption) {
577
+ throw new ToolError(`Tool permission response used unknown option ID: ${outcome.optionId}`);
578
+ }
579
+ if (selectedOption.kind === "allow_always") {
580
+ this.#acpPermissionDecisions.set(permissionIntent.cacheKey, "allow_always");
581
+ } else if (selectedOption.kind === "reject_always") {
582
+ this.#acpPermissionDecisions.set(permissionIntent.cacheKey, "reject_always");
583
+ }
584
+ if (selectedOption.kind === "reject_once" || selectedOption.kind === "reject_always") {
585
+ throw new ToolError(`Tool call rejected by user (${target.name})`);
586
+ }
587
+ return await target.execute(toolCallId, args as never, signal, onUpdate, ctx);
588
+ };
589
+ },
590
+ }) as T;
591
+ }
592
+
593
+ #isExplicitAutoApproveMode(): boolean {
594
+ return (
595
+ this.#autoApprove ||
596
+ (this.#host.settings.isConfigured("tools.approvalMode") &&
597
+ this.#host.settings.get("tools.approvalMode") === "yolo")
598
+ );
599
+ }
600
+
601
+ /** Applies an enabled tool set and reconciles its `xd://` partition. */
602
+ async applyActiveToolsByName(toolNames: string[]): Promise<void> {
603
+ toolNames = normalizeToolNames(toolNames);
604
+ let builtInWriteAvailable = this.#builtInToolNames.has("write");
605
+ if (toolNames.includes("write") && !builtInWriteAvailable) {
606
+ builtInWriteAvailable = (await this.#ensureWriteRegistered?.()) === true;
607
+ if (builtInWriteAvailable) this.#builtInToolNames.add("write");
608
+ }
609
+ const selectedTools = toolNames.flatMap(name => {
610
+ const tool = this.#toolRegistry.get(name);
611
+ return tool ? [{ name, tool }] : [];
612
+ });
613
+ const xdevReadAvailable = this.#builtInToolNames.has("read") && selectedTools.some(({ name }) => name === "read");
614
+ const xdevWriteAvailable = builtInWriteAvailable && selectedTools.some(({ name }) => name === "write");
615
+ const isPresentationPinned = (name: string): boolean =>
616
+ this.#presentationPinnedToolNames?.has(name) === true || this.#runtimeSelectedToolNames?.has(name) === true;
617
+ const mountCandidates = selectedTools.filter(
618
+ ({ name, tool }) =>
619
+ this.#xdev !== undefined &&
620
+ xdevReadAvailable &&
621
+ xdevWriteAvailable &&
622
+ !isPresentationPinned(name) &&
623
+ isMountableUnderXdev(tool),
624
+ );
625
+ const mountNames = new Set(mountCandidates.map(({ name }) => name));
626
+ const tools: AgentTool[] = [];
627
+ const validToolNames: string[] = [];
628
+ for (const { name, tool } of selectedTools) {
629
+ if (mountNames.has(name)) continue;
630
+ tools.push(this.#wrapToolForAcpPermission(tool));
631
+ validToolNames.push(name);
632
+ }
633
+
634
+ const pinnedWrite = isPresentationPinned("write");
635
+ const activeDeferrableTool = tools.some(tool => tool.deferrable === true);
636
+ const transportNeeded = mountNames.size > 0 || activeDeferrableTool || this.#host.planModeEnabled();
637
+ if (transportNeeded && !builtInWriteAvailable) {
638
+ builtInWriteAvailable = (await this.#ensureWriteRegistered?.()) === true;
639
+ if (builtInWriteAvailable) this.#builtInToolNames.add("write");
640
+ }
641
+ if (transportNeeded && builtInWriteAvailable) {
642
+ const write = this.#toolRegistry.get("write");
643
+ if (write && !validToolNames.includes("write")) {
644
+ tools.push(this.#wrapToolForAcpPermission(write));
645
+ validToolNames.push("write");
646
+ }
647
+ } else if (
648
+ !pinnedWrite &&
649
+ (this.#presentationPinnedToolNames !== undefined || this.#runtimeSelectedToolNames !== undefined)
650
+ ) {
651
+ const writeNameIndex = validToolNames.indexOf("write");
652
+ if (writeNameIndex >= 0 && this.#builtInToolNames.has("write")) validToolNames.splice(writeNameIndex, 1);
653
+ const writeToolIndex = tools.findIndex(tool => tool.name === "write" && this.#builtInToolNames.has("write"));
654
+ if (writeToolIndex >= 0) tools.splice(writeToolIndex, 1);
655
+ }
656
+
657
+ const previousMounted = new Set(this.#xdev?.mountedNames ?? []);
658
+ const previousActiveToolNames = this.getActiveToolNames();
659
+ this.#setMountedNames(mountNames);
660
+ this.#setActiveToolNames?.(validToolNames);
661
+
662
+ let rebuiltSystemPrompt: string[] | undefined;
663
+ let rebuiltSignature: string | undefined;
664
+ let rebuiltXdevCatalogNames: readonly string[] | undefined;
665
+ try {
666
+ if (this.#rebuildSystemPrompt) {
667
+ const signature = this.#computeAppliedToolSignature(validToolNames, tools);
668
+ if (signature !== this.#lastAppliedToolSignature) {
669
+ const built = await this.#rebuildSystemPrompt(validToolNames, this.#toolRegistry);
670
+ rebuiltSystemPrompt = built.systemPrompt;
671
+ rebuiltSignature = signature;
672
+ rebuiltXdevCatalogNames = built.xdevCatalogNames;
673
+ }
674
+ }
675
+ } catch (error) {
676
+ this.#setMountedNames(previousMounted);
677
+ this.#setActiveToolNames?.(previousActiveToolNames);
678
+ throw error;
679
+ }
680
+
681
+ if (this.#host.isDisposed()) {
682
+ this.#setMountedNames(previousMounted);
683
+ this.#setActiveToolNames?.(previousActiveToolNames);
684
+ return;
685
+ }
686
+
687
+ this.#notifyXdevMountDelta(previousMounted);
688
+ this.#host.agent.setTools(tools);
689
+ if (rebuiltSystemPrompt && rebuiltSignature) {
690
+ if (this.#lastAppliedToolSignature !== undefined) this.#host.clearInheritedProviderPromptCacheKey();
691
+ this.#baseSystemPrompt = rebuiltSystemPrompt;
692
+ this.#host.clearMemoryPromotionSnapshot();
693
+ this.#host.agent.setSystemPrompt(this.#baseSystemPrompt);
694
+ this.#lastAppliedToolSignature = rebuiltSignature;
695
+ this.#promptModelKey = this.#currentPromptModelKey();
696
+ this.#basePromptXdevNames = new Set(rebuiltXdevCatalogNames);
697
+ }
698
+ }
699
+
700
+ #setMountedNames(names: Iterable<string>): void {
701
+ const mountedNames = this.#xdev?.mountedNames;
702
+ if (!mountedNames) return;
703
+ mountedNames.clear();
704
+ for (const name of names) mountedNames.add(name);
705
+ }
706
+
707
+ /**
708
+ * Record a mid-session `xd://` mount delta for the model. Non-MCP mount
709
+ * churn remains notice-only, leaving the system prompt and provider cache
710
+ * prefix byte-stable; mounted MCP route changes additionally rebuild the
711
+ * global route guidance through the applied-tool signature. The delta is NOT
712
+ * steered immediately — a steered notice landing at a run's stop boundary
713
+ * (or while the session is idle) forces an unsolicited extra assistant turn
714
+ * — so it is coalesced into {@link #pendingXdevMountDelta} and rides along
715
+ * with the next prompt (docs + schema stay one `read xd://<tool>` away).
716
+ * Full docs join the system prompt opportunistically on a rebuild.
717
+ */
718
+ #notifyXdevMountDelta(previousMounted: ReadonlySet<string>): void {
719
+ const current = this.#xdev?.mountedNames;
720
+ if (!current) return;
721
+ const addedNames = [...current].filter(name => !previousMounted.has(name));
722
+ const removedNames = [...previousMounted].filter(name => !current.has(name));
723
+ if (addedNames.length === 0 && removedNames.length === 0) return;
724
+ // Coalesce against the unannounced delta: an unmount cancels a pending
725
+ // mount the model never learned about, and a remount cancels a pending
726
+ // unmount.
727
+ const pending = this.#pendingXdevMountDelta ?? { added: new Set<string>(), removed: new Set<string>() };
728
+ for (const name of addedNames) {
729
+ if (!pending.removed.delete(name)) pending.added.add(name);
730
+ }
731
+ for (const name of removedNames) {
732
+ if (!pending.added.delete(name)) pending.removed.add(name);
733
+ }
734
+ this.#pendingXdevMountDelta = pending.added.size > 0 || pending.removed.size > 0 ? pending : undefined;
735
+ if (this.#host.settings.get("startup.quiet")) return;
736
+ const parts: string[] = [];
737
+ if (addedNames.length > 0) parts.push(`mounted ${addedNames.join(", ")}`);
738
+ if (removedNames.length > 0) parts.push(`unmounted ${removedNames.join(", ")}`);
739
+ this.#host.emitNotice("info", `xd://: ${parts.join("; ")}`, "xdev");
740
+ }
741
+
742
+ /**
743
+ * Forget the announced-mount baseline for a replaced transcript. Called when
744
+ * session history is swapped wholesale (`/new`, `switchSession`, `branch`): the
745
+ * previous transcript's persisted notices no longer apply, so the next notice
746
+ * re-seeds from the new history and a device reconnecting into it announces
747
+ * again.
748
+ *
749
+ * The pending delta is deliberately preserved: it holds mounts that are still
750
+ * live but not yet delivered to the model, and `branch()` does not rebuild the
751
+ * base system prompt, so dropping it would leave the branched transcript
752
+ * unaware of a still-mounted device that no later refresh would re-queue.
753
+ */
754
+ resetAnnouncedMounts(): void {
755
+ this.#announcedMounts.clear();
756
+ this.#announcedMountsSeeded = false;
757
+ }
758
+
759
+ /**
760
+ * Seed {@link #announcedMounts} from persisted mount notices the first time a
761
+ * notice is consumed. On resume the in-memory mount set is rebuilt from
762
+ * scratch, so without replaying history every already-announced dynamic device
763
+ * would look freshly mounted and re-announce.
764
+ */
765
+ #ensureAnnouncedMountsSeeded(): void {
766
+ if (this.#announcedMountsSeeded) return;
767
+ this.#announcedMountsSeeded = true;
768
+ for (const message of this.#host.agent.state.messages) {
769
+ if (message.role !== "custom" || message.customType !== XDEV_MOUNT_NOTICE_MESSAGE_TYPE) continue;
770
+ const details = message.details;
771
+ if (
772
+ isRecord(details) &&
773
+ Array.isArray(details.added) &&
774
+ details.added.every(name => typeof name === "string") &&
775
+ Array.isArray(details.removed) &&
776
+ details.removed.every(name => typeof name === "string")
777
+ ) {
778
+ for (const name of details.added) this.#announcedMounts.add(name);
779
+ for (const name of details.removed) this.#announcedMounts.delete(name);
780
+ continue;
781
+ }
782
+
783
+ // Releases before structured notice details persisted only the rendered
784
+ // prompt. Replay its two stable inventory sections so the first resume
785
+ // after upgrading does not re-announce every dynamic device once.
786
+ if (typeof message.content !== "string") continue;
787
+ let section: "added" | "removed" | undefined;
788
+ for (const line of message.content.split("\n")) {
789
+ if (line === "These tools became available:") {
790
+ section = "added";
791
+ continue;
792
+ }
793
+ if (line.startsWith("No longer mounted")) {
794
+ section = "removed";
795
+ continue;
796
+ }
797
+ if (line === "Configured inline device docs:" || line === "</system-notice>") break;
798
+ if (line.startsWith("Read `xd://<tool>`")) {
799
+ section = undefined;
800
+ continue;
801
+ }
802
+ if (!section) continue;
803
+ const match = /^- xd:\/\/(\S+?)(?:\s+—|$)/.exec(line);
804
+ const name = match?.[1];
805
+ if (!name) continue;
806
+ if (section === "added") this.#announcedMounts.add(name);
807
+ else this.#announcedMounts.delete(name);
808
+ }
809
+ }
810
+ }
811
+
812
+ /** Consumes the hidden notice for unannounced `xd://` mount changes. */
813
+ takePendingXdevMountNotice(baseCatalogDelivered: boolean): CustomMessage<XdevMountNoticeDetails> | undefined {
814
+ const pending = this.#pendingXdevMountDelta;
815
+ if (!pending) return undefined;
816
+ this.#pendingXdevMountDelta = undefined;
817
+ this.#ensureAnnouncedMountsSeeded();
818
+ // A pending add for a device the outgoing base prompt already lists in its
819
+ // catalog needs no notice line — but only when the final provider prompt
820
+ // still carries that base catalog. A `before_agent_start` replacement drops
821
+ // it, so its additions must remain in the notice. Record prompt-carried
822
+ // devices announced here, after the final prompt is known and immediately
823
+ // before delivery. The pending delta remains untouched by rebuilds, letting
824
+ // {@link #notifyXdevMountDelta} cancel a mount followed by an unmount before
825
+ // any request is sent (issue #7139 reviews).
826
+ if (baseCatalogDelivered) {
827
+ for (const name of pending.added) {
828
+ if (this.#basePromptXdevNames.has(name)) this.#announcedMounts.add(name);
829
+ }
830
+ }
831
+ // Only announce a net change relative to what the model already knows (from
832
+ // this session and persisted history): a re-mount of an already-announced
833
+ // device — the common resume/reconnect case — and an unmount for a device
834
+ // it was never told about are both suppressed, keeping the provider prompt
835
+ // cache prefix byte-stable across resumes.
836
+ const addedNames = [...pending.added].filter(name => !this.#announcedMounts.has(name));
837
+ const removedNames = [...pending.removed].filter(name => this.#announcedMounts.has(name));
838
+ if (addedNames.length === 0 && removedNames.length === 0) return undefined;
839
+ const summaries = new Map(this.#xdev ? xdevEntries(this.#xdev).map(entry => [entry.name, entry.summary]) : []);
840
+ const added = addedNames.map(name => ({ name, summary: summaries.get(name) ?? "" }));
841
+ const removed = removedNames.map(name => ({ name }));
842
+ const docs = this.#xdev
843
+ ? xdevDocsFor(
844
+ this.#xdev,
845
+ new Set(addedNames),
846
+ this.#host.settings.get("tools.xdevDocs"),
847
+ this.#host.settings.get("tools.xdevInlineDevices"),
848
+ )
849
+ : "";
850
+ for (const name of addedNames) this.#announcedMounts.add(name);
851
+ for (const name of removedNames) this.#announcedMounts.delete(name);
852
+ return {
853
+ role: "custom",
854
+ customType: XDEV_MOUNT_NOTICE_MESSAGE_TYPE,
855
+ content: prompt.render(xdevMountNoticePrompt, { added, removed, docs }),
856
+ details: { added: addedNames, removed: removedNames },
857
+ attribution: "agent",
858
+ display: false,
859
+ timestamp: Date.now(),
860
+ };
861
+ }
862
+
863
+ /** Rediscovers reloadable skills and refreshes prompt metadata. */
864
+ async refreshSkills(): Promise<void> {
865
+ resetCapabilities();
866
+ if (this.#skillsReloadable) {
867
+ const skillsSettings = this.#host.settings.getGroup("skills");
868
+ const discovered = await loadSkills({
869
+ ...skillsSettings,
870
+ cwd: this.#host.sessionManager.getCwd(),
871
+ disabledExtensions: this.#host.settings.get("disabledExtensions") ?? [],
872
+ });
873
+ this.#skills = discovered.skills;
874
+ this.#skillWarnings = discovered.warnings;
875
+ this.#skillsSettings = skillsSettings;
876
+
877
+ if (this.#host.agentKind() === "main") {
878
+ setActiveSkills(this.#skills);
879
+ }
880
+ }
881
+ await this.refreshBaseSystemPrompt();
882
+ this.#host.notifyCommandMetadataChanged();
883
+ }
884
+
885
+ /** Selects enabled tools, ignoring names absent from the registry. */
886
+ async setActiveToolsByName(toolNames: string[]): Promise<void> {
887
+ const normalized = normalizeToolNames(toolNames);
888
+ // Transport-write eligibility keys off the *current* active set: an ordinary
889
+ // selection change should not demote `write` unless it is already active.
890
+ await this.#applyToolPresentation(
891
+ normalized,
892
+ this.#xdev?.mountedNames ?? new Set(),
893
+ this.getActiveToolNames().includes("write"),
894
+ );
895
+ }
896
+
897
+ /**
898
+ * Restore an enabled tool set with its exact top-level versus `xd://` partition.
899
+ *
900
+ * Both inputs are required because {@link setActiveToolsByName} only receives the
901
+ * enabled name list and classifies mounts from the current presentation set.
902
+ * Rollback/restore callers must pass the snapshotted mounted subset so names that
903
+ * were top-level stay pinned (`#runtimeSelectedToolNames`) and names that were under
904
+ * `xd://` remain mount-eligible, even when the live mount set has drifted.
905
+ *
906
+ * Names outside `mountedToolNames` are pinned top-level for this application;
907
+ * names in the mounted subset remain eligible for xdev mounting. Delegates the
908
+ * actual apply through {@link applyActiveToolsByName} and restores the prior runtime
909
+ * selection if that apply throws.
910
+ */
911
+ async setActiveToolPresentation(toolNames: string[], mountedToolNames: string[]): Promise<void> {
912
+ const normalized = normalizeToolNames(toolNames);
913
+ // Restoration targets a snapshot, so write eligibility comes from the
914
+ // *target* set rather than whatever happens to be active mid-rollback.
915
+ await this.#applyToolPresentation(
916
+ normalized,
917
+ new Set(normalizeToolNames(mountedToolNames)),
918
+ normalized.includes("write"),
919
+ );
920
+ }
921
+
922
+ /**
923
+ * Shared body for {@link setActiveToolsByName} and {@link setActiveToolPresentation}:
924
+ * pins non-mounted names as the runtime selection (holding `write` back when it is
925
+ * transport-only) and applies the set, rolling the selection back if apply throws.
926
+ */
927
+ async #applyToolPresentation(
928
+ normalized: string[],
929
+ mounted: ReadonlySet<string>,
930
+ writeSelected: boolean,
931
+ ): Promise<void> {
932
+ const transportWriteActive =
933
+ writeSelected &&
934
+ this.#builtInToolNames.has("write") &&
935
+ this.#presentationPinnedToolNames?.has("write") !== true &&
936
+ this.#runtimeSelectedToolNames?.has("write") !== true &&
937
+ (mounted.size > 0 || this.#host.planModeEnabled());
938
+ const previousRuntimeSelectedToolNames = this.#runtimeSelectedToolNames;
939
+ this.#runtimeSelectedToolNames = new Set(
940
+ normalized.filter(name => !mounted.has(name) && !(name === "write" && transportWriteActive)),
941
+ );
942
+ try {
943
+ await this.applyActiveToolsByName(normalized);
944
+ } catch (error) {
945
+ this.#runtimeSelectedToolNames = previousRuntimeSelectedToolNames;
946
+ throw error;
947
+ }
948
+ }
949
+
950
+ /** Replaces memory-backend tools while preserving unrelated selections. */
951
+ async replaceMemoryTools(tools: AgentTool[]): Promise<void> {
952
+ const removed = new Set<string>(MEMORY_BACKEND_TOOL_NAMES.filter(name => this.#builtInToolNames.has(name)));
953
+ const nextActive = this.getEnabledToolNames().filter(name => !removed.has(name));
954
+ for (const name of removed) {
955
+ this.#toolRegistry.delete(name);
956
+ this.#builtInToolNames.delete(name);
957
+ }
958
+
959
+ for (const tool of tools) {
960
+ if (!MEMORY_BACKEND_TOOL_NAMES.some(name => name === tool.name) || this.#toolRegistry.has(tool.name)) {
961
+ continue;
962
+ }
963
+ const wrapped = this.#wrapRuntimeTool(tool);
964
+ this.#toolRegistry.set(wrapped.name, wrapped);
965
+ this.#builtInToolNames.add(wrapped.name);
966
+ nextActive.push(wrapped.name);
967
+ }
968
+ await this.applyActiveToolsByName([...new Set(nextActive)]);
969
+ }
970
+
971
+ /**
972
+ * Session-scoped enable/disable for the settings-gated `computer` tool.
973
+ *
974
+ * `createTools` derives the built-in slate once at session start, so a runtime
975
+ * `computer.enabled` override alone never changes the active tools. Enabling
976
+ * builds the tool through the config factory on first use (later toggles reuse
977
+ * the registry entry, so only one desktop controller is ever registered) and
978
+ * activates it; disabling drops it from the active set while keeping the
979
+ * registry entry. Takes effect before the next model call.
980
+ *
981
+ * @returns false when enabling was requested but this session cannot build the
982
+ * tool (e.g. restricted child sessions have no factory).
983
+ */
984
+ async setComputerToolEnabled(enabled: boolean): Promise<boolean> {
985
+ const logState = (): void => this.#logComputerState("Computer tool state changed", enabled);
986
+ const active = this.getEnabledToolNames();
987
+ if (!enabled) {
988
+ if (active.includes("computer")) {
989
+ await this.applyActiveToolsByName(active.filter(name => name !== "computer"));
990
+ }
991
+ logState();
992
+ return true;
993
+ }
994
+ if (!this.#toolRegistry.has("computer")) {
995
+ const tool = await this.#createComputerTool?.();
996
+ if (tool?.name !== "computer") {
997
+ const model = this.#host.model();
998
+ logger.warn("Computer tool could not be created", {
999
+ model: model ? formatModelString(model) : undefined,
1000
+ });
1001
+ return false;
1002
+ }
1003
+ const wrapped = this.#wrapRuntimeTool(tool);
1004
+ this.#toolRegistry.set(wrapped.name, wrapped);
1005
+ this.#builtInToolNames.add(wrapped.name);
1006
+ }
1007
+ if (!active.includes("computer")) {
1008
+ await this.applyActiveToolsByName([...active, "computer"]);
1009
+ }
1010
+ logState();
1011
+ return true;
1012
+ }
1013
+
1014
+ /** Current effective inspect_image state for `/vision status`. */
1015
+ inspectImageState(): { mode: InspectImageMode; active: boolean; model: string | undefined } {
1016
+ const model = this.#host.model();
1017
+ return {
1018
+ mode: this.#host.getInspectImageModeOverride() ?? this.#host.settings.get("inspect_image.mode"),
1019
+ active: this.getEnabledToolNames().includes("inspect_image"),
1020
+ model: model ? formatModelString(model) : undefined,
1021
+ };
1022
+ }
1023
+
1024
+ /**
1025
+ * Brings the active tool set in line with the effective inspect_image state
1026
+ * (mode setting, `/vision` override, active-model image capability).
1027
+ * Mirrors {@link setComputerToolEnabled}: enabling builds the tool through
1028
+ * the config factory on first use and reuses the registry entry afterwards.
1029
+ * Idempotent — safe to call from every model/settings change path.
1030
+ *
1031
+ * @returns false when the tool should be active but this session cannot
1032
+ * build it (e.g. restricted child sessions have no factory).
1033
+ */
1034
+ async reconcileInspectImageTool(): Promise<boolean> {
1035
+ const expected = isInspectImageToolActive({
1036
+ settings: this.#host.settings,
1037
+ getActiveModel: () => this.#host.model(),
1038
+ getInspectImageModeOverride: () => this.#host.getInspectImageModeOverride(),
1039
+ });
1040
+ // Keep the read tool's advertised description in sync BEFORE any prompt
1041
+ // rebuild below, passing the post-change availability so the prompt never
1042
+ // lags a flip in either direction. Per-read lazy sync is the backstop.
1043
+ const syncReadDescription = (available: boolean): void => {
1044
+ const readTool = this.#toolRegistry.get("read") as
1045
+ | { syncInspectImageState?: (available?: boolean) => boolean }
1046
+ | undefined;
1047
+ readTool?.syncInspectImageState?.(available);
1048
+ };
1049
+ const active = this.getEnabledToolNames();
1050
+ const isActive = active.includes("inspect_image");
1051
+ if (expected === isActive) {
1052
+ syncReadDescription(isActive);
1053
+ return true;
1054
+ }
1055
+ if (!expected) {
1056
+ syncReadDescription(false);
1057
+ await this.applyActiveToolsByName(active.filter(name => name !== "inspect_image"));
1058
+ return true;
1059
+ }
1060
+ if (!this.#toolRegistry.has("inspect_image")) {
1061
+ const tool = await this.#createInspectImageTool?.();
1062
+ if (tool?.name !== "inspect_image") {
1063
+ logger.warn("inspect_image tool could not be created", {
1064
+ model: this.#host.model()?.id,
1065
+ });
1066
+ syncReadDescription(false);
1067
+ return false;
1068
+ }
1069
+ const wrapped = this.#wrapRuntimeTool(tool);
1070
+ this.#toolRegistry.set(wrapped.name, wrapped);
1071
+ this.#builtInToolNames.add(wrapped.name);
1072
+ }
1073
+ syncReadDescription(true);
1074
+ await this.applyActiveToolsByName([...active, "inspect_image"]);
1075
+ return true;
1076
+ }
1077
+
1078
+ /**
1079
+ * Reconciles inspect_image after a model change and surfaces a notice when
1080
+ * the visible tool set actually flipped. Called from every model-change
1081
+ * path — including retry-fallback switches that bypass
1082
+ * {@link syncAfterModelChange}.
1083
+ */
1084
+ async reconcileInspectImageAfterModelChange(): Promise<void> {
1085
+ const before = this.getEnabledToolNames().includes("inspect_image");
1086
+ const reconciled = await this.reconcileInspectImageTool();
1087
+ const after = this.getEnabledToolNames().includes("inspect_image");
1088
+ if (!reconciled || before === after) return;
1089
+ const model = this.#host.model();
1090
+ const modelName = model ? formatModelString(model) : "the current model";
1091
+ this.#host.emitNotice(
1092
+ "info",
1093
+ after
1094
+ ? `inspect_image is now available: ${modelName} has no native image input.`
1095
+ : `inspect_image is now hidden: ${modelName} supports image input natively. Override with /vision on.`,
1096
+ "vision",
1097
+ );
1098
+ }
1099
+
1100
+ /**
1101
+ * Session-scoped `/vision` override. `auto` clears the override so the
1102
+ * persisted `inspect_image.mode` setting (itself possibly `auto`) decides;
1103
+ * `on`/`off` force the tool for this session only. Takes effect before the
1104
+ * next model call.
1105
+ *
1106
+ * @returns false when `on` was requested but the tool cannot be built here.
1107
+ */
1108
+ async setInspectImageMode(mode: InspectImageMode): Promise<boolean> {
1109
+ this.#host.setInspectImageModeOverride(mode === "auto" ? undefined : mode);
1110
+ const applied = await this.reconcileInspectImageTool();
1111
+ const { active, model } = this.inspectImageState();
1112
+ logger.debug("inspect_image mode changed", { mode, active, model });
1113
+ return applied;
1114
+ }
1115
+
1116
+ /** Rebuilds the stable base prompt for the current tools and model. */
1117
+ async refreshBaseSystemPrompt(): Promise<void> {
1118
+ if (this.#host.isDisposed() || !this.#rebuildSystemPrompt) return;
1119
+ const activeToolNames = this.getActiveToolNames();
1120
+ this.#setActiveToolNames?.(activeToolNames);
1121
+ const previousBaseSystemPrompt = this.#baseSystemPrompt;
1122
+ const built = await this.#rebuildSystemPrompt(activeToolNames, this.#toolRegistry);
1123
+ if (this.#host.isDisposed()) return;
1124
+ this.#baseSystemPrompt = built.systemPrompt;
1125
+ this.#basePromptXdevNames = new Set(built.xdevCatalogNames);
1126
+ this.#host.clearMemoryPromotionSnapshot();
1127
+ if (
1128
+ previousBaseSystemPrompt.length !== this.#baseSystemPrompt.length ||
1129
+ previousBaseSystemPrompt.some((part, index) => part !== this.#baseSystemPrompt[index])
1130
+ ) {
1131
+ this.#host.clearInheritedProviderPromptCacheKey();
1132
+ }
1133
+ this.#host.agent.setSystemPrompt(this.#baseSystemPrompt);
1134
+ this.#promptModelKey = this.#currentPromptModelKey();
1135
+ // Refresh the cached signature so a subsequent `applyActiveToolsByName` with
1136
+ // the same tool set does not re-rebuild on top of the explicit refresh we
1137
+ // just performed (and conversely, a different set forces a fresh rebuild).
1138
+ const activeTools = activeToolNames
1139
+ .map(name => this.#toolRegistry.get(name))
1140
+ .filter((tool): tool is AgentTool => tool != null);
1141
+ this.#lastAppliedToolSignature = this.#computeAppliedToolSignature(activeToolNames, activeTools);
1142
+ }
1143
+
1144
+ /** Applies one-turn memory prompt injection before an agent run. */
1145
+ async buildSystemPromptForAgentStart(promptText: string): Promise<string[]> {
1146
+ const backend = await resolveMemoryBackend(this.#host.settings);
1147
+ if (!backend.beforeAgentStartPrompt) return this.#baseSystemPrompt;
1148
+
1149
+ try {
1150
+ const injected = await backend.beforeAgentStartPrompt(this.#host.memoryBackendSession(), promptText);
1151
+ if (!injected) return this.#baseSystemPrompt;
1152
+
1153
+ const previousBaseSystemPrompt = this.#baseSystemPrompt;
1154
+ try {
1155
+ await this.refreshBaseSystemPrompt();
1156
+ } catch (refreshErr) {
1157
+ logger.debug("Memory backend prompt refresh after beforeAgentStartPrompt failed", {
1158
+ backend: backend.id,
1159
+ error: String(refreshErr),
1160
+ });
1161
+ }
1162
+
1163
+ if (
1164
+ this.#baseSystemPrompt.length !== previousBaseSystemPrompt.length ||
1165
+ this.#baseSystemPrompt.some((part, index) => part !== previousBaseSystemPrompt[index])
1166
+ ) {
1167
+ return this.#baseSystemPrompt;
1168
+ }
1169
+
1170
+ this.#host.captureMemoryPromotionSnapshot(previousBaseSystemPrompt);
1171
+ const stablePrompt = [...previousBaseSystemPrompt, injected];
1172
+ this.#baseSystemPrompt = stablePrompt;
1173
+ this.#host.agent.setSystemPrompt(stablePrompt);
1174
+ return stablePrompt;
1175
+ } catch (err) {
1176
+ logger.debug("Memory backend beforeAgentStartPrompt failed", {
1177
+ backend: backend.id,
1178
+ error: String(err),
1179
+ });
1180
+ return this.#baseSystemPrompt;
1181
+ }
1182
+ }
1183
+
1184
+ /**
1185
+ * Compose a stable signature for the inputs that `rebuildSystemPrompt` reads.
1186
+ * Two calls producing identical signatures are guaranteed to produce identical
1187
+ * system prompt bytes, so the rebuild can be skipped.
1188
+ *
1189
+ * The signature covers:
1190
+ * 1. Active tool names in order (the prompt renders them in this order).
1191
+ * 2. Active tool labels, descriptions, and wire-visible names — all are
1192
+ * rendered into the prompt body (see `system-prompt.md` `{{label}}: \`{{name}}\``
1193
+ * and `toolPromptNames` in `buildSystemPrompt`). The wire name comes from
1194
+ * `tool.customWireName` and overrides the internal name on the model wire
1195
+ * (e.g. `edit` exposes itself as `apply_patch` to GPT-5 in apply_patch mode);
1196
+ * a stale wire name would desync prompt guidance from actual tool routing.
1197
+ * 3. The bounded mounted-MCP projection: escaped original-name labels,
1198
+ * actual `xd://` paths, and the omission flag in catalog order. These are
1199
+ * the exact values rendered by the global transport guidance; catalog
1200
+ * churn wholly behind the fallback does not change the prompt.
1201
+ * 4. MCP server instructions text (per server), since `rebuildSystemPrompt`
1202
+ * embeds these in the appended prompt under "## MCP Server Instructions".
1203
+ * A server upgrade can change instructions while keeping tools identical.
1204
+ *
1205
+ * Settings-driven tool metadata is covered automatically: built-in tools that
1206
+ * depend on settings expose `description`/`label` via getters (see `TaskTool`,
1207
+ * `SearchToolBm25Tool`, `EditTool`), and the signature reads them live on every
1208
+ * call - so a settings flip that mutates the rendered string differs the signature
1209
+ * the next time {@link applyActiveToolsByName} runs. Do not refactor `describeTool`
1210
+ * to cache per-tool strings without preserving this property.
1211
+ *
1212
+ * Inputs NOT covered: tool input schemas; memory instructions read from disk;
1213
+ * and SDK-init-time closure constants in `sdk.ts` (`inlineToolDescriptors`,
1214
+ * `eagerTasks`, `intentField`, `mcpDiscoveryEnabled`, `secretsEnabled`). The
1215
+ * closure-captured ones cannot change at runtime regardless of skip behavior.
1216
+ * For everything else, callers must explicitly call {@link refreshBaseSystemPrompt}
1217
+ * after side-effecting changes; see the memory hooks and {@link syncAfterModelChange}.
1218
+ *
1219
+ * The current calendar date IS covered (appended as a segment) because
1220
+ * `buildSystemPrompt` injects it into the prompt body (`Today is '{{date}}'`).
1221
+ * Without this, a session spanning midnight with only tool-stable MCP
1222
+ * reconnects would keep yesterday's date indefinitely.
1223
+ */
1224
+ #computeAppliedToolSignature(toolNames: string[], tools: AgentTool[]): string {
1225
+ // Order-preserving join: any reorder must produce a different signature so
1226
+ // the rebuild fires and the new tool list reaches the API.
1227
+ const nameSegment = toolNames.join("\u0001");
1228
+ const describeTool = (tool: AgentTool): string =>
1229
+ `${tool.name}=${tool.label ?? ""}|${tool.description ?? ""}|${tool.customWireName ?? ""}`;
1230
+ const descriptionSegment = tools.map(describeTool).join("\u0002");
1231
+ const mountedMCPProjection = projectMountedMCPXdevGuidance(
1232
+ collectMountedMCPToolRoutes(this.#xdev ? listXdevTools(this.#xdev) : []),
1233
+ );
1234
+ const mountedMCPRouteSegment =
1235
+ JSON.stringify({
1236
+ mappings: mountedMCPProjection.mappings.map(mapping => [mapping.label, mapping.path] as const),
1237
+ hasOmittedMappings: mountedMCPProjection.hasOmittedMappings,
1238
+ }) ?? "{}";
1239
+ const serverInstructions = this.#getMcpServerInstructions?.();
1240
+ let instructionsSegment = "";
1241
+ if (serverInstructions && serverInstructions.size > 0) {
1242
+ // Sort by server name so transport flap order does not perturb the signature.
1243
+ const entries: string[] = [];
1244
+ for (const [server, instructions] of serverInstructions) {
1245
+ entries.push(`${server}=${instructions}`);
1246
+ }
1247
+ entries.sort();
1248
+ instructionsSegment = entries.join("\u0006");
1249
+ }
1250
+ // The non-MCP remainder of the xd:// inventory is deliberately NOT part
1251
+ // of the signature: its mount/unmount announces itself through
1252
+ // `#notifyXdevMountDelta` rather than rewriting the system prompt, keeping
1253
+ // the provider cache prefix byte-stable. Mounted MCP routes are the narrow
1254
+ // exception above, bounded to the exact projection rendered in the global
1255
+ // route guidance so churn wholly behind its fallback does not rebuild.
1256
+ const date = this.#getLocalCalendarDate();
1257
+ return `${nameSegment}\u0003${descriptionSegment}\u0007${instructionsSegment}\u0008${mountedMCPRouteSegment}|${date}`;
1258
+ }
1259
+
1260
+ /**
1261
+ * Replace MCP tools in the registry and enable them immediately. Refreshes
1262
+ * are serialized so an older asynchronous prompt rebuild cannot commit
1263
+ * after a newer catalog snapshot. Every connected MCP tool becomes available
1264
+ * (mounted under `xd://` when that transport is active, else top-level).
1265
+ */
1266
+ refreshMCPTools(mcpTools: CustomTool[]): Promise<void> {
1267
+ const snapshot = [...mcpTools];
1268
+ const refresh = this.#mcpRefreshTail.then(() =>
1269
+ this.#host.isDisposed() ? undefined : this.#applyMCPToolRefresh(snapshot),
1270
+ );
1271
+ this.#mcpRefreshTail = refresh.catch(() => {});
1272
+ return refresh;
1273
+ }
1274
+
1275
+ async #applyMCPToolRefresh(mcpTools: CustomTool[]): Promise<void> {
1276
+ const existingNames = Array.from(this.#toolRegistry.keys());
1277
+ const previousMcpTools = new Map(
1278
+ existingNames.flatMap(name => {
1279
+ const tool = this.#toolRegistry.get(name);
1280
+ return isMCPToolName(name) && tool ? [[name, tool] as const] : [];
1281
+ }),
1282
+ );
1283
+ const restorePreviousMcpTools = () => {
1284
+ for (const name of this.#toolRegistry.keys()) {
1285
+ if (isMCPToolName(name)) this.#toolRegistry.delete(name);
1286
+ }
1287
+ for (const [name, tool] of previousMcpTools) this.#toolRegistry.set(name, tool);
1288
+ };
1289
+ for (const name of existingNames) {
1290
+ if (isMCPToolName(name)) {
1291
+ this.#toolRegistry.delete(name);
1292
+ }
1293
+ }
1294
+
1295
+ const getCustomToolContext = (): CustomToolContext => ({
1296
+ sessionManager: this.#host.sessionManager,
1297
+ modelRegistry: this.#host.modelRegistry,
1298
+ model: this.#host.model(),
1299
+ isIdle: () => !this.#host.isStreaming(),
1300
+ hasQueuedMessages: () => this.#host.queuedMessageCount() > 0,
1301
+ abort: () => {
1302
+ this.#host.agent.abort();
1303
+ },
1304
+ settings: this.#host.settings,
1305
+ localProtocolOptions: this.#host.localProtocolOptions(),
1306
+ });
1307
+
1308
+ const extensionRunner = this.#host.extensionRunner();
1309
+ const uniqueMcpTools = deduplicateMCPToolsByName(mcpTools);
1310
+ for (const customTool of uniqueMcpTools) {
1311
+ const wrapped = wrapToolWithMetaNotice(CustomToolAdapter.wrap(customTool, getCustomToolContext) as AgentTool);
1312
+ const finalTool = (
1313
+ extensionRunner ? new ExtensionToolWrapper(wrapped, extensionRunner) : wrapped
1314
+ ) as AgentTool;
1315
+ this.#toolRegistry.set(finalTool.name, finalTool);
1316
+ }
1317
+
1318
+ // Every connected MCP tool is selected; centralized repartitioning owns
1319
+ // presentation pins and write-transport activation/removal.
1320
+ const nextActive = [...new Set([...this.#getActiveNonMCPToolNames(), ...uniqueMcpTools.map(tool => tool.name)])];
1321
+ try {
1322
+ await this.applyActiveToolsByName(nextActive);
1323
+ if (this.#host.isDisposed()) restorePreviousMcpTools();
1324
+ } catch (error) {
1325
+ restorePreviousMcpTools();
1326
+ throw error;
1327
+ }
1328
+ }
1329
+
1330
+ /** Replaces RPC host-owned tools and refreshes the active set before the next model call. */
1331
+ async refreshRpcHostTools(rpcTools: AgentTool[]): Promise<void> {
1332
+ const nextToolNames = rpcTools.map(tool => tool.name);
1333
+ const uniqueToolNames = new Set(nextToolNames);
1334
+ if (uniqueToolNames.size !== nextToolNames.length) {
1335
+ throw new Error("RPC host tool names must be unique");
1336
+ }
1337
+
1338
+ for (const name of uniqueToolNames) {
1339
+ if (this.#toolRegistry.has(name) && !this.#rpcHostToolNames.has(name)) {
1340
+ throw new Error(`RPC host tool "${name}" conflicts with an existing tool`);
1341
+ }
1342
+ }
1343
+
1344
+ const previousRpcHostToolNames = new Set(this.#rpcHostToolNames);
1345
+ const previousActiveToolNames = this.getEnabledToolNames();
1346
+ const previousRpcHostTools = new Map(
1347
+ [...previousRpcHostToolNames].flatMap(name => {
1348
+ const tool = this.#toolRegistry.get(name);
1349
+ return tool ? [[name, tool] as const] : [];
1350
+ }),
1351
+ );
1352
+ for (const name of previousRpcHostToolNames) {
1353
+ this.#toolRegistry.delete(name);
1354
+ }
1355
+ this.#rpcHostToolNames.clear();
1356
+
1357
+ const extensionRunner = this.#host.extensionRunner();
1358
+ for (const tool of rpcTools) {
1359
+ const metaWrapped = wrapToolWithMetaNotice(tool);
1360
+ const finalTool = (
1361
+ extensionRunner ? new ExtensionToolWrapper(metaWrapped, extensionRunner) : metaWrapped
1362
+ ) as AgentTool;
1363
+ this.#toolRegistry.set(finalTool.name, finalTool);
1364
+ this.#rpcHostToolNames.add(finalTool.name);
1365
+ }
1366
+
1367
+ const activeNonRpcToolNames = previousActiveToolNames.filter(name => !previousRpcHostToolNames.has(name));
1368
+ const preservedRpcToolNames = previousActiveToolNames.filter(
1369
+ name => previousRpcHostToolNames.has(name) && this.#rpcHostToolNames.has(name),
1370
+ );
1371
+ const autoActivatedRpcToolNames = rpcTools
1372
+ .filter(tool => !tool.hidden && !previousRpcHostToolNames.has(tool.name))
1373
+ .map(tool => tool.name);
1374
+ try {
1375
+ await this.applyActiveToolsByName(
1376
+ Array.from(new Set([...activeNonRpcToolNames, ...preservedRpcToolNames, ...autoActivatedRpcToolNames])),
1377
+ );
1378
+ } catch (error) {
1379
+ for (const name of this.#rpcHostToolNames) this.#toolRegistry.delete(name);
1380
+ this.#rpcHostToolNames = previousRpcHostToolNames;
1381
+ for (const [name, tool] of previousRpcHostTools) this.#toolRegistry.set(name, tool);
1382
+ throw error;
1383
+ }
1384
+ }
1385
+ }