@getpaseo/server 0.1.62 → 0.1.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
- package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
- package/dist/server/client/daemon-client-transport-types.d.ts +13 -13
- package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.d.ts +1 -1
- package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.js +5 -4
- package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +59 -37
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +62 -17
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
- package/dist/server/server/agent/agent-loading.js +5 -3
- package/dist/server/server/agent/agent-loading.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +45 -19
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +393 -290
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -6
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.js +46 -38
- package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
- package/dist/server/server/agent/agent-projections.d.ts +4 -6
- package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
- package/dist/server/server/agent/agent-projections.js +59 -65
- package/dist/server/server/agent/agent-projections.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +58 -45
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +43 -40
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
- package/dist/server/server/agent/agent-storage.d.ts +2 -2
- package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
- package/dist/server/server/agent/agent-storage.js +29 -36
- package/dist/server/server/agent/agent-storage.js.map +1 -1
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +6 -6
- package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
- package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
- package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store.js +85 -64
- package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +185 -148
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/mcp-shared.d.ts +9 -2
- package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-shared.js +2 -0
- package/dist/server/server/agent/mcp-shared.js.map +1 -1
- package/dist/server/server/agent/model-resolver.d.ts +2 -2
- package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
- package/dist/server/server/agent/model-resolver.js +9 -5
- package/dist/server/server/agent/model-resolver.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +20 -9
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts +4 -2
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +24 -21
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
- package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
- package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.d.ts +11 -12
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.js +148 -122
- package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +20 -13
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +610 -460
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +49 -44
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +27 -8
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +564 -492
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
- package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
- package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +385 -360
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
- package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +3 -3
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +2 -2
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.js +63 -53
- package/dist/server/server/agent/stt-manager.js.map +1 -1
- package/dist/server/server/agent/timeline-projection.d.ts +6 -6
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.js +11 -6
- package/dist/server/server/agent/timeline-projection.js.map +1 -1
- package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
- package/dist/server/server/agent/tts-manager.js +1 -0
- package/dist/server/server/agent/tts-manager.js.map +1 -1
- package/dist/server/server/agent-attention-policy.d.ts +2 -2
- package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
- package/dist/server/server/bootstrap.d.ts +4 -4
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +493 -485
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/chat/chat-service.d.ts +1 -1
- package/dist/server/server/chat/chat-service.d.ts.map +1 -1
- package/dist/server/server/chat/chat-service.js +3 -3
- package/dist/server/server/chat/chat-service.js.map +1 -1
- package/dist/server/server/checkout-diff-manager.d.ts +2 -2
- package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
- package/dist/server/server/checkout-git-utils.d.ts +5 -3
- package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
- package/dist/server/server/checkout-git-utils.js +1 -2
- package/dist/server/server/checkout-git-utils.js.map +1 -1
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +68 -39
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/connection-offer.d.ts +2 -2
- package/dist/server/server/connection-offer.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.d.ts +5 -3
- package/dist/server/server/daemon-config-store.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.js +26 -0
- package/dist/server/server/daemon-config-store.js.map +1 -1
- package/dist/server/server/daemon-keypair.d.ts +2 -2
- package/dist/server/server/daemon-keypair.d.ts.map +1 -1
- package/dist/server/server/editor-targets.d.ts +4 -4
- package/dist/server/server/editor-targets.d.ts.map +1 -1
- package/dist/server/server/editor-targets.js +11 -15
- package/dist/server/server/editor-targets.js.map +1 -1
- package/dist/server/server/exports.d.ts +3 -3
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +1 -3
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/file-download/token-store.d.ts +4 -4
- package/dist/server/server/file-download/token-store.d.ts.map +1 -1
- package/dist/server/server/index.js +16 -12
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/logger.d.ts +4 -4
- package/dist/server/server/logger.d.ts.map +1 -1
- package/dist/server/server/logger.js +26 -20
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
- package/dist/server/server/loop-service.d.ts +13 -12
- package/dist/server/server/loop-service.d.ts.map +1 -1
- package/dist/server/server/loop-service.js +22 -18
- package/dist/server/server/loop-service.js.map +1 -1
- package/dist/server/server/package-version.d.ts +2 -2
- package/dist/server/server/package-version.d.ts.map +1 -1
- package/dist/server/server/package-version.js +19 -17
- package/dist/server/server/package-version.js.map +1 -1
- package/dist/server/server/pairing-offer.d.ts +2 -2
- package/dist/server/server/pairing-offer.d.ts.map +1 -1
- package/dist/server/server/paseo-env.d.ts +9 -0
- package/dist/server/server/paseo-env.d.ts.map +1 -0
- package/dist/server/server/paseo-env.js +70 -0
- package/dist/server/server/paseo-env.js.map +1 -0
- package/dist/server/server/paseo-worktree-archive-service.d.ts +4 -4
- package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-archive-service.js +11 -11
- package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +62 -62
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +4 -4
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/persistence-hooks.d.ts +8 -9
- package/dist/server/server/persistence-hooks.d.ts.map +1 -1
- package/dist/server/server/persistence-hooks.js +4 -12
- package/dist/server/server/persistence-hooks.js.map +1 -1
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/push/push-service.d.ts.map +1 -1
- package/dist/server/server/push/push-service.js +1 -3
- package/dist/server/server/push/push-service.js.map +1 -1
- package/dist/server/server/relay-transport.d.ts +8 -8
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +27 -16
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/schedule/service.d.ts.map +1 -1
- package/dist/server/server/schedule/service.js +2 -2
- package/dist/server/server/schedule/service.js.map +1 -1
- package/dist/server/server/script-health-monitor.d.ts.map +1 -1
- package/dist/server/server/script-health-monitor.js +7 -6
- package/dist/server/server/script-health-monitor.js.map +1 -1
- package/dist/server/server/script-proxy.js +1 -1
- package/dist/server/server/script-proxy.js.map +1 -1
- package/dist/server/server/script-status-projection.d.ts +4 -4
- package/dist/server/server/script-status-projection.d.ts.map +1 -1
- package/dist/server/server/script-status-projection.js +54 -44
- package/dist/server/server/script-status-projection.js.map +1 -1
- package/dist/server/server/server-id.d.ts +4 -4
- package/dist/server/server/server-id.d.ts.map +1 -1
- package/dist/server/server/session.d.ts +45 -14
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +1098 -761
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/audio.js +1 -1
- package/dist/server/server/speech/audio.js.map +1 -1
- package/dist/server/server/speech/providers/local/config.d.ts +6 -6
- package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/config.js +41 -16
- package/dist/server/server/speech/providers/local/config.js.map +1 -1
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
- package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.js +108 -77
- package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
- package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
- package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/config.js +58 -31
- package/dist/server/server/speech/providers/openai/config.js.map +1 -1
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
- package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
- package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/runtime.js +37 -32
- package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
- package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/stt.js +4 -3
- package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
- package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/tts.js +3 -2
- package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.js +46 -17
- package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
- package/dist/server/server/speech/speech-provider.d.ts +2 -2
- package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.d.ts +6 -6
- package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.js +17 -17
- package/dist/server/server/speech/speech-runtime.js.map +1 -1
- package/dist/server/server/speech/speech-types.d.ts +2 -2
- package/dist/server/server/speech/speech-types.d.ts.map +1 -1
- package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
- package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
- package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
- package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
- package/dist/server/server/utils/diff-highlighter.js +67 -66
- package/dist/server/server/utils/diff-highlighter.js.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.js +1 -0
- package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
- package/dist/server/server/voice-types.d.ts +2 -2
- package/dist/server/server/voice-types.d.ts.map +1 -1
- package/dist/server/server/websocket-server.d.ts +31 -21
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +299 -197
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-git-metadata.d.ts +2 -2
- package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
- package/dist/server/server/workspace-git-metadata.js +2 -32
- package/dist/server/server/workspace-git-metadata.js.map +1 -1
- package/dist/server/server/workspace-git-service.d.ts +8 -4
- package/dist/server/server/workspace-git-service.d.ts.map +1 -1
- package/dist/server/server/workspace-git-service.js +163 -115
- package/dist/server/server/workspace-git-service.js.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
- package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.js +82 -82
- package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
- package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-bootstrap.js +40 -33
- package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
- package/dist/server/server/workspace-registry-model.d.ts +19 -6
- package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-model.js +35 -21
- package/dist/server/server/workspace-registry-model.js.map +1 -1
- package/dist/server/server/workspace-registry.d.ts +2 -2
- package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
- package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
- package/dist/server/server/workspace-service-env.js +3 -3
- package/dist/server/server/workspace-service-env.js.map +1 -1
- package/dist/server/server/worktree-bootstrap.d.ts +4 -4
- package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
- package/dist/server/server/worktree-bootstrap.js +95 -67
- package/dist/server/server/worktree-bootstrap.js.map +1 -1
- package/dist/server/server/worktree-session.d.ts +8 -8
- package/dist/server/server/worktree-session.d.ts.map +1 -1
- package/dist/server/server/worktree-session.js +27 -19
- package/dist/server/server/worktree-session.js.map +1 -1
- package/dist/server/services/github-service.d.ts +1 -7
- package/dist/server/services/github-service.d.ts.map +1 -1
- package/dist/server/services/github-service.js +123 -143
- package/dist/server/services/github-service.js.map +1 -1
- package/dist/server/shared/agent-attention-notification.d.ts +9 -8
- package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
- package/dist/server/shared/agent-attention-notification.js +27 -17
- package/dist/server/shared/agent-attention-notification.js.map +1 -1
- package/dist/server/shared/daemon-endpoints.d.ts +2 -2
- package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
- package/dist/server/shared/daemon-endpoints.js +17 -2
- package/dist/server/shared/daemon-endpoints.js.map +1 -1
- package/dist/server/shared/messages.d.ts +21962 -3049
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +79 -2
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/terminal-stream-protocol.d.ts +2 -2
- package/dist/server/shared/terminal-stream-protocol.d.ts.map +1 -1
- package/dist/server/shared/tool-call-display.d.ts +2 -2
- package/dist/server/shared/tool-call-display.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.js +1 -3
- package/dist/server/terminal/terminal-manager.js.map +1 -1
- package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
- package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
- package/dist/server/terminal/terminal.d.ts +3 -2
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +57 -19
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/utils/checkout-git.d.ts +13 -12
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +351 -281
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/directory-suggestions.js +12 -33
- package/dist/server/utils/directory-suggestions.js.map +1 -1
- package/dist/server/utils/executable.d.ts +1 -14
- package/dist/server/utils/executable.d.ts.map +1 -1
- package/dist/server/utils/executable.js +13 -49
- package/dist/server/utils/executable.js.map +1 -1
- package/dist/server/utils/github-remote.d.ts +13 -0
- package/dist/server/utils/github-remote.d.ts.map +1 -0
- package/dist/server/utils/github-remote.js +128 -0
- package/dist/server/utils/github-remote.js.map +1 -0
- package/dist/server/utils/paseo-config-file.d.ts +30 -0
- package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-file.js +90 -0
- package/dist/server/utils/paseo-config-file.js.map +1 -0
- package/dist/server/utils/paseo-config-schema.d.ts +290 -0
- package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-schema.js +60 -0
- package/dist/server/utils/paseo-config-schema.js.map +1 -0
- package/dist/server/utils/project-icon.d.ts.map +1 -1
- package/dist/server/utils/project-icon.js +84 -109
- package/dist/server/utils/project-icon.js.map +1 -1
- package/dist/server/utils/promise-timeout.d.ts +2 -2
- package/dist/server/utils/promise-timeout.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.d.ts +3 -1
- package/dist/server/utils/run-git-command.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.js +10 -1
- package/dist/server/utils/run-git-command.js.map +1 -1
- package/dist/server/utils/script-hostname.d.ts +2 -2
- package/dist/server/utils/script-hostname.d.ts.map +1 -1
- package/dist/server/utils/spawn.d.ts +10 -3
- package/dist/server/utils/spawn.d.ts.map +1 -1
- package/dist/server/utils/spawn.js +30 -5
- package/dist/server/utils/spawn.js.map +1 -1
- package/dist/server/utils/windows-command.d.ts +15 -0
- package/dist/server/utils/windows-command.d.ts.map +1 -0
- package/dist/server/utils/windows-command.js +37 -0
- package/dist/server/utils/windows-command.js.map +1 -0
- package/dist/server/utils/worktree.d.ts +10 -7
- package/dist/server/utils/worktree.d.ts.map +1 -1
- package/dist/server/utils/worktree.js +64 -55
- package/dist/server/utils/worktree.js.map +1 -1
- package/dist/src/server/pid-lock.js.map +1 -1
- package/package.json +15 -20
- package/dist/server/server/agent/llm-openai.d.ts +0 -7
- package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
- package/dist/server/server/agent/llm-openai.js +0 -8
- package/dist/server/server/agent/llm-openai.js.map +0 -1
- package/dist/server/server/agent/orchestrator.d.ts +0 -12
- package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
- package/dist/server/server/agent/orchestrator.js +0 -12
- package/dist/server/server/agent/orchestrator.js.map +0 -1
- package/dist/server/server/types.d.ts +0 -5
- package/dist/server/server/types.d.ts.map +0 -1
- package/dist/server/server/types.js +0 -3
- package/dist/server/server/types.js.map +0 -1
- package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
- package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
- package/dist/server/server/workspace-registry.test-helpers.js +0 -121
- package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
|
@@ -8,7 +8,20 @@ import { AGENT_STREAM_COALESCE_DEFAULT_WINDOW_MS, AgentStreamCoalescer, } from "
|
|
|
8
8
|
import { getAgentProviderDefinition } from "./provider-manifest.js";
|
|
9
9
|
const RELOAD_SESSION_CLOSE_TIMEOUT_MS = 3000;
|
|
10
10
|
const INTERRUPT_SESSION_TIMEOUT_MS = 2000;
|
|
11
|
+
function formatProviderList(providers) {
|
|
12
|
+
return providers.length > 0 ? providers.join(", ") : "none";
|
|
13
|
+
}
|
|
11
14
|
export { AGENT_LIFECYCLE_STATUSES };
|
|
15
|
+
function resolveInitialAttention(input) {
|
|
16
|
+
if (input == null || !input.requiresAttention) {
|
|
17
|
+
return { requiresAttention: false };
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
requiresAttention: true,
|
|
21
|
+
attentionReason: input.attentionReason,
|
|
22
|
+
attentionTimestamp: new Date(input.attentionTimestamp),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
12
25
|
const SYSTEM_ERROR_PREFIX = "[System Error]";
|
|
13
26
|
function attachPersistenceCwd(handle, cwd) {
|
|
14
27
|
if (!handle) {
|
|
@@ -17,28 +30,30 @@ function attachPersistenceCwd(handle, cwd) {
|
|
|
17
30
|
return {
|
|
18
31
|
...handle,
|
|
19
32
|
metadata: {
|
|
20
|
-
...
|
|
33
|
+
...handle.metadata,
|
|
21
34
|
cwd,
|
|
22
35
|
},
|
|
23
36
|
};
|
|
24
37
|
}
|
|
25
|
-
const BUSY_STATUSES = ["initializing", "running"];
|
|
38
|
+
const BUSY_STATUSES = new Set(["initializing", "running"]);
|
|
26
39
|
const AgentIdSchema = z.string().uuid();
|
|
27
40
|
function isAgentBusy(status) {
|
|
28
|
-
return BUSY_STATUSES.
|
|
41
|
+
return BUSY_STATUSES.has(status);
|
|
29
42
|
}
|
|
30
43
|
function isTurnTerminalEvent(event) {
|
|
31
44
|
return (event.type === "turn_completed" ||
|
|
32
45
|
event.type === "turn_failed" ||
|
|
33
46
|
event.type === "turn_canceled");
|
|
34
47
|
}
|
|
48
|
+
function abortMessage(reason, fallbackMessage) {
|
|
49
|
+
if (typeof reason === "string")
|
|
50
|
+
return reason;
|
|
51
|
+
if (reason instanceof Error)
|
|
52
|
+
return reason.message;
|
|
53
|
+
return fallbackMessage;
|
|
54
|
+
}
|
|
35
55
|
function createAbortError(signal, fallbackMessage) {
|
|
36
|
-
const
|
|
37
|
-
const message = typeof reason === "string"
|
|
38
|
-
? reason
|
|
39
|
-
: reason instanceof Error
|
|
40
|
-
? reason.message
|
|
41
|
-
: fallbackMessage;
|
|
56
|
+
const message = abortMessage(signal?.reason, fallbackMessage);
|
|
42
57
|
return Object.assign(new Error(message), { name: "AbortError" });
|
|
43
58
|
}
|
|
44
59
|
function validateAgentId(agentId, source) {
|
|
@@ -55,9 +70,34 @@ function normalizeMessageId(messageId) {
|
|
|
55
70
|
const trimmed = messageId.trim();
|
|
56
71
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
57
72
|
}
|
|
73
|
+
function isDuplicateLegacyUserMessage(item, canonicalUserMessagesById) {
|
|
74
|
+
if (item.type !== "user_message") {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const eventMessageId = normalizeMessageId(item.messageId);
|
|
78
|
+
if (!eventMessageId) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return canonicalUserMessagesById.get(eventMessageId) === item.text;
|
|
82
|
+
}
|
|
83
|
+
function buildExplicitTimelineSeedForRegister(now, options) {
|
|
84
|
+
const hasTimeline = Boolean(options?.timeline?.length);
|
|
85
|
+
const hasTimelineRows = Boolean(options?.timelineRows?.length);
|
|
86
|
+
const hasTimelineNextSeq = options?.timelineNextSeq !== undefined;
|
|
87
|
+
if (!hasTimeline && !hasTimelineRows && !hasTimelineNextSeq) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
items: options?.timeline,
|
|
92
|
+
rows: options?.timelineRows,
|
|
93
|
+
nextSeq: options?.timelineNextSeq,
|
|
94
|
+
timestamp: (options?.updatedAt ?? options?.createdAt ?? now).toISOString(),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
58
97
|
export class AgentManager {
|
|
59
98
|
constructor(options) {
|
|
60
99
|
this.clients = new Map();
|
|
100
|
+
this.providerEnabled = new Map();
|
|
61
101
|
this.agents = new Map();
|
|
62
102
|
this.timelineStore = new InMemoryAgentTimelineStore();
|
|
63
103
|
this.agentsAwaitingInitialSnapshotPersist = new Set();
|
|
@@ -84,17 +124,26 @@ export class AgentManager {
|
|
|
84
124
|
this.notifyForegroundTurnWaiters(agentId, event);
|
|
85
125
|
},
|
|
86
126
|
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
127
|
+
this.updateProviderRegistry({
|
|
128
|
+
providerDefinitions: options.providerDefinitions ?? {},
|
|
129
|
+
clients: options.clients ?? {},
|
|
130
|
+
});
|
|
94
131
|
}
|
|
95
132
|
registerClient(provider, client) {
|
|
96
133
|
this.clients.set(provider, client);
|
|
97
134
|
}
|
|
135
|
+
updateProviderRegistry(input) {
|
|
136
|
+
for (const [provider, definition] of Object.entries(input.providerDefinitions)) {
|
|
137
|
+
if (definition) {
|
|
138
|
+
this.providerEnabled.set(provider, definition.enabled);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
for (const [provider, client] of Object.entries(input.clients)) {
|
|
142
|
+
if (client) {
|
|
143
|
+
this.clients.set(provider, client);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
98
147
|
getRegisteredProviderIds() {
|
|
99
148
|
return Array.from(this.clients.keys());
|
|
100
149
|
}
|
|
@@ -187,9 +236,7 @@ export class AgentManager {
|
|
|
187
236
|
listAgents() {
|
|
188
237
|
return Array.from(this.agents.values())
|
|
189
238
|
.filter((agent) => !agent.internal)
|
|
190
|
-
.map((agent) => ({
|
|
191
|
-
...agent,
|
|
192
|
-
}));
|
|
239
|
+
.map((agent) => Object.assign({}, agent));
|
|
193
240
|
}
|
|
194
241
|
async listPersistedAgents(options) {
|
|
195
242
|
if (options?.provider) {
|
|
@@ -199,21 +246,17 @@ export class AgentManager {
|
|
|
199
246
|
}
|
|
200
247
|
return client.listPersistedAgents({ limit: options.limit });
|
|
201
248
|
}
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
if (!client.listPersistedAgents) {
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
249
|
+
const providerEntries = Array.from(this.clients.entries()).filter(([, client]) => !!client.listPersistedAgents);
|
|
250
|
+
const descriptorLists = await Promise.all(providerEntries.map(async ([provider, client]) => {
|
|
207
251
|
try {
|
|
208
|
-
|
|
209
|
-
limit: options?.limit,
|
|
210
|
-
});
|
|
211
|
-
descriptors.push(...entries);
|
|
252
|
+
return await client.listPersistedAgents({ limit: options?.limit });
|
|
212
253
|
}
|
|
213
254
|
catch (error) {
|
|
214
255
|
this.logger.warn({ err: error, provider }, "Failed to list persisted agents for provider");
|
|
256
|
+
return [];
|
|
215
257
|
}
|
|
216
|
-
}
|
|
258
|
+
}));
|
|
259
|
+
const descriptors = descriptorLists.flat();
|
|
217
260
|
const limit = options?.limit ?? 20;
|
|
218
261
|
return descriptors
|
|
219
262
|
.sort((a, b) => b.lastActivityAt.getTime() - a.lastActivityAt.getTime())
|
|
@@ -322,16 +365,15 @@ export class AgentManager {
|
|
|
322
365
|
type: "http",
|
|
323
366
|
url: `${this.mcpBaseUrl}?callerAgentId=${resolvedAgentId}`,
|
|
324
367
|
},
|
|
325
|
-
...
|
|
368
|
+
...config.mcpServers,
|
|
326
369
|
},
|
|
327
370
|
};
|
|
371
|
+
this.requireEnabledProvider(injectedConfig.provider);
|
|
328
372
|
const normalizedConfig = await this.normalizeConfig(injectedConfig);
|
|
329
373
|
const launchContext = this.buildLaunchContext(resolvedAgentId);
|
|
330
|
-
const client = this.
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
throw new Error(`Provider '${normalizedConfig.provider}' is not available. Please ensure the CLI is installed.`);
|
|
334
|
-
}
|
|
374
|
+
const client = await this.requireAvailableClient({
|
|
375
|
+
provider: normalizedConfig.provider,
|
|
376
|
+
});
|
|
335
377
|
const session = await client.createSession(normalizedConfig, launchContext);
|
|
336
378
|
return this.registerSession(session, normalizedConfig, resolvedAgentId, {
|
|
337
379
|
labels: options?.labels,
|
|
@@ -443,10 +485,10 @@ export class AgentManager {
|
|
|
443
485
|
try {
|
|
444
486
|
return await Promise.race([
|
|
445
487
|
operation,
|
|
446
|
-
new Promise((
|
|
488
|
+
new Promise((resolvePromise) => {
|
|
447
489
|
timer = setTimeout(() => {
|
|
448
490
|
didTimeOut = true;
|
|
449
|
-
|
|
491
|
+
resolvePromise("timed_out");
|
|
450
492
|
}, options.timeoutMs);
|
|
451
493
|
}),
|
|
452
494
|
]);
|
|
@@ -766,10 +808,9 @@ export class AgentManager {
|
|
|
766
808
|
const agent = existingAgent;
|
|
767
809
|
agent.pendingReplacement = false;
|
|
768
810
|
agent.lastError = undefined;
|
|
769
|
-
const
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
const streamForwarder = (async function* streamForwarder() {
|
|
811
|
+
const pendingRun = this.createPendingForegroundRun();
|
|
812
|
+
this.pendingForegroundRuns.set(agentId, pendingRun);
|
|
813
|
+
const streamForwarder = async function* streamForwarder() {
|
|
773
814
|
let turnId;
|
|
774
815
|
let waiter = null;
|
|
775
816
|
try {
|
|
@@ -778,20 +819,20 @@ export class AgentManager {
|
|
|
778
819
|
}
|
|
779
820
|
catch (error) {
|
|
780
821
|
const errorMsg = error instanceof Error ? error.message : "Failed to start turn";
|
|
781
|
-
|
|
822
|
+
this.handleStreamEvent(agent, {
|
|
782
823
|
type: "turn_failed",
|
|
783
824
|
provider: agent.provider,
|
|
784
825
|
error: errorMsg,
|
|
785
826
|
});
|
|
786
|
-
|
|
827
|
+
this.finalizeForegroundTurn(agent);
|
|
787
828
|
throw error;
|
|
788
829
|
}
|
|
789
830
|
pendingRun.started = true;
|
|
790
831
|
agent.activeForegroundTurnId = turnId;
|
|
791
832
|
agent.lifecycle = "running";
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
833
|
+
this.touchUpdatedAt(agent);
|
|
834
|
+
this.emitState(agent);
|
|
835
|
+
this.logger.trace({
|
|
795
836
|
agentId,
|
|
796
837
|
lifecycle: agent.lifecycle,
|
|
797
838
|
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
@@ -801,8 +842,8 @@ export class AgentManager {
|
|
|
801
842
|
let queueResolve = null;
|
|
802
843
|
let done = false;
|
|
803
844
|
let resolveSettled;
|
|
804
|
-
const settledPromise = new Promise((
|
|
805
|
-
resolveSettled =
|
|
845
|
+
const settledPromise = new Promise((resolvePromise) => {
|
|
846
|
+
resolveSettled = resolvePromise;
|
|
806
847
|
});
|
|
807
848
|
waiter = {
|
|
808
849
|
turnId,
|
|
@@ -832,8 +873,8 @@ export class AgentManager {
|
|
|
832
873
|
if (waiter.settled) {
|
|
833
874
|
break;
|
|
834
875
|
}
|
|
835
|
-
await new Promise((
|
|
836
|
-
queueResolve =
|
|
876
|
+
await new Promise((resolvePromise) => {
|
|
877
|
+
queueResolve = resolvePromise;
|
|
837
878
|
});
|
|
838
879
|
}
|
|
839
880
|
}
|
|
@@ -841,14 +882,14 @@ export class AgentManager {
|
|
|
841
882
|
finally {
|
|
842
883
|
if (waiter) {
|
|
843
884
|
agent.foregroundTurnWaiters.delete(waiter);
|
|
844
|
-
|
|
885
|
+
this.settleForegroundTurnWaiter(waiter);
|
|
845
886
|
}
|
|
846
|
-
|
|
887
|
+
this.settlePendingForegroundRun(agentId, pendingRun.token);
|
|
847
888
|
if (!agent.activeForegroundTurnId) {
|
|
848
|
-
await
|
|
889
|
+
await this.refreshRuntimeInfo(agent);
|
|
849
890
|
}
|
|
850
891
|
}
|
|
851
|
-
}
|
|
892
|
+
}.call(this);
|
|
852
893
|
return streamForwarder;
|
|
853
894
|
}
|
|
854
895
|
finalizeForegroundTurn(agent, turnId) {
|
|
@@ -859,11 +900,17 @@ export class AgentManager {
|
|
|
859
900
|
mutableAgent.activeForegroundTurnId = null;
|
|
860
901
|
const terminalError = mutableAgent.lastError;
|
|
861
902
|
const shouldHoldBusyForReplacement = mutableAgent.pendingReplacement && !terminalError;
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
903
|
+
let nextLifecycle;
|
|
904
|
+
if (shouldHoldBusyForReplacement) {
|
|
905
|
+
nextLifecycle = "running";
|
|
906
|
+
}
|
|
907
|
+
else if (terminalError) {
|
|
908
|
+
nextLifecycle = "error";
|
|
909
|
+
}
|
|
910
|
+
else {
|
|
911
|
+
nextLifecycle = "idle";
|
|
912
|
+
}
|
|
913
|
+
mutableAgent.lifecycle = nextLifecycle;
|
|
867
914
|
const persistenceHandle = mutableAgent.session.describePersistence() ??
|
|
868
915
|
(mutableAgent.runtimeInfo?.sessionId
|
|
869
916
|
? { provider: mutableAgent.provider, sessionId: mutableAgent.runtimeInfo.sessionId }
|
|
@@ -894,29 +941,28 @@ export class AgentManager {
|
|
|
894
941
|
agent.lifecycle = "running";
|
|
895
942
|
this.touchUpdatedAt(agent);
|
|
896
943
|
this.emitState(agent);
|
|
897
|
-
|
|
898
|
-
return (async function* replaceRunForwarder() {
|
|
944
|
+
return async function* replaceRunForwarder() {
|
|
899
945
|
try {
|
|
900
|
-
await
|
|
901
|
-
const nextRun =
|
|
946
|
+
await this.cancelAgentRun(agentId);
|
|
947
|
+
const nextRun = this.streamAgent(agentId, prompt, options);
|
|
902
948
|
for await (const event of nextRun) {
|
|
903
949
|
yield event;
|
|
904
950
|
}
|
|
905
951
|
}
|
|
906
952
|
catch (error) {
|
|
907
|
-
const latest =
|
|
953
|
+
const latest = this.agents.get(agentId);
|
|
908
954
|
if (latest) {
|
|
909
955
|
const latestActive = latest;
|
|
910
956
|
latestActive.pendingReplacement = false;
|
|
911
957
|
if (!latestActive.activeForegroundTurnId && latestActive.lifecycle === "running") {
|
|
912
958
|
latestActive.lifecycle = "idle";
|
|
913
|
-
|
|
914
|
-
|
|
959
|
+
this.touchUpdatedAt(latestActive);
|
|
960
|
+
this.emitState(latestActive);
|
|
915
961
|
}
|
|
916
962
|
}
|
|
917
963
|
throw error;
|
|
918
964
|
}
|
|
919
|
-
}
|
|
965
|
+
}.call(this);
|
|
920
966
|
}
|
|
921
967
|
async waitForAgentRunStart(agentId, options) {
|
|
922
968
|
const snapshot = this.getAgent(agentId);
|
|
@@ -933,7 +979,7 @@ export class AgentManager {
|
|
|
933
979
|
if (options?.signal?.aborted) {
|
|
934
980
|
throw createAbortError(options.signal, "wait_for_agent_start aborted");
|
|
935
981
|
}
|
|
936
|
-
await new Promise((
|
|
982
|
+
await new Promise((resolvePromise, reject) => {
|
|
937
983
|
if (options?.signal?.aborted) {
|
|
938
984
|
reject(createAbortError(options.signal, "wait_for_agent_start aborted"));
|
|
939
985
|
return;
|
|
@@ -962,7 +1008,7 @@ export class AgentManager {
|
|
|
962
1008
|
};
|
|
963
1009
|
const finishOk = () => {
|
|
964
1010
|
cleanup();
|
|
965
|
-
|
|
1011
|
+
resolvePromise();
|
|
966
1012
|
};
|
|
967
1013
|
const finishErr = (error) => {
|
|
968
1014
|
cleanup();
|
|
@@ -1045,19 +1091,19 @@ export class AgentManager {
|
|
|
1045
1091
|
// Wait briefly for the event to propagate if there's an active foreground turn.
|
|
1046
1092
|
if (foregroundTurnId) {
|
|
1047
1093
|
const waiter = Array.from(agent.foregroundTurnWaiters).find((candidate) => candidate.turnId === foregroundTurnId);
|
|
1048
|
-
const timeout = new Promise((
|
|
1094
|
+
const timeout = new Promise((resolvePromise) => setTimeout(resolvePromise, 2000));
|
|
1049
1095
|
if (waiter) {
|
|
1050
1096
|
await Promise.race([waiter.settledPromise, timeout]);
|
|
1051
1097
|
}
|
|
1052
1098
|
else if (agent.activeForegroundTurnId === foregroundTurnId) {
|
|
1053
1099
|
await Promise.race([
|
|
1054
|
-
new Promise((
|
|
1100
|
+
new Promise((resolvePromise) => {
|
|
1055
1101
|
const unsubscribe = this.subscribe((event) => {
|
|
1056
1102
|
if (event.type === "agent_state" &&
|
|
1057
1103
|
event.agent.id === agentId &&
|
|
1058
1104
|
!event.agent.activeForegroundTurnId) {
|
|
1059
1105
|
unsubscribe();
|
|
1060
|
-
|
|
1106
|
+
resolvePromise();
|
|
1061
1107
|
}
|
|
1062
1108
|
}, { agentId, replayState: false });
|
|
1063
1109
|
}),
|
|
@@ -1073,7 +1119,7 @@ export class AgentManager {
|
|
|
1073
1119
|
}
|
|
1074
1120
|
}
|
|
1075
1121
|
else if (pendingRun) {
|
|
1076
|
-
const timeout = new Promise((
|
|
1122
|
+
const timeout = new Promise((resolvePromise) => setTimeout(resolvePromise, 2000));
|
|
1077
1123
|
await Promise.race([pendingRun.settledPromise, timeout]);
|
|
1078
1124
|
}
|
|
1079
1125
|
// If the foreground turn is still stuck after the timeout, force-dispatch a
|
|
@@ -1179,7 +1225,7 @@ export class AgentManager {
|
|
|
1179
1225
|
return null;
|
|
1180
1226
|
}
|
|
1181
1227
|
return {
|
|
1182
|
-
text: chunks.
|
|
1228
|
+
text: chunks.toReversed().join(""),
|
|
1183
1229
|
startsAtBeginning,
|
|
1184
1230
|
};
|
|
1185
1231
|
}
|
|
@@ -1256,7 +1302,7 @@ export class AgentManager {
|
|
|
1256
1302
|
if (options?.signal?.aborted) {
|
|
1257
1303
|
throw createAbortError(options.signal, "wait_for_agent aborted");
|
|
1258
1304
|
}
|
|
1259
|
-
return await new Promise((
|
|
1305
|
+
return await new Promise((resolvePromise, reject) => {
|
|
1260
1306
|
// Bug #1 Fix: Check abort signal AGAIN inside Promise constructor
|
|
1261
1307
|
// to avoid race condition between pre-Promise check and abort listener registration
|
|
1262
1308
|
if (options?.signal?.aborted) {
|
|
@@ -1302,11 +1348,12 @@ export class AgentManager {
|
|
|
1302
1348
|
cleanup();
|
|
1303
1349
|
void this.getLastAssistantMessage(agentId)
|
|
1304
1350
|
.then((lastMessage) => {
|
|
1305
|
-
|
|
1351
|
+
resolvePromise({
|
|
1306
1352
|
status: currentStatus,
|
|
1307
1353
|
permission,
|
|
1308
1354
|
lastMessage,
|
|
1309
1355
|
});
|
|
1356
|
+
return;
|
|
1310
1357
|
})
|
|
1311
1358
|
.catch(reject);
|
|
1312
1359
|
};
|
|
@@ -1368,31 +1415,57 @@ export class AgentManager {
|
|
|
1368
1415
|
}
|
|
1369
1416
|
const initialPersistedTitle = await this.resolveInitialPersistedTitle(resolvedAgentId, config);
|
|
1370
1417
|
const now = new Date();
|
|
1371
|
-
const
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1418
|
+
const { durableTimelineHasRows } = await this.initializeAgentTimelineForRegister({
|
|
1419
|
+
agentId: resolvedAgentId,
|
|
1420
|
+
now,
|
|
1421
|
+
options,
|
|
1422
|
+
});
|
|
1423
|
+
const managed = this.buildManagedAgentForRegister({
|
|
1424
|
+
resolvedAgentId,
|
|
1425
|
+
session,
|
|
1426
|
+
config,
|
|
1427
|
+
now,
|
|
1428
|
+
durableTimelineHasRows,
|
|
1429
|
+
options,
|
|
1430
|
+
});
|
|
1431
|
+
this.agents.set(resolvedAgentId, managed);
|
|
1432
|
+
// Initialize previousStatus to track transitions
|
|
1433
|
+
this.previousStatuses.set(resolvedAgentId, managed.lifecycle);
|
|
1434
|
+
await this.refreshRuntimeInfo(managed);
|
|
1435
|
+
await this.persistSnapshot(managed, {
|
|
1436
|
+
workspaceId: options?.workspaceId,
|
|
1437
|
+
title: initialPersistedTitle,
|
|
1438
|
+
});
|
|
1439
|
+
this.emitState(managed, { persist: false });
|
|
1440
|
+
await this.refreshSessionState(managed);
|
|
1441
|
+
managed.lifecycle = "idle";
|
|
1442
|
+
await this.persistSnapshot(managed, { workspaceId: options?.workspaceId });
|
|
1443
|
+
this.emitState(managed, { persist: false });
|
|
1444
|
+
this.subscribeToSession(managed);
|
|
1445
|
+
return { ...managed };
|
|
1446
|
+
}
|
|
1447
|
+
async initializeAgentTimelineForRegister(params) {
|
|
1448
|
+
const { agentId, now, options } = params;
|
|
1449
|
+
const explicitTimelineSeed = buildExplicitTimelineSeedForRegister(now, options);
|
|
1381
1450
|
const shouldSeedFromDurable = !explicitTimelineSeed &&
|
|
1382
|
-
!this.timelineStore.has(
|
|
1451
|
+
!this.timelineStore.has(agentId) &&
|
|
1383
1452
|
this.durableTimelineStore !== undefined;
|
|
1384
1453
|
const durableTimelineSeed = shouldSeedFromDurable
|
|
1385
|
-
? await this.loadCommittedTimelineSeed(
|
|
1454
|
+
? await this.loadCommittedTimelineSeed(agentId, now)
|
|
1386
1455
|
: null;
|
|
1387
1456
|
const durableTimelineHasRows = durableTimelineSeed != null && (durableTimelineSeed.nextSeq ?? 1) > 1;
|
|
1388
1457
|
const timelineSeed = explicitTimelineSeed ?? durableTimelineSeed;
|
|
1389
|
-
if (timelineSeed || !this.timelineStore.has(
|
|
1390
|
-
this.timelineStore.initialize(
|
|
1458
|
+
if (timelineSeed || !this.timelineStore.has(agentId)) {
|
|
1459
|
+
this.timelineStore.initialize(agentId, timelineSeed ?? { timestamp: now.toISOString() });
|
|
1391
1460
|
}
|
|
1392
1461
|
if (options?.timelineRows?.length) {
|
|
1393
|
-
this.enqueueDurableTimelineBulkInsert(
|
|
1462
|
+
this.enqueueDurableTimelineBulkInsert(agentId, options.timelineRows);
|
|
1394
1463
|
}
|
|
1395
|
-
|
|
1464
|
+
return { durableTimelineHasRows };
|
|
1465
|
+
}
|
|
1466
|
+
buildManagedAgentForRegister(params) {
|
|
1467
|
+
const { resolvedAgentId, session, config, now, durableTimelineHasRows, options } = params;
|
|
1468
|
+
return {
|
|
1396
1469
|
id: resolvedAgentId,
|
|
1397
1470
|
provider: config.provider,
|
|
1398
1471
|
cwd: config.cwd,
|
|
@@ -1418,33 +1491,10 @@ export class AgentManager {
|
|
|
1418
1491
|
lastUserMessageAt: options?.lastUserMessageAt ?? null,
|
|
1419
1492
|
lastUsage: options?.lastUsage,
|
|
1420
1493
|
lastError: options?.lastError,
|
|
1421
|
-
attention: options?.attention
|
|
1422
|
-
? options.attention.requiresAttention
|
|
1423
|
-
? {
|
|
1424
|
-
requiresAttention: true,
|
|
1425
|
-
attentionReason: options.attention.attentionReason,
|
|
1426
|
-
attentionTimestamp: new Date(options.attention.attentionTimestamp),
|
|
1427
|
-
}
|
|
1428
|
-
: { requiresAttention: false }
|
|
1429
|
-
: { requiresAttention: false },
|
|
1494
|
+
attention: resolveInitialAttention(options?.attention),
|
|
1430
1495
|
internal: config.internal ?? false,
|
|
1431
1496
|
labels: options?.labels ?? {},
|
|
1432
1497
|
};
|
|
1433
|
-
this.agents.set(resolvedAgentId, managed);
|
|
1434
|
-
// Initialize previousStatus to track transitions
|
|
1435
|
-
this.previousStatuses.set(resolvedAgentId, managed.lifecycle);
|
|
1436
|
-
await this.refreshRuntimeInfo(managed);
|
|
1437
|
-
await this.persistSnapshot(managed, {
|
|
1438
|
-
workspaceId: options?.workspaceId,
|
|
1439
|
-
title: initialPersistedTitle,
|
|
1440
|
-
});
|
|
1441
|
-
this.emitState(managed, { persist: false });
|
|
1442
|
-
await this.refreshSessionState(managed);
|
|
1443
|
-
managed.lifecycle = "idle";
|
|
1444
|
-
await this.persistSnapshot(managed, { workspaceId: options?.workspaceId });
|
|
1445
|
-
this.emitState(managed, { persist: false });
|
|
1446
|
-
this.subscribeToSession(managed);
|
|
1447
|
-
return { ...managed };
|
|
1448
1498
|
}
|
|
1449
1499
|
async loadCommittedTimelineSeed(agentId, now) {
|
|
1450
1500
|
if (!this.durableTimelineStore) {
|
|
@@ -1507,6 +1557,7 @@ export class AgentManager {
|
|
|
1507
1557
|
return;
|
|
1508
1558
|
}
|
|
1509
1559
|
await this.dispatchSessionEvent(current, event);
|
|
1560
|
+
return;
|
|
1510
1561
|
})
|
|
1511
1562
|
.catch((err) => {
|
|
1512
1563
|
this.logger.error({ err, agentId, eventType: event.type }, "Failed to process session event");
|
|
@@ -1554,8 +1605,8 @@ export class AgentManager {
|
|
|
1554
1605
|
}
|
|
1555
1606
|
createPendingForegroundRun() {
|
|
1556
1607
|
let resolveSettled;
|
|
1557
|
-
const settledPromise = new Promise((
|
|
1558
|
-
resolveSettled =
|
|
1608
|
+
const settledPromise = new Promise((resolvePromise) => {
|
|
1609
|
+
resolveSettled = resolvePromise;
|
|
1559
1610
|
});
|
|
1560
1611
|
return {
|
|
1561
1612
|
token: randomUUID(),
|
|
@@ -1671,14 +1722,8 @@ export class AgentManager {
|
|
|
1671
1722
|
if (event.type !== "timeline") {
|
|
1672
1723
|
continue;
|
|
1673
1724
|
}
|
|
1674
|
-
if (event.item
|
|
1675
|
-
|
|
1676
|
-
if (eventMessageId) {
|
|
1677
|
-
const canonicalText = canonicalUserMessagesById.get(eventMessageId);
|
|
1678
|
-
if (canonicalText === event.item.text) {
|
|
1679
|
-
continue;
|
|
1680
|
-
}
|
|
1681
|
-
}
|
|
1725
|
+
if (isDuplicateLegacyUserMessage(event.item, canonicalUserMessagesById)) {
|
|
1726
|
+
continue;
|
|
1682
1727
|
}
|
|
1683
1728
|
this.recordTimeline(agent.id, event.item);
|
|
1684
1729
|
}
|
|
@@ -1718,185 +1763,212 @@ export class AgentManager {
|
|
|
1718
1763
|
}
|
|
1719
1764
|
this.agentStreamCoalescer.flushFor(agent.id);
|
|
1720
1765
|
}
|
|
1721
|
-
|
|
1722
|
-
|
|
1766
|
+
const flags = { shouldDispatchEvent: true, shouldNotifyWaiters: true };
|
|
1767
|
+
const dispatchPromise = this.dispatchStreamEventByType({
|
|
1768
|
+
agent,
|
|
1769
|
+
event,
|
|
1770
|
+
options,
|
|
1771
|
+
isForegroundEvent,
|
|
1772
|
+
eventTurnId,
|
|
1773
|
+
flags,
|
|
1774
|
+
});
|
|
1775
|
+
if (dispatchPromise) {
|
|
1776
|
+
await dispatchPromise;
|
|
1777
|
+
}
|
|
1778
|
+
if (!options?.fromHistory && isForegroundEvent && isTurnTerminalEvent(event)) {
|
|
1779
|
+
this.finalizeForegroundTurn(agent, eventTurnId);
|
|
1780
|
+
}
|
|
1781
|
+
if (!options?.fromHistory && flags.shouldDispatchEvent) {
|
|
1782
|
+
this.dispatchStream(agent.id, event);
|
|
1783
|
+
}
|
|
1784
|
+
return flags.shouldNotifyWaiters;
|
|
1785
|
+
}
|
|
1786
|
+
dispatchStreamEventByType(params) {
|
|
1787
|
+
const { agent, event, options, isForegroundEvent, eventTurnId, flags } = params;
|
|
1723
1788
|
switch (event.type) {
|
|
1724
1789
|
case "thread_started":
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
const handle = agent.session.describePersistence();
|
|
1728
|
-
if (handle) {
|
|
1729
|
-
agent.persistence = attachPersistenceCwd(handle, agent.cwd);
|
|
1730
|
-
if (agent.persistence?.sessionId !== previousSessionId) {
|
|
1731
|
-
this.emitState(agent);
|
|
1732
|
-
}
|
|
1733
|
-
}
|
|
1734
|
-
void this.refreshRuntimeInfo(agent);
|
|
1735
|
-
}
|
|
1736
|
-
break;
|
|
1790
|
+
this.onStreamThreadStarted(agent);
|
|
1791
|
+
return undefined;
|
|
1737
1792
|
case "usage_updated":
|
|
1738
1793
|
agent.lastUsage = event.usage;
|
|
1739
1794
|
this.emitState(agent);
|
|
1740
|
-
|
|
1795
|
+
return undefined;
|
|
1741
1796
|
case "timeline":
|
|
1742
|
-
{
|
|
1743
|
-
// Skip provider-replayed user_message items during history hydration.
|
|
1744
|
-
if (options?.fromHistory && event.item.type === "user_message") {
|
|
1745
|
-
const eventMessageId = normalizeMessageId(event.item.messageId);
|
|
1746
|
-
if (eventMessageId) {
|
|
1747
|
-
const canonicalText = options?.canonicalUserMessagesById?.get(eventMessageId);
|
|
1748
|
-
if (canonicalText === event.item.text) {
|
|
1749
|
-
shouldDispatchEvent = false;
|
|
1750
|
-
shouldNotifyWaiters = false;
|
|
1751
|
-
break;
|
|
1752
|
-
}
|
|
1753
|
-
}
|
|
1754
|
-
}
|
|
1755
|
-
// Suppress user_message echoes for the active foreground turn.
|
|
1756
|
-
if (!options?.fromHistory && event.item.type === "user_message" && isForegroundEvent) {
|
|
1757
|
-
const eventMessageId = normalizeMessageId(event.item.messageId);
|
|
1758
|
-
if (eventMessageId &&
|
|
1759
|
-
(await this.hasCommittedUserMessageFromStores(agent.id, {
|
|
1760
|
-
messageId: eventMessageId,
|
|
1761
|
-
text: event.item.text,
|
|
1762
|
-
}))) {
|
|
1763
|
-
break;
|
|
1764
|
-
}
|
|
1765
|
-
}
|
|
1766
|
-
if (options?.fromHistory) {
|
|
1767
|
-
this.recordTimeline(agent.id, event.item);
|
|
1768
|
-
shouldDispatchEvent = false;
|
|
1769
|
-
shouldNotifyWaiters = false;
|
|
1770
|
-
break;
|
|
1771
|
-
}
|
|
1772
|
-
this.recordAndDispatchTimelineItem(agent.id, event.item, event.provider, event.turnId);
|
|
1773
|
-
if (event.item.type === "user_message") {
|
|
1774
|
-
agent.lastUserMessageAt = new Date();
|
|
1775
|
-
this.emitState(agent);
|
|
1776
|
-
}
|
|
1777
|
-
shouldDispatchEvent = false;
|
|
1778
|
-
shouldNotifyWaiters = true;
|
|
1779
|
-
}
|
|
1780
|
-
break;
|
|
1797
|
+
return this.onStreamTimelineEvent({ agent, event, options, isForegroundEvent, flags });
|
|
1781
1798
|
case "turn_completed":
|
|
1782
|
-
this.
|
|
1783
|
-
|
|
1784
|
-
lifecycle: agent.lifecycle,
|
|
1785
|
-
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1786
|
-
eventTurnId,
|
|
1787
|
-
}, "handleStreamEvent: turn_completed");
|
|
1788
|
-
agent.lastUsage = event.usage;
|
|
1789
|
-
agent.lastError = undefined;
|
|
1790
|
-
// For autonomous turns (not foreground), transition to idle
|
|
1791
|
-
// unless a replacement is pending (avoid idle flash during replace)
|
|
1792
|
-
if (!isForegroundEvent && agent.lifecycle !== "idle" && !agent.pendingReplacement) {
|
|
1793
|
-
agent.lifecycle = "idle";
|
|
1794
|
-
this.emitState(agent);
|
|
1795
|
-
}
|
|
1796
|
-
void this.refreshRuntimeInfo(agent);
|
|
1797
|
-
break;
|
|
1799
|
+
this.onStreamTurnCompleted({ agent, event, eventTurnId, isForegroundEvent });
|
|
1800
|
+
return undefined;
|
|
1798
1801
|
case "turn_failed":
|
|
1799
|
-
this.
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1802
|
+
return this.onStreamTurnFailed({
|
|
1803
|
+
agent,
|
|
1804
|
+
event,
|
|
1803
1805
|
eventTurnId,
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
}, "handleStreamEvent: turn_failed");
|
|
1808
|
-
// For autonomous turns, set error state directly
|
|
1809
|
-
if (!isForegroundEvent) {
|
|
1810
|
-
agent.lifecycle = "error";
|
|
1811
|
-
}
|
|
1812
|
-
agent.lastError = event.error;
|
|
1813
|
-
await this.appendSystemErrorTimelineMessage(agent, event.provider, this.formatTurnFailedMessage(event), options);
|
|
1814
|
-
for (const [requestId] of agent.pendingPermissions) {
|
|
1815
|
-
agent.pendingPermissions.delete(requestId);
|
|
1816
|
-
if (!options?.fromHistory) {
|
|
1817
|
-
this.dispatchStream(agent.id, {
|
|
1818
|
-
type: "permission_resolved",
|
|
1819
|
-
provider: event.provider,
|
|
1820
|
-
requestId,
|
|
1821
|
-
resolution: { behavior: "deny", message: "Turn failed" },
|
|
1822
|
-
});
|
|
1823
|
-
}
|
|
1824
|
-
}
|
|
1825
|
-
if (!isForegroundEvent) {
|
|
1826
|
-
this.emitState(agent);
|
|
1827
|
-
}
|
|
1828
|
-
break;
|
|
1806
|
+
isForegroundEvent,
|
|
1807
|
+
options,
|
|
1808
|
+
});
|
|
1829
1809
|
case "turn_canceled":
|
|
1830
|
-
this.
|
|
1831
|
-
|
|
1832
|
-
lifecycle: agent.lifecycle,
|
|
1833
|
-
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1834
|
-
eventTurnId,
|
|
1835
|
-
}, "handleStreamEvent: turn_canceled");
|
|
1836
|
-
// For autonomous turns, transition to idle
|
|
1837
|
-
// unless a replacement is pending (avoid idle flash during replace)
|
|
1838
|
-
if (!isForegroundEvent && !agent.pendingReplacement) {
|
|
1839
|
-
agent.lifecycle = "idle";
|
|
1840
|
-
}
|
|
1841
|
-
agent.lastError = undefined;
|
|
1842
|
-
for (const [requestId] of agent.pendingPermissions) {
|
|
1843
|
-
agent.pendingPermissions.delete(requestId);
|
|
1844
|
-
if (!options?.fromHistory) {
|
|
1845
|
-
this.dispatchStream(agent.id, {
|
|
1846
|
-
type: "permission_resolved",
|
|
1847
|
-
provider: event.provider,
|
|
1848
|
-
requestId,
|
|
1849
|
-
resolution: { behavior: "deny", message: "Interrupted" },
|
|
1850
|
-
});
|
|
1851
|
-
}
|
|
1852
|
-
}
|
|
1853
|
-
if (!isForegroundEvent) {
|
|
1854
|
-
this.emitState(agent);
|
|
1855
|
-
}
|
|
1856
|
-
break;
|
|
1810
|
+
this.onStreamTurnCanceled({ agent, event, eventTurnId, isForegroundEvent, options });
|
|
1811
|
+
return undefined;
|
|
1857
1812
|
case "turn_started":
|
|
1858
|
-
this.
|
|
1859
|
-
|
|
1860
|
-
lifecycle: agent.lifecycle,
|
|
1861
|
-
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1862
|
-
eventTurnId,
|
|
1863
|
-
}, "handleStreamEvent: turn_started");
|
|
1864
|
-
// For autonomous turn_started (no foreground match), set running
|
|
1865
|
-
if (!isForegroundEvent) {
|
|
1866
|
-
agent.lifecycle = "running";
|
|
1867
|
-
this.emitState(agent);
|
|
1868
|
-
}
|
|
1869
|
-
break;
|
|
1813
|
+
this.onStreamTurnStarted({ agent, eventTurnId, isForegroundEvent });
|
|
1814
|
+
return undefined;
|
|
1870
1815
|
case "permission_requested":
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
agent.pendingPermissions.set(event.request.id, event.request);
|
|
1874
|
-
if (!hadPendingPermissions && !agent.internal) {
|
|
1875
|
-
this.broadcastAgentAttention(agent, "permission");
|
|
1876
|
-
}
|
|
1877
|
-
}
|
|
1878
|
-
this.emitState(agent);
|
|
1879
|
-
break;
|
|
1816
|
+
this.onStreamPermissionRequested(agent, event);
|
|
1817
|
+
return undefined;
|
|
1880
1818
|
case "permission_resolved":
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
agent.bufferedPermissionResolutions.set(event.requestId, event);
|
|
1884
|
-
shouldDispatchEvent = false;
|
|
1885
|
-
break;
|
|
1886
|
-
}
|
|
1887
|
-
this.emitState(agent);
|
|
1888
|
-
break;
|
|
1819
|
+
this.onStreamPermissionResolved({ agent, event, options, flags });
|
|
1820
|
+
return undefined;
|
|
1889
1821
|
default:
|
|
1890
|
-
|
|
1822
|
+
return undefined;
|
|
1891
1823
|
}
|
|
1892
|
-
|
|
1893
|
-
|
|
1824
|
+
}
|
|
1825
|
+
onStreamThreadStarted(agent) {
|
|
1826
|
+
const previousSessionId = agent.persistence?.sessionId ?? null;
|
|
1827
|
+
const handle = agent.session.describePersistence();
|
|
1828
|
+
if (handle) {
|
|
1829
|
+
agent.persistence = attachPersistenceCwd(handle, agent.cwd);
|
|
1830
|
+
if (agent.persistence?.sessionId !== previousSessionId) {
|
|
1831
|
+
this.emitState(agent);
|
|
1832
|
+
}
|
|
1894
1833
|
}
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1834
|
+
void this.refreshRuntimeInfo(agent);
|
|
1835
|
+
}
|
|
1836
|
+
async onStreamTimelineEvent(params) {
|
|
1837
|
+
const { agent, event, options, isForegroundEvent, flags } = params;
|
|
1838
|
+
// Skip provider-replayed user_message items during history hydration.
|
|
1839
|
+
if (options?.fromHistory && event.item.type === "user_message") {
|
|
1840
|
+
const eventMessageId = normalizeMessageId(event.item.messageId);
|
|
1841
|
+
if (eventMessageId) {
|
|
1842
|
+
const canonicalText = options?.canonicalUserMessagesById?.get(eventMessageId);
|
|
1843
|
+
if (canonicalText === event.item.text) {
|
|
1844
|
+
flags.shouldDispatchEvent = false;
|
|
1845
|
+
flags.shouldNotifyWaiters = false;
|
|
1846
|
+
return;
|
|
1847
|
+
}
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
// Suppress user_message echoes for the active foreground turn.
|
|
1851
|
+
if (!options?.fromHistory && event.item.type === "user_message" && isForegroundEvent) {
|
|
1852
|
+
const eventMessageId = normalizeMessageId(event.item.messageId);
|
|
1853
|
+
if (eventMessageId &&
|
|
1854
|
+
(await this.hasCommittedUserMessageFromStores(agent.id, {
|
|
1855
|
+
messageId: eventMessageId,
|
|
1856
|
+
text: event.item.text,
|
|
1857
|
+
}))) {
|
|
1858
|
+
return;
|
|
1859
|
+
}
|
|
1860
|
+
}
|
|
1861
|
+
if (options?.fromHistory) {
|
|
1862
|
+
this.recordTimeline(agent.id, event.item);
|
|
1863
|
+
flags.shouldDispatchEvent = false;
|
|
1864
|
+
flags.shouldNotifyWaiters = false;
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
this.recordAndDispatchTimelineItem(agent.id, event.item, event.provider, event.turnId);
|
|
1868
|
+
if (event.item.type === "user_message") {
|
|
1869
|
+
agent.lastUserMessageAt = new Date();
|
|
1870
|
+
this.emitState(agent);
|
|
1871
|
+
}
|
|
1872
|
+
flags.shouldDispatchEvent = false;
|
|
1873
|
+
flags.shouldNotifyWaiters = true;
|
|
1874
|
+
}
|
|
1875
|
+
onStreamTurnCompleted(params) {
|
|
1876
|
+
const { agent, event, eventTurnId, isForegroundEvent } = params;
|
|
1877
|
+
this.logger.trace({
|
|
1878
|
+
agentId: agent.id,
|
|
1879
|
+
lifecycle: agent.lifecycle,
|
|
1880
|
+
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1881
|
+
eventTurnId,
|
|
1882
|
+
}, "handleStreamEvent: turn_completed");
|
|
1883
|
+
agent.lastUsage = event.usage;
|
|
1884
|
+
agent.lastError = undefined;
|
|
1885
|
+
if (!isForegroundEvent && agent.lifecycle !== "idle" && !agent.pendingReplacement) {
|
|
1886
|
+
agent.lifecycle = "idle";
|
|
1887
|
+
this.emitState(agent);
|
|
1888
|
+
}
|
|
1889
|
+
void this.refreshRuntimeInfo(agent);
|
|
1890
|
+
}
|
|
1891
|
+
async onStreamTurnFailed(params) {
|
|
1892
|
+
const { agent, event, eventTurnId, isForegroundEvent, options } = params;
|
|
1893
|
+
this.logger.warn({
|
|
1894
|
+
agentId: agent.id,
|
|
1895
|
+
lifecycle: agent.lifecycle,
|
|
1896
|
+
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1897
|
+
eventTurnId,
|
|
1898
|
+
error: event.error,
|
|
1899
|
+
code: event.code,
|
|
1900
|
+
diagnostic: event.diagnostic,
|
|
1901
|
+
}, "handleStreamEvent: turn_failed");
|
|
1902
|
+
if (!isForegroundEvent) {
|
|
1903
|
+
agent.lifecycle = "error";
|
|
1904
|
+
}
|
|
1905
|
+
agent.lastError = event.error;
|
|
1906
|
+
await this.appendSystemErrorTimelineMessage(agent, event.provider, this.formatTurnFailedMessage(event), options);
|
|
1907
|
+
this.resolvePendingPermissionsForAgent(agent, event.provider, options, "Turn failed");
|
|
1908
|
+
if (!isForegroundEvent) {
|
|
1909
|
+
this.emitState(agent);
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1912
|
+
onStreamTurnCanceled(params) {
|
|
1913
|
+
const { agent, event, eventTurnId, isForegroundEvent, options } = params;
|
|
1914
|
+
this.logger.trace({
|
|
1915
|
+
agentId: agent.id,
|
|
1916
|
+
lifecycle: agent.lifecycle,
|
|
1917
|
+
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1918
|
+
eventTurnId,
|
|
1919
|
+
}, "handleStreamEvent: turn_canceled");
|
|
1920
|
+
if (!isForegroundEvent && !agent.pendingReplacement) {
|
|
1921
|
+
agent.lifecycle = "idle";
|
|
1922
|
+
}
|
|
1923
|
+
agent.lastError = undefined;
|
|
1924
|
+
this.resolvePendingPermissionsForAgent(agent, event.provider, options, "Interrupted");
|
|
1925
|
+
if (!isForegroundEvent) {
|
|
1926
|
+
this.emitState(agent);
|
|
1927
|
+
}
|
|
1928
|
+
}
|
|
1929
|
+
onStreamTurnStarted(params) {
|
|
1930
|
+
const { agent, eventTurnId, isForegroundEvent } = params;
|
|
1931
|
+
this.logger.trace({
|
|
1932
|
+
agentId: agent.id,
|
|
1933
|
+
lifecycle: agent.lifecycle,
|
|
1934
|
+
activeForegroundTurnId: agent.activeForegroundTurnId,
|
|
1935
|
+
eventTurnId,
|
|
1936
|
+
}, "handleStreamEvent: turn_started");
|
|
1937
|
+
if (!isForegroundEvent) {
|
|
1938
|
+
agent.lifecycle = "running";
|
|
1939
|
+
this.emitState(agent);
|
|
1940
|
+
}
|
|
1941
|
+
}
|
|
1942
|
+
onStreamPermissionRequested(agent, event) {
|
|
1943
|
+
const hadPendingPermissions = agent.pendingPermissions.size > 0;
|
|
1944
|
+
agent.pendingPermissions.set(event.request.id, event.request);
|
|
1945
|
+
if (!hadPendingPermissions && !agent.internal) {
|
|
1946
|
+
this.broadcastAgentAttention(agent, "permission");
|
|
1947
|
+
}
|
|
1948
|
+
this.emitState(agent);
|
|
1949
|
+
}
|
|
1950
|
+
onStreamPermissionResolved(params) {
|
|
1951
|
+
const { agent, event, options, flags } = params;
|
|
1952
|
+
agent.pendingPermissions.delete(event.requestId);
|
|
1953
|
+
if (!options?.fromHistory && agent.inFlightPermissionResponses.has(event.requestId)) {
|
|
1954
|
+
agent.bufferedPermissionResolutions.set(event.requestId, event);
|
|
1955
|
+
flags.shouldDispatchEvent = false;
|
|
1956
|
+
return;
|
|
1957
|
+
}
|
|
1958
|
+
this.emitState(agent);
|
|
1959
|
+
}
|
|
1960
|
+
resolvePendingPermissionsForAgent(agent, provider, options, message) {
|
|
1961
|
+
for (const [requestId] of agent.pendingPermissions) {
|
|
1962
|
+
agent.pendingPermissions.delete(requestId);
|
|
1963
|
+
if (!options?.fromHistory) {
|
|
1964
|
+
this.dispatchStream(agent.id, {
|
|
1965
|
+
type: "permission_resolved",
|
|
1966
|
+
provider,
|
|
1967
|
+
requestId,
|
|
1968
|
+
resolution: { behavior: "deny", message },
|
|
1969
|
+
});
|
|
1970
|
+
}
|
|
1898
1971
|
}
|
|
1899
|
-
return shouldNotifyWaiters;
|
|
1900
1972
|
}
|
|
1901
1973
|
recordAndDispatchTimelineItem(agentId, item, provider, turnId) {
|
|
1902
1974
|
const row = this.recordTimeline(agentId, item);
|
|
@@ -2102,12 +2174,12 @@ export class AgentManager {
|
|
|
2102
2174
|
if (error instanceof Error &&
|
|
2103
2175
|
"code" in error &&
|
|
2104
2176
|
error.code === "ENOENT") {
|
|
2105
|
-
throw new Error(`Working directory does not exist: ${normalized.cwd}
|
|
2177
|
+
throw new Error(`Working directory does not exist: ${normalized.cwd}`, { cause: error });
|
|
2106
2178
|
}
|
|
2107
2179
|
if (error instanceof Error) {
|
|
2108
2180
|
throw error;
|
|
2109
2181
|
}
|
|
2110
|
-
throw new Error(`Failed to access working directory: ${normalized.cwd}
|
|
2182
|
+
throw new Error(`Failed to access working directory: ${normalized.cwd}`, { cause: error });
|
|
2111
2183
|
}
|
|
2112
2184
|
}
|
|
2113
2185
|
if (typeof normalized.model === "string") {
|
|
@@ -2147,6 +2219,37 @@ export class AgentManager {
|
|
|
2147
2219
|
},
|
|
2148
2220
|
};
|
|
2149
2221
|
}
|
|
2222
|
+
async requireAvailableClient(options) {
|
|
2223
|
+
const client = this.clients.get(options.provider);
|
|
2224
|
+
if (!client) {
|
|
2225
|
+
const configuredProviders = this.getConfiguredProviderIds();
|
|
2226
|
+
throw new Error(`Unknown provider '${options.provider}'. Configured providers: ${formatProviderList(configuredProviders)}.`);
|
|
2227
|
+
}
|
|
2228
|
+
let unavailableReason = null;
|
|
2229
|
+
try {
|
|
2230
|
+
const available = await client.isAvailable();
|
|
2231
|
+
if (available) {
|
|
2232
|
+
return client;
|
|
2233
|
+
}
|
|
2234
|
+
}
|
|
2235
|
+
catch (error) {
|
|
2236
|
+
unavailableReason = error instanceof Error ? error.message : String(error);
|
|
2237
|
+
}
|
|
2238
|
+
const availableProviders = (await this.listProviderAvailability())
|
|
2239
|
+
.filter((entry) => entry.available)
|
|
2240
|
+
.map((entry) => entry.provider);
|
|
2241
|
+
const providerList = formatProviderList(availableProviders);
|
|
2242
|
+
const reason = unavailableReason ? ` Reason: ${unavailableReason}.` : "";
|
|
2243
|
+
throw new Error(`Provider '${options.provider}' is not available.${reason} Available providers: ${providerList}. Use one of those providers, or install/configure '${options.provider}'.`);
|
|
2244
|
+
}
|
|
2245
|
+
requireEnabledProvider(provider) {
|
|
2246
|
+
if (this.providerEnabled.get(provider) === false) {
|
|
2247
|
+
throw new Error(`Provider '${provider}' is disabled`);
|
|
2248
|
+
}
|
|
2249
|
+
}
|
|
2250
|
+
getConfiguredProviderIds() {
|
|
2251
|
+
return Array.from(new Set([...this.providerEnabled.keys(), ...this.clients.keys()]));
|
|
2252
|
+
}
|
|
2150
2253
|
requireClient(provider) {
|
|
2151
2254
|
const client = this.clients.get(provider);
|
|
2152
2255
|
if (!client) {
|