@oh-my-pi/pi-coding-agent 17.0.9 → 17.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +1 -1
  3. package/dist/cli.js +4685 -4614
  4. package/dist/types/async/job-manager.d.ts +37 -1
  5. package/dist/types/cli/args.d.ts +2 -0
  6. package/dist/types/cli/bench-cli.d.ts +41 -0
  7. package/dist/types/commands/bench.d.ts +15 -3
  8. package/dist/types/commands/launch.d.ts +4 -0
  9. package/dist/types/config/model-registry.d.ts +3 -1
  10. package/dist/types/config/models-config-schema.d.ts +18 -6
  11. package/dist/types/config/models-config.d.ts +14 -5
  12. package/dist/types/config/provider-globals.d.ts +2 -2
  13. package/dist/types/config/service-tier.d.ts +5 -1
  14. package/dist/types/config/settings-schema.d.ts +374 -47
  15. package/dist/types/config/settings.d.ts +7 -0
  16. package/dist/types/dap/client.d.ts +20 -0
  17. package/dist/types/exec/bash-executor.d.ts +38 -0
  18. package/dist/types/exec/direnv.d.ts +33 -0
  19. package/dist/types/export/html/args.d.ts +15 -0
  20. package/dist/types/export/html/index.d.ts +11 -26
  21. package/dist/types/export/html/web-palette.d.ts +55 -116
  22. package/dist/types/extensibility/extensions/loader.d.ts +3 -0
  23. package/dist/types/extensibility/extensions/types.d.ts +17 -2
  24. package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +3 -0
  25. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +13 -0
  26. package/dist/types/live/attestation.d.ts +2 -0
  27. package/dist/types/live/controller.d.ts +48 -0
  28. package/dist/types/live/protocol.d.ts +85 -0
  29. package/dist/types/live/protocol.test.d.ts +1 -0
  30. package/dist/types/live/transport.d.ts +35 -0
  31. package/dist/types/live/visualizer.d.ts +30 -0
  32. package/dist/types/lsp/client.d.ts +16 -1
  33. package/dist/types/mcp/config-writer.test.d.ts +1 -0
  34. package/dist/types/mcp/oauth-discovery.d.ts +2 -0
  35. package/dist/types/mcp/smithery-auth.d.ts +1 -1
  36. package/dist/types/mcp/smithery-auth.test.d.ts +1 -0
  37. package/dist/types/memory-backend/tool-names.d.ts +2 -0
  38. package/dist/types/modes/components/assistant-message.d.ts +1 -0
  39. package/dist/types/modes/components/custom-message.d.ts +1 -1
  40. package/dist/types/modes/components/login-dialog.d.ts +2 -2
  41. package/dist/types/modes/components/message-frame.d.ts +8 -4
  42. package/dist/types/modes/components/plan-review-overlay.d.ts +26 -0
  43. package/dist/types/modes/components/session-account-selector.d.ts +11 -0
  44. package/dist/types/modes/components/settings-defs.d.ts +7 -1
  45. package/dist/types/modes/components/status-line/component.jj-cache.test.d.ts +1 -0
  46. package/dist/types/modes/components/tool-execution.d.ts +9 -1
  47. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  48. package/dist/types/modes/controllers/event-controller.d.ts +6 -1
  49. package/dist/types/modes/controllers/live-command-controller.d.ts +14 -0
  50. package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
  51. package/dist/types/modes/interactive-mode.d.ts +6 -0
  52. package/dist/types/modes/theme/theme.d.ts +1 -1
  53. package/dist/types/modes/types.d.ts +4 -1
  54. package/dist/types/modes/utils/context-usage.d.ts +12 -2
  55. package/dist/types/plan-mode/plan-files.d.ts +10 -0
  56. package/dist/types/registry/agent-lifecycle.d.ts +21 -9
  57. package/dist/types/registry/agent-registry.d.ts +11 -4
  58. package/dist/types/sdk.d.ts +15 -1
  59. package/dist/types/secrets/index.d.ts +15 -2
  60. package/dist/types/secrets/obfuscator.d.ts +113 -15
  61. package/dist/types/session/acp-permission-gate.d.ts +19 -0
  62. package/dist/types/session/agent-session-events.d.ts +84 -0
  63. package/dist/types/session/agent-session-types.d.ts +321 -0
  64. package/dist/types/session/agent-session.d.ts +135 -753
  65. package/dist/types/session/async-job-delivery.d.ts +28 -0
  66. package/dist/types/session/auth-storage.d.ts +1 -1
  67. package/dist/types/session/bash-runner.d.ts +75 -0
  68. package/dist/types/session/blob-store.d.ts +11 -1
  69. package/dist/types/session/blob-store.test.d.ts +1 -0
  70. package/dist/types/session/checkpoint-entries.d.ts +28 -0
  71. package/dist/types/session/eval-runner.d.ts +51 -0
  72. package/dist/types/session/irc-bridge.d.ts +46 -0
  73. package/dist/types/session/messages.d.ts +24 -0
  74. package/dist/types/session/model-controls.d.ts +180 -0
  75. package/dist/types/session/prewalk.d.ts +46 -0
  76. package/dist/types/session/queued-messages.d.ts +22 -0
  77. package/dist/types/session/redis-session-storage.d.ts +1 -0
  78. package/dist/types/session/retry-fallback-chains.d.ts +74 -0
  79. package/dist/types/session/role-models.d.ts +15 -0
  80. package/dist/types/session/session-advisors.d.ts +228 -0
  81. package/dist/types/session/session-entries.d.ts +8 -0
  82. package/dist/types/session/session-handoff.d.ts +70 -0
  83. package/dist/types/session/session-history-format.d.ts +6 -1
  84. package/dist/types/session/session-maintenance.d.ts +246 -0
  85. package/dist/types/session/session-manager.d.ts +41 -0
  86. package/dist/types/session/session-memory.d.ts +56 -0
  87. package/dist/types/session/session-provider-boundary.d.ts +62 -0
  88. package/dist/types/session/session-stats.d.ts +48 -0
  89. package/dist/types/session/session-tools.d.ts +158 -0
  90. package/dist/types/session/session-workspace.d.ts +32 -0
  91. package/dist/types/session/stream-guards.d.ts +44 -0
  92. package/dist/types/session/streaming-output.d.ts +8 -0
  93. package/dist/types/session/todo-tracker.d.ts +56 -0
  94. package/dist/types/session/ttsr-coordinator.d.ts +51 -0
  95. package/dist/types/session/turn-recovery.d.ts +225 -0
  96. package/dist/types/slash-commands/helpers/session-pin.d.ts +9 -0
  97. package/dist/types/stt/index.d.ts +0 -2
  98. package/dist/types/stt/stt-controller.d.ts +7 -0
  99. package/dist/types/system-prompt.d.ts +2 -0
  100. package/dist/types/task/executor.d.ts +4 -1
  101. package/dist/types/task/output-manager.d.ts +3 -1
  102. package/dist/types/tiny/title-client.d.ts +10 -0
  103. package/dist/types/tools/approval.d.ts +1 -0
  104. package/dist/types/tools/browser/launch.d.ts +5 -0
  105. package/dist/types/tools/builtin-names.d.ts +1 -1
  106. package/dist/types/tools/computer/protocol.d.ts +43 -0
  107. package/dist/types/tools/computer/supervisor.d.ts +32 -0
  108. package/dist/types/tools/computer/worker-entry.d.ts +1 -0
  109. package/dist/types/tools/computer/worker.d.ts +15 -0
  110. package/dist/types/tools/computer-renderer.d.ts +22 -0
  111. package/dist/types/tools/computer.d.ts +71 -0
  112. package/dist/types/tools/context.d.ts +2 -0
  113. package/dist/types/tools/default-renderer.d.ts +21 -0
  114. package/dist/types/tools/image-gen.d.ts +4 -4
  115. package/dist/types/tools/image-providers.d.ts +38 -0
  116. package/dist/types/tools/index.d.ts +7 -0
  117. package/dist/types/tools/path-utils.d.ts +8 -0
  118. package/dist/types/tools/todo.d.ts +10 -4
  119. package/dist/types/tools/xdev.d.ts +5 -1
  120. package/dist/types/tts/streaming-player.d.ts +10 -29
  121. package/dist/types/tts/vocalizer.d.ts +5 -0
  122. package/dist/types/utils/jj.d.ts +29 -0
  123. package/dist/types/utils/lang-from-path.d.ts +1 -0
  124. package/dist/types/utils/title-generator.d.ts +30 -0
  125. package/dist/types/utils/tools-manager.d.ts +1 -2
  126. package/dist/types/vibe/runtime.d.ts +36 -8
  127. package/dist/types/web/search/index.d.ts +1 -1
  128. package/dist/types/web/search/provider.d.ts +15 -5
  129. package/dist/types/web/search/types.d.ts +94 -0
  130. package/package.json +12 -12
  131. package/scripts/generate-share-viewer.ts +4 -6
  132. package/src/advisor/__tests__/advisor.test.ts +643 -0
  133. package/src/advisor/runtime.ts +144 -43
  134. package/src/async/job-manager.ts +90 -2
  135. package/src/cli/args.ts +3 -0
  136. package/src/cli/auth-gateway-cli.ts +18 -3
  137. package/src/cli/bench-cli.ts +395 -29
  138. package/src/cli/flag-tables.ts +3 -0
  139. package/src/cli/gc-cli.ts +2 -2
  140. package/src/cli/setup-cli.ts +2 -14
  141. package/src/cli/usage-cli.ts +10 -1
  142. package/src/cli.ts +8 -0
  143. package/src/collab/host.ts +3 -2
  144. package/src/commands/bench.ts +18 -4
  145. package/src/commands/launch.ts +4 -0
  146. package/src/config/model-registry.ts +16 -2
  147. package/src/config/models-config-schema.ts +15 -4
  148. package/src/config/provider-globals.ts +9 -9
  149. package/src/config/service-tier.ts +26 -1
  150. package/src/config/settings-schema.ts +270 -51
  151. package/src/config/settings.ts +81 -2
  152. package/src/dap/client.ts +37 -4
  153. package/src/edit/index.ts +49 -12
  154. package/src/eval/executor-base.ts +1 -0
  155. package/src/eval/js/executor.ts +2 -0
  156. package/src/eval/py/executor.ts +103 -33
  157. package/src/exec/bash-executor.ts +90 -6
  158. package/src/exec/direnv.ts +145 -0
  159. package/src/export/html/args.ts +20 -0
  160. package/src/export/html/index.ts +45 -47
  161. package/src/export/html/template.css +19 -1
  162. package/src/export/html/template.html +6 -0
  163. package/src/export/html/template.js +21 -0
  164. package/src/export/html/tool-views.generated.js +31 -31
  165. package/src/export/html/web-palette.ts +116 -132
  166. package/src/export/share.ts +249 -49
  167. package/src/extensibility/extensions/loader.ts +29 -1
  168. package/src/extensibility/extensions/runner.ts +6 -0
  169. package/src/extensibility/extensions/types.ts +33 -2
  170. package/src/extensibility/extensions/wrapper.ts +68 -12
  171. package/src/extensibility/legacy-pi-coding-agent-shim.ts +7 -1
  172. package/src/extensibility/plugins/legacy-pi-compat.ts +19 -1
  173. package/src/hindsight/state.ts +64 -6
  174. package/src/internal-urls/local-protocol.ts +2 -1
  175. package/src/internal-urls/memory-protocol.ts +2 -2
  176. package/src/internal-urls/skill-protocol.ts +2 -2
  177. package/src/internal-urls/ssh-protocol.ts +2 -1
  178. package/src/internal-urls/vault-protocol.ts +2 -1
  179. package/src/live/attestation.ts +91 -0
  180. package/src/live/controller.ts +517 -0
  181. package/src/live/prompts/agent-final-message.md +3 -0
  182. package/src/live/prompts/live-instructions.md +23 -0
  183. package/src/live/protocol.test.ts +140 -0
  184. package/src/live/protocol.ts +233 -0
  185. package/src/live/transport.ts +422 -0
  186. package/src/live/visualizer.ts +214 -0
  187. package/src/lsp/client.ts +29 -9
  188. package/src/lsp/index.ts +19 -4
  189. package/src/main.ts +8 -1
  190. package/src/mcp/config-writer.test.ts +43 -0
  191. package/src/mcp/config-writer.ts +109 -82
  192. package/src/mcp/oauth-discovery.ts +10 -2
  193. package/src/mcp/smithery-auth.test.ts +29 -0
  194. package/src/mcp/smithery-auth.ts +3 -2
  195. package/src/memories/index.ts +40 -20
  196. package/src/memory-backend/tool-names.ts +2 -0
  197. package/src/mnemopi/backend.ts +24 -7
  198. package/src/modes/acp/acp-agent.ts +56 -10
  199. package/src/modes/acp/acp-event-mapper.ts +8 -1
  200. package/src/modes/components/agent-hub.ts +1 -1
  201. package/src/modes/components/assistant-message.ts +7 -2
  202. package/src/modes/components/custom-message.ts +4 -1
  203. package/src/modes/components/login-dialog.ts +14 -4
  204. package/src/modes/components/message-frame.ts +14 -8
  205. package/src/modes/components/plan-review-overlay.ts +350 -35
  206. package/src/modes/components/session-account-selector.ts +62 -0
  207. package/src/modes/components/settings-defs.ts +23 -1
  208. package/src/modes/components/settings-selector.ts +169 -1
  209. package/src/modes/components/status-line/component.jj-cache.test.ts +229 -0
  210. package/src/modes/components/status-line/component.ts +123 -2
  211. package/src/modes/components/tool-execution.ts +28 -112
  212. package/src/modes/controllers/command-controller.ts +56 -15
  213. package/src/modes/controllers/event-controller.ts +111 -16
  214. package/src/modes/controllers/extension-ui-controller.test.ts +1 -0
  215. package/src/modes/controllers/extension-ui-controller.ts +20 -4
  216. package/src/modes/controllers/input-controller.ts +47 -39
  217. package/src/modes/controllers/live-command-controller.ts +255 -0
  218. package/src/modes/controllers/mcp-command-controller.ts +10 -1
  219. package/src/modes/controllers/omfg-controller.ts +44 -40
  220. package/src/modes/controllers/selector-controller.ts +80 -10
  221. package/src/modes/controllers/session-focus-controller.ts +6 -1
  222. package/src/modes/interactive-mode.ts +176 -38
  223. package/src/modes/runtime-init.ts +2 -0
  224. package/src/modes/setup-wizard/scenes/web-search.ts +17 -9
  225. package/src/modes/theme/theme.ts +1 -1
  226. package/src/modes/types.ts +4 -1
  227. package/src/modes/utils/context-usage.ts +23 -7
  228. package/src/modes/utils/ui-helpers.ts +10 -5
  229. package/src/plan-mode/plan-files.ts +40 -0
  230. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  231. package/src/prompts/bench/cache-prefix.md +3 -0
  232. package/src/prompts/bench/cache-suffix.md +1 -0
  233. package/src/prompts/system/computer-safety.md +14 -0
  234. package/src/prompts/system/custom-system-prompt.md +1 -1
  235. package/src/prompts/system/project-prompt.md +8 -1
  236. package/src/prompts/system/subagent-async-pending.md +6 -0
  237. package/src/prompts/system/system-prompt.md +1 -1
  238. package/src/prompts/system/workflow-notice.md +48 -40
  239. package/src/prompts/system/xdev-mount-notice.md +4 -0
  240. package/src/prompts/tools/computer.md +26 -0
  241. package/src/prompts/tools/todo.md +3 -1
  242. package/src/registry/agent-lifecycle.ts +116 -46
  243. package/src/registry/agent-registry.ts +35 -8
  244. package/src/registry/persisted-agents.ts +26 -2
  245. package/src/sdk.ts +215 -136
  246. package/src/secrets/index.ts +127 -4
  247. package/src/secrets/obfuscator.ts +2328 -105
  248. package/src/session/acp-permission-gate.ts +165 -0
  249. package/src/session/agent-session-error-log.test.ts +1 -1
  250. package/src/session/agent-session-events.ts +66 -0
  251. package/src/session/agent-session-types.ts +343 -0
  252. package/src/session/agent-session.ts +1940 -12218
  253. package/src/session/artifacts.ts +6 -5
  254. package/src/session/async-job-delivery.ts +74 -0
  255. package/src/session/auth-storage.ts +1 -0
  256. package/src/session/bash-runner.ts +326 -0
  257. package/src/session/blob-store.test.ts +56 -0
  258. package/src/session/blob-store.ts +18 -2
  259. package/src/session/checkpoint-entries.ts +81 -0
  260. package/src/session/eval-runner.ts +217 -0
  261. package/src/session/indexed-session-storage.ts +9 -2
  262. package/src/session/irc-bridge.ts +203 -0
  263. package/src/session/messages.ts +266 -1
  264. package/src/session/model-controls.ts +714 -0
  265. package/src/session/prewalk.ts +252 -0
  266. package/src/session/queued-messages.ts +93 -0
  267. package/src/session/redis-session-storage.ts +51 -11
  268. package/src/session/retry-fallback-chains.ts +455 -0
  269. package/src/session/role-models.ts +85 -0
  270. package/src/session/session-advisors.ts +1679 -0
  271. package/src/session/session-context.ts +6 -3
  272. package/src/session/session-entries.ts +8 -0
  273. package/src/session/session-handoff.ts +308 -0
  274. package/src/session/session-history-format.ts +20 -9
  275. package/src/session/session-loader.ts +0 -46
  276. package/src/session/session-maintenance.ts +2983 -0
  277. package/src/session/session-manager.ts +390 -30
  278. package/src/session/session-memory.ts +222 -0
  279. package/src/session/session-provider-boundary.ts +307 -0
  280. package/src/session/session-stats.ts +293 -0
  281. package/src/session/session-tools.ts +980 -0
  282. package/src/session/session-workspace.ts +53 -0
  283. package/src/session/stream-guards.ts +417 -0
  284. package/src/session/streaming-output.ts +52 -5
  285. package/src/session/todo-tracker.ts +380 -0
  286. package/src/session/ttsr-coordinator.ts +496 -0
  287. package/src/session/turn-recovery.ts +1629 -0
  288. package/src/slash-commands/builtin-registry.ts +257 -20
  289. package/src/slash-commands/helpers/session-pin.ts +44 -0
  290. package/src/slash-commands/helpers/usage-report.ts +22 -3
  291. package/src/stt/downloader.ts +0 -2
  292. package/src/stt/index.ts +0 -2
  293. package/src/stt/stt-controller.ts +57 -146
  294. package/src/system-prompt.ts +45 -17
  295. package/src/task/executor.ts +285 -70
  296. package/src/task/index.ts +98 -105
  297. package/src/task/output-manager.ts +25 -3
  298. package/src/task/persisted-revive.ts +4 -3
  299. package/src/task/structured-subagent.ts +1 -0
  300. package/src/tiny/title-client.ts +22 -0
  301. package/src/tools/approval.ts +55 -10
  302. package/src/tools/bash-interactive.ts +116 -86
  303. package/src/tools/bash-skill-urls.ts +28 -2
  304. package/src/tools/bash.ts +339 -123
  305. package/src/tools/browser/launch.ts +9 -1
  306. package/src/tools/browser/tab-supervisor.ts +8 -5
  307. package/src/tools/browser.ts +94 -47
  308. package/src/tools/builtin-names.ts +1 -0
  309. package/src/tools/computer/protocol.ts +28 -0
  310. package/src/tools/computer/supervisor.ts +258 -0
  311. package/src/tools/computer/worker-entry.ts +25 -0
  312. package/src/tools/computer/worker.ts +135 -0
  313. package/src/tools/computer-renderer.ts +108 -0
  314. package/src/tools/computer.ts +433 -0
  315. package/src/tools/context.ts +2 -0
  316. package/src/tools/default-renderer.ts +139 -0
  317. package/src/tools/essential-tools.ts +1 -0
  318. package/src/tools/image-gen.ts +20 -28
  319. package/src/tools/image-providers.ts +50 -0
  320. package/src/tools/index.ts +14 -0
  321. package/src/tools/path-utils.ts +49 -2
  322. package/src/tools/read.ts +156 -88
  323. package/src/tools/renderers.ts +9 -1
  324. package/src/tools/todo.ts +101 -11
  325. package/src/tools/vibe.ts +1 -2
  326. package/src/tools/write.ts +51 -1
  327. package/src/tools/xdev.ts +121 -29
  328. package/src/tts/streaming-player.ts +82 -283
  329. package/src/tts/vocalizer.ts +18 -1
  330. package/src/utils/clipboard.ts +1 -30
  331. package/src/utils/jj.ts +125 -4
  332. package/src/utils/lang-from-path.ts +7 -0
  333. package/src/utils/mac-file-urls.applescript +37 -0
  334. package/src/utils/title-generator.ts +137 -1
  335. package/src/utils/tool-choice.ts +14 -0
  336. package/src/utils/tools-manager.ts +1 -19
  337. package/src/vibe/runtime.ts +852 -72
  338. package/src/web/search/index.ts +3 -6
  339. package/src/web/search/provider.ts +31 -16
  340. package/src/web/search/providers/xai.ts +7 -1
  341. package/src/web/search/types.ts +3 -0
  342. package/dist/types/stt/recorder.d.ts +0 -30
  343. package/dist/types/stt/transcriber.d.ts +0 -14
  344. package/dist/types/stt/wav.d.ts +0 -29
  345. package/dist/types/tts/player.d.ts +0 -32
  346. package/src/stt/recorder.ts +0 -551
  347. package/src/stt/transcriber.ts +0 -60
  348. package/src/stt/wav.ts +0 -173
  349. package/src/tts/player.ts +0 -137
@@ -27,6 +27,7 @@ import { settings } from "../config/settings";
27
27
  import type { CustomTool } from "../extensibility/custom-tools/types";
28
28
  import { ohMyPiXAIUserAgent, resolveXAIHttpCredentials } from "../lib/xai-http";
29
29
  import imageGenDescription from "../prompts/tools/image-gen.md" with { type: "text" };
30
+ import { AUTO_IMAGE_PROVIDER_ORDER, type ImageProvider, isImageProviderId } from "./image-providers";
30
31
  import { resolveReadPath } from "./path-utils";
31
32
 
32
33
  const DEFAULT_MODEL = "gemini-3-pro-image-preview";
@@ -44,7 +45,7 @@ const DEFAULT_ANTIGRAVITY_ENDPOINT_SANDBOX = "https://daily-cloudcode-pa.sandbox
44
45
  const IMAGE_SYSTEM_INSTRUCTION =
45
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.";
46
47
 
47
- export type ImageProvider = "antigravity" | "gemini" | "openai" | "openai-codex" | "openrouter" | "xai";
48
+ export type { ImageProvider } from "./image-providers";
48
49
  export type ImageProviderPreference = ImageProvider | "auto";
49
50
 
50
51
  interface ImageApiKey {
@@ -57,17 +58,8 @@ interface ImageApiKey {
57
58
  const COMMON_IMAGE_ASPECT_RATIOS = ["1:1", "3:4", "4:3", "9:16", "16:9"] as const;
58
59
  const XAI_IMAGE_ASPECT_RATIOS = [...COMMON_IMAGE_ASPECT_RATIOS, "3:2", "2:3"] as const;
59
60
  const COMMON_IMAGE_ASPECT_RATIO_SET = new Set<string>(COMMON_IMAGE_ASPECT_RATIOS);
60
- const IMAGE_PROVIDER_CHOICES = [
61
- "auto",
62
- "antigravity",
63
- "gemini",
64
- "openai",
65
- "openai-codex",
66
- "openrouter",
67
- "xai",
68
- ] as const;
69
- const IMAGE_PROVIDER_PREFERENCES = new Set<string>(IMAGE_PROVIDER_CHOICES);
70
- const AUTO_IMAGE_PROVIDER_ORDER = ["openai", "openai-codex", "antigravity", "xai", "openrouter", "gemini"] as const;
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);
71
63
 
72
64
  const responseModalitySchema = type('"IMAGE" | "TEXT"');
73
65
 
@@ -81,8 +73,8 @@ const inputImageSchema = type({
81
73
  });
82
74
 
83
75
  const imageProviderSchema = type
84
- .enumerated(...IMAGE_PROVIDER_CHOICES)
85
- .describe("image provider for this request; overrides the providers.image setting (default: use the setting)");
76
+ .enumerated(...IMAGE_PROVIDER_REQUEST_CHOICES)
77
+ .describe("image provider for this request; overrides the providers.imageOrder setting (default: use the setting)");
86
78
 
87
79
  export const imageGenSchema = type({
88
80
  subject: type("string").describe("main subject"),
@@ -447,16 +439,16 @@ function extractOpenRouterImageUrls(message: OpenRouterMessage | undefined): str
447
439
  return urls;
448
440
  }
449
441
 
450
- /** Preferred provider set via settings (default: auto) */
451
- let preferredImageProvider: ImageProviderPreference = "auto";
442
+ /** Configured provider priority set via `providers.imageOrder` (default: none). */
443
+ let configuredImageProviderOrder: readonly ImageProvider[] = [];
452
444
 
453
445
  export function isImageProviderPreference(value: unknown): value is ImageProviderPreference {
454
446
  return typeof value === "string" && IMAGE_PROVIDER_PREFERENCES.has(value);
455
447
  }
456
448
 
457
- /** Set the preferred image provider from settings */
458
- export function setPreferredImageProvider(provider: ImageProviderPreference): void {
459
- preferredImageProvider = provider;
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);
460
452
  }
461
453
  function assertImageAspectRatioSupported(provider: ImageProvider, aspectRatio: ImageGenParams["aspect_ratio"]): void {
462
454
  if (!aspectRatio || provider === "xai" || COMMON_IMAGE_ASPECT_RATIO_SET.has(aspectRatio)) {
@@ -624,19 +616,19 @@ function activeImageProvider(model: Model | undefined): Exclude<ImageProviderPre
624
616
  }
625
617
  }
626
618
 
627
- function imageProviderOrder(
628
- activeModel: Model | undefined,
629
- preference: ImageProviderPreference = preferredImageProvider,
630
- ): Array<Exclude<ImageProviderPreference, "auto">> {
631
- const providers: Array<Exclude<ImageProviderPreference, "auto">> = [];
632
- const added = new Set<Exclude<ImageProviderPreference, "auto">>();
633
- const add = (provider: Exclude<ImageProviderPreference, "auto"> | null): void => {
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 => {
634
623
  if (!provider || added.has(provider)) return;
635
624
  added.add(provider);
636
625
  providers.push(provider);
637
626
  };
638
627
 
639
- if (preference !== "auto") add(preference);
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);
640
632
  add(activeImageProvider(activeModel));
641
633
  for (const provider of AUTO_IMAGE_PROVIDER_ORDER) add(provider);
642
634
  return providers;
@@ -1109,7 +1101,7 @@ export const imageGenTool: CustomTool<typeof imageGenSchema, ImageGenToolDetails
1109
1101
  async execute(_toolCallId, params, _onUpdate, ctx, signal) {
1110
1102
  return untilAborted(signal, async () => {
1111
1103
  const sessionId = ctx.sessionManager.getSessionId();
1112
- const providerOrder = imageProviderOrder(ctx.model, params.provider ?? preferredImageProvider);
1104
+ const providerOrder = imageProviderOrder(ctx.model, params.provider);
1113
1105
  const cwd = ctx.sessionManager.getCwd();
1114
1106
  const requestSignal = ptree.combineSignals(signal, IMAGE_TIMEOUT);
1115
1107
  const fetchImpl = ctx.fetch ?? fetch;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Image Generation Providers
3
+ *
4
+ * Leaf module (no runtime deps) shared by the image_gen tool, the settings
5
+ * schema, and settings migrations — mirrors `web/search/types.ts` so the
6
+ * provider list, auto order, and settings choices never drift apart.
7
+ */
8
+
9
+ /** Image generation backends, in settings/tool vocabulary. */
10
+ export type ImageProvider = "antigravity" | "gemini" | "openai" | "openai-codex" | "openrouter" | "xai";
11
+
12
+ /** Auto-resolution fallback order when no configured entry or session provider matches. */
13
+ export const AUTO_IMAGE_PROVIDER_ORDER: readonly ImageProvider[] = [
14
+ "openai",
15
+ "openai-codex",
16
+ "antigravity",
17
+ "xai",
18
+ "openrouter",
19
+ "gemini",
20
+ ];
21
+
22
+ /** Settings choices for `providers.imageOrder` (labels shared with the retired single-preference enum). */
23
+ export const IMAGE_PROVIDER_CHOICES = [
24
+ {
25
+ value: "openai",
26
+ label: "OpenAI",
27
+ description: "OPENAI_API_KEY (gpt-image-2) or active GPT model; falls back to a connected Codex subscription",
28
+ },
29
+ {
30
+ value: "openai-codex",
31
+ label: "OpenAI Codex (ChatGPT)",
32
+ description: "Uses a connected Codex / ChatGPT subscription — no OPENAI_API_KEY needed",
33
+ },
34
+ {
35
+ value: "antigravity",
36
+ label: "Antigravity",
37
+ description: "Requires google-antigravity OAuth",
38
+ },
39
+ {
40
+ value: "xai",
41
+ label: "xAI Grok Imagine",
42
+ description: "Requires xAI Grok OAuth or XAI_API_KEY",
43
+ },
44
+ { value: "gemini", label: "Gemini", description: "Requires GEMINI_API_KEY" },
45
+ { value: "openrouter", label: "OpenRouter", description: "Requires OPENROUTER_API_KEY" },
46
+ ] as const satisfies ReadonlyArray<{ value: ImageProvider; label: string; description: string }>;
47
+
48
+ export function isImageProviderId(value: unknown): value is ImageProvider {
49
+ return typeof value === "string" && AUTO_IMAGE_PROVIDER_ORDER.includes(value as ImageProvider);
50
+ }
@@ -26,6 +26,7 @@ import type { ArtifactManager } from "../session/artifacts";
26
26
  import type { ClientBridge } from "../session/client-bridge";
27
27
  import type { CustomMessage } from "../session/messages";
28
28
  import type { UsageStatistics } from "../session/session-entries";
29
+ import type { SessionManager } from "../session/session-manager";
29
30
  import type { ToolChoiceQueue } from "../session/tool-choice-queue";
30
31
  import { TaskTool } from "../task";
31
32
  import type { AgentOutputManager } from "../task/output-manager";
@@ -40,6 +41,7 @@ import { BashTool } from "./bash";
40
41
  import { BrowserTool } from "./browser";
41
42
  import { type BuiltinToolName, type HiddenToolName, normalizeToolNames } from "./builtin-names";
42
43
  import { type CheckpointState, CheckpointTool, type CompletedRewindState, RewindTool } from "./checkpoint";
44
+ import { ComputerTool } from "./computer";
43
45
  import { DebugTool } from "./debug";
44
46
  import { EvalTool } from "./eval";
45
47
  import { resolveEvalBackends } from "./eval-backends";
@@ -74,6 +76,8 @@ export * from "./ast-grep";
74
76
  export * from "./bash";
75
77
  export * from "./browser";
76
78
  export * from "./checkpoint";
79
+ export * from "./computer";
80
+ export * from "./computer/supervisor";
77
81
  export * from "./debug";
78
82
  export * from "./essential-tools";
79
83
  export * from "./eval";
@@ -144,6 +148,8 @@ export interface DeferredDiagnosticsEntry {
144
148
  export interface ToolSession {
145
149
  /** Current working directory */
146
150
  cwd: string;
151
+ /** Additional workspace directories beyond cwd (multi-root), forwarded to subagents. */
152
+ additionalDirectories?: string[];
147
153
  /** Whether UI is available */
148
154
  hasUI: boolean;
149
155
  /**
@@ -215,6 +221,8 @@ export interface ToolSession {
215
221
  getEvalSessionId?: () => string | null;
216
222
  /** Get session file */
217
223
  getSessionFile: () => string | null;
224
+ /** Parent session journal used by tools that persist runtime lifecycle state. */
225
+ sessionManager?: Pick<SessionManager, "appendCustomEntry" | "ensureOnDisk" | "flush" | "getBranch" | "getEntries">;
218
226
  /** Get eval kernel owner ID for session-scoped retained-kernel cleanup. */
219
227
  getEvalKernelOwnerId?: () => string | null;
220
228
  /** Reject new eval work once session disposal has started. */
@@ -394,6 +402,7 @@ export const BUILTIN_TOOLS: Record<BuiltinToolName, ToolFactory> = {
394
402
  lsp: LspTool.createIf,
395
403
  inspect_image: s => new InspectImageTool(s),
396
404
  browser: s => new BrowserTool(s),
405
+ computer: s => new ComputerTool(s),
397
406
  checkpoint: CheckpointTool.createIf,
398
407
  rewind: RewindTool.createIf,
399
408
  task: s => TaskTool.create(s),
@@ -513,6 +522,9 @@ export async function createTools(session: ToolSession, toolNames?: string[]): P
513
522
  if (!requestedTools.includes(name)) requestedTools.push(name);
514
523
  }
515
524
  }
525
+ if (session.settings.get("memory.backend") === "mnemopi" && !requestedTools.includes("memory_edit")) {
526
+ requestedTools.push("memory_edit");
527
+ }
516
528
  // Auto-learn tools are gated by `autolearn.enabled` but, like the memory
517
529
  // tools above, must also be force-included into an explicit requestedTools
518
530
  // list so a restricted top-level session whose controller/guidance is
@@ -547,6 +559,7 @@ export async function createTools(session: ToolSession, toolNames?: string[]): P
547
559
  if (name === "web_search") return session.settings.get("web_search.enabled");
548
560
  if (name === "ask") return session.settings.get("ask.enabled");
549
561
  if (name === "browser") return session.settings.get("browser.enabled");
562
+ if (name === "computer") return session.settings.get("computer.enabled");
550
563
  if (name === "checkpoint" || name === "rewind") return session.settings.get("checkpoint.enabled");
551
564
  if (name === "hub") {
552
565
  return (
@@ -556,6 +569,7 @@ export async function createTools(session: ToolSession, toolNames?: string[]): P
556
569
  if (name === "retain" || name === "recall" || name === "reflect") {
557
570
  return ["hindsight", "mnemopi"].includes(session.settings.get("memory.backend") ?? "");
558
571
  }
572
+ if (name === "memory_edit") return session.settings.get("memory.backend") === "mnemopi";
559
573
  if (name === "manage_skill") return session.settings.get("autolearn.enabled") && (session.taskDepth ?? 0) === 0;
560
574
  if (name === "learn") {
561
575
  return (
@@ -2,10 +2,11 @@ import * as fs from "node:fs";
2
2
  import * as os from "node:os";
3
3
  import * as path from "node:path";
4
4
  import * as url from "node:url";
5
- import { isEnoent, isEnotdir, stripWindowsExtendedLengthPathPrefix } from "@oh-my-pi/pi-utils";
5
+ import { glob } from "@oh-my-pi/pi-natives";
6
+ import { isEnoent, isEnotdir, stripWindowsExtendedLengthPathPrefix, untilAborted } from "@oh-my-pi/pi-utils";
6
7
  import type { Skill } from "../extensibility/skills";
7
8
  import { InternalUrlRouter, type LocalProtocolOptions } from "../internal-urls";
8
- import { ToolError } from "./tool-errors";
9
+ import { ToolAbortError, ToolError } from "./tool-errors";
9
10
 
10
11
  const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
11
12
  // A single line-range chunk: `N`, `N-M`, `N+K`, or open-ended `N-`. `..` is
@@ -1132,6 +1133,52 @@ export function resolveReadPath(filePath: string, cwd: string): string {
1132
1133
  return resolved;
1133
1134
  }
1134
1135
 
1136
+ const WORKSPACE_SUFFIX_TIMEOUT_MS = 5000;
1137
+
1138
+ function escapeGlobMetachars(value: string): string {
1139
+ return value.replace(/[*?[{]/g, "[$&]");
1140
+ }
1141
+
1142
+ /**
1143
+ * Find a unique workspace entry whose trailing path matches a missing authored path.
1144
+ * Returns `null` for no match, ambiguity, timeout, or scan failure.
1145
+ */
1146
+ export async function findUniqueWorkspaceSuffix(
1147
+ rawPath: string,
1148
+ cwd: string,
1149
+ signal?: AbortSignal,
1150
+ ): Promise<{ absolutePath: string; displayPath: string } | null> {
1151
+ const normalized = rawPath.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/+$/, "");
1152
+ if (!normalized) return null;
1153
+
1154
+ const timeoutSignal = AbortSignal.timeout(WORKSPACE_SUFFIX_TIMEOUT_MS);
1155
+ const combinedSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
1156
+
1157
+ let matches: string[];
1158
+ try {
1159
+ const result = await untilAborted(combinedSignal, () =>
1160
+ glob({
1161
+ pattern: `**/${escapeGlobMetachars(normalized)}`,
1162
+ path: cwd,
1163
+ hidden: true,
1164
+ }),
1165
+ );
1166
+ matches = result.matches.map(match => match.path);
1167
+ } catch (error) {
1168
+ if (error instanceof Error && error.name === "AbortError") {
1169
+ if (!signal?.aborted) return null;
1170
+ throw new ToolAbortError();
1171
+ }
1172
+ return null;
1173
+ }
1174
+
1175
+ if (matches.length !== 1) return null;
1176
+ return {
1177
+ absolutePath: path.resolve(cwd, matches[0]),
1178
+ displayPath: matches[0],
1179
+ };
1180
+ }
1181
+
1135
1182
  // =============================================================================
1136
1183
  // Tool-scope resolution (search/ast tools)
1137
1184
  // =============================================================================