@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,419 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { readFile, rename, rm } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { ArtifactStore, assertValidArtifactId } from "./artifact-store.js";
|
|
5
|
+
import { ArtifactWatcher } from "./artifact-watcher.js";
|
|
6
|
+
import { ARTIFACT_SYSTEM_PROMPT } from "./artifact-prompt.js";
|
|
7
|
+
const GENERATION_CANCELLED_MESSAGE = "Generation cancelled";
|
|
8
|
+
// How long a generation may run before we give up, cancel the agent, and mark
|
|
9
|
+
// the artifact as timed out. Local models are slow, so the default is generous;
|
|
10
|
+
// override with OTTO_ARTIFACT_TIMEOUT_MS (milliseconds) to tune without a
|
|
11
|
+
// rebuild. Keep this as the single source of truth — the watcher's timer and
|
|
12
|
+
// the user-facing message both derive from it.
|
|
13
|
+
const DEFAULT_GENERATION_TIMEOUT_MS = 960000;
|
|
14
|
+
const GENERATION_TIMEOUT_MS = parseInt(process.env.OTTO_ARTIFACT_TIMEOUT_MS ?? "", 10) || DEFAULT_GENERATION_TIMEOUT_MS;
|
|
15
|
+
function generationTimedOutMessage() {
|
|
16
|
+
return `Generation timed out after ${Math.round(GENERATION_TIMEOUT_MS / 1000)} seconds`;
|
|
17
|
+
}
|
|
18
|
+
class ArtifactNotFoundError extends Error {
|
|
19
|
+
constructor(artifactId) {
|
|
20
|
+
super(`Artifact "${artifactId}" not found`);
|
|
21
|
+
this.name = "ArtifactNotFoundError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class ArtifactService {
|
|
25
|
+
constructor(options) {
|
|
26
|
+
// artifactId -> generation agentId, for the lifetime of an active run. Lets
|
|
27
|
+
// cancel() interrupt the agent even before generationAgentId is persisted.
|
|
28
|
+
this.runningGenerations = new Map();
|
|
29
|
+
// artifactId -> path of the prior HTML, set only while a *regeneration* is
|
|
30
|
+
// in flight (never on a first-ever generation, which has nothing to back
|
|
31
|
+
// up). Restored on failure/cancel/timeout so a failed regeneration doesn't
|
|
32
|
+
// destroy an artifact's last successful output; discarded once the new
|
|
33
|
+
// generation succeeds.
|
|
34
|
+
this.regenerationBackups = new Map();
|
|
35
|
+
this.projectCwd = options.projectCwd;
|
|
36
|
+
this.store = new ArtifactStore(options.projectCwd);
|
|
37
|
+
this.logger = options.logger.child({ module: "artifact-service" });
|
|
38
|
+
this.agentManager = options.agentManager;
|
|
39
|
+
this.providerSnapshotManager = options.providerSnapshotManager;
|
|
40
|
+
this.broadcastArtifactUpdate = options.broadcastArtifactUpdate;
|
|
41
|
+
this.watcher = new ArtifactWatcher({
|
|
42
|
+
store: this.store,
|
|
43
|
+
logger: this.logger,
|
|
44
|
+
sendNotification: (metadata) => {
|
|
45
|
+
this.broadcastArtifactUpdate(metadata);
|
|
46
|
+
},
|
|
47
|
+
timeoutMs: GENERATION_TIMEOUT_MS,
|
|
48
|
+
// The watcher's timer fires here; the service owns the agent, so it does
|
|
49
|
+
// the real teardown (cancel the run, mark timed out) rather than leaving
|
|
50
|
+
// a hung/looping generation agent running in the background.
|
|
51
|
+
onTimeout: (artifactId) => {
|
|
52
|
+
void this.abortGeneration(artifactId, generationTimedOutMessage()).catch((error) => {
|
|
53
|
+
this.logger.error({ err: error, artifactId }, "Failed to abort timed-out generation");
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async list(projectId) {
|
|
59
|
+
return this.store.list(projectId ? { projectId } : undefined);
|
|
60
|
+
}
|
|
61
|
+
/** Full record with generation run history, for inspect_artifact. */
|
|
62
|
+
async inspect(artifactId) {
|
|
63
|
+
const record = await this.store.inspect(artifactId);
|
|
64
|
+
if (!record) {
|
|
65
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
66
|
+
}
|
|
67
|
+
return record;
|
|
68
|
+
}
|
|
69
|
+
/** Open a new generation run in "running" state. */
|
|
70
|
+
async startRun(artifactId, trigger, provider, model) {
|
|
71
|
+
await this.store.appendRun(artifactId, {
|
|
72
|
+
id: generateArtifactId(),
|
|
73
|
+
trigger,
|
|
74
|
+
status: "running",
|
|
75
|
+
startedAt: new Date().toISOString(),
|
|
76
|
+
endedAt: null,
|
|
77
|
+
agentId: null,
|
|
78
|
+
provider,
|
|
79
|
+
model,
|
|
80
|
+
error: null,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/** Close out the artifact's in-flight run. No-op if none is running. */
|
|
84
|
+
async completeRun(artifactId, status, error) {
|
|
85
|
+
await this.store.patchCurrentRun(artifactId, {
|
|
86
|
+
status,
|
|
87
|
+
endedAt: new Date().toISOString(),
|
|
88
|
+
error: status === "failed" ? (error ?? null) : null,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/** Watcher success hook, shared by create and regenerate: mark the run
|
|
92
|
+
* succeeded and drop any regeneration backup (a no-op for first generations). */
|
|
93
|
+
handleGenerationReady(artifactId) {
|
|
94
|
+
void this.completeRun(artifactId, "succeeded");
|
|
95
|
+
void this.discardBackup(artifactId);
|
|
96
|
+
}
|
|
97
|
+
async delete(artifactId) {
|
|
98
|
+
this.watcher.unwatch(artifactId);
|
|
99
|
+
await this.discardBackup(artifactId);
|
|
100
|
+
await this.store.delete(artifactId);
|
|
101
|
+
}
|
|
102
|
+
stop() {
|
|
103
|
+
this.watcher.stop();
|
|
104
|
+
}
|
|
105
|
+
async star(artifactId, starred) {
|
|
106
|
+
const existing = await this.store.get(artifactId);
|
|
107
|
+
if (!existing) {
|
|
108
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
109
|
+
}
|
|
110
|
+
await this.store.update(artifactId, { starred });
|
|
111
|
+
const updated = await this.store.get(artifactId);
|
|
112
|
+
if (!updated) {
|
|
113
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
114
|
+
}
|
|
115
|
+
return updated;
|
|
116
|
+
}
|
|
117
|
+
async getContent(artifactId) {
|
|
118
|
+
const metadata = await this.store.get(artifactId);
|
|
119
|
+
if (!metadata) {
|
|
120
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
return await readFile(this.resolveHtmlPath(artifactId), "utf-8");
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
127
|
+
throw new Error(`Artifact HTML not found for "${artifactId}"`, { cause: error });
|
|
128
|
+
}
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async create(input) {
|
|
133
|
+
const artifactId = generateArtifactId();
|
|
134
|
+
const now = new Date().toISOString();
|
|
135
|
+
const filePath = this.resolveHtmlPath(artifactId);
|
|
136
|
+
const metadata = {
|
|
137
|
+
id: artifactId,
|
|
138
|
+
name: input.name,
|
|
139
|
+
description: input.description,
|
|
140
|
+
projectId: input.projectId ?? "",
|
|
141
|
+
filePath,
|
|
142
|
+
kind: "html",
|
|
143
|
+
status: "generating",
|
|
144
|
+
starred: false,
|
|
145
|
+
createdAt: now,
|
|
146
|
+
updatedAt: now,
|
|
147
|
+
generationAgentId: null,
|
|
148
|
+
generationProvider: input.provider,
|
|
149
|
+
generationModel: input.model ?? null,
|
|
150
|
+
generationModeId: input.modeId ?? null,
|
|
151
|
+
generationThinkingOptionId: input.thinkingOptionId ?? null,
|
|
152
|
+
generationSpinner: input.spinner ?? null,
|
|
153
|
+
errorMessage: null,
|
|
154
|
+
};
|
|
155
|
+
await this.store.create(metadata);
|
|
156
|
+
await this.startRun(artifactId, "create", metadata.generationProvider, metadata.generationModel);
|
|
157
|
+
this.watcher.watch(artifactId, filePath, () => this.handleGenerationReady(artifactId));
|
|
158
|
+
void this.spawnArtifactAgent(artifactId, metadata, input).catch((error) => {
|
|
159
|
+
this.logger.error({ err: error, artifactId }, "Failed to spawn artifact agent");
|
|
160
|
+
void this.store.update(artifactId, { status: "error", errorMessage: String(error) });
|
|
161
|
+
void this.completeRun(artifactId, "failed", String(error));
|
|
162
|
+
});
|
|
163
|
+
return metadata;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Edit an artifact's metadata WITHOUT regenerating. Only provided fields are
|
|
167
|
+
* overwritten. Editing never re-runs the agent — the user regenerates
|
|
168
|
+
* separately once they're happy with the changes.
|
|
169
|
+
*/
|
|
170
|
+
async update(input) {
|
|
171
|
+
const existing = await this.store.get(input.artifactId);
|
|
172
|
+
if (!existing) {
|
|
173
|
+
throw new ArtifactNotFoundError(input.artifactId);
|
|
174
|
+
}
|
|
175
|
+
await this.store.update(input.artifactId, {
|
|
176
|
+
...(input.name !== undefined ? { name: input.name } : {}),
|
|
177
|
+
...(input.description !== undefined ? { description: input.description } : {}),
|
|
178
|
+
...(input.projectId !== undefined ? { projectId: input.projectId } : {}),
|
|
179
|
+
...(input.provider !== undefined ? { generationProvider: input.provider } : {}),
|
|
180
|
+
...(input.model !== undefined ? { generationModel: input.model || null } : {}),
|
|
181
|
+
...(input.thinkingOptionId !== undefined
|
|
182
|
+
? { generationThinkingOptionId: input.thinkingOptionId || null }
|
|
183
|
+
: {}),
|
|
184
|
+
});
|
|
185
|
+
const updated = await this.store.get(input.artifactId);
|
|
186
|
+
if (!updated) {
|
|
187
|
+
throw new ArtifactNotFoundError(input.artifactId);
|
|
188
|
+
}
|
|
189
|
+
return updated;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Re-run generation for an existing artifact using its stored config. Resets
|
|
193
|
+
* the artifact to "generating", clears the prior error, and spawns a fresh
|
|
194
|
+
* agent.
|
|
195
|
+
*/
|
|
196
|
+
async regenerate(artifactId) {
|
|
197
|
+
const existing = await this.store.get(artifactId);
|
|
198
|
+
if (!existing) {
|
|
199
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
200
|
+
}
|
|
201
|
+
const provider = existing.generationProvider ?? "";
|
|
202
|
+
if (!provider) {
|
|
203
|
+
throw new Error(`Artifact "${artifactId}" has no provider to regenerate with`);
|
|
204
|
+
}
|
|
205
|
+
const model = existing.generationModel ?? undefined;
|
|
206
|
+
await this.store.update(artifactId, {
|
|
207
|
+
status: "generating",
|
|
208
|
+
errorMessage: null,
|
|
209
|
+
generationAgentId: null,
|
|
210
|
+
});
|
|
211
|
+
const updated = await this.store.get(artifactId);
|
|
212
|
+
if (!updated) {
|
|
213
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
214
|
+
}
|
|
215
|
+
// Move the prior HTML out of the way before watching, rather than
|
|
216
|
+
// deleting it: the watcher marks an artifact "ready" the instant it sees
|
|
217
|
+
// a valid file at filePath, so leaving the old output in place would flip
|
|
218
|
+
// status straight back to "ready" with stale content and stop watching
|
|
219
|
+
// before the new agent writes anything. Keeping it as a backup lets a
|
|
220
|
+
// failed regeneration restore the last successful version instead of
|
|
221
|
+
// losing it outright.
|
|
222
|
+
await this.startRun(artifactId, "regenerate", provider, model ?? null);
|
|
223
|
+
await this.backupBeforeRegenerate(artifactId, updated.filePath);
|
|
224
|
+
this.watcher.watch(artifactId, updated.filePath, () => this.handleGenerationReady(artifactId));
|
|
225
|
+
void this.spawnArtifactAgent(artifactId, updated, {
|
|
226
|
+
name: updated.name,
|
|
227
|
+
description: updated.description,
|
|
228
|
+
projectId: updated.projectId,
|
|
229
|
+
provider,
|
|
230
|
+
model,
|
|
231
|
+
// Re-run with the originally requested mode/effort. The mode is safe to
|
|
232
|
+
// replay as-is: spawnArtifactAgent only honors it if unattended.
|
|
233
|
+
modeId: updated.generationModeId ?? undefined,
|
|
234
|
+
thinkingOptionId: updated.generationThinkingOptionId ?? undefined,
|
|
235
|
+
}).catch(async (error) => {
|
|
236
|
+
this.logger.error({ err: error, artifactId }, "Failed to regenerate artifact");
|
|
237
|
+
await this.restoreBackup(artifactId);
|
|
238
|
+
void this.store.update(artifactId, { status: "error", errorMessage: String(error) });
|
|
239
|
+
void this.completeRun(artifactId, "failed", String(error));
|
|
240
|
+
});
|
|
241
|
+
return updated;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Cancel an in-progress generation and recover the artifact. Stops the agent
|
|
245
|
+
* run, stops the watcher (so a partial/late file can't flip status back to
|
|
246
|
+
* "ready"), and lands the artifact in an error state so it can be regenerated
|
|
247
|
+
* or deleted.
|
|
248
|
+
*/
|
|
249
|
+
async cancel(artifactId) {
|
|
250
|
+
const existing = await this.store.get(artifactId);
|
|
251
|
+
if (!existing) {
|
|
252
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
253
|
+
}
|
|
254
|
+
const updated = await this.abortGeneration(artifactId, GENERATION_CANCELLED_MESSAGE);
|
|
255
|
+
if (!updated) {
|
|
256
|
+
throw new ArtifactNotFoundError(artifactId);
|
|
257
|
+
}
|
|
258
|
+
return updated;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Shared teardown for a generation that must stop early — user cancel or
|
|
262
|
+
* timeout. Stops the watcher (so a partial/late file can't flip status back
|
|
263
|
+
* to "ready"), cancels the generation agent so nothing lingers, and lands the
|
|
264
|
+
* artifact in an error state so it can be regenerated or deleted. Safe to call
|
|
265
|
+
* when the agent has already finished: cancelAgentRun on a closed agent is
|
|
266
|
+
* caught and logged. Returns the updated metadata, or null if the artifact
|
|
267
|
+
* disappeared underneath us.
|
|
268
|
+
*/
|
|
269
|
+
async abortGeneration(artifactId, errorMessage) {
|
|
270
|
+
// Stop watching first so an in-flight checkFileReady can't race us to
|
|
271
|
+
// "ready" after we mark the artifact as errored.
|
|
272
|
+
this.watcher.unwatch(artifactId);
|
|
273
|
+
const existing = await this.store.get(artifactId);
|
|
274
|
+
const agentId = this.runningGenerations.get(artifactId) ?? existing?.generationAgentId;
|
|
275
|
+
if (agentId) {
|
|
276
|
+
try {
|
|
277
|
+
await this.agentManager.cancelAgentRun(agentId);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
this.logger.warn({ err: error, artifactId, agentId }, "Failed to cancel generation agent");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// If this aborted a regeneration (not a first-ever generation), restore
|
|
284
|
+
// the prior successful output rather than leaving the artifact with none.
|
|
285
|
+
await this.restoreBackup(artifactId);
|
|
286
|
+
await this.store.update(artifactId, {
|
|
287
|
+
status: "error",
|
|
288
|
+
errorMessage,
|
|
289
|
+
generationAgentId: null,
|
|
290
|
+
});
|
|
291
|
+
await this.completeRun(artifactId, "failed", errorMessage);
|
|
292
|
+
return this.store.get(artifactId);
|
|
293
|
+
}
|
|
294
|
+
/** Move the current HTML aside so a regeneration can't be mistaken for
|
|
295
|
+
* "ready" by the watcher. No-ops (leaves nothing to restore) when there's
|
|
296
|
+
* no prior file — a first-ever generation has none. */
|
|
297
|
+
async backupBeforeRegenerate(artifactId, filePath) {
|
|
298
|
+
const backupPath = `${filePath}.bak`;
|
|
299
|
+
try {
|
|
300
|
+
await rename(filePath, backupPath);
|
|
301
|
+
this.regenerationBackups.set(artifactId, backupPath);
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/** Restore a regeneration's backup after a failed/cancelled/timed-out
|
|
311
|
+
* attempt. No-op if there's no backup (first-ever generation, or already
|
|
312
|
+
* consumed). */
|
|
313
|
+
async restoreBackup(artifactId) {
|
|
314
|
+
const backupPath = this.regenerationBackups.get(artifactId);
|
|
315
|
+
if (!backupPath) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
this.regenerationBackups.delete(artifactId);
|
|
319
|
+
try {
|
|
320
|
+
await rename(backupPath, this.resolveHtmlPath(artifactId));
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
this.logger.warn({ err: error, artifactId }, "Failed to restore artifact backup after failed regeneration");
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/** Drop a regeneration's backup once the new generation has succeeded. */
|
|
327
|
+
async discardBackup(artifactId) {
|
|
328
|
+
const backupPath = this.regenerationBackups.get(artifactId);
|
|
329
|
+
if (!backupPath) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
this.regenerationBackups.delete(artifactId);
|
|
333
|
+
try {
|
|
334
|
+
await rm(backupPath, { force: true });
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
this.logger.warn({ err: error, artifactId }, "Failed to remove stale artifact backup");
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
async spawnArtifactAgent(artifactId, metadata, input) {
|
|
341
|
+
const htmlPath = this.resolveHtmlPath(artifactId);
|
|
342
|
+
const agentPrompt = `${metadata.description}\n\nWrite the HTML file to: ${htmlPath}`;
|
|
343
|
+
// Artifacts run unattended: no client is watching to approve tool calls, so
|
|
344
|
+
// resolve the provider's unattended mode (unless the user picked an explicit
|
|
345
|
+
// mode that is itself unattended) exactly like the schedule runner does, or
|
|
346
|
+
// the agent stalls on the first approval prompt and the artifact never
|
|
347
|
+
// leaves "generating". A non-unattended modeId can leak in from the create
|
|
348
|
+
// sheet inheriting the user's last-used chat mode preference, so it's only
|
|
349
|
+
// honored when it actually won't prompt.
|
|
350
|
+
const requestedModeIsUnattended = input.modeId !== undefined &&
|
|
351
|
+
(await this.providerSnapshotManager.listModes({
|
|
352
|
+
provider: input.provider,
|
|
353
|
+
cwd: this.projectCwd,
|
|
354
|
+
wait: true,
|
|
355
|
+
})).some((mode) => mode.id === input.modeId && mode.isUnattended === true);
|
|
356
|
+
const resolved = requestedModeIsUnattended
|
|
357
|
+
? { modeId: input.modeId, featureValues: undefined }
|
|
358
|
+
: await this.providerSnapshotManager.resolveCreateConfig({
|
|
359
|
+
provider: input.provider,
|
|
360
|
+
cwd: this.projectCwd,
|
|
361
|
+
requestedMode: undefined,
|
|
362
|
+
featureValues: undefined,
|
|
363
|
+
parent: null,
|
|
364
|
+
unattended: true,
|
|
365
|
+
});
|
|
366
|
+
const config = {
|
|
367
|
+
provider: input.provider,
|
|
368
|
+
model: input.model,
|
|
369
|
+
modeId: resolved.modeId,
|
|
370
|
+
thinkingOptionId: input.thinkingOptionId,
|
|
371
|
+
featureValues: resolved.featureValues,
|
|
372
|
+
systemPrompt: ARTIFACT_SYSTEM_PROMPT,
|
|
373
|
+
cwd: this.projectCwd,
|
|
374
|
+
internal: true,
|
|
375
|
+
// Keep the agent out of listings/sidebar (internal) but let a client that
|
|
376
|
+
// opens the generation log watch its stream live (observable). Without
|
|
377
|
+
// this, the daemon's global subscription drops the agent's stream events
|
|
378
|
+
// and the log only updates on manual re-fetch (navigate away and back).
|
|
379
|
+
observable: true,
|
|
380
|
+
title: metadata.name,
|
|
381
|
+
};
|
|
382
|
+
const agent = await this.agentManager.createAgent(config, undefined, {
|
|
383
|
+
initialPrompt: agentPrompt,
|
|
384
|
+
initialTitle: metadata.name,
|
|
385
|
+
// Explicitly no workspace: the generator is an ephemeral internal agent
|
|
386
|
+
// that must never appear in the sidebar.
|
|
387
|
+
workspaceId: undefined,
|
|
388
|
+
});
|
|
389
|
+
// Register before running so cancel() can interrupt this run immediately.
|
|
390
|
+
this.runningGenerations.set(artifactId, agent.id);
|
|
391
|
+
await this.store.update(artifactId, { generationAgentId: agent.id });
|
|
392
|
+
await this.store.patchCurrentRun(artifactId, { agentId: agent.id });
|
|
393
|
+
// Creating the agent only spins up the session; the prompt must be run to
|
|
394
|
+
// actually generate the file. The watcher flips the artifact to "ready"
|
|
395
|
+
// when the HTML lands. Close (not archive) the ephemeral internal agent
|
|
396
|
+
// afterward — internal agents are never persisted, matching how other
|
|
397
|
+
// one-shot internal agents (branch-name/git-metadata generators) tear down.
|
|
398
|
+
try {
|
|
399
|
+
await this.agentManager.runAgent(agent.id, agentPrompt);
|
|
400
|
+
}
|
|
401
|
+
finally {
|
|
402
|
+
this.runningGenerations.delete(artifactId);
|
|
403
|
+
try {
|
|
404
|
+
await this.agentManager.closeAgent(agent.id);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// Ignore cleanup errors; the run result is what matters.
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
resolveHtmlPath(artifactId) {
|
|
412
|
+
assertValidArtifactId(artifactId);
|
|
413
|
+
return join(this.projectCwd, ".otto", "artifacts", `${artifactId}.html`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
function generateArtifactId() {
|
|
417
|
+
return randomBytes(4).toString("hex");
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=artifact-service.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ArtifactMetadata, ArtifactRun, StoredArtifact } from "@otto-code/protocol/artifacts/types";
|
|
2
|
+
export type { ArtifactMetadata };
|
|
3
|
+
export declare function assertValidArtifactId(artifactId: string): void;
|
|
4
|
+
export declare class ArtifactStore {
|
|
5
|
+
private readonly projectCwd;
|
|
6
|
+
constructor(projectCwd: string);
|
|
7
|
+
private artifactsDir;
|
|
8
|
+
private metadataPath;
|
|
9
|
+
private htmlPath;
|
|
10
|
+
private ensureDir;
|
|
11
|
+
private readStored;
|
|
12
|
+
get(artifactId: string): Promise<ArtifactMetadata | null>;
|
|
13
|
+
inspect(artifactId: string): Promise<StoredArtifact | null>;
|
|
14
|
+
list(options?: {
|
|
15
|
+
projectId?: string;
|
|
16
|
+
}): Promise<ArtifactMetadata[]>;
|
|
17
|
+
create(metadata: ArtifactMetadata): Promise<void>;
|
|
18
|
+
update(artifactId: string, changes: Partial<ArtifactMetadata>): Promise<void>;
|
|
19
|
+
appendRun(artifactId: string, run: ArtifactRun): Promise<void>;
|
|
20
|
+
patchCurrentRun(artifactId: string, patch: Partial<ArtifactRun>): Promise<void>;
|
|
21
|
+
delete(artifactId: string): Promise<void>;
|
|
22
|
+
scanAll(projectRoots: string[]): Promise<ArtifactMetadata[]>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=artifact-store.d.ts.map
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { mkdir, readFile, readdir, rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { MAX_ARTIFACT_RUNS, StoredArtifactSchema } from "@otto-code/protocol/artifacts/types";
|
|
4
|
+
import { writeJsonFileAtomic } from "../atomic-file.js";
|
|
5
|
+
// Artifact ids are server-generated hex (randomBytes). Anything that reaches a
|
|
6
|
+
// filesystem path must be a single safe segment: reject separators, dots, and
|
|
7
|
+
// null bytes so a client- or agent-supplied id can never traverse out of the
|
|
8
|
+
// artifacts dir (e.g. "../../../../Users/x/secret" would otherwise let delete()
|
|
9
|
+
// unlink arbitrary paired *.json/*.html files, or inspect() read them).
|
|
10
|
+
const ARTIFACT_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
11
|
+
export function assertValidArtifactId(artifactId) {
|
|
12
|
+
if (!ARTIFACT_ID_PATTERN.test(artifactId)) {
|
|
13
|
+
throw new Error(`Invalid artifact id: ${JSON.stringify(artifactId)}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// Drop the run history off a stored record to get the lean metadata that
|
|
17
|
+
// list/get callers (and every broadcast/notification) work with. Keeping runs
|
|
18
|
+
// out of that shape means they never ride the wire on routine updates — only
|
|
19
|
+
// inspect() surfaces them.
|
|
20
|
+
function toMetadata(stored) {
|
|
21
|
+
const { runs: _runs, ...metadata } = stored;
|
|
22
|
+
return metadata;
|
|
23
|
+
}
|
|
24
|
+
export class ArtifactStore {
|
|
25
|
+
constructor(projectCwd) {
|
|
26
|
+
this.projectCwd = projectCwd;
|
|
27
|
+
}
|
|
28
|
+
artifactsDir() {
|
|
29
|
+
return join(this.projectCwd, ".otto", "artifacts");
|
|
30
|
+
}
|
|
31
|
+
metadataPath(artifactId) {
|
|
32
|
+
assertValidArtifactId(artifactId);
|
|
33
|
+
return join(this.artifactsDir(), `${artifactId}.json`);
|
|
34
|
+
}
|
|
35
|
+
htmlPath(artifactId) {
|
|
36
|
+
assertValidArtifactId(artifactId);
|
|
37
|
+
return join(this.artifactsDir(), `${artifactId}.html`);
|
|
38
|
+
}
|
|
39
|
+
async ensureDir() {
|
|
40
|
+
await mkdir(this.artifactsDir(), { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
// Read the full on-disk record, run history included. Everything else in the
|
|
43
|
+
// store layers on top of this: get()/list() strip runs, inspect() keeps them.
|
|
44
|
+
async readStored(artifactId) {
|
|
45
|
+
await this.ensureDir();
|
|
46
|
+
try {
|
|
47
|
+
const content = await readFile(this.metadataPath(artifactId), "utf-8");
|
|
48
|
+
return StoredArtifactSchema.parse(JSON.parse(content));
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (isEnoent(error)) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async get(artifactId) {
|
|
58
|
+
const stored = await this.readStored(artifactId);
|
|
59
|
+
return stored ? toMetadata(stored) : null;
|
|
60
|
+
}
|
|
61
|
+
// Full record with run history, for inspect_artifact. Returns null when the
|
|
62
|
+
// artifact doesn't exist so callers can raise their own not-found error.
|
|
63
|
+
async inspect(artifactId) {
|
|
64
|
+
return this.readStored(artifactId);
|
|
65
|
+
}
|
|
66
|
+
async list(options) {
|
|
67
|
+
await this.ensureDir();
|
|
68
|
+
const entries = await readdir(this.artifactsDir(), { withFileTypes: true });
|
|
69
|
+
const results = await Promise.all(entries
|
|
70
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".json"))
|
|
71
|
+
.map(async (entry) => {
|
|
72
|
+
try {
|
|
73
|
+
const content = await readFile(join(this.artifactsDir(), entry.name), "utf-8");
|
|
74
|
+
return toMetadata(StoredArtifactSchema.parse(JSON.parse(content)));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
const valid = results.filter((m) => m !== null);
|
|
81
|
+
const sorted = valid.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
82
|
+
if (options?.projectId) {
|
|
83
|
+
return sorted.filter((m) => m.projectId === options.projectId);
|
|
84
|
+
}
|
|
85
|
+
return sorted;
|
|
86
|
+
}
|
|
87
|
+
async create(metadata) {
|
|
88
|
+
await this.ensureDir();
|
|
89
|
+
const stored = { ...metadata, runs: [] };
|
|
90
|
+
await writeJsonFileAtomic(this.metadataPath(metadata.id), stored);
|
|
91
|
+
}
|
|
92
|
+
async update(artifactId, changes) {
|
|
93
|
+
await this.ensureDir();
|
|
94
|
+
const existing = await this.readStored(artifactId);
|
|
95
|
+
if (!existing) {
|
|
96
|
+
throw new Error(`Artifact "${artifactId}" not found`);
|
|
97
|
+
}
|
|
98
|
+
const updated = {
|
|
99
|
+
...existing,
|
|
100
|
+
...changes,
|
|
101
|
+
updatedAt: new Date().toISOString(),
|
|
102
|
+
};
|
|
103
|
+
await writeJsonFileAtomic(this.metadataPath(artifactId), updated);
|
|
104
|
+
}
|
|
105
|
+
// Append a generation attempt to the run history, oldest entries pruned so the
|
|
106
|
+
// on-disk log stays bounded. Does not touch updatedAt — the run's own
|
|
107
|
+
// timestamps carry that, and the accompanying status update bumps it.
|
|
108
|
+
async appendRun(artifactId, run) {
|
|
109
|
+
await this.ensureDir();
|
|
110
|
+
const existing = await this.readStored(artifactId);
|
|
111
|
+
if (!existing) {
|
|
112
|
+
throw new Error(`Artifact "${artifactId}" not found`);
|
|
113
|
+
}
|
|
114
|
+
const runs = [...existing.runs, run].slice(-MAX_ARTIFACT_RUNS);
|
|
115
|
+
const updated = { ...existing, runs };
|
|
116
|
+
await writeJsonFileAtomic(this.metadataPath(artifactId), updated);
|
|
117
|
+
}
|
|
118
|
+
// Patch the current (most recent still-"running") run — to stamp its agent id
|
|
119
|
+
// once known, or to close it out as succeeded/failed. No-ops when there's no
|
|
120
|
+
// running run, so completion handlers can fire unconditionally.
|
|
121
|
+
async patchCurrentRun(artifactId, patch) {
|
|
122
|
+
await this.ensureDir();
|
|
123
|
+
const existing = await this.readStored(artifactId);
|
|
124
|
+
if (!existing) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const index = findLastRunningIndex(existing.runs);
|
|
128
|
+
if (index === -1) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const runs = existing.runs.map((run, i) => (i === index ? { ...run, ...patch } : run));
|
|
132
|
+
const updated = { ...existing, runs };
|
|
133
|
+
await writeJsonFileAtomic(this.metadataPath(artifactId), updated);
|
|
134
|
+
}
|
|
135
|
+
async delete(artifactId) {
|
|
136
|
+
await this.ensureDir();
|
|
137
|
+
await rm(this.metadataPath(artifactId), { force: true });
|
|
138
|
+
await rm(this.htmlPath(artifactId), { force: true });
|
|
139
|
+
}
|
|
140
|
+
async scanAll(projectRoots) {
|
|
141
|
+
const stores = projectRoots.map((root) => new ArtifactStore(root));
|
|
142
|
+
const results = await Promise.all(stores.map(async (store) => {
|
|
143
|
+
try {
|
|
144
|
+
return await store.list();
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
}));
|
|
150
|
+
return results
|
|
151
|
+
.flat()
|
|
152
|
+
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function isEnoent(error) {
|
|
156
|
+
return error.code === "ENOENT";
|
|
157
|
+
}
|
|
158
|
+
// Index of the last run still in flight — the one a success/failure handler
|
|
159
|
+
// should close out. Returns -1 when nothing is running.
|
|
160
|
+
function findLastRunningIndex(runs) {
|
|
161
|
+
for (let i = runs.length - 1; i >= 0; i--) {
|
|
162
|
+
if (runs[i].status === "running") {
|
|
163
|
+
return i;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return -1;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=artifact-store.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
import type { ArtifactMetadata } from "@otto-code/protocol/artifacts/types";
|
|
3
|
+
import type { ArtifactStore } from "./artifact-store.js";
|
|
4
|
+
interface ArtifactWatcherOptions {
|
|
5
|
+
store: ArtifactStore;
|
|
6
|
+
logger: Logger;
|
|
7
|
+
sendNotification: (metadata: ArtifactMetadata) => void;
|
|
8
|
+
timeoutMs: number;
|
|
9
|
+
onTimeout: (artifactId: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare class ArtifactWatcher {
|
|
12
|
+
private readonly store;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private readonly sendNotification;
|
|
15
|
+
private readonly timeoutMs;
|
|
16
|
+
private readonly onTimeout;
|
|
17
|
+
private readonly activeWatchers;
|
|
18
|
+
private readonly handles;
|
|
19
|
+
private batchPollTimer;
|
|
20
|
+
constructor(options: ArtifactWatcherOptions);
|
|
21
|
+
watch(artifactId: string, filePath: string, onReady?: () => void): void;
|
|
22
|
+
unwatch(artifactId: string): void;
|
|
23
|
+
stop(): void;
|
|
24
|
+
private cleanupHandle;
|
|
25
|
+
private startBatchPolling;
|
|
26
|
+
private stopBatchPolling;
|
|
27
|
+
private checkFileReady;
|
|
28
|
+
private writeSanitizedContent;
|
|
29
|
+
private updateToReady;
|
|
30
|
+
private handleTimeout;
|
|
31
|
+
private emitUpdatedNotification;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=artifact-watcher.d.ts.map
|