@otto-code/server 0.5.0
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/.env.example +31 -0
- package/README.md +111 -0
- package/dist/scripts/dev-runner.js +37 -0
- package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
- package/dist/scripts/supervisor-entrypoint.js +141 -0
- package/dist/scripts/supervisor-log-config.js +31 -0
- package/dist/scripts/supervisor.js +252 -0
- package/dist/server/executable-resolution/executable-resolution.d.ts +10 -0
- package/dist/server/executable-resolution/executable-resolution.js +118 -0
- package/dist/server/executable-resolution/windows.d.ts +18 -0
- package/dist/server/executable-resolution/windows.js +65 -0
- package/dist/server/server/agent/activity-curator.d.ts +28 -0
- package/dist/server/server/agent/activity-curator.js +227 -0
- package/dist/server/server/agent/agent-archive.d.ts +11 -0
- package/dist/server/server/agent/agent-archive.js +16 -0
- package/dist/server/server/agent/agent-loading.d.ts +14 -0
- package/dist/server/server/agent/agent-loading.js +54 -0
- package/dist/server/server/agent/agent-manager.d.ts +470 -0
- package/dist/server/server/agent/agent-manager.js +3049 -0
- package/dist/server/server/agent/agent-personalities.d.ts +59 -0
- package/dist/server/server/agent/agent-personalities.js +103 -0
- package/dist/server/server/agent/agent-projections.d.ts +35 -0
- package/dist/server/server/agent/agent-projections.js +488 -0
- package/dist/server/server/agent/agent-prompt.d.ts +76 -0
- package/dist/server/server/agent/agent-prompt.js +230 -0
- package/dist/server/server/agent/agent-response-loop.d.ts +72 -0
- package/dist/server/server/agent/agent-response-loop.js +333 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts +736 -0
- package/dist/server/server/agent/agent-sdk-types.js +22 -0
- package/dist/server/server/agent/agent-storage.d.ts +147 -0
- package/dist/server/server/agent/agent-storage.js +326 -0
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
- package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
- package/dist/server/server/agent/agent-timeline-store-types.d.ts +50 -0
- package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
- package/dist/server/server/agent/agent-timeline-store.d.ts +27 -0
- package/dist/server/server/agent/agent-timeline-store.js +230 -0
- package/dist/server/server/agent/audio-utils.d.ts +3 -0
- package/dist/server/server/agent/audio-utils.js +19 -0
- package/dist/server/server/agent/create-agent/create.d.ts +91 -0
- package/dist/server/server/agent/create-agent/create.js +370 -0
- package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +54 -0
- package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +152 -0
- package/dist/server/server/agent/create-agent-mode.d.ts +13 -0
- package/dist/server/server/agent/create-agent-mode.js +62 -0
- package/dist/server/server/agent/create-agent-title.d.ts +10 -0
- package/dist/server/server/agent/create-agent-title.js +34 -0
- package/dist/server/server/agent/dictation-debug.d.ts +13 -0
- package/dist/server/server/agent/dictation-debug.js +50 -0
- package/dist/server/server/agent/effort-levels.d.ts +2 -0
- package/dist/server/server/agent/effort-levels.js +7 -0
- package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
- package/dist/server/server/agent/foreground-run-state.js +160 -0
- package/dist/server/server/agent/import-sessions.d.ts +47 -0
- package/dist/server/server/agent/import-sessions.js +145 -0
- package/dist/server/server/agent/lifecycle-command.d.ts +73 -0
- package/dist/server/server/agent/lifecycle-command.js +92 -0
- package/dist/server/server/agent/mcp-server.d.ts +5 -0
- package/dist/server/server/agent/mcp-server.js +66 -0
- package/dist/server/server/agent/mcp-shared.d.ts +192 -0
- package/dist/server/server/agent/mcp-shared.js +201 -0
- package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
- package/dist/server/server/agent/pcm16-resampler.js +63 -0
- package/dist/server/server/agent/permission-response.d.ts +15 -0
- package/dist/server/server/agent/permission-response.js +14 -0
- package/dist/server/server/agent/personality-stats-store.d.ts +23 -0
- package/dist/server/server/agent/personality-stats-store.js +65 -0
- package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
- package/dist/server/server/agent/prompt-attachments.js +117 -0
- package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
- package/dist/server/server/agent/provider-history-timestamps.js +16 -0
- package/dist/server/server/agent/provider-launch-config.d.ts +43 -0
- package/dist/server/server/agent/provider-launch-config.js +167 -0
- package/dist/server/server/agent/provider-notices.d.ts +3 -0
- package/dist/server/server/agent/provider-notices.js +5 -0
- package/dist/server/server/agent/provider-registry.d.ts +41 -0
- package/dist/server/server/agent/provider-registry.js +532 -0
- package/dist/server/server/agent/provider-session-import.d.ts +10 -0
- package/dist/server/server/agent/provider-session-import.js +49 -0
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +142 -0
- package/dist/server/server/agent/provider-snapshot-manager.js +690 -0
- package/dist/server/server/agent/providers/acp-agent.d.ts +353 -0
- package/dist/server/server/agent/providers/acp-agent.js +2439 -0
- package/dist/server/server/agent/providers/claude/agent.d.ts +66 -0
- package/dist/server/server/agent/providers/claude/agent.js +4535 -0
- package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
- package/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
- package/dist/server/server/agent/providers/claude/model-manifest.d.ts +90 -0
- package/dist/server/server/agent/providers/claude/model-manifest.js +205 -0
- package/dist/server/server/agent/providers/claude/models.d.ts +11 -0
- package/dist/server/server/agent/providers/claude/models.js +97 -0
- package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
- package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
- package/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
- package/dist/server/server/agent/providers/claude/project-dir.js +57 -0
- package/dist/server/server/agent/providers/claude/query.d.ts +17 -0
- package/dist/server/server/agent/providers/claude/query.js +86 -0
- package/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
- package/dist/server/server/agent/providers/claude/rewind.js +30 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +35 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +272 -0
- package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
- package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +90 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js +262 -0
- package/dist/server/server/agent/providers/codex/rewind.d.ts +21 -0
- package/dist/server/server/agent/providers/codex/rewind.js +46 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +36 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +217 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +24 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +830 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +308 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.js +4515 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.js +188 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +15 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.js +18 -0
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js +355 -0
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +42 -0
- package/dist/server/server/agent/providers/generic-acp-agent.js +160 -0
- package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
- package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +85 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.js +1010 -0
- package/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
- package/dist/server/server/agent/providers/mock-slow-provider.js +39 -0
- package/dist/server/server/agent/providers/openai-compat-agent.d.ts +422 -0
- package/dist/server/server/agent/providers/openai-compat-agent.js +2536 -0
- package/dist/server/server/agent/providers/openai-compat-feature-definitions.d.ts +40 -0
- package/dist/server/server/agent/providers/openai-compat-feature-definitions.js +82 -0
- package/dist/server/server/agent/providers/openai-compat-mcp.d.ts +87 -0
- package/dist/server/server/agent/providers/openai-compat-mcp.js +353 -0
- package/dist/server/server/agent/providers/openai-compat-otto-tool-permissions.d.ts +29 -0
- package/dist/server/server/agent/providers/openai-compat-otto-tool-permissions.js +96 -0
- package/dist/server/server/agent/providers/openai-compat-tools.d.ts +69 -0
- package/dist/server/server/agent/providers/openai-compat-tools.js +1224 -0
- package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/paths.js +7 -0
- package/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
- package/dist/server/server/agent/providers/opencode/rewind.js +14 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +91 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +425 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +25 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js +39 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.d.ts +92 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.js +260 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +286 -0
- package/dist/server/server/agent/providers/opencode-agent.js +2830 -0
- package/dist/server/server/agent/providers/pi/agent.d.ts +132 -0
- package/dist/server/server/agent/providers/pi/agent.js +1649 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.js +261 -0
- package/dist/server/server/agent/providers/pi/history-mapper.d.ts +9 -0
- package/dist/server/server/agent/providers/pi/history-mapper.js +140 -0
- package/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
- package/dist/server/server/agent/providers/pi/rewind.js +8 -0
- package/dist/server/server/agent/providers/pi/rpc-types.d.ts +208 -0
- package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
- package/dist/server/server/agent/providers/pi/runtime.d.ts +57 -0
- package/dist/server/server/agent/providers/pi/runtime.js +56 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.js +346 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +83 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +184 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
- package/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
- package/dist/server/server/agent/providers/provider-image-output.js +111 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
- package/dist/server/server/agent/providers/provider-runner.js +81 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
- package/dist/server/server/agent/providers/trae-acp-agent.d.ts +15 -0
- package/dist/server/server/agent/providers/trae-acp-agent.js +18 -0
- package/dist/server/server/agent/recordings-debug.d.ts +3 -0
- package/dist/server/server/agent/recordings-debug.js +19 -0
- package/dist/server/server/agent/rewind/rewind.d.ts +10 -0
- package/dist/server/server/agent/rewind/rewind.js +29 -0
- package/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
- package/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
- package/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
- package/dist/server/server/agent/runtime-mcp-config.js +53 -0
- package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
- package/dist/server/server/agent/structured-generation-providers.js +236 -0
- package/dist/server/server/agent/stt-debug.d.ts +10 -0
- package/dist/server/server/agent/stt-debug.js +33 -0
- package/dist/server/server/agent/stt-manager.d.ts +38 -0
- package/dist/server/server/agent/stt-manager.js +246 -0
- package/dist/server/server/agent/system-prompt.d.ts +2 -0
- package/dist/server/server/agent/system-prompt.js +8 -0
- package/dist/server/server/agent/timeline-append.d.ts +10 -0
- package/dist/server/server/agent/timeline-append.js +27 -0
- package/dist/server/server/agent/timeline-projection.d.ts +71 -0
- package/dist/server/server/agent/timeline-projection.js +373 -0
- package/dist/server/server/agent/tools/otto-tools.d.ts +80 -0
- package/dist/server/server/agent/tools/otto-tools.js +2912 -0
- package/dist/server/server/agent/tools/types.d.ts +36 -0
- package/dist/server/server/agent/tools/types.js +2 -0
- package/dist/server/server/agent/tts-debug.d.ts +8 -0
- package/dist/server/server/agent/tts-debug.js +24 -0
- package/dist/server/server/agent/tts-manager.d.ts +41 -0
- package/dist/server/server/agent/tts-manager.js +375 -0
- package/dist/server/server/agent-attention-policy.d.ts +29 -0
- package/dist/server/server/agent-attention-policy.js +36 -0
- package/dist/server/server/artifact/artifact-prompt.d.ts +2 -0
- package/dist/server/server/artifact/artifact-prompt.js +15 -0
- package/dist/server/server/artifact/artifact-service.d.ts +91 -0
- package/dist/server/server/artifact/artifact-service.js +419 -0
- package/dist/server/server/artifact/artifact-store.d.ts +24 -0
- package/dist/server/server/artifact/artifact-store.js +168 -0
- package/dist/server/server/artifact/artifact-watcher.d.ts +34 -0
- package/dist/server/server/artifact/artifact-watcher.js +146 -0
- package/dist/server/server/artifact/html-validator.d.ts +26 -0
- package/dist/server/server/artifact/html-validator.js +92 -0
- package/dist/server/server/atomic-file.d.ts +5 -0
- package/dist/server/server/atomic-file.js +19 -0
- package/dist/server/server/auth.d.ts +38 -0
- package/dist/server/server/auth.js +143 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +92 -0
- package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
- package/dist/server/server/auto-archive-on-merge/index.js +15 -0
- package/dist/server/server/bootstrap.d.ts +127 -0
- package/dist/server/server/bootstrap.js +1331 -0
- package/dist/server/server/browser-tools/broker.d.ts +45 -0
- package/dist/server/server/browser-tools/broker.js +390 -0
- package/dist/server/server/browser-tools/errors.d.ts +22 -0
- package/dist/server/server/browser-tools/errors.js +27 -0
- package/dist/server/server/browser-tools/policy.d.ts +10 -0
- package/dist/server/server/browser-tools/policy.js +16 -0
- package/dist/server/server/browser-tools/tools.d.ts +24 -0
- package/dist/server/server/browser-tools/tools.js +967 -0
- package/dist/server/server/chat/chat-mentions.d.ts +47 -0
- package/dist/server/server/chat/chat-mentions.js +113 -0
- package/dist/server/server/chat/chat-service.d.ts +78 -0
- package/dist/server/server/chat/chat-service.js +337 -0
- package/dist/server/server/checkout/status-projection.d.ts +19 -0
- package/dist/server/server/checkout/status-projection.js +117 -0
- package/dist/server/server/checkout-diff-manager.d.ts +41 -0
- package/dist/server/server/checkout-diff-manager.js +189 -0
- package/dist/server/server/checkout-git-utils.d.ts +11 -0
- package/dist/server/server/checkout-git-utils.js +34 -0
- package/dist/server/server/client-message-id.d.ts +3 -0
- package/dist/server/server/client-message-id.js +12 -0
- package/dist/server/server/config.d.ts +22 -0
- package/dist/server/server/config.js +330 -0
- package/dist/server/server/connection-offer.d.ts +20 -0
- package/dist/server/server/connection-offer.js +59 -0
- package/dist/server/server/daemon-config-store.d.ts +44 -0
- package/dist/server/server/daemon-config-store.js +530 -0
- package/dist/server/server/daemon-keypair.d.ts +8 -0
- package/dist/server/server/daemon-keypair.js +42 -0
- package/dist/server/server/daemon-version.d.ts +5 -0
- package/dist/server/server/daemon-version.js +22 -0
- package/dist/server/server/daemon-worker.d.ts +2 -0
- package/dist/server/server/daemon-worker.js +251 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
- package/dist/server/server/dictation/dictation-stream-manager.js +572 -0
- package/dist/server/server/exports.d.ts +24 -0
- package/dist/server/server/exports.js +24 -0
- package/dist/server/server/file-download/token-store.d.ts +24 -0
- package/dist/server/server/file-download/token-store.js +40 -0
- package/dist/server/server/file-explorer/code-index.d.ts +28 -0
- package/dist/server/server/file-explorer/code-index.js +127 -0
- package/dist/server/server/file-explorer/file-search.d.ts +72 -0
- package/dist/server/server/file-explorer/file-search.js +297 -0
- package/dist/server/server/file-explorer/file-watcher.d.ts +40 -0
- package/dist/server/server/file-explorer/file-watcher.js +0 -0
- package/dist/server/server/file-explorer/gitignore.d.ts +39 -0
- package/dist/server/server/file-explorer/gitignore.js +191 -0
- package/dist/server/server/file-explorer/service.d.ts +103 -0
- package/dist/server/server/file-explorer/service.js +420 -0
- package/dist/server/server/file-upload/index.d.ts +27 -0
- package/dist/server/server/file-upload/index.js +158 -0
- package/dist/server/server/hostnames.d.ts +13 -0
- package/dist/server/server/hostnames.js +94 -0
- package/dist/server/server/json-utils.d.ts +11 -0
- package/dist/server/server/json-utils.js +45 -0
- package/dist/server/server/lifecycle-reasons.d.ts +4 -0
- package/dist/server/server/lifecycle-reasons.js +6 -0
- package/dist/server/server/logger.d.ts +29 -0
- package/dist/server/server/logger.js +125 -0
- package/dist/server/server/loop-service.d.ts +234 -0
- package/dist/server/server/loop-service.js +804 -0
- package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
- package/dist/server/server/managed-processes/managed-processes.js +326 -0
- package/dist/server/server/messages.d.ts +9 -0
- package/dist/server/server/messages.js +29 -0
- package/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
- package/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
- package/dist/server/server/otto-env.d.ts +13 -0
- package/dist/server/server/otto-env.js +53 -0
- package/dist/server/server/otto-home.d.ts +2 -0
- package/dist/server/server/otto-home.js +19 -0
- package/dist/server/server/otto-worktree-service.d.ts +52 -0
- package/dist/server/server/otto-worktree-service.js +294 -0
- package/dist/server/server/package-version.d.ts +19 -0
- package/dist/server/server/package-version.js +60 -0
- package/dist/server/server/pagination/cursor.d.ts +16 -0
- package/dist/server/server/pagination/cursor.js +62 -0
- package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
- package/dist/server/server/pagination/sortable-pager.js +68 -0
- package/dist/server/server/pairing-offer.d.ts +18 -0
- package/dist/server/server/pairing-offer.js +47 -0
- package/dist/server/server/pairing-qr.d.ts +7 -0
- package/dist/server/server/pairing-qr.js +45 -0
- package/dist/server/server/path-utils.d.ts +5 -0
- package/dist/server/server/path-utils.js +34 -0
- package/dist/server/server/persisted-config.d.ts +417 -0
- package/dist/server/server/persisted-config.js +471 -0
- package/dist/server/server/persistence-hooks.d.ts +31 -0
- package/dist/server/server/persistence-hooks.js +93 -0
- package/dist/server/server/pid-lock.d.ts +32 -0
- package/dist/server/server/pid-lock.js +170 -0
- package/dist/server/server/preview/dev-server-manager.d.ts +108 -0
- package/dist/server/server/preview/dev-server-manager.js +426 -0
- package/dist/server/server/preview/launch-config.d.ts +37 -0
- package/dist/server/server/preview/launch-config.js +63 -0
- package/dist/server/server/preview/preview-tools.d.ts +30 -0
- package/dist/server/server/preview/preview-tools.js +249 -0
- package/dist/server/server/private-files.d.ts +6 -0
- package/dist/server/server/private-files.js +37 -0
- package/dist/server/server/process-diagnostics.d.ts +17 -0
- package/dist/server/server/process-diagnostics.js +22 -0
- package/dist/server/server/push/notifications.d.ts +9 -0
- package/dist/server/server/push/notifications.js +15 -0
- package/dist/server/server/push/push-service.d.ts +20 -0
- package/dist/server/server/push/push-service.js +66 -0
- package/dist/server/server/push/token-store.d.ts +18 -0
- package/dist/server/server/push/token-store.js +68 -0
- package/dist/server/server/relay-transport.d.ts +31 -0
- package/dist/server/server/relay-transport.js +514 -0
- package/dist/server/server/resolve-workspace-id-for-path.d.ts +3 -0
- package/dist/server/server/resolve-workspace-id-for-path.js +41 -0
- package/dist/server/server/resolve-worktree-creation-intent.d.ts +32 -0
- package/dist/server/server/resolve-worktree-creation-intent.js +121 -0
- package/dist/server/server/schedule/cron.d.ts +4 -0
- package/dist/server/server/schedule/cron.js +81 -0
- package/dist/server/server/schedule/service.d.ts +89 -0
- package/dist/server/server/schedule/service.js +882 -0
- package/dist/server/server/schedule/store.d.ts +27 -0
- package/dist/server/server/schedule/store.js +190 -0
- package/dist/server/server/script-health-monitor.d.ts +39 -0
- package/dist/server/server/script-health-monitor.js +159 -0
- package/dist/server/server/script-proxy.d.ts +3 -0
- package/dist/server/server/script-proxy.js +2 -0
- package/dist/server/server/script-route-branch-handler.d.ts +10 -0
- package/dist/server/server/script-route-branch-handler.js +11 -0
- package/dist/server/server/script-status-projection.d.ts +36 -0
- package/dist/server/server/script-status-projection.js +200 -0
- package/dist/server/server/server-id.d.ts +17 -0
- package/dist/server/server/server-id.js +68 -0
- package/dist/server/server/service-proxy.d.ts +237 -0
- package/dist/server/server/service-proxy.js +714 -0
- package/dist/server/server/session/agent-config/agent-config-session.d.ts +59 -0
- package/dist/server/server/session/agent-config/agent-config-session.js +110 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +65 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.js +232 -0
- package/dist/server/server/session/artifact/artifact-session.d.ts +45 -0
- package/dist/server/server/session/artifact/artifact-session.js +293 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +120 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.js +489 -0
- package/dist/server/server/session/checkout/checkout-session.d.ts +146 -0
- package/dist/server/server/session/checkout/checkout-session.js +1000 -0
- package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
- package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
- package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
- package/dist/server/server/session/daemon/daemon-session.d.ts +76 -0
- package/dist/server/server/session/daemon/daemon-session.js +148 -0
- package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
- package/dist/server/server/session/daemon/diagnostics.js +431 -0
- package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
- package/dist/server/server/session/daemon/install-origin.js +64 -0
- package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
- package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
- package/dist/server/server/session/files/workspace-files-session.d.ts +60 -0
- package/dist/server/server/session/files/workspace-files-session.js +518 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
- package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
- package/dist/server/server/session/project-config/project-config-session.js +125 -0
- package/dist/server/server/session/provider/provider-catalog-session.d.ts +74 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +343 -0
- package/dist/server/server/session/voice/voice-session.d.ts +167 -0
- package/dist/server/server/session/voice/voice-session.js +912 -0
- package/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
- package/dist/server/server/session/voice/voice-turn-controller.js +393 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
- package/dist/server/server/session.d.ts +450 -0
- package/dist/server/server/session.js +4763 -0
- package/dist/server/server/speech/audio.d.ts +10 -0
- package/dist/server/server/speech/audio.js +101 -0
- package/dist/server/server/speech/provider-resolver.d.ts +3 -0
- package/dist/server/server/speech/provider-resolver.js +7 -0
- package/dist/server/server/speech/providers/local/config.d.ts +30 -0
- package/dist/server/server/speech/providers/local/config.js +133 -0
- package/dist/server/server/speech/providers/local/models.d.ts +13 -0
- package/dist/server/server/speech/providers/local/models.js +21 -0
- package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
- package/dist/server/server/speech/providers/local/runtime.js +135 -0
- package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +109 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +129 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +16 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +195 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +24 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +145 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
- package/dist/server/server/speech/providers/local/sherpa/tts-voices.d.ts +10 -0
- package/dist/server/server/speech/providers/local/sherpa/tts-voices.js +86 -0
- package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
- package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
- package/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
- package/dist/server/server/speech/providers/local/worker-client.js +591 -0
- package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
- package/dist/server/server/speech/providers/local/worker-process.js +270 -0
- package/dist/server/server/speech/providers/local/worker-protocol.d.ts +96 -0
- package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
- package/dist/server/server/speech/providers/openai/config.d.ts +19 -0
- package/dist/server/server/speech/providers/openai/config.js +160 -0
- package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
- package/dist/server/server/speech/providers/openai/runtime.js +102 -0
- package/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
- package/dist/server/server/speech/providers/openai/stt.js +209 -0
- package/dist/server/server/speech/providers/openai/tts.d.ts +20 -0
- package/dist/server/server/speech/providers/openai/tts.js +70 -0
- package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
- package/dist/server/server/speech/speech-config-resolver.js +132 -0
- package/dist/server/server/speech/speech-provider.d.ts +71 -0
- package/dist/server/server/speech/speech-provider.js +2 -0
- package/dist/server/server/speech/speech-runtime.d.ts +67 -0
- package/dist/server/server/speech/speech-runtime.js +615 -0
- package/dist/server/server/speech/speech-settings-options.d.ts +14 -0
- package/dist/server/server/speech/speech-settings-options.js +73 -0
- package/dist/server/server/speech/speech-types.d.ts +22 -0
- package/dist/server/server/speech/speech-types.js +8 -0
- package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
- package/dist/server/server/speech/turn-detection-provider.js +2 -0
- package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
- package/dist/server/server/utils/diff-highlighter.js +279 -0
- package/dist/server/server/voice-config.d.ts +15 -0
- package/dist/server/server/voice-config.js +54 -0
- package/dist/server/server/voice-permission-policy.d.ts +4 -0
- package/dist/server/server/voice-permission-policy.js +13 -0
- package/dist/server/server/voice-types.d.ts +12 -0
- package/dist/server/server/voice-types.js +2 -0
- package/dist/server/server/web-ui.d.ts +10 -0
- package/dist/server/server/web-ui.js +205 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts +94 -0
- package/dist/server/server/websocket/runtime-metrics.js +148 -0
- package/dist/server/server/websocket-server.d.ts +187 -0
- package/dist/server/server/websocket-server.js +1766 -0
- package/dist/server/server/workspace-archive-service.d.ts +65 -0
- package/dist/server/server/workspace-archive-service.js +229 -0
- package/dist/server/server/workspace-auto-name.d.ts +55 -0
- package/dist/server/server/workspace-auto-name.js +128 -0
- package/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
- package/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
- package/dist/server/server/workspace-directory.d.ts +93 -0
- package/dist/server/server/workspace-directory.js +422 -0
- package/dist/server/server/workspace-git-metadata.d.ts +24 -0
- package/dist/server/server/workspace-git-metadata.js +55 -0
- package/dist/server/server/workspace-git-service.d.ts +270 -0
- package/dist/server/server/workspace-git-service.js +1423 -0
- package/dist/server/server/workspace-reconciliation-service.d.ts +57 -0
- package/dist/server/server/workspace-reconciliation-service.js +278 -0
- package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
- package/dist/server/server/workspace-registry-bootstrap.js +121 -0
- package/dist/server/server/workspace-registry-model.d.ts +55 -0
- package/dist/server/server/workspace-registry-model.js +190 -0
- package/dist/server/server/workspace-registry.d.ts +117 -0
- package/dist/server/server/workspace-registry.js +194 -0
- package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
- package/dist/server/server/workspace-script-runtime-store.js +78 -0
- package/dist/server/server/workspace-service-env.d.ts +18 -0
- package/dist/server/server/workspace-service-env.js +85 -0
- package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
- package/dist/server/server/workspace-service-port-registry.js +59 -0
- package/dist/server/server/worktree/commands.d.ts +55 -0
- package/dist/server/server/worktree/commands.js +107 -0
- package/dist/server/server/worktree-bootstrap.d.ts +76 -0
- package/dist/server/server/worktree-bootstrap.js +720 -0
- package/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
- package/dist/server/server/worktree-branch-name-generator.js +91 -0
- package/dist/server/server/worktree-core.d.ts +31 -0
- package/dist/server/server/worktree-core.js +105 -0
- package/dist/server/server/worktree-errors.d.ts +12 -0
- package/dist/server/server/worktree-errors.js +28 -0
- package/dist/server/server/worktree-session.d.ts +152 -0
- package/dist/server/server/worktree-session.js +466 -0
- package/dist/server/services/git-hosting/bitbucket-cloud-service.d.ts +24 -0
- package/dist/server/services/git-hosting/bitbucket-cloud-service.js +754 -0
- package/dist/server/services/git-hosting/github-hosting-service.d.ts +4 -0
- package/dist/server/services/git-hosting/github-hosting-service.js +11 -0
- package/dist/server/services/git-hosting/hosting-http-client.d.ts +20 -0
- package/dist/server/services/git-hosting/hosting-http-client.js +131 -0
- package/dist/server/services/git-hosting/request-cache.d.ts +20 -0
- package/dist/server/services/git-hosting/request-cache.js +68 -0
- package/dist/server/services/git-hosting/resolver.d.ts +32 -0
- package/dist/server/services/git-hosting/resolver.js +152 -0
- package/dist/server/services/git-hosting/router.d.ts +4 -0
- package/dist/server/services/git-hosting/router.js +105 -0
- package/dist/server/services/git-hosting/status-poller.d.ts +39 -0
- package/dist/server/services/git-hosting/status-poller.js +149 -0
- package/dist/server/services/git-hosting/types.d.ts +53 -0
- package/dist/server/services/git-hosting/types.js +75 -0
- package/dist/server/services/github-service.d.ts +339 -0
- package/dist/server/services/github-service.js +2109 -0
- package/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
- package/dist/server/services/quota-fetcher/manifest.js +52 -0
- package/dist/server/services/quota-fetcher/provider.d.ts +17 -0
- package/dist/server/services/quota-fetcher/provider.js +2 -0
- package/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
- package/dist/server/services/quota-fetcher/providers/claude.js +217 -0
- package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
- package/dist/server/services/quota-fetcher/providers/codex.js +211 -0
- package/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
- package/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
- package/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
- package/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
- package/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
- package/dist/server/services/quota-fetcher/providers/grok.js +89 -0
- package/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
- package/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
- package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
- package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
- package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
- package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
- package/dist/server/services/quota-fetcher/service.d.ts +28 -0
- package/dist/server/services/quota-fetcher/service.js +58 -0
- package/dist/server/services/quota-fetcher/usage.d.ts +22 -0
- package/dist/server/services/quota-fetcher/usage.js +49 -0
- package/dist/server/terminal/activity/terminal-activity-tracker.d.ts +20 -0
- package/dist/server/terminal/activity/terminal-activity-tracker.js +59 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
- package/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
- package/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
- package/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
- package/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
- package/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
- package/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +46 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
- package/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
- package/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
- package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
- package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
- package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/server/terminal/shell-integration/zsh/otto-integration.zsh +32 -0
- package/dist/server/terminal/terminal-capture.d.ts +12 -0
- package/dist/server/terminal/terminal-capture.js +43 -0
- package/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
- package/dist/server/terminal/terminal-manager-factory.js +5 -0
- package/dist/server/terminal/terminal-manager.d.ts +78 -0
- package/dist/server/terminal/terminal-manager.js +319 -0
- package/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
- package/dist/server/terminal/terminal-output-coalescer.js +73 -0
- package/dist/server/terminal/terminal-restore.d.ts +18 -0
- package/dist/server/terminal/terminal-restore.js +52 -0
- package/dist/server/terminal/terminal-session-controller.d.ts +85 -0
- package/dist/server/terminal/terminal-session-controller.js +819 -0
- package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
- package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
- package/dist/server/terminal/terminal-worker-process.js +304 -0
- package/dist/server/terminal/terminal-worker-protocol.d.ts +119 -0
- package/dist/server/terminal/terminal-worker-protocol.js +2 -0
- package/dist/server/terminal/terminal.d.ts +151 -0
- package/dist/server/terminal/terminal.js +1155 -0
- package/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
- package/dist/server/terminal/worker-terminal-manager.js +688 -0
- package/dist/server/utils/build-metadata-prompt.d.ts +19 -0
- package/dist/server/utils/build-metadata-prompt.js +29 -0
- package/dist/server/utils/checkout-git.d.ts +253 -0
- package/dist/server/utils/checkout-git.js +2241 -0
- package/dist/server/utils/directory-suggestions.d.ts +26 -0
- package/dist/server/utils/directory-suggestions.js +830 -0
- package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
- package/dist/server/utils/git-rev-parse-path.js +21 -0
- package/dist/server/utils/github-remote.d.ts +9 -0
- package/dist/server/utils/github-remote.js +62 -0
- package/dist/server/utils/otto-config-file.d.ts +30 -0
- package/dist/server/utils/otto-config-file.js +90 -0
- package/dist/server/utils/path.d.ts +18 -0
- package/dist/server/utils/path.js +123 -0
- package/dist/server/utils/project-icon.d.ts +39 -0
- package/dist/server/utils/project-icon.js +364 -0
- package/dist/server/utils/promise-timeout.d.ts +9 -0
- package/dist/server/utils/promise-timeout.js +25 -0
- package/dist/server/utils/run-git-command.d.ts +37 -0
- package/dist/server/utils/run-git-command.js +232 -0
- package/dist/server/utils/spawn.d.ts +25 -0
- package/dist/server/utils/spawn.js +59 -0
- package/dist/server/utils/string-command-shell.d.ts +13 -0
- package/dist/server/utils/string-command-shell.js +37 -0
- package/dist/server/utils/tree-kill.d.ts +18 -0
- package/dist/server/utils/tree-kill.js +77 -0
- package/dist/server/utils/windows-command.d.ts +15 -0
- package/dist/server/utils/windows-command.js +41 -0
- package/dist/server/utils/worktree-metadata.d.ts +39 -0
- package/dist/server/utils/worktree-metadata.js +174 -0
- package/dist/server/utils/worktree.d.ts +205 -0
- package/dist/server/utils/worktree.js +1120 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-a25c6055b348629689f75618db2c83e1.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-a25c6055b348629689f75618db2c83e1.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-a25c6055b348629689f75618db2c83e1.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-7dc26ea1611eb9d7c2971a6745e5bf5c.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-7dc26ea1611eb9d7c2971a6745e5bf5c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-7dc26ea1611eb9d7c2971a6745e5bf5c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-ea91f496cee180fa5bf308c8cc177646.js +3199 -0
- package/dist/server/web-ui/_expo/static/js/web/index-ea91f496cee180fa5bf308c8cc177646.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-ea91f496cee180fa5bf308c8cc177646.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b6b853a967343babf305512fe8c5958c.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b6b853a967343babf305512fe8c5958c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b6b853a967343babf305512fe8c5958c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-17223e158406802adc686d02d946573d.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-17223e158406802adc686d02d946573d.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-17223e158406802adc686d02d946573d.js.gz +0 -0
- package/dist/server/web-ui/apple-touch-icon.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@expo-google-fonts/inter/400Regular/Inter_400Regular.51b6ad87261f18b6433ec52871ddfabc.ttf +0 -0
- package/dist/server/web-ui/assets/__node_modules/@expo-google-fonts/jetbrains-mono/400Regular/JetBrainsMono_400Regular.a0147b5ab9e4946e81879aef45313def.ttf +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/clion.baa1f4eb572e962a6117bdbee95749e4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/goland.0796ab2b9be2637fd1cdcde891fad3ca.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/intellij-idea.33bc9ff9c0815d8ad43f618c8c244401.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/phpstorm.c60b33bc7a8309143d232e14b76554c5.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/pycharm.88f25ac484989c45c25323e0adccfa9f.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/rider.1a1091dc3a0ede0461f0aa38a54f080a.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/rubymine.0e5b66fd7d43f8cbac0f05bba97c9a21.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/rustrover.3590ef05482369f41d3484c90272570d.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.3b2c331d11122d8f743c73a5878593be.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-running.6077c2ab71021b31c82a42e0b42ad837.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark.12984efe6d435a13794a74cd2f858dcd.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-attention.3b2c331d11122d8f743c73a5878593be.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-running.6077c2ab71021b31c82a42e0b42ad837.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light.12984efe6d435a13794a74cd2f858dcd.png +0 -0
- package/dist/server/web-ui/assets/assets/images/notification-icon.2394c3b427c0f5ee2bb84864d8fb0f45.png +0 -0
- package/dist/server/web-ui/favicon.ico +0 -0
- package/dist/server/web-ui/index.html +147 -0
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/server/web-ui/manifest.json +27 -0
- package/dist/server/web-ui/manifest.json.br +0 -0
- package/dist/server/web-ui/manifest.json.gz +0 -0
- package/dist/server/web-ui/metadata.json +1 -0
- package/dist/server/web-ui/metadata.json.br +1 -0
- package/dist/server/web-ui/metadata.json.gz +0 -0
- package/dist/server/web-ui/pwa-icon-192.png +0 -0
- package/dist/server/web-ui/pwa-icon-512.png +0 -0
- package/dist/server/web-ui/robots.txt +2 -0
- package/dist/src/executable-resolution/executable-resolution.js +118 -0
- package/dist/src/executable-resolution/windows.js +65 -0
- package/dist/src/server/agent/provider-launch-config.js +167 -0
- package/dist/src/server/otto-env.js +53 -0
- package/dist/src/server/otto-home.js +19 -0
- package/dist/src/server/persisted-config.js +471 -0
- package/dist/src/server/pid-lock.js +170 -0
- package/dist/src/server/private-files.js +37 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/src/terminal/shell-integration/zsh/otto-integration.zsh +32 -0
- package/dist/src/utils/spawn.js +59 -0
- package/dist/src/utils/windows-command.js +41 -0
- package/package.json +118 -0
|
@@ -0,0 +1,967 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { BrowserAutomationBrowserIdSchema } from "@otto-code/protocol/browser-automation/rpc-schemas";
|
|
3
|
+
const HTTP_URL_ONLY_MESSAGE = "URL must use http/https only";
|
|
4
|
+
const WORKSPACE_CONTEXT_MESSAGE = "This browser tool needs a workspace. Start the agent from a Otto workspace before calling browser_new_tab or browser_list_tabs.";
|
|
5
|
+
const URL_WHITESPACE_PATTERN = /\s/;
|
|
6
|
+
const NON_HTTP_EXPLICIT_SCHEME_PATTERN = /^(?!https?:\/\/)[a-z][a-z0-9+.-]*:\/\//i;
|
|
7
|
+
const BrowserHttpUrlInputSchema = z
|
|
8
|
+
.string()
|
|
9
|
+
.trim()
|
|
10
|
+
.transform((value, context) => {
|
|
11
|
+
const normalized = normalizeHttpUrlInput(value);
|
|
12
|
+
if (!normalized) {
|
|
13
|
+
context.addIssue({
|
|
14
|
+
code: "custom",
|
|
15
|
+
message: HTTP_URL_ONLY_MESSAGE,
|
|
16
|
+
});
|
|
17
|
+
return z.NEVER;
|
|
18
|
+
}
|
|
19
|
+
return normalized;
|
|
20
|
+
});
|
|
21
|
+
const BrowserRefInputSchema = z.string().regex(/^@e\d+$/);
|
|
22
|
+
const BrowserClickButtonInputSchema = z.enum(["left", "right", "middle"]);
|
|
23
|
+
const BrowserClickModifierInputSchema = z.enum(["Alt", "Control", "Meta", "Shift"]);
|
|
24
|
+
const BrowserWaitInputSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
text: z.string().min(1).optional(),
|
|
27
|
+
url: z.string().min(1).optional(),
|
|
28
|
+
timeoutMs: z.number().int().positive().max(30000).optional(),
|
|
29
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
30
|
+
})
|
|
31
|
+
.refine((input) => Number(Boolean(input.text)) + Number(Boolean(input.url)) === 1, {
|
|
32
|
+
message: "browser_wait requires exactly one of text or url",
|
|
33
|
+
});
|
|
34
|
+
const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "::1", "[::1]"]);
|
|
35
|
+
function urlPort(url) {
|
|
36
|
+
if (url.port) {
|
|
37
|
+
return Number(url.port);
|
|
38
|
+
}
|
|
39
|
+
return url.protocol === "https:" ? 443 : 80;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Find the running preview server a URL points at, if any. Preview servers
|
|
43
|
+
* always bind loopback, so a match means "loopback host + same port" — the
|
|
44
|
+
* agent may write localhost where the server registered 127.0.0.1.
|
|
45
|
+
*/
|
|
46
|
+
function findPreviewServerForUrl(params) {
|
|
47
|
+
const { previewServers, cwd, url } = params;
|
|
48
|
+
if (!previewServers || !cwd) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
let target;
|
|
52
|
+
try {
|
|
53
|
+
target = new URL(url);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
if (!LOOPBACK_HOSTS.has(target.hostname)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const port = urlPort(target);
|
|
62
|
+
for (const server of previewServers.list(cwd)) {
|
|
63
|
+
if (server.status !== "exited" && server.port === port) {
|
|
64
|
+
return server;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Deterministic backstop behind the tool-description guardrails: opening a
|
|
71
|
+
* preview server's URL anywhere but its designated tab is rejected with a
|
|
72
|
+
* message pointing at the right browserId (or at preview_start when no tab is
|
|
73
|
+
* bound yet), instead of trusting the agent to have read the descriptions.
|
|
74
|
+
*/
|
|
75
|
+
function previewTabRedirectResult(params) {
|
|
76
|
+
const { server, context } = params;
|
|
77
|
+
const message = server.boundBrowserId
|
|
78
|
+
? `${server.url} belongs to the preview server "${server.name}" started with preview_start. ` +
|
|
79
|
+
`Use its designated preview tab instead of opening another one: pass browserId=${server.boundBrowserId} ` +
|
|
80
|
+
`to browser_snapshot, browser_navigate, browser_screenshot, and the other browser tools.`
|
|
81
|
+
: `${server.url} belongs to the preview server "${server.name}", which has no designated preview tab yet. ` +
|
|
82
|
+
`Call preview_start with name "${server.name}" — it opens (or re-finds) the tab and returns its browserId.`;
|
|
83
|
+
return browserToolResult({
|
|
84
|
+
payload: {
|
|
85
|
+
requestId: "browser-tools-preview-redirect",
|
|
86
|
+
ok: false,
|
|
87
|
+
error: {
|
|
88
|
+
code: "browser_denied",
|
|
89
|
+
message,
|
|
90
|
+
retryable: false,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
context,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export function registerBrowserTools(options) {
|
|
97
|
+
options.registerTool("browser_list_tabs", {
|
|
98
|
+
title: "List browser tabs",
|
|
99
|
+
description: "List open Otto browser tabs for this agent's workspace across connected browser automation hosts. Use returned browserId values with tab-scoped tools.",
|
|
100
|
+
inputSchema: {},
|
|
101
|
+
}, async () => {
|
|
102
|
+
const context = resolveBrowserToolContext(options);
|
|
103
|
+
const missingWorkspace = requireWorkspaceContext(context);
|
|
104
|
+
if (missingWorkspace) {
|
|
105
|
+
return missingWorkspace;
|
|
106
|
+
}
|
|
107
|
+
const payload = await options.broker.execute({
|
|
108
|
+
agentId: context.agentId,
|
|
109
|
+
cwd: context.cwd,
|
|
110
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
111
|
+
command: {
|
|
112
|
+
command: "list_tabs",
|
|
113
|
+
args: {},
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
return browserToolResult({ payload, context });
|
|
117
|
+
});
|
|
118
|
+
options.registerTool("browser_new_tab", {
|
|
119
|
+
title: "Create browser tab",
|
|
120
|
+
description: "Create a new Otto browser tab in this agent's workspace on the most recently connected browser automation host, opened in the background without switching the user's view. Pass an http(s) URL or a scheme-less host URL, which is treated as http; the returned browserId is used by tab-scoped tools. " +
|
|
121
|
+
"Do NOT use this to open or view a dev server — preview_start opens the server's designated preview tab and returns its browserId. Use this tool only for external sites and general browsing.",
|
|
122
|
+
inputSchema: {
|
|
123
|
+
url: BrowserHttpUrlInputSchema.optional(),
|
|
124
|
+
},
|
|
125
|
+
}, async ({ url }) => {
|
|
126
|
+
const context = resolveBrowserToolContext(options);
|
|
127
|
+
const missingWorkspace = requireWorkspaceContext(context);
|
|
128
|
+
if (missingWorkspace) {
|
|
129
|
+
return missingWorkspace;
|
|
130
|
+
}
|
|
131
|
+
if (url) {
|
|
132
|
+
const previewServer = findPreviewServerForUrl({
|
|
133
|
+
previewServers: options.previewServers,
|
|
134
|
+
cwd: context.cwd,
|
|
135
|
+
url,
|
|
136
|
+
});
|
|
137
|
+
if (previewServer) {
|
|
138
|
+
return previewTabRedirectResult({ server: previewServer, context });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const payload = await options.broker.execute({
|
|
142
|
+
agentId: context.agentId,
|
|
143
|
+
cwd: context.cwd,
|
|
144
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
145
|
+
command: {
|
|
146
|
+
command: "new_tab",
|
|
147
|
+
args: url ? { url } : {},
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
return browserToolResult({ payload, context });
|
|
151
|
+
});
|
|
152
|
+
options.registerTool("browser_snapshot", {
|
|
153
|
+
title: "Snapshot browser page",
|
|
154
|
+
description: "Return a model-readable snapshot of a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
155
|
+
inputSchema: {
|
|
156
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
157
|
+
},
|
|
158
|
+
}, async ({ browserId }) => {
|
|
159
|
+
const context = resolveBrowserToolContext(options);
|
|
160
|
+
const payload = await options.broker.execute({
|
|
161
|
+
agentId: context.agentId,
|
|
162
|
+
cwd: context.cwd,
|
|
163
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
164
|
+
command: {
|
|
165
|
+
command: "snapshot",
|
|
166
|
+
args: {
|
|
167
|
+
browserId,
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
172
|
+
});
|
|
173
|
+
options.registerTool("browser_click", {
|
|
174
|
+
title: "Click browser element",
|
|
175
|
+
description: "Click an element in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
176
|
+
inputSchema: {
|
|
177
|
+
ref: BrowserRefInputSchema,
|
|
178
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
179
|
+
button: BrowserClickButtonInputSchema.optional(),
|
|
180
|
+
doubleClick: z.boolean().optional(),
|
|
181
|
+
modifiers: z.array(BrowserClickModifierInputSchema).optional(),
|
|
182
|
+
},
|
|
183
|
+
}, async ({ ref, browserId, button, doubleClick, modifiers }) => {
|
|
184
|
+
const context = resolveBrowserToolContext(options);
|
|
185
|
+
const payload = await options.broker.execute({
|
|
186
|
+
agentId: context.agentId,
|
|
187
|
+
cwd: context.cwd,
|
|
188
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
189
|
+
command: {
|
|
190
|
+
command: "click",
|
|
191
|
+
args: {
|
|
192
|
+
browserId,
|
|
193
|
+
ref,
|
|
194
|
+
button: button ?? "left",
|
|
195
|
+
doubleClick: doubleClick ?? false,
|
|
196
|
+
modifiers: modifiers ?? [],
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
201
|
+
});
|
|
202
|
+
options.registerTool("browser_fill", {
|
|
203
|
+
title: "Fill browser element",
|
|
204
|
+
description: "Fill an input-like element in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
205
|
+
inputSchema: {
|
|
206
|
+
ref: BrowserRefInputSchema,
|
|
207
|
+
value: z.string(),
|
|
208
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
209
|
+
},
|
|
210
|
+
}, async ({ ref, value, browserId }) => {
|
|
211
|
+
const context = resolveBrowserToolContext(options);
|
|
212
|
+
const payload = await options.broker.execute({
|
|
213
|
+
agentId: context.agentId,
|
|
214
|
+
cwd: context.cwd,
|
|
215
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
216
|
+
command: {
|
|
217
|
+
command: "fill",
|
|
218
|
+
args: {
|
|
219
|
+
browserId,
|
|
220
|
+
ref,
|
|
221
|
+
value,
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
226
|
+
});
|
|
227
|
+
options.registerTool("browser_wait", {
|
|
228
|
+
title: "Wait for browser condition",
|
|
229
|
+
description: "Wait until a Otto browser tab contains text or reaches a URL fragment. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; waits up to 5s by default on the browser host.",
|
|
230
|
+
inputSchema: BrowserWaitInputSchema,
|
|
231
|
+
}, async ({ text, url, timeoutMs, browserId }) => {
|
|
232
|
+
const context = resolveBrowserToolContext(options);
|
|
233
|
+
const payload = await options.broker.execute({
|
|
234
|
+
agentId: context.agentId,
|
|
235
|
+
cwd: context.cwd,
|
|
236
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
237
|
+
...(timeoutMs ? { timeoutMs: timeoutMs + 1000 } : {}),
|
|
238
|
+
command: {
|
|
239
|
+
command: "wait",
|
|
240
|
+
args: {
|
|
241
|
+
browserId,
|
|
242
|
+
...(text ? { text } : {}),
|
|
243
|
+
...(url ? { url } : {}),
|
|
244
|
+
...(timeoutMs ? { timeoutMs } : {}),
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
249
|
+
});
|
|
250
|
+
options.registerTool("browser_type", {
|
|
251
|
+
title: "Type into browser",
|
|
252
|
+
description: "Type text into an element, or into the focused element when ref is omitted. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
253
|
+
inputSchema: {
|
|
254
|
+
text: z.string(),
|
|
255
|
+
ref: BrowserRefInputSchema.optional(),
|
|
256
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
257
|
+
},
|
|
258
|
+
}, async ({ text, ref, browserId }) => {
|
|
259
|
+
const context = resolveBrowserToolContext(options);
|
|
260
|
+
const payload = await options.broker.execute({
|
|
261
|
+
agentId: context.agentId,
|
|
262
|
+
cwd: context.cwd,
|
|
263
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
264
|
+
command: {
|
|
265
|
+
command: "type",
|
|
266
|
+
args: {
|
|
267
|
+
browserId,
|
|
268
|
+
...(ref ? { ref } : {}),
|
|
269
|
+
text,
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
274
|
+
});
|
|
275
|
+
options.registerTool("browser_keypress", {
|
|
276
|
+
title: "Press browser key",
|
|
277
|
+
description: "Dispatch a keypress to an element, or to the focused element when ref is omitted. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
278
|
+
inputSchema: {
|
|
279
|
+
key: z.string().min(1),
|
|
280
|
+
ref: BrowserRefInputSchema.optional(),
|
|
281
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
282
|
+
},
|
|
283
|
+
}, async ({ key, ref, browserId }) => {
|
|
284
|
+
const context = resolveBrowserToolContext(options);
|
|
285
|
+
const payload = await options.broker.execute({
|
|
286
|
+
agentId: context.agentId,
|
|
287
|
+
cwd: context.cwd,
|
|
288
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
289
|
+
command: {
|
|
290
|
+
command: "keypress",
|
|
291
|
+
args: {
|
|
292
|
+
browserId,
|
|
293
|
+
...(ref ? { ref } : {}),
|
|
294
|
+
key,
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
299
|
+
});
|
|
300
|
+
options.registerTool("browser_navigate", {
|
|
301
|
+
title: "Navigate browser",
|
|
302
|
+
description: "Navigate a Otto browser tab to a URL. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; pass an http(s) URL or a scheme-less host URL, which is treated as http. " +
|
|
303
|
+
"Dev server URLs can only be opened in the server's designated preview tab — the browserId returned by preview_start.",
|
|
304
|
+
inputSchema: { url: BrowserHttpUrlInputSchema, browserId: BrowserAutomationBrowserIdSchema },
|
|
305
|
+
}, async ({ url, browserId }) => {
|
|
306
|
+
const context = resolveBrowserToolContext(options);
|
|
307
|
+
const previewServer = findPreviewServerForUrl({
|
|
308
|
+
previewServers: options.previewServers,
|
|
309
|
+
cwd: context.cwd,
|
|
310
|
+
url,
|
|
311
|
+
});
|
|
312
|
+
if (previewServer && previewServer.boundBrowserId !== browserId) {
|
|
313
|
+
return previewTabRedirectResult({
|
|
314
|
+
server: previewServer,
|
|
315
|
+
context: { ...context, browserId },
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
const payload = await options.broker.execute({
|
|
319
|
+
agentId: context.agentId,
|
|
320
|
+
cwd: context.cwd,
|
|
321
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
322
|
+
command: {
|
|
323
|
+
command: "navigate",
|
|
324
|
+
args: {
|
|
325
|
+
browserId,
|
|
326
|
+
url,
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
331
|
+
});
|
|
332
|
+
for (const toolConfig of [
|
|
333
|
+
{
|
|
334
|
+
name: "browser_back",
|
|
335
|
+
command: "back",
|
|
336
|
+
title: "Browser back",
|
|
337
|
+
description: "Go back in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing.",
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
name: "browser_forward",
|
|
341
|
+
command: "forward",
|
|
342
|
+
title: "Browser forward",
|
|
343
|
+
description: "Go forward in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing.",
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
name: "browser_reload",
|
|
347
|
+
command: "reload",
|
|
348
|
+
title: "Browser reload",
|
|
349
|
+
description: "Reload a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing.",
|
|
350
|
+
},
|
|
351
|
+
]) {
|
|
352
|
+
options.registerTool(toolConfig.name, {
|
|
353
|
+
title: toolConfig.title,
|
|
354
|
+
description: toolConfig.description,
|
|
355
|
+
inputSchema: { browserId: BrowserAutomationBrowserIdSchema },
|
|
356
|
+
}, async ({ browserId }) => {
|
|
357
|
+
const context = resolveBrowserToolContext(options);
|
|
358
|
+
const payload = await options.broker.execute({
|
|
359
|
+
agentId: context.agentId,
|
|
360
|
+
cwd: context.cwd,
|
|
361
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
362
|
+
command: {
|
|
363
|
+
command: toolConfig.command,
|
|
364
|
+
args: {
|
|
365
|
+
browserId,
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
});
|
|
369
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
options.registerTool("browser_screenshot", {
|
|
373
|
+
title: "Capture browser screenshot",
|
|
374
|
+
description: "Capture a PNG screenshot of a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing. Set fullPage to true to capture the full page.",
|
|
375
|
+
inputSchema: {
|
|
376
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
377
|
+
fullPage: z.boolean().default(false),
|
|
378
|
+
},
|
|
379
|
+
}, async ({ browserId, fullPage }) => {
|
|
380
|
+
const context = resolveBrowserToolContext(options);
|
|
381
|
+
const payload = await options.broker.execute({
|
|
382
|
+
agentId: context.agentId,
|
|
383
|
+
cwd: context.cwd,
|
|
384
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
385
|
+
command: {
|
|
386
|
+
command: "screenshot",
|
|
387
|
+
args: {
|
|
388
|
+
browserId,
|
|
389
|
+
fullPage: fullPage ?? false,
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
394
|
+
});
|
|
395
|
+
options.registerTool("browser_upload", {
|
|
396
|
+
title: "Upload files in browser",
|
|
397
|
+
description: "Set workspace files on a file input in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
398
|
+
inputSchema: {
|
|
399
|
+
ref: BrowserRefInputSchema,
|
|
400
|
+
filePaths: z.array(z.string().min(1)).min(1),
|
|
401
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
402
|
+
},
|
|
403
|
+
}, async ({ ref, filePaths, browserId }) => {
|
|
404
|
+
const context = resolveBrowserToolContext(options);
|
|
405
|
+
const payload = await options.broker.execute({
|
|
406
|
+
agentId: context.agentId,
|
|
407
|
+
cwd: context.cwd,
|
|
408
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
409
|
+
command: {
|
|
410
|
+
command: "upload",
|
|
411
|
+
args: {
|
|
412
|
+
browserId,
|
|
413
|
+
ref,
|
|
414
|
+
filePaths,
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
});
|
|
418
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
419
|
+
});
|
|
420
|
+
for (const toolConfig of [
|
|
421
|
+
{
|
|
422
|
+
name: "browser_hover",
|
|
423
|
+
command: "hover",
|
|
424
|
+
title: "Hover browser element",
|
|
425
|
+
description: "Hover an element in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
426
|
+
},
|
|
427
|
+
]) {
|
|
428
|
+
options.registerTool(toolConfig.name, {
|
|
429
|
+
title: toolConfig.title,
|
|
430
|
+
description: toolConfig.description,
|
|
431
|
+
inputSchema: { ref: BrowserRefInputSchema, browserId: BrowserAutomationBrowserIdSchema },
|
|
432
|
+
}, async ({ ref, browserId }) => {
|
|
433
|
+
const context = resolveBrowserToolContext(options);
|
|
434
|
+
const payload = await options.broker.execute({
|
|
435
|
+
agentId: context.agentId,
|
|
436
|
+
cwd: context.cwd,
|
|
437
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
438
|
+
command: {
|
|
439
|
+
command: toolConfig.command,
|
|
440
|
+
args: {
|
|
441
|
+
browserId,
|
|
442
|
+
ref,
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
});
|
|
446
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
options.registerTool("browser_select", {
|
|
450
|
+
title: "Select browser option",
|
|
451
|
+
description: "Set a select element in a Otto browser tab to a value. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
452
|
+
inputSchema: {
|
|
453
|
+
ref: BrowserRefInputSchema,
|
|
454
|
+
value: z.string(),
|
|
455
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
456
|
+
},
|
|
457
|
+
}, async ({ ref, value, browserId }) => {
|
|
458
|
+
const context = resolveBrowserToolContext(options);
|
|
459
|
+
const payload = await options.broker.execute({
|
|
460
|
+
agentId: context.agentId,
|
|
461
|
+
cwd: context.cwd,
|
|
462
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
463
|
+
command: {
|
|
464
|
+
command: "select",
|
|
465
|
+
args: {
|
|
466
|
+
browserId,
|
|
467
|
+
ref,
|
|
468
|
+
value,
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
});
|
|
472
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
473
|
+
});
|
|
474
|
+
options.registerTool("browser_drag", {
|
|
475
|
+
title: "Drag browser element",
|
|
476
|
+
description: "Drag one element onto another in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; refs come from the latest browser_snapshot of the same tab and expire when the page changes.",
|
|
477
|
+
inputSchema: {
|
|
478
|
+
sourceRef: BrowserRefInputSchema,
|
|
479
|
+
targetRef: BrowserRefInputSchema,
|
|
480
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
481
|
+
},
|
|
482
|
+
}, async ({ sourceRef, targetRef, browserId }) => {
|
|
483
|
+
const context = resolveBrowserToolContext(options);
|
|
484
|
+
const payload = await options.broker.execute({
|
|
485
|
+
agentId: context.agentId,
|
|
486
|
+
cwd: context.cwd,
|
|
487
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
488
|
+
command: {
|
|
489
|
+
command: "drag",
|
|
490
|
+
args: {
|
|
491
|
+
browserId,
|
|
492
|
+
sourceRef,
|
|
493
|
+
targetRef,
|
|
494
|
+
},
|
|
495
|
+
},
|
|
496
|
+
});
|
|
497
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
498
|
+
});
|
|
499
|
+
options.registerTool("browser_logs", {
|
|
500
|
+
title: "Read browser logs",
|
|
501
|
+
description: "Read recent console messages and browser performance network entries for a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; maxEntries defaults to 50.",
|
|
502
|
+
inputSchema: {
|
|
503
|
+
maxEntries: z.number().int().positive().max(200).optional(),
|
|
504
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
505
|
+
},
|
|
506
|
+
}, async ({ maxEntries, browserId }) => {
|
|
507
|
+
const context = resolveBrowserToolContext(options);
|
|
508
|
+
const payload = await options.broker.execute({
|
|
509
|
+
agentId: context.agentId,
|
|
510
|
+
cwd: context.cwd,
|
|
511
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
512
|
+
command: {
|
|
513
|
+
command: "logs",
|
|
514
|
+
args: {
|
|
515
|
+
browserId,
|
|
516
|
+
maxEntries: maxEntries ?? 50,
|
|
517
|
+
},
|
|
518
|
+
},
|
|
519
|
+
});
|
|
520
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
521
|
+
});
|
|
522
|
+
options.registerTool("browser_inspect", {
|
|
523
|
+
title: "Inspect browser element",
|
|
524
|
+
description: "Inspect a DOM element in a Otto browser tab by CSS selector or snapshot ref. Returns tag/id/class, text content, bounding box, and computed styles. " +
|
|
525
|
+
"BEST tool for verifying visual properties like colors, fonts, spacing, and dimensions — more accurate than screenshots. " +
|
|
526
|
+
"Pass styles to select which CSS properties to return; defaults to common layout and typography properties. Use browserId from preview_start, browser_new_tab, or browser_list_tabs.",
|
|
527
|
+
inputSchema: {
|
|
528
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
529
|
+
selector: z
|
|
530
|
+
.string()
|
|
531
|
+
.min(1)
|
|
532
|
+
.optional()
|
|
533
|
+
.describe("CSS selector (e.g., '.button', '#header'); the first match is inspected"),
|
|
534
|
+
ref: BrowserRefInputSchema.optional().describe("Element ref from the latest browser_snapshot (alternative to selector)"),
|
|
535
|
+
styles: z
|
|
536
|
+
.array(z.string().min(1))
|
|
537
|
+
.max(50)
|
|
538
|
+
.optional()
|
|
539
|
+
.describe("CSS properties to return (e.g., ['padding', 'color'])"),
|
|
540
|
+
},
|
|
541
|
+
}, async ({ browserId, selector, ref, styles, }) => {
|
|
542
|
+
if (Number(Boolean(selector)) + Number(Boolean(ref)) !== 1) {
|
|
543
|
+
return browserToolResult({
|
|
544
|
+
payload: {
|
|
545
|
+
requestId: "browser-tools-inspect-target",
|
|
546
|
+
ok: false,
|
|
547
|
+
error: {
|
|
548
|
+
code: "browser_denied",
|
|
549
|
+
message: "browser_inspect requires exactly one of selector or ref",
|
|
550
|
+
retryable: false,
|
|
551
|
+
},
|
|
552
|
+
},
|
|
553
|
+
context: resolveBrowserToolContext(options),
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
const context = resolveBrowserToolContext(options);
|
|
557
|
+
const payload = await options.broker.execute({
|
|
558
|
+
agentId: context.agentId,
|
|
559
|
+
cwd: context.cwd,
|
|
560
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
561
|
+
command: {
|
|
562
|
+
command: "inspect",
|
|
563
|
+
args: {
|
|
564
|
+
browserId,
|
|
565
|
+
...(selector ? { selector } : {}),
|
|
566
|
+
...(ref ? { ref } : {}),
|
|
567
|
+
...(styles && styles.length > 0 ? { styles } : {}),
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
});
|
|
571
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
572
|
+
});
|
|
573
|
+
options.registerTool("browser_network", {
|
|
574
|
+
title: "Inspect browser network traffic",
|
|
575
|
+
description: "List captured network requests in a Otto browser tab, or fetch a specific response body. " +
|
|
576
|
+
"Without requestId, lists requests with method, URL, status, and requestId. With requestId, returns that request's full response body (useful for inspecting API payloads). " +
|
|
577
|
+
"Capture starts on the first call for a tab — reload the page (browser_reload) after the first call to record its traffic. " +
|
|
578
|
+
"Use filter 'failed' to show only 4xx/5xx and network errors. Use browserId from preview_start, browser_new_tab, or browser_list_tabs.",
|
|
579
|
+
inputSchema: {
|
|
580
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
581
|
+
filter: z
|
|
582
|
+
.enum(["all", "failed"])
|
|
583
|
+
.optional()
|
|
584
|
+
.describe("Filter: 'all' (default) or 'failed' (4xx/5xx and network errors)"),
|
|
585
|
+
requestId: z
|
|
586
|
+
.string()
|
|
587
|
+
.min(1)
|
|
588
|
+
.optional()
|
|
589
|
+
.describe("If provided, returns the response body for this captured request instead of listing"),
|
|
590
|
+
},
|
|
591
|
+
}, async ({ browserId, filter, requestId, }) => {
|
|
592
|
+
const context = resolveBrowserToolContext(options);
|
|
593
|
+
const payload = await options.broker.execute({
|
|
594
|
+
agentId: context.agentId,
|
|
595
|
+
cwd: context.cwd,
|
|
596
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
597
|
+
command: {
|
|
598
|
+
command: "network",
|
|
599
|
+
args: {
|
|
600
|
+
browserId,
|
|
601
|
+
filter: filter ?? "all",
|
|
602
|
+
...(requestId ? { requestId } : {}),
|
|
603
|
+
},
|
|
604
|
+
},
|
|
605
|
+
});
|
|
606
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
607
|
+
});
|
|
608
|
+
options.registerTool("browser_evaluate", {
|
|
609
|
+
title: "Evaluate browser JavaScript",
|
|
610
|
+
description: "Evaluate a JavaScript function in a Otto browser tab. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; when ref is provided, refs come from the latest browser_snapshot and the resolved element is passed as the first argument.",
|
|
611
|
+
inputSchema: {
|
|
612
|
+
function: z.string().min(1),
|
|
613
|
+
ref: BrowserRefInputSchema.optional(),
|
|
614
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
615
|
+
},
|
|
616
|
+
}, async ({ function: functionSource, ref, browserId }) => {
|
|
617
|
+
const context = resolveBrowserToolContext(options);
|
|
618
|
+
const payload = await options.broker.execute({
|
|
619
|
+
agentId: context.agentId,
|
|
620
|
+
cwd: context.cwd,
|
|
621
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
622
|
+
command: {
|
|
623
|
+
command: "evaluate",
|
|
624
|
+
args: {
|
|
625
|
+
browserId,
|
|
626
|
+
function: functionSource,
|
|
627
|
+
...(ref ? { ref } : {}),
|
|
628
|
+
},
|
|
629
|
+
},
|
|
630
|
+
});
|
|
631
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
632
|
+
});
|
|
633
|
+
options.registerTool("browser_scroll", {
|
|
634
|
+
title: "Scroll browser",
|
|
635
|
+
description: "Scroll a Otto browser tab by deltaX/deltaY CSS pixels. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing; optional ref comes from the latest browser_snapshot and centers the wheel input over that element.",
|
|
636
|
+
inputSchema: {
|
|
637
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
638
|
+
ref: BrowserRefInputSchema.optional(),
|
|
639
|
+
deltaX: z.number(),
|
|
640
|
+
deltaY: z.number(),
|
|
641
|
+
},
|
|
642
|
+
}, async ({ browserId, ref, deltaX, deltaY }) => {
|
|
643
|
+
const context = resolveBrowserToolContext(options);
|
|
644
|
+
const payload = await options.broker.execute({
|
|
645
|
+
agentId: context.agentId,
|
|
646
|
+
cwd: context.cwd,
|
|
647
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
648
|
+
command: {
|
|
649
|
+
command: "scroll",
|
|
650
|
+
args: {
|
|
651
|
+
browserId,
|
|
652
|
+
...(ref ? { ref } : {}),
|
|
653
|
+
deltaX,
|
|
654
|
+
deltaY,
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
});
|
|
658
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
659
|
+
});
|
|
660
|
+
options.registerTool("browser_resize", {
|
|
661
|
+
title: "Resize browser viewport",
|
|
662
|
+
description: "Resize a Otto browser tab's resident webview viewport. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing.",
|
|
663
|
+
inputSchema: {
|
|
664
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
665
|
+
width: z.number().int().positive(),
|
|
666
|
+
height: z.number().int().positive(),
|
|
667
|
+
},
|
|
668
|
+
}, async ({ browserId, width, height }) => {
|
|
669
|
+
const context = resolveBrowserToolContext(options);
|
|
670
|
+
const payload = await options.broker.execute({
|
|
671
|
+
agentId: context.agentId,
|
|
672
|
+
cwd: context.cwd,
|
|
673
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
674
|
+
command: {
|
|
675
|
+
command: "resize",
|
|
676
|
+
args: {
|
|
677
|
+
browserId,
|
|
678
|
+
width,
|
|
679
|
+
height,
|
|
680
|
+
},
|
|
681
|
+
},
|
|
682
|
+
});
|
|
683
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
684
|
+
});
|
|
685
|
+
options.registerTool("browser_close_tab", {
|
|
686
|
+
title: "Close browser tab",
|
|
687
|
+
description: "Close a Otto browser tab, remove its resident webview, and unregister it from the browser automation host. Use browserId from preview_start when verifying a dev server, or from browser_new_tab / browser_list_tabs for general browsing.",
|
|
688
|
+
inputSchema: {
|
|
689
|
+
browserId: BrowserAutomationBrowserIdSchema,
|
|
690
|
+
},
|
|
691
|
+
}, async ({ browserId }) => {
|
|
692
|
+
const context = resolveBrowserToolContext(options);
|
|
693
|
+
const payload = await options.broker.execute({
|
|
694
|
+
agentId: context.agentId,
|
|
695
|
+
cwd: context.cwd,
|
|
696
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {}),
|
|
697
|
+
command: {
|
|
698
|
+
command: "close_tab",
|
|
699
|
+
args: {
|
|
700
|
+
browserId,
|
|
701
|
+
},
|
|
702
|
+
},
|
|
703
|
+
});
|
|
704
|
+
return browserToolResult({ payload, context: { ...context, browserId } });
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
function resolveBrowserToolContext(options) {
|
|
708
|
+
const callerAgent = options.resolveCallerAgent();
|
|
709
|
+
return {
|
|
710
|
+
...(options.callerAgentId ? { agentId: options.callerAgentId } : {}),
|
|
711
|
+
...(callerAgent?.cwd ? { cwd: callerAgent.cwd } : {}),
|
|
712
|
+
...(callerAgent?.workspaceId ? { workspaceId: callerAgent.workspaceId } : {}),
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
function normalizeHttpUrlInput(value) {
|
|
716
|
+
if (value.length === 0) {
|
|
717
|
+
return null;
|
|
718
|
+
}
|
|
719
|
+
const explicitHttpUrl = /^https?:\/\//i.test(value);
|
|
720
|
+
if (explicitHttpUrl) {
|
|
721
|
+
return isValidHttpUrl(value) ? value : null;
|
|
722
|
+
}
|
|
723
|
+
if (URL_WHITESPACE_PATTERN.test(value) || NON_HTTP_EXPLICIT_SCHEME_PATTERN.test(value)) {
|
|
724
|
+
return null;
|
|
725
|
+
}
|
|
726
|
+
const normalized = `http://${value}`;
|
|
727
|
+
return isValidHttpUrl(normalized) ? normalized : null;
|
|
728
|
+
}
|
|
729
|
+
function isValidHttpUrl(value) {
|
|
730
|
+
try {
|
|
731
|
+
const url = new URL(value);
|
|
732
|
+
return url.protocol === "http:" || url.protocol === "https:";
|
|
733
|
+
}
|
|
734
|
+
catch {
|
|
735
|
+
return false;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
function requireWorkspaceContext(context) {
|
|
739
|
+
if (context.workspaceId) {
|
|
740
|
+
return null;
|
|
741
|
+
}
|
|
742
|
+
return browserToolResult({
|
|
743
|
+
payload: {
|
|
744
|
+
requestId: "browser-tools-workspace-context",
|
|
745
|
+
ok: false,
|
|
746
|
+
error: {
|
|
747
|
+
code: "browser_denied",
|
|
748
|
+
message: WORKSPACE_CONTEXT_MESSAGE,
|
|
749
|
+
retryable: false,
|
|
750
|
+
},
|
|
751
|
+
},
|
|
752
|
+
context,
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
function browserToolResult(params) {
|
|
756
|
+
const { payload, context } = params;
|
|
757
|
+
if (payload.ok) {
|
|
758
|
+
return {
|
|
759
|
+
content: browserToolSuccessContent(payload),
|
|
760
|
+
structuredContent: {
|
|
761
|
+
ok: true,
|
|
762
|
+
result: browserToolStructuredResult(payload.result),
|
|
763
|
+
...(payload.dialogs ? { dialogs: payload.dialogs } : {}),
|
|
764
|
+
context,
|
|
765
|
+
},
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
return {
|
|
769
|
+
content: [
|
|
770
|
+
{
|
|
771
|
+
type: "text",
|
|
772
|
+
text: appendDialogSummary(summarizeBrowserError(payload.error), payload.dialogs),
|
|
773
|
+
},
|
|
774
|
+
],
|
|
775
|
+
structuredContent: {
|
|
776
|
+
ok: false,
|
|
777
|
+
error: payload.error,
|
|
778
|
+
...(payload.dialogs ? { dialogs: payload.dialogs } : {}),
|
|
779
|
+
context,
|
|
780
|
+
},
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
function browserToolStructuredResult(result) {
|
|
784
|
+
if (result.command !== "screenshot") {
|
|
785
|
+
return result;
|
|
786
|
+
}
|
|
787
|
+
const { dataBase64: _dataBase64, ...metadata } = result;
|
|
788
|
+
return metadata;
|
|
789
|
+
}
|
|
790
|
+
function browserToolSuccessContent(payload) {
|
|
791
|
+
const textContent = { type: "text", text: summarizeBrowserSuccess(payload) };
|
|
792
|
+
const imageContent = browserToolImageContent(payload.result);
|
|
793
|
+
return imageContent ? [textContent, imageContent] : [textContent];
|
|
794
|
+
}
|
|
795
|
+
function browserToolImageContent(result) {
|
|
796
|
+
if (result.command !== "screenshot") {
|
|
797
|
+
return null;
|
|
798
|
+
}
|
|
799
|
+
return {
|
|
800
|
+
type: "image",
|
|
801
|
+
data: result.dataBase64,
|
|
802
|
+
mimeType: result.mimeType,
|
|
803
|
+
};
|
|
804
|
+
}
|
|
805
|
+
function summarizeBrowserSuccess(payload) {
|
|
806
|
+
const withDialogs = (summary) => appendDialogSummary(summary, payload.dialogs);
|
|
807
|
+
const controlSummary = summarizeBrowserControlSuccess(payload.result);
|
|
808
|
+
if (controlSummary) {
|
|
809
|
+
return withDialogs(controlSummary);
|
|
810
|
+
}
|
|
811
|
+
const refActionSummary = summarizeBrowserRefActionSuccess(payload.result);
|
|
812
|
+
if (refActionSummary) {
|
|
813
|
+
return withDialogs(refActionSummary);
|
|
814
|
+
}
|
|
815
|
+
const diagnosticsSummary = summarizeBrowserDiagnosticsSuccess(payload.result);
|
|
816
|
+
if (diagnosticsSummary) {
|
|
817
|
+
return withDialogs(diagnosticsSummary);
|
|
818
|
+
}
|
|
819
|
+
const keyboardSummary = summarizeBrowserKeyboardSuccess(payload.result);
|
|
820
|
+
if (keyboardSummary) {
|
|
821
|
+
return withDialogs(keyboardSummary);
|
|
822
|
+
}
|
|
823
|
+
const navigationSummary = summarizeBrowserNavigationSuccess(payload.result);
|
|
824
|
+
if (navigationSummary) {
|
|
825
|
+
return withDialogs(navigationSummary);
|
|
826
|
+
}
|
|
827
|
+
const mediaSummary = summarizeBrowserMediaSuccess(payload.result);
|
|
828
|
+
if (mediaSummary) {
|
|
829
|
+
return withDialogs(mediaSummary);
|
|
830
|
+
}
|
|
831
|
+
if (payload.result.command === "list_tabs") {
|
|
832
|
+
const count = payload.result.tabs.length;
|
|
833
|
+
if (count === 0) {
|
|
834
|
+
return "No Otto browser tabs are open. Call browser_new_tab to create one.";
|
|
835
|
+
}
|
|
836
|
+
const tabLines = payload.result.tabs.map((tab) => {
|
|
837
|
+
const active = tab.isActive ? " active" : "";
|
|
838
|
+
return `- browserId=${tab.browserId}${active} title=${JSON.stringify(tab.title || "Untitled")} url=${tab.url}`;
|
|
839
|
+
});
|
|
840
|
+
return withDialogs([
|
|
841
|
+
`Found ${count} Otto browser tab${count === 1 ? "" : "s"}. Use these browserId values for tab-scoped browser tools.`,
|
|
842
|
+
...tabLines,
|
|
843
|
+
].join("\n"));
|
|
844
|
+
}
|
|
845
|
+
if (payload.result.command === "new_tab") {
|
|
846
|
+
return withDialogs(`Created browser tab browserId=${payload.result.browserId} url=${payload.result.url}. Use this browserId for tab-scoped browser tools.`);
|
|
847
|
+
}
|
|
848
|
+
if (payload.result.command === "snapshot") {
|
|
849
|
+
return withDialogs([
|
|
850
|
+
`Snapshot captured ${payload.result.stats.nodeCount} node${payload.result.stats.nodeCount === 1 ? "" : "s"} with ${payload.result.stats.refCount} ref${payload.result.stats.refCount === 1 ? "" : "s"}.`,
|
|
851
|
+
`Title: ${payload.result.title || "Untitled"}`,
|
|
852
|
+
`URL: ${payload.result.url}`,
|
|
853
|
+
"",
|
|
854
|
+
payload.result.snapshot,
|
|
855
|
+
].join("\n"));
|
|
856
|
+
}
|
|
857
|
+
if (payload.result.command === "wait") {
|
|
858
|
+
return withDialogs(`Browser wait matched ${payload.result.matched}.`);
|
|
859
|
+
}
|
|
860
|
+
return withDialogs(`Browser ${payload.result.command} complete.`);
|
|
861
|
+
}
|
|
862
|
+
function appendDialogSummary(summary, dialogs) {
|
|
863
|
+
if (!dialogs || dialogs.length === 0) {
|
|
864
|
+
return summary;
|
|
865
|
+
}
|
|
866
|
+
return `${summary}\nHandled browser dialog${dialogs.length === 1 ? "" : "s"}: ${dialogs
|
|
867
|
+
.map((dialog) => `${dialog.action} ${dialog.type} ${JSON.stringify(dialog.message)}`)
|
|
868
|
+
.join("; ")}.`;
|
|
869
|
+
}
|
|
870
|
+
function summarizeBrowserMediaSuccess(result) {
|
|
871
|
+
if (result.command === "screenshot") {
|
|
872
|
+
return `Captured browser screenshot (${result.width}x${result.height}).`;
|
|
873
|
+
}
|
|
874
|
+
if (result.command === "upload") {
|
|
875
|
+
const count = result.filePaths.length;
|
|
876
|
+
return `Uploaded ${count} file${count === 1 ? "" : "s"} to browser element ${result.ref}.`;
|
|
877
|
+
}
|
|
878
|
+
return null;
|
|
879
|
+
}
|
|
880
|
+
function summarizeBrowserKeyboardSuccess(result) {
|
|
881
|
+
if (result.command === "type") {
|
|
882
|
+
return result.ref
|
|
883
|
+
? `Typed into browser element ${result.ref}.`
|
|
884
|
+
: "Typed into the focused browser element.";
|
|
885
|
+
}
|
|
886
|
+
if (result.command === "keypress") {
|
|
887
|
+
return result.ref
|
|
888
|
+
? `Pressed ${result.key} on browser element ${result.ref}.`
|
|
889
|
+
: `Pressed ${result.key} in the browser.`;
|
|
890
|
+
}
|
|
891
|
+
return null;
|
|
892
|
+
}
|
|
893
|
+
function summarizeBrowserNavigationSuccess(result) {
|
|
894
|
+
if (result.command === "navigate") {
|
|
895
|
+
return `Navigated browser to ${result.url}.`;
|
|
896
|
+
}
|
|
897
|
+
if (result.command === "back" || result.command === "forward" || result.command === "reload") {
|
|
898
|
+
return `Browser ${result.command} complete.`;
|
|
899
|
+
}
|
|
900
|
+
return null;
|
|
901
|
+
}
|
|
902
|
+
function summarizeBrowserDiagnosticsSuccess(result) {
|
|
903
|
+
if (result.command === "evaluate") {
|
|
904
|
+
return [
|
|
905
|
+
"Browser evaluate returned:",
|
|
906
|
+
result.resultJson,
|
|
907
|
+
...(result.truncated ? ["Result was truncated."] : []),
|
|
908
|
+
].join("\n");
|
|
909
|
+
}
|
|
910
|
+
if (result.command !== "logs") {
|
|
911
|
+
return null;
|
|
912
|
+
}
|
|
913
|
+
const consoleCount = result.console.length;
|
|
914
|
+
const networkCount = result.network.length;
|
|
915
|
+
return `Read ${consoleCount} console log${consoleCount === 1 ? "" : "s"} and ${networkCount} network entr${networkCount === 1 ? "y" : "ies"}.`;
|
|
916
|
+
}
|
|
917
|
+
function summarizeBrowserRefActionSuccess(result) {
|
|
918
|
+
if (result.command === "click") {
|
|
919
|
+
return `Clicked browser element ${result.ref}.`;
|
|
920
|
+
}
|
|
921
|
+
if (result.command === "fill") {
|
|
922
|
+
return `Filled browser element ${result.ref}.`;
|
|
923
|
+
}
|
|
924
|
+
return null;
|
|
925
|
+
}
|
|
926
|
+
function summarizeBrowserControlSuccess(result) {
|
|
927
|
+
if (result.command === "select") {
|
|
928
|
+
return `Selected ${result.value} in browser element ${result.ref}.`;
|
|
929
|
+
}
|
|
930
|
+
if (result.command === "hover") {
|
|
931
|
+
return `Hovered browser element ${result.ref}.`;
|
|
932
|
+
}
|
|
933
|
+
if (result.command === "drag") {
|
|
934
|
+
return `Dragged browser element ${result.sourceRef} to ${result.targetRef}.`;
|
|
935
|
+
}
|
|
936
|
+
if (result.command === "scroll") {
|
|
937
|
+
return result.ref
|
|
938
|
+
? `Scrolled browser element ${result.ref} by ${result.deltaX}, ${result.deltaY}.`
|
|
939
|
+
: `Scrolled browser by ${result.deltaX}, ${result.deltaY}.`;
|
|
940
|
+
}
|
|
941
|
+
if (result.command === "resize") {
|
|
942
|
+
return `Resized browser viewport to ${result.width}x${result.height}.`;
|
|
943
|
+
}
|
|
944
|
+
if (result.command === "close_tab") {
|
|
945
|
+
return `Closed browser tab ${result.browserId}.`;
|
|
946
|
+
}
|
|
947
|
+
return null;
|
|
948
|
+
}
|
|
949
|
+
function summarizeBrowserError(error) {
|
|
950
|
+
switch (error.code) {
|
|
951
|
+
case "browser_disabled":
|
|
952
|
+
return "Browser tools are disabled. Enable browser tools on the host, then try again.";
|
|
953
|
+
case "browser_no_host":
|
|
954
|
+
return error.message;
|
|
955
|
+
case "browser_timeout":
|
|
956
|
+
return "The browser did not respond before the timeout. Try again or check the browser host.";
|
|
957
|
+
case "screenshot_no_frame":
|
|
958
|
+
return error.message;
|
|
959
|
+
case "browser_unsupported":
|
|
960
|
+
return error.message;
|
|
961
|
+
case "browser_stale_ref":
|
|
962
|
+
return "That browser element reference is stale. Take a new browser snapshot and try again.";
|
|
963
|
+
default:
|
|
964
|
+
return error.message;
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
//# sourceMappingURL=tools.js.map
|