@getpaseo/server 0.1.68 → 0.1.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/scripts/dev-runner.js +4 -1
- package/dist/scripts/dev-runner.js.map +1 -1
- package/dist/scripts/supervisor-entrypoint.js +32 -10
- package/dist/scripts/supervisor-entrypoint.js.map +1 -1
- package/dist/scripts/supervisor.js +71 -6
- package/dist/scripts/supervisor.js.map +1 -1
- package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +33 -0
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +37 -1
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +8 -0
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +54 -5
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +15 -2
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-storage.d.ts +2 -2
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +1 -1
- package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store.js +1 -1
- package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
- package/dist/server/server/agent/create-agent-mode.d.ts +14 -0
- package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
- package/dist/server/server/agent/create-agent-mode.js +23 -0
- package/dist/server/server/agent/create-agent-mode.js.map +1 -0
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +36 -12
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/mcp-shared.d.ts +8 -4
- package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-shared.js +12 -5
- package/dist/server/server/agent/mcp-shared.js.map +1 -1
- package/dist/server/server/agent/pcm16-resampler.js.map +1 -1
- package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
- package/dist/server/server/agent/prompt-attachments.js +2 -0
- package/dist/server/server/agent/prompt-attachments.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-manifest.d.ts +4 -1
- package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
- package/dist/server/server/agent/provider-manifest.js +11 -0
- package/dist/server/server/agent/provider-manifest.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +8 -3
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.d.ts +2 -1
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.js +35 -17
- package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/{claude-agent.d.ts → claude/agent.d.ts} +10 -6
- package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/{claude-agent.js → claude/agent.js} +216 -153
- package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
- package/dist/server/server/agent/providers/claude/{claude-models.d.ts → models.d.ts} +1 -1
- package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/{claude-models.js → models.js} +8 -1
- package/dist/server/server/agent/providers/claude/models.js.map +1 -0
- package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
- package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/query.js +84 -0
- package/dist/server/server/agent/providers/claude/query.js.map +1 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +11 -2
- 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 +408 -91
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.js +4 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.js +0 -3
- package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.js +6 -2
- package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +32 -27
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
- package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
- package/dist/server/server/agent/providers/provider-image-output.js +51 -0
- package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts +3 -3
- package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -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 +7 -7
- 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 +12 -18
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
- package/dist/server/server/agent/stt-manager.d.ts +1 -0
- package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.js +3 -0
- package/dist/server/server/agent/stt-manager.js.map +1 -1
- package/dist/server/server/agent/tool-name-normalization.js.map +1 -1
- package/dist/server/server/agent/tts-manager.js.map +1 -1
- package/dist/server/server/bootstrap.d.ts +3 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +3 -9
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/chat/chat-rpc-schemas.d.ts +42 -42
- package/dist/server/server/chat/chat-types.d.ts +6 -6
- package/dist/server/server/config.d.ts +1 -0
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +27 -2
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/connection-offer.d.ts +1 -0
- package/dist/server/server/connection-offer.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.js +2 -6
- package/dist/server/server/daemon-config-store.js.map +1 -1
- package/dist/server/server/daemon-keypair.js.map +1 -1
- package/dist/server/server/daemon-worker.d.ts +2 -0
- package/dist/server/server/daemon-worker.d.ts.map +1 -0
- package/dist/server/server/{index.js → daemon-worker.js} +13 -41
- package/dist/server/server/daemon-worker.js.map +1 -0
- package/dist/server/server/editor-targets.js.map +1 -1
- package/dist/server/server/json-utils.js.map +1 -1
- package/dist/server/server/logger.d.ts +2 -6
- package/dist/server/server/logger.d.ts.map +1 -1
- package/dist/server/server/logger.js +28 -118
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/loop/rpc-schemas.d.ts +340 -272
- package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -1
- package/dist/server/server/loop/rpc-schemas.js +4 -0
- package/dist/server/server/loop/rpc-schemas.js.map +1 -1
- package/dist/server/server/loop-service.d.ts +58 -50
- package/dist/server/server/loop-service.d.ts.map +1 -1
- package/dist/server/server/loop-service.js +11 -2
- package/dist/server/server/loop-service.js.map +1 -1
- package/dist/server/server/package-version.d.ts +12 -0
- package/dist/server/server/package-version.d.ts.map +1 -1
- package/dist/server/server/package-version.js +13 -1
- package/dist/server/server/package-version.js.map +1 -1
- package/dist/server/server/pairing-offer.d.ts +1 -0
- package/dist/server/server/pairing-offer.d.ts.map +1 -1
- package/dist/server/server/pairing-offer.js +2 -1
- package/dist/server/server/pairing-offer.js.map +1 -1
- package/dist/server/server/pairing-qr.js +1 -1
- package/dist/server/server/pairing-qr.js.map +1 -1
- package/dist/server/server/paseo-env.d.ts +7 -3
- package/dist/server/server/paseo-env.d.ts.map +1 -1
- package/dist/server/server/paseo-env.js +16 -33
- package/dist/server/server/paseo-env.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +27 -16
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +3 -2
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/persistence-hooks.js.map +1 -1
- package/dist/server/server/pid-lock.d.ts +21 -4
- package/dist/server/server/pid-lock.d.ts.map +1 -1
- package/dist/server/server/pid-lock.js +30 -8
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/relay-transport.d.ts +2 -1
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +8 -5
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/schedule/rpc-schemas.d.ts +1188 -52
- package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -1
- package/dist/server/server/schedule/rpc-schemas.js +39 -0
- package/dist/server/server/schedule/rpc-schemas.js.map +1 -1
- package/dist/server/server/schedule/service.d.ts +3 -1
- package/dist/server/server/schedule/service.d.ts.map +1 -1
- package/dist/server/server/schedule/service.js +92 -5
- package/dist/server/server/schedule/service.js.map +1 -1
- package/dist/server/server/schedule/types.d.ts +28 -12
- package/dist/server/server/schedule/types.d.ts.map +1 -1
- package/dist/server/server/script-health-monitor.js.map +1 -1
- package/dist/server/server/session.d.ts +3 -4
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +160 -120
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/audio.js.map +1 -1
- 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 +52 -52
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
- 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 +9 -3
- 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.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +12 -10
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +1 -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.js.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.d.ts +16 -13
- package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.js +303 -71
- package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
- package/dist/server/server/voice-config.js +1 -1
- package/dist/server/server/voice-config.js.map +1 -1
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-directory.d.ts.map +1 -1
- package/dist/server/server/workspace-directory.js +4 -2
- package/dist/server/server/workspace-directory.js.map +1 -1
- package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
- package/dist/server/server/workspace-git-metadata.js +12 -5
- package/dist/server/server/workspace-git-metadata.js.map +1 -1
- package/dist/server/server/workspace-git-service.d.ts +2 -0
- package/dist/server/server/workspace-git-service.d.ts.map +1 -1
- package/dist/server/server/workspace-git-service.js +49 -1
- package/dist/server/server/workspace-git-service.js.map +1 -1
- package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-model.js +10 -3
- package/dist/server/server/workspace-registry-model.js.map +1 -1
- package/dist/server/server/worktree-session.js +1 -1
- package/dist/server/server/worktree-session.js.map +1 -1
- package/dist/server/services/github-service.d.ts.map +1 -1
- package/dist/server/services/github-service.js +9 -2
- package/dist/server/services/github-service.js.map +1 -1
- package/dist/server/shared/connection-offer.d.ts +10 -0
- package/dist/server/shared/connection-offer.d.ts.map +1 -1
- package/dist/server/shared/connection-offer.js +1 -0
- package/dist/server/shared/connection-offer.js.map +1 -1
- package/dist/server/shared/daemon-endpoints.d.ts +4 -0
- package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
- package/dist/server/shared/daemon-endpoints.js +6 -1
- package/dist/server/shared/daemon-endpoints.js.map +1 -1
- package/dist/server/shared/error-utils.d.ts +11 -0
- package/dist/server/shared/error-utils.d.ts.map +1 -0
- package/dist/server/shared/error-utils.js +27 -0
- package/dist/server/shared/error-utils.js.map +1 -0
- package/dist/server/shared/messages.d.ts +8669 -4459
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +5 -1
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/tool-call-display.d.ts.map +1 -1
- package/dist/server/shared/tool-call-display.js +2 -0
- package/dist/server/shared/tool-call-display.js.map +1 -1
- package/dist/server/terminal/terminal-capture.d.ts +12 -0
- package/dist/server/terminal/terminal-capture.d.ts.map +1 -0
- package/dist/server/terminal/terminal-capture.js +43 -0
- package/dist/server/terminal/terminal-capture.js.map +1 -0
- package/dist/server/terminal/terminal-manager-factory.d.ts +2 -6
- package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager-factory.js +2 -10
- package/dist/server/terminal/terminal-manager-factory.js.map +1 -1
- package/dist/server/terminal/terminal-manager.d.ts +2 -1
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.js +2 -1
- package/dist/server/terminal/terminal-manager.js.map +1 -1
- package/dist/server/terminal/terminal-output-coalescer.js.map +1 -1
- package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -1
- package/dist/server/terminal/terminal-session-controller.js +2 -0
- package/dist/server/terminal/terminal-session-controller.js.map +1 -1
- package/dist/server/terminal/terminal-worker-process.js +1 -1
- package/dist/server/terminal/terminal-worker-process.js.map +1 -1
- package/dist/server/terminal/terminal-worker-protocol.d.ts +1 -1
- package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -1
- package/dist/server/terminal/terminal.d.ts +0 -10
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +53 -49
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/terminal/worker-terminal-manager.js.map +1 -1
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +67 -11
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/directory-suggestions.js.map +1 -1
- package/dist/server/utils/executable.d.ts +2 -1
- package/dist/server/utils/executable.d.ts.map +1 -1
- package/dist/server/utils/executable.js +50 -51
- package/dist/server/utils/executable.js.map +1 -1
- package/dist/server/utils/paseo-config-file.d.ts +1 -1
- package/dist/server/utils/paseo-config-file.d.ts.map +1 -1
- package/dist/server/utils/spawn.d.ts +2 -0
- package/dist/server/utils/spawn.d.ts.map +1 -1
- package/dist/server/utils/spawn.js +2 -1
- package/dist/server/utils/spawn.js.map +1 -1
- package/dist/server/utils/tree-kill.d.ts +18 -0
- package/dist/server/utils/tree-kill.d.ts.map +1 -0
- package/dist/server/utils/{process-tree.js → tree-kill.js} +14 -33
- package/dist/server/utils/tree-kill.js.map +1 -0
- package/dist/server/utils/worktree.d.ts.map +1 -1
- package/dist/server/utils/worktree.js +18 -43
- package/dist/server/utils/worktree.js.map +1 -1
- package/dist/src/server/agent/agent-sdk-types.js +12 -0
- package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
- package/dist/src/server/agent/agent-title-limits.js +3 -0
- package/dist/src/server/agent/agent-title-limits.js.map +1 -0
- package/dist/src/server/agent/provider-launch-config.js +189 -0
- package/dist/src/server/agent/provider-launch-config.js.map +1 -0
- package/dist/src/server/agent/provider-manifest.js +197 -0
- package/dist/src/server/agent/provider-manifest.js.map +1 -0
- package/dist/src/server/chat/chat-rpc-schemas.js +103 -0
- package/dist/src/server/chat/chat-rpc-schemas.js.map +1 -0
- package/dist/src/server/chat/chat-types.js +22 -0
- package/dist/src/server/chat/chat-types.js.map +1 -0
- package/dist/src/server/loop/rpc-schemas.js +163 -0
- package/dist/src/server/loop/rpc-schemas.js.map +1 -0
- package/dist/src/server/paseo-env.js +53 -0
- package/dist/src/server/paseo-env.js.map +1 -0
- package/dist/src/server/persisted-config.js +363 -0
- package/dist/src/server/persisted-config.js.map +1 -0
- package/dist/src/server/pid-lock.js +30 -8
- package/dist/src/server/pid-lock.js.map +1 -1
- package/dist/src/server/schedule/rpc-schemas.js +151 -0
- package/dist/src/server/schedule/rpc-schemas.js.map +1 -0
- package/dist/src/server/schedule/types.js +73 -0
- package/dist/src/server/schedule/types.js.map +1 -0
- package/dist/src/shared/agent-lifecycle.js +8 -0
- package/dist/src/shared/agent-lifecycle.js.map +1 -0
- package/dist/src/shared/client-capabilities.js +4 -0
- package/dist/src/shared/client-capabilities.js.map +1 -0
- package/dist/src/shared/literal-union.js +2 -0
- package/dist/src/shared/literal-union.js.map +1 -0
- package/dist/src/shared/messages.js +3026 -0
- package/dist/src/shared/messages.js.map +1 -0
- package/dist/src/utils/executable.js +113 -0
- package/dist/src/utils/executable.js.map +1 -0
- package/dist/src/utils/paseo-config-schema.js +60 -0
- package/dist/src/utils/paseo-config-schema.js.map +1 -0
- package/dist/src/utils/spawn.js +71 -0
- package/dist/src/utils/spawn.js.map +1 -0
- package/dist/src/utils/windows-command.js +41 -0
- package/dist/src/utils/windows-command.js.map +1 -0
- package/package.json +7 -6
- package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +0 -1
- package/dist/server/server/agent/providers/claude/claude-models.js.map +0 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +0 -1
- package/dist/server/server/agent/providers/claude-agent.js.map +0 -1
- package/dist/server/server/index.d.ts +0 -2
- package/dist/server/server/index.d.ts.map +0 -1
- package/dist/server/server/index.js.map +0 -1
- package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts +0 -16
- package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts.map +0 -1
- package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js +0 -35
- package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js.map +0 -1
- package/dist/server/utils/process-tree.d.ts +0 -25
- package/dist/server/utils/process-tree.d.ts.map +0 -1
- package/dist/server/utils/process-tree.js.map +0 -1
|
@@ -3,22 +3,79 @@ import fs from "node:fs";
|
|
|
3
3
|
import { promises } from "node:fs";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { createProviderEnv, createProviderEnvSpec, } from "
|
|
16
|
-
import { findExecutable, isCommandAvailable } from "
|
|
17
|
-
import { withTimeout } from "
|
|
18
|
-
import { execCommand
|
|
19
|
-
import { getOrchestratorModeInstructions } from "
|
|
6
|
+
import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./tool-call-mapper.js";
|
|
7
|
+
import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./task-notification-tool-call.js";
|
|
8
|
+
import { getClaudeModels, normalizeClaudeRuntimeModelId } from "./models.js";
|
|
9
|
+
import { parsePartialJsonObject } from "./partial-json.js";
|
|
10
|
+
import { ClaudeSidechainTracker } from "./sidechain-tracker.js";
|
|
11
|
+
import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "../diagnostic-utils.js";
|
|
12
|
+
import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "../provider-runner.js";
|
|
13
|
+
import { renderPromptAttachmentAsText } from "../../prompt-attachments.js";
|
|
14
|
+
import { claudeQuery } from "./query.js";
|
|
15
|
+
import { createProviderEnv, createProviderEnvSpec, } from "../../provider-launch-config.js";
|
|
16
|
+
import { findExecutable, isCommandAvailable } from "../../../../utils/executable.js";
|
|
17
|
+
import { withTimeout } from "../../../../utils/promise-timeout.js";
|
|
18
|
+
import { execCommand } from "../../../../utils/spawn.js";
|
|
19
|
+
import { getOrchestratorModeInstructions } from "../../orchestrator-instructions.js";
|
|
20
20
|
const fsPromises = promises;
|
|
21
21
|
const CLAUDE_SETTING_SOURCES = ["user", "project"];
|
|
22
|
+
function readNonEmptyString(value) {
|
|
23
|
+
return typeof value === "string" && value.trim().length > 0 ? value : null;
|
|
24
|
+
}
|
|
25
|
+
export function normalizeClaudeAskUserQuestionUpdatedInput(updatedInput, fallbackInput) {
|
|
26
|
+
const fallback = isMetadata(fallbackInput) ? fallbackInput : {};
|
|
27
|
+
const base = isMetadata(updatedInput) ? updatedInput : {};
|
|
28
|
+
// Paseo's shared question UI serializes answers by question header, but Claude's
|
|
29
|
+
// AskUserQuestion tool expects answer keys to match the full question text. Merge
|
|
30
|
+
// the original request payload back in so provider callbacks that only return
|
|
31
|
+
// `{ answers }` still satisfy Claude's full tool input schema.
|
|
32
|
+
const merged = { ...fallback, ...base };
|
|
33
|
+
const questions = (Array.isArray(base.questions) ? base.questions : null) ??
|
|
34
|
+
(Array.isArray(fallback.questions) ? fallback.questions : null);
|
|
35
|
+
const answers = isMetadata(base.answers) ? base.answers : null;
|
|
36
|
+
if (!questions || !answers) {
|
|
37
|
+
return merged;
|
|
38
|
+
}
|
|
39
|
+
const normalizedAnswers = {};
|
|
40
|
+
for (const item of questions) {
|
|
41
|
+
const question = isMetadata(item) ? item : null;
|
|
42
|
+
if (!question) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const questionText = readNonEmptyString(question.question);
|
|
46
|
+
if (!questionText) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const header = readNonEmptyString(question.header);
|
|
50
|
+
const answer = readNonEmptyString(answers[questionText]) ??
|
|
51
|
+
(header ? readNonEmptyString(answers[header]) : null);
|
|
52
|
+
if (answer) {
|
|
53
|
+
normalizedAnswers[questionText] = answer;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (Object.keys(normalizedAnswers).length === 0) {
|
|
57
|
+
return merged;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...merged,
|
|
61
|
+
answers: normalizedAnswers,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function isObjectRecord(value) {
|
|
65
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
66
|
+
}
|
|
67
|
+
function toObjectRecord(value) {
|
|
68
|
+
return isObjectRecord(value) ? value : undefined;
|
|
69
|
+
}
|
|
70
|
+
function isUnknownArray(value) {
|
|
71
|
+
return Array.isArray(value);
|
|
72
|
+
}
|
|
73
|
+
function isImageMimeType(value) {
|
|
74
|
+
return (value === "image/jpeg" ||
|
|
75
|
+
value === "image/png" ||
|
|
76
|
+
value === "image/gif" ||
|
|
77
|
+
value === "image/webp");
|
|
78
|
+
}
|
|
22
79
|
const CLAUDE_CAPABILITIES = {
|
|
23
80
|
supportsStreaming: true,
|
|
24
81
|
supportsSessionPersistence: true,
|
|
@@ -92,60 +149,6 @@ function extractSessionIdRaw(msg) {
|
|
|
92
149
|
return msg.session.id;
|
|
93
150
|
return "";
|
|
94
151
|
}
|
|
95
|
-
function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
|
|
96
|
-
const commandConfig = runtimeSettings?.command;
|
|
97
|
-
if (!commandConfig || commandConfig.mode === "default") {
|
|
98
|
-
return {
|
|
99
|
-
command: spawnOptions.command,
|
|
100
|
-
args: [...spawnOptions.args],
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
if (commandConfig.mode === "append") {
|
|
104
|
-
return {
|
|
105
|
-
command: spawnOptions.command,
|
|
106
|
-
args: [...spawnOptions.args, ...(commandConfig.args ?? [])],
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
return {
|
|
110
|
-
command: commandConfig.argv[0],
|
|
111
|
-
args: [...commandConfig.argv.slice(1), ...spawnOptions.args],
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv) {
|
|
115
|
-
return {
|
|
116
|
-
...options,
|
|
117
|
-
spawnClaudeCodeProcess: (spawnOptions) => {
|
|
118
|
-
const resolved = resolveClaudeSpawnCommand(spawnOptions, runtimeSettings);
|
|
119
|
-
// When the SDK passes a default JS runtime ("node"/"bun"), replace it with
|
|
120
|
-
// process.execPath — the actual node binary running the daemon. This avoids
|
|
121
|
-
// PATH lookup failures in the managed runtime bundle.
|
|
122
|
-
// When the SDK passes a native binary path (from pathToClaudeCodeExecutable)
|
|
123
|
-
// or the user overrides the command via runtime settings, use that directly.
|
|
124
|
-
const isDefaultRuntime = resolved.command === "node" || resolved.command === "bun";
|
|
125
|
-
const command = isDefaultRuntime ? process.execPath : resolved.command;
|
|
126
|
-
const child = spawnProcess(command, resolved.args, {
|
|
127
|
-
cwd: spawnOptions.cwd,
|
|
128
|
-
...createProviderEnvSpec({
|
|
129
|
-
baseEnv: spawnOptions.env,
|
|
130
|
-
runtimeSettings,
|
|
131
|
-
overlays: [launchEnv],
|
|
132
|
-
}),
|
|
133
|
-
signal: spawnOptions.signal,
|
|
134
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
135
|
-
// Bypass cmd.exe on Windows: the SDK passes --mcp-config with inline JSON
|
|
136
|
-
// containing double quotes, which cmd.exe mangles (strips quotes, breaks parsing).
|
|
137
|
-
// The command is always a resolved binary path, so shell routing is unnecessary.
|
|
138
|
-
shell: false,
|
|
139
|
-
});
|
|
140
|
-
if (typeof options.stderr === "function") {
|
|
141
|
-
child.stderr?.on("data", (chunk) => {
|
|
142
|
-
options.stderr?.(chunk.toString());
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return child;
|
|
146
|
-
},
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
152
|
function isClaudeThinkingEffort(value) {
|
|
150
153
|
return (value === "low" ||
|
|
151
154
|
value === "medium" ||
|
|
@@ -168,11 +171,11 @@ function summarizeClaudeOptionsForLog(options) {
|
|
|
168
171
|
if (typeof systemPromptRaw === "string") {
|
|
169
172
|
return { mode: "string", preset: null };
|
|
170
173
|
}
|
|
171
|
-
const prompt = systemPromptRaw;
|
|
172
|
-
const promptType = typeof prompt
|
|
174
|
+
const prompt = toObjectRecord(systemPromptRaw);
|
|
175
|
+
const promptType = typeof prompt?.type === "string" ? prompt.type : "custom";
|
|
173
176
|
return {
|
|
174
177
|
mode: promptType === "preset" ? "preset" : "custom",
|
|
175
|
-
preset: typeof prompt
|
|
178
|
+
preset: typeof prompt?.preset === "string" && prompt.preset.length > 0 ? prompt.preset : null,
|
|
176
179
|
};
|
|
177
180
|
})();
|
|
178
181
|
const mcpServerNames = options.mcpServers ? Object.keys(options.mcpServers).sort() : [];
|
|
@@ -234,7 +237,11 @@ function normalizeForDeterministicString(value, seen) {
|
|
|
234
237
|
return "[circular]";
|
|
235
238
|
}
|
|
236
239
|
seen.add(objectValue);
|
|
237
|
-
const record = value;
|
|
240
|
+
const record = toObjectRecord(value);
|
|
241
|
+
if (!record) {
|
|
242
|
+
seen.delete(objectValue);
|
|
243
|
+
return "[invalid]";
|
|
244
|
+
}
|
|
238
245
|
const normalized = {};
|
|
239
246
|
for (const key of Object.keys(record).sort()) {
|
|
240
247
|
normalized[key] = normalizeForDeterministicString(record[key], seen);
|
|
@@ -242,7 +249,10 @@ function normalizeForDeterministicString(value, seen) {
|
|
|
242
249
|
seen.delete(objectValue);
|
|
243
250
|
return normalized;
|
|
244
251
|
}
|
|
245
|
-
|
|
252
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
253
|
+
return String(value);
|
|
254
|
+
}
|
|
255
|
+
return "[unsupported]";
|
|
246
256
|
}
|
|
247
257
|
function deterministicStringify(value) {
|
|
248
258
|
if (typeof value === "undefined") {
|
|
@@ -256,12 +266,13 @@ function deterministicStringify(value) {
|
|
|
256
266
|
return JSON.stringify(normalized);
|
|
257
267
|
}
|
|
258
268
|
catch {
|
|
259
|
-
|
|
260
|
-
return
|
|
269
|
+
if (typeof value === "string") {
|
|
270
|
+
return value;
|
|
261
271
|
}
|
|
262
|
-
|
|
263
|
-
return
|
|
272
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
273
|
+
return String(value);
|
|
264
274
|
}
|
|
275
|
+
return "[unserializable]";
|
|
265
276
|
}
|
|
266
277
|
}
|
|
267
278
|
function coerceToolResultContentToString(content) {
|
|
@@ -302,20 +313,21 @@ function collectClaudeTextContentParts(content) {
|
|
|
302
313
|
const normalized = normalizeClaudeTranscriptText(content);
|
|
303
314
|
return normalized ? [normalized] : [];
|
|
304
315
|
}
|
|
305
|
-
if (!
|
|
316
|
+
if (!isUnknownArray(content)) {
|
|
306
317
|
return [];
|
|
307
318
|
}
|
|
308
319
|
const parts = [];
|
|
309
320
|
for (const block of content) {
|
|
310
|
-
|
|
321
|
+
const blockRecord = toObjectRecord(block);
|
|
322
|
+
if (!blockRecord) {
|
|
311
323
|
continue;
|
|
312
324
|
}
|
|
313
|
-
const text = normalizeClaudeTranscriptText(
|
|
325
|
+
const text = normalizeClaudeTranscriptText(blockRecord.text);
|
|
314
326
|
if (text) {
|
|
315
327
|
parts.push(text);
|
|
316
328
|
continue;
|
|
317
329
|
}
|
|
318
|
-
const input = normalizeClaudeTranscriptText(
|
|
330
|
+
const input = normalizeClaudeTranscriptText(blockRecord.input);
|
|
319
331
|
if (input) {
|
|
320
332
|
parts.push(input);
|
|
321
333
|
}
|
|
@@ -495,6 +507,7 @@ function toClaudeSdkMcpConfig(config) {
|
|
|
495
507
|
headers: config.headers,
|
|
496
508
|
};
|
|
497
509
|
}
|
|
510
|
+
throw new Error("Unhandled MCP server config type");
|
|
498
511
|
}
|
|
499
512
|
function isClaudeContentChunk(value) {
|
|
500
513
|
return isMetadata(value) && typeof value.type === "string";
|
|
@@ -585,7 +598,7 @@ class TimelineAssembler {
|
|
|
585
598
|
return this.applyAbsoluteFragments(state, fragments);
|
|
586
599
|
}
|
|
587
600
|
consumeStreamEvent(message, runId, messageIdHint) {
|
|
588
|
-
const event = message.event;
|
|
601
|
+
const event = toObjectRecord(message.event) ?? {};
|
|
589
602
|
const eventType = readTrimmedString(event.type);
|
|
590
603
|
const streamEventMessageId = this.readMessageIdFromStreamEvent(event) ?? messageIdHint;
|
|
591
604
|
if (eventType === "message_start") {
|
|
@@ -768,19 +781,20 @@ class TimelineAssembler {
|
|
|
768
781
|
return fragments;
|
|
769
782
|
}
|
|
770
783
|
readMessageIdFromAssistantMessage(message) {
|
|
771
|
-
const candidate = message;
|
|
772
|
-
|
|
784
|
+
const candidate = toObjectRecord(message);
|
|
785
|
+
const messageContainer = toObjectRecord(candidate?.message);
|
|
786
|
+
return (readTrimmedString(candidate?.message_id) ?? readTrimmedString(messageContainer?.id) ?? null);
|
|
773
787
|
}
|
|
774
788
|
readMessageIdFromStreamEvent(event) {
|
|
775
|
-
const
|
|
776
|
-
return readTrimmedString(event.message_id) ?? readTrimmedString(
|
|
789
|
+
const messageContainer = toObjectRecord(event.message);
|
|
790
|
+
return readTrimmedString(event.message_id) ?? readTrimmedString(messageContainer?.id) ?? null;
|
|
777
791
|
}
|
|
778
792
|
}
|
|
779
793
|
function isSyntheticUserEntry(entry) {
|
|
780
|
-
|
|
794
|
+
const candidate = toObjectRecord(entry);
|
|
795
|
+
if (!candidate) {
|
|
781
796
|
return false;
|
|
782
797
|
}
|
|
783
|
-
const candidate = entry;
|
|
784
798
|
return candidate.isSynthetic === true || candidate.isMeta === true;
|
|
785
799
|
}
|
|
786
800
|
function firstTrimmedString(sources) {
|
|
@@ -793,11 +807,11 @@ function firstTrimmedString(sources) {
|
|
|
793
807
|
return null;
|
|
794
808
|
}
|
|
795
809
|
export function readEventIdentifiers(message) {
|
|
796
|
-
const root = message;
|
|
810
|
+
const root = toObjectRecord(message) ?? {};
|
|
797
811
|
const messageType = readTrimmedString(root.type);
|
|
798
|
-
const streamEvent = root.event;
|
|
799
|
-
const streamEventMessage = streamEvent?.message;
|
|
800
|
-
const messageContainer = root.message;
|
|
812
|
+
const streamEvent = toObjectRecord(root.event);
|
|
813
|
+
const streamEventMessage = toObjectRecord(streamEvent?.message);
|
|
814
|
+
const messageContainer = toObjectRecord(root.message);
|
|
801
815
|
const messageIdFromUuid = messageType === "user" ? root.uuid : undefined;
|
|
802
816
|
return {
|
|
803
817
|
taskId: firstTrimmedString([
|
|
@@ -831,7 +845,8 @@ export class ClaudeAgentClient {
|
|
|
831
845
|
this.defaults = options.defaults;
|
|
832
846
|
this.logger = options.logger.child({ module: "agent", provider: "claude" });
|
|
833
847
|
this.runtimeSettings = options.runtimeSettings;
|
|
834
|
-
this.queryFactory = options.queryFactory
|
|
848
|
+
this.queryFactory = options.queryFactory;
|
|
849
|
+
this.resolveBinary = options.resolveBinary ?? (() => resolveClaudeBinary(this.runtimeSettings));
|
|
835
850
|
}
|
|
836
851
|
async createSession(config, launchContext, options) {
|
|
837
852
|
const claudeConfig = this.assertConfig(config);
|
|
@@ -842,6 +857,7 @@ export class ClaudeAgentClient {
|
|
|
842
857
|
persistSession: options?.persistSession,
|
|
843
858
|
logger: this.logger,
|
|
844
859
|
queryFactory: this.queryFactory,
|
|
860
|
+
resolveBinary: this.resolveBinary,
|
|
845
861
|
});
|
|
846
862
|
}
|
|
847
863
|
async resumeSession(handle, overrides, launchContext) {
|
|
@@ -863,6 +879,7 @@ export class ClaudeAgentClient {
|
|
|
863
879
|
launchEnv: launchContext?.env,
|
|
864
880
|
logger: this.logger,
|
|
865
881
|
queryFactory: this.queryFactory,
|
|
882
|
+
resolveBinary: this.resolveBinary,
|
|
866
883
|
});
|
|
867
884
|
}
|
|
868
885
|
async listModels(_options) {
|
|
@@ -887,9 +904,7 @@ export class ClaudeAgentClient {
|
|
|
887
904
|
if (command?.mode === "replace") {
|
|
888
905
|
return await isCommandAvailable(command.argv[0]);
|
|
889
906
|
}
|
|
890
|
-
|
|
891
|
-
// via process.execPath. No external `claude` binary is required.
|
|
892
|
-
return true;
|
|
907
|
+
return await isCommandAvailable("claude");
|
|
893
908
|
}
|
|
894
909
|
async getDiagnostic() {
|
|
895
910
|
try {
|
|
@@ -938,6 +953,20 @@ export class ClaudeAgentClient {
|
|
|
938
953
|
return { ...config, provider: "claude" };
|
|
939
954
|
}
|
|
940
955
|
}
|
|
956
|
+
async function resolveClaudeBinary(runtimeSettings) {
|
|
957
|
+
const command = runtimeSettings?.command;
|
|
958
|
+
if (command?.mode === "replace") {
|
|
959
|
+
const foundOverride = await findExecutable(command.argv[0]);
|
|
960
|
+
if (foundOverride) {
|
|
961
|
+
return foundOverride;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
const found = await findExecutable("claude");
|
|
965
|
+
if (found) {
|
|
966
|
+
return found;
|
|
967
|
+
}
|
|
968
|
+
throw new Error("Claude binary not found. Install Claude Code (https://github.com/anthropics/claude-code) and ensure it is available in your shell PATH.");
|
|
969
|
+
}
|
|
941
970
|
async function resolveClaudeVersion(runtimeSettings) {
|
|
942
971
|
const command = runtimeSettings?.command;
|
|
943
972
|
const envSpec = createProviderEnvSpec({ runtimeSettings });
|
|
@@ -970,11 +999,11 @@ async function resolveClaudeAuth(runtimeSettings) {
|
|
|
970
999
|
});
|
|
971
1000
|
}
|
|
972
1001
|
catch (error) {
|
|
973
|
-
const err = error;
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
};
|
|
1002
|
+
const err = toObjectRecord(error);
|
|
1003
|
+
const stdout = typeof err?.stdout === "string" ? err.stdout : "";
|
|
1004
|
+
const stderr = typeof err?.stderr === "string" ? err.stderr : "";
|
|
1005
|
+
const fallbackMessage = typeof err?.message === "string" ? err.message : "";
|
|
1006
|
+
return { stdout, stderr: stderr || fallbackMessage };
|
|
978
1007
|
}
|
|
979
1008
|
};
|
|
980
1009
|
try {
|
|
@@ -1000,15 +1029,17 @@ async function resolveClaudeAuth(runtimeSettings) {
|
|
|
1000
1029
|
}
|
|
1001
1030
|
}
|
|
1002
1031
|
function extractContextWindowSize(modelUsage) {
|
|
1003
|
-
|
|
1032
|
+
const usageRecord = toObjectRecord(modelUsage);
|
|
1033
|
+
if (!usageRecord) {
|
|
1004
1034
|
return undefined;
|
|
1005
1035
|
}
|
|
1006
1036
|
let maxContextWindow;
|
|
1007
|
-
for (const value of Object.values(
|
|
1008
|
-
|
|
1037
|
+
for (const value of Object.values(usageRecord)) {
|
|
1038
|
+
const valueRecord = toObjectRecord(value);
|
|
1039
|
+
if (!valueRecord) {
|
|
1009
1040
|
continue;
|
|
1010
1041
|
}
|
|
1011
|
-
const contextWindow =
|
|
1042
|
+
const contextWindow = valueRecord.contextWindow;
|
|
1012
1043
|
if (typeof contextWindow !== "number" ||
|
|
1013
1044
|
!Number.isFinite(contextWindow) ||
|
|
1014
1045
|
contextWindow <= 0) {
|
|
@@ -1035,8 +1066,8 @@ function readUsageFromTaskNotification(message) {
|
|
|
1035
1066
|
return readUsageTotalTokens(message.usage);
|
|
1036
1067
|
}
|
|
1037
1068
|
function readStreamRequestInputTokens(event) {
|
|
1038
|
-
const messageUsage = event.message?.usage;
|
|
1039
|
-
if (!messageUsage
|
|
1069
|
+
const messageUsage = toObjectRecord(toObjectRecord(event.message)?.usage);
|
|
1070
|
+
if (!messageUsage) {
|
|
1040
1071
|
return undefined;
|
|
1041
1072
|
}
|
|
1042
1073
|
const usage = messageUsage;
|
|
@@ -1057,7 +1088,7 @@ function readStreamRequestInputTokens(event) {
|
|
|
1057
1088
|
return inputTokens + cacheCreationInputTokens + cacheReadInputTokens;
|
|
1058
1089
|
}
|
|
1059
1090
|
function readStreamRequestOutputTokens(event) {
|
|
1060
|
-
const outputTokens = event.usage?.output_tokens;
|
|
1091
|
+
const outputTokens = toObjectRecord(event.usage)?.output_tokens;
|
|
1061
1092
|
if (typeof outputTokens !== "number" || !Number.isFinite(outputTokens) || outputTokens < 0) {
|
|
1062
1093
|
return undefined;
|
|
1063
1094
|
}
|
|
@@ -1175,7 +1206,8 @@ class ClaudeAgentSession {
|
|
|
1175
1206
|
this.runtimeSettings = options.runtimeSettings;
|
|
1176
1207
|
this.persistSession = options.persistSession;
|
|
1177
1208
|
this.logger = options.logger;
|
|
1178
|
-
this.queryFactory = options.queryFactory
|
|
1209
|
+
this.queryFactory = options.queryFactory;
|
|
1210
|
+
this.resolveBinary = options.resolveBinary;
|
|
1179
1211
|
const handle = options.handle;
|
|
1180
1212
|
if (handle) {
|
|
1181
1213
|
if (!handle.sessionId) {
|
|
@@ -1409,9 +1441,12 @@ class ClaudeAgentSession {
|
|
|
1409
1441
|
},
|
|
1410
1442
|
}));
|
|
1411
1443
|
}
|
|
1444
|
+
const updatedInput = pending.request.kind === "question"
|
|
1445
|
+
? normalizeClaudeAskUserQuestionUpdatedInput(response.updatedInput, pending.request.input ?? undefined)
|
|
1446
|
+
: (response.updatedInput ?? pending.request.input ?? {});
|
|
1412
1447
|
const result = {
|
|
1413
1448
|
behavior: "allow",
|
|
1414
|
-
updatedInput
|
|
1449
|
+
updatedInput,
|
|
1415
1450
|
updatedPermissions: this.normalizePermissionUpdates(response.updatedPermissions),
|
|
1416
1451
|
};
|
|
1417
1452
|
pending.resolve(result);
|
|
@@ -1700,7 +1735,11 @@ class ClaudeAgentSession {
|
|
|
1700
1735
|
const options = await this.buildOptions();
|
|
1701
1736
|
this.logger.debug({ options: summarizeClaudeOptionsForLog(options) }, "claude query");
|
|
1702
1737
|
this.input = input;
|
|
1703
|
-
this.query =
|
|
1738
|
+
this.query = claudeQuery({ prompt: input.iterable, options }, {
|
|
1739
|
+
runtimeSettings: this.runtimeSettings,
|
|
1740
|
+
launchEnv: this.launchEnv,
|
|
1741
|
+
queryFactory: this.queryFactory,
|
|
1742
|
+
});
|
|
1704
1743
|
// Do not kick off background control-plane queries here. Methods like
|
|
1705
1744
|
// supportedCommands()/setPermissionMode() may execute immediately after
|
|
1706
1745
|
// ensureQuery() (for listCommands()/setMode()), and sharing the same query
|
|
@@ -1727,12 +1766,7 @@ class ClaudeAgentSession {
|
|
|
1727
1766
|
? this.config.thinkingOptionId
|
|
1728
1767
|
: undefined;
|
|
1729
1768
|
if (thinkingOptionId && isClaudeThinkingEffort(thinkingOptionId)) {
|
|
1730
|
-
|
|
1731
|
-
// adds 'xhigh' which the binary accepts but the typings don't yet expose.
|
|
1732
|
-
return {
|
|
1733
|
-
thinking: { type: "adaptive" },
|
|
1734
|
-
effort: thinkingOptionId,
|
|
1735
|
-
};
|
|
1769
|
+
return { thinking: { type: "adaptive" }, effort: thinkingOptionId };
|
|
1736
1770
|
}
|
|
1737
1771
|
return { thinking: undefined, effort: undefined };
|
|
1738
1772
|
}
|
|
@@ -1758,7 +1792,7 @@ class ClaudeAgentSession {
|
|
|
1758
1792
|
this.launchEnv,
|
|
1759
1793
|
],
|
|
1760
1794
|
});
|
|
1761
|
-
const claudeBinary = await
|
|
1795
|
+
const claudeBinary = await this.resolveBinary();
|
|
1762
1796
|
this.logger.debug({
|
|
1763
1797
|
claudeBinary,
|
|
1764
1798
|
pathEnvKey: resolvePathEnvKey(),
|
|
@@ -1776,7 +1810,7 @@ class ClaudeAgentSession {
|
|
|
1776
1810
|
allowDangerouslySkipPermissions: true,
|
|
1777
1811
|
agents: this.defaults?.agents,
|
|
1778
1812
|
canUseTool: this.handlePermissionRequest,
|
|
1779
|
-
|
|
1813
|
+
pathToClaudeCodeExecutable: claudeBinary,
|
|
1780
1814
|
// Use Claude Code preset system prompt and load CLAUDE.md files
|
|
1781
1815
|
// Append provider-agnostic system prompt and orchestrator instructions for agents.
|
|
1782
1816
|
systemPrompt: {
|
|
@@ -1816,10 +1850,7 @@ class ClaudeAgentSession {
|
|
|
1816
1850
|
...this.runtimeSettings.disallowedTools,
|
|
1817
1851
|
];
|
|
1818
1852
|
}
|
|
1819
|
-
return
|
|
1820
|
-
}
|
|
1821
|
-
applyRuntimeSettings(options) {
|
|
1822
|
-
return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings, this.launchEnv);
|
|
1853
|
+
return base;
|
|
1823
1854
|
}
|
|
1824
1855
|
normalizeMcpServers(servers) {
|
|
1825
1856
|
const result = {};
|
|
@@ -1836,14 +1867,16 @@ class ClaudeAgentSession {
|
|
|
1836
1867
|
content.push({ type: "text", text: chunk.text });
|
|
1837
1868
|
}
|
|
1838
1869
|
else if (chunk.type === "image") {
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1870
|
+
if (isImageMimeType(chunk.mimeType)) {
|
|
1871
|
+
content.push({
|
|
1872
|
+
type: "image",
|
|
1873
|
+
source: {
|
|
1874
|
+
type: "base64",
|
|
1875
|
+
media_type: chunk.mimeType,
|
|
1876
|
+
data: chunk.data,
|
|
1877
|
+
},
|
|
1878
|
+
});
|
|
1879
|
+
}
|
|
1847
1880
|
}
|
|
1848
1881
|
else {
|
|
1849
1882
|
content.push({ type: "text", text: renderPromptAttachmentAsText(chunk) });
|
|
@@ -2062,7 +2095,7 @@ class ClaudeAgentSession {
|
|
|
2062
2095
|
this.logger.trace({ err: error }, "Claude query pump exited unexpectedly");
|
|
2063
2096
|
});
|
|
2064
2097
|
this.queryPumpPromise = pump;
|
|
2065
|
-
pump.finally(() => {
|
|
2098
|
+
void pump.finally(() => {
|
|
2066
2099
|
if (this.queryPumpPromise === pump) {
|
|
2067
2100
|
this.queryPumpPromise = null;
|
|
2068
2101
|
}
|
|
@@ -2341,7 +2374,7 @@ class ClaudeAgentSession {
|
|
|
2341
2374
|
return;
|
|
2342
2375
|
}
|
|
2343
2376
|
if (message.subtype === "status") {
|
|
2344
|
-
const status = message
|
|
2377
|
+
const status = toObjectRecord(message)?.status;
|
|
2345
2378
|
if (status === "compacting") {
|
|
2346
2379
|
this.compacting = true;
|
|
2347
2380
|
events.push({
|
|
@@ -2367,6 +2400,16 @@ class ClaudeAgentSession {
|
|
|
2367
2400
|
return;
|
|
2368
2401
|
}
|
|
2369
2402
|
if (message.subtype === "task_notification") {
|
|
2403
|
+
// TODO: subagent timelines are best-effort. Subagent task_notifications
|
|
2404
|
+
// arrive without parent_tool_use_id but with tool_use_id pointing at the
|
|
2405
|
+
// parent's Task call, so they slip past the sidechain router and pollute
|
|
2406
|
+
// the parent timeline. Drop them here; eventually thread them into the
|
|
2407
|
+
// parent Task tool call's sub_agent log instead.
|
|
2408
|
+
const taskUseId = message.tool_use_id;
|
|
2409
|
+
const cachedTool = taskUseId ? this.toolUseCache.get(taskUseId) : undefined;
|
|
2410
|
+
if (cachedTool?.name === "Task") {
|
|
2411
|
+
return;
|
|
2412
|
+
}
|
|
2370
2413
|
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
|
|
2371
2414
|
if (taskNotificationItem) {
|
|
2372
2415
|
events.push({
|
|
@@ -2478,8 +2521,12 @@ class ClaudeAgentSession {
|
|
|
2478
2521
|
};
|
|
2479
2522
|
}
|
|
2480
2523
|
captureSessionIdFromMessage(message) {
|
|
2481
|
-
const
|
|
2482
|
-
const sessionId = extractSessionIdRaw(
|
|
2524
|
+
const msgRecord = toObjectRecord(message) ?? {};
|
|
2525
|
+
const sessionId = extractSessionIdRaw({
|
|
2526
|
+
session_id: msgRecord.session_id,
|
|
2527
|
+
sessionId: msgRecord.sessionId,
|
|
2528
|
+
session: isObjectRecord(msgRecord.session) ? { id: msgRecord.session.id } : null,
|
|
2529
|
+
}).trim();
|
|
2483
2530
|
if (!sessionId) {
|
|
2484
2531
|
return { threadStartedSessionId: null, notice: null };
|
|
2485
2532
|
}
|
|
@@ -2507,8 +2554,12 @@ class ClaudeAgentSession {
|
|
|
2507
2554
|
if (message.subtype !== "init") {
|
|
2508
2555
|
return { threadStartedSessionId: null, notice: null };
|
|
2509
2556
|
}
|
|
2510
|
-
const
|
|
2511
|
-
const newSessionId = extractSessionIdRaw(
|
|
2557
|
+
const msgRecord = toObjectRecord(message) ?? {};
|
|
2558
|
+
const newSessionId = extractSessionIdRaw({
|
|
2559
|
+
session_id: msgRecord.session_id,
|
|
2560
|
+
sessionId: msgRecord.sessionId,
|
|
2561
|
+
session: isObjectRecord(msgRecord.session) ? { id: msgRecord.session.id } : null,
|
|
2562
|
+
}).trim();
|
|
2512
2563
|
if (!newSessionId) {
|
|
2513
2564
|
return { threadStartedSessionId: null, notice: null };
|
|
2514
2565
|
}
|
|
@@ -2631,10 +2682,10 @@ class ClaudeAgentSession {
|
|
|
2631
2682
|
};
|
|
2632
2683
|
}
|
|
2633
2684
|
trackStreamEventUsage(event) {
|
|
2634
|
-
|
|
2685
|
+
const streamEvent = toObjectRecord(event);
|
|
2686
|
+
if (!streamEvent) {
|
|
2635
2687
|
return null;
|
|
2636
2688
|
}
|
|
2637
|
-
const streamEvent = event;
|
|
2638
2689
|
const eventType = readTrimmedString(streamEvent.type);
|
|
2639
2690
|
if (eventType === "message_start") {
|
|
2640
2691
|
const inputTokens = readStreamRequestInputTokens(streamEvent);
|
|
@@ -2748,7 +2799,12 @@ class ClaudeAgentSession {
|
|
|
2748
2799
|
}
|
|
2749
2800
|
let entry;
|
|
2750
2801
|
try {
|
|
2751
|
-
|
|
2802
|
+
const parsed = JSON.parse(trimmed);
|
|
2803
|
+
const record = toObjectRecord(parsed);
|
|
2804
|
+
if (!record) {
|
|
2805
|
+
return;
|
|
2806
|
+
}
|
|
2807
|
+
entry = record;
|
|
2752
2808
|
}
|
|
2753
2809
|
catch {
|
|
2754
2810
|
return;
|
|
@@ -3289,12 +3345,20 @@ function hasToolLikeBlock(block) {
|
|
|
3289
3345
|
return type.includes("tool");
|
|
3290
3346
|
}
|
|
3291
3347
|
function readCompactionMetadata(source) {
|
|
3292
|
-
const
|
|
3348
|
+
const sourceRecord = toObjectRecord(source);
|
|
3349
|
+
if (!sourceRecord) {
|
|
3350
|
+
return null;
|
|
3351
|
+
}
|
|
3352
|
+
const candidates = [
|
|
3353
|
+
sourceRecord.compact_metadata,
|
|
3354
|
+
sourceRecord.compactMetadata,
|
|
3355
|
+
sourceRecord.compactionMetadata,
|
|
3356
|
+
];
|
|
3293
3357
|
for (const candidate of candidates) {
|
|
3294
|
-
|
|
3358
|
+
const metadata = toObjectRecord(candidate);
|
|
3359
|
+
if (!metadata) {
|
|
3295
3360
|
continue;
|
|
3296
3361
|
}
|
|
3297
|
-
const metadata = candidate;
|
|
3298
3362
|
const trigger = typeof metadata.trigger === "string" ? metadata.trigger : undefined;
|
|
3299
3363
|
const preTokensRaw = metadata.preTokens ?? metadata.pre_tokens;
|
|
3300
3364
|
const preTokens = typeof preTokensRaw === "number" ? preTokensRaw : undefined;
|
|
@@ -3484,10 +3548,10 @@ function isFinishedAccumulator(acc) {
|
|
|
3484
3548
|
return Boolean(acc.sessionId && acc.cwd && acc.title);
|
|
3485
3549
|
}
|
|
3486
3550
|
function applyClaudeSessionEntryToAccumulator(entryRaw, acc) {
|
|
3487
|
-
|
|
3551
|
+
const entry = toObjectRecord(entryRaw);
|
|
3552
|
+
if (!entry) {
|
|
3488
3553
|
return;
|
|
3489
3554
|
}
|
|
3490
|
-
const entry = entryRaw;
|
|
3491
3555
|
if (entry.isSidechain) {
|
|
3492
3556
|
return;
|
|
3493
3557
|
}
|
|
@@ -3571,10 +3635,10 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
|
|
|
3571
3635
|
};
|
|
3572
3636
|
}
|
|
3573
3637
|
function extractClaudeUserText(messageRaw) {
|
|
3574
|
-
|
|
3638
|
+
const message = toObjectRecord(messageRaw);
|
|
3639
|
+
if (!message) {
|
|
3575
3640
|
return null;
|
|
3576
3641
|
}
|
|
3577
|
-
const message = messageRaw;
|
|
3578
3642
|
if (typeof message.content === "string") {
|
|
3579
3643
|
const normalized = message.content.trim();
|
|
3580
3644
|
return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
|
|
@@ -3583,12 +3647,11 @@ function extractClaudeUserText(messageRaw) {
|
|
|
3583
3647
|
const normalized = message.text.trim();
|
|
3584
3648
|
return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
|
|
3585
3649
|
}
|
|
3586
|
-
if (
|
|
3650
|
+
if (isUnknownArray(message.content)) {
|
|
3587
3651
|
for (const block of message.content) {
|
|
3588
|
-
|
|
3589
|
-
|
|
3590
|
-
|
|
3591
|
-
const normalized = block.text.trim();
|
|
3652
|
+
const blockRecord = toObjectRecord(block);
|
|
3653
|
+
if (blockRecord && typeof blockRecord.text === "string") {
|
|
3654
|
+
const normalized = blockRecord.text.trim();
|
|
3592
3655
|
if (normalized && !isClaudeTranscriptNoiseText(normalized)) {
|
|
3593
3656
|
return normalized;
|
|
3594
3657
|
}
|
|
@@ -3597,4 +3660,4 @@ function extractClaudeUserText(messageRaw) {
|
|
|
3597
3660
|
}
|
|
3598
3661
|
return null;
|
|
3599
3662
|
}
|
|
3600
|
-
//# sourceMappingURL=
|
|
3663
|
+
//# sourceMappingURL=agent.js.map
|