@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,426 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import * as net from "node:net";
|
|
4
|
+
import { EXTERNAL_PREVIEW_SERVER_ID_PREFIX } from "@otto-code/protocol/messages";
|
|
5
|
+
import { findLaunchConfiguration, LAUNCH_CONFIG_RELATIVE_PATH, readLaunchConfig, resolveLaunchConfigPath, } from "./launch-config.js";
|
|
6
|
+
/**
|
|
7
|
+
* Subsystem A of the preview bridge (docs/preview.md):
|
|
8
|
+
* pure dev-server process supervision. Spawns configured commands from
|
|
9
|
+
* `.claude/launch.json`, tracks them by serverId, captures output into a
|
|
10
|
+
* bounded ring buffer, polls the port for readiness, and tree-kills on stop
|
|
11
|
+
* (dev servers fork children — plain proc.kill orphans them).
|
|
12
|
+
*
|
|
13
|
+
* Browser-side verification (subsystem B) lives in browser-tools/ and is
|
|
14
|
+
* joined to this by navigating a browser host at the returned url.
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_MAX_LOG_LINES = 2000;
|
|
17
|
+
const DEFAULT_READINESS_TIMEOUT_MS = 60000;
|
|
18
|
+
const DEFAULT_POLL_INTERVAL_MS = 250;
|
|
19
|
+
const DEFAULT_STOP_TIMEOUT_MS = 5000;
|
|
20
|
+
const PORT_PROBE_TIMEOUT_MS = 1000;
|
|
21
|
+
/** Keyword grep used by the `level: "error"` log filter (matches the Claude Preview contract). */
|
|
22
|
+
const ERROR_LINE_PATTERN = /error|exception|failed|fatal/i;
|
|
23
|
+
/** serverId prefix for running servers observed by port probe, not by in-memory record. */
|
|
24
|
+
const EXTERNAL_SERVER_ID_PREFIX = EXTERNAL_PREVIEW_SERVER_ID_PREFIX;
|
|
25
|
+
export class DevServerManager {
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.servers = new Map();
|
|
28
|
+
this.getProtectedPorts = () => [];
|
|
29
|
+
/**
|
|
30
|
+
* Ports reconcileRunning has reported as externally-running configured
|
|
31
|
+
* servers, keyed to the workspace whose launch.json listed them. External
|
|
32
|
+
* (`ext:<port>`) stops tree-kill whatever listens on the port, so only these
|
|
33
|
+
* observed ports are stoppable — never an arbitrary number an agent passes
|
|
34
|
+
* to preview_stop.
|
|
35
|
+
*/
|
|
36
|
+
this.externalPortCwds = new Map();
|
|
37
|
+
this.logger = options.logger;
|
|
38
|
+
this.maxLogLines = options.maxLogLines ?? DEFAULT_MAX_LOG_LINES;
|
|
39
|
+
this.readinessTimeoutMs = options.readinessTimeoutMs ?? DEFAULT_READINESS_TIMEOUT_MS;
|
|
40
|
+
this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
41
|
+
this.stopTimeoutMs = options.stopTimeoutMs ?? DEFAULT_STOP_TIMEOUT_MS;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Ports the daemon must never tree-kill via an external (`ext:<port>`) stop:
|
|
45
|
+
* its own listen port and the loopback origins of currently connected
|
|
46
|
+
* clients (e.g. the Metro dev server serving the Otto app itself — killing
|
|
47
|
+
* it takes down the app issuing the request). Wired lazily from bootstrap
|
|
48
|
+
* because the websocket server is constructed after this manager.
|
|
49
|
+
*/
|
|
50
|
+
setProtectedPortsProvider(provider) {
|
|
51
|
+
this.getProtectedPorts = provider;
|
|
52
|
+
}
|
|
53
|
+
async start(input) {
|
|
54
|
+
const running = this.findRunning(input.cwd, input.name);
|
|
55
|
+
if (running) {
|
|
56
|
+
return { server: summarize(running), reused: true, logTail: tail(running.log, 20) };
|
|
57
|
+
}
|
|
58
|
+
const entry = await this.resolveConfiguration(input.cwd, input.name);
|
|
59
|
+
if (await isPortOpen(entry.port)) {
|
|
60
|
+
throw new Error(`Port ${entry.port} is already in use by a process Otto did not start. ` +
|
|
61
|
+
`Stop that process or change the port in ${LAUNCH_CONFIG_RELATIVE_PATH}.`);
|
|
62
|
+
}
|
|
63
|
+
const record = this.spawnServer(input.cwd, entry);
|
|
64
|
+
this.servers.set(record.id, record);
|
|
65
|
+
try {
|
|
66
|
+
await this.waitForReady(record);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.servers.delete(record.id);
|
|
70
|
+
await this.killTree(record).catch(() => { });
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
record.status = "running";
|
|
74
|
+
this.logger.info({ serverId: record.id, name: record.name, port: record.port, pid: record.proc.pid }, "Preview dev server ready");
|
|
75
|
+
return { server: summarize(record), reused: false, logTail: tail(record.log, 20) };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* `requireCwd` scopes the stop to one workspace: agent-facing tools pass
|
|
79
|
+
* their caller's cwd so an agent can only stop servers of its own workspace,
|
|
80
|
+
* while user-initiated UI stops omit it.
|
|
81
|
+
*/
|
|
82
|
+
async stop(serverId, options) {
|
|
83
|
+
// Externally-observed servers (see reconcileRunning) carry no in-memory
|
|
84
|
+
// record — the daemon that spawned them is gone. Address them by port:
|
|
85
|
+
// find whatever is listening and tree-kill it.
|
|
86
|
+
if (serverId.startsWith(EXTERNAL_SERVER_ID_PREFIX)) {
|
|
87
|
+
return this.stopExternal(serverId, options?.requireCwd);
|
|
88
|
+
}
|
|
89
|
+
const record = this.requireServer(serverId);
|
|
90
|
+
if (options?.requireCwd !== undefined && record.cwd !== options.requireCwd) {
|
|
91
|
+
throw new Error(`Server "${serverId}" belongs to a different workspace.`);
|
|
92
|
+
}
|
|
93
|
+
if (record.status !== "exited") {
|
|
94
|
+
await this.killTree(record);
|
|
95
|
+
await this.waitForExit(record);
|
|
96
|
+
}
|
|
97
|
+
this.servers.delete(serverId);
|
|
98
|
+
return summarize(record);
|
|
99
|
+
}
|
|
100
|
+
list(cwd) {
|
|
101
|
+
return [...this.servers.values()]
|
|
102
|
+
.filter((record) => cwd === undefined || record.cwd === cwd)
|
|
103
|
+
.map(summarize);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Running servers for a cwd, reconciled against reality rather than trusting
|
|
107
|
+
* the in-memory map alone. The map is authoritative for servers this daemon
|
|
108
|
+
* instance spawned (it carries pid/logs/bound tab), but the map is wiped on
|
|
109
|
+
* every daemon restart while the dev server child — spawned detached / as its
|
|
110
|
+
* own process tree — keeps serving its port. In dev the daemon restarts
|
|
111
|
+
* constantly (tsx watch), so without reconciliation a running preview silently
|
|
112
|
+
* reverts to "not started" on the next save. We therefore also port-probe each
|
|
113
|
+
* configured server we don't already track and report open ones as
|
|
114
|
+
* externally-running, addressable for stop via an `ext:<port>` id. This also
|
|
115
|
+
* surfaces dev servers the user started by hand.
|
|
116
|
+
*/
|
|
117
|
+
async reconcileRunning(input) {
|
|
118
|
+
const managed = this.list(input.cwd).filter((record) => record.status !== "exited");
|
|
119
|
+
const ownedPorts = new Set(managed.map((record) => record.port));
|
|
120
|
+
const ownedNames = new Set(managed.map((record) => record.name));
|
|
121
|
+
const external = [];
|
|
122
|
+
for (const entry of input.configured) {
|
|
123
|
+
if (ownedNames.has(entry.name) || ownedPorts.has(entry.port)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (await isPortOpen(entry.port)) {
|
|
127
|
+
this.externalPortCwds.set(entry.port, input.cwd);
|
|
128
|
+
external.push({
|
|
129
|
+
serverId: `${EXTERNAL_SERVER_ID_PREFIX}${entry.port}`,
|
|
130
|
+
name: entry.name,
|
|
131
|
+
cwd: input.cwd,
|
|
132
|
+
port: entry.port,
|
|
133
|
+
url: `http://127.0.0.1:${entry.port}/`,
|
|
134
|
+
status: "running",
|
|
135
|
+
pid: null,
|
|
136
|
+
exitCode: null,
|
|
137
|
+
boundBrowserId: null,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return [...managed, ...external];
|
|
142
|
+
}
|
|
143
|
+
async stopExternal(serverId, requireCwd) {
|
|
144
|
+
const port = Number.parseInt(serverId.slice(EXTERNAL_SERVER_ID_PREFIX.length), 10);
|
|
145
|
+
if (!Number.isInteger(port) || port <= 0) {
|
|
146
|
+
throw new Error(`Invalid external preview server id "${serverId}".`);
|
|
147
|
+
}
|
|
148
|
+
if (this.getProtectedPorts().includes(port)) {
|
|
149
|
+
throw new Error(`Refusing to stop "${serverId}": port ${port} belongs to Otto's own runtime ` +
|
|
150
|
+
`(the daemon or a dev server hosting a connected Otto client).`);
|
|
151
|
+
}
|
|
152
|
+
// Only ports we ourselves observed as configured preview servers are
|
|
153
|
+
// stoppable, and the launch config must still list the port at stop time —
|
|
154
|
+
// otherwise this would be a primitive for killing arbitrary local services.
|
|
155
|
+
const cwd = this.externalPortCwds.get(port);
|
|
156
|
+
if (!cwd) {
|
|
157
|
+
throw new Error(`Refusing to stop "${serverId}": port ${port} is not a preview server this daemon ` +
|
|
158
|
+
`has observed. Only servers reported by ${LAUNCH_CONFIG_RELATIVE_PATH} can be stopped.`);
|
|
159
|
+
}
|
|
160
|
+
if (requireCwd !== undefined && cwd !== requireCwd) {
|
|
161
|
+
throw new Error(`Server "${serverId}" belongs to a different workspace.`);
|
|
162
|
+
}
|
|
163
|
+
const config = await readLaunchConfig(cwd).catch(() => null);
|
|
164
|
+
if (!config?.configurations.some((entry) => entry.port === port)) {
|
|
165
|
+
throw new Error(`Refusing to stop "${serverId}": port ${port} is no longer configured in ` +
|
|
166
|
+
`${LAUNCH_CONFIG_RELATIVE_PATH} for ${cwd}.`);
|
|
167
|
+
}
|
|
168
|
+
const pids = await listListeningPids(port);
|
|
169
|
+
// Never kill our own process tree even if the port lookup resolves to us
|
|
170
|
+
// (stale pid reuse, misconfigured launch.json port, etc.).
|
|
171
|
+
const selfPids = new Set([process.pid, process.ppid]);
|
|
172
|
+
for (const pid of pids) {
|
|
173
|
+
if (selfPids.has(pid)) {
|
|
174
|
+
this.logger.warn({ serverId, port, pid }, "Skipping external preview stop for the daemon's own process");
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
await killPidTree(pid).catch(() => { });
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
serverId,
|
|
181
|
+
name: serverId,
|
|
182
|
+
cwd: "",
|
|
183
|
+
port,
|
|
184
|
+
url: `http://127.0.0.1:${port}/`,
|
|
185
|
+
status: "exited",
|
|
186
|
+
pid: null,
|
|
187
|
+
exitCode: null,
|
|
188
|
+
boundBrowserId: null,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
logs(serverId, query) {
|
|
192
|
+
const record = this.requireServer(serverId);
|
|
193
|
+
let lines = record.log;
|
|
194
|
+
if (query?.level === "error") {
|
|
195
|
+
lines = lines.filter((line) => ERROR_LINE_PATTERN.test(line));
|
|
196
|
+
}
|
|
197
|
+
if (query?.search) {
|
|
198
|
+
const needle = query.search;
|
|
199
|
+
lines = lines.filter((line) => line.includes(needle));
|
|
200
|
+
}
|
|
201
|
+
return tail(lines, query?.lines ?? 50);
|
|
202
|
+
}
|
|
203
|
+
getServer(serverId) {
|
|
204
|
+
const record = this.servers.get(serverId);
|
|
205
|
+
return record ? summarize(record) : null;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Designate an Otto browser tab as this server's preview surface. One tab
|
|
209
|
+
* per server ("it") — rebinding replaces the previous designation.
|
|
210
|
+
*/
|
|
211
|
+
bindTab(serverId, browserId) {
|
|
212
|
+
this.requireServer(serverId).boundBrowserId = browserId;
|
|
213
|
+
}
|
|
214
|
+
boundTab(serverId) {
|
|
215
|
+
return this.requireServer(serverId).boundBrowserId;
|
|
216
|
+
}
|
|
217
|
+
async shutdown() {
|
|
218
|
+
await Promise.allSettled([...this.servers.keys()].map((serverId) => this.stop(serverId)));
|
|
219
|
+
}
|
|
220
|
+
findRunning(cwd, name) {
|
|
221
|
+
for (const record of this.servers.values()) {
|
|
222
|
+
if (record.cwd === cwd && record.name === name && record.status !== "exited") {
|
|
223
|
+
return record;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
async resolveConfiguration(cwd, name) {
|
|
229
|
+
const config = await readLaunchConfig(cwd);
|
|
230
|
+
if (!config) {
|
|
231
|
+
throw new Error(`No ${LAUNCH_CONFIG_RELATIVE_PATH} found in ${cwd}. ` +
|
|
232
|
+
`Create ${resolveLaunchConfigPath(cwd)} with the dev server configurations first.`);
|
|
233
|
+
}
|
|
234
|
+
const entry = findLaunchConfiguration(config, name);
|
|
235
|
+
if (!entry) {
|
|
236
|
+
const available = config.configurations.map((candidate) => candidate.name).join(", ");
|
|
237
|
+
throw new Error(`No configuration named "${name}" in ${LAUNCH_CONFIG_RELATIVE_PATH}. ` +
|
|
238
|
+
(available ? `Available: ${available}.` : "The file has no configurations."));
|
|
239
|
+
}
|
|
240
|
+
return entry;
|
|
241
|
+
}
|
|
242
|
+
spawnServer(cwd, entry) {
|
|
243
|
+
// shell:true so "npm"/"yarn" resolve on Windows; POSIX gets detached:true
|
|
244
|
+
// so the whole process group can be killed as a tree on stop.
|
|
245
|
+
const proc = spawn(entry.runtimeExecutable, entry.runtimeArgs, {
|
|
246
|
+
cwd,
|
|
247
|
+
shell: true,
|
|
248
|
+
windowsHide: true,
|
|
249
|
+
detached: process.platform !== "win32",
|
|
250
|
+
env: { ...process.env, ...entry.env },
|
|
251
|
+
});
|
|
252
|
+
const record = {
|
|
253
|
+
id: `srv_${randomUUID().slice(0, 8)}`,
|
|
254
|
+
name: entry.name,
|
|
255
|
+
cwd,
|
|
256
|
+
port: entry.port,
|
|
257
|
+
proc,
|
|
258
|
+
status: "starting",
|
|
259
|
+
exitCode: null,
|
|
260
|
+
log: [],
|
|
261
|
+
boundBrowserId: null,
|
|
262
|
+
};
|
|
263
|
+
const capture = (chunk) => {
|
|
264
|
+
this.appendLog(record, chunk.toString("utf8"));
|
|
265
|
+
};
|
|
266
|
+
proc.stdout?.on("data", capture);
|
|
267
|
+
proc.stderr?.on("data", capture);
|
|
268
|
+
proc.on("error", (error) => {
|
|
269
|
+
this.appendLog(record, `[spawn error] ${error.message}\n`);
|
|
270
|
+
});
|
|
271
|
+
proc.on("exit", (code) => {
|
|
272
|
+
record.status = "exited";
|
|
273
|
+
record.exitCode = code;
|
|
274
|
+
});
|
|
275
|
+
return record;
|
|
276
|
+
}
|
|
277
|
+
appendLog(record, text) {
|
|
278
|
+
const lines = text.split(/\r?\n/u).filter((line) => line.length > 0);
|
|
279
|
+
record.log.push(...lines);
|
|
280
|
+
if (record.log.length > this.maxLogLines) {
|
|
281
|
+
record.log.splice(0, record.log.length - this.maxLogLines);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async waitForReady(record) {
|
|
285
|
+
const deadline = Date.now() + this.readinessTimeoutMs;
|
|
286
|
+
while (Date.now() < deadline) {
|
|
287
|
+
if (record.status === "exited") {
|
|
288
|
+
throw new Error(`Dev server "${record.name}" exited with code ${record.exitCode} before becoming ready.\n` +
|
|
289
|
+
`Last output:\n${tail(record.log, 20).join("\n")}`);
|
|
290
|
+
}
|
|
291
|
+
if (await isPortOpen(record.port)) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
await sleep(this.pollIntervalMs);
|
|
295
|
+
}
|
|
296
|
+
throw new Error(`Dev server "${record.name}" did not open port ${record.port} within ` +
|
|
297
|
+
`${Math.round(this.readinessTimeoutMs / 1000)}s.\n` +
|
|
298
|
+
`Last output:\n${tail(record.log, 20).join("\n")}`);
|
|
299
|
+
}
|
|
300
|
+
async waitForExit(record) {
|
|
301
|
+
const deadline = Date.now() + this.stopTimeoutMs;
|
|
302
|
+
while (record.status !== "exited" && Date.now() < deadline) {
|
|
303
|
+
await sleep(50);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
requireServer(serverId) {
|
|
307
|
+
const record = this.servers.get(serverId);
|
|
308
|
+
if (!record) {
|
|
309
|
+
const known = [...this.servers.values()].map((entry) => entry.id).join(", ");
|
|
310
|
+
throw new Error(`Unknown serverId "${serverId}". ${known ? `Running servers: ${known}.` : "No servers are running."}`);
|
|
311
|
+
}
|
|
312
|
+
return record;
|
|
313
|
+
}
|
|
314
|
+
async killTree(record) {
|
|
315
|
+
const pid = record.proc.pid;
|
|
316
|
+
if (!pid || record.status === "exited") {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
await killPidTree(pid);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Tree-kill a process by pid. Dev servers fork children (a shell wrapper on
|
|
324
|
+
* Windows, worker processes everywhere), so a plain kill orphans them and leaves
|
|
325
|
+
* the port held.
|
|
326
|
+
*/
|
|
327
|
+
async function killPidTree(pid) {
|
|
328
|
+
if (process.platform === "win32") {
|
|
329
|
+
// shell:true wraps the server in cmd.exe; /T takes the whole tree down.
|
|
330
|
+
await new Promise((resolve) => {
|
|
331
|
+
const killer = spawn("taskkill", ["/T", "/F", "/PID", String(pid)], { windowsHide: true });
|
|
332
|
+
killer.on("exit", () => resolve());
|
|
333
|
+
killer.on("error", () => resolve());
|
|
334
|
+
});
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
try {
|
|
338
|
+
process.kill(-pid, "SIGKILL");
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
try {
|
|
342
|
+
process.kill(pid, "SIGKILL");
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
// already gone
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/** pids listening on a TCP port, used to stop servers this daemon didn't spawn. */
|
|
350
|
+
function listListeningPids(port) {
|
|
351
|
+
return new Promise((resolve) => {
|
|
352
|
+
let output = "";
|
|
353
|
+
const child = process.platform === "win32"
|
|
354
|
+
? spawn("netstat", ["-ano", "-p", "tcp"], { windowsHide: true })
|
|
355
|
+
: spawn("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"]);
|
|
356
|
+
child.stdout?.on("data", (chunk) => {
|
|
357
|
+
output += chunk.toString("utf8");
|
|
358
|
+
});
|
|
359
|
+
child.on("error", () => resolve([]));
|
|
360
|
+
child.on("close", () => {
|
|
361
|
+
const pids = new Set();
|
|
362
|
+
if (process.platform === "win32") {
|
|
363
|
+
for (const line of output.split(/\r?\n/u)) {
|
|
364
|
+
// Proto Local Address Foreign Address State PID
|
|
365
|
+
const cols = line.trim().split(/\s+/u);
|
|
366
|
+
if (cols.length < 5 || cols[3] !== "LISTENING") {
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
const local = cols[1] ?? "";
|
|
370
|
+
const colon = local.lastIndexOf(":");
|
|
371
|
+
if (colon !== -1 && local.slice(colon + 1) === String(port)) {
|
|
372
|
+
const pid = Number.parseInt(cols[4] ?? "", 10);
|
|
373
|
+
if (Number.isInteger(pid) && pid > 0) {
|
|
374
|
+
pids.add(pid);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
for (const line of output.split(/\r?\n/u)) {
|
|
381
|
+
const pid = Number.parseInt(line.trim(), 10);
|
|
382
|
+
if (Number.isInteger(pid) && pid > 0) {
|
|
383
|
+
pids.add(pid);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
resolve([...pids]);
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
function summarize(record) {
|
|
392
|
+
return {
|
|
393
|
+
serverId: record.id,
|
|
394
|
+
name: record.name,
|
|
395
|
+
cwd: record.cwd,
|
|
396
|
+
port: record.port,
|
|
397
|
+
url: `http://127.0.0.1:${record.port}/`,
|
|
398
|
+
status: record.status,
|
|
399
|
+
pid: record.proc.pid ?? null,
|
|
400
|
+
exitCode: record.exitCode,
|
|
401
|
+
boundBrowserId: record.boundBrowserId,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
function tail(lines, count) {
|
|
405
|
+
return lines.slice(-Math.max(count, 0));
|
|
406
|
+
}
|
|
407
|
+
function sleep(ms) {
|
|
408
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
409
|
+
}
|
|
410
|
+
function isPortOpen(port) {
|
|
411
|
+
return new Promise((resolve) => {
|
|
412
|
+
const socket = net.connect({ host: "127.0.0.1", port, timeout: PORT_PROBE_TIMEOUT_MS });
|
|
413
|
+
socket.once("connect", () => {
|
|
414
|
+
socket.destroy();
|
|
415
|
+
resolve(true);
|
|
416
|
+
});
|
|
417
|
+
socket.once("timeout", () => {
|
|
418
|
+
socket.destroy();
|
|
419
|
+
resolve(false);
|
|
420
|
+
});
|
|
421
|
+
socket.once("error", () => {
|
|
422
|
+
resolve(false);
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=dev-server-manager.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* `.claude/launch.json` — the project-level dev-server launch config shared
|
|
4
|
+
* with Claude Code's preview tooling. Otto's preview subsystem reads the same
|
|
5
|
+
* file so one config drives both harnesses.
|
|
6
|
+
* See docs/preview.md ("launch.json").
|
|
7
|
+
*/
|
|
8
|
+
export declare const LAUNCH_CONFIG_RELATIVE_PATH: string;
|
|
9
|
+
declare const LaunchConfigurationSchema: z.ZodObject<{
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
runtimeExecutable: z.ZodString;
|
|
12
|
+
runtimeArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
13
|
+
port: z.ZodNumber;
|
|
14
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
declare const LaunchConfigSchema: z.ZodObject<{
|
|
17
|
+
version: z.ZodOptional<z.ZodString>;
|
|
18
|
+
configurations: z.ZodArray<z.ZodObject<{
|
|
19
|
+
name: z.ZodString;
|
|
20
|
+
runtimeExecutable: z.ZodString;
|
|
21
|
+
runtimeArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
22
|
+
port: z.ZodNumber;
|
|
23
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
24
|
+
}, z.core.$strip>>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export type LaunchConfiguration = z.infer<typeof LaunchConfigurationSchema>;
|
|
27
|
+
export type LaunchConfig = z.infer<typeof LaunchConfigSchema>;
|
|
28
|
+
export declare class LaunchConfigError extends Error {
|
|
29
|
+
readonly configPath: string;
|
|
30
|
+
constructor(message: string, configPath: string);
|
|
31
|
+
}
|
|
32
|
+
export declare function resolveLaunchConfigPath(cwd: string): string;
|
|
33
|
+
/** Returns null when the file does not exist; throws LaunchConfigError when it is invalid. */
|
|
34
|
+
export declare function readLaunchConfig(cwd: string): Promise<LaunchConfig | null>;
|
|
35
|
+
export declare function findLaunchConfiguration(config: LaunchConfig, name: string): LaunchConfiguration | undefined;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=launch-config.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
/**
|
|
5
|
+
* `.claude/launch.json` — the project-level dev-server launch config shared
|
|
6
|
+
* with Claude Code's preview tooling. Otto's preview subsystem reads the same
|
|
7
|
+
* file so one config drives both harnesses.
|
|
8
|
+
* See docs/preview.md ("launch.json").
|
|
9
|
+
*/
|
|
10
|
+
export const LAUNCH_CONFIG_RELATIVE_PATH = path.join(".claude", "launch.json");
|
|
11
|
+
const LaunchConfigurationSchema = z.object({
|
|
12
|
+
name: z.string().min(1),
|
|
13
|
+
runtimeExecutable: z.string().min(1),
|
|
14
|
+
runtimeArgs: z.array(z.string()).default([]),
|
|
15
|
+
port: z.number().int().min(1).max(65535),
|
|
16
|
+
env: z.record(z.string(), z.string()).optional(),
|
|
17
|
+
});
|
|
18
|
+
const LaunchConfigSchema = z.object({
|
|
19
|
+
version: z.string().optional(),
|
|
20
|
+
configurations: z.array(LaunchConfigurationSchema),
|
|
21
|
+
});
|
|
22
|
+
export class LaunchConfigError extends Error {
|
|
23
|
+
constructor(message, configPath) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.configPath = configPath;
|
|
26
|
+
this.name = "LaunchConfigError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function resolveLaunchConfigPath(cwd) {
|
|
30
|
+
return path.join(cwd, LAUNCH_CONFIG_RELATIVE_PATH);
|
|
31
|
+
}
|
|
32
|
+
/** Returns null when the file does not exist; throws LaunchConfigError when it is invalid. */
|
|
33
|
+
export async function readLaunchConfig(cwd) {
|
|
34
|
+
const configPath = resolveLaunchConfigPath(cwd);
|
|
35
|
+
let raw;
|
|
36
|
+
try {
|
|
37
|
+
raw = await fs.readFile(configPath, "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error.code === "ENOENT") {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
throw new LaunchConfigError(`Cannot read ${configPath}: ${error instanceof Error ? error.message : String(error)}`, configPath);
|
|
44
|
+
}
|
|
45
|
+
let parsed;
|
|
46
|
+
try {
|
|
47
|
+
parsed = JSON.parse(raw);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new LaunchConfigError(`${configPath} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`, configPath);
|
|
51
|
+
}
|
|
52
|
+
const result = LaunchConfigSchema.safeParse(parsed);
|
|
53
|
+
if (!result.success) {
|
|
54
|
+
throw new LaunchConfigError(`${configPath} does not match the launch config format: ${result.error.issues
|
|
55
|
+
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
|
56
|
+
.join("; ")}`, configPath);
|
|
57
|
+
}
|
|
58
|
+
return result.data;
|
|
59
|
+
}
|
|
60
|
+
export function findLaunchConfiguration(config, name) {
|
|
61
|
+
return config.configurations.find((entry) => entry.name === name);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=launch-config.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { OttoToolConfig, OttoToolExecutionContext, OttoToolResult } from "../agent/tools/types.js";
|
|
2
|
+
import type { BrowserToolsBroker } from "../browser-tools/broker.js";
|
|
3
|
+
import type { DevServerManager } from "./dev-server-manager.js";
|
|
4
|
+
/**
|
|
5
|
+
* Agent-facing preview_* tools (dev-server half of the preview bridge).
|
|
6
|
+
* Registered into the Otto tool catalog next to the browser_* tools; the
|
|
7
|
+
* agent starts a server here, then verifies it through the browser tools.
|
|
8
|
+
*
|
|
9
|
+
* The verification surface is the Otto browser pane — the same tab the user
|
|
10
|
+
* watches — never a headless or system browser. Each server gets exactly one
|
|
11
|
+
* designated tab ("it"): preview_start opens or re-finds that tab and returns
|
|
12
|
+
* its browserId for the browser_* tools. Tool descriptions deliberately steer
|
|
13
|
+
* agent behavior — see docs/preview.md ("Design principles").
|
|
14
|
+
*/
|
|
15
|
+
interface CallerAgentContext {
|
|
16
|
+
id: string;
|
|
17
|
+
cwd: string;
|
|
18
|
+
workspaceId?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Narrow surface of DevServerManager the tools need — keeps tests honest. */
|
|
21
|
+
export type PreviewDevServerHost = Pick<DevServerManager, "start" | "stop" | "list" | "logs" | "bindTab" | "boundTab" | "getServer">;
|
|
22
|
+
export interface RegisterPreviewToolsOptions {
|
|
23
|
+
registerTool: (name: string, config: OttoToolConfig, handler: (input: any, context: OttoToolExecutionContext) => Promise<OttoToolResult>) => void;
|
|
24
|
+
manager: PreviewDevServerHost;
|
|
25
|
+
broker?: Pick<BrowserToolsBroker, "execute"> | null;
|
|
26
|
+
resolveCallerAgent: () => CallerAgentContext | null;
|
|
27
|
+
}
|
|
28
|
+
export declare function registerPreviewTools(options: RegisterPreviewToolsOptions): void;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=preview-tools.d.ts.map
|