@getpaseo/server 0.1.2
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 +20 -0
- package/README.md +107 -0
- package/agent-prompt.md +339 -0
- package/dist/scripts/daemon-runner.js +32 -0
- package/dist/scripts/daemon-runner.js.map +1 -0
- package/dist/scripts/dev-runner.js +19 -0
- package/dist/scripts/dev-runner.js.map +1 -0
- package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
- package/dist/scripts/supervisor.js +95 -0
- package/dist/scripts/supervisor.js.map +1 -0
- package/dist/server/client/daemon-client.d.ts +383 -0
- package/dist/server/client/daemon-client.d.ts.map +1 -0
- package/dist/server/client/daemon-client.js +2443 -0
- package/dist/server/client/daemon-client.js.map +1 -0
- package/dist/server/server/agent/activity-curator.d.ts +8 -0
- package/dist/server/server/agent/activity-curator.d.ts.map +1 -0
- package/dist/server/server/agent/activity-curator.js +228 -0
- package/dist/server/server/agent/activity-curator.js.map +1 -0
- package/dist/server/server/agent/agent-management-mcp.d.ts +34 -0
- package/dist/server/server/agent/agent-management-mcp.d.ts.map +1 -0
- package/dist/server/server/agent/agent-management-mcp.js +619 -0
- package/dist/server/server/agent/agent-management-mcp.js.map +1 -0
- package/dist/server/server/agent/agent-manager.d.ts +182 -0
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -0
- package/dist/server/server/agent/agent-manager.js +1066 -0
- package/dist/server/server/agent/agent-manager.js.map +1 -0
- package/dist/server/server/agent/agent-metadata-generator.d.ts +29 -0
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -0
- package/dist/server/server/agent/agent-metadata-generator.js +157 -0
- package/dist/server/server/agent/agent-metadata-generator.js.map +1 -0
- package/dist/server/server/agent/agent-projections.d.ts +12 -0
- package/dist/server/server/agent/agent-projections.d.ts.map +1 -0
- package/dist/server/server/agent/agent-projections.js +238 -0
- package/dist/server/server/agent/agent-projections.js.map +1 -0
- package/dist/server/server/agent/agent-response-loop.d.ts +32 -0
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -0
- package/dist/server/server/agent/agent-response-loop.js +224 -0
- package/dist/server/server/agent/agent-response-loop.js.map +1 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts +360 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -0
- package/dist/server/server/agent/agent-sdk-types.js +2 -0
- package/dist/server/server/agent/agent-sdk-types.js.map +1 -0
- package/dist/server/server/agent/agent-storage.d.ts +187 -0
- package/dist/server/server/agent/agent-storage.d.ts.map +1 -0
- package/dist/server/server/agent/agent-storage.js +328 -0
- package/dist/server/server/agent/agent-storage.js.map +1 -0
- package/dist/server/server/agent/audio-utils.d.ts +3 -0
- package/dist/server/server/agent/audio-utils.d.ts.map +1 -0
- package/dist/server/server/agent/audio-utils.js +19 -0
- package/dist/server/server/agent/audio-utils.js.map +1 -0
- package/dist/server/server/agent/dictation-debug.d.ts +13 -0
- package/dist/server/server/agent/dictation-debug.d.ts.map +1 -0
- package/dist/server/server/agent/dictation-debug.js +50 -0
- package/dist/server/server/agent/dictation-debug.js.map +1 -0
- package/dist/server/server/agent/llm-openai.d.ts +7 -0
- package/dist/server/server/agent/llm-openai.d.ts.map +1 -0
- package/dist/server/server/agent/llm-openai.js +8 -0
- package/dist/server/server/agent/llm-openai.js.map +1 -0
- package/dist/server/server/agent/mcp-server.d.ts +26 -0
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -0
- package/dist/server/server/agent/mcp-server.js +762 -0
- package/dist/server/server/agent/mcp-server.js.map +1 -0
- package/dist/server/server/agent/model-resolver.d.ts +11 -0
- package/dist/server/server/agent/model-resolver.d.ts.map +1 -0
- package/dist/server/server/agent/model-resolver.js +21 -0
- package/dist/server/server/agent/model-resolver.js.map +1 -0
- package/dist/server/server/agent/orchestrator-instructions.d.ts +7 -0
- package/dist/server/server/agent/orchestrator-instructions.d.ts.map +1 -0
- package/dist/server/server/agent/orchestrator-instructions.js +51 -0
- package/dist/server/server/agent/orchestrator-instructions.js.map +1 -0
- package/dist/server/server/agent/orchestrator.d.ts +12 -0
- package/dist/server/server/agent/orchestrator.d.ts.map +1 -0
- package/dist/server/server/agent/orchestrator.js +12 -0
- package/dist/server/server/agent/orchestrator.js.map +1 -0
- package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
- package/dist/server/server/agent/pcm16-resampler.d.ts.map +1 -0
- package/dist/server/server/agent/pcm16-resampler.js +63 -0
- package/dist/server/server/agent/pcm16-resampler.js.map +1 -0
- package/dist/server/server/agent/provider-launch-config.d.ts +139 -0
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -0
- package/dist/server/server/agent/provider-launch-config.js +83 -0
- package/dist/server/server/agent/provider-launch-config.js.map +1 -0
- package/dist/server/server/agent/provider-manifest.d.ts +20 -0
- package/dist/server/server/agent/provider-manifest.d.ts.map +1 -0
- package/dist/server/server/agent/provider-manifest.js +97 -0
- package/dist/server/server/agent/provider-manifest.js.map +1 -0
- package/dist/server/server/agent/provider-registry.d.ts +18 -0
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -0
- package/dist/server/server/agent/provider-registry.js +45 -0
- package/dist/server/server/agent/provider-registry.js.map +1 -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.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +42 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -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.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +73 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/claude-agent.d.ts +35 -0
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude-agent.js +2056 -0
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +13 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +67 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +15 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +640 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +34 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.js +2476 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +9 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.js +486 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -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.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +33 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -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.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +75 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +37 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode-agent.js +822 -0
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +1363 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +534 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +18 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js +119 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
- package/dist/server/server/agent/recordings-debug.d.ts +3 -0
- package/dist/server/server/agent/recordings-debug.d.ts.map +1 -0
- package/dist/server/server/agent/recordings-debug.js +19 -0
- package/dist/server/server/agent/recordings-debug.js.map +1 -0
- package/dist/server/server/agent/stt-debug.d.ts +10 -0
- package/dist/server/server/agent/stt-debug.d.ts.map +1 -0
- package/dist/server/server/agent/stt-debug.js +33 -0
- package/dist/server/server/agent/stt-debug.js.map +1 -0
- package/dist/server/server/agent/stt-manager.d.ts +32 -0
- package/dist/server/server/agent/stt-manager.d.ts.map +1 -0
- package/dist/server/server/agent/stt-manager.js +231 -0
- package/dist/server/server/agent/stt-manager.js.map +1 -0
- package/dist/server/server/agent/system-prompt.d.ts +3 -0
- package/dist/server/server/agent/system-prompt.d.ts.map +1 -0
- package/dist/server/server/agent/system-prompt.js +19 -0
- package/dist/server/server/agent/system-prompt.js.map +1 -0
- package/dist/server/server/agent/tool-name-normalization.d.ts +7 -0
- package/dist/server/server/agent/tool-name-normalization.d.ts.map +1 -0
- package/dist/server/server/agent/tool-name-normalization.js +45 -0
- package/dist/server/server/agent/tool-name-normalization.js.map +1 -0
- package/dist/server/server/agent/tts-debug.d.ts +8 -0
- package/dist/server/server/agent/tts-debug.d.ts.map +1 -0
- package/dist/server/server/agent/tts-debug.js +24 -0
- package/dist/server/server/agent/tts-debug.js.map +1 -0
- package/dist/server/server/agent/tts-manager.d.ts +33 -0
- package/dist/server/server/agent/tts-manager.d.ts.map +1 -0
- package/dist/server/server/agent/tts-manager.js +261 -0
- package/dist/server/server/agent/tts-manager.js.map +1 -0
- package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
- package/dist/server/server/agent/wait-for-agent-tracker.d.ts.map +1 -0
- package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
- package/dist/server/server/agent/wait-for-agent-tracker.js.map +1 -0
- package/dist/server/server/allowed-hosts.d.ts +13 -0
- package/dist/server/server/allowed-hosts.d.ts.map +1 -0
- package/dist/server/server/allowed-hosts.js +94 -0
- package/dist/server/server/allowed-hosts.js.map +1 -0
- package/dist/server/server/bootstrap.d.ts +49 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -0
- package/dist/server/server/bootstrap.js +483 -0
- package/dist/server/server/bootstrap.js.map +1 -0
- package/dist/server/server/config.d.ts +13 -0
- package/dist/server/server/config.d.ts.map +1 -0
- package/dist/server/server/config.js +84 -0
- package/dist/server/server/config.js.map +1 -0
- package/dist/server/server/connection-offer.d.ts +19 -0
- package/dist/server/server/connection-offer.d.ts.map +1 -0
- package/dist/server/server/connection-offer.js +60 -0
- package/dist/server/server/connection-offer.js.map +1 -0
- package/dist/server/server/daemon-keypair.d.ts +8 -0
- package/dist/server/server/daemon-keypair.d.ts.map +1 -0
- package/dist/server/server/daemon-keypair.js +40 -0
- package/dist/server/server/daemon-keypair.js.map +1 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts +76 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -0
- package/dist/server/server/dictation/dictation-stream-manager.js +481 -0
- package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -0
- package/dist/server/server/exports.d.ts +11 -0
- package/dist/server/server/exports.d.ts.map +1 -0
- package/dist/server/server/exports.js +11 -0
- package/dist/server/server/exports.js.map +1 -0
- package/dist/server/server/file-download/token-store.d.ts +25 -0
- package/dist/server/server/file-download/token-store.d.ts.map +1 -0
- package/dist/server/server/file-download/token-store.js +40 -0
- package/dist/server/server/file-download/token-store.js.map +1 -0
- package/dist/server/server/file-explorer/service.d.ts +41 -0
- package/dist/server/server/file-explorer/service.d.ts.map +1 -0
- package/dist/server/server/file-explorer/service.js +163 -0
- package/dist/server/server/file-explorer/service.js.map +1 -0
- package/dist/server/server/index.d.ts +2 -0
- package/dist/server/server/index.d.ts.map +1 -0
- package/dist/server/server/index.js +90 -0
- package/dist/server/server/index.js.map +1 -0
- package/dist/server/server/json-utils.d.ts +11 -0
- package/dist/server/server/json-utils.d.ts.map +1 -0
- package/dist/server/server/json-utils.js +45 -0
- package/dist/server/server/json-utils.js.map +1 -0
- package/dist/server/server/logger.d.ts +12 -0
- package/dist/server/server/logger.d.ts.map +1 -0
- package/dist/server/server/logger.js +29 -0
- package/dist/server/server/logger.js.map +1 -0
- package/dist/server/server/messages.d.ts +9 -0
- package/dist/server/server/messages.d.ts.map +1 -0
- package/dist/server/server/messages.js +29 -0
- package/dist/server/server/messages.js.map +1 -0
- package/dist/server/server/pairing-offer.d.ts +16 -0
- package/dist/server/server/pairing-offer.d.ts.map +1 -0
- package/dist/server/server/pairing-offer.js +45 -0
- package/dist/server/server/pairing-offer.js.map +1 -0
- package/dist/server/server/pairing-qr.d.ts +7 -0
- package/dist/server/server/pairing-qr.d.ts.map +1 -0
- package/dist/server/server/pairing-qr.js +45 -0
- package/dist/server/server/pairing-qr.js.map +1 -0
- package/dist/server/server/paseo-home.d.ts +2 -0
- package/dist/server/server/paseo-home.d.ts.map +1 -0
- package/dist/server/server/paseo-home.js +19 -0
- package/dist/server/server/paseo-home.js.map +1 -0
- package/dist/server/server/path-utils.d.ts +3 -0
- package/dist/server/server/path-utils.d.ts.map +1 -0
- package/dist/server/server/path-utils.js +20 -0
- package/dist/server/server/path-utils.js.map +1 -0
- package/dist/server/server/persisted-config.d.ts +500 -0
- package/dist/server/server/persisted-config.d.ts.map +1 -0
- package/dist/server/server/persisted-config.js +212 -0
- package/dist/server/server/persisted-config.js.map +1 -0
- package/dist/server/server/persistence-hooks.d.ts +24 -0
- package/dist/server/server/persistence-hooks.d.ts.map +1 -0
- package/dist/server/server/persistence-hooks.js +60 -0
- package/dist/server/server/persistence-hooks.js.map +1 -0
- package/dist/server/server/pid-lock.d.ts +19 -0
- package/dist/server/server/pid-lock.d.ts.map +1 -0
- package/dist/server/server/pid-lock.js +115 -0
- package/dist/server/server/pid-lock.js.map +1 -0
- package/dist/server/server/push/push-service.d.ts +21 -0
- package/dist/server/server/push/push-service.d.ts.map +1 -0
- package/dist/server/server/push/push-service.js +68 -0
- package/dist/server/server/push/push-service.js.map +1 -0
- package/dist/server/server/push/token-store.d.ts +18 -0
- package/dist/server/server/push/token-store.d.ts.map +1 -0
- package/dist/server/server/push/token-store.js +70 -0
- package/dist/server/server/push/token-store.js.map +1 -0
- package/dist/server/server/relay-transport.d.ts +22 -0
- package/dist/server/server/relay-transport.d.ts.map +1 -0
- package/dist/server/server/relay-transport.js +374 -0
- package/dist/server/server/relay-transport.js.map +1 -0
- package/dist/server/server/server-id.d.ts +17 -0
- package/dist/server/server/server-id.d.ts.map +1 -0
- package/dist/server/server/server-id.js +63 -0
- package/dist/server/server/server-id.js.map +1 -0
- package/dist/server/server/session.d.ts +360 -0
- package/dist/server/server/session.d.ts.map +1 -0
- package/dist/server/server/session.js +4615 -0
- package/dist/server/server/session.js.map +1 -0
- package/dist/server/server/speech/audio.d.ts +10 -0
- package/dist/server/server/speech/audio.d.ts.map +1 -0
- package/dist/server/server/speech/audio.js +101 -0
- package/dist/server/server/speech/audio.js.map +1 -0
- package/dist/server/server/speech/providers/local/config.d.ts +26 -0
- package/dist/server/server/speech/providers/local/config.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/config.js +93 -0
- package/dist/server/server/speech/providers/local/config.js.map +1 -0
- package/dist/server/server/speech/providers/local/models.d.ts +12 -0
- package/dist/server/server/speech/providers/local/models.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/models.js +18 -0
- package/dist/server/server/speech/providers/local/models.js.map +1 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +24 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +422 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
- package/dist/server/server/speech/providers/local/runtime.d.ts +30 -0
- package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/runtime.js +254 -0
- package/dist/server/server/speech/providers/local/runtime.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +117 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +166 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +17 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +151 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +68 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +37 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +79 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +7 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +44 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -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.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +131 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -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.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +132 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts +23 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +112 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +23 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +140 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -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.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +95 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
- package/dist/server/server/speech/providers/openai/config.d.ts +22 -0
- package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/config.js +94 -0
- package/dist/server/server/speech/providers/openai/config.js.map +1 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +42 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +165 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
- package/dist/server/server/speech/providers/openai/runtime.d.ts +27 -0
- package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/runtime.js +103 -0
- package/dist/server/server/speech/providers/openai/runtime.js.map +1 -0
- package/dist/server/server/speech/providers/openai/stt.d.ts +22 -0
- package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/stt.js +208 -0
- package/dist/server/server/speech/providers/openai/stt.js.map +1 -0
- package/dist/server/server/speech/providers/openai/tts.d.ts +18 -0
- package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/tts.js +46 -0
- package/dist/server/server/speech/providers/openai/tts.js.map +1 -0
- package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
- package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -0
- package/dist/server/server/speech/speech-config-resolver.js +64 -0
- package/dist/server/server/speech/speech-config-resolver.js.map +1 -0
- package/dist/server/server/speech/speech-provider.d.ts +59 -0
- package/dist/server/server/speech/speech-provider.d.ts.map +1 -0
- package/dist/server/server/speech/speech-provider.js +2 -0
- package/dist/server/server/speech/speech-provider.js.map +1 -0
- package/dist/server/server/speech/speech-runtime.d.ts +20 -0
- package/dist/server/server/speech/speech-runtime.d.ts.map +1 -0
- package/dist/server/server/speech/speech-runtime.js +119 -0
- package/dist/server/server/speech/speech-runtime.js.map +1 -0
- package/dist/server/server/speech/speech-types.d.ts +20 -0
- package/dist/server/server/speech/speech-types.d.ts.map +1 -0
- package/dist/server/server/speech/speech-types.js +7 -0
- package/dist/server/server/speech/speech-types.js.map +1 -0
- package/dist/server/server/terminal-mcp/index.d.ts +4 -0
- package/dist/server/server/terminal-mcp/index.d.ts.map +1 -0
- package/dist/server/server/terminal-mcp/index.js +3 -0
- package/dist/server/server/terminal-mcp/index.js.map +1 -0
- package/dist/server/server/terminal-mcp/server.d.ts +10 -0
- package/dist/server/server/terminal-mcp/server.d.ts.map +1 -0
- package/dist/server/server/terminal-mcp/server.js +217 -0
- package/dist/server/server/terminal-mcp/server.js.map +1 -0
- package/dist/server/server/terminal-mcp/terminal-manager.d.ts +123 -0
- package/dist/server/server/terminal-mcp/terminal-manager.d.ts.map +1 -0
- package/dist/server/server/terminal-mcp/terminal-manager.js +351 -0
- package/dist/server/server/terminal-mcp/terminal-manager.js.map +1 -0
- package/dist/server/server/terminal-mcp/tmux.d.ts +207 -0
- package/dist/server/server/terminal-mcp/tmux.d.ts.map +1 -0
- package/dist/server/server/terminal-mcp/tmux.js +924 -0
- package/dist/server/server/terminal-mcp/tmux.js.map +1 -0
- package/dist/server/server/types.d.ts +5 -0
- package/dist/server/server/types.d.ts.map +1 -0
- package/dist/server/server/types.js +3 -0
- package/dist/server/server/types.js.map +1 -0
- package/dist/server/server/utils/diff-highlighter.d.ts +52 -0
- package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -0
- package/dist/server/server/utils/diff-highlighter.js +244 -0
- package/dist/server/server/utils/diff-highlighter.js.map +1 -0
- package/dist/server/server/utils/syntax-highlighter.d.ts +10 -0
- package/dist/server/server/utils/syntax-highlighter.d.ts.map +1 -0
- package/dist/server/server/utils/syntax-highlighter.js +141 -0
- package/dist/server/server/utils/syntax-highlighter.js.map +1 -0
- package/dist/server/server/voice-config.d.ts +14 -0
- package/dist/server/server/voice-config.d.ts.map +1 -0
- package/dist/server/server/voice-config.js +51 -0
- package/dist/server/server/voice-config.js.map +1 -0
- package/dist/server/server/voice-mcp-bridge-command.d.ts +17 -0
- package/dist/server/server/voice-mcp-bridge-command.d.ts.map +1 -0
- package/dist/server/server/voice-mcp-bridge-command.js +31 -0
- package/dist/server/server/voice-mcp-bridge-command.js.map +1 -0
- package/dist/server/server/voice-mcp-bridge.d.ts +18 -0
- package/dist/server/server/voice-mcp-bridge.d.ts.map +1 -0
- package/dist/server/server/voice-mcp-bridge.js +109 -0
- package/dist/server/server/voice-mcp-bridge.js.map +1 -0
- package/dist/server/server/voice-permission-policy.d.ts +4 -0
- package/dist/server/server/voice-permission-policy.d.ts.map +1 -0
- package/dist/server/server/voice-permission-policy.js +13 -0
- package/dist/server/server/voice-permission-policy.js.map +1 -0
- package/dist/server/server/voice-types.d.ts +17 -0
- package/dist/server/server/voice-types.d.ts.map +1 -0
- package/dist/server/server/voice-types.js +2 -0
- package/dist/server/server/voice-types.js.map +1 -0
- package/dist/server/server/websocket-server.d.ts +80 -0
- package/dist/server/server/websocket-server.d.ts.map +1 -0
- package/dist/server/server/websocket-server.js +447 -0
- package/dist/server/server/websocket-server.js.map +1 -0
- package/dist/server/shared/agent-lifecycle.d.ts +3 -0
- package/dist/server/shared/agent-lifecycle.d.ts.map +1 -0
- package/dist/server/shared/agent-lifecycle.js +8 -0
- package/dist/server/shared/agent-lifecycle.js.map +1 -0
- package/dist/server/shared/connection-offer.d.ts +62 -0
- package/dist/server/shared/connection-offer.d.ts.map +1 -0
- package/dist/server/shared/connection-offer.js +17 -0
- package/dist/server/shared/connection-offer.js.map +1 -0
- package/dist/server/shared/daemon-endpoints.d.ts +19 -0
- package/dist/server/shared/daemon-endpoints.d.ts.map +1 -0
- package/dist/server/shared/daemon-endpoints.js +98 -0
- package/dist/server/shared/daemon-endpoints.js.map +1 -0
- package/dist/server/shared/messages.d.ts +36729 -0
- package/dist/server/shared/messages.d.ts.map +1 -0
- package/dist/server/shared/messages.js +1666 -0
- package/dist/server/shared/messages.js.map +1 -0
- package/dist/server/shared/path-utils.d.ts +2 -0
- package/dist/server/shared/path-utils.d.ts.map +1 -0
- package/dist/server/shared/path-utils.js +16 -0
- package/dist/server/shared/path-utils.js.map +1 -0
- package/dist/server/shared/tool-call-display.d.ts +11 -0
- package/dist/server/shared/tool-call-display.d.ts.map +1 -0
- package/dist/server/shared/tool-call-display.js +82 -0
- package/dist/server/shared/tool-call-display.js.map +1 -0
- package/dist/server/terminal/terminal-manager.d.ts +14 -0
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -0
- package/dist/server/terminal/terminal-manager.js +67 -0
- package/dist/server/terminal/terminal-manager.js.map +1 -0
- package/dist/server/terminal/terminal.d.ts +67 -0
- package/dist/server/terminal/terminal.d.ts.map +1 -0
- package/dist/server/terminal/terminal.js +190 -0
- package/dist/server/terminal/terminal.js.map +1 -0
- package/dist/server/utils/checkout-git.d.ts +138 -0
- package/dist/server/utils/checkout-git.d.ts.map +1 -0
- package/dist/server/utils/checkout-git.js +1079 -0
- package/dist/server/utils/checkout-git.js.map +1 -0
- package/dist/server/utils/path.d.ts +5 -0
- package/dist/server/utils/path.d.ts.map +1 -0
- package/dist/server/utils/path.js +15 -0
- package/dist/server/utils/path.js.map +1 -0
- package/dist/server/utils/project-icon.d.ts +39 -0
- package/dist/server/utils/project-icon.d.ts.map +1 -0
- package/dist/server/utils/project-icon.js +391 -0
- package/dist/server/utils/project-icon.js.map +1 -0
- package/dist/server/utils/worktree-metadata.d.ts +21 -0
- package/dist/server/utils/worktree-metadata.d.ts.map +1 -0
- package/dist/server/utils/worktree-metadata.js +74 -0
- package/dist/server/utils/worktree-metadata.js.map +1 -0
- package/dist/server/utils/worktree.d.ts +95 -0
- package/dist/server/utils/worktree.d.ts.map +1 -0
- package/dist/server/utils/worktree.js +568 -0
- package/dist/server/utils/worktree.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,762 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { ensureValidJson } from "../json-utils.js";
|
|
4
|
+
import { AgentPermissionRequestPayloadSchema, AgentPermissionResponseSchema, AgentSnapshotPayloadSchema, serializeAgentSnapshot, } from "../messages.js";
|
|
5
|
+
import { toAgentPayload } from "./agent-projections.js";
|
|
6
|
+
import { curateAgentActivity } from "./activity-curator.js";
|
|
7
|
+
import { AGENT_PROVIDER_DEFINITIONS } from "./provider-registry.js";
|
|
8
|
+
import { createWorktree } from "../../utils/worktree.js";
|
|
9
|
+
import { WaitForAgentTracker } from "./wait-for-agent-tracker.js";
|
|
10
|
+
import { scheduleAgentMetadataGeneration } from "./agent-metadata-generator.js";
|
|
11
|
+
import { expandUserPath, resolvePathFromBase } from "../path-utils.js";
|
|
12
|
+
const CLAUDE_TO_CODEX_MODE = {
|
|
13
|
+
plan: "read-only",
|
|
14
|
+
default: "auto",
|
|
15
|
+
acceptEdits: "auto",
|
|
16
|
+
bypassPermissions: "full-access",
|
|
17
|
+
};
|
|
18
|
+
const CODEX_TO_CLAUDE_MODE = {
|
|
19
|
+
"read-only": "plan",
|
|
20
|
+
auto: "default",
|
|
21
|
+
"full-access": "bypassPermissions",
|
|
22
|
+
};
|
|
23
|
+
function mapModeAcrossProviders(sourceMode, sourceProvider, targetProvider) {
|
|
24
|
+
if (sourceProvider === targetProvider) {
|
|
25
|
+
return sourceMode;
|
|
26
|
+
}
|
|
27
|
+
if (sourceProvider === "claude" && targetProvider === "codex") {
|
|
28
|
+
const mapped = CLAUDE_TO_CODEX_MODE[sourceMode];
|
|
29
|
+
if (mapped) {
|
|
30
|
+
return mapped;
|
|
31
|
+
}
|
|
32
|
+
return "auto";
|
|
33
|
+
}
|
|
34
|
+
if (sourceProvider === "codex" && targetProvider === "claude") {
|
|
35
|
+
const mapped = CODEX_TO_CLAUDE_MODE[sourceMode];
|
|
36
|
+
if (mapped) {
|
|
37
|
+
return mapped;
|
|
38
|
+
}
|
|
39
|
+
return "default";
|
|
40
|
+
}
|
|
41
|
+
return sourceMode;
|
|
42
|
+
}
|
|
43
|
+
const AgentProviderEnum = z.enum(AGENT_PROVIDER_DEFINITIONS.map((definition) => definition.id));
|
|
44
|
+
const AgentStatusEnum = z.enum([
|
|
45
|
+
"initializing",
|
|
46
|
+
"idle",
|
|
47
|
+
"running",
|
|
48
|
+
"error",
|
|
49
|
+
"closed",
|
|
50
|
+
]);
|
|
51
|
+
// 50 seconds - surface friendly message before SDK tool timeout (~60s)
|
|
52
|
+
const AGENT_WAIT_TIMEOUT_MS = 50000;
|
|
53
|
+
function resolveChildAgentCwd(params) {
|
|
54
|
+
const lockedCwd = params.lockedCwd?.trim();
|
|
55
|
+
if (lockedCwd) {
|
|
56
|
+
return expandUserPath(lockedCwd);
|
|
57
|
+
}
|
|
58
|
+
const requestedCwd = params.requestedCwd?.trim();
|
|
59
|
+
if (!requestedCwd || !params.allowCustomCwd) {
|
|
60
|
+
return params.parentCwd;
|
|
61
|
+
}
|
|
62
|
+
return resolvePathFromBase(params.parentCwd, requestedCwd);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Wraps agentManager.waitForAgentEvent with a self-imposed timeout.
|
|
66
|
+
* Returns a friendly message when timeout occurs, rather than letting
|
|
67
|
+
* the SDK tool timeout trigger a generic "tool failed" error.
|
|
68
|
+
*/
|
|
69
|
+
async function waitForAgentWithTimeout(agentManager, agentId, options) {
|
|
70
|
+
const timeoutController = new AbortController();
|
|
71
|
+
const combinedController = new AbortController();
|
|
72
|
+
const timeoutId = setTimeout(() => {
|
|
73
|
+
timeoutController.abort(new Error("wait timeout"));
|
|
74
|
+
}, AGENT_WAIT_TIMEOUT_MS);
|
|
75
|
+
const forwardAbort = (reason) => {
|
|
76
|
+
if (!combinedController.signal.aborted) {
|
|
77
|
+
combinedController.abort(reason);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// Forward external signal abort
|
|
81
|
+
if (options?.signal) {
|
|
82
|
+
if (options.signal.aborted) {
|
|
83
|
+
forwardAbort(options.signal.reason);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
options.signal.addEventListener("abort", () => forwardAbort(options.signal.reason), { once: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Forward timeout abort
|
|
90
|
+
timeoutController.signal.addEventListener("abort", () => forwardAbort(timeoutController.signal.reason), { once: true });
|
|
91
|
+
try {
|
|
92
|
+
const result = await agentManager.waitForAgentEvent(agentId, {
|
|
93
|
+
signal: combinedController.signal,
|
|
94
|
+
waitForActive: options?.waitForActive,
|
|
95
|
+
});
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error instanceof Error && error.message === "wait timeout") {
|
|
100
|
+
const snapshot = agentManager.getAgent(agentId);
|
|
101
|
+
const timeline = agentManager.getTimeline(agentId);
|
|
102
|
+
const recentActivity = curateAgentActivity(timeline.slice(-5));
|
|
103
|
+
const message = `Awaiting the agent timed out. This does not mean the agent failed - call wait_for_agent again to continue waiting.\n\nRecent activity:\n${recentActivity}`;
|
|
104
|
+
return {
|
|
105
|
+
status: snapshot?.lifecycle ?? "idle",
|
|
106
|
+
permission: null,
|
|
107
|
+
lastMessage: message,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
clearTimeout(timeoutId);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function startAgentRun(agentManager, agentId, prompt, logger) {
|
|
117
|
+
const iterator = agentManager.streamAgent(agentId, prompt);
|
|
118
|
+
void (async () => {
|
|
119
|
+
try {
|
|
120
|
+
for await (const _ of iterator) {
|
|
121
|
+
// Events are broadcast via AgentManager subscribers.
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
logger.error({ err: error, agentId }, "Agent stream failed");
|
|
126
|
+
}
|
|
127
|
+
})();
|
|
128
|
+
}
|
|
129
|
+
function sanitizePermissionRequest(permission) {
|
|
130
|
+
if (!permission) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
const sanitized = { ...permission };
|
|
134
|
+
if (sanitized.title === undefined) {
|
|
135
|
+
delete sanitized.title;
|
|
136
|
+
}
|
|
137
|
+
if (sanitized.description === undefined) {
|
|
138
|
+
delete sanitized.description;
|
|
139
|
+
}
|
|
140
|
+
if (sanitized.input === undefined) {
|
|
141
|
+
delete sanitized.input;
|
|
142
|
+
}
|
|
143
|
+
if (sanitized.suggestions === undefined) {
|
|
144
|
+
delete sanitized.suggestions;
|
|
145
|
+
}
|
|
146
|
+
if (sanitized.metadata === undefined) {
|
|
147
|
+
delete sanitized.metadata;
|
|
148
|
+
}
|
|
149
|
+
return sanitized;
|
|
150
|
+
}
|
|
151
|
+
async function resolveAgentTitle(agentStorage, agentId, logger) {
|
|
152
|
+
try {
|
|
153
|
+
const record = await agentStorage.get(agentId);
|
|
154
|
+
return record?.title ?? null;
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
logger.error({ err: error, agentId }, "Failed to load agent title");
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function serializeSnapshotWithMetadata(agentStorage, snapshot, logger) {
|
|
162
|
+
const title = await resolveAgentTitle(agentStorage, snapshot.id, logger);
|
|
163
|
+
return serializeAgentSnapshot(snapshot, { title });
|
|
164
|
+
}
|
|
165
|
+
export async function createAgentMcpServer(options) {
|
|
166
|
+
const { agentManager, agentStorage, callerAgentId, resolveSpeakHandler, resolveCallerContext, logger, } = options;
|
|
167
|
+
const childLogger = logger.child({ module: "agent", component: "mcp-server" });
|
|
168
|
+
const waitTracker = new WaitForAgentTracker(logger);
|
|
169
|
+
const callerContext = callerAgentId ? resolveCallerContext?.(callerAgentId) ?? null : null;
|
|
170
|
+
const server = new McpServer({
|
|
171
|
+
name: "agent-mcp",
|
|
172
|
+
version: "2.0.0",
|
|
173
|
+
});
|
|
174
|
+
const agentToAgentInputSchema = {
|
|
175
|
+
cwd: z
|
|
176
|
+
.string()
|
|
177
|
+
.optional()
|
|
178
|
+
.describe("Optional working directory. Defaults to the caller agent working directory."),
|
|
179
|
+
title: z
|
|
180
|
+
.string()
|
|
181
|
+
.trim()
|
|
182
|
+
.min(1, "Title is required")
|
|
183
|
+
.max(60, "Title must be 60 characters or fewer")
|
|
184
|
+
.describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
|
|
185
|
+
agentType: AgentProviderEnum.optional().describe("Optional agent implementation to spawn. Defaults to 'claude'."),
|
|
186
|
+
initialPrompt: z
|
|
187
|
+
.string()
|
|
188
|
+
.trim()
|
|
189
|
+
.min(1, "initialPrompt is required")
|
|
190
|
+
.describe("Required first task to run immediately after creation."),
|
|
191
|
+
background: z
|
|
192
|
+
.boolean()
|
|
193
|
+
.optional()
|
|
194
|
+
.default(false)
|
|
195
|
+
.describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
|
|
196
|
+
};
|
|
197
|
+
const topLevelInputSchema = {
|
|
198
|
+
cwd: z
|
|
199
|
+
.string()
|
|
200
|
+
.describe("Required working directory for the agent (absolute, relative, or ~)."),
|
|
201
|
+
title: z
|
|
202
|
+
.string()
|
|
203
|
+
.trim()
|
|
204
|
+
.min(1, "Title is required")
|
|
205
|
+
.max(60, "Title must be 60 characters or fewer")
|
|
206
|
+
.describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
|
|
207
|
+
agentType: AgentProviderEnum.optional().describe("Optional agent implementation to spawn. Defaults to 'claude'."),
|
|
208
|
+
initialPrompt: z
|
|
209
|
+
.string()
|
|
210
|
+
.trim()
|
|
211
|
+
.min(1, "initialPrompt is required")
|
|
212
|
+
.describe("Required first task to run immediately after creation."),
|
|
213
|
+
initialMode: z
|
|
214
|
+
.string()
|
|
215
|
+
.describe("Required session mode to configure before the first run."),
|
|
216
|
+
worktreeName: z
|
|
217
|
+
.string()
|
|
218
|
+
.optional()
|
|
219
|
+
.describe("Optional git worktree branch name (lowercase alphanumerics + hyphen)."),
|
|
220
|
+
baseBranch: z
|
|
221
|
+
.string()
|
|
222
|
+
.optional()
|
|
223
|
+
.describe("Required when worktreeName is set: the base branch to diff/merge against."),
|
|
224
|
+
background: z
|
|
225
|
+
.boolean()
|
|
226
|
+
.optional()
|
|
227
|
+
.default(false)
|
|
228
|
+
.describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
|
|
229
|
+
};
|
|
230
|
+
const createAgentInputSchema = callerAgentId
|
|
231
|
+
? agentToAgentInputSchema
|
|
232
|
+
: topLevelInputSchema;
|
|
233
|
+
const agentToAgentCreateAgentArgsSchema = z.object(agentToAgentInputSchema);
|
|
234
|
+
const topLevelCreateAgentArgsSchema = z.object({
|
|
235
|
+
...topLevelInputSchema,
|
|
236
|
+
initialMode: topLevelInputSchema.initialMode.optional(),
|
|
237
|
+
});
|
|
238
|
+
if (options.voiceOnly || options.enableVoiceTools || callerContext?.enableVoiceTools) {
|
|
239
|
+
server.registerTool("speak", {
|
|
240
|
+
title: "Speak",
|
|
241
|
+
description: "Speak text to the user via daemon-managed voice output. Blocks until playback completes.",
|
|
242
|
+
inputSchema: {
|
|
243
|
+
text: z
|
|
244
|
+
.string()
|
|
245
|
+
.trim()
|
|
246
|
+
.min(1, "text is required")
|
|
247
|
+
.max(4000, "text must be 4000 characters or fewer"),
|
|
248
|
+
},
|
|
249
|
+
outputSchema: {
|
|
250
|
+
ok: z.boolean(),
|
|
251
|
+
},
|
|
252
|
+
}, async (args, context) => {
|
|
253
|
+
if (!callerAgentId) {
|
|
254
|
+
throw new Error("speak is only available to agent-scoped MCP sessions");
|
|
255
|
+
}
|
|
256
|
+
const handler = resolveSpeakHandler?.(callerAgentId) ?? null;
|
|
257
|
+
if (!handler) {
|
|
258
|
+
throw new Error(`No speak handler registered for caller agent '${callerAgentId}'`);
|
|
259
|
+
}
|
|
260
|
+
await handler({
|
|
261
|
+
text: args.text,
|
|
262
|
+
callerAgentId,
|
|
263
|
+
signal: context?.signal,
|
|
264
|
+
});
|
|
265
|
+
return {
|
|
266
|
+
content: [],
|
|
267
|
+
structuredContent: ensureValidJson({ ok: true }),
|
|
268
|
+
};
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
if (options.voiceOnly) {
|
|
272
|
+
return server;
|
|
273
|
+
}
|
|
274
|
+
server.registerTool("create_agent", {
|
|
275
|
+
title: "Create Agent",
|
|
276
|
+
description: "Create a new Claude or Codex agent tied to a working directory. Optionally run an initial prompt immediately or create a git worktree for the agent.",
|
|
277
|
+
inputSchema: createAgentInputSchema,
|
|
278
|
+
outputSchema: {
|
|
279
|
+
agentId: z.string(),
|
|
280
|
+
type: AgentProviderEnum,
|
|
281
|
+
status: AgentStatusEnum,
|
|
282
|
+
cwd: z.string(),
|
|
283
|
+
currentModeId: z.string().nullable(),
|
|
284
|
+
availableModes: z.array(z.object({
|
|
285
|
+
id: z.string(),
|
|
286
|
+
label: z.string(),
|
|
287
|
+
description: z.string().nullable().optional(),
|
|
288
|
+
})),
|
|
289
|
+
lastMessage: z.string().nullable().optional(),
|
|
290
|
+
permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
|
|
291
|
+
},
|
|
292
|
+
}, async (args) => {
|
|
293
|
+
let provider;
|
|
294
|
+
let initialPrompt;
|
|
295
|
+
let background = false;
|
|
296
|
+
let normalizedTitle;
|
|
297
|
+
let resolvedCwd;
|
|
298
|
+
let resolvedMode;
|
|
299
|
+
if (callerAgentId) {
|
|
300
|
+
const callerArgs = agentToAgentCreateAgentArgsSchema.parse(args);
|
|
301
|
+
provider = callerArgs.agentType ?? "claude";
|
|
302
|
+
initialPrompt = callerArgs.initialPrompt;
|
|
303
|
+
background = callerArgs.background ?? false;
|
|
304
|
+
normalizedTitle = callerArgs.title.trim();
|
|
305
|
+
const parentAgent = agentManager.getAgent(callerAgentId);
|
|
306
|
+
if (!parentAgent) {
|
|
307
|
+
throw new Error(`Parent agent ${callerAgentId} not found`);
|
|
308
|
+
}
|
|
309
|
+
resolvedCwd = resolveChildAgentCwd({
|
|
310
|
+
parentCwd: parentAgent.cwd,
|
|
311
|
+
requestedCwd: callerArgs.cwd,
|
|
312
|
+
lockedCwd: callerContext?.lockedCwd,
|
|
313
|
+
allowCustomCwd: callerContext?.allowCustomCwd ?? true,
|
|
314
|
+
});
|
|
315
|
+
const parentMode = parentAgent.currentModeId;
|
|
316
|
+
if (parentMode) {
|
|
317
|
+
resolvedMode = mapModeAcrossProviders(parentMode, parentAgent.provider, provider);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
const topLevelArgs = topLevelCreateAgentArgsSchema.parse(args);
|
|
322
|
+
provider = topLevelArgs.agentType ?? "claude";
|
|
323
|
+
initialPrompt = topLevelArgs.initialPrompt;
|
|
324
|
+
background = topLevelArgs.background ?? false;
|
|
325
|
+
normalizedTitle = topLevelArgs.title.trim();
|
|
326
|
+
const { cwd, initialMode, worktreeName, baseBranch, } = topLevelArgs;
|
|
327
|
+
resolvedCwd = expandUserPath(cwd);
|
|
328
|
+
if (worktreeName) {
|
|
329
|
+
if (!baseBranch) {
|
|
330
|
+
throw new Error("baseBranch is required when creating a worktree");
|
|
331
|
+
}
|
|
332
|
+
const worktree = await createWorktree({
|
|
333
|
+
branchName: worktreeName,
|
|
334
|
+
cwd: resolvedCwd,
|
|
335
|
+
baseBranch,
|
|
336
|
+
worktreeSlug: worktreeName,
|
|
337
|
+
paseoHome: options.paseoHome,
|
|
338
|
+
});
|
|
339
|
+
resolvedCwd = worktree.worktreePath;
|
|
340
|
+
}
|
|
341
|
+
resolvedMode = initialMode;
|
|
342
|
+
}
|
|
343
|
+
const childAgentDefaultLabels = callerAgentId && callerContext?.childAgentDefaultLabels
|
|
344
|
+
? callerContext.childAgentDefaultLabels
|
|
345
|
+
: undefined;
|
|
346
|
+
const snapshot = await agentManager.createAgent({
|
|
347
|
+
provider,
|
|
348
|
+
cwd: resolvedCwd,
|
|
349
|
+
modeId: resolvedMode,
|
|
350
|
+
title: normalizedTitle ?? undefined,
|
|
351
|
+
}, undefined, childAgentDefaultLabels ? { labels: childAgentDefaultLabels } : undefined);
|
|
352
|
+
const trimmedPrompt = initialPrompt.trim();
|
|
353
|
+
scheduleAgentMetadataGeneration({
|
|
354
|
+
agentManager,
|
|
355
|
+
agentId: snapshot.id,
|
|
356
|
+
cwd: snapshot.cwd,
|
|
357
|
+
initialPrompt: trimmedPrompt,
|
|
358
|
+
explicitTitle: snapshot.config.title,
|
|
359
|
+
paseoHome: options.paseoHome,
|
|
360
|
+
logger: childLogger,
|
|
361
|
+
});
|
|
362
|
+
try {
|
|
363
|
+
agentManager.recordUserMessage(snapshot.id, trimmedPrompt);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
childLogger.error({ err: error, agentId: snapshot.id }, "Failed to record initial prompt");
|
|
367
|
+
}
|
|
368
|
+
try {
|
|
369
|
+
startAgentRun(agentManager, snapshot.id, trimmedPrompt, childLogger);
|
|
370
|
+
// If not running in background, wait for completion
|
|
371
|
+
if (!background) {
|
|
372
|
+
const result = await waitForAgentWithTimeout(agentManager, snapshot.id, { waitForActive: true });
|
|
373
|
+
const responseData = {
|
|
374
|
+
agentId: snapshot.id,
|
|
375
|
+
type: provider,
|
|
376
|
+
status: result.status,
|
|
377
|
+
cwd: snapshot.cwd,
|
|
378
|
+
currentModeId: snapshot.currentModeId,
|
|
379
|
+
availableModes: snapshot.availableModes,
|
|
380
|
+
lastMessage: result.lastMessage,
|
|
381
|
+
permission: sanitizePermissionRequest(result.permission),
|
|
382
|
+
};
|
|
383
|
+
const validJson = ensureValidJson(responseData);
|
|
384
|
+
const response = {
|
|
385
|
+
content: [],
|
|
386
|
+
structuredContent: validJson,
|
|
387
|
+
};
|
|
388
|
+
return response;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
childLogger.error({ err: error, agentId: snapshot.id }, "Failed to run initial prompt");
|
|
393
|
+
}
|
|
394
|
+
// Return immediately if background=true
|
|
395
|
+
const response = {
|
|
396
|
+
content: [],
|
|
397
|
+
structuredContent: ensureValidJson({
|
|
398
|
+
agentId: snapshot.id,
|
|
399
|
+
type: provider,
|
|
400
|
+
status: snapshot.lifecycle,
|
|
401
|
+
cwd: snapshot.cwd,
|
|
402
|
+
currentModeId: snapshot.currentModeId,
|
|
403
|
+
availableModes: snapshot.availableModes,
|
|
404
|
+
lastMessage: null,
|
|
405
|
+
permission: null,
|
|
406
|
+
}),
|
|
407
|
+
};
|
|
408
|
+
return response;
|
|
409
|
+
});
|
|
410
|
+
server.registerTool("wait_for_agent", {
|
|
411
|
+
title: "Wait For Agent",
|
|
412
|
+
description: "Block until the agent requests permission or the current run completes. Returns the pending permission (if any) and recent activity summary.",
|
|
413
|
+
inputSchema: {
|
|
414
|
+
agentId: z
|
|
415
|
+
.string()
|
|
416
|
+
.describe("Agent identifier returned by the create_agent tool"),
|
|
417
|
+
},
|
|
418
|
+
outputSchema: {
|
|
419
|
+
agentId: z.string(),
|
|
420
|
+
status: AgentStatusEnum,
|
|
421
|
+
permission: AgentPermissionRequestPayloadSchema.nullable(),
|
|
422
|
+
lastMessage: z.string().nullable(),
|
|
423
|
+
},
|
|
424
|
+
}, async ({ agentId }, { signal }) => {
|
|
425
|
+
const abortController = new AbortController();
|
|
426
|
+
const cleanupFns = [];
|
|
427
|
+
const cleanup = () => {
|
|
428
|
+
while (cleanupFns.length) {
|
|
429
|
+
const fn = cleanupFns.pop();
|
|
430
|
+
try {
|
|
431
|
+
fn?.();
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
// ignore cleanup errors
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
const forwardExternalAbort = () => {
|
|
439
|
+
if (!abortController.signal.aborted) {
|
|
440
|
+
const reason = signal?.reason ?? new Error("wait_for_agent aborted");
|
|
441
|
+
abortController.abort(reason);
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
if (signal) {
|
|
445
|
+
if (signal.aborted) {
|
|
446
|
+
forwardExternalAbort();
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
signal.addEventListener("abort", forwardExternalAbort, { once: true });
|
|
450
|
+
cleanupFns.push(() => signal.removeEventListener("abort", forwardExternalAbort));
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
const unregister = waitTracker.register(agentId, (reason) => {
|
|
454
|
+
if (!abortController.signal.aborted) {
|
|
455
|
+
abortController.abort(new Error(reason ?? "wait_for_agent cancelled"));
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
cleanupFns.push(unregister);
|
|
459
|
+
try {
|
|
460
|
+
const result = await waitForAgentWithTimeout(agentManager, agentId, { signal: abortController.signal });
|
|
461
|
+
const validJson = ensureValidJson({
|
|
462
|
+
agentId,
|
|
463
|
+
status: result.status,
|
|
464
|
+
permission: sanitizePermissionRequest(result.permission),
|
|
465
|
+
lastMessage: result.lastMessage,
|
|
466
|
+
});
|
|
467
|
+
const response = {
|
|
468
|
+
content: [],
|
|
469
|
+
structuredContent: validJson,
|
|
470
|
+
};
|
|
471
|
+
return response;
|
|
472
|
+
}
|
|
473
|
+
finally {
|
|
474
|
+
cleanup();
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
server.registerTool("send_agent_prompt", {
|
|
478
|
+
title: "Send Agent Prompt",
|
|
479
|
+
description: "Send a task to a running agent. Returns immediately after the agent begins processing.",
|
|
480
|
+
inputSchema: {
|
|
481
|
+
agentId: z.string(),
|
|
482
|
+
prompt: z.string(),
|
|
483
|
+
sessionMode: z
|
|
484
|
+
.string()
|
|
485
|
+
.optional()
|
|
486
|
+
.describe("Optional mode to set before running the prompt."),
|
|
487
|
+
background: z
|
|
488
|
+
.boolean()
|
|
489
|
+
.optional()
|
|
490
|
+
.default(false)
|
|
491
|
+
.describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
|
|
492
|
+
},
|
|
493
|
+
outputSchema: {
|
|
494
|
+
success: z.boolean(),
|
|
495
|
+
status: AgentStatusEnum,
|
|
496
|
+
lastMessage: z.string().nullable().optional(),
|
|
497
|
+
permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
|
|
498
|
+
},
|
|
499
|
+
}, async ({ agentId, prompt, sessionMode, background = false }) => {
|
|
500
|
+
// Check if agent is running and interrupt if necessary (matches app behavior)
|
|
501
|
+
const snapshot = agentManager.getAgent(agentId);
|
|
502
|
+
if (!snapshot) {
|
|
503
|
+
throw new Error(`Agent ${agentId} not found`);
|
|
504
|
+
}
|
|
505
|
+
if (snapshot.lifecycle === "running" || snapshot.pendingRun) {
|
|
506
|
+
childLogger.debug({ agentId }, "Interrupting active run before sending new prompt");
|
|
507
|
+
try {
|
|
508
|
+
const cancelled = await agentManager.cancelAgentRun(agentId);
|
|
509
|
+
if (!cancelled) {
|
|
510
|
+
childLogger.warn({ agentId }, "Agent reported running but no active run was cancelled");
|
|
511
|
+
}
|
|
512
|
+
// Also cancel any pending wait_for_agent calls for this agent
|
|
513
|
+
waitTracker.cancel(agentId, "Agent run interrupted by new prompt");
|
|
514
|
+
// Wait for the agent to become idle after cancellation
|
|
515
|
+
// Poll until the agent is no longer running and has no pending run
|
|
516
|
+
// This is necessary because cancelAgentRun only initiates cancellation
|
|
517
|
+
// and doesn't wait for the generator to fully terminate
|
|
518
|
+
const maxWaitMs = 5000;
|
|
519
|
+
const pollIntervalMs = 50;
|
|
520
|
+
const startTime = Date.now();
|
|
521
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
522
|
+
const current = agentManager.getAgent(agentId);
|
|
523
|
+
if (!current) {
|
|
524
|
+
throw new Error(`Agent ${agentId} not found during cancellation wait`);
|
|
525
|
+
}
|
|
526
|
+
if (current.lifecycle !== "running" && !current.pendingRun) {
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
catch (error) {
|
|
533
|
+
childLogger.error({ err: error, agentId }, "Failed to interrupt agent");
|
|
534
|
+
throw error;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
if (sessionMode) {
|
|
538
|
+
await agentManager.setAgentMode(agentId, sessionMode);
|
|
539
|
+
}
|
|
540
|
+
try {
|
|
541
|
+
agentManager.recordUserMessage(agentId, prompt);
|
|
542
|
+
}
|
|
543
|
+
catch (error) {
|
|
544
|
+
childLogger.error({ err: error, agentId }, "Failed to record user message");
|
|
545
|
+
}
|
|
546
|
+
startAgentRun(agentManager, agentId, prompt, childLogger);
|
|
547
|
+
// If not running in background, wait for completion
|
|
548
|
+
if (!background) {
|
|
549
|
+
const result = await waitForAgentWithTimeout(agentManager, agentId, {
|
|
550
|
+
waitForActive: true,
|
|
551
|
+
});
|
|
552
|
+
const responseData = {
|
|
553
|
+
success: true,
|
|
554
|
+
status: result.status,
|
|
555
|
+
lastMessage: result.lastMessage,
|
|
556
|
+
permission: sanitizePermissionRequest(result.permission),
|
|
557
|
+
};
|
|
558
|
+
const validJson = ensureValidJson(responseData);
|
|
559
|
+
const response = {
|
|
560
|
+
content: [],
|
|
561
|
+
structuredContent: validJson,
|
|
562
|
+
};
|
|
563
|
+
return response;
|
|
564
|
+
}
|
|
565
|
+
// Return immediately if background=true
|
|
566
|
+
// Re-fetch snapshot since the state may have changed
|
|
567
|
+
const currentSnapshot = agentManager.getAgent(agentId);
|
|
568
|
+
const responseData = {
|
|
569
|
+
success: true,
|
|
570
|
+
status: currentSnapshot?.lifecycle ?? "idle",
|
|
571
|
+
lastMessage: null,
|
|
572
|
+
permission: null,
|
|
573
|
+
};
|
|
574
|
+
const validJson = ensureValidJson(responseData);
|
|
575
|
+
const response = {
|
|
576
|
+
content: [],
|
|
577
|
+
structuredContent: validJson,
|
|
578
|
+
};
|
|
579
|
+
return response;
|
|
580
|
+
});
|
|
581
|
+
server.registerTool("get_agent_status", {
|
|
582
|
+
title: "Get Agent Status",
|
|
583
|
+
description: "Return the latest snapshot for an agent, including lifecycle state, capabilities, and pending permissions.",
|
|
584
|
+
inputSchema: {
|
|
585
|
+
agentId: z.string(),
|
|
586
|
+
},
|
|
587
|
+
outputSchema: {
|
|
588
|
+
status: AgentStatusEnum,
|
|
589
|
+
snapshot: AgentSnapshotPayloadSchema,
|
|
590
|
+
},
|
|
591
|
+
}, async ({ agentId }) => {
|
|
592
|
+
const snapshot = agentManager.getAgent(agentId);
|
|
593
|
+
if (!snapshot) {
|
|
594
|
+
throw new Error(`Agent ${agentId} not found`);
|
|
595
|
+
}
|
|
596
|
+
const structuredSnapshot = await serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger);
|
|
597
|
+
return {
|
|
598
|
+
content: [],
|
|
599
|
+
structuredContent: ensureValidJson({
|
|
600
|
+
status: snapshot.lifecycle,
|
|
601
|
+
snapshot: structuredSnapshot,
|
|
602
|
+
}),
|
|
603
|
+
};
|
|
604
|
+
});
|
|
605
|
+
server.registerTool("list_agents", {
|
|
606
|
+
title: "List Agents",
|
|
607
|
+
description: "List all live agents managed by the server.",
|
|
608
|
+
inputSchema: {},
|
|
609
|
+
outputSchema: {
|
|
610
|
+
agents: z.array(AgentSnapshotPayloadSchema),
|
|
611
|
+
},
|
|
612
|
+
}, async () => {
|
|
613
|
+
const snapshots = agentManager.listAgents();
|
|
614
|
+
const agents = await Promise.all(snapshots.map((snapshot) => serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger)));
|
|
615
|
+
return {
|
|
616
|
+
content: [],
|
|
617
|
+
structuredContent: ensureValidJson({ agents }),
|
|
618
|
+
};
|
|
619
|
+
});
|
|
620
|
+
server.registerTool("cancel_agent", {
|
|
621
|
+
title: "Cancel Agent Run",
|
|
622
|
+
description: "Abort the agent's current run but keep the agent alive for future tasks.",
|
|
623
|
+
inputSchema: {
|
|
624
|
+
agentId: z.string(),
|
|
625
|
+
},
|
|
626
|
+
outputSchema: {
|
|
627
|
+
success: z.boolean(),
|
|
628
|
+
},
|
|
629
|
+
}, async ({ agentId }) => {
|
|
630
|
+
const success = await agentManager.cancelAgentRun(agentId);
|
|
631
|
+
if (success) {
|
|
632
|
+
waitTracker.cancel(agentId, "Agent run cancelled");
|
|
633
|
+
}
|
|
634
|
+
return {
|
|
635
|
+
content: [],
|
|
636
|
+
structuredContent: ensureValidJson({ success }),
|
|
637
|
+
};
|
|
638
|
+
});
|
|
639
|
+
server.registerTool("kill_agent", {
|
|
640
|
+
title: "Kill Agent",
|
|
641
|
+
description: "Terminate an agent session permanently.",
|
|
642
|
+
inputSchema: {
|
|
643
|
+
agentId: z.string(),
|
|
644
|
+
},
|
|
645
|
+
outputSchema: {
|
|
646
|
+
success: z.boolean(),
|
|
647
|
+
},
|
|
648
|
+
}, async ({ agentId }) => {
|
|
649
|
+
await agentManager.closeAgent(agentId);
|
|
650
|
+
waitTracker.cancel(agentId, "Agent terminated");
|
|
651
|
+
return {
|
|
652
|
+
content: [],
|
|
653
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
654
|
+
};
|
|
655
|
+
});
|
|
656
|
+
server.registerTool("get_agent_activity", {
|
|
657
|
+
title: "Get Agent Activity",
|
|
658
|
+
description: "Return recent agent timeline entries as a curated summary.",
|
|
659
|
+
inputSchema: {
|
|
660
|
+
agentId: z.string(),
|
|
661
|
+
limit: z
|
|
662
|
+
.number()
|
|
663
|
+
.optional()
|
|
664
|
+
.describe("Optional limit for number of activities to include (most recent first)."),
|
|
665
|
+
},
|
|
666
|
+
outputSchema: {
|
|
667
|
+
agentId: z.string(),
|
|
668
|
+
updateCount: z.number(),
|
|
669
|
+
currentModeId: z.string().nullable(),
|
|
670
|
+
content: z.string(),
|
|
671
|
+
},
|
|
672
|
+
}, async ({ agentId, limit }) => {
|
|
673
|
+
const timeline = agentManager.getTimeline(agentId);
|
|
674
|
+
const snapshot = agentManager.getAgent(agentId);
|
|
675
|
+
const activitiesToCurate = limit
|
|
676
|
+
? timeline.slice(-limit)
|
|
677
|
+
: timeline;
|
|
678
|
+
const curatedContent = curateAgentActivity(activitiesToCurate);
|
|
679
|
+
const totalCount = timeline.length;
|
|
680
|
+
const shownCount = activitiesToCurate.length;
|
|
681
|
+
let countHeader;
|
|
682
|
+
if (limit && shownCount < totalCount) {
|
|
683
|
+
countHeader = `Showing ${shownCount} of ${totalCount} ${totalCount === 1 ? 'activity' : 'activities'} (limited to ${limit})`;
|
|
684
|
+
}
|
|
685
|
+
else {
|
|
686
|
+
countHeader = `Showing all ${totalCount} ${totalCount === 1 ? 'activity' : 'activities'}`;
|
|
687
|
+
}
|
|
688
|
+
const contentWithCount = `${countHeader}\n\n${curatedContent}`;
|
|
689
|
+
return {
|
|
690
|
+
content: [],
|
|
691
|
+
structuredContent: ensureValidJson({
|
|
692
|
+
agentId,
|
|
693
|
+
updateCount: timeline.length,
|
|
694
|
+
currentModeId: snapshot?.currentModeId ?? null,
|
|
695
|
+
content: contentWithCount,
|
|
696
|
+
}),
|
|
697
|
+
};
|
|
698
|
+
});
|
|
699
|
+
server.registerTool("set_agent_mode", {
|
|
700
|
+
title: "Set Agent Session Mode",
|
|
701
|
+
description: "Switch the agent's session mode (plan, bypassPermissions, read-only, auto, etc.).",
|
|
702
|
+
inputSchema: {
|
|
703
|
+
agentId: z.string(),
|
|
704
|
+
modeId: z.string(),
|
|
705
|
+
},
|
|
706
|
+
outputSchema: {
|
|
707
|
+
success: z.boolean(),
|
|
708
|
+
newMode: z.string(),
|
|
709
|
+
},
|
|
710
|
+
}, async ({ agentId, modeId }) => {
|
|
711
|
+
await agentManager.setAgentMode(agentId, modeId);
|
|
712
|
+
return {
|
|
713
|
+
content: [],
|
|
714
|
+
structuredContent: ensureValidJson({ success: true, newMode: modeId }),
|
|
715
|
+
};
|
|
716
|
+
});
|
|
717
|
+
server.registerTool("list_pending_permissions", {
|
|
718
|
+
title: "List Pending Permissions",
|
|
719
|
+
description: "Return all pending permission requests across all agents with the normalized payloads.",
|
|
720
|
+
inputSchema: {},
|
|
721
|
+
outputSchema: {
|
|
722
|
+
permissions: z.array(z.object({
|
|
723
|
+
agentId: z.string(),
|
|
724
|
+
status: AgentStatusEnum,
|
|
725
|
+
request: AgentPermissionRequestPayloadSchema,
|
|
726
|
+
})),
|
|
727
|
+
},
|
|
728
|
+
}, async () => {
|
|
729
|
+
const permissions = agentManager.listAgents().flatMap((agent) => {
|
|
730
|
+
const payload = toAgentPayload(agent);
|
|
731
|
+
return payload.pendingPermissions.map((request) => ({
|
|
732
|
+
agentId: agent.id,
|
|
733
|
+
status: payload.status,
|
|
734
|
+
request,
|
|
735
|
+
}));
|
|
736
|
+
});
|
|
737
|
+
return {
|
|
738
|
+
content: [],
|
|
739
|
+
structuredContent: ensureValidJson({ permissions }),
|
|
740
|
+
};
|
|
741
|
+
});
|
|
742
|
+
server.registerTool("respond_to_permission", {
|
|
743
|
+
title: "Respond To Permission",
|
|
744
|
+
description: "Approve or deny a pending permission request with an AgentManager-compatible response payload.",
|
|
745
|
+
inputSchema: {
|
|
746
|
+
agentId: z.string(),
|
|
747
|
+
requestId: z.string(),
|
|
748
|
+
response: AgentPermissionResponseSchema,
|
|
749
|
+
},
|
|
750
|
+
outputSchema: {
|
|
751
|
+
success: z.boolean(),
|
|
752
|
+
},
|
|
753
|
+
}, async ({ agentId, requestId, response }) => {
|
|
754
|
+
await agentManager.respondToPermission(agentId, requestId, response);
|
|
755
|
+
return {
|
|
756
|
+
content: [],
|
|
757
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
758
|
+
};
|
|
759
|
+
});
|
|
760
|
+
return server;
|
|
761
|
+
}
|
|
762
|
+
//# sourceMappingURL=mcp-server.js.map
|