@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,1689 @@
1
+ import * as os from "node:os";
2
+ import * as path from "node:path";
3
+ import { type } from "@oh-my-pi/omptype";
4
+ import { type ApiKey, type FetchImpl, getEnvApiKey, type Model, withAuth } from "@oh-my-pi/pi-ai";
5
+ import { ProviderHttpError } from "@oh-my-pi/pi-ai/error";
6
+ import {
7
+ CODEX_BASE_URL,
8
+ getCodexAccountId,
9
+ OPENAI_HEADER_VALUES,
10
+ OPENAI_HEADERS,
11
+ URL_PATHS,
12
+ } from "@oh-my-pi/pi-catalog/wire/codex";
13
+ import { getAntigravityUserAgent } from "@oh-my-pi/pi-catalog/wire/gemini-headers";
14
+ import {
15
+ $env,
16
+ isEnoent,
17
+ parseImageMetadata,
18
+ prompt,
19
+ ptree,
20
+ readSseJson,
21
+ Snowflake,
22
+ untilAborted,
23
+ } from "@oh-my-pi/pi-utils";
24
+ import packageJson from "../../package.json" with { type: "json" };
25
+ import { isAuthenticated, type ModelRegistry } from "../config/model-registry";
26
+ import { settings } from "../config/settings";
27
+ import type { CustomTool } from "../extensibility/custom-tools/types";
28
+ import { ohMyPiXAIUserAgent, resolveXAIHttpCredentials } from "../lib/xai-http";
29
+ import imageGenDescription from "../prompts/tools/image-gen.md" with { type: "text" };
30
+ import { AUTO_IMAGE_PROVIDER_ORDER, type ImageProvider, isImageProviderId } from "./image-providers";
31
+ import { resolveReadPath } from "./path-utils";
32
+
33
+ const DEFAULT_MODEL = "gemini-3-pro-image-preview";
34
+ const DEFAULT_OPENROUTER_MODEL = "google/gemini-3-pro-image-preview";
35
+ const DEFAULT_ANTIGRAVITY_MODEL = "gemini-3-pro-image";
36
+ const DEFAULT_XAI_IMAGE_MODEL = "grok-imagine-image";
37
+ const IMAGE_TIMEOUT = 3 * 60 * 1000; // 3 minutes
38
+ const MAX_IMAGE_SIZE = 35 * 1024 * 1024;
39
+ const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
40
+ const OPENAI_IMAGE_OUTPUT_FORMAT = "webp";
41
+ const OPENAI_IMAGE_MIME_TYPE = "image/webp";
42
+
43
+ const DEFAULT_ANTIGRAVITY_ENDPOINT_PROD = "https://daily-cloudcode-pa.googleapis.com";
44
+ const DEFAULT_ANTIGRAVITY_ENDPOINT_SANDBOX = "https://daily-cloudcode-pa.sandbox.googleapis.com";
45
+ const IMAGE_SYSTEM_INSTRUCTION =
46
+ "You are an AI image generator. Generate images based on user descriptions. Focus on creating high-quality, visually appealing images that match the user's request.";
47
+
48
+ export type { ImageProvider } from "./image-providers";
49
+ export type ImageProviderPreference = ImageProvider | "auto";
50
+
51
+ interface ImageApiKey {
52
+ provider: ImageProvider;
53
+ apiKey: ApiKey;
54
+ projectId?: string;
55
+ model?: Model;
56
+ }
57
+
58
+ const COMMON_IMAGE_ASPECT_RATIOS = ["1:1", "3:4", "4:3", "9:16", "16:9"] as const;
59
+ const XAI_IMAGE_ASPECT_RATIOS = [...COMMON_IMAGE_ASPECT_RATIOS, "3:2", "2:3"] as const;
60
+ const COMMON_IMAGE_ASPECT_RATIO_SET = new Set<string>(COMMON_IMAGE_ASPECT_RATIOS);
61
+ const IMAGE_PROVIDER_REQUEST_CHOICES = ["auto", ...AUTO_IMAGE_PROVIDER_ORDER] as const;
62
+ const IMAGE_PROVIDER_PREFERENCES = new Set<string>(IMAGE_PROVIDER_REQUEST_CHOICES);
63
+
64
+ const responseModalitySchema = type('"IMAGE" | "TEXT"');
65
+
66
+ const aspectRatioSchema = type.enumerated(...XAI_IMAGE_ASPECT_RATIOS).describe("aspect ratio");
67
+ const imageSizeSchema = type('"1024x1024" | "1536x1024" | "1024x1536"').describe("image size");
68
+
69
+ const inputImageSchema = type({
70
+ "path?": type("string").describe("input image path"),
71
+ "data?": type("string").describe("base64 image data"),
72
+ "mime_type?": type("string").describe("mime type"),
73
+ });
74
+
75
+ const imageProviderSchema = type
76
+ .enumerated(...IMAGE_PROVIDER_REQUEST_CHOICES)
77
+ .describe("image provider for this request; overrides the providers.imageOrder setting (default: use the setting)");
78
+
79
+ export const imageGenSchema = type({
80
+ subject: type("string").describe("main subject"),
81
+ "action?": type("string").describe("what subject is doing"),
82
+ "scene?": type("string").describe("location or environment"),
83
+ "composition?": type("string").describe("camera angle and framing"),
84
+ "lighting?": type("string").describe("lighting setup"),
85
+ "style?": type("string").describe("artistic style"),
86
+ "text?": type("string").describe("text to render"),
87
+ "changes?": type("string[]").describe("edits to make"),
88
+ "aspect_ratio?": aspectRatioSchema,
89
+ "image_size?": imageSizeSchema,
90
+ "input?": inputImageSchema.array().describe("input images"),
91
+ "provider?": imageProviderSchema,
92
+ });
93
+ export type ImageGenParams = typeof imageGenSchema.infer;
94
+ export type GeminiResponseModality = typeof responseModalitySchema.infer;
95
+
96
+ /**
97
+ * Assembles a structured prompt from the provided parameters.
98
+ * For generation: builds "subject, action, scene. composition. lighting. camera. style."
99
+ * For edits: appends change instructions and preserve directives.
100
+ */
101
+ function assemblePrompt(params: ImageGenParams): string {
102
+ const parts: string[] = [];
103
+
104
+ // Core subject line: subject + action + scene
105
+ const subjectParts = [params.subject];
106
+ if (params.action) subjectParts.push(params.action);
107
+ if (params.scene) subjectParts.push(params.scene);
108
+ parts.push(subjectParts.join(", "));
109
+
110
+ // Technical details as separate sentences
111
+ if (params.composition) parts.push(params.composition);
112
+ if (params.lighting) parts.push(params.lighting);
113
+ if (params.style) parts.push(params.style);
114
+
115
+ // Join with periods for sentence structure
116
+ let prompt = `${parts.map(p => p.replace(/[.!,;:]+$/, "")).join(". ")}.`;
117
+
118
+ // Text rendering specs
119
+ if (params.text) {
120
+ prompt += `\n\nText: ${params.text}`;
121
+ }
122
+
123
+ // Edit mode: changes and preserve directives
124
+ if (params.changes?.length) {
125
+ prompt += `\n\nChanges:\n${params.changes.map(c => `- ${c}`).join("\n")}`;
126
+ }
127
+
128
+ return prompt;
129
+ }
130
+
131
+ interface GeminiInlineData {
132
+ data?: string;
133
+ mimeType?: string;
134
+ }
135
+
136
+ interface GeminiPart {
137
+ text?: string;
138
+ inlineData?: GeminiInlineData;
139
+ }
140
+
141
+ interface GeminiCandidate {
142
+ content?: { parts?: GeminiPart[] };
143
+ }
144
+
145
+ interface GeminiSafetyRating {
146
+ category?: string;
147
+ probability?: string;
148
+ }
149
+
150
+ interface GeminiPromptFeedback {
151
+ blockReason?: string;
152
+ safetyRatings?: GeminiSafetyRating[];
153
+ }
154
+
155
+ interface GeminiUsageMetadata {
156
+ promptTokenCount?: number;
157
+ candidatesTokenCount?: number;
158
+ totalTokenCount?: number;
159
+ }
160
+
161
+ interface GeminiGenerateContentResponse {
162
+ candidates?: GeminiCandidate[];
163
+ promptFeedback?: GeminiPromptFeedback;
164
+ usageMetadata?: GeminiUsageMetadata;
165
+ }
166
+
167
+ interface OpenAIResponsesUsage {
168
+ input_tokens?: number;
169
+ output_tokens?: number;
170
+ total_tokens?: number;
171
+ }
172
+
173
+ type ImageUsageMetadata = GeminiUsageMetadata | OpenAIResponsesUsage;
174
+
175
+ type OpenAIImageAction = "edit" | "generate";
176
+
177
+ interface OpenAIInputTextContent {
178
+ type: "input_text";
179
+ text: string;
180
+ }
181
+
182
+ interface OpenAIInputImageContent {
183
+ type: "input_image";
184
+ detail: "auto";
185
+ image_url: string;
186
+ }
187
+
188
+ type OpenAIInputContent = OpenAIInputTextContent | OpenAIInputImageContent;
189
+
190
+ interface OpenAIImageGenerationTool {
191
+ type: "image_generation";
192
+ action: OpenAIImageAction;
193
+ output_format: typeof OPENAI_IMAGE_OUTPUT_FORMAT;
194
+ size?: string;
195
+ }
196
+
197
+ interface OpenAIHostedImageRequest {
198
+ model: string;
199
+ instructions?: string;
200
+ input: Array<{ role: "user"; content: OpenAIInputContent[] }>;
201
+ tools: OpenAIImageGenerationTool[];
202
+ tool_choice: { type: "image_generation" };
203
+ store: false;
204
+ stream?: boolean;
205
+ }
206
+
207
+ interface OpenAIImageGenerationCall {
208
+ id?: string;
209
+ type: "image_generation_call";
210
+ result?: string;
211
+ revised_prompt?: string;
212
+ status?: string;
213
+ }
214
+
215
+ interface OpenAIOutputText {
216
+ type: "output_text" | "refusal";
217
+ text?: string;
218
+ refusal?: string;
219
+ }
220
+
221
+ interface OpenAIOutputMessage {
222
+ id?: string;
223
+ type: "message";
224
+ content?: OpenAIOutputText[];
225
+ }
226
+
227
+ type OpenAIResponseOutput = OpenAIImageGenerationCall | OpenAIOutputMessage;
228
+
229
+ interface OpenAIHostedImageResponse {
230
+ output?: OpenAIResponseOutput[];
231
+ usage?: OpenAIResponsesUsage;
232
+ error?: { code?: string; message?: string };
233
+ }
234
+
235
+ interface OpenAISseEvent {
236
+ type?: string;
237
+ item?: OpenAIResponseOutput;
238
+ response?: OpenAIHostedImageResponse;
239
+ code?: string;
240
+ message?: string;
241
+ error?: { code?: string; message?: string };
242
+ }
243
+
244
+ interface OpenAIHostedImageResult {
245
+ images: InlineImageData[];
246
+ responseText?: string;
247
+ revisedPrompt?: string;
248
+ usage?: OpenAIResponsesUsage;
249
+ }
250
+
251
+ interface OpenRouterImageUrl {
252
+ url: string;
253
+ }
254
+
255
+ interface OpenRouterContentPart {
256
+ type: "text" | "image_url";
257
+ text?: string;
258
+ image_url?: OpenRouterImageUrl;
259
+ }
260
+
261
+ interface OpenRouterMessage {
262
+ content?: string | OpenRouterContentPart[];
263
+ images?: Array<string | { image_url?: OpenRouterImageUrl }>;
264
+ }
265
+
266
+ interface OpenRouterChoice {
267
+ message?: OpenRouterMessage;
268
+ }
269
+
270
+ interface OpenRouterResponse {
271
+ choices?: OpenRouterChoice[];
272
+ }
273
+
274
+ interface AntigravityRequest {
275
+ project: string;
276
+ model: string;
277
+ request: {
278
+ contents: Array<{ role: "user"; parts: Array<{ text?: string; inlineData?: InlineImageData }> }>;
279
+ systemInstruction?: { parts: Array<{ text: string }> };
280
+ generationConfig?: {
281
+ responseModalities?: GeminiResponseModality[];
282
+ imageConfig?: { aspectRatio?: string; imageSize?: string };
283
+ candidateCount?: number;
284
+ };
285
+ safetySettings?: Array<{ category: string; threshold: string }>;
286
+ };
287
+ requestType?: string;
288
+ userAgent?: string;
289
+ requestId?: string;
290
+ }
291
+
292
+ interface XAIImageReference {
293
+ // OpenAI-compat discriminator. Every code example at
294
+ // docs.x.ai/developers/rest-api-reference/inference/images sends this
295
+ // alongside `url`; the schema text doesn't strictly require it, but
296
+ // matching the documented wire format avoids relying on schema-vs-example.
297
+ readonly type: "image_url";
298
+ readonly url: string;
299
+ }
300
+
301
+ interface XAIImageRequestBase {
302
+ readonly model: string;
303
+ readonly prompt: string;
304
+ readonly aspect_ratio: string;
305
+ readonly resolution: "1k" | "2k";
306
+ readonly n: number;
307
+ readonly response_format: "b64_json" | "url";
308
+ }
309
+
310
+ // xAI image request body. Three shapes:
311
+ // 1. text-only generation → POST /v1/images/generations
312
+ // 2. single-source edit (image field) → POST /v1/images/edits
313
+ // 3. multi-reference edit (images field) → POST /v1/images/edits
314
+ // `image` and `images` are mutually exclusive per docs.x.ai; the discriminated
315
+ // union enforces that statically. The runtime cap (XAI_MAX_EDIT_IMAGES) bounds
316
+ // the array length, which TypeScript cannot encode without lossy tuple unions.
317
+ type XAIImageRequestBody =
318
+ | (XAIImageRequestBase & { readonly image?: never; readonly images?: never })
319
+ | (XAIImageRequestBase & { readonly image: XAIImageReference; readonly images?: never })
320
+ | (XAIImageRequestBase & { readonly images: readonly XAIImageReference[]; readonly image?: never });
321
+
322
+ interface AntigravityResponseChunk {
323
+ response?: {
324
+ candidates?: Array<{
325
+ content?: {
326
+ role: string;
327
+ parts?: Array<{
328
+ text?: string;
329
+ inlineData?: { mimeType?: string; data?: string };
330
+ }>;
331
+ };
332
+ }>;
333
+ usageMetadata?: GeminiUsageMetadata;
334
+ };
335
+ }
336
+
337
+ interface ImageGenToolDetails {
338
+ provider: ImageProvider;
339
+ model: string;
340
+ imageCount: number;
341
+ imagePaths: string[];
342
+ images: InlineImageData[];
343
+ responseText?: string;
344
+ promptFeedback?: GeminiPromptFeedback;
345
+ revisedPrompt?: string;
346
+ usage?: ImageUsageMetadata;
347
+ }
348
+
349
+ interface ImageInput {
350
+ path?: string;
351
+ data?: string;
352
+ mime_type?: string;
353
+ }
354
+
355
+ interface InlineImageData {
356
+ data: string;
357
+ mimeType: string;
358
+ }
359
+
360
+ function normalizeDataUrl(data: string): { data: string; mimeType?: string } {
361
+ const match = data.match(/^data:([^;]+);base64,(.+)$/);
362
+ if (!match) return { data };
363
+ return { data: match[2] ?? "", mimeType: match[1] };
364
+ }
365
+
366
+ function resolveOpenRouterModel(model: string): string {
367
+ return model.includes("/") ? model : `google/${model}`;
368
+ }
369
+
370
+ function toDataUrl(image: InlineImageData): string {
371
+ return `data:${image.mimeType};base64,${image.data}`;
372
+ }
373
+
374
+ async function loadImageFromUrl(
375
+ imageUrl: string,
376
+ fetchImpl: FetchImpl,
377
+ signal?: AbortSignal,
378
+ ): Promise<InlineImageData> {
379
+ if (imageUrl.startsWith("data:")) {
380
+ const normalized = normalizeDataUrl(imageUrl.trim());
381
+ if (!normalized.mimeType) {
382
+ throw new Error("mime_type is required when providing raw base64 data.");
383
+ }
384
+ if (!normalized.data) {
385
+ throw new Error("Image data is empty.");
386
+ }
387
+ return { data: normalized.data, mimeType: normalized.mimeType };
388
+ }
389
+
390
+ const response = await fetchImpl(imageUrl, { signal });
391
+ if (!response.ok) {
392
+ const rawText = await response.text();
393
+ throw new Error(`Image download failed (${response.status}): ${rawText}`);
394
+ }
395
+ const contentType = response.headers.get("content-type")?.split(";")[0];
396
+ if (!contentType?.startsWith("image/")) {
397
+ throw new Error(`Unsupported image type from URL: ${imageUrl}`);
398
+ }
399
+ const buffer = await response.bytes();
400
+ return { data: buffer.toBase64(), mimeType: contentType };
401
+ }
402
+
403
+ function collectOpenRouterResponseText(message: OpenRouterMessage | undefined): string | undefined {
404
+ if (!message) return undefined;
405
+ if (typeof message.content === "string") {
406
+ const trimmed = message.content.trim();
407
+ return trimmed.length > 0 ? trimmed : undefined;
408
+ }
409
+ if (Array.isArray(message.content)) {
410
+ const texts = message.content
411
+ .filter(part => part.type === "text")
412
+ .map(part => part.text)
413
+ .filter((text): text is string => Boolean(text));
414
+ const combined = texts.join("\n").trim();
415
+ return combined.length > 0 ? combined : undefined;
416
+ }
417
+ return undefined;
418
+ }
419
+
420
+ function extractOpenRouterImageUrls(message: OpenRouterMessage | undefined): string[] {
421
+ const urls: string[] = [];
422
+ if (!message) return urls;
423
+ for (const image of message.images ?? []) {
424
+ if (typeof image === "string") {
425
+ urls.push(image);
426
+ continue;
427
+ }
428
+ if (image.image_url?.url) {
429
+ urls.push(image.image_url.url);
430
+ }
431
+ }
432
+ if (Array.isArray(message.content)) {
433
+ for (const part of message.content) {
434
+ if (part.type === "image_url" && part.image_url?.url) {
435
+ urls.push(part.image_url.url);
436
+ }
437
+ }
438
+ }
439
+ return urls;
440
+ }
441
+
442
+ /** Configured provider priority set via `providers.imageOrder` (default: none). */
443
+ let configuredImageProviderOrder: readonly ImageProvider[] = [];
444
+
445
+ export function isImageProviderPreference(value: unknown): value is ImageProviderPreference {
446
+ return typeof value === "string" && IMAGE_PROVIDER_PREFERENCES.has(value);
447
+ }
448
+
449
+ /** Set the configured image-provider priority from settings; invalid IDs are dropped. */
450
+ export function setImageProviderOrder(providers: readonly string[]): void {
451
+ configuredImageProviderOrder = providers.filter(isImageProviderId);
452
+ }
453
+ function assertImageAspectRatioSupported(provider: ImageProvider, aspectRatio: ImageGenParams["aspect_ratio"]): void {
454
+ if (!aspectRatio || provider === "xai" || COMMON_IMAGE_ASPECT_RATIO_SET.has(aspectRatio)) {
455
+ return;
456
+ }
457
+ throw new Error(
458
+ `Aspect ratio ${aspectRatio} is only supported by xAI image generation. Set providers.image to xai or use one of ${COMMON_IMAGE_ASPECT_RATIOS.join(", ")}.`,
459
+ );
460
+ }
461
+
462
+ interface ParsedAntigravityCredentials {
463
+ accessToken: string;
464
+ projectId: string;
465
+ }
466
+
467
+ function parseAntigravityCredentials(raw: string): ParsedAntigravityCredentials | null {
468
+ try {
469
+ const parsed = JSON.parse(raw) as { token?: string; projectId?: string };
470
+ if (parsed.token && parsed.projectId) {
471
+ return { accessToken: parsed.token, projectId: parsed.projectId };
472
+ }
473
+ } catch {
474
+ // Invalid JSON
475
+ }
476
+ return null;
477
+ }
478
+
479
+ async function findAntigravityCredentials(
480
+ modelRegistry: ModelRegistry,
481
+ sessionId?: string,
482
+ ): Promise<ImageApiKey | null> {
483
+ const apiKey = await modelRegistry.getApiKeyForProvider("google-antigravity", sessionId, {
484
+ modelId: DEFAULT_ANTIGRAVITY_MODEL,
485
+ });
486
+ if (!apiKey) return null;
487
+
488
+ const parsed = parseAntigravityCredentials(apiKey);
489
+ if (!parsed) return null;
490
+
491
+ return {
492
+ provider: "antigravity",
493
+ apiKey: parsed.accessToken,
494
+ projectId: parsed.projectId,
495
+ };
496
+ }
497
+
498
+ async function findXAIImageCredentials(modelRegistry?: ModelRegistry): Promise<ImageApiKey | null> {
499
+ if (modelRegistry) {
500
+ const creds = await resolveXAIHttpCredentials(modelRegistry);
501
+ if (creds) return { provider: "xai", apiKey: creds.apiKey };
502
+ return null;
503
+ }
504
+ const apiKey = $env.XAI_API_KEY;
505
+ if (apiKey) return { provider: "xai", apiKey };
506
+ return null;
507
+ }
508
+
509
+ async function findOpenRouterImageCredentials(
510
+ modelRegistry?: ModelRegistry,
511
+ sessionId?: string,
512
+ ): Promise<ImageApiKey | null> {
513
+ if (modelRegistry) {
514
+ // AuthStorage.getApiKey already falls back to env keys, so this covers OPENROUTER_API_KEY too.
515
+ const apiKey = await modelRegistry.getApiKeyForProvider("openrouter", sessionId);
516
+ if (apiKey) return { provider: "openrouter", apiKey: modelRegistry.resolver("openrouter", { sessionId }) };
517
+ return null;
518
+ }
519
+ const apiKey = getEnvApiKey("openrouter");
520
+ if (apiKey) return { provider: "openrouter", apiKey };
521
+ return null;
522
+ }
523
+
524
+ async function findGeminiImageCredentials(
525
+ modelRegistry?: ModelRegistry,
526
+ sessionId?: string,
527
+ ): Promise<ImageApiKey | null> {
528
+ if (modelRegistry) {
529
+ // AuthStorage.getApiKey already falls back to env keys (GEMINI_API_KEY), so only
530
+ // GOOGLE_API_KEY needs the explicit check below.
531
+ const apiKey = await modelRegistry.getApiKeyForProvider("google", sessionId);
532
+ if (apiKey) return { provider: "gemini", apiKey: modelRegistry.resolver("google", { sessionId }) };
533
+ } else {
534
+ const envKey = getEnvApiKey("google");
535
+ if (envKey) return { provider: "gemini", apiKey: envKey };
536
+ }
537
+ const googleKey = $env.GOOGLE_API_KEY;
538
+ if (googleKey) return { provider: "gemini", apiKey: googleKey };
539
+ return null;
540
+ }
541
+
542
+ async function findOpenAIHostedImageCredentials(
543
+ modelRegistry: ModelRegistry | undefined,
544
+ activeModel: Model | undefined,
545
+ sessionId?: string,
546
+ ): Promise<ImageApiKey | null> {
547
+ if (!modelRegistry || !isOpenAIHostedImageModel(activeModel)) return null;
548
+ const apiKey = await modelRegistry.getApiKey(activeModel, sessionId);
549
+ if (!isAuthenticated(apiKey)) return null;
550
+ return {
551
+ provider: getOpenAIHostedImageProvider(activeModel),
552
+ apiKey,
553
+ model: activeModel,
554
+ };
555
+ }
556
+
557
+ // Codex (ChatGPT subscription) chat models that carry OpenAI's hosted
558
+ // `image_generation` tool. Priority: newest general model first, then Codex
559
+ // variants; any available openai-codex hosted-image model is the last resort.
560
+ const CODEX_IMAGE_MODEL_PRIORITY = ["gpt-5.5", "gpt-5.4", "gpt-5.1", "gpt-5", "gpt-5-codex"] as const;
561
+
562
+ function resolveDefaultCodexImageModel(modelRegistry: ModelRegistry): Model | undefined {
563
+ for (const id of CODEX_IMAGE_MODEL_PRIORITY) {
564
+ const model = modelRegistry.find("openai-codex", id);
565
+ if (model && isOpenAIHostedImageModel(model)) return model;
566
+ }
567
+ return modelRegistry.getAll().find(model => model.provider === "openai-codex" && isOpenAIHostedImageModel(model));
568
+ }
569
+
570
+ /**
571
+ * Codex subscription (ChatGPT OAuth) image credentials — engages OpenAI's hosted
572
+ * `image_generation` tool through a CONNECTED Codex account, independent of the
573
+ * active chat model. This is what lets image generation run on a ChatGPT
574
+ * subscription (no metered OPENAI_API_KEY) even when the active model is, e.g.,
575
+ * Claude. The active-model-is-codex case is already served by
576
+ * {@link findOpenAIHostedImageCredentials}, so it is skipped here to avoid a
577
+ * duplicate resolution.
578
+ */
579
+ async function findCodexSubscriptionImageCredentials(
580
+ modelRegistry: ModelRegistry | undefined,
581
+ activeModel: Model | undefined,
582
+ sessionId?: string,
583
+ ): Promise<ImageApiKey | null> {
584
+ if (!modelRegistry) return null;
585
+ if (isOpenAIHostedImageModel(activeModel) && getOpenAIHostedImageProvider(activeModel) === "openai-codex") {
586
+ return null;
587
+ }
588
+ // A Codex subscription credential is an OAuth JWT with an account claim. API
589
+ // keys stored under this provider cannot use the ChatGPT backend and must not
590
+ // prevent fallback providers from being selected.
591
+ const token = await modelRegistry.getApiKeyForProvider("openai-codex", sessionId);
592
+ if (!token || !getCodexAccountId(token)) return null;
593
+ const model = resolveDefaultCodexImageModel(modelRegistry);
594
+ if (!model) return null;
595
+ const apiKey = await modelRegistry.getApiKey(model, sessionId);
596
+ if (!isAuthenticated(apiKey) || !getCodexAccountId(apiKey)) return null;
597
+ return { provider: "openai-codex", apiKey, model };
598
+ }
599
+
600
+ function activeImageProvider(model: Model | undefined): Exclude<ImageProviderPreference, "auto"> | null {
601
+ switch (model?.provider) {
602
+ case "openai":
603
+ case "openai-codex":
604
+ return "openai";
605
+ case "google-antigravity":
606
+ return "antigravity";
607
+ case "xai":
608
+ case "xai-oauth":
609
+ return "xai";
610
+ case "openrouter":
611
+ return "openrouter";
612
+ case "google":
613
+ return "gemini";
614
+ default:
615
+ return null;
616
+ }
617
+ }
618
+
619
+ function imageProviderOrder(activeModel: Model | undefined, requested?: ImageProviderPreference): ImageProvider[] {
620
+ const providers: ImageProvider[] = [];
621
+ const added = new Set<ImageProvider>();
622
+ const add = (provider: ImageProvider | null): void => {
623
+ if (!provider || added.has(provider)) return;
624
+ added.add(provider);
625
+ providers.push(provider);
626
+ };
627
+
628
+ // Per-request provider wins, then the configured priority list, then the
629
+ // active session's provider, then the built-in auto order.
630
+ if (requested !== undefined && requested !== "auto") add(requested);
631
+ for (const provider of configuredImageProviderOrder) add(provider);
632
+ add(activeImageProvider(activeModel));
633
+ for (const provider of AUTO_IMAGE_PROVIDER_ORDER) add(provider);
634
+ return providers;
635
+ }
636
+
637
+ async function findImageApiKey(
638
+ provider: Exclude<ImageProviderPreference, "auto">,
639
+ modelRegistry?: ModelRegistry,
640
+ activeModel?: Model,
641
+ sessionId?: string,
642
+ ): Promise<ImageApiKey | null> {
643
+ switch (provider) {
644
+ case "openai":
645
+ return findOpenAIHostedImageCredentials(modelRegistry, activeModel, sessionId);
646
+ case "openai-codex":
647
+ return findCodexSubscriptionImageCredentials(modelRegistry, activeModel, sessionId);
648
+ case "antigravity":
649
+ return modelRegistry ? findAntigravityCredentials(modelRegistry, sessionId) : null;
650
+ case "xai":
651
+ return findXAIImageCredentials(modelRegistry);
652
+ case "openrouter":
653
+ return findOpenRouterImageCredentials(modelRegistry, sessionId);
654
+ case "gemini":
655
+ return findGeminiImageCredentials(modelRegistry, sessionId);
656
+ }
657
+ }
658
+
659
+ async function loadImageFromPath(imagePath: string, cwd: string): Promise<InlineImageData> {
660
+ const resolved = resolveReadPath(imagePath, cwd);
661
+ try {
662
+ const buffer = await Bun.file(resolved).bytes();
663
+ if (buffer.length > MAX_IMAGE_SIZE) {
664
+ throw new Error(`Image file too large: ${imagePath}`);
665
+ }
666
+
667
+ const metadata = parseImageMetadata(buffer);
668
+ const mimeType = metadata?.mimeType;
669
+ if (!mimeType) {
670
+ throw new Error(`Unsupported image type: ${imagePath}`);
671
+ }
672
+
673
+ return { data: buffer.toBase64(), mimeType };
674
+ } catch (err) {
675
+ if (isEnoent(err)) throw new Error(`Image file not found: ${imagePath}`);
676
+ throw err;
677
+ }
678
+ }
679
+
680
+ async function resolveInputImage(input: ImageInput, cwd: string): Promise<InlineImageData> {
681
+ if (input.path) {
682
+ return loadImageFromPath(input.path, cwd);
683
+ }
684
+
685
+ if (input.data) {
686
+ const normalized = normalizeDataUrl(input.data.trim());
687
+ const mimeType = normalized.mimeType ?? input.mime_type;
688
+ if (!mimeType) {
689
+ throw new Error("mime_type is required when providing raw base64 data.");
690
+ }
691
+ if (!normalized.data) {
692
+ throw new Error("Image data is empty.");
693
+ }
694
+ return { data: normalized.data, mimeType };
695
+ }
696
+
697
+ throw new Error("input_images entries must include either path or data.");
698
+ }
699
+
700
+ function getExtensionForMime(mimeType: string): string {
701
+ const map: Record<string, string> = {
702
+ "image/png": "png",
703
+ "image/jpeg": "jpg",
704
+ "image/gif": "gif",
705
+ "image/webp": "webp",
706
+ };
707
+ return map[mimeType] ?? "png";
708
+ }
709
+
710
+ async function saveImageToTemp(image: InlineImageData): Promise<string> {
711
+ const ext = getExtensionForMime(image.mimeType);
712
+ const filename = `omp-image-${Snowflake.next()}.${ext}`;
713
+ const filepath = path.join(os.tmpdir(), filename);
714
+ await Bun.write(filepath, Buffer.from(image.data, "base64"));
715
+ return filepath;
716
+ }
717
+
718
+ async function saveImagesToTemp(images: InlineImageData[]): Promise<string[]> {
719
+ return Promise.all(images.map(saveImageToTemp));
720
+ }
721
+
722
+ function buildResponseSummary(
723
+ provider: ImageProvider,
724
+ model: string,
725
+ imagePaths: string[],
726
+ responseText: string | undefined,
727
+ ): string {
728
+ const lines = [`Provider: ${provider}`, `Model: ${model}`, `Generated ${imagePaths.length} image(s):`];
729
+ for (const p of imagePaths) {
730
+ lines.push(` ${p}`);
731
+ }
732
+ if (responseText) {
733
+ lines.push("", responseText.trim());
734
+ }
735
+ return lines.join("\n");
736
+ }
737
+
738
+ function collectResponseText(parts: GeminiPart[]): string | undefined {
739
+ const texts = parts.map(part => part.text).filter((text): text is string => Boolean(text));
740
+ const combined = texts.join("\n").trim();
741
+ return combined.length > 0 ? combined : undefined;
742
+ }
743
+
744
+ function collectInlineImages(parts: GeminiPart[]): InlineImageData[] {
745
+ const images: InlineImageData[] = [];
746
+ for (const part of parts) {
747
+ const data = part.inlineData?.data;
748
+ const mimeType = part.inlineData?.mimeType;
749
+ if (!data || !mimeType) continue;
750
+ images.push({ data, mimeType });
751
+ }
752
+ return images;
753
+ }
754
+
755
+ function isOpenAIHostedImageModel(model: Model | undefined): model is Model {
756
+ if (!model) return false;
757
+ if (model.provider !== "openai" && model.provider !== "openai-codex") return false;
758
+ if (model.api !== "openai-responses" && model.api !== "openai-codex-responses") return false;
759
+ const modelId = model.id.toLowerCase();
760
+ return modelId.startsWith("gpt-") || modelId === "o3" || modelId.startsWith("o3-");
761
+ }
762
+
763
+ function getOpenAIHostedImageProvider(model: Model): ImageProvider {
764
+ return model.api === "openai-codex-responses" || model.provider === "openai-codex" ? "openai-codex" : "openai";
765
+ }
766
+
767
+ function resolveOpenAIImageSize(aspectRatio: string | undefined, imageSize: string | undefined): string | undefined {
768
+ if (imageSize) return imageSize;
769
+ switch (aspectRatio) {
770
+ case "1:1":
771
+ return "1024x1024";
772
+ case "3:4":
773
+ case "9:16":
774
+ return "1024x1536";
775
+ case "4:3":
776
+ case "16:9":
777
+ return "1536x1024";
778
+ default:
779
+ return undefined;
780
+ }
781
+ }
782
+
783
+ function buildOpenAIHostedImageRequest(
784
+ model: Model,
785
+ promptText: string,
786
+ params: ImageGenParams,
787
+ inputImages: InlineImageData[],
788
+ stream: boolean,
789
+ ): OpenAIHostedImageRequest {
790
+ const content: OpenAIInputContent[] = [{ type: "input_text", text: promptText }];
791
+ for (const image of inputImages) {
792
+ content.push({ type: "input_image", detail: "auto", image_url: toDataUrl(image) });
793
+ }
794
+
795
+ const size = resolveOpenAIImageSize(params.aspect_ratio, params.image_size);
796
+ const tool: OpenAIImageGenerationTool = {
797
+ type: "image_generation",
798
+ action: inputImages.length > 0 ? "edit" : "generate",
799
+ output_format: OPENAI_IMAGE_OUTPUT_FORMAT,
800
+ ...(size ? { size } : {}),
801
+ };
802
+
803
+ return {
804
+ model: model.id,
805
+ input: [{ role: "user", content }],
806
+ tools: [tool],
807
+ tool_choice: { type: "image_generation" },
808
+ store: false,
809
+ ...(stream
810
+ ? {
811
+ instructions:
812
+ "You are an AI image generator. Generate images based on user descriptions. Focus on creating high-quality, visually appealing images that match the user's request.",
813
+ }
814
+ : {}),
815
+ ...(stream ? { stream: true } : {}),
816
+ };
817
+ }
818
+
819
+ function createOpenAIInlineImage(data: string): InlineImageData {
820
+ const bytes = Buffer.from(data, "base64");
821
+ const mimeType = parseImageMetadata(bytes)?.mimeType ?? OPENAI_IMAGE_MIME_TYPE;
822
+ return { data, mimeType };
823
+ }
824
+
825
+ function collectOpenAIHostedImageResult(response: OpenAIHostedImageResponse): OpenAIHostedImageResult {
826
+ const images: InlineImageData[] = [];
827
+ const textParts: string[] = [];
828
+ let revisedPrompt: string | undefined;
829
+
830
+ for (const output of response.output ?? []) {
831
+ if (output.type === "image_generation_call") {
832
+ if (output.result) {
833
+ images.push(createOpenAIInlineImage(output.result));
834
+ }
835
+ if (output.revised_prompt) {
836
+ revisedPrompt = output.revised_prompt;
837
+ }
838
+ continue;
839
+ }
840
+
841
+ for (const part of output.content ?? []) {
842
+ if (part.type === "output_text" && part.text) {
843
+ textParts.push(part.text);
844
+ } else if (part.type === "refusal" && part.refusal) {
845
+ textParts.push(part.refusal);
846
+ }
847
+ }
848
+ }
849
+
850
+ const responseText = textParts.join("\n").trim();
851
+ return {
852
+ images,
853
+ revisedPrompt,
854
+ responseText: responseText.length > 0 ? responseText : undefined,
855
+ usage: response.usage,
856
+ };
857
+ }
858
+
859
+ function getOpenAIResponseErrorMessage(rawText: string): string {
860
+ try {
861
+ const parsed = JSON.parse(rawText) as { error?: { message?: string } };
862
+ return parsed.error?.message ?? rawText;
863
+ } catch {
864
+ return rawText;
865
+ }
866
+ }
867
+
868
+ function getOpenAIBaseUrl(model: Model): string {
869
+ const fallback =
870
+ model.api === "openai-codex-responses" || model.provider === "openai-codex"
871
+ ? CODEX_BASE_URL
872
+ : DEFAULT_OPENAI_BASE_URL;
873
+ return (model.baseUrl || fallback).replace(/\/+$/, "");
874
+ }
875
+
876
+ function getOpenAIResponsesUrl(model: Model): string {
877
+ const baseUrl = getOpenAIBaseUrl(model);
878
+ if (model.api !== "openai-codex-responses" && model.provider !== "openai-codex") {
879
+ return `${baseUrl}/responses`;
880
+ }
881
+ const baseWithSlash = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
882
+ return new URL(URL_PATHS.RESPONSES.slice(1), baseWithSlash)
883
+ .toString()
884
+ .replace(URL_PATHS.RESPONSES, URL_PATHS.CODEX_RESPONSES);
885
+ }
886
+
887
+ function buildOpenAIImageHeaders(model: Model, apiKey: string, sessionId: string | undefined): Headers {
888
+ const headers = new Headers(model.headers ?? {});
889
+ headers.set("Content-Type", "application/json");
890
+ headers.set("Authorization", `Bearer ${apiKey}`);
891
+
892
+ if (model.api === "openai-codex-responses" || model.provider === "openai-codex") {
893
+ const accountId = getCodexAccountId(apiKey);
894
+ headers.delete("x-api-key");
895
+ if (accountId) {
896
+ headers.set(OPENAI_HEADERS.ACCOUNT_ID, accountId);
897
+ }
898
+ headers.set(OPENAI_HEADERS.BETA, OPENAI_HEADER_VALUES.BETA_RESPONSES);
899
+ headers.set(OPENAI_HEADERS.ORIGINATOR, OPENAI_HEADER_VALUES.ORIGINATOR_CODEX);
900
+ headers.set("User-Agent", `pi/${packageJson.version} (${os.platform()} ${os.release()}; ${os.arch()})`);
901
+ if (sessionId) {
902
+ headers.set(OPENAI_HEADERS.CONVERSATION_ID, sessionId);
903
+ headers.set(OPENAI_HEADERS.SESSION_ID, sessionId);
904
+ }
905
+ }
906
+
907
+ return headers;
908
+ }
909
+
910
+ async function parseOpenAIHostedImageSse(response: Response, signal?: AbortSignal): Promise<OpenAIHostedImageResult> {
911
+ if (!response.body) {
912
+ throw new Error("No response body");
913
+ }
914
+
915
+ const fallbackOutput: OpenAIResponseOutput[] = [];
916
+ let completedResponse: OpenAIHostedImageResponse | undefined;
917
+
918
+ for await (const event of readSseJson<OpenAISseEvent>(response.body, signal)) {
919
+ if (event.type === "error") {
920
+ const message = event.error?.message ?? event.message ?? "OpenAI image request failed";
921
+ throw new Error(message);
922
+ }
923
+ if (event.type === "response.failed") {
924
+ const message = event.response?.error?.message ?? "OpenAI image request failed";
925
+ throw new Error(message);
926
+ }
927
+ if (event.type === "response.output_item.done" && event.item) {
928
+ fallbackOutput.push(event.item);
929
+ }
930
+ if ((event.type === "response.completed" || event.type === "response.done") && event.response) {
931
+ completedResponse = event.response;
932
+ }
933
+ }
934
+
935
+ return collectOpenAIHostedImageResult(
936
+ completedResponse?.output?.length
937
+ ? completedResponse
938
+ : { output: fallbackOutput, usage: completedResponse?.usage },
939
+ );
940
+ }
941
+
942
+ async function generateOpenAIHostedImage(
943
+ apiKey: string,
944
+ model: Model,
945
+ params: ImageGenParams,
946
+ inputImages: InlineImageData[],
947
+ fetchImpl: FetchImpl,
948
+ signal: AbortSignal | undefined,
949
+ sessionId: string | undefined,
950
+ ): Promise<OpenAIHostedImageResult> {
951
+ const promptText = assemblePrompt(params);
952
+ const stream = model.api === "openai-codex-responses" || model.provider === "openai-codex";
953
+ const requestBody = buildOpenAIHostedImageRequest(model, promptText, params, inputImages, stream);
954
+ const response = await fetchImpl(getOpenAIResponsesUrl(model), {
955
+ method: "POST",
956
+ headers: buildOpenAIImageHeaders(model, apiKey, sessionId),
957
+ body: JSON.stringify(requestBody),
958
+ signal,
959
+ });
960
+
961
+ if (!response.ok) {
962
+ const errorText = await response.text();
963
+ throw new ProviderHttpError(
964
+ `OpenAI image request failed (${response.status}): ${getOpenAIResponseErrorMessage(errorText)}`,
965
+ response.status,
966
+ { headers: response.headers },
967
+ );
968
+ }
969
+
970
+ const contentType = response.headers.get("content-type") ?? "";
971
+ if (stream || contentType.includes("text/event-stream")) {
972
+ return parseOpenAIHostedImageSse(response, signal);
973
+ }
974
+
975
+ const data = (await response.json()) as OpenAIHostedImageResponse;
976
+ return collectOpenAIHostedImageResult(data);
977
+ }
978
+
979
+ function combineParts(response: GeminiGenerateContentResponse): GeminiPart[] {
980
+ const parts: GeminiPart[] = [];
981
+ for (const candidate of response.candidates ?? []) {
982
+ const candidateParts = candidate.content?.parts ?? [];
983
+ parts.push(...candidateParts);
984
+ }
985
+ return parts;
986
+ }
987
+
988
+ function buildAntigravityRequest(
989
+ prompt: string,
990
+ model: string,
991
+ projectId: string,
992
+ aspectRatio: string | undefined,
993
+ imageSize: string | undefined,
994
+ inputImages: InlineImageData[],
995
+ ): AntigravityRequest {
996
+ const parts: Array<{ text?: string; inlineData?: InlineImageData }> = [];
997
+ for (const image of inputImages) {
998
+ parts.push({ inlineData: image });
999
+ }
1000
+ parts.push({ text: prompt });
1001
+
1002
+ const imageConfig = aspectRatio || imageSize ? { aspectRatio: aspectRatio, imageSize: imageSize } : undefined;
1003
+
1004
+ return {
1005
+ project: projectId,
1006
+ model,
1007
+ request: {
1008
+ contents: [{ role: "user", parts }],
1009
+ systemInstruction: { parts: [{ text: IMAGE_SYSTEM_INSTRUCTION }] },
1010
+ generationConfig: {
1011
+ responseModalities: ["IMAGE"],
1012
+ imageConfig,
1013
+ candidateCount: 1,
1014
+ },
1015
+ safetySettings: [
1016
+ { category: "HARM_CATEGORY_HARASSMENT", threshold: "BLOCK_ONLY_HIGH" },
1017
+ { category: "HARM_CATEGORY_HATE_SPEECH", threshold: "BLOCK_ONLY_HIGH" },
1018
+ { category: "HARM_CATEGORY_SEXUALLY_EXPLICIT", threshold: "BLOCK_ONLY_HIGH" },
1019
+ { category: "HARM_CATEGORY_DANGEROUS_CONTENT", threshold: "BLOCK_ONLY_HIGH" },
1020
+ { category: "HARM_CATEGORY_CIVIC_INTEGRITY", threshold: "BLOCK_ONLY_HIGH" },
1021
+ ],
1022
+ },
1023
+ requestType: "agent",
1024
+ requestId: `agent-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,
1025
+ userAgent: "antigravity",
1026
+ };
1027
+ }
1028
+
1029
+ // xAI image-edit cap per docs.x.ai (POST /v1/images/edits supports up to 3
1030
+ // source images for multi-reference editing).
1031
+ const XAI_MAX_EDIT_IMAGES = 3;
1032
+
1033
+ // Map the OpenAI-style pixel-size enum (image_size) to xAI's discrete tier.
1034
+ // "1024x1024" → "1k"; anything wider (1536x... or ...x1536) → "2k". Absent
1035
+ // image_size defaults to "1k", matching hermes-agent's DEFAULT_RESOLUTION
1036
+ // (plugins/image_gen/xai/__init__.py:71).
1037
+ function resolveXAIResolution(imageSize: string | undefined): "1k" | "2k" {
1038
+ if (!imageSize || imageSize === "1024x1024") return "1k";
1039
+ return "2k";
1040
+ }
1041
+
1042
+ // Build the discriminated edit body. Caller must ensure images.length is in
1043
+ // [1, XAI_MAX_EDIT_IMAGES]; the bound check fires earlier in execute().
1044
+ function buildXAIEditPayload(base: XAIImageRequestBase, images: readonly InlineImageData[]): XAIImageRequestBody {
1045
+ const refs: readonly XAIImageReference[] = images.map(img => ({
1046
+ type: "image_url",
1047
+ url: toDataUrl(img),
1048
+ }));
1049
+ const [first, ...rest] = refs;
1050
+ if (first === undefined) return base; // unreachable: caller checked images.length > 0
1051
+ return rest.length === 0 ? { ...base, image: first } : { ...base, images: refs };
1052
+ }
1053
+
1054
+ interface AntigravitySseResult {
1055
+ images: InlineImageData[];
1056
+ text: string[];
1057
+ usage?: GeminiUsageMetadata;
1058
+ }
1059
+
1060
+ async function parseAntigravitySseForImage(response: Response, signal?: AbortSignal): Promise<AntigravitySseResult> {
1061
+ if (!response.body) {
1062
+ throw new Error("No response body");
1063
+ }
1064
+
1065
+ const textParts: string[] = [];
1066
+ const images: InlineImageData[] = [];
1067
+ let usage: GeminiUsageMetadata | undefined;
1068
+
1069
+ for await (const chunk of readSseJson<AntigravityResponseChunk>(response.body, signal)) {
1070
+ const responseData = chunk.response;
1071
+ if (!responseData) continue;
1072
+ if (!responseData.candidates) continue;
1073
+ for (const candidate of responseData.candidates) {
1074
+ const parts = candidate.content?.parts;
1075
+ if (!parts) continue;
1076
+ for (const part of parts) {
1077
+ if (part.text) {
1078
+ textParts.push(part.text);
1079
+ }
1080
+ const inlineData = part.inlineData;
1081
+ if (inlineData?.data && inlineData.mimeType) {
1082
+ images.push({ data: inlineData.data, mimeType: inlineData.mimeType });
1083
+ }
1084
+ }
1085
+ }
1086
+ if (responseData.usageMetadata) {
1087
+ usage = responseData.usageMetadata;
1088
+ }
1089
+ }
1090
+
1091
+ return { images, text: textParts, usage };
1092
+ }
1093
+
1094
+ export const imageGenTool: CustomTool<typeof imageGenSchema, ImageGenToolDetails> = {
1095
+ name: "generate_image",
1096
+ label: "GenerateImage",
1097
+ strict: false,
1098
+ approval: "write",
1099
+ description: prompt.render(imageGenDescription),
1100
+ parameters: imageGenSchema,
1101
+ async execute(_toolCallId, params, _onUpdate, ctx, signal) {
1102
+ return untilAborted(signal, async () => {
1103
+ const sessionId = ctx.sessionManager.getSessionId();
1104
+ const providerOrder = imageProviderOrder(ctx.model, params.provider);
1105
+ const cwd = ctx.sessionManager.getCwd();
1106
+ const requestSignal = ptree.combineSignals(signal, IMAGE_TIMEOUT);
1107
+ const fetchImpl = ctx.fetch ?? fetch;
1108
+ const failures: Array<{ provider: ImageProvider; error: ProviderHttpError }> = [];
1109
+ let unsupportedAspectRatioProvider: ImageProvider | undefined;
1110
+ let foundCredentials = false;
1111
+ let resolvedImageCache: InlineImageData[] | undefined;
1112
+
1113
+ for (const preferredProvider of providerOrder) {
1114
+ const apiKey = await findImageApiKey(preferredProvider, ctx.modelRegistry, ctx.model, sessionId);
1115
+ if (!apiKey) continue;
1116
+ foundCredentials = true;
1117
+ if (!resolvedImageCache) {
1118
+ resolvedImageCache = [];
1119
+ if (params.input?.length) {
1120
+ for (const input of params.input) {
1121
+ resolvedImageCache.push(await resolveInputImage(input, cwd));
1122
+ }
1123
+ }
1124
+ }
1125
+ const resolvedImages = resolvedImageCache;
1126
+
1127
+ const provider = apiKey.provider;
1128
+ try {
1129
+ const model =
1130
+ provider === "openai" || provider === "openai-codex"
1131
+ ? (apiKey.model?.id ?? "gpt")
1132
+ : provider === "antigravity"
1133
+ ? DEFAULT_ANTIGRAVITY_MODEL
1134
+ : provider === "openrouter"
1135
+ ? DEFAULT_OPENROUTER_MODEL
1136
+ : provider === "xai"
1137
+ ? DEFAULT_XAI_IMAGE_MODEL
1138
+ : DEFAULT_MODEL;
1139
+ const resolvedModel = provider === "openrouter" ? resolveOpenRouterModel(model) : model;
1140
+ if (
1141
+ params.aspect_ratio &&
1142
+ provider !== "xai" &&
1143
+ !COMMON_IMAGE_ASPECT_RATIO_SET.has(params.aspect_ratio)
1144
+ ) {
1145
+ unsupportedAspectRatioProvider ??= provider;
1146
+ continue;
1147
+ }
1148
+ if (provider === "openai" || provider === "openai-codex") {
1149
+ if (!apiKey.model) {
1150
+ throw new Error("Missing active GPT model for OpenAI image generation");
1151
+ }
1152
+
1153
+ const hostedModel = apiKey.model;
1154
+ const hostedKey: ApiKey = ctx.modelRegistry.resolver(hostedModel, sessionId);
1155
+
1156
+ const parsed = await withAuth(
1157
+ hostedKey,
1158
+ key =>
1159
+ generateOpenAIHostedImage(
1160
+ key,
1161
+ hostedModel,
1162
+ params,
1163
+ resolvedImages,
1164
+ fetchImpl,
1165
+ requestSignal,
1166
+ sessionId,
1167
+ ),
1168
+ { signal: requestSignal },
1169
+ );
1170
+
1171
+ if (parsed.images.length === 0) {
1172
+ const messageText = parsed.responseText ? `\n\n${parsed.responseText}` : "";
1173
+ return {
1174
+ content: [{ type: "text", text: `No image data returned.${messageText}` }],
1175
+ details: {
1176
+ provider,
1177
+ model,
1178
+ imageCount: 0,
1179
+ imagePaths: [],
1180
+ images: [],
1181
+ responseText: parsed.responseText,
1182
+ revisedPrompt: parsed.revisedPrompt,
1183
+ usage: parsed.usage,
1184
+ },
1185
+ };
1186
+ }
1187
+
1188
+ const imagePaths = await saveImagesToTemp(parsed.images);
1189
+
1190
+ return {
1191
+ content: [
1192
+ { type: "text", text: buildResponseSummary(provider, model, imagePaths, parsed.responseText) },
1193
+ ],
1194
+ details: {
1195
+ provider,
1196
+ model,
1197
+ imageCount: parsed.images.length,
1198
+ imagePaths,
1199
+ images: parsed.images,
1200
+ responseText: parsed.responseText,
1201
+ revisedPrompt: parsed.revisedPrompt,
1202
+ usage: parsed.usage,
1203
+ },
1204
+ };
1205
+ }
1206
+
1207
+ if (provider === "antigravity") {
1208
+ if (!apiKey.projectId) {
1209
+ throw new Error("Missing projectId in antigravity credentials");
1210
+ }
1211
+
1212
+ const prompt = assemblePrompt(params);
1213
+ const antigravityKey: ApiKey = ctx.modelRegistry.resolver("google-antigravity", {
1214
+ sessionId,
1215
+ modelId: DEFAULT_ANTIGRAVITY_MODEL,
1216
+ });
1217
+
1218
+ const response = await withAuth(
1219
+ antigravityKey,
1220
+ async key => {
1221
+ // On a retry the resolver yields the raw stored credential JSON
1222
+ // ({ token, projectId }); the initial seed is the already-parsed
1223
+ // access token. Tolerate both, falling back to the seed projectId.
1224
+ const rotated = parseAntigravityCredentials(key);
1225
+ const bearer = rotated?.accessToken ?? key;
1226
+ const projectId = rotated?.projectId ?? apiKey.projectId!;
1227
+ const requestBody = buildAntigravityRequest(
1228
+ prompt,
1229
+ model,
1230
+ projectId,
1231
+ params.aspect_ratio,
1232
+ params.image_size,
1233
+ resolvedImages,
1234
+ );
1235
+
1236
+ let endpoints = [DEFAULT_ANTIGRAVITY_ENDPOINT_PROD, DEFAULT_ANTIGRAVITY_ENDPOINT_SANDBOX];
1237
+ try {
1238
+ const mode = settings.get("providers.antigravityEndpoint");
1239
+ if (mode === "production") {
1240
+ endpoints = [DEFAULT_ANTIGRAVITY_ENDPOINT_PROD];
1241
+ } else if (mode === "sandbox") {
1242
+ endpoints = [DEFAULT_ANTIGRAVITY_ENDPOINT_SANDBOX];
1243
+ }
1244
+ } catch {
1245
+ // Ignored
1246
+ }
1247
+
1248
+ let resp: Response | undefined;
1249
+ let lastError: Error | undefined;
1250
+
1251
+ for (let i = 0; i < endpoints.length; i++) {
1252
+ const endpoint = endpoints[i];
1253
+ const isLastEndpoint = i === endpoints.length - 1;
1254
+ try {
1255
+ resp = await fetchImpl(`${endpoint}/v1internal:streamGenerateContent?alt=sse`, {
1256
+ method: "POST",
1257
+ headers: {
1258
+ Authorization: `Bearer ${bearer}`,
1259
+ "Content-Type": "application/json",
1260
+ Accept: "text/event-stream",
1261
+ "User-Agent": getAntigravityUserAgent(),
1262
+ },
1263
+ body: JSON.stringify(requestBody),
1264
+ signal: requestSignal,
1265
+ });
1266
+
1267
+ if (resp.ok) {
1268
+ break;
1269
+ }
1270
+
1271
+ const errorText = await resp.text();
1272
+ let message = errorText;
1273
+ try {
1274
+ const parsedErr = JSON.parse(errorText) as { error?: { message?: string } };
1275
+ message = parsedErr.error?.message ?? message;
1276
+ } catch {
1277
+ // Keep raw text.
1278
+ }
1279
+
1280
+ lastError = new ProviderHttpError(
1281
+ `Antigravity image request failed (${resp.status}): ${message}`,
1282
+ resp.status,
1283
+ { headers: resp.headers },
1284
+ );
1285
+
1286
+ if (resp.status === 429 || (resp.status >= 500 && resp.status < 600)) {
1287
+ if (!isLastEndpoint) {
1288
+ continue;
1289
+ }
1290
+ }
1291
+ break;
1292
+ } catch (error) {
1293
+ lastError = error as Error;
1294
+ if (isLastEndpoint) {
1295
+ break;
1296
+ }
1297
+ }
1298
+ }
1299
+
1300
+ if (!resp?.ok) {
1301
+ throw lastError ?? new Error("Antigravity image generation failed");
1302
+ }
1303
+
1304
+ return resp;
1305
+ },
1306
+ { signal: requestSignal },
1307
+ );
1308
+
1309
+ const parsed = await parseAntigravitySseForImage(response, requestSignal);
1310
+ const responseText = parsed.text.length > 0 ? parsed.text.join(" ") : undefined;
1311
+
1312
+ if (parsed.images.length === 0) {
1313
+ const messageText = responseText ? `\n\n${responseText}` : "";
1314
+ return {
1315
+ content: [{ type: "text", text: `No image data returned.${messageText}` }],
1316
+ details: {
1317
+ provider,
1318
+ model,
1319
+ imageCount: 0,
1320
+ imagePaths: [],
1321
+ images: [],
1322
+ responseText,
1323
+ usage: parsed.usage,
1324
+ },
1325
+ };
1326
+ }
1327
+
1328
+ const imagePaths = await saveImagesToTemp(parsed.images);
1329
+
1330
+ return {
1331
+ content: [{ type: "text", text: buildResponseSummary(provider, model, imagePaths, responseText) }],
1332
+ details: {
1333
+ provider,
1334
+ model,
1335
+ imageCount: parsed.images.length,
1336
+ imagePaths,
1337
+ images: parsed.images,
1338
+ responseText,
1339
+ usage: parsed.usage,
1340
+ },
1341
+ };
1342
+ }
1343
+
1344
+ if (provider === "xai") {
1345
+ if (!ctx.modelRegistry) {
1346
+ throw new Error("Missing modelRegistry for xAI image generation");
1347
+ }
1348
+ const xaiCreds = await resolveXAIHttpCredentials(ctx.modelRegistry, resolvedModel);
1349
+ if (!xaiCreds) {
1350
+ throw new Error(
1351
+ "No xAI credentials. Run /login → xAI Grok OAuth (SuperGrok or X Premium+) or set XAI_API_KEY.",
1352
+ );
1353
+ }
1354
+
1355
+ const prompt = assemblePrompt(params);
1356
+ const aspectRatio = params.aspect_ratio ?? "1:1";
1357
+ const xaiResolution = resolveXAIResolution(params.image_size);
1358
+
1359
+ const isEdit = resolvedImages.length > 0;
1360
+ if (isEdit && resolvedImages.length > XAI_MAX_EDIT_IMAGES) {
1361
+ throw new Error(
1362
+ `xAI image edits accept up to ${XAI_MAX_EDIT_IMAGES} reference images; got ${resolvedImages.length}.`,
1363
+ );
1364
+ }
1365
+
1366
+ const xaiBaseBody: XAIImageRequestBase = {
1367
+ model: resolvedModel,
1368
+ prompt,
1369
+ aspect_ratio: aspectRatio,
1370
+ resolution: xaiResolution,
1371
+ n: 1,
1372
+ response_format: "b64_json",
1373
+ };
1374
+ const xaiBody: XAIImageRequestBody = isEdit
1375
+ ? buildXAIEditPayload(xaiBaseBody, resolvedImages)
1376
+ : xaiBaseBody;
1377
+ const xaiEndpoint = isEdit ? "/images/edits" : "/images/generations";
1378
+
1379
+ const xaiKey: ApiKey = ctx.modelRegistry.resolver(xaiCreds.provider, {
1380
+ sessionId,
1381
+ baseUrl: xaiCreds.baseURL,
1382
+ });
1383
+
1384
+ const xaiRawText = await withAuth(
1385
+ xaiKey,
1386
+ async key => {
1387
+ const resp = await fetchImpl(`${xaiCreds.baseURL}${xaiEndpoint}`, {
1388
+ method: "POST",
1389
+ headers: {
1390
+ Authorization: `Bearer ${key}`,
1391
+ "Content-Type": "application/json",
1392
+ "User-Agent": ohMyPiXAIUserAgent(),
1393
+ },
1394
+ body: JSON.stringify(xaiBody),
1395
+ signal: requestSignal,
1396
+ });
1397
+ const rawText = await resp.text();
1398
+ if (!resp.ok) {
1399
+ let message = rawText;
1400
+ try {
1401
+ const parsedErr = JSON.parse(rawText) as { error?: { message?: string } };
1402
+ message = parsedErr.error?.message ?? message;
1403
+ } catch {
1404
+ // Keep raw text.
1405
+ }
1406
+ throw new ProviderHttpError(
1407
+ `xAI image request failed (${resp.status}): ${message}`,
1408
+ resp.status,
1409
+ {
1410
+ headers: resp.headers,
1411
+ },
1412
+ );
1413
+ }
1414
+ return rawText;
1415
+ },
1416
+ { signal: requestSignal },
1417
+ );
1418
+
1419
+ const xaiData = JSON.parse(xaiRawText) as {
1420
+ data?: Array<{ b64_json?: string; url?: string }>;
1421
+ };
1422
+ const xaiInlineImages: InlineImageData[] = [];
1423
+ for (const entry of xaiData.data ?? []) {
1424
+ if (entry.b64_json) {
1425
+ const bytes = Buffer.from(entry.b64_json, "base64");
1426
+ const mimeType = parseImageMetadata(bytes)?.mimeType ?? "image/png";
1427
+ xaiInlineImages.push({ data: entry.b64_json, mimeType });
1428
+ } else if (entry.url) {
1429
+ xaiInlineImages.push(await loadImageFromUrl(entry.url, fetchImpl, requestSignal));
1430
+ }
1431
+ }
1432
+
1433
+ if (xaiInlineImages.length === 0) {
1434
+ return {
1435
+ content: [{ type: "text", text: "No image data returned." }],
1436
+ details: {
1437
+ provider,
1438
+ model: resolvedModel,
1439
+ imageCount: 0,
1440
+ imagePaths: [],
1441
+ images: [],
1442
+ },
1443
+ };
1444
+ }
1445
+
1446
+ const xaiImagePaths = await saveImagesToTemp(xaiInlineImages);
1447
+
1448
+ return {
1449
+ content: [
1450
+ { type: "text", text: buildResponseSummary(provider, resolvedModel, xaiImagePaths, undefined) },
1451
+ ],
1452
+ details: {
1453
+ provider,
1454
+ model: resolvedModel,
1455
+ imageCount: xaiInlineImages.length,
1456
+ imagePaths: xaiImagePaths,
1457
+ images: xaiInlineImages,
1458
+ },
1459
+ };
1460
+ }
1461
+
1462
+ if (provider === "openrouter") {
1463
+ const prompt = assemblePrompt(params);
1464
+ const contentParts: OpenRouterContentPart[] = [{ type: "text", text: prompt }];
1465
+ for (const image of resolvedImages) {
1466
+ contentParts.push({ type: "image_url", image_url: { url: toDataUrl(image) } });
1467
+ }
1468
+
1469
+ const requestBody = {
1470
+ model: resolvedModel,
1471
+ messages: [{ role: "user" as const, content: contentParts }],
1472
+ };
1473
+
1474
+ const rawText = await withAuth(
1475
+ apiKey.apiKey,
1476
+ async key => {
1477
+ const resp = await fetchImpl("https://openrouter.ai/api/v1/chat/completions", {
1478
+ method: "POST",
1479
+ headers: {
1480
+ "Content-Type": "application/json",
1481
+ Authorization: `Bearer ${key}`,
1482
+ "HTTP-Referer": "https://omp.sh/",
1483
+ "X-OpenRouter-Title": "Oh-My-Pi",
1484
+ "X-OpenRouter-Categories": "cli-agent",
1485
+ },
1486
+ body: JSON.stringify(requestBody),
1487
+ signal: requestSignal,
1488
+ });
1489
+ const text = await resp.text();
1490
+ if (!resp.ok) {
1491
+ let message = text;
1492
+ try {
1493
+ const parsed = JSON.parse(text) as { error?: { message?: string } };
1494
+ message = parsed.error?.message ?? message;
1495
+ } catch {
1496
+ // Keep raw text.
1497
+ }
1498
+ throw new ProviderHttpError(
1499
+ `OpenRouter image request failed (${resp.status}): ${message}`,
1500
+ resp.status,
1501
+ { headers: resp.headers },
1502
+ );
1503
+ }
1504
+ return text;
1505
+ },
1506
+ { signal: requestSignal },
1507
+ );
1508
+
1509
+ const data = JSON.parse(rawText) as OpenRouterResponse;
1510
+ const message = data.choices?.[0]?.message;
1511
+ const responseText = collectOpenRouterResponseText(message);
1512
+ const imageUrls = extractOpenRouterImageUrls(message);
1513
+ const inlineImages: InlineImageData[] = [];
1514
+ for (const imageUrl of imageUrls) {
1515
+ inlineImages.push(await loadImageFromUrl(imageUrl, fetchImpl, requestSignal));
1516
+ }
1517
+
1518
+ if (inlineImages.length === 0) {
1519
+ const messageText = responseText ? `\n\n${responseText}` : "";
1520
+ return {
1521
+ content: [{ type: "text", text: `No image data returned.${messageText}` }],
1522
+ details: {
1523
+ provider,
1524
+ model: resolvedModel,
1525
+ imageCount: 0,
1526
+ imagePaths: [],
1527
+ images: [],
1528
+ responseText,
1529
+ },
1530
+ };
1531
+ }
1532
+
1533
+ const imagePaths = await saveImagesToTemp(inlineImages);
1534
+
1535
+ return {
1536
+ content: [
1537
+ { type: "text", text: buildResponseSummary(provider, resolvedModel, imagePaths, responseText) },
1538
+ ],
1539
+ details: {
1540
+ provider,
1541
+ model: resolvedModel,
1542
+ imageCount: inlineImages.length,
1543
+ imagePaths,
1544
+ images: inlineImages,
1545
+ responseText,
1546
+ },
1547
+ };
1548
+ }
1549
+
1550
+ const parts = [] as Array<{ text?: string; inlineData?: InlineImageData }>;
1551
+ for (const image of resolvedImages) {
1552
+ parts.push({ inlineData: image });
1553
+ }
1554
+ parts.push({ text: assemblePrompt(params) });
1555
+
1556
+ const generationConfig: {
1557
+ responseModalities: GeminiResponseModality[];
1558
+ imageConfig?: { aspectRatio?: string; imageSize?: string };
1559
+ } = {
1560
+ responseModalities: ["IMAGE"],
1561
+ };
1562
+
1563
+ if (params.aspect_ratio || params.image_size) {
1564
+ generationConfig.imageConfig = {
1565
+ aspectRatio: params.aspect_ratio,
1566
+ imageSize: params.image_size,
1567
+ };
1568
+ }
1569
+
1570
+ const requestBody = {
1571
+ contents: [{ role: "user" as const, parts }],
1572
+ generationConfig,
1573
+ };
1574
+
1575
+ const rawText = await withAuth(
1576
+ apiKey.apiKey,
1577
+ async key => {
1578
+ const resp = await fetchImpl(
1579
+ `https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(model)}:generateContent`,
1580
+ {
1581
+ method: "POST",
1582
+ headers: {
1583
+ "Content-Type": "application/json",
1584
+ "x-goog-api-key": key,
1585
+ },
1586
+ body: JSON.stringify(requestBody),
1587
+ signal: requestSignal,
1588
+ },
1589
+ );
1590
+ const text = await resp.text();
1591
+ if (!resp.ok) {
1592
+ let message = text;
1593
+ try {
1594
+ const parsed = JSON.parse(text) as { error?: { message?: string } };
1595
+ message = parsed.error?.message ?? message;
1596
+ } catch {
1597
+ // Keep raw text.
1598
+ }
1599
+ throw new ProviderHttpError(
1600
+ `Gemini image request failed (${resp.status}): ${message}`,
1601
+ resp.status,
1602
+ {
1603
+ headers: resp.headers,
1604
+ },
1605
+ );
1606
+ }
1607
+ return text;
1608
+ },
1609
+ { signal: requestSignal },
1610
+ );
1611
+
1612
+ const data = JSON.parse(rawText) as GeminiGenerateContentResponse;
1613
+ const responseParts = combineParts(data);
1614
+ const responseText = collectResponseText(responseParts);
1615
+ const inlineImages = collectInlineImages(responseParts);
1616
+
1617
+ if (inlineImages.length === 0) {
1618
+ const blocked = data.promptFeedback?.blockReason
1619
+ ? `Blocked: ${data.promptFeedback.blockReason}`
1620
+ : "No image data returned.";
1621
+ return {
1622
+ content: [{ type: "text", text: `${blocked}${responseText ? `\n\n${responseText}` : ""}` }],
1623
+ details: {
1624
+ provider,
1625
+ model,
1626
+ imageCount: 0,
1627
+ imagePaths: [],
1628
+ images: [],
1629
+ responseText,
1630
+ promptFeedback: data.promptFeedback,
1631
+ usage: data.usageMetadata,
1632
+ },
1633
+ };
1634
+ }
1635
+
1636
+ const imagePaths = await saveImagesToTemp(inlineImages);
1637
+
1638
+ return {
1639
+ content: [{ type: "text", text: buildResponseSummary(provider, model, imagePaths, responseText) }],
1640
+ details: {
1641
+ provider,
1642
+ model,
1643
+ imageCount: inlineImages.length,
1644
+ imagePaths,
1645
+ images: inlineImages,
1646
+ responseText,
1647
+ promptFeedback: data.promptFeedback,
1648
+ usage: data.usageMetadata,
1649
+ },
1650
+ };
1651
+ } catch (error) {
1652
+ if (!(error instanceof ProviderHttpError) || requestSignal?.aborted) {
1653
+ throw error;
1654
+ }
1655
+ failures.push({ provider, error });
1656
+ }
1657
+ }
1658
+
1659
+ if (!foundCredentials) {
1660
+ throw new Error(
1661
+ "No image API credentials found. Connect a Codex (ChatGPT) subscription, use a GPT Responses/Codex model with OpenAI credentials, log in with google-antigravity or xAI Grok OAuth, or set OPENAI_API_KEY, XAI_API_KEY, OPENROUTER_API_KEY, GEMINI_API_KEY, or GOOGLE_API_KEY.",
1662
+ );
1663
+ }
1664
+
1665
+ if (failures.length === 0 && unsupportedAspectRatioProvider) {
1666
+ assertImageAspectRatioSupported(unsupportedAspectRatioProvider, params.aspect_ratio);
1667
+ }
1668
+
1669
+ throw new AggregateError(
1670
+ failures.map(failure => failure.error),
1671
+ `Image generation failed for all credentialed providers: ${failures.map(failure => failure.provider).join(", ")}`,
1672
+ );
1673
+ });
1674
+ },
1675
+ };
1676
+
1677
+ export async function getImageGenTools(
1678
+ _modelRegistry?: ModelRegistry,
1679
+ _activeModel?: Model,
1680
+ ): Promise<Array<CustomTool<typeof imageGenSchema, ImageGenToolDetails>>> {
1681
+ return [imageGenTool];
1682
+ }
1683
+
1684
+ export async function getImageGenToolsWithRegistry(
1685
+ _modelRegistry: ModelRegistry,
1686
+ _activeModel?: Model,
1687
+ ): Promise<Array<CustomTool<typeof imageGenSchema, ImageGenToolDetails>>> {
1688
+ return [imageGenTool];
1689
+ }