@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,1524 @@
1
+ /**
2
+ * MCP Server Manager.
3
+ *
4
+ * Discovers, connects to, and manages MCP servers.
5
+ * Handles tool loading and lifecycle.
6
+ */
7
+ import * as path from "node:path";
8
+ import * as url from "node:url";
9
+ import { isDefinitiveOAuthFailure, type TSchema } from "@oh-my-pi/pi-ai";
10
+ import { logger } from "@oh-my-pi/pi-utils";
11
+ import type { SourceMeta } from "../capability/types";
12
+ import { resolveConfigValue } from "../config/resolve-config-value";
13
+ import type { CustomTool } from "../extensibility/custom-tools/types";
14
+ import { type AuthStorage, REMOTE_REFRESH_SENTINEL } from "../session/auth-storage";
15
+ import {
16
+ connectToServer,
17
+ disconnectServer,
18
+ getPrompt,
19
+ listPrompts,
20
+ listResources,
21
+ listResourceTemplates,
22
+ listTools,
23
+ readResource,
24
+ serverSupportsPrompts,
25
+ serverSupportsResources,
26
+ subscribeToResources,
27
+ unsubscribeFromResources,
28
+ } from "./client";
29
+ import { type LoadMCPConfigsResult, loadAllMCPConfigs, validateServerConfig } from "./config";
30
+ import {
31
+ lookupMcpOAuthCredential,
32
+ type MCPOAuthCredentialLookup,
33
+ selectMcpOAuthRefreshMaterial,
34
+ } from "./oauth-credentials";
35
+ import { type MCPStoredOAuthCredential, refreshMCPOAuthToken } from "./oauth-flow";
36
+ import type { McpConnectionStatusEvent } from "./startup-events";
37
+ import type { MCPToolDetails } from "./tool-bridge";
38
+ import { DeferredMCPTool, MCPTool } from "./tool-bridge";
39
+ import type { MCPToolCache } from "./tool-cache";
40
+ import { setGeneratedHeader } from "./transports/header-policy";
41
+ import type {
42
+ MCPAuthChallenge,
43
+ MCPGetPromptResult,
44
+ MCPPrompt,
45
+ MCPRequestOptions,
46
+ MCPResource,
47
+ MCPResourceReadResult,
48
+ MCPResourceTemplate,
49
+ MCPServerConfig,
50
+ MCPServerConnection,
51
+ MCPToolDefinition,
52
+ MCPTransport,
53
+ } from "./types";
54
+ import { MCPNotificationMethods } from "./types";
55
+
56
+ type ToolLoadResult = {
57
+ connection: MCPServerConnection;
58
+ serverTools: MCPToolDefinition[];
59
+ };
60
+
61
+ interface AuthRefreshableMCPTransport extends MCPTransport {
62
+ onAuthError?: () => Promise<Record<string, string> | null>;
63
+ }
64
+
65
+ function isAuthRefreshableMCPTransport(transport: MCPTransport): transport is AuthRefreshableMCPTransport {
66
+ return "onAuthError" in transport;
67
+ }
68
+ type TrackedPromise<T> = {
69
+ promise: Promise<T>;
70
+ status: "pending" | "fulfilled" | "rejected";
71
+ value?: T;
72
+ reason?: unknown;
73
+ };
74
+
75
+ const STARTUP_TIMEOUT_MS = 250;
76
+
77
+ /**
78
+ * Per-server reconnect-storm circuit breaker.
79
+ *
80
+ * `transport.onClose` (wired in {@link MCPManager.connectServers} and
81
+ * {@link MCPManager.#connectAndWireServer}) fires `reconnectServer` on every
82
+ * clean process exit, so a stdio MCP server that completes the
83
+ * `initialize` + `tools/list` handshake and then exits will pull the agent
84
+ * into a fork loop with no rate limit. That pathology shipped in issue #1592
85
+ * (a `php`-shebang MCP fork-bombing macOS, parented directly to the agent's
86
+ * `bun` PID via shebang exec).
87
+ *
88
+ * We keep the sliding window short — older crashes age out so a single
89
+ * transient failure stays cheap — but cap the burst tightly enough that the
90
+ * agent never spawns more than `RECONNECT_BURST_LIMIT * #doReconnect retries`
91
+ * (≤ 25) processes per stuck server per window. Manual `/mcp reconnect`
92
+ * resets the window so users can recover after fixing the underlying
93
+ * misconfiguration.
94
+ */
95
+ const RECONNECT_BURST_WINDOW_MS = 30_000;
96
+ const RECONNECT_BURST_LIMIT = 5;
97
+
98
+ /**
99
+ * Bounded buffer for notifications received before any listener attaches.
100
+ * Mirrors {@link IrcBus}'s `MAILBOX_CAP` — drop-oldest on overflow. Drained
101
+ * into the first {@link MCPManager.addNotificationListener} subscriber, then
102
+ * cleared; subsequent frames deliver directly to attached listeners.
103
+ */
104
+ const NOTIFICATION_BUFFER_CAP = 100;
105
+
106
+ function trackPromise<T>(promise: Promise<T>): TrackedPromise<T> {
107
+ const tracked: TrackedPromise<T> = { promise, status: "pending" };
108
+ promise.then(
109
+ value => {
110
+ tracked.status = "fulfilled";
111
+ tracked.value = value;
112
+ },
113
+ reason => {
114
+ tracked.status = "rejected";
115
+ tracked.reason = reason;
116
+ },
117
+ );
118
+ return tracked;
119
+ }
120
+
121
+ function delay(ms: number): Promise<void> {
122
+ return Bun.sleep(ms);
123
+ }
124
+
125
+ /**
126
+ * Stable, total ordering on MCP tools by name.
127
+ *
128
+ * Anthropic prompt caching keys on byte-identical tool definitions: any reorder
129
+ * of the tools array invalidates the tools cache breakpoint and forces a full
130
+ * prefix rebuild on the next request. MCP servers connect/reconnect at arbitrary
131
+ * times, so the natural "insertion order" of `#tools` is non-deterministic.
132
+ * Sorting after every mutation makes the array bytes independent of connection
133
+ * sequence.
134
+ */
135
+ export function sortMCPToolsByName<T extends { name: string }>(tools: T[]): T[] {
136
+ tools.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
137
+ return tools;
138
+ }
139
+
140
+ export function resolveSubscriptionPostAction(
141
+ notificationsEnabled: boolean,
142
+ currentEpoch: number,
143
+ subscriptionEpoch: number,
144
+ ): "rollback" | "ignore" | "apply" {
145
+ if (!notificationsEnabled) return "rollback";
146
+ if (currentEpoch !== subscriptionEpoch) return "ignore";
147
+ return "apply";
148
+ }
149
+ /** Result of loading MCP tools */
150
+ export interface MCPLoadResult {
151
+ /** Loaded tools as CustomTool instances */
152
+ tools: CustomTool<TSchema, MCPToolDetails>[];
153
+ /** Connection errors by server name */
154
+ errors: Map<string, string>;
155
+ /** Connected server names */
156
+ connectedServers: string[];
157
+ /** Extracted Exa API keys from filtered MCP servers */
158
+ exaApiKeys: string[];
159
+ }
160
+
161
+ /** Options for discovering and connecting to MCP servers */
162
+ export interface MCPDiscoverOptions {
163
+ /** Whether to load project-level config (default: true) */
164
+ enableProjectConfig?: boolean;
165
+ /** Whether to filter out Exa MCP servers (default: true) */
166
+ filterExa?: boolean;
167
+ /** Whether to filter out browser MCP servers when builtin browser tool is enabled (default: false) */
168
+ filterBrowser?: boolean;
169
+ /** Called when MCP server connection state changes. */
170
+ onStatus?: (event: McpConnectionStatusEvent) => void;
171
+ }
172
+
173
+ /** Handles an MCP `WWW-Authenticate` challenge and returns refreshed config. */
174
+ export type MCPAuthHandler = (serverName: string, challenge: MCPAuthChallenge) => Promise<MCPServerConfig | undefined>;
175
+
176
+ /**
177
+ * MCP Server Manager.
178
+ *
179
+ * Manages connections to MCP servers and provides tools to the agent.
180
+ */
181
+ export class MCPManager {
182
+ static #instance: MCPManager | undefined;
183
+
184
+ /** Process-global instance shared by internal URL protocol handlers and tools. */
185
+ static instance(): MCPManager | undefined {
186
+ return MCPManager.#instance;
187
+ }
188
+
189
+ /** Install or clear the process-global instance. */
190
+ static setInstance(value: MCPManager | undefined): void {
191
+ MCPManager.#instance = value;
192
+ }
193
+
194
+ /** Reset the process-global instance. Test-only. */
195
+ static resetForTests(): void {
196
+ MCPManager.#instance = undefined;
197
+ }
198
+
199
+ #connections = new Map<string, MCPServerConnection>();
200
+ #tools: CustomTool<TSchema, MCPToolDetails>[] = [];
201
+ #pendingConnections = new Map<string, Promise<MCPServerConnection>>();
202
+ #pendingToolLoads = new Map<string, Promise<ToolLoadResult>>();
203
+ #sources = new Map<string, SourceMeta>();
204
+ #authStorage: AuthStorage | null = null;
205
+ #authHandler?: MCPAuthHandler;
206
+ #notificationListeners = new Set<(serverName: string, method: string, params: unknown) => void>();
207
+ /**
208
+ * Notifications received before any listener attached, to be drained on
209
+ * the first {@link addNotificationListener} call. Bounded by
210
+ * {@link NOTIFICATION_BUFFER_CAP}, drop-oldest on overflow.
211
+ */
212
+ #pendingNotifications: Array<{ server: string; method: string; params: unknown }> = [];
213
+ #onToolsChanged?: (tools: CustomTool<TSchema, MCPToolDetails>[]) => void | Promise<void>;
214
+ #onResourcesChanged?: (serverName: string, uri: string) => void;
215
+ #onPromptsChanged?: (serverName: string) => void;
216
+ #notificationsEnabled = false;
217
+ #notificationsEpoch = 0;
218
+ #subscribedResources = new Map<string, Set<string>>();
219
+ #pendingResourceRefresh = new Map<string, { connection: MCPServerConnection; promise: Promise<void> }>();
220
+ #pendingReconnections = new Map<string, Promise<MCPServerConnection | null>>();
221
+ /** Preserved configs for reconnection after connection loss. */
222
+ #serverConfigs = new Map<string, MCPServerConfig>();
223
+ /**
224
+ * Timestamps of recent reconnectServer invocations per server, used by the
225
+ * crash-storm circuit breaker (see {@link RECONNECT_BURST_LIMIT}).
226
+ */
227
+ #reconnectHistory = new Map<string, number[]>();
228
+ /** Monotonic epoch incremented on disconnectAll to invalidate stale reconnections. */
229
+ #epoch = 0;
230
+
231
+ constructor(
232
+ private cwd: string,
233
+ private toolCache: MCPToolCache | null = null,
234
+ ) {}
235
+
236
+ /**
237
+ * Register a listener for server-initiated MCP notifications.
238
+ *
239
+ * The listener is called for every JSON-RPC notification received from any
240
+ * connected server, AFTER the manager's own handling of known methods
241
+ * (`notifications/tools/list_changed`, `notifications/resources/list_changed`,
242
+ * `notifications/resources/updated`, `notifications/prompts/list_changed`).
243
+ * For list-change methods the internal refresh promise is awaited before
244
+ * fanout, so listeners observe up-to-date manager and tool state. Unknown
245
+ * or server-custom methods are also delivered, letting consumers bridge
246
+ * server-initiated events into session-level behavior (e.g. an extension
247
+ * injecting a steer via `pi.sendMessage`).
248
+ *
249
+ * Notifications received before any listener attached are buffered
250
+ * (bounded FIFO, cap {@link NOTIFICATION_BUFFER_CAP}, drop-oldest) and
251
+ * drained into the first subscriber — matches {@link setOnPromptsChanged}'s
252
+ * replay-on-attach and {@link IrcBus}'s mailbox semantics.
253
+ *
254
+ * Returns an unsubscribe function; call it to remove the listener.
255
+ *
256
+ * Multiple listeners are allowed; each is invoked with independent error
257
+ * isolation — a listener that throws does not prevent other listeners from
258
+ * firing.
259
+ */
260
+ addNotificationListener(listener: (serverName: string, method: string, params: unknown) => void): () => void {
261
+ const wasEmpty = this.#notificationListeners.size === 0;
262
+ this.#notificationListeners.add(listener);
263
+
264
+ // Drain startup-buffered notifications into the first attaching listener.
265
+ if (wasEmpty && this.#pendingNotifications.length > 0) {
266
+ const pending = this.#pendingNotifications.splice(0);
267
+ for (const frame of pending) {
268
+ try {
269
+ listener(frame.server, frame.method, frame.params);
270
+ } catch (error) {
271
+ logger.debug("MCP notification listener threw during buffered drain", {
272
+ path: `mcp:${frame.server}`,
273
+ method: frame.method,
274
+ error,
275
+ });
276
+ }
277
+ }
278
+ }
279
+
280
+ return () => {
281
+ this.#notificationListeners.delete(listener);
282
+ };
283
+ }
284
+
285
+ /**
286
+ * Set a callback to fire when any server's tools change.
287
+ *
288
+ * May return a Promise; if so, {@link refreshServerTools} awaits it so that
289
+ * downstream consumers (e.g. `mcp_notification` listeners for
290
+ * `notifications/tools/list_changed`) observe not just the manager's
291
+ * refreshed tool set but also any session-level rebind driven by the
292
+ * handler (`session.refreshMCPTools`). Other callsites (initial connect,
293
+ * disconnect, reconnect) invoke the handler synchronously — their downstream
294
+ * chains don't need to serialize on the rebind.
295
+ */
296
+ setOnToolsChanged(handler: (tools: CustomTool<TSchema, MCPToolDetails>[]) => void | Promise<void>): void {
297
+ this.#onToolsChanged = handler;
298
+ }
299
+
300
+ /**
301
+ * Set a callback to fire when any server's resources change.
302
+ */
303
+ setOnResourcesChanged(handler: (serverName: string, uri: string) => void): void {
304
+ this.#onResourcesChanged = handler;
305
+ }
306
+
307
+ /**
308
+ * Set a callback to fire when any server's prompts change.
309
+ */
310
+ setOnPromptsChanged(handler: (serverName: string) => void): void {
311
+ this.#onPromptsChanged = handler;
312
+ // Fire immediately for servers that already have prompts loaded
313
+ for (const [name, connection] of this.#connections) {
314
+ if (connection.prompts?.length) {
315
+ handler(name);
316
+ }
317
+ }
318
+ }
319
+
320
+ #subscribeAndTrack(name: string, connection: MCPServerConnection, uris: string[], notificationEpoch: number): void {
321
+ void subscribeToResources(connection, uris)
322
+ .then(() => {
323
+ const action = resolveSubscriptionPostAction(
324
+ this.#notificationsEnabled,
325
+ this.#notificationsEpoch,
326
+ notificationEpoch,
327
+ );
328
+ if (action === "rollback") {
329
+ void unsubscribeFromResources(connection, uris).catch(error => {
330
+ logger.debug("Failed to rollback stale MCP resource subscription", {
331
+ path: `mcp:${name}`,
332
+ error,
333
+ });
334
+ });
335
+ return;
336
+ }
337
+ if (action === "ignore") {
338
+ return;
339
+ }
340
+ this.#subscribedResources.set(name, new Set(uris));
341
+ })
342
+ .catch(error => {
343
+ logger.debug("Failed to subscribe to MCP resources", { path: `mcp:${name}`, error });
344
+ });
345
+ }
346
+
347
+ setNotificationsEnabled(enabled: boolean): void {
348
+ const wasEnabled = this.#notificationsEnabled;
349
+ this.#notificationsEnabled = enabled;
350
+ if (enabled === wasEnabled) return;
351
+
352
+ this.#notificationsEpoch += 1;
353
+ const notificationEpoch = this.#notificationsEpoch;
354
+
355
+ if (enabled) {
356
+ // Subscribe to all connected servers that support it
357
+ for (const [name, connection] of this.#connections) {
358
+ if (connection.capabilities.resources?.subscribe && connection.resources) {
359
+ const uris = connection.resources.map(r => r.uri);
360
+ this.#subscribeAndTrack(name, connection, uris, notificationEpoch);
361
+ }
362
+ }
363
+ return;
364
+ }
365
+
366
+ // Unsubscribe from all servers
367
+ for (const [name, connection] of this.#connections) {
368
+ const uris = this.#subscribedResources.get(name);
369
+ if (uris && uris.size > 0) {
370
+ void unsubscribeFromResources(connection, Array.from(uris)).catch(error => {
371
+ logger.debug("Failed to unsubscribe MCP resources", { path: `mcp:${name}`, error });
372
+ });
373
+ }
374
+ }
375
+ this.#subscribedResources.clear();
376
+ }
377
+
378
+ /**
379
+ * Set the auth storage for resolving OAuth credentials.
380
+ */
381
+ setAuthStorage(authStorage: AuthStorage): void {
382
+ this.#authStorage = authStorage;
383
+ }
384
+
385
+ /** Set the callback used to complete OAuth after a tool-level auth challenge. */
386
+ setAuthHandler(handler: MCPAuthHandler | undefined): void {
387
+ this.#authHandler = handler;
388
+ }
389
+
390
+ /**
391
+ * Discover and connect to all MCP servers from .mcp.json files.
392
+ * Returns tools and any connection errors.
393
+ */
394
+ async discoverAndConnect(options?: MCPDiscoverOptions): Promise<MCPLoadResult> {
395
+ let loadedConfigs: LoadMCPConfigsResult;
396
+ try {
397
+ loadedConfigs = await loadAllMCPConfigs(this.cwd, {
398
+ enableProjectConfig: options?.enableProjectConfig,
399
+ filterExa: options?.filterExa,
400
+ filterBrowser: options?.filterBrowser,
401
+ });
402
+ } catch (error) {
403
+ const message = error instanceof Error ? error.message : String(error);
404
+ options?.onStatus?.({ type: "failed", serverName: ".mcp.json", error: message });
405
+ throw error;
406
+ }
407
+ const { configs, exaApiKeys, sources } = loadedConfigs;
408
+ const result = await this.connectServers(configs, sources, options?.onStatus);
409
+ result.exaApiKeys = exaApiKeys;
410
+ return result;
411
+ }
412
+
413
+ /**
414
+ * Connect to specific MCP servers.
415
+ * Connections are made in parallel for faster startup.
416
+ */
417
+ async connectServers(
418
+ configs: Record<string, MCPServerConfig>,
419
+ sources: Record<string, SourceMeta>,
420
+ onStatus?: (event: McpConnectionStatusEvent) => void,
421
+ ): Promise<MCPLoadResult> {
422
+ type ConnectionTask = {
423
+ name: string;
424
+ config: MCPServerConfig;
425
+ tracked: TrackedPromise<ToolLoadResult>;
426
+ toolsPromise: Promise<ToolLoadResult>;
427
+ };
428
+
429
+ const errors = new Map<string, string>();
430
+ const connectedServers = new Set<string>();
431
+ const allTools: CustomTool<TSchema, MCPToolDetails>[] = [];
432
+ const reportedErrors = new Set<string>();
433
+ let allowBackgroundLogging = false;
434
+ const statusServerNames: string[] = [];
435
+ const validationFailures: Array<{ name: string; message: string }> = [];
436
+
437
+ // Prepare connection tasks
438
+ const connectionTasks: ConnectionTask[] = [];
439
+
440
+ for (const [name, config] of Object.entries(configs)) {
441
+ if (sources[name]) {
442
+ this.#sources.set(name, sources[name]);
443
+ const existing = this.#connections.get(name);
444
+ if (existing) {
445
+ existing._source = sources[name];
446
+ }
447
+ }
448
+
449
+ // Skip if already connected
450
+ if (this.#connections.has(name)) {
451
+ connectedServers.add(name);
452
+ continue;
453
+ }
454
+
455
+ if (
456
+ this.#pendingConnections.has(name) ||
457
+ this.#pendingToolLoads.has(name) ||
458
+ this.#pendingReconnections.has(name)
459
+ ) {
460
+ continue;
461
+ }
462
+
463
+ statusServerNames.push(name);
464
+
465
+ // Validate config
466
+ const validationErrors = validateServerConfig(name, config);
467
+ if (validationErrors.length > 0) {
468
+ const message = validationErrors.join("; ");
469
+ errors.set(name, message);
470
+ validationFailures.push({ name, message });
471
+ reportedErrors.add(name);
472
+ continue;
473
+ }
474
+
475
+ // Save config early so reconnection works even if the initial connect times out
476
+ // and falls back to cached/deferred tools.
477
+ this.#serverConfigs.set(name, config);
478
+
479
+ // Resolve auth config before connecting, but do so per-server in parallel.
480
+ const connectionPromise = (async () => {
481
+ const resolvedConfig = await this.#resolveAuthConfig(config);
482
+ return connectToServer(name, resolvedConfig, {
483
+ onNotification: (method, params) => {
484
+ this.#handleServerNotification(name, method, params);
485
+ },
486
+ onRequest: (method, params) => {
487
+ return this.#handleServerRequest(method, params);
488
+ },
489
+ });
490
+ })().then(
491
+ connection => {
492
+ // Store original config (without resolved tokens) to keep
493
+ // cache keys stable and avoid leaking rotating credentials.
494
+ connection.config = config;
495
+ this.#serverConfigs.set(name, config);
496
+ if (sources[name]) {
497
+ connection._source = sources[name];
498
+ }
499
+ if (this.#pendingConnections.get(name) === connectionPromise) {
500
+ this.#pendingConnections.delete(name);
501
+ this.#connections.set(name, connection);
502
+ }
503
+
504
+ // Wire auth refresh for HTTP-like transports so 401s trigger token refresh.
505
+ // Gate on a resolvable managed credential, not on the auth block:
506
+ // definition-only configs (url-keyed fallback) get Bearer injection
507
+ // too and need the same mid-session refresh hook.
508
+ if (
509
+ isAuthRefreshableMCPTransport(connection.transport) &&
510
+ lookupMcpOAuthCredential(this.#authStorage, config)
511
+ ) {
512
+ connection.transport.onAuthError = async () => {
513
+ const refreshed = await this.#resolveAuthConfig(config, { forceRefresh: true });
514
+ if (refreshed.type === "http" || refreshed.type === "sse") {
515
+ return refreshed.headers ?? null;
516
+ }
517
+ return null;
518
+ };
519
+ }
520
+
521
+ // Re-establish connection if the transport closes (server restart,
522
+ // network interruption).
523
+ connection.transport.onClose = () => {
524
+ logger.debug("MCP transport lost, triggering reconnect", { path: `mcp:${name}` });
525
+ void this.reconnectServer(name);
526
+ };
527
+
528
+ return connection;
529
+ },
530
+ error => {
531
+ if (this.#pendingConnections.get(name) === connectionPromise) {
532
+ this.#pendingConnections.delete(name);
533
+ }
534
+ throw error;
535
+ },
536
+ );
537
+ this.#pendingConnections.set(name, connectionPromise);
538
+
539
+ const toolsPromise = connectionPromise.then(async connection => {
540
+ const serverTools = await listTools(connection);
541
+ return { connection, serverTools };
542
+ });
543
+ this.#pendingToolLoads.set(name, toolsPromise);
544
+
545
+ const tracked = trackPromise(toolsPromise);
546
+ connectionTasks.push({ name, config, tracked, toolsPromise });
547
+
548
+ void toolsPromise
549
+ .then(async ({ connection, serverTools }) => {
550
+ if (this.#pendingToolLoads.get(name) !== toolsPromise) return;
551
+ this.#pendingToolLoads.delete(name);
552
+ const reconnect = (options?: { authChallenge?: MCPAuthChallenge }) =>
553
+ this.reconnectServer(name, options);
554
+ const customTools = MCPTool.fromTools(connection, serverTools, reconnect);
555
+ this.#replaceServerTools(name, customTools);
556
+ void this.#onToolsChanged?.(this.#tools);
557
+ void this.toolCache?.set(name, config, serverTools);
558
+
559
+ onStatus?.({ type: "connected", serverName: name });
560
+ await this.#loadServerResourcesAndPrompts(name, connection);
561
+ })
562
+ .catch(error => {
563
+ if (this.#pendingToolLoads.get(name) !== toolsPromise) return;
564
+ this.#pendingToolLoads.delete(name);
565
+ const message = error instanceof Error ? error.message : String(error);
566
+ onStatus?.({ type: "failed", serverName: name, error: message });
567
+ if (!allowBackgroundLogging || reportedErrors.has(name)) return;
568
+ logger.error("MCP tool load failed", { path: `mcp:${name}`, error: message });
569
+ });
570
+ }
571
+
572
+ // Notify about servers we're connecting to, including configs that fail fast.
573
+ if (statusServerNames.length > 0 && onStatus) {
574
+ onStatus({ type: "connecting", serverNames: statusServerNames });
575
+ for (const { name, message } of validationFailures) {
576
+ onStatus({ type: "failed", serverName: name, error: message });
577
+ }
578
+ }
579
+
580
+ if (connectionTasks.length > 0) {
581
+ await Promise.race([
582
+ Promise.allSettled(connectionTasks.map(task => task.tracked.promise)),
583
+ delay(STARTUP_TIMEOUT_MS),
584
+ ]);
585
+
586
+ const cachedTools = new Map<string, MCPToolDefinition[]>();
587
+ const pendingTasks = connectionTasks.filter(task => task.tracked.status === "pending");
588
+
589
+ if (pendingTasks.length > 0 && this.toolCache) {
590
+ await Promise.all(
591
+ pendingTasks.map(async task => {
592
+ const cached = await this.toolCache?.get(task.name, task.config);
593
+ if (cached) {
594
+ cachedTools.set(task.name, cached);
595
+ }
596
+ }),
597
+ );
598
+ }
599
+
600
+ // Pending tasks without cached tools used to be awaited synchronously here,
601
+ // which gated the entire UI on the slowest server's per-request timeout
602
+ // (issue #2100: a single unresponsive MCP server blocked startup for the
603
+ // full 30 s `OMP_MCP_TIMEOUT_MS`). Leave them in flight — the background
604
+ // `void toolsPromise.then(...)` chain above registers their tools and
605
+ // fires `#onToolsChanged` once the connect finishes, or logs the failure
606
+ // after `allowBackgroundLogging` flips below.
607
+
608
+ for (const task of connectionTasks) {
609
+ const { name } = task;
610
+ if (task.tracked.status === "fulfilled") {
611
+ const value = task.tracked.value;
612
+ if (!value) continue;
613
+ const { connection, serverTools } = value;
614
+ connectedServers.add(name);
615
+ const reconnect = () => this.reconnectServer(name);
616
+ allTools.push(...MCPTool.fromTools(connection, serverTools, reconnect));
617
+ } else if (task.tracked.status === "rejected") {
618
+ const message =
619
+ task.tracked.reason instanceof Error ? task.tracked.reason.message : String(task.tracked.reason);
620
+ errors.set(name, message);
621
+ reportedErrors.add(name);
622
+ } else {
623
+ const cached = cachedTools.get(name);
624
+ if (cached) {
625
+ const source = this.#sources.get(name);
626
+ const reconnect = () => this.reconnectServer(name);
627
+ allTools.push(
628
+ ...DeferredMCPTool.fromTools(name, cached, () => this.waitForConnection(name), source, reconnect),
629
+ );
630
+ }
631
+ }
632
+ }
633
+ }
634
+
635
+ // Stable sort by name so the order is independent of connection completion.
636
+ // See `sortMCPToolsByName` for the cache-stability rationale.
637
+ sortMCPToolsByName(allTools);
638
+
639
+ // Update cached tools
640
+ this.#tools = allTools;
641
+ allowBackgroundLogging = true;
642
+
643
+ return {
644
+ tools: allTools,
645
+ errors,
646
+ connectedServers: Array.from(connectedServers),
647
+ exaApiKeys: [], // Will be populated by discoverAndConnect
648
+ };
649
+ }
650
+
651
+ /**
652
+ * Ownership is matched via `mcpServerName`, never a `mcp__${name}_` name
653
+ * prefix: tool names are lossy-sanitized, so one server's sanitized name
654
+ * can prefix another's (`atlassian` vs `atlassian:atlassian`) and a name
655
+ * with sanitized characters never prefix-matches its own tools at all.
656
+ */
657
+ #replaceServerTools(name: string, tools: CustomTool<TSchema, MCPToolDetails>[]): void {
658
+ this.#tools = this.#tools.filter(t => t.mcpServerName !== name);
659
+ this.#tools.push(...tools);
660
+ // Stable sort by name so reconnect order does not perturb the array.
661
+ // See `sortMCPToolsByName` for the cache-stability rationale.
662
+ sortMCPToolsByName(this.#tools);
663
+ }
664
+
665
+ #triggerNotificationRefresh(serverName: string, kind: "tools" | "resources" | "prompts"): Promise<void> {
666
+ const refresh = (() => {
667
+ switch (kind) {
668
+ case "tools":
669
+ return this.refreshServerTools(serverName);
670
+ case "resources":
671
+ return this.refreshServerResources(serverName);
672
+ case "prompts":
673
+ return this.refreshServerPrompts(serverName);
674
+ }
675
+ })();
676
+ return refresh.catch(error => {
677
+ logger.debug("Failed MCP notification refresh", { path: `mcp:${serverName}`, kind, error });
678
+ });
679
+ }
680
+ async #handleServerNotification(serverName: string, method: string, params: unknown): Promise<void> {
681
+ logger.debug("MCP notification received", { path: `mcp:${serverName}`, method });
682
+
683
+ // Only trigger refresh if the connection is already stored — during the
684
+ // initial connect handshake, notifications may arrive before
685
+ // `#connections.set()` completes, and `refreshServer*` would no-op
686
+ // anyway. Skipping the await in that case preserves arrival order
687
+ // across concurrently-dispatched notifications (an awaited refresh,
688
+ // even a no-op, yields a microtask that lets later frames overtake).
689
+ const connectionKnown = this.#connections.has(serverName);
690
+ let refreshPromise: Promise<void> | undefined;
691
+ switch (method) {
692
+ case MCPNotificationMethods.TOOLS_LIST_CHANGED:
693
+ if (connectionKnown) refreshPromise = this.#triggerNotificationRefresh(serverName, "tools");
694
+ break;
695
+ case MCPNotificationMethods.RESOURCES_LIST_CHANGED:
696
+ if (connectionKnown) refreshPromise = this.#triggerNotificationRefresh(serverName, "resources");
697
+ break;
698
+ case MCPNotificationMethods.RESOURCES_UPDATED: {
699
+ const uri =
700
+ params && typeof params === "object" && "uri" in params && typeof params.uri === "string"
701
+ ? params.uri
702
+ : undefined;
703
+ const subscribed = this.#subscribedResources.get(serverName);
704
+ if (uri && subscribed?.has(uri)) {
705
+ this.#onResourcesChanged?.(serverName, uri);
706
+ }
707
+ break;
708
+ }
709
+ case MCPNotificationMethods.PROMPTS_LIST_CHANGED:
710
+ if (connectionKnown) refreshPromise = this.#triggerNotificationRefresh(serverName, "prompts");
711
+ break;
712
+ default:
713
+ break;
714
+ }
715
+
716
+ // Await internal refresh so listeners see the manager's post-refresh
717
+ // state (satisfies the documented "AFTER the manager's own handling"
718
+ // contract on `addNotificationListener` — otherwise an extension acting
719
+ // on `tools/list_changed` could hit stale `getTools()`).
720
+ if (refreshPromise) {
721
+ await refreshPromise;
722
+ }
723
+
724
+ // Buffer for late-attaching subscribers when no listener exists yet.
725
+ if (this.#notificationListeners.size === 0) {
726
+ this.#pendingNotifications.push({ server: serverName, method, params });
727
+ if (this.#pendingNotifications.length > NOTIFICATION_BUFFER_CAP) {
728
+ this.#pendingNotifications.shift();
729
+ }
730
+ return;
731
+ }
732
+
733
+ for (const listener of this.#notificationListeners) {
734
+ try {
735
+ listener(serverName, method, params);
736
+ } catch (error) {
737
+ logger.debug("MCP notification listener threw", {
738
+ path: `mcp:${serverName}`,
739
+ method,
740
+ error,
741
+ });
742
+ }
743
+ }
744
+ }
745
+
746
+ /** Handle server-to-client JSON-RPC requests (e.g. ping, roots/list). */
747
+ async #handleServerRequest(method: string, _params: unknown): Promise<unknown> {
748
+ switch (method) {
749
+ case "ping":
750
+ return {};
751
+ case "roots/list":
752
+ return this.#getRoots();
753
+ default:
754
+ throw Object.assign(new Error(`Unsupported server request: ${method}`), { code: -32601 });
755
+ }
756
+ }
757
+
758
+ #getRoots(): { roots: Array<{ uri: string; name: string }> } {
759
+ return {
760
+ roots: [
761
+ {
762
+ uri: url.pathToFileURL(this.cwd).href,
763
+ name: path.basename(this.cwd),
764
+ },
765
+ ],
766
+ };
767
+ }
768
+
769
+ /**
770
+ * Get all loaded tools.
771
+ */
772
+ getTools(): CustomTool<TSchema, MCPToolDetails>[] {
773
+ return this.#tools;
774
+ }
775
+
776
+ /**
777
+ * Get a specific connection.
778
+ */
779
+ getConnection(name: string): MCPServerConnection | undefined {
780
+ return this.#connections.get(name);
781
+ }
782
+
783
+ /**
784
+ * Get current connection status for a server.
785
+ */
786
+ getConnectionStatus(name: string): "connected" | "connecting" | "disconnected" {
787
+ if (this.#connections.has(name)) return "connected";
788
+ if (
789
+ this.#pendingConnections.has(name) ||
790
+ this.#pendingToolLoads.has(name) ||
791
+ this.#pendingReconnections.has(name)
792
+ )
793
+ return "connecting";
794
+ return "disconnected";
795
+ }
796
+
797
+ /**
798
+ * Get the source metadata for a server.
799
+ */
800
+ getSource(name: string): SourceMeta | undefined {
801
+ return this.#sources.get(name) ?? this.#connections.get(name)?._source;
802
+ }
803
+
804
+ /**
805
+ * Get the preserved (pre-auth) config for a known server — whether currently
806
+ * connected or merely discovered (a connect was attempted but may have failed,
807
+ * e.g. an OAuth server that has not been authorized yet). Mirrors the
808
+ * reconnect lookup at {@link reconnectServer} so callers like `/mcp reauth`
809
+ * can recover a discovered server's config without re-reading config files.
810
+ */
811
+ getServerConfig(name: string): MCPServerConfig | undefined {
812
+ return this.#connections.get(name)?.config ?? this.#serverConfigs.get(name);
813
+ }
814
+
815
+ /**
816
+ * Wait for a connection to complete (or fail).
817
+ */
818
+ async waitForConnection(name: string): Promise<MCPServerConnection> {
819
+ const connection = this.#connections.get(name);
820
+ if (connection) return connection;
821
+ const pending = this.#pendingConnections.get(name);
822
+ if (pending) return pending;
823
+ // If a reconnection is in flight, wait for it to complete
824
+ const reconnecting = this.#pendingReconnections.get(name);
825
+ if (reconnecting) {
826
+ const result = await reconnecting;
827
+ if (result) return result;
828
+ }
829
+ throw new Error(`MCP server not connected: ${name}`);
830
+ }
831
+
832
+ /**
833
+ * Resolve auth and shell-command substitutions in config before connecting.
834
+ * Pass `oauth: false` to skip OAuth credential injection (used by reauth's
835
+ * unauthenticated probe, which must observe the server's bare 401).
836
+ */
837
+ async prepareConfig(config: MCPServerConfig, options?: { oauth?: boolean }): Promise<MCPServerConfig> {
838
+ return this.#resolveAuthConfig(config, options);
839
+ }
840
+
841
+ /**
842
+ * Get all connected server names.
843
+ */
844
+ getConnectedServers(): string[] {
845
+ return Array.from(this.#connections.keys());
846
+ }
847
+
848
+ /**
849
+ * Get all known server names (connected, connecting, or discovered).
850
+ */
851
+ getAllServerNames(): string[] {
852
+ return Array.from(
853
+ new Set([...this.#sources.keys(), ...this.#connections.keys(), ...this.#pendingConnections.keys()]),
854
+ );
855
+ }
856
+
857
+ /**
858
+ * Disconnect from a specific server.
859
+ */
860
+ async disconnectServer(name: string): Promise<void> {
861
+ this.#pendingConnections.delete(name);
862
+ this.#pendingToolLoads.delete(name);
863
+ this.#pendingReconnections.delete(name);
864
+ this.#sources.delete(name);
865
+ this.#serverConfigs.delete(name);
866
+ this.#pendingResourceRefresh.delete(name);
867
+ this.#reconnectHistory.delete(name);
868
+
869
+ const connection = this.#connections.get(name);
870
+
871
+ const subscribedUris = this.#subscribedResources.get(name);
872
+ if (subscribedUris && subscribedUris.size > 0 && connection) {
873
+ void unsubscribeFromResources(connection, Array.from(subscribedUris)).catch(() => {});
874
+ }
875
+ this.#subscribedResources.delete(name);
876
+
877
+ if (connection) {
878
+ // Detach onClose to prevent spurious reconnect from close()
879
+ connection.transport.onClose = undefined;
880
+ await disconnectServer(connection);
881
+ this.#connections.delete(name);
882
+ }
883
+
884
+ // Remove tools from this server and notify consumers
885
+ const hadTools = this.#tools.some(t => t.mcpServerName === name);
886
+ this.#tools = this.#tools.filter(t => t.mcpServerName !== name);
887
+ if (hadTools) void this.#onToolsChanged?.(this.#tools);
888
+
889
+ // Notify prompt consumers so stale commands are cleared
890
+ if (connection?.prompts?.length) this.#onPromptsChanged?.(name);
891
+ }
892
+
893
+ /**
894
+ * Disconnect from all servers.
895
+ */
896
+ async disconnectAll(): Promise<void> {
897
+ // Invalidate any in-flight reconnection attempts that outlive this call.
898
+ // They captured the old epoch; after increment they'll detect staleness.
899
+ this.#epoch++;
900
+ // Detach onClose before closing to prevent spurious reconnect attempts
901
+ for (const conn of this.#connections.values()) {
902
+ conn.transport.onClose = undefined;
903
+ }
904
+ const promises = Array.from(this.#connections.values()).map(conn => disconnectServer(conn));
905
+ await Promise.allSettled(promises);
906
+
907
+ this.#pendingConnections.clear();
908
+ this.#pendingToolLoads.clear();
909
+ this.#pendingReconnections.clear();
910
+ this.#pendingResourceRefresh.clear();
911
+ this.#sources.clear();
912
+ this.#serverConfigs.clear();
913
+ this.#connections.clear();
914
+ this.#tools = [];
915
+ this.#subscribedResources.clear();
916
+ this.#reconnectHistory.clear();
917
+ }
918
+
919
+ /**
920
+ * Reconnect to a server after a connection failure.
921
+ *
922
+ * Tears down the stale connection, re-resolves auth, establishes a new
923
+ * connection, reloads tools, and notifies consumers. Concurrent calls for
924
+ * the same server share one reconnection attempt. Returns the new
925
+ * connection, or `null` if reconnection failed or the per-server crash
926
+ * burst limit (see {@link RECONNECT_BURST_LIMIT}) is exceeded.
927
+ * @param options.manual - When `true`, resets the crash-burst window so a
928
+ * user-driven retry (e.g. `/mcp reconnect`) is never blocked by an
929
+ * earlier storm. Defaults to `false`; the transport `onClose` callback
930
+ * and the per-tool-call retry path in `tool-bridge` MUST NOT set it.
931
+ */
932
+ async reconnectServer(
933
+ name: string,
934
+ options?: { manual?: boolean; authChallenge?: MCPAuthChallenge },
935
+ ): Promise<MCPServerConnection | null> {
936
+ if (options?.manual) {
937
+ this.#reconnectHistory.delete(name);
938
+ }
939
+
940
+ const pending = this.#pendingReconnections.get(name);
941
+ if (pending) return pending;
942
+
943
+ if (this.#tripReconnectBreaker(name)) {
944
+ return null;
945
+ }
946
+
947
+ const attempt = this.#doReconnect(name, options?.authChallenge);
948
+ this.#pendingReconnections.set(name, attempt);
949
+ return attempt.finally(() => this.#pendingReconnections.delete(name));
950
+ }
951
+
952
+ /**
953
+ * Record a reconnect attempt against the per-server crash window and report
954
+ * whether the circuit breaker is now open. Sliding window: entries older
955
+ * than {@link RECONNECT_BURST_WINDOW_MS} are pruned before the new
956
+ * timestamp is appended, so a single transient failure ages out cheaply
957
+ * but repeated rapid crashes accumulate until the limit is hit.
958
+ */
959
+ #tripReconnectBreaker(name: string): boolean {
960
+ const now = Date.now();
961
+ const previous = this.#reconnectHistory.get(name) ?? [];
962
+ const recent = previous.filter(ts => now - ts < RECONNECT_BURST_WINDOW_MS);
963
+ recent.push(now);
964
+ this.#reconnectHistory.set(name, recent);
965
+
966
+ if (recent.length > RECONNECT_BURST_LIMIT) {
967
+ logger.error("MCP server crashed too many times; suspending automatic reconnects", {
968
+ path: `mcp:${name}`,
969
+ crashes: recent.length,
970
+ windowMs: RECONNECT_BURST_WINDOW_MS,
971
+ });
972
+ // Tear down the stale connection so `getConnectionStatus()` no
973
+ // longer reports it as "connected" and `waitForConnection()` does
974
+ // not hand a closed transport to callers. Tools stay registered
975
+ // in `#tools` — the user can recover with `/mcp reconnect <name>`
976
+ // once they've fixed the underlying misconfiguration. Mirrors the
977
+ // teardown in `#doReconnect`: detach `onClose` first so the
978
+ // transport's own `close()` cannot re-arm this path.
979
+ const stale = this.#connections.get(name);
980
+ if (stale) {
981
+ stale.transport.onClose = undefined;
982
+ void stale.transport.close().catch(() => {});
983
+ this.#connections.delete(name);
984
+ }
985
+ this.#pendingConnections.delete(name);
986
+ this.#pendingToolLoads.delete(name);
987
+ return true;
988
+ }
989
+ return false;
990
+ }
991
+
992
+ async #doReconnect(name: string, authChallenge?: MCPAuthChallenge): Promise<MCPServerConnection | null> {
993
+ const oldConnection = this.#connections.get(name);
994
+ let config = oldConnection?.config ?? this.#serverConfigs.get(name);
995
+ const source = this.#sources.get(name) ?? oldConnection?._source;
996
+ if (!config) return null;
997
+
998
+ if (authChallenge) {
999
+ if (!this.#authHandler) {
1000
+ logger.error("MCP auth challenge cannot be handled; no auth handler is configured", {
1001
+ path: `mcp:${name}`,
1002
+ });
1003
+ return null;
1004
+ }
1005
+ try {
1006
+ const refreshedConfig = await this.#authHandler(name, authChallenge);
1007
+ if (!refreshedConfig) return null;
1008
+ config = refreshedConfig;
1009
+ this.#serverConfigs.set(name, config);
1010
+ } catch (error) {
1011
+ logger.error("MCP auth challenge handling failed", { path: `mcp:${name}`, error });
1012
+ return null;
1013
+ }
1014
+ }
1015
+
1016
+ logger.debug("MCP reconnecting", { path: `mcp:${name}` });
1017
+
1018
+ // Close the old transport without removing tools or notifying consumers.
1019
+ // Tools stay available (stale) while we establish the new connection.
1020
+ // Fire-and-forget: don't await the close — HttpTransport.close() sends a
1021
+ // DELETE with config.timeout (30s default), and blocking here delays the
1022
+ // reconnect loop by that amount on every server restart.
1023
+ const reconnectEpoch = this.#epoch;
1024
+ if (oldConnection) {
1025
+ // Detach onClose to prevent re-entrant reconnect from the close itself
1026
+ oldConnection.transport.onClose = undefined;
1027
+ void oldConnection.transport.close().catch(() => {});
1028
+ this.#connections.delete(name);
1029
+ }
1030
+ this.#pendingConnections.delete(name);
1031
+ this.#pendingToolLoads.delete(name);
1032
+
1033
+ // Retry with backoff — the server may still be starting up.
1034
+ const delays = [500, 1000, 2000, 4000];
1035
+ for (let attempt = 0; attempt <= delays.length; attempt++) {
1036
+ if (this.#epoch !== reconnectEpoch) {
1037
+ logger.debug("MCP reconnect aborted before attempt after configuration changed", {
1038
+ path: `mcp:${name}`,
1039
+ storedEpoch: reconnectEpoch,
1040
+ currentEpoch: this.#epoch,
1041
+ });
1042
+ return null;
1043
+ }
1044
+ try {
1045
+ const connection = await this.#connectAndWireServer(name, config, source, reconnectEpoch);
1046
+ logger.debug("MCP reconnected", { path: `mcp:${name}`, tools: connection.tools?.length ?? 0 });
1047
+ return connection;
1048
+ } catch (error) {
1049
+ if (this.#epoch !== reconnectEpoch) {
1050
+ logger.debug("MCP reconnect aborted after configuration changed", {
1051
+ path: `mcp:${name}`,
1052
+ storedEpoch: reconnectEpoch,
1053
+ currentEpoch: this.#epoch,
1054
+ });
1055
+ return null;
1056
+ }
1057
+
1058
+ const msg = error instanceof Error ? error.message : String(error);
1059
+ if (attempt < delays.length) {
1060
+ logger.debug("MCP reconnect attempt failed, retrying", {
1061
+ path: `mcp:${name}`,
1062
+ attempt: attempt + 1,
1063
+ error: msg,
1064
+ });
1065
+ await Bun.sleep(delays[attempt]);
1066
+ } else {
1067
+ logger.error("MCP reconnect failed after retries", { path: `mcp:${name}`, error: msg });
1068
+ // Don't remove stale tools — keep them in the registry so they
1069
+ // remain selected. Calls will fail with MCP errors, which
1070
+ // triggers the tool-level reconnect, or the user can run
1071
+ // /mcp reconnect <name> manually.
1072
+ }
1073
+ }
1074
+ }
1075
+ return null;
1076
+ }
1077
+
1078
+ /** Establish a new connection to a server, wire handlers, load tools. */
1079
+ async #connectAndWireServer(
1080
+ name: string,
1081
+ config: MCPServerConfig,
1082
+ source: SourceMeta | undefined,
1083
+ reconnectEpoch: number,
1084
+ ): Promise<MCPServerConnection> {
1085
+ const resolvedConfig = await this.#resolveAuthConfig(config);
1086
+ const connection = await connectToServer(name, resolvedConfig, {
1087
+ onNotification: (method, params) => {
1088
+ this.#handleServerNotification(name, method, params);
1089
+ },
1090
+ onRequest: (method, params) => {
1091
+ return this.#handleServerRequest(method, params);
1092
+ },
1093
+ });
1094
+
1095
+ connection.config = config;
1096
+ if (source) connection._source = source;
1097
+
1098
+ // Bail out if the server was disconnected or the manager was reset
1099
+ // while we were connecting (e.g. /mcp reload called disconnectAll).
1100
+ if (!this.#serverConfigs.has(name) || this.#epoch !== reconnectEpoch) {
1101
+ await connection.transport.close().catch(() => {});
1102
+ throw new Error(`Server "${name}" was disconnected during reconnection`);
1103
+ }
1104
+
1105
+ this.#connections.set(name, connection);
1106
+
1107
+ // Wire auth refresh for HTTP-like transports, and reconnect for any transport.
1108
+ // Same gate as connectServers: any resolvable managed credential.
1109
+ if (isAuthRefreshableMCPTransport(connection.transport) && lookupMcpOAuthCredential(this.#authStorage, config)) {
1110
+ connection.transport.onAuthError = async () => {
1111
+ const refreshed = await this.#resolveAuthConfig(config, { forceRefresh: true });
1112
+ if (refreshed.type === "http" || refreshed.type === "sse") {
1113
+ return refreshed.headers ?? null;
1114
+ }
1115
+ return null;
1116
+ };
1117
+ }
1118
+ connection.transport.onClose = () => {
1119
+ logger.debug("MCP transport lost, triggering reconnect", { path: `mcp:${name}` });
1120
+ void this.reconnectServer(name);
1121
+ };
1122
+ try {
1123
+ const serverTools = await listTools(connection);
1124
+ const reconnect = (options?: { authChallenge?: MCPAuthChallenge }) => this.reconnectServer(name, options);
1125
+ const customTools = MCPTool.fromTools(connection, serverTools, reconnect);
1126
+ void this.toolCache?.set(name, config, serverTools);
1127
+ this.#replaceServerTools(name, customTools);
1128
+ void this.#onToolsChanged?.(this.#tools);
1129
+ void this.#loadServerResourcesAndPrompts(name, connection);
1130
+ return connection;
1131
+ } catch (error) {
1132
+ // Clean up the connection to avoid zombie transports
1133
+ connection.transport.onClose = undefined;
1134
+ await connection.transport.close().catch(() => {});
1135
+ this.#connections.delete(name);
1136
+ throw error;
1137
+ }
1138
+ }
1139
+
1140
+ /**
1141
+ * Best-effort loading of resources, resource subscriptions, and prompts.
1142
+ * Shared between initial connection and reconnection.
1143
+ */
1144
+ async #loadServerResourcesAndPrompts(name: string, connection: MCPServerConnection): Promise<void> {
1145
+ if (serverSupportsResources(connection.capabilities)) {
1146
+ try {
1147
+ await this.refreshServerResources(name);
1148
+ } catch (error) {
1149
+ logger.debug("Failed to load MCP resources", { path: `mcp:${name}`, error });
1150
+ }
1151
+ }
1152
+
1153
+ if (serverSupportsPrompts(connection.capabilities)) {
1154
+ try {
1155
+ await listPrompts(connection);
1156
+ this.#onPromptsChanged?.(name);
1157
+ } catch (error) {
1158
+ logger.debug("Failed to load MCP prompts", { path: `mcp:${name}`, error });
1159
+ }
1160
+ }
1161
+ }
1162
+
1163
+ /**
1164
+ * Refresh tools from a specific server.
1165
+ */
1166
+ async refreshServerTools(name: string): Promise<void> {
1167
+ const connection = this.#connections.get(name);
1168
+ if (!connection) return;
1169
+
1170
+ // Clear cached tools
1171
+ connection.tools = undefined;
1172
+
1173
+ // Reload tools
1174
+ const serverTools = await listTools(connection);
1175
+ const reconnect = () => this.reconnectServer(name);
1176
+ const customTools = MCPTool.fromTools(connection, serverTools, reconnect);
1177
+ void this.toolCache?.set(name, connection.config, serverTools);
1178
+
1179
+ // Replace tools from this server
1180
+ this.#replaceServerTools(name, customTools);
1181
+ await this.#onToolsChanged?.(this.#tools);
1182
+ }
1183
+
1184
+ /**
1185
+ * Refresh tools from all servers.
1186
+ */
1187
+ async refreshAllTools(): Promise<void> {
1188
+ const promises = Array.from(this.#connections.keys()).map(name => this.refreshServerTools(name));
1189
+ await Promise.allSettled(promises);
1190
+ }
1191
+
1192
+ /**
1193
+ * Refresh resources from a specific server.
1194
+ */
1195
+ async refreshServerResources(name: string): Promise<void> {
1196
+ const connection = this.#connections.get(name);
1197
+ if (!connection || !serverSupportsResources(connection.capabilities)) return;
1198
+
1199
+ const existing = this.#pendingResourceRefresh.get(name);
1200
+ if (existing && existing.connection === connection) return existing.promise;
1201
+
1202
+ const doRefresh = async (): Promise<void> => {
1203
+ // Clear cached resources
1204
+ connection.resources = undefined;
1205
+ connection.resourceTemplates = undefined;
1206
+
1207
+ // Reload. Template listing failures must not discard a successful
1208
+ // resources/list — let both settle, then continue without templates.
1209
+ const [resourcesResult, templatesResult] = await Promise.allSettled([
1210
+ listResources(connection),
1211
+ listResourceTemplates(connection),
1212
+ ]);
1213
+ if (templatesResult.status === "rejected") {
1214
+ logger.debug("Failed to list MCP resource templates", {
1215
+ path: `mcp:${name}`,
1216
+ error: templatesResult.reason,
1217
+ });
1218
+ }
1219
+ if (resourcesResult.status === "rejected") throw resourcesResult.reason;
1220
+ const resources = resourcesResult.value;
1221
+ if (this.#notificationsEnabled && connection.capabilities.resources?.subscribe) {
1222
+ const newUris = new Set(resources.map(r => r.uri));
1223
+ const oldUris = this.#subscribedResources.get(name);
1224
+ const notificationEpoch = this.#notificationsEpoch;
1225
+
1226
+ // Unsubscribe URIs that were removed
1227
+ if (oldUris) {
1228
+ const removed = [...oldUris].filter(uri => !newUris.has(uri));
1229
+ if (removed.length > 0) {
1230
+ try {
1231
+ await unsubscribeFromResources(connection, removed);
1232
+ } catch (error) {
1233
+ logger.debug("Failed to unsubscribe stale MCP resources", { path: `mcp:${name}`, error });
1234
+ }
1235
+ }
1236
+ }
1237
+
1238
+ // Subscribe to the current set and update tracking atomically
1239
+ try {
1240
+ const allUris = [...newUris];
1241
+ await subscribeToResources(connection, allUris);
1242
+ const action = resolveSubscriptionPostAction(
1243
+ this.#notificationsEnabled,
1244
+ this.#notificationsEpoch,
1245
+ notificationEpoch,
1246
+ );
1247
+ if (action === "rollback") {
1248
+ await unsubscribeFromResources(connection, allUris).catch(error => {
1249
+ logger.debug("Failed to rollback stale MCP resource subscription", { path: `mcp:${name}`, error });
1250
+ });
1251
+ return;
1252
+ }
1253
+ if (action === "ignore") {
1254
+ return;
1255
+ }
1256
+ this.#subscribedResources.set(name, newUris);
1257
+ } catch (error) {
1258
+ logger.debug("Failed to re-subscribe to MCP resources", { path: `mcp:${name}`, error });
1259
+ }
1260
+ }
1261
+ };
1262
+
1263
+ const promise = doRefresh().finally(() => {
1264
+ const pending = this.#pendingResourceRefresh.get(name);
1265
+ if (pending?.promise === promise) {
1266
+ this.#pendingResourceRefresh.delete(name);
1267
+ }
1268
+ });
1269
+ this.#pendingResourceRefresh.set(name, { connection, promise });
1270
+ return promise;
1271
+ }
1272
+
1273
+ /**
1274
+ * Wait until a connected server's resource catalog has been loaded.
1275
+ * Coalesces with initial loading and notification-driven refreshes.
1276
+ */
1277
+ async ensureServerResources(name: string): Promise<void> {
1278
+ const connection = this.#connections.get(name);
1279
+ if (!connection || !serverSupportsResources(connection.capabilities)) return;
1280
+ if (connection.resources !== undefined && connection.resourceTemplates !== undefined) return;
1281
+ await this.refreshServerResources(name);
1282
+ }
1283
+
1284
+ /**
1285
+ * Refresh prompts from a specific server.
1286
+ */
1287
+ async refreshServerPrompts(name: string): Promise<void> {
1288
+ const connection = this.#connections.get(name);
1289
+ if (!connection || !serverSupportsPrompts(connection.capabilities)) return;
1290
+
1291
+ connection.prompts = undefined;
1292
+ await listPrompts(connection);
1293
+
1294
+ this.#onPromptsChanged?.(name);
1295
+ }
1296
+
1297
+ /**
1298
+ * Get resources and templates for a specific server.
1299
+ */
1300
+ getServerResources(name: string): { resources: MCPResource[]; templates: MCPResourceTemplate[] } | undefined {
1301
+ const connection = this.#connections.get(name);
1302
+ if (!connection) return undefined;
1303
+ return {
1304
+ resources: connection.resources ?? [],
1305
+ templates: connection.resourceTemplates ?? [],
1306
+ };
1307
+ }
1308
+
1309
+ /**
1310
+ * Read a specific resource from a server.
1311
+ */
1312
+ async readServerResource(
1313
+ name: string,
1314
+ uri: string,
1315
+ options?: MCPRequestOptions,
1316
+ ): Promise<MCPResourceReadResult | undefined> {
1317
+ const connection = this.#connections.get(name);
1318
+ if (!connection) return undefined;
1319
+ return readResource(connection, uri, options);
1320
+ }
1321
+
1322
+ /**
1323
+ * Get prompts for a specific server.
1324
+ */
1325
+ getServerPrompts(name: string): MCPPrompt[] | undefined {
1326
+ const connection = this.#connections.get(name);
1327
+ if (!connection) return undefined;
1328
+ return connection.prompts ?? [];
1329
+ }
1330
+
1331
+ /**
1332
+ * Get a specific prompt from a server.
1333
+ */
1334
+ async executePrompt(
1335
+ name: string,
1336
+ promptName: string,
1337
+ args?: Record<string, string>,
1338
+ options?: MCPRequestOptions,
1339
+ ): Promise<MCPGetPromptResult | undefined> {
1340
+ const connection = this.#connections.get(name);
1341
+ if (!connection) return undefined;
1342
+ return getPrompt(connection, promptName, args, options);
1343
+ }
1344
+
1345
+ /**
1346
+ * Get all server instructions (for system prompt injection).
1347
+ */
1348
+ getServerInstructions(): Map<string, string> {
1349
+ const instructions = new Map<string, string>();
1350
+ for (const [name, connection] of this.#connections) {
1351
+ if (connection.instructions) {
1352
+ instructions.set(name, connection.instructions);
1353
+ }
1354
+ }
1355
+ return instructions;
1356
+ }
1357
+
1358
+ /**
1359
+ * Get notification state for display.
1360
+ */
1361
+ getNotificationState(): { enabled: boolean; subscriptions: Map<string, ReadonlySet<string>> } {
1362
+ return {
1363
+ enabled: this.#notificationsEnabled,
1364
+ subscriptions: this.#subscribedResources as Map<string, ReadonlySet<string>>,
1365
+ };
1366
+ }
1367
+
1368
+ /**
1369
+ * Resolve OAuth credentials and shell commands in config.
1370
+ * `oauth: false` skips credential injection (reauth's unauthenticated probe);
1371
+ * `forceRefresh` bypasses the expiry buffer (401/403 auth-error hook).
1372
+ */
1373
+ async #resolveAuthConfig(
1374
+ config: MCPServerConfig,
1375
+ opts?: { forceRefresh?: boolean; oauth?: boolean },
1376
+ ): Promise<MCPServerConfig> {
1377
+ let resolved: MCPServerConfig = { ...config };
1378
+
1379
+ const auth = config.auth;
1380
+ const lookup: MCPOAuthCredentialLookup | undefined =
1381
+ opts?.oauth !== false ? lookupMcpOAuthCredential(this.#authStorage, config) : undefined;
1382
+ if (lookup && this.#authStorage) {
1383
+ const { credentialId } = lookup;
1384
+ try {
1385
+ let credential: MCPStoredOAuthCredential | undefined = lookup.credential;
1386
+ const REFRESH_BUFFER_MS = 5 * 60_000;
1387
+ const refreshResult = await this.#authStorage.refreshStoredOAuthCredential<MCPStoredOAuthCredential>(
1388
+ credentialId,
1389
+ {
1390
+ observedCredential: credential,
1391
+ credentialFromRow: row => row,
1392
+ forceRefresh: opts?.forceRefresh,
1393
+ refreshSkewMs: REFRESH_BUFFER_MS,
1394
+ canRefresh: current => {
1395
+ const material = selectMcpOAuthRefreshMaterial(current, auth);
1396
+ return Boolean(current.refresh && material?.tokenUrl);
1397
+ },
1398
+ refresh: (current, signal) => {
1399
+ if (current.refresh === REMOTE_REFRESH_SENTINEL) {
1400
+ throw new Error("MCP OAuth refresh token is broker-redacted; local refresh is unavailable");
1401
+ }
1402
+ const material = selectMcpOAuthRefreshMaterial(current, auth);
1403
+ const tokenUrl = material?.tokenUrl;
1404
+ if (!current.refresh || !tokenUrl) {
1405
+ throw new Error("MCP OAuth credential is missing refresh material");
1406
+ }
1407
+ const clientId = material?.clientId;
1408
+ const clientSecret = material?.clientSecret;
1409
+ const authorizationUrl =
1410
+ material && "authorizationUrl" in material ? material.authorizationUrl : undefined;
1411
+ const resourceIsFallback =
1412
+ !material?.resource && (config.type === "http" || config.type === "sse") && Boolean(config.url);
1413
+ const resource = material?.resource ?? (resourceIsFallback ? config.url : undefined);
1414
+ return refreshMCPOAuthToken(tokenUrl, current.refresh, clientId, clientSecret, resource, {
1415
+ authorizationUrl,
1416
+ stripSameOriginResource: resourceIsFallback,
1417
+ signal,
1418
+ });
1419
+ },
1420
+ mergeRefreshedCredential: (current, refreshed) => {
1421
+ const material = selectMcpOAuthRefreshMaterial(current, auth);
1422
+ const tokenUrl = material?.tokenUrl;
1423
+ const clientId = material?.clientId;
1424
+ const clientSecret = material?.clientSecret;
1425
+ const authorizationUrl =
1426
+ material && "authorizationUrl" in material ? material.authorizationUrl : undefined;
1427
+ const resourceIsFallback =
1428
+ !material?.resource && (config.type === "http" || config.type === "sse") && Boolean(config.url);
1429
+ const resource = material?.resource ?? (resourceIsFallback ? config.url : undefined);
1430
+ return {
1431
+ ...current,
1432
+ ...refreshed,
1433
+ tokenUrl,
1434
+ clientId,
1435
+ clientSecret,
1436
+ resource: resourceIsFallback ? undefined : resource,
1437
+ authorizationUrl,
1438
+ };
1439
+ },
1440
+ isDefinitiveFailure: error =>
1441
+ isDefinitiveOAuthFailure(error instanceof Error ? error.message : String(error)),
1442
+ disabledCause: error =>
1443
+ `oauth refresh failed: ${error instanceof Error ? error.message : String(error)}`,
1444
+ keepCredentialOnRefreshFailure: error =>
1445
+ !(error instanceof Error && error.message.includes("broker-redacted")),
1446
+ onRefreshFailure: refreshError => {
1447
+ if (refreshError instanceof Error && refreshError.message.includes("broker-redacted")) return;
1448
+ logger.warn("MCP OAuth refresh failed, using existing token", {
1449
+ credentialId,
1450
+ error: refreshError,
1451
+ });
1452
+ },
1453
+ },
1454
+ );
1455
+ if (refreshResult.removed) {
1456
+ logger.warn("MCP OAuth refresh failed definitively; cleared credential", { credentialId });
1457
+ }
1458
+ credential = refreshResult.credential;
1459
+
1460
+ if (credential) {
1461
+ if (resolved.type === "http" || resolved.type === "sse") {
1462
+ // Client-generated authorization wins over any configured header
1463
+ // with the same case-insensitive name (Agent Plugins §7.2.1).
1464
+ const headers = { ...resolved.headers };
1465
+ setGeneratedHeader(headers, "Authorization", `Bearer ${credential.access}`);
1466
+ resolved = { ...resolved, headers };
1467
+ } else {
1468
+ resolved = {
1469
+ ...resolved,
1470
+ env: {
1471
+ ...resolved.env,
1472
+ OAUTH_ACCESS_TOKEN: credential.access,
1473
+ },
1474
+ };
1475
+ }
1476
+ }
1477
+ } catch (error) {
1478
+ logger.warn("Failed to resolve OAuth credential", { credentialId, error });
1479
+ }
1480
+ }
1481
+
1482
+ if (resolved.type !== "http" && resolved.type !== "sse") {
1483
+ // Literal env values (Agent Plugins §§4.1/9.2) are opaque package data:
1484
+ // no env-name lookup, no `!command` execution, no dropping empty values.
1485
+ if (resolved.env && resolved.envPolicy !== "literal") {
1486
+ const nextEnv: Record<string, string> = {};
1487
+ for (const [key, value] of Object.entries(resolved.env)) {
1488
+ const resolvedValue = await resolveConfigValue(value);
1489
+ if (resolvedValue) nextEnv[key] = resolvedValue;
1490
+ }
1491
+ resolved = { ...resolved, env: nextEnv };
1492
+ }
1493
+ } else {
1494
+ // Origin-locked servers (Agent Plugins §9.2) carry literal header
1495
+ // values: no placeholder or environment-variable expansion.
1496
+ if (resolved.headers && resolved.headerPolicy !== "origin-locked") {
1497
+ const nextHeaders: Record<string, string> = {};
1498
+ for (const [key, value] of Object.entries(resolved.headers)) {
1499
+ const resolvedValue = await resolveConfigValue(value);
1500
+ if (resolvedValue) nextHeaders[key] = resolvedValue;
1501
+ }
1502
+ resolved = { ...resolved, headers: nextHeaders };
1503
+ }
1504
+ }
1505
+
1506
+ return resolved;
1507
+ }
1508
+ }
1509
+
1510
+ /**
1511
+ * Create an MCP manager and discover servers.
1512
+ * Convenience function for quick setup.
1513
+ */
1514
+ export async function createMCPManager(
1515
+ cwd: string,
1516
+ options?: MCPDiscoverOptions,
1517
+ ): Promise<{
1518
+ manager: MCPManager;
1519
+ result: MCPLoadResult;
1520
+ }> {
1521
+ const manager = new MCPManager(cwd);
1522
+ const result = await manager.discoverAndConnect(options);
1523
+ return { manager, result };
1524
+ }