@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.
- package/CHANGELOG.md +78 -0
- package/README.md +1 -1
- package/dist/cli.js +4685 -4614
- package/dist/types/async/job-manager.d.ts +37 -1
- package/dist/types/cli/args.d.ts +2 -0
- package/dist/types/cli/bench-cli.d.ts +41 -0
- package/dist/types/commands/bench.d.ts +15 -3
- package/dist/types/commands/launch.d.ts +4 -0
- package/dist/types/config/model-registry.d.ts +3 -1
- package/dist/types/config/models-config-schema.d.ts +18 -6
- package/dist/types/config/models-config.d.ts +14 -5
- package/dist/types/config/provider-globals.d.ts +2 -2
- package/dist/types/config/service-tier.d.ts +5 -1
- package/dist/types/config/settings-schema.d.ts +374 -47
- package/dist/types/config/settings.d.ts +7 -0
- package/dist/types/dap/client.d.ts +20 -0
- package/dist/types/exec/bash-executor.d.ts +38 -0
- package/dist/types/exec/direnv.d.ts +33 -0
- package/dist/types/export/html/args.d.ts +15 -0
- package/dist/types/export/html/index.d.ts +11 -26
- package/dist/types/export/html/web-palette.d.ts +55 -116
- package/dist/types/extensibility/extensions/loader.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +17 -2
- package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +3 -0
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +13 -0
- package/dist/types/live/attestation.d.ts +2 -0
- package/dist/types/live/controller.d.ts +48 -0
- package/dist/types/live/protocol.d.ts +85 -0
- package/dist/types/live/protocol.test.d.ts +1 -0
- package/dist/types/live/transport.d.ts +35 -0
- package/dist/types/live/visualizer.d.ts +30 -0
- package/dist/types/lsp/client.d.ts +16 -1
- package/dist/types/mcp/config-writer.test.d.ts +1 -0
- package/dist/types/mcp/oauth-discovery.d.ts +2 -0
- package/dist/types/mcp/smithery-auth.d.ts +1 -1
- package/dist/types/mcp/smithery-auth.test.d.ts +1 -0
- package/dist/types/memory-backend/tool-names.d.ts +2 -0
- package/dist/types/modes/components/assistant-message.d.ts +1 -0
- package/dist/types/modes/components/custom-message.d.ts +1 -1
- package/dist/types/modes/components/login-dialog.d.ts +2 -2
- package/dist/types/modes/components/message-frame.d.ts +8 -4
- package/dist/types/modes/components/plan-review-overlay.d.ts +26 -0
- package/dist/types/modes/components/session-account-selector.d.ts +11 -0
- package/dist/types/modes/components/settings-defs.d.ts +7 -1
- package/dist/types/modes/components/status-line/component.jj-cache.test.d.ts +1 -0
- package/dist/types/modes/components/tool-execution.d.ts +9 -1
- package/dist/types/modes/controllers/command-controller.d.ts +1 -1
- package/dist/types/modes/controllers/event-controller.d.ts +6 -1
- package/dist/types/modes/controllers/live-command-controller.d.ts +14 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +6 -0
- package/dist/types/modes/theme/theme.d.ts +1 -1
- package/dist/types/modes/types.d.ts +4 -1
- package/dist/types/modes/utils/context-usage.d.ts +12 -2
- package/dist/types/plan-mode/plan-files.d.ts +10 -0
- package/dist/types/registry/agent-lifecycle.d.ts +21 -9
- package/dist/types/registry/agent-registry.d.ts +11 -4
- package/dist/types/sdk.d.ts +15 -1
- package/dist/types/secrets/index.d.ts +15 -2
- package/dist/types/secrets/obfuscator.d.ts +113 -15
- package/dist/types/session/acp-permission-gate.d.ts +19 -0
- package/dist/types/session/agent-session-events.d.ts +84 -0
- package/dist/types/session/agent-session-types.d.ts +321 -0
- package/dist/types/session/agent-session.d.ts +135 -753
- package/dist/types/session/async-job-delivery.d.ts +28 -0
- package/dist/types/session/auth-storage.d.ts +1 -1
- package/dist/types/session/bash-runner.d.ts +75 -0
- package/dist/types/session/blob-store.d.ts +11 -1
- package/dist/types/session/blob-store.test.d.ts +1 -0
- package/dist/types/session/checkpoint-entries.d.ts +28 -0
- package/dist/types/session/eval-runner.d.ts +51 -0
- package/dist/types/session/irc-bridge.d.ts +46 -0
- package/dist/types/session/messages.d.ts +24 -0
- package/dist/types/session/model-controls.d.ts +180 -0
- package/dist/types/session/prewalk.d.ts +46 -0
- package/dist/types/session/queued-messages.d.ts +22 -0
- package/dist/types/session/redis-session-storage.d.ts +1 -0
- package/dist/types/session/retry-fallback-chains.d.ts +74 -0
- package/dist/types/session/role-models.d.ts +15 -0
- package/dist/types/session/session-advisors.d.ts +228 -0
- package/dist/types/session/session-entries.d.ts +8 -0
- package/dist/types/session/session-handoff.d.ts +70 -0
- package/dist/types/session/session-history-format.d.ts +6 -1
- package/dist/types/session/session-maintenance.d.ts +246 -0
- package/dist/types/session/session-manager.d.ts +41 -0
- package/dist/types/session/session-memory.d.ts +56 -0
- package/dist/types/session/session-provider-boundary.d.ts +62 -0
- package/dist/types/session/session-stats.d.ts +48 -0
- package/dist/types/session/session-tools.d.ts +158 -0
- package/dist/types/session/session-workspace.d.ts +32 -0
- package/dist/types/session/stream-guards.d.ts +44 -0
- package/dist/types/session/streaming-output.d.ts +8 -0
- package/dist/types/session/todo-tracker.d.ts +56 -0
- package/dist/types/session/ttsr-coordinator.d.ts +51 -0
- package/dist/types/session/turn-recovery.d.ts +225 -0
- package/dist/types/slash-commands/helpers/session-pin.d.ts +9 -0
- package/dist/types/stt/index.d.ts +0 -2
- package/dist/types/stt/stt-controller.d.ts +7 -0
- package/dist/types/system-prompt.d.ts +2 -0
- package/dist/types/task/executor.d.ts +4 -1
- package/dist/types/task/output-manager.d.ts +3 -1
- package/dist/types/tiny/title-client.d.ts +10 -0
- package/dist/types/tools/approval.d.ts +1 -0
- package/dist/types/tools/browser/launch.d.ts +5 -0
- package/dist/types/tools/builtin-names.d.ts +1 -1
- package/dist/types/tools/computer/protocol.d.ts +43 -0
- package/dist/types/tools/computer/supervisor.d.ts +32 -0
- package/dist/types/tools/computer/worker-entry.d.ts +1 -0
- package/dist/types/tools/computer/worker.d.ts +15 -0
- package/dist/types/tools/computer-renderer.d.ts +22 -0
- package/dist/types/tools/computer.d.ts +71 -0
- package/dist/types/tools/context.d.ts +2 -0
- package/dist/types/tools/default-renderer.d.ts +21 -0
- package/dist/types/tools/image-gen.d.ts +4 -4
- package/dist/types/tools/image-providers.d.ts +38 -0
- package/dist/types/tools/index.d.ts +7 -0
- package/dist/types/tools/path-utils.d.ts +8 -0
- package/dist/types/tools/todo.d.ts +10 -4
- package/dist/types/tools/xdev.d.ts +5 -1
- package/dist/types/tts/streaming-player.d.ts +10 -29
- package/dist/types/tts/vocalizer.d.ts +5 -0
- package/dist/types/utils/jj.d.ts +29 -0
- package/dist/types/utils/lang-from-path.d.ts +1 -0
- package/dist/types/utils/title-generator.d.ts +30 -0
- package/dist/types/utils/tools-manager.d.ts +1 -2
- package/dist/types/vibe/runtime.d.ts +36 -8
- package/dist/types/web/search/index.d.ts +1 -1
- package/dist/types/web/search/provider.d.ts +15 -5
- package/dist/types/web/search/types.d.ts +94 -0
- package/package.json +12 -12
- package/scripts/generate-share-viewer.ts +4 -6
- package/src/advisor/__tests__/advisor.test.ts +643 -0
- package/src/advisor/runtime.ts +144 -43
- package/src/async/job-manager.ts +90 -2
- package/src/cli/args.ts +3 -0
- package/src/cli/auth-gateway-cli.ts +18 -3
- package/src/cli/bench-cli.ts +395 -29
- package/src/cli/flag-tables.ts +3 -0
- package/src/cli/gc-cli.ts +2 -2
- package/src/cli/setup-cli.ts +2 -14
- package/src/cli/usage-cli.ts +10 -1
- package/src/cli.ts +8 -0
- package/src/collab/host.ts +3 -2
- package/src/commands/bench.ts +18 -4
- package/src/commands/launch.ts +4 -0
- package/src/config/model-registry.ts +16 -2
- package/src/config/models-config-schema.ts +15 -4
- package/src/config/provider-globals.ts +9 -9
- package/src/config/service-tier.ts +26 -1
- package/src/config/settings-schema.ts +270 -51
- package/src/config/settings.ts +81 -2
- package/src/dap/client.ts +37 -4
- package/src/edit/index.ts +49 -12
- package/src/eval/executor-base.ts +1 -0
- package/src/eval/js/executor.ts +2 -0
- package/src/eval/py/executor.ts +103 -33
- package/src/exec/bash-executor.ts +90 -6
- package/src/exec/direnv.ts +145 -0
- package/src/export/html/args.ts +20 -0
- package/src/export/html/index.ts +45 -47
- package/src/export/html/template.css +19 -1
- package/src/export/html/template.html +6 -0
- package/src/export/html/template.js +21 -0
- package/src/export/html/tool-views.generated.js +31 -31
- package/src/export/html/web-palette.ts +116 -132
- package/src/export/share.ts +249 -49
- package/src/extensibility/extensions/loader.ts +29 -1
- package/src/extensibility/extensions/runner.ts +6 -0
- package/src/extensibility/extensions/types.ts +33 -2
- package/src/extensibility/extensions/wrapper.ts +68 -12
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +7 -1
- package/src/extensibility/plugins/legacy-pi-compat.ts +19 -1
- package/src/hindsight/state.ts +64 -6
- package/src/internal-urls/local-protocol.ts +2 -1
- package/src/internal-urls/memory-protocol.ts +2 -2
- package/src/internal-urls/skill-protocol.ts +2 -2
- package/src/internal-urls/ssh-protocol.ts +2 -1
- package/src/internal-urls/vault-protocol.ts +2 -1
- package/src/live/attestation.ts +91 -0
- package/src/live/controller.ts +517 -0
- package/src/live/prompts/agent-final-message.md +3 -0
- package/src/live/prompts/live-instructions.md +23 -0
- package/src/live/protocol.test.ts +140 -0
- package/src/live/protocol.ts +233 -0
- package/src/live/transport.ts +422 -0
- package/src/live/visualizer.ts +214 -0
- package/src/lsp/client.ts +29 -9
- package/src/lsp/index.ts +19 -4
- package/src/main.ts +8 -1
- package/src/mcp/config-writer.test.ts +43 -0
- package/src/mcp/config-writer.ts +109 -82
- package/src/mcp/oauth-discovery.ts +10 -2
- package/src/mcp/smithery-auth.test.ts +29 -0
- package/src/mcp/smithery-auth.ts +3 -2
- package/src/memories/index.ts +40 -20
- package/src/memory-backend/tool-names.ts +2 -0
- package/src/mnemopi/backend.ts +24 -7
- package/src/modes/acp/acp-agent.ts +56 -10
- package/src/modes/acp/acp-event-mapper.ts +8 -1
- package/src/modes/components/agent-hub.ts +1 -1
- package/src/modes/components/assistant-message.ts +7 -2
- package/src/modes/components/custom-message.ts +4 -1
- package/src/modes/components/login-dialog.ts +14 -4
- package/src/modes/components/message-frame.ts +14 -8
- package/src/modes/components/plan-review-overlay.ts +350 -35
- package/src/modes/components/session-account-selector.ts +62 -0
- package/src/modes/components/settings-defs.ts +23 -1
- package/src/modes/components/settings-selector.ts +169 -1
- package/src/modes/components/status-line/component.jj-cache.test.ts +229 -0
- package/src/modes/components/status-line/component.ts +123 -2
- package/src/modes/components/tool-execution.ts +28 -112
- package/src/modes/controllers/command-controller.ts +56 -15
- package/src/modes/controllers/event-controller.ts +111 -16
- package/src/modes/controllers/extension-ui-controller.test.ts +1 -0
- package/src/modes/controllers/extension-ui-controller.ts +20 -4
- package/src/modes/controllers/input-controller.ts +47 -39
- package/src/modes/controllers/live-command-controller.ts +255 -0
- package/src/modes/controllers/mcp-command-controller.ts +10 -1
- package/src/modes/controllers/omfg-controller.ts +44 -40
- package/src/modes/controllers/selector-controller.ts +80 -10
- package/src/modes/controllers/session-focus-controller.ts +6 -1
- package/src/modes/interactive-mode.ts +176 -38
- package/src/modes/runtime-init.ts +2 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +17 -9
- package/src/modes/theme/theme.ts +1 -1
- package/src/modes/types.ts +4 -1
- package/src/modes/utils/context-usage.ts +23 -7
- package/src/modes/utils/ui-helpers.ts +10 -5
- package/src/plan-mode/plan-files.ts +40 -0
- package/src/prompts/bench/cache-prefix-chunk.md +1 -0
- package/src/prompts/bench/cache-prefix.md +3 -0
- package/src/prompts/bench/cache-suffix.md +1 -0
- package/src/prompts/system/computer-safety.md +14 -0
- package/src/prompts/system/custom-system-prompt.md +1 -1
- package/src/prompts/system/project-prompt.md +8 -1
- package/src/prompts/system/subagent-async-pending.md +6 -0
- package/src/prompts/system/system-prompt.md +1 -1
- package/src/prompts/system/workflow-notice.md +48 -40
- package/src/prompts/system/xdev-mount-notice.md +4 -0
- package/src/prompts/tools/computer.md +26 -0
- package/src/prompts/tools/todo.md +3 -1
- package/src/registry/agent-lifecycle.ts +116 -46
- package/src/registry/agent-registry.ts +35 -8
- package/src/registry/persisted-agents.ts +26 -2
- package/src/sdk.ts +215 -136
- package/src/secrets/index.ts +127 -4
- package/src/secrets/obfuscator.ts +2328 -105
- package/src/session/acp-permission-gate.ts +165 -0
- package/src/session/agent-session-error-log.test.ts +1 -1
- package/src/session/agent-session-events.ts +66 -0
- package/src/session/agent-session-types.ts +343 -0
- package/src/session/agent-session.ts +1940 -12218
- package/src/session/artifacts.ts +6 -5
- package/src/session/async-job-delivery.ts +74 -0
- package/src/session/auth-storage.ts +1 -0
- package/src/session/bash-runner.ts +326 -0
- package/src/session/blob-store.test.ts +56 -0
- package/src/session/blob-store.ts +18 -2
- package/src/session/checkpoint-entries.ts +81 -0
- package/src/session/eval-runner.ts +217 -0
- package/src/session/indexed-session-storage.ts +9 -2
- package/src/session/irc-bridge.ts +203 -0
- package/src/session/messages.ts +266 -1
- package/src/session/model-controls.ts +714 -0
- package/src/session/prewalk.ts +252 -0
- package/src/session/queued-messages.ts +93 -0
- package/src/session/redis-session-storage.ts +51 -11
- package/src/session/retry-fallback-chains.ts +455 -0
- package/src/session/role-models.ts +85 -0
- package/src/session/session-advisors.ts +1679 -0
- package/src/session/session-context.ts +6 -3
- package/src/session/session-entries.ts +8 -0
- package/src/session/session-handoff.ts +308 -0
- package/src/session/session-history-format.ts +20 -9
- package/src/session/session-loader.ts +0 -46
- package/src/session/session-maintenance.ts +2983 -0
- package/src/session/session-manager.ts +390 -30
- package/src/session/session-memory.ts +222 -0
- package/src/session/session-provider-boundary.ts +307 -0
- package/src/session/session-stats.ts +293 -0
- package/src/session/session-tools.ts +980 -0
- package/src/session/session-workspace.ts +53 -0
- package/src/session/stream-guards.ts +417 -0
- package/src/session/streaming-output.ts +52 -5
- package/src/session/todo-tracker.ts +380 -0
- package/src/session/ttsr-coordinator.ts +496 -0
- package/src/session/turn-recovery.ts +1629 -0
- package/src/slash-commands/builtin-registry.ts +257 -20
- package/src/slash-commands/helpers/session-pin.ts +44 -0
- package/src/slash-commands/helpers/usage-report.ts +22 -3
- package/src/stt/downloader.ts +0 -2
- package/src/stt/index.ts +0 -2
- package/src/stt/stt-controller.ts +57 -146
- package/src/system-prompt.ts +45 -17
- package/src/task/executor.ts +285 -70
- package/src/task/index.ts +98 -105
- package/src/task/output-manager.ts +25 -3
- package/src/task/persisted-revive.ts +4 -3
- package/src/task/structured-subagent.ts +1 -0
- package/src/tiny/title-client.ts +22 -0
- package/src/tools/approval.ts +55 -10
- package/src/tools/bash-interactive.ts +116 -86
- package/src/tools/bash-skill-urls.ts +28 -2
- package/src/tools/bash.ts +339 -123
- package/src/tools/browser/launch.ts +9 -1
- package/src/tools/browser/tab-supervisor.ts +8 -5
- package/src/tools/browser.ts +94 -47
- package/src/tools/builtin-names.ts +1 -0
- package/src/tools/computer/protocol.ts +28 -0
- package/src/tools/computer/supervisor.ts +258 -0
- package/src/tools/computer/worker-entry.ts +25 -0
- package/src/tools/computer/worker.ts +135 -0
- package/src/tools/computer-renderer.ts +108 -0
- package/src/tools/computer.ts +433 -0
- package/src/tools/context.ts +2 -0
- package/src/tools/default-renderer.ts +139 -0
- package/src/tools/essential-tools.ts +1 -0
- package/src/tools/image-gen.ts +20 -28
- package/src/tools/image-providers.ts +50 -0
- package/src/tools/index.ts +14 -0
- package/src/tools/path-utils.ts +49 -2
- package/src/tools/read.ts +156 -88
- package/src/tools/renderers.ts +9 -1
- package/src/tools/todo.ts +101 -11
- package/src/tools/vibe.ts +1 -2
- package/src/tools/write.ts +51 -1
- package/src/tools/xdev.ts +121 -29
- package/src/tts/streaming-player.ts +82 -283
- package/src/tts/vocalizer.ts +18 -1
- package/src/utils/clipboard.ts +1 -30
- package/src/utils/jj.ts +125 -4
- package/src/utils/lang-from-path.ts +7 -0
- package/src/utils/mac-file-urls.applescript +37 -0
- package/src/utils/title-generator.ts +137 -1
- package/src/utils/tool-choice.ts +14 -0
- package/src/utils/tools-manager.ts +1 -19
- package/src/vibe/runtime.ts +852 -72
- package/src/web/search/index.ts +3 -6
- package/src/web/search/provider.ts +31 -16
- package/src/web/search/providers/xai.ts +7 -1
- package/src/web/search/types.ts +3 -0
- package/dist/types/stt/recorder.d.ts +0 -30
- package/dist/types/stt/transcriber.d.ts +0 -14
- package/dist/types/stt/wav.d.ts +0 -29
- package/dist/types/tts/player.d.ts +0 -32
- package/src/stt/recorder.ts +0 -551
- package/src/stt/transcriber.ts +0 -60
- package/src/stt/wav.ts +0 -173
- package/src/tts/player.ts +0 -137
package/src/tools/image-gen.ts
CHANGED
|
@@ -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
|
|
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
|
|
61
|
-
|
|
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(...
|
|
85
|
-
.describe("image provider for this request; overrides the providers.
|
|
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
|
-
/**
|
|
451
|
-
let
|
|
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
|
|
458
|
-
export function
|
|
459
|
-
|
|
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
|
-
|
|
629
|
-
|
|
630
|
-
):
|
|
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
|
-
|
|
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
|
|
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
|
+
}
|
package/src/tools/index.ts
CHANGED
|
@@ -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 (
|
package/src/tools/path-utils.ts
CHANGED
|
@@ -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 {
|
|
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
|
// =============================================================================
|