@kr78/pi-coding-agent 17.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1593) hide show
  1. package/CHANGELOG.md +14861 -0
  2. package/README.md +35 -0
  3. package/dist/CHANGELOG-chtdxh1z.md +14861 -0
  4. package/dist/cli.js +20483 -0
  5. package/dist/template-c2hyaytt.js +1653 -0
  6. package/dist/template-f8wx9vfn.css +1355 -0
  7. package/dist/template-qat058wr.html +55 -0
  8. package/dist/tool-views.generated-jdfmzwmn.js +35 -0
  9. package/examples/README.md +21 -0
  10. package/examples/custom-tools/README.md +104 -0
  11. package/examples/custom-tools/hello/index.ts +20 -0
  12. package/examples/extensions/README.md +142 -0
  13. package/examples/extensions/api-demo.ts +78 -0
  14. package/examples/extensions/chalk-logger.ts +25 -0
  15. package/examples/extensions/hello.ts +31 -0
  16. package/examples/extensions/pirate.ts +43 -0
  17. package/examples/extensions/plan-mode.ts +549 -0
  18. package/examples/extensions/reload-runtime.ts +38 -0
  19. package/examples/extensions/thinking-note.ts +13 -0
  20. package/examples/extensions/tools.ts +145 -0
  21. package/examples/extensions/with-deps/index.ts +36 -0
  22. package/examples/extensions/with-deps/package-lock.json +31 -0
  23. package/examples/extensions/with-deps/package.json +17 -0
  24. package/examples/hooks/README.md +56 -0
  25. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  26. package/examples/hooks/confirm-destructive.ts +58 -0
  27. package/examples/hooks/custom-compaction.ts +115 -0
  28. package/examples/hooks/dirty-repo-guard.ts +51 -0
  29. package/examples/hooks/file-trigger.ts +40 -0
  30. package/examples/hooks/git-checkpoint.ts +52 -0
  31. package/examples/hooks/handoff.ts +149 -0
  32. package/examples/hooks/permission-gate.ts +33 -0
  33. package/examples/hooks/protected-paths.ts +29 -0
  34. package/examples/hooks/qna.ts +118 -0
  35. package/examples/hooks/status-line.ts +39 -0
  36. package/examples/sdk/01-minimal.ts +21 -0
  37. package/examples/sdk/02-custom-model.ts +49 -0
  38. package/examples/sdk/03-custom-prompt.ts +46 -0
  39. package/examples/sdk/04-skills.ts +43 -0
  40. package/examples/sdk/06-extensions.ts +82 -0
  41. package/examples/sdk/06-hooks.ts +61 -0
  42. package/examples/sdk/07-context-files.ts +35 -0
  43. package/examples/sdk/08-prompt-templates.ts +41 -0
  44. package/examples/sdk/08-slash-commands.ts +46 -0
  45. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  46. package/examples/sdk/11-sessions.ts +47 -0
  47. package/examples/sdk/12-redis-sessions.ts +54 -0
  48. package/examples/sdk/13-sql-sessions.ts +61 -0
  49. package/examples/sdk/README.md +169 -0
  50. package/package.json +587 -0
  51. package/scripts/bench-guard.ts +71 -0
  52. package/scripts/bench-title-models.ts +332 -0
  53. package/scripts/build-binary.ts +117 -0
  54. package/scripts/bundle-dist.ts +123 -0
  55. package/scripts/compile-binary.ts +69 -0
  56. package/scripts/embed-mupdf-wasm.ts +67 -0
  57. package/scripts/format-prompts.ts +68 -0
  58. package/scripts/generate-aria-snapshot.ts +134 -0
  59. package/scripts/generate-docs-index.ts +58 -0
  60. package/scripts/generate-share-viewer.ts +34 -0
  61. package/scripts/legacy-pi-virtual-module.ts +205 -0
  62. package/scripts/measure-prompt-tokens.ts +63 -0
  63. package/scripts/omp +51 -0
  64. package/scripts/omp.ts +19 -0
  65. package/scripts/security-compare.ts +40 -0
  66. package/src/advisor/advise-tool.ts +234 -0
  67. package/src/advisor/config.ts +341 -0
  68. package/src/advisor/emission-guard.ts +172 -0
  69. package/src/advisor/index.ts +6 -0
  70. package/src/advisor/runtime.ts +1412 -0
  71. package/src/advisor/transcript-recorder.ts +215 -0
  72. package/src/advisor/watchdog.ts +135 -0
  73. package/src/async/index.ts +1 -0
  74. package/src/async/job-manager.ts +847 -0
  75. package/src/auto-thinking/classifier.ts +220 -0
  76. package/src/autolearn/controller.ts +152 -0
  77. package/src/autolearn/managed-skills.ts +255 -0
  78. package/src/autoresearch/command-resume.md +14 -0
  79. package/src/autoresearch/dashboard.ts +436 -0
  80. package/src/autoresearch/git.ts +331 -0
  81. package/src/autoresearch/helpers.ts +218 -0
  82. package/src/autoresearch/index.ts +541 -0
  83. package/src/autoresearch/prompt-setup.md +43 -0
  84. package/src/autoresearch/prompt.md +103 -0
  85. package/src/autoresearch/resume-message.md +10 -0
  86. package/src/autoresearch/state.ts +273 -0
  87. package/src/autoresearch/storage.ts +700 -0
  88. package/src/autoresearch/tools/init-experiment.ts +268 -0
  89. package/src/autoresearch/tools/log-experiment.ts +520 -0
  90. package/src/autoresearch/tools/run-experiment.ts +407 -0
  91. package/src/autoresearch/tools/update-notes.ts +109 -0
  92. package/src/autoresearch/types.ts +168 -0
  93. package/src/capability/context-file.ts +44 -0
  94. package/src/capability/extension-module.ts +34 -0
  95. package/src/capability/extension.ts +47 -0
  96. package/src/capability/fs.ts +117 -0
  97. package/src/capability/hook.ts +40 -0
  98. package/src/capability/index.ts +467 -0
  99. package/src/capability/instruction.ts +37 -0
  100. package/src/capability/mcp.ts +115 -0
  101. package/src/capability/prompt.ts +35 -0
  102. package/src/capability/rule-buckets.ts +66 -0
  103. package/src/capability/rule.ts +298 -0
  104. package/src/capability/settings.ts +34 -0
  105. package/src/capability/skill.ts +69 -0
  106. package/src/capability/slash-command.ts +40 -0
  107. package/src/capability/ssh.ts +41 -0
  108. package/src/capability/system-prompt.ts +34 -0
  109. package/src/capability/tool.ts +38 -0
  110. package/src/capability/types.ts +187 -0
  111. package/src/cleanse/agent.ts +226 -0
  112. package/src/cleanse/balance.ts +79 -0
  113. package/src/cleanse/checkers.ts +996 -0
  114. package/src/cleanse/index.ts +190 -0
  115. package/src/cleanse/loop.ts +51 -0
  116. package/src/cleanse/parsers.ts +726 -0
  117. package/src/cleanse/progress.ts +50 -0
  118. package/src/cleanse/prompts/assignment.md +47 -0
  119. package/src/cleanse/types.ts +72 -0
  120. package/src/cli/agents-cli.ts +138 -0
  121. package/src/cli/args.ts +368 -0
  122. package/src/cli/auth-broker-cli.ts +940 -0
  123. package/src/cli/auth-gateway-cli.ts +674 -0
  124. package/src/cli/bench-cli.ts +990 -0
  125. package/src/cli/browser-relay-cli.ts +119 -0
  126. package/src/cli/classify-install-target.ts +76 -0
  127. package/src/cli/claude-trace-cli.ts +795 -0
  128. package/src/cli/command-help.ts +107 -0
  129. package/src/cli/commands/init-xdg.ts +27 -0
  130. package/src/cli/completion-gen.ts +550 -0
  131. package/src/cli/config-cli.ts +459 -0
  132. package/src/cli/dry-balance-cli.ts +864 -0
  133. package/src/cli/extension-flags.ts +48 -0
  134. package/src/cli/file-processor.ts +132 -0
  135. package/src/cli/flag-tables.ts +367 -0
  136. package/src/cli/gallery-cli.ts +272 -0
  137. package/src/cli/gallery-fixtures/agentic.ts +420 -0
  138. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  139. package/src/cli/gallery-fixtures/edit.ts +254 -0
  140. package/src/cli/gallery-fixtures/fs.ts +245 -0
  141. package/src/cli/gallery-fixtures/index.ts +40 -0
  142. package/src/cli/gallery-fixtures/interaction.ts +46 -0
  143. package/src/cli/gallery-fixtures/memory.ts +81 -0
  144. package/src/cli/gallery-fixtures/misc.ts +177 -0
  145. package/src/cli/gallery-fixtures/search.ts +135 -0
  146. package/src/cli/gallery-fixtures/shell.ts +241 -0
  147. package/src/cli/gallery-fixtures/types.ts +57 -0
  148. package/src/cli/gallery-fixtures/web.ts +158 -0
  149. package/src/cli/gallery-screenshot.ts +279 -0
  150. package/src/cli/gc-cli.ts +1566 -0
  151. package/src/cli/grep-cli.ts +161 -0
  152. package/src/cli/grievances-cli.ts +256 -0
  153. package/src/cli/help-extra.ts +89 -0
  154. package/src/cli/initial-message.ts +58 -0
  155. package/src/cli/models-cli.ts +385 -0
  156. package/src/cli/plugin-cli.ts +996 -0
  157. package/src/cli/profile-alias.ts +369 -0
  158. package/src/cli/profile-bootstrap.ts +233 -0
  159. package/src/cli/read-cli.ts +99 -0
  160. package/src/cli/session-picker.ts +110 -0
  161. package/src/cli/setup-cli.ts +312 -0
  162. package/src/cli/setup-model-picker.ts +43 -0
  163. package/src/cli/shell-cli.ts +176 -0
  164. package/src/cli/ssh-cli.ts +179 -0
  165. package/src/cli/startup-cwd.ts +58 -0
  166. package/src/cli/stats-cli.ts +229 -0
  167. package/src/cli/thinking-levels.ts +7 -0
  168. package/src/cli/tiny-models-cli.ts +153 -0
  169. package/src/cli/ttsr-cli.ts +1013 -0
  170. package/src/cli/update-cli.ts +1184 -0
  171. package/src/cli/usage-cli.ts +1084 -0
  172. package/src/cli/usage-error.ts +7 -0
  173. package/src/cli/web-search-cli.ts +144 -0
  174. package/src/cli/worktree-cli.ts +311 -0
  175. package/src/cli-commands.ts +308 -0
  176. package/src/cli.ts +428 -0
  177. package/src/collab/crypto.ts +63 -0
  178. package/src/collab/display-name.ts +13 -0
  179. package/src/collab/guest.ts +764 -0
  180. package/src/collab/host.ts +692 -0
  181. package/src/collab/protocol.ts +296 -0
  182. package/src/collab/relay-client.ts +282 -0
  183. package/src/collab/replication-shrink.ts +111 -0
  184. package/src/commands/acp.ts +35 -0
  185. package/src/commands/agents.ts +58 -0
  186. package/src/commands/auth-broker.ts +100 -0
  187. package/src/commands/auth-gateway.ts +70 -0
  188. package/src/commands/bench.ts +64 -0
  189. package/src/commands/browser-relay.ts +53 -0
  190. package/src/commands/cleanse.ts +45 -0
  191. package/src/commands/commit.ts +47 -0
  192. package/src/commands/complete.ts +67 -0
  193. package/src/commands/completions.ts +61 -0
  194. package/src/commands/config.ts +52 -0
  195. package/src/commands/dry-balance.ts +43 -0
  196. package/src/commands/gallery.ts +61 -0
  197. package/src/commands/gc.ts +47 -0
  198. package/src/commands/grep.ts +49 -0
  199. package/src/commands/grievances.ts +52 -0
  200. package/src/commands/install.ts +107 -0
  201. package/src/commands/join.ts +40 -0
  202. package/src/commands/launch-help.ts +116 -0
  203. package/src/commands/launch.ts +34 -0
  204. package/src/commands/models.ts +61 -0
  205. package/src/commands/plugin.ts +79 -0
  206. package/src/commands/read.ts +39 -0
  207. package/src/commands/say.ts +146 -0
  208. package/src/commands/setup.ts +68 -0
  209. package/src/commands/share.ts +71 -0
  210. package/src/commands/shell.ts +30 -0
  211. package/src/commands/ssh.ts +61 -0
  212. package/src/commands/stats.ts +30 -0
  213. package/src/commands/tiny-models.ts +36 -0
  214. package/src/commands/token.ts +164 -0
  215. package/src/commands/ttsr.ts +125 -0
  216. package/src/commands/update.ts +34 -0
  217. package/src/commands/usage.ts +55 -0
  218. package/src/commands/web-search.ts +43 -0
  219. package/src/commands/worktree.ts +63 -0
  220. package/src/commit/agentic/agent.ts +322 -0
  221. package/src/commit/agentic/fallback.ts +96 -0
  222. package/src/commit/agentic/index.ts +383 -0
  223. package/src/commit/agentic/lock-files.ts +107 -0
  224. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  225. package/src/commit/agentic/prompts/session-user.md +25 -0
  226. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  227. package/src/commit/agentic/prompts/system.md +38 -0
  228. package/src/commit/agentic/state.ts +60 -0
  229. package/src/commit/agentic/tools/analyze-file.ts +148 -0
  230. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  231. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  232. package/src/commit/agentic/tools/git-overview.ts +62 -0
  233. package/src/commit/agentic/tools/index.ts +54 -0
  234. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  235. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  236. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  237. package/src/commit/agentic/tools/schemas.ts +11 -0
  238. package/src/commit/agentic/tools/split-commit.ts +241 -0
  239. package/src/commit/agentic/topo-sort.ts +44 -0
  240. package/src/commit/agentic/trivial.ts +51 -0
  241. package/src/commit/agentic/validation.ts +183 -0
  242. package/src/commit/analysis/conventional.ts +64 -0
  243. package/src/commit/analysis/index.ts +4 -0
  244. package/src/commit/analysis/scope.ts +242 -0
  245. package/src/commit/analysis/summary.ts +107 -0
  246. package/src/commit/analysis/validation.ts +66 -0
  247. package/src/commit/changelog/detect.ts +40 -0
  248. package/src/commit/changelog/generate.ts +101 -0
  249. package/src/commit/changelog/index.ts +234 -0
  250. package/src/commit/changelog/parse.ts +44 -0
  251. package/src/commit/cli.ts +85 -0
  252. package/src/commit/git/diff.ts +148 -0
  253. package/src/commit/index.ts +5 -0
  254. package/src/commit/map-reduce/index.ts +69 -0
  255. package/src/commit/map-reduce/map-phase.ts +193 -0
  256. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  257. package/src/commit/map-reduce/utils.ts +9 -0
  258. package/src/commit/message.ts +11 -0
  259. package/src/commit/model-selection.ts +95 -0
  260. package/src/commit/pipeline.ts +244 -0
  261. package/src/commit/prompts/analysis-system.md +148 -0
  262. package/src/commit/prompts/analysis-user.md +38 -0
  263. package/src/commit/prompts/changelog-system.md +50 -0
  264. package/src/commit/prompts/changelog-user.md +18 -0
  265. package/src/commit/prompts/file-observer-system.md +24 -0
  266. package/src/commit/prompts/file-observer-user.md +8 -0
  267. package/src/commit/prompts/reduce-system.md +50 -0
  268. package/src/commit/prompts/reduce-user.md +17 -0
  269. package/src/commit/prompts/summary-retry.md +3 -0
  270. package/src/commit/prompts/summary-system.md +38 -0
  271. package/src/commit/prompts/summary-user.md +13 -0
  272. package/src/commit/prompts/types-description.md +2 -0
  273. package/src/commit/shared-llm.ts +70 -0
  274. package/src/commit/types.ts +118 -0
  275. package/src/commit/utils/exclusions.ts +42 -0
  276. package/src/commit/utils.ts +58 -0
  277. package/src/config/api-key-resolver.ts +81 -0
  278. package/src/config/append-only-context-mode.ts +76 -0
  279. package/src/config/config-file.ts +347 -0
  280. package/src/config/inline-tool-descriptors-mode.ts +26 -0
  281. package/src/config/keybindings.ts +703 -0
  282. package/src/config/mcp-schema.json +252 -0
  283. package/src/config/model-discovery.ts +1077 -0
  284. package/src/config/model-registry.ts +2822 -0
  285. package/src/config/model-resolver.ts +2115 -0
  286. package/src/config/model-roles.ts +113 -0
  287. package/src/config/models-config-schema-bundle.ts +315 -0
  288. package/src/config/models-config-schema.ts +14 -0
  289. package/src/config/models-config.ts +130 -0
  290. package/src/config/prompt-templates.ts +205 -0
  291. package/src/config/provider-globals.ts +25 -0
  292. package/src/config/resolve-config-value.ts +95 -0
  293. package/src/config/service-tier.ts +146 -0
  294. package/src/config/settings-schema.ts +5887 -0
  295. package/src/config/settings.ts +2394 -0
  296. package/src/config.ts +242 -0
  297. package/src/cursor-bridge-tools.ts +81 -0
  298. package/src/cursor.ts +960 -0
  299. package/src/dap/client.ts +1043 -0
  300. package/src/dap/config.ts +480 -0
  301. package/src/dap/defaults.json +212 -0
  302. package/src/dap/index.ts +4 -0
  303. package/src/dap/session.ts +1841 -0
  304. package/src/dap/types.ts +611 -0
  305. package/src/debug/index.ts +584 -0
  306. package/src/debug/log-formatting.ts +58 -0
  307. package/src/debug/log-viewer.ts +966 -0
  308. package/src/debug/profiler.ts +168 -0
  309. package/src/debug/protocol-probe.ts +267 -0
  310. package/src/debug/raw-sse-buffer.ts +421 -0
  311. package/src/debug/raw-sse.ts +312 -0
  312. package/src/debug/remote-debugger.ts +151 -0
  313. package/src/debug/report-bundle.ts +411 -0
  314. package/src/debug/system-info.ts +111 -0
  315. package/src/debug/terminal-info.ts +124 -0
  316. package/src/discovery/agent-plugin-format.ts +551 -0
  317. package/src/discovery/agent-plugins.ts +341 -0
  318. package/src/discovery/agents-md.ts +67 -0
  319. package/src/discovery/agents.ts +300 -0
  320. package/src/discovery/at-imports.ts +273 -0
  321. package/src/discovery/builtin-defaults.ts +39 -0
  322. package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
  323. package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
  324. package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
  325. package/src/discovery/builtin-rules/go-ioutil.md +37 -0
  326. package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
  327. package/src/discovery/builtin-rules/go-new-expr.md +44 -0
  328. package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
  329. package/src/discovery/builtin-rules/go-range-int.md +45 -0
  330. package/src/discovery/builtin-rules/index.ts +74 -0
  331. package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
  332. package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
  333. package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
  334. package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
  335. package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
  336. package/src/discovery/builtin-rules/rs-result-type.md +20 -0
  337. package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
  338. package/src/discovery/builtin-rules/ts-import-type.md +43 -0
  339. package/src/discovery/builtin-rules/ts-no-any.md +66 -0
  340. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
  341. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
  342. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
  343. package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
  344. package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
  345. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  346. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  347. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
  348. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  349. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  350. package/src/discovery/builtin.ts +945 -0
  351. package/src/discovery/claude-plugins.ts +640 -0
  352. package/src/discovery/claude.ts +591 -0
  353. package/src/discovery/cline.ts +83 -0
  354. package/src/discovery/codex.ts +553 -0
  355. package/src/discovery/contained-path.ts +78 -0
  356. package/src/discovery/cursor.ts +223 -0
  357. package/src/discovery/gemini.ts +386 -0
  358. package/src/discovery/github.ts +337 -0
  359. package/src/discovery/helpers.ts +1183 -0
  360. package/src/discovery/index.ts +82 -0
  361. package/src/discovery/mcp-json.ts +182 -0
  362. package/src/discovery/omp-extension-roots.ts +272 -0
  363. package/src/discovery/omp-plugins.ts +409 -0
  364. package/src/discovery/opencode.ts +441 -0
  365. package/src/discovery/plugin-dir-roots.ts +28 -0
  366. package/src/discovery/ssh.ts +153 -0
  367. package/src/discovery/substitute-plugin-root.ts +77 -0
  368. package/src/discovery/vscode.ts +106 -0
  369. package/src/discovery/windsurf.ts +149 -0
  370. package/src/edit/apply-patch/index.ts +87 -0
  371. package/src/edit/apply-patch/parser.ts +174 -0
  372. package/src/edit/diff.ts +1008 -0
  373. package/src/edit/edit-clipboard.ts +23 -0
  374. package/src/edit/file-snapshot-store.ts +148 -0
  375. package/src/edit/hashline/block-resolver.ts +33 -0
  376. package/src/edit/hashline/diff.ts +402 -0
  377. package/src/edit/hashline/execute.ts +313 -0
  378. package/src/edit/hashline/filesystem.ts +247 -0
  379. package/src/edit/hashline/index.ts +5 -0
  380. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  381. package/src/edit/hashline/params.ts +12 -0
  382. package/src/edit/index.ts +699 -0
  383. package/src/edit/modes/apply-patch.lark +19 -0
  384. package/src/edit/modes/apply-patch.ts +53 -0
  385. package/src/edit/modes/patch.ts +1958 -0
  386. package/src/edit/modes/replace.ts +1191 -0
  387. package/src/edit/normalize.ts +345 -0
  388. package/src/edit/notebook.ts +242 -0
  389. package/src/edit/read-file.ts +25 -0
  390. package/src/edit/renderer.ts +998 -0
  391. package/src/edit/snapshot-details.ts +77 -0
  392. package/src/edit/streaming.ts +710 -0
  393. package/src/eval/agent-bridge.ts +224 -0
  394. package/src/eval/backend-helpers.ts +48 -0
  395. package/src/eval/backend.ts +71 -0
  396. package/src/eval/bridge-timeout.ts +65 -0
  397. package/src/eval/budget-bridge.ts +48 -0
  398. package/src/eval/completion-bridge.ts +212 -0
  399. package/src/eval/concurrency-bridge.ts +34 -0
  400. package/src/eval/executor-base.ts +562 -0
  401. package/src/eval/idle-timeout.ts +91 -0
  402. package/src/eval/index.ts +6 -0
  403. package/src/eval/jl/executor.ts +551 -0
  404. package/src/eval/jl/index.ts +54 -0
  405. package/src/eval/jl/kernel.ts +236 -0
  406. package/src/eval/jl/prelude.jl +736 -0
  407. package/src/eval/jl/prelude.ts +3 -0
  408. package/src/eval/jl/runner.jl +666 -0
  409. package/src/eval/jl/runtime.ts +118 -0
  410. package/src/eval/js/context-manager.ts +872 -0
  411. package/src/eval/js/executor.ts +178 -0
  412. package/src/eval/js/index.ts +41 -0
  413. package/src/eval/js/process-entry.ts +31 -0
  414. package/src/eval/js/shared/helpers.ts +170 -0
  415. package/src/eval/js/shared/indirect-eval.ts +30 -0
  416. package/src/eval/js/shared/local-module-loader.ts +364 -0
  417. package/src/eval/js/shared/prelude.ts +2 -0
  418. package/src/eval/js/shared/prelude.txt +294 -0
  419. package/src/eval/js/shared/rewrite-imports.ts +550 -0
  420. package/src/eval/js/shared/runtime.ts +590 -0
  421. package/src/eval/js/shared/types.ts +18 -0
  422. package/src/eval/js/tool-bridge.ts +163 -0
  423. package/src/eval/js/worker-core.ts +380 -0
  424. package/src/eval/js/worker-entry.ts +37 -0
  425. package/src/eval/js/worker-protocol.ts +47 -0
  426. package/src/eval/kernel-base.ts +569 -0
  427. package/src/eval/py/display.ts +71 -0
  428. package/src/eval/py/executor.ts +643 -0
  429. package/src/eval/py/index.ts +57 -0
  430. package/src/eval/py/kernel.ts +235 -0
  431. package/src/eval/py/prelude.py +673 -0
  432. package/src/eval/py/prelude.ts +3 -0
  433. package/src/eval/py/runner.py +1425 -0
  434. package/src/eval/py/runtime.ts +276 -0
  435. package/src/eval/py/spawn-options.ts +134 -0
  436. package/src/eval/py/tool-bridge.ts +201 -0
  437. package/src/eval/rb/executor.ts +511 -0
  438. package/src/eval/rb/index.ts +54 -0
  439. package/src/eval/rb/kernel.ts +231 -0
  440. package/src/eval/rb/prelude.rb +551 -0
  441. package/src/eval/rb/prelude.ts +3 -0
  442. package/src/eval/rb/runner.rb +581 -0
  443. package/src/eval/rb/runtime.ts +132 -0
  444. package/src/eval/runtime-env.ts +104 -0
  445. package/src/eval/session-id.ts +8 -0
  446. package/src/eval/types.ts +48 -0
  447. package/src/exa/index.ts +2 -0
  448. package/src/exa/mcp-client.ts +370 -0
  449. package/src/exa/types.ts +69 -0
  450. package/src/exec/bash-executor.ts +627 -0
  451. package/src/exec/direnv.ts +145 -0
  452. package/src/exec/exec.ts +53 -0
  453. package/src/exec/non-interactive-env.ts +118 -0
  454. package/src/export/custom-share.ts +65 -0
  455. package/src/export/html/args.ts +20 -0
  456. package/src/export/html/index.ts +320 -0
  457. package/src/export/html/share-loader.js +102 -0
  458. package/src/export/html/template.css +1355 -0
  459. package/src/export/html/template.html +55 -0
  460. package/src/export/html/template.js +1653 -0
  461. package/src/export/html/tool-views.generated.js +35 -0
  462. package/src/export/html/vendor/highlight.min.js +1213 -0
  463. package/src/export/html/vendor/marked.min.js +6 -0
  464. package/src/export/html/web-palette.ts +126 -0
  465. package/src/export/share.ts +686 -0
  466. package/src/export/ttsr.ts +590 -0
  467. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  468. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  469. package/src/extensibility/custom-commands/index.ts +2 -0
  470. package/src/extensibility/custom-commands/loader.ts +242 -0
  471. package/src/extensibility/custom-commands/types.ts +119 -0
  472. package/src/extensibility/custom-tools/index.ts +7 -0
  473. package/src/extensibility/custom-tools/loader.ts +301 -0
  474. package/src/extensibility/custom-tools/types.ts +287 -0
  475. package/src/extensibility/custom-tools/wrapper.ts +50 -0
  476. package/src/extensibility/extensions/compact-handler.ts +40 -0
  477. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  478. package/src/extensibility/extensions/index.ts +16 -0
  479. package/src/extensibility/extensions/load-errors.ts +13 -0
  480. package/src/extensibility/extensions/loader.ts +663 -0
  481. package/src/extensibility/extensions/managed-timers.ts +83 -0
  482. package/src/extensibility/extensions/model-api.ts +39 -0
  483. package/src/extensibility/extensions/runner.ts +1396 -0
  484. package/src/extensibility/extensions/types.ts +1603 -0
  485. package/src/extensibility/extensions/wrapper.ts +395 -0
  486. package/src/extensibility/hooks/index.ts +6 -0
  487. package/src/extensibility/hooks/loader.ts +243 -0
  488. package/src/extensibility/hooks/runner.ts +425 -0
  489. package/src/extensibility/hooks/tool-wrapper.ts +124 -0
  490. package/src/extensibility/hooks/types.ts +612 -0
  491. package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
  492. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
  493. package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
  494. package/src/extensibility/legacy-typebox.ts +101 -0
  495. package/src/extensibility/plugins/bun-git-cache.ts +91 -0
  496. package/src/extensibility/plugins/doctor.ts +65 -0
  497. package/src/extensibility/plugins/git-url.ts +367 -0
  498. package/src/extensibility/plugins/index.ts +9 -0
  499. package/src/extensibility/plugins/installer.ts +201 -0
  500. package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
  501. package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
  502. package/src/extensibility/plugins/loader.ts +535 -0
  503. package/src/extensibility/plugins/manager.ts +1142 -0
  504. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  505. package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
  506. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  507. package/src/extensibility/plugins/marketplace/manager.ts +927 -0
  508. package/src/extensibility/plugins/marketplace/registry.ts +192 -0
  509. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  510. package/src/extensibility/plugins/marketplace/types.ts +192 -0
  511. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  512. package/src/extensibility/plugins/parser.ts +107 -0
  513. package/src/extensibility/plugins/runtime-config.ts +9 -0
  514. package/src/extensibility/plugins/types.ts +194 -0
  515. package/src/extensibility/session-handler-types.ts +21 -0
  516. package/src/extensibility/shared-events.ts +401 -0
  517. package/src/extensibility/skills.ts +531 -0
  518. package/src/extensibility/slash-commands.ts +131 -0
  519. package/src/extensibility/tool-event-input.ts +80 -0
  520. package/src/extensibility/tool-proxy.ts +28 -0
  521. package/src/extensibility/utils.ts +192 -0
  522. package/src/goals/index.ts +3 -0
  523. package/src/goals/runtime.ts +521 -0
  524. package/src/goals/state.ts +37 -0
  525. package/src/goals/tools/goal-tool.ts +251 -0
  526. package/src/hindsight/backend.ts +354 -0
  527. package/src/hindsight/bank.ts +156 -0
  528. package/src/hindsight/client.ts +680 -0
  529. package/src/hindsight/config.ts +193 -0
  530. package/src/hindsight/content.ts +266 -0
  531. package/src/hindsight/index.ts +8 -0
  532. package/src/hindsight/mental-models.ts +429 -0
  533. package/src/hindsight/seeds.json +32 -0
  534. package/src/hindsight/state.ts +530 -0
  535. package/src/hindsight/transcript.ts +71 -0
  536. package/src/index.ts +66 -0
  537. package/src/internal-urls/agent-protocol.ts +180 -0
  538. package/src/internal-urls/artifact-protocol.ts +151 -0
  539. package/src/internal-urls/docs-index.ts +102 -0
  540. package/src/internal-urls/filesystem-resource.ts +34 -0
  541. package/src/internal-urls/history-protocol.ts +198 -0
  542. package/src/internal-urls/index.ts +28 -0
  543. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  544. package/src/internal-urls/json-query.ts +126 -0
  545. package/src/internal-urls/local-protocol.ts +471 -0
  546. package/src/internal-urls/mcp-protocol.ts +168 -0
  547. package/src/internal-urls/memory-protocol.ts +380 -0
  548. package/src/internal-urls/omp-protocol.ts +94 -0
  549. package/src/internal-urls/parse.ts +103 -0
  550. package/src/internal-urls/registry-helpers.ts +132 -0
  551. package/src/internal-urls/router.ts +153 -0
  552. package/src/internal-urls/rule-protocol.ts +45 -0
  553. package/src/internal-urls/security-protocol.ts +261 -0
  554. package/src/internal-urls/skill-protocol.ts +131 -0
  555. package/src/internal-urls/ssh-protocol.ts +368 -0
  556. package/src/internal-urls/types.ts +196 -0
  557. package/src/internal-urls/vault-protocol.ts +940 -0
  558. package/src/internal-urls/xd-protocol.ts +46 -0
  559. package/src/irc/bus.ts +380 -0
  560. package/src/jsonrpc/message-framing.ts +142 -0
  561. package/src/launch/broker.ts +1368 -0
  562. package/src/launch/client.ts +521 -0
  563. package/src/launch/ensure.ts +73 -0
  564. package/src/launch/paths.ts +14 -0
  565. package/src/launch/presence.ts +82 -0
  566. package/src/launch/protocol.ts +448 -0
  567. package/src/launch/spawn-options.ts +17 -0
  568. package/src/launch/terminal-output-worker-client.ts +53 -0
  569. package/src/launch/terminal-output-worker-protocol.ts +11 -0
  570. package/src/launch/terminal-output-worker.ts +23 -0
  571. package/src/launch/terminal-output.ts +46 -0
  572. package/src/lib/xai-http.ts +150 -0
  573. package/src/live/attestation.ts +91 -0
  574. package/src/live/controller.ts +517 -0
  575. package/src/live/prompts/agent-final-message.md +3 -0
  576. package/src/live/prompts/live-instructions.md +23 -0
  577. package/src/live/protocol.ts +233 -0
  578. package/src/live/transport.ts +422 -0
  579. package/src/live/visualizer.ts +221 -0
  580. package/src/live/voices.ts +18 -0
  581. package/src/lsp/client.ts +1465 -0
  582. package/src/lsp/clients/biome-client.ts +263 -0
  583. package/src/lsp/clients/index.ts +50 -0
  584. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  585. package/src/lsp/clients/swiftlint-client.ts +120 -0
  586. package/src/lsp/config.ts +549 -0
  587. package/src/lsp/defaults.json +499 -0
  588. package/src/lsp/deferred-diagnostics.ts +66 -0
  589. package/src/lsp/diagnostics-ledger.ts +51 -0
  590. package/src/lsp/edits.ts +288 -0
  591. package/src/lsp/format-options.ts +119 -0
  592. package/src/lsp/index.ts +2821 -0
  593. package/src/lsp/lspmux.ts +233 -0
  594. package/src/lsp/mux/daemon.ts +348 -0
  595. package/src/lsp/mux/protocol.ts +96 -0
  596. package/src/lsp/mux/server.ts +797 -0
  597. package/src/lsp/render.ts +668 -0
  598. package/src/lsp/startup-events.ts +13 -0
  599. package/src/lsp/types.ts +479 -0
  600. package/src/lsp/utils.ts +747 -0
  601. package/src/main.ts +1799 -0
  602. package/src/markit/NOTICE +32 -0
  603. package/src/markit/converters/docx.ts +56 -0
  604. package/src/markit/converters/epub.ts +136 -0
  605. package/src/markit/converters/pdf/columns.ts +103 -0
  606. package/src/markit/converters/pdf/extract.ts +598 -0
  607. package/src/markit/converters/pdf/grid.ts +780 -0
  608. package/src/markit/converters/pdf/headers.ts +106 -0
  609. package/src/markit/converters/pdf/index.ts +146 -0
  610. package/src/markit/converters/pdf/render.ts +501 -0
  611. package/src/markit/converters/pdf/types.ts +84 -0
  612. package/src/markit/converters/pptx.ts +325 -0
  613. package/src/markit/converters/xlsx.ts +173 -0
  614. package/src/markit/index.ts +2 -0
  615. package/src/markit/registry.ts +59 -0
  616. package/src/markit/types.ts +35 -0
  617. package/src/mcp/client.ts +511 -0
  618. package/src/mcp/config-writer.ts +377 -0
  619. package/src/mcp/config.ts +385 -0
  620. package/src/mcp/index.ts +29 -0
  621. package/src/mcp/json-rpc.ts +122 -0
  622. package/src/mcp/loader.ts +125 -0
  623. package/src/mcp/manager.ts +1524 -0
  624. package/src/mcp/oauth-credentials.ts +104 -0
  625. package/src/mcp/oauth-discovery.ts +587 -0
  626. package/src/mcp/oauth-flow.ts +830 -0
  627. package/src/mcp/render.ts +214 -0
  628. package/src/mcp/request-id.ts +24 -0
  629. package/src/mcp/smithery-auth.ts +108 -0
  630. package/src/mcp/smithery-connect.ts +154 -0
  631. package/src/mcp/smithery-registry.ts +500 -0
  632. package/src/mcp/startup-events.ts +116 -0
  633. package/src/mcp/timeout.ts +59 -0
  634. package/src/mcp/tool-bridge.ts +691 -0
  635. package/src/mcp/tool-cache.ts +117 -0
  636. package/src/mcp/transports/header-policy.ts +95 -0
  637. package/src/mcp/transports/http.ts +508 -0
  638. package/src/mcp/transports/index.ts +7 -0
  639. package/src/mcp/transports/sse.ts +372 -0
  640. package/src/mcp/transports/stdio.ts +905 -0
  641. package/src/mcp/types.ts +467 -0
  642. package/src/memories/index.ts +1434 -0
  643. package/src/memories/storage.ts +578 -0
  644. package/src/memory-backend/index.ts +19 -0
  645. package/src/memory-backend/local-backend.ts +47 -0
  646. package/src/memory-backend/messages.ts +19 -0
  647. package/src/memory-backend/off-backend.ts +25 -0
  648. package/src/memory-backend/resolve.ts +25 -0
  649. package/src/memory-backend/runtime.ts +66 -0
  650. package/src/memory-backend/tool-names.ts +2 -0
  651. package/src/memory-backend/types.ts +166 -0
  652. package/src/mnemopi/backend.ts +629 -0
  653. package/src/mnemopi/config.ts +267 -0
  654. package/src/mnemopi/embed-client.ts +293 -0
  655. package/src/mnemopi/embed-protocol.ts +35 -0
  656. package/src/mnemopi/embed-worker.ts +114 -0
  657. package/src/mnemopi/index.ts +3 -0
  658. package/src/mnemopi/state.ts +940 -0
  659. package/src/modes/acp/acp-agent.ts +2595 -0
  660. package/src/modes/acp/acp-client-bridge.ts +154 -0
  661. package/src/modes/acp/acp-event-mapper.ts +1084 -0
  662. package/src/modes/acp/acp-mode.ts +48 -0
  663. package/src/modes/acp/index.ts +2 -0
  664. package/src/modes/acp/terminal-auth.ts +37 -0
  665. package/src/modes/components/advisor-config.ts +635 -0
  666. package/src/modes/components/advisor-message.ts +109 -0
  667. package/src/modes/components/agent-dashboard.ts +1252 -0
  668. package/src/modes/components/agent-hub-projection.ts +248 -0
  669. package/src/modes/components/agent-hub-renderer.ts +194 -0
  670. package/src/modes/components/agent-hub.ts +1126 -0
  671. package/src/modes/components/agent-transcript-viewer.ts +647 -0
  672. package/src/modes/components/ask-dialog.ts +1017 -0
  673. package/src/modes/components/assistant-message.ts +978 -0
  674. package/src/modes/components/background-tan-message.ts +36 -0
  675. package/src/modes/components/bash-execution.ts +233 -0
  676. package/src/modes/components/bordered-loader.ts +41 -0
  677. package/src/modes/components/btw-panel.ts +161 -0
  678. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  679. package/src/modes/components/chat-block.ts +111 -0
  680. package/src/modes/components/chat-transcript-builder.ts +518 -0
  681. package/src/modes/components/codex-reset-fireworks.ts +369 -0
  682. package/src/modes/components/collab-prompt-message.ts +32 -0
  683. package/src/modes/components/compaction-summary-message.ts +221 -0
  684. package/src/modes/components/copy-selector.ts +218 -0
  685. package/src/modes/components/countdown-timer.ts +75 -0
  686. package/src/modes/components/custom-editor.ts +1036 -0
  687. package/src/modes/components/custom-message.ts +70 -0
  688. package/src/modes/components/diff.ts +254 -0
  689. package/src/modes/components/dynamic-border.ts +37 -0
  690. package/src/modes/components/error-banner.ts +33 -0
  691. package/src/modes/components/eval-execution.ts +169 -0
  692. package/src/modes/components/execution-shared.ts +101 -0
  693. package/src/modes/components/extensions/extension-dashboard.ts +492 -0
  694. package/src/modes/components/extensions/extension-list.ts +507 -0
  695. package/src/modes/components/extensions/index.ts +9 -0
  696. package/src/modes/components/extensions/inspector-panel.ts +326 -0
  697. package/src/modes/components/extensions/state-manager.ts +648 -0
  698. package/src/modes/components/extensions/types.ts +186 -0
  699. package/src/modes/components/footer.ts +274 -0
  700. package/src/modes/components/history-search.ts +268 -0
  701. package/src/modes/components/hook-editor.ts +213 -0
  702. package/src/modes/components/hook-input.ts +87 -0
  703. package/src/modes/components/hook-message.ts +67 -0
  704. package/src/modes/components/hook-selector.ts +691 -0
  705. package/src/modes/components/index.ts +42 -0
  706. package/src/modes/components/keybinding-hints.ts +56 -0
  707. package/src/modes/components/late-diagnostics-message.ts +60 -0
  708. package/src/modes/components/login-dialog.ts +197 -0
  709. package/src/modes/components/logout-account-selector.ts +130 -0
  710. package/src/modes/components/mcp-add-wizard.ts +1413 -0
  711. package/src/modes/components/message-frame.ts +98 -0
  712. package/src/modes/components/model-browser.ts +888 -0
  713. package/src/modes/components/model-hub.ts +2014 -0
  714. package/src/modes/components/model-picker.ts +237 -0
  715. package/src/modes/components/move-overlay.ts +293 -0
  716. package/src/modes/components/oauth-selector.ts +474 -0
  717. package/src/modes/components/omfg-panel.ts +141 -0
  718. package/src/modes/components/overlay-box.ts +109 -0
  719. package/src/modes/components/pause-screen.ts +208 -0
  720. package/src/modes/components/plan-review-overlay.ts +1226 -0
  721. package/src/modes/components/plan-toc.ts +138 -0
  722. package/src/modes/components/plugin-selector.ts +100 -0
  723. package/src/modes/components/plugin-settings.ts +745 -0
  724. package/src/modes/components/queue-mode-selector.ts +61 -0
  725. package/src/modes/components/read-tool-group.ts +856 -0
  726. package/src/modes/components/reset-usage-selector.ts +161 -0
  727. package/src/modes/components/segment-track.ts +89 -0
  728. package/src/modes/components/select-list-mouse-routing.ts +35 -0
  729. package/src/modes/components/selector-helpers.ts +129 -0
  730. package/src/modes/components/session-account-selector.ts +62 -0
  731. package/src/modes/components/session-selector.ts +1035 -0
  732. package/src/modes/components/settings-defs.ts +267 -0
  733. package/src/modes/components/settings-selector.ts +1445 -0
  734. package/src/modes/components/show-images-selector.ts +50 -0
  735. package/src/modes/components/skill-message.ts +110 -0
  736. package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
  737. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  738. package/src/modes/components/status-line/component.ts +1843 -0
  739. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  740. package/src/modes/components/status-line/git-utils.ts +42 -0
  741. package/src/modes/components/status-line/index.ts +5 -0
  742. package/src/modes/components/status-line/presets.ts +106 -0
  743. package/src/modes/components/status-line/segments.ts +710 -0
  744. package/src/modes/components/status-line/separators.ts +55 -0
  745. package/src/modes/components/status-line/types.ts +159 -0
  746. package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
  747. package/src/modes/components/theme-selector.ts +68 -0
  748. package/src/modes/components/thinking-selector.ts +57 -0
  749. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  750. package/src/modes/components/tips.txt +26 -0
  751. package/src/modes/components/todo-reminder.ts +43 -0
  752. package/src/modes/components/tool-execution.ts +1467 -0
  753. package/src/modes/components/transcript-container.ts +527 -0
  754. package/src/modes/components/tree-selector.ts +1006 -0
  755. package/src/modes/components/ttsr-notification.ts +123 -0
  756. package/src/modes/components/usage-row.ts +52 -0
  757. package/src/modes/components/user-message-selector.ts +227 -0
  758. package/src/modes/components/user-message.ts +167 -0
  759. package/src/modes/components/visual-truncate.ts +63 -0
  760. package/src/modes/components/welcome.ts +578 -0
  761. package/src/modes/controllers/btw-controller.ts +246 -0
  762. package/src/modes/controllers/command-controller-shared.ts +109 -0
  763. package/src/modes/controllers/command-controller.ts +2024 -0
  764. package/src/modes/controllers/event-controller.ts +2173 -0
  765. package/src/modes/controllers/extension-ui-controller.ts +1243 -0
  766. package/src/modes/controllers/input-controller.ts +2037 -0
  767. package/src/modes/controllers/live-command-controller.ts +261 -0
  768. package/src/modes/controllers/mcp-command-controller.ts +2552 -0
  769. package/src/modes/controllers/omfg-controller.ts +287 -0
  770. package/src/modes/controllers/omfg-rule.ts +647 -0
  771. package/src/modes/controllers/selector-controller.ts +2058 -0
  772. package/src/modes/controllers/session-focus-controller.ts +117 -0
  773. package/src/modes/controllers/ssh-command-controller.ts +385 -0
  774. package/src/modes/controllers/streaming-reveal.ts +399 -0
  775. package/src/modes/controllers/tan-command-controller.ts +243 -0
  776. package/src/modes/controllers/todo-command-controller.ts +487 -0
  777. package/src/modes/controllers/tool-args-reveal.ts +591 -0
  778. package/src/modes/data/emojis.json +1 -0
  779. package/src/modes/emoji-autocomplete.ts +285 -0
  780. package/src/modes/github-ref-autocomplete.ts +75 -0
  781. package/src/modes/gradient-highlight.ts +99 -0
  782. package/src/modes/image-references.ts +137 -0
  783. package/src/modes/index.ts +10 -0
  784. package/src/modes/interactive-mode.ts +5055 -0
  785. package/src/modes/internal-url-autocomplete.ts +158 -0
  786. package/src/modes/loop-limit.ts +192 -0
  787. package/src/modes/magic-keyword-boundary.ts +23 -0
  788. package/src/modes/magic-keywords.ts +42 -0
  789. package/src/modes/markdown-prose.ts +247 -0
  790. package/src/modes/oauth-manual-input.ts +69 -0
  791. package/src/modes/orchestrate.ts +43 -0
  792. package/src/modes/print-mode.ts +282 -0
  793. package/src/modes/prompt-action-autocomplete.ts +322 -0
  794. package/src/modes/queue-input.ts +132 -0
  795. package/src/modes/rpc/host-tools.ts +204 -0
  796. package/src/modes/rpc/host-uris.ts +241 -0
  797. package/src/modes/rpc/rpc-client.ts +1213 -0
  798. package/src/modes/rpc/rpc-frame.ts +316 -0
  799. package/src/modes/rpc/rpc-input.ts +38 -0
  800. package/src/modes/rpc/rpc-messages.ts +127 -0
  801. package/src/modes/rpc/rpc-mode.ts +1519 -0
  802. package/src/modes/rpc/rpc-subagents.ts +265 -0
  803. package/src/modes/rpc/rpc-types.ts +544 -0
  804. package/src/modes/running-subagent-badge.ts +13 -0
  805. package/src/modes/runtime-init.ts +144 -0
  806. package/src/modes/session-observer-registry.ts +223 -0
  807. package/src/modes/session-teardown.ts +82 -0
  808. package/src/modes/setup-version.ts +11 -0
  809. package/src/modes/setup-wizard/index.ts +103 -0
  810. package/src/modes/setup-wizard/lazy.ts +16 -0
  811. package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
  812. package/src/modes/setup-wizard/scenes/model.ts +132 -0
  813. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  814. package/src/modes/setup-wizard/scenes/providers.ts +105 -0
  815. package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
  816. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  817. package/src/modes/setup-wizard/scenes/theme.ts +330 -0
  818. package/src/modes/setup-wizard/scenes/types.ts +65 -0
  819. package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
  820. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  821. package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
  822. package/src/modes/shared.ts +49 -0
  823. package/src/modes/skill-command.ts +91 -0
  824. package/src/modes/theme/dark.json +95 -0
  825. package/src/modes/theme/defaults/alabaster.json +93 -0
  826. package/src/modes/theme/defaults/amethyst.json +96 -0
  827. package/src/modes/theme/defaults/anthracite.json +93 -0
  828. package/src/modes/theme/defaults/basalt.json +91 -0
  829. package/src/modes/theme/defaults/birch.json +95 -0
  830. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  831. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  832. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  833. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  834. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  835. package/src/modes/theme/defaults/dark-copper.json +95 -0
  836. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  837. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  838. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  839. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  840. package/src/modes/theme/defaults/dark-ember.json +95 -0
  841. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  842. package/src/modes/theme/defaults/dark-forest.json +96 -0
  843. package/src/modes/theme/defaults/dark-github.json +105 -0
  844. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  845. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  846. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  847. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  848. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  849. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  850. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  851. package/src/modes/theme/defaults/dark-nord.json +97 -0
  852. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  853. package/src/modes/theme/defaults/dark-one.json +100 -0
  854. package/src/modes/theme/defaults/dark-poimandres.json +143 -0
  855. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  856. package/src/modes/theme/defaults/dark-reef.json +91 -0
  857. package/src/modes/theme/defaults/dark-retro.json +92 -0
  858. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  859. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  860. package/src/modes/theme/defaults/dark-slate.json +95 -0
  861. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  862. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  863. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  864. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  865. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  866. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  867. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  868. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  869. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  870. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  871. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  872. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  873. package/src/modes/theme/defaults/graphite.json +92 -0
  874. package/src/modes/theme/defaults/index.ts +199 -0
  875. package/src/modes/theme/defaults/light-arctic.json +107 -0
  876. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  877. package/src/modes/theme/defaults/light-canyon.json +91 -0
  878. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  879. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  880. package/src/modes/theme/defaults/light-coral.json +95 -0
  881. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  882. package/src/modes/theme/defaults/light-dawn.json +90 -0
  883. package/src/modes/theme/defaults/light-dunes.json +91 -0
  884. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  885. package/src/modes/theme/defaults/light-forest.json +100 -0
  886. package/src/modes/theme/defaults/light-frost.json +95 -0
  887. package/src/modes/theme/defaults/light-github.json +115 -0
  888. package/src/modes/theme/defaults/light-glacier.json +91 -0
  889. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  890. package/src/modes/theme/defaults/light-haze.json +90 -0
  891. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  892. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  893. package/src/modes/theme/defaults/light-lavender.json +95 -0
  894. package/src/modes/theme/defaults/light-meadow.json +91 -0
  895. package/src/modes/theme/defaults/light-mint.json +95 -0
  896. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  897. package/src/modes/theme/defaults/light-ocean.json +99 -0
  898. package/src/modes/theme/defaults/light-one.json +99 -0
  899. package/src/modes/theme/defaults/light-opal.json +91 -0
  900. package/src/modes/theme/defaults/light-orchard.json +91 -0
  901. package/src/modes/theme/defaults/light-paper.json +95 -0
  902. package/src/modes/theme/defaults/light-poimandres.json +143 -0
  903. package/src/modes/theme/defaults/light-prism.json +90 -0
  904. package/src/modes/theme/defaults/light-retro.json +98 -0
  905. package/src/modes/theme/defaults/light-sand.json +95 -0
  906. package/src/modes/theme/defaults/light-savanna.json +91 -0
  907. package/src/modes/theme/defaults/light-solarized.json +102 -0
  908. package/src/modes/theme/defaults/light-soleil.json +90 -0
  909. package/src/modes/theme/defaults/light-sunset.json +99 -0
  910. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  911. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  912. package/src/modes/theme/defaults/light-wetland.json +91 -0
  913. package/src/modes/theme/defaults/light-zenith.json +89 -0
  914. package/src/modes/theme/defaults/limestone.json +94 -0
  915. package/src/modes/theme/defaults/mahogany.json +97 -0
  916. package/src/modes/theme/defaults/marble.json +93 -0
  917. package/src/modes/theme/defaults/obsidian.json +91 -0
  918. package/src/modes/theme/defaults/onyx.json +91 -0
  919. package/src/modes/theme/defaults/pearl.json +93 -0
  920. package/src/modes/theme/defaults/porcelain.json +91 -0
  921. package/src/modes/theme/defaults/quartz.json +96 -0
  922. package/src/modes/theme/defaults/sandstone.json +95 -0
  923. package/src/modes/theme/defaults/titanium.json +90 -0
  924. package/src/modes/theme/light.json +93 -0
  925. package/src/modes/theme/mermaid-cache.ts +92 -0
  926. package/src/modes/theme/shimmer.ts +305 -0
  927. package/src/modes/theme/theme-schema.json +463 -0
  928. package/src/modes/theme/theme.ts +3171 -0
  929. package/src/modes/turn-budget.ts +31 -0
  930. package/src/modes/types.ts +494 -0
  931. package/src/modes/ultrathink.ts +42 -0
  932. package/src/modes/utils/context-usage.ts +518 -0
  933. package/src/modes/utils/copy-targets.ts +378 -0
  934. package/src/modes/utils/hotkeys-markdown.ts +65 -0
  935. package/src/modes/utils/interactive-context-helpers.ts +31 -0
  936. package/src/modes/utils/keybinding-matchers.ts +86 -0
  937. package/src/modes/utils/tools-markdown.ts +31 -0
  938. package/src/modes/utils/transcript-render-helpers.ts +253 -0
  939. package/src/modes/utils/ui-helpers.ts +976 -0
  940. package/src/modes/warp-events.ts +232 -0
  941. package/src/modes/workflow.ts +55 -0
  942. package/src/plan-mode/approved-plan.ts +194 -0
  943. package/src/plan-mode/model-transition.ts +51 -0
  944. package/src/plan-mode/plan-files.ts +40 -0
  945. package/src/plan-mode/plan-handoff.ts +37 -0
  946. package/src/plan-mode/plan-protection.ts +31 -0
  947. package/src/plan-mode/state.ts +6 -0
  948. package/src/priority.json +60 -0
  949. package/src/prompts/advisor/active-repo-watchdog.md +6 -0
  950. package/src/prompts/advisor/advise-tool.md +3 -0
  951. package/src/prompts/advisor/context-files.md +8 -0
  952. package/src/prompts/advisor/system.md +98 -0
  953. package/src/prompts/agents/designer.md +74 -0
  954. package/src/prompts/agents/frontmatter.md +12 -0
  955. package/src/prompts/agents/init.md +33 -0
  956. package/src/prompts/agents/librarian.md +119 -0
  957. package/src/prompts/agents/reviewer.md +139 -0
  958. package/src/prompts/agents/scout.md +58 -0
  959. package/src/prompts/agents/security-reviewer.md +75 -0
  960. package/src/prompts/agents/task.md +17 -0
  961. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  962. package/src/prompts/bench/cache-prefix.md +3 -0
  963. package/src/prompts/bench/cache-suffix.md +1 -0
  964. package/src/prompts/bench.md +6 -0
  965. package/src/prompts/ci-green-request.md +36 -0
  966. package/src/prompts/dry-balance-bench.md +8 -0
  967. package/src/prompts/goals/goal-budget-limit.md +16 -0
  968. package/src/prompts/goals/goal-continuation.md +28 -0
  969. package/src/prompts/goals/goal-mode-active.md +23 -0
  970. package/src/prompts/goals/goal-mode-context.md +4 -0
  971. package/src/prompts/goals/goal-todo-context.md +12 -0
  972. package/src/prompts/goals/guided-goal-interview.md +43 -0
  973. package/src/prompts/memories/consolidation.md +30 -0
  974. package/src/prompts/memories/consolidation_system.md +4 -0
  975. package/src/prompts/memories/read-path.md +17 -0
  976. package/src/prompts/memories/stage_one_input.md +6 -0
  977. package/src/prompts/memories/stage_one_system.md +21 -0
  978. package/src/prompts/review-custom-request.md +21 -0
  979. package/src/prompts/review-headless-request.md +16 -0
  980. package/src/prompts/review-request.md +68 -0
  981. package/src/prompts/security/scan-coordinator.md +7 -0
  982. package/src/prompts/security/scan-request.md +21 -0
  983. package/src/prompts/security/validate-request.md +8 -0
  984. package/src/prompts/session/launch-completion.md +1 -0
  985. package/src/prompts/skills/autoload.md +8 -0
  986. package/src/prompts/skills/user-invocation.md +11 -0
  987. package/src/prompts/steering/parent-irc.md +5 -0
  988. package/src/prompts/steering/user-interjection.md +6 -0
  989. package/src/prompts/system/active-repo-context.md +4 -0
  990. package/src/prompts/system/agent-creation-architect.md +50 -0
  991. package/src/prompts/system/agent-creation-user.md +6 -0
  992. package/src/prompts/system/auto-continue.md +1 -0
  993. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  994. package/src/prompts/system/auto-thinking-difficulty.md +14 -0
  995. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  996. package/src/prompts/system/autolearn-guidance.md +7 -0
  997. package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
  998. package/src/prompts/system/background-tan-dispatch.md +8 -0
  999. package/src/prompts/system/btw-user.md +8 -0
  1000. package/src/prompts/system/commit-message-system.md +14 -0
  1001. package/src/prompts/system/computer-safety.md +14 -0
  1002. package/src/prompts/system/custom-system-prompt.md +64 -0
  1003. package/src/prompts/system/eager-task.md +7 -0
  1004. package/src/prompts/system/eager-todo.md +18 -0
  1005. package/src/prompts/system/empty-stop-retry.md +4 -0
  1006. package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
  1007. package/src/prompts/system/interrupted-thinking.md +7 -0
  1008. package/src/prompts/system/irc-autoreply.md +6 -0
  1009. package/src/prompts/system/irc-incoming.md +9 -0
  1010. package/src/prompts/system/manual-continue.md +7 -0
  1011. package/src/prompts/system/mcp-xdev-guidance.md +11 -0
  1012. package/src/prompts/system/memory-consolidation-system.md +8 -0
  1013. package/src/prompts/system/memory-extraction-system.md +26 -0
  1014. package/src/prompts/system/mid-run-todo-nudge.md +3 -0
  1015. package/src/prompts/system/omfg-user.md +50 -0
  1016. package/src/prompts/system/orchestrate-notice.md +40 -0
  1017. package/src/prompts/system/personalities/default.md +18 -0
  1018. package/src/prompts/system/personalities/friendly.md +17 -0
  1019. package/src/prompts/system/personalities/pragmatic.md +15 -0
  1020. package/src/prompts/system/plan-mode-active.md +125 -0
  1021. package/src/prompts/system/plan-mode-approved.md +22 -0
  1022. package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
  1023. package/src/prompts/system/plan-mode-reference.md +10 -0
  1024. package/src/prompts/system/plan-mode-subagent.md +33 -0
  1025. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  1026. package/src/prompts/system/plan-yolo-handoff.md +5 -0
  1027. package/src/prompts/system/prewalk-checklist.md +7 -0
  1028. package/src/prompts/system/prewalk-continue.md +1 -0
  1029. package/src/prompts/system/prewalk-plan.md +13 -0
  1030. package/src/prompts/system/project-prompt.md +61 -0
  1031. package/src/prompts/system/recap-user.md +9 -0
  1032. package/src/prompts/system/resolve-device-reminder.md +3 -0
  1033. package/src/prompts/system/rewind-report.md +6 -0
  1034. package/src/prompts/system/side-channel-no-tools.md +3 -0
  1035. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  1036. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  1037. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  1038. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  1039. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  1040. package/src/prompts/system/speech-rewrite.md +15 -0
  1041. package/src/prompts/system/subagent-async-pending.md +6 -0
  1042. package/src/prompts/system/subagent-system-prompt.md +73 -0
  1043. package/src/prompts/system/subagent-user-prompt.md +3 -0
  1044. package/src/prompts/system/subagent-yield-reminder.md +23 -0
  1045. package/src/prompts/system/system-prompt.md +263 -0
  1046. package/src/prompts/system/tan-context-switch.md +17 -0
  1047. package/src/prompts/system/task-label.md +23 -0
  1048. package/src/prompts/system/thinking-loop-redirect.md +10 -0
  1049. package/src/prompts/system/title-marker-instruction.md +1 -0
  1050. package/src/prompts/system/title-system.md +16 -0
  1051. package/src/prompts/system/tool-call-loop-redirect.md +8 -0
  1052. package/src/prompts/system/ttsr-interrupt.md +7 -0
  1053. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  1054. package/src/prompts/system/ultrathink-notice.md +3 -0
  1055. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  1056. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  1057. package/src/prompts/system/vibe-mode-active.md +26 -0
  1058. package/src/prompts/system/web-search.md +25 -0
  1059. package/src/prompts/system/workflow-notice.md +112 -0
  1060. package/src/prompts/system/xdev-mount-notice.md +20 -0
  1061. package/src/prompts/tools/apply-patch.md +65 -0
  1062. package/src/prompts/tools/ask.md +22 -0
  1063. package/src/prompts/tools/ast-edit.md +11 -0
  1064. package/src/prompts/tools/ast-grep.md +19 -0
  1065. package/src/prompts/tools/async-result.md +8 -0
  1066. package/src/prompts/tools/bash.md +23 -0
  1067. package/src/prompts/tools/browser.md +29 -0
  1068. package/src/prompts/tools/checkpoint.md +15 -0
  1069. package/src/prompts/tools/computer.md +26 -0
  1070. package/src/prompts/tools/debug.md +3 -0
  1071. package/src/prompts/tools/eval.md +45 -0
  1072. package/src/prompts/tools/github.md +22 -0
  1073. package/src/prompts/tools/glob.md +16 -0
  1074. package/src/prompts/tools/goal.md +11 -0
  1075. package/src/prompts/tools/grep.md +13 -0
  1076. package/src/prompts/tools/hub.md +34 -0
  1077. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  1078. package/src/prompts/tools/image-attachment-describe.md +10 -0
  1079. package/src/prompts/tools/image-gen.md +7 -0
  1080. package/src/prompts/tools/inspect-image-system.md +20 -0
  1081. package/src/prompts/tools/inspect-image.md +22 -0
  1082. package/src/prompts/tools/learn.md +7 -0
  1083. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  1084. package/src/prompts/tools/lsp.md +19 -0
  1085. package/src/prompts/tools/manage-skill.md +9 -0
  1086. package/src/prompts/tools/memory-edit.md +12 -0
  1087. package/src/prompts/tools/patch.md +57 -0
  1088. package/src/prompts/tools/read.md +27 -0
  1089. package/src/prompts/tools/recall.md +7 -0
  1090. package/src/prompts/tools/reflect.md +5 -0
  1091. package/src/prompts/tools/replace.md +30 -0
  1092. package/src/prompts/tools/retain.md +6 -0
  1093. package/src/prompts/tools/rewind.md +14 -0
  1094. package/src/prompts/tools/security-publish.md +1 -0
  1095. package/src/prompts/tools/security-scan.md +1 -0
  1096. package/src/prompts/tools/task-async-contract.md +1 -0
  1097. package/src/prompts/tools/task-summary.md +20 -0
  1098. package/src/prompts/tools/task.md +83 -0
  1099. package/src/prompts/tools/todo.md +42 -0
  1100. package/src/prompts/tools/vibe-kill.md +3 -0
  1101. package/src/prompts/tools/vibe-list.md +3 -0
  1102. package/src/prompts/tools/vibe-send.md +9 -0
  1103. package/src/prompts/tools/vibe-spawn.md +10 -0
  1104. package/src/prompts/tools/vibe-turn-result.md +19 -0
  1105. package/src/prompts/tools/vibe-wait.md +8 -0
  1106. package/src/prompts/tools/web-search.md +8 -0
  1107. package/src/prompts/tools/write.md +14 -0
  1108. package/src/registry/agent-lifecycle.ts +505 -0
  1109. package/src/registry/agent-registry.ts +287 -0
  1110. package/src/registry/persisted-agents.ts +423 -0
  1111. package/src/sdk.ts +3820 -0
  1112. package/src/secrets/index.ts +375 -0
  1113. package/src/secrets/obfuscator.ts +2629 -0
  1114. package/src/secrets/regex.ts +21 -0
  1115. package/src/security/auth.ts +98 -0
  1116. package/src/security/cloud.ts +686 -0
  1117. package/src/security/comparison.ts +255 -0
  1118. package/src/security/contracts/ids.ts +111 -0
  1119. package/src/security/contracts/index.ts +4 -0
  1120. package/src/security/contracts/schemas.ts +219 -0
  1121. package/src/security/contracts/types.ts +254 -0
  1122. package/src/security/contracts/validation.ts +69 -0
  1123. package/src/security/coordinator.ts +708 -0
  1124. package/src/security/importers/codex-security.ts +387 -0
  1125. package/src/security/importers/index.ts +2 -0
  1126. package/src/security/importers/sarif.ts +357 -0
  1127. package/src/security/index.ts +13 -0
  1128. package/src/security/preflight.ts +405 -0
  1129. package/src/security/provenance.ts +106 -0
  1130. package/src/security/publication.ts +326 -0
  1131. package/src/security/remediation.ts +93 -0
  1132. package/src/security/resource-output.ts +50 -0
  1133. package/src/security/sarif.ts +78 -0
  1134. package/src/security/store.ts +430 -0
  1135. package/src/session/acp-permission-gate.ts +165 -0
  1136. package/src/session/agent-session-events.ts +67 -0
  1137. package/src/session/agent-session-types.ts +407 -0
  1138. package/src/session/agent-session.ts +9000 -0
  1139. package/src/session/agent-storage.ts +807 -0
  1140. package/src/session/artifacts.ts +154 -0
  1141. package/src/session/async-job-delivery.ts +82 -0
  1142. package/src/session/auth-broker-config.ts +92 -0
  1143. package/src/session/auth-storage.ts +25 -0
  1144. package/src/session/bash-runner.ts +326 -0
  1145. package/src/session/blob-store.ts +295 -0
  1146. package/src/session/checkpoint-entries.ts +81 -0
  1147. package/src/session/claude-session-store.ts +426 -0
  1148. package/src/session/client-bridge.ts +85 -0
  1149. package/src/session/codex-auto-reset.ts +673 -0
  1150. package/src/session/codex-session-store.ts +673 -0
  1151. package/src/session/compact-modes.ts +105 -0
  1152. package/src/session/credential-pin.ts +93 -0
  1153. package/src/session/eval-runner.ts +219 -0
  1154. package/src/session/exit-diagnostics.ts +310 -0
  1155. package/src/session/foreign-session-import.ts +52 -0
  1156. package/src/session/foreign-session-jsonl.ts +29 -0
  1157. package/src/session/foreign-session-store.ts +26 -0
  1158. package/src/session/history-storage.ts +329 -0
  1159. package/src/session/indexed-session-storage.ts +553 -0
  1160. package/src/session/irc-bridge.ts +203 -0
  1161. package/src/session/launch-completion.ts +37 -0
  1162. package/src/session/messages.ts +1304 -0
  1163. package/src/session/model-controls.ts +757 -0
  1164. package/src/session/prewalk.ts +279 -0
  1165. package/src/session/provider-image-budget.ts +86 -0
  1166. package/src/session/queued-messages.ts +99 -0
  1167. package/src/session/redis-session-storage.ts +257 -0
  1168. package/src/session/retry-fallback-chains.ts +455 -0
  1169. package/src/session/role-models.ts +85 -0
  1170. package/src/session/session-advisors.ts +1896 -0
  1171. package/src/session/session-context.ts +584 -0
  1172. package/src/session/session-dump-format.ts +216 -0
  1173. package/src/session/session-entries.ts +306 -0
  1174. package/src/session/session-handoff.ts +325 -0
  1175. package/src/session/session-history-format.ts +459 -0
  1176. package/src/session/session-listing.ts +715 -0
  1177. package/src/session/session-loader.ts +362 -0
  1178. package/src/session/session-maintenance.ts +3115 -0
  1179. package/src/session/session-manager.ts +2747 -0
  1180. package/src/session/session-memory.ts +222 -0
  1181. package/src/session/session-metadata.ts +53 -0
  1182. package/src/session/session-migrations.ts +78 -0
  1183. package/src/session/session-paths.ts +280 -0
  1184. package/src/session/session-persistence.ts +293 -0
  1185. package/src/session/session-provider-boundary.ts +306 -0
  1186. package/src/session/session-stats.ts +349 -0
  1187. package/src/session/session-storage.ts +774 -0
  1188. package/src/session/session-title-slot.ts +141 -0
  1189. package/src/session/session-tools.ts +1385 -0
  1190. package/src/session/session-workspace.ts +53 -0
  1191. package/src/session/settings-stream-fn.ts +79 -0
  1192. package/src/session/shake-types.ts +43 -0
  1193. package/src/session/snapcompact-inline.ts +545 -0
  1194. package/src/session/snapcompact-savings-journal.ts +113 -0
  1195. package/src/session/sql-session-storage.ts +374 -0
  1196. package/src/session/stream-guards.ts +417 -0
  1197. package/src/session/streaming-output.ts +1459 -0
  1198. package/src/session/todo-tracker.ts +380 -0
  1199. package/src/session/tool-choice-queue.ts +305 -0
  1200. package/src/session/ttsr-coordinator.ts +496 -0
  1201. package/src/session/turn-persistence.ts +142 -0
  1202. package/src/session/turn-recovery.ts +2005 -0
  1203. package/src/session/unexpected-stop-classifier.ts +141 -0
  1204. package/src/session/yield-queue.ts +288 -0
  1205. package/src/slash-commands/acp-builtins.ts +70 -0
  1206. package/src/slash-commands/available-commands.ts +105 -0
  1207. package/src/slash-commands/builtin-registry.ts +3149 -0
  1208. package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
  1209. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  1210. package/src/slash-commands/helpers/context-report.ts +66 -0
  1211. package/src/slash-commands/helpers/format.ts +46 -0
  1212. package/src/slash-commands/helpers/logout.ts +108 -0
  1213. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  1214. package/src/slash-commands/helpers/mcp.ts +533 -0
  1215. package/src/slash-commands/helpers/parse.ts +85 -0
  1216. package/src/slash-commands/helpers/reset-usage.ts +68 -0
  1217. package/src/slash-commands/helpers/security.ts +451 -0
  1218. package/src/slash-commands/helpers/session-pin.ts +44 -0
  1219. package/src/slash-commands/helpers/ssh.ts +196 -0
  1220. package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
  1221. package/src/slash-commands/helpers/todo.ts +285 -0
  1222. package/src/slash-commands/helpers/usage-report.ts +198 -0
  1223. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  1224. package/src/slash-commands/types.ts +139 -0
  1225. package/src/ssh/config-writer.ts +183 -0
  1226. package/src/ssh/connection-manager.ts +667 -0
  1227. package/src/ssh/file-transfer.ts +214 -0
  1228. package/src/ssh/sshfs-mount.ts +163 -0
  1229. package/src/ssh/utils.ts +51 -0
  1230. package/src/startup-splash.ts +19 -0
  1231. package/src/stt/asr-client.ts +401 -0
  1232. package/src/stt/asr-protocol.ts +65 -0
  1233. package/src/stt/asr-worker.ts +603 -0
  1234. package/src/stt/downloader.ts +142 -0
  1235. package/src/stt/endpointer.ts +259 -0
  1236. package/src/stt/index.ts +6 -0
  1237. package/src/stt/models.ts +150 -0
  1238. package/src/stt/sherpa-runtime.ts +71 -0
  1239. package/src/stt/stt-controller.ts +320 -0
  1240. package/src/stt/submit-trigger.ts +74 -0
  1241. package/src/subprocess/worker-client.ts +463 -0
  1242. package/src/subprocess/worker-runtime.ts +494 -0
  1243. package/src/system-prompt.ts +921 -0
  1244. package/src/task/agents.ts +170 -0
  1245. package/src/task/commands.ts +132 -0
  1246. package/src/task/discovery.ts +145 -0
  1247. package/src/task/executor.ts +3431 -0
  1248. package/src/task/index.ts +1515 -0
  1249. package/src/task/isolation-ownership.ts +106 -0
  1250. package/src/task/isolation-runner.ts +444 -0
  1251. package/src/task/label.ts +40 -0
  1252. package/src/task/name-generator.ts +1577 -0
  1253. package/src/task/omp-command.ts +26 -0
  1254. package/src/task/output-manager.ts +115 -0
  1255. package/src/task/parallel.ts +221 -0
  1256. package/src/task/persisted-revive.ts +173 -0
  1257. package/src/task/prewalk.ts +6 -0
  1258. package/src/task/prompt-policy.ts +8 -0
  1259. package/src/task/provider-concurrency.ts +100 -0
  1260. package/src/task/read-only-policy.ts +27 -0
  1261. package/src/task/render.ts +1830 -0
  1262. package/src/task/renderer.ts +14 -0
  1263. package/src/task/repair-args.ts +118 -0
  1264. package/src/task/spawn-policy.ts +72 -0
  1265. package/src/task/structured-subagent.ts +676 -0
  1266. package/src/task/subprocess-tool-registry.ts +88 -0
  1267. package/src/task/types.ts +555 -0
  1268. package/src/task/worktree.ts +967 -0
  1269. package/src/task/yield-assembly.ts +198 -0
  1270. package/src/telemetry-export.ts +504 -0
  1271. package/src/thinking.ts +377 -0
  1272. package/src/tiny/device.ts +111 -0
  1273. package/src/tiny/dtype.ts +101 -0
  1274. package/src/tiny/message-preproc.ts +155 -0
  1275. package/src/tiny/models.ts +268 -0
  1276. package/src/tiny/text.ts +290 -0
  1277. package/src/tiny/title-client.ts +460 -0
  1278. package/src/tiny/title-protocol.ts +56 -0
  1279. package/src/tiny/worker.ts +354 -0
  1280. package/src/tools/acp-bridge.ts +125 -0
  1281. package/src/tools/approval.ts +245 -0
  1282. package/src/tools/ask.ts +1459 -0
  1283. package/src/tools/ast-edit.ts +718 -0
  1284. package/src/tools/ast-grep.ts +526 -0
  1285. package/src/tools/auto-generated-guard.ts +335 -0
  1286. package/src/tools/bash-interactive.ts +435 -0
  1287. package/src/tools/bash-interceptor.ts +148 -0
  1288. package/src/tools/bash-pty-selection.ts +14 -0
  1289. package/src/tools/bash-skill-urls.ts +350 -0
  1290. package/src/tools/bash.ts +1826 -0
  1291. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  1292. package/src/tools/browser/aria/aria-snapshot.ts +131 -0
  1293. package/src/tools/browser/attach.ts +219 -0
  1294. package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
  1295. package/src/tools/browser/cmux/rpc.ts +200 -0
  1296. package/src/tools/browser/cmux/socket-client.ts +445 -0
  1297. package/src/tools/browser/launch.ts +939 -0
  1298. package/src/tools/browser/readable.ts +112 -0
  1299. package/src/tools/browser/registry.ts +447 -0
  1300. package/src/tools/browser/relay/bridge.ts +945 -0
  1301. package/src/tools/browser/relay/daemon.ts +117 -0
  1302. package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
  1303. package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
  1304. package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
  1305. package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
  1306. package/src/tools/browser/relay/kind.ts +41 -0
  1307. package/src/tools/browser/relay/protocol.ts +54 -0
  1308. package/src/tools/browser/relay/server.ts +141 -0
  1309. package/src/tools/browser/render.ts +229 -0
  1310. package/src/tools/browser/run-output.ts +76 -0
  1311. package/src/tools/browser/shared-daemon.ts +139 -0
  1312. package/src/tools/browser/tab-protocol.ts +123 -0
  1313. package/src/tools/browser/tab-supervisor.ts +1077 -0
  1314. package/src/tools/browser/tab-worker-entry.ts +29 -0
  1315. package/src/tools/browser/tab-worker.ts +1982 -0
  1316. package/src/tools/browser.ts +487 -0
  1317. package/src/tools/builtin-names.ts +67 -0
  1318. package/src/tools/checkpoint.ts +137 -0
  1319. package/src/tools/computer/exposure.ts +14 -0
  1320. package/src/tools/computer/protocol.ts +69 -0
  1321. package/src/tools/computer/supervisor.ts +409 -0
  1322. package/src/tools/computer/worker-entry.ts +39 -0
  1323. package/src/tools/computer/worker.ts +745 -0
  1324. package/src/tools/computer-renderer.ts +147 -0
  1325. package/src/tools/computer.ts +222 -0
  1326. package/src/tools/conflict-detect.ts +815 -0
  1327. package/src/tools/context.ts +49 -0
  1328. package/src/tools/debug.ts +1121 -0
  1329. package/src/tools/default-renderer.ts +154 -0
  1330. package/src/tools/essential-tools.ts +46 -0
  1331. package/src/tools/eval-backends.ts +34 -0
  1332. package/src/tools/eval-format/index.ts +24 -0
  1333. package/src/tools/eval-format/javascript.ts +952 -0
  1334. package/src/tools/eval-format/julia.ts +446 -0
  1335. package/src/tools/eval-format/python.ts +544 -0
  1336. package/src/tools/eval-format/ruby.ts +380 -0
  1337. package/src/tools/eval-render.ts +784 -0
  1338. package/src/tools/eval.ts +774 -0
  1339. package/src/tools/fetch.ts +1889 -0
  1340. package/src/tools/file-recorder.ts +35 -0
  1341. package/src/tools/fs-cache-invalidation.ts +28 -0
  1342. package/src/tools/gh-cache-invalidation.ts +175 -0
  1343. package/src/tools/gh-format.ts +12 -0
  1344. package/src/tools/gh-renderer.ts +484 -0
  1345. package/src/tools/gh.ts +3958 -0
  1346. package/src/tools/github-cache.ts +663 -0
  1347. package/src/tools/glob.ts +691 -0
  1348. package/src/tools/grep.ts +1920 -0
  1349. package/src/tools/grouped-file-output.ts +210 -0
  1350. package/src/tools/hub/index.ts +579 -0
  1351. package/src/tools/hub/jobs.ts +714 -0
  1352. package/src/tools/hub/launch.ts +690 -0
  1353. package/src/tools/hub/messaging.ts +735 -0
  1354. package/src/tools/hub/types.ts +117 -0
  1355. package/src/tools/image-gen.ts +1689 -0
  1356. package/src/tools/image-providers.ts +50 -0
  1357. package/src/tools/index.ts +736 -0
  1358. package/src/tools/inspect-image-renderer.ts +133 -0
  1359. package/src/tools/inspect-image.ts +316 -0
  1360. package/src/tools/json-tree.ts +260 -0
  1361. package/src/tools/jtd-to-json-schema.ts +219 -0
  1362. package/src/tools/jtd-to-typescript.ts +136 -0
  1363. package/src/tools/jtd-utils.ts +102 -0
  1364. package/src/tools/learn.ts +141 -0
  1365. package/src/tools/list-limit.ts +40 -0
  1366. package/src/tools/manage-skill.ts +102 -0
  1367. package/src/tools/match-line-format.ts +20 -0
  1368. package/src/tools/memory-edit.ts +61 -0
  1369. package/src/tools/memory-recall.ts +102 -0
  1370. package/src/tools/memory-reflect.ts +88 -0
  1371. package/src/tools/memory-render.ts +211 -0
  1372. package/src/tools/memory-retain.ts +89 -0
  1373. package/src/tools/output-meta.ts +860 -0
  1374. package/src/tools/output-schema-validator.ts +307 -0
  1375. package/src/tools/path-utils.ts +1489 -0
  1376. package/src/tools/plan-mode-guard.ts +155 -0
  1377. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  1378. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  1379. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  1380. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  1381. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  1382. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  1383. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  1384. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  1385. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  1386. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  1387. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  1388. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  1389. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  1390. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  1391. package/src/tools/read.ts +3762 -0
  1392. package/src/tools/render-utils.ts +926 -0
  1393. package/src/tools/renderers.ts +133 -0
  1394. package/src/tools/report-tool-issue.ts +568 -0
  1395. package/src/tools/resolve.ts +423 -0
  1396. package/src/tools/review.ts +103 -0
  1397. package/src/tools/run-scope.ts +417 -0
  1398. package/src/tools/security-scan.ts +287 -0
  1399. package/src/tools/shell-tokenize.ts +213 -0
  1400. package/src/tools/sqlite-reader.ts +884 -0
  1401. package/src/tools/terminal-output.ts +141 -0
  1402. package/src/tools/todo.ts +1226 -0
  1403. package/src/tools/tool-errors.ts +62 -0
  1404. package/src/tools/tool-result.ts +102 -0
  1405. package/src/tools/tool-timeouts.ts +38 -0
  1406. package/src/tools/tts.ts +266 -0
  1407. package/src/tools/vibe.ts +608 -0
  1408. package/src/tools/write.ts +1646 -0
  1409. package/src/tools/xdev.ts +560 -0
  1410. package/src/tools/yield.ts +486 -0
  1411. package/src/tts/downloader.ts +64 -0
  1412. package/src/tts/index.ts +10 -0
  1413. package/src/tts/models.ts +137 -0
  1414. package/src/tts/runtime.ts +21 -0
  1415. package/src/tts/speakable.ts +392 -0
  1416. package/src/tts/speech-enhancer.ts +206 -0
  1417. package/src/tts/streaming-player.ts +120 -0
  1418. package/src/tts/tts-client.ts +475 -0
  1419. package/src/tts/tts-protocol.ts +69 -0
  1420. package/src/tts/tts-worker.ts +434 -0
  1421. package/src/tts/vocalizer.ts +419 -0
  1422. package/src/tts/wav.ts +58 -0
  1423. package/src/tui/code-cell.ts +268 -0
  1424. package/src/tui/file-list.ts +55 -0
  1425. package/src/tui/hyperlink.ts +178 -0
  1426. package/src/tui/index.ts +13 -0
  1427. package/src/tui/output-block.ts +268 -0
  1428. package/src/tui/status-line.ts +54 -0
  1429. package/src/tui/tree-list.ts +172 -0
  1430. package/src/tui/types.ts +15 -0
  1431. package/src/tui/utils.ts +103 -0
  1432. package/src/tui/width-aware-text.ts +58 -0
  1433. package/src/utils/active-repo-context.ts +143 -0
  1434. package/src/utils/block-context.ts +312 -0
  1435. package/src/utils/changelog.ts +373 -0
  1436. package/src/utils/clipboard.ts +361 -0
  1437. package/src/utils/command-args.ts +74 -0
  1438. package/src/utils/commit-message-generator.ts +148 -0
  1439. package/src/utils/cpuprofile.ts +235 -0
  1440. package/src/utils/edit-mode.ts +61 -0
  1441. package/src/utils/enhanced-paste.ts +230 -0
  1442. package/src/utils/event-bus.ts +33 -0
  1443. package/src/utils/external-editor.ts +80 -0
  1444. package/src/utils/fetch-timeout.ts +10 -0
  1445. package/src/utils/file-display-mode.ts +44 -0
  1446. package/src/utils/file-mentions.ts +293 -0
  1447. package/src/utils/git.ts +2472 -0
  1448. package/src/utils/image-loading.ts +236 -0
  1449. package/src/utils/image-resize.ts +420 -0
  1450. package/src/utils/image-vision-fallback.ts +196 -0
  1451. package/src/utils/inspect-image-mode.ts +39 -0
  1452. package/src/utils/ipc.ts +38 -0
  1453. package/src/utils/jj.ts +422 -0
  1454. package/src/utils/lang-from-path.ts +251 -0
  1455. package/src/utils/late-cleanup.ts +17 -0
  1456. package/src/utils/local-date.ts +7 -0
  1457. package/src/utils/mac-file-urls.applescript +37 -0
  1458. package/src/utils/markit-cache.ts +166 -0
  1459. package/src/utils/markit.ts +223 -0
  1460. package/src/utils/mupdf-wasm-embed.ts +12 -0
  1461. package/src/utils/open.ts +126 -0
  1462. package/src/utils/profile-tree.ts +111 -0
  1463. package/src/utils/prompt-path.ts +3 -0
  1464. package/src/utils/qrcode.ts +535 -0
  1465. package/src/utils/sample-profile.ts +437 -0
  1466. package/src/utils/session-color.ts +142 -0
  1467. package/src/utils/shell-snapshot-fn-env.sh +63 -0
  1468. package/src/utils/shell-snapshot.ts +326 -0
  1469. package/src/utils/sixel.ts +69 -0
  1470. package/src/utils/thinking-display.ts +163 -0
  1471. package/src/utils/title-generator.ts +597 -0
  1472. package/src/utils/token-rate.ts +72 -0
  1473. package/src/utils/tool-choice.ts +50 -0
  1474. package/src/utils/tools-manager.ts +411 -0
  1475. package/src/utils/turndown.ts +82 -0
  1476. package/src/utils/zip.ts +1106 -0
  1477. package/src/vibe/runtime.ts +1684 -0
  1478. package/src/vibe/state.ts +4 -0
  1479. package/src/web/kagi.ts +305 -0
  1480. package/src/web/parallel.ts +354 -0
  1481. package/src/web/scrapers/artifacthub.ts +207 -0
  1482. package/src/web/scrapers/arxiv.ts +83 -0
  1483. package/src/web/scrapers/aur.ts +162 -0
  1484. package/src/web/scrapers/biorxiv.ts +133 -0
  1485. package/src/web/scrapers/bluesky.ts +262 -0
  1486. package/src/web/scrapers/brew.ts +172 -0
  1487. package/src/web/scrapers/cheatsh.ts +68 -0
  1488. package/src/web/scrapers/chocolatey.ts +196 -0
  1489. package/src/web/scrapers/choosealicense.ts +95 -0
  1490. package/src/web/scrapers/cisa-kev.ts +87 -0
  1491. package/src/web/scrapers/clojars.ts +154 -0
  1492. package/src/web/scrapers/coingecko.ts +177 -0
  1493. package/src/web/scrapers/crates-io.ts +97 -0
  1494. package/src/web/scrapers/crossref.ts +136 -0
  1495. package/src/web/scrapers/devto.ts +147 -0
  1496. package/src/web/scrapers/discogs.ts +306 -0
  1497. package/src/web/scrapers/discourse.ts +197 -0
  1498. package/src/web/scrapers/dockerhub.ts +138 -0
  1499. package/src/web/scrapers/docs-rs.ts +663 -0
  1500. package/src/web/scrapers/fdroid.ts +134 -0
  1501. package/src/web/scrapers/firefox-addons.ts +191 -0
  1502. package/src/web/scrapers/flathub.ts +223 -0
  1503. package/src/web/scrapers/github-gist.ts +58 -0
  1504. package/src/web/scrapers/github.ts +800 -0
  1505. package/src/web/scrapers/gitlab.ts +401 -0
  1506. package/src/web/scrapers/go-pkg.ts +266 -0
  1507. package/src/web/scrapers/hackage.ts +129 -0
  1508. package/src/web/scrapers/hackernews.ts +189 -0
  1509. package/src/web/scrapers/hex.ts +105 -0
  1510. package/src/web/scrapers/huggingface.ts +321 -0
  1511. package/src/web/scrapers/iacr.ts +89 -0
  1512. package/src/web/scrapers/index.ts +252 -0
  1513. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1514. package/src/web/scrapers/lemmy.ts +203 -0
  1515. package/src/web/scrapers/lobsters.ts +175 -0
  1516. package/src/web/scrapers/mastodon.ts +292 -0
  1517. package/src/web/scrapers/maven.ts +138 -0
  1518. package/src/web/scrapers/mdn.ts +173 -0
  1519. package/src/web/scrapers/metacpan.ts +222 -0
  1520. package/src/web/scrapers/musicbrainz.ts +250 -0
  1521. package/src/web/scrapers/npm.ts +98 -0
  1522. package/src/web/scrapers/nuget.ts +183 -0
  1523. package/src/web/scrapers/nvd.ts +222 -0
  1524. package/src/web/scrapers/ollama.ts +239 -0
  1525. package/src/web/scrapers/open-vsx.ts +106 -0
  1526. package/src/web/scrapers/opencorporates.ts +292 -0
  1527. package/src/web/scrapers/openlibrary.ts +336 -0
  1528. package/src/web/scrapers/orcid.ts +286 -0
  1529. package/src/web/scrapers/osv.ts +176 -0
  1530. package/src/web/scrapers/packagist.ts +160 -0
  1531. package/src/web/scrapers/pub-dev.ts +143 -0
  1532. package/src/web/scrapers/pubmed.ts +211 -0
  1533. package/src/web/scrapers/pypi.ts +112 -0
  1534. package/src/web/scrapers/rawg.ts +110 -0
  1535. package/src/web/scrapers/readthedocs.ts +121 -0
  1536. package/src/web/scrapers/reddit.ts +95 -0
  1537. package/src/web/scrapers/repology.ts +251 -0
  1538. package/src/web/scrapers/rfc.ts +201 -0
  1539. package/src/web/scrapers/rubygems.ts +103 -0
  1540. package/src/web/scrapers/searchcode.ts +189 -0
  1541. package/src/web/scrapers/sec-edgar.ts +261 -0
  1542. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1543. package/src/web/scrapers/snapcraft.ts +187 -0
  1544. package/src/web/scrapers/sourcegraph.ts +336 -0
  1545. package/src/web/scrapers/spdx.ts +108 -0
  1546. package/src/web/scrapers/spotify.ts +198 -0
  1547. package/src/web/scrapers/stackoverflow.ts +120 -0
  1548. package/src/web/scrapers/terraform.ts +277 -0
  1549. package/src/web/scrapers/tldr.ts +47 -0
  1550. package/src/web/scrapers/twitter.ts +94 -0
  1551. package/src/web/scrapers/types.ts +354 -0
  1552. package/src/web/scrapers/utils.ts +109 -0
  1553. package/src/web/scrapers/vimeo.ts +133 -0
  1554. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  1555. package/src/web/scrapers/w3c.ts +156 -0
  1556. package/src/web/scrapers/wikidata.ts +344 -0
  1557. package/src/web/scrapers/wikipedia.ts +84 -0
  1558. package/src/web/scrapers/youtube.ts +325 -0
  1559. package/src/web/search/index.ts +393 -0
  1560. package/src/web/search/provider.ts +272 -0
  1561. package/src/web/search/providers/anthropic.ts +406 -0
  1562. package/src/web/search/providers/base.ts +112 -0
  1563. package/src/web/search/providers/brave.ts +181 -0
  1564. package/src/web/search/providers/browser-headers.ts +82 -0
  1565. package/src/web/search/providers/browser-page.ts +125 -0
  1566. package/src/web/search/providers/codex.ts +788 -0
  1567. package/src/web/search/providers/duckduckgo.ts +382 -0
  1568. package/src/web/search/providers/ecosia.ts +183 -0
  1569. package/src/web/search/providers/exa.ts +513 -0
  1570. package/src/web/search/providers/firecrawl.ts +213 -0
  1571. package/src/web/search/providers/gemini.ts +634 -0
  1572. package/src/web/search/providers/google.ts +195 -0
  1573. package/src/web/search/providers/jina.ts +144 -0
  1574. package/src/web/search/providers/kagi.ts +98 -0
  1575. package/src/web/search/providers/kimi.ts +221 -0
  1576. package/src/web/search/providers/mojeek.ts +220 -0
  1577. package/src/web/search/providers/parallel.ts +186 -0
  1578. package/src/web/search/providers/perplexity-auth.ts +142 -0
  1579. package/src/web/search/providers/perplexity.ts +997 -0
  1580. package/src/web/search/providers/public.ts +199 -0
  1581. package/src/web/search/providers/searxng.ts +467 -0
  1582. package/src/web/search/providers/startpage.ts +225 -0
  1583. package/src/web/search/providers/synthetic.ts +126 -0
  1584. package/src/web/search/providers/tavily.ts +244 -0
  1585. package/src/web/search/providers/tinyfish.ts +166 -0
  1586. package/src/web/search/providers/utils.ts +130 -0
  1587. package/src/web/search/providers/xai.ts +372 -0
  1588. package/src/web/search/providers/zai.ts +452 -0
  1589. package/src/web/search/query.ts +850 -0
  1590. package/src/web/search/render.ts +262 -0
  1591. package/src/web/search/types.ts +518 -0
  1592. package/src/web/search/utils.ts +17 -0
  1593. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,1519 @@
1
+ /**
2
+ * RPC mode: Headless operation with JSON stdin/stdout protocol.
3
+ *
4
+ * Used for embedding the agent in other applications.
5
+ * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.
6
+ *
7
+ * Protocol:
8
+ * - Commands: JSON objects with `type` field, optional `id` for correlation
9
+ * - Responses: JSON objects with `type: "response"`, `command`, `success`, and optional `data`/`error`
10
+ * - Events: AgentSessionEvent objects streamed as they occur
11
+ * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
12
+ */
13
+ import { once } from "node:events";
14
+ import { getOAuthProviders } from "@oh-my-pi/pi-ai/oauth";
15
+ import { toolWireSchema } from "@oh-my-pi/pi-ai/utils/schema";
16
+ import { $env, isRecord, readLines, Snowflake } from "@oh-my-pi/pi-utils";
17
+ import { reset as resetCapabilities } from "../../capability";
18
+ import { clearPluginRootsAndCaches, resolveActiveProjectRegistryPath } from "../../discovery/helpers";
19
+ import {
20
+ type ExtensionUIContext,
21
+ type ExtensionUIDialogOptions,
22
+ type ExtensionUISelectItem,
23
+ type ExtensionWidgetOptions,
24
+ getExtensionUISelectOptionLabel,
25
+ } from "../../extensibility/extensions";
26
+ import { buildSkillPromptMessage, parseSkillInvocation } from "../../extensibility/skills";
27
+ import { loadSlashCommands } from "../../extensibility/slash-commands";
28
+ import { type Theme, theme } from "../../modes/theme/theme";
29
+ import type { AgentSession } from "../../session/agent-session";
30
+ import { SKILL_PROMPT_MESSAGE_TYPE, USER_INTERRUPT_LABEL } from "../../session/messages";
31
+ import { executeAcpBuiltinSlashCommand } from "../../slash-commands/acp-builtins";
32
+ import { buildAvailableSlashCommands } from "../../slash-commands/available-commands";
33
+ import { defaultLoadModeForToolName } from "../../tools/essential-tools";
34
+ import type { EventBus } from "../../utils/event-bus";
35
+ import { calculateTokensPerSecond } from "../../utils/token-rate";
36
+ import { initializeExtensions } from "../runtime-init";
37
+ import { isRpcHostToolResult, isRpcHostToolUpdate, RpcHostToolBridge } from "./host-tools";
38
+ import { isRpcHostUriResult, RpcHostUriBridge } from "./host-uris";
39
+ import { MAX_RPC_FRAME_BYTES, MAX_RPC_REASSEMBLED_BYTES, RpcFrameEncoder } from "./rpc-frame";
40
+ import { claimRpcInput } from "./rpc-input";
41
+ import { pageRpcMessages, RPC_MESSAGES_PAGE_BUSY_ERROR, RpcMessagesPageError } from "./rpc-messages";
42
+ import { RpcSubagentRegistry, readRpcSubagentTranscript } from "./rpc-subagents";
43
+ import type {
44
+ RpcCommand,
45
+ RpcExtensionUIRequest,
46
+ RpcExtensionUIResponse,
47
+ RpcHostToolCallRequest,
48
+ RpcHostToolCancelRequest,
49
+ RpcHostToolDefinition,
50
+ RpcHostToolResult,
51
+ RpcHostToolUpdate,
52
+ RpcHostUriCancelRequest,
53
+ RpcHostUriRequest,
54
+ RpcHostUriResult,
55
+ RpcResponse,
56
+ RpcSessionState,
57
+ RpcSubagentSubscriptionLevel,
58
+ } from "./rpc-types";
59
+
60
+ // Re-export types for consumers
61
+ export type * from "./rpc-types";
62
+
63
+ export type PendingExtensionRequest = {
64
+ resolve: (response: RpcExtensionUIResponse) => void;
65
+ reject: (error: Error) => void;
66
+ };
67
+
68
+ /** Pending extension UI request map that can fail closed when the RPC client disconnects. */
69
+ export class RpcPendingExtensionRequests extends Map<string, PendingExtensionRequest> {
70
+ #closedError: Error | undefined;
71
+
72
+ override set(id: string, request: PendingExtensionRequest): this {
73
+ if (this.#closedError) {
74
+ request.reject(this.#closedError);
75
+ return this;
76
+ }
77
+ return super.set(id, request);
78
+ }
79
+
80
+ /** Reject every active and future extension UI request. */
81
+ rejectAll(message: string): void {
82
+ if (!this.#closedError) this.#closedError = new Error(message);
83
+ const requests = Array.from(this.values());
84
+ this.clear();
85
+ for (const request of requests) {
86
+ request.reject(this.#closedError);
87
+ }
88
+ }
89
+ }
90
+
91
+ type RpcOutput = (
92
+ obj:
93
+ | RpcResponse
94
+ | RpcExtensionUIRequest
95
+ | RpcHostToolCallRequest
96
+ | RpcHostToolCancelRequest
97
+ | RpcHostUriRequest
98
+ | RpcHostUriCancelRequest
99
+ | object,
100
+ ) => void;
101
+
102
+ export type RpcSessionChangeCommand = Extract<
103
+ RpcCommand,
104
+ { type: "new_session" } | { type: "switch_session" } | { type: "branch" }
105
+ >;
106
+
107
+ export type RpcSessionChangeResult =
108
+ | { type: "new_session"; data: { cancelled: boolean } }
109
+ | { type: "switch_session"; data: { cancelled: boolean } }
110
+ | { type: "branch"; data: { text: string; cancelled: boolean } };
111
+
112
+ export type RpcSessionChangeSession = Pick<AgentSession, "newSession" | "switchSession" | "branch">;
113
+
114
+ export type RpcSkillCommandSession = Pick<AgentSession, "promptCustomMessage" | "skills" | "skillsSettings">;
115
+ export type RpcSkillCommandResult = { agentInvoked: true };
116
+
117
+ export async function tryRunRpcSkillCommand(
118
+ session: RpcSkillCommandSession,
119
+ text: string,
120
+ streamingBehavior: "steer" | "followUp" = "steer",
121
+ ): Promise<RpcSkillCommandResult | false> {
122
+ if (!session.skillsSettings?.enableSkillCommands) return false;
123
+ const parsed = parseSkillInvocation(text);
124
+ if (!parsed) return false;
125
+ const skill = session.skills.find(candidate => candidate.name === parsed.name);
126
+ if (!skill) return false;
127
+ const built = await buildSkillPromptMessage(skill, parsed.args, "user");
128
+ await session.promptCustomMessage(
129
+ {
130
+ customType: SKILL_PROMPT_MESSAGE_TYPE,
131
+ content: built.message,
132
+ display: true,
133
+ details: built.details,
134
+ attribution: "user",
135
+ },
136
+ { streamingBehavior },
137
+ );
138
+ return { agentInvoked: true };
139
+ }
140
+
141
+ export function reportLocalOnlyPromptResult(input: {
142
+ id: string | undefined;
143
+ prompt: Promise<boolean>;
144
+ output: (obj: object) => void;
145
+ onError: (error: Error) => void;
146
+ hasExtensionAgentMessageTask?: () => boolean;
147
+ waitForExtensionAgentMessageTasks?: () => Promise<void>;
148
+ }): void {
149
+ void input.prompt
150
+ .then(async agentInvoked => {
151
+ if (agentInvoked) return;
152
+ await input.waitForExtensionAgentMessageTasks?.();
153
+ if (!input.hasExtensionAgentMessageTask?.()) {
154
+ input.output({ type: "prompt_result", id: input.id, agentInvoked: false });
155
+ }
156
+ })
157
+ .catch(error => {
158
+ input.onError(error instanceof Error ? error : new Error(String(error)));
159
+ });
160
+ }
161
+
162
+ type RpcExtensionUserMessageScope = {
163
+ hasAgentMessageTask: boolean;
164
+ pendingAgentMessageTasks: Set<Promise<void>>;
165
+ };
166
+
167
+ /**
168
+ * Tracks extension-originated messages while an RPC prompt is executing.
169
+ * A slash command can resolve the outer prompt as local-only while also
170
+ * scheduling agent work through pi.sendUserMessage() or pi.sendMessage()
171
+ * with triggerTurn; that prompt must not report agentInvoked:false to the host.
172
+ */
173
+ export class RpcExtensionUserMessageTracker {
174
+ #activePromptScopes = new Set<RpcExtensionUserMessageScope>();
175
+
176
+ markAgentMessageTask(): void {
177
+ for (const scope of this.#activePromptScopes) {
178
+ scope.hasAgentMessageTask = true;
179
+ }
180
+ }
181
+
182
+ trackAgentMessageTask(task: Promise<unknown>): void {
183
+ for (const scope of this.#activePromptScopes) {
184
+ this.#trackAgentMessageTaskForScope(scope, task);
185
+ }
186
+ }
187
+
188
+ #trackAgentMessageTaskForScope(scope: RpcExtensionUserMessageScope, task: Promise<unknown>): void {
189
+ const scopedTask = task.then(
190
+ () => {
191
+ scope.hasAgentMessageTask = true;
192
+ },
193
+ () => {},
194
+ );
195
+ scope.pendingAgentMessageTasks.add(scopedTask);
196
+ void scopedTask.finally(() => {
197
+ scope.pendingAgentMessageTasks.delete(scopedTask);
198
+ });
199
+ }
200
+
201
+ async #waitForAgentMessageTasks(scope: RpcExtensionUserMessageScope): Promise<void> {
202
+ while (scope.pendingAgentMessageTasks.size > 0) {
203
+ await Promise.allSettled(Array.from(scope.pendingAgentMessageTasks));
204
+ }
205
+ }
206
+
207
+ watchPrompt<T>(startPrompt: () => Promise<T>): {
208
+ prompt: Promise<T>;
209
+ hasAgentMessageTask: () => boolean;
210
+ waitForAgentMessageTasks: () => Promise<void>;
211
+ } {
212
+ const scope: RpcExtensionUserMessageScope = {
213
+ hasAgentMessageTask: false,
214
+ pendingAgentMessageTasks: new Set(),
215
+ };
216
+ this.#activePromptScopes.add(scope);
217
+ let prompt: Promise<T>;
218
+ try {
219
+ prompt = startPrompt();
220
+ } catch (error) {
221
+ this.#activePromptScopes.delete(scope);
222
+ throw error;
223
+ }
224
+ return {
225
+ prompt: prompt.finally(() => {
226
+ this.#activePromptScopes.delete(scope);
227
+ }),
228
+ hasAgentMessageTask: () => scope.hasAgentMessageTask,
229
+ waitForAgentMessageTasks: () => this.#waitForAgentMessageTasks(scope),
230
+ };
231
+ }
232
+ }
233
+
234
+ export function watchAndReportLocalOnlyPromptResult(input: {
235
+ id: string | undefined;
236
+ startPrompt: () => Promise<boolean>;
237
+ output: (obj: object) => void;
238
+ onError: (error: Error) => void;
239
+ extensionUserMessageTracker: RpcExtensionUserMessageTracker;
240
+ }): void {
241
+ const trackedPrompt = input.extensionUserMessageTracker.watchPrompt(input.startPrompt);
242
+ reportLocalOnlyPromptResult({
243
+ id: input.id,
244
+ prompt: trackedPrompt.prompt,
245
+ output: input.output,
246
+ onError: input.onError,
247
+ hasExtensionAgentMessageTask: trackedPrompt.hasAgentMessageTask,
248
+ waitForExtensionAgentMessageTasks: trackedPrompt.waitForAgentMessageTasks,
249
+ });
250
+ }
251
+
252
+ /**
253
+ * Dependencies for {@link dispatchRpcInputFrame}. Provided by the RPC mode
254
+ * entrypoint; broken out so tests can drive the input loop with stubs.
255
+ */
256
+ export interface RpcInputFrameDeps {
257
+ handleCommand: (command: RpcCommand) => Promise<RpcResponse>;
258
+ output: RpcOutput;
259
+ errorResponse: (id: string | undefined, command: string, message: string) => RpcResponse;
260
+ trackBackgroundTask?: (task: Promise<void>) => void;
261
+ pendingExtensionRequests: Map<string, PendingExtensionRequest>;
262
+ onHostToolResult: (frame: RpcHostToolResult) => void;
263
+ onHostToolUpdate: (frame: RpcHostToolUpdate) => void;
264
+ onHostUriResult: (frame: RpcHostUriResult) => void;
265
+ }
266
+
267
+ /**
268
+ * Structural guard for a well-formed extension UI response frame. Mirrors the
269
+ * shape declared in {@link RpcExtensionUIResponse} — a truthy record with
270
+ * `type === "extension_ui_response"` and a string `id`. Payload variants (value,
271
+ * confirmed, cancelled) are validated at the read site.
272
+ */
273
+ function isRpcExtensionUIResponse(value: unknown): value is RpcExtensionUIResponse {
274
+ if (!isRecord(value)) return false;
275
+ return value.type === "extension_ui_response" && typeof value.id === "string";
276
+ }
277
+
278
+ /** Dispatch side-channel frames that must overtake the serialized command queue. */
279
+ export function dispatchRpcControlFrame(parsed: unknown, deps: RpcInputFrameDeps): boolean {
280
+ if (isRpcExtensionUIResponse(parsed)) {
281
+ const pending = deps.pendingExtensionRequests.get(parsed.id);
282
+ if (pending) pending.resolve(parsed);
283
+ return true;
284
+ }
285
+
286
+ if (isRpcHostToolResult(parsed)) {
287
+ deps.onHostToolResult(parsed);
288
+ return true;
289
+ }
290
+
291
+ if (isRpcHostToolUpdate(parsed)) {
292
+ deps.onHostToolUpdate(parsed);
293
+ return true;
294
+ }
295
+
296
+ if (isRpcHostUriResult(parsed)) {
297
+ deps.onHostUriResult(parsed);
298
+ return true;
299
+ }
300
+
301
+ return false;
302
+ }
303
+
304
+ /**
305
+ * Dispatch a single parsed frame from the RPC input stream.
306
+ *
307
+ * Bash commands are dispatched in the background so the caller can keep reading
308
+ * subsequent frames while a shell command is still running. This lets a client
309
+ * send `abort_bash` while a long-running `bash` is in flight. Response
310
+ * correlation is preserved via each command's `id`; ordering across concurrent
311
+ * commands is not guaranteed and clients MUST match on `id`.
312
+ *
313
+ * @returns `undefined` when the frame was routed to a side-channel handler
314
+ * (extension UI response, host tool/URI frames) or dispatched in the
315
+ * background (`bash`). Otherwise a promise that resolves once the response
316
+ * for the command has been emitted via `output`. Errors from `handleCommand`
317
+ * on non-`bash` commands propagate; the caller is expected to wrap them.
318
+ */
319
+ export function dispatchRpcInputFrame(parsed: unknown, deps: RpcInputFrameDeps): Promise<void> | undefined {
320
+ if (dispatchRpcControlFrame(parsed, deps)) return undefined;
321
+ // Regular RPC command. The transport contract states each remaining frame
322
+ // is an {@link RpcCommand}; `handleCommand`'s `default` arm surfaces
323
+ // unknown discriminants as an error response, so we do not shape-check
324
+ // the union here.
325
+ const command = parsed as RpcCommand;
326
+
327
+ // `bash` can run for a long time. Dispatch it in the background so a
328
+ // subsequent `abort_bash` frame can be read and handled without waiting
329
+ // for the shell command to finish on its own. The response is emitted
330
+ // when `handleCommand` resolves; clients correlate via `command.id`.
331
+ if (command.type === "bash") {
332
+ const task = (async () => {
333
+ try {
334
+ deps.output(await deps.handleCommand(command));
335
+ } catch (err: unknown) {
336
+ const message = err instanceof Error ? err.message : String(err);
337
+ deps.output(deps.errorResponse(command.id, "bash", message));
338
+ }
339
+ })();
340
+ deps.trackBackgroundTask?.(task);
341
+ return undefined;
342
+ }
343
+
344
+ return (async () => {
345
+ deps.output(await deps.handleCommand(command));
346
+ })();
347
+ }
348
+
349
+ /** Serializes ordinary RPC commands while allowing control frames to dispatch immediately. */
350
+ export class RpcInputDispatcher {
351
+ #tail: Promise<void> = Promise.resolve();
352
+ #tasks = new Set<Promise<void>>();
353
+ readonly #deps: RpcInputFrameDeps;
354
+ readonly #afterSerialCommand: (() => Promise<void>) | undefined;
355
+
356
+ constructor(options: { deps: RpcInputFrameDeps; afterSerialCommand?: () => Promise<void> }) {
357
+ this.#deps = options.deps;
358
+ this.#afterSerialCommand = options.afterSerialCommand;
359
+ }
360
+
361
+ /** Accept a parsed input frame without blocking the stdin reader. */
362
+ dispatch(parsed: unknown): void {
363
+ try {
364
+ if (dispatchRpcControlFrame(parsed, this.#deps)) return;
365
+
366
+ const command = parsed as RpcCommand;
367
+ if (command.type === "bash") {
368
+ dispatchRpcInputFrame(command, this.#deps);
369
+ return;
370
+ }
371
+
372
+ const task = this.#tail.then(
373
+ () => this.#dispatchSerialCommand(command),
374
+ () => this.#dispatchSerialCommand(command),
375
+ );
376
+ this.#tail = task.catch(() => {});
377
+ this.#tasks.add(task);
378
+ void task.finally(() => {
379
+ this.#tasks.delete(task);
380
+ });
381
+ } catch (err: unknown) {
382
+ const message = err instanceof Error ? err.message : String(err);
383
+ this.#deps.output(this.#deps.errorResponse(undefined, "parse", `Failed to parse command: ${message}`));
384
+ }
385
+ }
386
+
387
+ /** Await every accepted serial command, including commands queued before EOF. */
388
+ async drain(): Promise<void> {
389
+ while (this.#tasks.size > 0) {
390
+ await Promise.allSettled(Array.from(this.#tasks));
391
+ }
392
+ }
393
+
394
+ async #dispatchSerialCommand(command: RpcCommand): Promise<void> {
395
+ try {
396
+ const awaited = dispatchRpcInputFrame(command, this.#deps);
397
+ if (awaited) await awaited;
398
+ } catch (err: unknown) {
399
+ const message = err instanceof Error ? err.message : String(err);
400
+ this.#deps.output(this.#deps.errorResponse(command.id, command.type, message));
401
+ } finally {
402
+ await this.#afterSerialCommand?.();
403
+ }
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Coordinates deferred shutdown with in-flight background input tasks.
409
+ *
410
+ * `pi.shutdown()` from an extension only *requests* shutdown; the process must
411
+ * not exit while a background-dispatched command (`bash`, see
412
+ * {@link dispatchRpcInputFrame}) still owes the client a response frame. The
413
+ * coordinator tracks those tasks, re-checks the shutdown request whenever one
414
+ * settles (covering a shutdown requested mid-bash with no follow-up client
415
+ * frame), and drains every tracked task before invoking `performShutdown`.
416
+ * The shutdown sequence is latched so concurrent triggers (input loop and
417
+ * settling tasks) run it exactly once.
418
+ */
419
+ export class RpcShutdownCoordinator {
420
+ #tasks = new Set<Promise<void>>();
421
+ #shutdown: Promise<void> | undefined;
422
+ readonly #isShutdownRequested: () => boolean;
423
+ readonly #performShutdown: () => Promise<void>;
424
+
425
+ constructor(options: { isShutdownRequested: () => boolean; performShutdown: () => Promise<void> }) {
426
+ this.#isShutdownRequested = options.isShutdownRequested;
427
+ this.#performShutdown = options.performShutdown;
428
+ }
429
+
430
+ /**
431
+ * Track a background input task. When it settles it is untracked and the
432
+ * shutdown request is re-checked, so a deferred shutdown fires even when
433
+ * no further client frames arrive.
434
+ */
435
+ track(task: Promise<void>): void {
436
+ this.#tasks.add(task);
437
+ void task.finally(() => {
438
+ this.#tasks.delete(task);
439
+ // Fire-and-forget: performShutdown ends the process. Rejections are
440
+ // not expected — hook errors are caught inside extensionRunner.emit,
441
+ // and background tasks catch their own dispatch errors.
442
+ void this.checkShutdownRequested();
443
+ });
444
+ }
445
+
446
+ /** Await every tracked task, including tasks tracked while draining. */
447
+ async drain(): Promise<void> {
448
+ while (this.#tasks.size > 0) {
449
+ await Promise.allSettled(Array.from(this.#tasks));
450
+ }
451
+ }
452
+
453
+ /**
454
+ * If shutdown was requested, drain background tasks (so every owed
455
+ * response frame is written) before running the shutdown sequence.
456
+ */
457
+ checkShutdownRequested(): Promise<void> {
458
+ if (!this.#shutdown) {
459
+ if (!this.#isShutdownRequested()) return Promise.resolve();
460
+ this.#shutdown = this.drain().then(() => this.#performShutdown());
461
+ }
462
+ return this.#shutdown;
463
+ }
464
+ }
465
+
466
+ export type RpcSubagentResetRegistry = Pick<RpcSubagentRegistry, "clear">;
467
+
468
+ export async function handleRpcSessionChange(
469
+ session: RpcSessionChangeSession,
470
+ command: RpcSessionChangeCommand,
471
+ subagentRegistry?: RpcSubagentResetRegistry,
472
+ ): Promise<RpcSessionChangeResult> {
473
+ switch (command.type) {
474
+ case "new_session": {
475
+ const options = command.parentSession ? { parentSession: command.parentSession } : undefined;
476
+ const cancelled = !(await session.newSession(options));
477
+ if (!cancelled) subagentRegistry?.clear();
478
+ return { type: "new_session", data: { cancelled } };
479
+ }
480
+
481
+ case "switch_session": {
482
+ const cancelled = !(await session.switchSession(command.sessionPath));
483
+ if (!cancelled) subagentRegistry?.clear();
484
+ return { type: "switch_session", data: { cancelled } };
485
+ }
486
+
487
+ case "branch": {
488
+ const result = await session.branch(command.entryId);
489
+ if (!result.cancelled) subagentRegistry?.clear();
490
+ return { type: "branch", data: { text: result.selectedText, cancelled: result.cancelled } };
491
+ }
492
+ }
493
+ throw new Error("Unsupported RPC session change command");
494
+ }
495
+
496
+ function normalizeHostToolDefinitions(tools: RpcHostToolDefinition[]): RpcHostToolDefinition[] {
497
+ return tools.map((tool, index) => {
498
+ const name = typeof tool.name === "string" ? tool.name.trim() : "";
499
+ if (!name) {
500
+ throw new Error(`Host tool at index ${index} must provide a non-empty name`);
501
+ }
502
+ const description = typeof tool.description === "string" ? tool.description.trim() : "";
503
+ if (!description) {
504
+ throw new Error(`Host tool "${name}" must provide a non-empty description`);
505
+ }
506
+ if (!tool.parameters || typeof tool.parameters !== "object" || Array.isArray(tool.parameters)) {
507
+ throw new Error(`Host tool "${name}" must provide a JSON Schema object`);
508
+ }
509
+ const label = typeof tool.label === "string" && tool.label.trim() ? tool.label.trim() : name;
510
+ return {
511
+ name,
512
+ label,
513
+ description,
514
+ parameters: tool.parameters,
515
+ hidden: tool.hidden === true,
516
+ loadMode: defaultLoadModeForToolName(name, tool.loadMode),
517
+ };
518
+ });
519
+ }
520
+
521
+ function parseValueDialogResponse(
522
+ response: RpcExtensionUIResponse,
523
+ dialogOptions: ExtensionUIDialogOptions | undefined,
524
+ ): string | undefined {
525
+ if ("cancelled" in response && response.cancelled) {
526
+ if (response.timedOut) dialogOptions?.onTimeout?.();
527
+ return undefined;
528
+ }
529
+ if ("value" in response) return response.value;
530
+ return undefined;
531
+ }
532
+
533
+ function shouldEmitRpcTitles(): boolean {
534
+ const raw = $env.PI_RPC_EMIT_TITLE;
535
+ if (!raw) return false;
536
+ const normalized = raw.trim().toLowerCase();
537
+ return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
538
+ }
539
+
540
+ function isSubagentSubscriptionLevel(value: unknown): value is RpcSubagentSubscriptionLevel {
541
+ return value === "off" || value === "progress" || value === "events";
542
+ }
543
+
544
+ export function requestRpcEditor(
545
+ pendingRequests: Map<string, PendingExtensionRequest>,
546
+ output: RpcOutput,
547
+ title: string,
548
+ prefill?: string,
549
+ dialogOptions?: ExtensionUIDialogOptions,
550
+ editorOptions?: { promptStyle?: boolean },
551
+ ): Promise<string | undefined> {
552
+ if (dialogOptions?.signal?.aborted) return Promise.resolve(undefined);
553
+
554
+ const id = Snowflake.next() as string;
555
+ const { promise, resolve, reject } = Promise.withResolvers<string | undefined>();
556
+ let settled = false;
557
+
558
+ const cleanup = () => {
559
+ dialogOptions?.signal?.removeEventListener("abort", onAbort);
560
+ pendingRequests.delete(id);
561
+ };
562
+ const finish = (value: string | undefined) => {
563
+ if (settled) return;
564
+ settled = true;
565
+ cleanup();
566
+ resolve(value);
567
+ };
568
+ const fail = (error: Error) => {
569
+ if (settled) return;
570
+ settled = true;
571
+ cleanup();
572
+ reject(error);
573
+ };
574
+ const onAbort = () => {
575
+ output({
576
+ type: "extension_ui_request",
577
+ id: Snowflake.next() as string,
578
+ method: "cancel",
579
+ targetId: id,
580
+ } as RpcExtensionUIRequest);
581
+ finish(undefined);
582
+ };
583
+
584
+ dialogOptions?.signal?.addEventListener("abort", onAbort, { once: true });
585
+ pendingRequests.set(id, {
586
+ resolve: response => {
587
+ if ("cancelled" in response && response.cancelled) {
588
+ finish(undefined);
589
+ } else if ("value" in response) {
590
+ finish(response.value);
591
+ } else {
592
+ finish(undefined);
593
+ }
594
+ },
595
+ reject: fail,
596
+ });
597
+ output({
598
+ type: "extension_ui_request",
599
+ id,
600
+ method: "editor",
601
+ title,
602
+ prefill,
603
+ promptStyle: editorOptions?.promptStyle,
604
+ } as RpcExtensionUIRequest);
605
+ return promise;
606
+ }
607
+
608
+ /** Sends an RPC extension dialog and cancels the remote presentation when its signal aborts. */
609
+ export function requestRpcDialog<T>(
610
+ pendingRequests: Map<string, PendingExtensionRequest>,
611
+ output: RpcOutput,
612
+ opts: ExtensionUIDialogOptions | undefined,
613
+ defaultValue: T,
614
+ request: Record<string, unknown>,
615
+ parseResponse: (response: RpcExtensionUIResponse) => T,
616
+ ): Promise<T> {
617
+ if (opts?.signal?.aborted) return Promise.resolve(defaultValue);
618
+
619
+ const id = Snowflake.next() as string;
620
+ const { promise, resolve, reject } = Promise.withResolvers<T>();
621
+ let timeoutId: NodeJS.Timeout | undefined;
622
+
623
+ const cleanup = () => {
624
+ clearTimeout(timeoutId);
625
+ opts?.signal?.removeEventListener("abort", onAbort);
626
+ pendingRequests.delete(id);
627
+ };
628
+ const onAbort = () => {
629
+ output({
630
+ type: "extension_ui_request",
631
+ id: Snowflake.next() as string,
632
+ method: "cancel",
633
+ targetId: id,
634
+ } as RpcExtensionUIRequest);
635
+ cleanup();
636
+ resolve(defaultValue);
637
+ };
638
+ opts?.signal?.addEventListener("abort", onAbort, { once: true });
639
+
640
+ if (opts?.timeout !== undefined) {
641
+ timeoutId = setTimeout(() => {
642
+ opts.onTimeout?.();
643
+ cleanup();
644
+ resolve(defaultValue);
645
+ }, opts.timeout);
646
+ }
647
+
648
+ pendingRequests.set(id, {
649
+ resolve: response => {
650
+ cleanup();
651
+ resolve(parseResponse(response));
652
+ },
653
+ reject,
654
+ });
655
+ output({ type: "extension_ui_request", id, ...request } as RpcExtensionUIRequest);
656
+ return promise;
657
+ }
658
+ /**
659
+ * Run in RPC mode.
660
+ * Listens for JSON commands on stdin, outputs events and responses on stdout.
661
+ */
662
+ export async function runRpcMode(
663
+ session: AgentSession,
664
+ setToolUIContext?: (uiContext: ExtensionUIContext, hasUI: boolean) => void,
665
+ eventBus?: EventBus,
666
+ input: ReadableStream<Uint8Array> = claimRpcInput(),
667
+ ): Promise<never> {
668
+ // Signal to RPC clients that the server is ready to accept commands
669
+ // Suppress terminal notifications: they write \x07 (BEL) or OSC sequences directly to
670
+ // process.stdout with no newline, which the reader merges with the next JSON line and
671
+ // breaks JSON.parse. In RPC mode stdout is the JSON protocol channel — nothing else
672
+ // may write there.
673
+ process.env.PI_NOTIFICATIONS = "off";
674
+
675
+ const frameEncoder = new RpcFrameEncoder();
676
+ // Ordered stdout writer honoring backpressure: chunked v2 frames are produced
677
+ // lazily by the encoder and written one physical line at a time, so a near-limit
678
+ // logical frame never materializes its full base64 transport in memory.
679
+ let stdoutQueue: Promise<void> = Promise.resolve();
680
+ const writeFrames = (frames: Iterable<string>) => {
681
+ stdoutQueue = stdoutQueue
682
+ .then(async () => {
683
+ for (const line of frames) {
684
+ if (!process.stdout.write(line)) await once(process.stdout, "drain");
685
+ }
686
+ })
687
+ // stdout gone (host exited) — nothing left to deliver; keep the queue alive.
688
+ .catch(() => {});
689
+ };
690
+ writeFrames(
691
+ frameEncoder.encodeFrames({
692
+ type: "ready",
693
+ protocolVersion: 1,
694
+ supportedProtocolVersions: [1, 2],
695
+ maxFrameBytes: MAX_RPC_FRAME_BYTES,
696
+ maxReassembledFrameBytes: MAX_RPC_REASSEMBLED_BYTES,
697
+ }),
698
+ );
699
+ const output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {
700
+ writeFrames(frameEncoder.encodeFrames(obj));
701
+ if (isRecord(obj) && obj.type === "response" && obj.command === "negotiate_protocol" && obj.success === true)
702
+ frameEncoder.setProtocolVersion(2);
703
+ };
704
+ const emitRpcTitles = shouldEmitRpcTitles();
705
+
706
+ const success = <T extends RpcCommand["type"]>(
707
+ id: string | undefined,
708
+ command: T,
709
+ data?: object | null,
710
+ ): RpcResponse => {
711
+ if (data === undefined) {
712
+ return { id, type: "response", command, success: true } as RpcResponse;
713
+ }
714
+ return { id, type: "response", command, success: true, data } as RpcResponse;
715
+ };
716
+
717
+ const error = (id: string | undefined, command: string, message: string, code?: string): RpcResponse => {
718
+ return { id, type: "response", command, success: false, error: message, ...(code ? { code } : {}) };
719
+ };
720
+
721
+ const extensionUserMessageTracker = new RpcExtensionUserMessageTracker();
722
+
723
+ const pendingExtensionRequests = new RpcPendingExtensionRequests();
724
+ const hostToolBridge = new RpcHostToolBridge(output);
725
+ const hostUriBridge = new RpcHostUriBridge(output);
726
+ const subagentRegistry = eventBus ? new RpcSubagentRegistry(eventBus, output) : undefined;
727
+
728
+ // Shutdown request flag (wrapped in object to allow mutation with const)
729
+ const shutdownState = { requested: false };
730
+
731
+ /**
732
+ * Extension UI context that uses the RPC protocol.
733
+ */
734
+ class RpcExtensionUIContext implements ExtensionUIContext {
735
+ constructor(
736
+ private pendingRequests: Map<string, PendingExtensionRequest>,
737
+ private output: (obj: RpcResponse | RpcExtensionUIRequest | object) => void,
738
+ ) {}
739
+
740
+ select(
741
+ title: string,
742
+ options: ExtensionUISelectItem[],
743
+ dialogOptions?: ExtensionUIDialogOptions,
744
+ ): Promise<string | undefined> {
745
+ return requestRpcDialog(
746
+ this.pendingRequests,
747
+ this.output,
748
+ dialogOptions,
749
+ undefined,
750
+ {
751
+ method: "select",
752
+ title,
753
+ options: options.map(getExtensionUISelectOptionLabel),
754
+ timeout: dialogOptions?.timeout,
755
+ },
756
+ response => parseValueDialogResponse(response, dialogOptions),
757
+ );
758
+ }
759
+
760
+ confirm(title: string, message: string, dialogOptions?: ExtensionUIDialogOptions): Promise<boolean> {
761
+ return requestRpcDialog(
762
+ this.pendingRequests,
763
+ this.output,
764
+ dialogOptions,
765
+ false,
766
+ { method: "confirm", title, message, timeout: dialogOptions?.timeout },
767
+ response => {
768
+ if ("cancelled" in response && response.cancelled) {
769
+ if (response.timedOut) dialogOptions?.onTimeout?.();
770
+ return false;
771
+ }
772
+ if ("confirmed" in response) return response.confirmed;
773
+ return false;
774
+ },
775
+ );
776
+ }
777
+
778
+ input(
779
+ title: string,
780
+ placeholder?: string,
781
+ dialogOptions?: ExtensionUIDialogOptions,
782
+ ): Promise<string | undefined> {
783
+ return requestRpcDialog(
784
+ this.pendingRequests,
785
+ this.output,
786
+ dialogOptions,
787
+ undefined,
788
+ { method: "input", title, placeholder, timeout: dialogOptions?.timeout },
789
+ response => parseValueDialogResponse(response, dialogOptions),
790
+ );
791
+ }
792
+
793
+ onTerminalInput(): () => void {
794
+ // Raw terminal input not supported in RPC mode
795
+ return () => {};
796
+ }
797
+
798
+ notify(message: string, type?: "info" | "warning" | "error"): void {
799
+ // Fire and forget - no response needed
800
+ this.output({
801
+ type: "extension_ui_request",
802
+ id: Snowflake.next() as string,
803
+ method: "notify",
804
+ message,
805
+ notifyType: type,
806
+ } as RpcExtensionUIRequest);
807
+ }
808
+
809
+ setStatus(key: string, text: string | undefined): void {
810
+ // Fire and forget - no response needed
811
+ this.output({
812
+ type: "extension_ui_request",
813
+ id: Snowflake.next() as string,
814
+ method: "setStatus",
815
+ statusKey: key,
816
+ statusText: text,
817
+ } as RpcExtensionUIRequest);
818
+ }
819
+
820
+ setWorkingMessage(_message?: string): void {
821
+ // Not supported in RPC mode
822
+ }
823
+
824
+ setWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {
825
+ // Only support string arrays in RPC mode - factory functions are ignored
826
+ if (content === undefined || Array.isArray(content)) {
827
+ this.output({
828
+ type: "extension_ui_request",
829
+ id: Snowflake.next() as string,
830
+ method: "setWidget",
831
+ widgetKey: key,
832
+ widgetLines: content as string[] | undefined,
833
+ widgetPlacement: options?.placement,
834
+ } as RpcExtensionUIRequest);
835
+ }
836
+ // Component factories are not supported in RPC mode - would need TUI access
837
+ }
838
+
839
+ setFooter(_factory: unknown): void {
840
+ // Custom footer not supported in RPC mode - requires TUI access
841
+ }
842
+
843
+ setHeader(_factory: unknown): void {
844
+ // Custom header not supported in RPC mode - requires TUI access
845
+ }
846
+
847
+ setTitle(title: string): void {
848
+ // Title updates are low-value noise for most RPC hosts; opt in via PI_RPC_EMIT_TITLE=1.
849
+ if (!emitRpcTitles) return;
850
+ this.output({
851
+ type: "extension_ui_request",
852
+ id: Snowflake.next() as string,
853
+ method: "setTitle",
854
+ title,
855
+ } as RpcExtensionUIRequest);
856
+ }
857
+
858
+ async custom(): Promise<never> {
859
+ // Custom UI not supported in RPC mode
860
+ return undefined as never;
861
+ }
862
+
863
+ pasteToEditor(text: string): void {
864
+ // Paste handling not supported in RPC mode - falls back to setEditorText
865
+ this.setEditorText(text);
866
+ }
867
+
868
+ setEditorText(text: string): void {
869
+ // Fire and forget - host can implement editor control
870
+ this.output({
871
+ type: "extension_ui_request",
872
+ id: Snowflake.next() as string,
873
+ method: "set_editor_text",
874
+ text,
875
+ } as RpcExtensionUIRequest);
876
+ }
877
+
878
+ getEditorText(): string {
879
+ // Synchronous method can't wait for RPC response
880
+ // Host should track editor state locally if needed
881
+ return "";
882
+ }
883
+
884
+ async editor(
885
+ title: string,
886
+ prefill?: string,
887
+ dialogOptions?: ExtensionUIDialogOptions,
888
+ editorOptions?: { promptStyle?: boolean },
889
+ ): Promise<string | undefined> {
890
+ return requestRpcEditor(this.pendingRequests, this.output, title, prefill, dialogOptions, editorOptions);
891
+ }
892
+
893
+ addAutocompleteProvider(): void {
894
+ // Autocomplete provider composition is not supported in RPC mode
895
+ }
896
+
897
+ get theme(): Theme {
898
+ return theme;
899
+ }
900
+
901
+ getAllThemes(): Promise<{ name: string; path: string | undefined }[]> {
902
+ return Promise.resolve([]);
903
+ }
904
+
905
+ getTheme(_name: string): Promise<Theme | undefined> {
906
+ return Promise.resolve(undefined);
907
+ }
908
+
909
+ setTheme(_theme: string | Theme): Promise<{ success: boolean; error?: string }> {
910
+ // Theme switching not supported in RPC mode
911
+ return Promise.resolve({ success: false, error: "Theme switching not supported in RPC mode" });
912
+ }
913
+
914
+ getToolsExpanded() {
915
+ // Tool expansion not supported in RPC mode - no TUI
916
+ return false;
917
+ }
918
+
919
+ setToolsExpanded(_expanded: boolean) {
920
+ // Tool expansion not supported in RPC mode - no TUI
921
+ }
922
+
923
+ setEditorComponent(): void {
924
+ // Custom editor components not supported in RPC mode
925
+ }
926
+ }
927
+
928
+ // Wire up UI context for tool execution (ask tool, etc.) and extensions.
929
+ // A single shared instance routes all responses received on stdin to the
930
+ // correct waiting promise regardless of which code path created the request.
931
+ const rpcUiContext = new RpcExtensionUIContext(pendingExtensionRequests, output);
932
+ setToolUIContext?.(rpcUiContext, true);
933
+
934
+ // Set up extensions with RPC-based UI context
935
+ await initializeExtensions(session, {
936
+ reportSendError: (action, err) => {
937
+ output(error(undefined, action, err.message));
938
+ },
939
+ reportRuntimeError: err => {
940
+ output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
941
+ },
942
+ onShutdown: () => {
943
+ shutdownState.requested = true;
944
+ },
945
+ trackAgentInvokingMessage: task => {
946
+ extensionUserMessageTracker.trackAgentMessageTask(task);
947
+ },
948
+ uiContext: rpcUiContext,
949
+ });
950
+
951
+ // Output all agent events as JSON
952
+ session.subscribe(event => {
953
+ output(event);
954
+ });
955
+
956
+ const getAvailableCommands = async () => buildAvailableSlashCommands(session);
957
+ const reloadPluginState = async () => {
958
+ const cwd = session.sessionManager.getCwd();
959
+ const projectPath = await resolveActiveProjectRegistryPath(cwd);
960
+ clearPluginRootsAndCaches(projectPath ? [projectPath] : undefined);
961
+ resetCapabilities();
962
+ await session.refreshSkills();
963
+ session.setSlashCommands(await loadSlashCommands({ cwd }));
964
+ await emitAvailableCommandsUpdate();
965
+ };
966
+ const emitAvailableCommandsUpdate = async () => {
967
+ output({ type: "available_commands_update", commands: await getAvailableCommands() });
968
+ };
969
+ session.subscribeCommandMetadataChanged(() => {
970
+ void emitAvailableCommandsUpdate();
971
+ });
972
+ await emitAvailableCommandsUpdate();
973
+
974
+ // Handle a single command
975
+ const handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {
976
+ const id = command.id;
977
+
978
+ switch (command.type) {
979
+ case "negotiate_protocol": {
980
+ if (command.protocolVersion !== 2)
981
+ return error(id, "negotiate_protocol", `Unsupported RPC protocol version: ${command.protocolVersion}`);
982
+ return success(id, "negotiate_protocol", { protocolVersion: 2 });
983
+ }
984
+
985
+ // =================================================================
986
+ // Prompting
987
+ // =================================================================
988
+
989
+ case "prompt": {
990
+ const skillResult = await tryRunRpcSkillCommand(session, command.message, command.streamingBehavior);
991
+ if (skillResult) {
992
+ return success(id, "prompt", skillResult);
993
+ }
994
+ const builtinResult = await executeAcpBuiltinSlashCommand(command.message, {
995
+ session,
996
+ sessionManager: session.sessionManager,
997
+ settings: session.settings,
998
+ cwd: session.sessionManager.getCwd(),
999
+ output: text => output({ type: "command_output", text }),
1000
+ refreshCommands: emitAvailableCommandsUpdate,
1001
+ reloadPlugins: reloadPluginState,
1002
+ notifyTitleChanged: async () => {
1003
+ output({ type: "session_info_update", title: session.sessionName, sessionId: session.sessionId });
1004
+ },
1005
+ notifyConfigChanged: async () => {
1006
+ output({ type: "config_update", model: session.model, thinkingLevel: session.thinkingLevel });
1007
+ },
1008
+ });
1009
+ if (builtinResult !== false) {
1010
+ if ("prompt" in builtinResult) {
1011
+ watchAndReportLocalOnlyPromptResult({
1012
+ id,
1013
+ startPrompt: () => session.prompt(builtinResult.prompt, { images: command.images }),
1014
+ output,
1015
+ onError: promptError => output(error(id, "prompt", promptError.message)),
1016
+ extensionUserMessageTracker,
1017
+ });
1018
+ return success(id, "prompt");
1019
+ }
1020
+ return success(id, "prompt", { agentInvoked: false });
1021
+ }
1022
+
1023
+ // Don't await - events will stream
1024
+ // Extension commands are executed immediately, file prompt templates are expanded
1025
+ // If streaming and streamingBehavior specified, queues via steer/followUp
1026
+ watchAndReportLocalOnlyPromptResult({
1027
+ id,
1028
+ startPrompt: () =>
1029
+ session.prompt(command.message, {
1030
+ images: command.images,
1031
+ streamingBehavior: command.streamingBehavior,
1032
+ }),
1033
+ output,
1034
+ onError: promptError => output(error(id, "prompt", promptError.message)),
1035
+ extensionUserMessageTracker,
1036
+ });
1037
+ return success(id, "prompt");
1038
+ }
1039
+
1040
+ case "steer": {
1041
+ await session.steer(command.message, command.images);
1042
+ return success(id, "steer");
1043
+ }
1044
+
1045
+ case "follow_up": {
1046
+ await session.followUp(command.message, command.images);
1047
+ return success(id, "follow_up");
1048
+ }
1049
+
1050
+ case "abort": {
1051
+ await session.abort({ reason: USER_INTERRUPT_LABEL });
1052
+ return success(id, "abort");
1053
+ }
1054
+
1055
+ case "abort_and_prompt": {
1056
+ await session.abort({ reason: USER_INTERRUPT_LABEL });
1057
+ session
1058
+ .prompt(command.message, { images: command.images })
1059
+ .catch(e => output(error(id, "abort_and_prompt", e.message)));
1060
+ return success(id, "abort_and_prompt");
1061
+ }
1062
+
1063
+ case "new_session":
1064
+ case "switch_session":
1065
+ case "branch": {
1066
+ const result = await handleRpcSessionChange(session, command, subagentRegistry);
1067
+ if (!result.data.cancelled) await emitAvailableCommandsUpdate();
1068
+ return success(id, result.type, result.data);
1069
+ }
1070
+
1071
+ // =================================================================
1072
+ // State
1073
+ // =================================================================
1074
+
1075
+ case "get_state": {
1076
+ const state: RpcSessionState = {
1077
+ model: session.model,
1078
+ thinkingLevel: session.thinkingLevel,
1079
+ isStreaming: session.isStreaming,
1080
+ isCompacting: session.isCompacting,
1081
+ steeringMode: session.steeringMode,
1082
+ followUpMode: session.followUpMode,
1083
+ interruptMode: session.interruptMode,
1084
+ sessionFile: session.sessionFile,
1085
+ sessionId: session.sessionId,
1086
+ sessionName: session.sessionName,
1087
+ autoCompactionEnabled: session.autoCompactionEnabled,
1088
+ queuedMessageCount: session.queuedMessageCount,
1089
+ todoPhases: session.getTodoPhases(),
1090
+ fastModeEnabled: session.isFastModeEnabled(),
1091
+ tokensPerSecond: calculateTokensPerSecond(session.messages, session.isStreaming),
1092
+ fastModeActive: session.isFastModeActive(),
1093
+ messageCount: session.messages.length,
1094
+ systemPrompt: session.systemPrompt,
1095
+ dumpTools: session.agent.state.tools.map(tool => ({
1096
+ name: tool.name,
1097
+ description: tool.description,
1098
+ parameters: toolWireSchema(tool),
1099
+ examples: tool.examples,
1100
+ })),
1101
+ contextUsage: session.getContextUsage(),
1102
+ };
1103
+ return success(id, "get_state", state);
1104
+ }
1105
+
1106
+ case "set_fast_mode": {
1107
+ const supported = session.setFastMode(command.enabled);
1108
+ if (command.enabled && !supported) {
1109
+ return error(id, "set_fast_mode", "Fast mode is unavailable for the current model.");
1110
+ }
1111
+ return success(id, "set_fast_mode", {
1112
+ enabled: session.isFastModeEnabled(),
1113
+ active: session.isFastModeActive(),
1114
+ });
1115
+ }
1116
+
1117
+ case "get_available_commands": {
1118
+ return success(id, "get_available_commands", { commands: await getAvailableCommands() });
1119
+ }
1120
+
1121
+ case "set_todos": {
1122
+ session.setTodoPhases(command.phases);
1123
+ return success(id, "set_todos", { todoPhases: session.getTodoPhases() });
1124
+ }
1125
+
1126
+ case "set_host_tools": {
1127
+ const tools = normalizeHostToolDefinitions(command.tools);
1128
+ const rpcTools = hostToolBridge.setTools(tools);
1129
+ await session.refreshRpcHostTools(rpcTools);
1130
+ return success(id, "set_host_tools", { toolNames: tools.map(tool => tool.name) });
1131
+ }
1132
+
1133
+ case "set_host_uri_schemes": {
1134
+ try {
1135
+ const schemes = hostUriBridge.setSchemes(command.schemes);
1136
+ return success(id, "set_host_uri_schemes", { schemes });
1137
+ } catch (err) {
1138
+ return error(id, "set_host_uri_schemes", err instanceof Error ? err.message : String(err));
1139
+ }
1140
+ }
1141
+
1142
+ case "set_subagent_subscription": {
1143
+ if (!subagentRegistry) {
1144
+ return error(id, "set_subagent_subscription", "Subagent event bus is unavailable");
1145
+ }
1146
+ if (!isSubagentSubscriptionLevel(command.level)) {
1147
+ return error(
1148
+ id,
1149
+ "set_subagent_subscription",
1150
+ `Invalid subagent subscription level: ${String(command.level)}`,
1151
+ );
1152
+ }
1153
+ subagentRegistry.setSubscriptionLevel(command.level);
1154
+ return success(id, "set_subagent_subscription", { level: subagentRegistry.getSubscriptionLevel() });
1155
+ }
1156
+
1157
+ case "get_subagents": {
1158
+ if (!subagentRegistry) {
1159
+ return error(id, "get_subagents", "Subagent event bus is unavailable");
1160
+ }
1161
+ return success(id, "get_subagents", { subagents: subagentRegistry.getSubagents() });
1162
+ }
1163
+
1164
+ case "get_subagent_messages": {
1165
+ if (!subagentRegistry) {
1166
+ return error(id, "get_subagent_messages", "Subagent event bus is unavailable");
1167
+ }
1168
+ try {
1169
+ if (command.fromByte !== undefined && !Number.isFinite(command.fromByte)) {
1170
+ return error(id, "get_subagent_messages", "fromByte must be a finite number");
1171
+ }
1172
+ const sessionFile = subagentRegistry.resolveSessionFile(command);
1173
+ const transcript = await readRpcSubagentTranscript(sessionFile, command.fromByte);
1174
+ return success(id, "get_subagent_messages", transcript);
1175
+ } catch (err) {
1176
+ return error(id, "get_subagent_messages", err instanceof Error ? err.message : String(err));
1177
+ }
1178
+ }
1179
+
1180
+ // =================================================================
1181
+ // Model
1182
+ // =================================================================
1183
+
1184
+ case "set_model": {
1185
+ let models = session.getAvailableModels();
1186
+ let model = models.find(m => m.provider === command.provider && m.id === command.modelId);
1187
+ if (!model) {
1188
+ // Model not in the current catalog. Wait for in-flight
1189
+ // background discovery before declaring it missing: on cold
1190
+ // start, discovery-backed providers (proxy / ollama / etc.)
1191
+ // populate seconds after session ready. Models already in
1192
+ // the bundled catalog skip this await entirely so the RPC
1193
+ // queue is not stalled behind unrelated discovery.
1194
+ await session.modelRegistry.awaitBackgroundRefresh();
1195
+ models = session.getAvailableModels();
1196
+ model = models.find(m => m.provider === command.provider && m.id === command.modelId);
1197
+ }
1198
+ if (!model) {
1199
+ return error(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
1200
+ }
1201
+ await session.setModel(model);
1202
+ return success(id, "set_model", model);
1203
+ }
1204
+
1205
+ case "cycle_model": {
1206
+ const result = await session.cycleModel();
1207
+ if (!result) {
1208
+ return success(id, "cycle_model", null);
1209
+ }
1210
+ return success(id, "cycle_model", result);
1211
+ }
1212
+
1213
+ case "get_available_models": {
1214
+ await session.modelRegistry.awaitBackgroundRefresh();
1215
+ const models = session.getAvailableModels();
1216
+ return success(id, "get_available_models", { models });
1217
+ }
1218
+
1219
+ // =================================================================
1220
+ // Thinking
1221
+ // =================================================================
1222
+
1223
+ case "set_thinking_level": {
1224
+ session.setThinkingLevel(command.level);
1225
+ return success(id, "set_thinking_level");
1226
+ }
1227
+
1228
+ case "cycle_thinking_level": {
1229
+ const level = session.cycleThinkingLevel();
1230
+ if (!level) {
1231
+ return success(id, "cycle_thinking_level", null);
1232
+ }
1233
+ return success(id, "cycle_thinking_level", { level });
1234
+ }
1235
+
1236
+ // =================================================================
1237
+ // Queue Modes
1238
+ // =================================================================
1239
+
1240
+ case "set_steering_mode": {
1241
+ session.setSteeringMode(command.mode);
1242
+ return success(id, "set_steering_mode");
1243
+ }
1244
+
1245
+ case "set_follow_up_mode": {
1246
+ session.setFollowUpMode(command.mode);
1247
+ return success(id, "set_follow_up_mode");
1248
+ }
1249
+
1250
+ case "set_interrupt_mode": {
1251
+ session.setInterruptMode(command.mode);
1252
+ return success(id, "set_interrupt_mode");
1253
+ }
1254
+
1255
+ // =================================================================
1256
+ // Compaction
1257
+ // =================================================================
1258
+
1259
+ case "compact": {
1260
+ const result = await session.compact(command.customInstructions);
1261
+ return success(id, "compact", result);
1262
+ }
1263
+
1264
+ case "set_auto_compaction": {
1265
+ session.setAutoCompactionEnabled(command.enabled);
1266
+ return success(id, "set_auto_compaction");
1267
+ }
1268
+
1269
+ // =================================================================
1270
+ // Retry
1271
+ // =================================================================
1272
+
1273
+ case "set_auto_retry": {
1274
+ session.setAutoRetryEnabled(command.enabled);
1275
+ return success(id, "set_auto_retry");
1276
+ }
1277
+
1278
+ case "abort_retry": {
1279
+ session.abortRetry();
1280
+ return success(id, "abort_retry");
1281
+ }
1282
+
1283
+ // =================================================================
1284
+ // Bash
1285
+ // =================================================================
1286
+
1287
+ case "bash": {
1288
+ const result = await session.executeBash(command.command);
1289
+ return success(id, "bash", result);
1290
+ }
1291
+
1292
+ case "abort_bash": {
1293
+ session.abortBash();
1294
+ return success(id, "abort_bash");
1295
+ }
1296
+
1297
+ // =================================================================
1298
+ // Session
1299
+ // =================================================================
1300
+
1301
+ case "get_session_stats": {
1302
+ const stats = session.getSessionStats();
1303
+ return success(id, "get_session_stats", stats);
1304
+ }
1305
+
1306
+ case "export_html": {
1307
+ const path = await session.exportToHtml(command.outputPath);
1308
+ return success(id, "export_html", { path });
1309
+ }
1310
+
1311
+ case "get_branch_messages": {
1312
+ const messages = session.getUserMessagesForBranching();
1313
+ return success(id, "get_branch_messages", { messages });
1314
+ }
1315
+
1316
+ case "get_last_assistant_text": {
1317
+ const text = session.getLastAssistantText();
1318
+ return success(id, "get_last_assistant_text", { text });
1319
+ }
1320
+
1321
+ case "set_session_name": {
1322
+ const name = command.name.trim();
1323
+ if (!name) {
1324
+ return error(id, "set_session_name", "Session name cannot be empty");
1325
+ }
1326
+ const applied = await session.setSessionName(name, "user");
1327
+ if (!applied) {
1328
+ return error(id, "set_session_name", "Session name cannot be empty");
1329
+ }
1330
+ return success(id, "set_session_name");
1331
+ }
1332
+
1333
+ case "handoff": {
1334
+ // Resetting the agent mid-stream lets the live turn keep emitting into a
1335
+ // session that handoff has already torn down. Refuse while a prompt is in
1336
+ // flight (mirrors the TUI /handoff guard).
1337
+ if (session.isStreaming) {
1338
+ return error(id, "handoff", "Cannot hand off while a response is in progress");
1339
+ }
1340
+ const result = await session.handoff(command.customInstructions);
1341
+ return success(id, "handoff", result ? { savedPath: result.savedPath } : null);
1342
+ }
1343
+
1344
+ // =================================================================
1345
+ // Messages
1346
+ // =================================================================
1347
+
1348
+ case "get_messages": {
1349
+ return success(id, "get_messages", { messages: session.messages });
1350
+ }
1351
+
1352
+ case "get_messages_page": {
1353
+ if (session.isStreaming || session.isCompacting)
1354
+ return error(id, "get_messages_page", RPC_MESSAGES_PAGE_BUSY_ERROR, "session_busy");
1355
+ const messages = session.messages;
1356
+ try {
1357
+ return success(
1358
+ id,
1359
+ "get_messages_page",
1360
+ pageRpcMessages(
1361
+ messages,
1362
+ {
1363
+ sessionId: session.sessionId,
1364
+ leafId: session.sessionManager.getLeafId(),
1365
+ messageCount: messages.length,
1366
+ },
1367
+ { cursor: command.cursor, limit: command.limit },
1368
+ ),
1369
+ );
1370
+ } catch (pageError) {
1371
+ return error(
1372
+ id,
1373
+ "get_messages_page",
1374
+ pageError instanceof Error ? pageError.message : String(pageError),
1375
+ pageError instanceof RpcMessagesPageError ? pageError.code : undefined,
1376
+ );
1377
+ }
1378
+ }
1379
+
1380
+ // =================================================================
1381
+ // Login
1382
+ // =================================================================
1383
+
1384
+ case "get_login_providers": {
1385
+ const providers = getOAuthProviders().map(provider => ({
1386
+ id: provider.id,
1387
+ name: provider.name,
1388
+ available: provider.available,
1389
+ authenticated: session.modelRegistry.authStorage.hasAuth(provider.id),
1390
+ }));
1391
+ return success(id, "get_login_providers", { providers });
1392
+ }
1393
+
1394
+ case "login": {
1395
+ const knownProvider = getOAuthProviders().find(p => p.id === command.providerId);
1396
+ if (!knownProvider) {
1397
+ return error(id, "login", `Unknown OAuth provider: ${command.providerId}`);
1398
+ }
1399
+ const uiCtx = new RpcExtensionUIContext(pendingExtensionRequests, output);
1400
+ // Track whether onAuth has fired. Providers that require interactive
1401
+ // input before a browser URL cannot be satisfied headlessly; after
1402
+ // onAuth, prompt input is the pasted OAuth code/redirect URL path.
1403
+ let authEmitted = false;
1404
+ try {
1405
+ await session.modelRegistry.authStorage.login(command.providerId, {
1406
+ onAuth: info => {
1407
+ authEmitted = true;
1408
+ output({
1409
+ type: "extension_ui_request",
1410
+ id: Snowflake.next() as string,
1411
+ method: "open_url",
1412
+ url: info.url,
1413
+ launchUrl: info.launchUrl,
1414
+ instructions: info.instructions,
1415
+ } as RpcExtensionUIRequest);
1416
+ },
1417
+ onProgress: message => {
1418
+ uiCtx.notify(message, "info");
1419
+ },
1420
+ onPrompt: async prompt => {
1421
+ if (!authEmitted) {
1422
+ // onPrompt called before any auth URL — provider requires
1423
+ // interactive input that cannot be satisfied headlessly.
1424
+ return Promise.reject(
1425
+ new Error(
1426
+ `Provider '${command.providerId}' requires interactive prompts ` +
1427
+ "which are not supported in RPC mode. Use the terminal UI to log in.",
1428
+ ),
1429
+ );
1430
+ }
1431
+ return (await uiCtx.input(prompt.message, prompt.placeholder, { timeout: 600_000 })) ?? "";
1432
+ },
1433
+ });
1434
+ // Provider-scoped online refresh so the just-persisted credential
1435
+ // re-runs discovery instead of reusing a fresh authoritative cache
1436
+ // row (#5780).
1437
+ await session.modelRegistry.refreshProvider(command.providerId, "online");
1438
+ return success(id, "login", { providerId: command.providerId });
1439
+ } catch (err: unknown) {
1440
+ return error(id, "login", err instanceof Error ? err.message : String(err));
1441
+ }
1442
+ }
1443
+
1444
+ default: {
1445
+ const unknownCommand = command as { type: string };
1446
+ return error(undefined, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);
1447
+ }
1448
+ }
1449
+ };
1450
+
1451
+ // Deferred shutdown (pi.shutdown() from an extension) must not kill the
1452
+ // process while a background-dispatched bash still owes the client its
1453
+ // response frame. The coordinator drains tracked tasks before exiting and
1454
+ // re-checks the request as each task settles.
1455
+ const shutdownCoordinator = new RpcShutdownCoordinator({
1456
+ isShutdownRequested: () => shutdownState.requested,
1457
+ performShutdown: async () => {
1458
+ // Route through the idempotent session.dispose() so the browser
1459
+ // reaper (releaseTabsForOwner) and other bounded teardown run before
1460
+ // the process exits. dispose() also emits `session_shutdown`, so we
1461
+ // must NOT emit it separately here or the event fires twice. Skipping
1462
+ // dispose left OMP-owned Chromium alive after RPC shutdown (#5643).
1463
+ await session.dispose();
1464
+ process.exit(0);
1465
+ },
1466
+ });
1467
+
1468
+ const dispatchFrameDeps: RpcInputFrameDeps = {
1469
+ handleCommand,
1470
+ output,
1471
+ errorResponse: error,
1472
+ trackBackgroundTask: task => shutdownCoordinator.track(task),
1473
+ pendingExtensionRequests,
1474
+ onHostToolResult: frame => hostToolBridge.handleResult(frame),
1475
+ onHostToolUpdate: frame => hostToolBridge.handleUpdate(frame),
1476
+ onHostUriResult: frame => hostUriBridge.handleResult(frame),
1477
+ };
1478
+
1479
+ const inputDispatcher = new RpcInputDispatcher({
1480
+ deps: dispatchFrameDeps,
1481
+ afterSerialCommand: () => shutdownCoordinator.checkShutdownRequested(),
1482
+ });
1483
+
1484
+ // Keep the stdin reader moving: side-channel frames dispatch immediately,
1485
+ // ordinary commands serialize through inputDispatcher, and bash remains
1486
+ // background-dispatched so abort_bash can overtake it. Frames are read
1487
+ // line-by-line and parsed here (not via readJsonl) so a single malformed
1488
+ // line is reported as an error frame and the loop keeps running instead of
1489
+ // throwing out of the generator and killing the whole process (issue #5194).
1490
+ const decoder = new TextDecoder();
1491
+ for await (const line of readLines(input ?? Bun.stdin.stream())) {
1492
+ const text = decoder.decode(line).trim();
1493
+ if (!text) continue;
1494
+ let parsed: unknown;
1495
+ try {
1496
+ parsed = JSON.parse(text);
1497
+ } catch (e: unknown) {
1498
+ const message = e instanceof Error ? e.message : String(e);
1499
+ output(error(undefined, "parse", `Failed to parse command: ${message}`));
1500
+ continue;
1501
+ }
1502
+ inputDispatcher.dispatch(parsed);
1503
+ }
1504
+
1505
+ // stdin closed — RPC client is gone. Fail pending side-channel requests
1506
+ // first so active/queued commands can settle, then drain accepted work.
1507
+ pendingExtensionRequests.rejectAll("RPC client disconnected before extension UI response completed");
1508
+ hostToolBridge.close("RPC client disconnected before host tool execution completed");
1509
+ hostUriBridge.clear("RPC client disconnected before host URI request completed");
1510
+ await inputDispatcher.drain();
1511
+ await shutdownCoordinator.drain();
1512
+ subagentRegistry?.dispose();
1513
+ // Dispose the main session before exiting so the browser reaper and other
1514
+ // bounded teardown run on the stdin-EOF path too (#5643). Idempotent: a
1515
+ // prior pi.shutdown() through the coordinator makes this await settle
1516
+ // immediately.
1517
+ await session.dispose();
1518
+ process.exit(0);
1519
+ }