@hyperdrive.bot/paseo-server 0.2.6
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/extensions/daemon-backend.d.ts +11 -0
- package/dist/server/extensions/daemon-backend.js +146 -0
- package/dist/server/extensions/extension-host-manager.d.ts +48 -0
- package/dist/server/extensions/extension-host-manager.js +141 -0
- package/dist/server/extensions/extension-loader.d.ts +11 -0
- package/dist/server/extensions/extension-loader.js +47 -0
- package/dist/server/extensions/extension-service.d.ts +17 -0
- package/dist/server/extensions/extension-service.js +76 -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 +12 -0
- package/dist/server/server/agent/agent-loading.js +55 -0
- package/dist/server/server/agent/agent-manager.d.ts +462 -0
- package/dist/server/server/agent/agent-manager.js +2955 -0
- package/dist/server/server/agent/agent-projections.d.ts +26 -0
- package/dist/server/server/agent/agent-projections.js +404 -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 +67 -0
- package/dist/server/server/agent/agent-response-loop.js +326 -0
- package/dist/server/server/agent/agent-routes.d.ts +18 -0
- package/dist/server/server/agent/agent-routes.js +107 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts +677 -0
- package/dist/server/server/agent/agent-sdk-types.js +22 -0
- package/dist/server/server/agent/agent-storage.d.ts +152 -0
- package/dist/server/server/agent/agent-storage.js +342 -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 +83 -0
- package/dist/server/server/agent/create-agent/create.js +289 -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/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 +22 -0
- package/dist/server/server/agent/mcp-server.js +544 -0
- package/dist/server/server/agent/mcp-shared.d.ts +193 -0
- package/dist/server/server/agent/mcp-shared.js +197 -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/prompt-attachments.d.ts +7 -0
- package/dist/server/server/agent/prompt-attachments.js +90 -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 +51 -0
- package/dist/server/server/agent/provider-launch-config.js +183 -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 +49 -0
- package/dist/server/server/agent/provider-registry.js +578 -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 +137 -0
- package/dist/server/server/agent/provider-snapshot-manager.js +694 -0
- package/dist/server/server/agent/providers/acp-agent.d.ts +354 -0
- package/dist/server/server/agent/providers/acp-agent.js +2438 -0
- package/dist/server/server/agent/providers/claude/agent.d.ts +341 -0
- package/dist/server/server/agent/providers/claude/agent.js +4606 -0
- package/dist/server/server/agent/providers/claude/background-shell-kill-keys.d.ts +32 -0
- package/dist/server/server/agent/providers/claude/background-shell-kill-keys.js +34 -0
- package/dist/server/server/agent/providers/claude/background-task-tracker.d.ts +49 -0
- package/dist/server/server/agent/providers/claude/background-task-tracker.js +119 -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/hook-handler.d.ts +37 -0
- package/dist/server/server/agent/providers/claude/hook-handler.js +193 -0
- package/dist/server/server/agent/providers/claude/hooks/event-translator.d.ts +49 -0
- package/dist/server/server/agent/providers/claude/hooks/event-translator.js +151 -0
- package/dist/server/server/agent/providers/claude/image-compression.d.ts +10 -0
- package/dist/server/server/agent/providers/claude/image-compression.js +32 -0
- package/dist/server/server/agent/providers/claude/model-manifest.d.ts +104 -0
- package/dist/server/server/agent/providers/claude/model-manifest.js +221 -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/pty-session-launcher.d.ts +41 -0
- package/dist/server/server/agent/providers/claude/pty-session-launcher.js +131 -0
- package/dist/server/server/agent/providers/claude/resume-source.d.ts +11 -0
- package/dist/server/server/agent/providers/claude/resume-source.js +37 -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/spawn-config-writer.d.ts +70 -0
- package/dist/server/server/agent/providers/claude/spawn-config-writer.js +229 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +47 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +292 -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/claude/transport/claude-paths.d.ts +31 -0
- package/dist/server/server/agent/providers/claude/transport/claude-paths.js +63 -0
- package/dist/server/server/agent/providers/claude/transport/continue-flag.d.ts +31 -0
- package/dist/server/server/agent/providers/claude/transport/continue-flag.js +42 -0
- package/dist/server/server/agent/providers/claude/transport/pty-query.d.ts +62 -0
- package/dist/server/server/agent/providers/claude/transport/pty-query.js +265 -0
- package/dist/server/server/agent/providers/claude/transport/pty.d.ts +50 -0
- package/dist/server/server/agent/providers/claude/transport/pty.js +211 -0
- package/dist/server/server/agent/providers/claude/transport/redact.d.ts +2 -0
- package/dist/server/server/agent/providers/claude/transport/redact.js +5 -0
- package/dist/server/server/agent/providers/claude/transport/sdk.d.ts +63 -0
- package/dist/server/server/agent/providers/claude/transport/sdk.js +207 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.d.ts +27 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.js +162 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-tailer.d.ts +28 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-tailer.js +166 -0
- package/dist/server/server/agent/providers/claude/transport/truncate-session.d.ts +41 -0
- package/dist/server/server/agent/providers/claude/transport/truncate-session.js +86 -0
- package/dist/server/server/agent/providers/claude/transport/types.d.ts +47 -0
- package/dist/server/server/agent/providers/claude/transport/types.js +2 -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 +4514 -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 +187 -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 +161 -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/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 +268 -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 +2857 -0
- package/dist/server/server/agent/providers/pi/agent.d.ts +137 -0
- package/dist/server/server/agent/providers/pi/agent.js +1650 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.js +233 -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/recordings-debug.d.ts +3 -0
- package/dist/server/server/agent/recordings-debug.js +19 -0
- package/dist/server/server/agent/render-file-attachment.d.ts +29 -0
- package/dist/server/server/agent/render-file-attachment.js +41 -0
- package/dist/server/server/agent/resolve-resume-cwd.d.ts +14 -0
- package/dist/server/server/agent/resolve-resume-cwd.js +49 -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/session-digest-generator.d.ts +37 -0
- package/dist/server/server/agent/session-digest-generator.js +115 -0
- package/dist/server/server/agent/session-digest.d.ts +35 -0
- package/dist/server/server/agent/session-digest.js +104 -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/paseo-tools.d.ts +54 -0
- package/dist/server/server/agent/tools/paseo-tools.js +2197 -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/wait-for-agent-tracker.d.ts +15 -0
- package/dist/server/server/agent/wait-for-agent-tracker.js +53 -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/atomic-file.d.ts +3 -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 +126 -0
- package/dist/server/server/bootstrap.js +1193 -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 +16 -0
- package/dist/server/server/browser-tools/tools.js +845 -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 +102 -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 +17 -0
- package/dist/server/server/config.js +320 -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 +25 -0
- package/dist/server/server/daemon-config-store.js +194 -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/editor-targets.d.ts +18 -0
- package/dist/server/server/editor-targets.js +109 -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/file-download-frames.d.ts +27 -0
- package/dist/server/server/file-explorer/file-download-frames.js +47 -0
- package/dist/server/server/file-explorer/service.d.ts +75 -0
- package/dist/server/server/file-explorer/service.js +308 -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 +769 -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/meetings/capture-http.d.ts +3 -0
- package/dist/server/server/meetings/capture-http.js +71 -0
- package/dist/server/server/meetings/capture-orchestrator.d.ts +123 -0
- package/dist/server/server/meetings/capture-orchestrator.js +531 -0
- package/dist/server/server/meetings/capture-stream-ws.d.ts +42 -0
- package/dist/server/server/meetings/capture-stream-ws.js +68 -0
- package/dist/server/server/meetings/live-transcription.d.ts +57 -0
- package/dist/server/server/meetings/live-transcription.js +280 -0
- package/dist/server/server/meetings/meetings-http.d.ts +42 -0
- package/dist/server/server/meetings/meetings-http.js +266 -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/monitoring/telemetry.d.ts +13 -0
- package/dist/server/server/monitoring/telemetry.js +21 -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/paseo-env.d.ts +13 -0
- package/dist/server/server/paseo-env.js +53 -0
- package/dist/server/server/paseo-home.d.ts +2 -0
- package/dist/server/server/paseo-home.js +19 -0
- package/dist/server/server/paseo-worktree-service.d.ts +52 -0
- package/dist/server/server/paseo-worktree-service.js +294 -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 +333 -0
- package/dist/server/server/persisted-config.js +402 -0
- package/dist/server/server/persistence-hooks.d.ts +32 -0
- package/dist/server/server/persistence-hooks.js +97 -0
- package/dist/server/server/pid-lock.d.ts +32 -0
- package/dist/server/server/pid-lock.js +170 -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/categories.d.ts +35 -0
- package/dist/server/server/push/categories.js +40 -0
- package/dist/server/server/push/expo-worker.d.ts +51 -0
- package/dist/server/server/push/expo-worker.js +149 -0
- package/dist/server/server/push/index.d.ts +39 -0
- package/dist/server/server/push/index.js +45 -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/routes.d.ts +28 -0
- package/dist/server/server/push/routes.js +74 -0
- package/dist/server/server/push/subscriptions.d.ts +42 -0
- package/dist/server/server/push/subscriptions.js +112 -0
- package/dist/server/server/push/token-store.d.ts +29 -0
- package/dist/server/server/push/token-store.js +78 -0
- package/dist/server/server/push/triggers.d.ts +68 -0
- package/dist/server/server/push/triggers.js +103 -0
- package/dist/server/server/push/vapid-keys.d.ts +15 -0
- package/dist/server/server/push/vapid-keys.js +52 -0
- package/dist/server/server/push/web-worker.d.ts +44 -0
- package/dist/server/server/push/web-worker.js +99 -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 +52 -0
- package/dist/server/server/schedule/service.js +628 -0
- package/dist/server/server/schedule/store.d.ts +13 -0
- package/dist/server/server/schedule/store.js +57 -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 +50 -0
- package/dist/server/server/session/agent-config/agent-config-session.js +98 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -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 +140 -0
- package/dist/server/server/session/checkout/checkout-session.js +927 -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 +43 -0
- package/dist/server/server/session/files/workspace-files-session.js +218 -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/session-rename-route.d.ts +4 -0
- package/dist/server/server/session/session-rename-route.js +71 -0
- package/dist/server/server/session/session-rename-service.d.ts +25 -0
- package/dist/server/server/session/session-rename-service.js +76 -0
- package/dist/server/server/session/voice/voice-session.d.ts +166 -0
- package/dist/server/server/session/voice/voice-session.js +893 -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 +562 -0
- package/dist/server/server/session.js +5787 -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 +134 -0
- package/dist/server/server/speech/providers/local/models.d.ts +11 -0
- package/dist/server/server/speech/providers/local/models.js +17 -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 +56 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +74 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +142 -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 +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +101 -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/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 +611 -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 +95 -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 +148 -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 +19 -0
- package/dist/server/server/speech/providers/openai/tts.js +48 -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 +59 -0
- package/dist/server/server/speech/speech-provider.js +2 -0
- package/dist/server/server/speech/speech-runtime.d.ts +45 -0
- package/dist/server/server/speech/speech-runtime.js +562 -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/uploads/file-attachment-validation.d.ts +61 -0
- package/dist/server/server/uploads/file-attachment-validation.js +56 -0
- package/dist/server/server/uploads/staging-service.d.ts +91 -0
- package/dist/server/server/uploads/staging-service.js +144 -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/voice-turn-controller.d.ts +38 -0
- package/dist/server/server/voice/voice-turn-controller.js +393 -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/watch/composer-dictate.d.ts +42 -0
- package/dist/server/server/watch/composer-dictate.js +37 -0
- package/dist/server/server/watch/notification-action.d.ts +38 -0
- package/dist/server/server/watch/notification-action.js +54 -0
- package/dist/server/server/watch/notification-registry.d.ts +16 -0
- package/dist/server/server/watch/notification-registry.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 +193 -0
- package/dist/server/server/websocket-server.js +1768 -0
- package/dist/server/server/workflow/workflow-feature.d.ts +2 -0
- package/dist/server/server/workflow/workflow-feature.js +8 -0
- package/dist/server/server/workflow/workflow-http-routes.d.ts +27 -0
- package/dist/server/server/workflow/workflow-http-routes.js +97 -0
- package/dist/server/server/workflow/workflow-manager.d.ts +228 -0
- package/dist/server/server/workflow/workflow-manager.js +444 -0
- package/dist/server/server/workflow/workflow-progress.d.ts +95 -0
- package/dist/server/server/workflow/workflow-progress.js +178 -0
- package/dist/server/server/workflow/workflow-storage.d.ts +36 -0
- package/dist/server/server/workflow/workflow-storage.js +143 -0
- package/dist/server/server/workspace/all-sessions-route.d.ts +32 -0
- package/dist/server/server/workspace/all-sessions-route.js +138 -0
- package/dist/server/server/workspace/session-openable.d.ts +16 -0
- package/dist/server/server/workspace/session-openable.js +48 -0
- package/dist/server/server/workspace/sessions-route.d.ts +15 -0
- package/dist/server/server/workspace/sessions-route.js +108 -0
- package/dist/server/server/workspace/sessions-search-route.d.ts +68 -0
- package/dist/server/server/workspace/sessions-search-route.js +203 -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 +257 -0
- package/dist/server/server/workspace-git-service.js +1386 -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/github-service.d.ts +337 -0
- package/dist/server/services/github-service.js +2101 -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/paseo-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 +1161 -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 +2238 -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/paseo-config-file.d.ts +30 -0
- package/dist/server/utils/paseo-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 +33 -0
- package/dist/server/utils/spawn.js +71 -0
- package/dist/server/utils/string-command-shell.d.ts +10 -0
- package/dist/server/utils/string-command-shell.js +21 -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 +1119 -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-127b8d280bb901a810b0c9fa094d4945.js +5 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js +16533 -0
- package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js +5 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js +11 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js +60 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.map.gz +0 -0
- package/dist/server/web-ui/apple-touch-icon.png +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/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.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/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.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
- package/dist/server/web-ui/favicon.ico +0 -0
- package/dist/server/web-ui/index.html +90 -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/server/web-ui/service-worker.js +87 -0
- package/dist/server/web-ui/service-worker.js.br +0 -0
- package/dist/server/web-ui/service-worker.js.gz +0 -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 +183 -0
- package/dist/src/server/paseo-env.js +53 -0
- package/dist/src/server/paseo-home.js +19 -0
- package/dist/src/server/persisted-config.js +402 -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/paseo-integration.zsh +32 -0
- package/dist/src/utils/spawn.js +71 -0
- package/dist/src/utils/windows-command.js +41 -0
- package/package.json +143 -0
|
@@ -0,0 +1,1193 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { createServer as createHTTPServer } from "http";
|
|
3
|
+
import { constants, existsSync, unlinkSync } from "fs";
|
|
4
|
+
import { open } from "fs/promises";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { hostname as getHostname } from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { createBranchChangeRouteHandler } from "./script-route-branch-handler.js";
|
|
11
|
+
function resolveBoundListenTarget(listenTarget, httpServer) {
|
|
12
|
+
if (listenTarget.type !== "tcp") {
|
|
13
|
+
return listenTarget;
|
|
14
|
+
}
|
|
15
|
+
const address = httpServer.address();
|
|
16
|
+
if (!address || typeof address === "string") {
|
|
17
|
+
throw new Error("HTTP server did not expose a TCP address after listening");
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
type: "tcp",
|
|
21
|
+
host: listenTarget.host,
|
|
22
|
+
port: address.port,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Matches a Windows drive-letter path like C:\ or D:\
|
|
26
|
+
const WINDOWS_DRIVE_RE = /^[A-Za-z]:\\/;
|
|
27
|
+
export function parseListenString(listen) {
|
|
28
|
+
// 1. Windows named pipes: \\.\pipe\... or pipe://...
|
|
29
|
+
if (listen.startsWith("\\\\.\\pipe\\") || listen.startsWith("pipe://")) {
|
|
30
|
+
return {
|
|
31
|
+
type: "pipe",
|
|
32
|
+
path: listen.startsWith("pipe://") ? listen.slice("pipe://".length) : listen,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// 2. Explicit unix:// prefix
|
|
36
|
+
if (listen.startsWith("unix://")) {
|
|
37
|
+
return { type: "socket", path: listen.slice(7) };
|
|
38
|
+
}
|
|
39
|
+
// 3. Reject Windows absolute drive paths — they are not Unix sockets
|
|
40
|
+
if (WINDOWS_DRIVE_RE.test(listen)) {
|
|
41
|
+
throw new Error(`Invalid listen string (Windows path is not a valid listen target): ${listen}`);
|
|
42
|
+
}
|
|
43
|
+
// 4. POSIX absolute path (/ or ~) — Unix socket
|
|
44
|
+
if (listen.startsWith("/") || listen.startsWith("~")) {
|
|
45
|
+
return { type: "socket", path: listen };
|
|
46
|
+
}
|
|
47
|
+
// 5. Pure numeric — TCP port on 127.0.0.1
|
|
48
|
+
const trimmed = listen.trim();
|
|
49
|
+
if (/^\d+$/.test(trimmed)) {
|
|
50
|
+
const port = parseInt(trimmed, 10);
|
|
51
|
+
return { type: "tcp", host: "127.0.0.1", port };
|
|
52
|
+
}
|
|
53
|
+
// 6. host:port — TCP
|
|
54
|
+
if (listen.includes(":")) {
|
|
55
|
+
const lastColonIdx = listen.lastIndexOf(":");
|
|
56
|
+
const host = listen.slice(0, lastColonIdx);
|
|
57
|
+
const portStr = listen.slice(lastColonIdx + 1);
|
|
58
|
+
const parsedPort = parseInt(portStr, 10);
|
|
59
|
+
if (!Number.isFinite(parsedPort)) {
|
|
60
|
+
throw new Error(`Invalid port in listen string: ${listen}`);
|
|
61
|
+
}
|
|
62
|
+
const cleanHost = host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
|
|
63
|
+
return { type: "tcp", host: cleanHost || "127.0.0.1", port: parsedPort };
|
|
64
|
+
}
|
|
65
|
+
throw new Error(`Invalid listen string: ${listen}`);
|
|
66
|
+
}
|
|
67
|
+
function formatListenTarget(listenTarget) {
|
|
68
|
+
if (!listenTarget) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
if (listenTarget.type === "tcp") {
|
|
72
|
+
return `${listenTarget.host}:${listenTarget.port}`;
|
|
73
|
+
}
|
|
74
|
+
return listenTarget.path;
|
|
75
|
+
}
|
|
76
|
+
import { VoiceAssistantWebSocketServer } from "./websocket-server.js";
|
|
77
|
+
import { createPushSubsystem } from "./push/index.js";
|
|
78
|
+
import { registerPushRoutes } from "./push/routes.js";
|
|
79
|
+
import { registerAllSessionsRoute } from "./workspace/all-sessions-route.js";
|
|
80
|
+
import { registerSessionsSearchRoute } from "./workspace/sessions-search-route.js";
|
|
81
|
+
import { registerWorkspaceSessionsRoute } from "./workspace/sessions-route.js";
|
|
82
|
+
import { PushSubscriptionStore } from "./push/subscriptions.js";
|
|
83
|
+
import { loadOrGenerateVapidKeys } from "./push/vapid-keys.js";
|
|
84
|
+
import { createGitHubService } from "../services/github-service.js";
|
|
85
|
+
import { createPaseoWorktree as createRegisteredPaseoWorktree, createLocalCheckoutWorkspace, } from "./paseo-worktree-service.js";
|
|
86
|
+
import { createPaseoWorktreeWorkflow } from "./worktree-session.js";
|
|
87
|
+
import { DownloadTokenStore } from "./file-download/token-store.js";
|
|
88
|
+
import { registerMeetingsRoutes } from "./meetings/meetings-http.js";
|
|
89
|
+
import { registerCaptureRoutes } from "./meetings/capture-http.js";
|
|
90
|
+
import { getCaptureStreamWs } from "./meetings/capture-stream-ws.js";
|
|
91
|
+
import { createSpeechService } from "./speech/speech-runtime.js";
|
|
92
|
+
import { AgentManager } from "./agent/agent-manager.js";
|
|
93
|
+
import { scheduleSessionDigestRefresh } from "./agent/session-digest-generator.js";
|
|
94
|
+
import { registerAgentRoutes } from "./agent/agent-routes.js";
|
|
95
|
+
import { AgentStorage } from "./agent/agent-storage.js";
|
|
96
|
+
import { attachAgentStoragePersistence } from "./persistence-hooks.js";
|
|
97
|
+
import { WorkflowStorage } from "./workflow/workflow-storage.js";
|
|
98
|
+
import { WORKFLOWS_FEATURE_ENABLED } from "./workflow/workflow-feature.js";
|
|
99
|
+
import { registerWorkflowHttpRoutes } from "./workflow/workflow-http-routes.js";
|
|
100
|
+
import { WorkflowManager } from "./workflow/workflow-manager.js";
|
|
101
|
+
import { createAgentMcpServer } from "./agent/mcp-server.js";
|
|
102
|
+
import { createPaseoToolCatalog, } from "./agent/tools/paseo-tools.js";
|
|
103
|
+
import { ProviderSnapshotManager } from "./agent/provider-snapshot-manager.js";
|
|
104
|
+
import { bootstrapWorkspaceRegistries } from "./workspace-registry-bootstrap.js";
|
|
105
|
+
import { WorkspaceReconciliationService } from "./workspace-reconciliation-service.js";
|
|
106
|
+
import { FileBackedProjectRegistry, FileBackedWorkspaceRegistry } from "./workspace-registry.js";
|
|
107
|
+
import { FileBackedChatService } from "./chat/chat-service.js";
|
|
108
|
+
import { CheckoutDiffManager } from "./checkout-diff-manager.js";
|
|
109
|
+
import { LoopService } from "./loop-service.js";
|
|
110
|
+
import { ScheduleService } from "./schedule/service.js";
|
|
111
|
+
import { createExtensionService } from "../extensions/extension-service.js";
|
|
112
|
+
import { DaemonConfigStore } from "./daemon-config-store.js";
|
|
113
|
+
import { BrowserToolsBroker } from "./browser-tools/broker.js";
|
|
114
|
+
import { DaemonConfigBrowserToolsPolicy } from "./browser-tools/policy.js";
|
|
115
|
+
import { WorkspaceGitServiceImpl } from "./workspace-git-service.js";
|
|
116
|
+
import { resolveWorkspaceIdForPath } from "./resolve-workspace-id-for-path.js";
|
|
117
|
+
import { archivePersistedWorkspaceRecord, } from "./workspace-archive-service.js";
|
|
118
|
+
import { setupAutoArchiveOnMerge } from "./auto-archive-on-merge/index.js";
|
|
119
|
+
import { wrapSessionMessage } from "./messages.js";
|
|
120
|
+
import { createConfiguredTerminalManager } from "../terminal/terminal-manager-factory.js";
|
|
121
|
+
import { applyTerminalAgentHookSetting } from "../terminal/agent-hooks/terminal-agent-hook-setting.js";
|
|
122
|
+
import { createConnectionOfferV2, encodeOfferToFragmentUrl } from "./connection-offer.js";
|
|
123
|
+
import { loadOrCreateDaemonKeyPair } from "./daemon-keypair.js";
|
|
124
|
+
import { startRelayTransport } from "./relay-transport.js";
|
|
125
|
+
import { getOrCreateServerId } from "./server-id.js";
|
|
126
|
+
import { resolveDaemonVersion } from "./daemon-version.js";
|
|
127
|
+
import { createServiceProxySubsystem } from "./service-proxy.js";
|
|
128
|
+
import { ScriptHealthMonitor } from "./script-health-monitor.js";
|
|
129
|
+
import { createScriptStatusEmitter } from "./script-status-projection.js";
|
|
130
|
+
import { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js";
|
|
131
|
+
import { createManagedProcessRegistry, createSystemManagedProcessTable, } from "./managed-processes/managed-processes.js";
|
|
132
|
+
import { terminateWithTreeKill } from "../utils/tree-kill.js";
|
|
133
|
+
import { isHostnameAllowed } from "./hostnames.js";
|
|
134
|
+
import { createRequireBearerMiddleware, isAgentMcpRequestAuthorized, } from "./auth.js";
|
|
135
|
+
import { createWebUiMiddleware } from "./web-ui.js";
|
|
136
|
+
import { registerSessionRenameRoute } from "./session/session-rename-route.js";
|
|
137
|
+
import { WorkspaceAutoName } from "./workspace-auto-name.js";
|
|
138
|
+
import { createGitMutationService } from "./session/git-mutation/git-mutation-service.js";
|
|
139
|
+
import { workspaceIdsOnCheckout } from "./workspace-directory.js";
|
|
140
|
+
import { resolveFirstAgentPromptTitle } from "./agent/create-agent-title.js";
|
|
141
|
+
const MAX_MCP_DEBUG_BATCH_ITEMS = 10;
|
|
142
|
+
const REDACTED_LOG_VALUE = "[redacted]";
|
|
143
|
+
const DOWNLOAD_OPEN_FLAGS = process.platform === "win32" ? constants.O_RDONLY : constants.O_RDONLY | constants.O_NOFOLLOW;
|
|
144
|
+
function formatHostForHttpUrl(host) {
|
|
145
|
+
return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
|
|
146
|
+
}
|
|
147
|
+
function resolveAgentMcpClientHost(host) {
|
|
148
|
+
if (host === "0.0.0.0") {
|
|
149
|
+
return "127.0.0.1";
|
|
150
|
+
}
|
|
151
|
+
if (host === "::" || host === "[::]") {
|
|
152
|
+
return "::1";
|
|
153
|
+
}
|
|
154
|
+
return host;
|
|
155
|
+
}
|
|
156
|
+
function createAgentMcpBaseUrl(listenTarget) {
|
|
157
|
+
if (!listenTarget || listenTarget.type !== "tcp") {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
const host = resolveAgentMcpClientHost(listenTarget.host);
|
|
161
|
+
return new URL("/mcp/agents", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
|
|
162
|
+
}
|
|
163
|
+
function createTerminalActivityUrl(listenTarget) {
|
|
164
|
+
if (!listenTarget || listenTarget.type !== "tcp") {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const host = resolveAgentMcpClientHost(listenTarget.host);
|
|
168
|
+
return new URL("/api/terminal-activity", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
|
|
169
|
+
}
|
|
170
|
+
const TerminalActivityReportSchema = z.object({
|
|
171
|
+
terminalId: z.string().min(1),
|
|
172
|
+
token: z.string().min(1),
|
|
173
|
+
state: z.enum(["running", "idle", "needs-input"]),
|
|
174
|
+
});
|
|
175
|
+
const TERMINAL_ACTIVITY_STATE_MAP = {
|
|
176
|
+
running: "working",
|
|
177
|
+
idle: "idle",
|
|
178
|
+
"needs-input": "attention",
|
|
179
|
+
};
|
|
180
|
+
const LOOPBACK_REMOTE_ADDRESSES = new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
|
|
181
|
+
function isLoopbackRemoteAddress(remoteAddress) {
|
|
182
|
+
return remoteAddress !== undefined && LOOPBACK_REMOTE_ADDRESSES.has(remoteAddress);
|
|
183
|
+
}
|
|
184
|
+
export function createTerminalActivityRouteHandler(terminalManager) {
|
|
185
|
+
return async (req, res) => {
|
|
186
|
+
if (!isLoopbackRemoteAddress(req.socket.remoteAddress)) {
|
|
187
|
+
res.status(403).json({ error: "Forbidden" });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const parsed = TerminalActivityReportSchema.safeParse(req.body);
|
|
191
|
+
if (!parsed.success) {
|
|
192
|
+
res.status(400).json({ error: "Invalid terminal activity report" });
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const validation = terminalManager.validateTerminalActivityToken(parsed.data.terminalId, parsed.data.token);
|
|
196
|
+
if (validation !== "valid") {
|
|
197
|
+
res.status(403).json({ error: "Forbidden" });
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
const updated = await terminalManager.setTerminalActivity(parsed.data.terminalId, TERMINAL_ACTIVITY_STATE_MAP[parsed.data.state]);
|
|
202
|
+
if (!updated) {
|
|
203
|
+
res.status(403).json({ error: "Forbidden" });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
res.status(204).end();
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
res.status(500).json({ error: "Failed to update terminal activity" });
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function summarizeAgentMcpDebugMessage(body) {
|
|
214
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) {
|
|
215
|
+
return {
|
|
216
|
+
type: body === null ? "null" : typeof body,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
const record = body;
|
|
220
|
+
const method = typeof record.method === "string" ? record.method : undefined;
|
|
221
|
+
return {
|
|
222
|
+
type: "object",
|
|
223
|
+
...(typeof record.jsonrpc === "string" ? { jsonrpc: record.jsonrpc } : {}),
|
|
224
|
+
...(method ? { method } : {}),
|
|
225
|
+
hasId: Object.prototype.hasOwnProperty.call(record, "id"),
|
|
226
|
+
hasParams: Object.prototype.hasOwnProperty.call(record, "params"),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function summarizeAgentMcpDebugBody(body) {
|
|
230
|
+
if (!Array.isArray(body)) {
|
|
231
|
+
return summarizeAgentMcpDebugMessage(body);
|
|
232
|
+
}
|
|
233
|
+
const messages = body.slice(0, MAX_MCP_DEBUG_BATCH_ITEMS).map(summarizeAgentMcpDebugMessage);
|
|
234
|
+
return {
|
|
235
|
+
type: "batch",
|
|
236
|
+
count: body.length,
|
|
237
|
+
messages,
|
|
238
|
+
...(body.length > messages.length ? { omitted: body.length - messages.length } : {}),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function createBootstrapManagedProcessRegistry(config, logger) {
|
|
242
|
+
if (config.managedProcesses) {
|
|
243
|
+
return config.managedProcesses;
|
|
244
|
+
}
|
|
245
|
+
return createManagedProcessRegistry({
|
|
246
|
+
paseoHome: config.paseoHome,
|
|
247
|
+
processTable: createSystemManagedProcessTable(),
|
|
248
|
+
terminateProcess: terminateWithTreeKill,
|
|
249
|
+
logger,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
async function reconcileManagedProcessLedger(managedProcesses, logger) {
|
|
253
|
+
const reapResult = await managedProcesses.reapStale();
|
|
254
|
+
if (reapResult.checked > 0 || reapResult.errors.length > 0) {
|
|
255
|
+
logger.info(reapResult, "Managed helper process ledger reconciled");
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function mountWebUi(app, config, logger) {
|
|
259
|
+
app.use(createWebUiMiddleware({
|
|
260
|
+
enabled: config.webUi?.enabled ?? false,
|
|
261
|
+
distDir: config.webUi?.distDir ?? null,
|
|
262
|
+
label: getHostname(),
|
|
263
|
+
logger,
|
|
264
|
+
}));
|
|
265
|
+
}
|
|
266
|
+
function resolveExpressTrustProxySetting(config) {
|
|
267
|
+
return config.trustedProxies ?? ["loopback"];
|
|
268
|
+
}
|
|
269
|
+
function createInitialMutableDaemonConfig(config) {
|
|
270
|
+
const providers = Object.fromEntries(Object.entries(config.providerOverrides ?? {}).map(([providerId, override]) => {
|
|
271
|
+
const providerConfig = {};
|
|
272
|
+
if (override.enabled !== undefined) {
|
|
273
|
+
providerConfig.enabled = override.enabled;
|
|
274
|
+
}
|
|
275
|
+
if (override.additionalModels) {
|
|
276
|
+
providerConfig.additionalModels = override.additionalModels;
|
|
277
|
+
}
|
|
278
|
+
return [providerId, providerConfig];
|
|
279
|
+
}));
|
|
280
|
+
const initialConfig = {
|
|
281
|
+
mcp: { injectIntoAgents: config.mcpInjectIntoAgents ?? true },
|
|
282
|
+
browserTools: { enabled: config.browserToolsEnabled ?? false },
|
|
283
|
+
providers,
|
|
284
|
+
metadataGeneration: {
|
|
285
|
+
providers: config.metadataGeneration?.providers ?? [],
|
|
286
|
+
},
|
|
287
|
+
autoArchiveAfterMerge: config.autoArchiveAfterMerge ?? false,
|
|
288
|
+
enableTerminalAgentHooks: config.enableTerminalAgentHooks ?? false,
|
|
289
|
+
appendSystemPrompt: config.appendSystemPrompt ?? "",
|
|
290
|
+
};
|
|
291
|
+
if (config.terminalProfiles !== undefined) {
|
|
292
|
+
initialConfig.terminalProfiles = config.terminalProfiles;
|
|
293
|
+
}
|
|
294
|
+
return initialConfig;
|
|
295
|
+
}
|
|
296
|
+
export async function createPaseoDaemon(config, rootLogger) {
|
|
297
|
+
const logger = rootLogger.child({ module: "bootstrap" });
|
|
298
|
+
const bootstrapStart = performance.now();
|
|
299
|
+
const elapsed = () => `${(performance.now() - bootstrapStart).toFixed(0)}ms`;
|
|
300
|
+
const daemonVersion = resolveDaemonVersion(import.meta.url);
|
|
301
|
+
const daemonConfigStore = new DaemonConfigStore(config.paseoHome, createInitialMutableDaemonConfig(config), logger);
|
|
302
|
+
const browserToolsPolicy = new DaemonConfigBrowserToolsPolicy(daemonConfigStore);
|
|
303
|
+
const browserToolsBroker = new BrowserToolsBroker({});
|
|
304
|
+
const serverId = getOrCreateServerId(config.paseoHome, { logger });
|
|
305
|
+
const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
|
|
306
|
+
const managedProcesses = createBootstrapManagedProcessRegistry(config, logger);
|
|
307
|
+
// Reconcile the helper-process ledger in the background so it never blocks the
|
|
308
|
+
// daemon from coming up; terminating a live leftover can take a few seconds.
|
|
309
|
+
// Best-effort, so a failure is logged here rather than crashing startup.
|
|
310
|
+
void reconcileManagedProcessLedger(managedProcesses, logger).catch((error) => {
|
|
311
|
+
logger.warn({ err: error }, "Failed to reconcile managed helper process ledger");
|
|
312
|
+
});
|
|
313
|
+
let relayTransport = null;
|
|
314
|
+
const staticDir = config.staticDir;
|
|
315
|
+
const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
|
|
316
|
+
const downloadTokenStore = new DownloadTokenStore({
|
|
317
|
+
ttlMs: downloadTokenTtlMs,
|
|
318
|
+
});
|
|
319
|
+
// Capability token authenticating the daemon's own agents to the loopback
|
|
320
|
+
// Agent MCP endpoint (/mcp/agents). Random per daemon run, injected only into
|
|
321
|
+
// local agent configs and the daemon's own MCP client — never sent to remote
|
|
322
|
+
// clients — so it cannot be replayed off-box. This lets the injected MCP
|
|
323
|
+
// authenticate even when the daemon password is set via the app (hash only,
|
|
324
|
+
// no plaintext available). Mirrors the /api/files/download capability-token
|
|
325
|
+
// pattern.
|
|
326
|
+
const agentMcpAuthToken = randomUUID();
|
|
327
|
+
const listenTarget = parseListenString(config.listen);
|
|
328
|
+
const app = express();
|
|
329
|
+
app.set("trust proxy", resolveExpressTrustProxySetting(config));
|
|
330
|
+
let boundListenTarget = null;
|
|
331
|
+
let workspaceRegistry = null;
|
|
332
|
+
const terminalManager = createConfiguredTerminalManager({
|
|
333
|
+
getTerminalActivityUrl: () => createTerminalActivityUrl(boundListenTarget),
|
|
334
|
+
});
|
|
335
|
+
applyTerminalAgentHookSetting({ store: daemonConfigStore, logger });
|
|
336
|
+
const serviceProxyPublicBaseUrl = config.serviceProxy?.publicBaseUrl
|
|
337
|
+
? config.serviceProxy.publicBaseUrl
|
|
338
|
+
: null;
|
|
339
|
+
const serviceProxy = createServiceProxySubsystem({
|
|
340
|
+
logger,
|
|
341
|
+
publicBaseUrl: serviceProxyPublicBaseUrl,
|
|
342
|
+
});
|
|
343
|
+
const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
|
|
344
|
+
const configuredHostnames = config.hostnames ?? config.allowedHosts;
|
|
345
|
+
let wsServer = null;
|
|
346
|
+
let pushSubsystem = null;
|
|
347
|
+
let serviceProxyListenTarget = null;
|
|
348
|
+
const scriptHealthMonitor = new ScriptHealthMonitor({
|
|
349
|
+
serviceProxy,
|
|
350
|
+
onChange: createScriptStatusEmitter({
|
|
351
|
+
sessions: () => wsServer?.listActiveSessions().map((session) => ({
|
|
352
|
+
emit: (message) => session.emitServerMessage(message),
|
|
353
|
+
})) ?? [],
|
|
354
|
+
serviceProxy,
|
|
355
|
+
runtimeStore: scriptRuntimeStore,
|
|
356
|
+
daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
357
|
+
resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
|
|
358
|
+
logger,
|
|
359
|
+
serviceProxyPublicBaseUrl,
|
|
360
|
+
}),
|
|
361
|
+
});
|
|
362
|
+
const handleBranchChange = createBranchChangeRouteHandler({
|
|
363
|
+
serviceProxy,
|
|
364
|
+
onRoutesChanged: (workspaceId) => {
|
|
365
|
+
scriptHealthMonitor.invalidateWorkspace(workspaceId);
|
|
366
|
+
},
|
|
367
|
+
logger,
|
|
368
|
+
});
|
|
369
|
+
// Service proxy classifies service hosts before daemon auth/route fallthrough.
|
|
370
|
+
// Registered service hosts proxy directly; known service namespaces without a
|
|
371
|
+
// route return 404 and never reach daemon APIs.
|
|
372
|
+
app.use(serviceProxy.middleware());
|
|
373
|
+
// Host allowlist / DNS rebinding protection (vite-like semantics).
|
|
374
|
+
// For non-TCP (unix sockets), skip host validation.
|
|
375
|
+
if (listenTarget.type === "tcp") {
|
|
376
|
+
app.use((req, res, next) => {
|
|
377
|
+
const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
|
|
378
|
+
if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
|
|
379
|
+
res.status(403).json({ error: "Invalid Host header" });
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
next();
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
// CORS - allow same-origin + configured origins
|
|
386
|
+
const allowedOrigins = new Set([
|
|
387
|
+
...config.corsAllowedOrigins,
|
|
388
|
+
// Packaged desktop renderers use the custom paseo:// protocol scheme.
|
|
389
|
+
"paseo://app",
|
|
390
|
+
// For TCP, add localhost variants
|
|
391
|
+
...(listenTarget.type === "tcp"
|
|
392
|
+
? [
|
|
393
|
+
`http://${listenTarget.host}:${listenTarget.port}`,
|
|
394
|
+
`http://localhost:${listenTarget.port}`,
|
|
395
|
+
`http://127.0.0.1:${listenTarget.port}`,
|
|
396
|
+
]
|
|
397
|
+
: []),
|
|
398
|
+
]);
|
|
399
|
+
app.use((req, res, next) => {
|
|
400
|
+
const origin = req.headers.origin;
|
|
401
|
+
if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
|
|
402
|
+
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
403
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
404
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
405
|
+
res.setHeader("Access-Control-Allow-Credentials", "true");
|
|
406
|
+
}
|
|
407
|
+
if (req.method === "OPTIONS") {
|
|
408
|
+
res.status(204).end();
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
next();
|
|
412
|
+
});
|
|
413
|
+
// Local, harmless, and token-gated; deliberately skips daemon auth.
|
|
414
|
+
app.post("/api/terminal-activity", express.json(), createTerminalActivityRouteHandler(terminalManager));
|
|
415
|
+
// Serve the bundled browser web UI when enabled. Mounted after service-proxy
|
|
416
|
+
// classification and host/CORS handling, but before daemon bearer auth, so
|
|
417
|
+
// static app files load without the daemon password while API/WebSocket calls
|
|
418
|
+
// remain protected.
|
|
419
|
+
mountWebUi(app, config, logger);
|
|
420
|
+
app.use(createRequireBearerMiddleware(config.auth, (context) => {
|
|
421
|
+
logger.warn(context, "Rejected HTTP request with invalid daemon password");
|
|
422
|
+
}));
|
|
423
|
+
app.use(express.json());
|
|
424
|
+
// Serve static files from public directory
|
|
425
|
+
app.use("/public", express.static(staticDir));
|
|
426
|
+
// Health check endpoint
|
|
427
|
+
app.get("/api/health", (_req, res) => {
|
|
428
|
+
res.json({ status: "ok", timestamp: new Date().toISOString() });
|
|
429
|
+
});
|
|
430
|
+
// MEETINGS BACKEND (B) — serve real meeting data from the engine's meetings.db
|
|
431
|
+
registerMeetingsRoutes(app);
|
|
432
|
+
// CAPTURE — start/stop/status for a live meeting capture session (spawns meetcap)
|
|
433
|
+
registerCaptureRoutes(app);
|
|
434
|
+
app.get("/api/status", (_req, res) => {
|
|
435
|
+
res.json({
|
|
436
|
+
status: "server_info",
|
|
437
|
+
serverId,
|
|
438
|
+
hostname: getHostname(),
|
|
439
|
+
version: daemonVersion,
|
|
440
|
+
listen: formatListenTarget(boundListenTarget ?? listenTarget),
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
const handleFileDownload = async (req, res) => {
|
|
444
|
+
const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
|
|
445
|
+
? req.query.token.trim()
|
|
446
|
+
: null;
|
|
447
|
+
if (!token) {
|
|
448
|
+
res.status(400).json({ error: "Missing download token" });
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
const entry = downloadTokenStore.consumeToken(token);
|
|
452
|
+
if (!entry) {
|
|
453
|
+
res.status(403).json({ error: "Invalid or expired token" });
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
let fileHandle = null;
|
|
457
|
+
try {
|
|
458
|
+
fileHandle = await open(entry.absolutePath, DOWNLOAD_OPEN_FLAGS);
|
|
459
|
+
const fileStats = await fileHandle.stat();
|
|
460
|
+
if (!fileStats.isFile()) {
|
|
461
|
+
res.status(404).json({ error: "File not found" });
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
|
|
465
|
+
res.setHeader("Content-Type", entry.mimeType);
|
|
466
|
+
res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
|
|
467
|
+
res.setHeader("Content-Length", fileStats.size.toString());
|
|
468
|
+
const stream = fileHandle.createReadStream();
|
|
469
|
+
fileHandle = null;
|
|
470
|
+
stream.on("error", (err) => {
|
|
471
|
+
logger.error({ err }, "Failed to stream download");
|
|
472
|
+
if (!res.headersSent) {
|
|
473
|
+
res.status(500).json({ error: "Failed to read file" });
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
res.end();
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
stream.pipe(res);
|
|
480
|
+
}
|
|
481
|
+
catch (err) {
|
|
482
|
+
logger.error({ err }, "Failed to download file");
|
|
483
|
+
if (!res.headersSent) {
|
|
484
|
+
res.status(404).json({ error: "File not found" });
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
finally {
|
|
488
|
+
await fileHandle?.close().catch(() => undefined);
|
|
489
|
+
}
|
|
490
|
+
};
|
|
491
|
+
app.get("/api/files/download", (req, res) => {
|
|
492
|
+
void handleFileDownload(req, res);
|
|
493
|
+
});
|
|
494
|
+
// Story PASEO-CHAT-ACTIONS-V1-story-3.2: tab rename persistence.
|
|
495
|
+
// Loopback-bound, single-user trust model — same as the other /api/* routes.
|
|
496
|
+
// Provider-specific hook wiring lives in session-rename-route.ts so provider
|
|
497
|
+
// names stay out of this generic bootstrap file.
|
|
498
|
+
registerSessionRenameRoute(app, logger);
|
|
499
|
+
// Push subscription endpoint (Story PASEO-CHAT-ACTIONS-V1-story-1.002).
|
|
500
|
+
// Loopback-bound, single-user trust model — no auth. Persists to
|
|
501
|
+
// $PASEO_HOME/push-subscriptions.json with mode 0600.
|
|
502
|
+
const pushSubscriptionStore = new PushSubscriptionStore(logger, path.join(config.paseoHome, "push-subscriptions.json"));
|
|
503
|
+
// Story 1.4 — VAPID key pair for Web Push delivery.
|
|
504
|
+
const vapidKeys = loadOrGenerateVapidKeys(path.join(config.paseoHome, "vapid-keys.json"), logger);
|
|
505
|
+
registerPushRoutes(app, pushSubscriptionStore, logger, {
|
|
506
|
+
vapidPublicKey: vapidKeys.publicKey,
|
|
507
|
+
});
|
|
508
|
+
const httpServer = createHTTPServer(app);
|
|
509
|
+
// Script proxy WebSocket upgrade handler — must be registered before the
|
|
510
|
+
// VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
|
|
511
|
+
// script-bound upgrades are forwarded first. The handler is a no-op for
|
|
512
|
+
// requests that don't match a registered script route.
|
|
513
|
+
httpServer.on("upgrade", serviceProxy.upgradeHandler({ passthroughUnknown: true }));
|
|
514
|
+
// Capture-stream WebSocket (meetings live capture). Registered BEFORE the VoiceAssistant `/ws`
|
|
515
|
+
// server attaches so it gets first claim on `/api/meetings/capture/stream`; it no-ops on every
|
|
516
|
+
// other URL, so `/ws`, script-proxy, and relay upgrades pass through untouched.
|
|
517
|
+
httpServer.on("upgrade", getCaptureStreamWs().upgrade);
|
|
518
|
+
if (config.serviceProxy?.standaloneListen) {
|
|
519
|
+
serviceProxyListenTarget = parseListenString(config.serviceProxy.standaloneListen);
|
|
520
|
+
}
|
|
521
|
+
const agentStorage = new AgentStorage(config.agentStoragePath, logger);
|
|
522
|
+
const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
|
|
523
|
+
workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
|
|
524
|
+
// Story PASEO-CHAT-ACTIONS-V1-story-3.003 — GET /workspace/:id/sessions.
|
|
525
|
+
registerWorkspaceSessionsRoute(app, workspaceRegistry, logger);
|
|
526
|
+
// MARRA CUSTOMIZATION — GET /sessions (global; walks the agent transcript
|
|
527
|
+
// dirs). Powers the cross-workspace "find any session" mode in the command
|
|
528
|
+
// palette. Provider-specific paths are resolved inside the route module.
|
|
529
|
+
registerAllSessionsRoute(app, logger);
|
|
530
|
+
// MARRA CUSTOMIZATION — GET /sessions/search?q=… spawns the recall CLI to
|
|
531
|
+
// do FTS across every supported agent's transcripts and returns ranked
|
|
532
|
+
// snippets. Powers the FTS mode of the command palette.
|
|
533
|
+
registerSessionsSearchRoute(app, logger);
|
|
534
|
+
const chatService = new FileBackedChatService({
|
|
535
|
+
paseoHome: config.paseoHome,
|
|
536
|
+
logger,
|
|
537
|
+
});
|
|
538
|
+
const github = createGitHubService();
|
|
539
|
+
const workspaceGitService = new WorkspaceGitServiceImpl({
|
|
540
|
+
logger,
|
|
541
|
+
paseoHome: config.paseoHome,
|
|
542
|
+
worktreesRoot: config.worktreesRoot,
|
|
543
|
+
deps: {
|
|
544
|
+
github,
|
|
545
|
+
},
|
|
546
|
+
});
|
|
547
|
+
const providerSnapshotLogger = logger.child({ module: "provider-snapshot-manager" });
|
|
548
|
+
const providerSnapshotManager = new ProviderSnapshotManager({
|
|
549
|
+
logger: providerSnapshotLogger,
|
|
550
|
+
runtimeSettings: config.agentProviderSettings,
|
|
551
|
+
providerOverrides: config.providerOverrides,
|
|
552
|
+
workspaceGitService,
|
|
553
|
+
managedProcesses,
|
|
554
|
+
isDev: config.isDev === true,
|
|
555
|
+
extraClients: config.agentClients,
|
|
556
|
+
});
|
|
557
|
+
const initialAgentManagerState = providerSnapshotManager.getAgentManagerProviderState();
|
|
558
|
+
const agentManager = new AgentManager({
|
|
559
|
+
clients: initialAgentManagerState.clients,
|
|
560
|
+
providerDefinitions: initialAgentManagerState.providerDefinitions,
|
|
561
|
+
registry: agentStorage,
|
|
562
|
+
appendSystemPrompt: config.appendSystemPrompt,
|
|
563
|
+
onWorkspaceStateMayHaveChanged: ({ cwd }) => {
|
|
564
|
+
workspaceGitService.onWorkspaceStateMayHaveChanged(cwd);
|
|
565
|
+
},
|
|
566
|
+
mcpAuthToken: agentMcpAuthToken,
|
|
567
|
+
logger,
|
|
568
|
+
});
|
|
569
|
+
// Session digest (docs/session-digest.md §4.3 + §5): on the running→idle
|
|
570
|
+
// "finished" transition, refresh the digest — derive keyFiles deterministically
|
|
571
|
+
// and regenerate summary/accomplishments via the borrowed-provider rail (the
|
|
572
|
+
// same one auto-title uses; the daemon holds no API key of its own). Debounced +
|
|
573
|
+
// coalesced inside the scheduler; internal agents never broadcast attention.
|
|
574
|
+
agentManager.addAgentAttentionListener((params) => {
|
|
575
|
+
if (params.reason !== "finished") {
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
const agent = agentManager.getAgent(params.agentId);
|
|
579
|
+
if (!agent || agent.internal) {
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
scheduleSessionDigestRefresh({
|
|
583
|
+
agentManager,
|
|
584
|
+
agentId: params.agentId,
|
|
585
|
+
cwd: agent.cwd,
|
|
586
|
+
providerSnapshotManager,
|
|
587
|
+
daemonConfig: null,
|
|
588
|
+
currentSelection: {
|
|
589
|
+
provider: agent.provider,
|
|
590
|
+
model: agent.runtimeInfo?.model ?? agent.config.model ?? null,
|
|
591
|
+
thinkingOptionId: agent.runtimeInfo?.thinkingOptionId ?? agent.config.thinkingOptionId ?? null,
|
|
592
|
+
},
|
|
593
|
+
logger,
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
// Epic 1, Story 1.2 — first-class workflow entity. WorkflowManager orchestrates
|
|
597
|
+
// only; every child is spawned through agentManager.createAgent (one-directional:
|
|
598
|
+
// workflow -> agent, never the reverse). Storage is the flat $PASEO_HOME/workflows
|
|
599
|
+
// path from Story 1.1.
|
|
600
|
+
const workflowStorage = new WorkflowStorage(path.join(config.paseoHome, "workflows"), logger);
|
|
601
|
+
const workflowManager = new WorkflowManager({
|
|
602
|
+
agentManager,
|
|
603
|
+
storage: workflowStorage,
|
|
604
|
+
});
|
|
605
|
+
// Story 2.1 — read-only HTTP status + SSE phase-transition routes. Gated on the
|
|
606
|
+
// same WORKFLOWS_FEATURE_ENABLED constant as the server_info handshake flag.
|
|
607
|
+
registerWorkflowHttpRoutes(app, { manager: workflowManager, featureEnabled: WORKFLOWS_FEATURE_ENABLED }, logger);
|
|
608
|
+
// Story PASEO-CHAT-ACTIONS-V1 stories 2.2 + 2.4 — rewind + edit HTTP routes.
|
|
609
|
+
// Reuse truncate-session.ts (Story 2.1) under the hood. Loopback-only, gated
|
|
610
|
+
// by the same Bearer-token auth middleware as the rest of the API.
|
|
611
|
+
registerAgentRoutes(app, agentManager, logger);
|
|
612
|
+
const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
|
|
613
|
+
await agentStorage.initialize();
|
|
614
|
+
logger.info({ elapsed: elapsed() }, "Agent storage initialized");
|
|
615
|
+
await bootstrapWorkspaceRegistries({
|
|
616
|
+
paseoHome: config.paseoHome,
|
|
617
|
+
agentStorage,
|
|
618
|
+
projectRegistry,
|
|
619
|
+
workspaceRegistry,
|
|
620
|
+
workspaceGitService,
|
|
621
|
+
logger,
|
|
622
|
+
});
|
|
623
|
+
logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
|
|
624
|
+
const workspaceReconciliation = new WorkspaceReconciliationService({
|
|
625
|
+
projectRegistry,
|
|
626
|
+
workspaceRegistry,
|
|
627
|
+
logger,
|
|
628
|
+
workspaceGitService,
|
|
629
|
+
});
|
|
630
|
+
void (async () => {
|
|
631
|
+
try {
|
|
632
|
+
const result = await workspaceReconciliation.runOnce();
|
|
633
|
+
logger.info({
|
|
634
|
+
elapsed: elapsed(),
|
|
635
|
+
changeCount: result.changesApplied.length,
|
|
636
|
+
}, "Workspace registries reconciled");
|
|
637
|
+
}
|
|
638
|
+
catch (error) {
|
|
639
|
+
logger.error({ err: error }, "Background workspace reconciliation failed");
|
|
640
|
+
}
|
|
641
|
+
})();
|
|
642
|
+
await chatService.initialize();
|
|
643
|
+
logger.info({ elapsed: elapsed() }, "Chat service initialized");
|
|
644
|
+
const checkoutDiffManager = new CheckoutDiffManager({
|
|
645
|
+
logger,
|
|
646
|
+
paseoHome: config.paseoHome,
|
|
647
|
+
workspaceGitService,
|
|
648
|
+
});
|
|
649
|
+
const loopService = new LoopService({
|
|
650
|
+
paseoHome: config.paseoHome,
|
|
651
|
+
logger,
|
|
652
|
+
agentManager,
|
|
653
|
+
providerSnapshotManager,
|
|
654
|
+
});
|
|
655
|
+
await loopService.initialize();
|
|
656
|
+
logger.info({ elapsed: elapsed() }, "Loop service initialized");
|
|
657
|
+
const scheduleService = new ScheduleService({
|
|
658
|
+
paseoHome: config.paseoHome,
|
|
659
|
+
logger,
|
|
660
|
+
agentManager,
|
|
661
|
+
agentStorage,
|
|
662
|
+
providerSnapshotManager,
|
|
663
|
+
});
|
|
664
|
+
await scheduleService.start();
|
|
665
|
+
agentManager.setAgentArchivedCallback(async (agentId) => {
|
|
666
|
+
try {
|
|
667
|
+
await scheduleService.completeForAgent(agentId);
|
|
668
|
+
}
|
|
669
|
+
catch (error) {
|
|
670
|
+
logger.warn({ err: error, agentId }, "Failed to complete schedules for archived agent");
|
|
671
|
+
}
|
|
672
|
+
});
|
|
673
|
+
logger.info({ elapsed: elapsed() }, "Schedule service initialized");
|
|
674
|
+
// Plugin platform (opt-in via HYPERPASEO_EXTENSIONS=1). Discovers installed
|
|
675
|
+
// extensions and runs each in its own extension-host process, wired to the
|
|
676
|
+
// daemon backend. No-op by default — zero impact on standard daemon behavior.
|
|
677
|
+
const extensionService = createExtensionService({
|
|
678
|
+
agentManager,
|
|
679
|
+
serverId,
|
|
680
|
+
paseoHome: config.paseoHome,
|
|
681
|
+
logger,
|
|
682
|
+
});
|
|
683
|
+
logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
|
|
684
|
+
const persistedRecords = await agentStorage.list();
|
|
685
|
+
logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
|
|
686
|
+
logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
|
|
687
|
+
logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
|
|
688
|
+
const archiveWorkspaceRecordExternal = async (workspaceId) => {
|
|
689
|
+
const sessions = wsServer?.listActiveSessions() ?? [];
|
|
690
|
+
if (sessions.length > 0) {
|
|
691
|
+
await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
await archivePersistedWorkspaceRecord({
|
|
695
|
+
workspaceId,
|
|
696
|
+
workspaceRegistry,
|
|
697
|
+
});
|
|
698
|
+
};
|
|
699
|
+
// external path→workspace adapter, not ownership: archive-by-path requests that
|
|
700
|
+
// arrive with a worktree path and no workspaceId (old clients / CLI).
|
|
701
|
+
const findWorkspaceIdForCwdExternal = async (cwd) => {
|
|
702
|
+
return resolveWorkspaceIdForPath(cwd, await workspaceRegistry.list());
|
|
703
|
+
};
|
|
704
|
+
const ensureWorkspaceForCreateExternal = async (cwd, firstAgentContext) => {
|
|
705
|
+
const workspace = await createLocalCheckoutWorkspace({ cwd, title: resolveFirstAgentPromptTitle(firstAgentContext) }, { projectRegistry, workspaceRegistry, workspaceGitService });
|
|
706
|
+
if (firstAgentContext) {
|
|
707
|
+
workspaceAutoName.scheduleForDirectory({
|
|
708
|
+
workspaceId: workspace.workspaceId,
|
|
709
|
+
cwd: workspace.cwd,
|
|
710
|
+
firstAgentContext,
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
return workspace.workspaceId;
|
|
714
|
+
};
|
|
715
|
+
const listActiveWorkspacesExternal = async () => {
|
|
716
|
+
const workspaces = await workspaceRegistry.list();
|
|
717
|
+
return workspaces
|
|
718
|
+
.filter((workspace) => !workspace.archivedAt)
|
|
719
|
+
.map((workspace) => ({
|
|
720
|
+
workspaceId: workspace.workspaceId,
|
|
721
|
+
cwd: workspace.cwd,
|
|
722
|
+
kind: workspace.kind,
|
|
723
|
+
}));
|
|
724
|
+
};
|
|
725
|
+
const markWorkspaceArchivingExternal = (workspaceIds, archivingAt) => {
|
|
726
|
+
const workspaceIdList = Array.from(workspaceIds);
|
|
727
|
+
for (const session of wsServer?.listActiveSessions() ?? []) {
|
|
728
|
+
session.markWorkspaceArchivingForExternalMutation(workspaceIdList, archivingAt);
|
|
729
|
+
}
|
|
730
|
+
};
|
|
731
|
+
const clearWorkspaceArchivingExternal = (workspaceIds) => {
|
|
732
|
+
const workspaceIdList = Array.from(workspaceIds);
|
|
733
|
+
for (const session of wsServer?.listActiveSessions() ?? []) {
|
|
734
|
+
session.clearWorkspaceArchivingForExternalMutation(workspaceIdList);
|
|
735
|
+
}
|
|
736
|
+
};
|
|
737
|
+
const emitWorkspaceUpdatesExternal = async (workspaceIds) => {
|
|
738
|
+
const workspaceIdList = Array.from(workspaceIds);
|
|
739
|
+
await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalWorkspaceIds(workspaceIdList)));
|
|
740
|
+
};
|
|
741
|
+
const emitWorkspaceUpdateForCwdExternal = async (cwd) => {
|
|
742
|
+
const workspaceIds = workspaceIdsOnCheckout(await workspaceRegistry.list(), cwd);
|
|
743
|
+
await emitWorkspaceUpdatesExternal(workspaceIds);
|
|
744
|
+
};
|
|
745
|
+
const emitExternalSessionMessage = (message) => {
|
|
746
|
+
wsServer?.broadcast(wrapSessionMessage(message));
|
|
747
|
+
};
|
|
748
|
+
const workspaceAutoName = new WorkspaceAutoName({
|
|
749
|
+
agentManager,
|
|
750
|
+
workspaceRegistry,
|
|
751
|
+
workspaceGitService,
|
|
752
|
+
providerSnapshotManager,
|
|
753
|
+
readDaemonConfig: () => ({ metadataGeneration: daemonConfigStore.get().metadataGeneration }),
|
|
754
|
+
gitMutation: createGitMutationService({
|
|
755
|
+
workspaceGitService,
|
|
756
|
+
github,
|
|
757
|
+
logger,
|
|
758
|
+
}),
|
|
759
|
+
emitWorkspaceUpdateForCwd: emitWorkspaceUpdateForCwdExternal,
|
|
760
|
+
emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
|
|
761
|
+
await emitWorkspaceUpdatesExternal([workspaceId]);
|
|
762
|
+
},
|
|
763
|
+
logger,
|
|
764
|
+
});
|
|
765
|
+
setupAutoArchiveOnMerge({
|
|
766
|
+
paseoHome: config.paseoHome,
|
|
767
|
+
paseoWorktreesBaseRoot: config.worktreesRoot,
|
|
768
|
+
daemonConfigStore,
|
|
769
|
+
workspaceGitService,
|
|
770
|
+
github,
|
|
771
|
+
agentManager,
|
|
772
|
+
agentStorage,
|
|
773
|
+
terminalManager,
|
|
774
|
+
logger,
|
|
775
|
+
findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
|
|
776
|
+
listActiveWorkspaces: listActiveWorkspacesExternal,
|
|
777
|
+
archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
|
|
778
|
+
markWorkspaceArchiving: markWorkspaceArchivingExternal,
|
|
779
|
+
clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
|
|
780
|
+
emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
|
|
781
|
+
});
|
|
782
|
+
const createPaseoWorktreeForTools = async (input, serviceOptions) => {
|
|
783
|
+
return createPaseoWorktreeWorkflow({
|
|
784
|
+
paseoHome: config.paseoHome,
|
|
785
|
+
worktreesRoot: config.worktreesRoot,
|
|
786
|
+
createPaseoWorktree: async (workflowInput, workflowOptions) => {
|
|
787
|
+
return createRegisteredPaseoWorktree(workflowInput, {
|
|
788
|
+
github,
|
|
789
|
+
...(workflowOptions?.resolveDefaultBranch
|
|
790
|
+
? {
|
|
791
|
+
resolveDefaultBranch: workflowOptions.resolveDefaultBranch,
|
|
792
|
+
}
|
|
793
|
+
: {}),
|
|
794
|
+
projectRegistry,
|
|
795
|
+
workspaceRegistry,
|
|
796
|
+
workspaceGitService,
|
|
797
|
+
});
|
|
798
|
+
},
|
|
799
|
+
warmWorkspaceGitData: async (workspace) => {
|
|
800
|
+
await Promise.all(wsServer
|
|
801
|
+
?.listActiveSessions()
|
|
802
|
+
.map((session) => session.warmWorkspaceGitDataForWorkspace(workspace)) ?? []);
|
|
803
|
+
},
|
|
804
|
+
autoNameWorkspaceBranchForFirstAgent: (autoNameInput) => workspaceAutoName.scheduleForWorktree(autoNameInput),
|
|
805
|
+
emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
|
|
806
|
+
await emitWorkspaceUpdatesExternal([workspaceId]);
|
|
807
|
+
},
|
|
808
|
+
cacheWorkspaceSetupSnapshot: () => { },
|
|
809
|
+
emit: emitExternalSessionMessage,
|
|
810
|
+
sessionLogger: logger,
|
|
811
|
+
terminalManager,
|
|
812
|
+
archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
|
|
813
|
+
serviceProxy,
|
|
814
|
+
scriptRuntimeStore,
|
|
815
|
+
getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
816
|
+
getDaemonTcpHost: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null),
|
|
817
|
+
serviceProxyPublicBaseUrl,
|
|
818
|
+
onScriptsChanged: null,
|
|
819
|
+
}, input, serviceOptions);
|
|
820
|
+
};
|
|
821
|
+
const createAgentToolHostDependencies = (runtime) => ({
|
|
822
|
+
agentManager,
|
|
823
|
+
agentStorage,
|
|
824
|
+
terminalManager,
|
|
825
|
+
getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
826
|
+
scheduleService,
|
|
827
|
+
providerSnapshotManager,
|
|
828
|
+
github,
|
|
829
|
+
workspaceGitService,
|
|
830
|
+
findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
|
|
831
|
+
listActiveWorkspaces: listActiveWorkspacesExternal,
|
|
832
|
+
archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
|
|
833
|
+
emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
|
|
834
|
+
workspaceRegistry,
|
|
835
|
+
markWorkspaceArchiving: markWorkspaceArchivingExternal,
|
|
836
|
+
clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
|
|
837
|
+
ensureWorkspaceForCreate: ensureWorkspaceForCreateExternal,
|
|
838
|
+
createPaseoWorktree: createPaseoWorktreeForTools,
|
|
839
|
+
browserToolsEnabled: browserToolsPolicy.isEnabled(),
|
|
840
|
+
browserToolsBroker,
|
|
841
|
+
paseoHome: config.paseoHome,
|
|
842
|
+
worktreesRoot: config.worktreesRoot,
|
|
843
|
+
callerAgentId: runtime.callerAgentId,
|
|
844
|
+
enableVoiceTools: runtime.enableVoiceTools,
|
|
845
|
+
voiceOnly: runtime.voiceOnly,
|
|
846
|
+
resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
|
|
847
|
+
resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
|
|
848
|
+
logger,
|
|
849
|
+
});
|
|
850
|
+
const createAgentToolCatalog = (runtime) => createPaseoToolCatalog(createAgentToolHostDependencies(runtime));
|
|
851
|
+
agentManager.setPaseoToolCatalogFactory(createAgentToolCatalog);
|
|
852
|
+
agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
|
|
853
|
+
const mcpEnabled = config.mcpEnabled ?? true;
|
|
854
|
+
let agentMcpBaseUrl = null;
|
|
855
|
+
if (mcpEnabled) {
|
|
856
|
+
const agentMcpRoute = "/mcp/agents";
|
|
857
|
+
const createAgentMcpSession = async (callerAgentId) => {
|
|
858
|
+
// Adopt the converged host-dependency factory, then thread the daemon-owned
|
|
859
|
+
// workflowManager so the additive `workflow_*` MCP tools register.
|
|
860
|
+
const agentMcpServer = await createAgentMcpServer({
|
|
861
|
+
...createAgentToolHostDependencies({ callerAgentId }),
|
|
862
|
+
workflowManager,
|
|
863
|
+
// API-389: let the open_url MCP tool push to the user's paired client(s).
|
|
864
|
+
broadcastToClients: emitExternalSessionMessage,
|
|
865
|
+
});
|
|
866
|
+
// Stateless mode: each HTTP request builds a fresh server + transport that is
|
|
867
|
+
// torn down when the response closes, so no per-session state is retained between
|
|
868
|
+
// requests. The agent control plane only lists and calls tools, neither of which
|
|
869
|
+
// needs cross-request state, so sessions would only pin memory for the life of the
|
|
870
|
+
// daemon (agents that exit without a clean DELETE never get reaped).
|
|
871
|
+
const transport = new StreamableHTTPServerTransport({
|
|
872
|
+
sessionIdGenerator: undefined,
|
|
873
|
+
// NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
|
|
874
|
+
// StreamableHTTPServerTransport's built-in check requires exact Host header matches.
|
|
875
|
+
enableDnsRebindingProtection: false,
|
|
876
|
+
});
|
|
877
|
+
Object.assign(transport, {
|
|
878
|
+
onerror: (err) => {
|
|
879
|
+
logger.error({ err }, "Agent MCP transport error");
|
|
880
|
+
},
|
|
881
|
+
});
|
|
882
|
+
await agentMcpServer.connect(transport);
|
|
883
|
+
return { server: agentMcpServer, transport };
|
|
884
|
+
};
|
|
885
|
+
const runAgentMcpRequest = async (req, res) => {
|
|
886
|
+
// This route is exempt from the global daemon-password middleware, so it
|
|
887
|
+
// authenticates here using the injected capability token (or a valid
|
|
888
|
+
// daemon password). Without this, a password-protected daemon would be
|
|
889
|
+
// wide open on its agent control plane.
|
|
890
|
+
if (!(await isAgentMcpRequestAuthorized({
|
|
891
|
+
password: config.auth?.password,
|
|
892
|
+
capabilityToken: agentMcpAuthToken,
|
|
893
|
+
authorizationHeader: req.header("authorization"),
|
|
894
|
+
}))) {
|
|
895
|
+
res.status(401).json({ error: "Unauthorized" });
|
|
896
|
+
return;
|
|
897
|
+
}
|
|
898
|
+
if (config.mcpDebug) {
|
|
899
|
+
logger.debug({
|
|
900
|
+
method: req.method,
|
|
901
|
+
url: req.originalUrl,
|
|
902
|
+
sessionId: req.header("mcp-session-id"),
|
|
903
|
+
authorization: req.header("authorization") ? REDACTED_LOG_VALUE : undefined,
|
|
904
|
+
body: summarizeAgentMcpDebugBody(req.body),
|
|
905
|
+
}, "Agent MCP request");
|
|
906
|
+
}
|
|
907
|
+
try {
|
|
908
|
+
// Stateless: GET (standalone SSE) and DELETE (session termination) have no
|
|
909
|
+
// meaning without sessions. The MCP client tolerates 405 on the GET stream
|
|
910
|
+
// and never issues a DELETE because it is never handed a session id.
|
|
911
|
+
if (req.method !== "POST") {
|
|
912
|
+
res.status(405).json({
|
|
913
|
+
jsonrpc: "2.0",
|
|
914
|
+
error: {
|
|
915
|
+
code: -32000,
|
|
916
|
+
message: "Method not allowed",
|
|
917
|
+
},
|
|
918
|
+
id: null,
|
|
919
|
+
});
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
const callerAgentIdRaw = req.query.callerAgentId;
|
|
923
|
+
let callerAgentId;
|
|
924
|
+
if (typeof callerAgentIdRaw === "string") {
|
|
925
|
+
callerAgentId = callerAgentIdRaw;
|
|
926
|
+
}
|
|
927
|
+
else if (Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string") {
|
|
928
|
+
callerAgentId = callerAgentIdRaw[0];
|
|
929
|
+
}
|
|
930
|
+
const { server, transport } = await createAgentMcpSession(callerAgentId);
|
|
931
|
+
res.on("close", () => {
|
|
932
|
+
void transport.close();
|
|
933
|
+
void server.close();
|
|
934
|
+
});
|
|
935
|
+
await transport.handleRequest(req, res, req.body);
|
|
936
|
+
}
|
|
937
|
+
catch (err) {
|
|
938
|
+
logger.error({ err }, "Failed to handle Agent MCP request");
|
|
939
|
+
if (!res.headersSent) {
|
|
940
|
+
res.status(500).json({
|
|
941
|
+
jsonrpc: "2.0",
|
|
942
|
+
error: {
|
|
943
|
+
code: -32603,
|
|
944
|
+
message: "Internal MCP server error",
|
|
945
|
+
},
|
|
946
|
+
id: null,
|
|
947
|
+
});
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
};
|
|
951
|
+
const handleAgentMcpRequest = (req, res) => {
|
|
952
|
+
void runAgentMcpRequest(req, res);
|
|
953
|
+
};
|
|
954
|
+
app.post(agentMcpRoute, handleAgentMcpRequest);
|
|
955
|
+
app.get(agentMcpRoute, handleAgentMcpRequest);
|
|
956
|
+
app.delete(agentMcpRoute, handleAgentMcpRequest);
|
|
957
|
+
logger.info({ route: agentMcpRoute }, "Agent MCP server mounted on main app");
|
|
958
|
+
}
|
|
959
|
+
else {
|
|
960
|
+
logger.info("Agent MCP HTTP endpoint disabled");
|
|
961
|
+
}
|
|
962
|
+
const speechService = createSpeechService({
|
|
963
|
+
logger,
|
|
964
|
+
openaiConfig: config.openai,
|
|
965
|
+
speechConfig: config.speech,
|
|
966
|
+
});
|
|
967
|
+
logger.info({ elapsed: elapsed() }, "Speech service created");
|
|
968
|
+
logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
|
|
969
|
+
const start = async () => {
|
|
970
|
+
let mainStarted = false;
|
|
971
|
+
try {
|
|
972
|
+
if (serviceProxyListenTarget) {
|
|
973
|
+
const boundServiceProxyTarget = await serviceProxy.startStandalone({
|
|
974
|
+
listenTarget: serviceProxyListenTarget,
|
|
975
|
+
});
|
|
976
|
+
serviceProxyListenTarget = boundServiceProxyTarget;
|
|
977
|
+
logger.info({
|
|
978
|
+
listen: formatListenTarget(serviceProxyListenTarget),
|
|
979
|
+
publicBaseUrl: serviceProxyPublicBaseUrl,
|
|
980
|
+
elapsed: elapsed(),
|
|
981
|
+
}, "Service proxy listening");
|
|
982
|
+
}
|
|
983
|
+
// Start main HTTP server
|
|
984
|
+
await new Promise((resolve, reject) => {
|
|
985
|
+
const onError = (err) => {
|
|
986
|
+
httpServer.off("listening", onListening);
|
|
987
|
+
reject(err);
|
|
988
|
+
};
|
|
989
|
+
const onListening = () => {
|
|
990
|
+
httpServer.off("error", onError);
|
|
991
|
+
mainStarted = true;
|
|
992
|
+
const logAndResolve = async () => {
|
|
993
|
+
boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
|
|
994
|
+
const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
|
|
995
|
+
agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
|
|
996
|
+
agentManager.setMcpBaseUrl(agentMcpBaseUrl);
|
|
997
|
+
agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
|
|
998
|
+
daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
|
|
999
|
+
agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
|
|
1000
|
+
agentManager.setPaseoToolsEnabled(value !== false);
|
|
1001
|
+
});
|
|
1002
|
+
daemonConfigStore.onFieldChange("appendSystemPrompt", (value) => {
|
|
1003
|
+
agentManager.setAppendSystemPrompt(typeof value === "string" ? value : "");
|
|
1004
|
+
});
|
|
1005
|
+
const relayEnabled = config.relayEnabled ?? true;
|
|
1006
|
+
const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
|
|
1007
|
+
const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
|
|
1008
|
+
const relayUseTls = config.relayUseTls ?? relayEndpoint === "relay.paseo.sh:443";
|
|
1009
|
+
const relayPublicUseTls = config.relayPublicUseTls ?? relayUseTls;
|
|
1010
|
+
const appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
|
|
1011
|
+
if (boundListenTarget.type === "tcp") {
|
|
1012
|
+
logger.info({
|
|
1013
|
+
host: boundListenTarget.host,
|
|
1014
|
+
port: boundListenTarget.port,
|
|
1015
|
+
authRequired: !!config.auth?.password,
|
|
1016
|
+
elapsed: elapsed(),
|
|
1017
|
+
}, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
|
|
1018
|
+
}
|
|
1019
|
+
else {
|
|
1020
|
+
logger.info({
|
|
1021
|
+
path: boundListenTarget.path,
|
|
1022
|
+
authRequired: !!config.auth?.password,
|
|
1023
|
+
elapsed: elapsed(),
|
|
1024
|
+
}, `Server listening on ${boundListenTarget.path}`);
|
|
1025
|
+
}
|
|
1026
|
+
if (config.auth?.password) {
|
|
1027
|
+
logger.info("Daemon password authentication enabled");
|
|
1028
|
+
}
|
|
1029
|
+
// Push subsystem wires the pushTrigger channel onto the AgentManager
|
|
1030
|
+
// attention bus alongside WebSocketServer. Stories 1.3/1.4 will attach
|
|
1031
|
+
// their delivery workers to `pushSubsystem.triggerEmitter.on(...)`.
|
|
1032
|
+
// The PASEO_PUSH_ENABLED=false kill switch is honored inside the emitter.
|
|
1033
|
+
pushSubsystem = createPushSubsystem({
|
|
1034
|
+
agentManager,
|
|
1035
|
+
serverId,
|
|
1036
|
+
logger,
|
|
1037
|
+
subscriptionStore: pushSubscriptionStore,
|
|
1038
|
+
vapidKeys,
|
|
1039
|
+
});
|
|
1040
|
+
wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, workspaceAutoName, config.auth, speechService, terminalManager, {
|
|
1041
|
+
finalTimeoutMs: config.dictationFinalTimeoutMs,
|
|
1042
|
+
}, daemonVersion, (intent) => {
|
|
1043
|
+
try {
|
|
1044
|
+
config.onLifecycleIntent?.(intent);
|
|
1045
|
+
}
|
|
1046
|
+
catch (error) {
|
|
1047
|
+
logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
|
|
1048
|
+
}
|
|
1049
|
+
}, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, serviceProxy, scriptRuntimeStore, handleBranchChange, () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null), () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null), (hostname) => scriptHealthMonitor.getHealthForHostname(hostname), workspaceGitService, github, config.pushNotificationSender, providerSnapshotManager, {
|
|
1050
|
+
listen: formatListenTarget(boundListenTarget ?? listenTarget),
|
|
1051
|
+
worktreesRoot: config.worktreesRoot,
|
|
1052
|
+
appBaseUrl: config.appBaseUrl,
|
|
1053
|
+
relay: {
|
|
1054
|
+
enabled: relayEnabled,
|
|
1055
|
+
endpoint: relayEndpoint,
|
|
1056
|
+
publicEndpoint: relayPublicEndpoint,
|
|
1057
|
+
useTls: relayUseTls,
|
|
1058
|
+
publicUseTls: relayPublicUseTls,
|
|
1059
|
+
},
|
|
1060
|
+
},
|
|
1061
|
+
// Story 1.3 — inject the WorkflowManager so Session can serve
|
|
1062
|
+
// `workflow.*` RPCs (Session -> WorkflowManager, one-directional).
|
|
1063
|
+
workflowManager, serviceProxyPublicBaseUrl, browserToolsBroker);
|
|
1064
|
+
// Story 1.3 bridge: re-publish Expo tokens registered via the legacy
|
|
1065
|
+
// `register_push_token` WebSocket message into the Story 1.2
|
|
1066
|
+
// PushSubscriptionStore so the Expo Push worker sees them.
|
|
1067
|
+
wsServer.setExpoTokenBridge((token) => {
|
|
1068
|
+
pushSubscriptionStore.upsert({ type: "expo", token });
|
|
1069
|
+
});
|
|
1070
|
+
// Chat-actions ws bridges (2026-05): expose the Story 1.2 push
|
|
1071
|
+
// subscription store + VAPID public key to every Session so
|
|
1072
|
+
// relay-connected clients can persist subscriptions and fetch the
|
|
1073
|
+
// VAPID key without round-tripping the HTTP /push/* routes
|
|
1074
|
+
// (which are unreachable over the relay transport).
|
|
1075
|
+
wsServer.setPushSubscriptionBridge(pushSubscriptionStore, vapidKeys.publicKey);
|
|
1076
|
+
// COMPAT(extensions): route client-invoked plugin commands to the
|
|
1077
|
+
// extension-service. No-op until HYPERPASEO_EXTENSIONS=1 spawns hosts
|
|
1078
|
+
// (executeCommand then throws "no extension provides …" → ok:false).
|
|
1079
|
+
wsServer.setExtensionExecuteCommand((commandId, args) => extensionService.executeCommand(commandId, args));
|
|
1080
|
+
if (relayEnabled) {
|
|
1081
|
+
const offer = await createConnectionOfferV2({
|
|
1082
|
+
serverId,
|
|
1083
|
+
daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
|
|
1084
|
+
relay: {
|
|
1085
|
+
endpoint: relayPublicEndpoint,
|
|
1086
|
+
useTls: relayPublicUseTls,
|
|
1087
|
+
},
|
|
1088
|
+
});
|
|
1089
|
+
encodeOfferToFragmentUrl({ offer, appBaseUrl });
|
|
1090
|
+
relayTransport?.stop().catch(() => undefined);
|
|
1091
|
+
relayTransport = startRelayTransport({
|
|
1092
|
+
logger,
|
|
1093
|
+
attachSocket: (ws, metadata) => {
|
|
1094
|
+
if (!wsServer) {
|
|
1095
|
+
throw new Error("WebSocket server not initialized");
|
|
1096
|
+
}
|
|
1097
|
+
return wsServer.attachExternalSocket(ws, metadata);
|
|
1098
|
+
},
|
|
1099
|
+
relayEndpoint,
|
|
1100
|
+
relayUseTls,
|
|
1101
|
+
serverId,
|
|
1102
|
+
daemonKeyPair: daemonKeyPair.keyPair,
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1105
|
+
};
|
|
1106
|
+
logAndResolve().then(resolve, reject);
|
|
1107
|
+
};
|
|
1108
|
+
httpServer.once("error", onError);
|
|
1109
|
+
httpServer.once("listening", onListening);
|
|
1110
|
+
if (listenTarget.type === "tcp") {
|
|
1111
|
+
httpServer.listen(listenTarget.port, listenTarget.host);
|
|
1112
|
+
}
|
|
1113
|
+
else {
|
|
1114
|
+
if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
|
|
1115
|
+
unlinkSync(listenTarget.path);
|
|
1116
|
+
}
|
|
1117
|
+
httpServer.listen(listenTarget.path);
|
|
1118
|
+
}
|
|
1119
|
+
});
|
|
1120
|
+
// Start speech service after listening so synchronous Sherpa native
|
|
1121
|
+
// model loading doesn't block the server from accepting connections.
|
|
1122
|
+
speechService.start();
|
|
1123
|
+
scriptHealthMonitor.start();
|
|
1124
|
+
await extensionService.start();
|
|
1125
|
+
}
|
|
1126
|
+
catch (error) {
|
|
1127
|
+
await serviceProxy.stopStandalone().catch(() => undefined);
|
|
1128
|
+
if (mainStarted) {
|
|
1129
|
+
httpServer.closeAllConnections();
|
|
1130
|
+
await new Promise((resolve) => httpServer.close(() => resolve()));
|
|
1131
|
+
}
|
|
1132
|
+
throw error;
|
|
1133
|
+
}
|
|
1134
|
+
};
|
|
1135
|
+
const stop = async () => {
|
|
1136
|
+
scriptHealthMonitor.stop();
|
|
1137
|
+
await extensionService.stop().catch(() => undefined);
|
|
1138
|
+
await closeAllAgents(logger, agentManager);
|
|
1139
|
+
await agentManager.flush().catch(() => undefined);
|
|
1140
|
+
detachAgentStoragePersistence();
|
|
1141
|
+
await agentStorage.flush().catch(() => undefined);
|
|
1142
|
+
await providerSnapshotManager.shutdown();
|
|
1143
|
+
terminalManager.killAll();
|
|
1144
|
+
speechService.stop();
|
|
1145
|
+
await scheduleService.stop().catch(() => undefined);
|
|
1146
|
+
await relayTransport?.stop().catch(() => undefined);
|
|
1147
|
+
if (wsServer) {
|
|
1148
|
+
await wsServer.close();
|
|
1149
|
+
}
|
|
1150
|
+
pushSubsystem?.dispose();
|
|
1151
|
+
await serviceProxy.stopStandalone();
|
|
1152
|
+
// Force-drop remaining sockets so httpServer.close() resolves promptly.
|
|
1153
|
+
// We've already closed wsServer (which sent ws-layer close frames) and
|
|
1154
|
+
// stopped every other service, so anything still attached is a TCP
|
|
1155
|
+
// socket whose higher-level shutdown hasn't fully released it (e.g.
|
|
1156
|
+
// upgraded WS sockets in the closing handshake, or HTTP keep-alive
|
|
1157
|
+
// sockets in CLOSE_WAIT). closeIdleConnections() does not catch
|
|
1158
|
+
// upgraded sockets, so we use closeAllConnections() here.
|
|
1159
|
+
httpServer.closeAllConnections();
|
|
1160
|
+
await new Promise((resolve) => {
|
|
1161
|
+
httpServer.close(() => resolve());
|
|
1162
|
+
});
|
|
1163
|
+
// Clean up socket files
|
|
1164
|
+
if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
|
|
1165
|
+
unlinkSync(listenTarget.path);
|
|
1166
|
+
}
|
|
1167
|
+
};
|
|
1168
|
+
return {
|
|
1169
|
+
config,
|
|
1170
|
+
agentManager,
|
|
1171
|
+
agentStorage,
|
|
1172
|
+
workflowManager,
|
|
1173
|
+
terminalManager,
|
|
1174
|
+
serviceProxy,
|
|
1175
|
+
scriptRuntimeStore,
|
|
1176
|
+
browserToolsBroker,
|
|
1177
|
+
start,
|
|
1178
|
+
stop,
|
|
1179
|
+
getListenTarget: () => boundListenTarget,
|
|
1180
|
+
};
|
|
1181
|
+
}
|
|
1182
|
+
async function closeAllAgents(logger, agentManager) {
|
|
1183
|
+
const agents = agentManager.listAgents();
|
|
1184
|
+
await Promise.all(agents.map(async (agent) => {
|
|
1185
|
+
try {
|
|
1186
|
+
await agentManager.closeAgent(agent.id);
|
|
1187
|
+
}
|
|
1188
|
+
catch (err) {
|
|
1189
|
+
logger.error({ err, agentId: agent.id }, "Failed to close agent");
|
|
1190
|
+
}
|
|
1191
|
+
}));
|
|
1192
|
+
}
|
|
1193
|
+
//# sourceMappingURL=bootstrap.js.map
|