@oh-my-pi-zen/pi-coding-agent 16.3.6-zen.1

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 (2454) hide show
  1. package/CHANGELOG.md +13088 -0
  2. package/README.md +35 -0
  3. package/dist/cli.js +22542 -0
  4. package/dist/types/advisor/__tests__/advisor.test.d.ts +1 -0
  5. package/dist/types/advisor/__tests__/config.test.d.ts +1 -0
  6. package/dist/types/advisor/__tests__/emission-guard.test.d.ts +1 -0
  7. package/dist/types/advisor/advise-tool.d.ts +106 -0
  8. package/dist/types/advisor/config.d.ts +90 -0
  9. package/dist/types/advisor/emission-guard.d.ts +73 -0
  10. package/dist/types/advisor/index.d.ts +6 -0
  11. package/dist/types/advisor/runtime.d.ts +76 -0
  12. package/dist/types/advisor/transcript-recorder.d.ts +63 -0
  13. package/dist/types/advisor/watchdog.d.ts +38 -0
  14. package/dist/types/async/index.d.ts +1 -0
  15. package/dist/types/async/job-manager.d.ts +121 -0
  16. package/dist/types/auto-thinking/classifier.d.ts +37 -0
  17. package/dist/types/autolearn/controller.d.ts +25 -0
  18. package/dist/types/autolearn/managed-skills.d.ts +45 -0
  19. package/dist/types/autoresearch/dashboard.d.ts +4 -0
  20. package/dist/types/autoresearch/git.d.ts +36 -0
  21. package/dist/types/autoresearch/helpers.d.ts +24 -0
  22. package/dist/types/autoresearch/index.d.ts +2 -0
  23. package/dist/types/autoresearch/state.d.ts +17 -0
  24. package/dist/types/autoresearch/storage.d.ts +142 -0
  25. package/dist/types/autoresearch/tools/init-experiment.d.ts +27 -0
  26. package/dist/types/autoresearch/tools/log-experiment.d.ts +21 -0
  27. package/dist/types/autoresearch/tools/run-experiment.d.ts +7 -0
  28. package/dist/types/autoresearch/tools/update-notes.d.ts +11 -0
  29. package/dist/types/autoresearch/types.d.ts +154 -0
  30. package/dist/types/capability/context-file.d.ts +17 -0
  31. package/dist/types/capability/extension-module.d.ts +15 -0
  32. package/dist/types/capability/extension.d.ts +28 -0
  33. package/dist/types/capability/fs.d.ts +20 -0
  34. package/dist/types/capability/hook.d.ts +19 -0
  35. package/dist/types/capability/index.d.ts +80 -0
  36. package/dist/types/capability/instruction.d.ts +17 -0
  37. package/dist/types/capability/mcp.d.ts +47 -0
  38. package/dist/types/capability/prompt.d.ts +15 -0
  39. package/dist/types/capability/rule-buckets.d.ts +30 -0
  40. package/dist/types/capability/rule.d.ts +73 -0
  41. package/dist/types/capability/settings.d.ts +15 -0
  42. package/dist/types/capability/skill.d.ts +43 -0
  43. package/dist/types/capability/slash-command.d.ts +17 -0
  44. package/dist/types/capability/ssh.d.ts +23 -0
  45. package/dist/types/capability/system-prompt.d.ts +15 -0
  46. package/dist/types/capability/tool.d.ts +19 -0
  47. package/dist/types/capability/types.d.ts +154 -0
  48. package/dist/types/cli/agents-cli.d.ts +12 -0
  49. package/dist/types/cli/args.d.ts +77 -0
  50. package/dist/types/cli/auth-broker-cli.d.ts +25 -0
  51. package/dist/types/cli/auth-gateway-cli.d.ts +26 -0
  52. package/dist/types/cli/bench-cli.d.ts +85 -0
  53. package/dist/types/cli/classify-install-target.d.ts +12 -0
  54. package/dist/types/cli/claude-trace-cli.d.ts +54 -0
  55. package/dist/types/cli/commands/init-xdg.d.ts +1 -0
  56. package/dist/types/cli/completion-gen.d.ts +80 -0
  57. package/dist/types/cli/config-cli.d.ts +22 -0
  58. package/dist/types/cli/dry-balance-cli.d.ts +113 -0
  59. package/dist/types/cli/extension-flags.d.ts +36 -0
  60. package/dist/types/cli/file-processor.d.ts +11 -0
  61. package/dist/types/cli/flag-tables.d.ts +144 -0
  62. package/dist/types/cli/gallery-cli.d.ts +49 -0
  63. package/dist/types/cli/gallery-fixtures/agentic.d.ts +2 -0
  64. package/dist/types/cli/gallery-fixtures/codeintel.d.ts +3 -0
  65. package/dist/types/cli/gallery-fixtures/edit.d.ts +3 -0
  66. package/dist/types/cli/gallery-fixtures/fs.d.ts +2 -0
  67. package/dist/types/cli/gallery-fixtures/index.d.ts +4 -0
  68. package/dist/types/cli/gallery-fixtures/interaction.d.ts +3 -0
  69. package/dist/types/cli/gallery-fixtures/memory.d.ts +2 -0
  70. package/dist/types/cli/gallery-fixtures/misc.d.ts +3 -0
  71. package/dist/types/cli/gallery-fixtures/search.d.ts +3 -0
  72. package/dist/types/cli/gallery-fixtures/shell.d.ts +3 -0
  73. package/dist/types/cli/gallery-fixtures/types.d.ts +55 -0
  74. package/dist/types/cli/gallery-fixtures/web.d.ts +2 -0
  75. package/dist/types/cli/gallery-screenshot.d.ts +35 -0
  76. package/dist/types/cli/gc-cli.d.ts +58 -0
  77. package/dist/types/cli/grep-cli.d.ts +17 -0
  78. package/dist/types/cli/grievances-cli.d.ts +37 -0
  79. package/dist/types/cli/initial-message.d.ts +17 -0
  80. package/dist/types/cli/models-cli.d.ts +49 -0
  81. package/dist/types/cli/plugin-cli.d.ts +32 -0
  82. package/dist/types/cli/profile-alias.d.ts +29 -0
  83. package/dist/types/cli/profile-bootstrap.d.ts +55 -0
  84. package/dist/types/cli/read-cli.d.ts +4 -0
  85. package/dist/types/cli/session-picker.d.ts +11 -0
  86. package/dist/types/cli/setup-cli.d.ts +24 -0
  87. package/dist/types/cli/setup-model-picker.d.ts +14 -0
  88. package/dist/types/cli/shell-cli.d.ts +8 -0
  89. package/dist/types/cli/ssh-cli.d.ts +21 -0
  90. package/dist/types/cli/startup-cwd.d.ts +2 -0
  91. package/dist/types/cli/stats-cli.d.ts +17 -0
  92. package/dist/types/cli/tiny-models-cli.d.ts +11 -0
  93. package/dist/types/cli/ttsr-cli.d.ts +39 -0
  94. package/dist/types/cli/update-cli.d.ts +106 -0
  95. package/dist/types/cli/update-cli.test.d.ts +1 -0
  96. package/dist/types/cli/usage-cli.d.ts +95 -0
  97. package/dist/types/cli/web-search-cli.d.ts +20 -0
  98. package/dist/types/cli/worktree-cli.d.ts +26 -0
  99. package/dist/types/cli-commands.d.ts +33 -0
  100. package/dist/types/cli.d.ts +3 -0
  101. package/dist/types/collab/crypto.d.ts +7 -0
  102. package/dist/types/collab/display-name.d.ts +3 -0
  103. package/dist/types/collab/guest.d.ts +52 -0
  104. package/dist/types/collab/host.d.ts +43 -0
  105. package/dist/types/collab/protocol.d.ts +143 -0
  106. package/dist/types/collab/relay-client.d.ts +22 -0
  107. package/dist/types/collab/replication-shrink.d.ts +39 -0
  108. package/dist/types/commands/acp.d.ts +12 -0
  109. package/dist/types/commands/agents.d.ts +34 -0
  110. package/dist/types/commands/auth-broker.d.ts +54 -0
  111. package/dist/types/commands/auth-gateway.d.ts +35 -0
  112. package/dist/types/commands/bench.d.ts +37 -0
  113. package/dist/types/commands/commit.d.ts +27 -0
  114. package/dist/types/commands/complete.d.ts +6 -0
  115. package/dist/types/commands/completions.d.ts +13 -0
  116. package/dist/types/commands/config.d.ts +30 -0
  117. package/dist/types/commands/dry-balance.d.ts +31 -0
  118. package/dist/types/commands/gallery.d.ts +47 -0
  119. package/dist/types/commands/gc.d.ts +37 -0
  120. package/dist/types/commands/grep.d.ts +42 -0
  121. package/dist/types/commands/grievances.d.ts +40 -0
  122. package/dist/types/commands/install.d.ts +51 -0
  123. package/dist/types/commands/join.d.ts +12 -0
  124. package/dist/types/commands/launch.d.ts +148 -0
  125. package/dist/types/commands/models.d.ts +33 -0
  126. package/dist/types/commands/plugin.d.ts +52 -0
  127. package/dist/types/commands/read.d.ts +15 -0
  128. package/dist/types/commands/say.d.ts +24 -0
  129. package/dist/types/commands/setup.d.ts +34 -0
  130. package/dist/types/commands/shell.d.ts +21 -0
  131. package/dist/types/commands/ssh.d.ts +48 -0
  132. package/dist/types/commands/stats.d.ts +25 -0
  133. package/dist/types/commands/tiny-models.d.ts +22 -0
  134. package/dist/types/commands/token.d.ts +34 -0
  135. package/dist/types/commands/ttsr.d.ts +57 -0
  136. package/dist/types/commands/update.d.ts +25 -0
  137. package/dist/types/commands/usage.d.ts +34 -0
  138. package/dist/types/commands/web-search.d.ts +33 -0
  139. package/dist/types/commands/worktree.d.ts +31 -0
  140. package/dist/types/commit/agentic/agent.d.ts +31 -0
  141. package/dist/types/commit/agentic/fallback.d.ts +5 -0
  142. package/dist/types/commit/agentic/index.d.ts +2 -0
  143. package/dist/types/commit/agentic/state.d.ts +58 -0
  144. package/dist/types/commit/agentic/tools/analyze-file.d.ts +18 -0
  145. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +9 -0
  146. package/dist/types/commit/agentic/tools/git-hunk.d.ts +8 -0
  147. package/dist/types/commit/agentic/tools/git-overview.d.ts +8 -0
  148. package/dist/types/commit/agentic/tools/index.d.ts +16 -0
  149. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +27 -0
  150. package/dist/types/commit/agentic/tools/propose-commit.d.ts +15 -0
  151. package/dist/types/commit/agentic/tools/recent-commits.d.ts +6 -0
  152. package/dist/types/commit/agentic/tools/schemas.d.ts +6 -0
  153. package/dist/types/commit/agentic/tools/split-commit.d.ts +32 -0
  154. package/dist/types/commit/agentic/topo-sort.d.ts +4 -0
  155. package/dist/types/commit/agentic/trivial.d.ts +7 -0
  156. package/dist/types/commit/agentic/validation.d.ts +20 -0
  157. package/dist/types/commit/analysis/conventional.d.ts +22 -0
  158. package/dist/types/commit/analysis/index.d.ts +4 -0
  159. package/dist/types/commit/analysis/scope.d.ts +6 -0
  160. package/dist/types/commit/analysis/summary.d.ts +19 -0
  161. package/dist/types/commit/analysis/validation.d.ts +8 -0
  162. package/dist/types/commit/changelog/detect.d.ts +2 -0
  163. package/dist/types/commit/changelog/generate.d.ts +29 -0
  164. package/dist/types/commit/changelog/index.d.ts +30 -0
  165. package/dist/types/commit/changelog/parse.d.ts +2 -0
  166. package/dist/types/commit/cli.d.ts +3 -0
  167. package/dist/types/commit/git/diff.d.ts +5 -0
  168. package/dist/types/commit/index.d.ts +4 -0
  169. package/dist/types/commit/map-reduce/index.d.ts +28 -0
  170. package/dist/types/commit/map-reduce/map-phase.d.ts +17 -0
  171. package/dist/types/commit/map-reduce/reduce-phase.d.ts +13 -0
  172. package/dist/types/commit/map-reduce/utils.d.ts +2 -0
  173. package/dist/types/commit/message.d.ts +2 -0
  174. package/dist/types/commit/model-selection.d.ts +26 -0
  175. package/dist/types/commit/pipeline.d.ts +5 -0
  176. package/dist/types/commit/shared-llm.d.ts +27 -0
  177. package/dist/types/commit/types.d.ts +78 -0
  178. package/dist/types/commit/utils/exclusions.d.ts +4 -0
  179. package/dist/types/commit/utils.d.ts +20 -0
  180. package/dist/types/config/api-key-resolver.d.ts +43 -0
  181. package/dist/types/config/append-only-context-mode.d.ts +9 -0
  182. package/dist/types/config/config-file.d.ts +62 -0
  183. package/dist/types/config/file-lock.d.ts +29 -0
  184. package/dist/types/config/inline-tool-descriptors-mode.d.ts +12 -0
  185. package/dist/types/config/keybindings.d.ts +362 -0
  186. package/dist/types/config/model-discovery.d.ts +68 -0
  187. package/dist/types/config/model-registry.d.ts +251 -0
  188. package/dist/types/config/model-resolver.d.ts +300 -0
  189. package/dist/types/config/model-roles.d.ts +29 -0
  190. package/dist/types/config/models-config-schema.d.ts +697 -0
  191. package/dist/types/config/models-config.d.ts +436 -0
  192. package/dist/types/config/prompt-templates.d.ts +32 -0
  193. package/dist/types/config/provider-globals.d.ts +7 -0
  194. package/dist/types/config/resolve-config-value.d.ts +17 -0
  195. package/dist/types/config/service-tier.d.ts +49 -0
  196. package/dist/types/config/settings-schema.d.ts +5668 -0
  197. package/dist/types/config/settings.d.ts +181 -0
  198. package/dist/types/config.d.ts +92 -0
  199. package/dist/types/cursor.d.ts +22 -0
  200. package/dist/types/dap/client.d.ts +46 -0
  201. package/dist/types/dap/config.d.ts +19 -0
  202. package/dist/types/dap/index.d.ts +4 -0
  203. package/dist/types/dap/session.d.ts +108 -0
  204. package/dist/types/dap/types.d.ts +534 -0
  205. package/dist/types/debug/index.d.ts +15 -0
  206. package/dist/types/debug/log-formatting.d.ts +4 -0
  207. package/dist/types/debug/log-viewer.d.ts +69 -0
  208. package/dist/types/debug/profiler.d.ts +24 -0
  209. package/dist/types/debug/protocol-probe.d.ts +38 -0
  210. package/dist/types/debug/raw-sse-buffer.d.ts +44 -0
  211. package/dist/types/debug/raw-sse.d.ts +19 -0
  212. package/dist/types/debug/remote-debugger.d.ts +45 -0
  213. package/dist/types/debug/report-bundle.d.ts +58 -0
  214. package/dist/types/debug/system-info.d.ts +26 -0
  215. package/dist/types/debug/terminal-info.d.ts +33 -0
  216. package/dist/types/discovery/agents-md.d.ts +1 -0
  217. package/dist/types/discovery/agents.d.ts +12 -0
  218. package/dist/types/discovery/at-imports.d.ts +15 -0
  219. package/dist/types/discovery/builtin-defaults.d.ts +1 -0
  220. package/dist/types/discovery/builtin-rules/index.d.ts +7 -0
  221. package/dist/types/discovery/builtin.d.ts +1 -0
  222. package/dist/types/discovery/claude-plugins.d.ts +1 -0
  223. package/dist/types/discovery/claude.d.ts +1 -0
  224. package/dist/types/discovery/cline.d.ts +1 -0
  225. package/dist/types/discovery/codex.d.ts +1 -0
  226. package/dist/types/discovery/cursor.d.ts +16 -0
  227. package/dist/types/discovery/gemini.d.ts +1 -0
  228. package/dist/types/discovery/github.d.ts +1 -0
  229. package/dist/types/discovery/helpers.d.ts +278 -0
  230. package/dist/types/discovery/index.d.ts +53 -0
  231. package/dist/types/discovery/mcp-json.d.ts +1 -0
  232. package/dist/types/discovery/omp-extension-roots.d.ts +43 -0
  233. package/dist/types/discovery/omp-plugins.d.ts +1 -0
  234. package/dist/types/discovery/opencode.d.ts +1 -0
  235. package/dist/types/discovery/plugin-dir-roots.d.ts +15 -0
  236. package/dist/types/discovery/ssh.d.ts +1 -0
  237. package/dist/types/discovery/substitute-plugin-root.d.ts +1 -0
  238. package/dist/types/discovery/vscode.d.ts +1 -0
  239. package/dist/types/discovery/windsurf.d.ts +13 -0
  240. package/dist/types/edit/apply-patch/index.d.ts +35 -0
  241. package/dist/types/edit/apply-patch/parser.d.ts +34 -0
  242. package/dist/types/edit/diff.d.ts +60 -0
  243. package/dist/types/edit/file-snapshot-store.d.ts +74 -0
  244. package/dist/types/edit/hashline/block-resolver.d.ts +9 -0
  245. package/dist/types/edit/hashline/diff.d.ts +29 -0
  246. package/dist/types/edit/hashline/execute.d.ts +28 -0
  247. package/dist/types/edit/hashline/filesystem.d.ts +43 -0
  248. package/dist/types/edit/hashline/index.d.ts +5 -0
  249. package/dist/types/edit/hashline/noop-loop-guard.d.ts +72 -0
  250. package/dist/types/edit/hashline/params.d.ts +4 -0
  251. package/dist/types/edit/index.d.ts +83 -0
  252. package/dist/types/edit/modes/apply-patch.d.ts +23 -0
  253. package/dist/types/edit/modes/patch.d.ts +101 -0
  254. package/dist/types/edit/modes/replace.d.ts +141 -0
  255. package/dist/types/edit/normalize.d.ts +31 -0
  256. package/dist/types/edit/notebook.d.ts +23 -0
  257. package/dist/types/edit/read-file.d.ts +2 -0
  258. package/dist/types/edit/renderer.d.ts +118 -0
  259. package/dist/types/edit/snapshot-details.d.ts +33 -0
  260. package/dist/types/edit/streaming.d.ts +105 -0
  261. package/dist/types/eval/__tests__/agent-bridge.test.d.ts +1 -0
  262. package/dist/types/eval/__tests__/bridge-timeout.test.d.ts +1 -0
  263. package/dist/types/eval/__tests__/budget-bridge.test.d.ts +1 -0
  264. package/dist/types/eval/__tests__/completion-bridge.test.d.ts +1 -0
  265. package/dist/types/eval/__tests__/helpers-local-roots.test.d.ts +1 -0
  266. package/dist/types/eval/__tests__/idle-timeout.test.d.ts +1 -0
  267. package/dist/types/eval/__tests__/js-context-manager.test.d.ts +1 -0
  268. package/dist/types/eval/__tests__/julia-prelude.test.d.ts +1 -0
  269. package/dist/types/eval/__tests__/kernel-spawn.test.d.ts +1 -0
  270. package/dist/types/eval/__tests__/prelude-agent.test.d.ts +1 -0
  271. package/dist/types/eval/agent-bridge.d.ts +48 -0
  272. package/dist/types/eval/backend-helpers.d.ts +23 -0
  273. package/dist/types/eval/backend.d.ts +60 -0
  274. package/dist/types/eval/bridge-timeout.d.ts +27 -0
  275. package/dist/types/eval/budget-bridge.d.ts +29 -0
  276. package/dist/types/eval/completion-bridge.d.ts +25 -0
  277. package/dist/types/eval/concurrency-bridge.d.ts +26 -0
  278. package/dist/types/eval/executor-base.d.ts +118 -0
  279. package/dist/types/eval/idle-timeout.d.ts +26 -0
  280. package/dist/types/eval/index.d.ts +6 -0
  281. package/dist/types/eval/jl/executor.d.ts +44 -0
  282. package/dist/types/eval/jl/index.d.ts +11 -0
  283. package/dist/types/eval/jl/kernel.d.ts +28 -0
  284. package/dist/types/eval/jl/prelude.d.ts +1 -0
  285. package/dist/types/eval/jl/runtime.d.ts +22 -0
  286. package/dist/types/eval/js/context-manager.d.ts +40 -0
  287. package/dist/types/eval/js/executor.d.ts +38 -0
  288. package/dist/types/eval/js/index.d.ts +11 -0
  289. package/dist/types/eval/js/shared/helpers.d.ts +32 -0
  290. package/dist/types/eval/js/shared/indirect-eval.d.ts +14 -0
  291. package/dist/types/eval/js/shared/local-module-loader.d.ts +16 -0
  292. package/dist/types/eval/js/shared/prelude.d.ts +1 -0
  293. package/dist/types/eval/js/shared/rewrite-imports.d.ts +25 -0
  294. package/dist/types/eval/js/shared/runtime.d.ts +59 -0
  295. package/dist/types/eval/js/shared/types.d.ts +24 -0
  296. package/dist/types/eval/js/tool-bridge.d.ts +20 -0
  297. package/dist/types/eval/js/worker-core.d.ts +6 -0
  298. package/dist/types/eval/js/worker-entry.d.ts +1 -0
  299. package/dist/types/eval/js/worker-protocol.d.ts +83 -0
  300. package/dist/types/eval/kernel-base.d.ts +105 -0
  301. package/dist/types/eval/py/__tests__/prelude.test.d.ts +1 -0
  302. package/dist/types/eval/py/__tests__/runner-shell-output.test.d.ts +1 -0
  303. package/dist/types/eval/py/display.d.ts +25 -0
  304. package/dist/types/eval/py/executor.d.ts +107 -0
  305. package/dist/types/eval/py/index.d.ts +11 -0
  306. package/dist/types/eval/py/kernel.d.ts +17 -0
  307. package/dist/types/eval/py/prelude.d.ts +1 -0
  308. package/dist/types/eval/py/runtime.d.ts +40 -0
  309. package/dist/types/eval/py/spawn-options.d.ts +58 -0
  310. package/dist/types/eval/py/tool-bridge.d.ts +16 -0
  311. package/dist/types/eval/rb/executor.d.ts +77 -0
  312. package/dist/types/eval/rb/index.d.ts +11 -0
  313. package/dist/types/eval/rb/kernel.d.ts +31 -0
  314. package/dist/types/eval/rb/prelude.d.ts +1 -0
  315. package/dist/types/eval/rb/runtime.d.ts +23 -0
  316. package/dist/types/eval/runtime-env.d.ts +24 -0
  317. package/dist/types/eval/session-id.d.ts +3 -0
  318. package/dist/types/eval/types.d.ts +52 -0
  319. package/dist/types/exa/index.d.ts +2 -0
  320. package/dist/types/exa/mcp-client.d.ts +53 -0
  321. package/dist/types/exa/types.d.ts +72 -0
  322. package/dist/types/exec/bash-executor.d.ts +45 -0
  323. package/dist/types/exec/exec.d.ts +25 -0
  324. package/dist/types/exec/non-interactive-env.d.ts +3 -0
  325. package/dist/types/export/custom-share.d.ts +19 -0
  326. package/dist/types/export/html/index.d.ts +78 -0
  327. package/dist/types/export/html/web-palette.d.ts +117 -0
  328. package/dist/types/export/share.d.ts +55 -0
  329. package/dist/types/export/ttsr.d.ts +67 -0
  330. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +9 -0
  331. package/dist/types/extensibility/custom-commands/bundled/review/index.d.ts +10 -0
  332. package/dist/types/extensibility/custom-commands/index.d.ts +2 -0
  333. package/dist/types/extensibility/custom-commands/loader.d.ts +29 -0
  334. package/dist/types/extensibility/custom-commands/types.d.ts +112 -0
  335. package/dist/types/extensibility/custom-tools/index.d.ts +6 -0
  336. package/dist/types/extensibility/custom-tools/loader.d.ts +89 -0
  337. package/dist/types/extensibility/custom-tools/types.d.ts +244 -0
  338. package/dist/types/extensibility/custom-tools/wrapper.d.ts +23 -0
  339. package/dist/types/extensibility/extensions/compact-handler.d.ts +26 -0
  340. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +29 -0
  341. package/dist/types/extensibility/extensions/index.d.ts +8 -0
  342. package/dist/types/extensibility/extensions/loader.d.ts +59 -0
  343. package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
  344. package/dist/types/extensibility/extensions/runner.d.ts +161 -0
  345. package/dist/types/extensibility/extensions/types.d.ts +962 -0
  346. package/dist/types/extensibility/extensions/wrapper.d.ts +54 -0
  347. package/dist/types/extensibility/hooks/index.d.ts +6 -0
  348. package/dist/types/extensibility/hooks/loader.d.ts +65 -0
  349. package/dist/types/extensibility/hooks/runner.d.ts +126 -0
  350. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +25 -0
  351. package/dist/types/extensibility/hooks/types.d.ts +442 -0
  352. package/dist/types/extensibility/legacy-pi-ai-shim.d.ts +35 -0
  353. package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +115 -0
  354. package/dist/types/extensibility/plugins/doctor.d.ts +3 -0
  355. package/dist/types/extensibility/plugins/git-url.d.ts +44 -0
  356. package/dist/types/extensibility/plugins/index.d.ts +7 -0
  357. package/dist/types/extensibility/plugins/installer.d.ts +5 -0
  358. package/dist/types/extensibility/plugins/legacy-pi-bundled-keys.d.ts +10 -0
  359. package/dist/types/extensibility/plugins/legacy-pi-bundled-registry.d.ts +10 -0
  360. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +79 -0
  361. package/dist/types/extensibility/plugins/loader.d.ts +59 -0
  362. package/dist/types/extensibility/plugins/manager.d.ts +76 -0
  363. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +41 -0
  364. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +48 -0
  365. package/dist/types/extensibility/plugins/marketplace/index.d.ts +6 -0
  366. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +57 -0
  367. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +34 -0
  368. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +28 -0
  369. package/dist/types/extensibility/plugins/marketplace/types.d.ts +131 -0
  370. package/dist/types/extensibility/plugins/marketplace-auto-update.d.ts +8 -0
  371. package/dist/types/extensibility/plugins/parser.d.ts +53 -0
  372. package/dist/types/extensibility/plugins/runtime-config.d.ts +3 -0
  373. package/dist/types/extensibility/plugins/types.d.ts +149 -0
  374. package/dist/types/extensibility/session-handler-types.d.ts +23 -0
  375. package/dist/types/extensibility/shared-events.d.ts +308 -0
  376. package/dist/types/extensibility/skills.d.ts +97 -0
  377. package/dist/types/extensibility/slash-commands.d.ts +38 -0
  378. package/dist/types/extensibility/tool-event-input.d.ts +9 -0
  379. package/dist/types/extensibility/tool-proxy.d.ts +4 -0
  380. package/dist/types/extensibility/typebox.d.ts +177 -0
  381. package/dist/types/extensibility/utils.d.ts +24 -0
  382. package/dist/types/goals/guided-setup.d.ts +18 -0
  383. package/dist/types/goals/index.d.ts +3 -0
  384. package/dist/types/goals/runtime.d.ts +69 -0
  385. package/dist/types/goals/state.d.ts +35 -0
  386. package/dist/types/goals/tools/goal-tool.d.ts +53 -0
  387. package/dist/types/hindsight/backend.d.ts +13 -0
  388. package/dist/types/hindsight/bank.d.ts +62 -0
  389. package/dist/types/hindsight/client.d.ts +228 -0
  390. package/dist/types/hindsight/client.test.d.ts +1 -0
  391. package/dist/types/hindsight/config.d.ts +51 -0
  392. package/dist/types/hindsight/content.d.ts +73 -0
  393. package/dist/types/hindsight/index.d.ts +8 -0
  394. package/dist/types/hindsight/mental-models.d.ts +134 -0
  395. package/dist/types/hindsight/state.d.ts +105 -0
  396. package/dist/types/hindsight/transcript.d.ts +28 -0
  397. package/dist/types/index.d.ts +43 -0
  398. package/dist/types/internal-urls/__tests__/ssh-protocol.test.d.ts +1 -0
  399. package/dist/types/internal-urls/agent-protocol.d.ts +13 -0
  400. package/dist/types/internal-urls/artifact-protocol.d.ts +15 -0
  401. package/dist/types/internal-urls/docs-index.d.ts +19 -0
  402. package/dist/types/internal-urls/filesystem-resource.d.ts +9 -0
  403. package/dist/types/internal-urls/history-protocol.d.ts +14 -0
  404. package/dist/types/internal-urls/index.d.ts +25 -0
  405. package/dist/types/internal-urls/issue-pr-protocol.d.ts +17 -0
  406. package/dist/types/internal-urls/json-query.d.ts +30 -0
  407. package/dist/types/internal-urls/local-protocol.d.ts +79 -0
  408. package/dist/types/internal-urls/mcp-protocol.d.ts +12 -0
  409. package/dist/types/internal-urls/memory-protocol.d.ts +24 -0
  410. package/dist/types/internal-urls/omp-protocol.d.ts +13 -0
  411. package/dist/types/internal-urls/parse.d.ts +19 -0
  412. package/dist/types/internal-urls/registry-helpers.d.ts +12 -0
  413. package/dist/types/internal-urls/router.d.ts +21 -0
  414. package/dist/types/internal-urls/rule-protocol.d.ts +7 -0
  415. package/dist/types/internal-urls/skill-protocol.d.ts +14 -0
  416. package/dist/types/internal-urls/ssh-protocol.d.ts +10 -0
  417. package/dist/types/internal-urls/types.d.ts +175 -0
  418. package/dist/types/internal-urls/vault-protocol.d.ts +93 -0
  419. package/dist/types/irc/bus.d.ts +86 -0
  420. package/dist/types/jsonrpc/message-framing.d.ts +35 -0
  421. package/dist/types/lib/xai-http.d.ts +40 -0
  422. package/dist/types/lsp/client.d.ts +84 -0
  423. package/dist/types/lsp/clients/biome-client.d.ts +16 -0
  424. package/dist/types/lsp/clients/index.d.ts +19 -0
  425. package/dist/types/lsp/clients/lsp-linter-client.d.ts +16 -0
  426. package/dist/types/lsp/clients/swiftlint-client.d.ts +20 -0
  427. package/dist/types/lsp/config.d.ts +69 -0
  428. package/dist/types/lsp/diagnostics-ledger.d.ts +10 -0
  429. package/dist/types/lsp/edits.d.ts +34 -0
  430. package/dist/types/lsp/format-options.d.ts +32 -0
  431. package/dist/types/lsp/index.d.ts +120 -0
  432. package/dist/types/lsp/lspmux.d.ts +58 -0
  433. package/dist/types/lsp/render.d.ts +32 -0
  434. package/dist/types/lsp/startup-events.d.ts +11 -0
  435. package/dist/types/lsp/types.d.ts +300 -0
  436. package/dist/types/lsp/utils.d.ts +116 -0
  437. package/dist/types/main.d.ts +70 -0
  438. package/dist/types/markit/converters/docx.d.ts +6 -0
  439. package/dist/types/markit/converters/epub.d.ts +15 -0
  440. package/dist/types/markit/converters/pdf/columns.d.ts +35 -0
  441. package/dist/types/markit/converters/pdf/extract.d.ts +10 -0
  442. package/dist/types/markit/converters/pdf/grid.d.ts +25 -0
  443. package/dist/types/markit/converters/pdf/headers.d.ts +24 -0
  444. package/dist/types/markit/converters/pdf/index.d.ts +6 -0
  445. package/dist/types/markit/converters/pdf/render.d.ts +24 -0
  446. package/dist/types/markit/converters/pdf/types.d.ts +75 -0
  447. package/dist/types/markit/converters/pptx.d.ts +57 -0
  448. package/dist/types/markit/converters/xlsx.d.ts +25 -0
  449. package/dist/types/markit/index.d.ts +2 -0
  450. package/dist/types/markit/registry.d.ts +16 -0
  451. package/dist/types/markit/types.d.ts +30 -0
  452. package/dist/types/mcp/client.d.ts +83 -0
  453. package/dist/types/mcp/config-writer.d.ts +101 -0
  454. package/dist/types/mcp/config.d.ts +75 -0
  455. package/dist/types/mcp/index.d.ts +18 -0
  456. package/dist/types/mcp/json-rpc.d.ts +32 -0
  457. package/dist/types/mcp/loader.d.ts +44 -0
  458. package/dist/types/mcp/manager.d.ts +215 -0
  459. package/dist/types/mcp/oauth-credentials.d.ts +17 -0
  460. package/dist/types/mcp/oauth-discovery.d.ts +65 -0
  461. package/dist/types/mcp/oauth-flow.d.ts +145 -0
  462. package/dist/types/mcp/render.d.ts +25 -0
  463. package/dist/types/mcp/smithery-auth.d.ts +16 -0
  464. package/dist/types/mcp/smithery-connect.d.ts +38 -0
  465. package/dist/types/mcp/smithery-registry.d.ts +52 -0
  466. package/dist/types/mcp/smithery-registry.test.d.ts +1 -0
  467. package/dist/types/mcp/startup-events.d.ts +28 -0
  468. package/dist/types/mcp/timeout.d.ts +9 -0
  469. package/dist/types/mcp/tool-bridge.d.ts +95 -0
  470. package/dist/types/mcp/tool-cache.d.ts +8 -0
  471. package/dist/types/mcp/transports/http.d.ts +45 -0
  472. package/dist/types/mcp/transports/index.d.ts +6 -0
  473. package/dist/types/mcp/transports/sse.d.ts +20 -0
  474. package/dist/types/mcp/transports/stdio.d.ts +108 -0
  475. package/dist/types/mcp/transports/stdio.test.d.ts +1 -0
  476. package/dist/types/mcp/types.d.ts +340 -0
  477. package/dist/types/memories/index.d.ts +54 -0
  478. package/dist/types/memories/storage.d.ts +110 -0
  479. package/dist/types/memory-backend/index.d.ts +7 -0
  480. package/dist/types/memory-backend/local-backend.d.ts +10 -0
  481. package/dist/types/memory-backend/off-backend.d.ts +7 -0
  482. package/dist/types/memory-backend/resolve.d.ts +16 -0
  483. package/dist/types/memory-backend/runtime.d.ts +4 -0
  484. package/dist/types/memory-backend/types.d.ts +132 -0
  485. package/dist/types/mnemopi/backend.d.ts +4 -0
  486. package/dist/types/mnemopi/config.d.ts +60 -0
  487. package/dist/types/mnemopi/embed-client.d.ts +53 -0
  488. package/dist/types/mnemopi/embed-protocol.d.ts +52 -0
  489. package/dist/types/mnemopi/embed-worker.d.ts +12 -0
  490. package/dist/types/mnemopi/index.d.ts +3 -0
  491. package/dist/types/mnemopi/state.d.ts +130 -0
  492. package/dist/types/modes/acp/acp-agent.d.ts +60 -0
  493. package/dist/types/modes/acp/acp-client-bridge.d.ts +9 -0
  494. package/dist/types/modes/acp/acp-event-mapper.d.ts +33 -0
  495. package/dist/types/modes/acp/acp-mode.d.ts +5 -0
  496. package/dist/types/modes/acp/index.d.ts +2 -0
  497. package/dist/types/modes/acp/terminal-auth.d.ts +6 -0
  498. package/dist/types/modes/components/__tests__/move-overlay.test.d.ts +1 -0
  499. package/dist/types/modes/components/__tests__/skill-message.test.d.ts +1 -0
  500. package/dist/types/modes/components/advisor-config.d.ts +59 -0
  501. package/dist/types/modes/components/advisor-message.d.ts +11 -0
  502. package/dist/types/modes/components/agent-dashboard.d.ts +22 -0
  503. package/dist/types/modes/components/agent-hub.d.ts +77 -0
  504. package/dist/types/modes/components/agent-transcript-viewer.d.ts +40 -0
  505. package/dist/types/modes/components/assistant-message.d.ts +58 -0
  506. package/dist/types/modes/components/background-tan-message.d.ts +9 -0
  507. package/dist/types/modes/components/bash-execution.d.ts +35 -0
  508. package/dist/types/modes/components/bordered-loader.d.ts +11 -0
  509. package/dist/types/modes/components/btw-panel.d.ts +19 -0
  510. package/dist/types/modes/components/cache-invalidation-marker.d.ts +52 -0
  511. package/dist/types/modes/components/chat-block.d.ts +64 -0
  512. package/dist/types/modes/components/chat-transcript-builder.d.ts +45 -0
  513. package/dist/types/modes/components/collab-prompt-message.d.ts +10 -0
  514. package/dist/types/modes/components/compaction-summary-message.d.ts +46 -0
  515. package/dist/types/modes/components/copy-selector.d.ts +22 -0
  516. package/dist/types/modes/components/countdown-timer.d.ts +14 -0
  517. package/dist/types/modes/components/custom-editor.d.ts +163 -0
  518. package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
  519. package/dist/types/modes/components/custom-message.d.ts +15 -0
  520. package/dist/types/modes/components/diff.d.ts +11 -0
  521. package/dist/types/modes/components/dynamic-border.d.ts +14 -0
  522. package/dist/types/modes/components/error-banner.d.ts +11 -0
  523. package/dist/types/modes/components/eval-execution.d.ts +29 -0
  524. package/dist/types/modes/components/execution-shared.d.ts +46 -0
  525. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +43 -0
  526. package/dist/types/modes/components/extensions/extension-list.d.ts +52 -0
  527. package/dist/types/modes/components/extensions/index.d.ts +8 -0
  528. package/dist/types/modes/components/extensions/inspector-panel.d.ts +8 -0
  529. package/dist/types/modes/components/extensions/state-manager.d.ts +50 -0
  530. package/dist/types/modes/components/extensions/types.d.ts +147 -0
  531. package/dist/types/modes/components/footer.d.ts +30 -0
  532. package/dist/types/modes/components/history-search.d.ts +7 -0
  533. package/dist/types/modes/components/hook-editor.d.ts +24 -0
  534. package/dist/types/modes/components/hook-input.d.ts +19 -0
  535. package/dist/types/modes/components/hook-message.d.ts +15 -0
  536. package/dist/types/modes/components/hook-selector.d.ts +68 -0
  537. package/dist/types/modes/components/index.d.ts +38 -0
  538. package/dist/types/modes/components/keybinding-hints.d.ts +40 -0
  539. package/dist/types/modes/components/late-diagnostics-message.d.ts +20 -0
  540. package/dist/types/modes/components/login-dialog.d.ts +40 -0
  541. package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
  542. package/dist/types/modes/components/mcp-add-wizard.d.ts +38 -0
  543. package/dist/types/modes/components/message-frame.d.ts +44 -0
  544. package/dist/types/modes/components/model-selector.d.ts +36 -0
  545. package/dist/types/modes/components/move-overlay.d.ts +23 -0
  546. package/dist/types/modes/components/oauth-selector.d.ts +23 -0
  547. package/dist/types/modes/components/omfg-panel.d.ts +19 -0
  548. package/dist/types/modes/components/overlay-box.d.ts +17 -0
  549. package/dist/types/modes/components/plan-review-overlay.d.ts +61 -0
  550. package/dist/types/modes/components/plan-toc.d.ts +41 -0
  551. package/dist/types/modes/components/plugin-selector.d.ts +27 -0
  552. package/dist/types/modes/components/plugin-settings.d.ts +103 -0
  553. package/dist/types/modes/components/queue-mode-selector.d.ts +10 -0
  554. package/dist/types/modes/components/read-tool-group.d.ts +38 -0
  555. package/dist/types/modes/components/reset-usage-selector.d.ts +12 -0
  556. package/dist/types/modes/components/segment-track.d.ts +27 -0
  557. package/dist/types/modes/components/select-list-mouse-routing.d.ts +2 -0
  558. package/dist/types/modes/components/selector-helpers.d.ts +53 -0
  559. package/dist/types/modes/components/session-selector.d.ts +94 -0
  560. package/dist/types/modes/components/settings-defs.d.ts +60 -0
  561. package/dist/types/modes/components/settings-selector.d.ts +70 -0
  562. package/dist/types/modes/components/show-images-selector.d.ts +10 -0
  563. package/dist/types/modes/components/skill-message.d.ts +9 -0
  564. package/dist/types/modes/components/snapcompact-shape-preview.d.ts +31 -0
  565. package/dist/types/modes/components/status-line/component.d.ts +94 -0
  566. package/dist/types/modes/components/status-line/component.test.d.ts +1 -0
  567. package/dist/types/modes/components/status-line/context-thresholds.d.ts +10 -0
  568. package/dist/types/modes/components/status-line/git-utils.d.ts +22 -0
  569. package/dist/types/modes/components/status-line/index.d.ts +5 -0
  570. package/dist/types/modes/components/status-line/presets.d.ts +3 -0
  571. package/dist/types/modes/components/status-line/segments.d.ts +5 -0
  572. package/dist/types/modes/components/status-line/separators.d.ts +3 -0
  573. package/dist/types/modes/components/status-line/token-rate.d.ts +10 -0
  574. package/dist/types/modes/components/status-line/types.d.ts +150 -0
  575. package/dist/types/modes/components/theme-selector.d.ts +11 -0
  576. package/dist/types/modes/components/thinking-selector.d.ts +11 -0
  577. package/dist/types/modes/components/tiny-title-download-progress.d.ts +11 -0
  578. package/dist/types/modes/components/todo-reminder.d.ts +15 -0
  579. package/dist/types/modes/components/tool-execution.d.ts +117 -0
  580. package/dist/types/modes/components/transcript-container.d.ts +86 -0
  581. package/dist/types/modes/components/tree-selector.d.ts +31 -0
  582. package/dist/types/modes/components/ttsr-notification.d.ts +17 -0
  583. package/dist/types/modes/components/usage-row.d.ts +3 -0
  584. package/dist/types/modes/components/user-message-selector.d.ts +28 -0
  585. package/dist/types/modes/components/user-message.d.ts +9 -0
  586. package/dist/types/modes/components/visual-truncate.d.ts +19 -0
  587. package/dist/types/modes/components/welcome.d.ts +66 -0
  588. package/dist/types/modes/controllers/btw-controller.d.ts +14 -0
  589. package/dist/types/modes/controllers/command-controller-shared.d.ts +47 -0
  590. package/dist/types/modes/controllers/command-controller.d.ts +55 -0
  591. package/dist/types/modes/controllers/event-controller.d.ts +28 -0
  592. package/dist/types/modes/controllers/extension-ui-controller.d.ts +88 -0
  593. package/dist/types/modes/controllers/input-controller.d.ts +71 -0
  594. package/dist/types/modes/controllers/mcp-command-controller.d.ts +44 -0
  595. package/dist/types/modes/controllers/omfg-controller.d.ts +10 -0
  596. package/dist/types/modes/controllers/omfg-rule.d.ts +26 -0
  597. package/dist/types/modes/controllers/selector-controller.d.ts +61 -0
  598. package/dist/types/modes/controllers/session-focus-controller.d.ts +31 -0
  599. package/dist/types/modes/controllers/ssh-command-controller.d.ts +10 -0
  600. package/dist/types/modes/controllers/streaming-reveal.d.ts +45 -0
  601. package/dist/types/modes/controllers/tan-command-controller.d.ts +6 -0
  602. package/dist/types/modes/controllers/todo-command-controller.d.ts +7 -0
  603. package/dist/types/modes/controllers/tool-args-reveal.d.ts +77 -0
  604. package/dist/types/modes/emoji-autocomplete.d.ts +16 -0
  605. package/dist/types/modes/gradient-highlight.d.ts +32 -0
  606. package/dist/types/modes/image-references.d.ts +28 -0
  607. package/dist/types/modes/index.d.ts +10 -0
  608. package/dist/types/modes/interactive-mode.d.ts +401 -0
  609. package/dist/types/modes/internal-url-autocomplete.d.ts +43 -0
  610. package/dist/types/modes/loop-limit.d.ts +35 -0
  611. package/dist/types/modes/magic-keywords.d.ts +26 -0
  612. package/dist/types/modes/markdown-prose.d.ts +27 -0
  613. package/dist/types/modes/oauth-manual-input.d.ts +15 -0
  614. package/dist/types/modes/orchestrate.d.ts +15 -0
  615. package/dist/types/modes/print-mode.d.ts +29 -0
  616. package/dist/types/modes/prompt-action-autocomplete.d.ts +46 -0
  617. package/dist/types/modes/rpc/host-tools.d.ts +16 -0
  618. package/dist/types/modes/rpc/host-uris.d.ts +38 -0
  619. package/dist/types/modes/rpc/rpc-client.d.ts +304 -0
  620. package/dist/types/modes/rpc/rpc-mode.d.ts +145 -0
  621. package/dist/types/modes/rpc/rpc-subagents.d.ts +24 -0
  622. package/dist/types/modes/rpc/rpc-types.d.ts +705 -0
  623. package/dist/types/modes/running-subagent-badge.d.ts +6 -0
  624. package/dist/types/modes/runtime-init.d.ts +25 -0
  625. package/dist/types/modes/session-observer-registry.d.ts +35 -0
  626. package/dist/types/modes/session-teardown.d.ts +63 -0
  627. package/dist/types/modes/session-teardown.test.d.ts +1 -0
  628. package/dist/types/modes/setup-version.d.ts +11 -0
  629. package/dist/types/modes/setup-wizard/index.d.ts +22 -0
  630. package/dist/types/modes/setup-wizard/lazy.d.ts +2 -0
  631. package/dist/types/modes/setup-wizard/scenes/glyph.d.ts +2 -0
  632. package/dist/types/modes/setup-wizard/scenes/outro.d.ts +2 -0
  633. package/dist/types/modes/setup-wizard/scenes/providers.d.ts +2 -0
  634. package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +22 -0
  635. package/dist/types/modes/setup-wizard/scenes/splash.d.ts +11 -0
  636. package/dist/types/modes/setup-wizard/scenes/theme.d.ts +2 -0
  637. package/dist/types/modes/setup-wizard/scenes/types.d.ts +52 -0
  638. package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +23 -0
  639. package/dist/types/modes/setup-wizard/startup-splash.d.ts +7 -0
  640. package/dist/types/modes/setup-wizard/wizard-overlay.d.ts +15 -0
  641. package/dist/types/modes/shared.d.ts +15 -0
  642. package/dist/types/modes/skill-command.d.ts +32 -0
  643. package/dist/types/modes/theme/defaults/index.d.ts +9436 -0
  644. package/dist/types/modes/theme/mermaid-cache.d.ts +26 -0
  645. package/dist/types/modes/theme/mermaid-rendering.test.d.ts +1 -0
  646. package/dist/types/modes/theme/shimmer.d.ts +40 -0
  647. package/dist/types/modes/theme/theme.d.ts +360 -0
  648. package/dist/types/modes/turn-budget.d.ts +18 -0
  649. package/dist/types/modes/types.d.ts +399 -0
  650. package/dist/types/modes/ultrathink.d.ts +15 -0
  651. package/dist/types/modes/utils/context-usage.d.ts +64 -0
  652. package/dist/types/modes/utils/copy-targets.d.ts +75 -0
  653. package/dist/types/modes/utils/hotkeys-markdown.d.ts +5 -0
  654. package/dist/types/modes/utils/interactive-context-helpers.d.ts +14 -0
  655. package/dist/types/modes/utils/keybinding-matchers.d.ts +32 -0
  656. package/dist/types/modes/utils/tools-markdown.d.ts +5 -0
  657. package/dist/types/modes/utils/transcript-render-helpers.d.ts +63 -0
  658. package/dist/types/modes/utils/ui-helpers.d.ts +55 -0
  659. package/dist/types/modes/workflow.d.ts +15 -0
  660. package/dist/types/plan-mode/approved-plan-prompt.test.d.ts +1 -0
  661. package/dist/types/plan-mode/approved-plan.d.ts +68 -0
  662. package/dist/types/plan-mode/plan-handoff.d.ts +20 -0
  663. package/dist/types/plan-mode/plan-protection.d.ts +12 -0
  664. package/dist/types/plan-mode/state.d.ts +6 -0
  665. package/dist/types/registry/agent-lifecycle.d.ts +66 -0
  666. package/dist/types/registry/agent-registry.d.ts +97 -0
  667. package/dist/types/sdk.d.ts +370 -0
  668. package/dist/types/secrets/index.d.ts +9 -0
  669. package/dist/types/secrets/obfuscator.d.ts +63 -0
  670. package/dist/types/secrets/regex.d.ts +2 -0
  671. package/dist/types/session/agent-session.d.ts +1419 -0
  672. package/dist/types/session/agent-storage.d.ts +97 -0
  673. package/dist/types/session/artifacts.d.ts +61 -0
  674. package/dist/types/session/auth-broker-config.d.ts +45 -0
  675. package/dist/types/session/auth-storage.d.ts +7 -0
  676. package/dist/types/session/blob-store.d.ts +68 -0
  677. package/dist/types/session/client-bridge.d.ts +88 -0
  678. package/dist/types/session/codex-auto-reset.d.ts +111 -0
  679. package/dist/types/session/compact-modes.d.ts +60 -0
  680. package/dist/types/session/exit-diagnostics.d.ts +48 -0
  681. package/dist/types/session/history-storage.d.ts +30 -0
  682. package/dist/types/session/indexed-session-storage.d.ts +65 -0
  683. package/dist/types/session/messages.d.ts +220 -0
  684. package/dist/types/session/messages.test.d.ts +1 -0
  685. package/dist/types/session/provider-image-budget.d.ts +3 -0
  686. package/dist/types/session/redis-session-storage.d.ts +51 -0
  687. package/dist/types/session/session-context.d.ts +44 -0
  688. package/dist/types/session/session-dump-format.d.ts +30 -0
  689. package/dist/types/session/session-entries.d.ts +197 -0
  690. package/dist/types/session/session-history-format.d.ts +49 -0
  691. package/dist/types/session/session-listing.d.ts +78 -0
  692. package/dist/types/session/session-loader.d.ts +29 -0
  693. package/dist/types/session/session-manager.d.ts +306 -0
  694. package/dist/types/session/session-migrations.d.ts +12 -0
  695. package/dist/types/session/session-paths.d.ts +25 -0
  696. package/dist/types/session/session-persistence.d.ts +12 -0
  697. package/dist/types/session/session-storage.d.ts +129 -0
  698. package/dist/types/session/session-title-slot.d.ts +19 -0
  699. package/dist/types/session/settings-stream-fn.d.ts +21 -0
  700. package/dist/types/session/shake-types.d.ts +24 -0
  701. package/dist/types/session/snapcompact-inline.d.ts +145 -0
  702. package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
  703. package/dist/types/session/sql-session-storage.d.ts +72 -0
  704. package/dist/types/session/streaming-output.d.ts +229 -0
  705. package/dist/types/session/tool-choice-queue.d.ts +94 -0
  706. package/dist/types/session/turn-persistence.d.ts +88 -0
  707. package/dist/types/session/unexpected-stop-classifier.d.ts +13 -0
  708. package/dist/types/session/yield-queue.d.ts +37 -0
  709. package/dist/types/slash-commands/acp-builtins.d.ts +34 -0
  710. package/dist/types/slash-commands/available-commands.d.ts +34 -0
  711. package/dist/types/slash-commands/builtin-registry.d.ts +36 -0
  712. package/dist/types/slash-commands/helpers/active-oauth-account.d.ts +14 -0
  713. package/dist/types/slash-commands/helpers/collab-qrcode.d.ts +13 -0
  714. package/dist/types/slash-commands/helpers/context-report.d.ts +7 -0
  715. package/dist/types/slash-commands/helpers/format.d.ts +10 -0
  716. package/dist/types/slash-commands/helpers/logout.d.ts +15 -0
  717. package/dist/types/slash-commands/helpers/marketplace-manager.d.ts +8 -0
  718. package/dist/types/slash-commands/helpers/mcp.d.ts +3 -0
  719. package/dist/types/slash-commands/helpers/parse.d.ts +33 -0
  720. package/dist/types/slash-commands/helpers/reset-usage.d.ts +27 -0
  721. package/dist/types/slash-commands/helpers/ssh.d.ts +3 -0
  722. package/dist/types/slash-commands/helpers/stats-dashboard.d.ts +13 -0
  723. package/dist/types/slash-commands/helpers/todo.d.ts +3 -0
  724. package/dist/types/slash-commands/helpers/usage-report.d.ts +7 -0
  725. package/dist/types/slash-commands/marketplace-install-parser.d.ts +33 -0
  726. package/dist/types/slash-commands/types.d.ts +127 -0
  727. package/dist/types/ssh/__tests__/connection-manager-args.test.d.ts +1 -0
  728. package/dist/types/ssh/__tests__/connection-manager-timeout.test.d.ts +1 -0
  729. package/dist/types/ssh/__tests__/file-transfer-posix-guard.test.d.ts +1 -0
  730. package/dist/types/ssh/__tests__/sshfs-mount.test.d.ts +1 -0
  731. package/dist/types/ssh/config-writer.d.ts +49 -0
  732. package/dist/types/ssh/connection-manager.d.ts +109 -0
  733. package/dist/types/ssh/file-transfer.d.ts +79 -0
  734. package/dist/types/ssh/ssh-executor.d.ts +37 -0
  735. package/dist/types/ssh/sshfs-mount.d.ts +15 -0
  736. package/dist/types/ssh/utils.d.ts +24 -0
  737. package/dist/types/startup-splash.d.ts +12 -0
  738. package/dist/types/stt/asr-client.d.ts +68 -0
  739. package/dist/types/stt/asr-protocol.d.ts +97 -0
  740. package/dist/types/stt/asr-worker.d.ts +2 -0
  741. package/dist/types/stt/downloader.d.ts +47 -0
  742. package/dist/types/stt/endpointer.d.ts +59 -0
  743. package/dist/types/stt/index.d.ts +8 -0
  744. package/dist/types/stt/models.d.ts +120 -0
  745. package/dist/types/stt/recorder.d.ts +30 -0
  746. package/dist/types/stt/stt-controller.d.ts +24 -0
  747. package/dist/types/stt/submit-trigger.d.ts +30 -0
  748. package/dist/types/stt/transcriber.d.ts +14 -0
  749. package/dist/types/stt/wav.d.ts +29 -0
  750. package/dist/types/subprocess/worker-client.d.ts +163 -0
  751. package/dist/types/subprocess/worker-runtime.d.ts +118 -0
  752. package/dist/types/system-prompt.d.ts +128 -0
  753. package/dist/types/system-prompt.test.d.ts +1 -0
  754. package/dist/types/task/agents.d.ts +28 -0
  755. package/dist/types/task/commands.d.ts +35 -0
  756. package/dist/types/task/discovery.d.ts +20 -0
  757. package/dist/types/task/executor.d.ts +214 -0
  758. package/dist/types/task/index.d.ts +79 -0
  759. package/dist/types/task/isolation-runner.d.ts +128 -0
  760. package/dist/types/task/name-generator.d.ts +16 -0
  761. package/dist/types/task/omp-command.d.ts +7 -0
  762. package/dist/types/task/output-manager.d.ts +20 -0
  763. package/dist/types/task/parallel.d.ts +55 -0
  764. package/dist/types/task/persisted-revive.d.ts +36 -0
  765. package/dist/types/task/provider-concurrency.d.ts +40 -0
  766. package/dist/types/task/render.d.ts +34 -0
  767. package/dist/types/task/render.test.d.ts +1 -0
  768. package/dist/types/task/renderer.d.ts +14 -0
  769. package/dist/types/task/repair-args.d.ts +53 -0
  770. package/dist/types/task/spawn-policy.d.ts +17 -0
  771. package/dist/types/task/spawn-policy.test.d.ts +1 -0
  772. package/dist/types/task/subprocess-tool-registry.d.ts +72 -0
  773. package/dist/types/task/types.d.ts +384 -0
  774. package/dist/types/task/worktree.d.ts +135 -0
  775. package/dist/types/task/yield-assembly.d.ts +28 -0
  776. package/dist/types/telemetry-export.d.ts +19 -0
  777. package/dist/types/thinking.d.ts +96 -0
  778. package/dist/types/tiny/device.d.ts +78 -0
  779. package/dist/types/tiny/dtype.d.ts +85 -0
  780. package/dist/types/tiny/models.d.ts +230 -0
  781. package/dist/types/tiny/text.d.ts +44 -0
  782. package/dist/types/tiny/title-client.d.ts +68 -0
  783. package/dist/types/tiny/title-protocol.d.ts +78 -0
  784. package/dist/types/tiny/worker.d.ts +2 -0
  785. package/dist/types/tool-discovery/mode.d.ts +8 -0
  786. package/dist/types/tool-discovery/tool-index.d.ts +57 -0
  787. package/dist/types/tools/__tests__/eval-description.test.d.ts +1 -0
  788. package/dist/types/tools/__tests__/json-tree.test.d.ts +1 -0
  789. package/dist/types/tools/acp-bridge.d.ts +29 -0
  790. package/dist/types/tools/approval.d.ts +46 -0
  791. package/dist/types/tools/ask.d.ts +119 -0
  792. package/dist/types/tools/ast-edit.d.ts +84 -0
  793. package/dist/types/tools/ast-grep.d.ts +76 -0
  794. package/dist/types/tools/auto-generated-guard.d.ts +17 -0
  795. package/dist/types/tools/bash-command-fixup.d.ts +11 -0
  796. package/dist/types/tools/bash-interactive.d.ts +16 -0
  797. package/dist/types/tools/bash-interceptor.d.ts +24 -0
  798. package/dist/types/tools/bash-pty-selection.d.ts +7 -0
  799. package/dist/types/tools/bash-skill-urls.d.ts +31 -0
  800. package/dist/types/tools/bash.d.ts +173 -0
  801. package/dist/types/tools/browser/aria/aria-snapshot.d.ts +39 -0
  802. package/dist/types/tools/browser/attach.d.ts +34 -0
  803. package/dist/types/tools/browser/cmux/cmux-tab.d.ts +212 -0
  804. package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
  805. package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
  806. package/dist/types/tools/browser/launch.d.ts +67 -0
  807. package/dist/types/tools/browser/readable.d.ts +17 -0
  808. package/dist/types/tools/browser/registry.d.ts +58 -0
  809. package/dist/types/tools/browser/render.d.ts +54 -0
  810. package/dist/types/tools/browser/run-cancellation.d.ts +4 -0
  811. package/dist/types/tools/browser/tab-protocol.d.ts +146 -0
  812. package/dist/types/tools/browser/tab-supervisor.d.ts +114 -0
  813. package/dist/types/tools/browser/tab-worker-entry.d.ts +1 -0
  814. package/dist/types/tools/browser/tab-worker.d.ts +56 -0
  815. package/dist/types/tools/browser.d.ts +96 -0
  816. package/dist/types/tools/builtin-names.d.ts +6 -0
  817. package/dist/types/tools/checkpoint.d.ts +72 -0
  818. package/dist/types/tools/conflict-detect.d.ts +221 -0
  819. package/dist/types/tools/context.d.ts +19 -0
  820. package/dist/types/tools/debug.d.ts +157 -0
  821. package/dist/types/tools/eval-backends.d.ts +15 -0
  822. package/dist/types/tools/eval-render.d.ts +58 -0
  823. package/dist/types/tools/eval.d.ts +66 -0
  824. package/dist/types/tools/fetch.d.ts +99 -0
  825. package/dist/types/tools/file-recorder.d.ts +13 -0
  826. package/dist/types/tools/fs-cache-invalidation.d.ts +15 -0
  827. package/dist/types/tools/gh-cache-invalidation.d.ts +6 -0
  828. package/dist/types/tools/gh-format.d.ts +6 -0
  829. package/dist/types/tools/gh-renderer.d.ts +25 -0
  830. package/dist/types/tools/gh.d.ts +331 -0
  831. package/dist/types/tools/github-cache.d.ts +123 -0
  832. package/dist/types/tools/glob.d.ts +96 -0
  833. package/dist/types/tools/grep.d.ts +99 -0
  834. package/dist/types/tools/grouped-file-output.d.ts +70 -0
  835. package/dist/types/tools/image-gen.d.ts +66 -0
  836. package/dist/types/tools/index.d.ts +368 -0
  837. package/dist/types/tools/inspect-image-renderer.d.ts +26 -0
  838. package/dist/types/tools/inspect-image.d.ts +32 -0
  839. package/dist/types/tools/irc.d.ts +112 -0
  840. package/dist/types/tools/job.d.ts +73 -0
  841. package/dist/types/tools/json-tree.d.ts +23 -0
  842. package/dist/types/tools/jtd-to-json-schema.d.ts +29 -0
  843. package/dist/types/tools/jtd-to-typescript.d.ts +26 -0
  844. package/dist/types/tools/jtd-utils.d.ts +42 -0
  845. package/dist/types/tools/learn.d.ts +44 -0
  846. package/dist/types/tools/list-limit.d.ts +12 -0
  847. package/dist/types/tools/manage-skill.d.ts +31 -0
  848. package/dist/types/tools/match-line-format.d.ts +11 -0
  849. package/dist/types/tools/memory-edit.d.ts +31 -0
  850. package/dist/types/tools/memory-recall.d.ts +23 -0
  851. package/dist/types/tools/memory-reflect.d.ts +25 -0
  852. package/dist/types/tools/memory-render.d.ts +63 -0
  853. package/dist/types/tools/memory-retain.d.ts +29 -0
  854. package/dist/types/tools/output-meta.d.ts +211 -0
  855. package/dist/types/tools/output-schema-validator.d.ts +77 -0
  856. package/dist/types/tools/path-utils.d.ts +267 -0
  857. package/dist/types/tools/plan-mode-guard.d.ts +33 -0
  858. package/dist/types/tools/read.d.ts +87 -0
  859. package/dist/types/tools/render-utils.d.ts +218 -0
  860. package/dist/types/tools/renderers.d.ts +49 -0
  861. package/dist/types/tools/report-tool-issue.d.ts +127 -0
  862. package/dist/types/tools/resolve.d.ts +94 -0
  863. package/dist/types/tools/review.d.ts +59 -0
  864. package/dist/types/tools/search-tool-bm25.d.ts +65 -0
  865. package/dist/types/tools/sqlite-reader.d.ts +114 -0
  866. package/dist/types/tools/ssh.d.ts +74 -0
  867. package/dist/types/tools/todo.d.ts +126 -0
  868. package/dist/types/tools/tool-errors.d.ts +33 -0
  869. package/dist/types/tools/tool-result.d.ts +34 -0
  870. package/dist/types/tools/tool-timeouts.d.ts +51 -0
  871. package/dist/types/tools/tts.d.ts +42 -0
  872. package/dist/types/tools/write.d.ts +66 -0
  873. package/dist/types/tools/yield.d.ts +39 -0
  874. package/dist/types/tts/downloader.d.ts +20 -0
  875. package/dist/types/tts/index.d.ts +10 -0
  876. package/dist/types/tts/models.d.ts +82 -0
  877. package/dist/types/tts/player.d.ts +32 -0
  878. package/dist/types/tts/runtime.d.ts +6 -0
  879. package/dist/types/tts/speakable.d.ts +47 -0
  880. package/dist/types/tts/speech-enhancer.d.ts +46 -0
  881. package/dist/types/tts/streaming-player.d.ts +40 -0
  882. package/dist/types/tts/tts-client.d.ts +69 -0
  883. package/dist/types/tts/tts-protocol.d.ts +102 -0
  884. package/dist/types/tts/tts-worker.d.ts +2 -0
  885. package/dist/types/tts/vocalizer.d.ts +48 -0
  886. package/dist/types/tts/wav.d.ts +8 -0
  887. package/dist/types/tui/code-cell.d.ts +47 -0
  888. package/dist/types/tui/file-list.d.ts +22 -0
  889. package/dist/types/tui/hyperlink.d.ts +61 -0
  890. package/dist/types/tui/index.d.ts +12 -0
  891. package/dist/types/tui/output-block.d.ts +59 -0
  892. package/dist/types/tui/status-line.d.ts +21 -0
  893. package/dist/types/tui/tree-list.d.ts +20 -0
  894. package/dist/types/tui/types.d.ts +13 -0
  895. package/dist/types/tui/utils.d.ts +36 -0
  896. package/dist/types/tui/width-aware-text.d.ts +23 -0
  897. package/dist/types/utils/active-repo-context.d.ts +8 -0
  898. package/dist/types/utils/block-context.d.ts +35 -0
  899. package/dist/types/utils/changelog.d.ts +33 -0
  900. package/dist/types/utils/clipboard.d.ts +37 -0
  901. package/dist/types/utils/command-args.d.ts +9 -0
  902. package/dist/types/utils/commit-message-generator.d.ts +7 -0
  903. package/dist/types/utils/edit-mode.d.ts +13 -0
  904. package/dist/types/utils/enhanced-paste.d.ts +20 -0
  905. package/dist/types/utils/event-bus.d.ts +6 -0
  906. package/dist/types/utils/external-editor.d.ts +27 -0
  907. package/dist/types/utils/fetch-timeout.d.ts +4 -0
  908. package/dist/types/utils/file-display-mode.d.ts +27 -0
  909. package/dist/types/utils/file-mentions.d.ts +13 -0
  910. package/dist/types/utils/git.d.ts +471 -0
  911. package/dist/types/utils/image-loading.d.ts +67 -0
  912. package/dist/types/utils/image-resize.d.ts +42 -0
  913. package/dist/types/utils/image-vision-fallback.d.ts +28 -0
  914. package/dist/types/utils/ipc.d.ts +22 -0
  915. package/dist/types/utils/jj.d.ts +74 -0
  916. package/dist/types/utils/lang-from-path.d.ts +8 -0
  917. package/dist/types/utils/markit-cache.d.ts +23 -0
  918. package/dist/types/utils/markit.d.ts +20 -0
  919. package/dist/types/utils/mupdf-wasm-embed.d.ts +1 -0
  920. package/dist/types/utils/open.d.ts +2 -0
  921. package/dist/types/utils/prompt-path.d.ts +1 -0
  922. package/dist/types/utils/qrcode.d.ts +48 -0
  923. package/dist/types/utils/session-color.d.ts +27 -0
  924. package/dist/types/utils/shell-snapshot.d.ts +15 -0
  925. package/dist/types/utils/sixel.d.ts +21 -0
  926. package/dist/types/utils/thinking-display.d.ts +7 -0
  927. package/dist/types/utils/title-generator.d.ts +33 -0
  928. package/dist/types/utils/tool-choice.d.ts +15 -0
  929. package/dist/types/utils/tools-manager.d.ts +12 -0
  930. package/dist/types/utils/turndown.d.ts +15 -0
  931. package/dist/types/utils/zip.d.ts +119 -0
  932. package/dist/types/web/kagi.d.ts +99 -0
  933. package/dist/types/web/parallel.d.ts +67 -0
  934. package/dist/types/web/scrapers/artifacthub.d.ts +6 -0
  935. package/dist/types/web/scrapers/arxiv.d.ts +5 -0
  936. package/dist/types/web/scrapers/aur.d.ts +5 -0
  937. package/dist/types/web/scrapers/biorxiv.d.ts +5 -0
  938. package/dist/types/web/scrapers/bluesky.d.ts +5 -0
  939. package/dist/types/web/scrapers/brew.d.ts +5 -0
  940. package/dist/types/web/scrapers/cheatsh.d.ts +8 -0
  941. package/dist/types/web/scrapers/chocolatey.d.ts +5 -0
  942. package/dist/types/web/scrapers/choosealicense.d.ts +2 -0
  943. package/dist/types/web/scrapers/cisa-kev.d.ts +5 -0
  944. package/dist/types/web/scrapers/clojars.d.ts +5 -0
  945. package/dist/types/web/scrapers/coingecko.d.ts +5 -0
  946. package/dist/types/web/scrapers/crates-io.d.ts +5 -0
  947. package/dist/types/web/scrapers/crossref.d.ts +2 -0
  948. package/dist/types/web/scrapers/devto.d.ts +5 -0
  949. package/dist/types/web/scrapers/discogs.d.ts +8 -0
  950. package/dist/types/web/scrapers/discourse.d.ts +5 -0
  951. package/dist/types/web/scrapers/dockerhub.d.ts +5 -0
  952. package/dist/types/web/scrapers/docs-rs.d.ts +2 -0
  953. package/dist/types/web/scrapers/fdroid.d.ts +5 -0
  954. package/dist/types/web/scrapers/firefox-addons.d.ts +2 -0
  955. package/dist/types/web/scrapers/flathub.d.ts +2 -0
  956. package/dist/types/web/scrapers/github-gist.d.ts +5 -0
  957. package/dist/types/web/scrapers/github.d.ts +34 -0
  958. package/dist/types/web/scrapers/gitlab.d.ts +5 -0
  959. package/dist/types/web/scrapers/go-pkg.d.ts +5 -0
  960. package/dist/types/web/scrapers/hackage.d.ts +5 -0
  961. package/dist/types/web/scrapers/hackernews.d.ts +2 -0
  962. package/dist/types/web/scrapers/hex.d.ts +5 -0
  963. package/dist/types/web/scrapers/huggingface.d.ts +2 -0
  964. package/dist/types/web/scrapers/iacr.d.ts +5 -0
  965. package/dist/types/web/scrapers/index.d.ts +84 -0
  966. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +2 -0
  967. package/dist/types/web/scrapers/lemmy.d.ts +2 -0
  968. package/dist/types/web/scrapers/lobsters.d.ts +5 -0
  969. package/dist/types/web/scrapers/mastodon.d.ts +5 -0
  970. package/dist/types/web/scrapers/maven.d.ts +6 -0
  971. package/dist/types/web/scrapers/mdn.d.ts +2 -0
  972. package/dist/types/web/scrapers/metacpan.d.ts +5 -0
  973. package/dist/types/web/scrapers/musicbrainz.d.ts +5 -0
  974. package/dist/types/web/scrapers/npm.d.ts +5 -0
  975. package/dist/types/web/scrapers/nuget.d.ts +5 -0
  976. package/dist/types/web/scrapers/nvd.d.ts +5 -0
  977. package/dist/types/web/scrapers/ollama.d.ts +2 -0
  978. package/dist/types/web/scrapers/open-vsx.d.ts +5 -0
  979. package/dist/types/web/scrapers/opencorporates.d.ts +5 -0
  980. package/dist/types/web/scrapers/openlibrary.d.ts +5 -0
  981. package/dist/types/web/scrapers/orcid.d.ts +5 -0
  982. package/dist/types/web/scrapers/osv.d.ts +5 -0
  983. package/dist/types/web/scrapers/packagist.d.ts +5 -0
  984. package/dist/types/web/scrapers/pub-dev.d.ts +5 -0
  985. package/dist/types/web/scrapers/pubmed.d.ts +5 -0
  986. package/dist/types/web/scrapers/pypi.d.ts +5 -0
  987. package/dist/types/web/scrapers/rawg.d.ts +2 -0
  988. package/dist/types/web/scrapers/readthedocs.d.ts +5 -0
  989. package/dist/types/web/scrapers/reddit.d.ts +5 -0
  990. package/dist/types/web/scrapers/repology.d.ts +5 -0
  991. package/dist/types/web/scrapers/rfc.d.ts +5 -0
  992. package/dist/types/web/scrapers/rubygems.d.ts +5 -0
  993. package/dist/types/web/scrapers/searchcode.d.ts +2 -0
  994. package/dist/types/web/scrapers/sec-edgar.d.ts +5 -0
  995. package/dist/types/web/scrapers/semantic-scholar.d.ts +2 -0
  996. package/dist/types/web/scrapers/snapcraft.d.ts +2 -0
  997. package/dist/types/web/scrapers/sourcegraph.d.ts +2 -0
  998. package/dist/types/web/scrapers/spdx.d.ts +5 -0
  999. package/dist/types/web/scrapers/spotify.d.ts +8 -0
  1000. package/dist/types/web/scrapers/stackoverflow.d.ts +6 -0
  1001. package/dist/types/web/scrapers/terraform.d.ts +5 -0
  1002. package/dist/types/web/scrapers/tldr.d.ts +7 -0
  1003. package/dist/types/web/scrapers/twitter.d.ts +5 -0
  1004. package/dist/types/web/scrapers/types.d.ts +90 -0
  1005. package/dist/types/web/scrapers/utils.d.ts +26 -0
  1006. package/dist/types/web/scrapers/vimeo.d.ts +5 -0
  1007. package/dist/types/web/scrapers/vscode-marketplace.d.ts +5 -0
  1008. package/dist/types/web/scrapers/w3c.d.ts +2 -0
  1009. package/dist/types/web/scrapers/wikidata.d.ts +5 -0
  1010. package/dist/types/web/scrapers/wikipedia.d.ts +5 -0
  1011. package/dist/types/web/scrapers/youtube.d.ts +5 -0
  1012. package/dist/types/web/search/index.d.ts +74 -0
  1013. package/dist/types/web/search/provider.d.ts +30 -0
  1014. package/dist/types/web/search/providers/anthropic.d.ts +33 -0
  1015. package/dist/types/web/search/providers/base.d.ts +84 -0
  1016. package/dist/types/web/search/providers/brave.d.ts +28 -0
  1017. package/dist/types/web/search/providers/codex.d.ts +36 -0
  1018. package/dist/types/web/search/providers/duckduckgo.d.ts +14 -0
  1019. package/dist/types/web/search/providers/exa.d.ts +70 -0
  1020. package/dist/types/web/search/providers/firecrawl.d.ts +28 -0
  1021. package/dist/types/web/search/providers/gemini.d.ts +63 -0
  1022. package/dist/types/web/search/providers/jina.d.ts +31 -0
  1023. package/dist/types/web/search/providers/kagi.d.ts +30 -0
  1024. package/dist/types/web/search/providers/kimi.d.ts +32 -0
  1025. package/dist/types/web/search/providers/parallel.d.ts +16 -0
  1026. package/dist/types/web/search/providers/perplexity-auth.d.ts +37 -0
  1027. package/dist/types/web/search/providers/perplexity.d.ts +58 -0
  1028. package/dist/types/web/search/providers/searxng.d.ts +45 -0
  1029. package/dist/types/web/search/providers/synthetic.d.ts +25 -0
  1030. package/dist/types/web/search/providers/tavily.d.ts +30 -0
  1031. package/dist/types/web/search/providers/tinyfish.d.ts +29 -0
  1032. package/dist/types/web/search/providers/utils.d.ts +52 -0
  1033. package/dist/types/web/search/providers/xai.d.ts +13 -0
  1034. package/dist/types/web/search/providers/zai.d.ts +29 -0
  1035. package/dist/types/web/search/render.d.ts +34 -0
  1036. package/dist/types/web/search/types.d.ts +431 -0
  1037. package/dist/types/web/search/utils.d.ts +4 -0
  1038. package/dist/types/workspace-tree.d.ts +42 -0
  1039. package/examples/README.md +21 -0
  1040. package/examples/custom-tools/README.md +104 -0
  1041. package/examples/custom-tools/hello/index.ts +20 -0
  1042. package/examples/extensions/README.md +142 -0
  1043. package/examples/extensions/api-demo.ts +79 -0
  1044. package/examples/extensions/chalk-logger.ts +25 -0
  1045. package/examples/extensions/hello.ts +31 -0
  1046. package/examples/extensions/pirate.ts +43 -0
  1047. package/examples/extensions/plan-mode.ts +549 -0
  1048. package/examples/extensions/reload-runtime.ts +38 -0
  1049. package/examples/extensions/thinking-note.ts +13 -0
  1050. package/examples/extensions/tools.ts +145 -0
  1051. package/examples/extensions/with-deps/index.ts +36 -0
  1052. package/examples/extensions/with-deps/package-lock.json +31 -0
  1053. package/examples/extensions/with-deps/package.json +17 -0
  1054. package/examples/hooks/README.md +56 -0
  1055. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  1056. package/examples/hooks/confirm-destructive.ts +58 -0
  1057. package/examples/hooks/custom-compaction.ts +115 -0
  1058. package/examples/hooks/dirty-repo-guard.ts +51 -0
  1059. package/examples/hooks/file-trigger.ts +40 -0
  1060. package/examples/hooks/git-checkpoint.ts +52 -0
  1061. package/examples/hooks/handoff.ts +149 -0
  1062. package/examples/hooks/permission-gate.ts +33 -0
  1063. package/examples/hooks/protected-paths.ts +29 -0
  1064. package/examples/hooks/qna.ts +118 -0
  1065. package/examples/hooks/status-line.ts +39 -0
  1066. package/examples/sdk/01-minimal.ts +21 -0
  1067. package/examples/sdk/02-custom-model.ts +49 -0
  1068. package/examples/sdk/03-custom-prompt.ts +46 -0
  1069. package/examples/sdk/04-skills.ts +43 -0
  1070. package/examples/sdk/06-extensions.ts +82 -0
  1071. package/examples/sdk/06-hooks.ts +61 -0
  1072. package/examples/sdk/07-context-files.ts +35 -0
  1073. package/examples/sdk/08-prompt-templates.ts +41 -0
  1074. package/examples/sdk/08-slash-commands.ts +46 -0
  1075. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  1076. package/examples/sdk/11-sessions.ts +47 -0
  1077. package/examples/sdk/12-redis-sessions.ts +54 -0
  1078. package/examples/sdk/13-sql-sessions.ts +61 -0
  1079. package/examples/sdk/README.md +172 -0
  1080. package/package.json +594 -0
  1081. package/scripts/bench-guard.ts +71 -0
  1082. package/scripts/build-binary.ts +135 -0
  1083. package/scripts/bundle-dist.ts +129 -0
  1084. package/scripts/embed-mupdf-wasm.ts +67 -0
  1085. package/scripts/format-prompts.ts +68 -0
  1086. package/scripts/generate-aria-snapshot.ts +134 -0
  1087. package/scripts/generate-docs-index.ts +148 -0
  1088. package/scripts/generate-legacy-pi-bundled-registry.ts +420 -0
  1089. package/scripts/generate-share-viewer.ts +36 -0
  1090. package/scripts/measure-prompt-tokens.ts +63 -0
  1091. package/scripts/omp +42 -0
  1092. package/scripts/omp.ts +19 -0
  1093. package/src/advisor/__tests__/advisor.test.ts +1662 -0
  1094. package/src/advisor/__tests__/config.test.ts +173 -0
  1095. package/src/advisor/__tests__/emission-guard.test.ts +147 -0
  1096. package/src/advisor/advise-tool.ts +203 -0
  1097. package/src/advisor/config.ts +258 -0
  1098. package/src/advisor/emission-guard.ts +172 -0
  1099. package/src/advisor/index.ts +6 -0
  1100. package/src/advisor/runtime.ts +518 -0
  1101. package/src/advisor/transcript-recorder.ts +159 -0
  1102. package/src/advisor/watchdog.ts +135 -0
  1103. package/src/async/index.ts +1 -0
  1104. package/src/async/job-manager.ts +698 -0
  1105. package/src/auto-thinking/classifier.ts +195 -0
  1106. package/src/autolearn/controller.ts +145 -0
  1107. package/src/autolearn/managed-skills.ts +255 -0
  1108. package/src/autoresearch/command-resume.md +14 -0
  1109. package/src/autoresearch/dashboard.ts +436 -0
  1110. package/src/autoresearch/git.ts +331 -0
  1111. package/src/autoresearch/helpers.ts +218 -0
  1112. package/src/autoresearch/index.ts +541 -0
  1113. package/src/autoresearch/prompt-setup.md +43 -0
  1114. package/src/autoresearch/prompt.md +103 -0
  1115. package/src/autoresearch/resume-message.md +10 -0
  1116. package/src/autoresearch/state.ts +273 -0
  1117. package/src/autoresearch/storage.ts +700 -0
  1118. package/src/autoresearch/tools/init-experiment.ts +269 -0
  1119. package/src/autoresearch/tools/log-experiment.ts +521 -0
  1120. package/src/autoresearch/tools/run-experiment.ts +407 -0
  1121. package/src/autoresearch/tools/update-notes.ts +109 -0
  1122. package/src/autoresearch/types.ts +168 -0
  1123. package/src/capability/context-file.ts +44 -0
  1124. package/src/capability/extension-module.ts +34 -0
  1125. package/src/capability/extension.ts +47 -0
  1126. package/src/capability/fs.ts +117 -0
  1127. package/src/capability/hook.ts +40 -0
  1128. package/src/capability/index.ts +436 -0
  1129. package/src/capability/instruction.ts +37 -0
  1130. package/src/capability/mcp.ts +76 -0
  1131. package/src/capability/prompt.ts +35 -0
  1132. package/src/capability/rule-buckets.ts +66 -0
  1133. package/src/capability/rule.ts +261 -0
  1134. package/src/capability/settings.ts +34 -0
  1135. package/src/capability/skill.ts +63 -0
  1136. package/src/capability/slash-command.ts +40 -0
  1137. package/src/capability/ssh.ts +41 -0
  1138. package/src/capability/system-prompt.ts +34 -0
  1139. package/src/capability/tool.ts +38 -0
  1140. package/src/capability/types.ts +168 -0
  1141. package/src/cli/agents-cli.ts +138 -0
  1142. package/src/cli/args.ts +393 -0
  1143. package/src/cli/auth-broker-cli.ts +921 -0
  1144. package/src/cli/auth-gateway-cli.ts +608 -0
  1145. package/src/cli/bench-cli.ts +623 -0
  1146. package/src/cli/classify-install-target.ts +76 -0
  1147. package/src/cli/claude-trace-cli.ts +795 -0
  1148. package/src/cli/commands/init-xdg.ts +27 -0
  1149. package/src/cli/completion-gen.ts +550 -0
  1150. package/src/cli/config-cli.ts +422 -0
  1151. package/src/cli/dry-balance-cli.ts +853 -0
  1152. package/src/cli/extension-flags.ts +48 -0
  1153. package/src/cli/file-processor.ts +133 -0
  1154. package/src/cli/flag-tables.ts +325 -0
  1155. package/src/cli/gallery-cli.ts +272 -0
  1156. package/src/cli/gallery-fixtures/agentic.ts +416 -0
  1157. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  1158. package/src/cli/gallery-fixtures/edit.ts +254 -0
  1159. package/src/cli/gallery-fixtures/fs.ts +220 -0
  1160. package/src/cli/gallery-fixtures/index.ts +40 -0
  1161. package/src/cli/gallery-fixtures/interaction.ts +46 -0
  1162. package/src/cli/gallery-fixtures/memory.ts +81 -0
  1163. package/src/cli/gallery-fixtures/misc.ts +250 -0
  1164. package/src/cli/gallery-fixtures/search.ts +213 -0
  1165. package/src/cli/gallery-fixtures/shell.ts +159 -0
  1166. package/src/cli/gallery-fixtures/types.ts +57 -0
  1167. package/src/cli/gallery-fixtures/web.ts +158 -0
  1168. package/src/cli/gallery-screenshot.ts +279 -0
  1169. package/src/cli/gc-cli.ts +946 -0
  1170. package/src/cli/grep-cli.ts +160 -0
  1171. package/src/cli/grievances-cli.ts +256 -0
  1172. package/src/cli/initial-message.ts +58 -0
  1173. package/src/cli/models-cli.ts +368 -0
  1174. package/src/cli/plugin-cli.ts +996 -0
  1175. package/src/cli/profile-alias.ts +369 -0
  1176. package/src/cli/profile-bootstrap.ts +233 -0
  1177. package/src/cli/read-cli.ts +57 -0
  1178. package/src/cli/session-picker.ts +93 -0
  1179. package/src/cli/setup-cli.ts +332 -0
  1180. package/src/cli/setup-model-picker.ts +43 -0
  1181. package/src/cli/shell-cli.ts +176 -0
  1182. package/src/cli/ssh-cli.ts +179 -0
  1183. package/src/cli/startup-cwd.ts +58 -0
  1184. package/src/cli/stats-cli.ts +229 -0
  1185. package/src/cli/tiny-models-cli.ts +153 -0
  1186. package/src/cli/ttsr-cli.ts +995 -0
  1187. package/src/cli/update-cli.test.ts +28 -0
  1188. package/src/cli/update-cli.ts +944 -0
  1189. package/src/cli/usage-cli.ts +857 -0
  1190. package/src/cli/web-search-cli.ts +137 -0
  1191. package/src/cli/worktree-cli.ts +294 -0
  1192. package/src/cli-commands.ts +131 -0
  1193. package/src/cli.ts +348 -0
  1194. package/src/collab/crypto.ts +63 -0
  1195. package/src/collab/display-name.ts +13 -0
  1196. package/src/collab/guest.ts +731 -0
  1197. package/src/collab/host.ts +690 -0
  1198. package/src/collab/protocol.ts +296 -0
  1199. package/src/collab/relay-client.ts +216 -0
  1200. package/src/collab/replication-shrink.ts +111 -0
  1201. package/src/commands/acp.ts +24 -0
  1202. package/src/commands/agents.ts +57 -0
  1203. package/src/commands/auth-broker.ts +99 -0
  1204. package/src/commands/auth-gateway.ts +69 -0
  1205. package/src/commands/bench.ts +51 -0
  1206. package/src/commands/commit.ts +46 -0
  1207. package/src/commands/complete.ts +66 -0
  1208. package/src/commands/completions.ts +60 -0
  1209. package/src/commands/config.ts +51 -0
  1210. package/src/commands/dry-balance.ts +43 -0
  1211. package/src/commands/gallery.ts +60 -0
  1212. package/src/commands/gc.ts +46 -0
  1213. package/src/commands/grep.ts +48 -0
  1214. package/src/commands/grievances.ts +51 -0
  1215. package/src/commands/install.ts +107 -0
  1216. package/src/commands/join.ts +39 -0
  1217. package/src/commands/launch.ts +182 -0
  1218. package/src/commands/models.ts +60 -0
  1219. package/src/commands/plugin.ts +78 -0
  1220. package/src/commands/read.ts +38 -0
  1221. package/src/commands/say.ts +102 -0
  1222. package/src/commands/setup.ts +67 -0
  1223. package/src/commands/shell.ts +29 -0
  1224. package/src/commands/ssh.ts +60 -0
  1225. package/src/commands/stats.ts +29 -0
  1226. package/src/commands/tiny-models.ts +36 -0
  1227. package/src/commands/token.ts +162 -0
  1228. package/src/commands/ttsr.ts +125 -0
  1229. package/src/commands/update.ts +27 -0
  1230. package/src/commands/usage.ts +43 -0
  1231. package/src/commands/web-search.ts +42 -0
  1232. package/src/commands/worktree.ts +62 -0
  1233. package/src/commit/agentic/agent.ts +318 -0
  1234. package/src/commit/agentic/fallback.ts +96 -0
  1235. package/src/commit/agentic/index.ts +355 -0
  1236. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  1237. package/src/commit/agentic/prompts/session-user.md +25 -0
  1238. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  1239. package/src/commit/agentic/prompts/system.md +38 -0
  1240. package/src/commit/agentic/state.ts +60 -0
  1241. package/src/commit/agentic/tools/analyze-file.ts +149 -0
  1242. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  1243. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  1244. package/src/commit/agentic/tools/git-overview.ts +81 -0
  1245. package/src/commit/agentic/tools/index.ts +54 -0
  1246. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  1247. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  1248. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  1249. package/src/commit/agentic/tools/schemas.ts +11 -0
  1250. package/src/commit/agentic/tools/split-commit.ts +241 -0
  1251. package/src/commit/agentic/topo-sort.ts +44 -0
  1252. package/src/commit/agentic/trivial.ts +51 -0
  1253. package/src/commit/agentic/validation.ts +183 -0
  1254. package/src/commit/analysis/conventional.ts +64 -0
  1255. package/src/commit/analysis/index.ts +4 -0
  1256. package/src/commit/analysis/scope.ts +242 -0
  1257. package/src/commit/analysis/summary.ts +107 -0
  1258. package/src/commit/analysis/validation.ts +66 -0
  1259. package/src/commit/changelog/detect.ts +40 -0
  1260. package/src/commit/changelog/generate.ts +101 -0
  1261. package/src/commit/changelog/index.ts +234 -0
  1262. package/src/commit/changelog/parse.ts +44 -0
  1263. package/src/commit/cli.ts +85 -0
  1264. package/src/commit/git/diff.ts +148 -0
  1265. package/src/commit/index.ts +5 -0
  1266. package/src/commit/map-reduce/index.ts +69 -0
  1267. package/src/commit/map-reduce/map-phase.ts +193 -0
  1268. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  1269. package/src/commit/map-reduce/utils.ts +9 -0
  1270. package/src/commit/message.ts +11 -0
  1271. package/src/commit/model-selection.ts +95 -0
  1272. package/src/commit/pipeline.ts +243 -0
  1273. package/src/commit/prompts/analysis-system.md +148 -0
  1274. package/src/commit/prompts/analysis-user.md +38 -0
  1275. package/src/commit/prompts/changelog-system.md +50 -0
  1276. package/src/commit/prompts/changelog-user.md +18 -0
  1277. package/src/commit/prompts/file-observer-system.md +24 -0
  1278. package/src/commit/prompts/file-observer-user.md +8 -0
  1279. package/src/commit/prompts/reduce-system.md +50 -0
  1280. package/src/commit/prompts/reduce-user.md +17 -0
  1281. package/src/commit/prompts/summary-retry.md +3 -0
  1282. package/src/commit/prompts/summary-system.md +38 -0
  1283. package/src/commit/prompts/summary-user.md +13 -0
  1284. package/src/commit/prompts/types-description.md +2 -0
  1285. package/src/commit/shared-llm.ts +70 -0
  1286. package/src/commit/types.ts +118 -0
  1287. package/src/commit/utils/exclusions.ts +42 -0
  1288. package/src/commit/utils.ts +58 -0
  1289. package/src/config/api-key-resolver.ts +67 -0
  1290. package/src/config/append-only-context-mode.ts +76 -0
  1291. package/src/config/config-file.ts +315 -0
  1292. package/src/config/file-lock.ts +164 -0
  1293. package/src/config/inline-tool-descriptors-mode.ts +26 -0
  1294. package/src/config/keybindings.ts +636 -0
  1295. package/src/config/mcp-schema.json +247 -0
  1296. package/src/config/model-discovery.ts +919 -0
  1297. package/src/config/model-registry.ts +2275 -0
  1298. package/src/config/model-resolver.ts +1798 -0
  1299. package/src/config/model-roles.ts +99 -0
  1300. package/src/config/models-config-schema.ts +293 -0
  1301. package/src/config/models-config.ts +134 -0
  1302. package/src/config/prompt-templates.ts +205 -0
  1303. package/src/config/provider-globals.ts +25 -0
  1304. package/src/config/resolve-config-value.ts +94 -0
  1305. package/src/config/service-tier.ts +116 -0
  1306. package/src/config/settings-schema.ts +5247 -0
  1307. package/src/config/settings.ts +1540 -0
  1308. package/src/config.ts +242 -0
  1309. package/src/cursor.ts +340 -0
  1310. package/src/dap/client.ts +764 -0
  1311. package/src/dap/config.ts +333 -0
  1312. package/src/dap/defaults.json +212 -0
  1313. package/src/dap/index.ts +4 -0
  1314. package/src/dap/session.ts +1441 -0
  1315. package/src/dap/types.ts +610 -0
  1316. package/src/debug/index.ts +584 -0
  1317. package/src/debug/log-formatting.ts +58 -0
  1318. package/src/debug/log-viewer.ts +966 -0
  1319. package/src/debug/profiler.ts +168 -0
  1320. package/src/debug/protocol-probe.ts +267 -0
  1321. package/src/debug/raw-sse-buffer.ts +294 -0
  1322. package/src/debug/raw-sse.ts +312 -0
  1323. package/src/debug/remote-debugger.ts +151 -0
  1324. package/src/debug/report-bundle.ts +375 -0
  1325. package/src/debug/system-info.ts +111 -0
  1326. package/src/debug/terminal-info.ts +124 -0
  1327. package/src/discovery/agents-md.ts +67 -0
  1328. package/src/discovery/agents.ts +230 -0
  1329. package/src/discovery/at-imports.ts +273 -0
  1330. package/src/discovery/builtin-defaults.ts +39 -0
  1331. package/src/discovery/builtin-rules/go-add-cleanup.md +32 -0
  1332. package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
  1333. package/src/discovery/builtin-rules/go-exp-promoted.md +39 -0
  1334. package/src/discovery/builtin-rules/go-ioutil.md +36 -0
  1335. package/src/discovery/builtin-rules/go-join-hostport.md +29 -0
  1336. package/src/discovery/builtin-rules/go-new-expr.md +44 -0
  1337. package/src/discovery/builtin-rules/go-rand-v2.md +40 -0
  1338. package/src/discovery/builtin-rules/go-range-int.md +45 -0
  1339. package/src/discovery/builtin-rules/index.ts +72 -0
  1340. package/src/discovery/builtin-rules/rs-box-leak.md +48 -0
  1341. package/src/discovery/builtin-rules/rs-future-prelude.md +23 -0
  1342. package/src/discovery/builtin-rules/rs-lazylock.md +51 -0
  1343. package/src/discovery/builtin-rules/rs-match-ergonomics.md +67 -0
  1344. package/src/discovery/builtin-rules/rs-parking-lot.md +44 -0
  1345. package/src/discovery/builtin-rules/rs-result-type.md +19 -0
  1346. package/src/discovery/builtin-rules/ts-bare-catch.md +38 -0
  1347. package/src/discovery/builtin-rules/ts-import-type.md +42 -0
  1348. package/src/discovery/builtin-rules/ts-no-any.md +65 -0
  1349. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
  1350. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +39 -0
  1351. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +55 -0
  1352. package/src/discovery/builtin-rules/ts-no-return-type.md +44 -0
  1353. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  1354. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  1355. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +65 -0
  1356. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  1357. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  1358. package/src/discovery/builtin.ts +934 -0
  1359. package/src/discovery/claude-plugins.ts +387 -0
  1360. package/src/discovery/claude.ts +584 -0
  1361. package/src/discovery/cline.ts +83 -0
  1362. package/src/discovery/codex.ts +530 -0
  1363. package/src/discovery/cursor.ts +220 -0
  1364. package/src/discovery/gemini.ts +383 -0
  1365. package/src/discovery/github.ts +337 -0
  1366. package/src/discovery/helpers.ts +1102 -0
  1367. package/src/discovery/index.ts +81 -0
  1368. package/src/discovery/mcp-json.ts +172 -0
  1369. package/src/discovery/omp-extension-roots.ts +213 -0
  1370. package/src/discovery/omp-plugins.ts +383 -0
  1371. package/src/discovery/opencode.ts +441 -0
  1372. package/src/discovery/plugin-dir-roots.ts +28 -0
  1373. package/src/discovery/ssh.ts +153 -0
  1374. package/src/discovery/substitute-plugin-root.ts +29 -0
  1375. package/src/discovery/vscode.ts +105 -0
  1376. package/src/discovery/windsurf.ts +147 -0
  1377. package/src/edit/apply-patch/index.ts +87 -0
  1378. package/src/edit/apply-patch/parser.ts +174 -0
  1379. package/src/edit/diff.ts +999 -0
  1380. package/src/edit/file-snapshot-store.ts +157 -0
  1381. package/src/edit/hashline/block-resolver.ts +33 -0
  1382. package/src/edit/hashline/diff.ts +356 -0
  1383. package/src/edit/hashline/execute.ts +279 -0
  1384. package/src/edit/hashline/filesystem.ts +205 -0
  1385. package/src/edit/hashline/index.ts +5 -0
  1386. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  1387. package/src/edit/hashline/params.ts +12 -0
  1388. package/src/edit/index.ts +705 -0
  1389. package/src/edit/modes/apply-patch.lark +19 -0
  1390. package/src/edit/modes/apply-patch.ts +53 -0
  1391. package/src/edit/modes/patch.ts +1950 -0
  1392. package/src/edit/modes/replace.ts +1137 -0
  1393. package/src/edit/normalize.ts +345 -0
  1394. package/src/edit/notebook.ts +242 -0
  1395. package/src/edit/read-file.ts +25 -0
  1396. package/src/edit/renderer.ts +969 -0
  1397. package/src/edit/snapshot-details.ts +77 -0
  1398. package/src/edit/streaming.ts +698 -0
  1399. package/src/eval/__tests__/agent-bridge.test.ts +1399 -0
  1400. package/src/eval/__tests__/bridge-timeout.test.ts +64 -0
  1401. package/src/eval/__tests__/budget-bridge.test.ts +69 -0
  1402. package/src/eval/__tests__/completion-bridge.test.ts +412 -0
  1403. package/src/eval/__tests__/helpers-local-roots.test.ts +55 -0
  1404. package/src/eval/__tests__/idle-timeout.test.ts +80 -0
  1405. package/src/eval/__tests__/js-context-manager.test.ts +291 -0
  1406. package/src/eval/__tests__/julia-prelude.test.ts +66 -0
  1407. package/src/eval/__tests__/kernel-spawn.test.ts +103 -0
  1408. package/src/eval/__tests__/prelude-agent.test.ts +107 -0
  1409. package/src/eval/agent-bridge.ts +584 -0
  1410. package/src/eval/backend-helpers.ts +48 -0
  1411. package/src/eval/backend.ts +71 -0
  1412. package/src/eval/bridge-timeout.ts +44 -0
  1413. package/src/eval/budget-bridge.ts +48 -0
  1414. package/src/eval/completion-bridge.ts +211 -0
  1415. package/src/eval/concurrency-bridge.ts +34 -0
  1416. package/src/eval/executor-base.ts +425 -0
  1417. package/src/eval/idle-timeout.ts +91 -0
  1418. package/src/eval/index.ts +6 -0
  1419. package/src/eval/jl/executor.ts +540 -0
  1420. package/src/eval/jl/index.ts +54 -0
  1421. package/src/eval/jl/kernel.ts +235 -0
  1422. package/src/eval/jl/prelude.jl +735 -0
  1423. package/src/eval/jl/prelude.ts +3 -0
  1424. package/src/eval/jl/runner.jl +666 -0
  1425. package/src/eval/jl/runtime.ts +118 -0
  1426. package/src/eval/js/context-manager.ts +621 -0
  1427. package/src/eval/js/executor.ts +173 -0
  1428. package/src/eval/js/index.ts +40 -0
  1429. package/src/eval/js/shared/helpers.ts +170 -0
  1430. package/src/eval/js/shared/indirect-eval.ts +30 -0
  1431. package/src/eval/js/shared/local-module-loader.ts +364 -0
  1432. package/src/eval/js/shared/prelude.ts +2 -0
  1433. package/src/eval/js/shared/prelude.txt +293 -0
  1434. package/src/eval/js/shared/rewrite-imports.ts +532 -0
  1435. package/src/eval/js/shared/runtime.ts +574 -0
  1436. package/src/eval/js/shared/types.ts +18 -0
  1437. package/src/eval/js/tool-bridge.ts +163 -0
  1438. package/src/eval/js/worker-core.ts +151 -0
  1439. package/src/eval/js/worker-entry.ts +37 -0
  1440. package/src/eval/js/worker-protocol.ts +47 -0
  1441. package/src/eval/kernel-base.ts +569 -0
  1442. package/src/eval/py/__tests__/prelude.test.ts +32 -0
  1443. package/src/eval/py/__tests__/runner-shell-output.test.ts +157 -0
  1444. package/src/eval/py/display.ts +71 -0
  1445. package/src/eval/py/executor.ts +533 -0
  1446. package/src/eval/py/index.ts +57 -0
  1447. package/src/eval/py/kernel.ts +233 -0
  1448. package/src/eval/py/prelude.py +625 -0
  1449. package/src/eval/py/prelude.ts +3 -0
  1450. package/src/eval/py/runner.py +1322 -0
  1451. package/src/eval/py/runtime.ts +276 -0
  1452. package/src/eval/py/spawn-options.ts +126 -0
  1453. package/src/eval/py/tool-bridge.ts +182 -0
  1454. package/src/eval/rb/executor.ts +504 -0
  1455. package/src/eval/rb/index.ts +54 -0
  1456. package/src/eval/rb/kernel.ts +230 -0
  1457. package/src/eval/rb/prelude.rb +553 -0
  1458. package/src/eval/rb/prelude.ts +3 -0
  1459. package/src/eval/rb/runner.rb +581 -0
  1460. package/src/eval/rb/runtime.ts +132 -0
  1461. package/src/eval/runtime-env.ts +104 -0
  1462. package/src/eval/session-id.ts +8 -0
  1463. package/src/eval/types.ts +48 -0
  1464. package/src/exa/index.ts +2 -0
  1465. package/src/exa/mcp-client.ts +370 -0
  1466. package/src/exa/types.ts +69 -0
  1467. package/src/exec/bash-executor.ts +473 -0
  1468. package/src/exec/exec.ts +53 -0
  1469. package/src/exec/non-interactive-env.ts +119 -0
  1470. package/src/export/custom-share.ts +65 -0
  1471. package/src/export/html/index.ts +308 -0
  1472. package/src/export/html/share-loader.js +102 -0
  1473. package/src/export/html/template.css +1337 -0
  1474. package/src/export/html/template.html +49 -0
  1475. package/src/export/html/template.js +1634 -0
  1476. package/src/export/html/tool-views.generated.js +37 -0
  1477. package/src/export/html/vendor/highlight.min.js +1213 -0
  1478. package/src/export/html/vendor/marked.min.js +6 -0
  1479. package/src/export/html/web-palette.ts +142 -0
  1480. package/src/export/share.ts +481 -0
  1481. package/src/export/ttsr.ts +583 -0
  1482. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  1483. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  1484. package/src/extensibility/custom-commands/index.ts +2 -0
  1485. package/src/extensibility/custom-commands/loader.ts +242 -0
  1486. package/src/extensibility/custom-commands/types.ts +119 -0
  1487. package/src/extensibility/custom-tools/index.ts +7 -0
  1488. package/src/extensibility/custom-tools/loader.ts +268 -0
  1489. package/src/extensibility/custom-tools/types.ts +280 -0
  1490. package/src/extensibility/custom-tools/wrapper.ts +47 -0
  1491. package/src/extensibility/extensions/compact-handler.ts +40 -0
  1492. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  1493. package/src/extensibility/extensions/index.ts +16 -0
  1494. package/src/extensibility/extensions/loader.ts +596 -0
  1495. package/src/extensibility/extensions/model-api.ts +39 -0
  1496. package/src/extensibility/extensions/runner.ts +1039 -0
  1497. package/src/extensibility/extensions/types.ts +1394 -0
  1498. package/src/extensibility/extensions/wrapper.ts +266 -0
  1499. package/src/extensibility/hooks/index.ts +6 -0
  1500. package/src/extensibility/hooks/loader.ts +244 -0
  1501. package/src/extensibility/hooks/runner.ts +425 -0
  1502. package/src/extensibility/hooks/tool-wrapper.ts +117 -0
  1503. package/src/extensibility/hooks/types.ts +613 -0
  1504. package/src/extensibility/legacy-pi-ai-shim.ts +73 -0
  1505. package/src/extensibility/legacy-pi-coding-agent-shim.ts +646 -0
  1506. package/src/extensibility/plugins/doctor.ts +65 -0
  1507. package/src/extensibility/plugins/git-url.ts +367 -0
  1508. package/src/extensibility/plugins/index.ts +9 -0
  1509. package/src/extensibility/plugins/installer.ts +201 -0
  1510. package/src/extensibility/plugins/legacy-pi-bundled-keys.ts +1011 -0
  1511. package/src/extensibility/plugins/legacy-pi-bundled-registry.ts +3430 -0
  1512. package/src/extensibility/plugins/legacy-pi-compat.ts +1141 -0
  1513. package/src/extensibility/plugins/loader.ts +535 -0
  1514. package/src/extensibility/plugins/manager.ts +1121 -0
  1515. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  1516. package/src/extensibility/plugins/marketplace/fetcher.ts +315 -0
  1517. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  1518. package/src/extensibility/plugins/marketplace/manager.ts +926 -0
  1519. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  1520. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  1521. package/src/extensibility/plugins/marketplace/types.ts +192 -0
  1522. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  1523. package/src/extensibility/plugins/parser.ts +107 -0
  1524. package/src/extensibility/plugins/runtime-config.ts +9 -0
  1525. package/src/extensibility/plugins/types.ts +194 -0
  1526. package/src/extensibility/session-handler-types.ts +21 -0
  1527. package/src/extensibility/shared-events.ts +376 -0
  1528. package/src/extensibility/skills.ts +508 -0
  1529. package/src/extensibility/slash-commands.ts +131 -0
  1530. package/src/extensibility/tool-event-input.ts +80 -0
  1531. package/src/extensibility/tool-proxy.ts +28 -0
  1532. package/src/extensibility/typebox.ts +945 -0
  1533. package/src/extensibility/utils.ts +118 -0
  1534. package/src/goals/guided-setup.ts +143 -0
  1535. package/src/goals/index.ts +3 -0
  1536. package/src/goals/runtime.ts +521 -0
  1537. package/src/goals/state.ts +37 -0
  1538. package/src/goals/tools/goal-tool.ts +251 -0
  1539. package/src/hindsight/backend.ts +354 -0
  1540. package/src/hindsight/bank.ts +156 -0
  1541. package/src/hindsight/client.test.ts +33 -0
  1542. package/src/hindsight/client.ts +643 -0
  1543. package/src/hindsight/config.ts +175 -0
  1544. package/src/hindsight/content.ts +266 -0
  1545. package/src/hindsight/index.ts +8 -0
  1546. package/src/hindsight/mental-models.ts +429 -0
  1547. package/src/hindsight/seeds.json +32 -0
  1548. package/src/hindsight/state.ts +492 -0
  1549. package/src/hindsight/transcript.ts +71 -0
  1550. package/src/index.ts +66 -0
  1551. package/src/internal-urls/__tests__/ssh-protocol.test.ts +331 -0
  1552. package/src/internal-urls/agent-protocol.ts +146 -0
  1553. package/src/internal-urls/artifact-protocol.ts +151 -0
  1554. package/src/internal-urls/docs-index.generated.txt +2 -0
  1555. package/src/internal-urls/docs-index.ts +101 -0
  1556. package/src/internal-urls/filesystem-resource.ts +34 -0
  1557. package/src/internal-urls/history-protocol.ts +118 -0
  1558. package/src/internal-urls/index.ts +26 -0
  1559. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  1560. package/src/internal-urls/json-query.ts +126 -0
  1561. package/src/internal-urls/local-protocol.ts +469 -0
  1562. package/src/internal-urls/mcp-protocol.ts +151 -0
  1563. package/src/internal-urls/memory-protocol.ts +173 -0
  1564. package/src/internal-urls/omp-protocol.ts +94 -0
  1565. package/src/internal-urls/parse.ts +72 -0
  1566. package/src/internal-urls/registry-helpers.ts +40 -0
  1567. package/src/internal-urls/router.ts +107 -0
  1568. package/src/internal-urls/rule-protocol.ts +45 -0
  1569. package/src/internal-urls/skill-protocol.ts +112 -0
  1570. package/src/internal-urls/ssh-protocol.ts +367 -0
  1571. package/src/internal-urls/types.ts +182 -0
  1572. package/src/internal-urls/vault-protocol.ts +939 -0
  1573. package/src/irc/bus.ts +320 -0
  1574. package/src/jsonrpc/message-framing.ts +142 -0
  1575. package/src/lib/xai-http.ts +124 -0
  1576. package/src/lsp/client.ts +1249 -0
  1577. package/src/lsp/clients/biome-client.ts +264 -0
  1578. package/src/lsp/clients/index.ts +50 -0
  1579. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  1580. package/src/lsp/clients/swiftlint-client.ts +120 -0
  1581. package/src/lsp/config.ts +531 -0
  1582. package/src/lsp/defaults.json +499 -0
  1583. package/src/lsp/diagnostics-ledger.ts +51 -0
  1584. package/src/lsp/edits.ts +288 -0
  1585. package/src/lsp/format-options.ts +119 -0
  1586. package/src/lsp/index.ts +2539 -0
  1587. package/src/lsp/lspmux.ts +233 -0
  1588. package/src/lsp/render.ts +668 -0
  1589. package/src/lsp/startup-events.ts +13 -0
  1590. package/src/lsp/types.ts +444 -0
  1591. package/src/lsp/utils.ts +718 -0
  1592. package/src/main.ts +1474 -0
  1593. package/src/markit/NOTICE +32 -0
  1594. package/src/markit/converters/docx.ts +56 -0
  1595. package/src/markit/converters/epub.ts +136 -0
  1596. package/src/markit/converters/mammoth.d.ts +24 -0
  1597. package/src/markit/converters/pdf/columns.ts +103 -0
  1598. package/src/markit/converters/pdf/extract.ts +574 -0
  1599. package/src/markit/converters/pdf/grid.ts +780 -0
  1600. package/src/markit/converters/pdf/headers.ts +106 -0
  1601. package/src/markit/converters/pdf/index.ts +146 -0
  1602. package/src/markit/converters/pdf/render.ts +501 -0
  1603. package/src/markit/converters/pdf/types.ts +84 -0
  1604. package/src/markit/converters/pptx.ts +325 -0
  1605. package/src/markit/converters/xlsx.ts +173 -0
  1606. package/src/markit/index.ts +2 -0
  1607. package/src/markit/registry.ts +59 -0
  1608. package/src/markit/types.ts +35 -0
  1609. package/src/mcp/client.ts +511 -0
  1610. package/src/mcp/config-writer.ts +350 -0
  1611. package/src/mcp/config.ts +369 -0
  1612. package/src/mcp/index.ts +29 -0
  1613. package/src/mcp/json-rpc.ts +122 -0
  1614. package/src/mcp/loader.ts +125 -0
  1615. package/src/mcp/manager.ts +1362 -0
  1616. package/src/mcp/oauth-credentials.ts +104 -0
  1617. package/src/mcp/oauth-discovery.ts +560 -0
  1618. package/src/mcp/oauth-flow.ts +787 -0
  1619. package/src/mcp/render.ts +155 -0
  1620. package/src/mcp/smithery-auth.ts +107 -0
  1621. package/src/mcp/smithery-connect.ts +154 -0
  1622. package/src/mcp/smithery-registry.test.ts +51 -0
  1623. package/src/mcp/smithery-registry.ts +500 -0
  1624. package/src/mcp/startup-events.ts +116 -0
  1625. package/src/mcp/timeout.ts +59 -0
  1626. package/src/mcp/tool-bridge.ts +484 -0
  1627. package/src/mcp/tool-cache.ts +117 -0
  1628. package/src/mcp/transports/http.ts +523 -0
  1629. package/src/mcp/transports/index.ts +7 -0
  1630. package/src/mcp/transports/sse.ts +377 -0
  1631. package/src/mcp/transports/stdio.test.ts +95 -0
  1632. package/src/mcp/transports/stdio.ts +663 -0
  1633. package/src/mcp/types.ts +430 -0
  1634. package/src/memories/index.ts +1395 -0
  1635. package/src/memories/storage.ts +578 -0
  1636. package/src/memory-backend/index.ts +18 -0
  1637. package/src/memory-backend/local-backend.ts +47 -0
  1638. package/src/memory-backend/off-backend.ts +25 -0
  1639. package/src/memory-backend/resolve.ts +25 -0
  1640. package/src/memory-backend/runtime.ts +66 -0
  1641. package/src/memory-backend/types.ts +166 -0
  1642. package/src/mnemopi/backend.ts +612 -0
  1643. package/src/mnemopi/config.ts +267 -0
  1644. package/src/mnemopi/embed-client.ts +246 -0
  1645. package/src/mnemopi/embed-protocol.ts +35 -0
  1646. package/src/mnemopi/embed-worker.ts +113 -0
  1647. package/src/mnemopi/index.ts +3 -0
  1648. package/src/mnemopi/state.ts +722 -0
  1649. package/src/modes/acp/acp-agent.ts +2372 -0
  1650. package/src/modes/acp/acp-client-bridge.ts +154 -0
  1651. package/src/modes/acp/acp-event-mapper.ts +1002 -0
  1652. package/src/modes/acp/acp-mode.ts +23 -0
  1653. package/src/modes/acp/index.ts +2 -0
  1654. package/src/modes/acp/terminal-auth.ts +37 -0
  1655. package/src/modes/components/__tests__/move-overlay.test.ts +237 -0
  1656. package/src/modes/components/__tests__/skill-message.test.ts +92 -0
  1657. package/src/modes/components/advisor-config.ts +555 -0
  1658. package/src/modes/components/advisor-message.ts +109 -0
  1659. package/src/modes/components/agent-dashboard.ts +1183 -0
  1660. package/src/modes/components/agent-hub.ts +586 -0
  1661. package/src/modes/components/agent-transcript-viewer.ts +649 -0
  1662. package/src/modes/components/assistant-message.ts +869 -0
  1663. package/src/modes/components/background-tan-message.ts +36 -0
  1664. package/src/modes/components/bash-execution.ts +229 -0
  1665. package/src/modes/components/bordered-loader.ts +41 -0
  1666. package/src/modes/components/btw-panel.ts +124 -0
  1667. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  1668. package/src/modes/components/chat-block.ts +111 -0
  1669. package/src/modes/components/chat-transcript-builder.ts +449 -0
  1670. package/src/modes/components/collab-prompt-message.ts +32 -0
  1671. package/src/modes/components/compaction-summary-message.ts +215 -0
  1672. package/src/modes/components/copy-selector.ts +206 -0
  1673. package/src/modes/components/countdown-timer.ts +75 -0
  1674. package/src/modes/components/custom-editor.test.ts +283 -0
  1675. package/src/modes/components/custom-editor.ts +835 -0
  1676. package/src/modes/components/custom-message.ts +67 -0
  1677. package/src/modes/components/diff.ts +254 -0
  1678. package/src/modes/components/dynamic-border.ts +34 -0
  1679. package/src/modes/components/error-banner.ts +33 -0
  1680. package/src/modes/components/eval-execution.ts +167 -0
  1681. package/src/modes/components/execution-shared.ts +101 -0
  1682. package/src/modes/components/extensions/extension-dashboard.ts +492 -0
  1683. package/src/modes/components/extensions/extension-list.ts +507 -0
  1684. package/src/modes/components/extensions/index.ts +9 -0
  1685. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  1686. package/src/modes/components/extensions/state-manager.ts +648 -0
  1687. package/src/modes/components/extensions/types.ts +186 -0
  1688. package/src/modes/components/footer.ts +276 -0
  1689. package/src/modes/components/history-search.ts +268 -0
  1690. package/src/modes/components/hook-editor.ts +183 -0
  1691. package/src/modes/components/hook-input.ts +87 -0
  1692. package/src/modes/components/hook-message.ts +67 -0
  1693. package/src/modes/components/hook-selector.ts +678 -0
  1694. package/src/modes/components/index.ts +40 -0
  1695. package/src/modes/components/keybinding-hints.ts +65 -0
  1696. package/src/modes/components/late-diagnostics-message.ts +60 -0
  1697. package/src/modes/components/login-dialog.ts +178 -0
  1698. package/src/modes/components/logout-account-selector.ts +130 -0
  1699. package/src/modes/components/mcp-add-wizard.ts +1408 -0
  1700. package/src/modes/components/message-frame.ts +92 -0
  1701. package/src/modes/components/model-selector.ts +1267 -0
  1702. package/src/modes/components/move-overlay.ts +294 -0
  1703. package/src/modes/components/oauth-selector.ts +457 -0
  1704. package/src/modes/components/omfg-panel.ts +141 -0
  1705. package/src/modes/components/overlay-box.ts +109 -0
  1706. package/src/modes/components/plan-review-overlay.ts +847 -0
  1707. package/src/modes/components/plan-toc.ts +138 -0
  1708. package/src/modes/components/plugin-selector.ts +100 -0
  1709. package/src/modes/components/plugin-settings.ts +745 -0
  1710. package/src/modes/components/queue-mode-selector.ts +61 -0
  1711. package/src/modes/components/read-tool-group.ts +676 -0
  1712. package/src/modes/components/reset-usage-selector.ts +161 -0
  1713. package/src/modes/components/segment-track.ts +89 -0
  1714. package/src/modes/components/select-list-mouse-routing.ts +35 -0
  1715. package/src/modes/components/selector-helpers.ts +129 -0
  1716. package/src/modes/components/session-selector.ts +744 -0
  1717. package/src/modes/components/settings-defs.ts +238 -0
  1718. package/src/modes/components/settings-selector.ts +1265 -0
  1719. package/src/modes/components/show-images-selector.ts +50 -0
  1720. package/src/modes/components/skill-message.ts +110 -0
  1721. package/src/modes/components/snapcompact-shape-preview-doc.md +18 -0
  1722. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  1723. package/src/modes/components/status-line/component.test.ts +44 -0
  1724. package/src/modes/components/status-line/component.ts +1308 -0
  1725. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  1726. package/src/modes/components/status-line/git-utils.ts +42 -0
  1727. package/src/modes/components/status-line/index.ts +5 -0
  1728. package/src/modes/components/status-line/presets.ts +106 -0
  1729. package/src/modes/components/status-line/segments.ts +663 -0
  1730. package/src/modes/components/status-line/separators.ts +55 -0
  1731. package/src/modes/components/status-line/token-rate.ts +66 -0
  1732. package/src/modes/components/status-line/types.ts +147 -0
  1733. package/src/modes/components/theme-selector.ts +68 -0
  1734. package/src/modes/components/thinking-selector.ts +57 -0
  1735. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  1736. package/src/modes/components/tips.txt +24 -0
  1737. package/src/modes/components/todo-reminder.ts +43 -0
  1738. package/src/modes/components/tool-execution.ts +1308 -0
  1739. package/src/modes/components/transcript-container.ts +456 -0
  1740. package/src/modes/components/tree-selector.ts +1002 -0
  1741. package/src/modes/components/ttsr-notification.ts +123 -0
  1742. package/src/modes/components/usage-row.ts +32 -0
  1743. package/src/modes/components/user-message-selector.ts +227 -0
  1744. package/src/modes/components/user-message.ts +68 -0
  1745. package/src/modes/components/visual-truncate.ts +63 -0
  1746. package/src/modes/components/welcome.ts +579 -0
  1747. package/src/modes/controllers/btw-controller.ts +198 -0
  1748. package/src/modes/controllers/command-controller-shared.ts +109 -0
  1749. package/src/modes/controllers/command-controller.ts +1751 -0
  1750. package/src/modes/controllers/event-controller.ts +1497 -0
  1751. package/src/modes/controllers/extension-ui-controller.ts +977 -0
  1752. package/src/modes/controllers/input-controller.ts +1851 -0
  1753. package/src/modes/controllers/mcp-command-controller.ts +2364 -0
  1754. package/src/modes/controllers/omfg-controller.ts +283 -0
  1755. package/src/modes/controllers/omfg-rule.ts +647 -0
  1756. package/src/modes/controllers/selector-controller.ts +1443 -0
  1757. package/src/modes/controllers/session-focus-controller.ts +112 -0
  1758. package/src/modes/controllers/ssh-command-controller.ts +384 -0
  1759. package/src/modes/controllers/streaming-reveal.ts +392 -0
  1760. package/src/modes/controllers/tan-command-controller.ts +190 -0
  1761. package/src/modes/controllers/todo-command-controller.ts +484 -0
  1762. package/src/modes/controllers/tool-args-reveal.ts +582 -0
  1763. package/src/modes/data/emojis.json +1 -0
  1764. package/src/modes/emoji-autocomplete.ts +285 -0
  1765. package/src/modes/gradient-highlight.ts +99 -0
  1766. package/src/modes/image-references.ts +137 -0
  1767. package/src/modes/index.ts +17 -0
  1768. package/src/modes/interactive-mode.ts +4223 -0
  1769. package/src/modes/internal-url-autocomplete.ts +158 -0
  1770. package/src/modes/loop-limit.ts +192 -0
  1771. package/src/modes/magic-keywords.ts +42 -0
  1772. package/src/modes/markdown-prose.ts +247 -0
  1773. package/src/modes/oauth-manual-input.ts +69 -0
  1774. package/src/modes/orchestrate.ts +42 -0
  1775. package/src/modes/print-mode.ts +130 -0
  1776. package/src/modes/prompt-action-autocomplete.ts +262 -0
  1777. package/src/modes/rpc/host-tools.ts +186 -0
  1778. package/src/modes/rpc/host-uris.ts +235 -0
  1779. package/src/modes/rpc/rpc-client.ts +1033 -0
  1780. package/src/modes/rpc/rpc-mode.ts +1311 -0
  1781. package/src/modes/rpc/rpc-subagents.ts +265 -0
  1782. package/src/modes/rpc/rpc-types.ts +499 -0
  1783. package/src/modes/running-subagent-badge.ts +13 -0
  1784. package/src/modes/runtime-init.ts +142 -0
  1785. package/src/modes/session-observer-registry.ts +215 -0
  1786. package/src/modes/session-teardown.test.ts +219 -0
  1787. package/src/modes/session-teardown.ts +82 -0
  1788. package/src/modes/setup-version.ts +11 -0
  1789. package/src/modes/setup-wizard/index.ts +101 -0
  1790. package/src/modes/setup-wizard/lazy.ts +16 -0
  1791. package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
  1792. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  1793. package/src/modes/setup-wizard/scenes/providers.ts +104 -0
  1794. package/src/modes/setup-wizard/scenes/sign-in.ts +304 -0
  1795. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  1796. package/src/modes/setup-wizard/scenes/theme.ts +320 -0
  1797. package/src/modes/setup-wizard/scenes/types.ts +57 -0
  1798. package/src/modes/setup-wizard/scenes/web-search.ts +140 -0
  1799. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  1800. package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
  1801. package/src/modes/shared.ts +49 -0
  1802. package/src/modes/skill-command.ts +91 -0
  1803. package/src/modes/theme/dark.json +95 -0
  1804. package/src/modes/theme/defaults/alabaster.json +93 -0
  1805. package/src/modes/theme/defaults/amethyst.json +96 -0
  1806. package/src/modes/theme/defaults/anthracite.json +93 -0
  1807. package/src/modes/theme/defaults/basalt.json +91 -0
  1808. package/src/modes/theme/defaults/birch.json +95 -0
  1809. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  1810. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  1811. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  1812. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  1813. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  1814. package/src/modes/theme/defaults/dark-copper.json +95 -0
  1815. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  1816. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  1817. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  1818. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  1819. package/src/modes/theme/defaults/dark-ember.json +95 -0
  1820. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  1821. package/src/modes/theme/defaults/dark-forest.json +96 -0
  1822. package/src/modes/theme/defaults/dark-github.json +105 -0
  1823. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  1824. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  1825. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  1826. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  1827. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  1828. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  1829. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  1830. package/src/modes/theme/defaults/dark-nord.json +97 -0
  1831. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  1832. package/src/modes/theme/defaults/dark-one.json +100 -0
  1833. package/src/modes/theme/defaults/dark-poimandres.json +142 -0
  1834. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  1835. package/src/modes/theme/defaults/dark-reef.json +91 -0
  1836. package/src/modes/theme/defaults/dark-retro.json +92 -0
  1837. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  1838. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  1839. package/src/modes/theme/defaults/dark-slate.json +95 -0
  1840. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  1841. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  1842. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  1843. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  1844. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  1845. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  1846. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  1847. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  1848. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  1849. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  1850. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  1851. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  1852. package/src/modes/theme/defaults/graphite.json +92 -0
  1853. package/src/modes/theme/defaults/index.ts +199 -0
  1854. package/src/modes/theme/defaults/light-arctic.json +107 -0
  1855. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  1856. package/src/modes/theme/defaults/light-canyon.json +91 -0
  1857. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  1858. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  1859. package/src/modes/theme/defaults/light-coral.json +95 -0
  1860. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  1861. package/src/modes/theme/defaults/light-dawn.json +90 -0
  1862. package/src/modes/theme/defaults/light-dunes.json +91 -0
  1863. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  1864. package/src/modes/theme/defaults/light-forest.json +100 -0
  1865. package/src/modes/theme/defaults/light-frost.json +95 -0
  1866. package/src/modes/theme/defaults/light-github.json +115 -0
  1867. package/src/modes/theme/defaults/light-glacier.json +91 -0
  1868. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  1869. package/src/modes/theme/defaults/light-haze.json +90 -0
  1870. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  1871. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  1872. package/src/modes/theme/defaults/light-lavender.json +95 -0
  1873. package/src/modes/theme/defaults/light-meadow.json +91 -0
  1874. package/src/modes/theme/defaults/light-mint.json +95 -0
  1875. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  1876. package/src/modes/theme/defaults/light-ocean.json +99 -0
  1877. package/src/modes/theme/defaults/light-one.json +99 -0
  1878. package/src/modes/theme/defaults/light-opal.json +91 -0
  1879. package/src/modes/theme/defaults/light-orchard.json +91 -0
  1880. package/src/modes/theme/defaults/light-paper.json +95 -0
  1881. package/src/modes/theme/defaults/light-poimandres.json +142 -0
  1882. package/src/modes/theme/defaults/light-prism.json +90 -0
  1883. package/src/modes/theme/defaults/light-retro.json +98 -0
  1884. package/src/modes/theme/defaults/light-sand.json +95 -0
  1885. package/src/modes/theme/defaults/light-savanna.json +91 -0
  1886. package/src/modes/theme/defaults/light-solarized.json +102 -0
  1887. package/src/modes/theme/defaults/light-soleil.json +90 -0
  1888. package/src/modes/theme/defaults/light-sunset.json +99 -0
  1889. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  1890. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  1891. package/src/modes/theme/defaults/light-wetland.json +91 -0
  1892. package/src/modes/theme/defaults/light-zenith.json +89 -0
  1893. package/src/modes/theme/defaults/limestone.json +94 -0
  1894. package/src/modes/theme/defaults/mahogany.json +97 -0
  1895. package/src/modes/theme/defaults/marble.json +93 -0
  1896. package/src/modes/theme/defaults/obsidian.json +91 -0
  1897. package/src/modes/theme/defaults/onyx.json +91 -0
  1898. package/src/modes/theme/defaults/pearl.json +93 -0
  1899. package/src/modes/theme/defaults/porcelain.json +91 -0
  1900. package/src/modes/theme/defaults/quartz.json +96 -0
  1901. package/src/modes/theme/defaults/sandstone.json +95 -0
  1902. package/src/modes/theme/defaults/titanium.json +90 -0
  1903. package/src/modes/theme/light.json +93 -0
  1904. package/src/modes/theme/mermaid-cache.ts +92 -0
  1905. package/src/modes/theme/mermaid-rendering.test.ts +53 -0
  1906. package/src/modes/theme/shimmer.ts +269 -0
  1907. package/src/modes/theme/theme-schema.json +459 -0
  1908. package/src/modes/theme/theme.ts +3004 -0
  1909. package/src/modes/turn-budget.ts +31 -0
  1910. package/src/modes/types.ts +437 -0
  1911. package/src/modes/ultrathink.ts +41 -0
  1912. package/src/modes/utils/context-usage.ts +432 -0
  1913. package/src/modes/utils/copy-targets.ts +378 -0
  1914. package/src/modes/utils/hotkeys-markdown.ts +62 -0
  1915. package/src/modes/utils/interactive-context-helpers.ts +27 -0
  1916. package/src/modes/utils/keybinding-matchers.ts +86 -0
  1917. package/src/modes/utils/tools-markdown.ts +27 -0
  1918. package/src/modes/utils/transcript-render-helpers.ts +184 -0
  1919. package/src/modes/utils/ui-helpers.ts +864 -0
  1920. package/src/modes/workflow.ts +42 -0
  1921. package/src/plan-mode/approved-plan-prompt.test.ts +36 -0
  1922. package/src/plan-mode/approved-plan.ts +186 -0
  1923. package/src/plan-mode/plan-handoff.ts +37 -0
  1924. package/src/plan-mode/plan-protection.ts +31 -0
  1925. package/src/plan-mode/state.ts +6 -0
  1926. package/src/priority.json +60 -0
  1927. package/src/prompts/advisor/active-repo-watchdog.md +6 -0
  1928. package/src/prompts/advisor/advise-tool.md +3 -0
  1929. package/src/prompts/advisor/context-files.md +8 -0
  1930. package/src/prompts/advisor/system.md +89 -0
  1931. package/src/prompts/agents/designer.md +74 -0
  1932. package/src/prompts/agents/explore.md +58 -0
  1933. package/src/prompts/agents/frontmatter.md +11 -0
  1934. package/src/prompts/agents/init.md +33 -0
  1935. package/src/prompts/agents/librarian.md +119 -0
  1936. package/src/prompts/agents/plan.md +48 -0
  1937. package/src/prompts/agents/reviewer.md +140 -0
  1938. package/src/prompts/agents/task.md +17 -0
  1939. package/src/prompts/agents/tester.md +111 -0
  1940. package/src/prompts/bench.md +6 -0
  1941. package/src/prompts/ci-green-request.md +36 -0
  1942. package/src/prompts/dry-balance-bench.md +8 -0
  1943. package/src/prompts/goals/goal-budget-limit.md +16 -0
  1944. package/src/prompts/goals/goal-continuation.md +28 -0
  1945. package/src/prompts/goals/goal-mode-active.md +23 -0
  1946. package/src/prompts/goals/goal-mode-context.md +4 -0
  1947. package/src/prompts/goals/goal-todo-context.md +20 -0
  1948. package/src/prompts/goals/guided-goal-interview.md +8 -0
  1949. package/src/prompts/goals/guided-goal-system.md +12 -0
  1950. package/src/prompts/memories/consolidation.md +30 -0
  1951. package/src/prompts/memories/consolidation_system.md +4 -0
  1952. package/src/prompts/memories/read-path.md +17 -0
  1953. package/src/prompts/memories/stage_one_input.md +6 -0
  1954. package/src/prompts/memories/stage_one_system.md +21 -0
  1955. package/src/prompts/review-custom-request.md +21 -0
  1956. package/src/prompts/review-headless-request.md +16 -0
  1957. package/src/prompts/review-request.md +68 -0
  1958. package/src/prompts/skills/autoload.md +8 -0
  1959. package/src/prompts/skills/user-invocation.md +11 -0
  1960. package/src/prompts/steering/parent-irc.md +5 -0
  1961. package/src/prompts/steering/user-interjection.md +9 -0
  1962. package/src/prompts/system/active-repo-context.md +4 -0
  1963. package/src/prompts/system/agent-creation-architect.md +50 -0
  1964. package/src/prompts/system/agent-creation-user.md +6 -0
  1965. package/src/prompts/system/auto-continue.md +1 -0
  1966. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  1967. package/src/prompts/system/auto-thinking-difficulty.md +12 -0
  1968. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  1969. package/src/prompts/system/autolearn-guidance.md +7 -0
  1970. package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
  1971. package/src/prompts/system/background-tan-dispatch.md +8 -0
  1972. package/src/prompts/system/btw-user.md +8 -0
  1973. package/src/prompts/system/commit-message-system.md +14 -0
  1974. package/src/prompts/system/custom-system-prompt.md +64 -0
  1975. package/src/prompts/system/eager-task.md +7 -0
  1976. package/src/prompts/system/eager-todo.md +18 -0
  1977. package/src/prompts/system/empty-stop-retry.md +4 -0
  1978. package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
  1979. package/src/prompts/system/interrupted-thinking.md +7 -0
  1980. package/src/prompts/system/irc-autoreply.md +6 -0
  1981. package/src/prompts/system/irc-incoming.md +9 -0
  1982. package/src/prompts/system/manual-continue.md +7 -0
  1983. package/src/prompts/system/memory-consolidation-system.md +8 -0
  1984. package/src/prompts/system/memory-extraction-system.md +26 -0
  1985. package/src/prompts/system/mid-run-todo-nudge.md +3 -0
  1986. package/src/prompts/system/omfg-user.md +50 -0
  1987. package/src/prompts/system/orchestrate-notice.md +40 -0
  1988. package/src/prompts/system/personalities/default.md +18 -0
  1989. package/src/prompts/system/personalities/friendly.md +17 -0
  1990. package/src/prompts/system/personalities/pragmatic.md +15 -0
  1991. package/src/prompts/system/plan-mode-active.md +118 -0
  1992. package/src/prompts/system/plan-mode-approved.md +22 -0
  1993. package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
  1994. package/src/prompts/system/plan-mode-reference.md +10 -0
  1995. package/src/prompts/system/plan-mode-subagent.md +33 -0
  1996. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  1997. package/src/prompts/system/project-prompt.md +54 -0
  1998. package/src/prompts/system/recap-user.md +9 -0
  1999. package/src/prompts/system/rewind-report.md +6 -0
  2000. package/src/prompts/system/side-channel-no-tools.md +3 -0
  2001. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  2002. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  2003. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  2004. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  2005. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  2006. package/src/prompts/system/speech-rewrite.md +15 -0
  2007. package/src/prompts/system/subagent-system-prompt.md +77 -0
  2008. package/src/prompts/system/subagent-user-prompt.md +3 -0
  2009. package/src/prompts/system/subagent-yield-reminder.md +13 -0
  2010. package/src/prompts/system/system-prompt.md +248 -0
  2011. package/src/prompts/system/thinking-loop-redirect.md +10 -0
  2012. package/src/prompts/system/tiny-title-system.md +8 -0
  2013. package/src/prompts/system/title-marker-instruction.md +1 -0
  2014. package/src/prompts/system/title-system-marker.md +17 -0
  2015. package/src/prompts/system/title-system.md +17 -0
  2016. package/src/prompts/system/tool-call-loop-redirect.md +8 -0
  2017. package/src/prompts/system/ttsr-interrupt.md +7 -0
  2018. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  2019. package/src/prompts/system/ultrathink-notice.md +3 -0
  2020. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  2021. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  2022. package/src/prompts/system/web-search.md +25 -0
  2023. package/src/prompts/system/workflow-notice.md +70 -0
  2024. package/src/prompts/tools/apply-patch.md +65 -0
  2025. package/src/prompts/tools/ask.md +22 -0
  2026. package/src/prompts/tools/ast-edit.md +22 -0
  2027. package/src/prompts/tools/ast-grep.md +25 -0
  2028. package/src/prompts/tools/async-result.md +8 -0
  2029. package/src/prompts/tools/bash.md +57 -0
  2030. package/src/prompts/tools/browser.md +45 -0
  2031. package/src/prompts/tools/checkpoint.md +15 -0
  2032. package/src/prompts/tools/debug.md +17 -0
  2033. package/src/prompts/tools/eval.md +72 -0
  2034. package/src/prompts/tools/github.md +17 -0
  2035. package/src/prompts/tools/glob.md +15 -0
  2036. package/src/prompts/tools/goal.md +11 -0
  2037. package/src/prompts/tools/grep.md +22 -0
  2038. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  2039. package/src/prompts/tools/image-attachment-describe.md +10 -0
  2040. package/src/prompts/tools/image-gen.md +7 -0
  2041. package/src/prompts/tools/inspect-image-system.md +20 -0
  2042. package/src/prompts/tools/inspect-image.md +22 -0
  2043. package/src/prompts/tools/irc.md +24 -0
  2044. package/src/prompts/tools/job.md +11 -0
  2045. package/src/prompts/tools/learn.md +7 -0
  2046. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  2047. package/src/prompts/tools/lsp.md +28 -0
  2048. package/src/prompts/tools/manage-skill.md +9 -0
  2049. package/src/prompts/tools/memory-edit.md +8 -0
  2050. package/src/prompts/tools/patch.md +57 -0
  2051. package/src/prompts/tools/read.md +77 -0
  2052. package/src/prompts/tools/recall.md +5 -0
  2053. package/src/prompts/tools/reflect.md +5 -0
  2054. package/src/prompts/tools/replace.md +29 -0
  2055. package/src/prompts/tools/resolve.md +4 -0
  2056. package/src/prompts/tools/retain.md +6 -0
  2057. package/src/prompts/tools/rewind.md +14 -0
  2058. package/src/prompts/tools/search-tool-bm25.md +32 -0
  2059. package/src/prompts/tools/ssh.md +23 -0
  2060. package/src/prompts/tools/task-summary.md +17 -0
  2061. package/src/prompts/tools/task.md +68 -0
  2062. package/src/prompts/tools/todo.md +39 -0
  2063. package/src/prompts/tools/web-search.md +6 -0
  2064. package/src/prompts/tools/write.md +14 -0
  2065. package/src/registry/agent-lifecycle.ts +270 -0
  2066. package/src/registry/agent-registry.ts +190 -0
  2067. package/src/sdk.ts +3037 -0
  2068. package/src/secrets/index.ts +123 -0
  2069. package/src/secrets/obfuscator.ts +441 -0
  2070. package/src/secrets/regex.ts +21 -0
  2071. package/src/session/agent-session.ts +15855 -0
  2072. package/src/session/agent-storage.ts +478 -0
  2073. package/src/session/artifacts.ts +153 -0
  2074. package/src/session/auth-broker-config.ts +92 -0
  2075. package/src/session/auth-storage.ts +24 -0
  2076. package/src/session/blob-store.ts +279 -0
  2077. package/src/session/client-bridge.ts +85 -0
  2078. package/src/session/codex-auto-reset.ts +202 -0
  2079. package/src/session/compact-modes.ts +105 -0
  2080. package/src/session/exit-diagnostics.ts +202 -0
  2081. package/src/session/history-storage.ts +360 -0
  2082. package/src/session/indexed-session-storage.ts +537 -0
  2083. package/src/session/messages.test.ts +125 -0
  2084. package/src/session/messages.ts +740 -0
  2085. package/src/session/provider-image-budget.ts +86 -0
  2086. package/src/session/redis-session-storage.ts +217 -0
  2087. package/src/session/session-context.ts +442 -0
  2088. package/src/session/session-dump-format.ts +216 -0
  2089. package/src/session/session-entries.ts +241 -0
  2090. package/src/session/session-history-format.ts +396 -0
  2091. package/src/session/session-listing.ts +652 -0
  2092. package/src/session/session-loader.ts +284 -0
  2093. package/src/session/session-manager.ts +1995 -0
  2094. package/src/session/session-migrations.ts +78 -0
  2095. package/src/session/session-paths.ts +193 -0
  2096. package/src/session/session-persistence.ts +266 -0
  2097. package/src/session/session-storage.ts +734 -0
  2098. package/src/session/session-title-slot.ts +141 -0
  2099. package/src/session/settings-stream-fn.ts +73 -0
  2100. package/src/session/shake-types.ts +43 -0
  2101. package/src/session/snapcompact-inline.ts +561 -0
  2102. package/src/session/snapcompact-savings-journal.ts +113 -0
  2103. package/src/session/sql-session-storage.ts +374 -0
  2104. package/src/session/streaming-output.ts +1330 -0
  2105. package/src/session/tool-choice-queue.ts +290 -0
  2106. package/src/session/turn-persistence.ts +142 -0
  2107. package/src/session/unexpected-stop-classifier.ts +129 -0
  2108. package/src/session/yield-queue.ts +183 -0
  2109. package/src/slash-commands/acp-builtins.ts +70 -0
  2110. package/src/slash-commands/available-commands.ts +105 -0
  2111. package/src/slash-commands/builtin-registry.ts +2554 -0
  2112. package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
  2113. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  2114. package/src/slash-commands/helpers/context-report.ts +66 -0
  2115. package/src/slash-commands/helpers/format.ts +46 -0
  2116. package/src/slash-commands/helpers/logout.ts +88 -0
  2117. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  2118. package/src/slash-commands/helpers/mcp.ts +533 -0
  2119. package/src/slash-commands/helpers/parse.ts +85 -0
  2120. package/src/slash-commands/helpers/reset-usage.ts +66 -0
  2121. package/src/slash-commands/helpers/ssh.ts +195 -0
  2122. package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
  2123. package/src/slash-commands/helpers/todo.ts +285 -0
  2124. package/src/slash-commands/helpers/usage-report.ts +162 -0
  2125. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  2126. package/src/slash-commands/types.ts +137 -0
  2127. package/src/ssh/__tests__/connection-manager-args.test.ts +191 -0
  2128. package/src/ssh/__tests__/connection-manager-timeout.test.ts +61 -0
  2129. package/src/ssh/__tests__/file-transfer-posix-guard.test.ts +105 -0
  2130. package/src/ssh/__tests__/sshfs-mount.test.ts +13 -0
  2131. package/src/ssh/config-writer.ts +183 -0
  2132. package/src/ssh/connection-manager.ts +667 -0
  2133. package/src/ssh/file-transfer.ts +214 -0
  2134. package/src/ssh/ssh-executor.ts +178 -0
  2135. package/src/ssh/sshfs-mount.ts +163 -0
  2136. package/src/ssh/utils.ts +51 -0
  2137. package/src/startup-splash.ts +19 -0
  2138. package/src/stt/asr-client.ts +401 -0
  2139. package/src/stt/asr-protocol.ts +65 -0
  2140. package/src/stt/asr-worker.ts +638 -0
  2141. package/src/stt/downloader.ts +144 -0
  2142. package/src/stt/endpointer.ts +259 -0
  2143. package/src/stt/index.ts +8 -0
  2144. package/src/stt/models.ts +150 -0
  2145. package/src/stt/recorder.ts +538 -0
  2146. package/src/stt/stt-controller.ts +409 -0
  2147. package/src/stt/submit-trigger.ts +74 -0
  2148. package/src/stt/transcriber.ts +60 -0
  2149. package/src/stt/wav.ts +173 -0
  2150. package/src/subprocess/worker-client.ts +456 -0
  2151. package/src/subprocess/worker-runtime.ts +494 -0
  2152. package/src/system-prompt.test.ts +158 -0
  2153. package/src/system-prompt.ts +787 -0
  2154. package/src/task/agents.ts +166 -0
  2155. package/src/task/commands.ts +132 -0
  2156. package/src/task/discovery.ts +145 -0
  2157. package/src/task/executor.ts +2481 -0
  2158. package/src/task/index.ts +1481 -0
  2159. package/src/task/isolation-runner.ts +384 -0
  2160. package/src/task/name-generator.ts +1577 -0
  2161. package/src/task/omp-command.ts +26 -0
  2162. package/src/task/output-manager.ts +93 -0
  2163. package/src/task/parallel.ts +178 -0
  2164. package/src/task/persisted-revive.ts +128 -0
  2165. package/src/task/provider-concurrency.ts +100 -0
  2166. package/src/task/render.test.ts +121 -0
  2167. package/src/task/render.ts +1761 -0
  2168. package/src/task/renderer.ts +15 -0
  2169. package/src/task/repair-args.ts +129 -0
  2170. package/src/task/spawn-policy.test.ts +63 -0
  2171. package/src/task/spawn-policy.ts +58 -0
  2172. package/src/task/subprocess-tool-registry.ts +88 -0
  2173. package/src/task/types.ts +495 -0
  2174. package/src/task/worktree.ts +935 -0
  2175. package/src/task/yield-assembly.ts +198 -0
  2176. package/src/telemetry-export.ts +144 -0
  2177. package/src/thinking.ts +219 -0
  2178. package/src/tiny/device.ts +111 -0
  2179. package/src/tiny/dtype.ts +101 -0
  2180. package/src/tiny/models.ts +268 -0
  2181. package/src/tiny/text.ts +336 -0
  2182. package/src/tiny/title-client.ts +438 -0
  2183. package/src/tiny/title-protocol.ts +56 -0
  2184. package/src/tiny/worker.ts +351 -0
  2185. package/src/tool-discovery/mode.ts +24 -0
  2186. package/src/tool-discovery/tool-index.ts +271 -0
  2187. package/src/tools/__tests__/eval-description.test.ts +19 -0
  2188. package/src/tools/__tests__/json-tree.test.ts +35 -0
  2189. package/src/tools/acp-bridge.ts +71 -0
  2190. package/src/tools/approval.ts +189 -0
  2191. package/src/tools/ask.ts +1213 -0
  2192. package/src/tools/ast-edit.ts +708 -0
  2193. package/src/tools/ast-grep.ts +520 -0
  2194. package/src/tools/auto-generated-guard.ts +322 -0
  2195. package/src/tools/bash-command-fixup.ts +37 -0
  2196. package/src/tools/bash-interactive.ts +408 -0
  2197. package/src/tools/bash-interceptor.ts +67 -0
  2198. package/src/tools/bash-pty-selection.ts +14 -0
  2199. package/src/tools/bash-skill-urls.ts +248 -0
  2200. package/src/tools/bash.ts +1421 -0
  2201. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  2202. package/src/tools/browser/aria/aria-snapshot.ts +103 -0
  2203. package/src/tools/browser/attach.ts +194 -0
  2204. package/src/tools/browser/cmux/cmux-tab.ts +1378 -0
  2205. package/src/tools/browser/cmux/rpc.ts +156 -0
  2206. package/src/tools/browser/cmux/socket-client.ts +309 -0
  2207. package/src/tools/browser/launch.ts +749 -0
  2208. package/src/tools/browser/readable.ts +112 -0
  2209. package/src/tools/browser/registry.ts +266 -0
  2210. package/src/tools/browser/render.ts +223 -0
  2211. package/src/tools/browser/run-cancellation.ts +47 -0
  2212. package/src/tools/browser/tab-protocol.ts +107 -0
  2213. package/src/tools/browser/tab-supervisor.ts +956 -0
  2214. package/src/tools/browser/tab-worker-entry.ts +29 -0
  2215. package/src/tools/browser/tab-worker.ts +1433 -0
  2216. package/src/tools/browser.ts +409 -0
  2217. package/src/tools/builtin-names.ts +58 -0
  2218. package/src/tools/checkpoint.ts +150 -0
  2219. package/src/tools/conflict-detect.ts +718 -0
  2220. package/src/tools/context.ts +39 -0
  2221. package/src/tools/debug.ts +1088 -0
  2222. package/src/tools/eval-backends.ts +34 -0
  2223. package/src/tools/eval-render.ts +776 -0
  2224. package/src/tools/eval.ts +767 -0
  2225. package/src/tools/fetch.ts +1966 -0
  2226. package/src/tools/file-recorder.ts +35 -0
  2227. package/src/tools/fs-cache-invalidation.ts +28 -0
  2228. package/src/tools/gh-cache-invalidation.ts +255 -0
  2229. package/src/tools/gh-format.ts +12 -0
  2230. package/src/tools/gh-renderer.ts +484 -0
  2231. package/src/tools/gh.ts +3752 -0
  2232. package/src/tools/github-cache.ts +663 -0
  2233. package/src/tools/glob.ts +639 -0
  2234. package/src/tools/grep.ts +1836 -0
  2235. package/src/tools/grouped-file-output.ts +210 -0
  2236. package/src/tools/image-gen.ts +1587 -0
  2237. package/src/tools/index.ts +682 -0
  2238. package/src/tools/inspect-image-renderer.ts +132 -0
  2239. package/src/tools/inspect-image.ts +260 -0
  2240. package/src/tools/irc.ts +827 -0
  2241. package/src/tools/job.ts +612 -0
  2242. package/src/tools/json-tree.ts +260 -0
  2243. package/src/tools/jtd-to-json-schema.ts +219 -0
  2244. package/src/tools/jtd-to-typescript.ts +136 -0
  2245. package/src/tools/jtd-utils.ts +102 -0
  2246. package/src/tools/learn.ts +141 -0
  2247. package/src/tools/list-limit.ts +40 -0
  2248. package/src/tools/manage-skill.ts +100 -0
  2249. package/src/tools/match-line-format.ts +20 -0
  2250. package/src/tools/memory-edit.ts +59 -0
  2251. package/src/tools/memory-recall.ts +102 -0
  2252. package/src/tools/memory-reflect.ts +88 -0
  2253. package/src/tools/memory-render.ts +202 -0
  2254. package/src/tools/memory-retain.ts +89 -0
  2255. package/src/tools/output-meta.ts +818 -0
  2256. package/src/tools/output-schema-validator.ts +307 -0
  2257. package/src/tools/path-utils.ts +1279 -0
  2258. package/src/tools/plan-mode-guard.ts +155 -0
  2259. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  2260. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  2261. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  2262. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  2263. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  2264. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  2265. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  2266. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  2267. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  2268. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  2269. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  2270. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  2271. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  2272. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  2273. package/src/tools/read.ts +3522 -0
  2274. package/src/tools/render-utils.ts +913 -0
  2275. package/src/tools/renderers.ts +107 -0
  2276. package/src/tools/report-tool-issue.ts +530 -0
  2277. package/src/tools/resolve.ts +302 -0
  2278. package/src/tools/review.ts +261 -0
  2279. package/src/tools/search-tool-bm25.ts +351 -0
  2280. package/src/tools/sqlite-reader.ts +884 -0
  2281. package/src/tools/ssh.ts +397 -0
  2282. package/src/tools/todo.ts +944 -0
  2283. package/src/tools/tool-errors.ts +62 -0
  2284. package/src/tools/tool-result.ts +102 -0
  2285. package/src/tools/tool-timeouts.ts +30 -0
  2286. package/src/tools/tts.ts +266 -0
  2287. package/src/tools/write.ts +1219 -0
  2288. package/src/tools/yield.ts +455 -0
  2289. package/src/tts/downloader.ts +64 -0
  2290. package/src/tts/index.ts +10 -0
  2291. package/src/tts/models.ts +137 -0
  2292. package/src/tts/player.ts +137 -0
  2293. package/src/tts/runtime.ts +21 -0
  2294. package/src/tts/speakable.ts +382 -0
  2295. package/src/tts/speech-enhancer.ts +204 -0
  2296. package/src/tts/streaming-player.ts +321 -0
  2297. package/src/tts/tts-client.ts +475 -0
  2298. package/src/tts/tts-protocol.ts +69 -0
  2299. package/src/tts/tts-worker.ts +434 -0
  2300. package/src/tts/vocalizer.ts +393 -0
  2301. package/src/tts/wav.ts +58 -0
  2302. package/src/tui/code-cell.ts +268 -0
  2303. package/src/tui/file-list.ts +55 -0
  2304. package/src/tui/hyperlink.ts +178 -0
  2305. package/src/tui/index.ts +13 -0
  2306. package/src/tui/output-block.ts +251 -0
  2307. package/src/tui/status-line.ts +54 -0
  2308. package/src/tui/tree-list.ts +133 -0
  2309. package/src/tui/types.ts +15 -0
  2310. package/src/tui/utils.ts +103 -0
  2311. package/src/tui/width-aware-text.ts +58 -0
  2312. package/src/utils/active-repo-context.ts +143 -0
  2313. package/src/utils/block-context.ts +312 -0
  2314. package/src/utils/changelog.ts +132 -0
  2315. package/src/utils/clipboard.ts +356 -0
  2316. package/src/utils/command-args.ts +76 -0
  2317. package/src/utils/commit-message-generator.ts +146 -0
  2318. package/src/utils/edit-mode.ts +58 -0
  2319. package/src/utils/enhanced-paste.ts +230 -0
  2320. package/src/utils/event-bus.ts +33 -0
  2321. package/src/utils/external-editor.ts +78 -0
  2322. package/src/utils/fetch-timeout.ts +10 -0
  2323. package/src/utils/file-display-mode.ts +44 -0
  2324. package/src/utils/file-mentions.ts +293 -0
  2325. package/src/utils/git.ts +2181 -0
  2326. package/src/utils/image-loading.ts +231 -0
  2327. package/src/utils/image-resize.ts +420 -0
  2328. package/src/utils/image-vision-fallback.ts +196 -0
  2329. package/src/utils/ipc.ts +38 -0
  2330. package/src/utils/jj.ts +295 -0
  2331. package/src/utils/lang-from-path.ts +244 -0
  2332. package/src/utils/markit-cache.ts +166 -0
  2333. package/src/utils/markit.ts +211 -0
  2334. package/src/utils/mupdf-wasm-embed.ts +12 -0
  2335. package/src/utils/open.ts +100 -0
  2336. package/src/utils/prompt-path.ts +3 -0
  2337. package/src/utils/qrcode.ts +535 -0
  2338. package/src/utils/session-color.ts +142 -0
  2339. package/src/utils/shell-snapshot-fn-env.sh +60 -0
  2340. package/src/utils/shell-snapshot.ts +306 -0
  2341. package/src/utils/sixel.ts +69 -0
  2342. package/src/utils/thinking-display.ts +117 -0
  2343. package/src/utils/title-generator.ts +348 -0
  2344. package/src/utils/tool-choice.ts +49 -0
  2345. package/src/utils/tools-manager.ts +429 -0
  2346. package/src/utils/turndown.ts +83 -0
  2347. package/src/utils/zip.ts +1091 -0
  2348. package/src/web/kagi.ts +304 -0
  2349. package/src/web/parallel.ts +354 -0
  2350. package/src/web/scrapers/artifacthub.ts +207 -0
  2351. package/src/web/scrapers/arxiv.ts +83 -0
  2352. package/src/web/scrapers/aur.ts +162 -0
  2353. package/src/web/scrapers/biorxiv.ts +133 -0
  2354. package/src/web/scrapers/bluesky.ts +262 -0
  2355. package/src/web/scrapers/brew.ts +172 -0
  2356. package/src/web/scrapers/cheatsh.ts +68 -0
  2357. package/src/web/scrapers/chocolatey.ts +196 -0
  2358. package/src/web/scrapers/choosealicense.ts +95 -0
  2359. package/src/web/scrapers/cisa-kev.ts +87 -0
  2360. package/src/web/scrapers/clojars.ts +154 -0
  2361. package/src/web/scrapers/coingecko.ts +177 -0
  2362. package/src/web/scrapers/crates-io.ts +97 -0
  2363. package/src/web/scrapers/crossref.ts +136 -0
  2364. package/src/web/scrapers/devto.ts +147 -0
  2365. package/src/web/scrapers/discogs.ts +306 -0
  2366. package/src/web/scrapers/discourse.ts +197 -0
  2367. package/src/web/scrapers/dockerhub.ts +138 -0
  2368. package/src/web/scrapers/docs-rs.ts +652 -0
  2369. package/src/web/scrapers/fdroid.ts +134 -0
  2370. package/src/web/scrapers/firefox-addons.ts +191 -0
  2371. package/src/web/scrapers/flathub.ts +223 -0
  2372. package/src/web/scrapers/github-gist.ts +58 -0
  2373. package/src/web/scrapers/github.ts +800 -0
  2374. package/src/web/scrapers/gitlab.ts +401 -0
  2375. package/src/web/scrapers/go-pkg.ts +266 -0
  2376. package/src/web/scrapers/hackage.ts +140 -0
  2377. package/src/web/scrapers/hackernews.ts +189 -0
  2378. package/src/web/scrapers/hex.ts +105 -0
  2379. package/src/web/scrapers/huggingface.ts +321 -0
  2380. package/src/web/scrapers/iacr.ts +89 -0
  2381. package/src/web/scrapers/index.ts +252 -0
  2382. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  2383. package/src/web/scrapers/lemmy.ts +203 -0
  2384. package/src/web/scrapers/lobsters.ts +175 -0
  2385. package/src/web/scrapers/mastodon.ts +292 -0
  2386. package/src/web/scrapers/maven.ts +138 -0
  2387. package/src/web/scrapers/mdn.ts +173 -0
  2388. package/src/web/scrapers/metacpan.ts +222 -0
  2389. package/src/web/scrapers/musicbrainz.ts +250 -0
  2390. package/src/web/scrapers/npm.ts +98 -0
  2391. package/src/web/scrapers/nuget.ts +183 -0
  2392. package/src/web/scrapers/nvd.ts +222 -0
  2393. package/src/web/scrapers/ollama.ts +239 -0
  2394. package/src/web/scrapers/open-vsx.ts +106 -0
  2395. package/src/web/scrapers/opencorporates.ts +292 -0
  2396. package/src/web/scrapers/openlibrary.ts +336 -0
  2397. package/src/web/scrapers/orcid.ts +286 -0
  2398. package/src/web/scrapers/osv.ts +176 -0
  2399. package/src/web/scrapers/packagist.ts +160 -0
  2400. package/src/web/scrapers/pub-dev.ts +143 -0
  2401. package/src/web/scrapers/pubmed.ts +211 -0
  2402. package/src/web/scrapers/pypi.ts +112 -0
  2403. package/src/web/scrapers/rawg.ts +110 -0
  2404. package/src/web/scrapers/readthedocs.ts +120 -0
  2405. package/src/web/scrapers/reddit.ts +95 -0
  2406. package/src/web/scrapers/repology.ts +251 -0
  2407. package/src/web/scrapers/rfc.ts +201 -0
  2408. package/src/web/scrapers/rubygems.ts +103 -0
  2409. package/src/web/scrapers/searchcode.ts +189 -0
  2410. package/src/web/scrapers/sec-edgar.ts +261 -0
  2411. package/src/web/scrapers/semantic-scholar.ts +171 -0
  2412. package/src/web/scrapers/snapcraft.ts +187 -0
  2413. package/src/web/scrapers/sourcegraph.ts +336 -0
  2414. package/src/web/scrapers/spdx.ts +108 -0
  2415. package/src/web/scrapers/spotify.ts +198 -0
  2416. package/src/web/scrapers/stackoverflow.ts +120 -0
  2417. package/src/web/scrapers/terraform.ts +277 -0
  2418. package/src/web/scrapers/tldr.ts +47 -0
  2419. package/src/web/scrapers/twitter.ts +94 -0
  2420. package/src/web/scrapers/types.ts +354 -0
  2421. package/src/web/scrapers/utils.ts +109 -0
  2422. package/src/web/scrapers/vimeo.ts +133 -0
  2423. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  2424. package/src/web/scrapers/w3c.ts +156 -0
  2425. package/src/web/scrapers/wikidata.ts +344 -0
  2426. package/src/web/scrapers/wikipedia.ts +84 -0
  2427. package/src/web/scrapers/youtube.ts +325 -0
  2428. package/src/web/search/index.ts +312 -0
  2429. package/src/web/search/provider.ts +214 -0
  2430. package/src/web/search/providers/anthropic.ts +343 -0
  2431. package/src/web/search/providers/base.ts +91 -0
  2432. package/src/web/search/providers/brave.ts +152 -0
  2433. package/src/web/search/providers/codex.ts +593 -0
  2434. package/src/web/search/providers/duckduckgo.ts +212 -0
  2435. package/src/web/search/providers/exa.ts +484 -0
  2436. package/src/web/search/providers/firecrawl.ts +144 -0
  2437. package/src/web/search/providers/gemini.ts +618 -0
  2438. package/src/web/search/providers/jina.ts +111 -0
  2439. package/src/web/search/providers/kagi.ts +86 -0
  2440. package/src/web/search/providers/kimi.ts +196 -0
  2441. package/src/web/search/providers/parallel.ts +136 -0
  2442. package/src/web/search/providers/perplexity-auth.ts +133 -0
  2443. package/src/web/search/providers/perplexity.ts +878 -0
  2444. package/src/web/search/providers/searxng.ts +325 -0
  2445. package/src/web/search/providers/synthetic.ts +114 -0
  2446. package/src/web/search/providers/tavily.ts +193 -0
  2447. package/src/web/search/providers/tinyfish.ts +159 -0
  2448. package/src/web/search/providers/utils.ts +128 -0
  2449. package/src/web/search/providers/xai.ts +292 -0
  2450. package/src/web/search/providers/zai.ts +419 -0
  2451. package/src/web/search/render.ts +262 -0
  2452. package/src/web/search/types.ts +470 -0
  2453. package/src/web/search/utils.ts +17 -0
  2454. package/src/workspace-tree.ts +326 -0
package/src/sdk.ts ADDED
@@ -0,0 +1,3037 @@
1
+ import {
2
+ Agent,
3
+ type AgentEvent,
4
+ type AgentMessage,
5
+ type AgentTelemetryConfig,
6
+ type AgentTool,
7
+ AppendOnlyContextManager,
8
+ filterProviderReplayMessages,
9
+ type ThinkingLevel,
10
+ } from "@oh-my-pi-zen/pi-agent-core";
11
+ import type { Context, CredentialDisabledEvent, Message, Model, SimpleStreamOptions } from "@oh-my-pi-zen/pi-ai";
12
+ import type { Dialect } from "@oh-my-pi-zen/pi-ai/dialect";
13
+ import {
14
+ getOpenAICodexTransportDetails,
15
+ prewarmOpenAICodexResponses,
16
+ } from "@oh-my-pi-zen/pi-ai/providers/openai-codex-responses";
17
+ import { FALLBACK_DIALECT, preferredDialect } from "@oh-my-pi-zen/pi-catalog/identity";
18
+ import type { Component } from "@oh-my-pi-zen/pi-tui";
19
+ import { $env, $flag, getAgentDir, getProjectDir, logger, postmortem, prompt, Snowflake } from "@oh-my-pi-zen/pi-utils";
20
+ import { INTENT_FIELD } from "@oh-my-pi-zen/pi-wire";
21
+ import {
22
+ discoverAdvisorConfigs,
23
+ discoverWatchdogFiles,
24
+ formatActiveRepoWatchdogPrompt,
25
+ formatAdvisorContextPrompt,
26
+ } from "./advisor";
27
+ import { type AsyncJob, AsyncJobManager } from "./async";
28
+ import { AutoLearnController, buildAutoLearnInstructions } from "./autolearn/controller";
29
+ import { loadCapability } from "./capability";
30
+ import { type Rule, ruleCapability, setActiveRules } from "./capability/rule";
31
+ import { bucketRules } from "./capability/rule-buckets";
32
+ import { shouldEnableAppendOnlyContext } from "./config/append-only-context-mode";
33
+ import { shouldInlineToolDescriptors } from "./config/inline-tool-descriptors-mode";
34
+ import { ModelRegistry } from "./config/model-registry";
35
+ import {
36
+ formatModelString,
37
+ getModelMatchPreferences,
38
+ parseModelPattern,
39
+ parseModelString,
40
+ pickDefaultAvailableModel,
41
+ resolveAllowedModels,
42
+ resolveModelRoleValue,
43
+ } from "./config/model-resolver";
44
+ import { loadPromptTemplates as loadPromptTemplatesInternal, type PromptTemplate } from "./config/prompt-templates";
45
+ import { buildServiceTierByFamily } from "./config/service-tier";
46
+ import { Settings, type SkillsSettings } from "./config/settings";
47
+ import { CursorExecHandlers } from "./cursor";
48
+ import "./discovery";
49
+ import { initializeWithSettings } from "./discovery";
50
+ import { disposeAllJuliaKernelSessions, disposeJuliaKernelSessionsByOwner } from "./eval/jl/executor";
51
+ import { disposeAllKernelSessions, disposeKernelSessionsByOwner } from "./eval/py/executor";
52
+ import { disposeAllRubyKernelSessions, disposeRubyKernelSessionsByOwner } from "./eval/rb/executor";
53
+ import { defaultEvalSessionId } from "./eval/session-id";
54
+ import {
55
+ type CustomCommandsLoadResult,
56
+ type LoadedCustomCommand,
57
+ loadCustomCommands as loadCustomCommandsInternal,
58
+ } from "./extensibility/custom-commands";
59
+ import { discoverCustomToolPaths, loadCustomTools, type ToolPathWithSource } from "./extensibility/custom-tools";
60
+ import type { CustomTool, CustomToolContext, CustomToolSessionEvent } from "./extensibility/custom-tools/types";
61
+ import {
62
+ discoverAndLoadExtensions,
63
+ discoverExtensionPaths,
64
+ type ExtensionContext,
65
+ type ExtensionFactory,
66
+ ExtensionRunner,
67
+ ExtensionToolWrapper,
68
+ type ExtensionUIContext,
69
+ type LoadExtensionsResult,
70
+ loadExtensionFromFactory,
71
+ loadExtensions,
72
+ type ToolDefinition,
73
+ wrapRegisteredTools,
74
+ } from "./extensibility/extensions";
75
+ import {
76
+ loadSkills as loadSkillsInternal,
77
+ type Skill,
78
+ type SkillWarning,
79
+ setActiveSkills,
80
+ } from "./extensibility/skills";
81
+ import { type FileSlashCommand, loadSlashCommands as loadSlashCommandsInternal } from "./extensibility/slash-commands";
82
+ import type { HindsightSessionState } from "./hindsight/state";
83
+ import { LocalProtocolHandler, type LocalProtocolOptions } from "./internal-urls";
84
+ import { LSP_STARTUP_EVENT_CHANNEL, type LspStartupEvent } from "./lsp/startup-events";
85
+ import {
86
+ discoverAndLoadMCPTools,
87
+ type MCPLoadResult,
88
+ MCPManager,
89
+ MCPToolCache,
90
+ type MCPToolsLoadResult,
91
+ parseMCPToolName,
92
+ } from "./mcp";
93
+ import { MCP_CONNECTION_STATUS_EVENT_CHANNEL, type McpConnectionStatusEvent } from "./mcp/startup-events";
94
+ import { createSessionMemoryRuntimeContext, resolveMemoryBackend } from "./memory-backend";
95
+ import type { MnemopiSessionState } from "./mnemopi/state";
96
+ import asyncResultTemplate from "./prompts/tools/async-result.md" with { type: "text" };
97
+ import lateDiagnosticTemplate from "./prompts/tools/lsp-late-diagnostic.md" with { type: "text" };
98
+ import { AgentLifecycleManager } from "./registry/agent-lifecycle";
99
+ import { AgentRegistry, MAIN_AGENT_ID } from "./registry/agent-registry";
100
+ import {
101
+ collectEnvSecrets,
102
+ deobfuscateSessionContext,
103
+ deobfuscateToolArguments,
104
+ loadSecrets,
105
+ obfuscateMessages,
106
+ obfuscateProviderContext,
107
+ SecretObfuscator,
108
+ } from "./secrets";
109
+ import { AgentSession } from "./session/agent-session";
110
+ import { discoverAuthStorage as discoverAuthStorageFromConfig } from "./session/auth-broker-config";
111
+ import type { AuthStorage } from "./session/auth-storage";
112
+ import {
113
+ type CustomMessage,
114
+ convertToLlm,
115
+ LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE,
116
+ USER_INTERRUPT_LABEL,
117
+ wrapSteeringForModel,
118
+ } from "./session/messages";
119
+ import { clampProviderContextImages } from "./session/provider-image-budget";
120
+ import { getRestorableSessionModels } from "./session/session-context";
121
+ import { SessionManager } from "./session/session-manager";
122
+ import { createSettingsAwareStreamFn } from "./session/settings-stream-fn";
123
+ import { SnapcompactInlineTransformer } from "./session/snapcompact-inline";
124
+ import { createSnapcompactSavingsRecorder } from "./session/snapcompact-savings-journal";
125
+ import { closeAllConnections } from "./ssh/connection-manager";
126
+ import { unmountAll } from "./ssh/sshfs-mount";
127
+ import {
128
+ type BuildSystemPromptResult,
129
+ buildSystemPrompt as buildSystemPromptInternal,
130
+ buildSystemPromptToolMetadata,
131
+ loadProjectContextFiles as loadContextFilesInternal,
132
+ } from "./system-prompt";
133
+ import { AgentOutputManager } from "./task/output-manager";
134
+ import { wrapStreamFnWithProviderConcurrency } from "./task/provider-concurrency";
135
+ import {
136
+ AUTO_THINKING,
137
+ type ConfiguredThinkingLevel,
138
+ concreteThinkingLevel,
139
+ parseConfiguredThinkingLevel,
140
+ parseThinkingLevel,
141
+ resolveProvisionalAutoLevel,
142
+ resolveThinkingLevelForModel,
143
+ shouldDisableReasoning,
144
+ toReasoningEffort,
145
+ } from "./thinking";
146
+ import { countToolsForAutoDiscovery, resolveEffectiveToolDiscoveryMode } from "./tool-discovery/mode";
147
+ import {
148
+ collectDiscoverableTools,
149
+ type DiscoverableTool,
150
+ filterBySource,
151
+ formatDiscoverableToolServerSummary,
152
+ isMCPToolName,
153
+ selectDiscoverableToolNamesByServer,
154
+ summarizeDiscoverableTools,
155
+ } from "./tool-discovery/tool-index";
156
+ import {
157
+ BashTool,
158
+ BUILTIN_TOOLS,
159
+ computeEssentialBuiltinNames,
160
+ createTools,
161
+ type DeferredDiagnosticsEntry,
162
+ discoverStartupLspServers,
163
+ EditTool,
164
+ EvalTool,
165
+ filterInitialToolsForDiscoveryAll,
166
+ GlobTool,
167
+ GrepTool,
168
+ getSearchTools,
169
+ HIDDEN_TOOLS,
170
+ isImageProviderPreference,
171
+ isSearchProviderId,
172
+ isSearchProviderPreference,
173
+ type LspStartupServerInfo,
174
+ loadSshTool,
175
+ ReadTool,
176
+ ResolveTool,
177
+ renderSearchToolBm25Description,
178
+ SearchToolBm25Tool,
179
+ setExcludedSearchProviders,
180
+ setPreferredImageProvider,
181
+ setPreferredSearchProvider,
182
+ type Tool,
183
+ type ToolSession,
184
+ WebSearchTool,
185
+ WriteTool,
186
+ warmupLspServers,
187
+ } from "./tools";
188
+ import { normalizeToolName, normalizeToolNames } from "./tools/builtin-names";
189
+ import { ToolContextStore } from "./tools/context";
190
+ import { getImageGenTools } from "./tools/image-gen";
191
+ import { wrapToolWithMetaNotice } from "./tools/output-meta";
192
+ import { queueResolveHandler } from "./tools/resolve";
193
+ import { ttsTool } from "./tools/tts";
194
+ import { resolveActiveRepoContext } from "./utils/active-repo-context";
195
+ import { EventBus } from "./utils/event-bus";
196
+ import { buildNamedToolChoice } from "./utils/tool-choice";
197
+ import { buildWorkspaceTree, type WorkspaceTree } from "./workspace-tree";
198
+
199
+ type AsyncResultEntry = {
200
+ jobId: string;
201
+ result: string;
202
+ job: AsyncJob | undefined;
203
+ durationMs: number | undefined;
204
+ };
205
+
206
+ type AsyncResultJobDetails = {
207
+ jobId: string;
208
+ type?: "bash" | "task";
209
+ label?: string;
210
+ durationMs?: number;
211
+ };
212
+
213
+ type AsyncResultDetails = {
214
+ jobs: AsyncResultJobDetails[];
215
+ };
216
+
217
+ type McpNotificationEntry = {
218
+ serverName: string;
219
+ uri: string;
220
+ };
221
+
222
+ function buildAsyncResultBatchMessage(entries: AsyncResultEntry[]): CustomMessage<AsyncResultDetails> | null {
223
+ if (entries.length === 0) return null;
224
+ const jobs = entries.map(entry => ({
225
+ jobId: entry.jobId,
226
+ result: entry.result,
227
+ type: entry.job?.type,
228
+ label: entry.job?.label,
229
+ durationMs: entry.durationMs,
230
+ }));
231
+ const details: AsyncResultDetails = {
232
+ jobs: jobs.map(job => ({
233
+ jobId: job.jobId,
234
+ type: job.type,
235
+ label: job.label,
236
+ durationMs: job.durationMs,
237
+ })),
238
+ };
239
+ return {
240
+ role: "custom",
241
+ customType: "async-result",
242
+ content: prompt.render(asyncResultTemplate, {
243
+ multiple: jobs.length > 1,
244
+ jobs,
245
+ }),
246
+ display: true,
247
+ attribution: "agent",
248
+ details,
249
+ timestamp: Date.now(),
250
+ };
251
+ }
252
+
253
+ type LateDiagnosticsDetails = {
254
+ files: Array<{ path: string; summary: string; errored: boolean; messages: string[] }>;
255
+ };
256
+
257
+ function buildLateDiagnosticsBatchMessage(
258
+ entries: DeferredDiagnosticsEntry[],
259
+ ): CustomMessage<LateDiagnosticsDetails> | null {
260
+ if (entries.length === 0) return null;
261
+ const files = entries.map(entry => ({
262
+ path: entry.path,
263
+ summary: entry.summary,
264
+ messages: entry.messages,
265
+ errored: entry.errored,
266
+ }));
267
+ const details: LateDiagnosticsDetails = {
268
+ files: files.map(file => ({
269
+ path: file.path,
270
+ summary: file.summary,
271
+ errored: file.errored,
272
+ messages: file.messages,
273
+ })),
274
+ };
275
+ return {
276
+ role: "custom",
277
+ customType: LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE,
278
+ content: prompt.render(lateDiagnosticTemplate, {
279
+ multiple: files.length > 1,
280
+ files,
281
+ }),
282
+ display: true,
283
+ attribution: "agent",
284
+ details,
285
+ timestamp: Date.now(),
286
+ };
287
+ }
288
+
289
+ function buildMcpNotificationBatchMessage(entries: McpNotificationEntry[]): AgentMessage | null {
290
+ const resources: McpNotificationEntry[] = [];
291
+ const seen = new Set<string>();
292
+ for (const entry of entries) {
293
+ const key = `${entry.serverName}\0${entry.uri}`;
294
+ if (seen.has(key)) continue;
295
+ seen.add(key);
296
+ resources.push(entry);
297
+ }
298
+ if (resources.length === 0) return null;
299
+ const lines = [`[MCP notification] ${resources.length} resource(s) updated:`];
300
+ for (const resource of resources) {
301
+ lines.push(`- server="${resource.serverName}" uri=${resource.uri}`);
302
+ }
303
+ lines.push('Use read(path="mcp://<uri>") to inspect if relevant.');
304
+ return {
305
+ role: "user",
306
+ content: [{ type: "text", text: lines.join("\n") }],
307
+ attribution: "agent",
308
+ timestamp: Date.now(),
309
+ };
310
+ }
311
+
312
+ type DeferredMCPActivation = {
313
+ mcpDiscoveryEnabled: boolean;
314
+ explicitlyRequestedMCPToolNames: string[];
315
+ activateAllMCPTools: boolean;
316
+ };
317
+
318
+ function createPendingMCPTool(name: string): Tool {
319
+ const parsed = parseMCPToolName(name);
320
+ const serverName = parsed?.serverName;
321
+ const mcpToolName = parsed?.toolName ?? name;
322
+ const label = serverName ? `${serverName}/${mcpToolName}` : name;
323
+ const message = serverName
324
+ ? `MCP server "${serverName}" is still connecting; tool "${name}" is not yet available. Retry after the MCP connection completes.`
325
+ : `MCP discovery is still in progress; tool "${name}" is not yet available. Retry after MCP connection completes.`;
326
+ const tool: Tool & { mcpServerName?: string; mcpToolName?: string } = {
327
+ name,
328
+ label,
329
+ description: `Pending MCP tool. ${message}`,
330
+ parameters: {
331
+ type: "object",
332
+ properties: {},
333
+ additionalProperties: true,
334
+ },
335
+ approval: "write",
336
+ intent: "omit",
337
+ mcpServerName: serverName,
338
+ mcpToolName,
339
+ async execute() {
340
+ return {
341
+ content: [{ type: "text", text: message }],
342
+ details: { serverName, mcpToolName, isError: true },
343
+ isError: true,
344
+ };
345
+ },
346
+ };
347
+ return tool;
348
+ }
349
+
350
+ function collectPendingMCPToolNames(
351
+ explicitToolNames: readonly string[] | undefined,
352
+ restoredSelectedToolNames: readonly string[],
353
+ ): string[] {
354
+ const names = new Set<string>();
355
+ for (const name of explicitToolNames ?? []) {
356
+ const normalized = name.toLowerCase();
357
+ if (isMCPToolName(normalized)) names.add(normalized);
358
+ }
359
+ for (const name of restoredSelectedToolNames) {
360
+ const normalized = name.toLowerCase();
361
+ if (isMCPToolName(normalized)) names.add(normalized);
362
+ }
363
+ return [...names];
364
+ }
365
+
366
+ function logMCPLoadErrors(errors: MCPLoadResult["errors"]): void {
367
+ for (const [serverName, error] of errors) {
368
+ logger.error("MCP tool load failed", { path: `mcp:${serverName}`, error });
369
+ }
370
+ }
371
+
372
+ function applyMCPEnvironment(result: { exaApiKeys: string[] }): void {
373
+ if (result.exaApiKeys.length > 0 && !$env.EXA_API_KEY) {
374
+ Bun.env.EXA_API_KEY = result.exaApiKeys[0];
375
+ }
376
+ }
377
+
378
+ // Types
379
+ export interface CreateAgentSessionOptions {
380
+ /** Working directory for project-local discovery. Default: getProjectDir() */
381
+ cwd?: string;
382
+ /** Global config directory. Default: ~/.omp/agent */
383
+ agentDir?: string;
384
+ /** Spawns to allow. Default: "*" */
385
+ spawns?: string;
386
+
387
+ /** Auth storage for credentials. Default: discoverAuthStorage(agentDir) */
388
+ authStorage?: AuthStorage;
389
+ /** Model registry. Default: discoverModels(authStorage, agentDir) */
390
+ modelRegistry?: ModelRegistry;
391
+
392
+ /** Model to use. Default: from settings, else first available */
393
+ model?: Model;
394
+ /** Raw model pattern string (e.g. from --model CLI flag) to resolve after extensions load.
395
+ * Used when model lookup is deferred because extension-provided models aren't registered yet. */
396
+ modelPattern?: string;
397
+ /** Thinking selector. Default: from settings, else unset */
398
+ thinkingLevel?: ConfiguredThinkingLevel;
399
+ /** Models available for cycling (Ctrl+P in interactive mode) */
400
+ scopedModels?: Array<{ model: Model; thinkingLevel?: ThinkingLevel }>;
401
+
402
+ /** Provider-facing system prompt override. Replaces the fully rendered default blocks. */
403
+ systemPrompt?: string | string[] | ((defaultPrompt: string[]) => string | string[]);
404
+ /** Already-loaded custom prompt text rendered through the bundled custom system prompt template. */
405
+ customSystemPrompt?: string;
406
+ /** Already-loaded text appended through the bundled system prompt templates. */
407
+ appendSystemPrompt?: string;
408
+ /**
409
+ * Already-loaded title-generation system prompt override (typically
410
+ * {@link discoverTitleSystemPromptFile} → {@link resolvePromptInput}). When
411
+ * set, every automatic session-title generation path on this session — the
412
+ * first-input title and the replan-driven refresh — uses this prompt
413
+ * instead of the bundled default. Refresh on cwd change via
414
+ * {@link AgentSession.setTitleSystemPrompt}.
415
+ */
416
+ titleSystemPrompt?: string;
417
+ /** Optional provider-facing session identifier for prompt caches and sticky auth selection.
418
+ * Keeps persisted session files isolated while reusing provider-side caches. */
419
+ providerSessionId?: string;
420
+ /** Optional provider-facing prompt cache key, distinct from request lineage. */
421
+ providerPromptCacheKey?: string;
422
+ /** Absolute wall-clock deadline in Unix epoch milliseconds. */
423
+ deadline?: number;
424
+
425
+ /** Custom tools to register (in addition to built-in tools). Accepts both CustomTool and ToolDefinition. */
426
+ customTools?: (CustomTool | ToolDefinition)[];
427
+ /** Inline extensions (merged with discovery). */
428
+ extensions?: ExtensionFactory[];
429
+ /** Additional extension paths to load (merged with discovery). */
430
+ additionalExtensionPaths?: string[];
431
+ /** Disable extension discovery (explicit paths still load). */
432
+ disableExtensionDiscovery?: boolean;
433
+ /**
434
+ * Pre-loaded extensions (skips file discovery and the per-session factory
435
+ * call). Used by the CLI when extensions are loaded early to parse custom
436
+ * flags — the same process owns the returned instances, so reusing them is
437
+ * safe.
438
+ *
439
+ * NEVER pass this across session boundaries (e.g. parent → subagent).
440
+ * `Extension` instances close over a parent-bound `ExtensionAPI` (cwd,
441
+ * eventBus, runtime), and reusing them would route tools/handlers/commands
442
+ * back through the parent. For subagents, forward
443
+ * {@link preloadedExtensionPaths} instead.
444
+ *
445
+ * @internal
446
+ */
447
+ preloadedExtensions?: LoadExtensionsResult;
448
+ /**
449
+ * Pre-discovered extension source paths. When provided, the filesystem-scan
450
+ * inside `discoverExtensionPaths()` is skipped — the session still calls
451
+ * `loadExtensions()` itself so each `Extension` is bound to THIS session's
452
+ * `ExtensionAPI` (cwd, eventBus, runtime).
453
+ *
454
+ * This is the safe pass-through for parent → subagent forwarding.
455
+ */
456
+ preloadedExtensionPaths?: string[];
457
+ /**
458
+ * Pre-discovered custom-tool source paths from `.omp/tools/`, `.claude/tools/`,
459
+ * plugins, etc. When provided, the filesystem-scan inside
460
+ * `discoverCustomToolPaths()` is skipped — subagents inherit the parent's
461
+ * scan result and call `loadCustomTools()` themselves so each session binds
462
+ * tools to its OWN `CustomToolAPI` (cwd, exec, pushPendingAction, UI).
463
+ *
464
+ * Forwarding the loaded `LoadedCustomTool[]` instances directly would reuse
465
+ * the parent's session-bound API and route tool execution back through the
466
+ * parent — wrong for isolated tasks and for pending-action routing.
467
+ */
468
+ preloadedCustomToolPaths?: ToolPathWithSource[];
469
+
470
+ /** Shared event bus for tool/extension communication. Default: creates new bus. */
471
+ eventBus?: EventBus;
472
+
473
+ /** Skills. Default: discovered from multiple locations */
474
+ skills?: Skill[];
475
+ /** Rules. Default: discovered from multiple locations */
476
+ rules?: Rule[];
477
+ /** Context files (AGENTS.md content). Default: discovered walking up from cwd */
478
+ contextFiles?: Array<{ path: string; content: string }>;
479
+ /** Pre-built workspace tree (skips re-scanning; passed by parents to subagents). */
480
+ workspaceTree?: WorkspaceTree;
481
+ /** Prompt templates. Default: discovered from cwd/.omp/prompts/ + agentDir/prompts/ */
482
+ promptTemplates?: PromptTemplate[];
483
+ /** File-based slash commands. Default: discovered from commands/ directories */
484
+ slashCommands?: FileSlashCommand[];
485
+
486
+ /** Enable MCP server discovery from .mcp.json files. Default: true */
487
+ enableMCP?: boolean;
488
+ /** Existing MCP manager to reuse (skips discovery, propagates to toolSession). */
489
+ mcpManager?: MCPManager;
490
+
491
+ /** Enable LSP integration (tool, formatting, diagnostics, warmup). Default: true */
492
+ enableLsp?: boolean;
493
+ /** Skip subprocess-kernel availability checks and prelude warmup */
494
+ skipPythonPreflight?: boolean;
495
+ /** Tool names explicitly requested (enables disabled-by-default tools) */
496
+ toolNames?: string[];
497
+
498
+ /** Output schema for structured completion (subagents) */
499
+ outputSchema?: unknown;
500
+ /** Whether to include the yield tool by default */
501
+ requireYieldTool?: boolean;
502
+ /** Task recursion depth (for subagent sessions). Default: 0 */
503
+ taskDepth?: number;
504
+ /** Parent Hindsight state to alias for subagent memory tools. */
505
+ parentHindsightSessionState?: HindsightSessionState;
506
+ /** Parent Mnemopi state to alias for subagent memory tools. */
507
+ parentMnemopiSessionState?: MnemopiSessionState;
508
+ /** Pre-allocated agent identity for IRC routing. Default: "Main" for top-level, parentTaskPrefix-derived for sub. */
509
+ agentId?: string;
510
+ /** Display name for the agent in IRC. Default: "main" or "sub". */
511
+ agentDisplayName?: string;
512
+ /** Optional shared agent registry for IRC routing. Default: AgentRegistry.global(). */
513
+ agentRegistry?: AgentRegistry;
514
+ /** Parent task ID prefix for nested artifact naming (e.g., "Extensions") */
515
+ parentTaskPrefix?: string;
516
+ /**
517
+ * Registry id of the spawning agent, recorded as this subagent's parent in
518
+ * the agent registry. Distinct from `parentTaskPrefix`, which is this agent's
519
+ * own artifact/output-id prefix (the executor passes the child's own id
520
+ * there, so it must never double as the parent link). Undefined for the
521
+ * top-level "Main" session, which has no parent.
522
+ */
523
+ parentAgentId?: string;
524
+ /** Inherited eval executor session id for subagents sharing parent eval state. */
525
+ parentEvalSessionId?: string;
526
+
527
+ /** Session manager. Default: session stored under the configured agentDir sessions root */
528
+ sessionManager?: SessionManager;
529
+
530
+ /** Override local:// protocol options for subagent local:// sharing. Default: uses the session's own artifacts dir and session ID. */
531
+ localProtocolOptions?: LocalProtocolOptions;
532
+
533
+ /** Settings instance. Default: Settings.init({ cwd, agentDir }) */
534
+ settings?: Settings;
535
+ /**
536
+ * Legacy alias for `settings`. Older Pi extensions pass SettingsManager.create(...)
537
+ * through this field; accept it so their SDK calls keep the configured settings.
538
+ */
539
+ settingsManager?: Settings | Promise<Settings>;
540
+
541
+ /** Whether UI is available (enables interactive tools like ask). Default: false */
542
+ hasUI?: boolean;
543
+
544
+ /**
545
+ * Opt-in OpenTelemetry instrumentation forwarded to the underlying Agent.
546
+ * Passing `{}` enables the loop's GenAI-semantic-convention spans. See
547
+ * {@link AgentTelemetryConfig} for the full surface (hooks, content capture,
548
+ * cost estimator, agent identity).
549
+ *
550
+ * Safe to enable without an OTEL SDK registered in the host: the
551
+ * `@opentelemetry/api` package returns a no-op tracer in that case.
552
+ */
553
+ telemetry?: AgentTelemetryConfig;
554
+
555
+ /**
556
+ * Fired once, when the agent loop hands its first request to the provider
557
+ * transport (i.e. the `streamFn` wrapper is first invoked). Used to measure
558
+ * subagent launch latency — the boundary between "session built" and "model
559
+ * call dispatched". This is the loop's dispatch point, slightly before the
560
+ * actual provider HTTP call (per-request prep, identical across all
561
+ * requests, follows it), which is the right granularity for launch timing.
562
+ */
563
+ onFirstChatDispatch?: () => void;
564
+
565
+ /** Whether to auto-approve all tool calls (--auto-approve CLI flag). Default: false */
566
+ autoApprove?: boolean;
567
+ }
568
+
569
+ /** Result from createAgentSession */
570
+ export interface CreateAgentSessionResult {
571
+ /** The created session */
572
+ session: AgentSession;
573
+ /** Extensions result (loaded extensions + runtime) */
574
+ extensionsResult: LoadExtensionsResult;
575
+ /** Update tool UI context (interactive mode) */
576
+ setToolUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void;
577
+ /** MCP manager for server lifecycle management (undefined if MCP disabled) */
578
+ mcpManager?: MCPManager;
579
+ /** Warning if session was restored with a different model than saved */
580
+ modelFallbackMessage?: string;
581
+ /** LSP servers detected for startup; warmup may continue in the background */
582
+ lspServers?: LspStartupServerInfo[];
583
+ /** Shared event bus for tool/extension communication */
584
+ eventBus: EventBus;
585
+ }
586
+
587
+ export type DialectFormat = "auto" | "native" | Dialect;
588
+
589
+ export function resolveDialect(
590
+ format: DialectFormat,
591
+ model: (Pick<Model, "supportsTools"> & Partial<Pick<Model, "id">>) | undefined,
592
+ ): Dialect | undefined {
593
+ if (format === "native") return undefined;
594
+ if (format === "auto") {
595
+ if (model?.supportsTools !== false) return undefined;
596
+ if (!model.id) return "glm";
597
+ const preferred = preferredDialect(model.id);
598
+ return preferred === FALLBACK_DIALECT ? "glm" : preferred;
599
+ }
600
+ return format;
601
+ }
602
+
603
+ // Re-exports
604
+
605
+ export type { PromptTemplate } from "./config/prompt-templates";
606
+ export { Settings, type SkillsSettings } from "./config/settings";
607
+ export type { CustomCommand, CustomCommandFactory } from "./extensibility/custom-commands/types";
608
+ export type { CustomTool, CustomToolFactory } from "./extensibility/custom-tools/types";
609
+ export type * from "./extensibility/extensions";
610
+ export type { Skill } from "./extensibility/skills";
611
+ export type { FileSlashCommand } from "./extensibility/slash-commands";
612
+ export type { MCPManager, MCPServerConfig, MCPServerConnection, MCPToolsLoadResult } from "./mcp";
613
+ export type { Tool } from "./tools";
614
+ export { buildDirectoryTree, buildWorkspaceTree, type DirectoryTree, type WorkspaceTree } from "./workspace-tree";
615
+
616
+ export {
617
+ // Individual tool classes (for custom usage)
618
+ BashTool,
619
+ // Tool classes and factories
620
+ BUILTIN_TOOLS,
621
+ createTools,
622
+ EditTool,
623
+ EvalTool,
624
+ GlobTool,
625
+ GrepTool,
626
+ HIDDEN_TOOLS,
627
+ loadSshTool,
628
+ ReadTool,
629
+ ResolveTool,
630
+ type ToolSession,
631
+ WebSearchTool,
632
+ WriteTool,
633
+ };
634
+
635
+ // Helper Functions
636
+
637
+ // Discovery Functions
638
+
639
+ /**
640
+ * Create an AuthStorage instance.
641
+ *
642
+ * Default: local SQLite store at `<agentDir>/agent.db`.
643
+ *
644
+ * Broker mode: when `OMP_AUTH_BROKER_URL` is set, credentials are pulled from
645
+ * a remote auth-broker over the wire. Refresh tokens never leave the broker;
646
+ * the client receives access tokens with `refresh = "__remote__"` and calls
647
+ * back into the broker through the {@link AuthStorageOptions.refreshOAuthCredential}
648
+ * override to re-mint access tokens when needed.
649
+ *
650
+ * Delegates to {@link ./session/auth-broker-config} so the TUI and the catalog
651
+ * generator share the same credential-discovery logic.
652
+ */
653
+ export async function discoverAuthStorage(agentDir: string = getAgentDir()): Promise<AuthStorage> {
654
+ return discoverAuthStorageFromConfig(agentDir);
655
+ }
656
+
657
+ /**
658
+ * Discover extensions from cwd.
659
+ */
660
+ export async function discoverExtensions(cwd?: string): Promise<LoadExtensionsResult> {
661
+ const resolvedCwd = cwd ?? getProjectDir();
662
+
663
+ return discoverAndLoadExtensions([], resolvedCwd);
664
+ }
665
+
666
+ /**
667
+ * Path-only counterpart of {@link loadSessionExtensions}: the FS-heavy scan
668
+ * without the per-session module load. Subagents reuse the parent's path list
669
+ * (cached on {@link ToolSession.extensionPaths}) and rebuild Extension
670
+ * instances themselves so each session's `ExtensionAPI` (cwd, eventBus,
671
+ * runtime) is its own.
672
+ */
673
+ export async function discoverSessionExtensionPaths(
674
+ options: Pick<CreateAgentSessionOptions, "disableExtensionDiscovery" | "additionalExtensionPaths">,
675
+ cwd: string,
676
+ settings: Settings,
677
+ ): Promise<string[]> {
678
+ if (options.disableExtensionDiscovery) {
679
+ return options.additionalExtensionPaths ?? [];
680
+ }
681
+ const configuredPaths = [...(options.additionalExtensionPaths ?? []), ...(settings.get("extensions") ?? [])];
682
+ const disabledExtensionIds = settings.get("disabledExtensions") ?? [];
683
+ return discoverExtensionPaths(configuredPaths, cwd, disabledExtensionIds);
684
+ }
685
+
686
+ /**
687
+ * Load the discovered/configured extensions for a session — everything {@link
688
+ * createAgentSession} would load except the inline factory extensions it appends
689
+ * itself. Extracted so the CLI can resolve extension-registered flags (and thus
690
+ * classify `@file` arguments extension-aware) *before* a session — and its
691
+ * terminal breadcrumb — is created, then hand the result back through
692
+ * {@link CreateAgentSessionOptions.preloadedExtensions} so the work is not
693
+ * repeated. Keep this the single source of the discovery branch logic.
694
+ */
695
+ export async function loadSessionExtensions(
696
+ options: Pick<CreateAgentSessionOptions, "disableExtensionDiscovery" | "additionalExtensionPaths">,
697
+ cwd: string,
698
+ settings: Settings,
699
+ eventBus: EventBus,
700
+ ): Promise<LoadExtensionsResult> {
701
+ const paths = await discoverSessionExtensionPaths(options, cwd, settings);
702
+ const result = await logger.time("loadExtensions", loadExtensions, paths, cwd, eventBus);
703
+ for (const { path, error } of result.errors) {
704
+ logger.error("Failed to load extension", { path, error });
705
+ }
706
+ return result;
707
+ }
708
+
709
+ /**
710
+ * Load discovered/configured extensions and register their providers into
711
+ * `modelRegistry`, then discover the dynamic provider catalogs. One-shot CLIs
712
+ * (`omp bench`, dry-balance) build a bare {@link ModelRegistry} that only knows
713
+ * built-in catalog providers; without this, providers contributed by an
714
+ * extension (e.g. a custom OpenAI-compatible provider under
715
+ * `~/.omp/agent/extensions/`) never reach model resolution. Mirrors the
716
+ * session / `omp models` path: drain the queued provider registrations, then
717
+ * `refreshRuntimeProviders` so dynamically-discovered models exist before
718
+ * selectors are resolved.
719
+ */
720
+ export async function loadCliExtensionProviders(
721
+ modelRegistry: ModelRegistry,
722
+ settings: Settings,
723
+ cwd: string,
724
+ options: Pick<CreateAgentSessionOptions, "disableExtensionDiscovery" | "additionalExtensionPaths"> = {},
725
+ ): Promise<void> {
726
+ const eventBus = new EventBus();
727
+ const extensionsResult = await loadSessionExtensions(options, cwd, settings, eventBus);
728
+ const activeSources = extensionsResult.extensions.map(extension => extension.path);
729
+ modelRegistry.syncExtensionSources(activeSources);
730
+ for (const sourceId of new Set(activeSources)) {
731
+ modelRegistry.clearSourceRegistrations(sourceId);
732
+ }
733
+ for (const { name, config, sourceId } of extensionsResult.runtime.pendingProviderRegistrations) {
734
+ modelRegistry.registerProvider(name, config, sourceId);
735
+ }
736
+ extensionsResult.runtime.pendingProviderRegistrations = [];
737
+ await modelRegistry.refreshRuntimeProviders();
738
+ }
739
+
740
+ /**
741
+ * Discover skills from cwd and agentDir.
742
+ */
743
+ export async function discoverSkills(
744
+ cwd?: string,
745
+ _agentDir?: string,
746
+ settings?: SkillsSettings,
747
+ ): Promise<{ skills: Skill[]; warnings: SkillWarning[] }> {
748
+ return await loadSkillsInternal({
749
+ ...settings,
750
+ cwd: cwd ?? getProjectDir(),
751
+ });
752
+ }
753
+
754
+ /**
755
+ * Discover context files (AGENTS.md) walking up from cwd.
756
+ * Returns files sorted by depth (farther from cwd first, so closer files appear last/more prominent).
757
+ */
758
+ export async function discoverContextFiles(
759
+ cwd?: string,
760
+ _agentDir?: string,
761
+ ): Promise<Array<{ path: string; content: string; depth?: number }>> {
762
+ return await loadContextFilesInternal({
763
+ cwd: cwd ?? getProjectDir(),
764
+ });
765
+ }
766
+
767
+ /**
768
+ * Discover prompt templates from cwd and agentDir.
769
+ */
770
+ export async function discoverPromptTemplates(cwd?: string, agentDir?: string): Promise<PromptTemplate[]> {
771
+ return await loadPromptTemplatesInternal({
772
+ cwd: cwd ?? getProjectDir(),
773
+ agentDir: agentDir ?? getAgentDir(),
774
+ });
775
+ }
776
+
777
+ /**
778
+ * Discover file-based slash commands from commands/ directories.
779
+ */
780
+ export async function discoverSlashCommands(cwd?: string): Promise<FileSlashCommand[]> {
781
+ return loadSlashCommandsInternal({ cwd: cwd ?? getProjectDir() });
782
+ }
783
+
784
+ /**
785
+ * Discover custom commands (TypeScript slash commands) from cwd and agentDir.
786
+ */
787
+ export async function discoverCustomTSCommands(cwd?: string, agentDir?: string): Promise<CustomCommandsLoadResult> {
788
+ const resolvedCwd = cwd ?? getProjectDir();
789
+ const resolvedAgentDir = agentDir ?? getAgentDir();
790
+
791
+ return loadCustomCommandsInternal({
792
+ cwd: resolvedCwd,
793
+ agentDir: resolvedAgentDir,
794
+ });
795
+ }
796
+
797
+ /**
798
+ * Discover MCP servers from .mcp.json files.
799
+ * Returns the manager and loaded tools.
800
+ */
801
+ export async function discoverMCPServers(cwd?: string): Promise<MCPToolsLoadResult> {
802
+ const resolvedCwd = cwd ?? getProjectDir();
803
+ return discoverAndLoadMCPTools(resolvedCwd);
804
+ }
805
+
806
+ // API Key Helpers
807
+
808
+ // System Prompt
809
+
810
+ export interface BuildSystemPromptOptions {
811
+ tools?: Tool[];
812
+ skills?: Skill[];
813
+ contextFiles?: Array<{ path: string; content: string }>;
814
+ cwd?: string;
815
+ customPrompt?: string;
816
+ appendPrompt?: string;
817
+ inlineToolDescriptors?: boolean;
818
+ includeWorkspaceTree?: boolean;
819
+ }
820
+
821
+ /**
822
+ * Build the default provider-facing system prompt blocks.
823
+ *
824
+ * The returned `systemPrompt` preserves the stable harness prompt and dynamic project context
825
+ * as separate entries so providers can cache prompt prefixes without concatenating blocks.
826
+ */
827
+ export async function buildSystemPrompt(options: BuildSystemPromptOptions = {}): Promise<BuildSystemPromptResult> {
828
+ const toolMap = options.tools ? new Map(options.tools.map(tool => [tool.name, tool])) : undefined;
829
+ return await buildSystemPromptInternal({
830
+ cwd: options.cwd,
831
+ customPrompt: options.customPrompt,
832
+ skills: options.skills,
833
+ contextFiles: options.contextFiles,
834
+ appendSystemPrompt: options.appendPrompt,
835
+ inlineToolDescriptors: options.inlineToolDescriptors,
836
+ includeWorkspaceTree: options.includeWorkspaceTree,
837
+ toolNames: options.tools?.map(tool => tool.name),
838
+ tools: toolMap ? buildSystemPromptToolMetadata(toolMap) : undefined,
839
+ });
840
+ }
841
+
842
+ // Internal Helpers
843
+
844
+ function createCustomToolContext(ctx: ExtensionContext): CustomToolContext {
845
+ return {
846
+ sessionManager: ctx.sessionManager,
847
+ modelRegistry: ctx.modelRegistry,
848
+ model: ctx.model,
849
+ isIdle: ctx.isIdle,
850
+ hasQueuedMessages: ctx.hasPendingMessages,
851
+ abort: ctx.abort,
852
+ };
853
+ }
854
+
855
+ function isCustomTool(tool: CustomTool | ToolDefinition): tool is CustomTool {
856
+ // To distinguish, we mark converted tools with a hidden symbol property.
857
+ // If the tool doesn't have this marker, it's a CustomTool that needs conversion.
858
+ return !(tool as any).__isToolDefinition;
859
+ }
860
+
861
+ function isLegacyBuiltinToolDefinition(tool: CustomTool | ToolDefinition): boolean {
862
+ return !isCustomTool(tool) && "__ompLegacyBuiltinTool" in tool && tool.__ompLegacyBuiltinTool === true;
863
+ }
864
+
865
+ const TOOL_DEFINITION_MARKER = Symbol("__isToolDefinition");
866
+
867
+ /** Matches the truncation applied to per-server instructions inside `rebuildSystemPrompt`. */
868
+ const MAX_MCP_INSTRUCTIONS_LENGTH = 4000;
869
+
870
+ let sshCleanupRegistered = false;
871
+
872
+ async function cleanupSshResources(): Promise<void> {
873
+ const results = await Promise.allSettled([closeAllConnections(), unmountAll()]);
874
+ for (const result of results) {
875
+ if (result.status === "rejected") {
876
+ logger.warn("SSH cleanup failed", { error: String(result.reason) });
877
+ }
878
+ }
879
+ }
880
+
881
+ function registerSshCleanup(): void {
882
+ if (sshCleanupRegistered) return;
883
+ sshCleanupRegistered = true;
884
+ postmortem.register("ssh-cleanup", cleanupSshResources);
885
+ }
886
+
887
+ let evalCleanupRegistered = false;
888
+
889
+ function registerEvalCleanup(): void {
890
+ if (evalCleanupRegistered) return;
891
+ evalCleanupRegistered = true;
892
+ postmortem.register("python-cleanup", disposeAllKernelSessions);
893
+ postmortem.register("ruby-cleanup", disposeAllRubyKernelSessions);
894
+ postmortem.register("julia-cleanup", disposeAllJuliaKernelSessions);
895
+ }
896
+
897
+ function customToolToDefinition(tool: CustomTool): ToolDefinition {
898
+ const definition: ToolDefinition & { [TOOL_DEFINITION_MARKER]: true } = {
899
+ name: tool.name,
900
+ label: tool.label,
901
+ description: tool.description,
902
+ parameters: tool.parameters,
903
+ hidden: tool.hidden,
904
+ deferrable: tool.deferrable,
905
+ approval: typeof tool.approval === "function" ? tool.approval.bind(tool) : tool.approval,
906
+ mcpServerName: tool.mcpServerName,
907
+ mcpToolName: tool.mcpToolName,
908
+ execute: (toolCallId, params, signal, onUpdate, ctx) =>
909
+ tool.execute(toolCallId, params, onUpdate, createCustomToolContext(ctx), signal),
910
+ onSession: tool.onSession ? (event, ctx) => tool.onSession?.(event, createCustomToolContext(ctx)) : undefined,
911
+ renderCall: tool.renderCall,
912
+ renderResult: tool.renderResult
913
+ ? (result, options, theme): Component => {
914
+ const component = tool.renderResult?.(
915
+ result,
916
+ { expanded: options.expanded, isPartial: options.isPartial, spinnerFrame: options.spinnerFrame },
917
+ theme,
918
+ );
919
+ // Return empty component if undefined to match Component type requirement
920
+ return component ?? ({ render: () => [] } as unknown as Component);
921
+ }
922
+ : undefined,
923
+ [TOOL_DEFINITION_MARKER]: true,
924
+ };
925
+ return definition;
926
+ }
927
+
928
+ function createCustomToolsExtension(tools: CustomTool[]): ExtensionFactory {
929
+ return api => {
930
+ for (const tool of tools) {
931
+ api.registerTool(customToolToDefinition(tool));
932
+ }
933
+
934
+ const runOnSession = async (event: CustomToolSessionEvent, ctx: ExtensionContext) => {
935
+ for (const tool of tools) {
936
+ if (!tool.onSession) continue;
937
+ try {
938
+ await tool.onSession(event, createCustomToolContext(ctx));
939
+ } catch (err) {
940
+ logger.warn("Custom tool onSession error", { tool: tool.name, error: String(err) });
941
+ }
942
+ }
943
+ };
944
+
945
+ api.on("session_start", async (_event, ctx) =>
946
+ runOnSession({ reason: "start", previousSessionFile: undefined }, ctx),
947
+ );
948
+ api.on("session_switch", async (event, ctx) =>
949
+ runOnSession({ reason: "switch", previousSessionFile: event.previousSessionFile }, ctx),
950
+ );
951
+ api.on("session_branch", async (event, ctx) =>
952
+ runOnSession({ reason: "branch", previousSessionFile: event.previousSessionFile }, ctx),
953
+ );
954
+ api.on("session_tree", async (_event, ctx) =>
955
+ runOnSession({ reason: "tree", previousSessionFile: undefined }, ctx),
956
+ );
957
+ api.on("session_shutdown", async (_event, ctx) =>
958
+ runOnSession({ reason: "shutdown", previousSessionFile: undefined }, ctx),
959
+ );
960
+ api.on("auto_compaction_start", async (event, ctx) =>
961
+ runOnSession({ reason: "auto_compaction_start", trigger: event.reason, action: event.action }, ctx),
962
+ );
963
+ api.on("auto_compaction_end", async (event, ctx) =>
964
+ runOnSession(
965
+ {
966
+ reason: "auto_compaction_end",
967
+ action: event.action,
968
+ result: event.result,
969
+ aborted: event.aborted,
970
+ willRetry: event.willRetry,
971
+ errorMessage: event.errorMessage,
972
+ },
973
+ ctx,
974
+ ),
975
+ );
976
+ api.on("auto_retry_start", async (event, ctx) =>
977
+ runOnSession(
978
+ {
979
+ reason: "auto_retry_start",
980
+ attempt: event.attempt,
981
+ maxAttempts: event.maxAttempts,
982
+ delayMs: event.delayMs,
983
+ errorMessage: event.errorMessage,
984
+ errorId: event.errorId,
985
+ },
986
+ ctx,
987
+ ),
988
+ );
989
+ api.on("auto_retry_end", async (event, ctx) =>
990
+ runOnSession(
991
+ {
992
+ reason: "auto_retry_end",
993
+ success: event.success,
994
+ attempt: event.attempt,
995
+ finalError: event.finalError,
996
+ recoveredErrors: event.recoveredErrors,
997
+ },
998
+ ctx,
999
+ ),
1000
+ );
1001
+ api.on("ttsr_triggered", async (event, ctx) =>
1002
+ runOnSession({ reason: "ttsr_triggered", rules: event.rules }, ctx),
1003
+ );
1004
+ api.on("todo_reminder", async (event, ctx) =>
1005
+ runOnSession(
1006
+ {
1007
+ reason: "todo_reminder",
1008
+ todos: event.todos,
1009
+ attempt: event.attempt,
1010
+ maxAttempts: event.maxAttempts,
1011
+ },
1012
+ ctx,
1013
+ ),
1014
+ );
1015
+ };
1016
+ }
1017
+
1018
+ // Factory
1019
+
1020
+ /**
1021
+ * Build LoadedCustomCommand entries for all MCP prompts across connected servers.
1022
+ * These are re-created whenever prompts change (setOnPromptsChanged callback).
1023
+ */
1024
+ function buildMCPPromptCommands(manager: MCPManager): LoadedCustomCommand[] {
1025
+ const commands: LoadedCustomCommand[] = [];
1026
+ for (const serverName of manager.getConnectedServers()) {
1027
+ const prompts = manager.getServerPrompts(serverName);
1028
+ if (!prompts?.length) continue;
1029
+ for (const prompt of prompts) {
1030
+ const commandName = `${serverName}:${prompt.name}`;
1031
+ commands.push({
1032
+ path: `mcp:${commandName}`,
1033
+ resolvedPath: `mcp:${commandName}`,
1034
+ source: "bundled",
1035
+ command: {
1036
+ name: commandName,
1037
+ description: prompt.description ?? `MCP prompt from ${serverName}`,
1038
+ async execute(args: string[]) {
1039
+ const promptArgs: Record<string, string> = {};
1040
+ for (const arg of args) {
1041
+ const eqIdx = arg.indexOf("=");
1042
+ if (eqIdx > 0) {
1043
+ promptArgs[arg.slice(0, eqIdx)] = arg.slice(eqIdx + 1);
1044
+ }
1045
+ }
1046
+ const result = await manager.executePrompt(serverName, prompt.name, promptArgs);
1047
+ if (!result) return "";
1048
+ const parts: string[] = [];
1049
+ for (const msg of result.messages) {
1050
+ const contentItems = Array.isArray(msg.content) ? msg.content : [msg.content];
1051
+ for (const item of contentItems) {
1052
+ if (item.type === "text") {
1053
+ parts.push(item.text);
1054
+ } else if (item.type === "resource") {
1055
+ const resource = item.resource;
1056
+ if (resource.text) parts.push(resource.text);
1057
+ }
1058
+ }
1059
+ }
1060
+ return parts.join("\n\n");
1061
+ },
1062
+ },
1063
+ });
1064
+ }
1065
+ }
1066
+ return commands;
1067
+ }
1068
+ /**
1069
+ * Create an AgentSession with the specified options.
1070
+ *
1071
+ * @example
1072
+ * ```typescript
1073
+ * // Minimal - uses defaults
1074
+ * const { session } = await createAgentSession();
1075
+ *
1076
+ * // With explicit model
1077
+ * import { getModel } from '@oh-my-pi-zen/pi-ai';
1078
+ * const { session } = await createAgentSession({
1079
+ * model: getModel('anthropic', 'claude-opus-4-5'),
1080
+ * thinkingLevel: 'high',
1081
+ * });
1082
+ *
1083
+ * // Continue previous session
1084
+ * const { session, modelFallbackMessage } = await createAgentSession({
1085
+ * continueSession: true,
1086
+ * });
1087
+ *
1088
+ * // Full control
1089
+ * const { session } = await createAgentSession({
1090
+ * model: myModel,
1091
+ * getApiKey: async () => Bun.env.MY_KEY,
1092
+ * systemPrompt: ['You are helpful.'],
1093
+ * tools: codingTools({ cwd: getProjectDir() }),
1094
+ * skills: [],
1095
+ * sessionManager: SessionManager.inMemory(),
1096
+ * });
1097
+ * ```
1098
+ */
1099
+ export async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {
1100
+ const cwd = options.cwd ?? getProjectDir();
1101
+ const agentDir = options.agentDir ?? getAgentDir();
1102
+ const eventBus = options.eventBus ?? new EventBus();
1103
+
1104
+ registerSshCleanup();
1105
+ registerEvalCleanup();
1106
+
1107
+ // Pin authStorage to modelRegistry.authStorage: ModelRegistry.getApiKey() routes refresh
1108
+ // failures through that instance, so any divergent storage handed to the bridge / mcpManager
1109
+ // / session would silently miss credential_disabled events.
1110
+ const modelRegistry =
1111
+ options.modelRegistry ??
1112
+ new ModelRegistry(options.authStorage ?? (await logger.time("discoverModels", discoverAuthStorage, agentDir)));
1113
+ // Track whether we internally created the authStorage so we can close it
1114
+ // if construction fails before the session takes ownership.
1115
+ const ownsAuthStorage = !options.authStorage && !options.modelRegistry;
1116
+ const authStorage = modelRegistry.authStorage;
1117
+ if (options.authStorage && options.authStorage !== authStorage) {
1118
+ throw new Error(
1119
+ "options.authStorage and options.modelRegistry.authStorage must be the same instance when both are provided",
1120
+ );
1121
+ }
1122
+ // Subscribe before any getApiKey() call so startup model probes can't fire a
1123
+ // credential_disabled event past us. An embedder's constructor handler makes the
1124
+ // listener set non-empty from construction, which defeats AuthStorage's no-listener
1125
+ // buffer — so we can't rely on it to catch startup events for the extension runner.
1126
+ const startupCredentialDisabledEvents: CredentialDisabledEvent[] = [];
1127
+ let credentialDisabledTarget: ExtensionRunner | undefined;
1128
+ const unsubscribeCredentialDisabled: (() => void) | undefined = authStorage.onCredentialDisabled(event => {
1129
+ if (credentialDisabledTarget) {
1130
+ // Discard return: any handler error is routed through runner.onError listeners.
1131
+ void credentialDisabledTarget.emitCredentialDisabled(event);
1132
+ } else {
1133
+ startupCredentialDisabledEvents.push(event);
1134
+ }
1135
+ });
1136
+ const settings = await (options.settings ??
1137
+ options.settingsManager ??
1138
+ logger.time("settings", Settings.init, { cwd, agentDir }));
1139
+ logger.time("initializeWithSettings", initializeWithSettings, settings);
1140
+ if (!options.modelRegistry) {
1141
+ modelRegistry.refreshInBackground();
1142
+ }
1143
+ // Kick off workspace tree discovery early. The native workspace scan returns
1144
+ // both the rendered-tree input and the AGENTS.md directory-context index, so
1145
+ // startup does not perform a second recursive filesystem search. Subagents
1146
+ // inherit the parent's resolved values via options.
1147
+ const STARTUP_SCAN_DEADLINE_MS = 5000;
1148
+ const includeWorkspaceTree = settings.get("includeWorkspaceTree") ?? false;
1149
+ const workspaceTreePromise: Promise<WorkspaceTree> = options.workspaceTree
1150
+ ? Promise.resolve(options.workspaceTree)
1151
+ : includeWorkspaceTree
1152
+ ? logger.time("buildWorkspaceTree", () => buildWorkspaceTree(cwd, { timeoutMs: STARTUP_SCAN_DEADLINE_MS }))
1153
+ : Promise.resolve({ rootPath: cwd, rendered: "", truncated: false, totalLines: 0, agentsMdFiles: [] });
1154
+ workspaceTreePromise.catch(() => {});
1155
+
1156
+ // Independent discoveries that depend only on cwd/agentDir — kicked off in parallel and awaited
1157
+ // at their respective consumer sites. Their work can overlap with model resolution, secret loading,
1158
+ // session-context build, tool creation, MCP discovery, and extension discovery.
1159
+ const contextFilesPromise = options.contextFiles
1160
+ ? Promise.resolve(options.contextFiles)
1161
+ : logger.time("discoverContextFiles", discoverContextFiles, cwd, agentDir);
1162
+ contextFilesPromise.catch(() => {});
1163
+ const activeRepoContextPromise = logger.time("resolveActiveRepoContext", async () => {
1164
+ try {
1165
+ return await resolveActiveRepoContext(cwd);
1166
+ } catch (err) {
1167
+ logger.debug("Failed to resolve active repo context", { err: String(err) });
1168
+ return null;
1169
+ }
1170
+ });
1171
+ activeRepoContextPromise.catch(() => {});
1172
+ const watchdogFilesPromise = logger.time("discoverWatchdogFiles", () => discoverWatchdogFiles(cwd, agentDir));
1173
+ watchdogFilesPromise.catch(() => {});
1174
+ const advisorConfigsPromise = logger.time("discoverAdvisorConfigs", () => discoverAdvisorConfigs(cwd, agentDir));
1175
+ advisorConfigsPromise.catch(() => {});
1176
+ const promptTemplatesPromise = options.promptTemplates
1177
+ ? Promise.resolve(options.promptTemplates)
1178
+ : logger.time("discoverPromptTemplates", discoverPromptTemplates, cwd, agentDir);
1179
+ promptTemplatesPromise.catch(() => {});
1180
+ const slashCommandsPromise = options.slashCommands
1181
+ ? Promise.resolve(options.slashCommands)
1182
+ : logger.time("discoverSlashCommands", discoverSlashCommands, cwd);
1183
+ slashCommandsPromise.catch(() => {});
1184
+ const skillsSettings = settings.getGroup("skills");
1185
+ const disabledExtensionIds = settings.get("disabledExtensions") ?? [];
1186
+ const discoveredSkillsPromise =
1187
+ options.skills === undefined
1188
+ ? logger.time("discoverSkills", discoverSkills, cwd, agentDir, {
1189
+ ...skillsSettings,
1190
+ disabledExtensions: disabledExtensionIds,
1191
+ })
1192
+ : undefined;
1193
+ discoveredSkillsPromise?.catch(() => {});
1194
+
1195
+ // Initialize provider preferences from settings
1196
+ const excludedWebSearchProviders = settings.get("providers.webSearchExclude");
1197
+ if (Array.isArray(excludedWebSearchProviders)) {
1198
+ setExcludedSearchProviders(excludedWebSearchProviders.filter(isSearchProviderId));
1199
+ }
1200
+
1201
+ const webSearchProvider = settings.get("providers.webSearch");
1202
+ if (typeof webSearchProvider === "string" && isSearchProviderPreference(webSearchProvider)) {
1203
+ setPreferredSearchProvider(webSearchProvider);
1204
+ }
1205
+
1206
+ const imageProvider = settings.get("providers.image");
1207
+ if (isImageProviderPreference(imageProvider)) {
1208
+ setPreferredImageProvider(imageProvider);
1209
+ }
1210
+
1211
+ const sessionManager =
1212
+ options.sessionManager ??
1213
+ logger.time("sessionManager", () =>
1214
+ SessionManager.create(cwd, SessionManager.getDefaultSessionDir(cwd, agentDir)),
1215
+ );
1216
+ const providerSessionId = options.providerSessionId ?? sessionManager.getSessionId();
1217
+ // Startup model *selection* only needs to know whether auth is configured for
1218
+ // a candidate's provider — never the resolved key bytes. Use the synchronous,
1219
+ // side-effect-free probe (`hasConfiguredAuth`): it refreshes no OAuth tokens,
1220
+ // executes no `!command` keys, and issues no auth-broker requests. Resolving the
1221
+ // real key here (`getApiKey`) blocks resume on those network paths — a slow or
1222
+ // unreachable OAuth/broker endpoint stalls startup for the full ~10s refresh
1223
+ // timeout per candidate (observed as a hang in `restoreSessionModel`). The real
1224
+ // key is resolved lazily per request via ModelRegistry.resolver.
1225
+ const hasModelAuth = (candidate: Model): boolean => modelRegistry.hasConfiguredAuth(candidate);
1226
+
1227
+ // Load and create secret obfuscator early so resumed session state and prompt warnings
1228
+ // reflect actual loaded secrets, not just the setting toggle.
1229
+ let obfuscator: SecretObfuscator | undefined;
1230
+ if (settings.get("secrets.enabled")) {
1231
+ const fileEntries = await logger.time("loadSecrets", loadSecrets, cwd, agentDir);
1232
+ const envEntries = collectEnvSecrets();
1233
+ const allEntries = [...envEntries, ...fileEntries];
1234
+ if (allEntries.length > 0) {
1235
+ obfuscator = new SecretObfuscator(allEntries);
1236
+ }
1237
+ }
1238
+ const secretsEnabled = obfuscator?.hasSecrets() === true;
1239
+
1240
+ // Check if session has existing data to restore
1241
+ const existingSession = logger.time("loadSessionContext", () =>
1242
+ deobfuscateSessionContext(sessionManager.buildSessionContext(), obfuscator),
1243
+ );
1244
+ const existingBranch = logger.time("getSessionBranch", () => sessionManager.getBranch());
1245
+ const hasExistingSession = existingBranch.length > 0;
1246
+ const hasThinkingEntry = existingBranch.some(entry => entry.type === "thinking_level_change");
1247
+ const hasServiceTierEntry = existingBranch.some(entry => entry.type === "service_tier_change");
1248
+
1249
+ const hasExplicitModel = options.model !== undefined || options.modelPattern !== undefined;
1250
+ const modelMatchPreferences = getModelMatchPreferences(settings);
1251
+ const allowedModels = await logger.time("resolveAllowedModels", () =>
1252
+ resolveAllowedModels(modelRegistry, settings, modelMatchPreferences),
1253
+ );
1254
+ let defaultRoleSpec = logger.time("resolveDefaultModelRole", () =>
1255
+ resolveModelRoleValue(settings.getModelRole("default"), allowedModels, {
1256
+ settings,
1257
+ matchPreferences: modelMatchPreferences,
1258
+ }),
1259
+ );
1260
+ let model = options.model;
1261
+ let modelFallbackMessage: string | undefined;
1262
+ // Identify session model strings to restore in fallback order. We do an
1263
+ // initial pass here so model-dependent setup (thinking-level resolution,
1264
+ // host preconnect) can use the restored model; extension-registered
1265
+ // providers aren't visible yet, so we retry the preferred candidates once
1266
+ // extensions register below.
1267
+ const sessionModelStrings =
1268
+ !hasExplicitModel && hasExistingSession
1269
+ ? getRestorableSessionModels(existingSession.models, sessionManager.getLastModelChangeRole())
1270
+ : [];
1271
+ let restoredSessionModelIndex = -1;
1272
+ let restoredSessionThinkingLevel: ConfiguredThinkingLevel | undefined;
1273
+ if (!hasExplicitModel && !model && sessionModelStrings.length > 0) {
1274
+ logger.time("restoreSessionModel", () => {
1275
+ let failedSessionModel: string | undefined;
1276
+ for (let i = 0; i < sessionModelStrings.length; i++) {
1277
+ const sessionModelStr = sessionModelStrings[i];
1278
+ const parsedModel = parseModelString(sessionModelStr, {
1279
+ allowMaxAlias: true,
1280
+ allowAutoAlias: true,
1281
+ isLiteralModelId: (provider, id) => modelRegistry.find(provider, id) !== undefined,
1282
+ });
1283
+ if (!parsedModel) {
1284
+ failedSessionModel ??= sessionModelStr;
1285
+ continue;
1286
+ }
1287
+
1288
+ const restoredModel = modelRegistry.find(parsedModel.provider, parsedModel.id);
1289
+ if (restoredModel && hasModelAuth(restoredModel)) {
1290
+ model = restoredModel;
1291
+ restoredSessionModelIndex = i;
1292
+ restoredSessionThinkingLevel = parsedModel.thinkingLevel;
1293
+ break;
1294
+ }
1295
+ failedSessionModel ??= sessionModelStr;
1296
+ }
1297
+ if (failedSessionModel) {
1298
+ modelFallbackMessage = `Could not restore model ${failedSessionModel}`;
1299
+ }
1300
+ });
1301
+ }
1302
+
1303
+ // If still no model, try settings default.
1304
+ // Skip settings fallback when an explicit model was requested.
1305
+ if (!hasExplicitModel && !model && defaultRoleSpec.model) {
1306
+ const settingsDefaultModel = defaultRoleSpec.model;
1307
+ logger.time("resolveSettingsDefaultModel", () => {
1308
+ // defaultRoleSpec.model already comes from modelRegistry.getAvailable(),
1309
+ // so re-validating auth here just repeats the expensive lookup path.
1310
+ model = settingsDefaultModel;
1311
+ });
1312
+ }
1313
+
1314
+ const taskDepth = options.taskDepth ?? 0;
1315
+
1316
+ // Resolves the session/agent thinking level using the same precedence we
1317
+ // apply at startup: explicit option → persisted session entry → restored
1318
+ // model selector suffix → default role's explicit selector → selected
1319
+ // model's defaultLevel → global settings default. Run again after extension
1320
+ // role reclaim so the final model's own defaults aren't masked by an earlier
1321
+ // fallback model's.
1322
+ const pickInitialThinkingLevel = (selectedModel: Model | undefined): ConfiguredThinkingLevel | undefined => {
1323
+ let level = options.thinkingLevel;
1324
+ if (level === undefined && hasExistingSession && hasThinkingEntry) {
1325
+ level =
1326
+ parseConfiguredThinkingLevel(existingSession.configuredThinkingLevel) ??
1327
+ parseThinkingLevel(existingSession.thinkingLevel);
1328
+ }
1329
+ if (level === undefined && !hasThinkingEntry && restoredSessionThinkingLevel !== undefined) {
1330
+ level = restoredSessionThinkingLevel;
1331
+ }
1332
+ if (level === undefined && !hasExplicitModel && !hasThinkingEntry && defaultRoleSpec.explicitThinkingLevel) {
1333
+ level = defaultRoleSpec.thinkingLevel;
1334
+ }
1335
+ if (level === undefined && selectedModel?.thinking?.defaultLevel !== undefined) {
1336
+ level = selectedModel.thinking.defaultLevel;
1337
+ }
1338
+ if (level === undefined) {
1339
+ level = parseConfiguredThinkingLevel(settings.get("defaultThinkingLevel"));
1340
+ }
1341
+ return level;
1342
+ };
1343
+ let thinkingLevel = pickInitialThinkingLevel(model);
1344
+ let autoThinking = thinkingLevel === AUTO_THINKING;
1345
+ // Concrete level the agent/session start with. With `auto` this is the
1346
+ // provisional level shown until the first per-turn classification resolves;
1347
+ // `auto` itself stays a session-only concept handled by AgentSession.
1348
+ let effectiveThinkingLevel: ThinkingLevel | undefined = concreteThinkingLevel(thinkingLevel);
1349
+ if (model) {
1350
+ const resolvedModel = model;
1351
+ effectiveThinkingLevel = logger.time("resolveThinkingLevelForModel", () =>
1352
+ autoThinking
1353
+ ? resolveProvisionalAutoLevel(resolvedModel)
1354
+ : resolveThinkingLevelForModel(resolvedModel, effectiveThinkingLevel),
1355
+ );
1356
+ // Fire-and-forget TLS+H2 handshake to the model's host so it overlaps
1357
+ // with the rest of session setup (extension/skill load, tool registry,
1358
+ // system prompt build). Without this, the first `fetch(...)` pays the
1359
+ // full handshake serially — 100–300 ms transcontinental for
1360
+ // api.anthropic.com from a residential IP. Every mode benefits
1361
+ // (interactive, print, rpc, acp).
1362
+ preconnectModelHost(model.baseUrl);
1363
+ }
1364
+
1365
+ let skills: Skill[];
1366
+ let skillWarnings: SkillWarning[];
1367
+ if (options.skills !== undefined) {
1368
+ skills = options.skills;
1369
+ skillWarnings = [];
1370
+ } else {
1371
+ const discovered = await (discoveredSkillsPromise ?? Promise.resolve({ skills: [], warnings: [] }));
1372
+ skills = discovered.skills;
1373
+ skillWarnings = discovered.warnings;
1374
+ }
1375
+
1376
+ // Discover rules and bucket them in one pass to avoid repeated scans over large rule sets.
1377
+ const { ttsrManager, rulebookRules, alwaysApplyRules, allRules } = await logger.time(
1378
+ "discoverTtsrRules",
1379
+ async () => {
1380
+ const { TtsrManager } = await import("./export/ttsr");
1381
+ const ttsrSettings = settings.getGroup("ttsr");
1382
+ const ttsrManager = new TtsrManager(ttsrSettings);
1383
+ const rulesResult =
1384
+ options.rules !== undefined
1385
+ ? { items: options.rules, warnings: undefined }
1386
+ : await loadCapability<Rule>(ruleCapability.id, { cwd });
1387
+ const { rulebookRules, alwaysApplyRules } = bucketRules(rulesResult.items, ttsrManager, {
1388
+ builtinRules: ttsrSettings.builtinRules,
1389
+ disabledRules: ttsrSettings.disabledRules,
1390
+ });
1391
+ if (existingSession.injectedTtsrRules.length > 0) {
1392
+ ttsrManager.restoreInjected(existingSession.injectedTtsrRules);
1393
+ }
1394
+ return { ttsrManager, rulebookRules, alwaysApplyRules, allRules: rulesResult.items };
1395
+ },
1396
+ );
1397
+
1398
+ // Resolve contextFiles up-front (it's needed before tool creation). The
1399
+ // workspace tree scan is slow on large repos and we MUST NOT block startup on
1400
+ // it. On timeout we forward `undefined` to ToolSession; buildSystemPromptInternal
1401
+ // will re-race the same promise through its own withDeadline path. Background
1402
+ // work continues so caches still warm.
1403
+ const raceWithDeadline = async <T>(name: string, work: Promise<T>): Promise<T | undefined> => {
1404
+ let timedOut = false;
1405
+ const result = await Promise.race([
1406
+ work,
1407
+ Bun.sleep(STARTUP_SCAN_DEADLINE_MS).then(() => {
1408
+ timedOut = true;
1409
+ return undefined;
1410
+ }),
1411
+ ]);
1412
+ if (timedOut) {
1413
+ logger.warn("Startup scan exceeded deadline; deferring to system prompt fallback", {
1414
+ name,
1415
+ timeoutMs: STARTUP_SCAN_DEADLINE_MS,
1416
+ cwd,
1417
+ });
1418
+ }
1419
+ return result;
1420
+ };
1421
+ const [contextFiles, resolvedWorkspaceTree, watchdogFiles, activeRepoContext, discoveredAdvisors] =
1422
+ await Promise.all([
1423
+ contextFilesPromise,
1424
+ raceWithDeadline("buildWorkspaceTree", workspaceTreePromise),
1425
+ watchdogFilesPromise,
1426
+ activeRepoContextPromise,
1427
+ advisorConfigsPromise,
1428
+ ]);
1429
+
1430
+ let agent: Agent;
1431
+ let session!: AgentSession;
1432
+ let hasSession = false;
1433
+ let hasRegistered = false;
1434
+ const enableLsp = options.enableLsp ?? true;
1435
+ const asyncMaxJobs = Math.min(100, Math.max(1, settings.get("async.maxJobs") ?? 100));
1436
+ const ASYNC_INLINE_RESULT_MAX_CHARS = 12_000;
1437
+ const ASYNC_PREVIEW_MAX_CHARS = 4_000;
1438
+ const formatAsyncResultForFollowUp = async (result: string): Promise<string> => {
1439
+ if (result.length <= ASYNC_INLINE_RESULT_MAX_CHARS) {
1440
+ return result;
1441
+ }
1442
+
1443
+ const preview = `${result.slice(0, ASYNC_PREVIEW_MAX_CHARS)}\n\n[Output truncated. Showing first ${ASYNC_PREVIEW_MAX_CHARS.toLocaleString()} characters.]`;
1444
+ try {
1445
+ const { path: artifactPath, id: artifactId } = await sessionManager.allocateArtifactPath("async");
1446
+ if (artifactPath && artifactId) {
1447
+ await Bun.write(artifactPath, result);
1448
+ return `${preview}\nFull output: artifact://${artifactId}`;
1449
+ }
1450
+ } catch (error) {
1451
+ logger.warn("Failed to persist async follow-up artifact", {
1452
+ error: error instanceof Error ? error.message : String(error),
1453
+ });
1454
+ }
1455
+
1456
+ return preview;
1457
+ };
1458
+ // Only the first top-level session in a process owns an AsyncJobManager.
1459
+ // Subagents inherit the parent's manager via `AsyncJobManager.instance()`
1460
+ // (set below), and any additional top-level session spun up in-process
1461
+ // (e.g. the agent-creation architect in `agent-dashboard.ts`) must share
1462
+ // the live singleton — otherwise its dispose path would clobber the
1463
+ // owning session's manager and break the `task`/`bash` async paths
1464
+ // (issue #1923). The `instance()` guard means later sessions also skip
1465
+ // constructing an orphaned manager that nothing would ever route to.
1466
+ const asyncJobManager =
1467
+ !options.parentTaskPrefix && !AsyncJobManager.instance()
1468
+ ? new AsyncJobManager({
1469
+ maxRunningJobs: asyncMaxJobs,
1470
+ onJobComplete: async (jobId, result, job) => {
1471
+ if (!session || asyncJobManager!.isDeliverySuppressed(jobId)) return;
1472
+ const formattedResult = await formatAsyncResultForFollowUp(result);
1473
+ if (asyncJobManager!.isDeliverySuppressed(jobId)) return;
1474
+
1475
+ const durationMs = job ? Math.max(0, Date.now() - job.startTime) : undefined;
1476
+ session.yieldQueue.enqueue<AsyncResultEntry>("async-result", {
1477
+ jobId,
1478
+ result: formattedResult,
1479
+ job,
1480
+ durationMs,
1481
+ });
1482
+ },
1483
+ })
1484
+ : undefined;
1485
+
1486
+ const scopedAsyncJobManager = asyncJobManager ?? (options.parentTaskPrefix ? AsyncJobManager.instance() : undefined);
1487
+
1488
+ const agentRegistry = options.agentRegistry ?? AgentRegistry.global();
1489
+ const resolvedAgentId = options.agentId ?? options.parentTaskPrefix ?? MAIN_AGENT_ID;
1490
+ const resolvedAgentDisplayName =
1491
+ options.agentDisplayName ?? ((options.taskDepth ?? 0) > 0 || options.parentTaskPrefix ? "sub" : "main");
1492
+ const agentKind = (options.taskDepth ?? 0) > 0 || options.parentTaskPrefix ? ("sub" as const) : ("main" as const);
1493
+ /**
1494
+ * Forget the agent ref on teardown — unless the agent is being parked (or is
1495
+ * already parked). Parking disposes the session but keeps the ref addressable
1496
+ * (history://, revive); only process teardown / explicit kill unregisters.
1497
+ */
1498
+ const unregisterUnlessParked = (): void => {
1499
+ if (agentRegistry.get(resolvedAgentId)?.status === "parked") return;
1500
+ if (AgentLifecycleManager.global().isParking(resolvedAgentId)) return;
1501
+ agentRegistry.unregister(resolvedAgentId);
1502
+ };
1503
+ const evalKernelOwnerId = `agent-session:${Snowflake.next()}`;
1504
+
1505
+ try {
1506
+ const getActiveModelString = (): string | undefined => {
1507
+ const activeModel = agent?.state.model;
1508
+ if (activeModel) return formatModelString(activeModel);
1509
+ if (model) return formatModelString(model);
1510
+ return undefined;
1511
+ };
1512
+ // Per-path mutation counter shared across edit/write tools. Late-diagnostics
1513
+ // entries capture it at fetch time and are dropped at injection if a newer
1514
+ // mutation (any tool) bumped it in the meantime.
1515
+ const fileMutationVersions = new Map<string, number>();
1516
+ const toolSession: ToolSession = {
1517
+ get cwd() {
1518
+ return sessionManager.getCwd();
1519
+ },
1520
+ hasUI: options.hasUI ?? false,
1521
+ enableLsp,
1522
+ get hasEditTool() {
1523
+ const requestedToolNames = options.toolNames ? normalizeToolNames(options.toolNames) : undefined;
1524
+ return !requestedToolNames || requestedToolNames.includes("edit");
1525
+ },
1526
+ skipPythonPreflight: options.skipPythonPreflight,
1527
+ contextFiles,
1528
+ workspaceTree: resolvedWorkspaceTree,
1529
+ skills,
1530
+ rules: allRules,
1531
+ eventBus,
1532
+ outputSchema: options.outputSchema,
1533
+ requireYieldTool: options.requireYieldTool,
1534
+ taskDepth: options.taskDepth ?? 0,
1535
+ getSessionFile: () => sessionManager.getSessionFile() ?? null,
1536
+ getEvalKernelOwnerId: () => evalKernelOwnerId,
1537
+ getEvalSessionId: () =>
1538
+ session?.getEvalSessionId() ?? options.parentEvalSessionId ?? defaultEvalSessionId(toolSession),
1539
+ assertEvalExecutionAllowed: () => session?.assertEvalExecutionAllowed(),
1540
+ trackEvalExecution: (execution, abortController) =>
1541
+ session ? session.trackEvalExecution(execution, abortController) : execution,
1542
+ getSessionId: () => sessionManager.getSessionId?.() ?? null,
1543
+ getHindsightSessionState: () => session?.getHindsightSessionState(),
1544
+ getMnemopiSessionState: () => session?.getMnemopiSessionState(),
1545
+ getAgentId: () => resolvedAgentId,
1546
+ getToolByName: name => session?.getToolByName(name),
1547
+ agentRegistry,
1548
+ getSessionSpawns: () => options.spawns ?? "*",
1549
+ getModelString: () => (hasExplicitModel && model ? formatModelString(model) : undefined),
1550
+ getActiveModelString,
1551
+ getActiveModel: () => agent?.state.model ?? model,
1552
+ getServiceTierByFamily: () => session?.serviceTierByFamily,
1553
+ getImageAttachments: () => session?.getImageAttachments() ?? [],
1554
+ getPlanModeState: () => session?.getPlanModeState(),
1555
+ getPlanReferencePath: () => session?.getPlanReferencePath() ?? "local://PLAN.md",
1556
+ getGoalModeState: () => session?.getGoalModeState(),
1557
+ getGoalRuntime: () => session?.goalRuntime,
1558
+ getUsageStatistics: () => sessionManager.getUsageStatistics(),
1559
+ getTurnBudget: () => sessionManager.getTurnBudget(),
1560
+ recordEvalSubagentUsage: output => sessionManager.recordEvalSubagentOutput(output),
1561
+ getClientBridge: () => session?.clientBridge,
1562
+ queueDeferredDiagnostics: entry => session?.yieldQueue.enqueue(LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE, entry),
1563
+ bumpFileMutationVersion: path => {
1564
+ const next = (fileMutationVersions.get(path) ?? 0) + 1;
1565
+ fileMutationVersions.set(path, next);
1566
+ return next;
1567
+ },
1568
+ getFileMutationVersion: path => fileMutationVersions.get(path) ?? 0,
1569
+ getTodoPhases: () => session.getTodoPhases(),
1570
+ setTodoPhases: phases => session.setTodoPhases(phases),
1571
+ isMCPDiscoveryEnabled: () => session.isMCPDiscoveryEnabled(),
1572
+ getSelectedMCPToolNames: () => session.getSelectedMCPToolNames(),
1573
+ activateDiscoveredMCPTools: toolNames => session.activateDiscoveredMCPTools(toolNames),
1574
+ // Generic tool discovery (unified — covers built-in + MCP + extension)
1575
+ isToolDiscoveryEnabled: () => session.isToolDiscoveryEnabled(),
1576
+ getDiscoverableTools: filter => session.getDiscoverableTools(filter),
1577
+ getDiscoverableToolSearchIndex: () => session.getDiscoverableToolSearchIndex(),
1578
+ getSelectedDiscoveredToolNames: () => session.getSelectedDiscoveredToolNames(),
1579
+ activateDiscoveredTools: toolNames => session.activateDiscoveredTools(toolNames),
1580
+ getCheckpointState: () => session.getCheckpointState(),
1581
+ setCheckpointState: state => session.setCheckpointState(state ?? undefined),
1582
+ getLastCompletedRewind: () => session.getLastCompletedRewind(),
1583
+ getToolChoiceQueue: () => session.toolChoiceQueue,
1584
+ buildToolChoice: name => {
1585
+ const m = session.model;
1586
+ return m ? buildNamedToolChoice(name, m) : undefined;
1587
+ },
1588
+ steer: msg =>
1589
+ session.agent.steer({
1590
+ role: "custom",
1591
+ customType: msg.customType,
1592
+ content: msg.content,
1593
+ display: false,
1594
+ details: msg.details,
1595
+ attribution: "agent",
1596
+ timestamp: Date.now(),
1597
+ }),
1598
+ peekQueueInvoker: () => session.peekQueueInvoker(),
1599
+ peekPendingInvoker: () => session.peekPendingInvoker(),
1600
+ clearPendingInvokers: () => session.clearPendingInvokers(),
1601
+ peekStandingResolveHandler: () => session.peekStandingResolveHandler(),
1602
+ setStandingResolveHandler: handler => session.setStandingResolveHandler(handler),
1603
+ allocateOutputArtifact: async toolType => {
1604
+ try {
1605
+ return await sessionManager.allocateArtifactPath(toolType);
1606
+ } catch {
1607
+ return {};
1608
+ }
1609
+ },
1610
+ getArtifactManager: () => sessionManager.getArtifactManager(),
1611
+ settings,
1612
+ authStorage,
1613
+ modelRegistry,
1614
+ getTelemetry: () => agent?.telemetry,
1615
+ // Subagents inherit the singleton (the parent's manager) so their bash/task
1616
+ // completions still flow into the spawning conversation's yieldQueue.
1617
+ // Secondary in-process top-level sessions (no parentTaskPrefix, no
1618
+ // constructed manager because the singleton was already installed) leave
1619
+ // this undefined so tools and session job snapshots refuse async work
1620
+ // instead of silently routing into the owning session (issue #1923).
1621
+ asyncJobManager: scopedAsyncJobManager,
1622
+ };
1623
+
1624
+ // Wire process-wide internal URL singletons owned by their real classes.
1625
+ // Top-level sessions install the active snapshots; subagents inherit them.
1626
+ // Artifact and agent-output URLs resolve via `AgentRegistry.global()` —
1627
+ // the protocol handlers walk each ref's `sessionManager.getArtifactsDir()`,
1628
+ // which collapses to the parent's dir for subagents (they adopt the
1629
+ // parent's ArtifactManager) so one lookup hits everything.
1630
+ const getArtifactsDir = () => sessionManager.getArtifactsDir();
1631
+ if (!options.parentTaskPrefix) {
1632
+ setActiveSkills(skills);
1633
+ // Include TTSR rules so `rule://<name>` can resolve them too. They are
1634
+ // registered with the manager and bucketed out before rulebook/always,
1635
+ // so without this a TTSR-only rule (e.g. a triggered builtin) is not
1636
+ // addressable and `rule://` reports "Available: none".
1637
+ setActiveRules([...rulebookRules, ...alwaysApplyRules, ...ttsrManager.getRules()]);
1638
+ if (asyncJobManager) AsyncJobManager.setInstance(asyncJobManager);
1639
+ }
1640
+ const localProtocolOptions = options.localProtocolOptions ?? {
1641
+ getArtifactsDir,
1642
+ getSessionId: () => sessionManager.getSessionId?.() ?? null,
1643
+ };
1644
+ if (options.localProtocolOptions) {
1645
+ LocalProtocolHandler.setOverride(options.localProtocolOptions);
1646
+ }
1647
+ toolSession.getArtifactsDir = getArtifactsDir;
1648
+ toolSession.localProtocolOptions = localProtocolOptions;
1649
+ toolSession.agentOutputManager = new AgentOutputManager(
1650
+ getArtifactsDir,
1651
+ options.parentTaskPrefix ? { parentPrefix: options.parentTaskPrefix } : undefined,
1652
+ );
1653
+
1654
+ // Create built-in tools (already wrapped with meta notice formatting)
1655
+ const builtinTools = await logger.time("createAllTools", createTools, toolSession, options.toolNames);
1656
+
1657
+ // Discover MCP tools from .mcp.json files
1658
+ let mcpManager: MCPManager | undefined = options.mcpManager;
1659
+ toolSession.mcpManager = mcpManager;
1660
+ const enableMCP = options.enableMCP ?? true;
1661
+ const deferMCPDiscoveryForUI = enableMCP && !mcpManager && options.hasUI === true;
1662
+ const customTools: CustomTool[] = [];
1663
+ let startDeferredMCPDiscovery:
1664
+ | ((liveSession: AgentSession, activation: DeferredMCPActivation) => void)
1665
+ | undefined;
1666
+ const startupQuiet = settings.get("startup.quiet");
1667
+ const onMCPStatus = (event: McpConnectionStatusEvent) => {
1668
+ if (!options.hasUI || startupQuiet) return;
1669
+ if (event.type === "connecting" && event.serverNames.length === 0) return;
1670
+ eventBus.emit(MCP_CONNECTION_STATUS_EVENT_CHANNEL, event);
1671
+ };
1672
+ const mcpDiscoverOptions = {
1673
+ onStatus: onMCPStatus,
1674
+ enableProjectConfig: settings.get("mcp.enableProjectConfig") ?? true,
1675
+ // Always filter Exa - we have native integration
1676
+ filterExa: true,
1677
+ // Filter browser MCP servers when builtin browser tool is active
1678
+ filterBrowser: settings.get("browser.enabled") ?? false,
1679
+ };
1680
+ if (enableMCP && !mcpManager) {
1681
+ if (deferMCPDiscoveryForUI) {
1682
+ const cacheStorage = settings.getStorage();
1683
+ mcpManager = new MCPManager(cwd, cacheStorage ? new MCPToolCache(cacheStorage) : null);
1684
+ mcpManager.setAuthStorage(authStorage);
1685
+ toolSession.mcpManager = mcpManager;
1686
+
1687
+ if (settings.get("mcp.notifications")) {
1688
+ mcpManager.setNotificationsEnabled(true);
1689
+ }
1690
+
1691
+ const deferredMCPManager = mcpManager;
1692
+ startDeferredMCPDiscovery = (liveSession, activation) => {
1693
+ void (async () => {
1694
+ try {
1695
+ const mcpResult = await logger.time("discoverAndLoadMCPTools", () =>
1696
+ deferredMCPManager.discoverAndConnect(mcpDiscoverOptions),
1697
+ );
1698
+ // The session can be torn down while servers are still connecting.
1699
+ // Don't resurrect tools on a disposed session, and don't leak the
1700
+ // transports/subprocesses the connect just spawned.
1701
+ if (liveSession.isDisposed) {
1702
+ await deferredMCPManager.disconnectAll();
1703
+ return;
1704
+ }
1705
+ applyMCPEnvironment(mcpResult);
1706
+ logMCPLoadErrors(mcpResult.errors);
1707
+ // `tools.discoveryMode: "auto"` was resolved against a registry that
1708
+ // held only built-ins plus persisted placeholder names. Recompute with
1709
+ // the real MCP tool count: a large toolset must flip discovery on
1710
+ // BEFORE the refresh, or activateAll would dump every MCP tool into
1711
+ // the active set with no search_tool_bm25 registered.
1712
+ let discoveryEnabled = activation.mcpDiscoveryEnabled;
1713
+ let activateAll = activation.activateAllMCPTools;
1714
+ if (!discoveryEnabled) {
1715
+ const nonMCPToolNames = [...toolRegistry.keys()].filter(name => !isMCPToolName(name));
1716
+ const projectedMode = resolveEffectiveToolDiscoveryMode(
1717
+ settings,
1718
+ countToolsForAutoDiscovery([...nonMCPToolNames, ...mcpResult.tools.map(tool => tool.name)]),
1719
+ );
1720
+ if (projectedMode !== "off") {
1721
+ effectiveDiscoveryMode = projectedMode;
1722
+ mcpDiscoveryEnabled = true;
1723
+ discoveryEnabled = true;
1724
+ activateAll = false;
1725
+ liveSession.enableMCPDiscovery();
1726
+ if (!toolRegistry.has("search_tool_bm25")) {
1727
+ const searchTool: Tool = new SearchToolBm25Tool(toolSession);
1728
+ toolRegistry.set(
1729
+ searchTool.name,
1730
+ new ExtensionToolWrapper(wrapToolWithMetaNotice(searchTool), extensionRunner) as Tool,
1731
+ );
1732
+ }
1733
+ await liveSession.setActiveToolsByName([
1734
+ ...liveSession.getActiveToolNames(),
1735
+ "search_tool_bm25",
1736
+ ]);
1737
+ }
1738
+ }
1739
+ await liveSession.refreshMCPTools(mcpResult.tools, { activateAll });
1740
+ if (activation.explicitlyRequestedMCPToolNames.length > 0) {
1741
+ if (discoveryEnabled && !activation.mcpDiscoveryEnabled) {
1742
+ // Discovery flipped on mid-flight: route the explicit request
1743
+ // through discovery-aware activation so selection persists.
1744
+ await liveSession.activateDiscoveredMCPTools(activation.explicitlyRequestedMCPToolNames);
1745
+ } else if (!discoveryEnabled) {
1746
+ await liveSession.setActiveToolsByName([
1747
+ ...liveSession.getActiveToolNames(),
1748
+ ...activation.explicitlyRequestedMCPToolNames,
1749
+ ]);
1750
+ }
1751
+ }
1752
+ } catch (error) {
1753
+ logger.error("MCP tool load failed", {
1754
+ path: ".mcp.json",
1755
+ error: error instanceof Error ? error.message : String(error),
1756
+ });
1757
+ }
1758
+ })();
1759
+ };
1760
+ } else {
1761
+ const mcpResult = await logger.time("discoverAndLoadMCPTools", discoverAndLoadMCPTools, cwd, {
1762
+ ...mcpDiscoverOptions,
1763
+ cacheStorage: settings.getStorage(),
1764
+ authStorage,
1765
+ });
1766
+ mcpManager = mcpResult.manager;
1767
+ toolSession.mcpManager = mcpManager;
1768
+
1769
+ if (settings.get("mcp.notifications")) {
1770
+ mcpManager.setNotificationsEnabled(true);
1771
+ }
1772
+ applyMCPEnvironment(mcpResult);
1773
+
1774
+ // Log MCP errors
1775
+ for (const { path, error } of mcpResult.errors) {
1776
+ logger.error("MCP tool load failed", { path, error });
1777
+ }
1778
+
1779
+ if (mcpResult.tools.length > 0) {
1780
+ // MCP tools are LoadedCustomTool, extract the tool property
1781
+ customTools.push(...mcpResult.tools.map(loaded => loaded.tool));
1782
+ }
1783
+ }
1784
+ }
1785
+ // Only top-level sessions own the global MCPManager. Subagents already
1786
+ // receive the parent's manager via `options.mcpManager`, and reassigning
1787
+ // the singleton to the same value is a no-op — keep the gate explicit
1788
+ // to mirror the AsyncJobManager ownership rule.
1789
+ if (mcpManager && !options.parentTaskPrefix) MCPManager.setInstance(mcpManager);
1790
+
1791
+ // Add image tools when the active model or configured image providers can generate images.
1792
+ const imageGenTools = await logger.time("getImageGenTools", () => getImageGenTools(modelRegistry, model));
1793
+ if (imageGenTools.length > 0) {
1794
+ customTools.push(...(imageGenTools as unknown as CustomTool[]));
1795
+ }
1796
+
1797
+ if (settings.get("speechgen.enabled")) {
1798
+ customTools.push(ttsTool as unknown as CustomTool);
1799
+ }
1800
+
1801
+ // Add web search tools
1802
+ if (options.toolNames?.includes("web_search")) {
1803
+ customTools.push(...getSearchTools());
1804
+ }
1805
+
1806
+ // Discover custom tools from `.omp/tools/`, `.claude/tools/`, plugins, etc.
1807
+ // Subagents reuse the parent's scan via `preloadedCustomToolPaths` to skip
1808
+ // the FS walk, but ALWAYS re-call `loadCustomTools` here so factories bind
1809
+ // to THIS session's `CustomToolAPI` (cwd, exec, pushPendingAction, UI).
1810
+ // Forwarding the parent's `LoadedCustomTool[]` directly would route tool
1811
+ // execution back through the parent — wrong for isolated tasks and for
1812
+ // pending-action queueing.
1813
+ const builtInToolNames = builtinTools.map(t => t.name);
1814
+ const customToolPaths: ToolPathWithSource[] =
1815
+ options.preloadedCustomToolPaths ??
1816
+ (await logger.time("discoverCustomToolPaths", () => discoverCustomToolPaths([], cwd)));
1817
+ const customToolsLoadResult = await logger.time("loadCustomTools", () =>
1818
+ loadCustomTools(customToolPaths, cwd, builtInToolNames, action => queueResolveHandler(toolSession, action)),
1819
+ );
1820
+ for (const { path, error } of customToolsLoadResult.errors) {
1821
+ logger.error("Custom tool load failed", { path, error });
1822
+ }
1823
+ if (customToolsLoadResult.tools.length > 0) {
1824
+ customTools.push(...customToolsLoadResult.tools.map(loaded => loaded.tool));
1825
+ }
1826
+ // Forward the path list (NOT the loaded tools) to subagents so they
1827
+ // re-bind under their own `CustomToolAPI` while skipping the FS scan.
1828
+ toolSession.customToolPaths = customToolPaths;
1829
+
1830
+ const inlineExtensions: ExtensionFactory[] = options.extensions ? [...options.extensions] : [];
1831
+ inlineExtensions.push((await import("./autoresearch")).createAutoresearchExtension);
1832
+ if (customTools.length > 0) {
1833
+ inlineExtensions.push(createCustomToolsExtension(customTools));
1834
+ }
1835
+
1836
+ // Load extensions. Three paths:
1837
+ // 1. `preloadedExtensions` (CLI): caller already loaded — reuse the
1838
+ // Extension instances. Shallow-clone `extensions` so the inline
1839
+ // push below cannot mutate the caller's array. `runtime` is shared
1840
+ // so flag values set pre-creation flow into the live session.
1841
+ // 2. `preloadedExtensionPaths` (subagent): caller resolved paths;
1842
+ // skip the FS scan but always re-call `loadExtensions` here so
1843
+ // each `Extension` binds to THIS session's `ExtensionAPI`
1844
+ // (cwd, eventBus, runtime).
1845
+ // 3. No preload: run the full session discovery.
1846
+ // `disableExtensionDiscovery` is honored implicitly: a caller that set
1847
+ // the flag and pre-resolved the result already reflects that choice.
1848
+ let extensionPaths: string[];
1849
+ let extensionsResult: LoadExtensionsResult;
1850
+ if (options.preloadedExtensions) {
1851
+ extensionsResult = {
1852
+ ...options.preloadedExtensions,
1853
+ extensions: [...options.preloadedExtensions.extensions],
1854
+ };
1855
+ // Capture paths for downstream forwarding; filter inline-factory
1856
+ // entries (`<inline-N>`) — those are per-session, not source paths.
1857
+ extensionPaths = extensionsResult.extensions
1858
+ .map(ext => ext.resolvedPath)
1859
+ .filter(p => !p.startsWith("<inline"));
1860
+ } else if (options.preloadedExtensionPaths) {
1861
+ extensionPaths = options.preloadedExtensionPaths;
1862
+ extensionsResult = await logger.time("loadExtensions", loadExtensions, extensionPaths, cwd, eventBus);
1863
+ for (const { path, error } of extensionsResult.errors) {
1864
+ logger.error("Failed to load extension", { path, error });
1865
+ }
1866
+ } else {
1867
+ extensionPaths = await logger.time("discoverSessionExtensionPaths", () =>
1868
+ discoverSessionExtensionPaths(options, cwd, settings),
1869
+ );
1870
+ extensionsResult = await logger.time("loadExtensions", loadExtensions, extensionPaths, cwd, eventBus);
1871
+ for (const { path, error } of extensionsResult.errors) {
1872
+ logger.error("Failed to load extension", { path, error });
1873
+ }
1874
+ }
1875
+ // Forward the source-path list (NOT the loaded instances) so subagents
1876
+ // rebuild their own session-scoped extensions.
1877
+ toolSession.extensionPaths = extensionPaths;
1878
+
1879
+ // Load inline extensions from factories
1880
+ if (inlineExtensions.length > 0) {
1881
+ for (let i = 0; i < inlineExtensions.length; i++) {
1882
+ const factory = inlineExtensions[i];
1883
+ const loaded = await loadExtensionFromFactory(
1884
+ factory,
1885
+ cwd,
1886
+ eventBus,
1887
+ extensionsResult.runtime,
1888
+ `<inline-${i}>`,
1889
+ );
1890
+ extensionsResult.extensions.push(loaded);
1891
+ }
1892
+ }
1893
+
1894
+ // Process provider registrations queued during extension loading.
1895
+ // This must happen before the runner is created so that models registered by
1896
+ // extensions are available for model selection on session resume / fallback.
1897
+ const activeExtensionSources = extensionsResult.extensions.map(extension => extension.path);
1898
+ modelRegistry.syncExtensionSources(activeExtensionSources);
1899
+ for (const sourceId of new Set(activeExtensionSources)) {
1900
+ modelRegistry.clearSourceRegistrations(sourceId);
1901
+ }
1902
+ if (extensionsResult.runtime.pendingProviderRegistrations.length > 0) {
1903
+ for (const { name, config, sourceId } of extensionsResult.runtime.pendingProviderRegistrations) {
1904
+ modelRegistry.registerProvider(name, config, sourceId);
1905
+ }
1906
+ extensionsResult.runtime.pendingProviderRegistrations = [];
1907
+ }
1908
+ // Hydrate cached runtime (extension) provider catalogs before model
1909
+ // resolution. Dynamic-only providers have no synchronous registration side
1910
+ // effect, so a cold --model/provider resume must see the same fresh SQLite
1911
+ // cache that `omp models find` uses before the online refresh continues in
1912
+ // the background.
1913
+ await modelRegistry.refreshRuntimeProviders("offline");
1914
+ // Continue runtime discovery in the background (cache-aware) so startup is
1915
+ // only blocked on local cache reads, not provider network fetches.
1916
+ void modelRegistry.refreshRuntimeProviders().catch(error => {
1917
+ logger.warn("runtime provider discovery failed", {
1918
+ error: error instanceof Error ? error.message : String(error),
1919
+ });
1920
+ });
1921
+
1922
+ // Retry session-model candidates now that extension providers are
1923
+ // registered. The initial restore runs before extensions load, so a role
1924
+ // model supplied by an extension would have either fallen back to the
1925
+ // saved default (`restoredSessionModelIndex > 0`) or failed entirely
1926
+ // (`restoredSessionModelIndex === -1`, with the settings default or
1927
+ // downstream fallback filling `model`). Reclaim it here so resume
1928
+ // honors the last active role in either case.
1929
+ const sessionRetryLimit = restoredSessionModelIndex >= 0 ? restoredSessionModelIndex : sessionModelStrings.length;
1930
+ if (!hasExplicitModel && sessionRetryLimit > 0) {
1931
+ for (let i = 0; i < sessionRetryLimit; i++) {
1932
+ const sessionModelStr = sessionModelStrings[i];
1933
+ const parsedModel = parseModelString(sessionModelStr, {
1934
+ allowMaxAlias: true,
1935
+ allowAutoAlias: true,
1936
+ isLiteralModelId: (provider, id) => modelRegistry.find(provider, id) !== undefined,
1937
+ });
1938
+ if (!parsedModel) continue;
1939
+ const restoredModel = modelRegistry.find(parsedModel.provider, parsedModel.id);
1940
+ if (restoredModel && hasModelAuth(restoredModel)) {
1941
+ model = restoredModel;
1942
+ modelFallbackMessage = undefined;
1943
+ restoredSessionModelIndex = i;
1944
+ restoredSessionThinkingLevel = parsedModel.thinkingLevel;
1945
+ // Recompute thinking-level from scratch against the reclaimed
1946
+ // model: any value derived from the earlier fallback model's
1947
+ // `thinking.defaultLevel` must not become sticky.
1948
+ thinkingLevel = pickInitialThinkingLevel(restoredModel);
1949
+ autoThinking = thinkingLevel === AUTO_THINKING;
1950
+ effectiveThinkingLevel = concreteThinkingLevel(thinkingLevel);
1951
+ effectiveThinkingLevel = logger.time("resolveThinkingLevelForModel", () =>
1952
+ autoThinking
1953
+ ? resolveProvisionalAutoLevel(restoredModel)
1954
+ : resolveThinkingLevelForModel(restoredModel, effectiveThinkingLevel),
1955
+ );
1956
+ preconnectModelHost(restoredModel.baseUrl);
1957
+ break;
1958
+ }
1959
+ }
1960
+ }
1961
+ // Resolve deferred --model pattern now that extension models are registered.
1962
+ if (!model && options.modelPattern) {
1963
+ const availableModels = modelRegistry.getAll();
1964
+ const matchPreferences = getModelMatchPreferences(settings);
1965
+ const { model: resolved } = parseModelPattern(options.modelPattern, availableModels, matchPreferences);
1966
+ if (resolved) {
1967
+ model = resolved;
1968
+ modelFallbackMessage = undefined;
1969
+ } else {
1970
+ modelFallbackMessage = `Model "${options.modelPattern}" not found`;
1971
+ }
1972
+ }
1973
+
1974
+ // Fall back to first available model with a valid API key, honoring the
1975
+ // path-scoped `enabledModels` allow-list when configured. Skip when the
1976
+ // user explicitly requested a model via --model that wasn't found.
1977
+ if (!model && !options.modelPattern) {
1978
+ // Re-resolve the allowed set: extension factories above may have
1979
+ // registered providers/models that weren't visible at startup.
1980
+ const fallbackCandidates = await resolveAllowedModels(modelRegistry, settings, modelMatchPreferences);
1981
+
1982
+ // Retry the default-role lookup against the post-extension allowed
1983
+ // set. Extension factories register providers AFTER the early
1984
+ // `defaultRoleSpec` resolution, so a role pointing at an extension
1985
+ // model (e.g. an openai-compat plugin's `posthog/claude-opus-4-8`)
1986
+ // returned `undefined` there. Without this retry the next step's
1987
+ // `pickDefaultAvailableModel` happily replaces the user's configured
1988
+ // default with a bundled provider's default whenever a stray
1989
+ // `OPENAI_API_KEY`/`ANTHROPIC_API_KEY` is in the environment.
1990
+ // (issue #3569)
1991
+ if (!hasExplicitModel && !defaultRoleSpec.model) {
1992
+ const reResolvedRoleSpec = resolveModelRoleValue(settings.getModelRole("default"), fallbackCandidates, {
1993
+ settings,
1994
+ matchPreferences: modelMatchPreferences,
1995
+ });
1996
+ if (reResolvedRoleSpec.model) {
1997
+ defaultRoleSpec = reResolvedRoleSpec;
1998
+ const resolvedDefaultModel = reResolvedRoleSpec.model;
1999
+ model = resolvedDefaultModel;
2000
+ modelFallbackMessage = undefined;
2001
+ // Recompute the thinking level against the now-real model.
2002
+ // `pickInitialThinkingLevel` closes over `defaultRoleSpec`,
2003
+ // so the role's explicit selector (e.g. `:max`) now applies.
2004
+ thinkingLevel = pickInitialThinkingLevel(resolvedDefaultModel);
2005
+ autoThinking = thinkingLevel === AUTO_THINKING;
2006
+ effectiveThinkingLevel = concreteThinkingLevel(thinkingLevel);
2007
+ effectiveThinkingLevel = logger.time("resolveThinkingLevelForModel", () =>
2008
+ autoThinking
2009
+ ? resolveProvisionalAutoLevel(resolvedDefaultModel)
2010
+ : resolveThinkingLevelForModel(resolvedDefaultModel, effectiveThinkingLevel),
2011
+ );
2012
+ preconnectModelHost(resolvedDefaultModel.baseUrl);
2013
+ }
2014
+ }
2015
+
2016
+ if (!model) {
2017
+ const defaultModel = pickDefaultAvailableModel(fallbackCandidates.filter(hasModelAuth));
2018
+ if (defaultModel) {
2019
+ model = defaultModel;
2020
+ }
2021
+ }
2022
+ if (model) {
2023
+ if (modelFallbackMessage) {
2024
+ modelFallbackMessage += `. Using ${model.provider}/${model.id}`;
2025
+ }
2026
+ } else {
2027
+ const patterns = settings.get("enabledModels");
2028
+ modelFallbackMessage =
2029
+ patterns && patterns.length > 0
2030
+ ? `No model available matching enabledModels (${patterns.join(", ")}) with usable credentials. Configure auth for an allowed provider or adjust enabledModels.`
2031
+ : "No models available. Use /login or set an API key environment variable. Then use /model to select a model.";
2032
+ }
2033
+ }
2034
+
2035
+ // Discover custom commands (TypeScript slash commands)
2036
+ const customCommandsResult: CustomCommandsLoadResult = options.disableExtensionDiscovery
2037
+ ? { commands: [], errors: [] }
2038
+ : await logger.time("discoverCustomCommands", loadCustomCommandsInternal, { cwd, agentDir });
2039
+ if (!options.disableExtensionDiscovery) {
2040
+ for (const { path, error } of customCommandsResult.errors) {
2041
+ logger.error("Failed to load custom command", { path, error });
2042
+ }
2043
+ }
2044
+
2045
+ // The runner is created unconditionally — even with zero extensions loaded — because the
2046
+ // `ExtensionToolWrapper` installed below is the only place the per-tool approval gate runs.
2047
+ // A conditional runner means the approval system silently disappears for users with no
2048
+ // extensions, contradicting non-yolo `tools.approvalMode` settings without feedback.
2049
+ // (The builtin autoresearch extension is unconditionally loaded above, so this scenario
2050
+ // is unreachable; unconditional runner construction keeps that invariant explicit and
2051
+ // prevents future optional extensions from silently re-opening the hole.)
2052
+ const extensionRunner: ExtensionRunner = new ExtensionRunner(
2053
+ extensionsResult.extensions,
2054
+ extensionsResult.runtime,
2055
+ cwd,
2056
+ sessionManager,
2057
+ modelRegistry,
2058
+ () => (hasSession ? createSessionMemoryRuntimeContext(session, agentDir, cwd) : undefined),
2059
+ settings,
2060
+ );
2061
+
2062
+ credentialDisabledTarget = extensionRunner;
2063
+ for (const event of startupCredentialDisabledEvents.splice(0)) {
2064
+ // Discard return: any handler error is routed through runner.onError listeners.
2065
+ void extensionRunner.emitCredentialDisabled(event);
2066
+ }
2067
+
2068
+ const getSessionContext = () => ({
2069
+ sessionManager,
2070
+ modelRegistry,
2071
+ model: agent.state.model,
2072
+ isIdle: () => !session.isStreaming,
2073
+ hasQueuedMessages: () => session.queuedMessageCount > 0,
2074
+ abort: () => {
2075
+ session.abort({ reason: USER_INTERRUPT_LABEL });
2076
+ },
2077
+ settings,
2078
+ autoApprove: options.autoApprove ?? false,
2079
+ });
2080
+ const toolContextStore = new ToolContextStore(getSessionContext);
2081
+
2082
+ const registeredTools = extensionRunner.getAllRegisteredTools();
2083
+ const sdkCustomTools = options.customTools?.filter(tool => !isLegacyBuiltinToolDefinition(tool)) ?? [];
2084
+ const allCustomTools = [
2085
+ ...registeredTools,
2086
+ ...sdkCustomTools.map(tool => {
2087
+ const definition = isCustomTool(tool) ? customToolToDefinition(tool) : tool;
2088
+ return { definition, extensionPath: "<sdk>" };
2089
+ }),
2090
+ ];
2091
+ // `wrapToolWithMetaNotice` runs the centralized large-output → artifact spill.
2092
+ // Built-in tools get it in `createTools`; extension, SDK-custom, image-gen,
2093
+ // TTS, and startup (non-deferred) MCP tools all funnel through here, so apply
2094
+ // it once at this adapter boundary (idempotent — a no-op if already wrapped).
2095
+ const wrappedExtensionTools: Tool[] = wrapRegisteredTools(allCustomTools, extensionRunner).map(
2096
+ wrapToolWithMetaNotice,
2097
+ );
2098
+
2099
+ // All built-in tools are active (conditional tools like git/ask return null from factory if disabled)
2100
+ const builtInRegistryToolNames = new Set<string>();
2101
+ const toolRegistry = new Map<string, Tool>();
2102
+ for (const tool of builtinTools) {
2103
+ toolRegistry.set(tool.name, tool);
2104
+ builtInRegistryToolNames.add(tool.name);
2105
+ }
2106
+ if (!toolRegistry.has("goal") && settings.get("goal.enabled")) {
2107
+ const goalTool = await logger.time("createTools:goal:session", HIDDEN_TOOLS.goal, toolSession);
2108
+ if (goalTool) {
2109
+ toolRegistry.set(goalTool.name, wrapToolWithMetaNotice(goalTool));
2110
+ builtInRegistryToolNames.add(goalTool.name);
2111
+ }
2112
+ }
2113
+ for (const tool of wrappedExtensionTools) {
2114
+ toolRegistry.set(tool.name, tool);
2115
+ builtInRegistryToolNames.delete(tool.name);
2116
+ }
2117
+ if (deferMCPDiscoveryForUI && mcpManager) {
2118
+ for (const name of collectPendingMCPToolNames(options.toolNames, existingSession.selectedMCPToolNames)) {
2119
+ if (!toolRegistry.has(name)) {
2120
+ toolRegistry.set(name, createPendingMCPTool(name));
2121
+ }
2122
+ }
2123
+ }
2124
+
2125
+ // Wrap every tool with `ExtensionToolWrapper` so the per-tool approval gate runs on every
2126
+ // call site, regardless of whether any user extensions are loaded. See the runner-construction
2127
+ // comment above for the safety invariant this enforces.
2128
+ for (const tool of toolRegistry.values()) {
2129
+ toolRegistry.set(tool.name, new ExtensionToolWrapper(tool, extensionRunner));
2130
+ }
2131
+ if (model?.provider === "cursor") {
2132
+ toolRegistry.delete("edit");
2133
+ builtInRegistryToolNames.delete("edit");
2134
+ }
2135
+
2136
+ // `resolve` is hidden but must stay in the registry whenever any code path can invoke it:
2137
+ // either a deferrable tool stages a preview action, or plan mode installs a standing handler
2138
+ // that consumes `resolve { action: "apply" }` to submit the plan for approval (issue #1428).
2139
+ // Dropping it on read-only sessions (e.g. plan-mode toolset `read`, `search`, `find`,
2140
+ // `web_search`) leaves plan mode unable to exit through the intended path.
2141
+ const hasDeferrableTools = Array.from(toolRegistry.values()).some(tool => tool.deferrable === true);
2142
+ const planModeAvailable = settings.get("plan.enabled");
2143
+ const needsResolveTool = hasDeferrableTools || planModeAvailable;
2144
+ if (!needsResolveTool) {
2145
+ toolRegistry.delete("resolve");
2146
+ builtInRegistryToolNames.delete("resolve");
2147
+ } else if (!toolRegistry.has("resolve")) {
2148
+ const resolveTool = await logger.time("createTools:resolve:session", HIDDEN_TOOLS.resolve, toolSession);
2149
+ if (resolveTool) {
2150
+ toolRegistry.set(resolveTool.name, wrapToolWithMetaNotice(resolveTool));
2151
+ builtInRegistryToolNames.add(resolveTool.name);
2152
+ }
2153
+ }
2154
+
2155
+ // `let`: the deferred MCP discovery closure upgrades these when the real
2156
+ // MCP tool count pushes `auto` past its threshold; `rebuildSystemPrompt`
2157
+ // below reads the live bindings.
2158
+ let effectiveDiscoveryMode = resolveEffectiveToolDiscoveryMode(
2159
+ settings,
2160
+ countToolsForAutoDiscovery(toolRegistry.keys()),
2161
+ );
2162
+ if (effectiveDiscoveryMode !== "off" && !toolRegistry.has("search_tool_bm25")) {
2163
+ const searchTool: Tool = new SearchToolBm25Tool(toolSession);
2164
+ toolRegistry.set(
2165
+ searchTool.name,
2166
+ new ExtensionToolWrapper(wrapToolWithMetaNotice(searchTool), extensionRunner) as Tool,
2167
+ );
2168
+ builtInRegistryToolNames.add(searchTool.name);
2169
+ }
2170
+ let mcpDiscoveryEnabled = effectiveDiscoveryMode !== "off"; // back-compat: true when any discovery active
2171
+
2172
+ const reloadSshTool = async (): Promise<AgentTool | null> => {
2173
+ if (!requestedToolNameSet.has("ssh")) return null;
2174
+ const sshTool = (await loadSshTool({
2175
+ ...toolSession,
2176
+ cwd: sessionManager.getCwd(),
2177
+ })) as unknown as AgentTool | null;
2178
+ if (!sshTool) return null;
2179
+ const wrapped = wrapToolWithMetaNotice(sshTool);
2180
+ return new ExtensionToolWrapper(wrapped, extensionRunner) as AgentTool;
2181
+ };
2182
+
2183
+ let cursorEventEmitter: ((event: AgentEvent) => void) | undefined;
2184
+ const cursorExecHandlers = new CursorExecHandlers({
2185
+ cwd,
2186
+ tools: toolRegistry,
2187
+ getToolContext: () => toolContextStore.getContext(),
2188
+ emitEvent: event => cursorEventEmitter?.(event),
2189
+ });
2190
+
2191
+ // Resolve the inline-descriptors setting against the session-start model.
2192
+ // `auto` enforces the per-model policy (inline for Gemini, off otherwise);
2193
+ // like the rest of the prune machinery this is fixed for the session, so a
2194
+ // mid-session model switch keeps the start-time decision.
2195
+ const inlineToolDescriptors = shouldInlineToolDescriptors(settings.get("inlineToolDescriptors"), model?.id);
2196
+ const eagerTasks = settings.get("task.eager") !== "default";
2197
+ const eagerTasksAlways = settings.get("task.eager") === "always";
2198
+ const intentField = $flag("PI_INTENT_TRACING", settings.get("tools.intentTracing")) ? INTENT_FIELD : undefined;
2199
+ const includeWorkspaceTree = settings.get("includeWorkspaceTree") ?? false;
2200
+ const rebuildSystemPrompt = async (
2201
+ toolNames: string[],
2202
+ tools: Map<string, AgentTool>,
2203
+ ): Promise<BuildSystemPromptResult> => {
2204
+ toolContextStore.setToolNames(toolNames);
2205
+ const discoverableMCPTools: DiscoverableTool[] = mcpDiscoveryEnabled
2206
+ ? filterBySource(collectDiscoverableTools(tools.values()), "mcp")
2207
+ : [];
2208
+ const activeToolNames = new Set(toolNames);
2209
+ const discoverableBuiltinTools: DiscoverableTool[] =
2210
+ effectiveDiscoveryMode === "all"
2211
+ ? collectDiscoverableTools(
2212
+ Array.from(tools.values()).filter(
2213
+ tool => tool.loadMode === "discoverable" && !activeToolNames.has(tool.name),
2214
+ ),
2215
+ { source: "builtin" },
2216
+ )
2217
+ : [];
2218
+ const discoverableToolsForDesc: DiscoverableTool[] = [...discoverableBuiltinTools, ...discoverableMCPTools];
2219
+ const discoverableToolSummary = summarizeDiscoverableTools(discoverableToolsForDesc);
2220
+ const hasDiscoverableTools =
2221
+ mcpDiscoveryEnabled && toolNames.includes("search_tool_bm25") && discoverableToolsForDesc.length > 0;
2222
+ const promptTools = buildSystemPromptToolMetadata(tools, {
2223
+ search_tool_bm25: { description: renderSearchToolBm25Description(discoverableToolsForDesc) },
2224
+ });
2225
+ const memoryBackend = await resolveMemoryBackend(settings);
2226
+ const memoryInstructions = await memoryBackend.buildDeveloperInstructions(agentDir, settings, session);
2227
+
2228
+ // Build combined append prompt: memory instructions + auto-learn guidance
2229
+ // + MCP server instructions. For UI sessions MCP discovery is deferred, so
2230
+ // `getServerInstructions()` is empty until the background connect completes;
2231
+ // the rebuild that `refreshMCPTools` triggers post-discovery then picks up
2232
+ // the now-connected servers' instructions, so they join the prompt for the
2233
+ // rest of the session.
2234
+ const serverInstructions = mcpManager?.getServerInstructions();
2235
+ // Drive guidance off the auto-learn BUILTINS that createTools actually built
2236
+ // (provenance, not just an active name): `builtInToolNames` excludes a
2237
+ // custom/extension tool that merely shares the name, and reflects the
2238
+ // session-start build — so a subagent that filtered them out, a mid-session
2239
+ // enable that never built them, or a same-named custom tool while auto-learn
2240
+ // is off all get no guidance.
2241
+ const autoLearnInstructions = buildAutoLearnInstructions({
2242
+ manageSkill: builtInToolNames.includes("manage_skill"),
2243
+ learn: builtInToolNames.includes("learn"),
2244
+ });
2245
+ const appendParts: string[] = [];
2246
+ if (memoryInstructions) appendParts.push(memoryInstructions);
2247
+ if (autoLearnInstructions) appendParts.push(autoLearnInstructions);
2248
+ let appendPrompt: string | undefined = appendParts.length > 0 ? appendParts.join("\n\n") : undefined;
2249
+ if (serverInstructions && serverInstructions.size > 0) {
2250
+ const parts: string[] = [];
2251
+ if (appendPrompt) parts.push(appendPrompt);
2252
+ parts.push(
2253
+ "## MCP Server Instructions\n\nThe following instructions are provided by connected MCP servers. They are server-controlled and may not be verified.",
2254
+ );
2255
+ for (const [srvName, srvInstructions] of serverInstructions) {
2256
+ const truncated =
2257
+ srvInstructions.length > MAX_MCP_INSTRUCTIONS_LENGTH
2258
+ ? `${srvInstructions.slice(0, MAX_MCP_INSTRUCTIONS_LENGTH)}\n[truncated]`
2259
+ : srvInstructions;
2260
+ parts.push(`### ${srvName}\n${truncated}`);
2261
+ }
2262
+ appendPrompt = parts.join("\n\n");
2263
+ }
2264
+ // Owned/in-band tool dialects (non-native) require the catalog as `# Tool:`
2265
+ // sections; native tool calling lets the compact name list suffice.
2266
+ const nativeTools = resolveDialect(settings.get("tools.format"), agent?.state.model ?? model) === undefined;
2267
+ if (options.appendSystemPrompt) {
2268
+ appendPrompt = appendPrompt
2269
+ ? `${appendPrompt}\n\n${options.appendSystemPrompt}`
2270
+ : options.appendSystemPrompt;
2271
+ }
2272
+ const defaultPrompt = await buildSystemPromptInternal({
2273
+ cwd,
2274
+ resolvedCustomPrompt: options.customSystemPrompt,
2275
+ skills,
2276
+ contextFiles,
2277
+ tools: promptTools,
2278
+ toolNames,
2279
+ rules: rulebookRules,
2280
+ alwaysApplyRules,
2281
+ resolvedAppendSystemPrompt: appendPrompt,
2282
+ skillsSettings: settings.getGroup("skills"),
2283
+ inlineToolDescriptors,
2284
+ nativeTools,
2285
+ intentField,
2286
+ mcpDiscoveryMode: hasDiscoverableTools,
2287
+ mcpDiscoveryServerSummaries: discoverableToolSummary.servers.map(formatDiscoverableToolServerSummary),
2288
+ eagerTasks,
2289
+ eagerTasksAlways,
2290
+ taskBatch: settings.get("task.batch"),
2291
+ secretsEnabled,
2292
+ workspaceTree: workspaceTreePromise,
2293
+ includeWorkspaceTree,
2294
+ memoryRootEnabled: memoryBackend.id === "local",
2295
+ model: settings.get("includeModelInPrompt") ? getActiveModelString() : undefined,
2296
+ personality: agentKind === "sub" ? "none" : settings.get("personality"),
2297
+ renderMermaid: settings.get("tui.renderMermaid"),
2298
+ activeRepoContext,
2299
+ });
2300
+
2301
+ if (options.systemPrompt === undefined) {
2302
+ return defaultPrompt;
2303
+ }
2304
+ const customPrompt =
2305
+ typeof options.systemPrompt === "function"
2306
+ ? options.systemPrompt(defaultPrompt.systemPrompt)
2307
+ : options.systemPrompt;
2308
+ return {
2309
+ systemPrompt: typeof customPrompt === "string" ? [customPrompt] : customPrompt,
2310
+ };
2311
+ };
2312
+
2313
+ const toolNamesFromRegistry = Array.from(toolRegistry.keys());
2314
+ const explicitlyRequestedToolNames = options.toolNames ? normalizeToolNames(options.toolNames) : undefined;
2315
+ // When `requireYieldTool` is set, the subagent's prompts and idle-reminders demand a
2316
+ // `yield` call to terminate. The tool registry already includes `yield` (see
2317
+ // `createTools`), but an explicit `toolNames` list would otherwise drop it from the
2318
+ // active set — leaving the model unable to satisfy the contract. Mirror the same
2319
+ // invariant `parseAgentFields` enforces on frontmatter `tools`.
2320
+ if (
2321
+ options.requireYieldTool === true &&
2322
+ explicitlyRequestedToolNames &&
2323
+ !explicitlyRequestedToolNames.includes("yield")
2324
+ ) {
2325
+ explicitlyRequestedToolNames.push("yield");
2326
+ }
2327
+ // Auto-learn builtins are force-included into the registry by `createTools`
2328
+ // for enabled top-level sessions (tools/index.ts), but — like `yield` above —
2329
+ // an explicit `toolNames` list would otherwise drop them from the ACTIVE set,
2330
+ // leaving the nudge/guidance pointing at tools the model cannot call. Activate
2331
+ // exactly the builtins createTools built (`builtInToolNames` — provenance, so a
2332
+ // same-named custom/extension tool is never force-activated when auto-learn is
2333
+ // off) to keep guidance, controller, and the active set consistent.
2334
+ if (explicitlyRequestedToolNames) {
2335
+ for (const name of ["manage_skill", "learn"]) {
2336
+ if (builtInToolNames.includes(name) && !explicitlyRequestedToolNames.includes(name)) {
2337
+ explicitlyRequestedToolNames.push(name);
2338
+ }
2339
+ }
2340
+ }
2341
+ const requestedToolNames = explicitlyRequestedToolNames ?? toolNamesFromRegistry;
2342
+ const normalizedRequested = requestedToolNames.filter(name => toolRegistry.has(name));
2343
+ const requestedToolNameSet = new Set(normalizedRequested);
2344
+ // Effective discovery mode is resolved after the full registry exists so auto mode can count MCP/extension tools.
2345
+ const defaultInactiveToolNames = new Set(
2346
+ registeredTools.filter(tool => tool.definition.defaultInactive).map(tool => tool.definition.name),
2347
+ );
2348
+ const requestedActiveToolNames = normalizedRequested.filter(name => name !== "goal");
2349
+ const initialRequestedActiveToolNames = options.toolNames
2350
+ ? requestedActiveToolNames
2351
+ : requestedActiveToolNames.filter(name => !defaultInactiveToolNames.has(name));
2352
+ const explicitlyRequestedMCPToolNames = options.toolNames
2353
+ ? requestedActiveToolNames.filter(name => name.startsWith("mcp__"))
2354
+ : [];
2355
+ const discoveryDefaultServers = new Set(
2356
+ (settings.get("mcp.discoveryDefaultServers") ?? []).map(serverName => serverName.trim()).filter(Boolean),
2357
+ );
2358
+ const discoveryDefaultServerToolNames = mcpDiscoveryEnabled
2359
+ ? selectDiscoverableToolNamesByServer(
2360
+ filterBySource(collectDiscoverableTools(toolRegistry.values()), "mcp"),
2361
+ discoveryDefaultServers,
2362
+ )
2363
+ : [];
2364
+ const normalizeRenamedBuiltinToolName = normalizeToolName;
2365
+ let initialSelectedMCPToolNames: string[] = [];
2366
+ let defaultSelectedMCPToolNames: string[] = [];
2367
+ let initialToolNames = [...initialRequestedActiveToolNames];
2368
+ if (mcpDiscoveryEnabled) {
2369
+ const restoredSelectedMCPToolNames = existingSession.selectedMCPToolNames
2370
+ .map(normalizeRenamedBuiltinToolName)
2371
+ .filter(name => toolRegistry.has(name));
2372
+ defaultSelectedMCPToolNames = [
2373
+ ...new Set([...discoveryDefaultServerToolNames, ...explicitlyRequestedMCPToolNames]),
2374
+ ];
2375
+ initialSelectedMCPToolNames = existingSession.hasPersistedMCPToolSelection
2376
+ ? restoredSelectedMCPToolNames
2377
+ : [...new Set([...restoredSelectedMCPToolNames, ...defaultSelectedMCPToolNames])];
2378
+ initialToolNames = [
2379
+ ...new Set([
2380
+ ...initialRequestedActiveToolNames.filter(name => !name.startsWith("mcp__")),
2381
+ ...initialSelectedMCPToolNames,
2382
+ ]),
2383
+ ];
2384
+ }
2385
+
2386
+ // Custom tools and extension-registered tools are always included regardless of toolNames filter
2387
+ const alwaysInclude: string[] = [
2388
+ ...sdkCustomTools.map(t => (isCustomTool(t) ? t.name : t.name)),
2389
+ ...registeredTools.filter(t => !t.definition.defaultInactive).map(t => t.definition.name),
2390
+ ];
2391
+ for (const name of alwaysInclude) {
2392
+ if (mcpDiscoveryEnabled && name.startsWith("mcp__")) {
2393
+ continue;
2394
+ }
2395
+ if (toolRegistry.has(name) && !initialToolNames.includes(name)) {
2396
+ initialToolNames.push(name);
2397
+ }
2398
+ }
2399
+
2400
+ // When tools.discoveryMode === "all", hide non-essential built-in discoverable tools
2401
+ // from the initial set unless they were explicitly requested or restored from persistence.
2402
+ // The model finds them via search_tool_bm25 and activates them on demand.
2403
+ if (effectiveDiscoveryMode === "all") {
2404
+ // Tools a forced tool_choice will target must stay active, or the named
2405
+ // choice references a tool absent from the request (provider 400). Eager
2406
+ // todos force a named `todo` choice on the first turn. `task` is also kept
2407
+ // active under discovery-all when `task.eager` is not `default`, so eager delegation is
2408
+ // possible and the Eager Tasks prompt section renders, even though nothing
2409
+ // forces a `task` tool_choice.
2410
+ const forceActive = new Set<string>();
2411
+ if (settings.get("todo.eager") !== "default" && settings.get("todo.enabled") && toolRegistry.has("todo")) {
2412
+ forceActive.add("todo");
2413
+ }
2414
+ if (settings.get("task.eager") !== "default" && toolRegistry.has("task")) {
2415
+ forceActive.add("task");
2416
+ }
2417
+ initialToolNames = filterInitialToolsForDiscoveryAll(initialToolNames, {
2418
+ loadModeOf: name => toolRegistry.get(name)?.loadMode,
2419
+ essentialNames: new Set(computeEssentialBuiltinNames(settings)),
2420
+ explicitlyRequested: new Set(options.toolNames ? normalizeToolNames(options.toolNames) : []),
2421
+ // Back-compat: persisted activations live under selectedMCPToolNames today (built-in
2422
+ // activation persistence is a follow-up). MCP names won't collide with built-in names.
2423
+ restored: new Set(existingSession.selectedMCPToolNames.map(normalizeRenamedBuiltinToolName)),
2424
+ forceActive,
2425
+ });
2426
+ }
2427
+
2428
+ // Pre-register in the global agent registry BEFORE building the system prompt,
2429
+ // so that subagents launched in the same parallel batch can see each other in
2430
+ // their initial `# IRC Peers` block (rendered inside `rebuildSystemPrompt`).
2431
+ // The session reference is attached after construction below.
2432
+ agentRegistry.register({
2433
+ id: resolvedAgentId,
2434
+ displayName: resolvedAgentDisplayName,
2435
+ kind: agentKind,
2436
+ parentId: options.parentAgentId,
2437
+ session: null,
2438
+ sessionFile: sessionManager.getSessionFile() ?? null,
2439
+ status: "running",
2440
+ });
2441
+ hasRegistered = true;
2442
+
2443
+ const { systemPrompt } = await logger.time(
2444
+ "buildSystemPrompt",
2445
+ rebuildSystemPrompt,
2446
+ initialToolNames,
2447
+ toolRegistry,
2448
+ );
2449
+
2450
+ const promptTemplates = await promptTemplatesPromise;
2451
+ toolSession.promptTemplates = promptTemplates;
2452
+
2453
+ const slashCommands = await slashCommandsPromise;
2454
+
2455
+ // Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)
2456
+ const convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {
2457
+ const converted = convertToLlm(messages);
2458
+ // Check setting dynamically so mid-session changes take effect
2459
+ if (!settings.get("images.blockImages")) {
2460
+ return converted;
2461
+ }
2462
+ // Filter out ImageContent from all messages, replacing with text placeholder
2463
+ return converted.map(msg => {
2464
+ if (msg.role === "user" || msg.role === "toolResult") {
2465
+ const content = msg.content;
2466
+ if (Array.isArray(content)) {
2467
+ const hasImages = content.some(c => c.type === "image");
2468
+ if (hasImages) {
2469
+ const filteredContent = content
2470
+ .map(c =>
2471
+ c.type === "image" ? { type: "text" as const, text: "Image reading is disabled." } : c,
2472
+ )
2473
+ .filter((c, i, arr) => {
2474
+ // Dedupe consecutive "Image reading is disabled." texts
2475
+ if (!(c.type === "text" && c.text === "Image reading is disabled." && i > 0)) return true;
2476
+ const prev = arr[i - 1];
2477
+ return !(prev.type === "text" && prev.text === "Image reading is disabled.");
2478
+ });
2479
+ return { ...msg, content: filteredContent };
2480
+ }
2481
+ }
2482
+ }
2483
+ return msg;
2484
+ });
2485
+ };
2486
+
2487
+ // Final convertToLlm: live provider replay drops API-level refusal errors,
2488
+ // then applies secret obfuscation to the remaining outbound context.
2489
+ const convertToLlmFinal = (messages: AgentMessage[]): Message[] => {
2490
+ const converted = filterProviderReplayMessages(convertToLlmWithBlockImages(messages));
2491
+ if (!obfuscator?.hasSecrets()) return converted;
2492
+ return obfuscateMessages(obfuscator, converted);
2493
+ };
2494
+
2495
+ const transformContext = async (messages: AgentMessage[], _signal?: AbortSignal) => {
2496
+ const withContext = await extensionRunner.emitContext(messages);
2497
+ return wrapSteeringForModel(withContext);
2498
+ };
2499
+ // Per-request provider-context transforms. Obfuscate FIRST so secrets are
2500
+ // redacted from text before snapcompact rasterizes it into PNG frames, then
2501
+ // clamp images to the active provider budget before the request is sent.
2502
+ const snapcompactSystemPromptMode = settings.get("snapcompact.systemPrompt");
2503
+ const snapcompactInline =
2504
+ snapcompactSystemPromptMode !== "none" || settings.get("snapcompact.toolResults")
2505
+ ? new SnapcompactInlineTransformer(
2506
+ {
2507
+ renderSystemPrompt: snapcompactSystemPromptMode,
2508
+ renderToolResults: settings.get("snapcompact.toolResults"),
2509
+ shape: settings.get("snapcompact.shape"),
2510
+ },
2511
+ // Journal the tokens each imaged tool result keeps off the wire
2512
+ // (frames never reach session.jsonl, so this is their only trace).
2513
+ createSnapcompactSavingsRecorder(() => sessionManager.getSessionFile() ?? null),
2514
+ )
2515
+ : undefined;
2516
+ const transformProviderContext = async (context: Context, transformModel: Model): Promise<Context> => {
2517
+ let transformed = obfuscator ? obfuscateProviderContext(obfuscator, context) : context;
2518
+ if (snapcompactInline) transformed = await snapcompactInline.transform(transformed, transformModel);
2519
+ return clampProviderContextImages(transformed, transformModel);
2520
+ };
2521
+ const onPayload = async (payload: unknown, _model?: Model) => {
2522
+ return await extensionRunner.emitBeforeProviderRequest(payload);
2523
+ };
2524
+ const onResponse: SimpleStreamOptions["onResponse"] = async (response, model) => {
2525
+ await extensionRunner.emitAfterProviderResponse(response, model);
2526
+ };
2527
+
2528
+ const setToolUIContext = (uiContext: ExtensionUIContext, hasUI: boolean) => {
2529
+ toolContextStore.setUIContext(uiContext, hasUI);
2530
+ };
2531
+
2532
+ const initialTools = initialToolNames
2533
+ .map(name => toolRegistry.get(name))
2534
+ .filter((tool): tool is AgentTool => tool !== undefined);
2535
+
2536
+ const openaiWebsocketSetting = settings.get("providers.openaiWebsockets") ?? "off";
2537
+ const preferOpenAICodexWebsockets =
2538
+ openaiWebsocketSetting === "on" ? true : openaiWebsocketSetting === "off" ? false : undefined;
2539
+ const initialServiceTierByFamily = hasServiceTierEntry
2540
+ ? (existingSession.serviceTier ?? {})
2541
+ : buildServiceTierByFamily(
2542
+ settings.get("tier.openai"),
2543
+ settings.get("tier.anthropic"),
2544
+ settings.get("tier.google"),
2545
+ );
2546
+
2547
+ // One-shot launch-latency marker: fired the first time the loop dispatches
2548
+ // a chat request to the provider transport. See onFirstChatDispatch.
2549
+ let notifyFirstChatDispatch = options.onFirstChatDispatch;
2550
+ // Shared, settings-aware stream wrapper used by the main agent, advisor,
2551
+ // and side-channel requests (`/btw`, `/omfg`, IRC auto-replies, handoff).
2552
+ // Keeps OpenRouter sticky-routing variants, antigravity endpoint routing,
2553
+ // in-flight caps, and the loop guard consistent across every provider call
2554
+ // the session drives. Wrapped in a per-provider concurrency limiter so
2555
+ // each LLM HTTP request — not the whole subagent lifecycle — holds the
2556
+ // slot, preventing the nested-spawn deadlock from issue #3749.
2557
+ const settingsAwareStreamFn = wrapStreamFnWithProviderConcurrency(
2558
+ settings,
2559
+ createSettingsAwareStreamFn(settings),
2560
+ );
2561
+ agent = new Agent({
2562
+ initialState: {
2563
+ systemPrompt,
2564
+ model,
2565
+ thinkingLevel: toReasoningEffort(effectiveThinkingLevel),
2566
+ disableReasoning: shouldDisableReasoning(effectiveThinkingLevel),
2567
+ tools: initialTools,
2568
+ },
2569
+ cwd,
2570
+ // Live cwd: `/move` updates SessionManager (and process cwd) without
2571
+ // reconstructing the Agent, so a static cwd would strand GitLab Duo Agent
2572
+ // namespace/project discovery on the original repo's git remote. Re-read it
2573
+ // per turn from the SessionManager.
2574
+ cwdResolver: () => sessionManager.getCwd(),
2575
+ convertToLlm: convertToLlmFinal,
2576
+ onPayload,
2577
+ onResponse,
2578
+ sessionId: providerSessionId,
2579
+ promptCacheKey: options.providerPromptCacheKey,
2580
+ deadline: options.deadline,
2581
+ transformContext,
2582
+ transformProviderContext,
2583
+ steeringMode: settings.get("steeringMode") ?? "one-at-a-time",
2584
+ followUpMode: settings.get("followUpMode") ?? "one-at-a-time",
2585
+ interruptMode: settings.get("interruptMode") ?? "immediate",
2586
+ thinkingBudgets: settings.getGroup("thinkingBudgets"),
2587
+ temperature: settings.get("temperature") >= 0 ? settings.get("temperature") : undefined,
2588
+ topP: settings.get("topP") >= 0 ? settings.get("topP") : undefined,
2589
+ topK: settings.get("topK") >= 0 ? settings.get("topK") : undefined,
2590
+ minP: settings.get("minP") >= 0 ? settings.get("minP") : undefined,
2591
+ presencePenalty: settings.get("presencePenalty") >= 0 ? settings.get("presencePenalty") : undefined,
2592
+ repetitionPenalty: settings.get("repetitionPenalty") >= 0 ? settings.get("repetitionPenalty") : undefined,
2593
+ hideThinkingSummary: settings.get("omitThinking"),
2594
+ kimiApiFormat: settings.get("providers.kimiApiFormat") ?? "anthropic",
2595
+ preferWebsockets: preferOpenAICodexWebsockets,
2596
+ getToolContext: tc => toolContextStore.getContext(tc),
2597
+ getApiKey: requestModel => modelRegistry.resolver(requestModel, agent.sessionId),
2598
+ streamFn: (streamModel, context, streamOptions) => {
2599
+ if (notifyFirstChatDispatch) {
2600
+ const cb = notifyFirstChatDispatch;
2601
+ notifyFirstChatDispatch = undefined;
2602
+ try {
2603
+ cb();
2604
+ } catch (err) {
2605
+ logger.warn("onFirstChatDispatch hook threw", {
2606
+ error: err instanceof Error ? err.message : String(err),
2607
+ });
2608
+ }
2609
+ }
2610
+ return settingsAwareStreamFn(streamModel, context, streamOptions);
2611
+ },
2612
+ cursorExecHandlers,
2613
+ transformToolCallArguments: (args, _toolName) => {
2614
+ let result = args;
2615
+ const maxTimeout = settings.get("tools.maxTimeout");
2616
+ if (maxTimeout > 0 && typeof result.timeout === "number") {
2617
+ result = { ...result, timeout: Math.min(result.timeout, maxTimeout) };
2618
+ }
2619
+ if (obfuscator?.hasSecrets()) {
2620
+ result = deobfuscateToolArguments(obfuscator, result);
2621
+ }
2622
+ return result;
2623
+ },
2624
+ intentTracing: !!intentField,
2625
+ pruneToolDescriptions: inlineToolDescriptors,
2626
+ dialect: resolveDialect(settings.get("tools.format"), model),
2627
+ abortOnFabricatedToolResult: settings.get("tools.abortOnFabricatedResult"),
2628
+ getToolChoice: () => session?.nextToolChoiceDirective(),
2629
+ telemetry: options.telemetry,
2630
+ appendOnlyContext: model
2631
+ ? shouldEnableAppendOnlyContext(settings.get("provider.appendOnlyContext"), model)
2632
+ ? new AppendOnlyContextManager()
2633
+ : undefined
2634
+ : undefined,
2635
+ });
2636
+
2637
+ cursorEventEmitter = event => agent.emitExternalEvent(event);
2638
+
2639
+ // Restore messages if session has existing data
2640
+ if (hasExistingSession) {
2641
+ agent.replaceMessages(existingSession.messages);
2642
+ } else {
2643
+ // Save initial model, thinking level, and service tier for new sessions so they can be restored on resume.
2644
+ if (model) {
2645
+ sessionManager.appendModelChange(`${model.provider}/${model.id}`);
2646
+ }
2647
+ if (!autoThinking) {
2648
+ // Do not write the `auto` selector before the first turn resolves; auto
2649
+ // classification persists its concrete effort once a real user turn runs.
2650
+ sessionManager.appendThinkingLevelChange(effectiveThinkingLevel);
2651
+ }
2652
+ if (Object.keys(initialServiceTierByFamily).length > 0) {
2653
+ sessionManager.appendServiceTierChange(initialServiceTierByFamily);
2654
+ }
2655
+ }
2656
+
2657
+ // Full toolset for the advisor, built unconditionally so it can be toggled at
2658
+ // runtime. Bound to a DISTINCT ToolSession (its own `-advisor` session id +
2659
+ // agent id) so the advisor's tool state — snapshot, seen-lines, conflict, and
2660
+ // summary caches, all keyed on session identity — stays isolated from the
2661
+ // primary, while edit/bash/write stay fully functional: the advisor is a full
2662
+ // agent and its config's `tools` selects which of these it actually gets
2663
+ // (defaulting to read/grep/glob).
2664
+ const advisorToolSession: ToolSession = {
2665
+ ...toolSession,
2666
+ get cwd() {
2667
+ return sessionManager.getCwd();
2668
+ },
2669
+ hasEditTool: true,
2670
+ requireYieldTool: false,
2671
+ getSessionId: () => {
2672
+ const id = sessionManager.getSessionId?.();
2673
+ return id ? `${id}-advisor` : null;
2674
+ },
2675
+ getAgentId: () => "advisor",
2676
+ };
2677
+ const advisorToolBuilds: Array<Tool | null | Promise<Tool | null>> = [];
2678
+ for (const name in BUILTIN_TOOLS) {
2679
+ advisorToolBuilds.push(BUILTIN_TOOLS[name as keyof typeof BUILTIN_TOOLS](advisorToolSession));
2680
+ }
2681
+ const built = await Promise.all(advisorToolBuilds);
2682
+ const advisorTools: Tool[] = built.filter((tool): tool is Tool => tool != null).map(wrapToolWithMetaNotice);
2683
+
2684
+ const advisorWatchdogPrompts = [...watchdogFiles];
2685
+ if (activeRepoContext) {
2686
+ advisorWatchdogPrompts.push(formatActiveRepoWatchdogPrompt(activeRepoContext));
2687
+ }
2688
+ const advisorWatchdogPrompt = advisorWatchdogPrompts.length > 0 ? advisorWatchdogPrompts.join("\n\n") : undefined;
2689
+ // Hand the advisor the same project context files (AGENTS.md, etc.) the
2690
+ // primary agent gets in its system prompt, so the read-only reviewer judges
2691
+ // against the user's standing project rules instead of advising blind.
2692
+ const advisorContextPrompt = formatAdvisorContextPrompt(contextFiles);
2693
+ // Owned only when this session created the manager; subagents receive a
2694
+ // parent's manager via `options.mcpManager` and MUST NOT disconnect it.
2695
+ const ownedMcpManager = options.mcpManager ? undefined : mcpManager;
2696
+ session = new AgentSession({
2697
+ advisorWatchdogPrompt,
2698
+ advisorContextPrompt,
2699
+ advisorSharedInstructions: discoveredAdvisors.sharedInstructions,
2700
+ advisorConfigs: discoveredAdvisors.advisors,
2701
+ agent,
2702
+ pruneToolDescriptions: inlineToolDescriptors,
2703
+ thinkingLevel: autoThinking ? AUTO_THINKING : effectiveThinkingLevel,
2704
+ serviceTierByFamily: initialServiceTierByFamily,
2705
+ sessionManager,
2706
+ settings,
2707
+ autoApprove: options.autoApprove,
2708
+ evalKernelOwnerId,
2709
+ // Defined only for top-level sessions (creation is gated above).
2710
+ // AgentSession uses this to decide whether it may dispose the global
2711
+ // AsyncJobManager on teardown; subagents inherit the parent's and
2712
+ // **MUST NOT** tear it down.
2713
+ ownedAsyncJobManager: asyncJobManager,
2714
+ asyncJobManager: scopedAsyncJobManager,
2715
+ scopedModels: options.scopedModels,
2716
+ promptTemplates,
2717
+ slashCommands,
2718
+ extensionRunner,
2719
+ customCommands: customCommandsResult.commands,
2720
+ skills,
2721
+ skillWarnings,
2722
+ skillsSettings: settings.getGroup("skills"),
2723
+ modelRegistry,
2724
+ toolRegistry,
2725
+ builtInToolNames: builtInRegistryToolNames,
2726
+ transformContext,
2727
+ transformProviderContext,
2728
+ onPayload,
2729
+ onResponse,
2730
+ sideStreamFn: settingsAwareStreamFn,
2731
+ advisorStreamFn: settingsAwareStreamFn,
2732
+ preferWebsockets: preferOpenAICodexWebsockets,
2733
+ convertToLlm: convertToLlmFinal,
2734
+ rebuildSystemPrompt,
2735
+ reloadSshTool,
2736
+ requestedToolNames: requestedToolNameSet,
2737
+ getMcpServerInstructions: mcpManager
2738
+ ? () => {
2739
+ const raw = mcpManager.getServerInstructions();
2740
+ if (!raw || raw.size === 0) return raw;
2741
+ const out = new Map<string, string>();
2742
+ for (const [name, text] of raw) {
2743
+ out.set(
2744
+ name,
2745
+ text.length > MAX_MCP_INSTRUCTIONS_LENGTH ? text.slice(0, MAX_MCP_INSTRUCTIONS_LENGTH) : text,
2746
+ );
2747
+ }
2748
+ return out;
2749
+ }
2750
+ : undefined,
2751
+ disconnectOwnedMcpManager: ownedMcpManager ? () => ownedMcpManager.disconnectAll() : undefined,
2752
+ mcpDiscoveryEnabled,
2753
+ initialSelectedMCPToolNames,
2754
+ defaultSelectedMCPToolNames,
2755
+ persistInitialMCPToolSelection: !hasExistingSession,
2756
+ defaultSelectedMCPServerNames: [...discoveryDefaultServers],
2757
+ ttsrManager,
2758
+ obfuscator,
2759
+ agentId: resolvedAgentId,
2760
+ agentKind,
2761
+ providerSessionId: options.providerSessionId,
2762
+ parentEvalSessionId: options.parentEvalSessionId,
2763
+ advisorTools,
2764
+ titleSystemPrompt: options.titleSystemPrompt,
2765
+ });
2766
+ hasSession = true;
2767
+ if (asyncJobManager) {
2768
+ session.yieldQueue.register<AsyncResultEntry>("async-result", {
2769
+ isStale: entry => asyncJobManager.isDeliverySuppressed(entry.jobId),
2770
+ build: buildAsyncResultBatchMessage,
2771
+ });
2772
+ }
2773
+ session.yieldQueue.register<McpNotificationEntry>("mcp-notification", {
2774
+ build: buildMcpNotificationBatchMessage,
2775
+ });
2776
+ session.yieldQueue.register<DeferredDiagnosticsEntry>(LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE, {
2777
+ isStale: entry => entry.isStale(),
2778
+ build: buildLateDiagnosticsBatchMessage,
2779
+ });
2780
+
2781
+ // Attach the live session to the pre-registered ref so peers can route IRC
2782
+ // messages here. Refresh sessionFile in case it was unavailable at pre-register
2783
+ // time. The dispose wrapper below unregisters on teardown (unless parked).
2784
+ agentRegistry.attachSession(resolvedAgentId, session, sessionManager.getSessionFile() ?? null);
2785
+ {
2786
+ const originalDispose = session.dispose.bind(session);
2787
+ session.dispose = async () => {
2788
+ try {
2789
+ // Reject new session work (eval starts) the moment disposal
2790
+ // begins — the lifecycle await below opens an async gap before
2791
+ // AgentSession.dispose() would otherwise set its guards.
2792
+ session.beginDispose();
2793
+ if (agentKind === "main") {
2794
+ // Top-level teardown owns the global agent lifecycle: park timers,
2795
+ // adopted subagent sessions, revivers. Tear it down while shared
2796
+ // resources (kernels, MCP, LSP) are still live. Subagent disposal
2797
+ // must NOT touch the global lifecycle.
2798
+ await AgentLifecycleManager.global().dispose();
2799
+ }
2800
+ await originalDispose();
2801
+ } finally {
2802
+ unregisterUnlessParked();
2803
+ unsubscribeCredentialDisabled?.();
2804
+ }
2805
+ };
2806
+ }
2807
+
2808
+ if (model?.api === "openai-codex-responses") {
2809
+ // `.api` equality doesn't narrow the generic; the guard makes this cast sound.
2810
+ const codexModel = model as Model<"openai-codex-responses">;
2811
+ const codexTransport = getOpenAICodexTransportDetails(codexModel, {
2812
+ sessionId: providerSessionId,
2813
+ baseUrl: codexModel.baseUrl,
2814
+ preferWebsockets: preferOpenAICodexWebsockets,
2815
+ providerSessionState: session.providerSessionState,
2816
+ });
2817
+ if (codexTransport.websocketPreferred) {
2818
+ void (async () => {
2819
+ try {
2820
+ const codexPrewarmApiKey = await modelRegistry.getApiKey(codexModel, providerSessionId);
2821
+ if (!codexPrewarmApiKey) return;
2822
+ await logger.time("prewarmOpenAICodexResponses", prewarmOpenAICodexResponses, codexModel, {
2823
+ apiKey: codexPrewarmApiKey,
2824
+ sessionId: providerSessionId,
2825
+ preferWebsockets: preferOpenAICodexWebsockets,
2826
+ providerSessionState: session.providerSessionState,
2827
+ });
2828
+ } catch (error) {
2829
+ const errorMessage = error instanceof Error ? error.message : String(error);
2830
+ logger.debug("Codex websocket prewarm failed", {
2831
+ error: errorMessage,
2832
+ provider: codexModel.provider,
2833
+ model: codexModel.id,
2834
+ });
2835
+ }
2836
+ })();
2837
+ }
2838
+ }
2839
+
2840
+ // Start LSP warmup in the background so startup does not block on language server initialization.
2841
+ // With `lsp.lazy` (the default) the warmup is skipped: recognized servers are still discovered and
2842
+ // surfaced in the UI as "available", but cold-start on first use — the lsp tool or an edit/write
2843
+ // touching a matching file type — through `getOrCreateClient`.
2844
+ // Print/script invocations (`hasUI=false`) skip it regardless: they don't render the warmup status
2845
+ // indicator AND typically finish before LSP servers would have stabilized — warming them just spends
2846
+ // CPU parsing big `initialize` responses concurrently with the LLM stream consumer, jittering
2847
+ // perceived latency.
2848
+ let lspServers: CreateAgentSessionResult["lspServers"];
2849
+ if (enableLsp && options.hasUI && settings.get("lsp.lazy")) {
2850
+ lspServers = discoverStartupLspServers(cwd, "available");
2851
+ } else if (enableLsp && options.hasUI) {
2852
+ lspServers = discoverStartupLspServers(cwd);
2853
+ if (lspServers.length > 0) {
2854
+ void (async () => {
2855
+ try {
2856
+ const result = await logger.time("warmupLspServers", warmupLspServers, cwd);
2857
+ const serversByName = new Map(result.servers.map(server => [server.name, server] as const));
2858
+ for (const server of lspServers ?? []) {
2859
+ const next = serversByName.get(server.name);
2860
+ if (!next) continue;
2861
+ server.status = next.status;
2862
+ server.fileTypes = next.fileTypes;
2863
+ server.error = next.error;
2864
+ }
2865
+ const event: LspStartupEvent = {
2866
+ type: "completed",
2867
+ servers: result.servers,
2868
+ };
2869
+ if (!startupQuiet) eventBus.emit(LSP_STARTUP_EVENT_CHANNEL, event);
2870
+ } catch (error) {
2871
+ const errorMessage = error instanceof Error ? error.message : String(error);
2872
+ logger.warn("LSP server warmup failed", { cwd, error: errorMessage });
2873
+ for (const server of lspServers ?? []) {
2874
+ server.status = "error";
2875
+ server.error = errorMessage;
2876
+ }
2877
+ const event: LspStartupEvent = {
2878
+ type: "failed",
2879
+ error: errorMessage,
2880
+ };
2881
+ if (!startupQuiet) eventBus.emit(LSP_STARTUP_EVENT_CHANNEL, event);
2882
+ }
2883
+ })();
2884
+ }
2885
+ }
2886
+
2887
+ const startMemoryBackend = async () => {
2888
+ const memoryBackend = await resolveMemoryBackend(settings);
2889
+ await memoryBackend.start({
2890
+ session,
2891
+ settings,
2892
+ modelRegistry,
2893
+ agentDir,
2894
+ taskDepth,
2895
+ parentHindsightSessionState: options.parentHindsightSessionState,
2896
+ parentMnemopiSessionState: options.parentMnemopiSessionState,
2897
+ });
2898
+ };
2899
+
2900
+ // Auto-learn can immediately trigger a synthetic capture turn after the
2901
+ // first real stop. When a memory backend is selected, install that backend's
2902
+ // per-session state first so the capture turn's `learn` tool observes the
2903
+ // same initialized state as normal memory tools. Other sessions keep memory
2904
+ // startup in the background to preserve the existing startup profile.
2905
+ //
2906
+ // Gated on `autolearn.enabled` to match the tools: `createTools` builds the
2907
+ // `learn`/`manage_skill` registry ONCE at session start and no settings
2908
+ // change rebuilds it, so installing the controller while disabled would let a
2909
+ // mid-session enable fire a nudge pointing at tools the session never built.
2910
+ // Activation is therefore a session-start decision for BOTH the controller
2911
+ // and the tools; the fire-time re-check in `#onAgentEnd` still handles a
2912
+ // mid-session DISABLE. The subscription lives for the session's lifetime; the
2913
+ // reference is intentionally discarded (the listener retains it).
2914
+ if (settings.get("autolearn.enabled") && taskDepth === 0) {
2915
+ await logger.time("startMemoryStartupTask", startMemoryBackend);
2916
+ new AutoLearnController({ session, settings });
2917
+ } else {
2918
+ void logger.time("startMemoryStartupTask", startMemoryBackend);
2919
+ }
2920
+
2921
+ // Wire MCP manager callbacks to session for reactive tool updates.
2922
+ // Skip when reusing a parent's manager — the parent owns the callbacks.
2923
+ if (mcpManager && !options.mcpManager) {
2924
+ mcpManager.setOnToolsChanged(tools => {
2925
+ void (async () => {
2926
+ try {
2927
+ await session.refreshMCPTools(
2928
+ tools,
2929
+ deferMCPDiscoveryForUI && !mcpDiscoveryEnabled && options.toolNames === undefined
2930
+ ? { activateAll: true }
2931
+ : undefined,
2932
+ );
2933
+ if (deferMCPDiscoveryForUI && !mcpDiscoveryEnabled && explicitlyRequestedMCPToolNames.length > 0) {
2934
+ await session.setActiveToolsByName([
2935
+ ...session.getActiveToolNames(),
2936
+ ...explicitlyRequestedMCPToolNames,
2937
+ ]);
2938
+ }
2939
+ } catch (error) {
2940
+ logger.warn("MCP tool refresh failed", {
2941
+ error: error instanceof Error ? error.message : String(error),
2942
+ });
2943
+ }
2944
+ })();
2945
+ });
2946
+ // Wire prompt refresh → rebuild MCP prompt slash commands
2947
+ mcpManager.setOnPromptsChanged(serverName => {
2948
+ const promptCommands = buildMCPPromptCommands(mcpManager);
2949
+ session.setMCPPromptCommands(promptCommands);
2950
+ logger.debug("MCP prompt commands refreshed", { path: `mcp:${serverName}` });
2951
+ });
2952
+ const notificationDebounceTimers = new Map<string, Timer>();
2953
+ const clearDebounceTimers = () => {
2954
+ for (const timer of notificationDebounceTimers.values()) clearTimeout(timer);
2955
+ notificationDebounceTimers.clear();
2956
+ };
2957
+ postmortem.register("mcp-notification-cleanup", clearDebounceTimers);
2958
+ mcpManager.setOnResourcesChanged((serverName, uri) => {
2959
+ logger.debug("MCP resources changed", { path: `mcp:${serverName}`, uri });
2960
+ if (!settings.get("mcp.notifications")) return;
2961
+ const debounceMs = settings.get("mcp.notificationDebounceMs");
2962
+ const key = `${serverName}:${uri}`;
2963
+ const existing = notificationDebounceTimers.get(key);
2964
+ if (existing) clearTimeout(existing);
2965
+ notificationDebounceTimers.set(
2966
+ key,
2967
+ setTimeout(() => {
2968
+ notificationDebounceTimers.delete(key);
2969
+ // Re-check: user may have disabled notifications during the debounce window
2970
+ if (!settings.get("mcp.notifications")) return;
2971
+ session.yieldQueue.enqueue<McpNotificationEntry>("mcp-notification", { serverName, uri });
2972
+ }, debounceMs),
2973
+ );
2974
+ });
2975
+ }
2976
+
2977
+ startDeferredMCPDiscovery?.(session, {
2978
+ mcpDiscoveryEnabled,
2979
+ explicitlyRequestedMCPToolNames,
2980
+ activateAllMCPTools: !mcpDiscoveryEnabled && options.toolNames === undefined,
2981
+ });
2982
+
2983
+ return {
2984
+ session,
2985
+ extensionsResult,
2986
+ setToolUIContext,
2987
+ mcpManager,
2988
+ modelFallbackMessage,
2989
+ lspServers,
2990
+ eventBus,
2991
+ };
2992
+ } catch (error) {
2993
+ // Release the subscription if the throw happened after install but before the
2994
+ // dispose-wrap took ownership. Idempotent with dispose() — Set.delete is a no-op
2995
+ // for already-removed listeners.
2996
+ unsubscribeCredentialDisabled?.();
2997
+ try {
2998
+ if (hasSession) {
2999
+ await session.dispose();
3000
+ } else {
3001
+ if (hasRegistered) unregisterUnlessParked();
3002
+ if (asyncJobManager) {
3003
+ if (AsyncJobManager.instance() === asyncJobManager) {
3004
+ AsyncJobManager.setInstance(undefined);
3005
+ }
3006
+ await asyncJobManager.dispose({ timeoutMs: 3_000 });
3007
+ }
3008
+ await disposeKernelSessionsByOwner(evalKernelOwnerId);
3009
+ await disposeRubyKernelSessionsByOwner(evalKernelOwnerId);
3010
+ await disposeJuliaKernelSessionsByOwner(evalKernelOwnerId);
3011
+ if (ownsAuthStorage) authStorage.close();
3012
+ }
3013
+ } catch (cleanupError) {
3014
+ logger.warn("Failed to clean up createAgentSession resources after startup error", {
3015
+ error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
3016
+ });
3017
+ }
3018
+ throw error;
3019
+ }
3020
+ }
3021
+
3022
+ /**
3023
+ * Best-effort preconnect to the model's API host. Bun's `fetch.preconnect`
3024
+ * primes DNS + TCP + TLS + H2 so the first real request reuses the warm
3025
+ * connection. Errors are swallowed: preconnect is an optimization, never a
3026
+ * hard dependency.
3027
+ */
3028
+ function preconnectModelHost(baseUrl: string | undefined): void {
3029
+ if (!baseUrl) return;
3030
+ const preconnect = (globalThis.fetch as typeof fetch & { preconnect?: (url: string) => void }).preconnect;
3031
+ if (typeof preconnect !== "function") return;
3032
+ try {
3033
+ preconnect(baseUrl);
3034
+ } catch {
3035
+ // Best effort.
3036
+ }
3037
+ }