@getpaseo/server 0.1.62 → 0.1.65
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 +15 -13
- package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.d.ts +3 -2
- package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.js +9 -8
- package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +88 -56
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +264 -111
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/client/terminal-stream-router.d.ts +24 -0
- package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
- package/dist/server/client/terminal-stream-router.js +100 -0
- package/dist/server/client/terminal-stream-router.js.map +1 -0
- package/dist/server/server/agent/activity-curator.d.ts +6 -3
- package/dist/server/server/agent/activity-curator.d.ts.map +1 -1
- package/dist/server/server/agent/activity-curator.js +45 -138
- package/dist/server/server/agent/activity-curator.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 +46 -31
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +457 -419
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -11
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.js +3 -85
- 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 +58 -41
- 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 +7 -7
- package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
- package/dist/server/server/agent/agent-stream-coalescer.js +1 -1
- package/dist/server/server/agent/agent-stream-coalescer.js.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 +103 -85
- package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
- package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
- package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
- package/dist/server/server/agent/foreground-run-state.js +162 -0
- package/dist/server/server/agent/foreground-run-state.js.map +1 -0
- package/dist/server/server/agent/mcp-server.d.ts +5 -3
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +282 -234
- 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 +9 -1
- 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/prompt-attachments.d.ts +4 -3
- package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
- package/dist/server/server/agent/prompt-attachments.js +43 -4
- package/dist/server/server/agent/prompt-attachments.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-manifest.d.ts.map +1 -1
- package/dist/server/server/agent/provider-manifest.js +7 -0
- package/dist/server/server/agent/provider-manifest.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 +49 -13
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.js +404 -261
- 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 +83 -206
- 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 +654 -554
- 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 +174 -185
- 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 +62 -13
- 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 +873 -646
- 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 +6 -2
- 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 +294 -113
- package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +1 -1
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +94 -2
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.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/tool-call-mapper.js +24 -115
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +104 -3
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +786 -503
- 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/provider-runner.d.ts +27 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
- package/dist/server/server/agent/providers/provider-runner.js +80 -0
- package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
- 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 +9 -6
- 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 +4 -2
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js +31 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js.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 +27 -11
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.js +70 -15
- 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/auth.d.ts +25 -0
- package/dist/server/server/auth.d.ts.map +1 -0
- package/dist/server/server/auth.js +93 -0
- package/dist/server/server/auth.js.map +1 -0
- package/dist/server/server/bootstrap.d.ts +7 -5
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +550 -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 +79 -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 +10 -4
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +7 -4
- 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/file-explorer/service.d.ts +10 -0
- package/dist/server/server/file-explorer/service.d.ts.map +1 -1
- package/dist/server/server/file-explorer/service.js +38 -4
- package/dist/server/server/file-explorer/service.js.map +1 -1
- package/dist/server/server/index.js +25 -18
- 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 +41 -21
- 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/pagination/cursor.d.ts +16 -0
- package/dist/server/server/pagination/cursor.d.ts.map +1 -0
- package/dist/server/server/pagination/cursor.js +62 -0
- package/dist/server/server/pagination/cursor.js.map +1 -0
- package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
- package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
- package/dist/server/server/pagination/sortable-pager.js +68 -0
- package/dist/server/server/pagination/sortable-pager.js.map +1 -0
- 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 +7 -5
- package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-archive-service.js +70 -62
- package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
- package/dist/server/server/paseo-worktree-service.d.ts +13 -0
- package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-service.js +72 -3
- package/dist/server/server/paseo-worktree-service.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +87 -62
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +13 -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 +43 -20
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/resolve-worktree-creation-intent.d.ts +0 -10
- package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -1
- package/dist/server/server/resolve-worktree-creation-intent.js +1 -45
- package/dist/server/server/resolve-worktree-creation-intent.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 +10 -5
- package/dist/server/server/script-status-projection.d.ts.map +1 -1
- package/dist/server/server/script-status-projection.js +66 -47
- 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 +64 -65
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +1356 -1734
- 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 +34 -22
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +360 -205
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-directory.d.ts +69 -0
- package/dist/server/server/workspace-directory.d.ts.map +1 -0
- package/dist/server/server/workspace-directory.js +229 -0
- package/dist/server/server/workspace-directory.js.map +1 -0
- 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 +101 -69
- package/dist/server/server/worktree-bootstrap.js.map +1 -1
- package/dist/server/server/worktree-core.d.ts +2 -0
- package/dist/server/server/worktree-core.d.ts.map +1 -1
- package/dist/server/server/worktree-core.js.map +1 -1
- package/dist/server/server/worktree-errors.d.ts +1 -1
- package/dist/server/server/worktree-errors.d.ts.map +1 -1
- package/dist/server/server/worktree-errors.js +1 -4
- package/dist/server/server/worktree-errors.js.map +1 -1
- package/dist/server/server/worktree-session.d.ts +54 -27
- package/dist/server/server/worktree-session.d.ts.map +1 -1
- package/dist/server/server/worktree-session.js +95 -44
- 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/binary-frames/file-transfer.d.ts +56 -0
- package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
- package/dist/server/shared/binary-frames/file-transfer.js +108 -0
- package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
- package/dist/server/shared/binary-frames/index.d.ts +3 -0
- package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
- package/dist/server/shared/binary-frames/index.js +3 -0
- package/dist/server/shared/binary-frames/index.js.map +1 -0
- package/dist/server/shared/{terminal-stream-protocol.d.ts → binary-frames/terminal.d.ts} +4 -4
- package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
- package/dist/server/shared/{terminal-stream-protocol.js → binary-frames/terminal.js} +2 -2
- package/dist/server/shared/binary-frames/terminal.js.map +1 -0
- package/dist/server/shared/client-capabilities.d.ts +5 -0
- package/dist/server/shared/client-capabilities.d.ts.map +1 -0
- package/dist/server/shared/client-capabilities.js +4 -0
- package/dist/server/shared/client-capabilities.js.map +1 -0
- package/dist/server/shared/connection-offer.d.ts +8 -0
- package/dist/server/shared/connection-offer.d.ts.map +1 -1
- package/dist/server/shared/connection-offer.js +35 -0
- package/dist/server/shared/connection-offer.js.map +1 -1
- package/dist/server/shared/daemon-endpoints.d.ts +18 -3
- package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
- package/dist/server/shared/daemon-endpoints.js +82 -8
- package/dist/server/shared/daemon-endpoints.js.map +1 -1
- package/dist/server/shared/host-connection-schema.d.ts +23 -0
- package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
- package/dist/server/shared/host-connection-schema.js +9 -0
- package/dist/server/shared/host-connection-schema.js.map +1 -0
- package/dist/server/shared/messages.d.ts +25073 -3453
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +152 -36
- package/dist/server/shared/messages.js.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-factory.d.ts +7 -0
- package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
- package/dist/server/terminal/terminal-manager-factory.js +13 -0
- package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
- package/dist/server/terminal/terminal-manager.d.ts +7 -1
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.js +15 -4
- 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-session-controller.d.ts +63 -0
- package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
- package/dist/server/terminal/terminal-session-controller.js +615 -0
- package/dist/server/terminal/terminal-session-controller.js.map +1 -0
- package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
- package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
- package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
- package/dist/server/terminal/terminal-worker-process.js +221 -0
- package/dist/server/terminal/terminal-worker-process.js.map +1 -0
- package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
- package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
- package/dist/server/terminal/terminal-worker-protocol.js +2 -0
- package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
- package/dist/server/terminal/terminal.d.ts +10 -2
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +79 -28
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
- package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
- package/dist/server/terminal/worker-terminal-manager.js +466 -0
- package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/server/utils/directory-suggestions.js +22 -34
- 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/process-tree.d.ts +25 -0
- package/dist/server/utils/process-tree.d.ts.map +1 -0
- package/dist/server/utils/process-tree.js +96 -0
- package/dist/server/utils/process-tree.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 +41 -0
- package/dist/server/utils/windows-command.js.map +1 -0
- package/dist/server/utils/worktree-metadata.d.ts +44 -0
- package/dist/server/utils/worktree-metadata.d.ts.map +1 -1
- package/dist/server/utils/worktree-metadata.js +58 -0
- package/dist/server/utils/worktree-metadata.js.map +1 -1
- package/dist/server/utils/worktree.d.ts +23 -8
- package/dist/server/utils/worktree.d.ts.map +1 -1
- package/dist/server/utils/worktree.js +81 -63
- package/dist/server/utils/worktree.js.map +1 -1
- package/dist/src/server/pid-lock.js.map +1 -1
- package/package.json +17 -21
- 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
- package/dist/server/shared/terminal-stream-protocol.d.ts.map +0 -1
- package/dist/server/shared/terminal-stream-protocol.js.map +0 -1
|
@@ -10,8 +10,9 @@ import { getClaudeModels, normalizeClaudeRuntimeModelId } from "./claude/claude-
|
|
|
10
10
|
import { parsePartialJsonObject } from "./claude/partial-json.js";
|
|
11
11
|
import { ClaudeSidechainTracker } from "./claude/sidechain-tracker.js";
|
|
12
12
|
import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
|
|
13
|
+
import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "./provider-runner.js";
|
|
13
14
|
import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
|
|
14
|
-
import {
|
|
15
|
+
import { createProviderEnv, createProviderEnvSpec, } from "../provider-launch-config.js";
|
|
15
16
|
import { findExecutable, isCommandAvailable } from "../../../utils/executable.js";
|
|
16
17
|
import { withTimeout } from "../../../utils/promise-timeout.js";
|
|
17
18
|
import { execCommand, spawnProcess } from "../../../utils/spawn.js";
|
|
@@ -59,6 +60,38 @@ const INTERRUPT_TOOL_USE_PLACEHOLDER = "[Request interrupted by user for tool us
|
|
|
59
60
|
const INTERRUPT_PLACEHOLDER_PATTERN = /^\[Request interrupted by user(?:[^\]]*)\]$/;
|
|
60
61
|
const NO_RESPONSE_REQUESTED_PLACEHOLDER = "No response requested.";
|
|
61
62
|
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
63
|
+
function resolvePathEnvKey() {
|
|
64
|
+
if (process.env["Path"] !== undefined)
|
|
65
|
+
return "Path";
|
|
66
|
+
if (process.env["PATH"] !== undefined)
|
|
67
|
+
return "PATH";
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
function errorToMessageString(error) {
|
|
71
|
+
if (typeof error === "string")
|
|
72
|
+
return error;
|
|
73
|
+
if (error instanceof Error)
|
|
74
|
+
return error.message;
|
|
75
|
+
return "";
|
|
76
|
+
}
|
|
77
|
+
function firstStringField(input, primaryKey, secondaryKey) {
|
|
78
|
+
const primary = input[primaryKey];
|
|
79
|
+
if (typeof primary === "string")
|
|
80
|
+
return primary;
|
|
81
|
+
const secondary = input[secondaryKey];
|
|
82
|
+
if (typeof secondary === "string")
|
|
83
|
+
return secondary;
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
function extractSessionIdRaw(msg) {
|
|
87
|
+
if (typeof msg.session_id === "string")
|
|
88
|
+
return msg.session_id;
|
|
89
|
+
if (typeof msg.sessionId === "string")
|
|
90
|
+
return msg.sessionId;
|
|
91
|
+
if (typeof msg.session?.id === "string")
|
|
92
|
+
return msg.session.id;
|
|
93
|
+
return "";
|
|
94
|
+
}
|
|
62
95
|
function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
|
|
63
96
|
const commandConfig = runtimeSettings?.command;
|
|
64
97
|
if (!commandConfig || commandConfig.mode === "default") {
|
|
@@ -92,10 +125,11 @@ function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv
|
|
|
92
125
|
const command = isDefaultRuntime ? process.execPath : resolved.command;
|
|
93
126
|
const child = spawnProcess(command, resolved.args, {
|
|
94
127
|
cwd: spawnOptions.cwd,
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
128
|
+
...createProviderEnvSpec({
|
|
129
|
+
baseEnv: spawnOptions.env,
|
|
130
|
+
runtimeSettings,
|
|
131
|
+
overlays: [launchEnv],
|
|
132
|
+
}),
|
|
99
133
|
signal: spawnOptions.signal,
|
|
100
134
|
stdio: ["pipe", "pipe", "pipe"],
|
|
101
135
|
// Bypass cmd.exe on Windows: the SDK passes --mcp-config with inline JSON
|
|
@@ -332,6 +366,26 @@ export function extractUserMessageText(content) {
|
|
|
332
366
|
function isMetadata(value) {
|
|
333
367
|
return typeof value === "object" && value !== null;
|
|
334
368
|
}
|
|
369
|
+
function createDefaultToolUseCacheEntry(id, block) {
|
|
370
|
+
const nameFromBlock = typeof block.name === "string" && block.name.length > 0 ? block.name : "tool";
|
|
371
|
+
let server;
|
|
372
|
+
if (typeof block.server === "string" && block.server.length > 0) {
|
|
373
|
+
server = block.server;
|
|
374
|
+
}
|
|
375
|
+
else if (typeof block.name === "string" && block.name.length > 0) {
|
|
376
|
+
server = block.name;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
server = "tool";
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
id,
|
|
383
|
+
name: nameFromBlock,
|
|
384
|
+
server,
|
|
385
|
+
classification: "generic",
|
|
386
|
+
started: false,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
335
389
|
function readTrimmedString(value) {
|
|
336
390
|
if (typeof value !== "string") {
|
|
337
391
|
return undefined;
|
|
@@ -728,31 +782,44 @@ function isSyntheticUserEntry(entry) {
|
|
|
728
782
|
const candidate = entry;
|
|
729
783
|
return candidate.isSynthetic === true || candidate.isMeta === true;
|
|
730
784
|
}
|
|
785
|
+
function firstTrimmedString(sources) {
|
|
786
|
+
for (const source of sources) {
|
|
787
|
+
const value = readTrimmedString(source);
|
|
788
|
+
if (value) {
|
|
789
|
+
return value;
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
return null;
|
|
793
|
+
}
|
|
731
794
|
export function readEventIdentifiers(message) {
|
|
732
795
|
const root = message;
|
|
733
796
|
const messageType = readTrimmedString(root.type);
|
|
734
797
|
const streamEvent = root.event;
|
|
735
798
|
const streamEventMessage = streamEvent?.message;
|
|
736
799
|
const messageContainer = root.message;
|
|
800
|
+
const messageIdFromUuid = messageType === "user" ? root.uuid : undefined;
|
|
737
801
|
return {
|
|
738
|
-
taskId:
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
802
|
+
taskId: firstTrimmedString([
|
|
803
|
+
root.task_id,
|
|
804
|
+
streamEvent?.task_id,
|
|
805
|
+
streamEventMessage?.task_id,
|
|
806
|
+
messageContainer?.task_id,
|
|
807
|
+
]),
|
|
808
|
+
parentMessageId: firstTrimmedString([
|
|
809
|
+
root.parent_message_id,
|
|
810
|
+
streamEvent?.parent_message_id,
|
|
811
|
+
streamEventMessage?.parent_message_id,
|
|
812
|
+
messageContainer?.parent_message_id,
|
|
813
|
+
]),
|
|
814
|
+
messageId: firstTrimmedString([
|
|
815
|
+
root.message_id,
|
|
816
|
+
streamEvent?.message_id,
|
|
817
|
+
streamEventMessage?.id,
|
|
818
|
+
streamEventMessage?.message_id,
|
|
819
|
+
messageContainer?.id,
|
|
820
|
+
messageContainer?.message_id,
|
|
821
|
+
messageIdFromUuid,
|
|
822
|
+
]),
|
|
756
823
|
};
|
|
757
824
|
}
|
|
758
825
|
const claudeDebug = process.env.PASEO_CLAUDE_DEBUG === "1";
|
|
@@ -781,7 +848,11 @@ export class ClaudeAgentClient {
|
|
|
781
848
|
if (!merged.cwd) {
|
|
782
849
|
throw new Error("Claude resume requires the original working directory in metadata");
|
|
783
850
|
}
|
|
784
|
-
const mergedConfig = {
|
|
851
|
+
const mergedConfig = {
|
|
852
|
+
...merged,
|
|
853
|
+
provider: "claude",
|
|
854
|
+
cwd: merged.cwd,
|
|
855
|
+
};
|
|
785
856
|
const claudeConfig = this.assertConfig(mergedConfig);
|
|
786
857
|
return new ClaudeAgentSession(claudeConfig, {
|
|
787
858
|
defaults: this.defaults,
|
|
@@ -804,17 +875,10 @@ export class ClaudeAgentClient {
|
|
|
804
875
|
}
|
|
805
876
|
const limit = options?.limit ?? 20;
|
|
806
877
|
const candidates = await collectRecentClaudeSessions(projectsRoot, limit * 3);
|
|
807
|
-
const
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
descriptors.push(descriptor);
|
|
812
|
-
}
|
|
813
|
-
if (descriptors.length >= limit) {
|
|
814
|
-
break;
|
|
815
|
-
}
|
|
816
|
-
}
|
|
817
|
-
return descriptors;
|
|
878
|
+
const parsed = await Promise.all(candidates.map((candidate) => parseClaudeSessionDescriptor(candidate.path, candidate.mtime)));
|
|
879
|
+
return parsed
|
|
880
|
+
.filter((descriptor) => descriptor !== null)
|
|
881
|
+
.slice(0, limit);
|
|
818
882
|
}
|
|
819
883
|
async isAvailable() {
|
|
820
884
|
const command = this.runtimeSettings?.command;
|
|
@@ -835,7 +899,10 @@ export class ClaudeAgentClient {
|
|
|
835
899
|
let status = formatDiagnosticStatus(available);
|
|
836
900
|
if (available) {
|
|
837
901
|
try {
|
|
838
|
-
const models = await this.listModels({
|
|
902
|
+
const models = await this.listModels({
|
|
903
|
+
cwd: os.homedir(),
|
|
904
|
+
force: false,
|
|
905
|
+
});
|
|
839
906
|
modelsValue = String(models.length);
|
|
840
907
|
}
|
|
841
908
|
catch (error) {
|
|
@@ -871,16 +938,20 @@ export class ClaudeAgentClient {
|
|
|
871
938
|
}
|
|
872
939
|
async function resolveClaudeVersion(runtimeSettings) {
|
|
873
940
|
const command = runtimeSettings?.command;
|
|
941
|
+
const envSpec = createProviderEnvSpec({ runtimeSettings });
|
|
874
942
|
try {
|
|
875
943
|
if (command?.mode === "replace") {
|
|
876
|
-
const { stdout } = await execCommand(command.argv[0], [...command.argv.slice(1), "--version"], { timeout: 5000 });
|
|
944
|
+
const { stdout } = await execCommand(command.argv[0], [...command.argv.slice(1), "--version"], { ...envSpec, timeout: 5000 });
|
|
877
945
|
return stdout.trim() || null;
|
|
878
946
|
}
|
|
879
947
|
const executable = await findExecutable("claude");
|
|
880
948
|
if (!executable) {
|
|
881
949
|
return null;
|
|
882
950
|
}
|
|
883
|
-
const { stdout } = await execCommand(executable, ["--version"], {
|
|
951
|
+
const { stdout } = await execCommand(executable, ["--version"], {
|
|
952
|
+
...envSpec,
|
|
953
|
+
timeout: 5000,
|
|
954
|
+
});
|
|
884
955
|
return stdout.trim() || null;
|
|
885
956
|
}
|
|
886
957
|
catch {
|
|
@@ -891,7 +962,10 @@ async function resolveClaudeAuth(runtimeSettings) {
|
|
|
891
962
|
const command = runtimeSettings?.command;
|
|
892
963
|
const run = async (executable, args) => {
|
|
893
964
|
try {
|
|
894
|
-
return await execCommand(executable, args, {
|
|
965
|
+
return await execCommand(executable, args, {
|
|
966
|
+
...createProviderEnvSpec({ runtimeSettings }),
|
|
967
|
+
timeout: 5000,
|
|
968
|
+
});
|
|
895
969
|
}
|
|
896
970
|
catch (error) {
|
|
897
971
|
const err = error;
|
|
@@ -1048,11 +1122,17 @@ class ClaudeAgentSession {
|
|
|
1048
1122
|
kind,
|
|
1049
1123
|
input,
|
|
1050
1124
|
detail: toolDetail,
|
|
1051
|
-
suggestions: options.suggestions?.map((suggestion) => ({
|
|
1125
|
+
suggestions: options.suggestions?.map((suggestion) => ({
|
|
1126
|
+
...suggestion,
|
|
1127
|
+
})),
|
|
1052
1128
|
actions: kind === "plan" ? buildClaudePlanPermissionActions(this.planResumeMode) : undefined,
|
|
1053
1129
|
metadata: Object.keys(metadata).length ? metadata : undefined,
|
|
1054
1130
|
};
|
|
1055
|
-
this.pushEvent({
|
|
1131
|
+
this.pushEvent({
|
|
1132
|
+
type: "permission_requested",
|
|
1133
|
+
provider: "claude",
|
|
1134
|
+
request,
|
|
1135
|
+
});
|
|
1056
1136
|
return await new Promise((resolve, reject) => {
|
|
1057
1137
|
const cleanupFns = [];
|
|
1058
1138
|
const cleanup = () => {
|
|
@@ -1140,77 +1220,14 @@ class ClaudeAgentSession {
|
|
|
1140
1220
|
return { ...info };
|
|
1141
1221
|
}
|
|
1142
1222
|
async run(prompt, options) {
|
|
1143
|
-
const
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
let rejectCompletion;
|
|
1151
|
-
const processEvent = (event) => {
|
|
1152
|
-
if (settled) {
|
|
1153
|
-
return;
|
|
1154
|
-
}
|
|
1155
|
-
const eventTurnId = event.turnId;
|
|
1156
|
-
if (turnId && eventTurnId && eventTurnId !== turnId) {
|
|
1157
|
-
return;
|
|
1158
|
-
}
|
|
1159
|
-
if (event.type === "timeline") {
|
|
1160
|
-
timeline.push(event.item);
|
|
1161
|
-
if (event.item.type === "assistant_message") {
|
|
1162
|
-
if (!finalText) {
|
|
1163
|
-
finalText = event.item.text;
|
|
1164
|
-
}
|
|
1165
|
-
else if (event.item.text.startsWith(finalText)) {
|
|
1166
|
-
finalText = event.item.text;
|
|
1167
|
-
}
|
|
1168
|
-
else {
|
|
1169
|
-
finalText += event.item.text;
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
return;
|
|
1173
|
-
}
|
|
1174
|
-
if (event.type === "turn_completed") {
|
|
1175
|
-
usage = event.usage;
|
|
1176
|
-
settled = true;
|
|
1177
|
-
resolveCompletion();
|
|
1178
|
-
return;
|
|
1179
|
-
}
|
|
1180
|
-
if (event.type === "turn_failed") {
|
|
1181
|
-
settled = true;
|
|
1182
|
-
rejectCompletion(new Error(event.error));
|
|
1183
|
-
return;
|
|
1184
|
-
}
|
|
1185
|
-
if (event.type === "turn_canceled") {
|
|
1186
|
-
settled = true;
|
|
1187
|
-
resolveCompletion();
|
|
1188
|
-
}
|
|
1189
|
-
};
|
|
1190
|
-
const completion = new Promise((resolve, reject) => {
|
|
1191
|
-
resolveCompletion = resolve;
|
|
1192
|
-
rejectCompletion = reject;
|
|
1223
|
+
const result = await runProviderTurn({
|
|
1224
|
+
prompt,
|
|
1225
|
+
runOptions: options,
|
|
1226
|
+
startTurn: (p, o) => this.startTurn(p, o),
|
|
1227
|
+
subscribe: (callback) => this.subscribe(callback),
|
|
1228
|
+
getSessionId: () => this.claudeSessionId ?? "",
|
|
1229
|
+
reduceFinalText: appendOrReplaceGrowingAssistantMessage,
|
|
1193
1230
|
});
|
|
1194
|
-
const unsubscribe = this.subscribe((event) => {
|
|
1195
|
-
if (!turnId) {
|
|
1196
|
-
bufferedEvents.push(event);
|
|
1197
|
-
return;
|
|
1198
|
-
}
|
|
1199
|
-
processEvent(event);
|
|
1200
|
-
});
|
|
1201
|
-
try {
|
|
1202
|
-
const result = await this.startTurn(prompt, options);
|
|
1203
|
-
turnId = result.turnId;
|
|
1204
|
-
for (const event of bufferedEvents) {
|
|
1205
|
-
processEvent(event);
|
|
1206
|
-
}
|
|
1207
|
-
if (!settled) {
|
|
1208
|
-
await completion;
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
finally {
|
|
1212
|
-
unsubscribe();
|
|
1213
|
-
}
|
|
1214
1231
|
this.cachedRuntimeInfo = {
|
|
1215
1232
|
provider: "claude",
|
|
1216
1233
|
sessionId: this.claudeSessionId,
|
|
@@ -1220,12 +1237,7 @@ class ClaudeAgentSession {
|
|
|
1220
1237
|
if (!this.claudeSessionId) {
|
|
1221
1238
|
throw new Error("Session ID not set after run completed");
|
|
1222
1239
|
}
|
|
1223
|
-
return
|
|
1224
|
-
sessionId: this.claudeSessionId,
|
|
1225
|
-
finalText,
|
|
1226
|
-
usage,
|
|
1227
|
-
timeline,
|
|
1228
|
-
};
|
|
1240
|
+
return result;
|
|
1229
1241
|
}
|
|
1230
1242
|
async startTurn(prompt, _options) {
|
|
1231
1243
|
if (this.closed) {
|
|
@@ -1328,8 +1340,8 @@ class ClaudeAgentSession {
|
|
|
1328
1340
|
}
|
|
1329
1341
|
const normalized = isPermissionMode(modeId) ? modeId : "default";
|
|
1330
1342
|
const previousMode = this.currentMode;
|
|
1331
|
-
const
|
|
1332
|
-
await
|
|
1343
|
+
const activeQuery = await this.ensureQuery();
|
|
1344
|
+
await activeQuery.setPermissionMode(normalized);
|
|
1333
1345
|
if (normalized === "plan") {
|
|
1334
1346
|
if (previousMode !== "plan") {
|
|
1335
1347
|
this.planResumeMode = previousMode;
|
|
@@ -1342,8 +1354,8 @@ class ClaudeAgentSession {
|
|
|
1342
1354
|
}
|
|
1343
1355
|
async setModel(modelId) {
|
|
1344
1356
|
const normalizedModelId = typeof modelId === "string" && modelId.trim().length > 0 ? modelId : null;
|
|
1345
|
-
const
|
|
1346
|
-
await
|
|
1357
|
+
const activeQuery = await this.ensureQuery();
|
|
1358
|
+
await activeQuery.setModel(normalizedModelId ?? undefined);
|
|
1347
1359
|
this.config.model = normalizedModelId ?? undefined;
|
|
1348
1360
|
this.lastOptionsModel = normalizedModelId ?? this.lastOptionsModel;
|
|
1349
1361
|
this.lastRuntimeModel = null;
|
|
@@ -1577,8 +1589,8 @@ class ClaudeAgentSession {
|
|
|
1577
1589
|
}
|
|
1578
1590
|
async rewindFilesOnce(messageId) {
|
|
1579
1591
|
try {
|
|
1580
|
-
const
|
|
1581
|
-
return await
|
|
1592
|
+
const activeQuery = await this.ensureFreshQuery();
|
|
1593
|
+
return await activeQuery.rewindFiles(messageId, { dryRun: false });
|
|
1582
1594
|
}
|
|
1583
1595
|
catch (error) {
|
|
1584
1596
|
// The Claude SDK transport can close after a rewind call.
|
|
@@ -1669,9 +1681,6 @@ class ClaudeAgentSession {
|
|
|
1669
1681
|
this.input = null;
|
|
1670
1682
|
this.queryPumpPromise = null;
|
|
1671
1683
|
this.queryRestartNeeded = false;
|
|
1672
|
-
// Reset session identity for explicit restarts so the new query starts
|
|
1673
|
-
// a fresh session rather than resuming the previous one.
|
|
1674
|
-
this.claudeSessionId = null;
|
|
1675
1684
|
oldInput?.end();
|
|
1676
1685
|
oldQuery.close?.();
|
|
1677
1686
|
try {
|
|
@@ -1681,10 +1690,8 @@ class ClaudeAgentSession {
|
|
|
1681
1690
|
/* ignore */
|
|
1682
1691
|
}
|
|
1683
1692
|
}
|
|
1684
|
-
//
|
|
1685
|
-
//
|
|
1686
|
-
// resume: sessionId and the new query auto-resumes the previous session.
|
|
1687
|
-
// For explicit restarts above, claudeSessionId was already cleared.
|
|
1693
|
+
// Preserve claudeSessionId across query recreation so buildOptions() passes
|
|
1694
|
+
// resume: sessionId and the new query continues the existing conversation.
|
|
1688
1695
|
this.persistence = null;
|
|
1689
1696
|
const input = createAsyncMessageInput();
|
|
1690
1697
|
const options = await this.buildOptions();
|
|
@@ -1712,32 +1719,46 @@ class ClaudeAgentSession {
|
|
|
1712
1719
|
this.logger.warn({ err: error, label }, "Claude query operation did not settle cleanly");
|
|
1713
1720
|
}
|
|
1714
1721
|
}
|
|
1715
|
-
|
|
1722
|
+
resolveThinkingConfig() {
|
|
1716
1723
|
const thinkingOptionId = this.config.thinkingOptionId && this.config.thinkingOptionId !== "default"
|
|
1717
1724
|
? this.config.thinkingOptionId
|
|
1718
1725
|
: undefined;
|
|
1719
|
-
let thinking;
|
|
1720
|
-
let effort;
|
|
1721
1726
|
if (thinkingOptionId && isClaudeThinkingEffort(thinkingOptionId)) {
|
|
1722
|
-
thinking = { type: "adaptive" };
|
|
1723
1727
|
// SDK 0.2.71 types `effort` as 'low' | 'medium' | 'high' | 'max'; Opus 4.7
|
|
1724
1728
|
// adds 'xhigh' which the binary accepts but the typings don't yet expose.
|
|
1725
|
-
|
|
1729
|
+
return {
|
|
1730
|
+
thinking: { type: "adaptive" },
|
|
1731
|
+
effort: thinkingOptionId,
|
|
1732
|
+
};
|
|
1726
1733
|
}
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
]
|
|
1734
|
+
return { thinking: undefined, effort: undefined };
|
|
1735
|
+
}
|
|
1736
|
+
buildAppendedSystemPrompt() {
|
|
1737
|
+
return [getOrchestratorModeInstructions(), this.config.systemPrompt?.trim()]
|
|
1731
1738
|
.filter((entry) => typeof entry === "string" && entry.length > 0)
|
|
1732
1739
|
.join("\n\n");
|
|
1740
|
+
}
|
|
1741
|
+
async buildOptions() {
|
|
1742
|
+
const { thinking, effort } = this.resolveThinkingConfig();
|
|
1743
|
+
const appendedSystemPrompt = this.buildAppendedSystemPrompt();
|
|
1744
|
+
const extraClaudeOptions = this.config.extra?.claude;
|
|
1745
|
+
const sdkEnv = createProviderEnv({
|
|
1746
|
+
baseEnv: process.env,
|
|
1747
|
+
runtimeSettings: this.runtimeSettings,
|
|
1748
|
+
overlays: [
|
|
1749
|
+
extraClaudeOptions?.env,
|
|
1750
|
+
{
|
|
1751
|
+
// Increase MCP timeouts for long-running tool calls (10 minutes)
|
|
1752
|
+
MCP_TIMEOUT: "600000",
|
|
1753
|
+
MCP_TOOL_TIMEOUT: "600000",
|
|
1754
|
+
},
|
|
1755
|
+
this.launchEnv,
|
|
1756
|
+
],
|
|
1757
|
+
});
|
|
1733
1758
|
const claudeBinary = await findExecutable("claude");
|
|
1734
1759
|
this.logger.debug({
|
|
1735
1760
|
claudeBinary,
|
|
1736
|
-
pathEnvKey:
|
|
1737
|
-
? "Path"
|
|
1738
|
-
: process.env["PATH"] !== undefined
|
|
1739
|
-
? "PATH"
|
|
1740
|
-
: null,
|
|
1761
|
+
pathEnvKey: resolvePathEnvKey(),
|
|
1741
1762
|
pathIncludesClaudeLocalBin: (process.env["Path"] ?? process.env["PATH"] ?? "")
|
|
1742
1763
|
.toLowerCase()
|
|
1743
1764
|
.includes("\\.local\\bin"),
|
|
@@ -1765,13 +1786,6 @@ class ClaudeAgentSession {
|
|
|
1765
1786
|
this.captureStderr(data);
|
|
1766
1787
|
this.logger.error({ stderr: data.trim() }, "Claude Agent SDK stderr");
|
|
1767
1788
|
},
|
|
1768
|
-
env: {
|
|
1769
|
-
...process.env,
|
|
1770
|
-
// Increase MCP timeouts for long-running tool calls (10 minutes)
|
|
1771
|
-
MCP_TIMEOUT: "600000",
|
|
1772
|
-
MCP_TOOL_TIMEOUT: "600000",
|
|
1773
|
-
...(this.launchEnv ?? {}),
|
|
1774
|
-
},
|
|
1775
1789
|
// Required for provider-level /rewind support.
|
|
1776
1790
|
enableFileCheckpointing: true,
|
|
1777
1791
|
// If we have a session ID from a previous query (e.g., after interrupt),
|
|
@@ -1779,7 +1793,8 @@ class ClaudeAgentSession {
|
|
|
1779
1793
|
...(this.claudeSessionId ? { resume: this.claudeSessionId } : {}),
|
|
1780
1794
|
...(thinking ? { thinking } : {}),
|
|
1781
1795
|
...(effort ? { effort } : {}),
|
|
1782
|
-
...
|
|
1796
|
+
...extraClaudeOptions,
|
|
1797
|
+
env: sdkEnv,
|
|
1783
1798
|
};
|
|
1784
1799
|
if (this.config.mcpServers) {
|
|
1785
1800
|
base.mcpServers = this.normalizeMcpServers(this.config.mcpServers);
|
|
@@ -1826,7 +1841,7 @@ class ClaudeAgentSession {
|
|
|
1826
1841
|
},
|
|
1827
1842
|
});
|
|
1828
1843
|
}
|
|
1829
|
-
else
|
|
1844
|
+
else {
|
|
1830
1845
|
content.push({ type: "text", text: renderPromptAttachmentAsText(chunk) });
|
|
1831
1846
|
}
|
|
1832
1847
|
}
|
|
@@ -1900,7 +1915,7 @@ class ClaudeAgentSession {
|
|
|
1900
1915
|
if (this.getRecentStderrDiagnostic()) {
|
|
1901
1916
|
return;
|
|
1902
1917
|
}
|
|
1903
|
-
const message =
|
|
1918
|
+
const message = errorToMessageString(error);
|
|
1904
1919
|
if (!/\bprocess exited with code\b/i.test(message) &&
|
|
1905
1920
|
!/\bterminated by signal\b/i.test(message)) {
|
|
1906
1921
|
return;
|
|
@@ -1965,11 +1980,16 @@ class ClaudeAgentSession {
|
|
|
1965
1980
|
if (consecutiveRecoveries >= 3) {
|
|
1966
1981
|
return false;
|
|
1967
1982
|
}
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1983
|
+
let message;
|
|
1984
|
+
if (typeof error === "string") {
|
|
1985
|
+
message = error;
|
|
1986
|
+
}
|
|
1987
|
+
else if (error instanceof Error) {
|
|
1988
|
+
message = `${error.message}\n${error.stack ?? ""}`;
|
|
1989
|
+
}
|
|
1990
|
+
else {
|
|
1991
|
+
message = JSON.stringify(error);
|
|
1992
|
+
}
|
|
1973
1993
|
return message.toLowerCase().includes("request was aborted");
|
|
1974
1994
|
}
|
|
1975
1995
|
finishForegroundTurn(event) {
|
|
@@ -2055,23 +2075,39 @@ class ClaudeAgentSession {
|
|
|
2055
2075
|
return;
|
|
2056
2076
|
}
|
|
2057
2077
|
let consecutiveInterruptAbortRecoveries = 0;
|
|
2078
|
+
const logRawMessage = (message) => {
|
|
2079
|
+
if (!claudeDebug) {
|
|
2080
|
+
return;
|
|
2081
|
+
}
|
|
2082
|
+
this.logger.trace({
|
|
2083
|
+
claudeSessionId: this.claudeSessionId,
|
|
2084
|
+
messageType: message.type,
|
|
2085
|
+
messageSubtype: "subtype" in message ? message.subtype : undefined,
|
|
2086
|
+
messageUuid: "uuid" in message ? message.uuid : undefined,
|
|
2087
|
+
}, "Claude query pump: raw SDK message");
|
|
2088
|
+
};
|
|
2089
|
+
const handlePumpedMessage = async (message) => {
|
|
2090
|
+
logRawMessage(message);
|
|
2091
|
+
consecutiveInterruptAbortRecoveries = 0;
|
|
2092
|
+
if (await this.handleMissingResumedConversation(message, activeQuery)) {
|
|
2093
|
+
return true;
|
|
2094
|
+
}
|
|
2095
|
+
this.routeSdkMessageFromPump(message);
|
|
2096
|
+
return false;
|
|
2097
|
+
};
|
|
2098
|
+
const drainActiveQuery = async () => {
|
|
2099
|
+
for await (const message of activeQuery) {
|
|
2100
|
+
if (await handlePumpedMessage(message)) {
|
|
2101
|
+
return true;
|
|
2102
|
+
}
|
|
2103
|
+
}
|
|
2104
|
+
return false;
|
|
2105
|
+
};
|
|
2058
2106
|
try {
|
|
2059
2107
|
while (!this.closed && this.query === activeQuery) {
|
|
2060
2108
|
try {
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
this.logger.trace({
|
|
2064
|
-
claudeSessionId: this.claudeSessionId,
|
|
2065
|
-
messageType: message.type,
|
|
2066
|
-
messageSubtype: "subtype" in message ? message.subtype : undefined,
|
|
2067
|
-
messageUuid: "uuid" in message ? message.uuid : undefined,
|
|
2068
|
-
}, "Claude query pump: raw SDK message");
|
|
2069
|
-
}
|
|
2070
|
-
consecutiveInterruptAbortRecoveries = 0;
|
|
2071
|
-
if (await this.handleMissingResumedConversation(message, activeQuery)) {
|
|
2072
|
-
return;
|
|
2073
|
-
}
|
|
2074
|
-
this.routeSdkMessageFromPump(message);
|
|
2109
|
+
if (await drainActiveQuery()) {
|
|
2110
|
+
return;
|
|
2075
2111
|
}
|
|
2076
2112
|
if (!this.closed && this.query === activeQuery) {
|
|
2077
2113
|
this.failActiveTurns("Claude stream ended before terminal result");
|
|
@@ -2101,7 +2137,16 @@ class ClaudeAgentSession {
|
|
|
2101
2137
|
}
|
|
2102
2138
|
}
|
|
2103
2139
|
}
|
|
2104
|
-
|
|
2140
|
+
isEchoedForegroundUserMessage(event) {
|
|
2141
|
+
if (event.type !== "timeline" ||
|
|
2142
|
+
event.item.type !== "user_message" ||
|
|
2143
|
+
!this.activeForegroundTurnId ||
|
|
2144
|
+
!this.lastForegroundPromptText) {
|
|
2145
|
+
return false;
|
|
2146
|
+
}
|
|
2147
|
+
return event.item.text.trim() === this.lastForegroundPromptText.trim();
|
|
2148
|
+
}
|
|
2149
|
+
shouldSuppressStaleResult(message) {
|
|
2105
2150
|
// Suppress stale results from interrupted requests. The cancel path already
|
|
2106
2151
|
// emitted the terminal event; this result is leftover from the killed API
|
|
2107
2152
|
// request. Consume the flag on ANY result so it doesn't linger.
|
|
@@ -2109,19 +2154,27 @@ class ClaudeAgentSession {
|
|
|
2109
2154
|
this.pendingInterruptAbort = false;
|
|
2110
2155
|
if (message.subtype !== "success") {
|
|
2111
2156
|
this.logger.debug("Suppressing stale non-success result from interrupted request");
|
|
2112
|
-
return;
|
|
2157
|
+
return true;
|
|
2113
2158
|
}
|
|
2114
2159
|
}
|
|
2115
2160
|
if (message.type === "result" && message.subtype !== "success" && this.isAbortError(message)) {
|
|
2116
2161
|
this.logger.debug("Suppressing abort result by content");
|
|
2117
|
-
return;
|
|
2162
|
+
return true;
|
|
2118
2163
|
}
|
|
2119
|
-
|
|
2120
|
-
|
|
2164
|
+
return false;
|
|
2165
|
+
}
|
|
2166
|
+
isAssistantishMessage(message) {
|
|
2167
|
+
return (message.type === "assistant" ||
|
|
2121
2168
|
message.type === "stream_event" ||
|
|
2122
2169
|
message.type === "tool_progress" ||
|
|
2123
|
-
(message.type === "system" && message.subtype === "task_notification");
|
|
2124
|
-
|
|
2170
|
+
(message.type === "system" && message.subtype === "task_notification"));
|
|
2171
|
+
}
|
|
2172
|
+
routeSdkMessageFromPump(message) {
|
|
2173
|
+
if (this.shouldSuppressStaleResult(message)) {
|
|
2174
|
+
return;
|
|
2175
|
+
}
|
|
2176
|
+
const isForeground = Boolean(this.activeForegroundTurnId);
|
|
2177
|
+
if (!isForeground && this.isAssistantishMessage(message)) {
|
|
2125
2178
|
this.startAutonomousTurn();
|
|
2126
2179
|
}
|
|
2127
2180
|
if (!isForeground && !this.autonomousTurn && message.type === "result") {
|
|
@@ -2152,17 +2205,7 @@ class ClaudeAgentSession {
|
|
|
2152
2205
|
provider: "claude",
|
|
2153
2206
|
}));
|
|
2154
2207
|
// User message dedup: suppress echoed user messages that match the foreground prompt
|
|
2155
|
-
const filteredMessageEvents = messageEvents.filter((event) =>
|
|
2156
|
-
if (event.type === "timeline" &&
|
|
2157
|
-
event.item.type === "user_message" &&
|
|
2158
|
-
this.activeForegroundTurnId &&
|
|
2159
|
-
this.lastForegroundPromptText) {
|
|
2160
|
-
if (event.item.text.trim() === this.lastForegroundPromptText.trim()) {
|
|
2161
|
-
return false;
|
|
2162
|
-
}
|
|
2163
|
-
}
|
|
2164
|
-
return true;
|
|
2165
|
-
});
|
|
2208
|
+
const filteredMessageEvents = messageEvents.filter((event) => !this.isEchoedForegroundUserMessage(event));
|
|
2166
2209
|
const events = [...filteredMessageEvents, ...assistantTimelineEvents];
|
|
2167
2210
|
if (events.length === 0) {
|
|
2168
2211
|
return;
|
|
@@ -2183,7 +2226,7 @@ class ClaudeAgentSession {
|
|
|
2183
2226
|
}
|
|
2184
2227
|
this.dispatchEvents(events);
|
|
2185
2228
|
}
|
|
2186
|
-
async handleMissingResumedConversation(message,
|
|
2229
|
+
async handleMissingResumedConversation(message, activeQuery) {
|
|
2187
2230
|
const staleResumeError = this.readMissingResumedConversationError(message);
|
|
2188
2231
|
if (!staleResumeError) {
|
|
2189
2232
|
return false;
|
|
@@ -2194,12 +2237,11 @@ class ClaudeAgentSession {
|
|
|
2194
2237
|
}, "Claude resumed session no longer exists; invalidating persisted session");
|
|
2195
2238
|
this.failActiveTurns(staleResumeError);
|
|
2196
2239
|
this.input?.end();
|
|
2197
|
-
await this.awaitWithTimeout(
|
|
2198
|
-
if (this.query ===
|
|
2240
|
+
await this.awaitWithTimeout(activeQuery.return?.(), "query pump return on missing resumed conversation");
|
|
2241
|
+
if (this.query === activeQuery) {
|
|
2199
2242
|
this.query = null;
|
|
2200
2243
|
this.input = null;
|
|
2201
2244
|
}
|
|
2202
|
-
this.claudeSessionId = null;
|
|
2203
2245
|
this.persistence = null;
|
|
2204
2246
|
this.persistedHistory = [];
|
|
2205
2247
|
this.historyPending = false;
|
|
@@ -2232,128 +2274,28 @@ class ClaudeAgentSession {
|
|
|
2232
2274
|
return this.sidechainTracker.handleMessage(message, parentToolUseId);
|
|
2233
2275
|
}
|
|
2234
2276
|
const events = [];
|
|
2235
|
-
const
|
|
2236
|
-
if (
|
|
2277
|
+
const sessionCapture = this.captureSessionIdFromMessage(message);
|
|
2278
|
+
if (sessionCapture.notice) {
|
|
2279
|
+
events.push({
|
|
2280
|
+
type: "timeline",
|
|
2281
|
+
provider: "claude",
|
|
2282
|
+
item: sessionCapture.notice,
|
|
2283
|
+
});
|
|
2284
|
+
}
|
|
2285
|
+
if (sessionCapture.threadStartedSessionId) {
|
|
2237
2286
|
events.push({
|
|
2238
2287
|
type: "thread_started",
|
|
2239
2288
|
provider: "claude",
|
|
2240
|
-
sessionId:
|
|
2289
|
+
sessionId: sessionCapture.threadStartedSessionId,
|
|
2241
2290
|
});
|
|
2242
2291
|
}
|
|
2243
2292
|
switch (message.type) {
|
|
2244
2293
|
case "system":
|
|
2245
|
-
|
|
2246
|
-
const threadSessionId = this.handleSystemMessage(message);
|
|
2247
|
-
if (threadSessionId) {
|
|
2248
|
-
events.push({
|
|
2249
|
-
type: "thread_started",
|
|
2250
|
-
provider: "claude",
|
|
2251
|
-
sessionId: threadSessionId,
|
|
2252
|
-
});
|
|
2253
|
-
}
|
|
2254
|
-
}
|
|
2255
|
-
else if (message.subtype === "status") {
|
|
2256
|
-
const status = message.status;
|
|
2257
|
-
if (status === "compacting") {
|
|
2258
|
-
this.compacting = true;
|
|
2259
|
-
events.push({
|
|
2260
|
-
type: "timeline",
|
|
2261
|
-
item: { type: "compaction", status: "loading" },
|
|
2262
|
-
provider: "claude",
|
|
2263
|
-
});
|
|
2264
|
-
}
|
|
2265
|
-
}
|
|
2266
|
-
else if (message.subtype === "compact_boundary") {
|
|
2267
|
-
const compactMetadata = readCompactionMetadata(message);
|
|
2268
|
-
events.push({
|
|
2269
|
-
type: "timeline",
|
|
2270
|
-
item: {
|
|
2271
|
-
type: "compaction",
|
|
2272
|
-
status: "completed",
|
|
2273
|
-
trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
|
|
2274
|
-
preTokens: compactMetadata?.preTokens,
|
|
2275
|
-
},
|
|
2276
|
-
provider: "claude",
|
|
2277
|
-
});
|
|
2278
|
-
}
|
|
2279
|
-
else if (message.subtype === "task_notification") {
|
|
2280
|
-
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
|
|
2281
|
-
if (taskNotificationItem) {
|
|
2282
|
-
events.push({
|
|
2283
|
-
type: "timeline",
|
|
2284
|
-
item: taskNotificationItem,
|
|
2285
|
-
provider: "claude",
|
|
2286
|
-
});
|
|
2287
|
-
}
|
|
2288
|
-
const usage = readUsageFromTaskNotification(message);
|
|
2289
|
-
if (typeof usage === "number") {
|
|
2290
|
-
this.lastContextWindowUsedTokens = usage;
|
|
2291
|
-
events.push(this.createUsageUpdatedEvent(usage));
|
|
2292
|
-
}
|
|
2293
|
-
}
|
|
2294
|
-
else if (message.subtype === "task_progress") {
|
|
2295
|
-
this.lastContextWindowUsedTokens =
|
|
2296
|
-
readContextWindowUsedTokensFromTaskProgress(message) ??
|
|
2297
|
-
this.lastContextWindowUsedTokens;
|
|
2298
|
-
if (typeof this.lastContextWindowUsedTokens === "number") {
|
|
2299
|
-
events.push(this.createUsageUpdatedEvent(this.lastContextWindowUsedTokens));
|
|
2300
|
-
}
|
|
2301
|
-
}
|
|
2294
|
+
this.appendSystemMessageEvents(message, events);
|
|
2302
2295
|
break;
|
|
2303
|
-
case "user":
|
|
2304
|
-
|
|
2305
|
-
break;
|
|
2306
|
-
}
|
|
2307
|
-
if (this.compacting) {
|
|
2308
|
-
this.compacting = false;
|
|
2309
|
-
break;
|
|
2310
|
-
}
|
|
2311
|
-
const messageId = typeof message.uuid === "string" && message.uuid.length > 0 ? message.uuid : undefined;
|
|
2312
|
-
this.rememberUserMessageId(messageId);
|
|
2313
|
-
const content = message.message?.content;
|
|
2314
|
-
const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
|
|
2315
|
-
content,
|
|
2316
|
-
messageId,
|
|
2317
|
-
});
|
|
2318
|
-
if (taskNotificationItem) {
|
|
2319
|
-
events.push({
|
|
2320
|
-
type: "timeline",
|
|
2321
|
-
item: taskNotificationItem,
|
|
2322
|
-
provider: "claude",
|
|
2323
|
-
});
|
|
2324
|
-
break;
|
|
2325
|
-
}
|
|
2326
|
-
if (typeof content === "string" && content.length > 0) {
|
|
2327
|
-
if (!isClaudeTranscriptNoiseText(content)) {
|
|
2328
|
-
events.push({
|
|
2329
|
-
type: "timeline",
|
|
2330
|
-
item: {
|
|
2331
|
-
type: "user_message",
|
|
2332
|
-
text: content,
|
|
2333
|
-
...(messageId ? { messageId } : {}),
|
|
2334
|
-
},
|
|
2335
|
-
provider: "claude",
|
|
2336
|
-
});
|
|
2337
|
-
}
|
|
2338
|
-
}
|
|
2339
|
-
else if (Array.isArray(content)) {
|
|
2340
|
-
const timelineItems = this.mapBlocksToTimeline(content, {
|
|
2341
|
-
textMessageType: "user_message",
|
|
2342
|
-
});
|
|
2343
|
-
for (const item of timelineItems) {
|
|
2344
|
-
if (item.type === "user_message" && messageId && !item.messageId) {
|
|
2345
|
-
events.push({
|
|
2346
|
-
type: "timeline",
|
|
2347
|
-
item: { ...item, messageId },
|
|
2348
|
-
provider: "claude",
|
|
2349
|
-
});
|
|
2350
|
-
continue;
|
|
2351
|
-
}
|
|
2352
|
-
events.push({ type: "timeline", item, provider: "claude" });
|
|
2353
|
-
}
|
|
2354
|
-
}
|
|
2296
|
+
case "user":
|
|
2297
|
+
this.appendUserMessageEvents(message, events);
|
|
2355
2298
|
break;
|
|
2356
|
-
}
|
|
2357
2299
|
case "assistant": {
|
|
2358
2300
|
const timelineItems = this.mapBlocksToTimeline(message.message.content, {
|
|
2359
2301
|
suppressAssistantText: options?.suppressAssistantText ?? false,
|
|
@@ -2364,85 +2306,211 @@ class ClaudeAgentSession {
|
|
|
2364
2306
|
}
|
|
2365
2307
|
break;
|
|
2366
2308
|
}
|
|
2367
|
-
case "stream_event":
|
|
2368
|
-
|
|
2369
|
-
if (usageUpdatedEvent) {
|
|
2370
|
-
events.push(usageUpdatedEvent);
|
|
2371
|
-
}
|
|
2372
|
-
const timelineItems = this.mapPartialEvent(message.event, {
|
|
2373
|
-
suppressAssistantText: options?.suppressAssistantText ?? false,
|
|
2374
|
-
suppressReasoning: options?.suppressReasoning ?? false,
|
|
2375
|
-
});
|
|
2376
|
-
for (const item of timelineItems) {
|
|
2377
|
-
events.push({ type: "timeline", item, provider: "claude" });
|
|
2378
|
-
}
|
|
2309
|
+
case "stream_event":
|
|
2310
|
+
this.appendStreamEventEvents(message, events, options);
|
|
2379
2311
|
break;
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
const usage = this.convertUsage(message, message.modelUsage);
|
|
2383
|
-
if (message.subtype === "success") {
|
|
2384
|
-
events.push({ type: "turn_completed", provider: "claude", usage });
|
|
2385
|
-
}
|
|
2386
|
-
else {
|
|
2387
|
-
const errorMessage = "errors" in message && Array.isArray(message.errors) && message.errors.length > 0
|
|
2388
|
-
? message.errors.join("\n")
|
|
2389
|
-
: "Claude run failed";
|
|
2390
|
-
events.push(this.buildTurnFailedEvent(errorMessage));
|
|
2391
|
-
}
|
|
2312
|
+
case "result":
|
|
2313
|
+
this.appendResultEvents(message, events);
|
|
2392
2314
|
break;
|
|
2393
|
-
}
|
|
2394
2315
|
default:
|
|
2395
2316
|
break;
|
|
2396
2317
|
}
|
|
2397
2318
|
return events;
|
|
2398
2319
|
}
|
|
2320
|
+
appendSystemMessageEvents(message, events) {
|
|
2321
|
+
if (message.subtype === "init") {
|
|
2322
|
+
const sessionUpdate = this.handleSystemMessage(message);
|
|
2323
|
+
if (sessionUpdate.notice) {
|
|
2324
|
+
events.push({
|
|
2325
|
+
type: "timeline",
|
|
2326
|
+
provider: "claude",
|
|
2327
|
+
item: sessionUpdate.notice,
|
|
2328
|
+
});
|
|
2329
|
+
}
|
|
2330
|
+
if (sessionUpdate.threadStartedSessionId) {
|
|
2331
|
+
events.push({
|
|
2332
|
+
type: "thread_started",
|
|
2333
|
+
provider: "claude",
|
|
2334
|
+
sessionId: sessionUpdate.threadStartedSessionId,
|
|
2335
|
+
});
|
|
2336
|
+
}
|
|
2337
|
+
return;
|
|
2338
|
+
}
|
|
2339
|
+
if (message.subtype === "status") {
|
|
2340
|
+
const status = message.status;
|
|
2341
|
+
if (status === "compacting") {
|
|
2342
|
+
this.compacting = true;
|
|
2343
|
+
events.push({
|
|
2344
|
+
type: "timeline",
|
|
2345
|
+
item: { type: "compaction", status: "loading" },
|
|
2346
|
+
provider: "claude",
|
|
2347
|
+
});
|
|
2348
|
+
}
|
|
2349
|
+
return;
|
|
2350
|
+
}
|
|
2351
|
+
if (message.subtype === "compact_boundary") {
|
|
2352
|
+
const compactMetadata = readCompactionMetadata(message);
|
|
2353
|
+
events.push({
|
|
2354
|
+
type: "timeline",
|
|
2355
|
+
item: {
|
|
2356
|
+
type: "compaction",
|
|
2357
|
+
status: "completed",
|
|
2358
|
+
trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
|
|
2359
|
+
preTokens: compactMetadata?.preTokens,
|
|
2360
|
+
},
|
|
2361
|
+
provider: "claude",
|
|
2362
|
+
});
|
|
2363
|
+
return;
|
|
2364
|
+
}
|
|
2365
|
+
if (message.subtype === "task_notification") {
|
|
2366
|
+
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
|
|
2367
|
+
if (taskNotificationItem) {
|
|
2368
|
+
events.push({
|
|
2369
|
+
type: "timeline",
|
|
2370
|
+
item: taskNotificationItem,
|
|
2371
|
+
provider: "claude",
|
|
2372
|
+
});
|
|
2373
|
+
}
|
|
2374
|
+
const usage = readUsageFromTaskNotification(message);
|
|
2375
|
+
if (typeof usage === "number") {
|
|
2376
|
+
this.lastContextWindowUsedTokens = usage;
|
|
2377
|
+
events.push(this.createUsageUpdatedEvent(usage));
|
|
2378
|
+
}
|
|
2379
|
+
return;
|
|
2380
|
+
}
|
|
2381
|
+
if (message.subtype === "task_progress") {
|
|
2382
|
+
this.lastContextWindowUsedTokens =
|
|
2383
|
+
readContextWindowUsedTokensFromTaskProgress(message) ?? this.lastContextWindowUsedTokens;
|
|
2384
|
+
if (typeof this.lastContextWindowUsedTokens === "number") {
|
|
2385
|
+
events.push(this.createUsageUpdatedEvent(this.lastContextWindowUsedTokens));
|
|
2386
|
+
}
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
2389
|
+
appendUserMessageEvents(message, events) {
|
|
2390
|
+
if (isSyntheticUserEntry(message)) {
|
|
2391
|
+
return;
|
|
2392
|
+
}
|
|
2393
|
+
if (this.compacting) {
|
|
2394
|
+
this.compacting = false;
|
|
2395
|
+
return;
|
|
2396
|
+
}
|
|
2397
|
+
const messageId = typeof message.uuid === "string" && message.uuid.length > 0 ? message.uuid : undefined;
|
|
2398
|
+
this.rememberUserMessageId(messageId);
|
|
2399
|
+
const content = message.message?.content;
|
|
2400
|
+
const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
|
|
2401
|
+
content,
|
|
2402
|
+
messageId,
|
|
2403
|
+
});
|
|
2404
|
+
if (taskNotificationItem) {
|
|
2405
|
+
events.push({
|
|
2406
|
+
type: "timeline",
|
|
2407
|
+
item: taskNotificationItem,
|
|
2408
|
+
provider: "claude",
|
|
2409
|
+
});
|
|
2410
|
+
return;
|
|
2411
|
+
}
|
|
2412
|
+
if (typeof content === "string" && content.length > 0) {
|
|
2413
|
+
if (!isClaudeTranscriptNoiseText(content)) {
|
|
2414
|
+
events.push({
|
|
2415
|
+
type: "timeline",
|
|
2416
|
+
item: {
|
|
2417
|
+
type: "user_message",
|
|
2418
|
+
text: content,
|
|
2419
|
+
...(messageId ? { messageId } : {}),
|
|
2420
|
+
},
|
|
2421
|
+
provider: "claude",
|
|
2422
|
+
});
|
|
2423
|
+
}
|
|
2424
|
+
return;
|
|
2425
|
+
}
|
|
2426
|
+
if (Array.isArray(content)) {
|
|
2427
|
+
this.appendUserContentArrayEvents(content, messageId, events);
|
|
2428
|
+
}
|
|
2429
|
+
}
|
|
2430
|
+
appendUserContentArrayEvents(content, messageId, events) {
|
|
2431
|
+
const timelineItems = this.mapBlocksToTimeline(content, {
|
|
2432
|
+
textMessageType: "user_message",
|
|
2433
|
+
});
|
|
2434
|
+
for (const item of timelineItems) {
|
|
2435
|
+
if (item.type === "user_message" && messageId && !item.messageId) {
|
|
2436
|
+
events.push({
|
|
2437
|
+
type: "timeline",
|
|
2438
|
+
item: { ...item, messageId },
|
|
2439
|
+
provider: "claude",
|
|
2440
|
+
});
|
|
2441
|
+
continue;
|
|
2442
|
+
}
|
|
2443
|
+
events.push({ type: "timeline", item, provider: "claude" });
|
|
2444
|
+
}
|
|
2445
|
+
}
|
|
2446
|
+
appendStreamEventEvents(message, events, options) {
|
|
2447
|
+
const usageUpdatedEvent = this.trackStreamEventUsage(message.event);
|
|
2448
|
+
if (usageUpdatedEvent) {
|
|
2449
|
+
events.push(usageUpdatedEvent);
|
|
2450
|
+
}
|
|
2451
|
+
const timelineItems = this.mapPartialEvent(message.event, {
|
|
2452
|
+
suppressAssistantText: options?.suppressAssistantText ?? false,
|
|
2453
|
+
suppressReasoning: options?.suppressReasoning ?? false,
|
|
2454
|
+
});
|
|
2455
|
+
for (const item of timelineItems) {
|
|
2456
|
+
events.push({ type: "timeline", item, provider: "claude" });
|
|
2457
|
+
}
|
|
2458
|
+
}
|
|
2459
|
+
appendResultEvents(message, events) {
|
|
2460
|
+
const usage = this.convertUsage(message, message.modelUsage);
|
|
2461
|
+
if (message.subtype === "success") {
|
|
2462
|
+
events.push({ type: "turn_completed", provider: "claude", usage });
|
|
2463
|
+
return;
|
|
2464
|
+
}
|
|
2465
|
+
const errorMessage = "errors" in message && Array.isArray(message.errors) && message.errors.length > 0
|
|
2466
|
+
? message.errors.join("\n")
|
|
2467
|
+
: "Claude run failed";
|
|
2468
|
+
events.push(this.buildTurnFailedEvent(errorMessage));
|
|
2469
|
+
}
|
|
2470
|
+
createClaudeSessionChangedNotice(oldSessionId, newSessionId) {
|
|
2471
|
+
return {
|
|
2472
|
+
type: "assistant_message",
|
|
2473
|
+
text: `Claude switched to a new session: ${oldSessionId} -> ${newSessionId}`,
|
|
2474
|
+
};
|
|
2475
|
+
}
|
|
2399
2476
|
captureSessionIdFromMessage(message) {
|
|
2400
2477
|
const msg = message;
|
|
2401
|
-
const
|
|
2402
|
-
? msg.session_id
|
|
2403
|
-
: typeof msg.sessionId === "string"
|
|
2404
|
-
? msg.sessionId
|
|
2405
|
-
: typeof msg.session?.id === "string"
|
|
2406
|
-
? msg.session.id
|
|
2407
|
-
: "";
|
|
2408
|
-
const sessionId = sessionIdRaw.trim();
|
|
2478
|
+
const sessionId = extractSessionIdRaw(msg).trim();
|
|
2409
2479
|
if (!sessionId) {
|
|
2410
|
-
return null;
|
|
2480
|
+
return { threadStartedSessionId: null, notice: null };
|
|
2411
2481
|
}
|
|
2412
2482
|
if (this.claudeSessionId === null) {
|
|
2413
2483
|
this.claudeSessionId = sessionId;
|
|
2414
2484
|
this.persistence = null;
|
|
2415
|
-
return sessionId;
|
|
2485
|
+
return { threadStartedSessionId: sessionId, notice: null };
|
|
2416
2486
|
}
|
|
2417
2487
|
if (this.claudeSessionId === sessionId) {
|
|
2418
|
-
return null;
|
|
2488
|
+
return { threadStartedSessionId: null, notice: null };
|
|
2419
2489
|
}
|
|
2490
|
+
const oldSessionId = this.claudeSessionId;
|
|
2420
2491
|
// Session ID changed mid-stream (e.g. a hook caused Claude to restart
|
|
2421
2492
|
// with a new session). Accept the new ID and continue — the turn should
|
|
2422
2493
|
// not be failed just because the underlying subprocess cycled.
|
|
2423
2494
|
this.logger.warn({ existingSessionId: this.claudeSessionId, newSessionId: sessionId }, "Claude session ID changed in message; accepting new session");
|
|
2424
2495
|
this.claudeSessionId = sessionId;
|
|
2425
2496
|
this.persistence = null;
|
|
2426
|
-
return
|
|
2497
|
+
return {
|
|
2498
|
+
threadStartedSessionId: sessionId,
|
|
2499
|
+
notice: this.createClaudeSessionChangedNotice(oldSessionId, sessionId),
|
|
2500
|
+
};
|
|
2427
2501
|
}
|
|
2428
2502
|
handleSystemMessage(message) {
|
|
2429
2503
|
if (message.subtype !== "init") {
|
|
2430
|
-
return null;
|
|
2504
|
+
return { threadStartedSessionId: null, notice: null };
|
|
2431
2505
|
}
|
|
2432
2506
|
const msg = message;
|
|
2433
|
-
const
|
|
2434
|
-
? msg.session_id
|
|
2435
|
-
: typeof msg.sessionId === "string"
|
|
2436
|
-
? msg.sessionId
|
|
2437
|
-
: typeof msg.session?.id === "string"
|
|
2438
|
-
? msg.session.id
|
|
2439
|
-
: "";
|
|
2440
|
-
const newSessionId = newSessionIdRaw.trim();
|
|
2507
|
+
const newSessionId = extractSessionIdRaw(msg).trim();
|
|
2441
2508
|
if (!newSessionId) {
|
|
2442
|
-
return null;
|
|
2509
|
+
return { threadStartedSessionId: null, notice: null };
|
|
2443
2510
|
}
|
|
2444
2511
|
const existingSessionId = this.claudeSessionId;
|
|
2445
2512
|
let threadStartedSessionId = null;
|
|
2513
|
+
let notice = null;
|
|
2446
2514
|
if (existingSessionId === null) {
|
|
2447
2515
|
this.claudeSessionId = newSessionId;
|
|
2448
2516
|
threadStartedSessionId = newSessionId;
|
|
@@ -2457,6 +2525,7 @@ class ClaudeAgentSession {
|
|
|
2457
2525
|
this.logger.warn({ existingSessionId, newSessionId }, "Claude session ID changed in init message; accepting new session");
|
|
2458
2526
|
this.claudeSessionId = newSessionId;
|
|
2459
2527
|
threadStartedSessionId = newSessionId;
|
|
2528
|
+
notice = this.createClaudeSessionChangedNotice(existingSessionId, newSessionId);
|
|
2460
2529
|
}
|
|
2461
2530
|
this.availableModes = DEFAULT_MODES;
|
|
2462
2531
|
this.currentMode = message.permissionMode;
|
|
@@ -2476,7 +2545,7 @@ class ClaudeAgentSession {
|
|
|
2476
2545
|
this.lastRuntimeModel = message.model;
|
|
2477
2546
|
this.cachedRuntimeInfo = null;
|
|
2478
2547
|
}
|
|
2479
|
-
return threadStartedSessionId;
|
|
2548
|
+
return { threadStartedSessionId, notice };
|
|
2480
2549
|
}
|
|
2481
2550
|
readMissingResumedConversationError(message) {
|
|
2482
2551
|
if (message.type !== "result" || message.subtype !== "error_during_execution") {
|
|
@@ -2651,7 +2720,7 @@ class ClaudeAgentSession {
|
|
|
2651
2720
|
}
|
|
2652
2721
|
this.ingestPersistedHistory(fs.readFileSync(historyPath, "utf8"));
|
|
2653
2722
|
}
|
|
2654
|
-
catch
|
|
2723
|
+
catch {
|
|
2655
2724
|
// ignore history load failures
|
|
2656
2725
|
}
|
|
2657
2726
|
}
|
|
@@ -2734,50 +2803,16 @@ class ClaudeAgentSession {
|
|
|
2734
2803
|
// User SDK entries can arrive as multiple text blocks, but Paseo treats them as one message.
|
|
2735
2804
|
const userTextParts = [];
|
|
2736
2805
|
for (const block of content) {
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
case "text_delta":
|
|
2740
|
-
if (block.text &&
|
|
2741
|
-
block.text !== INTERRUPT_TOOL_USE_PLACEHOLDER &&
|
|
2742
|
-
!isClaudeTranscriptNoiseText(block.text)) {
|
|
2743
|
-
if (textMessageType === "user_message") {
|
|
2744
|
-
const trimmed = block.text.trim();
|
|
2745
|
-
if (trimmed) {
|
|
2746
|
-
userTextParts.push(trimmed);
|
|
2747
|
-
}
|
|
2748
|
-
}
|
|
2749
|
-
else if (!suppressText) {
|
|
2750
|
-
items.push({ type: "assistant_message", text: block.text });
|
|
2751
|
-
}
|
|
2752
|
-
}
|
|
2753
|
-
break;
|
|
2754
|
-
case "thinking":
|
|
2755
|
-
case "thinking_delta":
|
|
2756
|
-
if (block.thinking) {
|
|
2757
|
-
if (!suppressReasoning) {
|
|
2758
|
-
items.push({ type: "reasoning", text: block.thinking });
|
|
2759
|
-
}
|
|
2760
|
-
}
|
|
2761
|
-
break;
|
|
2762
|
-
case "tool_use":
|
|
2763
|
-
case "server_tool_use":
|
|
2764
|
-
case "mcp_tool_use": {
|
|
2765
|
-
this.handleToolUseStart(block, items);
|
|
2766
|
-
break;
|
|
2767
|
-
}
|
|
2768
|
-
case "tool_result":
|
|
2769
|
-
case "mcp_tool_result":
|
|
2770
|
-
case "web_fetch_tool_result":
|
|
2771
|
-
case "web_search_tool_result":
|
|
2772
|
-
case "code_execution_tool_result":
|
|
2773
|
-
case "bash_code_execution_tool_result":
|
|
2774
|
-
case "text_editor_code_execution_tool_result": {
|
|
2775
|
-
this.handleToolResult(block, items);
|
|
2776
|
-
break;
|
|
2777
|
-
}
|
|
2778
|
-
default:
|
|
2779
|
-
break;
|
|
2806
|
+
if (!isClaudeContentChunk(block)) {
|
|
2807
|
+
continue;
|
|
2780
2808
|
}
|
|
2809
|
+
this.mapBlockToTimeline(block, {
|
|
2810
|
+
items,
|
|
2811
|
+
userTextParts,
|
|
2812
|
+
textMessageType,
|
|
2813
|
+
suppressText,
|
|
2814
|
+
suppressReasoning,
|
|
2815
|
+
});
|
|
2781
2816
|
}
|
|
2782
2817
|
if (textMessageType === "user_message" && userTextParts.length > 0) {
|
|
2783
2818
|
items.unshift({
|
|
@@ -2787,6 +2822,53 @@ class ClaudeAgentSession {
|
|
|
2787
2822
|
}
|
|
2788
2823
|
return items;
|
|
2789
2824
|
}
|
|
2825
|
+
appendTextBlockToTimeline(block, context) {
|
|
2826
|
+
const { items, userTextParts, textMessageType, suppressText } = context;
|
|
2827
|
+
const text = typeof block.text === "string" ? block.text : "";
|
|
2828
|
+
if (!text || text === INTERRUPT_TOOL_USE_PLACEHOLDER || isClaudeTranscriptNoiseText(text)) {
|
|
2829
|
+
return;
|
|
2830
|
+
}
|
|
2831
|
+
if (textMessageType === "user_message") {
|
|
2832
|
+
const trimmed = text.trim();
|
|
2833
|
+
if (trimmed) {
|
|
2834
|
+
userTextParts.push(trimmed);
|
|
2835
|
+
}
|
|
2836
|
+
return;
|
|
2837
|
+
}
|
|
2838
|
+
if (!suppressText) {
|
|
2839
|
+
items.push({ type: "assistant_message", text });
|
|
2840
|
+
}
|
|
2841
|
+
}
|
|
2842
|
+
mapBlockToTimeline(block, context) {
|
|
2843
|
+
switch (block.type) {
|
|
2844
|
+
case "text":
|
|
2845
|
+
case "text_delta":
|
|
2846
|
+
this.appendTextBlockToTimeline(block, context);
|
|
2847
|
+
break;
|
|
2848
|
+
case "thinking":
|
|
2849
|
+
case "thinking_delta":
|
|
2850
|
+
if (typeof block.thinking === "string" && block.thinking && !context.suppressReasoning) {
|
|
2851
|
+
context.items.push({ type: "reasoning", text: block.thinking });
|
|
2852
|
+
}
|
|
2853
|
+
break;
|
|
2854
|
+
case "tool_use":
|
|
2855
|
+
case "server_tool_use":
|
|
2856
|
+
case "mcp_tool_use":
|
|
2857
|
+
this.handleToolUseStart(block, context.items);
|
|
2858
|
+
break;
|
|
2859
|
+
case "tool_result":
|
|
2860
|
+
case "mcp_tool_result":
|
|
2861
|
+
case "web_fetch_tool_result":
|
|
2862
|
+
case "web_search_tool_result":
|
|
2863
|
+
case "code_execution_tool_result":
|
|
2864
|
+
case "bash_code_execution_tool_result":
|
|
2865
|
+
case "text_editor_code_execution_tool_result":
|
|
2866
|
+
this.handleToolResult(block, context.items);
|
|
2867
|
+
break;
|
|
2868
|
+
default:
|
|
2869
|
+
break;
|
|
2870
|
+
}
|
|
2871
|
+
}
|
|
2790
2872
|
handleToolUseStart(block, items) {
|
|
2791
2873
|
const entry = this.upsertToolUseEntry(block);
|
|
2792
2874
|
if (!entry) {
|
|
@@ -2806,7 +2888,8 @@ class ClaudeAgentSession {
|
|
|
2806
2888
|
}
|
|
2807
2889
|
handleToolResult(block, items) {
|
|
2808
2890
|
const entry = typeof block.tool_use_id === "string" ? this.toolUseCache.get(block.tool_use_id) : undefined;
|
|
2809
|
-
const
|
|
2891
|
+
const blockToolName = typeof block.tool_name === "string" ? block.tool_name : undefined;
|
|
2892
|
+
const toolName = entry?.name ?? blockToolName ?? "tool";
|
|
2810
2893
|
const callId = typeof block.tool_use_id === "string" && block.tool_use_id.length > 0
|
|
2811
2894
|
? block.tool_use_id
|
|
2812
2895
|
: (entry?.id ?? null);
|
|
@@ -2838,8 +2921,10 @@ class ClaudeAgentSession {
|
|
|
2838
2921
|
if (block.is_error) {
|
|
2839
2922
|
return undefined;
|
|
2840
2923
|
}
|
|
2841
|
-
const
|
|
2842
|
-
const
|
|
2924
|
+
const blockServer = typeof block.server === "string" ? block.server : undefined;
|
|
2925
|
+
const blockToolName = typeof block.tool_name === "string" ? block.tool_name : undefined;
|
|
2926
|
+
const server = entry?.server ?? blockServer ?? "tool";
|
|
2927
|
+
const tool = entry?.name ?? blockToolName ?? "tool";
|
|
2843
2928
|
const content = coerceToolResultContentToString(block.content);
|
|
2844
2929
|
const input = entry?.input;
|
|
2845
2930
|
// Build structured result based on tool type
|
|
@@ -2865,17 +2950,39 @@ class ClaudeAgentSession {
|
|
|
2865
2950
|
}
|
|
2866
2951
|
return Object.keys(result).length > 0 ? result : undefined;
|
|
2867
2952
|
}
|
|
2868
|
-
|
|
2869
|
-
const normalizedServer = server.toLowerCase();
|
|
2870
|
-
const normalizedTool = tool.toLowerCase();
|
|
2871
|
-
// Command execution tools
|
|
2953
|
+
isCommandExecutionTool(normalizedServer, normalizedTool, input) {
|
|
2872
2954
|
if (normalizedServer.includes("bash") ||
|
|
2873
2955
|
normalizedServer.includes("shell") ||
|
|
2874
|
-
normalizedServer.includes("command")
|
|
2875
|
-
|
|
2956
|
+
normalizedServer.includes("command")) {
|
|
2957
|
+
return true;
|
|
2958
|
+
}
|
|
2959
|
+
if (normalizedTool.includes("bash") ||
|
|
2876
2960
|
normalizedTool.includes("shell") ||
|
|
2877
|
-
normalizedTool.includes("command")
|
|
2878
|
-
|
|
2961
|
+
normalizedTool.includes("command")) {
|
|
2962
|
+
return true;
|
|
2963
|
+
}
|
|
2964
|
+
return Boolean(input && (typeof input.command === "string" || Array.isArray(input.command)));
|
|
2965
|
+
}
|
|
2966
|
+
static isFileWriteTool(normalizedTool) {
|
|
2967
|
+
return (normalizedTool.includes("write") ||
|
|
2968
|
+
normalizedTool === "write_file" ||
|
|
2969
|
+
normalizedTool === "create_file");
|
|
2970
|
+
}
|
|
2971
|
+
static isFileEditTool(normalizedTool) {
|
|
2972
|
+
return (normalizedTool.includes("edit") ||
|
|
2973
|
+
normalizedTool.includes("patch") ||
|
|
2974
|
+
normalizedTool === "apply_patch" ||
|
|
2975
|
+
normalizedTool === "apply_diff");
|
|
2976
|
+
}
|
|
2977
|
+
static isFileReadTool(normalizedTool) {
|
|
2978
|
+
return (normalizedTool.includes("read") ||
|
|
2979
|
+
normalizedTool === "read_file" ||
|
|
2980
|
+
normalizedTool === "view_file");
|
|
2981
|
+
}
|
|
2982
|
+
buildStructuredToolResult(server, tool, output, input) {
|
|
2983
|
+
const normalizedServer = server.toLowerCase();
|
|
2984
|
+
const normalizedTool = tool.toLowerCase();
|
|
2985
|
+
if (this.isCommandExecutionTool(normalizedServer, normalizedTool, input)) {
|
|
2879
2986
|
const command = this.extractCommandText(input ?? {}) ?? "command";
|
|
2880
2987
|
return {
|
|
2881
2988
|
type: "command",
|
|
@@ -2884,64 +2991,43 @@ class ClaudeAgentSession {
|
|
|
2884
2991
|
cwd: typeof input?.cwd === "string" ? input.cwd : undefined,
|
|
2885
2992
|
};
|
|
2886
2993
|
}
|
|
2887
|
-
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
newContent: typeof input.content === "string" ? input.content : output,
|
|
2897
|
-
};
|
|
2898
|
-
}
|
|
2994
|
+
if (ClaudeAgentSession.isFileWriteTool(normalizedTool) &&
|
|
2995
|
+
input &&
|
|
2996
|
+
typeof input.file_path === "string") {
|
|
2997
|
+
return {
|
|
2998
|
+
type: "file_write",
|
|
2999
|
+
filePath: input.file_path,
|
|
3000
|
+
oldContent: "",
|
|
3001
|
+
newContent: typeof input.content === "string" ? input.content : output,
|
|
3002
|
+
};
|
|
2899
3003
|
}
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
: typeof input.new_string === "string"
|
|
2915
|
-
? input.new_string
|
|
2916
|
-
: undefined;
|
|
2917
|
-
return {
|
|
2918
|
-
type: "file_edit",
|
|
2919
|
-
filePath: input.file_path,
|
|
2920
|
-
diff: typeof input.patch === "string"
|
|
2921
|
-
? input.patch
|
|
2922
|
-
: typeof input.diff === "string"
|
|
2923
|
-
? input.diff
|
|
2924
|
-
: undefined,
|
|
2925
|
-
oldContent,
|
|
2926
|
-
newContent,
|
|
2927
|
-
};
|
|
2928
|
-
}
|
|
3004
|
+
if (ClaudeAgentSession.isFileEditTool(normalizedTool) &&
|
|
3005
|
+
input &&
|
|
3006
|
+
typeof input.file_path === "string") {
|
|
3007
|
+
// Support both old_str/new_str and old_string/new_string parameter names
|
|
3008
|
+
const oldContent = firstStringField(input, "old_str", "old_string");
|
|
3009
|
+
const newContent = firstStringField(input, "new_str", "new_string");
|
|
3010
|
+
const diff = firstStringField(input, "patch", "diff");
|
|
3011
|
+
return {
|
|
3012
|
+
type: "file_edit",
|
|
3013
|
+
filePath: input.file_path,
|
|
3014
|
+
diff,
|
|
3015
|
+
oldContent,
|
|
3016
|
+
newContent,
|
|
3017
|
+
};
|
|
2929
3018
|
}
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
content: output,
|
|
2939
|
-
};
|
|
2940
|
-
}
|
|
3019
|
+
if (ClaudeAgentSession.isFileReadTool(normalizedTool) &&
|
|
3020
|
+
input &&
|
|
3021
|
+
typeof input.file_path === "string") {
|
|
3022
|
+
return {
|
|
3023
|
+
type: "file_read",
|
|
3024
|
+
filePath: input.file_path,
|
|
3025
|
+
content: output,
|
|
3026
|
+
};
|
|
2941
3027
|
}
|
|
2942
3028
|
return undefined;
|
|
2943
3029
|
}
|
|
2944
|
-
|
|
3030
|
+
updatePartialEventToolState(event) {
|
|
2945
3031
|
if (event.type === "content_block_start") {
|
|
2946
3032
|
const block = isClaudeContentChunk(event.content_block) ? event.content_block : null;
|
|
2947
3033
|
if (block?.type === "tool_use" &&
|
|
@@ -2950,22 +3036,30 @@ class ClaudeAgentSession {
|
|
|
2950
3036
|
this.toolUseIndexToId.set(event.index, block.id);
|
|
2951
3037
|
this.toolUseInputBuffers.delete(block.id);
|
|
2952
3038
|
}
|
|
3039
|
+
return false;
|
|
2953
3040
|
}
|
|
2954
|
-
|
|
3041
|
+
if (event.type === "content_block_delta") {
|
|
2955
3042
|
const delta = isClaudeContentChunk(event.delta) ? event.delta : null;
|
|
2956
3043
|
if (delta?.type === "input_json_delta") {
|
|
2957
3044
|
const partialJson = typeof delta.partial_json === "string" ? delta.partial_json : undefined;
|
|
2958
3045
|
this.handleToolInputDelta(event.index, partialJson);
|
|
2959
|
-
return
|
|
3046
|
+
return true;
|
|
2960
3047
|
}
|
|
3048
|
+
return false;
|
|
2961
3049
|
}
|
|
2962
|
-
|
|
3050
|
+
if (event.type === "content_block_stop" && typeof event.index === "number") {
|
|
2963
3051
|
const toolId = this.toolUseIndexToId.get(event.index);
|
|
2964
3052
|
if (toolId) {
|
|
2965
3053
|
this.toolUseIndexToId.delete(event.index);
|
|
2966
3054
|
this.toolUseInputBuffers.delete(toolId);
|
|
2967
3055
|
}
|
|
2968
3056
|
}
|
|
3057
|
+
return false;
|
|
3058
|
+
}
|
|
3059
|
+
mapPartialEvent(event, options) {
|
|
3060
|
+
if (this.updatePartialEventToolState(event)) {
|
|
3061
|
+
return [];
|
|
3062
|
+
}
|
|
2969
3063
|
switch (event.type) {
|
|
2970
3064
|
case "content_block_start":
|
|
2971
3065
|
return isClaudeContentChunk(event.content_block)
|
|
@@ -2990,18 +3084,7 @@ class ClaudeAgentSession {
|
|
|
2990
3084
|
if (!id) {
|
|
2991
3085
|
return null;
|
|
2992
3086
|
}
|
|
2993
|
-
const existing = this.toolUseCache.get(id) ??
|
|
2994
|
-
{
|
|
2995
|
-
id,
|
|
2996
|
-
name: typeof block.name === "string" && block.name.length > 0 ? block.name : "tool",
|
|
2997
|
-
server: typeof block.server === "string" && block.server.length > 0
|
|
2998
|
-
? block.server
|
|
2999
|
-
: typeof block.name === "string" && block.name.length > 0
|
|
3000
|
-
? block.name
|
|
3001
|
-
: "tool",
|
|
3002
|
-
classification: "generic",
|
|
3003
|
-
started: false,
|
|
3004
|
-
};
|
|
3087
|
+
const existing = this.toolUseCache.get(id) ?? createDefaultToolUseCacheEntry(id, block);
|
|
3005
3088
|
if (typeof block.name === "string" && block.name.length > 0) {
|
|
3006
3089
|
existing.name = block.name;
|
|
3007
3090
|
}
|
|
@@ -3225,37 +3308,47 @@ function normalizeHistoryBlocks(content) {
|
|
|
3225
3308
|
}
|
|
3226
3309
|
return null;
|
|
3227
3310
|
}
|
|
3228
|
-
|
|
3311
|
+
function convertClaudeHistoryEntryPreamble(entry) {
|
|
3229
3312
|
if (entry.type === "system" && entry.subtype === "compact_boundary") {
|
|
3230
3313
|
const compactMetadata = readCompactionMetadata(entry);
|
|
3231
|
-
return
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3314
|
+
return {
|
|
3315
|
+
shortCircuit: [
|
|
3316
|
+
{
|
|
3317
|
+
type: "compaction",
|
|
3318
|
+
status: "completed",
|
|
3319
|
+
trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
|
|
3320
|
+
preTokens: compactMetadata?.preTokens,
|
|
3321
|
+
},
|
|
3322
|
+
],
|
|
3323
|
+
};
|
|
3239
3324
|
}
|
|
3240
3325
|
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(entry);
|
|
3241
3326
|
if (taskNotificationItem) {
|
|
3242
|
-
return [taskNotificationItem];
|
|
3327
|
+
return { shortCircuit: [taskNotificationItem] };
|
|
3243
3328
|
}
|
|
3244
3329
|
if (entry.isCompactSummary) {
|
|
3245
|
-
return [];
|
|
3330
|
+
return { shortCircuit: [] };
|
|
3246
3331
|
}
|
|
3247
3332
|
if (entry.type === "user" && isSyntheticUserEntry(entry)) {
|
|
3248
|
-
return [];
|
|
3333
|
+
return { shortCircuit: [] };
|
|
3249
3334
|
}
|
|
3250
3335
|
const message = entry?.message;
|
|
3251
3336
|
if (!message || !("content" in message)) {
|
|
3252
|
-
return [];
|
|
3337
|
+
return { shortCircuit: [] };
|
|
3253
3338
|
}
|
|
3254
3339
|
const content = message.content;
|
|
3255
3340
|
if ((entry.type === "user" || entry.type === "assistant") &&
|
|
3256
3341
|
isClaudeTranscriptNoiseContent(content)) {
|
|
3257
|
-
return [];
|
|
3342
|
+
return { shortCircuit: [] };
|
|
3343
|
+
}
|
|
3344
|
+
return { proceed: { content } };
|
|
3345
|
+
}
|
|
3346
|
+
export function convertClaudeHistoryEntry(entry, mapBlocks) {
|
|
3347
|
+
const preamble = convertClaudeHistoryEntryPreamble(entry);
|
|
3348
|
+
if ("shortCircuit" in preamble) {
|
|
3349
|
+
return preamble.shortCircuit;
|
|
3258
3350
|
}
|
|
3351
|
+
const { content } = preamble.proceed;
|
|
3259
3352
|
const normalizedBlocks = normalizeHistoryBlocks(content);
|
|
3260
3353
|
const contentValue = typeof content === "string" ? content : normalizedBlocks;
|
|
3261
3354
|
const hasToolBlock = normalizedBlocks?.some((block) => hasToolLikeBlock(block)) ?? false;
|
|
@@ -3263,12 +3356,12 @@ export function convertClaudeHistoryEntry(entry, mapBlocks) {
|
|
|
3263
3356
|
? entry.uuid
|
|
3264
3357
|
: null;
|
|
3265
3358
|
if (entry.type === "user") {
|
|
3266
|
-
const
|
|
3359
|
+
const userTaskNotificationItem = mapTaskNotificationUserContentToToolCall({
|
|
3267
3360
|
content,
|
|
3268
3361
|
messageId: userMessageId,
|
|
3269
3362
|
});
|
|
3270
|
-
if (
|
|
3271
|
-
return [
|
|
3363
|
+
if (userTaskNotificationItem) {
|
|
3364
|
+
return [userTaskNotificationItem];
|
|
3272
3365
|
}
|
|
3273
3366
|
}
|
|
3274
3367
|
const timeline = [];
|
|
@@ -3357,41 +3450,68 @@ async function collectRecentClaudeSessions(root, limit) {
|
|
|
3357
3450
|
catch {
|
|
3358
3451
|
return [];
|
|
3359
3452
|
}
|
|
3360
|
-
const
|
|
3361
|
-
for (const dirName of projectDirs) {
|
|
3453
|
+
const projectFileLists = await Promise.all(projectDirs.map(async (dirName) => {
|
|
3362
3454
|
const projectPath = path.join(root, dirName);
|
|
3363
|
-
let stats;
|
|
3364
3455
|
try {
|
|
3365
|
-
stats = await fsPromises.stat(projectPath);
|
|
3456
|
+
const stats = await fsPromises.stat(projectPath);
|
|
3457
|
+
if (!stats.isDirectory())
|
|
3458
|
+
return { projectPath, files: [] };
|
|
3459
|
+
const files = await fsPromises.readdir(projectPath);
|
|
3460
|
+
return { projectPath, files };
|
|
3366
3461
|
}
|
|
3367
3462
|
catch {
|
|
3368
|
-
|
|
3463
|
+
return { projectPath, files: [] };
|
|
3369
3464
|
}
|
|
3370
|
-
|
|
3371
|
-
|
|
3372
|
-
|
|
3373
|
-
let files;
|
|
3465
|
+
}));
|
|
3466
|
+
const fileEntries = projectFileLists.flatMap(({ projectPath, files }) => files.filter((f) => f.endsWith(".jsonl")).map((f) => path.join(projectPath, f)));
|
|
3467
|
+
const statResults = await Promise.all(fileEntries.map(async (fullPath) => {
|
|
3374
3468
|
try {
|
|
3375
|
-
|
|
3469
|
+
const fileStats = await fsPromises.stat(fullPath);
|
|
3470
|
+
return { path: fullPath, mtime: fileStats.mtime };
|
|
3376
3471
|
}
|
|
3377
3472
|
catch {
|
|
3378
|
-
|
|
3473
|
+
return null;
|
|
3379
3474
|
}
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
|
|
3386
|
-
|
|
3387
|
-
|
|
3388
|
-
|
|
3389
|
-
|
|
3390
|
-
|
|
3475
|
+
}));
|
|
3476
|
+
const candidates = statResults.filter((entry) => entry !== null);
|
|
3477
|
+
return candidates.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()).slice(0, limit);
|
|
3478
|
+
}
|
|
3479
|
+
function isFinishedAccumulator(acc) {
|
|
3480
|
+
return Boolean(acc.sessionId && acc.cwd && acc.title);
|
|
3481
|
+
}
|
|
3482
|
+
function applyClaudeSessionEntryToAccumulator(entryRaw, acc) {
|
|
3483
|
+
if (!entryRaw || typeof entryRaw !== "object") {
|
|
3484
|
+
return;
|
|
3485
|
+
}
|
|
3486
|
+
const entry = entryRaw;
|
|
3487
|
+
if (entry.isSidechain) {
|
|
3488
|
+
return;
|
|
3489
|
+
}
|
|
3490
|
+
if (entry.type === "user" && isSyntheticUserEntry(entry)) {
|
|
3491
|
+
return;
|
|
3492
|
+
}
|
|
3493
|
+
if (!acc.sessionId && typeof entry.sessionId === "string") {
|
|
3494
|
+
acc.sessionId = entry.sessionId;
|
|
3495
|
+
}
|
|
3496
|
+
if (!acc.cwd && typeof entry.cwd === "string") {
|
|
3497
|
+
acc.cwd = entry.cwd;
|
|
3498
|
+
}
|
|
3499
|
+
if (entry.type === "user" && entry.message) {
|
|
3500
|
+
const text = extractClaudeUserText(entry.message);
|
|
3501
|
+
if (text) {
|
|
3502
|
+
if (!acc.title) {
|
|
3503
|
+
acc.title = text;
|
|
3391
3504
|
}
|
|
3505
|
+
acc.timeline.push({ type: "user_message", text });
|
|
3506
|
+
}
|
|
3507
|
+
return;
|
|
3508
|
+
}
|
|
3509
|
+
if (entry.type === "assistant" && entry.message) {
|
|
3510
|
+
const text = extractClaudeUserText(entry.message);
|
|
3511
|
+
if (text) {
|
|
3512
|
+
acc.timeline.push({ type: "assistant_message", text });
|
|
3392
3513
|
}
|
|
3393
3514
|
}
|
|
3394
|
-
return candidates.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()).slice(0, limit);
|
|
3395
3515
|
}
|
|
3396
3516
|
async function parseClaudeSessionDescriptor(filePath, mtime) {
|
|
3397
3517
|
let content;
|
|
@@ -3401,10 +3521,12 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
|
|
|
3401
3521
|
catch {
|
|
3402
3522
|
return null;
|
|
3403
3523
|
}
|
|
3404
|
-
|
|
3405
|
-
|
|
3406
|
-
|
|
3407
|
-
|
|
3524
|
+
const acc = {
|
|
3525
|
+
sessionId: null,
|
|
3526
|
+
cwd: null,
|
|
3527
|
+
title: null,
|
|
3528
|
+
timeline: [],
|
|
3529
|
+
};
|
|
3408
3530
|
for (const rawLine of content.split(/\r?\n/)) {
|
|
3409
3531
|
const line = rawLine.trim();
|
|
3410
3532
|
if (!line)
|
|
@@ -3416,37 +3538,12 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
|
|
|
3416
3538
|
catch {
|
|
3417
3539
|
continue;
|
|
3418
3540
|
}
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
}
|
|
3422
|
-
if (entry?.type === "user" && isSyntheticUserEntry(entry)) {
|
|
3423
|
-
continue;
|
|
3424
|
-
}
|
|
3425
|
-
if (!sessionId && typeof entry.sessionId === "string") {
|
|
3426
|
-
sessionId = entry.sessionId;
|
|
3427
|
-
}
|
|
3428
|
-
if (!cwd && typeof entry.cwd === "string") {
|
|
3429
|
-
cwd = entry.cwd;
|
|
3430
|
-
}
|
|
3431
|
-
if (entry.type === "user" && entry.message) {
|
|
3432
|
-
const text = extractClaudeUserText(entry.message);
|
|
3433
|
-
if (text) {
|
|
3434
|
-
if (!title) {
|
|
3435
|
-
title = text;
|
|
3436
|
-
}
|
|
3437
|
-
timeline.push({ type: "user_message", text });
|
|
3438
|
-
}
|
|
3439
|
-
}
|
|
3440
|
-
else if (entry.type === "assistant" && entry.message) {
|
|
3441
|
-
const text = extractClaudeUserText(entry.message);
|
|
3442
|
-
if (text) {
|
|
3443
|
-
timeline.push({ type: "assistant_message", text });
|
|
3444
|
-
}
|
|
3445
|
-
}
|
|
3446
|
-
if (sessionId && cwd && title) {
|
|
3541
|
+
applyClaudeSessionEntryToAccumulator(entry, acc);
|
|
3542
|
+
if (isFinishedAccumulator(acc)) {
|
|
3447
3543
|
break;
|
|
3448
3544
|
}
|
|
3449
3545
|
}
|
|
3546
|
+
const { sessionId, cwd, title, timeline } = acc;
|
|
3450
3547
|
if (!sessionId || !cwd) {
|
|
3451
3548
|
return null;
|
|
3452
3549
|
}
|
|
@@ -3469,10 +3566,11 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
|
|
|
3469
3566
|
timeline,
|
|
3470
3567
|
};
|
|
3471
3568
|
}
|
|
3472
|
-
function extractClaudeUserText(
|
|
3473
|
-
if (!
|
|
3569
|
+
function extractClaudeUserText(messageRaw) {
|
|
3570
|
+
if (!messageRaw || typeof messageRaw !== "object") {
|
|
3474
3571
|
return null;
|
|
3475
3572
|
}
|
|
3573
|
+
const message = messageRaw;
|
|
3476
3574
|
if (typeof message.content === "string") {
|
|
3477
3575
|
const normalized = message.content.trim();
|
|
3478
3576
|
return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
|
|
@@ -3483,7 +3581,9 @@ function extractClaudeUserText(message) {
|
|
|
3483
3581
|
}
|
|
3484
3582
|
if (Array.isArray(message.content)) {
|
|
3485
3583
|
for (const block of message.content) {
|
|
3486
|
-
if (block &&
|
|
3584
|
+
if (block &&
|
|
3585
|
+
typeof block === "object" &&
|
|
3586
|
+
typeof block.text === "string") {
|
|
3487
3587
|
const normalized = block.text.trim();
|
|
3488
3588
|
if (normalized && !isClaudeTranscriptNoiseText(normalized)) {
|
|
3489
3589
|
return normalized;
|