@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,146 @@
|
|
|
1
|
+
import { readFileSync, watch as fsWatch, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { validateHtmlFile } from "./html-validator.js";
|
|
4
|
+
const BATCH_POLL_INTERVAL_MS = 1000;
|
|
5
|
+
export class ArtifactWatcher {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.activeWatchers = new Map();
|
|
8
|
+
this.handles = new Map();
|
|
9
|
+
this.batchPollTimer = null;
|
|
10
|
+
this.store = options.store;
|
|
11
|
+
this.logger = options.logger.child({ module: "artifact-watcher" });
|
|
12
|
+
this.sendNotification = options.sendNotification;
|
|
13
|
+
this.timeoutMs = options.timeoutMs;
|
|
14
|
+
this.onTimeout = options.onTimeout;
|
|
15
|
+
}
|
|
16
|
+
watch(artifactId, filePath, onReady) {
|
|
17
|
+
if (this.handles.has(artifactId)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const handle = { watcher: null, timeoutTimer: null, onReady: onReady ?? null };
|
|
21
|
+
this.handles.set(artifactId, handle);
|
|
22
|
+
const validation = validateHtmlFile(filePath);
|
|
23
|
+
if (validation.isValid) {
|
|
24
|
+
this.writeSanitizedContent(filePath, validation.content);
|
|
25
|
+
this.updateToReady(artifactId);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const artifactsDir = dirname(filePath);
|
|
29
|
+
try {
|
|
30
|
+
handle.watcher = fsWatch(artifactsDir, { persistent: false }, () => {
|
|
31
|
+
this.checkFileReady(artifactId, filePath);
|
|
32
|
+
});
|
|
33
|
+
this.logger.debug({ artifactId, dir: artifactsDir }, "Started fs.watch on artifacts directory");
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
this.logger.warn({ error, artifactId }, "Failed to set up fs.watch, relying on polling fallback");
|
|
37
|
+
handle.watcher = null;
|
|
38
|
+
}
|
|
39
|
+
this.activeWatchers.set(artifactId, filePath);
|
|
40
|
+
this.startBatchPolling();
|
|
41
|
+
handle.timeoutTimer = setTimeout(() => {
|
|
42
|
+
this.handleTimeout(artifactId);
|
|
43
|
+
}, this.timeoutMs);
|
|
44
|
+
handle.timeoutTimer?.unref?.();
|
|
45
|
+
this.logger.debug({ artifactId, filePath }, "Watching for artifact file creation");
|
|
46
|
+
}
|
|
47
|
+
unwatch(artifactId) {
|
|
48
|
+
const handle = this.handles.get(artifactId);
|
|
49
|
+
if (!handle)
|
|
50
|
+
return;
|
|
51
|
+
this.activeWatchers.delete(artifactId);
|
|
52
|
+
if (this.activeWatchers.size === 0) {
|
|
53
|
+
this.stopBatchPolling();
|
|
54
|
+
}
|
|
55
|
+
this.cleanupHandle(handle);
|
|
56
|
+
this.handles.delete(artifactId);
|
|
57
|
+
this.logger.debug({ artifactId }, "Stopped watching artifact");
|
|
58
|
+
}
|
|
59
|
+
stop() {
|
|
60
|
+
const count = this.handles.size;
|
|
61
|
+
this.stopBatchPolling();
|
|
62
|
+
this.activeWatchers.clear();
|
|
63
|
+
for (const handle of this.handles.values()) {
|
|
64
|
+
this.cleanupHandle(handle);
|
|
65
|
+
}
|
|
66
|
+
this.handles.clear();
|
|
67
|
+
if (count > 0) {
|
|
68
|
+
this.logger.info(`Cleaned up ${count} artifact watchers`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
cleanupHandle(handle) {
|
|
72
|
+
handle.watcher?.close();
|
|
73
|
+
clearTimeout(handle.timeoutTimer ?? undefined);
|
|
74
|
+
}
|
|
75
|
+
startBatchPolling() {
|
|
76
|
+
if (this.batchPollTimer)
|
|
77
|
+
return;
|
|
78
|
+
this.logger.debug("Started batch polling timer for artifacts");
|
|
79
|
+
this.batchPollTimer = setInterval(() => {
|
|
80
|
+
for (const [artifactId, filePath] of this.activeWatchers.entries()) {
|
|
81
|
+
this.checkFileReady(artifactId, filePath);
|
|
82
|
+
}
|
|
83
|
+
}, BATCH_POLL_INTERVAL_MS);
|
|
84
|
+
this.batchPollTimer?.unref?.();
|
|
85
|
+
}
|
|
86
|
+
stopBatchPolling() {
|
|
87
|
+
if (this.batchPollTimer) {
|
|
88
|
+
clearInterval(this.batchPollTimer);
|
|
89
|
+
this.batchPollTimer = null;
|
|
90
|
+
this.logger.debug("Stopped batch polling timer");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async checkFileReady(artifactId, filePath) {
|
|
94
|
+
const validation = validateHtmlFile(filePath);
|
|
95
|
+
if (validation.isValid) {
|
|
96
|
+
this.writeSanitizedContent(filePath, validation.content);
|
|
97
|
+
await this.updateToReady(artifactId);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
writeSanitizedContent(filePath, content) {
|
|
101
|
+
try {
|
|
102
|
+
const original = readFileSync(filePath, "utf-8");
|
|
103
|
+
if (original !== content) {
|
|
104
|
+
writeFileSync(filePath, content, "utf-8");
|
|
105
|
+
this.logger.debug({ filePath }, "Sanitized artifact HTML content");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Ignore errors in sanitization - not critical
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async updateToReady(artifactId) {
|
|
113
|
+
const onReady = this.handles.get(artifactId)?.onReady;
|
|
114
|
+
this.unwatch(artifactId);
|
|
115
|
+
try {
|
|
116
|
+
await this.store.update(artifactId, { status: "ready" });
|
|
117
|
+
this.logger.info({ artifactId }, "Artifact generation complete - marked as ready");
|
|
118
|
+
onReady?.();
|
|
119
|
+
this.emitUpdatedNotification(artifactId);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
this.logger.error({ error, artifactId }, "Failed to update artifact status to ready");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
handleTimeout(artifactId) {
|
|
126
|
+
// Stop the file watch immediately so a late/partial write can't flip the
|
|
127
|
+
// artifact to "ready" after we've decided it timed out. The service owns
|
|
128
|
+
// the rest of the teardown: it cancels the generation agent (so nothing
|
|
129
|
+
// lingers) and marks the artifact as timed out.
|
|
130
|
+
this.unwatch(artifactId);
|
|
131
|
+
this.logger.warn({ artifactId }, "Artifact generation timed out");
|
|
132
|
+
this.onTimeout(artifactId);
|
|
133
|
+
}
|
|
134
|
+
async emitUpdatedNotification(artifactId) {
|
|
135
|
+
try {
|
|
136
|
+
const metadata = await this.store.get(artifactId);
|
|
137
|
+
if (!metadata)
|
|
138
|
+
return;
|
|
139
|
+
this.sendNotification(metadata);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
this.logger.error({ error, artifactId }, "Failed to emit updated notification");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=artifact-watcher.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates that a string contains reasonable HTML content.
|
|
3
|
+
* Does not perform full parsing - just basic structural checks.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isValidHtmlContent(content: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Inserts a restrictive Content-Security-Policy meta tag into the document
|
|
8
|
+
* head so artifact content cannot reach the network no matter which platform
|
|
9
|
+
* renders it. Idempotent - a document that already has one is left alone.
|
|
10
|
+
*/
|
|
11
|
+
export declare function injectContentSecurityPolicy(content: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Sanitizes HTML content by stripping common wrapper artifacts
|
|
14
|
+
* that models might add (markdown code fences, explanations), and injecting
|
|
15
|
+
* a restrictive CSP so the artifact cannot make network calls.
|
|
16
|
+
*/
|
|
17
|
+
export declare function sanitizeHtmlContent(content: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Validates an HTML file on disk exists and contains valid HTML.
|
|
20
|
+
* Returns the validated content or null if validation fails.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateHtmlFile(filePath: string): {
|
|
23
|
+
content: string;
|
|
24
|
+
isValid: boolean;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=html-validator.d.ts.map
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { readFileSync, statSync } from "node:fs";
|
|
2
|
+
/**
|
|
3
|
+
* Validates that a string contains reasonable HTML content.
|
|
4
|
+
* Does not perform full parsing - just basic structural checks.
|
|
5
|
+
*/
|
|
6
|
+
export function isValidHtmlContent(content) {
|
|
7
|
+
// Minimum length check (basic HTML needs at least ~50 chars)
|
|
8
|
+
if (content.length < 50)
|
|
9
|
+
return false;
|
|
10
|
+
// Must have HTML structure indicators
|
|
11
|
+
const hasDoctype = /<!DOCTYPE\s+html/i.test(content);
|
|
12
|
+
const hasHtmlTag = /<html[^>]*>/i.test(content);
|
|
13
|
+
const hasBasicTags = /<(head|body)/i.test(content);
|
|
14
|
+
return (hasDoctype || hasHtmlTag) && (hasBasicTags || content.includes("<"));
|
|
15
|
+
}
|
|
16
|
+
// Artifacts are LLM-generated HTML rendered inline (WebView/iframe/webview guest)
|
|
17
|
+
// on every platform. This CSP is the one hardening layer that reaches all of
|
|
18
|
+
// them regardless of renderer: it blocks the artifact from making any network
|
|
19
|
+
// call (fetch/XHR/WebSocket/beacon) or framing/submitting to anywhere, while
|
|
20
|
+
// still allowing the inline script/style/data-URI assets an artifact needs to
|
|
21
|
+
// render itself. Per-platform WebView/webview sandboxing is defense in depth
|
|
22
|
+
// on top of this, not a substitute for it.
|
|
23
|
+
const ARTIFACT_CSP = "default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; " +
|
|
24
|
+
"img-src data: blob:; font-src data:; connect-src 'none'; frame-src 'none'; " +
|
|
25
|
+
"object-src 'none'; base-uri 'none'; form-action 'none'";
|
|
26
|
+
/**
|
|
27
|
+
* Inserts a restrictive Content-Security-Policy meta tag into the document
|
|
28
|
+
* head so artifact content cannot reach the network no matter which platform
|
|
29
|
+
* renders it. Idempotent - a document that already has one is left alone.
|
|
30
|
+
*/
|
|
31
|
+
export function injectContentSecurityPolicy(content) {
|
|
32
|
+
if (/<meta[^>]+http-equiv=["']Content-Security-Policy["']/i.test(content)) {
|
|
33
|
+
return content;
|
|
34
|
+
}
|
|
35
|
+
const cspTag = `<meta http-equiv="Content-Security-Policy" content="${ARTIFACT_CSP}">`;
|
|
36
|
+
const headOpenMatch = content.match(/<head[^>]*>/i);
|
|
37
|
+
if (headOpenMatch) {
|
|
38
|
+
const insertAt = headOpenMatch.index + headOpenMatch[0].length;
|
|
39
|
+
return content.slice(0, insertAt) + cspTag + content.slice(insertAt);
|
|
40
|
+
}
|
|
41
|
+
const htmlOpenMatch = content.match(/<html[^>]*>/i);
|
|
42
|
+
if (htmlOpenMatch) {
|
|
43
|
+
const insertAt = htmlOpenMatch.index + htmlOpenMatch[0].length;
|
|
44
|
+
return content.slice(0, insertAt) + `<head>${cspTag}</head>` + content.slice(insertAt);
|
|
45
|
+
}
|
|
46
|
+
return cspTag + content;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sanitizes HTML content by stripping common wrapper artifacts
|
|
50
|
+
* that models might add (markdown code fences, explanations), and injecting
|
|
51
|
+
* a restrictive CSP so the artifact cannot make network calls.
|
|
52
|
+
*/
|
|
53
|
+
export function sanitizeHtmlContent(content) {
|
|
54
|
+
// Strip markdown code fences if present
|
|
55
|
+
let sanitized = content.replace(/^```html\s*\n?/, "");
|
|
56
|
+
sanitized = sanitized.replace(/^```\s*\n?/, "");
|
|
57
|
+
sanitized = sanitized.replace(/\n?```\s*$/, "");
|
|
58
|
+
// Remove any trailing explanations after closing HTML tags
|
|
59
|
+
const htmlEndMatch = sanitized.match(/(<\/html>)(?:\s|<)/is);
|
|
60
|
+
if (htmlEndMatch) {
|
|
61
|
+
// Keep only content up to and including </html>
|
|
62
|
+
sanitized = sanitized.substring(0, htmlEndMatch.index + "</html>".length);
|
|
63
|
+
}
|
|
64
|
+
sanitized = injectContentSecurityPolicy(sanitized.trim());
|
|
65
|
+
return sanitized.trim();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validates an HTML file on disk exists and contains valid HTML.
|
|
69
|
+
* Returns the validated content or null if validation fails.
|
|
70
|
+
*/
|
|
71
|
+
export function validateHtmlFile(filePath) {
|
|
72
|
+
try {
|
|
73
|
+
// Check file exists and has minimum size
|
|
74
|
+
const stats = statSync(filePath);
|
|
75
|
+
// Must have non-zero size (minimum ~50 bytes for basic HTML)
|
|
76
|
+
if (stats.size < 50) {
|
|
77
|
+
return { content: "", isValid: false };
|
|
78
|
+
}
|
|
79
|
+
// Read and validate content
|
|
80
|
+
const rawContent = readFileSync(filePath, "utf-8");
|
|
81
|
+
// Sanitize first (remove code fences etc)
|
|
82
|
+
const sanitized = sanitizeHtmlContent(rawContent);
|
|
83
|
+
return {
|
|
84
|
+
content: sanitized,
|
|
85
|
+
isValid: isValidHtmlContent(sanitized),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return { content: "", isValid: false };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=html-validator.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function writeFileAtomic(filePath: string, data: string | NodeJS.ArrayBufferView, options?: {
|
|
2
|
+
mode?: number;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function writeJsonFileAtomic(filePath: string, value: unknown): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=atomic-file.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export async function writeFileAtomic(filePath, data, options) {
|
|
5
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
6
|
+
const tempPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`);
|
|
7
|
+
try {
|
|
8
|
+
await fs.writeFile(tempPath, data, { encoding: "utf8", mode: options?.mode });
|
|
9
|
+
await fs.rename(tempPath, filePath);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
await fs.rm(tempPath, { force: true });
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function writeJsonFileAtomic(filePath, value) {
|
|
17
|
+
await writeFileAtomic(filePath, JSON.stringify(value, null, 2));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=atomic-file.js.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RequestHandler } from "express";
|
|
2
|
+
export declare const DAEMON_PASSWORD_BCRYPT_COST = 12;
|
|
3
|
+
export interface DaemonAuthConfig {
|
|
4
|
+
password?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface BearerAuthRejectContext {
|
|
7
|
+
path: string;
|
|
8
|
+
method: string;
|
|
9
|
+
hasToken: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface BearerValidationInput {
|
|
12
|
+
password: string | undefined;
|
|
13
|
+
token: string | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function isBearerTokenValid(input: BearerValidationInput): boolean;
|
|
16
|
+
export declare function isBearerTokenValidAsync(input: BearerValidationInput): Promise<boolean>;
|
|
17
|
+
export declare function isBearerTokenValidSync(input: BearerValidationInput): boolean;
|
|
18
|
+
export declare function hashDaemonPassword(password: string): string;
|
|
19
|
+
export declare function extractHttpBearerToken(value: string | undefined): string | null;
|
|
20
|
+
export declare function extractWsBearerProtocol(value: string | undefined): string | null;
|
|
21
|
+
export declare function extractWsBearerToken(protocol: string | null): string | null;
|
|
22
|
+
export declare function createRequireBearerMiddleware(auth: DaemonAuthConfig | undefined, onReject?: (context: BearerAuthRejectContext) => void): RequestHandler;
|
|
23
|
+
export declare function shouldBypassBearerAuth(method: string, path: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Authorizes a request to the Agent MCP endpoint (/mcp/agents), which is exempt
|
|
26
|
+
* from the global daemon-password middleware. Accepts either the per-daemon-run
|
|
27
|
+
* capability token the daemon injects into its own agents' configs and MCP
|
|
28
|
+
* client, or a valid daemon-password bearer (so existing password-authenticated
|
|
29
|
+
* callers keep working). When no daemon password is configured the endpoint is
|
|
30
|
+
* open, matching the global middleware's behavior.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isAgentMcpRequestAuthorized(input: {
|
|
33
|
+
password: string | undefined;
|
|
34
|
+
capabilityToken: string | null;
|
|
35
|
+
authorizationHeader: string | undefined;
|
|
36
|
+
}): Promise<boolean>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { compare, compareSync, hashSync } from "bcryptjs";
|
|
2
|
+
import { timingSafeEqual } from "node:crypto";
|
|
3
|
+
export const DAEMON_PASSWORD_BCRYPT_COST = 12;
|
|
4
|
+
export function isBearerTokenValid(input) {
|
|
5
|
+
return isBearerTokenValidSync(input);
|
|
6
|
+
}
|
|
7
|
+
export async function isBearerTokenValidAsync(input) {
|
|
8
|
+
if (!input.password) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
if (input.token === null) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return compare(input.token, input.password);
|
|
15
|
+
}
|
|
16
|
+
export function isBearerTokenValidSync(input) {
|
|
17
|
+
if (!input.password) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
if (input.token === null) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return compareSync(input.token, input.password);
|
|
24
|
+
}
|
|
25
|
+
export function hashDaemonPassword(password) {
|
|
26
|
+
return hashSync(password, DAEMON_PASSWORD_BCRYPT_COST);
|
|
27
|
+
}
|
|
28
|
+
export function extractHttpBearerToken(value) {
|
|
29
|
+
if (!value) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const [scheme, ...tokenParts] = value.trim().split(/\s+/);
|
|
33
|
+
if (scheme !== "Bearer" || tokenParts.length !== 1) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return tokenParts[0] ?? null;
|
|
37
|
+
}
|
|
38
|
+
export function extractWsBearerProtocol(value) {
|
|
39
|
+
if (!value) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
for (const protocol of value.split(",")) {
|
|
43
|
+
const trimmed = protocol.trim();
|
|
44
|
+
const segments = trimmed.split(".");
|
|
45
|
+
if (segments[0] === "otto" && segments[1] === "bearer" && segments.length >= 3) {
|
|
46
|
+
return trimmed;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
export function extractWsBearerToken(protocol) {
|
|
52
|
+
if (!protocol) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const segments = protocol.split(".");
|
|
56
|
+
if (segments[0] !== "otto" || segments[1] !== "bearer" || segments.length < 3) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return segments.slice(2).join(".");
|
|
60
|
+
}
|
|
61
|
+
export function createRequireBearerMiddleware(auth, onReject) {
|
|
62
|
+
const password = auth?.password;
|
|
63
|
+
return (req, res, next) => {
|
|
64
|
+
if (!password || shouldBypassBearerAuth(req.method, req.path)) {
|
|
65
|
+
next();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
void (async () => {
|
|
69
|
+
try {
|
|
70
|
+
const token = extractHttpBearerToken(req.header("authorization"));
|
|
71
|
+
if (!(await isBearerTokenValidAsync({ password, token }))) {
|
|
72
|
+
onReject?.({
|
|
73
|
+
path: req.path,
|
|
74
|
+
method: req.method,
|
|
75
|
+
hasToken: token !== null,
|
|
76
|
+
});
|
|
77
|
+
res.status(401).json({ error: "Unauthorized" });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
next();
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
next(error);
|
|
84
|
+
}
|
|
85
|
+
})();
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Routes that authenticate via their own capability and therefore must not be
|
|
89
|
+
// gated a second time behind the daemon password.
|
|
90
|
+
const BEARER_AUTH_BYPASS_PATHS = new Set([
|
|
91
|
+
// Unauthenticated liveness probe.
|
|
92
|
+
"/api/health",
|
|
93
|
+
// Guarded by a single-use download token (crypto-random UUID, 60s TTL,
|
|
94
|
+
// consumed on first use) that is only ever issued over the
|
|
95
|
+
// already-authenticated WebSocket. The token IS the capability for this
|
|
96
|
+
// route. Requiring the daemon password on top of it breaks browser and
|
|
97
|
+
// Electron downloads: those trigger the download via an anchor navigation,
|
|
98
|
+
// which cannot attach an `Authorization` header. The download endpoint still
|
|
99
|
+
// rejects requests without a valid token (400/403), so dropping the bearer
|
|
100
|
+
// here does not make the route unauthenticated.
|
|
101
|
+
"/api/files/download",
|
|
102
|
+
// The daemon injects its own agents' Otto MCP connections at this endpoint
|
|
103
|
+
// (and connects its own per-client MCP client here). Those connections cannot
|
|
104
|
+
// carry the daemon password — it is only known in plaintext when set via env,
|
|
105
|
+
// never when set via the app — so the route authenticates them with a
|
|
106
|
+
// per-daemon-run capability token instead (see isAgentMcpRequestAuthorized).
|
|
107
|
+
// The token is injected only into local agent configs/sessions and never sent
|
|
108
|
+
// to remote clients, and the route still rejects callers presenting neither
|
|
109
|
+
// the token nor a valid daemon password, so dropping the global bearer here
|
|
110
|
+
// does not make the endpoint unauthenticated.
|
|
111
|
+
"/mcp/agents",
|
|
112
|
+
]);
|
|
113
|
+
export function shouldBypassBearerAuth(method, path) {
|
|
114
|
+
if (method === "OPTIONS") {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return BEARER_AUTH_BYPASS_PATHS.has(path);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Authorizes a request to the Agent MCP endpoint (/mcp/agents), which is exempt
|
|
121
|
+
* from the global daemon-password middleware. Accepts either the per-daemon-run
|
|
122
|
+
* capability token the daemon injects into its own agents' configs and MCP
|
|
123
|
+
* client, or a valid daemon-password bearer (so existing password-authenticated
|
|
124
|
+
* callers keep working). When no daemon password is configured the endpoint is
|
|
125
|
+
* open, matching the global middleware's behavior.
|
|
126
|
+
*/
|
|
127
|
+
export async function isAgentMcpRequestAuthorized(input) {
|
|
128
|
+
if (!input.password) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
const token = extractHttpBearerToken(input.authorizationHeader);
|
|
132
|
+
if (input.capabilityToken !== null && token !== null) {
|
|
133
|
+
// Constant-time compare; length-guard first because timingSafeEqual throws
|
|
134
|
+
// on differing buffer lengths.
|
|
135
|
+
const provided = Buffer.from(token);
|
|
136
|
+
const expected = Buffer.from(input.capabilityToken);
|
|
137
|
+
if (provided.length === expected.length && timingSafeEqual(provided, expected)) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return isBearerTokenValidAsync({ password: input.password, token });
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
import type { AgentManager } from "../agent/agent-manager.js";
|
|
3
|
+
import type { AgentStorage } from "../agent/agent-storage.js";
|
|
4
|
+
import type { DaemonConfigStore } from "../daemon-config-store.js";
|
|
5
|
+
import { archiveByScope, type ActiveWorkspaceRef, killTerminalsForWorkspace, resolveWorkspaceIdAtPath } from "../workspace-archive-service.js";
|
|
6
|
+
import type { WorkspaceGitRuntimeSnapshot, WorkspaceGitServiceImpl } from "../workspace-git-service.js";
|
|
7
|
+
import type { GitHubService } from "../../services/github-service.js";
|
|
8
|
+
import type { TerminalManager } from "../../terminal/terminal-manager.js";
|
|
9
|
+
import { isOttoOwnedWorktreeCwd } from "../../utils/worktree.js";
|
|
10
|
+
export interface AutoArchiveArchiveOptions {
|
|
11
|
+
ottoHome: string;
|
|
12
|
+
ottoWorktreesBaseRoot?: string;
|
|
13
|
+
daemonConfigStore: DaemonConfigStore;
|
|
14
|
+
workspaceGitService: WorkspaceGitServiceImpl;
|
|
15
|
+
github: GitHubService;
|
|
16
|
+
agentManager: AgentManager;
|
|
17
|
+
agentStorage: AgentStorage;
|
|
18
|
+
terminalManager: TerminalManager;
|
|
19
|
+
findWorkspaceIdForCwd: (cwd: string) => Promise<string | null>;
|
|
20
|
+
listActiveWorkspaces: () => Promise<ActiveWorkspaceRef[]>;
|
|
21
|
+
archiveWorkspaceRecord: (workspaceId: string) => Promise<void>;
|
|
22
|
+
markWorkspaceArchiving: (workspaceIds: Iterable<string>, archivingAt: string) => void;
|
|
23
|
+
clearWorkspaceArchiving: (workspaceIds: Iterable<string>) => void;
|
|
24
|
+
emitWorkspaceUpdatesForWorkspaceIds: (workspaceIds: Iterable<string>) => Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export interface ArchiveIfSafeDependencies {
|
|
27
|
+
archiveByScope: typeof archiveByScope;
|
|
28
|
+
resolveWorkspaceIdAtPath: typeof resolveWorkspaceIdAtPath;
|
|
29
|
+
isOttoOwnedWorktreeCwd: typeof isOttoOwnedWorktreeCwd;
|
|
30
|
+
killTerminalsForWorkspace: typeof killTerminalsForWorkspace;
|
|
31
|
+
}
|
|
32
|
+
export declare function archiveIfSafe(input: {
|
|
33
|
+
cwd: string;
|
|
34
|
+
pullRequest: WorkspaceGitRuntimeSnapshot["github"]["pullRequest"];
|
|
35
|
+
inFlight: Set<string>;
|
|
36
|
+
options: AutoArchiveArchiveOptions;
|
|
37
|
+
log: Logger;
|
|
38
|
+
deps?: ArchiveIfSafeDependencies;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=archive-if-safe.d.ts.map
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { archiveByScope, killTerminalsForWorkspace, resolveWorkspaceIdAtPath, } from "../workspace-archive-service.js";
|
|
2
|
+
import { isOttoOwnedWorktreeCwd } from "../../utils/worktree.js";
|
|
3
|
+
const defaultDependencies = {
|
|
4
|
+
archiveByScope,
|
|
5
|
+
resolveWorkspaceIdAtPath,
|
|
6
|
+
isOttoOwnedWorktreeCwd,
|
|
7
|
+
killTerminalsForWorkspace,
|
|
8
|
+
};
|
|
9
|
+
export async function archiveIfSafe(input) {
|
|
10
|
+
const { cwd, pullRequest, inFlight, options, log } = input;
|
|
11
|
+
const deps = input.deps ?? defaultDependencies;
|
|
12
|
+
if (!pullRequest?.isMerged) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (options.daemonConfigStore.get().autoArchiveAfterMerge !== true) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (inFlight.has(cwd)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
inFlight.add(cwd);
|
|
22
|
+
try {
|
|
23
|
+
let snapshot;
|
|
24
|
+
try {
|
|
25
|
+
snapshot = await options.workspaceGitService.getSnapshot(cwd, {
|
|
26
|
+
reason: "auto-archive-on-merge",
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
log.warn({ err: error, cwd }, "Failed to read snapshot for auto-archive; skipping");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!snapshot) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (snapshot.git.isDirty === true) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (typeof snapshot.git.aheadOfOrigin === "number" && snapshot.git.aheadOfOrigin > 0) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const ownership = await deps.isOttoOwnedWorktreeCwd(cwd, {
|
|
43
|
+
ottoHome: options.ottoHome,
|
|
44
|
+
worktreesRoot: options.ottoWorktreesBaseRoot,
|
|
45
|
+
});
|
|
46
|
+
if (!ownership.allowed) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const workspaceId = await deps.resolveWorkspaceIdAtPath({
|
|
51
|
+
findWorkspaceIdForCwd: options.findWorkspaceIdForCwd,
|
|
52
|
+
listActiveWorkspaces: options.listActiveWorkspaces,
|
|
53
|
+
}, cwd);
|
|
54
|
+
if (!workspaceId) {
|
|
55
|
+
log.warn({ cwd }, "Auto-archive could not resolve a workspace for cwd; skipping");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
await deps.archiveByScope({
|
|
59
|
+
ottoHome: options.ottoHome,
|
|
60
|
+
ottoWorktreesBaseRoot: options.ottoWorktreesBaseRoot,
|
|
61
|
+
github: options.github,
|
|
62
|
+
workspaceGitService: options.workspaceGitService,
|
|
63
|
+
agentManager: options.agentManager,
|
|
64
|
+
agentStorage: options.agentStorage,
|
|
65
|
+
findWorkspaceIdForCwd: options.findWorkspaceIdForCwd,
|
|
66
|
+
listActiveWorkspaces: options.listActiveWorkspaces,
|
|
67
|
+
archiveWorkspaceRecord: options.archiveWorkspaceRecord,
|
|
68
|
+
emitWorkspaceUpdatesForWorkspaceIds: options.emitWorkspaceUpdatesForWorkspaceIds,
|
|
69
|
+
markWorkspaceArchiving: options.markWorkspaceArchiving,
|
|
70
|
+
clearWorkspaceArchiving: options.clearWorkspaceArchiving,
|
|
71
|
+
killTerminalsForWorkspace: (workspaceIdToKill) => deps.killTerminalsForWorkspace({
|
|
72
|
+
terminalManager: options.terminalManager,
|
|
73
|
+
sessionLogger: log,
|
|
74
|
+
}, workspaceIdToKill),
|
|
75
|
+
sessionLogger: log,
|
|
76
|
+
}, {
|
|
77
|
+
scope: { kind: "workspace", workspaceId },
|
|
78
|
+
repoRoot: ownership.repoRoot ?? null,
|
|
79
|
+
ottoWorktreesBaseRoot: options.ottoWorktreesBaseRoot,
|
|
80
|
+
requestId: "auto-archive-on-merge",
|
|
81
|
+
});
|
|
82
|
+
log.info({ cwd }, "Auto-archived worktree after PR merge");
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
log.warn({ err: error, cwd }, "Auto-archive after merge failed");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
inFlight.delete(cwd);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=archive-if-safe.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
import { type AutoArchiveArchiveOptions } from "./archive-if-safe.js";
|
|
3
|
+
import type { WorkspaceGitSubscription } from "../workspace-git-service.js";
|
|
4
|
+
export interface AutoArchiveOnMergeOptions extends AutoArchiveArchiveOptions {
|
|
5
|
+
logger: Logger;
|
|
6
|
+
}
|
|
7
|
+
export declare function setupAutoArchiveOnMerge(options: AutoArchiveOnMergeOptions): WorkspaceGitSubscription;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { archiveIfSafe } from "./archive-if-safe.js";
|
|
2
|
+
export function setupAutoArchiveOnMerge(options) {
|
|
3
|
+
const log = options.logger.child({ module: "auto-archive-on-merge" });
|
|
4
|
+
const inFlight = new Set();
|
|
5
|
+
return options.workspaceGitService.onSnapshotUpdated((snapshot) => {
|
|
6
|
+
void archiveIfSafe({
|
|
7
|
+
cwd: snapshot.cwd,
|
|
8
|
+
pullRequest: snapshot.github.pullRequest,
|
|
9
|
+
inFlight,
|
|
10
|
+
options,
|
|
11
|
+
log,
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|