@getpaseo/server 0.1.16 → 0.1.17
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/dist/scripts/daemon-runner.js +53 -14
- package/dist/scripts/daemon-runner.js.map +1 -1
- package/dist/scripts/dev-runner.js +9 -16
- package/dist/scripts/dev-runner.js.map +1 -1
- package/dist/scripts/supervisor.js +40 -13
- package/dist/scripts/supervisor.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +23 -3
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +81 -8
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +3 -1
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +146 -24
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.js +13 -4
- package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +1 -1
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +9 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.js +11 -1
- package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
- package/dist/server/server/agent/agent-storage.d.ts +5 -1
- package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
- package/dist/server/server/agent/agent-storage.js +41 -72
- package/dist/server/server/agent/agent-storage.js.map +1 -1
- package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
- package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
- package/dist/server/server/agent/agent-title-limits.js +3 -0
- package/dist/server/server/agent/agent-title-limits.js.map +1 -0
- package/dist/server/server/agent/providers/claude/model-catalog.d.ts +29 -0
- package/dist/server/server/agent/providers/claude/model-catalog.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/model-catalog.js +70 -0
- package/dist/server/server/agent/providers/claude/model-catalog.js.map +1 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +44 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +250 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
- 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 +15 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts +3 -2
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +240 -106
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- 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 +81 -28
- 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.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +31 -5
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +10 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +207 -176
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +15 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.d.ts +20 -0
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.js +73 -0
- package/dist/server/server/agent/timeline-projection.js.map +1 -1
- package/dist/server/server/bootstrap.d.ts +15 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +27 -4
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/file-download/token-store.d.ts +0 -1
- package/dist/server/server/file-download/token-store.d.ts.map +1 -1
- package/dist/server/server/file-download/token-store.js.map +1 -1
- package/dist/server/server/file-explorer/service.d.ts.map +1 -1
- package/dist/server/server/file-explorer/service.js +56 -36
- package/dist/server/server/file-explorer/service.js.map +1 -1
- package/dist/server/server/index.js +85 -29
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/logger.d.ts +24 -3
- package/dist/server/server/logger.d.ts.map +1 -1
- package/dist/server/server/logger.js +157 -21
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +86 -0
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +25 -3
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/pid-lock.d.ts +6 -2
- package/dist/server/server/pid-lock.d.ts.map +1 -1
- package/dist/server/server/pid-lock.js +7 -10
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +1 -0
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/session.d.ts +57 -3
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +755 -182
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/websocket-server.d.ts +16 -1
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +135 -9
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
- package/dist/server/server/worktree-bootstrap.js +45 -2
- package/dist/server/server/worktree-bootstrap.js.map +1 -1
- package/dist/server/shared/messages.d.ts +2841 -541
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +99 -5
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/tool-call-display.d.ts.map +1 -1
- package/dist/server/shared/tool-call-display.js +3 -0
- package/dist/server/shared/tool-call-display.js.map +1 -1
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.js +1 -13
- package/dist/server/terminal/terminal-manager.js.map +1 -1
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +29 -5
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/utils/worktree.d.ts +1 -0
- package/dist/server/utils/worktree.d.ts.map +1 -1
- package/dist/server/utils/worktree.js +17 -2
- package/dist/server/utils/worktree.js.map +1 -1
- package/dist/src/server/agent/activity-curator.js +228 -0
- package/dist/src/server/agent/activity-curator.js.map +1 -0
- package/dist/src/server/agent/agent-manager.js +1712 -0
- package/dist/src/server/agent/agent-manager.js.map +1 -0
- package/dist/src/server/agent/agent-metadata-generator.js +163 -0
- package/dist/src/server/agent/agent-metadata-generator.js.map +1 -0
- package/dist/src/server/agent/agent-projections.js +262 -0
- package/dist/src/server/agent/agent-projections.js.map +1 -0
- package/dist/src/server/agent/agent-response-loop.js +304 -0
- package/dist/src/server/agent/agent-response-loop.js.map +1 -0
- package/dist/src/server/agent/agent-sdk-types.js +12 -0
- package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
- package/dist/src/server/agent/agent-storage.js +299 -0
- package/dist/src/server/agent/agent-storage.js.map +1 -0
- package/dist/src/server/agent/agent-title-limits.js +3 -0
- package/dist/src/server/agent/agent-title-limits.js.map +1 -0
- package/dist/src/server/agent/audio-utils.js +19 -0
- package/dist/src/server/agent/audio-utils.js.map +1 -0
- package/dist/src/server/agent/dictation-debug.js +50 -0
- package/dist/src/server/agent/dictation-debug.js.map +1 -0
- package/dist/src/server/agent/mcp-server.js +787 -0
- package/dist/src/server/agent/mcp-server.js.map +1 -0
- package/dist/src/server/agent/orchestrator-instructions.js +51 -0
- package/dist/src/server/agent/orchestrator-instructions.js.map +1 -0
- package/dist/src/server/agent/pcm16-resampler.js +63 -0
- package/dist/src/server/agent/pcm16-resampler.js.map +1 -0
- package/dist/src/server/agent/provider-launch-config.js +83 -0
- package/dist/src/server/agent/provider-launch-config.js.map +1 -0
- package/dist/src/server/agent/provider-manifest.js +97 -0
- package/dist/src/server/agent/provider-manifest.js.map +1 -0
- package/dist/src/server/agent/provider-registry.js +45 -0
- package/dist/src/server/agent/provider-registry.js.map +1 -0
- package/dist/src/server/agent/providers/claude/model-catalog.js +70 -0
- package/dist/src/server/agent/providers/claude/model-catalog.js.map +1 -0
- package/dist/src/server/agent/providers/claude/task-notification-tool-call.js +250 -0
- package/dist/src/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
- package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +109 -0
- package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
- package/dist/src/server/agent/providers/claude/tool-call-mapper.js +238 -0
- package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
- package/dist/src/server/agent/providers/claude-agent.js +3747 -0
- package/dist/src/server/agent/providers/claude-agent.js.map +1 -0
- package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
- package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
- package/dist/src/server/agent/providers/codex/tool-call-mapper.js +720 -0
- package/dist/src/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
- package/dist/src/server/agent/providers/codex-app-server-agent.js +2601 -0
- package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -0
- package/dist/src/server/agent/providers/codex-rollout-timeline.js +487 -0
- package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +1 -0
- package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js +39 -0
- package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
- package/dist/src/server/agent/providers/opencode/tool-call-mapper.js +151 -0
- package/dist/src/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
- package/dist/src/server/agent/providers/opencode-agent.js +905 -0
- package/dist/src/server/agent/providers/opencode-agent.js.map +1 -0
- package/dist/src/server/agent/providers/tool-call-detail-primitives.js +552 -0
- package/dist/src/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
- package/dist/src/server/agent/providers/tool-call-mapper-utils.js +109 -0
- package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
- package/dist/src/server/agent/recordings-debug.js +19 -0
- package/dist/src/server/agent/recordings-debug.js.map +1 -0
- package/dist/src/server/agent/stt-debug.js +33 -0
- package/dist/src/server/agent/stt-debug.js.map +1 -0
- package/dist/src/server/agent/stt-manager.js +233 -0
- package/dist/src/server/agent/stt-manager.js.map +1 -0
- package/dist/src/server/agent/timeline-append.js +27 -0
- package/dist/src/server/agent/timeline-append.js.map +1 -0
- package/dist/src/server/agent/timeline-projection.js +215 -0
- package/dist/src/server/agent/timeline-projection.js.map +1 -0
- package/dist/src/server/agent/tool-name-normalization.js +45 -0
- package/dist/src/server/agent/tool-name-normalization.js.map +1 -0
- package/dist/src/server/agent/tts-debug.js +24 -0
- package/dist/src/server/agent/tts-debug.js.map +1 -0
- package/dist/src/server/agent/tts-manager.js +249 -0
- package/dist/src/server/agent/tts-manager.js.map +1 -0
- package/dist/src/server/agent/wait-for-agent-tracker.js +53 -0
- package/dist/src/server/agent/wait-for-agent-tracker.js.map +1 -0
- package/dist/src/server/agent-attention-policy.js +40 -0
- package/dist/src/server/agent-attention-policy.js.map +1 -0
- package/dist/src/server/allowed-hosts.js +94 -0
- package/dist/src/server/allowed-hosts.js.map +1 -0
- package/dist/src/server/bootstrap.js +498 -0
- package/dist/src/server/bootstrap.js.map +1 -0
- package/dist/src/server/client-message-id.js +12 -0
- package/dist/src/server/client-message-id.js.map +1 -0
- package/dist/src/server/config.js +84 -0
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/connection-offer.js +60 -0
- package/dist/src/server/connection-offer.js.map +1 -0
- package/dist/src/server/daemon-keypair.js +40 -0
- package/dist/src/server/daemon-keypair.js.map +1 -0
- package/dist/src/server/daemon-version.js +22 -0
- package/dist/src/server/daemon-version.js.map +1 -0
- package/dist/src/server/dictation/dictation-stream-manager.js +568 -0
- package/dist/src/server/dictation/dictation-stream-manager.js.map +1 -0
- package/dist/src/server/file-download/token-store.js +40 -0
- package/dist/src/server/file-download/token-store.js.map +1 -0
- package/dist/src/server/file-explorer/service.js +183 -0
- package/dist/src/server/file-explorer/service.js.map +1 -0
- package/dist/src/server/json-utils.js +45 -0
- package/dist/src/server/json-utils.js.map +1 -0
- package/dist/src/server/messages.js +29 -0
- package/dist/src/server/messages.js.map +1 -0
- package/dist/src/server/package-version.js +47 -0
- package/dist/src/server/package-version.js.map +1 -0
- package/dist/src/server/paseo-home.js +19 -0
- package/dist/src/server/paseo-home.js.map +1 -0
- package/dist/src/server/path-utils.js +20 -0
- package/dist/src/server/path-utils.js.map +1 -0
- package/dist/src/server/persisted-config.js +259 -0
- package/dist/src/server/persisted-config.js.map +1 -0
- package/dist/src/server/persistence-hooks.js +60 -0
- package/dist/src/server/persistence-hooks.js.map +1 -0
- package/dist/src/server/pid-lock.js +126 -0
- package/dist/src/server/pid-lock.js.map +1 -0
- package/dist/src/server/push/push-service.js +68 -0
- package/dist/src/server/push/push-service.js.map +1 -0
- package/dist/src/server/push/token-store.js +70 -0
- package/dist/src/server/push/token-store.js.map +1 -0
- package/dist/src/server/relay-transport.js +457 -0
- package/dist/src/server/relay-transport.js.map +1 -0
- package/dist/src/server/server-id.js +63 -0
- package/dist/src/server/server-id.js.map +1 -0
- package/dist/src/server/session.js +5947 -0
- package/dist/src/server/session.js.map +1 -0
- package/dist/src/server/speech/audio.js +101 -0
- package/dist/src/server/speech/audio.js.map +1 -0
- package/dist/src/server/speech/provider-resolver.js +7 -0
- package/dist/src/server/speech/provider-resolver.js.map +1 -0
- package/dist/src/server/speech/providers/local/config.js +83 -0
- package/dist/src/server/speech/providers/local/config.js.map +1 -0
- package/dist/src/server/speech/providers/local/models.js +17 -0
- package/dist/src/server/speech/providers/local/models.js.map +1 -0
- package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js +422 -0
- package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
- package/dist/src/server/speech/providers/local/runtime.js +253 -0
- package/dist/src/server/speech/providers/local/runtime.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/model-catalog.js +166 -0
- package/dist/src/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/model-downloader.js +165 -0
- package/dist/src/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +68 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +79 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +102 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +131 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +132 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js +112 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js +140 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js +95 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
- package/dist/src/server/speech/providers/openai/config.js +99 -0
- package/dist/src/server/speech/providers/openai/config.js.map +1 -0
- package/dist/src/server/speech/providers/openai/realtime-transcription-session.js +165 -0
- package/dist/src/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
- package/dist/src/server/speech/providers/openai/runtime.js +114 -0
- package/dist/src/server/speech/providers/openai/runtime.js.map +1 -0
- package/dist/src/server/speech/providers/openai/stt.js +208 -0
- package/dist/src/server/speech/providers/openai/stt.js.map +1 -0
- package/dist/src/server/speech/providers/openai/tts.js +46 -0
- package/dist/src/server/speech/providers/openai/tts.js.map +1 -0
- package/dist/src/server/speech/speech-config-resolver.js +85 -0
- package/dist/src/server/speech/speech-config-resolver.js.map +1 -0
- package/dist/src/server/speech/speech-provider.js +2 -0
- package/dist/src/server/speech/speech-provider.js.map +1 -0
- package/dist/src/server/speech/speech-runtime.js +497 -0
- package/dist/src/server/speech/speech-runtime.js.map +1 -0
- package/dist/src/server/speech/speech-types.js +8 -0
- package/dist/src/server/speech/speech-types.js.map +1 -0
- package/dist/src/server/utils/diff-highlighter.js +244 -0
- package/dist/src/server/utils/diff-highlighter.js.map +1 -0
- package/dist/src/server/utils/syntax-highlighter.js +145 -0
- package/dist/src/server/utils/syntax-highlighter.js.map +1 -0
- package/dist/src/server/voice-config.js +51 -0
- package/dist/src/server/voice-config.js.map +1 -0
- package/dist/src/server/voice-mcp-bridge-command.js +31 -0
- package/dist/src/server/voice-mcp-bridge-command.js.map +1 -0
- package/dist/src/server/voice-mcp-bridge.js +109 -0
- package/dist/src/server/voice-mcp-bridge.js.map +1 -0
- package/dist/src/server/voice-permission-policy.js +13 -0
- package/dist/src/server/voice-permission-policy.js.map +1 -0
- package/dist/src/server/voice-types.js +2 -0
- package/dist/src/server/voice-types.js.map +1 -0
- package/dist/src/server/websocket-server.js +967 -0
- package/dist/src/server/websocket-server.js.map +1 -0
- package/dist/src/server/worktree-bootstrap.js +497 -0
- package/dist/src/server/worktree-bootstrap.js.map +1 -0
- package/dist/src/shared/agent-attention-notification.js +130 -0
- package/dist/src/shared/agent-attention-notification.js.map +1 -0
- package/dist/src/shared/agent-lifecycle.js +8 -0
- package/dist/src/shared/agent-lifecycle.js.map +1 -0
- package/dist/src/shared/binary-mux.js +114 -0
- package/dist/src/shared/binary-mux.js.map +1 -0
- package/dist/src/shared/connection-offer.js +17 -0
- package/dist/src/shared/connection-offer.js.map +1 -0
- package/dist/src/shared/daemon-endpoints.js +113 -0
- package/dist/src/shared/daemon-endpoints.js.map +1 -0
- package/dist/src/shared/messages.js +2001 -0
- package/dist/src/shared/messages.js.map +1 -0
- package/dist/src/shared/path-utils.js +16 -0
- package/dist/src/shared/path-utils.js.map +1 -0
- package/dist/src/shared/tool-call-display.js +93 -0
- package/dist/src/shared/tool-call-display.js.map +1 -0
- package/dist/src/terminal/terminal-manager.js +136 -0
- package/dist/src/terminal/terminal-manager.js.map +1 -0
- package/dist/src/terminal/terminal.js +410 -0
- package/dist/src/terminal/terminal.js.map +1 -0
- package/dist/src/utils/checkout-git.js +1397 -0
- package/dist/src/utils/checkout-git.js.map +1 -0
- package/dist/src/utils/directory-suggestions.js +655 -0
- package/dist/src/utils/directory-suggestions.js.map +1 -0
- package/dist/src/utils/path.js +15 -0
- package/dist/src/utils/path.js.map +1 -0
- package/dist/src/utils/project-icon.js +391 -0
- package/dist/src/utils/project-icon.js.map +1 -0
- package/dist/src/utils/worktree-metadata.js +116 -0
- package/dist/src/utils/worktree-metadata.js.map +1 -0
- package/dist/src/utils/worktree.js +741 -0
- package/dist/src/utils/worktree.js.map +1 -0
- package/package.json +14 -6
|
@@ -6,23 +6,16 @@ import os from "node:os";
|
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { query, } from "@anthropic-ai/claude-agent-sdk";
|
|
8
8
|
import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./claude/tool-call-mapper.js";
|
|
9
|
+
import { isTaskNotificationUserContent, mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./claude/task-notification-tool-call.js";
|
|
10
|
+
import { buildClaudeModelFamilyAliases, buildClaudeSelectableModelIds, listClaudeCatalogModels, } from "./claude/model-catalog.js";
|
|
9
11
|
import { buildToolCallDisplayModel } from "../../../shared/tool-call-display.js";
|
|
10
12
|
import { applyProviderEnv, isProviderCommandAvailable, } from "../provider-launch-config.js";
|
|
11
13
|
import { getOrchestratorModeInstructions } from "../orchestrator-instructions.js";
|
|
12
14
|
const fsPromises = promises;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return fallback;
|
|
18
|
-
// Prefer concrete versioned labels from description (e.g. "Opus 4.6",
|
|
19
|
-
// "Sonnet 4.5"), especially when displayName is generic like
|
|
20
|
-
// "Default (recommended)".
|
|
21
|
-
if (/\d/.test(prefix)) {
|
|
22
|
-
return prefix;
|
|
23
|
-
}
|
|
24
|
-
return fallback;
|
|
25
|
-
}
|
|
15
|
+
const CLAUDE_SETTING_SOURCES = [
|
|
16
|
+
"user",
|
|
17
|
+
"project",
|
|
18
|
+
];
|
|
26
19
|
function normalizeModelIdCandidate(modelId) {
|
|
27
20
|
if (typeof modelId !== "string") {
|
|
28
21
|
return null;
|
|
@@ -37,6 +30,28 @@ function pickSupportedModelId(supportedModelIds, candidate) {
|
|
|
37
30
|
}
|
|
38
31
|
return supportedModelIds.has(normalizedCandidate) ? normalizedCandidate : null;
|
|
39
32
|
}
|
|
33
|
+
function inferClaudeModelFamilyFromText(text) {
|
|
34
|
+
if (typeof text !== "string") {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const lowerText = text.toLowerCase();
|
|
38
|
+
if (lowerText.includes("sonnet")) {
|
|
39
|
+
return "sonnet";
|
|
40
|
+
}
|
|
41
|
+
if (lowerText.includes("opus")) {
|
|
42
|
+
return "opus";
|
|
43
|
+
}
|
|
44
|
+
if (lowerText.includes("haiku")) {
|
|
45
|
+
return "haiku";
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function pickFamilyAliasModelId(familyAliases, family) {
|
|
50
|
+
if (!familyAliases) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return normalizeModelIdCandidate(familyAliases.get(family) ?? null);
|
|
54
|
+
}
|
|
40
55
|
export function normalizeClaudeRuntimeModelId(options) {
|
|
41
56
|
const runtimeModel = options.runtimeModelId.trim();
|
|
42
57
|
if (!runtimeModel) {
|
|
@@ -46,31 +61,43 @@ export function normalizeClaudeRuntimeModelId(options) {
|
|
|
46
61
|
if (!supportedModelIds || supportedModelIds.size === 0) {
|
|
47
62
|
return runtimeModel;
|
|
48
63
|
}
|
|
49
|
-
|
|
50
|
-
|
|
64
|
+
if (supportedModelIds.has(runtimeModel)) {
|
|
65
|
+
return runtimeModel;
|
|
66
|
+
}
|
|
67
|
+
const runtimeFamily = inferClaudeModelFamilyFromText(runtimeModel);
|
|
68
|
+
const familyAlias = runtimeFamily
|
|
69
|
+
? pickFamilyAliasModelId(options.supportedModelFamilyAliases, runtimeFamily)
|
|
70
|
+
: null;
|
|
71
|
+
if (runtimeFamily === "sonnet") {
|
|
51
72
|
const explicitSonnet = pickSupportedModelId(supportedModelIds, "sonnet");
|
|
52
73
|
if (explicitSonnet) {
|
|
53
74
|
return explicitSonnet;
|
|
54
75
|
}
|
|
76
|
+
if (familyAlias && supportedModelIds.has(familyAlias)) {
|
|
77
|
+
return familyAlias;
|
|
78
|
+
}
|
|
55
79
|
const defaultAlias = pickSupportedModelId(supportedModelIds, "default");
|
|
56
80
|
if (defaultAlias) {
|
|
57
81
|
return defaultAlias;
|
|
58
82
|
}
|
|
59
83
|
}
|
|
60
|
-
if (
|
|
84
|
+
if (runtimeFamily === "opus") {
|
|
61
85
|
const alias = pickSupportedModelId(supportedModelIds, "opus");
|
|
62
86
|
if (alias) {
|
|
63
87
|
return alias;
|
|
64
88
|
}
|
|
89
|
+
if (familyAlias && supportedModelIds.has(familyAlias)) {
|
|
90
|
+
return familyAlias;
|
|
91
|
+
}
|
|
65
92
|
}
|
|
66
|
-
if (
|
|
93
|
+
if (runtimeFamily === "haiku") {
|
|
67
94
|
const alias = pickSupportedModelId(supportedModelIds, "haiku");
|
|
68
95
|
if (alias) {
|
|
69
96
|
return alias;
|
|
70
97
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
98
|
+
if (familyAlias && supportedModelIds.has(familyAlias)) {
|
|
99
|
+
return familyAlias;
|
|
100
|
+
}
|
|
74
101
|
}
|
|
75
102
|
const configuredModelId = pickSupportedModelId(supportedModelIds, options.configuredModelId);
|
|
76
103
|
if (configuredModelId) {
|
|
@@ -80,6 +107,15 @@ export function normalizeClaudeRuntimeModelId(options) {
|
|
|
80
107
|
if (currentModelId) {
|
|
81
108
|
return currentModelId;
|
|
82
109
|
}
|
|
110
|
+
// If Claude reports a concrete family ID we can't map directly, prefer the
|
|
111
|
+
// provider default alias for unconfigured sessions so UI model/thinking state
|
|
112
|
+
// can still reconcile against the current model catalog.
|
|
113
|
+
const defaultAlias = pickSupportedModelId(supportedModelIds, "default");
|
|
114
|
+
const hasConfiguredModel = normalizeModelIdCandidate(options.configuredModelId) !== null;
|
|
115
|
+
const hasCurrentModel = normalizeModelIdCandidate(options.currentModelId) !== null;
|
|
116
|
+
if (runtimeFamily && defaultAlias && !hasConfiguredModel && !hasCurrentModel) {
|
|
117
|
+
return defaultAlias;
|
|
118
|
+
}
|
|
83
119
|
return runtimeModel;
|
|
84
120
|
}
|
|
85
121
|
const CLAUDE_CAPABILITIES = {
|
|
@@ -172,6 +208,7 @@ function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings) {
|
|
|
172
208
|
},
|
|
173
209
|
};
|
|
174
210
|
}
|
|
211
|
+
const MAX_RECENT_STDERR_CHARS = 4000;
|
|
175
212
|
function summarizeClaudeOptionsForLog(options) {
|
|
176
213
|
const systemPromptRaw = options.systemPrompt;
|
|
177
214
|
const systemPromptSummary = (() => {
|
|
@@ -860,8 +897,17 @@ function isMetadataOnlySdkMessage(message) {
|
|
|
860
897
|
if (message.type !== "user") {
|
|
861
898
|
return false;
|
|
862
899
|
}
|
|
900
|
+
if (isSyntheticUserEntry(message)) {
|
|
901
|
+
return true;
|
|
902
|
+
}
|
|
863
903
|
return isTaskNotificationUserContent(message.message?.content);
|
|
864
904
|
}
|
|
905
|
+
function isSyntheticUserEntry(entry) {
|
|
906
|
+
if (!entry || typeof entry !== "object") {
|
|
907
|
+
return false;
|
|
908
|
+
}
|
|
909
|
+
return entry.isSynthetic === true;
|
|
910
|
+
}
|
|
865
911
|
export function readEventIdentifiers(message) {
|
|
866
912
|
const root = message;
|
|
867
913
|
const messageType = readTrimmedString(root.type);
|
|
@@ -889,23 +935,6 @@ export function readEventIdentifiers(message) {
|
|
|
889
935
|
null,
|
|
890
936
|
};
|
|
891
937
|
}
|
|
892
|
-
function isTaskNotificationUserContent(content) {
|
|
893
|
-
if (typeof content === "string") {
|
|
894
|
-
return content.includes("<task-notification>");
|
|
895
|
-
}
|
|
896
|
-
if (!Array.isArray(content)) {
|
|
897
|
-
return false;
|
|
898
|
-
}
|
|
899
|
-
for (const block of content) {
|
|
900
|
-
if (block &&
|
|
901
|
-
typeof block === "object" &&
|
|
902
|
-
typeof block.text === "string" &&
|
|
903
|
-
block.text.includes("<task-notification>")) {
|
|
904
|
-
return true;
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
return false;
|
|
908
|
-
}
|
|
909
938
|
export class ClaudeAgentClient {
|
|
910
939
|
constructor(options) {
|
|
911
940
|
this.provider = "claude";
|
|
@@ -920,9 +949,6 @@ export class ClaudeAgentClient {
|
|
|
920
949
|
this.claudePath = null;
|
|
921
950
|
}
|
|
922
951
|
}
|
|
923
|
-
applyRuntimeSettings(options) {
|
|
924
|
-
return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings);
|
|
925
|
-
}
|
|
926
952
|
async createSession(config) {
|
|
927
953
|
const claudeConfig = this.assertConfig(config);
|
|
928
954
|
return new ClaudeAgentSession(claudeConfig, {
|
|
@@ -948,45 +974,8 @@ export class ClaudeAgentClient {
|
|
|
948
974
|
logger: this.logger,
|
|
949
975
|
});
|
|
950
976
|
}
|
|
951
|
-
async listModels(
|
|
952
|
-
|
|
953
|
-
const claudeOptions = {
|
|
954
|
-
cwd: options?.cwd ?? process.cwd(),
|
|
955
|
-
permissionMode: "plan",
|
|
956
|
-
includePartialMessages: false,
|
|
957
|
-
...(this.claudePath ? { pathToClaudeCodeExecutable: this.claudePath } : {}),
|
|
958
|
-
};
|
|
959
|
-
const claudeQuery = query({
|
|
960
|
-
prompt,
|
|
961
|
-
options: this.applyRuntimeSettings(claudeOptions),
|
|
962
|
-
});
|
|
963
|
-
try {
|
|
964
|
-
const models = await claudeQuery.supportedModels();
|
|
965
|
-
return models.map((model) => ({
|
|
966
|
-
provider: "claude",
|
|
967
|
-
id: model.value,
|
|
968
|
-
label: normalizeClaudeModelLabel(model),
|
|
969
|
-
description: model.description,
|
|
970
|
-
thinkingOptions: [
|
|
971
|
-
{ id: "off", label: "Off", isDefault: true },
|
|
972
|
-
{ id: "on", label: "On" },
|
|
973
|
-
],
|
|
974
|
-
defaultThinkingOptionId: "off",
|
|
975
|
-
metadata: {
|
|
976
|
-
description: model.description,
|
|
977
|
-
},
|
|
978
|
-
}));
|
|
979
|
-
}
|
|
980
|
-
finally {
|
|
981
|
-
if (typeof claudeQuery.return === "function") {
|
|
982
|
-
try {
|
|
983
|
-
await claudeQuery.return();
|
|
984
|
-
}
|
|
985
|
-
catch {
|
|
986
|
-
// ignore shutdown errors
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
}
|
|
977
|
+
async listModels(_options) {
|
|
978
|
+
return listClaudeCatalogModels();
|
|
990
979
|
}
|
|
991
980
|
async listPersistedAgents(options) {
|
|
992
981
|
const configDir = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
|
|
@@ -1048,7 +1037,8 @@ class ClaudeAgentSession {
|
|
|
1048
1037
|
this.activeTurnPromise = null;
|
|
1049
1038
|
this.cachedRuntimeInfo = null;
|
|
1050
1039
|
this.lastOptionsModel = null;
|
|
1051
|
-
this.selectableModelIds =
|
|
1040
|
+
this.selectableModelIds = buildClaudeSelectableModelIds();
|
|
1041
|
+
this.selectableModelFamilyAliases = buildClaudeModelFamilyAliases();
|
|
1052
1042
|
this.activeSidechains = new Map();
|
|
1053
1043
|
this.compacting = false;
|
|
1054
1044
|
this.queryPumpPromise = null;
|
|
@@ -1056,6 +1046,7 @@ class ClaudeAgentSession {
|
|
|
1056
1046
|
this.userMessageIds = [];
|
|
1057
1047
|
this.localUserMessageIds = new Set();
|
|
1058
1048
|
this.suppressLocalReplayActivity = false;
|
|
1049
|
+
this.recentStderr = "";
|
|
1059
1050
|
this.closed = false;
|
|
1060
1051
|
this.handlePermissionRequest = async (toolName, input, options) => {
|
|
1061
1052
|
const requestId = `permission-${randomUUID()}`;
|
|
@@ -1236,6 +1227,7 @@ class ClaudeAgentSession {
|
|
|
1236
1227
|
this.activeForegroundTurn = foregroundTurn;
|
|
1237
1228
|
this.preReplayMetadataSeen = false;
|
|
1238
1229
|
this.transitionTurnState("foreground", "foreground stream started");
|
|
1230
|
+
this.clearRecentStderr();
|
|
1239
1231
|
let finishedNaturally = false;
|
|
1240
1232
|
let cancelIssued = false;
|
|
1241
1233
|
let queueDrainedWithoutTerminal = false;
|
|
@@ -1458,6 +1450,13 @@ class ClaudeAgentSession {
|
|
|
1458
1450
|
return this.persistence;
|
|
1459
1451
|
}
|
|
1460
1452
|
async close() {
|
|
1453
|
+
this.logger.trace({
|
|
1454
|
+
claudeSessionId: this.claudeSessionId,
|
|
1455
|
+
turnState: this.turnState,
|
|
1456
|
+
hasQuery: Boolean(this.query),
|
|
1457
|
+
hasInput: Boolean(this.input),
|
|
1458
|
+
hasActiveForegroundTurn: Boolean(this.activeForegroundTurn),
|
|
1459
|
+
}, "Claude session close: start");
|
|
1461
1460
|
this.closed = true;
|
|
1462
1461
|
this.rejectAllPendingPermissions(new Error("Claude session closed"));
|
|
1463
1462
|
this.cancelCurrentTurn?.();
|
|
@@ -1474,6 +1473,7 @@ class ClaudeAgentSession {
|
|
|
1474
1473
|
await this.awaitWithTimeout(this.query?.return?.(), "close query return");
|
|
1475
1474
|
this.query = null;
|
|
1476
1475
|
this.input = null;
|
|
1476
|
+
this.logger.trace({ claudeSessionId: this.claudeSessionId, turnState: this.turnState }, "Claude session close: completed");
|
|
1477
1477
|
}
|
|
1478
1478
|
async listCommands() {
|
|
1479
1479
|
const q = await this.ensureQuery();
|
|
@@ -1708,20 +1708,6 @@ class ClaudeAgentSession {
|
|
|
1708
1708
|
}
|
|
1709
1709
|
this.userMessageIds.push(messageId);
|
|
1710
1710
|
}
|
|
1711
|
-
async primeSelectableModelIds(query) {
|
|
1712
|
-
try {
|
|
1713
|
-
const models = await query.supportedModels();
|
|
1714
|
-
const ids = models
|
|
1715
|
-
.map((model) => model.value?.trim())
|
|
1716
|
-
.filter((id) => typeof id === "string" && id.length > 0);
|
|
1717
|
-
this.selectableModelIds = new Set(ids);
|
|
1718
|
-
this.logger.debug({ modelIds: ids }, "Primed Claude selectable model IDs");
|
|
1719
|
-
}
|
|
1720
|
-
catch (error) {
|
|
1721
|
-
this.selectableModelIds = null;
|
|
1722
|
-
this.logger.warn({ err: error }, "Failed to prime Claude selectable model IDs");
|
|
1723
|
-
}
|
|
1724
|
-
}
|
|
1725
1711
|
async ensureQuery() {
|
|
1726
1712
|
if (this.query && !this.queryRestartNeeded) {
|
|
1727
1713
|
return this.query;
|
|
@@ -1741,15 +1727,19 @@ class ClaudeAgentSession {
|
|
|
1741
1727
|
this.logger.debug({ options: summarizeClaudeOptionsForLog(options) }, "claude query");
|
|
1742
1728
|
this.input = input;
|
|
1743
1729
|
this.query = query({ prompt: input, options });
|
|
1744
|
-
// Do not
|
|
1745
|
-
//
|
|
1746
|
-
|
|
1730
|
+
// Do not kick off background control-plane queries here. Methods like
|
|
1731
|
+
// supportedCommands()/setPermissionMode() may execute immediately after
|
|
1732
|
+
// ensureQuery() (for listCommands()/setMode()), and sharing the same query
|
|
1733
|
+
// control plane can cause those calls to wait behind supportedModels().
|
|
1747
1734
|
return this.query;
|
|
1748
1735
|
}
|
|
1749
1736
|
async awaitWithTimeout(promise, label) {
|
|
1750
1737
|
if (!promise) {
|
|
1738
|
+
this.logger.trace({ label }, "Claude query operation skipped (no promise)");
|
|
1751
1739
|
return;
|
|
1752
1740
|
}
|
|
1741
|
+
const startedAt = Date.now();
|
|
1742
|
+
this.logger.trace({ label }, "Claude query operation wait start");
|
|
1753
1743
|
try {
|
|
1754
1744
|
await Promise.race([
|
|
1755
1745
|
promise,
|
|
@@ -1757,6 +1747,7 @@ class ClaudeAgentSession {
|
|
|
1757
1747
|
setTimeout(() => reject(new Error("timeout")), 3000);
|
|
1758
1748
|
}),
|
|
1759
1749
|
]);
|
|
1750
|
+
this.logger.trace({ label, durationMs: Date.now() - startedAt }, "Claude query operation settled");
|
|
1760
1751
|
}
|
|
1761
1752
|
catch (error) {
|
|
1762
1753
|
this.logger.warn({ err: error, label }, "Claude query operation did not settle cleanly");
|
|
@@ -1794,8 +1785,9 @@ class ClaudeAgentSession {
|
|
|
1794
1785
|
preset: "claude_code",
|
|
1795
1786
|
append: appendedSystemPrompt,
|
|
1796
1787
|
},
|
|
1797
|
-
settingSources:
|
|
1788
|
+
settingSources: CLAUDE_SETTING_SOURCES,
|
|
1798
1789
|
stderr: (data) => {
|
|
1790
|
+
this.captureStderr(data);
|
|
1799
1791
|
this.logger.error({ stderr: data.trim() }, "Claude Agent SDK stderr");
|
|
1800
1792
|
},
|
|
1801
1793
|
env: {
|
|
@@ -1907,17 +1899,53 @@ class ClaudeAgentSession {
|
|
|
1907
1899
|
this.transitionTurnState("idle", reason);
|
|
1908
1900
|
}
|
|
1909
1901
|
failRun(run, errorMessage) {
|
|
1910
|
-
this.emitRunEvent(run,
|
|
1902
|
+
this.emitRunEvent(run, this.buildTurnFailedEvent(errorMessage));
|
|
1903
|
+
}
|
|
1904
|
+
buildTurnFailedEvent(errorMessage) {
|
|
1905
|
+
const normalized = errorMessage.trim() || "Claude run failed";
|
|
1906
|
+
const exitCodeMatch = normalized.match(/\bcode\s+(\d+)\b/i);
|
|
1907
|
+
const code = exitCodeMatch ? exitCodeMatch[1] : undefined;
|
|
1908
|
+
const diagnostic = this.getRecentStderrDiagnostic();
|
|
1909
|
+
return {
|
|
1911
1910
|
type: "turn_failed",
|
|
1912
1911
|
provider: "claude",
|
|
1913
|
-
error:
|
|
1914
|
-
|
|
1912
|
+
error: normalized,
|
|
1913
|
+
...(code ? { code } : {}),
|
|
1914
|
+
...(diagnostic ? { diagnostic } : {}),
|
|
1915
|
+
};
|
|
1916
|
+
}
|
|
1917
|
+
captureStderr(data) {
|
|
1918
|
+
const text = data.trim();
|
|
1919
|
+
if (!text) {
|
|
1920
|
+
return;
|
|
1921
|
+
}
|
|
1922
|
+
const combined = this.recentStderr ? `${this.recentStderr}\n${text}` : text;
|
|
1923
|
+
this.recentStderr = combined.slice(-MAX_RECENT_STDERR_CHARS);
|
|
1924
|
+
}
|
|
1925
|
+
clearRecentStderr() {
|
|
1926
|
+
this.recentStderr = "";
|
|
1927
|
+
}
|
|
1928
|
+
getRecentStderrDiagnostic() {
|
|
1929
|
+
const text = this.recentStderr.trim();
|
|
1930
|
+
return text.length > 0 ? text : undefined;
|
|
1915
1931
|
}
|
|
1916
1932
|
cancelRun(run, event) {
|
|
1917
1933
|
this.flushPendingToolCalls();
|
|
1918
1934
|
this.emitRunEvent(run, event);
|
|
1919
1935
|
}
|
|
1920
1936
|
emitRunEvent(run, event) {
|
|
1937
|
+
if (event.type === "turn_started" ||
|
|
1938
|
+
event.type === "turn_completed" ||
|
|
1939
|
+
event.type === "turn_failed" ||
|
|
1940
|
+
event.type === "turn_canceled") {
|
|
1941
|
+
this.logger.trace({
|
|
1942
|
+
runId: run.id,
|
|
1943
|
+
owner: run.owner,
|
|
1944
|
+
runState: run.state,
|
|
1945
|
+
eventType: event.type,
|
|
1946
|
+
routedTo: run.owner === "foreground" && run.queue ? "foreground_queue" : "live_queue",
|
|
1947
|
+
}, "Claude run event emitted");
|
|
1948
|
+
}
|
|
1921
1949
|
if (run.owner === "foreground" && run.queue) {
|
|
1922
1950
|
run.queue.push(event);
|
|
1923
1951
|
if (event.type === "turn_completed" ||
|
|
@@ -1948,6 +1976,13 @@ class ClaudeAgentSession {
|
|
|
1948
1976
|
this.activeForegroundTurn = null;
|
|
1949
1977
|
this.preReplayMetadataSeen = false;
|
|
1950
1978
|
}
|
|
1979
|
+
this.logger.trace({
|
|
1980
|
+
runId: run.id,
|
|
1981
|
+
owner: run.owner,
|
|
1982
|
+
eventType: event.type,
|
|
1983
|
+
runState: run.state,
|
|
1984
|
+
hasActiveForegroundTurn: Boolean(this.activeForegroundTurn),
|
|
1985
|
+
}, "Claude run terminal event handled");
|
|
1951
1986
|
this.transitionTurnStateFromActiveRuns(`run ${run.id} terminal`);
|
|
1952
1987
|
}
|
|
1953
1988
|
async transitionAutonomousToForeground() {
|
|
@@ -2056,6 +2091,9 @@ class ClaudeAgentSession {
|
|
|
2056
2091
|
// first turn cannot be stranded in autonomous fallback. If metadata churn
|
|
2057
2092
|
// was observed pre-replay, stay conservative and wait for replay.
|
|
2058
2093
|
if (!run.promptReplaySeen) {
|
|
2094
|
+
if (this.isToolUseBoundaryStreamEvent(input.message)) {
|
|
2095
|
+
return true;
|
|
2096
|
+
}
|
|
2059
2097
|
// Keep pre-replay result events with the foreground run so stale result
|
|
2060
2098
|
// bursts cannot consume autonomous wake reservations.
|
|
2061
2099
|
if (message.type === "result") {
|
|
@@ -2074,6 +2112,19 @@ class ClaudeAgentSession {
|
|
|
2074
2112
|
}
|
|
2075
2113
|
return true;
|
|
2076
2114
|
}
|
|
2115
|
+
isToolUseBoundaryStreamEvent(message) {
|
|
2116
|
+
if (message.type !== "stream_event") {
|
|
2117
|
+
return false;
|
|
2118
|
+
}
|
|
2119
|
+
const event = message.event;
|
|
2120
|
+
if (!event || event.type !== "message_delta") {
|
|
2121
|
+
return false;
|
|
2122
|
+
}
|
|
2123
|
+
const delta = "delta" in event && event.delta && typeof event.delta === "object"
|
|
2124
|
+
? event.delta
|
|
2125
|
+
: null;
|
|
2126
|
+
return delta?.stop_reason === "tool_use";
|
|
2127
|
+
}
|
|
2077
2128
|
notePreReplayMetadata(message) {
|
|
2078
2129
|
if (this.turnState !== "foreground") {
|
|
2079
2130
|
return;
|
|
@@ -2153,6 +2204,7 @@ class ClaudeAgentSession {
|
|
|
2153
2204
|
let next;
|
|
2154
2205
|
try {
|
|
2155
2206
|
next = await q.next();
|
|
2207
|
+
this.logger.info({ claudeSessionId: this.claudeSessionId, next }, "Claude query pump raw next()");
|
|
2156
2208
|
}
|
|
2157
2209
|
catch (error) {
|
|
2158
2210
|
this.logger.warn({ err: error }, "Claude query pump next() failed");
|
|
@@ -2169,6 +2221,10 @@ class ClaudeAgentSession {
|
|
|
2169
2221
|
continue;
|
|
2170
2222
|
}
|
|
2171
2223
|
if (next.done) {
|
|
2224
|
+
this.logger.trace({
|
|
2225
|
+
claudeSessionId: this.claudeSessionId,
|
|
2226
|
+
activeRunCount: this.runTracker.listActiveRuns().length,
|
|
2227
|
+
}, "Claude query pump next() returned done");
|
|
2172
2228
|
this.input?.end();
|
|
2173
2229
|
await this.awaitWithTimeout(q.return?.(), "query pump return on done");
|
|
2174
2230
|
if (this.query === q) {
|
|
@@ -2211,6 +2267,15 @@ class ClaudeAgentSession {
|
|
|
2211
2267
|
run: route.run,
|
|
2212
2268
|
message,
|
|
2213
2269
|
});
|
|
2270
|
+
this.logger.trace({
|
|
2271
|
+
claudeSessionId: this.claudeSessionId,
|
|
2272
|
+
messageType: message.type,
|
|
2273
|
+
routeReason: route.reason,
|
|
2274
|
+
runId: route.run?.id ?? null,
|
|
2275
|
+
runOwner: route.run?.owner ?? null,
|
|
2276
|
+
suppressTerminalEvents,
|
|
2277
|
+
metadataOnly,
|
|
2278
|
+
}, "Claude query pump routed SDK message");
|
|
2214
2279
|
if (route.run) {
|
|
2215
2280
|
this.transitionTurnStateFromActiveRuns(`routed via ${route.reason}`);
|
|
2216
2281
|
this.runTracker.bindIdentifiers(route.run, identifiers);
|
|
@@ -2262,6 +2327,13 @@ class ClaudeAgentSession {
|
|
|
2262
2327
|
// Pre-replay success results are stale in practice (leftover from an
|
|
2263
2328
|
// earlier query segment) and must not end the current foreground run.
|
|
2264
2329
|
if (resultSubtype === "success") {
|
|
2330
|
+
this.logger.trace({
|
|
2331
|
+
runId: run.id,
|
|
2332
|
+
runOwner: run.owner,
|
|
2333
|
+
runState: run.state,
|
|
2334
|
+
promptReplaySeen: run.promptReplaySeen,
|
|
2335
|
+
resultSubtype,
|
|
2336
|
+
}, "Suppressing pre-replay foreground success result terminal event");
|
|
2265
2337
|
return true;
|
|
2266
2338
|
}
|
|
2267
2339
|
// For non-success results, keep the metadata-churn guard to avoid
|
|
@@ -2274,6 +2346,7 @@ class ClaudeAgentSession {
|
|
|
2274
2346
|
}
|
|
2275
2347
|
}
|
|
2276
2348
|
updateRunLifecycleForMessage(run, message, identifiers) {
|
|
2349
|
+
const previousState = run.state;
|
|
2277
2350
|
if (message.type === "user" &&
|
|
2278
2351
|
identifiers.messageId &&
|
|
2279
2352
|
run.messageIds.has(identifiers.messageId)) {
|
|
@@ -2291,8 +2364,22 @@ class ClaudeAgentSession {
|
|
|
2291
2364
|
}
|
|
2292
2365
|
if (message.type === "result") {
|
|
2293
2366
|
this.runTracker.transition(run, "finalizing");
|
|
2367
|
+
}
|
|
2368
|
+
else {
|
|
2294
2369
|
return;
|
|
2295
2370
|
}
|
|
2371
|
+
if (run.state !== previousState) {
|
|
2372
|
+
this.logger.trace({
|
|
2373
|
+
runId: run.id,
|
|
2374
|
+
owner: run.owner,
|
|
2375
|
+
messageType: message.type,
|
|
2376
|
+
previousState,
|
|
2377
|
+
nextState: run.state,
|
|
2378
|
+
taskId: identifiers.taskId,
|
|
2379
|
+
parentMessageId: identifiers.parentMessageId,
|
|
2380
|
+
messageId: identifiers.messageId,
|
|
2381
|
+
}, "Updated Claude run lifecycle from SDK message");
|
|
2382
|
+
}
|
|
2296
2383
|
}
|
|
2297
2384
|
shouldSuppressLocalReplayActivity(message) {
|
|
2298
2385
|
const localReplay = this.isLocalReplayUserMessage(message);
|
|
@@ -2631,8 +2718,21 @@ class ClaudeAgentSession {
|
|
|
2631
2718
|
provider: "claude",
|
|
2632
2719
|
});
|
|
2633
2720
|
}
|
|
2721
|
+
else if (message.subtype === "task_notification") {
|
|
2722
|
+
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
|
|
2723
|
+
if (taskNotificationItem) {
|
|
2724
|
+
events.push({
|
|
2725
|
+
type: "timeline",
|
|
2726
|
+
item: taskNotificationItem,
|
|
2727
|
+
provider: "claude",
|
|
2728
|
+
});
|
|
2729
|
+
}
|
|
2730
|
+
}
|
|
2634
2731
|
break;
|
|
2635
2732
|
case "user": {
|
|
2733
|
+
if (isSyntheticUserEntry(message)) {
|
|
2734
|
+
break;
|
|
2735
|
+
}
|
|
2636
2736
|
if (this.compacting) {
|
|
2637
2737
|
this.compacting = false;
|
|
2638
2738
|
break;
|
|
@@ -2642,6 +2742,18 @@ class ClaudeAgentSession {
|
|
|
2642
2742
|
: undefined;
|
|
2643
2743
|
this.rememberUserMessageId(messageId);
|
|
2644
2744
|
const content = message.message?.content;
|
|
2745
|
+
const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
|
|
2746
|
+
content,
|
|
2747
|
+
messageId,
|
|
2748
|
+
});
|
|
2749
|
+
if (taskNotificationItem) {
|
|
2750
|
+
events.push({
|
|
2751
|
+
type: "timeline",
|
|
2752
|
+
item: taskNotificationItem,
|
|
2753
|
+
provider: "claude",
|
|
2754
|
+
});
|
|
2755
|
+
break;
|
|
2756
|
+
}
|
|
2645
2757
|
if (typeof content === "string" && content.length > 0) {
|
|
2646
2758
|
// String content from user messages (e.g., local command output)
|
|
2647
2759
|
events.push({
|
|
@@ -2702,7 +2814,7 @@ class ClaudeAgentSession {
|
|
|
2702
2814
|
const errorMessage = "errors" in message && Array.isArray(message.errors) && message.errors.length > 0
|
|
2703
2815
|
? message.errors.join("\n")
|
|
2704
2816
|
: "Claude run failed";
|
|
2705
|
-
events.push(
|
|
2817
|
+
events.push(this.buildTurnFailedEvent(errorMessage));
|
|
2706
2818
|
}
|
|
2707
2819
|
break;
|
|
2708
2820
|
}
|
|
@@ -2779,6 +2891,7 @@ class ClaudeAgentSession {
|
|
|
2779
2891
|
const normalizedModel = normalizeClaudeRuntimeModelId({
|
|
2780
2892
|
runtimeModelId: message.model,
|
|
2781
2893
|
supportedModelIds: this.selectableModelIds,
|
|
2894
|
+
supportedModelFamilyAliases: this.selectableModelFamilyAliases,
|
|
2782
2895
|
configuredModelId: this.config.model ?? null,
|
|
2783
2896
|
currentModelId: this.lastOptionsModel,
|
|
2784
2897
|
});
|
|
@@ -3379,9 +3492,18 @@ export function convertClaudeHistoryEntry(entry, mapBlocks) {
|
|
|
3379
3492
|
preTokens: compactMetadata?.preTokens,
|
|
3380
3493
|
}];
|
|
3381
3494
|
}
|
|
3495
|
+
if (entry.type === "system") {
|
|
3496
|
+
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(entry);
|
|
3497
|
+
if (taskNotificationItem) {
|
|
3498
|
+
return [taskNotificationItem];
|
|
3499
|
+
}
|
|
3500
|
+
}
|
|
3382
3501
|
if (entry.isCompactSummary) {
|
|
3383
3502
|
return [];
|
|
3384
3503
|
}
|
|
3504
|
+
if (entry.type === "user" && isSyntheticUserEntry(entry)) {
|
|
3505
|
+
return [];
|
|
3506
|
+
}
|
|
3385
3507
|
const message = entry?.message;
|
|
3386
3508
|
if (!message || !("content" in message)) {
|
|
3387
3509
|
return [];
|
|
@@ -3392,17 +3514,26 @@ export function convertClaudeHistoryEntry(entry, mapBlocks) {
|
|
|
3392
3514
|
? content
|
|
3393
3515
|
: normalizedBlocks;
|
|
3394
3516
|
const hasToolBlock = normalizedBlocks?.some((block) => hasToolLikeBlock(block)) ?? false;
|
|
3517
|
+
const userMessageId = entry.type === "user" && typeof entry.uuid === "string" && entry.uuid.length > 0
|
|
3518
|
+
? entry.uuid
|
|
3519
|
+
: null;
|
|
3520
|
+
if (entry.type === "user") {
|
|
3521
|
+
const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
|
|
3522
|
+
content,
|
|
3523
|
+
messageId: userMessageId,
|
|
3524
|
+
});
|
|
3525
|
+
if (taskNotificationItem) {
|
|
3526
|
+
return [taskNotificationItem];
|
|
3527
|
+
}
|
|
3528
|
+
}
|
|
3395
3529
|
const timeline = [];
|
|
3396
3530
|
if (entry.type === "user") {
|
|
3397
3531
|
const text = extractUserMessageText(content);
|
|
3398
3532
|
if (text) {
|
|
3399
|
-
const messageId = typeof entry.uuid === "string" && entry.uuid.length > 0
|
|
3400
|
-
? entry.uuid
|
|
3401
|
-
: undefined;
|
|
3402
3533
|
timeline.push({
|
|
3403
3534
|
type: "user_message",
|
|
3404
3535
|
text,
|
|
3405
|
-
...(
|
|
3536
|
+
...(userMessageId ? { messageId: userMessageId } : {}),
|
|
3406
3537
|
});
|
|
3407
3538
|
}
|
|
3408
3539
|
}
|
|
@@ -3544,6 +3675,9 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
|
|
|
3544
3675
|
if (entry?.isSidechain) {
|
|
3545
3676
|
continue;
|
|
3546
3677
|
}
|
|
3678
|
+
if (entry?.type === "user" && isSyntheticUserEntry(entry)) {
|
|
3679
|
+
continue;
|
|
3680
|
+
}
|
|
3547
3681
|
if (!sessionId && typeof entry.sessionId === "string") {
|
|
3548
3682
|
sessionId = entry.sessionId;
|
|
3549
3683
|
}
|