@camerontaylor/paseo-server 0.8.0-fork.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +31 -0
- package/README.md +111 -0
- package/dist/scripts/dev-runner.js +37 -0
- package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
- package/dist/scripts/supervisor-entrypoint.js +160 -0
- package/dist/scripts/supervisor-log-config.js +31 -0
- package/dist/scripts/supervisor.js +313 -0
- package/dist/server/executable-resolution/executable-resolution.d.ts +10 -0
- package/dist/server/executable-resolution/executable-resolution.js +121 -0
- package/dist/server/executable-resolution/windows.d.ts +18 -0
- package/dist/server/executable-resolution/windows.js +65 -0
- package/dist/server/server/agent/activity-curator.d.ts +40 -0
- package/dist/server/server/agent/activity-curator.js +243 -0
- package/dist/server/server/agent/agent-archive.d.ts +11 -0
- package/dist/server/server/agent/agent-archive.js +16 -0
- package/dist/server/server/agent/agent-configuration-validator.d.ts +18 -0
- package/dist/server/server/agent/agent-configuration-validator.js +42 -0
- package/dist/server/server/agent/agent-loading.d.ts +17 -0
- package/dist/server/server/agent/agent-loading.js +88 -0
- package/dist/server/server/agent/agent-manager.d.ts +555 -0
- package/dist/server/server/agent/agent-manager.js +3930 -0
- package/dist/server/server/agent/agent-owner.d.ts +12 -0
- package/dist/server/server/agent/agent-owner.js +12 -0
- package/dist/server/server/agent/agent-projections.d.ts +26 -0
- package/dist/server/server/agent/agent-projections.js +414 -0
- package/dist/server/server/agent/agent-prompt.d.ts +91 -0
- package/dist/server/server/agent/agent-prompt.js +359 -0
- package/dist/server/server/agent/agent-response-loop.d.ts +72 -0
- package/dist/server/server/agent/agent-response-loop.js +336 -0
- package/dist/server/server/agent/agent-run-state.d.ts +76 -0
- package/dist/server/server/agent/agent-run-state.js +212 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts +742 -0
- package/dist/server/server/agent/agent-sdk-types.js +25 -0
- package/dist/server/server/agent/agent-storage.d.ts +148 -0
- package/dist/server/server/agent/agent-storage.js +401 -0
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +43 -0
- package/dist/server/server/agent/agent-stream-coalescer.js +187 -0
- package/dist/server/server/agent/agent-timeline-content.d.ts +6 -0
- package/dist/server/server/agent/agent-timeline-content.js +62 -0
- package/dist/server/server/agent/agent-timeline-store-types.d.ts +54 -0
- package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
- package/dist/server/server/agent/agent-timeline-store.d.ts +31 -0
- package/dist/server/server/agent/agent-timeline-store.js +249 -0
- package/dist/server/server/agent/audio-utils.d.ts +3 -0
- package/dist/server/server/agent/audio-utils.js +19 -0
- package/dist/server/server/agent/create-agent/create.d.ts +102 -0
- package/dist/server/server/agent/create-agent/create.js +362 -0
- package/dist/server/server/agent/create-agent/intent.d.ts +25 -0
- package/dist/server/server/agent/create-agent/intent.js +30 -0
- package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +65 -0
- package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +166 -0
- package/dist/server/server/agent/create-agent-mode.d.ts +13 -0
- package/dist/server/server/agent/create-agent-mode.js +65 -0
- package/dist/server/server/agent/create-agent-title.d.ts +10 -0
- package/dist/server/server/agent/create-agent-title.js +34 -0
- package/dist/server/server/agent/dictation-debug.d.ts +13 -0
- package/dist/server/server/agent/dictation-debug.js +50 -0
- package/dist/server/server/agent/import-sessions.d.ts +57 -0
- package/dist/server/server/agent/import-sessions.js +240 -0
- package/dist/server/server/agent/lifecycle-command.d.ts +73 -0
- package/dist/server/server/agent/lifecycle-command.js +99 -0
- package/dist/server/server/agent/mcp-server.d.ts +5 -0
- package/dist/server/server/agent/mcp-server.js +31 -0
- package/dist/server/server/agent/mcp-shared.d.ts +181 -0
- package/dist/server/server/agent/mcp-shared.js +199 -0
- package/dist/server/server/agent/mutable-provider-config-owner.d.ts +8 -0
- package/dist/server/server/agent/mutable-provider-config-owner.js +35 -0
- package/dist/server/server/agent/paseo-tool-policy.d.ts +9 -0
- package/dist/server/server/agent/paseo-tool-policy.js +16 -0
- package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
- package/dist/server/server/agent/pcm16-resampler.js +63 -0
- package/dist/server/server/agent/permission-response.d.ts +15 -0
- package/dist/server/server/agent/permission-response.js +14 -0
- package/dist/server/server/agent/plugin-provider.d.ts +16 -0
- package/dist/server/server/agent/plugin-provider.js +1356 -0
- package/dist/server/server/agent/prompt-attachments.d.ts +12 -0
- package/dist/server/server/agent/prompt-attachments.js +182 -0
- package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
- package/dist/server/server/agent/provider-history-timestamps.js +16 -0
- package/dist/server/server/agent/provider-launch-config.d.ts +43 -0
- package/dist/server/server/agent/provider-launch-config.js +167 -0
- package/dist/server/server/agent/provider-notices.d.ts +4 -0
- package/dist/server/server/agent/provider-notices.js +9 -0
- package/dist/server/server/agent/provider-options.d.ts +19 -0
- package/dist/server/server/agent/provider-options.js +53 -0
- package/dist/server/server/agent/provider-refresh-deadline.d.ts +11 -0
- package/dist/server/server/agent/provider-refresh-deadline.js +65 -0
- package/dist/server/server/agent/provider-registry.d.ts +72 -0
- package/dist/server/server/agent/provider-registry.js +604 -0
- package/dist/server/server/agent/provider-runtime.d.ts +16 -0
- package/dist/server/server/agent/provider-runtime.js +35 -0
- package/dist/server/server/agent/provider-session-import.d.ts +10 -0
- package/dist/server/server/agent/provider-session-import.js +55 -0
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +166 -0
- package/dist/server/server/agent/provider-snapshot-manager.js +843 -0
- package/dist/server/server/agent/provider-subagents/store.d.ts +68 -0
- package/dist/server/server/agent/provider-subagents/store.js +111 -0
- package/dist/server/server/agent/providers/acp-agent.d.ts +703 -0
- package/dist/server/server/agent/providers/acp-agent.js +3412 -0
- package/dist/server/server/agent/providers/claude/agent.d.ts +74 -0
- package/dist/server/server/agent/providers/claude/agent.js +5236 -0
- package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
- package/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
- package/dist/server/server/agent/providers/claude/hooks.d.ts +12 -0
- package/dist/server/server/agent/providers/claude/hooks.js +20 -0
- package/dist/server/server/agent/providers/claude/model-manifest.d.ts +147 -0
- package/dist/server/server/agent/providers/claude/model-manifest.js +342 -0
- package/dist/server/server/agent/providers/claude/models.d.ts +28 -0
- package/dist/server/server/agent/providers/claude/models.js +141 -0
- package/dist/server/server/agent/providers/claude/options.d.ts +85 -0
- package/dist/server/server/agent/providers/claude/options.js +93 -0
- package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
- package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
- package/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
- package/dist/server/server/agent/providers/claude/project-dir.js +57 -0
- package/dist/server/server/agent/providers/claude/query.d.ts +17 -0
- package/dist/server/server/agent/providers/claude/query.js +86 -0
- package/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
- package/dist/server/server/agent/providers/claude/rewind.js +30 -0
- package/dist/server/server/agent/providers/claude/side-question.d.ts +16 -0
- package/dist/server/server/agent/providers/claude/side-question.js +57 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +35 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js +392 -0
- package/dist/server/server/agent/providers/claude/subagents/live-source.d.ts +161 -0
- package/dist/server/server/agent/providers/claude/subagents/live-source.js +415 -0
- package/dist/server/server/agent/providers/claude/subagents/observation.d.ts +53 -0
- package/dist/server/server/agent/providers/claude/subagents/observation.js +57 -0
- package/dist/server/server/agent/providers/claude/subagents/presentation.d.ts +12 -0
- package/dist/server/server/agent/providers/claude/subagents/presentation.js +41 -0
- package/dist/server/server/agent/providers/claude/subagents/replay-source.d.ts +70 -0
- package/dist/server/server/agent/providers/claude/subagents/replay-source.js +305 -0
- package/dist/server/server/agent/providers/claude/subagents/workflow-output.d.ts +4 -0
- package/dist/server/server/agent/providers/claude/subagents/workflow-output.js +86 -0
- package/dist/server/server/agent/providers/claude/subagents/workflow-replay-source.d.ts +38 -0
- package/dist/server/server/agent/providers/claude/subagents/workflow-replay-source.js +225 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +37 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +296 -0
- package/dist/server/server/agent/providers/claude/task-state.d.ts +18 -0
- package/dist/server/server/agent/providers/claude/task-state.js +185 -0
- package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
- package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +101 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js +290 -0
- package/dist/server/server/agent/providers/codex/async-questions.d.ts +18 -0
- package/dist/server/server/agent/providers/codex/async-questions.js +135 -0
- package/dist/server/server/agent/providers/codex/options.d.ts +59 -0
- package/dist/server/server/agent/providers/codex/options.js +82 -0
- package/dist/server/server/agent/providers/codex/rewind.d.ts +24 -0
- package/dist/server/server/agent/providers/codex/rewind.js +77 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +24 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +909 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +384 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.js +5877 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.js +55 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.js +187 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +17 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.js +31 -0
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js +356 -0
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +55 -0
- package/dist/server/server/agent/providers/generic-acp-agent.js +178 -0
- package/dist/server/server/agent/providers/gjc-acp-agent.d.ts +155 -0
- package/dist/server/server/agent/providers/gjc-acp-agent.js +588 -0
- package/dist/server/server/agent/providers/jsonl-frame-decoder.d.ts +17 -0
- package/dist/server/server/agent/providers/jsonl-frame-decoder.js +149 -0
- package/dist/server/server/agent/providers/jsonl-rpc-process.d.ts +63 -0
- package/dist/server/server/agent/providers/jsonl-rpc-process.js +207 -0
- package/dist/server/server/agent/providers/kimi-acp-agent.d.ts +35 -0
- package/dist/server/server/agent/providers/kimi-acp-agent.js +65 -0
- package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
- package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +111 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.js +1340 -0
- package/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
- package/dist/server/server/agent/providers/mock-slow-provider.js +40 -0
- package/dist/server/server/agent/providers/omp/advisor-message.d.ts +11 -0
- package/dist/server/server/agent/providers/omp/advisor-message.js +80 -0
- package/dist/server/server/agent/providers/omp/agent.d.ts +178 -0
- package/dist/server/server/agent/providers/omp/agent.js +1952 -0
- package/dist/server/server/agent/providers/omp/cli-runtime.d.ts +22 -0
- package/dist/server/server/agent/providers/omp/cli-runtime.js +208 -0
- package/dist/server/server/agent/providers/omp/commands.d.ts +8 -0
- package/dist/server/server/agent/providers/omp/commands.js +62 -0
- package/dist/server/server/agent/providers/omp/custom-message.d.ts +7 -0
- package/dist/server/server/agent/providers/omp/custom-message.js +4 -0
- package/dist/server/server/agent/providers/omp/event-mapper.d.ts +13 -0
- package/dist/server/server/agent/providers/omp/event-mapper.js +267 -0
- package/dist/server/server/agent/providers/omp/history-hooks.d.ts +3 -0
- package/dist/server/server/agent/providers/omp/history-hooks.js +13 -0
- package/dist/server/server/agent/providers/omp/history.d.ts +19 -0
- package/dist/server/server/agent/providers/omp/history.js +306 -0
- package/dist/server/server/agent/providers/omp/host-tools.d.ts +14 -0
- package/dist/server/server/agent/providers/omp/host-tools.js +196 -0
- package/dist/server/server/agent/providers/omp/map-omp-model.d.ts +11 -0
- package/dist/server/server/agent/providers/omp/map-omp-model.js +67 -0
- package/dist/server/server/agent/providers/omp/message-history.d.ts +38 -0
- package/dist/server/server/agent/providers/omp/message-history.js +216 -0
- package/dist/server/server/agent/providers/omp/protocol-session.d.ts +13 -0
- package/dist/server/server/agent/providers/omp/protocol-session.js +39 -0
- package/dist/server/server/agent/providers/omp/provider-config.d.ts +43 -0
- package/dist/server/server/agent/providers/omp/provider-config.js +120 -0
- package/dist/server/server/agent/providers/omp/rpc-types.d.ts +2040 -0
- package/dist/server/server/agent/providers/omp/rpc-types.js +551 -0
- package/dist/server/server/agent/providers/omp/rpc-ui-permission-mapper.d.ts +24 -0
- package/dist/server/server/agent/providers/omp/rpc-ui-permission-mapper.js +156 -0
- package/dist/server/server/agent/providers/omp/runtime.d.ts +85 -0
- package/dist/server/server/agent/providers/omp/runtime.js +62 -0
- package/dist/server/server/agent/providers/omp/session-descriptor.d.ts +16 -0
- package/dist/server/server/agent/providers/omp/session-descriptor.js +389 -0
- package/dist/server/server/agent/providers/omp/subagent-card-tracker.d.ts +33 -0
- package/dist/server/server/agent/providers/omp/subagent-card-tracker.js +264 -0
- package/dist/server/server/agent/providers/omp/subagent-index.d.ts +13 -0
- package/dist/server/server/agent/providers/omp/subagent-index.js +111 -0
- package/dist/server/server/agent/providers/omp/subagent-title.d.ts +2 -0
- package/dist/server/server/agent/providers/omp/subagent-title.js +14 -0
- package/dist/server/server/agent/providers/omp/system-notice.d.ts +8 -0
- package/dist/server/server/agent/providers/omp/system-notice.js +68 -0
- package/dist/server/server/agent/providers/omp/todo-mapper.d.ts +9 -0
- package/dist/server/server/agent/providers/omp/todo-mapper.js +52 -0
- package/dist/server/server/agent/providers/omp/tool-call-detail.d.ts +110 -0
- package/dist/server/server/agent/providers/omp/tool-call-detail.js +288 -0
- package/dist/server/server/agent/providers/omp/tool-call-id.d.ts +4 -0
- package/dist/server/server/agent/providers/omp/tool-call-id.js +34 -0
- package/dist/server/server/agent/providers/omp/tool-call-mapper.d.ts +7 -0
- package/dist/server/server/agent/providers/omp/tool-call-mapper.js +98 -0
- package/dist/server/server/agent/providers/omp/usage-poller.d.ts +32 -0
- package/dist/server/server/agent/providers/omp/usage-poller.js +141 -0
- package/dist/server/server/agent/providers/opencode/bridge-plugin.bundle.mjs +14678 -0
- package/dist/server/server/agent/providers/opencode/bridge.d.ts +39 -0
- package/dist/server/server/agent/providers/opencode/bridge.js +249 -0
- package/dist/server/server/agent/providers/opencode/event-consumer.d.ts +60 -0
- package/dist/server/server/agent/providers/opencode/event-consumer.js +221 -0
- package/dist/server/server/agent/providers/opencode/options.d.ts +156 -0
- package/dist/server/server/agent/providers/opencode/options.js +62 -0
- package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/paths.js +7 -0
- package/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
- package/dist/server/server/agent/providers/opencode/rewind.js +14 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +101 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +513 -0
- package/dist/server/server/agent/providers/opencode/side-question.d.ts +78 -0
- package/dist/server/server/agent/providers/opencode/side-question.js +172 -0
- package/dist/server/server/agent/providers/opencode/subagent-presentation.d.ts +36 -0
- package/dist/server/server/agent/providers/opencode/subagent-presentation.js +62 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js +43 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +393 -0
- package/dist/server/server/agent/providers/opencode-agent.js +4106 -0
- package/dist/server/server/agent/providers/pi/agent.d.ts +164 -0
- package/dist/server/server/agent/providers/pi/agent.js +2236 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.js +177 -0
- package/dist/server/server/agent/providers/pi/history-mapper.d.ts +36 -0
- package/dist/server/server/agent/providers/pi/history-mapper.js +212 -0
- package/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
- package/dist/server/server/agent/providers/pi/rewind.js +8 -0
- package/dist/server/server/agent/providers/pi/rpc-types.d.ts +252 -0
- package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
- package/dist/server/server/agent/providers/pi/runtime.d.ts +77 -0
- package/dist/server/server/agent/providers/pi/runtime.js +65 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.js +355 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +113 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.js +340 -0
- package/dist/server/server/agent/providers/pi/usage-poller.d.ts +32 -0
- package/dist/server/server/agent/providers/pi/usage-poller.js +141 -0
- package/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
- package/dist/server/server/agent/providers/provider-image-output.js +165 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
- package/dist/server/server/agent/providers/provider-runner.js +81 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
- package/dist/server/server/agent/providers/trae-acp-agent.d.ts +15 -0
- package/dist/server/server/agent/providers/trae-acp-agent.js +18 -0
- package/dist/server/server/agent/recordings-debug.d.ts +3 -0
- package/dist/server/server/agent/recordings-debug.js +19 -0
- package/dist/server/server/agent/rewind/rewind.d.ts +10 -0
- package/dist/server/server/agent/rewind/rewind.js +29 -0
- package/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
- package/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
- package/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
- package/dist/server/server/agent/runtime-mcp-config.js +53 -0
- package/dist/server/server/agent/side-conversations/store.d.ts +33 -0
- package/dist/server/server/agent/side-conversations/store.js +62 -0
- package/dist/server/server/agent/stale-provider-session-error.d.ts +6 -0
- package/dist/server/server/agent/stale-provider-session-error.js +11 -0
- package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
- package/dist/server/server/agent/structured-generation-providers.js +193 -0
- package/dist/server/server/agent/stt-debug.d.ts +10 -0
- package/dist/server/server/agent/stt-debug.js +33 -0
- package/dist/server/server/agent/stt-manager.d.ts +38 -0
- package/dist/server/server/agent/stt-manager.js +246 -0
- package/dist/server/server/agent/system-prompt.d.ts +2 -0
- package/dist/server/server/agent/system-prompt.js +8 -0
- package/dist/server/server/agent/timeline-append.d.ts +10 -0
- package/dist/server/server/agent/timeline-append.js +27 -0
- package/dist/server/server/agent/timeline-page-bounds.d.ts +19 -0
- package/dist/server/server/agent/timeline-page-bounds.js +37 -0
- package/dist/server/server/agent/timeline-projection.d.ts +74 -0
- package/dist/server/server/agent/timeline-projection.js +467 -0
- package/dist/server/server/agent/timeline-prompt-index.d.ts +12 -0
- package/dist/server/server/agent/timeline-prompt-index.js +23 -0
- package/dist/server/server/agent/tools/paseo-tool-serialization.d.ts +4 -0
- package/dist/server/server/agent/tools/paseo-tool-serialization.js +58 -0
- package/dist/server/server/agent/tools/paseo-tools.d.ts +62 -0
- package/dist/server/server/agent/tools/paseo-tools.js +2445 -0
- package/dist/server/server/agent/tools/types.d.ts +39 -0
- package/dist/server/server/agent/tools/types.js +2 -0
- package/dist/server/server/agent/tts-debug.d.ts +8 -0
- package/dist/server/server/agent/tts-debug.js +24 -0
- package/dist/server/server/agent/tts-manager.d.ts +41 -0
- package/dist/server/server/agent/tts-manager.js +375 -0
- package/dist/server/server/agent-attention-policy.d.ts +29 -0
- package/dist/server/server/agent-attention-policy.js +36 -0
- package/dist/server/server/agent-history-search.d.ts +48 -0
- package/dist/server/server/agent-history-search.js +129 -0
- package/dist/server/server/atomic-file.d.ts +3 -0
- package/dist/server/server/atomic-file.js +19 -0
- package/dist/server/server/auth.d.ts +38 -0
- package/dist/server/server/auth.js +122 -0
- package/dist/server/server/authorization/index.d.ts +18 -0
- package/dist/server/server/authorization/index.js +47 -0
- package/dist/server/server/authorization/operation-permissions.d.ts +8 -0
- package/dist/server/server/authorization/operation-permissions.js +438 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +64 -0
- package/dist/server/server/auto-archive-on-merge/index.d.ts +13 -0
- package/dist/server/server/auto-archive-on-merge/index.js +77 -0
- package/dist/server/server/bootstrap.d.ts +166 -0
- package/dist/server/server/bootstrap.js +1388 -0
- package/dist/server/server/browser-tools/broker.d.ts +45 -0
- package/dist/server/server/browser-tools/broker.js +390 -0
- package/dist/server/server/browser-tools/errors.d.ts +22 -0
- package/dist/server/server/browser-tools/errors.js +27 -0
- package/dist/server/server/browser-tools/policy.d.ts +10 -0
- package/dist/server/server/browser-tools/policy.js +16 -0
- package/dist/server/server/browser-tools/tools.d.ts +16 -0
- package/dist/server/server/browser-tools/tools.js +796 -0
- package/dist/server/server/checkout/status-projection.d.ts +19 -0
- package/dist/server/server/checkout/status-projection.js +127 -0
- package/dist/server/server/checkout-diff-manager.d.ts +48 -0
- package/dist/server/server/checkout-diff-manager.js +284 -0
- package/dist/server/server/checkout-git-utils.d.ts +11 -0
- package/dist/server/server/checkout-git-utils.js +34 -0
- package/dist/server/server/client-message-id.d.ts +3 -0
- package/dist/server/server/client-message-id.js +12 -0
- package/dist/server/server/config.d.ts +26 -0
- package/dist/server/server/config.js +594 -0
- package/dist/server/server/connection-offer.d.ts +20 -0
- package/dist/server/server/connection-offer.js +59 -0
- package/dist/server/server/creation/index.d.ts +41 -0
- package/dist/server/server/creation/index.js +250 -0
- package/dist/server/server/daemon-config-store.d.ts +63 -0
- package/dist/server/server/daemon-config-store.js +524 -0
- package/dist/server/server/daemon-keypair.d.ts +8 -0
- package/dist/server/server/daemon-keypair.js +42 -0
- package/dist/server/server/daemon-version.d.ts +5 -0
- package/dist/server/server/daemon-version.js +22 -0
- package/dist/server/server/daemon-worker.d.ts +2 -0
- package/dist/server/server/daemon-worker.js +287 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts +88 -0
- package/dist/server/server/dictation/dictation-stream-manager.js +578 -0
- package/dist/server/server/directory-sync/index.d.ts +45 -0
- package/dist/server/server/directory-sync/index.js +98 -0
- package/dist/server/server/directory-sync/internal/versioned-collection.d.ts +56 -0
- package/dist/server/server/directory-sync/internal/versioned-collection.js +94 -0
- package/dist/server/server/exports.d.ts +24 -0
- package/dist/server/server/exports.js +24 -0
- package/dist/server/server/file-download/token-store.d.ts +24 -0
- package/dist/server/server/file-download/token-store.js +40 -0
- package/dist/server/server/file-explorer/observer.d.ts +32 -0
- package/dist/server/server/file-explorer/observer.js +130 -0
- package/dist/server/server/file-explorer/service.d.ts +125 -0
- package/dist/server/server/file-explorer/service.js +663 -0
- package/dist/server/server/file-observer/index.d.ts +43 -0
- package/dist/server/server/file-observer/index.js +114 -0
- package/dist/server/server/file-observer/internal/contracts.d.ts +26 -0
- package/dist/server/server/file-observer/internal/contracts.js +2 -0
- package/dist/server/server/file-observer/internal/linux.d.ts +4 -0
- package/dist/server/server/file-observer/internal/linux.js +260 -0
- package/dist/server/server/file-observer/internal/native-recursive.d.ts +9 -0
- package/dist/server/server/file-observer/internal/native-recursive.js +577 -0
- package/dist/server/server/file-observer/internal/observation.d.ts +21 -0
- package/dist/server/server/file-observer/internal/observation.js +129 -0
- package/dist/server/server/file-observer/internal/paths.d.ts +10 -0
- package/dist/server/server/file-observer/internal/paths.js +43 -0
- package/dist/server/server/file-upload/index.d.ts +27 -0
- package/dist/server/server/file-upload/index.js +158 -0
- package/dist/server/server/git-metadata-event-rules.d.ts +123 -0
- package/dist/server/server/git-metadata-event-rules.js +152 -0
- package/dist/server/server/hostnames.d.ts +13 -0
- package/dist/server/server/hostnames.js +94 -0
- package/dist/server/server/hub/daemon-executions.d.ts +89 -0
- package/dist/server/server/hub/daemon-executions.js +287 -0
- package/dist/server/server/hub/execution-controller.d.ts +30 -0
- package/dist/server/server/hub/execution-controller.js +220 -0
- package/dist/server/server/hub/relationship-controller.d.ts +116 -0
- package/dist/server/server/hub/relationship-controller.js +534 -0
- package/dist/server/server/hub/relationship-remote.d.ts +68 -0
- package/dist/server/server/hub/relationship-remote.js +159 -0
- package/dist/server/server/hub/relationship-retry.d.ts +7 -0
- package/dist/server/server/hub/relationship-retry.js +15 -0
- package/dist/server/server/json-utils.d.ts +11 -0
- package/dist/server/server/json-utils.js +45 -0
- package/dist/server/server/lifecycle-reasons.d.ts +4 -0
- package/dist/server/server/lifecycle-reasons.js +6 -0
- package/dist/server/server/logger.d.ts +29 -0
- package/dist/server/server/logger.js +127 -0
- package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
- package/dist/server/server/managed-processes/managed-processes.js +326 -0
- package/dist/server/server/messages.d.ts +9 -0
- package/dist/server/server/messages.js +29 -0
- package/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
- package/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
- package/dist/server/server/orchestration-skills/index.d.ts +18 -0
- package/dist/server/server/orchestration-skills/index.js +18 -0
- package/dist/server/server/orchestration-skills/internal/controller.d.ts +39 -0
- package/dist/server/server/orchestration-skills/internal/controller.js +108 -0
- package/dist/server/server/orchestration-skills/internal/operations.d.ts +43 -0
- package/dist/server/server/orchestration-skills/internal/operations.js +178 -0
- package/dist/server/server/orchestration-skills/internal/paths.d.ts +4 -0
- package/dist/server/server/orchestration-skills/internal/paths.js +21 -0
- package/dist/server/server/orchestration-skills/internal/selection-store.d.ts +12 -0
- package/dist/server/server/orchestration-skills/internal/selection-store.js +39 -0
- package/dist/server/server/orchestration-skills/internal/sync.d.ts +21 -0
- package/dist/server/server/orchestration-skills/internal/sync.js +177 -0
- package/dist/server/server/orchestration-skills/internal/transaction.d.ts +22 -0
- package/dist/server/server/orchestration-skills/internal/transaction.js +483 -0
- package/dist/server/server/package-version.d.ts +19 -0
- package/dist/server/server/package-version.js +60 -0
- package/dist/server/server/pagination/cursor.d.ts +16 -0
- package/dist/server/server/pagination/cursor.js +62 -0
- package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
- package/dist/server/server/pagination/sortable-pager.js +68 -0
- package/dist/server/server/pairing-offer.d.ts +18 -0
- package/dist/server/server/pairing-offer.js +47 -0
- package/dist/server/server/pairing-qr.d.ts +2 -0
- package/dist/server/server/pairing-qr.js +15 -0
- package/dist/server/server/paseo-env.d.ts +13 -0
- package/dist/server/server/paseo-env.js +54 -0
- package/dist/server/server/paseo-home.d.ts +2 -0
- package/dist/server/server/paseo-home.js +19 -0
- package/dist/server/server/paseo-worktree-service.d.ts +45 -0
- package/dist/server/server/paseo-worktree-service.js +191 -0
- package/dist/server/server/path-utils.d.ts +5 -0
- package/dist/server/server/path-utils.js +34 -0
- package/dist/server/server/persisted-config.d.ts +397 -0
- package/dist/server/server/persisted-config.js +411 -0
- package/dist/server/server/persistence-hooks.d.ts +32 -0
- package/dist/server/server/persistence-hooks.js +96 -0
- package/dist/server/server/pid-lock.d.ts +44 -0
- package/dist/server/server/pid-lock.js +285 -0
- package/dist/server/server/plugins/compiler-imports.d.ts +13 -0
- package/dist/server/server/plugins/compiler-imports.js +90 -0
- package/dist/server/server/plugins/compiler.d.ts +10 -0
- package/dist/server/server/plugins/compiler.js +354 -0
- package/dist/server/server/plugins/daemon-transport.d.ts +9 -0
- package/dist/server/server/plugins/daemon-transport.js +68 -0
- package/dist/server/server/plugins/index.d.ts +102 -0
- package/dist/server/server/plugins/index.js +575 -0
- package/dist/server/server/plugins/lifecycle/index.d.ts +40 -0
- package/dist/server/server/plugins/lifecycle/index.js +200 -0
- package/dist/server/server/plugins/managed-source.d.ts +50 -0
- package/dist/server/server/plugins/managed-source.js +327 -0
- package/dist/server/server/plugins/manifest.d.ts +12 -0
- package/dist/server/server/plugins/manifest.js +26 -0
- package/dist/server/server/plugins/plugin-process-protocol.d.ts +120 -0
- package/dist/server/server/plugins/plugin-process-protocol.js +154 -0
- package/dist/server/server/plugins/plugin-process.d.ts +2 -0
- package/dist/server/server/plugins/plugin-process.js +419 -0
- package/dist/server/server/plugins/plugin-sdk-specifiers.d.ts +5 -0
- package/dist/server/server/plugins/plugin-sdk-specifiers.js +23 -0
- package/dist/server/server/plugins/plugin-session-identity.d.ts +4 -0
- package/dist/server/server/plugins/plugin-session-identity.js +11 -0
- package/dist/server/server/plugins/preparation.d.ts +4 -0
- package/dist/server/server/plugins/preparation.js +49 -0
- package/dist/server/server/plugins/provider-icon.d.ts +2 -0
- package/dist/server/server/plugins/provider-icon.js +55 -0
- package/dist/server/server/plugins/runtime.d.ts +83 -0
- package/dist/server/server/plugins/runtime.js +836 -0
- package/dist/server/server/plugins/session-socket.d.ts +23 -0
- package/dist/server/server/plugins/session-socket.js +82 -0
- package/dist/server/server/plugins/settings/index.d.ts +96 -0
- package/dist/server/server/plugins/settings/index.js +115 -0
- package/dist/server/server/private-files.d.ts +6 -0
- package/dist/server/server/private-files.js +37 -0
- package/dist/server/server/process-diagnostics.d.ts +17 -0
- package/dist/server/server/process-diagnostics.js +22 -0
- package/dist/server/server/project-directory-service.d.ts +30 -0
- package/dist/server/server/project-directory-service.js +120 -0
- package/dist/server/server/project-key.d.ts +14 -0
- package/dist/server/server/project-key.js +44 -0
- package/dist/server/server/push/index.d.ts +16 -0
- package/dist/server/server/push/index.js +26 -0
- package/dist/server/server/push/push-service.d.ts +19 -0
- package/dist/server/server/push/push-service.js +66 -0
- package/dist/server/server/push/token-store.d.ts +22 -0
- package/dist/server/server/push/token-store.js +125 -0
- package/dist/server/server/relay-runtime.d.ts +27 -0
- package/dist/server/server/relay-runtime.js +46 -0
- package/dist/server/server/relay-transport.d.ts +33 -0
- package/dist/server/server/relay-transport.js +481 -0
- package/dist/server/server/request-receipts/index.d.ts +33 -0
- package/dist/server/server/request-receipts/index.js +131 -0
- package/dist/server/server/resolve-workspace-id-for-path.d.ts +3 -0
- package/dist/server/server/resolve-workspace-id-for-path.js +41 -0
- package/dist/server/server/resolve-worktree-creation-intent.d.ts +44 -0
- package/dist/server/server/resolve-worktree-creation-intent.js +186 -0
- package/dist/server/server/schedule/cron.d.ts +4 -0
- package/dist/server/server/schedule/cron.js +83 -0
- package/dist/server/server/schedule/service.d.ts +75 -0
- package/dist/server/server/schedule/service.js +810 -0
- package/dist/server/server/schedule/store.d.ts +27 -0
- package/dist/server/server/schedule/store.js +190 -0
- package/dist/server/server/script-health-monitor.d.ts +39 -0
- package/dist/server/server/script-health-monitor.js +159 -0
- package/dist/server/server/script-proxy.d.ts +3 -0
- package/dist/server/server/script-proxy.js +2 -0
- package/dist/server/server/script-route-branch-handler.d.ts +10 -0
- package/dist/server/server/script-route-branch-handler.js +11 -0
- package/dist/server/server/script-status-projection.d.ts +36 -0
- package/dist/server/server/script-status-projection.js +200 -0
- package/dist/server/server/server-id.d.ts +17 -0
- package/dist/server/server/server-id.js +68 -0
- package/dist/server/server/service-proxy.d.ts +237 -0
- package/dist/server/server/service-proxy.js +679 -0
- package/dist/server/server/session/agent-config/agent-config-session.d.ts +75 -0
- package/dist/server/server/session/agent-config/agent-config-session.js +151 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +65 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.js +266 -0
- package/dist/server/server/session/checkout/checkout-session.d.ts +150 -0
- package/dist/server/server/session/checkout/checkout-session.js +1187 -0
- package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
- package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +34 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +90 -0
- package/dist/server/server/session/daemon/daemon-self-updater.d.ts +33 -0
- package/dist/server/server/session/daemon/daemon-self-updater.js +60 -0
- package/dist/server/server/session/daemon/daemon-session.d.ts +90 -0
- package/dist/server/server/session/daemon/daemon-session.js +224 -0
- package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
- package/dist/server/server/session/daemon/diagnostics.js +431 -0
- package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
- package/dist/server/server/session/daemon/install-origin.js +64 -0
- package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
- package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
- package/dist/server/server/session/files/workspace-files-session.d.ts +55 -0
- package/dist/server/server/session/files/workspace-files-session.js +359 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +32 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.js +74 -0
- package/dist/server/server/session/project-config/project-config-session.d.ts +35 -0
- package/dist/server/server/session/project-config/project-config-session.js +143 -0
- package/dist/server/server/session/project-config/worktree-setup-commit-status.d.ts +6 -0
- package/dist/server/server/session/project-config/worktree-setup-commit-status.js +38 -0
- package/dist/server/server/session/provider/provider-catalog-session.d.ts +78 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +388 -0
- package/dist/server/server/session/schedule/schedule-session.d.ts +47 -0
- package/dist/server/server/session/schedule/schedule-session.js +188 -0
- package/dist/server/server/session/voice/voice-session.d.ts +166 -0
- package/dist/server/server/session/voice/voice-session.js +904 -0
- package/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
- package/dist/server/server/session/voice/voice-turn-controller.js +393 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +42 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +170 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +59 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +326 -0
- package/dist/server/server/session/workspace-recovery/workspace-recovery-service.d.ts +30 -0
- package/dist/server/server/session/workspace-recovery/workspace-recovery-service.js +178 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +54 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +156 -0
- package/dist/server/server/session.d.ts +555 -0
- package/dist/server/server/session.js +6540 -0
- package/dist/server/server/speech/audio.d.ts +10 -0
- package/dist/server/server/speech/audio.js +101 -0
- package/dist/server/server/speech/provider-resolver.d.ts +3 -0
- package/dist/server/server/speech/provider-resolver.js +7 -0
- package/dist/server/server/speech/providers/local/config.d.ts +30 -0
- package/dist/server/server/speech/providers/local/config.js +134 -0
- package/dist/server/server/speech/providers/local/models.d.ts +12 -0
- package/dist/server/server/speech/providers/local/models.js +18 -0
- package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
- package/dist/server/server/speech/providers/local/runtime.js +135 -0
- package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +56 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +74 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +17 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +145 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +101 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
- package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
- package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
- package/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
- package/dist/server/server/speech/providers/local/worker-client.js +590 -0
- package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
- package/dist/server/server/speech/providers/local/worker-process.js +270 -0
- package/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
- package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
- package/dist/server/server/speech/providers/openai/config.d.ts +19 -0
- package/dist/server/server/speech/providers/openai/config.js +148 -0
- package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
- package/dist/server/server/speech/providers/openai/runtime.js +102 -0
- package/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
- package/dist/server/server/speech/providers/openai/stt.js +209 -0
- package/dist/server/server/speech/providers/openai/tts.d.ts +19 -0
- package/dist/server/server/speech/providers/openai/tts.js +48 -0
- package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
- package/dist/server/server/speech/speech-config-resolver.js +132 -0
- package/dist/server/server/speech/speech-provider.d.ts +59 -0
- package/dist/server/server/speech/speech-provider.js +2 -0
- package/dist/server/server/speech/speech-runtime.d.ts +45 -0
- package/dist/server/server/speech/speech-runtime.js +571 -0
- package/dist/server/server/speech/speech-types.d.ts +22 -0
- package/dist/server/server/speech/speech-types.js +8 -0
- package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
- package/dist/server/server/speech/turn-detection-provider.js +2 -0
- package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
- package/dist/server/server/utils/diff-highlighter.js +304 -0
- package/dist/server/server/voice-config.d.ts +15 -0
- package/dist/server/server/voice-config.js +54 -0
- package/dist/server/server/voice-permission-policy.d.ts +4 -0
- package/dist/server/server/voice-permission-policy.js +13 -0
- package/dist/server/server/voice-types.d.ts +12 -0
- package/dist/server/server/voice-types.js +2 -0
- package/dist/server/server/watcher-liveness-canary.d.ts +11 -0
- package/dist/server/server/watcher-liveness-canary.js +53 -0
- package/dist/server/server/web-ui.d.ts +10 -0
- package/dist/server/server/web-ui.js +205 -0
- package/dist/server/server/websocket/encrypted-relay-socket.d.ts +23 -0
- package/dist/server/server/websocket/encrypted-relay-socket.js +64 -0
- package/dist/server/server/websocket/physical-socket.d.ts +36 -0
- package/dist/server/server/websocket/physical-socket.js +95 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts +95 -0
- package/dist/server/server/websocket/runtime-metrics.js +148 -0
- package/dist/server/server/websocket-server.d.ts +214 -0
- package/dist/server/server/websocket-server.js +2258 -0
- package/dist/server/server/workspace-archive-service.d.ts +63 -0
- package/dist/server/server/workspace-archive-service.js +355 -0
- package/dist/server/server/workspace-auto-name.d.ts +55 -0
- package/dist/server/server/workspace-auto-name.js +127 -0
- package/dist/server/server/workspace-automation-gate.d.ts +16 -0
- package/dist/server/server/workspace-automation-gate.js +35 -0
- package/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
- package/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
- package/dist/server/server/workspace-directory.d.ts +99 -0
- package/dist/server/server/workspace-directory.js +467 -0
- package/dist/server/server/workspace-git-fetch.d.ts +33 -0
- package/dist/server/server/workspace-git-fetch.js +108 -0
- package/dist/server/server/workspace-git-metadata.d.ts +8 -0
- package/dist/server/server/workspace-git-metadata.js +24 -0
- package/dist/server/server/workspace-git-service.d.ts +348 -0
- package/dist/server/server/workspace-git-service.js +2534 -0
- package/dist/server/server/workspace-labels/index.d.ts +14 -0
- package/dist/server/server/workspace-labels/index.js +10 -0
- package/dist/server/server/workspace-labels/internal/catalog-store.d.ts +50 -0
- package/dist/server/server/workspace-labels/internal/catalog-store.js +203 -0
- package/dist/server/server/workspace-labels/internal/sequence.d.ts +43 -0
- package/dist/server/server/workspace-labels/internal/sequence.js +80 -0
- package/dist/server/server/workspace-labels/internal/service.d.ts +57 -0
- package/dist/server/server/workspace-labels/internal/service.js +224 -0
- package/dist/server/server/workspace-reconciliation-service.d.ts +103 -0
- package/dist/server/server/workspace-reconciliation-service.js +379 -0
- package/dist/server/server/workspace-registry-bootstrap-legacy.d.ts +21 -0
- package/dist/server/server/workspace-registry-bootstrap-legacy.js +57 -0
- package/dist/server/server/workspace-registry-bootstrap.d.ts +14 -0
- package/dist/server/server/workspace-registry-bootstrap.js +155 -0
- package/dist/server/server/workspace-registry-model.d.ts +56 -0
- package/dist/server/server/workspace-registry-model.js +150 -0
- package/dist/server/server/workspace-registry.d.ts +228 -0
- package/dist/server/server/workspace-registry.js +468 -0
- package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
- package/dist/server/server/workspace-script-runtime-store.js +78 -0
- package/dist/server/server/workspace-service-env.d.ts +18 -0
- package/dist/server/server/workspace-service-env.js +85 -0
- package/dist/server/server/workspace-service-port-allocator.d.ts +11 -0
- package/dist/server/server/workspace-service-port-allocator.js +89 -0
- package/dist/server/server/workspace-service-port-registry.d.ts +24 -0
- package/dist/server/server/workspace-service-port-registry.js +172 -0
- package/dist/server/server/workspace-setup-runtime.d.ts +7 -0
- package/dist/server/server/workspace-setup-runtime.js +30 -0
- package/dist/server/server/workspace-source.d.ts +7 -0
- package/dist/server/server/workspace-source.js +15 -0
- package/dist/server/server/worktree/commands.d.ts +55 -0
- package/dist/server/server/worktree/commands.js +99 -0
- package/dist/server/server/worktree-bootstrap.d.ts +86 -0
- package/dist/server/server/worktree-bootstrap.js +753 -0
- package/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
- package/dist/server/server/worktree-branch-name-generator.js +89 -0
- package/dist/server/server/worktree-core.d.ts +32 -0
- package/dist/server/server/worktree-core.js +114 -0
- package/dist/server/server/worktree-errors.d.ts +12 -0
- package/dist/server/server/worktree-errors.js +28 -0
- package/dist/server/server/worktree-session.d.ts +165 -0
- package/dist/server/server/worktree-session.js +594 -0
- package/dist/server/services/forge-cli-command.d.ts +128 -0
- package/dist/server/services/forge-cli-command.js +212 -0
- package/dist/server/services/forge-registry.d.ts +25 -0
- package/dist/server/services/forge-registry.js +155 -0
- package/dist/server/services/forge-resolver.d.ts +38 -0
- package/dist/server/services/forge-resolver.js +191 -0
- package/dist/server/services/forge-service.d.ts +430 -0
- package/dist/server/services/forge-service.js +50 -0
- package/dist/server/services/gitea-facts.d.ts +11 -0
- package/dist/server/services/gitea-facts.js +4 -0
- package/dist/server/services/gitea-service.d.ts +62 -0
- package/dist/server/services/gitea-service.js +1844 -0
- package/dist/server/services/github-facts.d.ts +27 -0
- package/dist/server/services/github-facts.js +4 -0
- package/dist/server/services/github-service.d.ts +76 -0
- package/dist/server/services/github-service.js +3297 -0
- package/dist/server/services/gitlab-facts.d.ts +26 -0
- package/dist/server/services/gitlab-facts.js +4 -0
- package/dist/server/services/gitlab-service.d.ts +43 -0
- package/dist/server/services/gitlab-service.js +1092 -0
- package/dist/server/services/quota-fetcher/manifest.d.ts +5 -0
- package/dist/server/services/quota-fetcher/manifest.js +118 -0
- package/dist/server/services/quota-fetcher/provider.d.ts +18 -0
- package/dist/server/services/quota-fetcher/provider.js +2 -0
- package/dist/server/services/quota-fetcher/providers/claude.d.ts +40 -0
- package/dist/server/services/quota-fetcher/providers/claude.js +389 -0
- package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
- package/dist/server/services/quota-fetcher/providers/codex.js +167 -0
- package/dist/server/services/quota-fetcher/providers/copilot.d.ts +21 -0
- package/dist/server/services/quota-fetcher/providers/copilot.js +77 -0
- package/dist/server/services/quota-fetcher/providers/cursor.d.ts +19 -0
- package/dist/server/services/quota-fetcher/providers/cursor.js +185 -0
- package/dist/server/services/quota-fetcher/providers/grok.d.ts +23 -0
- package/dist/server/services/quota-fetcher/providers/grok.js +137 -0
- package/dist/server/services/quota-fetcher/providers/kimi.d.ts +23 -0
- package/dist/server/services/quota-fetcher/providers/kimi.js +260 -0
- package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
- package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
- package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
- package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
- package/dist/server/services/quota-fetcher/service.d.ts +34 -0
- package/dist/server/services/quota-fetcher/service.js +74 -0
- package/dist/server/services/quota-fetcher/usage.d.ts +39 -0
- package/dist/server/services/quota-fetcher/usage.js +78 -0
- package/dist/server/skills/paseo/SKILL.md +129 -0
- package/dist/server/skills/paseo-advisor/SKILL.md +63 -0
- package/dist/server/skills/paseo-committee/SKILL.md +46 -0
- package/dist/server/skills/paseo-handoff/SKILL.md +65 -0
- package/dist/server/skills/paseo-help/SKILL.md +92 -0
- package/dist/server/skills/paseo-plugin/SKILL.md +639 -0
- package/dist/server/terminal/activity/terminal-activity-tracker.d.ts +21 -0
- package/dist/server/terminal/activity/terminal-activity-tracker.js +65 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
- package/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
- package/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
- package/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
- package/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
- package/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
- package/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +81 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
- package/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
- package/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
- package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
- package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
- package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
- package/dist/server/terminal/terminal-capture.d.ts +12 -0
- package/dist/server/terminal/terminal-capture.js +43 -0
- package/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
- package/dist/server/terminal/terminal-manager-factory.js +5 -0
- package/dist/server/terminal/terminal-manager.d.ts +80 -0
- package/dist/server/terminal/terminal-manager.js +321 -0
- package/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
- package/dist/server/terminal/terminal-output-coalescer.js +73 -0
- package/dist/server/terminal/terminal-restore.d.ts +18 -0
- package/dist/server/terminal/terminal-restore.js +52 -0
- package/dist/server/terminal/terminal-session-controller.d.ts +90 -0
- package/dist/server/terminal/terminal-session-controller.js +849 -0
- package/dist/server/terminal/terminal-size-ownership.d.ts +9 -0
- package/dist/server/terminal/terminal-size-ownership.js +23 -0
- package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
- package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
- package/dist/server/terminal/terminal-worker-process.js +308 -0
- package/dist/server/terminal/terminal-worker-protocol.d.ts +121 -0
- package/dist/server/terminal/terminal-worker-protocol.js +2 -0
- package/dist/server/terminal/terminal.d.ts +151 -0
- package/dist/server/terminal/terminal.js +1234 -0
- package/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
- package/dist/server/terminal/worker-terminal-manager.js +688 -0
- package/dist/server/utils/build-metadata-prompt.d.ts +19 -0
- package/dist/server/utils/build-metadata-prompt.js +29 -0
- package/dist/server/utils/checkout-git.d.ts +317 -0
- package/dist/server/utils/checkout-git.js +2886 -0
- package/dist/server/utils/directory-suggestions.d.ts +29 -0
- package/dist/server/utils/directory-suggestions.js +596 -0
- package/dist/server/utils/git-command-runtime-metrics.d.ts +67 -0
- package/dist/server/utils/git-command-runtime-metrics.js +126 -0
- package/dist/server/utils/git-command-trace.d.ts +29 -0
- package/dist/server/utils/git-command-trace.js +74 -0
- package/dist/server/utils/git-process-scheduler.d.ts +34 -0
- package/dist/server/utils/git-process-scheduler.js +112 -0
- package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
- package/dist/server/utils/git-rev-parse-path.js +21 -0
- package/dist/server/utils/paseo-config-file.d.ts +30 -0
- package/dist/server/utils/paseo-config-file.js +90 -0
- package/dist/server/utils/path.d.ts +27 -0
- package/dist/server/utils/path.js +156 -0
- package/dist/server/utils/project-custom-icon.d.ts +40 -0
- package/dist/server/utils/project-custom-icon.js +144 -0
- package/dist/server/utils/project-icon.d.ts +54 -0
- package/dist/server/utils/project-icon.js +445 -0
- package/dist/server/utils/promise-timeout.d.ts +9 -0
- package/dist/server/utils/promise-timeout.js +25 -0
- package/dist/server/utils/run-git-command.d.ts +59 -0
- package/dist/server/utils/run-git-command.js +393 -0
- package/dist/server/utils/spawn.d.ts +26 -0
- package/dist/server/utils/spawn.js +60 -0
- package/dist/server/utils/ssh-hostname.d.ts +8 -0
- package/dist/server/utils/ssh-hostname.js +60 -0
- package/dist/server/utils/string-command-shell.d.ts +13 -0
- package/dist/server/utils/string-command-shell.js +37 -0
- package/dist/server/utils/tree-kill.d.ts +19 -0
- package/dist/server/utils/tree-kill.js +77 -0
- package/dist/server/utils/windows-command.d.ts +15 -0
- package/dist/server/utils/windows-command.js +41 -0
- package/dist/server/utils/worktree-metadata.d.ts +77 -0
- package/dist/server/utils/worktree-metadata.js +280 -0
- package/dist/server/utils/worktree.d.ts +232 -0
- package/dist/server/utils/worktree.js +1193 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-29f33408b1a3c5b435c5202d62a36719.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-29f33408b1a3c5b435c5202d62a36719.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-29f33408b1a3c5b435c5202d62a36719.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-41547ee520dfff946caa727824742a5c.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-41547ee520dfff946caa727824742a5c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-41547ee520dfff946caa727824742a5c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-03b99be4265ac4a2bc5a6d602fd59cc4.js +16819 -0
- package/dist/server/web-ui/_expo/static/js/web/index-03b99be4265ac4a2bc5a6d602fd59cc4.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-03b99be4265ac4a2bc5a6d602fd59cc4.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5444610146b0794f1e7d9edad4522d41.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5444610146b0794f1e7d9edad4522d41.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5444610146b0794f1e7d9edad4522d41.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-88b083190031a44788be59103814f511.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-88b083190031a44788be59103814f511.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-88b083190031a44788be59103814f511.js.gz +0 -0
- package/dist/server/web-ui/apple-touch-icon.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
- package/dist/server/web-ui/favicon.ico +0 -0
- package/dist/server/web-ui/index.html +90 -0
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/server/web-ui/manifest.json +27 -0
- package/dist/server/web-ui/manifest.json.br +0 -0
- package/dist/server/web-ui/manifest.json.gz +0 -0
- package/dist/server/web-ui/metadata.json +1 -0
- package/dist/server/web-ui/metadata.json.br +1 -0
- package/dist/server/web-ui/metadata.json.gz +0 -0
- package/dist/server/web-ui/pwa-icon-192.png +0 -0
- package/dist/server/web-ui/pwa-icon-512.png +0 -0
- package/dist/server/web-ui/robots.txt +2 -0
- package/dist/src/executable-resolution/executable-resolution.js +121 -0
- package/dist/src/executable-resolution/windows.js +65 -0
- package/dist/src/server/agent/provider-launch-config.js +167 -0
- package/dist/src/server/paseo-env.js +54 -0
- package/dist/src/server/paseo-home.js +19 -0
- package/dist/src/server/persisted-config.js +411 -0
- package/dist/src/server/pid-lock.js +285 -0
- package/dist/src/server/private-files.js +37 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
- package/dist/src/utils/spawn.js +60 -0
- package/dist/src/utils/tree-kill.js +77 -0
- package/dist/src/utils/windows-command.js +41 -0
- package/package.json +125 -0
|
@@ -0,0 +1,2445 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ensureValidJson } from "../../json-utils.js";
|
|
3
|
+
import { AgentProfileSchema } from "@camerontaylor/paseo-protocol/messages";
|
|
4
|
+
import { AgentFeatureSchema, AgentPermissionRequestPayloadSchema, AgentListItemPayloadSchema, AgentPermissionResponseSchema, AgentSnapshotPayloadSchema, WorkspaceScriptPayloadSchema, } from "../../messages.js";
|
|
5
|
+
import { buildStoredAgentPayload, toAgentListItemPayload, toAgentPayload, } from "../agent-projections.js";
|
|
6
|
+
import { curateAgentActivity } from "../activity-curator.js";
|
|
7
|
+
import { selectItemsByProjectedLimit } from "../timeline-projection.js";
|
|
8
|
+
import { ensureAgentLoaded } from "../agent-loading.js";
|
|
9
|
+
import { isStoredAgentProviderAvailable } from "../../persistence-hooks.js";
|
|
10
|
+
import { archiveByScope, killTerminalsForWorkspace, requireActiveWorkspaceForArchive, } from "../../workspace-archive-service.js";
|
|
11
|
+
import { createAgentCommand } from "../create-agent/create.js";
|
|
12
|
+
import { everyMsToFiveFieldCron } from "@camerontaylor/paseo-protocol/schedule/cadence";
|
|
13
|
+
import { expandUserPath, isSameOrDescendantPath, resolvePathFromBase } from "../../path-utils.js";
|
|
14
|
+
import { ScheduleRunSchema, ScheduleSummarySchema, StoredScheduleSchema, } from "@camerontaylor/paseo-protocol/schedule/types";
|
|
15
|
+
import { AgentModelSchema, AgentProviderEnum, AgentStatusEnum, ProviderModeSchema, ProviderSummarySchema, parseDurationString, resolveRequiredProviderModel, sanitizePermissionRequest, serializeSnapshotWithMetadata, toScheduleSummary, waitForAgentWithTimeout, } from "../mcp-shared.js";
|
|
16
|
+
import { sendPromptToAgent, setupFinishNotification } from "../agent-prompt.js";
|
|
17
|
+
import { respondToAgentPermission } from "../permission-response.js";
|
|
18
|
+
import { archiveAgentCommand, cancelAgentRunCommand, closeAgentCommand, setAgentModeCommand, updateAgentCommand, } from "../lifecycle-command.js";
|
|
19
|
+
import { resolveWorktreeSourceCwd } from "../../workspace-source.js";
|
|
20
|
+
import { createPaseoWorktreeCommand, } from "../../worktree/commands.js";
|
|
21
|
+
import { registerBrowserTools } from "../../browser-tools/tools.js";
|
|
22
|
+
import { isPaseoToolEnabled } from "../paseo-tool-policy.js";
|
|
23
|
+
function parseTimestamp(value) {
|
|
24
|
+
if (!value) {
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
const parsed = Date.parse(value);
|
|
28
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
29
|
+
}
|
|
30
|
+
function resolveAgentListActivityTime(agent) {
|
|
31
|
+
return Math.max(parseTimestamp(agent.updatedAt), parseTimestamp(agent.lastUserMessageAt), parseTimestamp(agent.attentionTimestamp), parseTimestamp(agent.archivedAt), parseTimestamp(agent.createdAt));
|
|
32
|
+
}
|
|
33
|
+
const WorkspaceAutomationSummarySchema = z.object({
|
|
34
|
+
workspaceId: z.string(),
|
|
35
|
+
projectId: z.string(),
|
|
36
|
+
cwd: z.string(),
|
|
37
|
+
isolation: z.enum(["local", "worktree"]),
|
|
38
|
+
kind: z.enum(["directory", "local_checkout", "worktree"]),
|
|
39
|
+
title: z.string().nullable(),
|
|
40
|
+
});
|
|
41
|
+
function toWorkspaceAutomationSummary(workspace) {
|
|
42
|
+
return {
|
|
43
|
+
workspaceId: workspace.workspaceId,
|
|
44
|
+
projectId: workspace.projectId,
|
|
45
|
+
cwd: workspace.cwd,
|
|
46
|
+
isolation: workspace.kind === "worktree" ? "worktree" : "local",
|
|
47
|
+
kind: workspace.kind,
|
|
48
|
+
title: workspace.title,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function assertOptionsAbsent(options, message) {
|
|
52
|
+
if (options.some(([, value]) => value !== undefined)) {
|
|
53
|
+
throw new Error(message);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function resolveWorkspaceWorktreeTarget(input) {
|
|
57
|
+
switch (input.mode ?? "branch-off") {
|
|
58
|
+
case "branch-off":
|
|
59
|
+
assertOptionsAbsent([
|
|
60
|
+
["branch", input.branch],
|
|
61
|
+
["prNumber", input.prNumber],
|
|
62
|
+
["forge", input.forge],
|
|
63
|
+
], "branch, prNumber, and forge require a checkout mode");
|
|
64
|
+
return {
|
|
65
|
+
action: "branch-off",
|
|
66
|
+
...(input.branchName ? { branchName: input.branchName } : {}),
|
|
67
|
+
...(input.baseBranch ? { refName: input.baseBranch } : {}),
|
|
68
|
+
};
|
|
69
|
+
case "checkout-branch":
|
|
70
|
+
if (!input.branch) {
|
|
71
|
+
throw new Error("branch is required for checkout-branch mode");
|
|
72
|
+
}
|
|
73
|
+
assertOptionsAbsent([
|
|
74
|
+
["branchName", input.branchName],
|
|
75
|
+
["baseBranch", input.baseBranch],
|
|
76
|
+
["prNumber", input.prNumber],
|
|
77
|
+
["forge", input.forge],
|
|
78
|
+
], "branchName, baseBranch, prNumber, and forge are not valid for checkout-branch mode");
|
|
79
|
+
return { action: "checkout", refName: input.branch };
|
|
80
|
+
case "checkout-pr":
|
|
81
|
+
if (input.prNumber === undefined) {
|
|
82
|
+
throw new Error("prNumber is required for checkout-pr mode");
|
|
83
|
+
}
|
|
84
|
+
assertOptionsAbsent([
|
|
85
|
+
["branchName", input.branchName],
|
|
86
|
+
["baseBranch", input.baseBranch],
|
|
87
|
+
["branch", input.branch],
|
|
88
|
+
], "branchName, baseBranch, and branch are not valid for checkout-pr mode");
|
|
89
|
+
return {
|
|
90
|
+
action: "checkout",
|
|
91
|
+
checkoutSource: {
|
|
92
|
+
kind: "change_request",
|
|
93
|
+
...(input.forge ? { forge: input.forge } : {}),
|
|
94
|
+
number: input.prNumber,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function toProviderSummary(entry) {
|
|
100
|
+
return {
|
|
101
|
+
id: entry.provider,
|
|
102
|
+
label: entry.label ?? entry.provider,
|
|
103
|
+
description: entry.description ?? "",
|
|
104
|
+
enabled: entry.enabled,
|
|
105
|
+
...(entry.source ? { source: entry.source } : {}),
|
|
106
|
+
...(entry.baseProviderId ? { baseProviderId: entry.baseProviderId } : {}),
|
|
107
|
+
modes: entry.modes ?? [],
|
|
108
|
+
status: entry.status === "ready" ? "available" : entry.status,
|
|
109
|
+
...(entry.error ? { error: entry.error } : {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function compareAgentListItems(a, b) {
|
|
113
|
+
const attentionDelta = Number(b.requiresAttention ?? false) - Number(a.requiresAttention ?? false);
|
|
114
|
+
if (attentionDelta !== 0) {
|
|
115
|
+
return attentionDelta;
|
|
116
|
+
}
|
|
117
|
+
const statusOrder = {
|
|
118
|
+
running: 0,
|
|
119
|
+
initializing: 1,
|
|
120
|
+
idle: 2,
|
|
121
|
+
error: 3,
|
|
122
|
+
closed: 4,
|
|
123
|
+
};
|
|
124
|
+
const statusDelta = (statusOrder[a.status] ?? 999) - (statusOrder[b.status] ?? 999);
|
|
125
|
+
if (statusDelta !== 0) {
|
|
126
|
+
return statusDelta;
|
|
127
|
+
}
|
|
128
|
+
return resolveAgentListActivityTime(b) - resolveAgentListActivityTime(a);
|
|
129
|
+
}
|
|
130
|
+
function resolveScheduleProviderAndModel(params) {
|
|
131
|
+
const providerInput = params.provider?.trim() || params.defaultProvider;
|
|
132
|
+
const slashIndex = providerInput.indexOf("/");
|
|
133
|
+
if (slashIndex === -1) {
|
|
134
|
+
return { provider: providerInput };
|
|
135
|
+
}
|
|
136
|
+
const provider = providerInput.slice(0, slashIndex).trim();
|
|
137
|
+
const model = providerInput.slice(slashIndex + 1).trim();
|
|
138
|
+
if (!provider || !model) {
|
|
139
|
+
throw new Error("provider must be <provider> or <provider>/<model>");
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
provider: provider,
|
|
143
|
+
model,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function resolveScheduleUpdateProviderAndModel(params) {
|
|
147
|
+
const providerInput = params.provider?.trim();
|
|
148
|
+
const modelInput = typeof params.model === "string" ? params.model.trim() : params.model;
|
|
149
|
+
if (params.model !== undefined && modelInput === "") {
|
|
150
|
+
throw new Error("model cannot be empty");
|
|
151
|
+
}
|
|
152
|
+
if (!providerInput) {
|
|
153
|
+
return params.model !== undefined ? { model: modelInput } : {};
|
|
154
|
+
}
|
|
155
|
+
const slashIndex = providerInput.indexOf("/");
|
|
156
|
+
if (slashIndex === -1) {
|
|
157
|
+
return {
|
|
158
|
+
provider: providerInput,
|
|
159
|
+
...(params.model !== undefined ? { model: modelInput } : {}),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const provider = providerInput.slice(0, slashIndex).trim();
|
|
163
|
+
const modelFromProvider = providerInput.slice(slashIndex + 1).trim();
|
|
164
|
+
if (!provider || !modelFromProvider) {
|
|
165
|
+
throw new Error("provider must be <provider> or <provider>/<model>");
|
|
166
|
+
}
|
|
167
|
+
if (params.model === null) {
|
|
168
|
+
throw new Error("provider specifies a model but model is null");
|
|
169
|
+
}
|
|
170
|
+
if (typeof modelInput === "string" && modelInput !== modelFromProvider) {
|
|
171
|
+
throw new Error("Conflicting model values provided");
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
provider,
|
|
175
|
+
model: modelInput ?? modelFromProvider,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function normalizeScheduleCadenceArg(value) {
|
|
179
|
+
if (value === undefined) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
const trimmed = value.trim();
|
|
183
|
+
if (!trimmed) {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
return trimmed;
|
|
187
|
+
}
|
|
188
|
+
function normalizeScheduleTimeZoneArg(value) {
|
|
189
|
+
return normalizeScheduleCadenceArg(value);
|
|
190
|
+
}
|
|
191
|
+
function resolveScheduleUpdateCadence(input) {
|
|
192
|
+
const every = normalizeScheduleCadenceArg(input.every);
|
|
193
|
+
const cron = normalizeScheduleCadenceArg(input.cron);
|
|
194
|
+
const timeZone = normalizeScheduleTimeZoneArg(input.timezone);
|
|
195
|
+
if (every !== undefined && cron !== undefined) {
|
|
196
|
+
throw new Error("Specify at most one of every or cron");
|
|
197
|
+
}
|
|
198
|
+
if (timeZone !== undefined && cron === undefined) {
|
|
199
|
+
throw new Error("timezone can only be used with cron");
|
|
200
|
+
}
|
|
201
|
+
if (every !== undefined) {
|
|
202
|
+
// COMPAT(scheduleEveryInput): accept the old hidden field and canonicalize it before write.
|
|
203
|
+
// Added in v0.2.0; remove after 2027-01-17.
|
|
204
|
+
const everyMs = parseDurationString(every);
|
|
205
|
+
const expression = everyMsToFiveFieldCron(everyMs);
|
|
206
|
+
if (expression) {
|
|
207
|
+
return { type: "cron", expression };
|
|
208
|
+
}
|
|
209
|
+
throw new Error(`${every} cannot be represented faithfully by five-field cron`);
|
|
210
|
+
}
|
|
211
|
+
if (cron !== undefined) {
|
|
212
|
+
return {
|
|
213
|
+
type: "cron",
|
|
214
|
+
expression: cron,
|
|
215
|
+
...(timeZone !== undefined ? { timezone: timeZone } : {}),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
function resolveScheduleUpdateExpiresAt(input) {
|
|
221
|
+
if (input.expiresIn !== undefined && input.clearExpires) {
|
|
222
|
+
throw new Error("Specify at most one of expiresIn or clearExpires");
|
|
223
|
+
}
|
|
224
|
+
if (input.expiresIn !== undefined) {
|
|
225
|
+
return new Date(Date.now() + parseDurationString(input.expiresIn)).toISOString();
|
|
226
|
+
}
|
|
227
|
+
if (input.clearExpires) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
function buildScheduleUpdateInput(input) {
|
|
233
|
+
const cadence = resolveScheduleUpdateCadence(input);
|
|
234
|
+
const expiresAt = resolveScheduleUpdateExpiresAt(input);
|
|
235
|
+
const providerModelPatch = resolveScheduleUpdateProviderAndModel({
|
|
236
|
+
provider: input.provider,
|
|
237
|
+
model: input.model,
|
|
238
|
+
});
|
|
239
|
+
const newAgentConfig = {
|
|
240
|
+
...(providerModelPatch.provider !== undefined ? { provider: providerModelPatch.provider } : {}),
|
|
241
|
+
...(providerModelPatch.model !== undefined ? { model: providerModelPatch.model } : {}),
|
|
242
|
+
...(input.mode !== undefined ? { modeId: input.mode } : {}),
|
|
243
|
+
...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
|
|
244
|
+
};
|
|
245
|
+
return {
|
|
246
|
+
id: input.id,
|
|
247
|
+
...(input.name !== undefined ? { name: input.name } : {}),
|
|
248
|
+
...(input.prompt !== undefined ? { prompt: input.prompt } : {}),
|
|
249
|
+
...(cadence !== undefined ? { cadence } : {}),
|
|
250
|
+
...(input.maxRuns !== undefined ? { maxRuns: input.maxRuns } : {}),
|
|
251
|
+
...(expiresAt !== undefined ? { expiresAt } : {}),
|
|
252
|
+
...(Object.keys(newAgentConfig).length > 0 ? { newAgentConfig } : {}),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function resolveChildAgentCwd(params) {
|
|
256
|
+
const lockedCwd = params.lockedCwd?.trim();
|
|
257
|
+
if (lockedCwd) {
|
|
258
|
+
return expandUserPath(lockedCwd);
|
|
259
|
+
}
|
|
260
|
+
const requestedCwd = params.requestedCwd?.trim();
|
|
261
|
+
if (!requestedCwd || !params.allowCustomCwd) {
|
|
262
|
+
return params.parentCwd;
|
|
263
|
+
}
|
|
264
|
+
return resolvePathFromBase(params.parentCwd, requestedCwd);
|
|
265
|
+
}
|
|
266
|
+
const TerminalSummarySchema = z.object({
|
|
267
|
+
id: z.string(),
|
|
268
|
+
name: z.string(),
|
|
269
|
+
cwd: z.string(),
|
|
270
|
+
});
|
|
271
|
+
function resolveTerminalKeyToken(key, literal) {
|
|
272
|
+
if (literal) {
|
|
273
|
+
return key;
|
|
274
|
+
}
|
|
275
|
+
switch (key) {
|
|
276
|
+
case "Enter":
|
|
277
|
+
return "\r";
|
|
278
|
+
case "Tab":
|
|
279
|
+
return "\t";
|
|
280
|
+
case "Escape":
|
|
281
|
+
return "\u001b";
|
|
282
|
+
case "Space":
|
|
283
|
+
return " ";
|
|
284
|
+
case "BSpace":
|
|
285
|
+
return "\u007f";
|
|
286
|
+
case "C-c":
|
|
287
|
+
return "\u0003";
|
|
288
|
+
case "C-d":
|
|
289
|
+
return "\u0004";
|
|
290
|
+
case "C-z":
|
|
291
|
+
return "\u001a";
|
|
292
|
+
case "C-l":
|
|
293
|
+
return "\u000c";
|
|
294
|
+
case "C-a":
|
|
295
|
+
return "\u0001";
|
|
296
|
+
case "C-e":
|
|
297
|
+
return "\u0005";
|
|
298
|
+
default:
|
|
299
|
+
return key;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
export function createPaseoToolCatalog(options) {
|
|
303
|
+
const { agentManager, agentStorage, terminalManager, workspaceScripts, scheduleService, providerSnapshotManager, daemonConfigStore, callerAgentId, resolveSpeakHandler, resolveCallerContext, logger, } = options;
|
|
304
|
+
const childLogger = logger.child({ module: "agent", component: "paseo-tool-catalog" });
|
|
305
|
+
const callerContext = callerAgentId ? (resolveCallerContext?.(callerAgentId) ?? null) : null;
|
|
306
|
+
const parseToolInput = async (tool, input) => {
|
|
307
|
+
const inputSchema = tool.inputSchema;
|
|
308
|
+
if (!inputSchema) {
|
|
309
|
+
return input;
|
|
310
|
+
}
|
|
311
|
+
const schema = typeof inputSchema === "object" &&
|
|
312
|
+
inputSchema !== null &&
|
|
313
|
+
typeof inputSchema.safeParseAsync === "function"
|
|
314
|
+
? inputSchema
|
|
315
|
+
: z.object(inputSchema).passthrough();
|
|
316
|
+
return schema.parseAsync(input);
|
|
317
|
+
};
|
|
318
|
+
const tools = new Map();
|
|
319
|
+
const registerTool = (name, config,
|
|
320
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Tool handlers are schema-validated at registration boundaries.
|
|
321
|
+
handler) => {
|
|
322
|
+
if (!isPaseoToolEnabled(options.paseoToolPolicy, name)) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
tools.set(name, {
|
|
326
|
+
name,
|
|
327
|
+
title: config.title,
|
|
328
|
+
description: config.description ?? name,
|
|
329
|
+
inputSchema: config.inputSchema,
|
|
330
|
+
outputSchema: config.outputSchema,
|
|
331
|
+
handler: handler,
|
|
332
|
+
});
|
|
333
|
+
};
|
|
334
|
+
const toCatalog = () => ({
|
|
335
|
+
tools,
|
|
336
|
+
getTool(name) {
|
|
337
|
+
return tools.get(name);
|
|
338
|
+
},
|
|
339
|
+
async executeTool(name, input, context = {}) {
|
|
340
|
+
const tool = tools.get(name);
|
|
341
|
+
if (!tool) {
|
|
342
|
+
throw new Error(`Paseo tool not found: ${name}`);
|
|
343
|
+
}
|
|
344
|
+
return tool.handler(await parseToolInput(tool, input), context);
|
|
345
|
+
},
|
|
346
|
+
});
|
|
347
|
+
const buildCronScheduleCadence = (input) => {
|
|
348
|
+
const expression = input.cron?.trim() ?? "";
|
|
349
|
+
if (!expression) {
|
|
350
|
+
throw new Error("cron is required");
|
|
351
|
+
}
|
|
352
|
+
const timezone = normalizeScheduleTimeZoneArg(input.timezone);
|
|
353
|
+
return {
|
|
354
|
+
type: "cron",
|
|
355
|
+
expression,
|
|
356
|
+
...(timezone !== undefined ? { timezone } : {}),
|
|
357
|
+
};
|
|
358
|
+
};
|
|
359
|
+
const buildScheduleExpiry = (expiresIn) => {
|
|
360
|
+
return expiresIn === undefined
|
|
361
|
+
? undefined
|
|
362
|
+
: new Date(Date.now() + parseDurationString(expiresIn)).toISOString();
|
|
363
|
+
};
|
|
364
|
+
const resolveCallerAgent = () => {
|
|
365
|
+
if (!callerAgentId) {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
const parentAgent = agentManager.getAgent(callerAgentId);
|
|
369
|
+
if (!parentAgent) {
|
|
370
|
+
throw new Error(`Parent agent ${callerAgentId} not found`);
|
|
371
|
+
}
|
|
372
|
+
return parentAgent;
|
|
373
|
+
};
|
|
374
|
+
const resolveInheritedProviderConfig = (selectedProvider) => {
|
|
375
|
+
const callerAgent = resolveCallerAgent();
|
|
376
|
+
if (callerAgent?.provider !== selectedProvider || !callerAgent.config?.providerOptions) {
|
|
377
|
+
return undefined;
|
|
378
|
+
}
|
|
379
|
+
return { providerOptions: callerAgent.config.providerOptions };
|
|
380
|
+
};
|
|
381
|
+
const resolveScopedCwd = (requestedCwd, opts) => {
|
|
382
|
+
const callerAgent = resolveCallerAgent();
|
|
383
|
+
if (callerAgent) {
|
|
384
|
+
return resolveChildAgentCwd({
|
|
385
|
+
parentCwd: callerAgent.cwd,
|
|
386
|
+
requestedCwd,
|
|
387
|
+
lockedCwd: callerContext?.lockedCwd,
|
|
388
|
+
allowCustomCwd: callerContext?.allowCustomCwd ?? true,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
const trimmedCwd = requestedCwd?.trim();
|
|
392
|
+
if (!trimmedCwd) {
|
|
393
|
+
if (opts?.required) {
|
|
394
|
+
throw new Error("cwd is required");
|
|
395
|
+
}
|
|
396
|
+
throw new Error("cwd is required outside an agent-scoped session");
|
|
397
|
+
}
|
|
398
|
+
return expandUserPath(trimmedCwd);
|
|
399
|
+
};
|
|
400
|
+
async function resolveTerminalWorkspaceId(resolvedCwd) {
|
|
401
|
+
// An agent-spawned terminal belongs to the caller agent's workspace. Only if
|
|
402
|
+
// the caller has no workspace do we mint one for the cwd.
|
|
403
|
+
const callerAgent = callerAgentId ? agentManager.getAgent(callerAgentId) : null;
|
|
404
|
+
if (callerAgent?.workspaceId) {
|
|
405
|
+
return callerAgent.workspaceId;
|
|
406
|
+
}
|
|
407
|
+
if (!options.ensureWorkspaceForCreate) {
|
|
408
|
+
throw new Error(callerAgentId
|
|
409
|
+
? `Caller agent ${callerAgentId} has no workspace and workspace minting is not configured`
|
|
410
|
+
: "workspaceId is required outside an agent-scoped session");
|
|
411
|
+
}
|
|
412
|
+
return options.ensureWorkspaceForCreate(resolvedCwd);
|
|
413
|
+
}
|
|
414
|
+
function resolveWorkspaceIdForRename(requestedWorkspaceId) {
|
|
415
|
+
const explicitWorkspaceId = requestedWorkspaceId?.trim();
|
|
416
|
+
if (explicitWorkspaceId) {
|
|
417
|
+
return explicitWorkspaceId;
|
|
418
|
+
}
|
|
419
|
+
if (callerAgentId) {
|
|
420
|
+
const callerAgent = resolveCallerAgent();
|
|
421
|
+
if (!callerAgent?.workspaceId) {
|
|
422
|
+
throw new Error(`Caller agent ${callerAgentId} has no current workspace`);
|
|
423
|
+
}
|
|
424
|
+
return callerAgent.workspaceId;
|
|
425
|
+
}
|
|
426
|
+
throw new Error("workspaceId is required outside an agent-scoped session");
|
|
427
|
+
}
|
|
428
|
+
const buildCallerAgentScheduleConfigExtras = (callerAgent, resolvedProvider) => {
|
|
429
|
+
return {
|
|
430
|
+
...(callerAgent.config.thinkingOptionId
|
|
431
|
+
? { thinkingOptionId: callerAgent.config.thinkingOptionId }
|
|
432
|
+
: {}),
|
|
433
|
+
...(callerAgent.provider === resolvedProvider && callerAgent.config.providerOptions
|
|
434
|
+
? { providerOptions: callerAgent.config.providerOptions }
|
|
435
|
+
: {}),
|
|
436
|
+
...(callerAgent.config.featureValues
|
|
437
|
+
? { featureValues: callerAgent.config.featureValues }
|
|
438
|
+
: {}),
|
|
439
|
+
...(callerAgent.config.systemPrompt ? { systemPrompt: callerAgent.config.systemPrompt } : {}),
|
|
440
|
+
...(callerAgent.config.mcpServers ? { mcpServers: callerAgent.config.mcpServers } : {}),
|
|
441
|
+
};
|
|
442
|
+
};
|
|
443
|
+
const buildCallerAgentScheduleConfig = (callerAgent, params) => {
|
|
444
|
+
const hasProviderOverride = params?.provider !== undefined;
|
|
445
|
+
const resolvedProviderModel = hasProviderOverride
|
|
446
|
+
? resolveScheduleProviderAndModel({
|
|
447
|
+
provider: params?.provider,
|
|
448
|
+
defaultProvider: callerAgent.provider,
|
|
449
|
+
})
|
|
450
|
+
: null;
|
|
451
|
+
const resolvedProvider = resolvedProviderModel?.provider ?? callerAgent.provider;
|
|
452
|
+
let resolvedModel;
|
|
453
|
+
if (resolvedProviderModel?.model) {
|
|
454
|
+
resolvedModel = resolvedProviderModel.model;
|
|
455
|
+
}
|
|
456
|
+
else if (!hasProviderOverride && callerAgent.config.model) {
|
|
457
|
+
resolvedModel = callerAgent.config.model;
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
provider: resolvedProvider,
|
|
461
|
+
cwd: params?.cwd?.trim() ? expandUserPath(params.cwd) : callerAgent.cwd,
|
|
462
|
+
...(callerAgent.currentModeId && callerAgent.provider === resolvedProvider
|
|
463
|
+
? {
|
|
464
|
+
modeId: callerAgent.currentModeId,
|
|
465
|
+
}
|
|
466
|
+
: {}),
|
|
467
|
+
...(resolvedModel ? { model: resolvedModel } : {}),
|
|
468
|
+
...buildCallerAgentScheduleConfigExtras(callerAgent, resolvedProvider),
|
|
469
|
+
};
|
|
470
|
+
};
|
|
471
|
+
const resolveNewAgentScheduleTarget = (params) => {
|
|
472
|
+
const callerAgent = resolveCallerAgent();
|
|
473
|
+
if (callerAgent) {
|
|
474
|
+
return {
|
|
475
|
+
type: "new-agent",
|
|
476
|
+
config: {
|
|
477
|
+
...buildCallerAgentScheduleConfig(callerAgent, params),
|
|
478
|
+
...(params?.isolation ? { isolation: params.isolation } : {}),
|
|
479
|
+
},
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
if (!params?.provider?.trim()) {
|
|
483
|
+
throw new Error("provider is required when target is new-agent");
|
|
484
|
+
}
|
|
485
|
+
const resolvedProviderModel = resolveScheduleProviderAndModel({
|
|
486
|
+
provider: params?.provider,
|
|
487
|
+
defaultProvider: params.provider,
|
|
488
|
+
});
|
|
489
|
+
return {
|
|
490
|
+
type: "new-agent",
|
|
491
|
+
config: {
|
|
492
|
+
provider: resolvedProviderModel.provider,
|
|
493
|
+
cwd: params?.cwd?.trim() ? expandUserPath(params.cwd) : process.cwd(),
|
|
494
|
+
...(resolvedProviderModel.model ? { model: resolvedProviderModel.model } : {}),
|
|
495
|
+
...(params?.isolation ? { isolation: params.isolation } : {}),
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
};
|
|
499
|
+
async function requireScheduleTarget(id, type) {
|
|
500
|
+
if (!scheduleService) {
|
|
501
|
+
throw new Error("Schedule service is not configured");
|
|
502
|
+
}
|
|
503
|
+
const schedule = await scheduleService.inspect(id);
|
|
504
|
+
if (schedule.target.type !== type) {
|
|
505
|
+
throw new Error(type === "agent" ? `Heartbeat not found: ${id}` : `Schedule not found: ${id}`);
|
|
506
|
+
}
|
|
507
|
+
return schedule;
|
|
508
|
+
}
|
|
509
|
+
async function requireCallerHeartbeat(id) {
|
|
510
|
+
if (!callerAgentId) {
|
|
511
|
+
throw new Error("Heartbeat operations require an agent-scoped session");
|
|
512
|
+
}
|
|
513
|
+
const schedule = await requireScheduleTarget(id, "agent");
|
|
514
|
+
if (schedule.target.type !== "agent" || schedule.target.agentId !== callerAgentId) {
|
|
515
|
+
throw new Error(`Heartbeat ${id} does not belong to caller ${callerAgentId}`);
|
|
516
|
+
}
|
|
517
|
+
return schedule;
|
|
518
|
+
}
|
|
519
|
+
const ProviderModelInputSchema = AgentProviderEnum.trim()
|
|
520
|
+
.refine((value) => value.includes("/"), {
|
|
521
|
+
message: "provider must be provider/model, for example codex/gpt-5.4",
|
|
522
|
+
})
|
|
523
|
+
.refine((value) => {
|
|
524
|
+
try {
|
|
525
|
+
resolveRequiredProviderModel(value);
|
|
526
|
+
return true;
|
|
527
|
+
}
|
|
528
|
+
catch {
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
}, { message: "provider must be provider/model, for example codex/gpt-5.4" });
|
|
532
|
+
const ProviderOrProviderModelInputSchema = AgentProviderEnum.trim()
|
|
533
|
+
.min(1, "provider is required")
|
|
534
|
+
.refine((value) => {
|
|
535
|
+
if (!value.includes("/")) {
|
|
536
|
+
return true;
|
|
537
|
+
}
|
|
538
|
+
try {
|
|
539
|
+
resolveRequiredProviderModel(value);
|
|
540
|
+
return true;
|
|
541
|
+
}
|
|
542
|
+
catch {
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
}, { message: "provider must be provider or provider/model, for example codex/gpt-5.4" });
|
|
546
|
+
const CreateAgentSettingsInputSchema = z
|
|
547
|
+
.object({
|
|
548
|
+
modeId: z.string().optional().describe("Session mode to configure before the first run."),
|
|
549
|
+
thinkingOptionId: z.string().optional().describe("Thinking option ID."),
|
|
550
|
+
features: z
|
|
551
|
+
.record(z.string(), z.unknown())
|
|
552
|
+
.optional()
|
|
553
|
+
.describe("Provider-specific feature values, for example { fast_mode: true } for Codex."),
|
|
554
|
+
})
|
|
555
|
+
.strict();
|
|
556
|
+
const UpdateAgentSettingsInputSchema = z
|
|
557
|
+
.object({
|
|
558
|
+
modeId: z.string().optional().describe("Session mode ID."),
|
|
559
|
+
model: z.string().nullable().optional().describe("Model ID. Pass null to clear."),
|
|
560
|
+
thinkingOptionId: z
|
|
561
|
+
.string()
|
|
562
|
+
.nullable()
|
|
563
|
+
.optional()
|
|
564
|
+
.describe("Thinking option ID. Pass null to clear."),
|
|
565
|
+
features: z
|
|
566
|
+
.record(z.string(), z.unknown())
|
|
567
|
+
.optional()
|
|
568
|
+
.describe("Provider-specific feature values, for example { fast_mode: true } for Codex."),
|
|
569
|
+
})
|
|
570
|
+
.strict();
|
|
571
|
+
const InspectProviderSettingsInputSchema = z
|
|
572
|
+
.object({
|
|
573
|
+
modeId: z.string().optional().describe("Draft session mode ID."),
|
|
574
|
+
model: z.string().optional().describe("Draft model ID."),
|
|
575
|
+
thinkingOptionId: z.string().optional().describe("Draft thinking option ID."),
|
|
576
|
+
features: z
|
|
577
|
+
.record(z.string(), z.unknown())
|
|
578
|
+
.optional()
|
|
579
|
+
.describe("Draft provider feature values."),
|
|
580
|
+
})
|
|
581
|
+
.strict();
|
|
582
|
+
const AgentRelationshipInputSchema = z.discriminatedUnion("kind", [
|
|
583
|
+
z
|
|
584
|
+
.object({ kind: z.literal("subagent") })
|
|
585
|
+
.strict()
|
|
586
|
+
.describe("Create a child agent under this agent's subagent track."),
|
|
587
|
+
z
|
|
588
|
+
.object({ kind: z.literal("detached") })
|
|
589
|
+
.strict()
|
|
590
|
+
.describe("Create a root agent that does not appear in this agent's subagent track."),
|
|
591
|
+
]);
|
|
592
|
+
const AgentCreateWorktreeTargetInputSchema = z.discriminatedUnion("kind", [
|
|
593
|
+
z
|
|
594
|
+
.object({
|
|
595
|
+
kind: z.literal("branch-off"),
|
|
596
|
+
worktreeSlug: z
|
|
597
|
+
.string()
|
|
598
|
+
.min(1)
|
|
599
|
+
.optional()
|
|
600
|
+
.describe("Optional worktree slug/path label. Omit to let Paseo generate one."),
|
|
601
|
+
branchName: z
|
|
602
|
+
.string()
|
|
603
|
+
.min(1)
|
|
604
|
+
.optional()
|
|
605
|
+
.describe("Optional git branch name. Defaults to the worktree slug."),
|
|
606
|
+
baseBranch: z
|
|
607
|
+
.string()
|
|
608
|
+
.min(1)
|
|
609
|
+
.optional()
|
|
610
|
+
.describe("Optional base branch. Defaults to the repository default branch."),
|
|
611
|
+
})
|
|
612
|
+
.strict()
|
|
613
|
+
.describe("Create a new branch in a new Paseo worktree."),
|
|
614
|
+
z
|
|
615
|
+
.object({
|
|
616
|
+
kind: z.literal("checkout-branch"),
|
|
617
|
+
branch: z.string().min(1).describe("Existing branch to check out."),
|
|
618
|
+
})
|
|
619
|
+
.strict()
|
|
620
|
+
.describe("Check out an existing branch in a new Paseo worktree."),
|
|
621
|
+
z
|
|
622
|
+
.object({
|
|
623
|
+
kind: z.literal("checkout-pr"),
|
|
624
|
+
githubPrNumber: z.number().int().positive().describe("GitHub pull request number."),
|
|
625
|
+
})
|
|
626
|
+
.strict()
|
|
627
|
+
.describe("Check out a GitHub pull request in a new Paseo worktree."),
|
|
628
|
+
]);
|
|
629
|
+
const AgentWorkspaceInputSchema = z.discriminatedUnion("kind", [
|
|
630
|
+
z
|
|
631
|
+
.object({
|
|
632
|
+
kind: z.literal("current"),
|
|
633
|
+
cwd: z.string().optional().describe("Optional runtime cwd. Defaults to the caller's cwd."),
|
|
634
|
+
})
|
|
635
|
+
.strict()
|
|
636
|
+
.describe("Use the caller's current workspace."),
|
|
637
|
+
z
|
|
638
|
+
.object({
|
|
639
|
+
kind: z.literal("existing"),
|
|
640
|
+
workspaceId: z.string().min(1).describe("Existing workspace id to attach the agent to."),
|
|
641
|
+
cwd: z
|
|
642
|
+
.string()
|
|
643
|
+
.optional()
|
|
644
|
+
.describe("Optional runtime cwd. Defaults to the existing workspace cwd."),
|
|
645
|
+
})
|
|
646
|
+
.strict()
|
|
647
|
+
.describe("Attach the agent to an existing workspace."),
|
|
648
|
+
z
|
|
649
|
+
.object({
|
|
650
|
+
kind: z.literal("create"),
|
|
651
|
+
source: z.discriminatedUnion("kind", [
|
|
652
|
+
z
|
|
653
|
+
.object({
|
|
654
|
+
kind: z.literal("directory"),
|
|
655
|
+
path: z
|
|
656
|
+
.string()
|
|
657
|
+
.optional()
|
|
658
|
+
.describe("Optional directory path. Defaults to the caller's cwd."),
|
|
659
|
+
})
|
|
660
|
+
.strict(),
|
|
661
|
+
z
|
|
662
|
+
.object({
|
|
663
|
+
kind: z.literal("worktree"),
|
|
664
|
+
cwd: z
|
|
665
|
+
.string()
|
|
666
|
+
.optional()
|
|
667
|
+
.describe("Optional source repository. Defaults to the caller's cwd."),
|
|
668
|
+
target: AgentCreateWorktreeTargetInputSchema,
|
|
669
|
+
})
|
|
670
|
+
.strict(),
|
|
671
|
+
]),
|
|
672
|
+
})
|
|
673
|
+
.strict()
|
|
674
|
+
.describe("Create a new workspace for the agent."),
|
|
675
|
+
]);
|
|
676
|
+
const commonCreateAgentFields = {
|
|
677
|
+
title: z
|
|
678
|
+
.string()
|
|
679
|
+
.trim()
|
|
680
|
+
.min(1, "Title is required")
|
|
681
|
+
.max(60, "Title must be 60 characters or fewer")
|
|
682
|
+
.describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
|
|
683
|
+
provider: ProviderModelInputSchema.describe("Required provider/model pair, for example codex/gpt-5.4."),
|
|
684
|
+
labels: z.record(z.string(), z.string()).optional().describe("Labels to set on the agent"),
|
|
685
|
+
settings: CreateAgentSettingsInputSchema.optional().describe("Initial runtime settings for the new agent."),
|
|
686
|
+
initialPrompt: z
|
|
687
|
+
.string()
|
|
688
|
+
.trim()
|
|
689
|
+
.min(1, "initialPrompt is required")
|
|
690
|
+
.describe("Required first task to run immediately after creation."),
|
|
691
|
+
};
|
|
692
|
+
const legacyCreateAgentPlacementFields = {
|
|
693
|
+
relationship: AgentRelationshipInputSchema.describe("Whether the created agent is a subagent under you or a detached root agent."),
|
|
694
|
+
workspace: AgentWorkspaceInputSchema.describe("Workspace ownership/location for the created agent."),
|
|
695
|
+
};
|
|
696
|
+
const canonicalCreateAgentFields = {
|
|
697
|
+
...commonCreateAgentFields,
|
|
698
|
+
workspaceId: z
|
|
699
|
+
.string()
|
|
700
|
+
.min(1)
|
|
701
|
+
.optional()
|
|
702
|
+
.describe("Existing workspace id. Agent-scoped calls default to the caller workspace; top-level calls create a new local workspace when omitted."),
|
|
703
|
+
};
|
|
704
|
+
const agentToAgentInputSchema = {
|
|
705
|
+
...canonicalCreateAgentFields,
|
|
706
|
+
notifyOnFinish: z
|
|
707
|
+
.boolean()
|
|
708
|
+
.optional()
|
|
709
|
+
.default(true)
|
|
710
|
+
.describe("Get notified when the created agent finishes, errors, or needs permission. Set false only for truly fire-and-forget agents."),
|
|
711
|
+
};
|
|
712
|
+
const canonicalTopLevelInputSchema = {
|
|
713
|
+
...canonicalCreateAgentFields,
|
|
714
|
+
background: z
|
|
715
|
+
.boolean()
|
|
716
|
+
.optional()
|
|
717
|
+
.default(false)
|
|
718
|
+
.describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
|
|
719
|
+
notifyOnFinish: z
|
|
720
|
+
.boolean()
|
|
721
|
+
.optional()
|
|
722
|
+
.default(false)
|
|
723
|
+
.describe("Agent-scoped only: get notified when the created agent finishes, errors, or needs permission."),
|
|
724
|
+
};
|
|
725
|
+
const legacyAgentToAgentInputSchema = {
|
|
726
|
+
...commonCreateAgentFields,
|
|
727
|
+
...legacyCreateAgentPlacementFields,
|
|
728
|
+
notifyOnFinish: agentToAgentInputSchema.notifyOnFinish,
|
|
729
|
+
};
|
|
730
|
+
const legacyTopLevelCreateAgentInputSchema = {
|
|
731
|
+
...commonCreateAgentFields,
|
|
732
|
+
relationship: legacyCreateAgentPlacementFields.relationship.optional(),
|
|
733
|
+
workspace: legacyCreateAgentPlacementFields.workspace.optional(),
|
|
734
|
+
background: canonicalTopLevelInputSchema.background,
|
|
735
|
+
notifyOnFinish: canonicalTopLevelInputSchema.notifyOnFinish,
|
|
736
|
+
cwd: z
|
|
737
|
+
.string()
|
|
738
|
+
.optional()
|
|
739
|
+
.describe("Legacy top-level working directory. Prefer workspace.source.path."),
|
|
740
|
+
mode: z.string().optional().describe("Legacy session mode ID. Prefer settings.modeId."),
|
|
741
|
+
thinking: z
|
|
742
|
+
.string()
|
|
743
|
+
.optional()
|
|
744
|
+
.describe("Legacy thinking option ID. Prefer settings.thinkingOptionId."),
|
|
745
|
+
features: z
|
|
746
|
+
.record(z.string(), z.unknown())
|
|
747
|
+
.optional()
|
|
748
|
+
.describe("Legacy feature values. Prefer settings.features."),
|
|
749
|
+
worktreeName: z
|
|
750
|
+
.string()
|
|
751
|
+
.min(1)
|
|
752
|
+
.optional()
|
|
753
|
+
.describe("Legacy worktree slug. Prefer workspace.source.target.worktreeSlug."),
|
|
754
|
+
branchName: z
|
|
755
|
+
.string()
|
|
756
|
+
.min(1)
|
|
757
|
+
.optional()
|
|
758
|
+
.describe("Legacy branch name. Prefer workspace.source.target.branchName."),
|
|
759
|
+
baseBranch: z
|
|
760
|
+
.string()
|
|
761
|
+
.min(1)
|
|
762
|
+
.optional()
|
|
763
|
+
.describe("Legacy base branch. Prefer workspace.source.target.baseBranch."),
|
|
764
|
+
refName: z
|
|
765
|
+
.string()
|
|
766
|
+
.min(1)
|
|
767
|
+
.optional()
|
|
768
|
+
.describe("Legacy branch/ref to check out. Prefer workspace.source.target.branch."),
|
|
769
|
+
githubPrNumber: z
|
|
770
|
+
.number()
|
|
771
|
+
.int()
|
|
772
|
+
.positive()
|
|
773
|
+
.optional()
|
|
774
|
+
.describe("Legacy GitHub PR number. Prefer workspace.source.target.githubPrNumber."),
|
|
775
|
+
};
|
|
776
|
+
const createAgentInputSchema = z
|
|
777
|
+
.object(callerAgentId ? agentToAgentInputSchema : canonicalTopLevelInputSchema)
|
|
778
|
+
.passthrough();
|
|
779
|
+
const agentToAgentCreateAgentArgsSchema = z.object(agentToAgentInputSchema).strict();
|
|
780
|
+
const legacyAgentToAgentCreateAgentArgsSchema = z.object(legacyAgentToAgentInputSchema).strict();
|
|
781
|
+
const canonicalTopLevelCreateAgentArgsSchema = z.object(canonicalTopLevelInputSchema).strict();
|
|
782
|
+
const legacyTopLevelCreateAgentArgsSchema = z
|
|
783
|
+
.object(legacyTopLevelCreateAgentInputSchema)
|
|
784
|
+
.strict();
|
|
785
|
+
const commonSendAgentPromptInputSchema = {
|
|
786
|
+
agentId: z.string(),
|
|
787
|
+
prompt: z.string(),
|
|
788
|
+
sessionMode: z.string().optional().describe("Optional mode to set before running the prompt."),
|
|
789
|
+
};
|
|
790
|
+
const agentToAgentSendAgentPromptInputSchema = {
|
|
791
|
+
...commonSendAgentPromptInputSchema,
|
|
792
|
+
background: z
|
|
793
|
+
.boolean()
|
|
794
|
+
.optional()
|
|
795
|
+
.default(true)
|
|
796
|
+
.describe("Run agent in background. Agent-scoped default is true so you can continue until the finish notification arrives. Set false only when you need a blocking response."),
|
|
797
|
+
notifyOnFinish: z
|
|
798
|
+
.boolean()
|
|
799
|
+
.optional()
|
|
800
|
+
.default(true)
|
|
801
|
+
.describe("Get notified when the prompted agent finishes, errors, or needs permission. Set false only for truly fire-and-forget prompts."),
|
|
802
|
+
};
|
|
803
|
+
const topLevelSendAgentPromptInputSchema = {
|
|
804
|
+
...commonSendAgentPromptInputSchema,
|
|
805
|
+
background: z
|
|
806
|
+
.boolean()
|
|
807
|
+
.optional()
|
|
808
|
+
.default(false)
|
|
809
|
+
.describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
|
|
810
|
+
notifyOnFinish: z
|
|
811
|
+
.boolean()
|
|
812
|
+
.optional()
|
|
813
|
+
.default(false)
|
|
814
|
+
.describe("Agent-scoped only: get notified when the prompted agent finishes, errors, or needs permission."),
|
|
815
|
+
};
|
|
816
|
+
const sendAgentPromptInputSchema = callerAgentId
|
|
817
|
+
? agentToAgentSendAgentPromptInputSchema
|
|
818
|
+
: topLevelSendAgentPromptInputSchema;
|
|
819
|
+
const inspectProviderInputSchema = {
|
|
820
|
+
provider: ProviderOrProviderModelInputSchema.describe("Provider ID, optionally with a model ID (for example codex or codex/gpt-5.4)."),
|
|
821
|
+
cwd: z
|
|
822
|
+
.string()
|
|
823
|
+
.optional()
|
|
824
|
+
.describe("Working directory used to resolve provider feature availability."),
|
|
825
|
+
settings: InspectProviderSettingsInputSchema.optional().describe("Draft provider settings used to compute available features."),
|
|
826
|
+
};
|
|
827
|
+
if (options.voiceOnly || options.enableVoiceTools || callerContext?.enableVoiceTools) {
|
|
828
|
+
registerTool("speak", {
|
|
829
|
+
title: "Speak",
|
|
830
|
+
description: "Speak text to the user via daemon-managed voice output. Blocks until playback completes.",
|
|
831
|
+
inputSchema: {
|
|
832
|
+
text: z
|
|
833
|
+
.string()
|
|
834
|
+
.trim()
|
|
835
|
+
.min(1, "text is required")
|
|
836
|
+
.max(4000, "text must be 4000 characters or fewer"),
|
|
837
|
+
},
|
|
838
|
+
outputSchema: {
|
|
839
|
+
ok: z.boolean(),
|
|
840
|
+
},
|
|
841
|
+
}, async (args, context) => {
|
|
842
|
+
if (!callerAgentId) {
|
|
843
|
+
throw new Error("speak is only available to agent-scoped tool sessions");
|
|
844
|
+
}
|
|
845
|
+
const handler = resolveSpeakHandler?.(callerAgentId) ?? null;
|
|
846
|
+
if (!handler) {
|
|
847
|
+
throw new Error(`No speak handler registered for your session '${callerAgentId}'`);
|
|
848
|
+
}
|
|
849
|
+
await handler({
|
|
850
|
+
text: args.text,
|
|
851
|
+
callerAgentId,
|
|
852
|
+
signal: context?.signal,
|
|
853
|
+
});
|
|
854
|
+
return {
|
|
855
|
+
content: [],
|
|
856
|
+
structuredContent: ensureValidJson({ ok: true }),
|
|
857
|
+
};
|
|
858
|
+
});
|
|
859
|
+
}
|
|
860
|
+
if (options.voiceOnly) {
|
|
861
|
+
return toCatalog();
|
|
862
|
+
}
|
|
863
|
+
if (options.browserToolsEnabled && options.browserToolsBroker) {
|
|
864
|
+
registerBrowserTools({
|
|
865
|
+
registerTool,
|
|
866
|
+
broker: options.browserToolsBroker,
|
|
867
|
+
callerAgentId,
|
|
868
|
+
resolveCallerAgent,
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
registerTool("create_workspace", {
|
|
872
|
+
title: "Create workspace",
|
|
873
|
+
description: "Create a workspace using an existing local checkout or a new Paseo-managed worktree.",
|
|
874
|
+
inputSchema: {
|
|
875
|
+
isolation: z.enum(["local", "worktree"]),
|
|
876
|
+
path: z
|
|
877
|
+
.string()
|
|
878
|
+
.optional()
|
|
879
|
+
.describe("Local directory or source checkout. Defaults to your current workspace."),
|
|
880
|
+
projectId: z.string().optional().describe("Existing project id to own the workspace."),
|
|
881
|
+
title: z.string().trim().min(1).optional(),
|
|
882
|
+
mode: z
|
|
883
|
+
.enum(["branch-off", "checkout-branch", "checkout-pr"])
|
|
884
|
+
.optional()
|
|
885
|
+
.describe("Worktree creation mode. Defaults to branch-off."),
|
|
886
|
+
worktreeSlug: z.string().trim().min(1).optional(),
|
|
887
|
+
branchName: z
|
|
888
|
+
.string()
|
|
889
|
+
.trim()
|
|
890
|
+
.min(1)
|
|
891
|
+
.optional()
|
|
892
|
+
.describe("New branch name for branch-off mode."),
|
|
893
|
+
baseBranch: z.string().trim().min(1).optional().describe("Base ref for branch-off mode."),
|
|
894
|
+
branch: z
|
|
895
|
+
.string()
|
|
896
|
+
.trim()
|
|
897
|
+
.min(1)
|
|
898
|
+
.optional()
|
|
899
|
+
.describe("Existing branch for checkout-branch mode."),
|
|
900
|
+
prNumber: z
|
|
901
|
+
.number()
|
|
902
|
+
.int()
|
|
903
|
+
.positive()
|
|
904
|
+
.optional()
|
|
905
|
+
.describe("Pull request or change request number for checkout-pr mode."),
|
|
906
|
+
forge: z
|
|
907
|
+
.string()
|
|
908
|
+
.trim()
|
|
909
|
+
.min(1)
|
|
910
|
+
.optional()
|
|
911
|
+
.describe("Forge for checkout-pr mode. Defaults to the source checkout."),
|
|
912
|
+
},
|
|
913
|
+
outputSchema: WorkspaceAutomationSummarySchema.shape,
|
|
914
|
+
}, async ({ isolation, path, projectId, title, mode, worktreeSlug, branchName, baseBranch, branch, prNumber, forge, }) => {
|
|
915
|
+
let workspace;
|
|
916
|
+
if (isolation === "local") {
|
|
917
|
+
const cwd = resolveScopedCwd(path, { required: true });
|
|
918
|
+
assertOptionsAbsent([
|
|
919
|
+
["mode", mode],
|
|
920
|
+
["worktreeSlug", worktreeSlug],
|
|
921
|
+
["branchName", branchName],
|
|
922
|
+
["baseBranch", baseBranch],
|
|
923
|
+
["branch", branch],
|
|
924
|
+
["prNumber", prNumber],
|
|
925
|
+
["forge", forge],
|
|
926
|
+
], "Worktree options require isolation worktree");
|
|
927
|
+
if (!options.createDirectoryWorkspace) {
|
|
928
|
+
throw new Error("Workspace provisioning is not configured");
|
|
929
|
+
}
|
|
930
|
+
workspace = await options.createDirectoryWorkspace(cwd, title, projectId);
|
|
931
|
+
}
|
|
932
|
+
else {
|
|
933
|
+
let cwd = path !== undefined || !projectId ? resolveScopedCwd(path, { required: true }) : null;
|
|
934
|
+
if (!cwd) {
|
|
935
|
+
if (!options.projectRegistry) {
|
|
936
|
+
throw new Error("Project registry is not configured");
|
|
937
|
+
}
|
|
938
|
+
cwd = await resolveWorktreeSourceCwd({ projectId }, options.projectRegistry);
|
|
939
|
+
}
|
|
940
|
+
const worktreeTarget = resolveWorkspaceWorktreeTarget({
|
|
941
|
+
mode,
|
|
942
|
+
worktreeSlug,
|
|
943
|
+
branchName,
|
|
944
|
+
baseBranch,
|
|
945
|
+
branch,
|
|
946
|
+
prNumber,
|
|
947
|
+
forge,
|
|
948
|
+
});
|
|
949
|
+
const result = await createPaseoWorktreeCommand({
|
|
950
|
+
paseoHome: options.paseoHome,
|
|
951
|
+
worktreesRoot: options.worktreesRoot,
|
|
952
|
+
createPaseoWorktreeWorkflow: options.createPaseoWorktree,
|
|
953
|
+
}, {
|
|
954
|
+
cwd,
|
|
955
|
+
...(projectId ? { projectId } : {}),
|
|
956
|
+
...(worktreeSlug ? { worktreeSlug } : {}),
|
|
957
|
+
...worktreeTarget,
|
|
958
|
+
...(title ? { title } : {}),
|
|
959
|
+
});
|
|
960
|
+
if (!result.ok) {
|
|
961
|
+
throw result.cause;
|
|
962
|
+
}
|
|
963
|
+
workspace = result.createdWorktree.workspace;
|
|
964
|
+
}
|
|
965
|
+
return {
|
|
966
|
+
content: [],
|
|
967
|
+
structuredContent: ensureValidJson(toWorkspaceAutomationSummary(workspace)),
|
|
968
|
+
};
|
|
969
|
+
});
|
|
970
|
+
registerTool("list_workspaces", {
|
|
971
|
+
title: "List workspaces",
|
|
972
|
+
description: "List active workspaces.",
|
|
973
|
+
inputSchema: {},
|
|
974
|
+
outputSchema: { workspaces: z.array(WorkspaceAutomationSummarySchema) },
|
|
975
|
+
}, async () => {
|
|
976
|
+
if (!options.workspaceRegistry) {
|
|
977
|
+
throw new Error("Workspace registry is not configured");
|
|
978
|
+
}
|
|
979
|
+
const workspaces = (await options.workspaceRegistry.list())
|
|
980
|
+
.filter((workspace) => !workspace.archivedAt)
|
|
981
|
+
.map(toWorkspaceAutomationSummary);
|
|
982
|
+
return {
|
|
983
|
+
content: [],
|
|
984
|
+
structuredContent: ensureValidJson({ workspaces }),
|
|
985
|
+
};
|
|
986
|
+
});
|
|
987
|
+
registerTool("archive_workspace", {
|
|
988
|
+
title: "Archive workspace",
|
|
989
|
+
description: "Archive a workspace and everything it owns.",
|
|
990
|
+
inputSchema: { workspaceId: z.string().min(1) },
|
|
991
|
+
outputSchema: {
|
|
992
|
+
workspaceId: z.string(),
|
|
993
|
+
archivedAgentIds: z.array(z.string()),
|
|
994
|
+
removedDirectory: z.boolean(),
|
|
995
|
+
},
|
|
996
|
+
}, async ({ workspaceId }) => {
|
|
997
|
+
if (!options.listActiveWorkspaces) {
|
|
998
|
+
throw new Error("Active workspace lister is required to archive workspaces");
|
|
999
|
+
}
|
|
1000
|
+
const workspace = await requireActiveWorkspaceForArchive({ listActiveWorkspaces: options.listActiveWorkspaces }, workspaceId);
|
|
1001
|
+
const result = await archiveByScope(archiveWorktreeDependencies(options, {
|
|
1002
|
+
agentManager,
|
|
1003
|
+
agentStorage,
|
|
1004
|
+
terminalManager: terminalManager ?? null,
|
|
1005
|
+
logger: childLogger,
|
|
1006
|
+
}), {
|
|
1007
|
+
requestId: "mcp:archive_workspace",
|
|
1008
|
+
scope: { kind: "workspace", workspaceId: workspace.workspaceId },
|
|
1009
|
+
});
|
|
1010
|
+
return {
|
|
1011
|
+
content: [],
|
|
1012
|
+
structuredContent: ensureValidJson({
|
|
1013
|
+
workspaceId,
|
|
1014
|
+
archivedAgentIds: result.archivedAgentIds,
|
|
1015
|
+
removedDirectory: result.removedDirectory,
|
|
1016
|
+
}),
|
|
1017
|
+
};
|
|
1018
|
+
});
|
|
1019
|
+
registerTool("create_agent", {
|
|
1020
|
+
title: "Create agent",
|
|
1021
|
+
description: "Create an agent. Agent-scoped creation defaults to your workspace and creates your subagent. Top-level creation without workspaceId creates a new local workspace. Requires provider/model (for example codex/gpt-5.4) and an initial prompt. Do not guess; call list_providers and list_models first if uncertain.",
|
|
1022
|
+
inputSchema: createAgentInputSchema,
|
|
1023
|
+
outputSchema: {
|
|
1024
|
+
agentId: z.string(),
|
|
1025
|
+
type: AgentProviderEnum,
|
|
1026
|
+
status: AgentStatusEnum,
|
|
1027
|
+
cwd: z.string(),
|
|
1028
|
+
workspaceId: z.string().optional(),
|
|
1029
|
+
currentModeId: z.string().nullable(),
|
|
1030
|
+
availableModes: z.array(ProviderModeSchema),
|
|
1031
|
+
lastMessage: z.string().nullable().optional(),
|
|
1032
|
+
permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
|
|
1033
|
+
guidance: z.string().optional(),
|
|
1034
|
+
},
|
|
1035
|
+
}, async (args) => {
|
|
1036
|
+
const resolvedArgs = await resolveCreateAgentToolArgs(args);
|
|
1037
|
+
const { parsedArgs, worktree } = resolvedArgs;
|
|
1038
|
+
let requestedBackground;
|
|
1039
|
+
let notifyOnFinish;
|
|
1040
|
+
if (resolvedArgs.kind === "agent-scoped") {
|
|
1041
|
+
requestedBackground = true;
|
|
1042
|
+
notifyOnFinish = parsedArgs.notifyOnFinish;
|
|
1043
|
+
}
|
|
1044
|
+
else {
|
|
1045
|
+
requestedBackground = resolvedArgs.parsedArgs.background;
|
|
1046
|
+
notifyOnFinish = resolvedArgs.parsedArgs.notifyOnFinish ?? false;
|
|
1047
|
+
}
|
|
1048
|
+
const selectedProvider = resolveRequiredProviderModel(parsedArgs.provider).provider;
|
|
1049
|
+
const inheritedConfig = resolveInheritedProviderConfig(selectedProvider);
|
|
1050
|
+
const { snapshot, background: createdInBackground, initialPromptStarted, } = await createAgentCommand({
|
|
1051
|
+
agentManager,
|
|
1052
|
+
agentStorage,
|
|
1053
|
+
logger: childLogger,
|
|
1054
|
+
paseoHome: options.paseoHome,
|
|
1055
|
+
worktreesRoot: options.worktreesRoot,
|
|
1056
|
+
terminalManager,
|
|
1057
|
+
providerSnapshotManager,
|
|
1058
|
+
createPaseoWorktree: options.createPaseoWorktree,
|
|
1059
|
+
...(options.ensureWorkspaceForCreate
|
|
1060
|
+
? { ensureWorkspaceForCreate: options.ensureWorkspaceForCreate }
|
|
1061
|
+
: {}),
|
|
1062
|
+
}, {
|
|
1063
|
+
kind: "mcp",
|
|
1064
|
+
provider: parsedArgs.provider,
|
|
1065
|
+
title: parsedArgs.title,
|
|
1066
|
+
initialPrompt: parsedArgs.initialPrompt,
|
|
1067
|
+
config: inheritedConfig,
|
|
1068
|
+
cwd: resolvedArgs.cwd,
|
|
1069
|
+
workspaceId: resolvedArgs.workspaceId,
|
|
1070
|
+
thinking: parsedArgs.settings?.thinkingOptionId,
|
|
1071
|
+
features: parsedArgs.settings?.features,
|
|
1072
|
+
labels: parsedArgs.labels,
|
|
1073
|
+
mode: parsedArgs.settings?.modeId,
|
|
1074
|
+
background: requestedBackground,
|
|
1075
|
+
notifyOnFinish,
|
|
1076
|
+
detached: resolvedArgs.detached,
|
|
1077
|
+
callerAgentId,
|
|
1078
|
+
callerContext,
|
|
1079
|
+
worktree,
|
|
1080
|
+
});
|
|
1081
|
+
try {
|
|
1082
|
+
if (!createdInBackground && initialPromptStarted) {
|
|
1083
|
+
const result = await waitForAgentWithTimeout(agentManager, snapshot.id, {
|
|
1084
|
+
waitForActive: true,
|
|
1085
|
+
});
|
|
1086
|
+
const liveSnapshot = agentManager.getAgent(snapshot.id) ?? snapshot;
|
|
1087
|
+
const responseData = {
|
|
1088
|
+
agentId: snapshot.id,
|
|
1089
|
+
type: snapshot.provider,
|
|
1090
|
+
status: result.status,
|
|
1091
|
+
cwd: liveSnapshot.cwd,
|
|
1092
|
+
...(liveSnapshot.workspaceId ? { workspaceId: liveSnapshot.workspaceId } : {}),
|
|
1093
|
+
currentModeId: liveSnapshot.currentModeId,
|
|
1094
|
+
availableModes: liveSnapshot.availableModes,
|
|
1095
|
+
lastMessage: result.lastMessage,
|
|
1096
|
+
permission: sanitizePermissionRequest(result.permission),
|
|
1097
|
+
};
|
|
1098
|
+
const validJson = ensureValidJson(responseData);
|
|
1099
|
+
const response = {
|
|
1100
|
+
content: [],
|
|
1101
|
+
structuredContent: validJson,
|
|
1102
|
+
};
|
|
1103
|
+
return response;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
catch (error) {
|
|
1107
|
+
childLogger.error({ err: error, agentId: snapshot.id }, "Failed to run initial prompt");
|
|
1108
|
+
throw error;
|
|
1109
|
+
}
|
|
1110
|
+
// Return immediately for async creation.
|
|
1111
|
+
const currentSnapshot = agentManager.getAgent(snapshot.id) ?? snapshot;
|
|
1112
|
+
const guidance = callerAgentId && notifyOnFinish && initialPromptStarted
|
|
1113
|
+
? "You will get notified when the created agent finishes, errors, or needs permission. Do not poll for status; continue with other work until the notification arrives."
|
|
1114
|
+
: undefined;
|
|
1115
|
+
const response = {
|
|
1116
|
+
content: [],
|
|
1117
|
+
structuredContent: ensureValidJson({
|
|
1118
|
+
agentId: currentSnapshot.id,
|
|
1119
|
+
type: snapshot.provider,
|
|
1120
|
+
status: currentSnapshot.lifecycle,
|
|
1121
|
+
cwd: currentSnapshot.cwd,
|
|
1122
|
+
...(currentSnapshot.workspaceId ? { workspaceId: currentSnapshot.workspaceId } : {}),
|
|
1123
|
+
currentModeId: currentSnapshot.currentModeId,
|
|
1124
|
+
availableModes: currentSnapshot.availableModes,
|
|
1125
|
+
lastMessage: null,
|
|
1126
|
+
permission: null,
|
|
1127
|
+
...(guidance ? { guidance } : {}),
|
|
1128
|
+
}),
|
|
1129
|
+
};
|
|
1130
|
+
return response;
|
|
1131
|
+
});
|
|
1132
|
+
async function resolveCreateAgentToolArgs(args) {
|
|
1133
|
+
if (callerAgentId) {
|
|
1134
|
+
if (hasLegacyCreateAgentPlacement(args)) {
|
|
1135
|
+
// COMPAT(nestedCreateAgentPlacement): accept the old relationship/workspace shape without
|
|
1136
|
+
// advertising it to models. Added in v0.2.0; remove after 2027-01-17.
|
|
1137
|
+
const parsed = legacyAgentToAgentCreateAgentArgsSchema.parse(args);
|
|
1138
|
+
const { cwd, workspaceId, worktree } = await resolveCreateAgentWorkspace(parsed.workspace, {
|
|
1139
|
+
prompt: parsed.initialPrompt,
|
|
1140
|
+
});
|
|
1141
|
+
return {
|
|
1142
|
+
kind: "agent-scoped",
|
|
1143
|
+
parsedArgs: parsed,
|
|
1144
|
+
detached: parsed.relationship.kind === "detached",
|
|
1145
|
+
cwd,
|
|
1146
|
+
workspaceId,
|
|
1147
|
+
worktree,
|
|
1148
|
+
};
|
|
1149
|
+
}
|
|
1150
|
+
const parsed = agentToAgentCreateAgentArgsSchema.parse(args);
|
|
1151
|
+
const { cwd, workspaceId } = await resolveCanonicalCreateAgentWorkspace(parsed.workspaceId, {
|
|
1152
|
+
prompt: parsed.initialPrompt,
|
|
1153
|
+
});
|
|
1154
|
+
return {
|
|
1155
|
+
kind: "agent-scoped",
|
|
1156
|
+
parsedArgs: parsed,
|
|
1157
|
+
detached: false,
|
|
1158
|
+
cwd,
|
|
1159
|
+
workspaceId,
|
|
1160
|
+
worktree: undefined,
|
|
1161
|
+
};
|
|
1162
|
+
}
|
|
1163
|
+
if (hasLegacyCreateAgentPlacement(args)) {
|
|
1164
|
+
// COMPAT(nestedCreateAgentPlacement): see the agent-scoped branch above.
|
|
1165
|
+
const parsedArgs = normalizeTopLevelCreateAgentArgs(legacyTopLevelCreateAgentArgsSchema.parse(args));
|
|
1166
|
+
if (parsedArgs.relationship?.kind === "subagent") {
|
|
1167
|
+
throw new Error("relationship subagent requires an agent-scoped tool session");
|
|
1168
|
+
}
|
|
1169
|
+
if (!parsedArgs.workspace) {
|
|
1170
|
+
throw new Error("Legacy create_agent placement could not be resolved");
|
|
1171
|
+
}
|
|
1172
|
+
const { cwd, workspaceId, worktree } = await resolveCreateAgentWorkspace(parsedArgs.workspace, { prompt: parsedArgs.initialPrompt });
|
|
1173
|
+
return {
|
|
1174
|
+
kind: "top-level",
|
|
1175
|
+
parsedArgs,
|
|
1176
|
+
detached: true,
|
|
1177
|
+
cwd,
|
|
1178
|
+
workspaceId,
|
|
1179
|
+
worktree,
|
|
1180
|
+
};
|
|
1181
|
+
}
|
|
1182
|
+
const parsedArgs = canonicalTopLevelCreateAgentArgsSchema.parse(args);
|
|
1183
|
+
const { cwd, workspaceId } = await resolveCanonicalCreateAgentWorkspace(parsedArgs.workspaceId, { prompt: parsedArgs.initialPrompt });
|
|
1184
|
+
return {
|
|
1185
|
+
kind: "top-level",
|
|
1186
|
+
parsedArgs,
|
|
1187
|
+
detached: false,
|
|
1188
|
+
cwd,
|
|
1189
|
+
workspaceId,
|
|
1190
|
+
worktree: undefined,
|
|
1191
|
+
};
|
|
1192
|
+
}
|
|
1193
|
+
function hasLegacyCreateAgentPlacement(args) {
|
|
1194
|
+
if (!args || typeof args !== "object") {
|
|
1195
|
+
return false;
|
|
1196
|
+
}
|
|
1197
|
+
const input = args;
|
|
1198
|
+
return [
|
|
1199
|
+
"relationship",
|
|
1200
|
+
"workspace",
|
|
1201
|
+
"cwd",
|
|
1202
|
+
"worktreeName",
|
|
1203
|
+
"branchName",
|
|
1204
|
+
"baseBranch",
|
|
1205
|
+
"refName",
|
|
1206
|
+
"githubPrNumber",
|
|
1207
|
+
].some((key) => input[key] !== undefined);
|
|
1208
|
+
}
|
|
1209
|
+
async function resolveCanonicalCreateAgentWorkspace(workspaceId, firstAgentContext) {
|
|
1210
|
+
if (workspaceId) {
|
|
1211
|
+
const resolved = await resolveCreateAgentWorkspace({ kind: "existing", workspaceId }, undefined);
|
|
1212
|
+
return { cwd: resolved.cwd, workspaceId };
|
|
1213
|
+
}
|
|
1214
|
+
if (!callerAgentId) {
|
|
1215
|
+
if (!options.ensureWorkspaceForCreate) {
|
|
1216
|
+
throw new Error("Workspace creation is not configured");
|
|
1217
|
+
}
|
|
1218
|
+
const cwd = process.cwd();
|
|
1219
|
+
return {
|
|
1220
|
+
cwd,
|
|
1221
|
+
workspaceId: await options.ensureWorkspaceForCreate(cwd, firstAgentContext),
|
|
1222
|
+
};
|
|
1223
|
+
}
|
|
1224
|
+
const caller = resolveCallerAgent();
|
|
1225
|
+
if (!caller?.workspaceId) {
|
|
1226
|
+
throw new Error(`Caller agent ${callerAgentId} has no current workspace`);
|
|
1227
|
+
}
|
|
1228
|
+
return { cwd: undefined, workspaceId: caller.workspaceId };
|
|
1229
|
+
}
|
|
1230
|
+
function normalizeTopLevelCreateAgentArgs(args) {
|
|
1231
|
+
const { cwd, mode, thinking, features, worktreeName, branchName, baseBranch, refName, githubPrNumber, ...canonicalCandidate } = args;
|
|
1232
|
+
const settings = {
|
|
1233
|
+
...canonicalCandidate.settings,
|
|
1234
|
+
...(mode ? { modeId: mode } : {}),
|
|
1235
|
+
...(thinking ? { thinkingOptionId: thinking } : {}),
|
|
1236
|
+
...(features ? { features } : {}),
|
|
1237
|
+
};
|
|
1238
|
+
if (canonicalCandidate.relationship && canonicalCandidate.workspace) {
|
|
1239
|
+
return legacyTopLevelCreateAgentArgsSchema.parse({
|
|
1240
|
+
...canonicalCandidate,
|
|
1241
|
+
...(Object.keys(settings).length > 0 ? { settings } : {}),
|
|
1242
|
+
});
|
|
1243
|
+
}
|
|
1244
|
+
if (canonicalCandidate.relationship || canonicalCandidate.workspace) {
|
|
1245
|
+
throw new Error("relationship and workspace must be provided together");
|
|
1246
|
+
}
|
|
1247
|
+
if (!cwd?.trim()) {
|
|
1248
|
+
throw new Error("cwd is required for legacy top-level create_agent calls");
|
|
1249
|
+
}
|
|
1250
|
+
const legacyWorktreeTarget = resolveLegacyCreateAgentWorktreeTarget({
|
|
1251
|
+
worktreeName,
|
|
1252
|
+
branchName,
|
|
1253
|
+
baseBranch,
|
|
1254
|
+
refName,
|
|
1255
|
+
githubPrNumber,
|
|
1256
|
+
});
|
|
1257
|
+
const workspace = legacyWorktreeTarget
|
|
1258
|
+
? {
|
|
1259
|
+
kind: "create",
|
|
1260
|
+
source: {
|
|
1261
|
+
kind: "worktree",
|
|
1262
|
+
cwd,
|
|
1263
|
+
target: legacyWorktreeTarget,
|
|
1264
|
+
},
|
|
1265
|
+
}
|
|
1266
|
+
: {
|
|
1267
|
+
kind: "create",
|
|
1268
|
+
source: {
|
|
1269
|
+
kind: "directory",
|
|
1270
|
+
path: cwd,
|
|
1271
|
+
},
|
|
1272
|
+
};
|
|
1273
|
+
return legacyTopLevelCreateAgentArgsSchema.parse({
|
|
1274
|
+
...canonicalCandidate,
|
|
1275
|
+
relationship: { kind: "detached" },
|
|
1276
|
+
workspace,
|
|
1277
|
+
...(Object.keys(settings).length > 0 ? { settings } : {}),
|
|
1278
|
+
});
|
|
1279
|
+
}
|
|
1280
|
+
function resolveLegacyCreateAgentWorktreeTarget(input) {
|
|
1281
|
+
if (input.githubPrNumber !== undefined) {
|
|
1282
|
+
return {
|
|
1283
|
+
kind: "checkout-pr",
|
|
1284
|
+
githubPrNumber: input.githubPrNumber,
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
if (input.refName) {
|
|
1288
|
+
return {
|
|
1289
|
+
kind: "checkout-branch",
|
|
1290
|
+
branch: input.refName,
|
|
1291
|
+
};
|
|
1292
|
+
}
|
|
1293
|
+
if (input.worktreeName || input.branchName || input.baseBranch) {
|
|
1294
|
+
return {
|
|
1295
|
+
kind: "branch-off",
|
|
1296
|
+
worktreeSlug: input.worktreeName,
|
|
1297
|
+
branchName: input.branchName,
|
|
1298
|
+
baseBranch: input.baseBranch,
|
|
1299
|
+
};
|
|
1300
|
+
}
|
|
1301
|
+
return null;
|
|
1302
|
+
}
|
|
1303
|
+
async function resolveCreateAgentWorkspace(workspace, firstAgentContext) {
|
|
1304
|
+
if (workspace.kind === "current") {
|
|
1305
|
+
if (!callerAgentId) {
|
|
1306
|
+
throw new Error("workspace current requires an agent-scoped tool session");
|
|
1307
|
+
}
|
|
1308
|
+
const callerAgent = resolveCallerAgent();
|
|
1309
|
+
if (!callerAgent?.workspaceId) {
|
|
1310
|
+
throw new Error(`Caller agent ${callerAgentId} has no current workspace`);
|
|
1311
|
+
}
|
|
1312
|
+
return {
|
|
1313
|
+
cwd: workspace.cwd,
|
|
1314
|
+
workspaceId: callerAgent.workspaceId,
|
|
1315
|
+
worktree: undefined,
|
|
1316
|
+
};
|
|
1317
|
+
}
|
|
1318
|
+
if (workspace.kind === "existing") {
|
|
1319
|
+
if (!options.listActiveWorkspaces) {
|
|
1320
|
+
throw new Error("Workspace lookup is not configured");
|
|
1321
|
+
}
|
|
1322
|
+
const existingWorkspace = (await options.listActiveWorkspaces()).find((candidate) => candidate.workspaceId === workspace.workspaceId);
|
|
1323
|
+
if (!existingWorkspace) {
|
|
1324
|
+
throw new Error(`Workspace ${workspace.workspaceId} not found`);
|
|
1325
|
+
}
|
|
1326
|
+
const cwd = workspace.cwd
|
|
1327
|
+
? resolveScopedCwd(workspace.cwd, { required: true })
|
|
1328
|
+
: existingWorkspace.cwd;
|
|
1329
|
+
const lockedCwd = callerContext?.lockedCwd?.trim();
|
|
1330
|
+
if (lockedCwd && !isSameOrDescendantPath(expandUserPath(lockedCwd), cwd)) {
|
|
1331
|
+
throw new Error(`Workspace ${workspace.workspaceId} is outside the allowed cwd`);
|
|
1332
|
+
}
|
|
1333
|
+
return {
|
|
1334
|
+
cwd,
|
|
1335
|
+
workspaceId: workspace.workspaceId,
|
|
1336
|
+
worktree: undefined,
|
|
1337
|
+
};
|
|
1338
|
+
}
|
|
1339
|
+
if (workspace.source.kind === "directory") {
|
|
1340
|
+
const cwd = resolveScopedCwd(workspace.source.path, { required: true });
|
|
1341
|
+
if (!options.ensureWorkspaceForCreate) {
|
|
1342
|
+
throw new Error("Workspace creation is not configured");
|
|
1343
|
+
}
|
|
1344
|
+
return {
|
|
1345
|
+
cwd,
|
|
1346
|
+
workspaceId: await options.ensureWorkspaceForCreate(cwd, firstAgentContext),
|
|
1347
|
+
worktree: undefined,
|
|
1348
|
+
};
|
|
1349
|
+
}
|
|
1350
|
+
const cwd = resolveScopedCwd(workspace.source.cwd, { required: true });
|
|
1351
|
+
return {
|
|
1352
|
+
cwd,
|
|
1353
|
+
workspaceId: undefined,
|
|
1354
|
+
worktree: resolveCreateAgentWorktree(workspace.source.target),
|
|
1355
|
+
};
|
|
1356
|
+
}
|
|
1357
|
+
function resolveCreateAgentWorktree(target) {
|
|
1358
|
+
switch (target.kind) {
|
|
1359
|
+
case "branch-off":
|
|
1360
|
+
return {
|
|
1361
|
+
action: "branch-off",
|
|
1362
|
+
worktreeName: target.worktreeSlug,
|
|
1363
|
+
branchName: target.branchName,
|
|
1364
|
+
baseBranch: target.baseBranch,
|
|
1365
|
+
};
|
|
1366
|
+
case "checkout-branch":
|
|
1367
|
+
return {
|
|
1368
|
+
action: "checkout",
|
|
1369
|
+
refName: target.branch,
|
|
1370
|
+
};
|
|
1371
|
+
case "checkout-pr":
|
|
1372
|
+
return {
|
|
1373
|
+
action: "checkout",
|
|
1374
|
+
githubPrNumber: target.githubPrNumber,
|
|
1375
|
+
};
|
|
1376
|
+
default:
|
|
1377
|
+
throw new Error("unreachable");
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
registerTool("send_agent_prompt", {
|
|
1381
|
+
title: "Send agent prompt",
|
|
1382
|
+
description: "Send a task to a running agent. Agent-scoped callers run in background by default; top-level callers wait by default.",
|
|
1383
|
+
inputSchema: sendAgentPromptInputSchema,
|
|
1384
|
+
outputSchema: {
|
|
1385
|
+
success: z.boolean(),
|
|
1386
|
+
status: AgentStatusEnum,
|
|
1387
|
+
lastMessage: z.string().nullable().optional(),
|
|
1388
|
+
permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
|
|
1389
|
+
guidance: z.string().optional(),
|
|
1390
|
+
},
|
|
1391
|
+
}, async ({ agentId, prompt, sessionMode, background = Boolean(callerAgentId), notifyOnFinish = Boolean(callerAgentId), }) => {
|
|
1392
|
+
const shouldNotifyOnFinish = Boolean(callerAgentId && notifyOnFinish && background);
|
|
1393
|
+
await sendPromptToAgent({
|
|
1394
|
+
agentManager,
|
|
1395
|
+
agentStorage,
|
|
1396
|
+
agentId,
|
|
1397
|
+
prompt,
|
|
1398
|
+
sessionMode,
|
|
1399
|
+
logger: childLogger,
|
|
1400
|
+
});
|
|
1401
|
+
if (shouldNotifyOnFinish && callerAgentId) {
|
|
1402
|
+
setupFinishNotification({
|
|
1403
|
+
agentManager,
|
|
1404
|
+
agentStorage,
|
|
1405
|
+
childAgentId: agentId,
|
|
1406
|
+
callerAgentId,
|
|
1407
|
+
logger: childLogger,
|
|
1408
|
+
});
|
|
1409
|
+
}
|
|
1410
|
+
// If not running in background, wait for completion
|
|
1411
|
+
if (!background) {
|
|
1412
|
+
const result = await waitForAgentWithTimeout(agentManager, agentId, {
|
|
1413
|
+
waitForActive: true,
|
|
1414
|
+
});
|
|
1415
|
+
const responseData = {
|
|
1416
|
+
success: true,
|
|
1417
|
+
status: result.status,
|
|
1418
|
+
lastMessage: result.lastMessage,
|
|
1419
|
+
permission: sanitizePermissionRequest(result.permission),
|
|
1420
|
+
};
|
|
1421
|
+
const validJson = ensureValidJson(responseData);
|
|
1422
|
+
const response = {
|
|
1423
|
+
content: [],
|
|
1424
|
+
structuredContent: validJson,
|
|
1425
|
+
};
|
|
1426
|
+
return response;
|
|
1427
|
+
}
|
|
1428
|
+
// Return immediately if background=true
|
|
1429
|
+
// Re-fetch snapshot since the state may have changed
|
|
1430
|
+
const currentSnapshot = agentManager.getAgent(agentId);
|
|
1431
|
+
const responseData = {
|
|
1432
|
+
success: true,
|
|
1433
|
+
status: currentSnapshot?.lifecycle ?? "idle",
|
|
1434
|
+
lastMessage: null,
|
|
1435
|
+
permission: null,
|
|
1436
|
+
...(shouldNotifyOnFinish
|
|
1437
|
+
? {
|
|
1438
|
+
guidance: "You will get notified when the prompted agent finishes, errors, or needs permission. Do not poll for status; continue with other work until the notification arrives.",
|
|
1439
|
+
}
|
|
1440
|
+
: {}),
|
|
1441
|
+
};
|
|
1442
|
+
const validJson = ensureValidJson(responseData);
|
|
1443
|
+
const response = {
|
|
1444
|
+
content: [],
|
|
1445
|
+
structuredContent: validJson,
|
|
1446
|
+
};
|
|
1447
|
+
return response;
|
|
1448
|
+
});
|
|
1449
|
+
registerTool("get_agent_status", {
|
|
1450
|
+
title: "Get agent status",
|
|
1451
|
+
description: "Return the latest snapshot for an agent, including lifecycle state, capabilities, and pending permissions.",
|
|
1452
|
+
inputSchema: {
|
|
1453
|
+
agentId: z.string(),
|
|
1454
|
+
},
|
|
1455
|
+
outputSchema: {
|
|
1456
|
+
status: AgentStatusEnum,
|
|
1457
|
+
snapshot: AgentSnapshotPayloadSchema,
|
|
1458
|
+
},
|
|
1459
|
+
}, async ({ agentId }) => {
|
|
1460
|
+
const snapshot = agentManager.getAgent(agentId);
|
|
1461
|
+
if (snapshot) {
|
|
1462
|
+
const structuredSnapshot = await serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger);
|
|
1463
|
+
return {
|
|
1464
|
+
content: [],
|
|
1465
|
+
structuredContent: ensureValidJson({
|
|
1466
|
+
status: snapshot.lifecycle,
|
|
1467
|
+
snapshot: structuredSnapshot,
|
|
1468
|
+
}),
|
|
1469
|
+
};
|
|
1470
|
+
}
|
|
1471
|
+
const record = await agentStorage.get(agentId);
|
|
1472
|
+
if (!record || record.internal) {
|
|
1473
|
+
throw new Error(`Agent ${agentId} not found`);
|
|
1474
|
+
}
|
|
1475
|
+
const structuredSnapshot = buildStoredAgentPayload(record, new Set(providerSnapshotManager.listRegisteredProviderIds()));
|
|
1476
|
+
return {
|
|
1477
|
+
content: [],
|
|
1478
|
+
structuredContent: ensureValidJson({
|
|
1479
|
+
status: structuredSnapshot.status,
|
|
1480
|
+
snapshot: structuredSnapshot,
|
|
1481
|
+
}),
|
|
1482
|
+
};
|
|
1483
|
+
});
|
|
1484
|
+
registerTool("list_agents", {
|
|
1485
|
+
title: "List agents",
|
|
1486
|
+
description: "List recent agents as compact metadata.",
|
|
1487
|
+
inputSchema: {
|
|
1488
|
+
includeArchived: z.boolean().optional().default(false),
|
|
1489
|
+
cwd: z.string().optional(),
|
|
1490
|
+
sinceHours: z
|
|
1491
|
+
.number()
|
|
1492
|
+
.int()
|
|
1493
|
+
.positive()
|
|
1494
|
+
.max(24 * 30)
|
|
1495
|
+
.optional()
|
|
1496
|
+
.default(48),
|
|
1497
|
+
statuses: z.array(AgentStatusEnum).optional(),
|
|
1498
|
+
limit: z.number().int().positive().max(200).optional().default(50),
|
|
1499
|
+
},
|
|
1500
|
+
outputSchema: {
|
|
1501
|
+
agents: z.array(AgentListItemPayloadSchema),
|
|
1502
|
+
},
|
|
1503
|
+
}, async ({ includeArchived = false, cwd, sinceHours = 48, statuses, limit = 50 }) => {
|
|
1504
|
+
const callerCwd = callerAgentId ? resolveCallerAgent()?.cwd : undefined;
|
|
1505
|
+
const requestedCwd = cwd?.trim() ? expandUserPath(cwd) : callerCwd;
|
|
1506
|
+
const statusFilter = statuses && statuses.length > 0 ? new Set(statuses) : null;
|
|
1507
|
+
const sinceMs = Date.now() - sinceHours * 60 * 60 * 1000;
|
|
1508
|
+
const liveSnapshots = agentManager.listAgents();
|
|
1509
|
+
const liveAgents = await Promise.all(liveSnapshots.map((snapshot) => serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger)));
|
|
1510
|
+
const liveIds = new Set(liveSnapshots.map((snapshot) => snapshot.id));
|
|
1511
|
+
const storedRecords = await agentStorage.list();
|
|
1512
|
+
const registeredProviderIds = new Set(providerSnapshotManager.listRegisteredProviderIds());
|
|
1513
|
+
const storedAgents = storedRecords
|
|
1514
|
+
.filter((record) => !record.internal && !liveIds.has(record.id))
|
|
1515
|
+
.filter((record) => includeArchived || !record.archivedAt)
|
|
1516
|
+
.filter((record) => includeArchived || isStoredAgentProviderAvailable(record, registeredProviderIds))
|
|
1517
|
+
.map((record) => buildStoredAgentPayload(record, registeredProviderIds));
|
|
1518
|
+
const agents = [...liveAgents, ...storedAgents]
|
|
1519
|
+
.map(toAgentListItemPayload)
|
|
1520
|
+
.filter((agent) => !requestedCwd || isSameOrDescendantPath(requestedCwd, agent.cwd))
|
|
1521
|
+
.filter((agent) => !statusFilter || statusFilter.has(agent.status))
|
|
1522
|
+
.filter((agent) => !agent.archivedAt || resolveAgentListActivityTime(agent) >= sinceMs)
|
|
1523
|
+
.sort(compareAgentListItems)
|
|
1524
|
+
.slice(0, limit);
|
|
1525
|
+
return {
|
|
1526
|
+
content: [],
|
|
1527
|
+
structuredContent: ensureValidJson({ agents }),
|
|
1528
|
+
};
|
|
1529
|
+
});
|
|
1530
|
+
registerTool("cancel_agent", {
|
|
1531
|
+
title: "Cancel agent run",
|
|
1532
|
+
description: "Abort the agent's current run but keep the agent alive for future tasks.",
|
|
1533
|
+
inputSchema: {
|
|
1534
|
+
agentId: z.string(),
|
|
1535
|
+
},
|
|
1536
|
+
outputSchema: {
|
|
1537
|
+
success: z.boolean(),
|
|
1538
|
+
},
|
|
1539
|
+
}, async ({ agentId }) => {
|
|
1540
|
+
const { cancelled } = await cancelAgentRunCommand({ agentManager, logger: childLogger }, agentId);
|
|
1541
|
+
return {
|
|
1542
|
+
content: [],
|
|
1543
|
+
structuredContent: ensureValidJson({ success: cancelled }),
|
|
1544
|
+
};
|
|
1545
|
+
});
|
|
1546
|
+
registerTool("archive_agent", {
|
|
1547
|
+
title: "Archive agent",
|
|
1548
|
+
description: "Archive an agent (soft-delete). The agent is interrupted if running and removed from the active list.",
|
|
1549
|
+
inputSchema: {
|
|
1550
|
+
agentId: z.string(),
|
|
1551
|
+
},
|
|
1552
|
+
outputSchema: {
|
|
1553
|
+
success: z.boolean(),
|
|
1554
|
+
},
|
|
1555
|
+
}, async ({ agentId }) => {
|
|
1556
|
+
await archiveAgentCommand({
|
|
1557
|
+
agentManager,
|
|
1558
|
+
agentStorage,
|
|
1559
|
+
logger: childLogger,
|
|
1560
|
+
}, agentId);
|
|
1561
|
+
return {
|
|
1562
|
+
content: [],
|
|
1563
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
1564
|
+
};
|
|
1565
|
+
});
|
|
1566
|
+
registerTool("kill_agent", {
|
|
1567
|
+
title: "Kill agent",
|
|
1568
|
+
description: "Terminate an agent session permanently.",
|
|
1569
|
+
inputSchema: {
|
|
1570
|
+
agentId: z.string(),
|
|
1571
|
+
},
|
|
1572
|
+
outputSchema: {
|
|
1573
|
+
success: z.boolean(),
|
|
1574
|
+
},
|
|
1575
|
+
}, async ({ agentId }) => {
|
|
1576
|
+
await closeAgentCommand({ agentManager }, agentId);
|
|
1577
|
+
return {
|
|
1578
|
+
content: [],
|
|
1579
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
1580
|
+
};
|
|
1581
|
+
});
|
|
1582
|
+
registerTool("update_agent", {
|
|
1583
|
+
title: "Update agent",
|
|
1584
|
+
description: "Update an agent name, labels, and/or runtime settings.",
|
|
1585
|
+
inputSchema: {
|
|
1586
|
+
agentId: z.string(),
|
|
1587
|
+
name: z.string().optional(),
|
|
1588
|
+
labels: z.record(z.string(), z.string()).optional().describe("Labels to set on the agent"),
|
|
1589
|
+
settings: UpdateAgentSettingsInputSchema.optional().describe("Runtime settings to apply to the agent."),
|
|
1590
|
+
},
|
|
1591
|
+
outputSchema: {
|
|
1592
|
+
success: z.boolean(),
|
|
1593
|
+
},
|
|
1594
|
+
}, async ({ agentId, name, labels, settings }) => {
|
|
1595
|
+
if (settings?.modeId !== undefined) {
|
|
1596
|
+
await agentManager.setAgentMode(agentId, settings.modeId);
|
|
1597
|
+
}
|
|
1598
|
+
if (settings?.model !== undefined) {
|
|
1599
|
+
await agentManager.setAgentModel(agentId, settings.model);
|
|
1600
|
+
}
|
|
1601
|
+
if (settings?.thinkingOptionId !== undefined) {
|
|
1602
|
+
await agentManager.setAgentThinkingOption(agentId, settings.thinkingOptionId);
|
|
1603
|
+
}
|
|
1604
|
+
if (settings?.features) {
|
|
1605
|
+
for (const [featureId, value] of Object.entries(settings.features)) {
|
|
1606
|
+
await agentManager.setAgentFeature(agentId, featureId, value);
|
|
1607
|
+
}
|
|
1608
|
+
}
|
|
1609
|
+
await updateAgentCommand({ agentManager }, { agentId, name, labels });
|
|
1610
|
+
return {
|
|
1611
|
+
content: [],
|
|
1612
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
1613
|
+
};
|
|
1614
|
+
});
|
|
1615
|
+
registerTool("rename_workspace", {
|
|
1616
|
+
title: "Rename workspace",
|
|
1617
|
+
description: "Rename a workspace by setting its user-visible title. Omit workspaceId to rename your current workspace.",
|
|
1618
|
+
inputSchema: {
|
|
1619
|
+
workspaceId: z
|
|
1620
|
+
.string()
|
|
1621
|
+
.trim()
|
|
1622
|
+
.min(1)
|
|
1623
|
+
.optional()
|
|
1624
|
+
.describe("Workspace id to rename. Omit to rename your current workspace."),
|
|
1625
|
+
title: z
|
|
1626
|
+
.string()
|
|
1627
|
+
.trim()
|
|
1628
|
+
.min(1, "title is required")
|
|
1629
|
+
.describe("New user-visible workspace title."),
|
|
1630
|
+
},
|
|
1631
|
+
outputSchema: {
|
|
1632
|
+
success: z.boolean(),
|
|
1633
|
+
workspaceId: z.string(),
|
|
1634
|
+
title: z.string(),
|
|
1635
|
+
},
|
|
1636
|
+
}, async ({ workspaceId: requestedWorkspaceId, title }) => {
|
|
1637
|
+
if (!options.workspaceRegistry) {
|
|
1638
|
+
throw new Error("Workspace registry is required to rename workspaces");
|
|
1639
|
+
}
|
|
1640
|
+
if (!options.emitWorkspaceUpdatesForWorkspaceIds) {
|
|
1641
|
+
throw new Error("Workspace update emitter is required to rename workspaces");
|
|
1642
|
+
}
|
|
1643
|
+
const workspaceId = resolveWorkspaceIdForRename(requestedWorkspaceId);
|
|
1644
|
+
const existing = await options.workspaceRegistry.get(workspaceId);
|
|
1645
|
+
if (!existing) {
|
|
1646
|
+
throw new Error(`Workspace ${workspaceId} not found`);
|
|
1647
|
+
}
|
|
1648
|
+
if (existing.archivedAt) {
|
|
1649
|
+
throw new Error(`Workspace ${workspaceId} is archived`);
|
|
1650
|
+
}
|
|
1651
|
+
await options.workspaceRegistry.upsert({
|
|
1652
|
+
...existing,
|
|
1653
|
+
title,
|
|
1654
|
+
updatedAt: new Date().toISOString(),
|
|
1655
|
+
});
|
|
1656
|
+
await options.emitWorkspaceUpdatesForWorkspaceIds([workspaceId]);
|
|
1657
|
+
return {
|
|
1658
|
+
content: [],
|
|
1659
|
+
structuredContent: ensureValidJson({
|
|
1660
|
+
success: true,
|
|
1661
|
+
workspaceId,
|
|
1662
|
+
title,
|
|
1663
|
+
}),
|
|
1664
|
+
};
|
|
1665
|
+
});
|
|
1666
|
+
registerTool("list_workspace_scripts", {
|
|
1667
|
+
title: "List workspace scripts",
|
|
1668
|
+
description: "List configured workspace scripts and their lifecycle, service port, proxy URL, health, and terminal ID.",
|
|
1669
|
+
inputSchema: {
|
|
1670
|
+
workspaceId: z.string().describe("Workspace ID whose configured scripts to list."),
|
|
1671
|
+
},
|
|
1672
|
+
outputSchema: {
|
|
1673
|
+
scripts: z.array(WorkspaceScriptPayloadSchema),
|
|
1674
|
+
},
|
|
1675
|
+
}, async ({ workspaceId }) => {
|
|
1676
|
+
if (!workspaceScripts) {
|
|
1677
|
+
throw new Error("Workspace script management is not configured");
|
|
1678
|
+
}
|
|
1679
|
+
return {
|
|
1680
|
+
content: [],
|
|
1681
|
+
structuredContent: ensureValidJson({ scripts: await workspaceScripts.list(workspaceId) }),
|
|
1682
|
+
};
|
|
1683
|
+
});
|
|
1684
|
+
registerTool("start_workspace_script", {
|
|
1685
|
+
title: "Start workspace script",
|
|
1686
|
+
description: "Start one configured workspace script through Paseo's managed workspace-script launcher.",
|
|
1687
|
+
inputSchema: {
|
|
1688
|
+
workspaceId: z.string().describe("Workspace ID containing the configured script."),
|
|
1689
|
+
scriptName: z.string().min(1).describe("Configured paseo.json script name to start."),
|
|
1690
|
+
},
|
|
1691
|
+
outputSchema: {
|
|
1692
|
+
script: WorkspaceScriptPayloadSchema,
|
|
1693
|
+
},
|
|
1694
|
+
}, async ({ workspaceId, scriptName }) => {
|
|
1695
|
+
if (!workspaceScripts) {
|
|
1696
|
+
throw new Error("Workspace script management is not configured");
|
|
1697
|
+
}
|
|
1698
|
+
return {
|
|
1699
|
+
content: [],
|
|
1700
|
+
structuredContent: ensureValidJson({
|
|
1701
|
+
script: await workspaceScripts.launch({ workspaceId, scriptName }),
|
|
1702
|
+
}),
|
|
1703
|
+
};
|
|
1704
|
+
});
|
|
1705
|
+
registerTool("stop_workspace_script", {
|
|
1706
|
+
title: "Stop workspace script",
|
|
1707
|
+
description: "Stop a running workspace script through its supervised terminal lifecycle.",
|
|
1708
|
+
inputSchema: {
|
|
1709
|
+
workspaceId: z.string().describe("Workspace ID containing the running script."),
|
|
1710
|
+
scriptName: z.string().min(1).describe("Configured paseo.json script name to stop."),
|
|
1711
|
+
},
|
|
1712
|
+
outputSchema: {
|
|
1713
|
+
script: WorkspaceScriptPayloadSchema,
|
|
1714
|
+
},
|
|
1715
|
+
}, async ({ workspaceId, scriptName }) => {
|
|
1716
|
+
if (!workspaceScripts) {
|
|
1717
|
+
throw new Error("Workspace script management is not configured");
|
|
1718
|
+
}
|
|
1719
|
+
return {
|
|
1720
|
+
content: [],
|
|
1721
|
+
structuredContent: ensureValidJson({
|
|
1722
|
+
script: await workspaceScripts.stop({ workspaceId, scriptName }),
|
|
1723
|
+
}),
|
|
1724
|
+
};
|
|
1725
|
+
});
|
|
1726
|
+
registerTool("list_terminals", {
|
|
1727
|
+
title: "List terminals",
|
|
1728
|
+
description: "List terminals for a working directory or across all working directories.",
|
|
1729
|
+
inputSchema: {
|
|
1730
|
+
cwd: z
|
|
1731
|
+
.string()
|
|
1732
|
+
.optional()
|
|
1733
|
+
.describe("Optional working directory. Defaults to your current working directory."),
|
|
1734
|
+
all: z.boolean().optional().describe("List terminals across all working directories."),
|
|
1735
|
+
},
|
|
1736
|
+
outputSchema: {
|
|
1737
|
+
terminals: z.array(TerminalSummarySchema),
|
|
1738
|
+
},
|
|
1739
|
+
}, async ({ cwd, all }) => {
|
|
1740
|
+
if (!terminalManager) {
|
|
1741
|
+
throw new Error("Terminal manager is not configured");
|
|
1742
|
+
}
|
|
1743
|
+
const terminals = all
|
|
1744
|
+
? (await Promise.all(terminalManager.listDirectories().map(async (directory) => (await terminalManager.getTerminals(directory)).map((terminal) => ({
|
|
1745
|
+
id: terminal.id,
|
|
1746
|
+
name: terminal.name,
|
|
1747
|
+
cwd: terminal.cwd,
|
|
1748
|
+
}))))).flat()
|
|
1749
|
+
: (await terminalManager.getTerminals(resolveScopedCwd(cwd, { required: true }))).map((terminal) => ({
|
|
1750
|
+
id: terminal.id,
|
|
1751
|
+
name: terminal.name,
|
|
1752
|
+
cwd: terminal.cwd,
|
|
1753
|
+
}));
|
|
1754
|
+
return {
|
|
1755
|
+
content: [],
|
|
1756
|
+
structuredContent: ensureValidJson({ terminals }),
|
|
1757
|
+
};
|
|
1758
|
+
});
|
|
1759
|
+
registerTool("create_terminal", {
|
|
1760
|
+
title: "Create terminal",
|
|
1761
|
+
description: "Create a terminal session for a working directory.",
|
|
1762
|
+
inputSchema: {
|
|
1763
|
+
cwd: z
|
|
1764
|
+
.string()
|
|
1765
|
+
.optional()
|
|
1766
|
+
.describe("Optional working directory. Defaults to your current working directory."),
|
|
1767
|
+
name: z.string().optional().describe("Optional terminal name."),
|
|
1768
|
+
},
|
|
1769
|
+
outputSchema: TerminalSummarySchema.shape,
|
|
1770
|
+
}, async ({ cwd, name }) => {
|
|
1771
|
+
if (!terminalManager) {
|
|
1772
|
+
throw new Error("Terminal manager is not configured");
|
|
1773
|
+
}
|
|
1774
|
+
const resolvedCwd = resolveScopedCwd(cwd, { required: true });
|
|
1775
|
+
const workspaceId = await resolveTerminalWorkspaceId(resolvedCwd);
|
|
1776
|
+
const terminal = await terminalManager.createTerminal({
|
|
1777
|
+
cwd: resolvedCwd,
|
|
1778
|
+
workspaceId,
|
|
1779
|
+
...(name?.trim() ? { name: name.trim() } : {}),
|
|
1780
|
+
});
|
|
1781
|
+
return {
|
|
1782
|
+
content: [],
|
|
1783
|
+
structuredContent: ensureValidJson({
|
|
1784
|
+
id: terminal.id,
|
|
1785
|
+
name: terminal.name,
|
|
1786
|
+
cwd: terminal.cwd,
|
|
1787
|
+
}),
|
|
1788
|
+
};
|
|
1789
|
+
});
|
|
1790
|
+
registerTool("kill_terminal", {
|
|
1791
|
+
title: "Kill terminal",
|
|
1792
|
+
description: "Kill an existing terminal session.",
|
|
1793
|
+
inputSchema: {
|
|
1794
|
+
terminalId: z.string(),
|
|
1795
|
+
},
|
|
1796
|
+
outputSchema: {
|
|
1797
|
+
success: z.boolean(),
|
|
1798
|
+
},
|
|
1799
|
+
}, async ({ terminalId }) => {
|
|
1800
|
+
if (!terminalManager) {
|
|
1801
|
+
throw new Error("Terminal manager is not configured");
|
|
1802
|
+
}
|
|
1803
|
+
const terminal = terminalManager.getTerminal(terminalId);
|
|
1804
|
+
if (!terminal) {
|
|
1805
|
+
throw new Error(`Terminal ${terminalId} not found`);
|
|
1806
|
+
}
|
|
1807
|
+
terminal.kill();
|
|
1808
|
+
return {
|
|
1809
|
+
content: [],
|
|
1810
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
1811
|
+
};
|
|
1812
|
+
});
|
|
1813
|
+
registerTool("capture_terminal", {
|
|
1814
|
+
title: "Capture terminal",
|
|
1815
|
+
description: "Capture plain-text terminal output lines from a terminal session.",
|
|
1816
|
+
inputSchema: {
|
|
1817
|
+
terminalId: z.string(),
|
|
1818
|
+
start: z.number().optional(),
|
|
1819
|
+
end: z.number().optional(),
|
|
1820
|
+
scrollback: z.boolean().optional(),
|
|
1821
|
+
stripAnsi: z.boolean().optional().default(true),
|
|
1822
|
+
},
|
|
1823
|
+
outputSchema: {
|
|
1824
|
+
terminalId: z.string(),
|
|
1825
|
+
lines: z.array(z.string()),
|
|
1826
|
+
totalLines: z.number().int().nonnegative(),
|
|
1827
|
+
},
|
|
1828
|
+
}, async ({ terminalId, start, end, scrollback, stripAnsi = true }) => {
|
|
1829
|
+
if (!terminalManager) {
|
|
1830
|
+
throw new Error("Terminal manager is not configured");
|
|
1831
|
+
}
|
|
1832
|
+
if (!terminalManager.getTerminal(terminalId)) {
|
|
1833
|
+
throw new Error(`Terminal ${terminalId} not found`);
|
|
1834
|
+
}
|
|
1835
|
+
const capture = await terminalManager.captureTerminal(terminalId, {
|
|
1836
|
+
start: scrollback ? 0 : start,
|
|
1837
|
+
end,
|
|
1838
|
+
stripAnsi,
|
|
1839
|
+
});
|
|
1840
|
+
return {
|
|
1841
|
+
content: [],
|
|
1842
|
+
structuredContent: ensureValidJson({
|
|
1843
|
+
terminalId,
|
|
1844
|
+
lines: capture.lines,
|
|
1845
|
+
totalLines: capture.totalLines,
|
|
1846
|
+
}),
|
|
1847
|
+
};
|
|
1848
|
+
});
|
|
1849
|
+
registerTool("send_terminal_keys", {
|
|
1850
|
+
title: "Send terminal keys",
|
|
1851
|
+
description: "Send literal text or special key tokens to a terminal session.",
|
|
1852
|
+
inputSchema: {
|
|
1853
|
+
terminalId: z.string(),
|
|
1854
|
+
keys: z.string(),
|
|
1855
|
+
literal: z.boolean().optional(),
|
|
1856
|
+
},
|
|
1857
|
+
outputSchema: {
|
|
1858
|
+
success: z.boolean(),
|
|
1859
|
+
},
|
|
1860
|
+
}, async ({ terminalId, keys, literal = false }) => {
|
|
1861
|
+
if (!terminalManager) {
|
|
1862
|
+
throw new Error("Terminal manager is not configured");
|
|
1863
|
+
}
|
|
1864
|
+
const terminal = terminalManager.getTerminal(terminalId);
|
|
1865
|
+
if (!terminal) {
|
|
1866
|
+
throw new Error(`Terminal ${terminalId} not found`);
|
|
1867
|
+
}
|
|
1868
|
+
terminal.send({
|
|
1869
|
+
type: "input",
|
|
1870
|
+
data: resolveTerminalKeyToken(keys, literal),
|
|
1871
|
+
});
|
|
1872
|
+
return {
|
|
1873
|
+
content: [],
|
|
1874
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
1875
|
+
};
|
|
1876
|
+
});
|
|
1877
|
+
registerTool("create_schedule", {
|
|
1878
|
+
title: "Create schedule",
|
|
1879
|
+
description: "Create a recurring schedule that starts a new agent on a cron cadence.",
|
|
1880
|
+
inputSchema: {
|
|
1881
|
+
prompt: z.string().trim().min(1, "prompt is required"),
|
|
1882
|
+
cron: z.string().trim().min(1, "cron is required"),
|
|
1883
|
+
timezone: z
|
|
1884
|
+
.string()
|
|
1885
|
+
.trim()
|
|
1886
|
+
.min(1)
|
|
1887
|
+
.optional()
|
|
1888
|
+
.describe("IANA time zone for the cron cadence. For example: America/New_York."),
|
|
1889
|
+
name: z.string().optional(),
|
|
1890
|
+
provider: (callerAgentId ? AgentProviderEnum.optional() : AgentProviderEnum).describe("Provider, or provider/model (for example: codex or codex/gpt-5.4). Defaults to the caller's provider in an agent-scoped session."),
|
|
1891
|
+
cwd: z.string().optional(),
|
|
1892
|
+
isolation: z.enum(["local", "worktree"]).optional(),
|
|
1893
|
+
maxRuns: z.number().int().positive().optional(),
|
|
1894
|
+
expiresIn: z.string().optional(),
|
|
1895
|
+
},
|
|
1896
|
+
outputSchema: ScheduleSummarySchema.shape,
|
|
1897
|
+
}, async ({ prompt, cron, timezone, name, provider, cwd, isolation, maxRuns, expiresIn }) => {
|
|
1898
|
+
if (!scheduleService) {
|
|
1899
|
+
throw new Error("Schedule service is not configured");
|
|
1900
|
+
}
|
|
1901
|
+
const expiresAt = buildScheduleExpiry(expiresIn);
|
|
1902
|
+
const schedule = await scheduleService.createOrReplace({
|
|
1903
|
+
prompt: prompt.trim(),
|
|
1904
|
+
cadence: buildCronScheduleCadence({
|
|
1905
|
+
cron,
|
|
1906
|
+
...(timezone !== undefined ? { timezone } : {}),
|
|
1907
|
+
}),
|
|
1908
|
+
target: resolveNewAgentScheduleTarget({ provider, cwd, isolation }),
|
|
1909
|
+
...(name?.trim() ? { name: name.trim() } : {}),
|
|
1910
|
+
...(maxRuns === undefined ? {} : { maxRuns }),
|
|
1911
|
+
...(expiresAt === undefined ? {} : { expiresAt }),
|
|
1912
|
+
});
|
|
1913
|
+
return {
|
|
1914
|
+
content: [],
|
|
1915
|
+
structuredContent: ensureValidJson(toScheduleSummary(schedule)),
|
|
1916
|
+
};
|
|
1917
|
+
});
|
|
1918
|
+
registerTool("create_heartbeat", {
|
|
1919
|
+
title: "Create heartbeat",
|
|
1920
|
+
description: "Create a recurring heartbeat that sends you a prompt on a cron cadence.",
|
|
1921
|
+
inputSchema: {
|
|
1922
|
+
prompt: z.string().trim().min(1, "prompt is required"),
|
|
1923
|
+
cron: z.string().trim().min(1, "cron is required"),
|
|
1924
|
+
timezone: z
|
|
1925
|
+
.string()
|
|
1926
|
+
.trim()
|
|
1927
|
+
.min(1)
|
|
1928
|
+
.optional()
|
|
1929
|
+
.describe("IANA time zone for the cron cadence. For example: America/New_York."),
|
|
1930
|
+
name: z.string().optional(),
|
|
1931
|
+
maxRuns: z.number().int().positive().optional(),
|
|
1932
|
+
expiresIn: z.string().optional(),
|
|
1933
|
+
},
|
|
1934
|
+
outputSchema: ScheduleSummarySchema.shape,
|
|
1935
|
+
}, async ({ prompt, cron, timezone, name, maxRuns, expiresIn }) => {
|
|
1936
|
+
if (!scheduleService) {
|
|
1937
|
+
throw new Error("Schedule service is not configured");
|
|
1938
|
+
}
|
|
1939
|
+
if (!callerAgentId) {
|
|
1940
|
+
throw new Error("create_heartbeat requires an agent-scoped session");
|
|
1941
|
+
}
|
|
1942
|
+
resolveCallerAgent();
|
|
1943
|
+
const expiresAt = buildScheduleExpiry(expiresIn);
|
|
1944
|
+
const schedule = await scheduleService.createOrReplace({
|
|
1945
|
+
prompt: prompt.trim(),
|
|
1946
|
+
cadence: buildCronScheduleCadence({
|
|
1947
|
+
cron,
|
|
1948
|
+
...(timezone !== undefined ? { timezone } : {}),
|
|
1949
|
+
}),
|
|
1950
|
+
target: { type: "agent", agentId: callerAgentId },
|
|
1951
|
+
...(name?.trim() ? { name: name.trim() } : {}),
|
|
1952
|
+
...(maxRuns === undefined ? {} : { maxRuns }),
|
|
1953
|
+
...(expiresAt === undefined ? {} : { expiresAt }),
|
|
1954
|
+
});
|
|
1955
|
+
return {
|
|
1956
|
+
content: [],
|
|
1957
|
+
structuredContent: ensureValidJson(toScheduleSummary(schedule)),
|
|
1958
|
+
};
|
|
1959
|
+
});
|
|
1960
|
+
registerTool("delete_heartbeat", {
|
|
1961
|
+
title: "Delete heartbeat",
|
|
1962
|
+
description: "Delete one of your heartbeats.",
|
|
1963
|
+
inputSchema: { id: z.string().min(1) },
|
|
1964
|
+
outputSchema: { success: z.boolean() },
|
|
1965
|
+
}, async ({ id }) => {
|
|
1966
|
+
if (!scheduleService) {
|
|
1967
|
+
throw new Error("Schedule service is not configured");
|
|
1968
|
+
}
|
|
1969
|
+
await requireCallerHeartbeat(id);
|
|
1970
|
+
await scheduleService.delete(id);
|
|
1971
|
+
return {
|
|
1972
|
+
content: [],
|
|
1973
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
1974
|
+
};
|
|
1975
|
+
});
|
|
1976
|
+
registerTool("list_schedules", {
|
|
1977
|
+
title: "List schedules",
|
|
1978
|
+
description: "List all schedules managed by the daemon.",
|
|
1979
|
+
inputSchema: {},
|
|
1980
|
+
outputSchema: {
|
|
1981
|
+
schedules: z.array(ScheduleSummarySchema),
|
|
1982
|
+
},
|
|
1983
|
+
}, async () => {
|
|
1984
|
+
if (!scheduleService) {
|
|
1985
|
+
throw new Error("Schedule service is not configured");
|
|
1986
|
+
}
|
|
1987
|
+
const schedules = (await scheduleService.list())
|
|
1988
|
+
.filter((schedule) => schedule.target.type === "new-agent")
|
|
1989
|
+
.map((schedule) => toScheduleSummary(schedule));
|
|
1990
|
+
return {
|
|
1991
|
+
content: [],
|
|
1992
|
+
structuredContent: ensureValidJson({ schedules }),
|
|
1993
|
+
};
|
|
1994
|
+
});
|
|
1995
|
+
registerTool("inspect_schedule", {
|
|
1996
|
+
title: "Inspect schedule",
|
|
1997
|
+
description: "Inspect a schedule and its run history.",
|
|
1998
|
+
inputSchema: {
|
|
1999
|
+
id: z.string(),
|
|
2000
|
+
},
|
|
2001
|
+
outputSchema: StoredScheduleSchema.shape,
|
|
2002
|
+
}, async ({ id }) => {
|
|
2003
|
+
if (!scheduleService) {
|
|
2004
|
+
throw new Error("Schedule service is not configured");
|
|
2005
|
+
}
|
|
2006
|
+
const schedule = await requireScheduleTarget(id, "new-agent");
|
|
2007
|
+
return {
|
|
2008
|
+
content: [],
|
|
2009
|
+
structuredContent: ensureValidJson(schedule),
|
|
2010
|
+
};
|
|
2011
|
+
});
|
|
2012
|
+
registerTool("pause_schedule", {
|
|
2013
|
+
title: "Pause schedule",
|
|
2014
|
+
description: "Pause an active schedule.",
|
|
2015
|
+
inputSchema: {
|
|
2016
|
+
id: z.string(),
|
|
2017
|
+
},
|
|
2018
|
+
outputSchema: {
|
|
2019
|
+
success: z.boolean(),
|
|
2020
|
+
},
|
|
2021
|
+
}, async ({ id }) => {
|
|
2022
|
+
if (!scheduleService) {
|
|
2023
|
+
throw new Error("Schedule service is not configured");
|
|
2024
|
+
}
|
|
2025
|
+
await requireScheduleTarget(id, "new-agent");
|
|
2026
|
+
await scheduleService.pause(id);
|
|
2027
|
+
return {
|
|
2028
|
+
content: [],
|
|
2029
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
2030
|
+
};
|
|
2031
|
+
});
|
|
2032
|
+
registerTool("resume_schedule", {
|
|
2033
|
+
title: "Resume schedule",
|
|
2034
|
+
description: "Resume a paused schedule.",
|
|
2035
|
+
inputSchema: {
|
|
2036
|
+
id: z.string(),
|
|
2037
|
+
},
|
|
2038
|
+
outputSchema: {
|
|
2039
|
+
success: z.boolean(),
|
|
2040
|
+
},
|
|
2041
|
+
}, async ({ id }) => {
|
|
2042
|
+
if (!scheduleService) {
|
|
2043
|
+
throw new Error("Schedule service is not configured");
|
|
2044
|
+
}
|
|
2045
|
+
await requireScheduleTarget(id, "new-agent");
|
|
2046
|
+
await scheduleService.resume(id);
|
|
2047
|
+
return {
|
|
2048
|
+
content: [],
|
|
2049
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
2050
|
+
};
|
|
2051
|
+
});
|
|
2052
|
+
registerTool("delete_schedule", {
|
|
2053
|
+
title: "Delete schedule",
|
|
2054
|
+
description: "Delete a schedule permanently.",
|
|
2055
|
+
inputSchema: {
|
|
2056
|
+
id: z.string(),
|
|
2057
|
+
},
|
|
2058
|
+
outputSchema: {
|
|
2059
|
+
success: z.boolean(),
|
|
2060
|
+
},
|
|
2061
|
+
}, async ({ id }) => {
|
|
2062
|
+
if (!scheduleService) {
|
|
2063
|
+
throw new Error("Schedule service is not configured");
|
|
2064
|
+
}
|
|
2065
|
+
await requireScheduleTarget(id, "new-agent");
|
|
2066
|
+
await scheduleService.delete(id);
|
|
2067
|
+
return {
|
|
2068
|
+
content: [],
|
|
2069
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
2070
|
+
};
|
|
2071
|
+
});
|
|
2072
|
+
registerTool("update_schedule", {
|
|
2073
|
+
title: "Update schedule",
|
|
2074
|
+
description: "Update an existing schedule. Only provided fields are changed; omitted fields remain unchanged.",
|
|
2075
|
+
inputSchema: z
|
|
2076
|
+
.object({
|
|
2077
|
+
id: z.string(),
|
|
2078
|
+
cron: z.string().optional().describe("New cron expression."),
|
|
2079
|
+
timezone: z
|
|
2080
|
+
.string()
|
|
2081
|
+
.trim()
|
|
2082
|
+
.min(1)
|
|
2083
|
+
.optional()
|
|
2084
|
+
.describe("IANA time zone for cron cadence; requires cron. For example: America/New_York."),
|
|
2085
|
+
name: z.string().nullable().optional().describe("New name (null to clear)."),
|
|
2086
|
+
prompt: z.string().trim().min(1).optional().describe("New prompt text."),
|
|
2087
|
+
maxRuns: z
|
|
2088
|
+
.number()
|
|
2089
|
+
.int()
|
|
2090
|
+
.positive()
|
|
2091
|
+
.nullable()
|
|
2092
|
+
.optional()
|
|
2093
|
+
.describe("New max runs limit (null to clear)."),
|
|
2094
|
+
provider: z
|
|
2095
|
+
.string()
|
|
2096
|
+
.trim()
|
|
2097
|
+
.min(1)
|
|
2098
|
+
.optional()
|
|
2099
|
+
.describe("New provider for new-agent target."),
|
|
2100
|
+
model: z
|
|
2101
|
+
.string()
|
|
2102
|
+
.trim()
|
|
2103
|
+
.min(1)
|
|
2104
|
+
.nullable()
|
|
2105
|
+
.optional()
|
|
2106
|
+
.describe("New model for new-agent target (null to clear)."),
|
|
2107
|
+
mode: z
|
|
2108
|
+
.string()
|
|
2109
|
+
.trim()
|
|
2110
|
+
.min(1)
|
|
2111
|
+
.nullable()
|
|
2112
|
+
.optional()
|
|
2113
|
+
.describe("New mode for new-agent target (null to clear)."),
|
|
2114
|
+
cwd: z.string().trim().min(1).optional().describe("New cwd for new-agent target."),
|
|
2115
|
+
expiresIn: z
|
|
2116
|
+
.string()
|
|
2117
|
+
.optional()
|
|
2118
|
+
.describe("New relative expiry duration (for example: 1h, 2d)."),
|
|
2119
|
+
clearExpires: z.boolean().optional().describe("Clear any schedule expiry."),
|
|
2120
|
+
})
|
|
2121
|
+
.passthrough(),
|
|
2122
|
+
outputSchema: StoredScheduleSchema.shape,
|
|
2123
|
+
}, async (input) => {
|
|
2124
|
+
if (!scheduleService) {
|
|
2125
|
+
throw new Error("Schedule service is not configured");
|
|
2126
|
+
}
|
|
2127
|
+
await requireScheduleTarget(input.id, "new-agent");
|
|
2128
|
+
const schedule = await scheduleService.update(buildScheduleUpdateInput(input));
|
|
2129
|
+
return {
|
|
2130
|
+
content: [],
|
|
2131
|
+
structuredContent: ensureValidJson(schedule),
|
|
2132
|
+
};
|
|
2133
|
+
});
|
|
2134
|
+
registerTool("schedule_logs", {
|
|
2135
|
+
title: "Schedule logs",
|
|
2136
|
+
description: "Get the run history (logs) for a schedule.",
|
|
2137
|
+
inputSchema: {
|
|
2138
|
+
id: z.string(),
|
|
2139
|
+
},
|
|
2140
|
+
outputSchema: {
|
|
2141
|
+
runs: z.array(ScheduleRunSchema),
|
|
2142
|
+
},
|
|
2143
|
+
}, async ({ id }) => {
|
|
2144
|
+
if (!scheduleService) {
|
|
2145
|
+
throw new Error("Schedule service is not configured");
|
|
2146
|
+
}
|
|
2147
|
+
await requireScheduleTarget(id, "new-agent");
|
|
2148
|
+
const runs = await scheduleService.logs(id);
|
|
2149
|
+
return {
|
|
2150
|
+
content: [],
|
|
2151
|
+
structuredContent: ensureValidJson({ runs }),
|
|
2152
|
+
};
|
|
2153
|
+
});
|
|
2154
|
+
registerTool("run_schedule_once", {
|
|
2155
|
+
title: "Run schedule once",
|
|
2156
|
+
description: "Run a schedule immediately without changing its cron cadence.",
|
|
2157
|
+
inputSchema: { id: z.string().min(1) },
|
|
2158
|
+
outputSchema: StoredScheduleSchema.shape,
|
|
2159
|
+
}, async ({ id }) => {
|
|
2160
|
+
if (!scheduleService) {
|
|
2161
|
+
throw new Error("Schedule service is not configured");
|
|
2162
|
+
}
|
|
2163
|
+
await requireScheduleTarget(id, "new-agent");
|
|
2164
|
+
const schedule = await scheduleService.runOnce(id);
|
|
2165
|
+
return {
|
|
2166
|
+
content: [],
|
|
2167
|
+
structuredContent: ensureValidJson(schedule),
|
|
2168
|
+
};
|
|
2169
|
+
});
|
|
2170
|
+
registerTool("list_providers", {
|
|
2171
|
+
title: "List providers",
|
|
2172
|
+
description: "List configured agent providers and accounts, including availability, modes, and each account's base provider.",
|
|
2173
|
+
inputSchema: {},
|
|
2174
|
+
outputSchema: {
|
|
2175
|
+
providers: z.array(ProviderSummarySchema),
|
|
2176
|
+
},
|
|
2177
|
+
}, async () => {
|
|
2178
|
+
const providers = (await providerSnapshotManager.listProviders({ wait: true })).map(toProviderSummary);
|
|
2179
|
+
return {
|
|
2180
|
+
content: [],
|
|
2181
|
+
structuredContent: ensureValidJson({ providers }),
|
|
2182
|
+
};
|
|
2183
|
+
});
|
|
2184
|
+
registerTool("list_models", {
|
|
2185
|
+
title: "List models",
|
|
2186
|
+
description: "List models for an agent provider.",
|
|
2187
|
+
inputSchema: {
|
|
2188
|
+
provider: AgentProviderEnum,
|
|
2189
|
+
},
|
|
2190
|
+
outputSchema: {
|
|
2191
|
+
provider: z.string(),
|
|
2192
|
+
models: z.array(AgentModelSchema),
|
|
2193
|
+
},
|
|
2194
|
+
}, async ({ provider }) => {
|
|
2195
|
+
const models = await providerSnapshotManager.listModels({
|
|
2196
|
+
provider,
|
|
2197
|
+
wait: true,
|
|
2198
|
+
});
|
|
2199
|
+
return {
|
|
2200
|
+
content: [],
|
|
2201
|
+
structuredContent: ensureValidJson({
|
|
2202
|
+
provider,
|
|
2203
|
+
models,
|
|
2204
|
+
}),
|
|
2205
|
+
};
|
|
2206
|
+
});
|
|
2207
|
+
registerTool("list_profiles", {
|
|
2208
|
+
title: "List agent profiles",
|
|
2209
|
+
description: "List agent profiles: named provider/model/mode bundles a human configured for specific " +
|
|
2210
|
+
"kinds of work. Read each profile's `notes` to pick the one that fits the task you're " +
|
|
2211
|
+
"delegating, then copy its `provider`, `model`, `modeId`, `thinkingOptionId`, and " +
|
|
2212
|
+
"`featureValues` into create_agent (there is no `profile` parameter). Returns an empty " +
|
|
2213
|
+
"list if none are configured.",
|
|
2214
|
+
inputSchema: {},
|
|
2215
|
+
outputSchema: {
|
|
2216
|
+
profiles: z.array(AgentProfileSchema),
|
|
2217
|
+
},
|
|
2218
|
+
}, async () => {
|
|
2219
|
+
const profiles = daemonConfigStore?.get().agentProfiles ?? [];
|
|
2220
|
+
return {
|
|
2221
|
+
content: [],
|
|
2222
|
+
structuredContent: ensureValidJson({ profiles }),
|
|
2223
|
+
};
|
|
2224
|
+
});
|
|
2225
|
+
registerTool("inspect_provider", {
|
|
2226
|
+
title: "Inspect provider",
|
|
2227
|
+
description: "Inspect compact provider capabilities for orchestration, including modes and draft feature settings. Use list_models for the full model list.",
|
|
2228
|
+
inputSchema: inspectProviderInputSchema,
|
|
2229
|
+
outputSchema: {
|
|
2230
|
+
provider: AgentProviderEnum,
|
|
2231
|
+
label: z.string().nullable().optional(),
|
|
2232
|
+
description: z.string().nullable().optional(),
|
|
2233
|
+
enabled: z.boolean(),
|
|
2234
|
+
source: z.enum(["builtin", "custom"]).optional(),
|
|
2235
|
+
baseProviderId: z.string().optional(),
|
|
2236
|
+
status: z.string(),
|
|
2237
|
+
modes: z.array(ProviderModeSchema).nullish(),
|
|
2238
|
+
selectedModel: z.string().nullable(),
|
|
2239
|
+
features: z.array(AgentFeatureSchema),
|
|
2240
|
+
},
|
|
2241
|
+
}, async ({ provider, cwd, settings }) => {
|
|
2242
|
+
const resolvedProviderModel = resolveScheduleProviderAndModel({
|
|
2243
|
+
provider,
|
|
2244
|
+
defaultProvider: provider,
|
|
2245
|
+
});
|
|
2246
|
+
const providerId = resolvedProviderModel.provider;
|
|
2247
|
+
const resolvedCwd = resolveScopedCwd(cwd, { required: true });
|
|
2248
|
+
const entry = await providerSnapshotManager.getProvider({
|
|
2249
|
+
cwd: resolvedCwd,
|
|
2250
|
+
provider: providerId,
|
|
2251
|
+
wait: true,
|
|
2252
|
+
});
|
|
2253
|
+
const summary = toProviderSummary(entry);
|
|
2254
|
+
if (!entry.enabled) {
|
|
2255
|
+
throw new Error(`Provider '${providerId}' is disabled`);
|
|
2256
|
+
}
|
|
2257
|
+
if (entry.status !== "ready") {
|
|
2258
|
+
throw new Error(entry.error ?? `Provider '${providerId}' is unavailable`);
|
|
2259
|
+
}
|
|
2260
|
+
const selectedModel = settings?.model ?? resolvedProviderModel.model;
|
|
2261
|
+
const features = await agentManager.listDraftFeatures({
|
|
2262
|
+
provider: providerId,
|
|
2263
|
+
cwd: resolvedCwd,
|
|
2264
|
+
...(settings?.modeId ? { modeId: settings.modeId } : {}),
|
|
2265
|
+
...(selectedModel ? { model: selectedModel } : {}),
|
|
2266
|
+
...(settings?.thinkingOptionId ? { thinkingOptionId: settings.thinkingOptionId } : {}),
|
|
2267
|
+
...(settings?.features ? { featureValues: settings.features } : {}),
|
|
2268
|
+
});
|
|
2269
|
+
return {
|
|
2270
|
+
content: [],
|
|
2271
|
+
structuredContent: ensureValidJson({
|
|
2272
|
+
provider: providerId,
|
|
2273
|
+
label: summary.label,
|
|
2274
|
+
description: summary.description,
|
|
2275
|
+
enabled: summary.enabled,
|
|
2276
|
+
...(summary.source ? { source: summary.source } : {}),
|
|
2277
|
+
...(summary.baseProviderId ? { baseProviderId: summary.baseProviderId } : {}),
|
|
2278
|
+
status: summary.status,
|
|
2279
|
+
modes: summary.modes,
|
|
2280
|
+
selectedModel: selectedModel ?? null,
|
|
2281
|
+
features,
|
|
2282
|
+
}),
|
|
2283
|
+
};
|
|
2284
|
+
});
|
|
2285
|
+
registerTool("get_agent_activity", {
|
|
2286
|
+
title: "Get agent activity",
|
|
2287
|
+
description: "Return recent agent timeline entries as a curated summary.",
|
|
2288
|
+
inputSchema: {
|
|
2289
|
+
agentId: z.string(),
|
|
2290
|
+
limit: z
|
|
2291
|
+
.number()
|
|
2292
|
+
.optional()
|
|
2293
|
+
.describe("Optional limit for number of activities to include (most recent first)."),
|
|
2294
|
+
},
|
|
2295
|
+
outputSchema: {
|
|
2296
|
+
agentId: z.string(),
|
|
2297
|
+
updateCount: z.number(),
|
|
2298
|
+
currentModeId: z.string().nullable(),
|
|
2299
|
+
content: z.string(),
|
|
2300
|
+
},
|
|
2301
|
+
}, async ({ agentId, limit }) => {
|
|
2302
|
+
await ensureAgentLoaded(agentId, {
|
|
2303
|
+
agentManager,
|
|
2304
|
+
agentStorage,
|
|
2305
|
+
logger: childLogger,
|
|
2306
|
+
});
|
|
2307
|
+
const timeline = agentManager.getTimeline(agentId);
|
|
2308
|
+
const snapshot = agentManager.getAgent(agentId);
|
|
2309
|
+
const selection = selectItemsByProjectedLimit({
|
|
2310
|
+
items: timeline,
|
|
2311
|
+
direction: "tail",
|
|
2312
|
+
limit: limit ?? 0,
|
|
2313
|
+
});
|
|
2314
|
+
const curatedContent = curateAgentActivity(selection.items);
|
|
2315
|
+
const { totalProjected, shownProjected } = selection;
|
|
2316
|
+
const noun = totalProjected === 1 ? "activity" : "activities";
|
|
2317
|
+
const countHeader = limit && shownProjected < totalProjected
|
|
2318
|
+
? `Showing ${shownProjected} of ${totalProjected} ${noun} (limited to ${limit})`
|
|
2319
|
+
: `Showing all ${totalProjected} ${noun}`;
|
|
2320
|
+
const contentWithCount = `${countHeader}\n\n${curatedContent}`;
|
|
2321
|
+
return {
|
|
2322
|
+
content: [],
|
|
2323
|
+
structuredContent: ensureValidJson({
|
|
2324
|
+
agentId,
|
|
2325
|
+
updateCount: timeline.length,
|
|
2326
|
+
currentModeId: snapshot?.currentModeId ?? null,
|
|
2327
|
+
content: contentWithCount,
|
|
2328
|
+
}),
|
|
2329
|
+
};
|
|
2330
|
+
});
|
|
2331
|
+
registerTool("set_agent_mode", {
|
|
2332
|
+
title: "Set agent session mode",
|
|
2333
|
+
description: "Switch the agent's session mode (plan, bypassPermissions, read-only, auto, etc.).",
|
|
2334
|
+
inputSchema: {
|
|
2335
|
+
agentId: z.string(),
|
|
2336
|
+
modeId: z.string(),
|
|
2337
|
+
},
|
|
2338
|
+
outputSchema: {
|
|
2339
|
+
success: z.boolean(),
|
|
2340
|
+
newMode: z.string(),
|
|
2341
|
+
},
|
|
2342
|
+
}, async ({ agentId, modeId }) => {
|
|
2343
|
+
const result = await setAgentModeCommand({ agentManager }, { agentId, modeId });
|
|
2344
|
+
return {
|
|
2345
|
+
content: [],
|
|
2346
|
+
structuredContent: ensureValidJson({ success: true, newMode: result.modeId }),
|
|
2347
|
+
};
|
|
2348
|
+
});
|
|
2349
|
+
registerTool("list_pending_permissions", {
|
|
2350
|
+
title: "List pending permissions",
|
|
2351
|
+
description: "Return all pending permission requests across all agents with the normalized payloads.",
|
|
2352
|
+
inputSchema: {},
|
|
2353
|
+
outputSchema: {
|
|
2354
|
+
permissions: z.array(z.object({
|
|
2355
|
+
agentId: z.string(),
|
|
2356
|
+
status: AgentStatusEnum,
|
|
2357
|
+
request: AgentPermissionRequestPayloadSchema,
|
|
2358
|
+
})),
|
|
2359
|
+
},
|
|
2360
|
+
}, async () => {
|
|
2361
|
+
const permissions = agentManager.listAgents().flatMap((agent) => {
|
|
2362
|
+
const payload = toAgentPayload(agent);
|
|
2363
|
+
return payload.pendingPermissions.map((request) => ({
|
|
2364
|
+
agentId: agent.id,
|
|
2365
|
+
status: payload.status,
|
|
2366
|
+
request: sanitizePermissionRequest(request),
|
|
2367
|
+
}));
|
|
2368
|
+
});
|
|
2369
|
+
return {
|
|
2370
|
+
content: [],
|
|
2371
|
+
structuredContent: ensureValidJson({ permissions }),
|
|
2372
|
+
};
|
|
2373
|
+
});
|
|
2374
|
+
registerTool("respond_to_permission", {
|
|
2375
|
+
title: "Respond to permission",
|
|
2376
|
+
description: "Approve or deny a pending permission request with an AgentManager-compatible response payload.",
|
|
2377
|
+
inputSchema: {
|
|
2378
|
+
agentId: z.string(),
|
|
2379
|
+
requestId: z.string(),
|
|
2380
|
+
response: AgentPermissionResponseSchema,
|
|
2381
|
+
},
|
|
2382
|
+
outputSchema: {
|
|
2383
|
+
success: z.boolean(),
|
|
2384
|
+
},
|
|
2385
|
+
}, async ({ agentId, requestId, response }) => {
|
|
2386
|
+
await respondToAgentPermission({
|
|
2387
|
+
agentManager,
|
|
2388
|
+
agentId,
|
|
2389
|
+
requestId,
|
|
2390
|
+
response,
|
|
2391
|
+
logger: childLogger,
|
|
2392
|
+
});
|
|
2393
|
+
return {
|
|
2394
|
+
content: [],
|
|
2395
|
+
structuredContent: ensureValidJson({ success: true }),
|
|
2396
|
+
};
|
|
2397
|
+
});
|
|
2398
|
+
return toCatalog();
|
|
2399
|
+
}
|
|
2400
|
+
function archiveWorktreeDependencies(options, context) {
|
|
2401
|
+
if (!options.github) {
|
|
2402
|
+
throw new Error("GitHub service is required to archive worktrees");
|
|
2403
|
+
}
|
|
2404
|
+
if (!options.workspaceGitService) {
|
|
2405
|
+
throw new Error("WorkspaceGitService is required to archive worktrees");
|
|
2406
|
+
}
|
|
2407
|
+
if (!options.archiveWorkspaceRecord) {
|
|
2408
|
+
throw new Error("Workspace registry archiver is required to archive worktrees");
|
|
2409
|
+
}
|
|
2410
|
+
if (!options.findWorkspaceIdForCwd) {
|
|
2411
|
+
throw new Error("Workspace resolver is required to archive worktrees");
|
|
2412
|
+
}
|
|
2413
|
+
if (!options.listActiveWorkspaces) {
|
|
2414
|
+
throw new Error("Active workspace lister is required to archive worktrees");
|
|
2415
|
+
}
|
|
2416
|
+
if (!options.emitWorkspaceUpdatesForWorkspaceIds) {
|
|
2417
|
+
throw new Error("Workspace update emitter is required to archive worktrees");
|
|
2418
|
+
}
|
|
2419
|
+
if (!options.markWorkspaceArchiving) {
|
|
2420
|
+
throw new Error("Workspace archiving marker is required to archive worktrees");
|
|
2421
|
+
}
|
|
2422
|
+
if (!options.clearWorkspaceArchiving) {
|
|
2423
|
+
throw new Error("Workspace archiving clearer is required to archive worktrees");
|
|
2424
|
+
}
|
|
2425
|
+
return {
|
|
2426
|
+
paseoHome: options.paseoHome,
|
|
2427
|
+
paseoWorktreesBaseRoot: options.worktreesRoot,
|
|
2428
|
+
github: options.github,
|
|
2429
|
+
workspaceGitService: options.workspaceGitService,
|
|
2430
|
+
agentManager: context.agentManager,
|
|
2431
|
+
agentStorage: context.agentStorage,
|
|
2432
|
+
findWorkspaceIdForCwd: options.findWorkspaceIdForCwd,
|
|
2433
|
+
listActiveWorkspaces: options.listActiveWorkspaces,
|
|
2434
|
+
archiveWorkspaceRecord: options.archiveWorkspaceRecord,
|
|
2435
|
+
emitWorkspaceUpdatesForWorkspaceIds: options.emitWorkspaceUpdatesForWorkspaceIds,
|
|
2436
|
+
markWorkspaceArchiving: options.markWorkspaceArchiving,
|
|
2437
|
+
clearWorkspaceArchiving: options.clearWorkspaceArchiving,
|
|
2438
|
+
killTerminalsForWorkspace: (workspaceId) => killTerminalsForWorkspace({
|
|
2439
|
+
terminalManager: context.terminalManager,
|
|
2440
|
+
sessionLogger: context.logger,
|
|
2441
|
+
}, workspaceId),
|
|
2442
|
+
sessionLogger: context.logger,
|
|
2443
|
+
};
|
|
2444
|
+
}
|
|
2445
|
+
//# sourceMappingURL=paseo-tools.js.map
|