@hyperdrive.bot/fleet-server 0.3.99
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 +156 -0
- package/dist/scripts/supervisor-log-config.js +31 -0
- package/dist/scripts/supervisor.js +345 -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-list-filter.d.ts +76 -0
- package/dist/server/server/agent/agent-list-filter.js +184 -0
- package/dist/server/server/agent/agent-loading.d.ts +12 -0
- package/dist/server/server/agent/agent-loading.js +76 -0
- package/dist/server/server/agent/agent-manager.d.ts +628 -0
- package/dist/server/server/agent/agent-manager.js +3370 -0
- package/dist/server/server/agent/agent-projections.d.ts +65 -0
- package/dist/server/server/agent/agent-projections.js +548 -0
- package/dist/server/server/agent/agent-prompt.d.ts +65 -0
- package/dist/server/server/agent/agent-prompt.js +271 -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 +809 -0
- package/dist/server/server/agent/agent-sdk-types.js +22 -0
- package/dist/server/server/agent/agent-storage.d.ts +209 -0
- package/dist/server/server/agent/agent-storage.js +365 -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 +277 -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/authorship-ledger.d.ts +139 -0
- package/dist/server/server/agent/authorship-ledger.js +207 -0
- package/dist/server/server/agent/authorship-markup.d.ts +198 -0
- package/dist/server/server/agent/authorship-markup.js +288 -0
- package/dist/server/server/agent/blocker-log.d.ts +81 -0
- package/dist/server/server/agent/blocker-log.js +113 -0
- package/dist/server/server/agent/card-move-log.d.ts +66 -0
- package/dist/server/server/agent/card-move-log.js +113 -0
- package/dist/server/server/agent/create-agent/create.d.ts +126 -0
- package/dist/server/server/agent/create-agent/create.js +378 -0
- package/dist/server/server/agent/create-agent/routine.d.ts +45 -0
- package/dist/server/server/agent/create-agent/routine.js +53 -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 +52 -0
- package/dist/server/server/agent/import-sessions.js +170 -0
- package/dist/server/server/agent/jarvis-judge.d.ts +157 -0
- package/dist/server/server/agent/jarvis-judge.js +289 -0
- package/dist/server/server/agent/judge-relay-gate.d.ts +70 -0
- package/dist/server/server/agent/judge-relay-gate.js +92 -0
- package/dist/server/server/agent/lifecycle-command.d.ts +75 -0
- package/dist/server/server/agent/lifecycle-command.js +97 -0
- package/dist/server/server/agent/mcp-server.d.ts +22 -0
- package/dist/server/server/agent/mcp-server.js +653 -0
- package/dist/server/server/agent/mcp-shared.d.ts +239 -0
- package/dist/server/server/agent/mcp-shared.js +200 -0
- package/dist/server/server/agent/output-language.d.ts +16 -0
- package/dist/server/server/agent/output-language.js +62 -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-config-reload.d.ts +27 -0
- package/dist/server/server/agent/provider-config-reload.js +65 -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-contract.d.ts +40 -0
- package/dist/server/server/agent/provider-registry-contract.js +28 -0
- package/dist/server/server/agent/provider-registry.d.ts +97 -0
- package/dist/server/server/agent/provider-registry.js +686 -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 +166 -0
- package/dist/server/server/agent/provider-snapshot-manager.js +760 -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 +491 -0
- package/dist/server/server/agent/providers/claude/agent.js +5128 -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 +217 -0
- package/dist/server/server/agent/providers/claude/background-task-tracker.js +511 -0
- package/dist/server/server/agent/providers/claude/background-work-kinds.d.ts +124 -0
- package/dist/server/server/agent/providers/claude/background-work-kinds.js +96 -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 +116 -0
- package/dist/server/server/agent/providers/claude/model-manifest.js +279 -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 +62 -0
- package/dist/server/server/agent/providers/claude/pty-session-launcher.js +175 -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-allowlist-guard.d.ts +41 -0
- package/dist/server/server/agent/providers/claude/tool-allowlist-guard.js +95 -0
- package/dist/server/server/agent/providers/claude/tool-allowlist.d.ts +68 -0
- package/dist/server/server/agent/providers/claude/tool-allowlist.js +133 -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 +493 -0
- package/dist/server/server/agent/providers/claude/transport/pty-query.js +2075 -0
- package/dist/server/server/agent/providers/claude/transport/pty.d.ts +153 -0
- package/dist/server/server/agent/providers/claude/transport/pty.js +367 -0
- package/dist/server/server/agent/providers/claude/transport/redact.d.ts +8 -0
- package/dist/server/server/agent/providers/claude/transport/redact.js +33 -0
- package/dist/server/server/agent/providers/claude/transport/sdk.d.ts +65 -0
- package/dist/server/server/agent/providers/claude/transport/sdk.js +219 -0
- package/dist/server/server/agent/providers/claude/transport/tmux.d.ts +141 -0
- package/dist/server/server/agent/providers/claude/transport/tmux.js +218 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.d.ts +53 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.js +243 -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 +50 -0
- package/dist/server/server/agent/providers/claude/transport/truncate-session.js +121 -0
- package/dist/server/server/agent/providers/claude/transport/turn-id-reconciler.d.ts +36 -0
- package/dist/server/server/agent/providers/claude/transport/turn-id-reconciler.js +75 -0
- package/dist/server/server/agent/providers/claude/transport/types.d.ts +61 -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 +4515 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.js +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 +293 -0
- package/dist/server/server/agent/providers/opencode-agent.js +2908 -0
- package/dist/server/server/agent/providers/pi/agent.d.ts +137 -0
- package/dist/server/server/agent/providers/pi/agent.js +1651 -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 +64 -0
- package/dist/server/server/agent/session-digest-generator.js +306 -0
- package/dist/server/server/agent/session-digest.d.ts +81 -0
- package/dist/server/server/agent/session-digest.js +226 -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 +47 -0
- package/dist/server/server/agent/stt-manager.js +263 -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 +66 -0
- package/dist/server/server/agent/tools/paseo-tools.js +2616 -0
- package/dist/server/server/agent/tools/read-only-surface.d.ts +53 -0
- package/dist/server/server/agent/tools/read-only-surface.js +69 -0
- package/dist/server/server/agent/tools/types.d.ts +41 -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 +68 -0
- package/dist/server/server/auth.js +207 -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 +163 -0
- package/dist/server/server/bootstrap.js +1597 -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 +20 -0
- package/dist/server/server/config.js +427 -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 +78 -0
- package/dist/server/server/daemon-config-store.js +320 -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 +95 -0
- package/dist/server/server/dictation/dictation-stream-manager.js +581 -0
- package/dist/server/server/editor-targets.d.ts +18 -0
- package/dist/server/server/editor-targets.js +109 -0
- package/dist/server/server/ensure-workspace-for-create.d.ts +30 -0
- package/dist/server/server/ensure-workspace-for-create.js +20 -0
- package/dist/server/server/exports.d.ts +28 -0
- package/dist/server/server/exports.js +31 -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/mime-types.d.ts +58 -0
- package/dist/server/server/file-explorer/mime-types.js +212 -0
- package/dist/server/server/file-explorer/service.d.ts +97 -0
- package/dist/server/server/file-explorer/service.js +362 -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/fleet/decision-service.d.ts +47 -0
- package/dist/server/server/fleet/decision-service.js +156 -0
- package/dist/server/server/fleet/fleet-controls.d.ts +77 -0
- package/dist/server/server/fleet/fleet-controls.js +217 -0
- package/dist/server/server/fleet/fleet-reader.d.ts +106 -0
- package/dist/server/server/fleet/fleet-reader.js +470 -0
- package/dist/server/server/fleet/fleet-scaffold.d.ts +26 -0
- package/dist/server/server/fleet/fleet-scaffold.js +48 -0
- package/dist/server/server/fleet/fleet-scheduler.d.ts +75 -0
- package/dist/server/server/fleet/fleet-scheduler.js +186 -0
- package/dist/server/server/fleet/fleet-service.d.ts +75 -0
- package/dist/server/server/fleet/fleet-service.js +134 -0
- package/dist/server/server/hostnames.d.ts +13 -0
- package/dist/server/server/hostnames.js +94 -0
- package/dist/server/server/ingestion/adapters.d.ts +21 -0
- package/dist/server/server/ingestion/adapters.js +27 -0
- package/dist/server/server/ingestion/apply.d.ts +220 -0
- package/dist/server/server/ingestion/apply.js +345 -0
- package/dist/server/server/ingestion/backfill.d.ts +123 -0
- package/dist/server/server/ingestion/backfill.js +160 -0
- package/dist/server/server/ingestion/cap-limiter.d.ts +148 -0
- package/dist/server/server/ingestion/cap-limiter.js +264 -0
- package/dist/server/server/ingestion/cohort-recorder-memory.d.ts +25 -0
- package/dist/server/server/ingestion/cohort-recorder-memory.js +78 -0
- package/dist/server/server/ingestion/cohort-recorder-store.d.ts +12 -0
- package/dist/server/server/ingestion/cohort-recorder-store.js +99 -0
- package/dist/server/server/ingestion/cohort-resume.d.ts +22 -0
- package/dist/server/server/ingestion/cohort-resume.js +171 -0
- package/dist/server/server/ingestion/cohort-store.d.ts +227 -0
- package/dist/server/server/ingestion/cohort-store.js +462 -0
- package/dist/server/server/ingestion/composio/gateway.d.ts +8 -0
- package/dist/server/server/ingestion/composio/gateway.js +469 -0
- package/dist/server/server/ingestion/dry-run.d.ts +70 -0
- package/dist/server/server/ingestion/dry-run.js +142 -0
- package/dist/server/server/ingestion/errors.d.ts +48 -0
- package/dist/server/server/ingestion/errors.js +63 -0
- package/dist/server/server/ingestion/external-user-id.d.ts +24 -0
- package/dist/server/server/ingestion/external-user-id.js +35 -0
- package/dist/server/server/ingestion/filters/store.d.ts +28 -0
- package/dist/server/server/ingestion/filters/store.js +74 -0
- package/dist/server/server/ingestion/fingerprint.d.ts +13 -0
- package/dist/server/server/ingestion/fingerprint.js +31 -0
- package/dist/server/server/ingestion/grouping.d.ts +26 -0
- package/dist/server/server/ingestion/grouping.js +116 -0
- package/dist/server/server/ingestion/hard-failure.d.ts +73 -0
- package/dist/server/server/ingestion/hard-failure.js +125 -0
- package/dist/server/server/ingestion/health.d.ts +38 -0
- package/dist/server/server/ingestion/health.js +90 -0
- package/dist/server/server/ingestion/ledger-schema.d.ts +99 -0
- package/dist/server/server/ingestion/ledger-schema.js +359 -0
- package/dist/server/server/ingestion/ledger.d.ts +562 -0
- package/dist/server/server/ingestion/ledger.js +881 -0
- package/dist/server/server/ingestion/match.d.ts +57 -0
- package/dist/server/server/ingestion/match.js +102 -0
- package/dist/server/server/ingestion/pipedream/gateway.d.ts +8 -0
- package/dist/server/server/ingestion/pipedream/gateway.js +282 -0
- package/dist/server/server/ingestion/presets.d.ts +57 -0
- package/dist/server/server/ingestion/presets.js +57 -0
- package/dist/server/server/ingestion/reconcile/artifact-kind.d.ts +19 -0
- package/dist/server/server/ingestion/reconcile/artifact-kind.js +65 -0
- package/dist/server/server/ingestion/reconcile/calendar.d.ts +19 -0
- package/dist/server/server/ingestion/reconcile/calendar.js +110 -0
- package/dist/server/server/ingestion/reconcile/constants.d.ts +60 -0
- package/dist/server/server/ingestion/reconcile/constants.js +62 -0
- package/dist/server/server/ingestion/reconcile/github.d.ts +21 -0
- package/dist/server/server/ingestion/reconcile/github.js +83 -0
- package/dist/server/server/ingestion/reconcile/gitlab.d.ts +23 -0
- package/dist/server/server/ingestion/reconcile/gitlab.js +94 -0
- package/dist/server/server/ingestion/reconcile/gmail.d.ts +9 -0
- package/dist/server/server/ingestion/reconcile/gmail.js +141 -0
- package/dist/server/server/ingestion/reconcile/jira.d.ts +17 -0
- package/dist/server/server/ingestion/reconcile/jira.js +76 -0
- package/dist/server/server/ingestion/reconcile/kinds.d.ts +16 -0
- package/dist/server/server/ingestion/reconcile/kinds.js +59 -0
- package/dist/server/server/ingestion/reconcile/mcp-call.d.ts +18 -0
- package/dist/server/server/ingestion/reconcile/mcp-call.js +105 -0
- package/dist/server/server/ingestion/reconcile/payload.d.ts +38 -0
- package/dist/server/server/ingestion/reconcile/payload.js +82 -0
- package/dist/server/server/ingestion/reconcile/registry.d.ts +40 -0
- package/dist/server/server/ingestion/reconcile/registry.js +72 -0
- package/dist/server/server/ingestion/reconcile/runner.d.ts +43 -0
- package/dist/server/server/ingestion/reconcile/runner.js +91 -0
- package/dist/server/server/ingestion/reconcile/sentry.d.ts +20 -0
- package/dist/server/server/ingestion/reconcile/sentry.js +85 -0
- package/dist/server/server/ingestion/reconcile/service.d.ts +134 -0
- package/dist/server/server/ingestion/reconcile/service.js +409 -0
- package/dist/server/server/ingestion/reconcile/signature-guard.d.ts +30 -0
- package/dist/server/server/ingestion/reconcile/signature-guard.js +82 -0
- package/dist/server/server/ingestion/reconcile/testing/fake-mcp-server.d.ts +68 -0
- package/dist/server/server/ingestion/reconcile/testing/fake-mcp-server.js +158 -0
- package/dist/server/server/ingestion/reconcile/types.d.ts +65 -0
- package/dist/server/server/ingestion/reconcile/types.js +11 -0
- package/dist/server/server/ingestion/reconcile/verdict-mapping.d.ts +54 -0
- package/dist/server/server/ingestion/reconcile/verdict-mapping.js +82 -0
- package/dist/server/server/ingestion/resolve-items.d.ts +23 -0
- package/dist/server/server/ingestion/resolve-items.js +54 -0
- package/dist/server/server/ingestion/run-projection.d.ts +35 -0
- package/dist/server/server/ingestion/run-projection.js +76 -0
- package/dist/server/server/ingestion/service.d.ts +147 -0
- package/dist/server/server/ingestion/service.js +364 -0
- package/dist/server/server/ingestion/sources/store.d.ts +27 -0
- package/dist/server/server/ingestion/sources/store.js +71 -0
- package/dist/server/server/ingestion/testing/claim-and-hang.d.ts +2 -0
- package/dist/server/server/ingestion/testing/claim-and-hang.js +21 -0
- package/dist/server/server/ingestion/testing/cohort-crash.d.ts +2 -0
- package/dist/server/server/ingestion/testing/cohort-crash.js +89 -0
- package/dist/server/server/ingestion/types.d.ts +226 -0
- package/dist/server/server/ingestion/types.js +18 -0
- package/dist/server/server/ingestion/utc-day.d.ts +27 -0
- package/dist/server/server/ingestion/utc-day.js +44 -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 +390 -0
- package/dist/server/server/persisted-config.js +424 -0
- package/dist/server/server/persistence-hooks.d.ts +32 -0
- package/dist/server/server/persistence-hooks.js +99 -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 +188 -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/reference-enricher.d.ts +41 -0
- package/dist/server/server/reference-enricher.js +392 -0
- package/dist/server/server/relay-transport.d.ts +31 -0
- package/dist/server/server/relay-transport.js +545 -0
- package/dist/server/server/resolve-workspace-id-for-path.d.ts +4 -0
- package/dist/server/server/resolve-workspace-id-for-path.js +71 -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/restart-manifest.d.ts +83 -0
- package/dist/server/server/restart-manifest.js +122 -0
- package/dist/server/server/resume-after-restart.d.ts +50 -0
- package/dist/server/server/resume-after-restart.js +108 -0
- package/dist/server/server/schedule/create-cadence.d.ts +22 -0
- package/dist/server/server/schedule/create-cadence.js +70 -0
- package/dist/server/server/schedule/cron.d.ts +8 -0
- package/dist/server/server/schedule/cron.js +114 -0
- package/dist/server/server/schedule/service.d.ts +207 -0
- package/dist/server/server/schedule/service.js +867 -0
- package/dist/server/server/schedule/source-prompt.d.ts +42 -0
- package/dist/server/server/schedule/source-prompt.js +87 -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/search/extract.d.ts +53 -0
- package/dist/server/server/search/extract.js +222 -0
- package/dist/server/server/search/index-store.d.ts +83 -0
- package/dist/server/server/search/index-store.js +241 -0
- package/dist/server/server/search/indexer.d.ts +69 -0
- package/dist/server/server/search/indexer.js +362 -0
- package/dist/server/server/search/resolve-cwd.d.ts +40 -0
- package/dist/server/server/search/resolve-cwd.js +109 -0
- package/dist/server/server/search/session-search-service.d.ts +59 -0
- package/dist/server/server/search/session-search-service.js +171 -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-ingestion-session.d.ts +285 -0
- package/dist/server/server/session/chat/chat-ingestion-session.js +504 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +175 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.js +720 -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 +89 -0
- package/dist/server/server/session/daemon/daemon-session.js +179 -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 +53 -0
- package/dist/server/server/session/files/workspace-files-session.js +245 -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/ingestion/source-session.d.ts +78 -0
- package/dist/server/server/session/ingestion/source-session.js +191 -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 +105 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +364 -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 +899 -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 +46 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +214 -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 +677 -0
- package/dist/server/server/session.js +6531 -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/tenant-token-verifier.d.ts +43 -0
- package/dist/server/server/tenant-token-verifier.js +79 -0
- package/dist/server/server/update/installer.d.ts +70 -0
- package/dist/server/server/update/installer.js +181 -0
- package/dist/server/server/update/registry.d.ts +47 -0
- package/dist/server/server/update/registry.js +95 -0
- package/dist/server/server/update/slots.d.ts +45 -0
- package/dist/server/server/update/slots.js +97 -0
- package/dist/server/server/update/state.d.ts +41 -0
- package/dist/server/server/update/state.js +65 -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 +247 -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 +231 -0
- package/dist/server/server/websocket-server.js +1853 -0
- package/dist/server/server/whatsapp-bridge.d.ts +74 -0
- package/dist/server/server/whatsapp-bridge.js +142 -0
- package/dist/server/server/workflow/workflow-agent-resolution.d.ts +82 -0
- package/dist/server/server/workflow/workflow-agent-resolution.js +105 -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 +363 -0
- package/dist/server/server/workflow/workflow-manager.js +852 -0
- package/dist/server/server/workflow/workflow-progress.d.ts +148 -0
- package/dist/server/server/workflow/workflow-progress.js +274 -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 +218 -0
- package/dist/server/server/workspace/recall-search-feature.d.ts +2 -0
- package/dist/server/server/workspace/recall-search-feature.js +31 -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 +40 -0
- package/dist/server/server/workspace/sessions-search-route.js +74 -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 +440 -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 +860 -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-67f19cbfce758da6aa23c38c2dbd6a33.js +5 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js +16683 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js +5 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js +11 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js +60 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.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 +196 -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 +424 -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/server/update/slots.js +97 -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 +146 -0
|
@@ -0,0 +1,1597 @@
|
|
|
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, userInfo } 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 { CardMoveLog } from "./agent/card-move-log.js";
|
|
95
|
+
import { BlockerLog } from "./agent/blocker-log.js";
|
|
96
|
+
import { AUTHORSHIP_ENV_FLAG, createAuthorshipLedger } from "./agent/authorship-ledger.js";
|
|
97
|
+
import { AUTHORSHIP_MARKUP_ENV_FLAG, AUTHORSHIP_SPEAKER_ENV, createAuthorshipMarkup, } from "./agent/authorship-markup.js";
|
|
98
|
+
import { JudgeRelayGate } from "./agent/judge-relay-gate.js";
|
|
99
|
+
import { JarvisJudge } from "./agent/jarvis-judge.js";
|
|
100
|
+
import { registerAgentRoutes } from "./agent/agent-routes.js";
|
|
101
|
+
import { AgentStorage } from "./agent/agent-storage.js";
|
|
102
|
+
import { attachAgentStoragePersistence } from "./persistence-hooks.js";
|
|
103
|
+
import { writeRestartManifest } from "./restart-manifest.js";
|
|
104
|
+
import { collectInFlightAgentIds, resumeAgentsAfterRestart } from "./resume-after-restart.js";
|
|
105
|
+
import { WorkflowStorage } from "./workflow/workflow-storage.js";
|
|
106
|
+
import { WORKFLOWS_FEATURE_ENABLED } from "./workflow/workflow-feature.js";
|
|
107
|
+
import { registerWorkflowHttpRoutes } from "./workflow/workflow-http-routes.js";
|
|
108
|
+
import { WorkflowManager } from "./workflow/workflow-manager.js";
|
|
109
|
+
import { createAgentMcpServer } from "./agent/mcp-server.js";
|
|
110
|
+
import { createPaseoToolCatalog, } from "./agent/tools/paseo-tools.js";
|
|
111
|
+
import { ProviderSnapshotManager } from "./agent/provider-snapshot-manager.js";
|
|
112
|
+
import { bootstrapWorkspaceRegistries } from "./workspace-registry-bootstrap.js";
|
|
113
|
+
import { WorkspaceReconciliationService } from "./workspace-reconciliation-service.js";
|
|
114
|
+
import { FileBackedProjectRegistry, FileBackedWorkspaceRegistry } from "./workspace-registry.js";
|
|
115
|
+
import { FileBackedChatService } from "./chat/chat-service.js";
|
|
116
|
+
import { CheckoutDiffManager } from "./checkout-diff-manager.js";
|
|
117
|
+
import { LoopService } from "./loop-service.js";
|
|
118
|
+
import { ScheduleService } from "./schedule/service.js";
|
|
119
|
+
import { IngestionService } from "./ingestion/service.js";
|
|
120
|
+
import { FilterStore, filtersDir } from "./ingestion/filters/store.js";
|
|
121
|
+
import { SourceStore } from "./ingestion/sources/store.js";
|
|
122
|
+
import { resolveSourceGateway } from "./ingestion/adapters.js";
|
|
123
|
+
import { CapLimiter } from "./ingestion/cap-limiter.js";
|
|
124
|
+
import { IngestionLedger } from "./ingestion/ledger.js";
|
|
125
|
+
import { InMemoryCohortRecorder } from "./ingestion/cohort-recorder-memory.js";
|
|
126
|
+
import { CohortStoreRecorder } from "./ingestion/cohort-recorder-store.js";
|
|
127
|
+
import { CohortStore } from "./ingestion/cohort-store.js";
|
|
128
|
+
import { resumeCohorts } from "./ingestion/cohort-resume.js";
|
|
129
|
+
import { resolveMatchedItems } from "./ingestion/resolve-items.js";
|
|
130
|
+
import { BACKFILL_WINDOW_OPTIONS_DAYS } from "./ingestion/backfill.js";
|
|
131
|
+
import { createExtensionService } from "../extensions/extension-service.js";
|
|
132
|
+
import { DaemonConfigStore } from "./daemon-config-store.js";
|
|
133
|
+
import { BrowserToolsBroker } from "./browser-tools/broker.js";
|
|
134
|
+
import { DaemonConfigBrowserToolsPolicy } from "./browser-tools/policy.js";
|
|
135
|
+
import { WorkspaceGitServiceImpl } from "./workspace-git-service.js";
|
|
136
|
+
import { resolveWorkspaceIdForPath } from "./resolve-workspace-id-for-path.js";
|
|
137
|
+
import { ensureWorkspaceForCreate } from "./ensure-workspace-for-create.js";
|
|
138
|
+
import { archivePersistedWorkspaceRecord, } from "./workspace-archive-service.js";
|
|
139
|
+
import { setupAutoArchiveOnMerge } from "./auto-archive-on-merge/index.js";
|
|
140
|
+
import { wrapSessionMessage } from "./messages.js";
|
|
141
|
+
import { createConfiguredTerminalManager } from "../terminal/terminal-manager-factory.js";
|
|
142
|
+
import { applyTerminalAgentHookSetting } from "../terminal/agent-hooks/terminal-agent-hook-setting.js";
|
|
143
|
+
import { createConnectionOfferV2, encodeOfferToFragmentUrl } from "./connection-offer.js";
|
|
144
|
+
import { loadOrCreateDaemonKeyPair } from "./daemon-keypair.js";
|
|
145
|
+
import { startRelayTransport } from "./relay-transport.js";
|
|
146
|
+
import { getOrCreateServerId } from "./server-id.js";
|
|
147
|
+
import { resolveDaemonVersion } from "./daemon-version.js";
|
|
148
|
+
import { createServiceProxySubsystem } from "./service-proxy.js";
|
|
149
|
+
import { ScriptHealthMonitor } from "./script-health-monitor.js";
|
|
150
|
+
import { createScriptStatusEmitter } from "./script-status-projection.js";
|
|
151
|
+
import { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js";
|
|
152
|
+
import { createManagedProcessRegistry, createSystemManagedProcessTable, } from "./managed-processes/managed-processes.js";
|
|
153
|
+
import { terminateWithTreeKill } from "../utils/tree-kill.js";
|
|
154
|
+
import { isHostnameAllowed } from "./hostnames.js";
|
|
155
|
+
import { createRequireBearerMiddleware, isAgentMcpRequestAuthorized, } from "./auth.js";
|
|
156
|
+
import { createWebUiMiddleware } from "./web-ui.js";
|
|
157
|
+
import { registerSessionRenameRoute } from "./session/session-rename-route.js";
|
|
158
|
+
import { WorkspaceAutoName } from "./workspace-auto-name.js";
|
|
159
|
+
import { createGitMutationService } from "./session/git-mutation/git-mutation-service.js";
|
|
160
|
+
import { workspaceIdsOnCheckout } from "./workspace-directory.js";
|
|
161
|
+
import { resolveFirstAgentPromptTitle } from "./agent/create-agent-title.js";
|
|
162
|
+
const MAX_MCP_DEBUG_BATCH_ITEMS = 10;
|
|
163
|
+
const REDACTED_LOG_VALUE = "[redacted]";
|
|
164
|
+
const DOWNLOAD_OPEN_FLAGS = process.platform === "win32" ? constants.O_RDONLY : constants.O_RDONLY | constants.O_NOFOLLOW;
|
|
165
|
+
function formatHostForHttpUrl(host) {
|
|
166
|
+
return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
|
|
167
|
+
}
|
|
168
|
+
function resolveAgentMcpClientHost(host) {
|
|
169
|
+
if (host === "0.0.0.0") {
|
|
170
|
+
return "127.0.0.1";
|
|
171
|
+
}
|
|
172
|
+
if (host === "::" || host === "[::]") {
|
|
173
|
+
return "::1";
|
|
174
|
+
}
|
|
175
|
+
return host;
|
|
176
|
+
}
|
|
177
|
+
function createAgentMcpBaseUrl(listenTarget) {
|
|
178
|
+
if (!listenTarget || listenTarget.type !== "tcp") {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const host = resolveAgentMcpClientHost(listenTarget.host);
|
|
182
|
+
return new URL("/mcp/agents", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
|
|
183
|
+
}
|
|
184
|
+
function createTerminalActivityUrl(listenTarget) {
|
|
185
|
+
if (!listenTarget || listenTarget.type !== "tcp") {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
const host = resolveAgentMcpClientHost(listenTarget.host);
|
|
189
|
+
return new URL("/api/terminal-activity", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
|
|
190
|
+
}
|
|
191
|
+
const TerminalActivityReportSchema = z.object({
|
|
192
|
+
terminalId: z.string().min(1),
|
|
193
|
+
token: z.string().min(1),
|
|
194
|
+
state: z.enum(["running", "idle", "needs-input"]),
|
|
195
|
+
});
|
|
196
|
+
const TERMINAL_ACTIVITY_STATE_MAP = {
|
|
197
|
+
running: "working",
|
|
198
|
+
idle: "idle",
|
|
199
|
+
"needs-input": "attention",
|
|
200
|
+
};
|
|
201
|
+
const LOOPBACK_REMOTE_ADDRESSES = new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
|
|
202
|
+
function isLoopbackRemoteAddress(remoteAddress) {
|
|
203
|
+
return remoteAddress !== undefined && LOOPBACK_REMOTE_ADDRESSES.has(remoteAddress);
|
|
204
|
+
}
|
|
205
|
+
export function createTerminalActivityRouteHandler(terminalManager) {
|
|
206
|
+
return async (req, res) => {
|
|
207
|
+
if (!isLoopbackRemoteAddress(req.socket.remoteAddress)) {
|
|
208
|
+
res.status(403).json({ error: "Forbidden" });
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const parsed = TerminalActivityReportSchema.safeParse(req.body);
|
|
212
|
+
if (!parsed.success) {
|
|
213
|
+
res.status(400).json({ error: "Invalid terminal activity report" });
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const validation = terminalManager.validateTerminalActivityToken(parsed.data.terminalId, parsed.data.token);
|
|
217
|
+
if (validation !== "valid") {
|
|
218
|
+
res.status(403).json({ error: "Forbidden" });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const updated = await terminalManager.setTerminalActivity(parsed.data.terminalId, TERMINAL_ACTIVITY_STATE_MAP[parsed.data.state]);
|
|
223
|
+
if (!updated) {
|
|
224
|
+
res.status(403).json({ error: "Forbidden" });
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
res.status(204).end();
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
res.status(500).json({ error: "Failed to update terminal activity" });
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function summarizeAgentMcpDebugMessage(body) {
|
|
235
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) {
|
|
236
|
+
return {
|
|
237
|
+
type: body === null ? "null" : typeof body,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const record = body;
|
|
241
|
+
const method = typeof record.method === "string" ? record.method : undefined;
|
|
242
|
+
return {
|
|
243
|
+
type: "object",
|
|
244
|
+
...(typeof record.jsonrpc === "string" ? { jsonrpc: record.jsonrpc } : {}),
|
|
245
|
+
...(method ? { method } : {}),
|
|
246
|
+
hasId: Object.prototype.hasOwnProperty.call(record, "id"),
|
|
247
|
+
hasParams: Object.prototype.hasOwnProperty.call(record, "params"),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function summarizeAgentMcpDebugBody(body) {
|
|
251
|
+
if (!Array.isArray(body)) {
|
|
252
|
+
return summarizeAgentMcpDebugMessage(body);
|
|
253
|
+
}
|
|
254
|
+
const messages = body.slice(0, MAX_MCP_DEBUG_BATCH_ITEMS).map(summarizeAgentMcpDebugMessage);
|
|
255
|
+
return {
|
|
256
|
+
type: "batch",
|
|
257
|
+
count: body.length,
|
|
258
|
+
messages,
|
|
259
|
+
...(body.length > messages.length ? { omitted: body.length - messages.length } : {}),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function createBootstrapManagedProcessRegistry(config, logger) {
|
|
263
|
+
if (config.managedProcesses) {
|
|
264
|
+
return config.managedProcesses;
|
|
265
|
+
}
|
|
266
|
+
return createManagedProcessRegistry({
|
|
267
|
+
paseoHome: config.paseoHome,
|
|
268
|
+
processTable: createSystemManagedProcessTable(),
|
|
269
|
+
terminateProcess: terminateWithTreeKill,
|
|
270
|
+
logger,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
async function reconcileManagedProcessLedger(managedProcesses, logger) {
|
|
274
|
+
const reapResult = await managedProcesses.reapStale();
|
|
275
|
+
if (reapResult.checked > 0 || reapResult.errors.length > 0) {
|
|
276
|
+
logger.info(reapResult, "Managed helper process ledger reconciled");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function mountWebUi(app, config, logger) {
|
|
280
|
+
app.use(createWebUiMiddleware({
|
|
281
|
+
enabled: config.webUi?.enabled ?? false,
|
|
282
|
+
distDir: config.webUi?.distDir ?? null,
|
|
283
|
+
label: getHostname(),
|
|
284
|
+
logger,
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
function resolveExpressTrustProxySetting(config) {
|
|
288
|
+
return config.trustedProxies ?? ["loopback"];
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Builds the config object broadcast to every connected client.
|
|
292
|
+
*
|
|
293
|
+
* Exported for the ingestion config-no-leak test: MutableDaemonConfigSchema is
|
|
294
|
+
* `.passthrough()`, so nothing downstream strips an unknown key. This function
|
|
295
|
+
* enumerating its output field by field, never spreading its input, is the only
|
|
296
|
+
* thing keeping a daemon-side secret off the wire.
|
|
297
|
+
*/
|
|
298
|
+
export function createInitialMutableDaemonConfig(config) {
|
|
299
|
+
const providers = Object.fromEntries(Object.entries(config.providerOverrides ?? {}).map(([providerId, override]) => {
|
|
300
|
+
const providerConfig = {};
|
|
301
|
+
if (override.enabled !== undefined) {
|
|
302
|
+
providerConfig.enabled = override.enabled;
|
|
303
|
+
}
|
|
304
|
+
if (override.additionalModels) {
|
|
305
|
+
providerConfig.additionalModels = override.additionalModels;
|
|
306
|
+
}
|
|
307
|
+
return [providerId, providerConfig];
|
|
308
|
+
}));
|
|
309
|
+
const initialConfig = {
|
|
310
|
+
mcp: { injectIntoAgents: config.mcpInjectIntoAgents ?? true },
|
|
311
|
+
browserTools: { enabled: config.browserToolsEnabled ?? false },
|
|
312
|
+
providers,
|
|
313
|
+
metadataGeneration: {
|
|
314
|
+
providers: config.metadataGeneration?.providers ?? [],
|
|
315
|
+
},
|
|
316
|
+
autoArchiveAfterMerge: config.autoArchiveAfterMerge ?? false,
|
|
317
|
+
ingestionReconcileEnabled: config.ingestionReconcileEnabled ?? true,
|
|
318
|
+
ingestionReconcileStaleMs: config.ingestionReconcileStaleMs ?? 60000,
|
|
319
|
+
enableTerminalAgentHooks: config.enableTerminalAgentHooks ?? false,
|
|
320
|
+
appendSystemPrompt: config.appendSystemPrompt ?? "",
|
|
321
|
+
};
|
|
322
|
+
if (config.terminalProfiles !== undefined) {
|
|
323
|
+
initialConfig.terminalProfiles = config.terminalProfiles;
|
|
324
|
+
}
|
|
325
|
+
// Left undefined when the daemon has never stored a board. The client reads
|
|
326
|
+
// that as "nothing to adopt yet" and seeds the daemon from its own local board
|
|
327
|
+
// on first connect, so upgrading never wipes the columns you already had.
|
|
328
|
+
if (config.kanbanBoard !== undefined) {
|
|
329
|
+
initialConfig.kanbanBoard = config.kanbanBoard;
|
|
330
|
+
}
|
|
331
|
+
return initialConfig;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* The aggregator gateway resolver: the injected one, or the real registry.
|
|
335
|
+
*
|
|
336
|
+
* A module function rather than an inline `??` because the daemon factory sits
|
|
337
|
+
* exactly on the repo's complexity ceiling, and one more branch tips it over.
|
|
338
|
+
*/
|
|
339
|
+
/**
|
|
340
|
+
* The daemon's ONE cohort store and the recorder `applySelection` writes through.
|
|
341
|
+
*
|
|
342
|
+
* A module function rather than two inline ternaries in `createPaseoDaemon`, for
|
|
343
|
+
* the same reason `buildCohortResumerOption` below is one: that function sits on
|
|
344
|
+
* the repo's complexity ceiling, and a guard reads better beside its reason.
|
|
345
|
+
*
|
|
346
|
+
* With a ledger: sqlite-backed, over the LEDGER'S OWN HANDLE, so a cohort
|
|
347
|
+
* survives a restart. Without one: the in-memory recorder, which is honest about
|
|
348
|
+
* not surviving a restart and is still strictly better than an apply that can
|
|
349
|
+
* dispatch sessions with nowhere to record having done so.
|
|
350
|
+
*/
|
|
351
|
+
function buildCohortRecording(ledger) {
|
|
352
|
+
if (!ledger) {
|
|
353
|
+
return { store: undefined, recorder: new InMemoryCohortRecorder() };
|
|
354
|
+
}
|
|
355
|
+
const store = new CohortStore({ db: ledger.database, now: () => Date.now() });
|
|
356
|
+
return { store, recorder: new CohortStoreRecorder(store) };
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* The `cohortResumer` option for `ScheduleService`, or nothing at all.
|
|
360
|
+
*
|
|
361
|
+
* A module function rather than an inline ternary in `createPaseoDaemon`: the
|
|
362
|
+
* three-way guard pushed that function past the repo's complexity ceiling, and
|
|
363
|
+
* the guard reads better next to the reason for it anyway - the same call
|
|
364
|
+
* `createChatIngestionSession` makes one file over.
|
|
365
|
+
*
|
|
366
|
+
* Returns `{}` when there is no ledger, no limiter or no store, because a resume
|
|
367
|
+
* that could not claim, could not count against the day's cap, or had nothing to
|
|
368
|
+
* read would dispatch sessions with no ceiling and no memory of having done so.
|
|
369
|
+
*/
|
|
370
|
+
function buildCohortResumerOption(deps) {
|
|
371
|
+
const { store, limiter, ledger } = deps;
|
|
372
|
+
if (!store || !limiter || !ledger) {
|
|
373
|
+
return {};
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
cohortResumer: () => resumeCohorts({
|
|
377
|
+
store,
|
|
378
|
+
filterResolver: (filterId) => deps.filterStore.get(filterId),
|
|
379
|
+
resolveItems: (filter, itemKeys) => resolveMatchedItems({
|
|
380
|
+
filter,
|
|
381
|
+
sourceStore: deps.sourceStore,
|
|
382
|
+
gatewayResolver: deps.gatewayResolver,
|
|
383
|
+
itemKeys,
|
|
384
|
+
windowDays: Math.max(...BACKFILL_WINDOW_OPTIONS_DAYS),
|
|
385
|
+
now: () => Date.now(),
|
|
386
|
+
}),
|
|
387
|
+
ledger,
|
|
388
|
+
schedule: deps.schedule(),
|
|
389
|
+
cohorts: deps.cohorts,
|
|
390
|
+
limiter,
|
|
391
|
+
runIdFactory: () => randomUUID(),
|
|
392
|
+
logger: deps.logger,
|
|
393
|
+
}),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function resolveIngestionGatewayResolver(config, ingestionConfig) {
|
|
397
|
+
return (config.ingestionGatewayResolver ??
|
|
398
|
+
((kind) => resolveSourceGateway(kind, { config: ingestionConfig })));
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Every ingestion collaborator the daemon needs, built in one place.
|
|
402
|
+
*
|
|
403
|
+
* Extracted from `createPaseoDaemon` purely to keep its branch count under the
|
|
404
|
+
* oxlint complexity cap: the `??` config defaults and the ledger-conditional
|
|
405
|
+
* limiter are three decision points that belong to ingestion, not to daemon
|
|
406
|
+
* startup. Construction order and behaviour are unchanged.
|
|
407
|
+
*/
|
|
408
|
+
function buildIngestionCollaborators(config, ingestionLedger) {
|
|
409
|
+
// Undefined when the ledger is: a limiter with nowhere durable to count would
|
|
410
|
+
// be an in-memory counter that resets on every restart, which is the exact
|
|
411
|
+
// failure the on-disk budget exists to prevent.
|
|
412
|
+
//
|
|
413
|
+
// ONE instance, TWO counters (Epic 5, Story 5.2). `admit`/`spent` spend the
|
|
414
|
+
// APPLY budget, a row in `ingestion_dispatch_budget`, on disk, surviving
|
|
415
|
+
// restarts, bounding outward artifacts. `admitDryRun`/`spentDryRun` spend the
|
|
416
|
+
// DRY-RUN budget, a Map on this object, in memory, reset by a restart, bounding
|
|
417
|
+
// only token spend. They are deliberately separate numbers on deliberately
|
|
418
|
+
// different substrates: a rehearsal must never consume the day's real
|
|
419
|
+
// allowance, and a restart must never hand back the day's real allowance.
|
|
420
|
+
const capLimiter = ingestionLedger ? new CapLimiter({ store: ingestionLedger }) : undefined;
|
|
421
|
+
// The ingestion collaborators are built HERE, above `ScheduleService`, rather
|
|
422
|
+
// than beside `IngestionService` further down, because `start()` runs the
|
|
423
|
+
// cohort resume and therefore needs the store to already exist. Every one of
|
|
424
|
+
// them is a pure constructor over config or a directory - no connection, no
|
|
425
|
+
// network - so moving them up costs nothing and removes a late-binding hazard.
|
|
426
|
+
const ingestionConfig = config.ingestion ?? {
|
|
427
|
+
pipedream: { environment: "development", allowedOrigins: [] },
|
|
428
|
+
composio: {},
|
|
429
|
+
};
|
|
430
|
+
// EXACTLY ONE cohort store per daemon, for the same reason there is exactly
|
|
431
|
+
// one ledger: two would be two answers to "what did that apply dispatch", and
|
|
432
|
+
// the client that asked second would get the emptier one.
|
|
433
|
+
//
|
|
434
|
+
// Story 5.4: sqlite-backed, over the LEDGER'S OWN HANDLE (`ingestionLedger.database`),
|
|
435
|
+
// so a cohort survives a restart and a half-dispatched batch is finished rather
|
|
436
|
+
// than orphaned. No second `new DatabaseSync(...)` anywhere in this file.
|
|
437
|
+
//
|
|
438
|
+
// The in-memory recorder remains the fallback for a daemon whose sqlite could
|
|
439
|
+
// not be opened. It is honest about what it cannot do - a cohort in that map is
|
|
440
|
+
// gone after a restart - and it is strictly better than an apply that can
|
|
441
|
+
// dispatch sessions with nowhere to record having done so.
|
|
442
|
+
const { store: ingestionCohortStore, recorder: ingestionCohorts } = buildCohortRecording(ingestionLedger);
|
|
443
|
+
const ingestionFilterStore = new FilterStore(filtersDir(config.paseoHome));
|
|
444
|
+
const ingestionSourceStore = new SourceStore(path.join(config.paseoHome, "sources"));
|
|
445
|
+
const ingestionGatewayResolver = resolveIngestionGatewayResolver(config, ingestionConfig);
|
|
446
|
+
return {
|
|
447
|
+
capLimiter,
|
|
448
|
+
ingestionCohortStore,
|
|
449
|
+
ingestionCohorts,
|
|
450
|
+
ingestionFilterStore,
|
|
451
|
+
ingestionSourceStore,
|
|
452
|
+
ingestionGatewayResolver,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
export async function createPaseoDaemon(config, rootLogger) {
|
|
456
|
+
const logger = rootLogger.child({ module: "bootstrap" });
|
|
457
|
+
const bootstrapStart = performance.now();
|
|
458
|
+
const elapsed = () => `${(performance.now() - bootstrapStart).toFixed(0)}ms`;
|
|
459
|
+
const daemonVersion = resolveDaemonVersion(import.meta.url);
|
|
460
|
+
const daemonConfigStore = new DaemonConfigStore(config.paseoHome, createInitialMutableDaemonConfig(config), logger);
|
|
461
|
+
const browserToolsPolicy = new DaemonConfigBrowserToolsPolicy(daemonConfigStore);
|
|
462
|
+
const browserToolsBroker = new BrowserToolsBroker({});
|
|
463
|
+
const serverId = getOrCreateServerId(config.paseoHome, { logger });
|
|
464
|
+
const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
|
|
465
|
+
const managedProcesses = createBootstrapManagedProcessRegistry(config, logger);
|
|
466
|
+
// Reconcile the helper-process ledger in the background so it never blocks the
|
|
467
|
+
// daemon from coming up; terminating a live leftover can take a few seconds.
|
|
468
|
+
// Best-effort, so a failure is logged here rather than crashing startup.
|
|
469
|
+
void reconcileManagedProcessLedger(managedProcesses, logger).catch((error) => {
|
|
470
|
+
logger.warn({ err: error }, "Failed to reconcile managed helper process ledger");
|
|
471
|
+
});
|
|
472
|
+
let relayTransport = null;
|
|
473
|
+
const staticDir = config.staticDir;
|
|
474
|
+
const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
|
|
475
|
+
const downloadTokenStore = new DownloadTokenStore({
|
|
476
|
+
ttlMs: downloadTokenTtlMs,
|
|
477
|
+
});
|
|
478
|
+
// Capability token authenticating the daemon's own agents to the loopback
|
|
479
|
+
// Agent MCP endpoint (/mcp/agents). Random per daemon run, injected only into
|
|
480
|
+
// local agent configs and the daemon's own MCP client — never sent to remote
|
|
481
|
+
// clients — so it cannot be replayed off-box. This lets the injected MCP
|
|
482
|
+
// authenticate even when the daemon password is set via the app (hash only,
|
|
483
|
+
// no plaintext available). Mirrors the /api/files/download capability-token
|
|
484
|
+
// pattern.
|
|
485
|
+
const agentMcpAuthToken = randomUUID();
|
|
486
|
+
const listenTarget = parseListenString(config.listen);
|
|
487
|
+
const app = express();
|
|
488
|
+
app.set("trust proxy", resolveExpressTrustProxySetting(config));
|
|
489
|
+
let boundListenTarget = null;
|
|
490
|
+
let workspaceRegistry = null;
|
|
491
|
+
const terminalManager = createConfiguredTerminalManager({
|
|
492
|
+
getTerminalActivityUrl: () => createTerminalActivityUrl(boundListenTarget),
|
|
493
|
+
});
|
|
494
|
+
applyTerminalAgentHookSetting({ store: daemonConfigStore, logger });
|
|
495
|
+
const serviceProxyPublicBaseUrl = config.serviceProxy?.publicBaseUrl
|
|
496
|
+
? config.serviceProxy.publicBaseUrl
|
|
497
|
+
: null;
|
|
498
|
+
const serviceProxy = createServiceProxySubsystem({
|
|
499
|
+
logger,
|
|
500
|
+
publicBaseUrl: serviceProxyPublicBaseUrl,
|
|
501
|
+
});
|
|
502
|
+
const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
|
|
503
|
+
const configuredHostnames = config.hostnames ?? config.allowedHosts;
|
|
504
|
+
let wsServer = null;
|
|
505
|
+
let pushSubsystem = null;
|
|
506
|
+
let serviceProxyListenTarget = null;
|
|
507
|
+
const scriptHealthMonitor = new ScriptHealthMonitor({
|
|
508
|
+
serviceProxy,
|
|
509
|
+
onChange: createScriptStatusEmitter({
|
|
510
|
+
sessions: () => wsServer?.listActiveSessions().map((session) => ({
|
|
511
|
+
emit: (message) => session.emitServerMessage(message),
|
|
512
|
+
})) ?? [],
|
|
513
|
+
serviceProxy,
|
|
514
|
+
runtimeStore: scriptRuntimeStore,
|
|
515
|
+
daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
516
|
+
resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
|
|
517
|
+
logger,
|
|
518
|
+
serviceProxyPublicBaseUrl,
|
|
519
|
+
}),
|
|
520
|
+
});
|
|
521
|
+
const handleBranchChange = createBranchChangeRouteHandler({
|
|
522
|
+
serviceProxy,
|
|
523
|
+
onRoutesChanged: (workspaceId) => {
|
|
524
|
+
scriptHealthMonitor.invalidateWorkspace(workspaceId);
|
|
525
|
+
},
|
|
526
|
+
logger,
|
|
527
|
+
});
|
|
528
|
+
// Service proxy classifies service hosts before daemon auth/route fallthrough.
|
|
529
|
+
// Registered service hosts proxy directly; known service namespaces without a
|
|
530
|
+
// route return 404 and never reach daemon APIs.
|
|
531
|
+
app.use(serviceProxy.middleware());
|
|
532
|
+
// Host allowlist / DNS rebinding protection (vite-like semantics).
|
|
533
|
+
// For non-TCP (unix sockets), skip host validation.
|
|
534
|
+
if (listenTarget.type === "tcp") {
|
|
535
|
+
app.use((req, res, next) => {
|
|
536
|
+
const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
|
|
537
|
+
if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
|
|
538
|
+
res.status(403).json({ error: "Invalid Host header" });
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
next();
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
// CORS - allow same-origin + configured origins
|
|
545
|
+
const allowedOrigins = new Set([
|
|
546
|
+
...config.corsAllowedOrigins,
|
|
547
|
+
// Packaged desktop renderers use the custom paseo:// protocol scheme.
|
|
548
|
+
"paseo://app",
|
|
549
|
+
// For TCP, add localhost variants
|
|
550
|
+
...(listenTarget.type === "tcp"
|
|
551
|
+
? [
|
|
552
|
+
`http://${listenTarget.host}:${listenTarget.port}`,
|
|
553
|
+
`http://localhost:${listenTarget.port}`,
|
|
554
|
+
`http://127.0.0.1:${listenTarget.port}`,
|
|
555
|
+
]
|
|
556
|
+
: []),
|
|
557
|
+
]);
|
|
558
|
+
app.use((req, res, next) => {
|
|
559
|
+
const origin = req.headers.origin;
|
|
560
|
+
if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
|
|
561
|
+
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
562
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
563
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
564
|
+
res.setHeader("Access-Control-Allow-Credentials", "true");
|
|
565
|
+
}
|
|
566
|
+
if (req.method === "OPTIONS") {
|
|
567
|
+
res.status(204).end();
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
next();
|
|
571
|
+
});
|
|
572
|
+
// Local, harmless, and token-gated; deliberately skips daemon auth.
|
|
573
|
+
app.post("/api/terminal-activity", express.json(), createTerminalActivityRouteHandler(terminalManager));
|
|
574
|
+
// Serve the bundled browser web UI when enabled. Mounted after service-proxy
|
|
575
|
+
// classification and host/CORS handling, but before daemon bearer auth, so
|
|
576
|
+
// static app files load without the daemon password while API/WebSocket calls
|
|
577
|
+
// remain protected.
|
|
578
|
+
mountWebUi(app, config, logger);
|
|
579
|
+
app.use(createRequireBearerMiddleware(config.auth, (context) => {
|
|
580
|
+
logger.warn(context, "Rejected HTTP request with invalid daemon password");
|
|
581
|
+
}));
|
|
582
|
+
app.use(express.json());
|
|
583
|
+
// Serve static files from public directory
|
|
584
|
+
app.use("/public", express.static(staticDir));
|
|
585
|
+
// Health check endpoint
|
|
586
|
+
app.get("/api/health", (_req, res) => {
|
|
587
|
+
res.json({ status: "ok", timestamp: new Date().toISOString() });
|
|
588
|
+
});
|
|
589
|
+
// MEETINGS BACKEND (B) — serve real meeting data from the engine's meetings.db
|
|
590
|
+
registerMeetingsRoutes(app);
|
|
591
|
+
// CAPTURE — start/stop/status for a live meeting capture session (spawns meetcap)
|
|
592
|
+
registerCaptureRoutes(app);
|
|
593
|
+
app.get("/api/status", (_req, res) => {
|
|
594
|
+
res.json({
|
|
595
|
+
status: "server_info",
|
|
596
|
+
serverId,
|
|
597
|
+
hostname: getHostname(),
|
|
598
|
+
version: daemonVersion,
|
|
599
|
+
listen: formatListenTarget(boundListenTarget ?? listenTarget),
|
|
600
|
+
});
|
|
601
|
+
});
|
|
602
|
+
const handleFileDownload = async (req, res) => {
|
|
603
|
+
const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
|
|
604
|
+
? req.query.token.trim()
|
|
605
|
+
: null;
|
|
606
|
+
if (!token) {
|
|
607
|
+
res.status(400).json({ error: "Missing download token" });
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
const entry = downloadTokenStore.consumeToken(token);
|
|
611
|
+
if (!entry) {
|
|
612
|
+
res.status(403).json({ error: "Invalid or expired token" });
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
let fileHandle = null;
|
|
616
|
+
try {
|
|
617
|
+
fileHandle = await open(entry.absolutePath, DOWNLOAD_OPEN_FLAGS);
|
|
618
|
+
const fileStats = await fileHandle.stat();
|
|
619
|
+
if (!fileStats.isFile()) {
|
|
620
|
+
res.status(404).json({ error: "File not found" });
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
|
|
624
|
+
res.setHeader("Content-Type", entry.mimeType);
|
|
625
|
+
res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
|
|
626
|
+
res.setHeader("Content-Length", fileStats.size.toString());
|
|
627
|
+
const stream = fileHandle.createReadStream();
|
|
628
|
+
fileHandle = null;
|
|
629
|
+
stream.on("error", (err) => {
|
|
630
|
+
logger.error({ err }, "Failed to stream download");
|
|
631
|
+
if (!res.headersSent) {
|
|
632
|
+
res.status(500).json({ error: "Failed to read file" });
|
|
633
|
+
}
|
|
634
|
+
else {
|
|
635
|
+
res.end();
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
stream.pipe(res);
|
|
639
|
+
}
|
|
640
|
+
catch (err) {
|
|
641
|
+
logger.error({ err }, "Failed to download file");
|
|
642
|
+
if (!res.headersSent) {
|
|
643
|
+
res.status(404).json({ error: "File not found" });
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
finally {
|
|
647
|
+
await fileHandle?.close().catch(() => undefined);
|
|
648
|
+
}
|
|
649
|
+
};
|
|
650
|
+
app.get("/api/files/download", (req, res) => {
|
|
651
|
+
void handleFileDownload(req, res);
|
|
652
|
+
});
|
|
653
|
+
// Story PASEO-CHAT-ACTIONS-V1-story-3.2: tab rename persistence.
|
|
654
|
+
// Loopback-bound, single-user trust model — same as the other /api/* routes.
|
|
655
|
+
// Provider-specific hook wiring lives in session-rename-route.ts so provider
|
|
656
|
+
// names stay out of this generic bootstrap file.
|
|
657
|
+
registerSessionRenameRoute(app, logger);
|
|
658
|
+
// Push subscription endpoint (Story PASEO-CHAT-ACTIONS-V1-story-1.002).
|
|
659
|
+
// Loopback-bound, single-user trust model — no auth. Persists to
|
|
660
|
+
// $PASEO_HOME/push-subscriptions.json with mode 0600.
|
|
661
|
+
const pushSubscriptionStore = new PushSubscriptionStore(logger, path.join(config.paseoHome, "push-subscriptions.json"));
|
|
662
|
+
// Story 1.4 — VAPID key pair for Web Push delivery.
|
|
663
|
+
const vapidKeys = loadOrGenerateVapidKeys(path.join(config.paseoHome, "vapid-keys.json"), logger);
|
|
664
|
+
registerPushRoutes(app, pushSubscriptionStore, logger, {
|
|
665
|
+
vapidPublicKey: vapidKeys.publicKey,
|
|
666
|
+
});
|
|
667
|
+
const httpServer = createHTTPServer(app);
|
|
668
|
+
// Script proxy WebSocket upgrade handler — must be registered before the
|
|
669
|
+
// VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
|
|
670
|
+
// script-bound upgrades are forwarded first. The handler is a no-op for
|
|
671
|
+
// requests that don't match a registered script route.
|
|
672
|
+
httpServer.on("upgrade", serviceProxy.upgradeHandler({ passthroughUnknown: true }));
|
|
673
|
+
// Capture-stream WebSocket (meetings live capture). Registered BEFORE the VoiceAssistant `/ws`
|
|
674
|
+
// server attaches so it gets first claim on `/api/meetings/capture/stream`; it no-ops on every
|
|
675
|
+
// other URL, so `/ws`, script-proxy, and relay upgrades pass through untouched.
|
|
676
|
+
httpServer.on("upgrade", getCaptureStreamWs().upgrade);
|
|
677
|
+
if (config.serviceProxy?.standaloneListen) {
|
|
678
|
+
serviceProxyListenTarget = parseListenString(config.serviceProxy.standaloneListen);
|
|
679
|
+
}
|
|
680
|
+
const agentStorage = new AgentStorage(config.agentStoragePath, logger);
|
|
681
|
+
const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
|
|
682
|
+
workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
|
|
683
|
+
// Story PASEO-CHAT-ACTIONS-V1-story-3.003 — GET /workspace/:id/sessions.
|
|
684
|
+
registerWorkspaceSessionsRoute(app, workspaceRegistry, logger);
|
|
685
|
+
// MARRA CUSTOMIZATION — GET /sessions (global; walks the agent transcript
|
|
686
|
+
// dirs). Powers the cross-workspace "find any session" mode in the command
|
|
687
|
+
// palette. Provider-specific paths are resolved inside the route module.
|
|
688
|
+
registerAllSessionsRoute(app, logger);
|
|
689
|
+
// MARRA CUSTOMIZATION — GET /sessions/search?q=… spawns the recall CLI to
|
|
690
|
+
// do FTS across every supported agent's transcripts and returns ranked
|
|
691
|
+
// snippets. Powers the FTS mode of the command palette.
|
|
692
|
+
registerSessionsSearchRoute(app, logger);
|
|
693
|
+
const chatService = new FileBackedChatService({
|
|
694
|
+
paseoHome: config.paseoHome,
|
|
695
|
+
logger,
|
|
696
|
+
});
|
|
697
|
+
const github = createGitHubService();
|
|
698
|
+
const workspaceGitService = new WorkspaceGitServiceImpl({
|
|
699
|
+
logger,
|
|
700
|
+
paseoHome: config.paseoHome,
|
|
701
|
+
worktreesRoot: config.worktreesRoot,
|
|
702
|
+
deps: {
|
|
703
|
+
github,
|
|
704
|
+
},
|
|
705
|
+
});
|
|
706
|
+
const providerSnapshotLogger = logger.child({ module: "provider-snapshot-manager" });
|
|
707
|
+
const providerSnapshotManager = new ProviderSnapshotManager({
|
|
708
|
+
logger: providerSnapshotLogger,
|
|
709
|
+
runtimeSettings: config.agentProviderSettings,
|
|
710
|
+
providerOverrides: config.providerOverrides,
|
|
711
|
+
workspaceGitService,
|
|
712
|
+
managedProcesses,
|
|
713
|
+
isDev: config.isDev === true,
|
|
714
|
+
extraClients: config.agentClients,
|
|
715
|
+
});
|
|
716
|
+
// Jarvis substrate (JARVIS-V1-SPEC §3.2). Append-only kanban move history.
|
|
717
|
+
// Prospective only: nothing before this ships is recoverable, which is why the
|
|
718
|
+
// spec sequences it ahead of every other piece.
|
|
719
|
+
const cardMoveLog = new CardMoveLog({ dir: config.paseoHome, logger });
|
|
720
|
+
// Blocker history. Same prospective-only property as the move log, and it
|
|
721
|
+
// answers a different question: not "how often was this deferred" but "who or
|
|
722
|
+
// what has kept blocking it". mergeDigest overwrites digest.blockers on every
|
|
723
|
+
// derivation, so without this the signal is destroyed on each idle.
|
|
724
|
+
const blockerLog = new BlockerLog({ dir: config.paseoHome, logger });
|
|
725
|
+
// Human-authorship ledger (multiplayer architecture §4). OFF BY DEFAULT:
|
|
726
|
+
// opt in with PASEO_AUTHORSHIP_ENABLED=true. Same prospective-only property
|
|
727
|
+
// as the two logs above and a sharper deadline, because paseo is the only
|
|
728
|
+
// component that ever sees the human and the turn together - a provider
|
|
729
|
+
// transcript records that a message came from `human`, never which one.
|
|
730
|
+
//
|
|
731
|
+
// Disabled yields undefined, and AgentManager's call site is `?.`, so the
|
|
732
|
+
// feature costs nothing and touches no disk until it is switched on.
|
|
733
|
+
const authorshipLedger = createAuthorshipLedger({
|
|
734
|
+
dir: config.paseoHome,
|
|
735
|
+
logger,
|
|
736
|
+
flag: process.env[AUTHORSHIP_ENV_FLAG],
|
|
737
|
+
});
|
|
738
|
+
// Prompt attribution (multiplayer architecture 4.6). OFF BY DEFAULT: opt in
|
|
739
|
+
// with PASEO_AUTHORSHIP_MARKUP=true. Unlike the ledger this REWRITES the
|
|
740
|
+
// prompt and lands permanently in the provider transcript, so the flag is
|
|
741
|
+
// strict and separate: enabling history must not silently enable injection.
|
|
742
|
+
//
|
|
743
|
+
// The speaker name is a placeholder until per-user identity exists. A daemon
|
|
744
|
+
// has one principal today, so this names the daemon's user, not a person in a
|
|
745
|
+
// shared session. Truthful, low-information, and the only thing that changes
|
|
746
|
+
// when identity lands.
|
|
747
|
+
const authorshipMarkup = createAuthorshipMarkup({
|
|
748
|
+
flag: process.env[AUTHORSHIP_MARKUP_ENV_FLAG],
|
|
749
|
+
speaker: process.env[AUTHORSHIP_SPEAKER_ENV] ?? userInfo().username,
|
|
750
|
+
});
|
|
751
|
+
// Jarvis judge config (§5, §9.1). Env-driven in v1 to avoid protocol churn
|
|
752
|
+
// while the feature is still being shaped.
|
|
753
|
+
// Gate for the judge's one mutating capability. Enabled only when the judge
|
|
754
|
+
// itself is, so an unconfigured deployment cannot expose relay_to_agent.
|
|
755
|
+
const judgeRelayGate = new JudgeRelayGate({
|
|
756
|
+
enabled: Boolean(process.env.PASEO_JARVIS_AGENT_ID?.trim()),
|
|
757
|
+
});
|
|
758
|
+
const jarvisJudgeConfig = {
|
|
759
|
+
agentId: process.env.PASEO_JARVIS_AGENT_ID?.trim() || null,
|
|
760
|
+
shadow: process.env.PASEO_JARVIS_SHADOW === "1",
|
|
761
|
+
};
|
|
762
|
+
const initialAgentManagerState = providerSnapshotManager.getAgentManagerProviderState();
|
|
763
|
+
const agentManager = new AgentManager({
|
|
764
|
+
clients: initialAgentManagerState.clients,
|
|
765
|
+
providerDefinitions: initialAgentManagerState.providerDefinitions,
|
|
766
|
+
registry: agentStorage,
|
|
767
|
+
cardMoveLog,
|
|
768
|
+
blockerLog,
|
|
769
|
+
authorshipLedger,
|
|
770
|
+
authorshipMarkup,
|
|
771
|
+
appendSystemPrompt: config.appendSystemPrompt,
|
|
772
|
+
onWorkspaceStateMayHaveChanged: ({ cwd }) => {
|
|
773
|
+
workspaceGitService.onWorkspaceStateMayHaveChanged(cwd);
|
|
774
|
+
},
|
|
775
|
+
mcpAuthToken: agentMcpAuthToken,
|
|
776
|
+
logger,
|
|
777
|
+
});
|
|
778
|
+
// Session digest (docs/session-digest.md §4.3 + §5): on the running→idle
|
|
779
|
+
// "finished" transition, refresh the digest — derive keyFiles deterministically
|
|
780
|
+
// and regenerate summary/accomplishments via the borrowed-provider rail (the
|
|
781
|
+
// same one auto-title uses; the daemon holds no API key of its own). Debounced +
|
|
782
|
+
// coalesced inside the scheduler; internal agents never broadcast attention.
|
|
783
|
+
// Jarvis judge (JARVIS-V1-SPEC §5.1). Constructed before the attention
|
|
784
|
+
// listener because the listener has to ORDER the two: see below.
|
|
785
|
+
const jarvisJudge = new JarvisJudge({
|
|
786
|
+
agentManager,
|
|
787
|
+
agentStorage,
|
|
788
|
+
cardMoveLog,
|
|
789
|
+
blockerLog,
|
|
790
|
+
relayGate: judgeRelayGate,
|
|
791
|
+
config: jarvisJudgeConfig,
|
|
792
|
+
logger,
|
|
793
|
+
});
|
|
794
|
+
if (jarvisJudge.enabled) {
|
|
795
|
+
logger.info({ judgeAgentId: jarvisJudgeConfig.agentId, shadow: jarvisJudgeConfig.shadow }, "Jarvis judge enabled");
|
|
796
|
+
// Resolve the judge NOW rather than waiting for the first event. An archived
|
|
797
|
+
// judge emits nothing, so a purely event-driven probe would keep advertising
|
|
798
|
+
// the feature as healthy in exactly the case where it is dead. Best-effort:
|
|
799
|
+
// a storage hiccup here must not block daemon startup.
|
|
800
|
+
void jarvisJudge.refreshAvailability().catch((error) => {
|
|
801
|
+
logger.warn({ err: error }, "Jarvis availability probe failed");
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
agentManager.addAgentAttentionListener((params) => {
|
|
805
|
+
// Never let a judge failure take down attention handling for everyone else.
|
|
806
|
+
const wakeJudge = () => {
|
|
807
|
+
void jarvisJudge.handleAttention({ agentId: params.agentId, reason: params.reason });
|
|
808
|
+
};
|
|
809
|
+
// `error` and `permission` have no derivation step, so nothing to wait for.
|
|
810
|
+
if (params.reason !== "finished") {
|
|
811
|
+
if (jarvisJudge.enabled) {
|
|
812
|
+
wakeJudge();
|
|
813
|
+
}
|
|
814
|
+
return;
|
|
815
|
+
}
|
|
816
|
+
const agent = agentManager.getAgent(params.agentId);
|
|
817
|
+
if (!agent || agent.internal) {
|
|
818
|
+
return;
|
|
819
|
+
}
|
|
820
|
+
// ORDERING IS LOAD-BEARING, and getting it wrong is invisible.
|
|
821
|
+
//
|
|
822
|
+
// The digest refresh and the judge both hang off this one `finished` event.
|
|
823
|
+
// Fired in parallel, the judge wins the race every time and reads a digest
|
|
824
|
+
// that has not been written yet, so its briefing carries no summary, no
|
|
825
|
+
// blockers and no deadline. It then correctly concludes there is nothing
|
|
826
|
+
// worth saying and answers "quiet" forever. No error is raised anywhere: the
|
|
827
|
+
// feature looks healthy and delivers nothing. Verified live in the docker lab
|
|
828
|
+
// before this chaining existed.
|
|
829
|
+
//
|
|
830
|
+
// So the judge is woken from onSettled, which fires on success, skip AND
|
|
831
|
+
// failure. A judge that only ran on the happy path would go quiet exactly
|
|
832
|
+
// when something broke.
|
|
833
|
+
scheduleSessionDigestRefresh({
|
|
834
|
+
agentManager,
|
|
835
|
+
agentId: params.agentId,
|
|
836
|
+
cwd: agent.cwd,
|
|
837
|
+
providerSnapshotManager,
|
|
838
|
+
daemonConfig: null,
|
|
839
|
+
currentSelection: {
|
|
840
|
+
provider: agent.provider,
|
|
841
|
+
model: agent.runtimeInfo?.model ?? agent.config.model ?? null,
|
|
842
|
+
thinkingOptionId: agent.runtimeInfo?.thinkingOptionId ?? agent.config.thinkingOptionId ?? null,
|
|
843
|
+
},
|
|
844
|
+
logger,
|
|
845
|
+
onSettled: jarvisJudge.enabled ? wakeJudge : undefined,
|
|
846
|
+
});
|
|
847
|
+
});
|
|
848
|
+
// Epic 1, Story 1.2 — first-class workflow entity. WorkflowManager orchestrates
|
|
849
|
+
// only; every child is spawned through agentManager.createAgent (one-directional:
|
|
850
|
+
// workflow -> agent, never the reverse). Storage is the flat $PASEO_HOME/workflows
|
|
851
|
+
// path from Story 1.1.
|
|
852
|
+
const workflowStorage = new WorkflowStorage(path.join(config.paseoHome, "workflows"), logger);
|
|
853
|
+
const workflowManager = new WorkflowManager({
|
|
854
|
+
agentManager,
|
|
855
|
+
storage: workflowStorage,
|
|
856
|
+
logger,
|
|
857
|
+
});
|
|
858
|
+
// Story 2.1 — read-only HTTP status + SSE phase-transition routes. Gated on the
|
|
859
|
+
// same WORKFLOWS_FEATURE_ENABLED constant as the server_info handshake flag.
|
|
860
|
+
registerWorkflowHttpRoutes(app, { manager: workflowManager, featureEnabled: WORKFLOWS_FEATURE_ENABLED }, logger);
|
|
861
|
+
// Story PASEO-CHAT-ACTIONS-V1 stories 2.2 + 2.4 — rewind + edit HTTP routes.
|
|
862
|
+
// Reuse truncate-session.ts (Story 2.1) under the hood. Loopback-only, gated
|
|
863
|
+
// by the same Bearer-token auth middleware as the rest of the API.
|
|
864
|
+
registerAgentRoutes(app, agentManager, logger);
|
|
865
|
+
const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
|
|
866
|
+
await agentStorage.initialize();
|
|
867
|
+
logger.info({ elapsed: elapsed() }, "Agent storage initialized");
|
|
868
|
+
await bootstrapWorkspaceRegistries({
|
|
869
|
+
paseoHome: config.paseoHome,
|
|
870
|
+
agentStorage,
|
|
871
|
+
projectRegistry,
|
|
872
|
+
workspaceRegistry,
|
|
873
|
+
workspaceGitService,
|
|
874
|
+
logger,
|
|
875
|
+
});
|
|
876
|
+
logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
|
|
877
|
+
const workspaceReconciliation = new WorkspaceReconciliationService({
|
|
878
|
+
projectRegistry,
|
|
879
|
+
workspaceRegistry,
|
|
880
|
+
logger,
|
|
881
|
+
workspaceGitService,
|
|
882
|
+
});
|
|
883
|
+
void (async () => {
|
|
884
|
+
try {
|
|
885
|
+
const result = await workspaceReconciliation.runOnce();
|
|
886
|
+
logger.info({
|
|
887
|
+
elapsed: elapsed(),
|
|
888
|
+
changeCount: result.changesApplied.length,
|
|
889
|
+
}, "Workspace registries reconciled");
|
|
890
|
+
}
|
|
891
|
+
catch (error) {
|
|
892
|
+
logger.error({ err: error }, "Background workspace reconciliation failed");
|
|
893
|
+
}
|
|
894
|
+
})();
|
|
895
|
+
await chatService.initialize();
|
|
896
|
+
logger.info({ elapsed: elapsed() }, "Chat service initialized");
|
|
897
|
+
const checkoutDiffManager = new CheckoutDiffManager({
|
|
898
|
+
logger,
|
|
899
|
+
paseoHome: config.paseoHome,
|
|
900
|
+
workspaceGitService,
|
|
901
|
+
});
|
|
902
|
+
const loopService = new LoopService({
|
|
903
|
+
paseoHome: config.paseoHome,
|
|
904
|
+
logger,
|
|
905
|
+
agentManager,
|
|
906
|
+
providerSnapshotManager,
|
|
907
|
+
});
|
|
908
|
+
await loopService.initialize();
|
|
909
|
+
logger.info({ elapsed: elapsed() }, "Loop service initialized");
|
|
910
|
+
// EXACTLY ONE IngestionLedger per daemon. Do not construct a second one anywhere:
|
|
911
|
+
// the manual (Apply now) path and the tick path must share this instance, and
|
|
912
|
+
// Story 3.4's CapLimiter derives its daily budget from these same rows. A second
|
|
913
|
+
// connection would also be a second writer to the same sqlite file.
|
|
914
|
+
//
|
|
915
|
+
// Constructing it can throw (node:sqlite missing, or the file unreadable/locked).
|
|
916
|
+
// That is caught HERE rather than left to propagate: a host without a working
|
|
917
|
+
// ledger must still boot and still run clock schedules. Fail-loud for ingestion
|
|
918
|
+
// belongs where a { type: "source" } cadence arms, not at daemon boot (epic D1).
|
|
919
|
+
let ingestionLedger;
|
|
920
|
+
try {
|
|
921
|
+
ingestionLedger = new IngestionLedger({ paseoHome: config.paseoHome });
|
|
922
|
+
}
|
|
923
|
+
catch (error) {
|
|
924
|
+
ingestionLedger = undefined;
|
|
925
|
+
logger.warn({ err: error }, "Ingestion ledger unavailable; source-triggered filters will not arm. Clock schedules are unaffected");
|
|
926
|
+
}
|
|
927
|
+
// EXACTLY ONE CapLimiter per daemon, over that same ledger. Do not construct a
|
|
928
|
+
// second one anywhere.
|
|
929
|
+
//
|
|
930
|
+
// A second instance would NOT double the day's allowance - the budget is a row
|
|
931
|
+
// in `ingestion_dispatch_budget`, not a field in memory, so two limiters over
|
|
932
|
+
// the same PASEO_HOME still spend one budget. The rule stands anyway, for two
|
|
933
|
+
// reasons. It would duplicate the prepared-statement set for no gain. And, the
|
|
934
|
+
// load-bearing one: a second construction is a signal that a future reader
|
|
935
|
+
// believed the budget was per-instance, and that belief is one refactor away
|
|
936
|
+
// from being true (someone caches `used` in a field to save a query). Two
|
|
937
|
+
// guards, one of which fails loudly.
|
|
938
|
+
//
|
|
939
|
+
const { capLimiter, ingestionCohortStore, ingestionCohorts, ingestionFilterStore, ingestionSourceStore, ingestionGatewayResolver, } = buildIngestionCollaborators(config, ingestionLedger);
|
|
940
|
+
// Explicit annotation breaks the inference cycle: this options object passes
|
|
941
|
+
// `schedule: () => scheduleService`, so inferring the type from the initializer
|
|
942
|
+
// is circular (TS7022/TS7023). The lazy closure itself is correct and intended.
|
|
943
|
+
const scheduleService = new ScheduleService({
|
|
944
|
+
paseoHome: config.paseoHome,
|
|
945
|
+
logger,
|
|
946
|
+
agentManager,
|
|
947
|
+
agentStorage,
|
|
948
|
+
providerSnapshotManager,
|
|
949
|
+
ledger: ingestionLedger,
|
|
950
|
+
capLimiter,
|
|
951
|
+
// Story 5.4. A CALLBACK, never a `CohortStore` import inside `service.ts`:
|
|
952
|
+
// deleting this one line is the whole rollback, and it leaves
|
|
953
|
+
// `cohort-store.ts` as code nothing in the scheduler names.
|
|
954
|
+
...buildCohortResumerOption({
|
|
955
|
+
store: ingestionCohortStore,
|
|
956
|
+
limiter: capLimiter,
|
|
957
|
+
ledger: ingestionLedger,
|
|
958
|
+
filterStore: ingestionFilterStore,
|
|
959
|
+
sourceStore: ingestionSourceStore,
|
|
960
|
+
gatewayResolver: ingestionGatewayResolver,
|
|
961
|
+
cohorts: ingestionCohorts,
|
|
962
|
+
// Referenced lazily inside the returned closure: `start()` is called after
|
|
963
|
+
// this `const` is assigned, so the binding is initialized by the time the
|
|
964
|
+
// resumer can run. The scheduler is the daemon's ONE new-agent minting
|
|
965
|
+
// path, and a resumed group must mint through it like any other.
|
|
966
|
+
schedule: () => scheduleService,
|
|
967
|
+
logger,
|
|
968
|
+
}),
|
|
969
|
+
});
|
|
970
|
+
await scheduleService.start();
|
|
971
|
+
agentManager.setAgentArchivedCallback(async (agentId) => {
|
|
972
|
+
try {
|
|
973
|
+
await scheduleService.completeForAgent(agentId);
|
|
974
|
+
}
|
|
975
|
+
catch (error) {
|
|
976
|
+
logger.warn({ err: error, agentId }, "Failed to complete schedules for archived agent");
|
|
977
|
+
}
|
|
978
|
+
});
|
|
979
|
+
logger.info({ elapsed: elapsed() }, "Schedule service initialized");
|
|
980
|
+
// Ingestion sources. `config.ingestion` is optional on PaseoDaemonConfig, so
|
|
981
|
+
// fall back to an empty block rather than asserting: with no aggregator
|
|
982
|
+
// credentials the service is inert by design (no timer, no filesystem, no
|
|
983
|
+
// network) and simply logs that the health sweep is disabled.
|
|
984
|
+
const ingestionService = new IngestionService({
|
|
985
|
+
paseoHome: config.paseoHome,
|
|
986
|
+
serverId,
|
|
987
|
+
logger,
|
|
988
|
+
config: config.ingestion ?? {
|
|
989
|
+
pipedream: { environment: "development", allowedOrigins: [] },
|
|
990
|
+
composio: {},
|
|
991
|
+
},
|
|
992
|
+
});
|
|
993
|
+
await ingestionService.start();
|
|
994
|
+
logger.info({ elapsed: elapsed() }, "Ingestion service initialized");
|
|
995
|
+
// The read-only ingestion PREVIEW collaborators (Story 5.1).
|
|
996
|
+
//
|
|
997
|
+
// Wired beside IngestionService rather than through it, because that service
|
|
998
|
+
// states an invariant it must keep: no gateway, no McpTarget and no
|
|
999
|
+
// IngestionConfig ever leaves it. The backfill needs a gateway, so it
|
|
1000
|
+
// resolves one from `adapters.ts` - the SAME single factory the service uses,
|
|
1001
|
+
// so there is one resolver definition, not two.
|
|
1002
|
+
//
|
|
1003
|
+
// `ingestionSourceStore` is a second SourceStore over the same directory, and
|
|
1004
|
+
// that is safe in a way a second IngestionLedger would not be: SourceStore
|
|
1005
|
+
// holds no connection and caches nothing, every method re-reads from disk,
|
|
1006
|
+
// and `ensureDir` is idempotent. The ledger below is the ONE instance,
|
|
1007
|
+
// shared, exactly as its own comment requires.
|
|
1008
|
+
// Plugin platform (opt-in via HYPERPASEO_EXTENSIONS=1). Discovers installed
|
|
1009
|
+
// extensions and runs each in its own extension-host process, wired to the
|
|
1010
|
+
// daemon backend. No-op by default — zero impact on standard daemon behavior.
|
|
1011
|
+
const extensionService = createExtensionService({
|
|
1012
|
+
agentManager,
|
|
1013
|
+
serverId,
|
|
1014
|
+
paseoHome: config.paseoHome,
|
|
1015
|
+
logger,
|
|
1016
|
+
});
|
|
1017
|
+
logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
|
|
1018
|
+
const persistedRecords = await agentStorage.list();
|
|
1019
|
+
logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
|
|
1020
|
+
logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
|
|
1021
|
+
logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
|
|
1022
|
+
const archiveWorkspaceRecordExternal = async (workspaceId) => {
|
|
1023
|
+
const sessions = wsServer?.listActiveSessions() ?? [];
|
|
1024
|
+
if (sessions.length > 0) {
|
|
1025
|
+
await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
|
|
1026
|
+
return;
|
|
1027
|
+
}
|
|
1028
|
+
await archivePersistedWorkspaceRecord({
|
|
1029
|
+
workspaceId,
|
|
1030
|
+
workspaceRegistry,
|
|
1031
|
+
});
|
|
1032
|
+
};
|
|
1033
|
+
// external path→workspace adapter, not ownership: archive-by-path requests that
|
|
1034
|
+
// arrive with a worktree path and no workspaceId (old clients / CLI).
|
|
1035
|
+
const findWorkspaceIdForCwdExternal = async (cwd) => {
|
|
1036
|
+
return resolveWorkspaceIdForPath(cwd, await workspaceRegistry.list());
|
|
1037
|
+
};
|
|
1038
|
+
// Every create that arrives without a workspaceId (MCP create_agent, CLI,
|
|
1039
|
+
// agent-spawned terminals). Reuses the live workspace owning the cwd instead
|
|
1040
|
+
// of minting one per call — see ensure-workspace-for-create.ts for why the
|
|
1041
|
+
// lookup lives at this caller and not inside createLocalCheckoutWorkspace.
|
|
1042
|
+
const ensureWorkspaceForCreateExternal = async (cwd, firstAgentContext) => {
|
|
1043
|
+
const { workspaceId } = await ensureWorkspaceForCreate(cwd, firstAgentContext, {
|
|
1044
|
+
listWorkspaces: () => workspaceRegistry.list(),
|
|
1045
|
+
createWorkspace: (input) => createLocalCheckoutWorkspace(input, {
|
|
1046
|
+
projectRegistry,
|
|
1047
|
+
workspaceRegistry,
|
|
1048
|
+
workspaceGitService,
|
|
1049
|
+
}),
|
|
1050
|
+
scheduleAutoName: (input) => workspaceAutoName.scheduleForDirectory(input),
|
|
1051
|
+
resolveTitle: resolveFirstAgentPromptTitle,
|
|
1052
|
+
});
|
|
1053
|
+
return workspaceId;
|
|
1054
|
+
};
|
|
1055
|
+
const listActiveWorkspacesExternal = async () => {
|
|
1056
|
+
const workspaces = await workspaceRegistry.list();
|
|
1057
|
+
return workspaces
|
|
1058
|
+
.filter((workspace) => !workspace.archivedAt)
|
|
1059
|
+
.map((workspace) => ({
|
|
1060
|
+
workspaceId: workspace.workspaceId,
|
|
1061
|
+
cwd: workspace.cwd,
|
|
1062
|
+
kind: workspace.kind,
|
|
1063
|
+
}));
|
|
1064
|
+
};
|
|
1065
|
+
const markWorkspaceArchivingExternal = (workspaceIds, archivingAt) => {
|
|
1066
|
+
const workspaceIdList = Array.from(workspaceIds);
|
|
1067
|
+
for (const session of wsServer?.listActiveSessions() ?? []) {
|
|
1068
|
+
session.markWorkspaceArchivingForExternalMutation(workspaceIdList, archivingAt);
|
|
1069
|
+
}
|
|
1070
|
+
};
|
|
1071
|
+
const clearWorkspaceArchivingExternal = (workspaceIds) => {
|
|
1072
|
+
const workspaceIdList = Array.from(workspaceIds);
|
|
1073
|
+
for (const session of wsServer?.listActiveSessions() ?? []) {
|
|
1074
|
+
session.clearWorkspaceArchivingForExternalMutation(workspaceIdList);
|
|
1075
|
+
}
|
|
1076
|
+
};
|
|
1077
|
+
const emitWorkspaceUpdatesExternal = async (workspaceIds) => {
|
|
1078
|
+
const workspaceIdList = Array.from(workspaceIds);
|
|
1079
|
+
await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalWorkspaceIds(workspaceIdList)));
|
|
1080
|
+
};
|
|
1081
|
+
const emitWorkspaceUpdateForCwdExternal = async (cwd) => {
|
|
1082
|
+
const workspaceIds = workspaceIdsOnCheckout(await workspaceRegistry.list(), cwd);
|
|
1083
|
+
await emitWorkspaceUpdatesExternal(workspaceIds);
|
|
1084
|
+
};
|
|
1085
|
+
const emitExternalSessionMessage = (message) => {
|
|
1086
|
+
wsServer?.broadcast(wrapSessionMessage(message));
|
|
1087
|
+
};
|
|
1088
|
+
const workspaceAutoName = new WorkspaceAutoName({
|
|
1089
|
+
agentManager,
|
|
1090
|
+
workspaceRegistry,
|
|
1091
|
+
workspaceGitService,
|
|
1092
|
+
providerSnapshotManager,
|
|
1093
|
+
readDaemonConfig: () => ({ metadataGeneration: daemonConfigStore.get().metadataGeneration }),
|
|
1094
|
+
gitMutation: createGitMutationService({
|
|
1095
|
+
workspaceGitService,
|
|
1096
|
+
github,
|
|
1097
|
+
logger,
|
|
1098
|
+
}),
|
|
1099
|
+
emitWorkspaceUpdateForCwd: emitWorkspaceUpdateForCwdExternal,
|
|
1100
|
+
emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
|
|
1101
|
+
await emitWorkspaceUpdatesExternal([workspaceId]);
|
|
1102
|
+
},
|
|
1103
|
+
logger,
|
|
1104
|
+
});
|
|
1105
|
+
setupAutoArchiveOnMerge({
|
|
1106
|
+
paseoHome: config.paseoHome,
|
|
1107
|
+
paseoWorktreesBaseRoot: config.worktreesRoot,
|
|
1108
|
+
daemonConfigStore,
|
|
1109
|
+
workspaceGitService,
|
|
1110
|
+
github,
|
|
1111
|
+
agentManager,
|
|
1112
|
+
agentStorage,
|
|
1113
|
+
terminalManager,
|
|
1114
|
+
logger,
|
|
1115
|
+
findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
|
|
1116
|
+
listActiveWorkspaces: listActiveWorkspacesExternal,
|
|
1117
|
+
archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
|
|
1118
|
+
markWorkspaceArchiving: markWorkspaceArchivingExternal,
|
|
1119
|
+
clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
|
|
1120
|
+
emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
|
|
1121
|
+
});
|
|
1122
|
+
const createPaseoWorktreeForTools = async (input, serviceOptions) => {
|
|
1123
|
+
return createPaseoWorktreeWorkflow({
|
|
1124
|
+
paseoHome: config.paseoHome,
|
|
1125
|
+
worktreesRoot: config.worktreesRoot,
|
|
1126
|
+
createPaseoWorktree: async (workflowInput, workflowOptions) => {
|
|
1127
|
+
return createRegisteredPaseoWorktree(workflowInput, {
|
|
1128
|
+
github,
|
|
1129
|
+
...(workflowOptions?.resolveDefaultBranch
|
|
1130
|
+
? {
|
|
1131
|
+
resolveDefaultBranch: workflowOptions.resolveDefaultBranch,
|
|
1132
|
+
}
|
|
1133
|
+
: {}),
|
|
1134
|
+
projectRegistry,
|
|
1135
|
+
workspaceRegistry,
|
|
1136
|
+
workspaceGitService,
|
|
1137
|
+
});
|
|
1138
|
+
},
|
|
1139
|
+
warmWorkspaceGitData: async (workspace) => {
|
|
1140
|
+
await Promise.all(wsServer
|
|
1141
|
+
?.listActiveSessions()
|
|
1142
|
+
.map((session) => session.warmWorkspaceGitDataForWorkspace(workspace)) ?? []);
|
|
1143
|
+
},
|
|
1144
|
+
autoNameWorkspaceBranchForFirstAgent: (autoNameInput) => workspaceAutoName.scheduleForWorktree(autoNameInput),
|
|
1145
|
+
emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
|
|
1146
|
+
await emitWorkspaceUpdatesExternal([workspaceId]);
|
|
1147
|
+
},
|
|
1148
|
+
cacheWorkspaceSetupSnapshot: () => { },
|
|
1149
|
+
emit: emitExternalSessionMessage,
|
|
1150
|
+
sessionLogger: logger,
|
|
1151
|
+
terminalManager,
|
|
1152
|
+
archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
|
|
1153
|
+
serviceProxy,
|
|
1154
|
+
scriptRuntimeStore,
|
|
1155
|
+
getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
1156
|
+
getDaemonTcpHost: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null),
|
|
1157
|
+
serviceProxyPublicBaseUrl,
|
|
1158
|
+
onScriptsChanged: null,
|
|
1159
|
+
}, input, serviceOptions);
|
|
1160
|
+
};
|
|
1161
|
+
const createAgentToolHostDependencies = (runtime) => ({
|
|
1162
|
+
agentManager,
|
|
1163
|
+
agentStorage,
|
|
1164
|
+
terminalManager,
|
|
1165
|
+
getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
1166
|
+
scheduleService,
|
|
1167
|
+
providerSnapshotManager,
|
|
1168
|
+
github,
|
|
1169
|
+
workspaceGitService,
|
|
1170
|
+
findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
|
|
1171
|
+
listActiveWorkspaces: listActiveWorkspacesExternal,
|
|
1172
|
+
archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
|
|
1173
|
+
emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
|
|
1174
|
+
workspaceRegistry,
|
|
1175
|
+
markWorkspaceArchiving: markWorkspaceArchivingExternal,
|
|
1176
|
+
clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
|
|
1177
|
+
ensureWorkspaceForCreate: ensureWorkspaceForCreateExternal,
|
|
1178
|
+
createPaseoWorktree: createPaseoWorktreeForTools,
|
|
1179
|
+
browserToolsEnabled: browserToolsPolicy.isEnabled(),
|
|
1180
|
+
browserToolsBroker,
|
|
1181
|
+
paseoHome: config.paseoHome,
|
|
1182
|
+
worktreesRoot: config.worktreesRoot,
|
|
1183
|
+
callerAgentId: runtime.callerAgentId,
|
|
1184
|
+
enableVoiceTools: runtime.enableVoiceTools,
|
|
1185
|
+
voiceOnly: runtime.voiceOnly,
|
|
1186
|
+
// JARVIS-V1-SPEC §6, HARD REQUIREMENT. The judge reads untrusted transcripts,
|
|
1187
|
+
// so it must not hold a mutating tool. Keyed on identity rather than on a
|
|
1188
|
+
// mode, because a mode is something the agent itself could change.
|
|
1189
|
+
readOnly: runtime.readOnly ||
|
|
1190
|
+
(jarvisJudgeConfig.agentId !== null && runtime.callerAgentId === jarvisJudgeConfig.agentId),
|
|
1191
|
+
// Only the judge's own tool sessions get the relay tool, and even then its
|
|
1192
|
+
// handler refuses unless a human turn is driving. Identity-keyed, like the
|
|
1193
|
+
// read-only surface, so the agent cannot grant it to itself.
|
|
1194
|
+
judgeRelayGate: jarvisJudgeConfig.agentId !== null && runtime.callerAgentId === jarvisJudgeConfig.agentId
|
|
1195
|
+
? judgeRelayGate
|
|
1196
|
+
: undefined,
|
|
1197
|
+
resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
|
|
1198
|
+
resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
|
|
1199
|
+
logger,
|
|
1200
|
+
});
|
|
1201
|
+
const createAgentToolCatalog = (runtime) => createPaseoToolCatalog(createAgentToolHostDependencies(runtime));
|
|
1202
|
+
agentManager.setPaseoToolCatalogFactory(createAgentToolCatalog);
|
|
1203
|
+
agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
|
|
1204
|
+
const mcpEnabled = config.mcpEnabled ?? true;
|
|
1205
|
+
let agentMcpBaseUrl = null;
|
|
1206
|
+
if (mcpEnabled) {
|
|
1207
|
+
const agentMcpRoute = "/mcp/agents";
|
|
1208
|
+
const createAgentMcpSession = async (callerAgentId) => {
|
|
1209
|
+
// Adopt the converged host-dependency factory, then thread the daemon-owned
|
|
1210
|
+
// workflowManager so the additive `workflow_*` MCP tools register.
|
|
1211
|
+
const agentMcpServer = await createAgentMcpServer({
|
|
1212
|
+
...createAgentToolHostDependencies({ callerAgentId }),
|
|
1213
|
+
workflowManager,
|
|
1214
|
+
// API-389: let the open_url MCP tool push to the user's paired client(s).
|
|
1215
|
+
broadcastToClients: emitExternalSessionMessage,
|
|
1216
|
+
});
|
|
1217
|
+
// Stateless mode: each HTTP request builds a fresh server + transport that is
|
|
1218
|
+
// torn down when the response closes, so no per-session state is retained between
|
|
1219
|
+
// requests. The agent control plane only lists and calls tools, neither of which
|
|
1220
|
+
// needs cross-request state, so sessions would only pin memory for the life of the
|
|
1221
|
+
// daemon (agents that exit without a clean DELETE never get reaped).
|
|
1222
|
+
const transport = new StreamableHTTPServerTransport({
|
|
1223
|
+
sessionIdGenerator: undefined,
|
|
1224
|
+
// NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
|
|
1225
|
+
// StreamableHTTPServerTransport's built-in check requires exact Host header matches.
|
|
1226
|
+
enableDnsRebindingProtection: false,
|
|
1227
|
+
});
|
|
1228
|
+
Object.assign(transport, {
|
|
1229
|
+
onerror: (err) => {
|
|
1230
|
+
logger.error({ err }, "Agent MCP transport error");
|
|
1231
|
+
},
|
|
1232
|
+
});
|
|
1233
|
+
await agentMcpServer.connect(transport);
|
|
1234
|
+
return { server: agentMcpServer, transport };
|
|
1235
|
+
};
|
|
1236
|
+
const runAgentMcpRequest = async (req, res) => {
|
|
1237
|
+
// This route is exempt from the global daemon-password middleware, so it
|
|
1238
|
+
// authenticates here using the injected capability token (or a valid
|
|
1239
|
+
// daemon password). Without this, a password-protected daemon would be
|
|
1240
|
+
// wide open on its agent control plane.
|
|
1241
|
+
if (!(await isAgentMcpRequestAuthorized({
|
|
1242
|
+
password: config.auth?.password,
|
|
1243
|
+
capabilityToken: agentMcpAuthToken,
|
|
1244
|
+
authorizationHeader: req.header("authorization"),
|
|
1245
|
+
}))) {
|
|
1246
|
+
res.status(401).json({ error: "Unauthorized" });
|
|
1247
|
+
return;
|
|
1248
|
+
}
|
|
1249
|
+
if (config.mcpDebug) {
|
|
1250
|
+
logger.debug({
|
|
1251
|
+
method: req.method,
|
|
1252
|
+
url: req.originalUrl,
|
|
1253
|
+
sessionId: req.header("mcp-session-id"),
|
|
1254
|
+
authorization: req.header("authorization") ? REDACTED_LOG_VALUE : undefined,
|
|
1255
|
+
body: summarizeAgentMcpDebugBody(req.body),
|
|
1256
|
+
}, "Agent MCP request");
|
|
1257
|
+
}
|
|
1258
|
+
try {
|
|
1259
|
+
// Stateless: GET (standalone SSE) and DELETE (session termination) have no
|
|
1260
|
+
// meaning without sessions. The MCP client tolerates 405 on the GET stream
|
|
1261
|
+
// and never issues a DELETE because it is never handed a session id.
|
|
1262
|
+
if (req.method !== "POST") {
|
|
1263
|
+
res.status(405).json({
|
|
1264
|
+
jsonrpc: "2.0",
|
|
1265
|
+
error: {
|
|
1266
|
+
code: -32000,
|
|
1267
|
+
message: "Method not allowed",
|
|
1268
|
+
},
|
|
1269
|
+
id: null,
|
|
1270
|
+
});
|
|
1271
|
+
return;
|
|
1272
|
+
}
|
|
1273
|
+
const callerAgentIdRaw = req.query.callerAgentId;
|
|
1274
|
+
let callerAgentId;
|
|
1275
|
+
if (typeof callerAgentIdRaw === "string") {
|
|
1276
|
+
callerAgentId = callerAgentIdRaw;
|
|
1277
|
+
}
|
|
1278
|
+
else if (Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string") {
|
|
1279
|
+
callerAgentId = callerAgentIdRaw[0];
|
|
1280
|
+
}
|
|
1281
|
+
const { server, transport } = await createAgentMcpSession(callerAgentId);
|
|
1282
|
+
res.on("close", () => {
|
|
1283
|
+
void transport.close();
|
|
1284
|
+
void server.close();
|
|
1285
|
+
});
|
|
1286
|
+
await transport.handleRequest(req, res, req.body);
|
|
1287
|
+
}
|
|
1288
|
+
catch (err) {
|
|
1289
|
+
logger.error({ err }, "Failed to handle Agent MCP request");
|
|
1290
|
+
if (!res.headersSent) {
|
|
1291
|
+
res.status(500).json({
|
|
1292
|
+
jsonrpc: "2.0",
|
|
1293
|
+
error: {
|
|
1294
|
+
code: -32603,
|
|
1295
|
+
message: "Internal MCP server error",
|
|
1296
|
+
},
|
|
1297
|
+
id: null,
|
|
1298
|
+
});
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
};
|
|
1302
|
+
const handleAgentMcpRequest = (req, res) => {
|
|
1303
|
+
void runAgentMcpRequest(req, res);
|
|
1304
|
+
};
|
|
1305
|
+
app.post(agentMcpRoute, handleAgentMcpRequest);
|
|
1306
|
+
app.get(agentMcpRoute, handleAgentMcpRequest);
|
|
1307
|
+
app.delete(agentMcpRoute, handleAgentMcpRequest);
|
|
1308
|
+
logger.info({ route: agentMcpRoute }, "Agent MCP server mounted on main app");
|
|
1309
|
+
}
|
|
1310
|
+
else {
|
|
1311
|
+
logger.info("Agent MCP HTTP endpoint disabled");
|
|
1312
|
+
}
|
|
1313
|
+
const speechService = createSpeechService({
|
|
1314
|
+
logger,
|
|
1315
|
+
openaiConfig: config.openai,
|
|
1316
|
+
speechConfig: config.speech,
|
|
1317
|
+
});
|
|
1318
|
+
logger.info({ elapsed: elapsed() }, "Speech service created");
|
|
1319
|
+
logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
|
|
1320
|
+
// Agents that were RUNNING when the daemon goes down lose their turn
|
|
1321
|
+
// mid-sentence, and nothing ever tells them so. Record that set on the way
|
|
1322
|
+
// out; `resumeAgentsAfterRestart` nudges exactly those on the way back in.
|
|
1323
|
+
//
|
|
1324
|
+
// Must run before anything tears agents down: `hasInFlightRun` reads
|
|
1325
|
+
// agentManager's live memory, and `closeAllAgents` is about to empty it.
|
|
1326
|
+
const captureInFlightAgentsForResume = async (reason) => {
|
|
1327
|
+
try {
|
|
1328
|
+
const inFlight = collectInFlightAgentIds(agentManager);
|
|
1329
|
+
await writeRestartManifest({
|
|
1330
|
+
paseoHome: config.paseoHome,
|
|
1331
|
+
agentIds: inFlight,
|
|
1332
|
+
reason,
|
|
1333
|
+
logger,
|
|
1334
|
+
});
|
|
1335
|
+
}
|
|
1336
|
+
catch (err) {
|
|
1337
|
+
// Shutdown must never hang or fail on the nudge bookkeeping.
|
|
1338
|
+
logger.warn({ err, reason }, "Failed to capture in-flight agents for resume");
|
|
1339
|
+
}
|
|
1340
|
+
};
|
|
1341
|
+
const start = async () => {
|
|
1342
|
+
let mainStarted = false;
|
|
1343
|
+
try {
|
|
1344
|
+
if (serviceProxyListenTarget) {
|
|
1345
|
+
const boundServiceProxyTarget = await serviceProxy.startStandalone({
|
|
1346
|
+
listenTarget: serviceProxyListenTarget,
|
|
1347
|
+
});
|
|
1348
|
+
serviceProxyListenTarget = boundServiceProxyTarget;
|
|
1349
|
+
logger.info({
|
|
1350
|
+
listen: formatListenTarget(serviceProxyListenTarget),
|
|
1351
|
+
publicBaseUrl: serviceProxyPublicBaseUrl,
|
|
1352
|
+
elapsed: elapsed(),
|
|
1353
|
+
}, "Service proxy listening");
|
|
1354
|
+
}
|
|
1355
|
+
// Start main HTTP server
|
|
1356
|
+
await new Promise((resolve, reject) => {
|
|
1357
|
+
const onError = (err) => {
|
|
1358
|
+
httpServer.off("listening", onListening);
|
|
1359
|
+
reject(err);
|
|
1360
|
+
};
|
|
1361
|
+
const onListening = () => {
|
|
1362
|
+
httpServer.off("error", onError);
|
|
1363
|
+
mainStarted = true;
|
|
1364
|
+
const logAndResolve = async () => {
|
|
1365
|
+
boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
|
|
1366
|
+
const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
|
|
1367
|
+
agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
|
|
1368
|
+
agentManager.setMcpBaseUrl(agentMcpBaseUrl);
|
|
1369
|
+
agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
|
|
1370
|
+
daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
|
|
1371
|
+
agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
|
|
1372
|
+
agentManager.setPaseoToolsEnabled(value !== false);
|
|
1373
|
+
});
|
|
1374
|
+
daemonConfigStore.onFieldChange("appendSystemPrompt", (value) => {
|
|
1375
|
+
agentManager.setAppendSystemPrompt(typeof value === "string" ? value : "");
|
|
1376
|
+
});
|
|
1377
|
+
const relayEnabled = config.relayEnabled ?? true;
|
|
1378
|
+
const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
|
|
1379
|
+
const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
|
|
1380
|
+
const relayUseTls = config.relayUseTls ?? relayEndpoint === "relay.paseo.sh:443";
|
|
1381
|
+
const relayPublicUseTls = config.relayPublicUseTls ?? relayUseTls;
|
|
1382
|
+
const appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
|
|
1383
|
+
if (boundListenTarget.type === "tcp") {
|
|
1384
|
+
logger.info({
|
|
1385
|
+
host: boundListenTarget.host,
|
|
1386
|
+
port: boundListenTarget.port,
|
|
1387
|
+
authRequired: !!config.auth?.password,
|
|
1388
|
+
elapsed: elapsed(),
|
|
1389
|
+
}, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
|
|
1390
|
+
}
|
|
1391
|
+
else {
|
|
1392
|
+
logger.info({
|
|
1393
|
+
path: boundListenTarget.path,
|
|
1394
|
+
authRequired: !!config.auth?.password,
|
|
1395
|
+
elapsed: elapsed(),
|
|
1396
|
+
}, `Server listening on ${boundListenTarget.path}`);
|
|
1397
|
+
}
|
|
1398
|
+
if (config.auth?.password) {
|
|
1399
|
+
logger.info("Daemon password authentication enabled");
|
|
1400
|
+
}
|
|
1401
|
+
// Push subsystem wires the pushTrigger channel onto the AgentManager
|
|
1402
|
+
// attention bus alongside WebSocketServer. Stories 1.3/1.4 will attach
|
|
1403
|
+
// their delivery workers to `pushSubsystem.triggerEmitter.on(...)`.
|
|
1404
|
+
// The PASEO_PUSH_ENABLED=false kill switch is honored inside the emitter.
|
|
1405
|
+
pushSubsystem = createPushSubsystem({
|
|
1406
|
+
agentManager,
|
|
1407
|
+
serverId,
|
|
1408
|
+
logger,
|
|
1409
|
+
subscriptionStore: pushSubscriptionStore,
|
|
1410
|
+
vapidKeys,
|
|
1411
|
+
});
|
|
1412
|
+
wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, workspaceAutoName, config.auth, speechService, terminalManager, {
|
|
1413
|
+
finalTimeoutMs: config.dictationFinalTimeoutMs,
|
|
1414
|
+
}, daemonVersion, (intent) => {
|
|
1415
|
+
try {
|
|
1416
|
+
config.onLifecycleIntent?.(intent);
|
|
1417
|
+
}
|
|
1418
|
+
catch (error) {
|
|
1419
|
+
logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
|
|
1420
|
+
}
|
|
1421
|
+
}, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, ingestionService, 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, {
|
|
1422
|
+
listen: formatListenTarget(boundListenTarget ?? listenTarget),
|
|
1423
|
+
worktreesRoot: config.worktreesRoot,
|
|
1424
|
+
appBaseUrl: config.appBaseUrl,
|
|
1425
|
+
relay: {
|
|
1426
|
+
enabled: relayEnabled,
|
|
1427
|
+
endpoint: relayEndpoint,
|
|
1428
|
+
publicEndpoint: relayPublicEndpoint,
|
|
1429
|
+
useTls: relayUseTls,
|
|
1430
|
+
publicUseTls: relayPublicUseTls,
|
|
1431
|
+
},
|
|
1432
|
+
},
|
|
1433
|
+
// Story 1.3 — inject the WorkflowManager so Session can serve
|
|
1434
|
+
// `workflow.*` RPCs (Session -> WorkflowManager, one-directional).
|
|
1435
|
+
workflowManager, serviceProxyPublicBaseUrl, browserToolsBroker, {
|
|
1436
|
+
filterStore: ingestionFilterStore,
|
|
1437
|
+
sourceStore: ingestionSourceStore,
|
|
1438
|
+
gatewayResolver: ingestionGatewayResolver,
|
|
1439
|
+
ledger: ingestionLedger,
|
|
1440
|
+
cohorts: ingestionCohorts,
|
|
1441
|
+
cohortStore: ingestionCohortStore,
|
|
1442
|
+
},
|
|
1443
|
+
// JARVIS-V1-SPEC §8. A getter so every server_info broadcast carries
|
|
1444
|
+
// the CURRENT availability, not whatever it was at daemon start.
|
|
1445
|
+
() => jarvisJudge.describe());
|
|
1446
|
+
// Story 1.3 bridge: re-publish Expo tokens registered via the legacy
|
|
1447
|
+
// `register_push_token` WebSocket message into the Story 1.2
|
|
1448
|
+
// PushSubscriptionStore so the Expo Push worker sees them.
|
|
1449
|
+
wsServer.setExpoTokenBridge((token) => {
|
|
1450
|
+
pushSubscriptionStore.upsert({ type: "expo", token });
|
|
1451
|
+
});
|
|
1452
|
+
// Chat-actions ws bridges (2026-05): expose the Story 1.2 push
|
|
1453
|
+
// subscription store + VAPID public key to every Session so
|
|
1454
|
+
// relay-connected clients can persist subscriptions and fetch the
|
|
1455
|
+
// VAPID key without round-tripping the HTTP /push/* routes
|
|
1456
|
+
// (which are unreachable over the relay transport).
|
|
1457
|
+
wsServer.setPushSubscriptionBridge(pushSubscriptionStore, vapidKeys.publicKey);
|
|
1458
|
+
// COMPAT(extensions): route client-invoked plugin commands to the
|
|
1459
|
+
// extension-service. No-op until HYPERPASEO_EXTENSIONS=1 spawns hosts
|
|
1460
|
+
// (executeCommand then throws "no extension provides …" → ok:false).
|
|
1461
|
+
wsServer.setExtensionExecuteCommand((commandId, args) => extensionService.executeCommand(commandId, args));
|
|
1462
|
+
if (relayEnabled) {
|
|
1463
|
+
const offer = await createConnectionOfferV2({
|
|
1464
|
+
serverId,
|
|
1465
|
+
daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
|
|
1466
|
+
relay: {
|
|
1467
|
+
endpoint: relayPublicEndpoint,
|
|
1468
|
+
useTls: relayPublicUseTls,
|
|
1469
|
+
},
|
|
1470
|
+
});
|
|
1471
|
+
encodeOfferToFragmentUrl({ offer, appBaseUrl });
|
|
1472
|
+
relayTransport?.stop().catch(() => undefined);
|
|
1473
|
+
relayTransport = startRelayTransport({
|
|
1474
|
+
logger,
|
|
1475
|
+
attachSocket: (ws, metadata) => {
|
|
1476
|
+
if (!wsServer) {
|
|
1477
|
+
throw new Error("WebSocket server not initialized");
|
|
1478
|
+
}
|
|
1479
|
+
return wsServer.attachExternalSocket(ws, metadata);
|
|
1480
|
+
},
|
|
1481
|
+
relayEndpoint,
|
|
1482
|
+
relayUseTls,
|
|
1483
|
+
serverId,
|
|
1484
|
+
daemonKeyPair: daemonKeyPair.keyPair,
|
|
1485
|
+
});
|
|
1486
|
+
}
|
|
1487
|
+
};
|
|
1488
|
+
logAndResolve().then(resolve, reject);
|
|
1489
|
+
};
|
|
1490
|
+
httpServer.once("error", onError);
|
|
1491
|
+
httpServer.once("listening", onListening);
|
|
1492
|
+
if (listenTarget.type === "tcp") {
|
|
1493
|
+
httpServer.listen(listenTarget.port, listenTarget.host);
|
|
1494
|
+
}
|
|
1495
|
+
else {
|
|
1496
|
+
if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
|
|
1497
|
+
unlinkSync(listenTarget.path);
|
|
1498
|
+
}
|
|
1499
|
+
httpServer.listen(listenTarget.path);
|
|
1500
|
+
}
|
|
1501
|
+
});
|
|
1502
|
+
// Start speech service after listening so synchronous Sherpa native
|
|
1503
|
+
// model loading doesn't block the server from accepting connections.
|
|
1504
|
+
speechService.start();
|
|
1505
|
+
scriptHealthMonitor.start();
|
|
1506
|
+
await extensionService.start();
|
|
1507
|
+
// Nudge the agents the previous shutdown interrupted.
|
|
1508
|
+
//
|
|
1509
|
+
// After the listen, not before: `agentManager.setMcpBaseUrl` is only
|
|
1510
|
+
// called from the `onListening` callback above, so an agent resumed
|
|
1511
|
+
// earlier would come back without paseo's own MCP tools.
|
|
1512
|
+
//
|
|
1513
|
+
// Not awaited: `start()` gates the supervisor's readiness message, and
|
|
1514
|
+
// each nudge is a full provider turn. Blocking on them would report a
|
|
1515
|
+
// healthy daemon as slow to boot.
|
|
1516
|
+
void resumeAgentsAfterRestart({
|
|
1517
|
+
paseoHome: config.paseoHome,
|
|
1518
|
+
agentManager,
|
|
1519
|
+
agentStorage,
|
|
1520
|
+
logger,
|
|
1521
|
+
}).catch((err) => {
|
|
1522
|
+
logger.warn({ err }, "Resume after restart failed");
|
|
1523
|
+
});
|
|
1524
|
+
}
|
|
1525
|
+
catch (error) {
|
|
1526
|
+
await serviceProxy.stopStandalone().catch(() => undefined);
|
|
1527
|
+
if (mainStarted) {
|
|
1528
|
+
httpServer.closeAllConnections();
|
|
1529
|
+
await new Promise((resolve) => httpServer.close(() => resolve()));
|
|
1530
|
+
}
|
|
1531
|
+
throw error;
|
|
1532
|
+
}
|
|
1533
|
+
};
|
|
1534
|
+
const stop = async () => {
|
|
1535
|
+
await captureInFlightAgentsForResume("daemon_stop");
|
|
1536
|
+
scriptHealthMonitor.stop();
|
|
1537
|
+
await extensionService.stop().catch(() => undefined);
|
|
1538
|
+
await closeAllAgents(logger, agentManager);
|
|
1539
|
+
await agentManager.flush().catch(() => undefined);
|
|
1540
|
+
detachAgentStoragePersistence();
|
|
1541
|
+
await agentStorage.flush().catch(() => undefined);
|
|
1542
|
+
await providerSnapshotManager.shutdown();
|
|
1543
|
+
terminalManager.killAll();
|
|
1544
|
+
speechService.stop();
|
|
1545
|
+
await scheduleService.stop().catch(() => undefined);
|
|
1546
|
+
// Closing checkpoints the WAL away. Optional-chained because construction above
|
|
1547
|
+
// is allowed to have failed without stopping the daemon.
|
|
1548
|
+
ingestionLedger?.close();
|
|
1549
|
+
await ingestionService.stop().catch(() => undefined);
|
|
1550
|
+
await relayTransport?.stop().catch(() => undefined);
|
|
1551
|
+
if (wsServer) {
|
|
1552
|
+
await wsServer.close();
|
|
1553
|
+
}
|
|
1554
|
+
pushSubsystem?.dispose();
|
|
1555
|
+
await serviceProxy.stopStandalone();
|
|
1556
|
+
// Force-drop remaining sockets so httpServer.close() resolves promptly.
|
|
1557
|
+
// We've already closed wsServer (which sent ws-layer close frames) and
|
|
1558
|
+
// stopped every other service, so anything still attached is a TCP
|
|
1559
|
+
// socket whose higher-level shutdown hasn't fully released it (e.g.
|
|
1560
|
+
// upgraded WS sockets in the closing handshake, or HTTP keep-alive
|
|
1561
|
+
// sockets in CLOSE_WAIT). closeIdleConnections() does not catch
|
|
1562
|
+
// upgraded sockets, so we use closeAllConnections() here.
|
|
1563
|
+
httpServer.closeAllConnections();
|
|
1564
|
+
await new Promise((resolve) => {
|
|
1565
|
+
httpServer.close(() => resolve());
|
|
1566
|
+
});
|
|
1567
|
+
// Clean up socket files
|
|
1568
|
+
if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
|
|
1569
|
+
unlinkSync(listenTarget.path);
|
|
1570
|
+
}
|
|
1571
|
+
};
|
|
1572
|
+
return {
|
|
1573
|
+
config,
|
|
1574
|
+
agentManager,
|
|
1575
|
+
agentStorage,
|
|
1576
|
+
workflowManager,
|
|
1577
|
+
terminalManager,
|
|
1578
|
+
serviceProxy,
|
|
1579
|
+
scriptRuntimeStore,
|
|
1580
|
+
browserToolsBroker,
|
|
1581
|
+
start,
|
|
1582
|
+
stop,
|
|
1583
|
+
getListenTarget: () => boundListenTarget,
|
|
1584
|
+
};
|
|
1585
|
+
}
|
|
1586
|
+
async function closeAllAgents(logger, agentManager) {
|
|
1587
|
+
const agents = agentManager.listAgents();
|
|
1588
|
+
await Promise.all(agents.map(async (agent) => {
|
|
1589
|
+
try {
|
|
1590
|
+
await agentManager.closeAgent(agent.id);
|
|
1591
|
+
}
|
|
1592
|
+
catch (err) {
|
|
1593
|
+
logger.error({ err, agentId: agent.id }, "Failed to close agent");
|
|
1594
|
+
}
|
|
1595
|
+
}));
|
|
1596
|
+
}
|
|
1597
|
+
//# sourceMappingURL=bootstrap.js.map
|