@getpaseo/server 0.1.62 → 0.1.63
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/README.md +4 -0
- package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
- package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
- package/dist/server/client/daemon-client-transport-types.d.ts +13 -13
- package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.d.ts +1 -1
- package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.js +5 -4
- package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +59 -37
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +62 -17
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
- package/dist/server/server/agent/agent-loading.js +5 -3
- package/dist/server/server/agent/agent-loading.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +45 -19
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +393 -290
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -6
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.js +46 -38
- package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
- package/dist/server/server/agent/agent-projections.d.ts +4 -6
- package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
- package/dist/server/server/agent/agent-projections.js +59 -65
- package/dist/server/server/agent/agent-projections.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +58 -45
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +43 -40
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
- package/dist/server/server/agent/agent-storage.d.ts +2 -2
- package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
- package/dist/server/server/agent/agent-storage.js +29 -36
- package/dist/server/server/agent/agent-storage.js.map +1 -1
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +6 -6
- package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
- package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
- package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store.js +85 -64
- package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +185 -148
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/mcp-shared.d.ts +9 -2
- package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-shared.js +2 -0
- package/dist/server/server/agent/mcp-shared.js.map +1 -1
- package/dist/server/server/agent/model-resolver.d.ts +2 -2
- package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
- package/dist/server/server/agent/model-resolver.js +9 -5
- package/dist/server/server/agent/model-resolver.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +20 -9
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts +4 -2
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +24 -21
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
- package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
- package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.d.ts +11 -12
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.js +148 -122
- package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +20 -13
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +610 -460
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +49 -44
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +27 -8
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +564 -492
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
- package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
- package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +385 -360
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
- package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +3 -3
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +2 -2
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.js +63 -53
- package/dist/server/server/agent/stt-manager.js.map +1 -1
- package/dist/server/server/agent/timeline-projection.d.ts +6 -6
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.js +11 -6
- package/dist/server/server/agent/timeline-projection.js.map +1 -1
- package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
- package/dist/server/server/agent/tts-manager.js +1 -0
- package/dist/server/server/agent/tts-manager.js.map +1 -1
- package/dist/server/server/agent-attention-policy.d.ts +2 -2
- package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
- package/dist/server/server/bootstrap.d.ts +4 -4
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +493 -485
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/chat/chat-service.d.ts +1 -1
- package/dist/server/server/chat/chat-service.d.ts.map +1 -1
- package/dist/server/server/chat/chat-service.js +3 -3
- package/dist/server/server/chat/chat-service.js.map +1 -1
- package/dist/server/server/checkout-diff-manager.d.ts +2 -2
- package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
- package/dist/server/server/checkout-git-utils.d.ts +5 -3
- package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
- package/dist/server/server/checkout-git-utils.js +1 -2
- package/dist/server/server/checkout-git-utils.js.map +1 -1
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +68 -39
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/connection-offer.d.ts +2 -2
- package/dist/server/server/connection-offer.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.d.ts +5 -3
- package/dist/server/server/daemon-config-store.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.js +26 -0
- package/dist/server/server/daemon-config-store.js.map +1 -1
- package/dist/server/server/daemon-keypair.d.ts +2 -2
- package/dist/server/server/daemon-keypair.d.ts.map +1 -1
- package/dist/server/server/editor-targets.d.ts +4 -4
- package/dist/server/server/editor-targets.d.ts.map +1 -1
- package/dist/server/server/editor-targets.js +11 -15
- package/dist/server/server/editor-targets.js.map +1 -1
- package/dist/server/server/exports.d.ts +3 -3
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +1 -3
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/file-download/token-store.d.ts +4 -4
- package/dist/server/server/file-download/token-store.d.ts.map +1 -1
- package/dist/server/server/index.js +16 -12
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/logger.d.ts +4 -4
- package/dist/server/server/logger.d.ts.map +1 -1
- package/dist/server/server/logger.js +26 -20
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
- package/dist/server/server/loop-service.d.ts +13 -12
- package/dist/server/server/loop-service.d.ts.map +1 -1
- package/dist/server/server/loop-service.js +22 -18
- package/dist/server/server/loop-service.js.map +1 -1
- package/dist/server/server/package-version.d.ts +2 -2
- package/dist/server/server/package-version.d.ts.map +1 -1
- package/dist/server/server/package-version.js +19 -17
- package/dist/server/server/package-version.js.map +1 -1
- package/dist/server/server/pairing-offer.d.ts +2 -2
- package/dist/server/server/pairing-offer.d.ts.map +1 -1
- package/dist/server/server/paseo-env.d.ts +9 -0
- package/dist/server/server/paseo-env.d.ts.map +1 -0
- package/dist/server/server/paseo-env.js +70 -0
- package/dist/server/server/paseo-env.js.map +1 -0
- package/dist/server/server/paseo-worktree-archive-service.d.ts +4 -4
- package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-archive-service.js +11 -11
- package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +62 -62
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +4 -4
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/persistence-hooks.d.ts +8 -9
- package/dist/server/server/persistence-hooks.d.ts.map +1 -1
- package/dist/server/server/persistence-hooks.js +4 -12
- package/dist/server/server/persistence-hooks.js.map +1 -1
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/push/push-service.d.ts.map +1 -1
- package/dist/server/server/push/push-service.js +1 -3
- package/dist/server/server/push/push-service.js.map +1 -1
- package/dist/server/server/relay-transport.d.ts +8 -8
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +27 -16
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/schedule/service.d.ts.map +1 -1
- package/dist/server/server/schedule/service.js +2 -2
- package/dist/server/server/schedule/service.js.map +1 -1
- package/dist/server/server/script-health-monitor.d.ts.map +1 -1
- package/dist/server/server/script-health-monitor.js +7 -6
- package/dist/server/server/script-health-monitor.js.map +1 -1
- package/dist/server/server/script-proxy.js +1 -1
- package/dist/server/server/script-proxy.js.map +1 -1
- package/dist/server/server/script-status-projection.d.ts +4 -4
- package/dist/server/server/script-status-projection.d.ts.map +1 -1
- package/dist/server/server/script-status-projection.js +54 -44
- package/dist/server/server/script-status-projection.js.map +1 -1
- package/dist/server/server/server-id.d.ts +4 -4
- package/dist/server/server/server-id.d.ts.map +1 -1
- package/dist/server/server/session.d.ts +45 -14
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +1098 -761
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/audio.js +1 -1
- package/dist/server/server/speech/audio.js.map +1 -1
- package/dist/server/server/speech/providers/local/config.d.ts +6 -6
- package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/config.js +41 -16
- package/dist/server/server/speech/providers/local/config.js.map +1 -1
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
- package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.js +108 -77
- package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
- package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
- package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/config.js +58 -31
- package/dist/server/server/speech/providers/openai/config.js.map +1 -1
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
- package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
- package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/runtime.js +37 -32
- package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
- package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/stt.js +4 -3
- package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
- package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/tts.js +3 -2
- package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.js +46 -17
- package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
- package/dist/server/server/speech/speech-provider.d.ts +2 -2
- package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.d.ts +6 -6
- package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.js +17 -17
- package/dist/server/server/speech/speech-runtime.js.map +1 -1
- package/dist/server/server/speech/speech-types.d.ts +2 -2
- package/dist/server/server/speech/speech-types.d.ts.map +1 -1
- package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
- package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
- package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
- package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
- package/dist/server/server/utils/diff-highlighter.js +67 -66
- package/dist/server/server/utils/diff-highlighter.js.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.js +1 -0
- package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
- package/dist/server/server/voice-types.d.ts +2 -2
- package/dist/server/server/voice-types.d.ts.map +1 -1
- package/dist/server/server/websocket-server.d.ts +31 -21
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +299 -197
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-git-metadata.d.ts +2 -2
- package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
- package/dist/server/server/workspace-git-metadata.js +2 -32
- package/dist/server/server/workspace-git-metadata.js.map +1 -1
- package/dist/server/server/workspace-git-service.d.ts +8 -4
- package/dist/server/server/workspace-git-service.d.ts.map +1 -1
- package/dist/server/server/workspace-git-service.js +163 -115
- package/dist/server/server/workspace-git-service.js.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
- package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.js +82 -82
- package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
- package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-bootstrap.js +40 -33
- package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
- package/dist/server/server/workspace-registry-model.d.ts +19 -6
- package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-model.js +35 -21
- package/dist/server/server/workspace-registry-model.js.map +1 -1
- package/dist/server/server/workspace-registry.d.ts +2 -2
- package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
- package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
- package/dist/server/server/workspace-service-env.js +3 -3
- package/dist/server/server/workspace-service-env.js.map +1 -1
- package/dist/server/server/worktree-bootstrap.d.ts +4 -4
- package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
- package/dist/server/server/worktree-bootstrap.js +95 -67
- package/dist/server/server/worktree-bootstrap.js.map +1 -1
- package/dist/server/server/worktree-session.d.ts +8 -8
- package/dist/server/server/worktree-session.d.ts.map +1 -1
- package/dist/server/server/worktree-session.js +27 -19
- package/dist/server/server/worktree-session.js.map +1 -1
- package/dist/server/services/github-service.d.ts +1 -7
- package/dist/server/services/github-service.d.ts.map +1 -1
- package/dist/server/services/github-service.js +123 -143
- package/dist/server/services/github-service.js.map +1 -1
- package/dist/server/shared/agent-attention-notification.d.ts +9 -8
- package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
- package/dist/server/shared/agent-attention-notification.js +27 -17
- package/dist/server/shared/agent-attention-notification.js.map +1 -1
- package/dist/server/shared/daemon-endpoints.d.ts +2 -2
- package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
- package/dist/server/shared/daemon-endpoints.js +17 -2
- package/dist/server/shared/daemon-endpoints.js.map +1 -1
- package/dist/server/shared/messages.d.ts +21962 -3049
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +79 -2
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/terminal-stream-protocol.d.ts +2 -2
- package/dist/server/shared/terminal-stream-protocol.d.ts.map +1 -1
- package/dist/server/shared/tool-call-display.d.ts +2 -2
- package/dist/server/shared/tool-call-display.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.js +1 -3
- package/dist/server/terminal/terminal-manager.js.map +1 -1
- package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
- package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
- package/dist/server/terminal/terminal.d.ts +3 -2
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +57 -19
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/utils/checkout-git.d.ts +13 -12
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +351 -281
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/directory-suggestions.js +12 -33
- package/dist/server/utils/directory-suggestions.js.map +1 -1
- package/dist/server/utils/executable.d.ts +1 -14
- package/dist/server/utils/executable.d.ts.map +1 -1
- package/dist/server/utils/executable.js +13 -49
- package/dist/server/utils/executable.js.map +1 -1
- package/dist/server/utils/github-remote.d.ts +13 -0
- package/dist/server/utils/github-remote.d.ts.map +1 -0
- package/dist/server/utils/github-remote.js +128 -0
- package/dist/server/utils/github-remote.js.map +1 -0
- package/dist/server/utils/paseo-config-file.d.ts +30 -0
- package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-file.js +90 -0
- package/dist/server/utils/paseo-config-file.js.map +1 -0
- package/dist/server/utils/paseo-config-schema.d.ts +290 -0
- package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-schema.js +60 -0
- package/dist/server/utils/paseo-config-schema.js.map +1 -0
- package/dist/server/utils/project-icon.d.ts.map +1 -1
- package/dist/server/utils/project-icon.js +84 -109
- package/dist/server/utils/project-icon.js.map +1 -1
- package/dist/server/utils/promise-timeout.d.ts +2 -2
- package/dist/server/utils/promise-timeout.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.d.ts +3 -1
- package/dist/server/utils/run-git-command.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.js +10 -1
- package/dist/server/utils/run-git-command.js.map +1 -1
- package/dist/server/utils/script-hostname.d.ts +2 -2
- package/dist/server/utils/script-hostname.d.ts.map +1 -1
- package/dist/server/utils/spawn.d.ts +10 -3
- package/dist/server/utils/spawn.d.ts.map +1 -1
- package/dist/server/utils/spawn.js +30 -5
- package/dist/server/utils/spawn.js.map +1 -1
- package/dist/server/utils/windows-command.d.ts +15 -0
- package/dist/server/utils/windows-command.d.ts.map +1 -0
- package/dist/server/utils/windows-command.js +37 -0
- package/dist/server/utils/windows-command.js.map +1 -0
- package/dist/server/utils/worktree.d.ts +10 -7
- package/dist/server/utils/worktree.d.ts.map +1 -1
- package/dist/server/utils/worktree.js +64 -55
- package/dist/server/utils/worktree.js.map +1 -1
- package/dist/src/server/pid-lock.js.map +1 -1
- package/package.json +15 -20
- package/dist/server/server/agent/llm-openai.d.ts +0 -7
- package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
- package/dist/server/server/agent/llm-openai.js +0 -8
- package/dist/server/server/agent/llm-openai.js.map +0 -1
- package/dist/server/server/agent/orchestrator.d.ts +0 -12
- package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
- package/dist/server/server/agent/orchestrator.js +0 -12
- package/dist/server/server/agent/orchestrator.js.map +0 -1
- package/dist/server/server/types.d.ts +0 -5
- package/dist/server/server/types.d.ts.map +0 -1
- package/dist/server/server/types.js +0 -3
- package/dist/server/server/types.js.map +0 -1
- package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
- package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
- package/dist/server/server/workspace-registry.test-helpers.js +0 -121
- package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
|
@@ -80,7 +80,7 @@ import { AgentManager } from "./agent/agent-manager.js";
|
|
|
80
80
|
import { AgentStorage } from "./agent/agent-storage.js";
|
|
81
81
|
import { attachAgentStoragePersistence } from "./persistence-hooks.js";
|
|
82
82
|
import { createAgentMcpServer } from "./agent/mcp-server.js";
|
|
83
|
-
import { buildProviderRegistry,
|
|
83
|
+
import { buildProviderRegistry, createClientsFromRegistry, shutdownProviders, } from "./agent/provider-registry.js";
|
|
84
84
|
import { bootstrapWorkspaceRegistries } from "./workspace-registry-bootstrap.js";
|
|
85
85
|
import { FileBackedProjectRegistry, FileBackedWorkspaceRegistry } from "./workspace-registry.js";
|
|
86
86
|
import { FileBackedChatService } from "./chat/chat-service.js";
|
|
@@ -118,531 +118,539 @@ export async function createPaseoDaemon(config, rootLogger) {
|
|
|
118
118
|
const daemonVersion = resolveDaemonVersion(import.meta.url);
|
|
119
119
|
const daemonConfigStore = new DaemonConfigStore(config.paseoHome, {
|
|
120
120
|
mcp: { injectIntoAgents: config.mcpInjectIntoAgents ?? true },
|
|
121
|
+
providers: Object.fromEntries(Object.entries(config.providerOverrides ?? {}).map(([providerId, override]) => [
|
|
122
|
+
providerId,
|
|
123
|
+
{
|
|
124
|
+
...(override.enabled !== undefined ? { enabled: override.enabled } : {}),
|
|
125
|
+
...(override.additionalModels ? { additionalModels: override.additionalModels } : {}),
|
|
126
|
+
},
|
|
127
|
+
])),
|
|
121
128
|
}, logger);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
})) ?? [],
|
|
143
|
-
routeStore: scriptRouteStore,
|
|
144
|
-
runtimeStore: scriptRuntimeStore,
|
|
145
|
-
daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
146
|
-
resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
|
|
147
|
-
}),
|
|
148
|
-
});
|
|
149
|
-
const handleBranchChange = createBranchChangeRouteHandler({
|
|
129
|
+
const serverId = getOrCreateServerId(config.paseoHome, { logger });
|
|
130
|
+
const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
|
|
131
|
+
let relayTransport = null;
|
|
132
|
+
const staticDir = config.staticDir;
|
|
133
|
+
const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
|
|
134
|
+
const downloadTokenStore = new DownloadTokenStore({ ttlMs: downloadTokenTtlMs });
|
|
135
|
+
const listenTarget = parseListenString(config.listen);
|
|
136
|
+
const app = express();
|
|
137
|
+
let boundListenTarget = null;
|
|
138
|
+
let workspaceRegistry = null;
|
|
139
|
+
const scriptRouteStore = new ScriptRouteStore();
|
|
140
|
+
const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
|
|
141
|
+
const configuredHostnames = config.hostnames ?? config.allowedHosts;
|
|
142
|
+
let wsServer = null;
|
|
143
|
+
const scriptHealthMonitor = new ScriptHealthMonitor({
|
|
144
|
+
routeStore: scriptRouteStore,
|
|
145
|
+
onChange: createScriptStatusEmitter({
|
|
146
|
+
sessions: () => wsServer?.listActiveSessions().map((session) => ({
|
|
147
|
+
emit: (message) => session.emitServerMessage(message),
|
|
148
|
+
})) ?? [],
|
|
150
149
|
routeStore: scriptRouteStore,
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
// Script proxy — intercepts requests for registered *.localhost hostnames
|
|
169
|
-
// and forwards them to the corresponding local script port. Placed after
|
|
170
|
-
// the host allowlist (*.localhost is already allowed) but before CORS and
|
|
171
|
-
// the rest of the routes so proxied requests skip unnecessary middleware.
|
|
172
|
-
app.use(createScriptProxyMiddleware({ routeStore: scriptRouteStore, logger }));
|
|
173
|
-
// CORS - allow same-origin + configured origins
|
|
174
|
-
const allowedOrigins = new Set([
|
|
175
|
-
...config.corsAllowedOrigins,
|
|
176
|
-
// Packaged desktop renderers use the custom paseo:// protocol scheme.
|
|
177
|
-
"paseo://app",
|
|
178
|
-
// For TCP, add localhost variants
|
|
179
|
-
...(listenTarget.type === "tcp"
|
|
180
|
-
? [
|
|
181
|
-
`http://${listenTarget.host}:${listenTarget.port}`,
|
|
182
|
-
`http://localhost:${listenTarget.port}`,
|
|
183
|
-
`http://127.0.0.1:${listenTarget.port}`,
|
|
184
|
-
]
|
|
185
|
-
: []),
|
|
186
|
-
]);
|
|
150
|
+
runtimeStore: scriptRuntimeStore,
|
|
151
|
+
daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
152
|
+
resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
|
|
153
|
+
}),
|
|
154
|
+
});
|
|
155
|
+
const handleBranchChange = createBranchChangeRouteHandler({
|
|
156
|
+
routeStore: scriptRouteStore,
|
|
157
|
+
onRoutesChanged: (workspaceId) => {
|
|
158
|
+
scriptHealthMonitor.invalidateWorkspace(workspaceId);
|
|
159
|
+
},
|
|
160
|
+
logger,
|
|
161
|
+
});
|
|
162
|
+
// Host allowlist / DNS rebinding protection (vite-like semantics).
|
|
163
|
+
// For non-TCP (unix sockets), skip host validation.
|
|
164
|
+
if (listenTarget.type === "tcp") {
|
|
187
165
|
app.use((req, res, next) => {
|
|
188
|
-
const
|
|
189
|
-
if (
|
|
190
|
-
res.
|
|
191
|
-
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
192
|
-
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
193
|
-
res.setHeader("Access-Control-Allow-Credentials", "true");
|
|
194
|
-
}
|
|
195
|
-
if (req.method === "OPTIONS") {
|
|
196
|
-
res.status(204).end();
|
|
166
|
+
const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
|
|
167
|
+
if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
|
|
168
|
+
res.status(403).json({ error: "Invalid Host header" });
|
|
197
169
|
return;
|
|
198
170
|
}
|
|
199
171
|
next();
|
|
200
172
|
});
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
173
|
+
}
|
|
174
|
+
// Script proxy — intercepts requests for registered *.localhost hostnames
|
|
175
|
+
// and forwards them to the corresponding local script port. Placed after
|
|
176
|
+
// the host allowlist (*.localhost is already allowed) but before CORS and
|
|
177
|
+
// the rest of the routes so proxied requests skip unnecessary middleware.
|
|
178
|
+
app.use(createScriptProxyMiddleware({ routeStore: scriptRouteStore, logger }));
|
|
179
|
+
// CORS - allow same-origin + configured origins
|
|
180
|
+
const allowedOrigins = new Set([
|
|
181
|
+
...config.corsAllowedOrigins,
|
|
182
|
+
// Packaged desktop renderers use the custom paseo:// protocol scheme.
|
|
183
|
+
"paseo://app",
|
|
184
|
+
// For TCP, add localhost variants
|
|
185
|
+
...(listenTarget.type === "tcp"
|
|
186
|
+
? [
|
|
187
|
+
`http://${listenTarget.host}:${listenTarget.port}`,
|
|
188
|
+
`http://localhost:${listenTarget.port}`,
|
|
189
|
+
`http://127.0.0.1:${listenTarget.port}`,
|
|
190
|
+
]
|
|
191
|
+
: []),
|
|
192
|
+
]);
|
|
193
|
+
app.use((req, res, next) => {
|
|
194
|
+
const origin = req.headers.origin;
|
|
195
|
+
if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
|
|
196
|
+
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
197
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
198
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
199
|
+
res.setHeader("Access-Control-Allow-Credentials", "true");
|
|
200
|
+
}
|
|
201
|
+
if (req.method === "OPTIONS") {
|
|
202
|
+
res.status(204).end();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
next();
|
|
206
|
+
});
|
|
207
|
+
// Serve static files from public directory
|
|
208
|
+
app.use("/public", express.static(staticDir));
|
|
209
|
+
// Middleware
|
|
210
|
+
app.use(express.json());
|
|
211
|
+
// Health check endpoint
|
|
212
|
+
app.get("/api/health", (_req, res) => {
|
|
213
|
+
res.json({ status: "ok", timestamp: new Date().toISOString() });
|
|
214
|
+
});
|
|
215
|
+
app.get("/api/status", (_req, res) => {
|
|
216
|
+
res.json({
|
|
217
|
+
status: "server_info",
|
|
218
|
+
serverId,
|
|
219
|
+
hostname: getHostname(),
|
|
220
|
+
version: daemonVersion,
|
|
221
|
+
listen: formatListenTarget(boundListenTarget ?? listenTarget),
|
|
217
222
|
});
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
223
|
+
});
|
|
224
|
+
const handleFileDownload = async (req, res) => {
|
|
225
|
+
const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
|
|
226
|
+
? req.query.token.trim()
|
|
227
|
+
: null;
|
|
228
|
+
if (!token) {
|
|
229
|
+
res.status(400).json({ error: "Missing download token" });
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const entry = downloadTokenStore.consumeToken(token);
|
|
233
|
+
if (!entry) {
|
|
234
|
+
res.status(403).json({ error: "Invalid or expired token" });
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
const fileStats = await stat(entry.absolutePath);
|
|
239
|
+
if (!fileStats.isFile()) {
|
|
240
|
+
res.status(404).json({ error: "File not found" });
|
|
229
241
|
return;
|
|
230
242
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
res.setHeader("Content-Type", entry.mimeType);
|
|
239
|
-
res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
|
|
240
|
-
res.setHeader("Content-Length", entry.size.toString());
|
|
241
|
-
const stream = createReadStream(entry.absolutePath);
|
|
242
|
-
stream.on("error", (err) => {
|
|
243
|
-
logger.error({ err }, "Failed to stream download");
|
|
244
|
-
if (!res.headersSent) {
|
|
245
|
-
res.status(500).json({ error: "Failed to read file" });
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
res.end();
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
stream.pipe(res);
|
|
252
|
-
}
|
|
253
|
-
catch (err) {
|
|
254
|
-
logger.error({ err }, "Failed to download file");
|
|
243
|
+
const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
|
|
244
|
+
res.setHeader("Content-Type", entry.mimeType);
|
|
245
|
+
res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
|
|
246
|
+
res.setHeader("Content-Length", entry.size.toString());
|
|
247
|
+
const stream = createReadStream(entry.absolutePath);
|
|
248
|
+
stream.on("error", (err) => {
|
|
249
|
+
logger.error({ err }, "Failed to stream download");
|
|
255
250
|
if (!res.headersSent) {
|
|
256
|
-
res.status(
|
|
251
|
+
res.status(500).json({ error: "Failed to read file" });
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
res.end();
|
|
257
255
|
}
|
|
256
|
+
});
|
|
257
|
+
stream.pipe(res);
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
logger.error({ err }, "Failed to download file");
|
|
261
|
+
if (!res.headersSent) {
|
|
262
|
+
res.status(404).json({ error: "File not found" });
|
|
258
263
|
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
app.get("/api/files/download", (req, res) => {
|
|
267
|
+
void handleFileDownload(req, res);
|
|
268
|
+
});
|
|
269
|
+
const httpServer = createHTTPServer(app);
|
|
270
|
+
// Script proxy WebSocket upgrade handler — must be registered before the
|
|
271
|
+
// VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
|
|
272
|
+
// script-bound upgrades are forwarded first. The handler is a no-op for
|
|
273
|
+
// requests that don't match a registered script route.
|
|
274
|
+
const scriptProxyUpgradeHandler = createScriptProxyUpgradeHandler({
|
|
275
|
+
routeStore: scriptRouteStore,
|
|
276
|
+
logger,
|
|
277
|
+
});
|
|
278
|
+
httpServer.on("upgrade", scriptProxyUpgradeHandler);
|
|
279
|
+
const agentStorage = new AgentStorage(config.agentStoragePath, logger);
|
|
280
|
+
const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
|
|
281
|
+
workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
|
|
282
|
+
const chatService = new FileBackedChatService({
|
|
283
|
+
paseoHome: config.paseoHome,
|
|
284
|
+
logger,
|
|
285
|
+
});
|
|
286
|
+
const terminalManager = createTerminalManager();
|
|
287
|
+
const github = createGitHubService();
|
|
288
|
+
const workspaceGitService = new WorkspaceGitServiceImpl({
|
|
289
|
+
logger,
|
|
290
|
+
paseoHome: config.paseoHome,
|
|
291
|
+
deps: {
|
|
292
|
+
github,
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
const providerRegistry = buildProviderRegistry(logger, {
|
|
296
|
+
runtimeSettings: config.agentProviderSettings,
|
|
297
|
+
providerOverrides: config.providerOverrides,
|
|
298
|
+
workspaceGitService,
|
|
299
|
+
isDev: config.isDev === true,
|
|
300
|
+
});
|
|
301
|
+
const agentManager = new AgentManager({
|
|
302
|
+
clients: {
|
|
303
|
+
...createClientsFromRegistry(providerRegistry, logger),
|
|
304
|
+
...config.agentClients,
|
|
305
|
+
},
|
|
306
|
+
providerDefinitions: providerRegistry,
|
|
307
|
+
registry: agentStorage,
|
|
308
|
+
logger,
|
|
309
|
+
});
|
|
310
|
+
const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
|
|
311
|
+
await agentStorage.initialize();
|
|
312
|
+
logger.info({ elapsed: elapsed() }, "Agent storage initialized");
|
|
313
|
+
await bootstrapWorkspaceRegistries({
|
|
314
|
+
paseoHome: config.paseoHome,
|
|
315
|
+
agentStorage,
|
|
316
|
+
projectRegistry,
|
|
317
|
+
workspaceRegistry,
|
|
318
|
+
workspaceGitService,
|
|
319
|
+
logger,
|
|
320
|
+
});
|
|
321
|
+
logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
|
|
322
|
+
await chatService.initialize();
|
|
323
|
+
logger.info({ elapsed: elapsed() }, "Chat service initialized");
|
|
324
|
+
const checkoutDiffManager = new CheckoutDiffManager({
|
|
325
|
+
logger,
|
|
326
|
+
paseoHome: config.paseoHome,
|
|
327
|
+
workspaceGitService,
|
|
328
|
+
});
|
|
329
|
+
const loopService = new LoopService({
|
|
330
|
+
paseoHome: config.paseoHome,
|
|
331
|
+
logger,
|
|
332
|
+
agentManager,
|
|
333
|
+
});
|
|
334
|
+
await loopService.initialize();
|
|
335
|
+
logger.info({ elapsed: elapsed() }, "Loop service initialized");
|
|
336
|
+
const scheduleService = new ScheduleService({
|
|
337
|
+
paseoHome: config.paseoHome,
|
|
338
|
+
logger,
|
|
339
|
+
agentManager,
|
|
340
|
+
agentStorage,
|
|
341
|
+
});
|
|
342
|
+
await scheduleService.start();
|
|
343
|
+
logger.info({ elapsed: elapsed() }, "Schedule service initialized");
|
|
344
|
+
logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
|
|
345
|
+
const persistedRecords = await agentStorage.list();
|
|
346
|
+
logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
|
|
347
|
+
logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
|
|
348
|
+
logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
|
|
349
|
+
const mcpEnabled = config.mcpEnabled ?? true;
|
|
350
|
+
let agentMcpBaseUrl = null;
|
|
351
|
+
if (mcpEnabled) {
|
|
352
|
+
const agentMcpRoute = "/mcp/agents";
|
|
353
|
+
const agentMcpTransports = new Map();
|
|
354
|
+
const archiveWorkspaceRecordForMcp = async (workspaceId) => {
|
|
355
|
+
const sessions = wsServer?.listActiveSessions() ?? [];
|
|
356
|
+
if (sessions.length > 0) {
|
|
357
|
+
await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
await archivePersistedWorkspaceRecord({
|
|
361
|
+
workspaceId,
|
|
362
|
+
workspaceRegistry,
|
|
363
|
+
projectRegistry,
|
|
364
|
+
});
|
|
365
|
+
};
|
|
366
|
+
const emitWorkspaceUpdatesForMcpArchive = async (cwds) => {
|
|
367
|
+
const cwdList = Array.from(cwds);
|
|
368
|
+
await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalCwds(cwdList)));
|
|
369
|
+
};
|
|
370
|
+
const emitMcpArchiveSessionMessage = (message) => {
|
|
371
|
+
wsServer?.broadcast(wrapSessionMessage(message));
|
|
372
|
+
};
|
|
373
|
+
const createAgentMcpTransport = async (callerAgentId) => {
|
|
374
|
+
const agentMcpServer = await createAgentMcpServer({
|
|
375
|
+
agentManager,
|
|
376
|
+
agentStorage,
|
|
377
|
+
terminalManager,
|
|
378
|
+
getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
|
|
379
|
+
scheduleService,
|
|
380
|
+
providerRegistry,
|
|
283
381
|
github,
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
await loopService.initialize();
|
|
330
|
-
logger.info({ elapsed: elapsed() }, "Loop service initialized");
|
|
331
|
-
const scheduleService = new ScheduleService({
|
|
332
|
-
paseoHome: config.paseoHome,
|
|
333
|
-
logger,
|
|
334
|
-
agentManager,
|
|
335
|
-
agentStorage,
|
|
336
|
-
});
|
|
337
|
-
await scheduleService.start();
|
|
338
|
-
logger.info({ elapsed: elapsed() }, "Schedule service initialized");
|
|
339
|
-
logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
|
|
340
|
-
const persistedRecords = await agentStorage.list();
|
|
341
|
-
logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
|
|
342
|
-
logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
|
|
343
|
-
logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
|
|
344
|
-
const mcpEnabled = config.mcpEnabled ?? true;
|
|
345
|
-
let agentMcpBaseUrl = null;
|
|
346
|
-
if (mcpEnabled) {
|
|
347
|
-
const agentMcpRoute = "/mcp/agents";
|
|
348
|
-
const agentMcpTransports = new Map();
|
|
349
|
-
const archiveWorkspaceRecordForMcp = async (workspaceId) => {
|
|
350
|
-
const sessions = wsServer?.listActiveSessions() ?? [];
|
|
351
|
-
if (sessions.length > 0) {
|
|
352
|
-
await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
await archivePersistedWorkspaceRecord({
|
|
356
|
-
workspaceId,
|
|
357
|
-
workspaceRegistry,
|
|
358
|
-
projectRegistry,
|
|
359
|
-
});
|
|
360
|
-
};
|
|
361
|
-
const emitWorkspaceUpdatesForMcpArchive = async (cwds) => {
|
|
362
|
-
const cwdList = Array.from(cwds);
|
|
363
|
-
await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalCwds(cwdList)));
|
|
364
|
-
};
|
|
365
|
-
const emitMcpArchiveSessionMessage = (message) => {
|
|
366
|
-
wsServer?.broadcast(wrapSessionMessage(message));
|
|
367
|
-
};
|
|
368
|
-
const createAgentMcpTransport = async (callerAgentId) => {
|
|
369
|
-
const agentMcpServer = await createAgentMcpServer({
|
|
370
|
-
agentManager,
|
|
371
|
-
agentStorage,
|
|
372
|
-
terminalManager,
|
|
373
|
-
getDaemonTcpPort: () => boundListenTarget?.type === "tcp" ? boundListenTarget.port : null,
|
|
374
|
-
scheduleService,
|
|
375
|
-
providerRegistry,
|
|
376
|
-
github,
|
|
377
|
-
workspaceGitService,
|
|
378
|
-
archiveWorkspaceRecord: archiveWorkspaceRecordForMcp,
|
|
379
|
-
emitWorkspaceUpdatesForCwds: emitWorkspaceUpdatesForMcpArchive,
|
|
380
|
-
emitSessionMessage: emitMcpArchiveSessionMessage,
|
|
381
|
-
createPaseoWorktree: async (input, serviceOptions) => {
|
|
382
|
-
const coreDeps = createWorktreeCoreDeps(github);
|
|
383
|
-
const result = await createPaseoWorktree(input, {
|
|
384
|
-
...coreDeps,
|
|
385
|
-
...(serviceOptions?.resolveDefaultBranch
|
|
386
|
-
? {
|
|
387
|
-
resolveDefaultBranch: serviceOptions.resolveDefaultBranch,
|
|
388
|
-
}
|
|
389
|
-
: {}),
|
|
390
|
-
projectRegistry,
|
|
391
|
-
workspaceRegistry,
|
|
392
|
-
workspaceGitService,
|
|
393
|
-
});
|
|
394
|
-
await Promise.all(wsServer
|
|
395
|
-
?.listActiveSessions()
|
|
396
|
-
.map((session) => session.warmWorkspaceGitDataForWorkspace(result.workspace)) ?? []);
|
|
397
|
-
return result;
|
|
398
|
-
},
|
|
399
|
-
paseoHome: config.paseoHome,
|
|
400
|
-
callerAgentId,
|
|
401
|
-
enableVoiceTools: false,
|
|
402
|
-
resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
|
|
403
|
-
resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
|
|
404
|
-
logger,
|
|
405
|
-
});
|
|
406
|
-
const transport = new StreamableHTTPServerTransport({
|
|
407
|
-
sessionIdGenerator: () => randomUUID(),
|
|
408
|
-
onsessioninitialized: (sessionId) => {
|
|
409
|
-
agentMcpTransports.set(sessionId, transport);
|
|
410
|
-
logger.debug({ sessionId }, "Agent MCP session initialized");
|
|
411
|
-
},
|
|
412
|
-
onsessionclosed: (sessionId) => {
|
|
413
|
-
agentMcpTransports.delete(sessionId);
|
|
414
|
-
logger.debug({ sessionId }, "Agent MCP session closed");
|
|
415
|
-
},
|
|
416
|
-
// NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
|
|
417
|
-
// StreamableHTTPServerTransport's built-in check requires exact Host header matches.
|
|
418
|
-
enableDnsRebindingProtection: false,
|
|
419
|
-
});
|
|
420
|
-
transport.onclose = () => {
|
|
382
|
+
workspaceGitService,
|
|
383
|
+
archiveWorkspaceRecord: archiveWorkspaceRecordForMcp,
|
|
384
|
+
emitWorkspaceUpdatesForCwds: emitWorkspaceUpdatesForMcpArchive,
|
|
385
|
+
emitSessionMessage: emitMcpArchiveSessionMessage,
|
|
386
|
+
createPaseoWorktree: async (input, serviceOptions) => {
|
|
387
|
+
const coreDeps = createWorktreeCoreDeps(github);
|
|
388
|
+
const result = await createPaseoWorktree(input, {
|
|
389
|
+
...coreDeps,
|
|
390
|
+
...(serviceOptions?.resolveDefaultBranch
|
|
391
|
+
? {
|
|
392
|
+
resolveDefaultBranch: serviceOptions.resolveDefaultBranch,
|
|
393
|
+
}
|
|
394
|
+
: {}),
|
|
395
|
+
projectRegistry,
|
|
396
|
+
workspaceRegistry,
|
|
397
|
+
workspaceGitService,
|
|
398
|
+
});
|
|
399
|
+
await Promise.all(wsServer
|
|
400
|
+
?.listActiveSessions()
|
|
401
|
+
.map((session) => session.warmWorkspaceGitDataForWorkspace(result.workspace)) ?? []);
|
|
402
|
+
return result;
|
|
403
|
+
},
|
|
404
|
+
paseoHome: config.paseoHome,
|
|
405
|
+
callerAgentId,
|
|
406
|
+
enableVoiceTools: false,
|
|
407
|
+
resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
|
|
408
|
+
resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
|
|
409
|
+
logger,
|
|
410
|
+
});
|
|
411
|
+
const transport = new StreamableHTTPServerTransport({
|
|
412
|
+
sessionIdGenerator: () => randomUUID(),
|
|
413
|
+
onsessioninitialized: (sessionId) => {
|
|
414
|
+
agentMcpTransports.set(sessionId, transport);
|
|
415
|
+
logger.debug({ sessionId }, "Agent MCP session initialized");
|
|
416
|
+
},
|
|
417
|
+
onsessionclosed: (sessionId) => {
|
|
418
|
+
agentMcpTransports.delete(sessionId);
|
|
419
|
+
logger.debug({ sessionId }, "Agent MCP session closed");
|
|
420
|
+
},
|
|
421
|
+
// NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
|
|
422
|
+
// StreamableHTTPServerTransport's built-in check requires exact Host header matches.
|
|
423
|
+
enableDnsRebindingProtection: false,
|
|
424
|
+
});
|
|
425
|
+
Object.assign(transport, {
|
|
426
|
+
onclose: () => {
|
|
421
427
|
if (transport.sessionId) {
|
|
422
428
|
agentMcpTransports.delete(transport.sessionId);
|
|
423
429
|
}
|
|
424
|
-
}
|
|
425
|
-
|
|
430
|
+
},
|
|
431
|
+
onerror: (err) => {
|
|
426
432
|
logger.error({ err }, "Agent MCP transport error");
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
error: {
|
|
449
|
-
code: -32000,
|
|
450
|
-
message: "Missing or invalid MCP session",
|
|
451
|
-
},
|
|
452
|
-
id: null,
|
|
453
|
-
});
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
if (!isInitializeRequest(req.body)) {
|
|
457
|
-
res.status(400).json({
|
|
458
|
-
jsonrpc: "2.0",
|
|
459
|
-
error: {
|
|
460
|
-
code: -32000,
|
|
461
|
-
message: "Initialization request expected",
|
|
462
|
-
},
|
|
463
|
-
id: null,
|
|
464
|
-
});
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
const callerAgentIdRaw = req.query.callerAgentId;
|
|
468
|
-
const callerAgentId = typeof callerAgentIdRaw === "string"
|
|
469
|
-
? callerAgentIdRaw
|
|
470
|
-
: Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string"
|
|
471
|
-
? callerAgentIdRaw[0]
|
|
472
|
-
: undefined;
|
|
473
|
-
transport = await createAgentMcpTransport(callerAgentId);
|
|
474
|
-
}
|
|
475
|
-
await transport.handleRequest(req, res, req.body);
|
|
476
|
-
}
|
|
477
|
-
catch (err) {
|
|
478
|
-
logger.error({ err }, "Failed to handle Agent MCP request");
|
|
479
|
-
if (!res.headersSent) {
|
|
480
|
-
res.status(500).json({
|
|
433
|
+
},
|
|
434
|
+
});
|
|
435
|
+
await agentMcpServer.connect(transport);
|
|
436
|
+
return transport;
|
|
437
|
+
};
|
|
438
|
+
const runAgentMcpRequest = async (req, res) => {
|
|
439
|
+
if (config.mcpDebug) {
|
|
440
|
+
logger.debug({
|
|
441
|
+
method: req.method,
|
|
442
|
+
url: req.originalUrl,
|
|
443
|
+
sessionId: req.header("mcp-session-id"),
|
|
444
|
+
authorization: req.header("authorization"),
|
|
445
|
+
body: req.body,
|
|
446
|
+
}, "Agent MCP request");
|
|
447
|
+
}
|
|
448
|
+
try {
|
|
449
|
+
const sessionId = req.header("mcp-session-id");
|
|
450
|
+
let transport = sessionId ? agentMcpTransports.get(sessionId) : undefined;
|
|
451
|
+
if (!transport) {
|
|
452
|
+
if (req.method !== "POST") {
|
|
453
|
+
res.status(400).json({
|
|
481
454
|
jsonrpc: "2.0",
|
|
482
455
|
error: {
|
|
483
|
-
code: -
|
|
484
|
-
message: "
|
|
456
|
+
code: -32000,
|
|
457
|
+
message: "Missing or invalid MCP session",
|
|
485
458
|
},
|
|
486
459
|
id: null,
|
|
487
460
|
});
|
|
461
|
+
return;
|
|
488
462
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
logger.info("Agent MCP HTTP endpoint disabled");
|
|
498
|
-
}
|
|
499
|
-
const speechService = createSpeechService({
|
|
500
|
-
logger,
|
|
501
|
-
openaiConfig: config.openai,
|
|
502
|
-
speechConfig: config.speech,
|
|
503
|
-
});
|
|
504
|
-
logger.info({ elapsed: elapsed() }, "Speech service created");
|
|
505
|
-
logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
|
|
506
|
-
const start = async () => {
|
|
507
|
-
// Start main HTTP server
|
|
508
|
-
await new Promise((resolve, reject) => {
|
|
509
|
-
const onError = (err) => {
|
|
510
|
-
httpServer.off("listening", onListening);
|
|
511
|
-
reject(err);
|
|
512
|
-
};
|
|
513
|
-
const onListening = () => {
|
|
514
|
-
httpServer.off("error", onError);
|
|
515
|
-
const logAndResolve = async () => {
|
|
516
|
-
boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
|
|
517
|
-
const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
|
|
518
|
-
agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
|
|
519
|
-
agentManager.setMcpBaseUrl(agentMcpBaseUrl);
|
|
520
|
-
daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
|
|
521
|
-
agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
|
|
463
|
+
if (!isInitializeRequest(req.body)) {
|
|
464
|
+
res.status(400).json({
|
|
465
|
+
jsonrpc: "2.0",
|
|
466
|
+
error: {
|
|
467
|
+
code: -32000,
|
|
468
|
+
message: "Initialization request expected",
|
|
469
|
+
},
|
|
470
|
+
id: null,
|
|
522
471
|
});
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
host: boundListenTarget.host,
|
|
530
|
-
port: boundListenTarget.port,
|
|
531
|
-
elapsed: elapsed(),
|
|
532
|
-
}, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
logger.info({ path: boundListenTarget.path, elapsed: elapsed() }, `Server listening on ${boundListenTarget.path}`);
|
|
536
|
-
}
|
|
537
|
-
wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, speechService, terminalManager, {
|
|
538
|
-
finalTimeoutMs: config.dictationFinalTimeoutMs,
|
|
539
|
-
}, config.agentProviderSettings, config.providerOverrides, config.isDev === true, daemonVersion, (intent) => {
|
|
540
|
-
try {
|
|
541
|
-
config.onLifecycleIntent?.(intent);
|
|
542
|
-
}
|
|
543
|
-
catch (error) {
|
|
544
|
-
logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
|
|
545
|
-
}
|
|
546
|
-
}, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, handleBranchChange, () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null), () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null), (hostname) => scriptHealthMonitor.getHealthForHostname(hostname), workspaceGitService, github);
|
|
547
|
-
if (typeof process.send === "function" && process.env.PASEO_SUPERVISED === "1") {
|
|
548
|
-
process.send({
|
|
549
|
-
type: "paseo:ready",
|
|
550
|
-
listen: boundListenTarget.type === "tcp"
|
|
551
|
-
? `${boundListenTarget.host}:${boundListenTarget.port}`
|
|
552
|
-
: boundListenTarget.path,
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
if (relayEnabled) {
|
|
556
|
-
const offer = await createConnectionOfferV2({
|
|
557
|
-
serverId,
|
|
558
|
-
daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
|
|
559
|
-
relay: { endpoint: relayPublicEndpoint },
|
|
560
|
-
});
|
|
561
|
-
encodeOfferToFragmentUrl({ offer, appBaseUrl });
|
|
562
|
-
relayTransport?.stop().catch(() => undefined);
|
|
563
|
-
relayTransport = startRelayTransport({
|
|
564
|
-
logger,
|
|
565
|
-
attachSocket: (ws, metadata) => {
|
|
566
|
-
if (!wsServer) {
|
|
567
|
-
throw new Error("WebSocket server not initialized");
|
|
568
|
-
}
|
|
569
|
-
return wsServer.attachExternalSocket(ws, metadata);
|
|
570
|
-
},
|
|
571
|
-
relayEndpoint,
|
|
572
|
-
serverId,
|
|
573
|
-
daemonKeyPair: daemonKeyPair.keyPair,
|
|
574
|
-
});
|
|
575
|
-
}
|
|
576
|
-
};
|
|
577
|
-
logAndResolve().then(resolve, reject);
|
|
578
|
-
};
|
|
579
|
-
httpServer.once("error", onError);
|
|
580
|
-
httpServer.once("listening", onListening);
|
|
581
|
-
if (listenTarget.type === "tcp") {
|
|
582
|
-
httpServer.listen(listenTarget.port, listenTarget.host);
|
|
583
|
-
}
|
|
584
|
-
else {
|
|
585
|
-
if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
|
|
586
|
-
unlinkSync(listenTarget.path);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
const callerAgentIdRaw = req.query.callerAgentId;
|
|
475
|
+
let callerAgentId;
|
|
476
|
+
if (typeof callerAgentIdRaw === "string") {
|
|
477
|
+
callerAgentId = callerAgentIdRaw;
|
|
587
478
|
}
|
|
588
|
-
|
|
479
|
+
else if (Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string") {
|
|
480
|
+
callerAgentId = callerAgentIdRaw[0];
|
|
481
|
+
}
|
|
482
|
+
transport = await createAgentMcpTransport(callerAgentId);
|
|
589
483
|
}
|
|
590
|
-
|
|
591
|
-
// Start speech service after listening so synchronous Sherpa native
|
|
592
|
-
// model loading doesn't block the server from accepting connections.
|
|
593
|
-
speechService.start();
|
|
594
|
-
scriptHealthMonitor.start();
|
|
595
|
-
};
|
|
596
|
-
const stop = async () => {
|
|
597
|
-
scriptHealthMonitor.stop();
|
|
598
|
-
await closeAllAgents(logger, agentManager);
|
|
599
|
-
await agentManager.flush().catch(() => undefined);
|
|
600
|
-
detachAgentStoragePersistence();
|
|
601
|
-
await agentStorage.flush().catch(() => undefined);
|
|
602
|
-
await shutdownProviders(logger, {
|
|
603
|
-
runtimeSettings: config.agentProviderSettings,
|
|
604
|
-
providerOverrides: config.providerOverrides,
|
|
605
|
-
});
|
|
606
|
-
terminalManager.killAll();
|
|
607
|
-
speechService.stop();
|
|
608
|
-
await scheduleService.stop().catch(() => undefined);
|
|
609
|
-
await relayTransport?.stop().catch(() => undefined);
|
|
610
|
-
if (wsServer) {
|
|
611
|
-
await wsServer.close();
|
|
484
|
+
await transport.handleRequest(req, res, req.body);
|
|
612
485
|
}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
486
|
+
catch (err) {
|
|
487
|
+
logger.error({ err }, "Failed to handle Agent MCP request");
|
|
488
|
+
if (!res.headersSent) {
|
|
489
|
+
res.status(500).json({
|
|
490
|
+
jsonrpc: "2.0",
|
|
491
|
+
error: {
|
|
492
|
+
code: -32603,
|
|
493
|
+
message: "Internal MCP server error",
|
|
494
|
+
},
|
|
495
|
+
id: null,
|
|
496
|
+
});
|
|
497
|
+
}
|
|
619
498
|
}
|
|
620
499
|
};
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
agentManager,
|
|
624
|
-
agentStorage,
|
|
625
|
-
terminalManager,
|
|
626
|
-
scriptRouteStore,
|
|
627
|
-
scriptRuntimeStore,
|
|
628
|
-
start,
|
|
629
|
-
stop,
|
|
630
|
-
getListenTarget: () => boundListenTarget,
|
|
500
|
+
const handleAgentMcpRequest = (req, res) => {
|
|
501
|
+
void runAgentMcpRequest(req, res);
|
|
631
502
|
};
|
|
503
|
+
app.post(agentMcpRoute, handleAgentMcpRequest);
|
|
504
|
+
app.get(agentMcpRoute, handleAgentMcpRequest);
|
|
505
|
+
app.delete(agentMcpRoute, handleAgentMcpRequest);
|
|
506
|
+
logger.info({ route: agentMcpRoute }, "Agent MCP server mounted on main app");
|
|
632
507
|
}
|
|
633
|
-
|
|
634
|
-
|
|
508
|
+
else {
|
|
509
|
+
logger.info("Agent MCP HTTP endpoint disabled");
|
|
635
510
|
}
|
|
511
|
+
const speechService = createSpeechService({
|
|
512
|
+
logger,
|
|
513
|
+
openaiConfig: config.openai,
|
|
514
|
+
speechConfig: config.speech,
|
|
515
|
+
});
|
|
516
|
+
logger.info({ elapsed: elapsed() }, "Speech service created");
|
|
517
|
+
logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
|
|
518
|
+
const start = async () => {
|
|
519
|
+
// Start main HTTP server
|
|
520
|
+
await new Promise((resolve, reject) => {
|
|
521
|
+
const onError = (err) => {
|
|
522
|
+
httpServer.off("listening", onListening);
|
|
523
|
+
reject(err);
|
|
524
|
+
};
|
|
525
|
+
const onListening = () => {
|
|
526
|
+
httpServer.off("error", onError);
|
|
527
|
+
const logAndResolve = async () => {
|
|
528
|
+
boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
|
|
529
|
+
const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
|
|
530
|
+
agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
|
|
531
|
+
agentManager.setMcpBaseUrl(agentMcpBaseUrl);
|
|
532
|
+
daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
|
|
533
|
+
agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
|
|
534
|
+
});
|
|
535
|
+
const relayEnabled = config.relayEnabled ?? true;
|
|
536
|
+
const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
|
|
537
|
+
const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
|
|
538
|
+
const appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
|
|
539
|
+
if (boundListenTarget.type === "tcp") {
|
|
540
|
+
logger.info({
|
|
541
|
+
host: boundListenTarget.host,
|
|
542
|
+
port: boundListenTarget.port,
|
|
543
|
+
elapsed: elapsed(),
|
|
544
|
+
}, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
logger.info({ path: boundListenTarget.path, elapsed: elapsed() }, `Server listening on ${boundListenTarget.path}`);
|
|
548
|
+
}
|
|
549
|
+
wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, speechService, terminalManager, {
|
|
550
|
+
finalTimeoutMs: config.dictationFinalTimeoutMs,
|
|
551
|
+
}, config.agentProviderSettings, config.providerOverrides, config.isDev === true, daemonVersion, (intent) => {
|
|
552
|
+
try {
|
|
553
|
+
config.onLifecycleIntent?.(intent);
|
|
554
|
+
}
|
|
555
|
+
catch (error) {
|
|
556
|
+
logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
|
|
557
|
+
}
|
|
558
|
+
}, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, handleBranchChange, () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null), () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null), (hostname) => scriptHealthMonitor.getHealthForHostname(hostname), workspaceGitService, github);
|
|
559
|
+
if (typeof process.send === "function" && process.env.PASEO_SUPERVISED === "1") {
|
|
560
|
+
process.send({
|
|
561
|
+
type: "paseo:ready",
|
|
562
|
+
listen: boundListenTarget.type === "tcp"
|
|
563
|
+
? `${boundListenTarget.host}:${boundListenTarget.port}`
|
|
564
|
+
: boundListenTarget.path,
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
if (relayEnabled) {
|
|
568
|
+
const offer = await createConnectionOfferV2({
|
|
569
|
+
serverId,
|
|
570
|
+
daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
|
|
571
|
+
relay: { endpoint: relayPublicEndpoint },
|
|
572
|
+
});
|
|
573
|
+
encodeOfferToFragmentUrl({ offer, appBaseUrl });
|
|
574
|
+
relayTransport?.stop().catch(() => undefined);
|
|
575
|
+
relayTransport = startRelayTransport({
|
|
576
|
+
logger,
|
|
577
|
+
attachSocket: (ws, metadata) => {
|
|
578
|
+
if (!wsServer) {
|
|
579
|
+
throw new Error("WebSocket server not initialized");
|
|
580
|
+
}
|
|
581
|
+
return wsServer.attachExternalSocket(ws, metadata);
|
|
582
|
+
},
|
|
583
|
+
relayEndpoint,
|
|
584
|
+
serverId,
|
|
585
|
+
daemonKeyPair: daemonKeyPair.keyPair,
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
logAndResolve().then(resolve, reject);
|
|
590
|
+
};
|
|
591
|
+
httpServer.once("error", onError);
|
|
592
|
+
httpServer.once("listening", onListening);
|
|
593
|
+
if (listenTarget.type === "tcp") {
|
|
594
|
+
httpServer.listen(listenTarget.port, listenTarget.host);
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
|
|
598
|
+
unlinkSync(listenTarget.path);
|
|
599
|
+
}
|
|
600
|
+
httpServer.listen(listenTarget.path);
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
// Start speech service after listening so synchronous Sherpa native
|
|
604
|
+
// model loading doesn't block the server from accepting connections.
|
|
605
|
+
speechService.start();
|
|
606
|
+
scriptHealthMonitor.start();
|
|
607
|
+
};
|
|
608
|
+
const stop = async () => {
|
|
609
|
+
scriptHealthMonitor.stop();
|
|
610
|
+
await closeAllAgents(logger, agentManager);
|
|
611
|
+
await agentManager.flush().catch(() => undefined);
|
|
612
|
+
detachAgentStoragePersistence();
|
|
613
|
+
await agentStorage.flush().catch(() => undefined);
|
|
614
|
+
await shutdownProviders(logger, {
|
|
615
|
+
runtimeSettings: config.agentProviderSettings,
|
|
616
|
+
providerOverrides: config.providerOverrides,
|
|
617
|
+
});
|
|
618
|
+
terminalManager.killAll();
|
|
619
|
+
speechService.stop();
|
|
620
|
+
await scheduleService.stop().catch(() => undefined);
|
|
621
|
+
await relayTransport?.stop().catch(() => undefined);
|
|
622
|
+
if (wsServer) {
|
|
623
|
+
await wsServer.close();
|
|
624
|
+
}
|
|
625
|
+
await new Promise((resolve) => {
|
|
626
|
+
httpServer.close(() => resolve());
|
|
627
|
+
});
|
|
628
|
+
// Clean up socket files
|
|
629
|
+
if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
|
|
630
|
+
unlinkSync(listenTarget.path);
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
return {
|
|
634
|
+
config,
|
|
635
|
+
agentManager,
|
|
636
|
+
agentStorage,
|
|
637
|
+
terminalManager,
|
|
638
|
+
scriptRouteStore,
|
|
639
|
+
scriptRuntimeStore,
|
|
640
|
+
start,
|
|
641
|
+
stop,
|
|
642
|
+
getListenTarget: () => boundListenTarget,
|
|
643
|
+
};
|
|
636
644
|
}
|
|
637
645
|
async function closeAllAgents(logger, agentManager) {
|
|
638
646
|
const agents = agentManager.listAgents();
|
|
639
|
-
|
|
647
|
+
await Promise.all(agents.map(async (agent) => {
|
|
640
648
|
try {
|
|
641
649
|
await agentManager.closeAgent(agent.id);
|
|
642
650
|
}
|
|
643
651
|
catch (err) {
|
|
644
652
|
logger.error({ err, agentId: agent.id }, "Failed to close agent");
|
|
645
653
|
}
|
|
646
|
-
}
|
|
654
|
+
}));
|
|
647
655
|
}
|
|
648
656
|
//# sourceMappingURL=bootstrap.js.map
|