@code-yeongyu/senpi 2026.9.3 → 2026.9.4
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/CHANGELOG.md +75 -0
- package/dist/core/agent-session.d.ts +2 -5
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +32 -29
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/dynamic-prompt/style.js +1 -1
- package/dist/core/dynamic-prompt/style.js.map +1 -1
- package/dist/core/dynamic-prompt/working-task.js +1 -1
- package/dist/core/dynamic-prompt/working-task.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.d.ts +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js +7 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts +11 -7
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +4 -8
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js +15 -18
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.d.ts +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.js +80 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts +18 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.js +57 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js +13 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +6 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js +2 -23
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts +2 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +30 -24
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +15 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts +6 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js +19 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +31 -13
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +8 -14
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js +23 -6
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js +4 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +13 -6
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts +11 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js +12 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +1 -1
- package/dist/core/extensions/builtin/eval-only-routing.d.ts +10 -0
- package/dist/core/extensions/builtin/eval-only-routing.d.ts.map +1 -0
- package/dist/core/extensions/builtin/eval-only-routing.js +16 -0
- package/dist/core/extensions/builtin/eval-only-routing.js.map +1 -0
- package/dist/core/extensions/builtin/gpt-account.d.ts +3 -0
- package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -0
- package/dist/core/extensions/builtin/gpt-account.js +115 -0
- package/dist/core/extensions/builtin/gpt-account.js.map +1 -0
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +2 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js +1 -3
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js +1 -11
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js +2 -2
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +3 -3
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +56 -43
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +4 -15
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +12 -21
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js +2 -11
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js +2 -11
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts +4 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5.js +16 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +1 -5
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -6
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +123 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +202 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-eval-routing.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-eval-routing.js +1 -2
- package/dist/core/extensions/builtin/prompt-preset/gpt-eval-routing.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +60 -76
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +17 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +5 -2
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts +13 -2
- package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.js +18 -7
- package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/tool-search/native-search.d.ts +1 -1
- package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-search/native-search.js +1 -1
- package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.d.ts +34 -0
- package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.js +121 -0
- package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.js.map +1 -0
- package/dist/core/extensions/builtin/ttsr/detectors/collapse.d.ts +2 -0
- package/dist/core/extensions/builtin/ttsr/detectors/collapse.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/collapse.js +6 -2
- package/dist/core/extensions/builtin/ttsr/detectors/collapse.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +18 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +0 -4
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +0 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +9 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +2 -0
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +71 -12
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +5 -0
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +5 -0
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/login-prompts.d.ts +24 -0
- package/dist/modes/rpc/login-prompts.d.ts.map +1 -0
- package/dist/modes/rpc/login-prompts.js +44 -0
- package/dist/modes/rpc/login-prompts.js.map +1 -0
- package/dist/modes/rpc/media-placeholders.d.ts +49 -0
- package/dist/modes/rpc/media-placeholders.d.ts.map +1 -0
- package/dist/modes/rpc/media-placeholders.js +151 -0
- package/dist/modes/rpc/media-placeholders.js.map +1 -0
- package/dist/modes/rpc/multi-session-host.js +3 -0
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +8 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +11 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +23 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +1 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +2 -1
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-fanout.d.ts +13 -2
- package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-fanout.js +36 -12
- package/dist/modes/rpc/session-event-fanout.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +3 -1
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +23 -13
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts +8 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.js +32 -9
- package/dist/modes/rpc/socket-event-fanout.js.map +1 -1
- package/docs/rpc.md +104 -0
- package/docs/settings.md +5 -27
- package/docs/windows.md +1 -1
- package/node_modules/@anthropic-ai/claude-agent-sdk/bridge.d.ts +18 -1
- package/node_modules/@anthropic-ai/claude-agent-sdk/bridge.mjs +155 -106
- package/node_modules/@anthropic-ai/claude-agent-sdk/browser-sdk.js +144 -83
- package/node_modules/@anthropic-ai/claude-agent-sdk/manifest.json +21 -32
- package/node_modules/@anthropic-ai/claude-agent-sdk/manifest.zst.json +25 -36
- package/node_modules/@anthropic-ai/claude-agent-sdk/package.json +2 -2
- package/node_modules/@anthropic-ai/claude-agent-sdk/sdk-tools.d.ts +93 -31
- package/node_modules/@anthropic-ai/claude-agent-sdk/sdk.d.ts +473 -31
- package/node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs +140 -93
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +17 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.d.ts +10 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.js +126 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +14 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +1 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/context-room.js +40 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/context-room.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts +1 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +2 -16
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +16 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +40 -6
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SDKAssistantMessageError } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport type SdkErrorKind = \"rate_limit\" | \"overloaded\" | \"auth_error\" | \"billing\" | \"org_not_allowed\" | \"other\";\n\nexport type SdkErrorClassification = {\n\tkind: SdkErrorKind;\n\tretryable: boolean;\n};\n\nconst SDK_ERROR_CLASSIFICATIONS: Partial<Record<SDKAssistantMessageError, SdkErrorClassification>> = {\n\tauthentication_failed: { kind: \"auth_error\", retryable: true },\n\toauth_org_not_allowed: { kind: \"org_not_allowed\", retryable: true },\n\tbilling_error: { kind: \"billing\", retryable: true },\n\trate_limit: { kind: \"rate_limit\", retryable: true },\n\toverloaded: { kind: \"overloaded\", retryable: true },\n\tinvalid_request: { kind: \"other\", retryable: false },\n\tserver_error: { kind: \"other\", retryable: true },\n};\n\nconst OTHER_ERROR: SdkErrorClassification = { kind: \"other\", retryable: false };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction errorText(error: unknown): string {\n\tif (typeof error === \"string\") return error;\n\tif (error instanceof Error) return error.message;\n\tconst value = record(error);\n\tif (!value) return String(error);\n\tconst message = value.message;\n\tif (typeof message === \"string\") return message;\n\tconst code = value.error;\n\tif (typeof code === \"string\") return code;\n\treturn String(error);\n}\n\n/** Classifies Claude SDK OAuth error codes and HTTP-shaped fallback text in one place. */\nexport function classifySdkError(error: unknown): SdkErrorClassification {\n\tconst text = errorText(error).toLowerCase();\n\tfor (const [code, classification] of Object.entries(SDK_ERROR_CLASSIFICATIONS)) {\n\t\tif (new RegExp(`\\\\b${code}\\\\b`).test(text)) return classification;\n\t}\n\tif (/\\b(?:http\\s*)?429\\b|too many requests|rate[ _-]?limit/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\t// Claude Code signals subscription exhaustion two ways, neither of which\n\t// carries an SDK error code or HTTP status:\n\t// - `terminal_reason: \"blocking_limit\"` / `\"rapid_refill_breaker\"` on a\n\t// result message (surfaced by auth-lane's sdkFailure)\n\t// - prose in `errors[0]`, e.g. \"You've hit your weekly limit · resets 5am\n\t// (Asia/Seoul)\" and the 5-hour/daily equivalents\n\t// Without these branches both classify as non-retryable \"other\", so the\n\t// exhausted account is never blocked and a pool never rotates past it.\n\tif (/\\bblocking_limit\\b|\\brapid_refill_breaker\\b/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\tif (/\\b(?:hit|reached|exceeded)\\b[^.]*\\blimit\\b|\\b(?:weekly|daily|hourly|usage)\\s+limit\\b/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\tif (/\\b(?:http\\s*)?529\\b|overloaded/.test(text)) return { kind: \"overloaded\", retryable: true };\n\treturn OTHER_ERROR;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/errors.ts"],"names":[],"mappings":"AAiBA,MAAM,yBAAyB,GAAsE;IACpG,qBAAqB,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;IAC9D,qBAAqB,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE;IACnE,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IACnD,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;IACnD,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;IACnD,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;IACpD,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;IAChD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IACrD,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;IACpD,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;CACtD,CAAC;AAEF,MAAM,WAAW,GAA2B,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAEhF,SAAS,MAAM,CAAC,KAAc;IAC7B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1E,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAID,sFAAsF;AACtF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAG1C,YAAY,OAAe,EAAE,KAAiC;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;CACD;AAED,mGAAmG;AACnG,MAAM,UAAU,qBAAqB,CAAC,KAAc;IACnD,IAAI,KAAK,YAAY,gBAAgB;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACxC,OAAO,OAAO,YAAY,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgD;IAChF,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACjF,MAAM,MAAM,GAAG,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1G,MAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1G,MAAM,MAAM,GACX,UAAU;QACV,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,eAAe,OAAO,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,MAAM,GACX,kBAAkB,IAAI,OAAO,IAAI,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7G,MAAM,MAAM,GACX,iBAAiB,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5G,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAmD;IACtF,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACxC,MAAM,IAAI,GAAG,CACZ,OAAO,OAAO,KAAK,QAAQ;QAC1B,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO;aACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;aAC7F,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACrF,IAAI,CAAC,GAAG,CAAC,CACb,CAAC,IAAI,EAAE,CAAC;IACT,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9G,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,IACC,kLAAkL,CAAC,IAAI,CACtL,IAAI,CACJ,EACA,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAChF,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,cAAc,IAAI,WAAW,CAAC;IAClF,CAAC;IACD,IAAI,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,yEAAyE;IACzE,4CAA4C;IAC5C,0EAA0E;IAC1E,0DAA0D;IAC1D,4EAA4E;IAC5E,qDAAqD;IACrD,wEAAwE;IACxE,uEAAuE;IACvE,IAAI,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,sFAAsF,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvG,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChG,IAAI,0EAA0E,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3F,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,2EAA2E;IAC3E,2EAA2E;IAC3E,kEAAkE;IAClE,IAAI,mEAAmE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpF,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC","sourcesContent":["import type { SDKAssistantMessageError } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { SDKMessage } from \"./sdk-boundary.ts\";\n\nexport type SdkErrorKind =\n\t| \"rate_limit\"\n\t| \"overloaded\"\n\t| \"auth_error\"\n\t| \"billing\"\n\t| \"org_not_allowed\"\n\t| \"entitlement\"\n\t| \"other\";\n\nexport type SdkErrorClassification = {\n\tkind: SdkErrorKind;\n\tretryable: boolean;\n};\n\nconst SDK_ERROR_CLASSIFICATIONS: Partial<Record<SDKAssistantMessageError, SdkErrorClassification>> = {\n\tauthentication_failed: { kind: \"auth_error\", retryable: true },\n\toauth_org_not_allowed: { kind: \"org_not_allowed\", retryable: true },\n\tbilling_error: { kind: \"billing\", retryable: true },\n\trate_limit: { kind: \"rate_limit\", retryable: true },\n\toverloaded: { kind: \"overloaded\", retryable: true },\n\tinvalid_request: { kind: \"other\", retryable: false },\n\tserver_error: { kind: \"other\", retryable: true },\n\taccount_on_hold: { kind: \"billing\", retryable: true },\n\tmodel_not_found: { kind: \"other\", retryable: false },\n\tmax_output_tokens: { kind: \"other\", retryable: false },\n};\n\nconst OTHER_ERROR: SdkErrorClassification = { kind: \"other\", retryable: false };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction errorText(error: unknown): string {\n\tif (typeof error === \"string\") return error;\n\tif (error instanceof Error) return error.message;\n\tconst value = record(error);\n\tif (!value) return String(error);\n\tconst message = value.message;\n\tif (typeof message === \"string\") return message;\n\tconst code = value.error;\n\tif (typeof code === \"string\") return code;\n\treturn String(error);\n}\n\nexport type SdkResultUsage = Extract<SDKMessage, { type: \"result\" }>[\"usage\"];\n\n/** A failed SDK result keeps the usage it billed so every lane can account for it. */\nexport class SdkResultFailure extends Error {\n\treadonly usage: SdkResultUsage | undefined;\n\n\tconstructor(message: string, usage: SdkResultUsage | undefined) {\n\t\tsuper(message);\n\t\tthis.name = \"SdkResultFailure\";\n\t\tthis.usage = usage;\n\t}\n}\n\n/** The usage carried by a failed SDK result, looking through failover's classification wrapper. */\nexport function sdkResultFailureUsage(error: unknown): SdkResultUsage | undefined {\n\tif (error instanceof SdkResultFailure) return error.usage;\n\tconst wrapped = record(error)?.original;\n\treturn wrapped instanceof SdkResultFailure ? wrapped.usage : undefined;\n}\n\nexport function sdkResultFailure(message: Extract<SDKMessage, { type: \"result\" }>): SdkResultFailure | undefined {\n\tif (message.subtype === \"success\" && message.is_error !== true) return undefined;\n\tconst errors = \"errors\" in message && Array.isArray(message.errors) ? message.errors : [];\n\tconst firstError = errors.find((error): error is string => typeof error === \"string\" && error.length > 0);\n\tconst resultText = \"result\" in message && typeof message.result === \"string\" ? message.result.trim() : \"\";\n\tconst detail =\n\t\tfirstError ??\n\t\t(message.is_error === true && resultText ? resultText : undefined) ??\n\t\t`Claude Code ${message.subtype}`;\n\tconst status =\n\t\t\"api_error_status\" in message && message.api_error_status != null ? `HTTP ${message.api_error_status}` : \"\";\n\tconst reason =\n\t\t\"terminal_reason\" in message && typeof message.terminal_reason === \"string\" ? message.terminal_reason : \"\";\n\tconst suffix = [status, reason].filter(Boolean).join(\", \");\n\treturn new SdkResultFailure(suffix ? `${detail} (${suffix})` : detail, message.usage);\n}\n\nexport function sdkAssistantFailure(message: Extract<SDKMessage, { type: \"assistant\" }>): Error | undefined {\n\tif (!message.error) return undefined;\n\tconst content = message.message.content;\n\tconst text = (\n\t\ttypeof content === \"string\"\n\t\t\t? content\n\t\t\t: content\n\t\t\t\t\t.filter((block) => block.type === \"text\" && \"text\" in block && typeof block.text === \"string\")\n\t\t\t\t\t.map((block) => (\"text\" in block && typeof block.text === \"string\" ? block.text : \"\"))\n\t\t\t\t\t.join(\" \")\n\t).trim();\n\treturn new Error(text ? (message.error === \"unknown\" ? text : `${text} (${message.error})`) : message.error);\n}\n\n/** Classifies Claude SDK OAuth error codes and HTTP-shaped fallback text in one place. */\nexport function classifySdkError(error: unknown): SdkErrorClassification {\n\tconst text = errorText(error).toLowerCase();\n\tif (\n\t\t/\\b(enotfound|eai_again|econnreset|econnrefused|etimedout|enetunreach|ehostunreach|und_err_connect_timeout|und_err_socket)\\b|fetch failed|socket hang up|connection reset by peer/.test(\n\t\t\ttext,\n\t\t)\n\t) {\n\t\treturn { kind: \"other\", retryable: true };\n\t}\n\tfor (const [code, classification] of Object.entries(SDK_ERROR_CLASSIFICATIONS)) {\n\t\tif (new RegExp(`\\\\b${code}\\\\b`).test(text)) return classification ?? OTHER_ERROR;\n\t}\n\tif (/\\b(?:http\\s*)?429\\b|too many requests|rate[ _-]?limit/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\t// Claude Code signals subscription exhaustion two ways, neither of which\n\t// carries an SDK error code or HTTP status:\n\t// - `terminal_reason: \"blocking_limit\"` / `\"rapid_refill_breaker\"` on a\n\t// result message (surfaced by auth-lane's sdkFailure)\n\t// - prose in `errors[0]`, e.g. \"You've hit your weekly limit · resets 5am\n\t// (Asia/Seoul)\" and the 5-hour/daily equivalents\n\t// Without these branches both classify as non-retryable \"other\", so the\n\t// exhausted account is never blocked and a pool never rotates past it.\n\tif (/\\bblocking_limit\\b|\\brapid_refill_breaker\\b/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\tif (/\\b(?:hit|reached|exceeded)\\b[^.]*\\blimit\\b|\\b(?:weekly|daily|hourly|usage)\\s+limit\\b/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\tif (/\\b(?:http\\s*)?529\\b|overloaded/.test(text)) return { kind: \"overloaded\", retryable: true };\n\tif (/\\binvalid_grant\\b|\\binvalid_token\\b|\\b(?:http\\s*)?401\\b|\\bunauthorized\\b/.test(text)) {\n\t\treturn { kind: \"auth_error\", retryable: true };\n\t}\n\t// Fable 5 and similar models are not in the subscription; Claude Code asks\n\t// for usage credits. That is an account entitlement, not a 60s rate limit:\n\t// blocking the only account would also block Opus fallback on it.\n\tif (/\\brequires usage credits\\b|\\/usage-credits\\b|\\bcredits_required\\b/.test(text)) {\n\t\treturn { kind: \"entitlement\", retryable: false };\n\t}\n\treturn OTHER_ERROR;\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { SdkErrorKind } from "./errors.ts";
|
|
2
2
|
export declare function noAccountGuidance(hasAnthropicCredential: boolean): string;
|
|
3
3
|
export declare function allAccountsBlockedGuidance(soonestUnblockAt: number | undefined): string;
|
|
4
|
+
export declare function claudeCodeVersionFloorGuidance(text: string): string | undefined;
|
|
4
5
|
export declare function sdkErrorGuidance(kind: SdkErrorKind): string | undefined;
|
|
5
6
|
export declare function missingBinaryGuidance(platform: string, arch: string): string;
|
|
6
7
|
export type SystemPromptMode = "full" | "override" | "preset-append";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guidance.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/guidance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAgB,iBAAiB,CAAC,sBAAsB,EAAE,OAAO,GAAG,MAAM,CAazE;AAED,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAWvF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"guidance.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/guidance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAgB,iBAAiB,CAAC,sBAAsB,EAAE,OAAO,GAAG,MAAM,CAazE;AAED,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAWvF;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa/E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAavE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,eAAe,CAAC;AAErE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7F;AAID,wBAAgB,4BAA4B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAMrE;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACxD,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,SAAS,CAqBrB"}
|
|
@@ -21,6 +21,17 @@ export function allAccountsBlockedGuidance(soonestUnblockAt) {
|
|
|
21
21
|
` /login ${PROVIDER} - add another account`,
|
|
22
22
|
].join("\n");
|
|
23
23
|
}
|
|
24
|
+
export function claudeCodeVersionFloorGuidance(text) {
|
|
25
|
+
const floor = /does not support this model; version (\S+?) or newer is required|claude_code_version_too_old/i.exec(text);
|
|
26
|
+
if (floor) {
|
|
27
|
+
const target = floor[1] === undefined ? "a newer Claude Code" : `Claude Code ${floor[1].replace(/[.,;:]+$/, "")} or newer`;
|
|
28
|
+
return `The bundled Claude Code binary is too old for this model. Update senpi/omo (it ships a newer @anthropic-ai/claude-agent-sdk) or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`;
|
|
29
|
+
}
|
|
30
|
+
if (/\bmodel_not_found\b|unrecognized_model|not found for provider/i.test(text)) {
|
|
31
|
+
return "The bundled Claude Code binary does not know this model id; update senpi/omo or set CLAUDE_CODE_EXECUTABLE to a newer Claude Code binary.";
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
24
35
|
export function sdkErrorGuidance(kind) {
|
|
25
36
|
switch (kind) {
|
|
26
37
|
case "org_not_allowed":
|
|
@@ -29,6 +40,8 @@ export function sdkErrorGuidance(kind) {
|
|
|
29
40
|
return "The selected Claude account has a billing problem. Check the plan at claude.com or switch accounts with /claude-account pin <name>.";
|
|
30
41
|
case "auth_error":
|
|
31
42
|
return `The account's OAuth token was rejected. Re-run /login ${PROVIDER} to refresh it, or remove the account with /claude-account remove <name>.`;
|
|
43
|
+
case "entitlement":
|
|
44
|
+
return "This model needs usage credits on the selected Claude account (it is not included in the subscription). Switch models with /model, enable usage credits at claude.com, or pick another account with /claude-account pin <name>.";
|
|
32
45
|
default:
|
|
33
46
|
return undefined;
|
|
34
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guidance.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/guidance.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,MAAM,UAAU,iBAAiB,CAAC,sBAA+B;IAChE,MAAM,KAAK,GAAG;QACb,oCAAoC,QAAQ,GAAG;QAC/C,YAAY,QAAQ,mDAAmD;KACvE,CAAC;IACF,IAAI,sBAAsB,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACpF,CAAC;IACD,KAAK,CAAC,IAAI,CACT,kEAAkE,EAClE,mDAAmD,CACnD,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,gBAAoC;IAC9E,MAAM,GAAG,GACR,gBAAgB,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAClE,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE;QAC1C,CAAC,CAAC,gBAAgB,CAAC;IACrB,OAAO;QACN,2BAA2B,QAAQ,qDAAqD;QACxF,8BAA8B,GAAG,GAAG;QACpC,kDAAkD;QAClD,YAAY,QAAQ,yBAAyB;KAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IAClD,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,iBAAiB;YACrB,OAAO,kJAAkJ,CAAC;QAC3J,KAAK,SAAS;YACb,OAAO,qIAAqI,CAAC;QAC9I,KAAK,YAAY;YAChB,OAAO,yDAAyD,QAAQ,2EAA2E,CAAC;QACrJ;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,IAAY;IACnE,OAAO;QACN,sCAAsC,QAAQ,IAAI,IAAI,GAAG;QACzD,kGAAkG;KAClG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAID,MAAM,UAAU,4BAA4B,CAAC,IAAwB,EAAE,MAAc;IACpF,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,qBAAqB,IAAI,GAAG,CAAC;IACtF,OAAO;QACN,mDAAmD,MAAM,KAAK,MAAM,GAAG;QACvE,4HAA4H;KAC5H,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;AAExC,MAAM,UAAU,4BAA4B,CAAC,SAAkB;IAC9D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7B,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACP,aAAa,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,OAI/C;IACA,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,KAAK,eAAe,CAAC;IACtD,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,YAAY,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CACT,kDAAkD;YACjD,yDAAyD;YACzD,kDAAkD,CACnD,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC","sourcesContent":["import type { SdkErrorKind } from \"./errors.ts\";\n\nconst PROVIDER = \"claude-sdk-oauth\";\n\nexport function noAccountGuidance(hasAnthropicCredential: boolean): string {\n\tconst lines = [\n\t\t`No Claude account configured for ${PROVIDER}.`,\n\t\t` /login ${PROVIDER} - sign in with your Claude Pro/Max subscription`,\n\t];\n\tif (hasAnthropicCredential) {\n\t\tlines.push(\" (your existing Anthropic OAuth login will be offered as an import)\");\n\t}\n\tlines.push(\n\t\t\" Or set CLAUDE_CODE_OAUTH_TOKEN (and _2.._N for more accounts),\",\n\t\t\" or log in with the claude CLI for ambient auth.\",\n\t);\n\treturn lines.join(\"\\n\");\n}\n\nexport function allAccountsBlockedGuidance(soonestUnblockAt: number | undefined): string {\n\tconst eta =\n\t\tsoonestUnblockAt !== undefined && Number.isFinite(soonestUnblockAt)\n\t\t\t? new Date(soonestUnblockAt).toISOString()\n\t\t\t: \"after re-login\";\n\treturn [\n\t\t`All Claude accounts for ${PROVIDER} are currently blocked (rate limit or auth errors).`,\n\t\t` Soonest automatic retry: ${eta}.`,\n\t\t` /claude-account list - inspect account states`,\n\t\t` /login ${PROVIDER} - add another account`,\n\t].join(\"\\n\");\n}\n\nexport function sdkErrorGuidance(kind: SdkErrorKind): string | undefined {\n\tswitch (kind) {\n\t\tcase \"org_not_allowed\":\n\t\t\treturn \"This organization's policy disallows subscription OAuth use here. Use an API key (ANTHROPIC_API_KEY) or an account from an allowed organization.\";\n\t\tcase \"billing\":\n\t\t\treturn \"The selected Claude account has a billing problem. Check the plan at claude.com or switch accounts with /claude-account pin <name>.\";\n\t\tcase \"auth_error\":\n\t\t\treturn `The account's OAuth token was rejected. Re-run /login ${PROVIDER} to refresh it, or remove the account with /claude-account remove <name>.`;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nexport function missingBinaryGuidance(platform: string, arch: string): string {\n\treturn [\n\t\t`Claude native binary not found for ${platform}-${arch}.`,\n\t\t\"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, or set CLAUDE_CODE_EXECUTABLE.\",\n\t].join(\"\\n\");\n}\n\nexport type SystemPromptMode = \"full\" | \"override\" | \"preset-append\";\n\nexport function overrideSystemPromptGuidance(path: string | undefined, reason: string): string {\n\tconst target = path === undefined ? \"systemPromptFile\" : `systemPromptFile \"${path}\"`;\n\treturn [\n\t\t`Claude SDK OAuth override prompt could not load ${target}: ${reason}.`,\n\t\t'Set claudeSdkOauthProvider.systemPromptFile to a readable, non-empty UTF-8 prompt file, or select systemPromptMode \"full\".',\n\t].join(\" \");\n}\n\nconst armedSessions = new Set<string>();\n\nexport function resetPresetAppendDeprecation(sessionId?: string): void {\n\tif (sessionId !== undefined) {\n\t\tarmedSessions.delete(sessionId);\n\t} else {\n\t\tarmedSessions.clear();\n\t}\n}\n\nexport function presetAppendDeprecationGuidance(options: {\n\tmode: SystemPromptMode;\n\tconflict?: boolean;\n\tsessionId: string;\n}): string | undefined {\n\tif (armedSessions.has(options.sessionId)) {\n\t\treturn undefined;\n\t}\n\tconst isDeprecated = options.mode === \"preset-append\";\n\tif (!options.conflict && !isDeprecated) {\n\t\treturn undefined;\n\t}\n\tarmedSessions.add(options.sessionId);\n\tconst parts: string[] = [];\n\tif (isDeprecated) {\n\t\tparts.push(\n\t\t\t\"preset-append system-prompt mode is deprecated; \" +\n\t\t\t\t\"`full` mode delivers the complete senpi system prompt; \" +\n\t\t\t\t\"preset-append will be removed after one release.\",\n\t\t);\n\t}\n\tif (options.conflict) {\n\t\tparts.push(\"systemPromptMode wins.\");\n\t}\n\treturn parts.join(\" \");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"guidance.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/guidance.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SdkErrorKind } from \"./errors.ts\";\n\nconst PROVIDER = \"claude-sdk-oauth\";\n\nexport function noAccountGuidance(hasAnthropicCredential: boolean): string {\n\tconst lines = [\n\t\t`No Claude account configured for ${PROVIDER}.`,\n\t\t` /login ${PROVIDER} - sign in with your Claude Pro/Max subscription`,\n\t];\n\tif (hasAnthropicCredential) {\n\t\tlines.push(\" (your existing Anthropic OAuth login will be offered as an import)\");\n\t}\n\tlines.push(\n\t\t\" Or set CLAUDE_CODE_OAUTH_TOKEN (and _2.._N for more accounts),\",\n\t\t\" or log in with the claude CLI for ambient auth.\",\n\t);\n\treturn lines.join(\"\\n\");\n}\n\nexport function allAccountsBlockedGuidance(soonestUnblockAt: number | undefined): string {\n\tconst eta =\n\t\tsoonestUnblockAt !== undefined && Number.isFinite(soonestUnblockAt)\n\t\t\t? new Date(soonestUnblockAt).toISOString()\n\t\t\t: \"after re-login\";\n\treturn [\n\t\t`All Claude accounts for ${PROVIDER} are currently blocked (rate limit or auth errors).`,\n\t\t` Soonest automatic retry: ${eta}.`,\n\t\t` /claude-account list - inspect account states`,\n\t\t` /login ${PROVIDER} - add another account`,\n\t].join(\"\\n\");\n}\n\nexport function claudeCodeVersionFloorGuidance(text: string): string | undefined {\n\tconst floor = /does not support this model; version (\\S+?) or newer is required|claude_code_version_too_old/i.exec(\n\t\ttext,\n\t);\n\tif (floor) {\n\t\tconst target =\n\t\t\tfloor[1] === undefined ? \"a newer Claude Code\" : `Claude Code ${floor[1].replace(/[.,;:]+$/, \"\")} or newer`;\n\t\treturn `The bundled Claude Code binary is too old for this model. Update senpi/omo (it ships a newer @anthropic-ai/claude-agent-sdk) or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`;\n\t}\n\tif (/\\bmodel_not_found\\b|unrecognized_model|not found for provider/i.test(text)) {\n\t\treturn \"The bundled Claude Code binary does not know this model id; update senpi/omo or set CLAUDE_CODE_EXECUTABLE to a newer Claude Code binary.\";\n\t}\n\treturn undefined;\n}\n\nexport function sdkErrorGuidance(kind: SdkErrorKind): string | undefined {\n\tswitch (kind) {\n\t\tcase \"org_not_allowed\":\n\t\t\treturn \"This organization's policy disallows subscription OAuth use here. Use an API key (ANTHROPIC_API_KEY) or an account from an allowed organization.\";\n\t\tcase \"billing\":\n\t\t\treturn \"The selected Claude account has a billing problem. Check the plan at claude.com or switch accounts with /claude-account pin <name>.\";\n\t\tcase \"auth_error\":\n\t\t\treturn `The account's OAuth token was rejected. Re-run /login ${PROVIDER} to refresh it, or remove the account with /claude-account remove <name>.`;\n\t\tcase \"entitlement\":\n\t\t\treturn \"This model needs usage credits on the selected Claude account (it is not included in the subscription). Switch models with /model, enable usage credits at claude.com, or pick another account with /claude-account pin <name>.\";\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nexport function missingBinaryGuidance(platform: string, arch: string): string {\n\treturn [\n\t\t`Claude native binary not found for ${platform}-${arch}.`,\n\t\t\"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, or set CLAUDE_CODE_EXECUTABLE.\",\n\t].join(\"\\n\");\n}\n\nexport type SystemPromptMode = \"full\" | \"override\" | \"preset-append\";\n\nexport function overrideSystemPromptGuidance(path: string | undefined, reason: string): string {\n\tconst target = path === undefined ? \"systemPromptFile\" : `systemPromptFile \"${path}\"`;\n\treturn [\n\t\t`Claude SDK OAuth override prompt could not load ${target}: ${reason}.`,\n\t\t'Set claudeSdkOauthProvider.systemPromptFile to a readable, non-empty UTF-8 prompt file, or select systemPromptMode \"full\".',\n\t].join(\" \");\n}\n\nconst armedSessions = new Set<string>();\n\nexport function resetPresetAppendDeprecation(sessionId?: string): void {\n\tif (sessionId !== undefined) {\n\t\tarmedSessions.delete(sessionId);\n\t} else {\n\t\tarmedSessions.clear();\n\t}\n}\n\nexport function presetAppendDeprecationGuidance(options: {\n\tmode: SystemPromptMode;\n\tconflict?: boolean;\n\tsessionId: string;\n}): string | undefined {\n\tif (armedSessions.has(options.sessionId)) {\n\t\treturn undefined;\n\t}\n\tconst isDeprecated = options.mode === \"preset-append\";\n\tif (!options.conflict && !isDeprecated) {\n\t\treturn undefined;\n\t}\n\tarmedSessions.add(options.sessionId);\n\tconst parts: string[] = [];\n\tif (isDeprecated) {\n\t\tparts.push(\n\t\t\t\"preset-append system-prompt mode is deprecated; \" +\n\t\t\t\t\"`full` mode delivers the complete senpi system prompt; \" +\n\t\t\t\t\"preset-append will be removed after one release.\",\n\t\t);\n\t}\n\tif (options.conflict) {\n\t\tparts.push(\"systemPromptMode wins.\");\n\t}\n\treturn parts.join(\" \");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-login.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/oauth-login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,SAAS,EACT,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAEhB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAGN,KAAK,wBAAwB,EAI7B,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,mBAAmB,GAAG;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,MAAM,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;AAE1F,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,KAAK,EAAE;QACZ,GAAG,EAAE,WAAW,CAAC;QACjB,UAAU,CAAC,EAAE,eAAe,CAAC;QAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACnC;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE;QACrB,GAAG,EAAE,WAAW,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACpC,KAAK,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjE,YAAY,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,SAAS,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,qBAAqB,sCAAsC,CAAC;AAqCzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACvC,WAAW,EAAE,uBAAuB,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC1G,qBAAqB,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,YAAY,CAAC,EAAE,MAAM;QAAE,cAAc,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAClH,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"oauth-login.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/oauth-login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,SAAS,EACT,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAEhB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAGN,KAAK,wBAAwB,EAI7B,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,mBAAmB,GAAG;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,MAAM,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;AAE1F,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,KAAK,EAAE;QACZ,GAAG,EAAE,WAAW,CAAC;QACjB,UAAU,CAAC,EAAE,eAAe,CAAC;QAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACnC;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE;QACrB,GAAG,EAAE,WAAW,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACpC,KAAK,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjE,YAAY,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,SAAS,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,qBAAqB,sCAAsC,CAAC;AAqCzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACvC,WAAW,EAAE,uBAAuB,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC1G,qBAAqB,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,YAAY,CAAC,EAAE,MAAM;QAAE,cAAc,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAClH,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,gBAAgB,CA4GnB"}
|
|
@@ -40,9 +40,14 @@ export function createOAuthConfig(deps) {
|
|
|
40
40
|
/** Single predicate behind both `check` and `resolveAmbient`, so availability and resolution cannot disagree. */
|
|
41
41
|
const configuredFor = async (ctx, stored, signal, environment) => {
|
|
42
42
|
const storedAccounts = stored?.type === "oauth" && Array.isArray(stored.accounts) ? stored.accounts : [];
|
|
43
|
+
// Slot-scoped resolution projects one account onto the flat credential shape,
|
|
44
|
+
// stripping `accounts`; its concrete (non-sentinel) tokens are that account.
|
|
45
|
+
const selectedStoredAccount = stored?.type === "oauth" &&
|
|
46
|
+
stored.access !== SENTINEL_OAUTH_FIELDS.access &&
|
|
47
|
+
stored.refresh !== SENTINEL_OAUTH_FIELDS.refresh;
|
|
43
48
|
const effectiveEnvironment = environment ?? (await claudeEnvironment(ctx));
|
|
44
49
|
const environmentTokenCount = Object.values(effectiveEnvironment).filter(Boolean).length;
|
|
45
|
-
const accountCount = storedAccounts.length + environmentTokenCount;
|
|
50
|
+
const accountCount = storedAccounts.length + (selectedStoredAccount ? 1 : 0) + environmentTokenCount;
|
|
46
51
|
const settings = deps.readSettings?.();
|
|
47
52
|
const lane = settings?.tokenInjection ?? (accountCount > 0 ? "oauth-slots" : "ambient");
|
|
48
53
|
if (lane === "ambient") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-login.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/oauth-login.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAuthCheck,\n\tAuthContext,\n\tAuthResult,\n\tOAuthAuth,\n\tOAuthCredential,\n\tOAuthCredentials,\n\tProviderAuthInteraction,\n} from \"@earendil-works/pi-ai\";\nimport { loadAnthropicOAuth } from \"@earendil-works/pi-ai/oauth\";\nimport {\n\ttype AccountSlot,\n\taddAccount,\n\ttype ClaudeSdkOauthCredential,\n\temptyCredential,\n\tlistAccounts,\n\tSENTINEL_OAUTH_FIELDS,\n} from \"./accounts.ts\";\nimport { readAmbientClaudeAuthStatus } from \"./availability.ts\";\n\nexport type OAuthLoginCallbacks = {\n\tsignal?: AbortSignal;\n\tonAuth?: (event: { url: string }) => void | Promise<void>;\n\tonPrompt?: (prompt: { message: string; placeholder?: string }) => Promise<string>;\n\tonManualCodeInput?: () => Promise<string>;\n\tonProgress?: (message: string) => void;\n};\n\nexport type CurrentCredentialReader = () => Promise<ClaudeSdkOauthCredential | undefined>;\n\nexport type OAuthConfigShape = {\n\tname: string;\n\tcheck(input: {\n\t\tctx: AuthContext;\n\t\tcredential?: OAuthCredential;\n\t\tsignal?: AbortSignal;\n\t}): Promise<AuthCheck | undefined>;\n\t/**\n\t * Request auth for the ambient lane — an environment OAuth token or a\n\t * logged-in Claude CLI — used when auth.json holds no managed accounts.\n\t * The SDK subprocess authenticates itself in that lane, so the sentinel is\n\t * the whole credential; without this the provider passes `check` and then\n\t * fails every request with \"Provider is not configured\".\n\t */\n\tresolveAmbient(input: {\n\t\tctx: AuthContext;\n\t\tenv?: Record<string, string>;\n\t\tsignal?: AbortSignal;\n\t}): Promise<AuthResult | undefined>;\n\tlogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;\n\trefreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;\n\tgetApiKey(credentials: OAuthCredentials): string;\n};\n\nexport const CLAUDE_SDK_OAUTH_NAME = \"Claude SDK OAuth (Claude Pro/Max)\";\nconst ENV_TOKEN_NAMES = [\n\t\"CLAUDE_CODE_OAUTH_TOKEN\",\n\t...Array.from({ length: 15 }, (_, index) => `CLAUDE_CODE_OAUTH_TOKEN_${index + 2}`),\n] as const;\nconst ENV_TOKEN_NAME_SET = new Set<string>(ENV_TOKEN_NAMES);\nconst AUTH_CHECK = { source: \"Claude SDK OAuth\", type: \"oauth\" } as const;\n\nfunction requestClaudeEnvironment(value: unknown): Record<string, string> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n\tconst environment: Record<string, string> = {};\n\tfor (const [name, entry] of Object.entries(value)) {\n\t\tif (ENV_TOKEN_NAME_SET.has(name) && typeof entry === \"string\") environment[name] = entry;\n\t}\n\treturn environment;\n}\n\nfunction toSlot(\n\tcredential: { access: string; refresh: string; expires: number },\n\tname: string,\n\tsource: AccountSlot[\"source\"],\n): AccountSlot {\n\treturn { name, access: credential.access, refresh: credential.refresh, expires: credential.expires, source };\n}\n\nasync function promptAccountName(callbacks: OAuthLoginCallbacks, existing: AccountSlot[]): Promise<string> {\n\tif (existing.length === 0) return \"default\";\n\tif (!callbacks.onPrompt) return `account-${existing.length + 1}`;\n\tconst answer = (\n\t\tawait callbacks.onPrompt({\n\t\t\tmessage: `Name for this account (existing: ${existing.map((slot) => slot.name).join(\", \")})`,\n\t\t\tplaceholder: `account-${existing.length + 1}`,\n\t\t})\n\t).trim();\n\treturn answer || `account-${existing.length + 1}`;\n}\n\nexport function createOAuthConfig(deps: {\n\treadCurrent: CurrentCredentialReader;\n\treadAnthropicCredential?: () => Promise<{ access: string; refresh: string; expires: number } | undefined>;\n\treadAmbientAuthStatus?: (signal?: AbortSignal) => Promise<boolean>;\n\treadSettings?: () => { tokenInjection?: \"oauth-slots\" | \"config-dir\" | \"ambient\"; enabled?: boolean } | undefined;\n\tloginFlow?: OAuthAuth;\n}): OAuthConfigShape {\n\tconst claudeEnvironment = async (ctx: AuthContext): Promise<Record<string, string>> => {\n\t\tconst entries = await Promise.all(ENV_TOKEN_NAMES.map(async (name) => [name, await ctx.env(name)] as const));\n\t\treturn Object.fromEntries(entries.filter((entry): entry is readonly [string, string] => entry[1] !== undefined));\n\t};\n\n\t/** Single predicate behind both `check` and `resolveAmbient`, so availability and resolution cannot disagree. */\n\tconst configuredFor = async (\n\t\tctx: AuthContext,\n\t\tstored: ClaudeSdkOauthCredential | undefined,\n\t\tsignal?: AbortSignal,\n\t\tenvironment?: Record<string, string>,\n\t): Promise<boolean> => {\n\t\tconst storedAccounts = stored?.type === \"oauth\" && Array.isArray(stored.accounts) ? stored.accounts : [];\n\t\tconst effectiveEnvironment = environment ?? (await claudeEnvironment(ctx));\n\t\tconst environmentTokenCount = Object.values(effectiveEnvironment).filter(Boolean).length;\n\t\tconst accountCount = storedAccounts.length + environmentTokenCount;\n\t\tconst settings = deps.readSettings?.();\n\t\tconst lane = settings?.tokenInjection ?? (accountCount > 0 ? \"oauth-slots\" : \"ambient\");\n\t\tif (lane === \"ambient\") {\n\t\t\tif (environmentTokenCount > 0) return true;\n\t\t\t// A logged-in host Claude CLI is not senpi-side consent: spending the\n\t\t\t// user's Claude subscription requires an explicit opt-in. Stored\n\t\t\t// accounts and env tokens above are opt-ins in themselves.\n\t\t\tif (settings?.enabled !== true) return false;\n\t\t\treturn (deps.readAmbientAuthStatus ?? readAmbientClaudeAuthStatus)(signal);\n\t\t}\n\t\treturn accountCount > 0;\n\t};\n\n\treturn {\n\t\tname: CLAUDE_SDK_OAUTH_NAME,\n\n\t\tasync check({ ctx, credential, signal }) {\n\t\t\tconst requestEnvironment = requestClaudeEnvironment(credential?.env);\n\t\t\treturn (await configuredFor(\n\t\t\t\tctx,\n\t\t\t\tcredential as ClaudeSdkOauthCredential | undefined,\n\t\t\t\tsignal,\n\t\t\t\tObject.keys(requestEnvironment).length > 0 ? requestEnvironment : undefined,\n\t\t\t))\n\t\t\t\t? AUTH_CHECK\n\t\t\t\t: undefined;\n\t\t},\n\n\t\tasync resolveAmbient({ ctx, env, signal }) {\n\t\t\tconst requestEnvironment = requestClaudeEnvironment(env);\n\t\t\tconst environment =\n\t\t\t\tObject.keys(requestEnvironment).length > 0 ? requestEnvironment : await claudeEnvironment(ctx);\n\t\t\tif (!(await configuredFor(ctx, undefined, signal, environment))) return undefined;\n\t\t\treturn {\n\t\t\t\tauth: { apiKey: SENTINEL_OAUTH_FIELDS.access },\n\t\t\t\t...(Object.keys(environment).length > 0 ? { env: environment } : {}),\n\t\t\t\tsource: AUTH_CHECK.source,\n\t\t\t};\n\t\t},\n\n\t\tasync login(callbacks) {\n\t\t\tconst current = (await deps.readCurrent()) ?? emptyCredential();\n\t\t\tconst existing = listAccounts(current);\n\t\t\tif (existing.length === 0 && deps.readAnthropicCredential && callbacks.onPrompt) {\n\t\t\t\tconst imported = await deps.readAnthropicCredential();\n\t\t\t\tif (imported) {\n\t\t\t\t\tconst answer = (\n\t\t\t\t\t\tawait callbacks.onPrompt({\n\t\t\t\t\t\t\tmessage: \"An Anthropic OAuth login already exists. Import it instead of a new login? [y/N]\",\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t\t\t.trim()\n\t\t\t\t\t\t.toLowerCase();\n\t\t\t\t\tif (answer === \"y\" || answer === \"yes\") {\n\t\t\t\t\t\treturn addAccount(current, toSlot(imported, \"imported-anthropic\", \"import\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst interaction: ProviderAuthInteraction = {\n\t\t\t\tsignal: callbacks.signal ?? new AbortController().signal,\n\t\t\t\tprompt: async (prompt) => {\n\t\t\t\t\tif (prompt.type === \"select\") return \"\";\n\t\t\t\t\treturn callbacks.onPrompt ? callbacks.onPrompt({ message: prompt.message }) : \"\";\n\t\t\t\t},\n\t\t\t\tnotify: (event) => {\n\t\t\t\t\tif (event.type === \"auth_url\" && callbacks.onAuth) void callbacks.onAuth({ url: event.url });\n\t\t\t\t\tif (event.type === \"progress\" && callbacks.onProgress) callbacks.onProgress(event.message);\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst flow = deps.loginFlow ?? (await loadAnthropicOAuth());\n\t\t\tconst credential = await flow.login(interaction);\n\n\t\t\tconst existingAfter = listAccounts(current);\n\t\t\tconst name = await promptAccountName(callbacks, existingAfter);\n\t\t\treturn addAccount(current, toSlot(credential, name, \"login\"));\n\t\t},\n\n\t\tasync refreshToken(credentials) {\n\t\t\treturn credentials;\n\t\t},\n\n\t\tgetApiKey(_credentials) {\n\t\t\treturn SENTINEL_OAUTH_FIELDS.access;\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oauth-login.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/oauth-login.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAuthCheck,\n\tAuthContext,\n\tAuthResult,\n\tOAuthAuth,\n\tOAuthCredential,\n\tOAuthCredentials,\n\tProviderAuthInteraction,\n} from \"@earendil-works/pi-ai\";\nimport { loadAnthropicOAuth } from \"@earendil-works/pi-ai/oauth\";\nimport {\n\ttype AccountSlot,\n\taddAccount,\n\ttype ClaudeSdkOauthCredential,\n\temptyCredential,\n\tlistAccounts,\n\tSENTINEL_OAUTH_FIELDS,\n} from \"./accounts.ts\";\nimport { readAmbientClaudeAuthStatus } from \"./availability.ts\";\n\nexport type OAuthLoginCallbacks = {\n\tsignal?: AbortSignal;\n\tonAuth?: (event: { url: string }) => void | Promise<void>;\n\tonPrompt?: (prompt: { message: string; placeholder?: string }) => Promise<string>;\n\tonManualCodeInput?: () => Promise<string>;\n\tonProgress?: (message: string) => void;\n};\n\nexport type CurrentCredentialReader = () => Promise<ClaudeSdkOauthCredential | undefined>;\n\nexport type OAuthConfigShape = {\n\tname: string;\n\tcheck(input: {\n\t\tctx: AuthContext;\n\t\tcredential?: OAuthCredential;\n\t\tsignal?: AbortSignal;\n\t}): Promise<AuthCheck | undefined>;\n\t/**\n\t * Request auth for the ambient lane — an environment OAuth token or a\n\t * logged-in Claude CLI — used when auth.json holds no managed accounts.\n\t * The SDK subprocess authenticates itself in that lane, so the sentinel is\n\t * the whole credential; without this the provider passes `check` and then\n\t * fails every request with \"Provider is not configured\".\n\t */\n\tresolveAmbient(input: {\n\t\tctx: AuthContext;\n\t\tenv?: Record<string, string>;\n\t\tsignal?: AbortSignal;\n\t}): Promise<AuthResult | undefined>;\n\tlogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;\n\trefreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;\n\tgetApiKey(credentials: OAuthCredentials): string;\n};\n\nexport const CLAUDE_SDK_OAUTH_NAME = \"Claude SDK OAuth (Claude Pro/Max)\";\nconst ENV_TOKEN_NAMES = [\n\t\"CLAUDE_CODE_OAUTH_TOKEN\",\n\t...Array.from({ length: 15 }, (_, index) => `CLAUDE_CODE_OAUTH_TOKEN_${index + 2}`),\n] as const;\nconst ENV_TOKEN_NAME_SET = new Set<string>(ENV_TOKEN_NAMES);\nconst AUTH_CHECK = { source: \"Claude SDK OAuth\", type: \"oauth\" } as const;\n\nfunction requestClaudeEnvironment(value: unknown): Record<string, string> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n\tconst environment: Record<string, string> = {};\n\tfor (const [name, entry] of Object.entries(value)) {\n\t\tif (ENV_TOKEN_NAME_SET.has(name) && typeof entry === \"string\") environment[name] = entry;\n\t}\n\treturn environment;\n}\n\nfunction toSlot(\n\tcredential: { access: string; refresh: string; expires: number },\n\tname: string,\n\tsource: AccountSlot[\"source\"],\n): AccountSlot {\n\treturn { name, access: credential.access, refresh: credential.refresh, expires: credential.expires, source };\n}\n\nasync function promptAccountName(callbacks: OAuthLoginCallbacks, existing: AccountSlot[]): Promise<string> {\n\tif (existing.length === 0) return \"default\";\n\tif (!callbacks.onPrompt) return `account-${existing.length + 1}`;\n\tconst answer = (\n\t\tawait callbacks.onPrompt({\n\t\t\tmessage: `Name for this account (existing: ${existing.map((slot) => slot.name).join(\", \")})`,\n\t\t\tplaceholder: `account-${existing.length + 1}`,\n\t\t})\n\t).trim();\n\treturn answer || `account-${existing.length + 1}`;\n}\n\nexport function createOAuthConfig(deps: {\n\treadCurrent: CurrentCredentialReader;\n\treadAnthropicCredential?: () => Promise<{ access: string; refresh: string; expires: number } | undefined>;\n\treadAmbientAuthStatus?: (signal?: AbortSignal) => Promise<boolean>;\n\treadSettings?: () => { tokenInjection?: \"oauth-slots\" | \"config-dir\" | \"ambient\"; enabled?: boolean } | undefined;\n\tloginFlow?: OAuthAuth;\n}): OAuthConfigShape {\n\tconst claudeEnvironment = async (ctx: AuthContext): Promise<Record<string, string>> => {\n\t\tconst entries = await Promise.all(ENV_TOKEN_NAMES.map(async (name) => [name, await ctx.env(name)] as const));\n\t\treturn Object.fromEntries(entries.filter((entry): entry is readonly [string, string] => entry[1] !== undefined));\n\t};\n\n\t/** Single predicate behind both `check` and `resolveAmbient`, so availability and resolution cannot disagree. */\n\tconst configuredFor = async (\n\t\tctx: AuthContext,\n\t\tstored: ClaudeSdkOauthCredential | undefined,\n\t\tsignal?: AbortSignal,\n\t\tenvironment?: Record<string, string>,\n\t): Promise<boolean> => {\n\t\tconst storedAccounts = stored?.type === \"oauth\" && Array.isArray(stored.accounts) ? stored.accounts : [];\n\t\t// Slot-scoped resolution projects one account onto the flat credential shape,\n\t\t// stripping `accounts`; its concrete (non-sentinel) tokens are that account.\n\t\tconst selectedStoredAccount =\n\t\t\tstored?.type === \"oauth\" &&\n\t\t\tstored.access !== SENTINEL_OAUTH_FIELDS.access &&\n\t\t\tstored.refresh !== SENTINEL_OAUTH_FIELDS.refresh;\n\t\tconst effectiveEnvironment = environment ?? (await claudeEnvironment(ctx));\n\t\tconst environmentTokenCount = Object.values(effectiveEnvironment).filter(Boolean).length;\n\t\tconst accountCount = storedAccounts.length + (selectedStoredAccount ? 1 : 0) + environmentTokenCount;\n\t\tconst settings = deps.readSettings?.();\n\t\tconst lane = settings?.tokenInjection ?? (accountCount > 0 ? \"oauth-slots\" : \"ambient\");\n\t\tif (lane === \"ambient\") {\n\t\t\tif (environmentTokenCount > 0) return true;\n\t\t\t// A logged-in host Claude CLI is not senpi-side consent: spending the\n\t\t\t// user's Claude subscription requires an explicit opt-in. Stored\n\t\t\t// accounts and env tokens above are opt-ins in themselves.\n\t\t\tif (settings?.enabled !== true) return false;\n\t\t\treturn (deps.readAmbientAuthStatus ?? readAmbientClaudeAuthStatus)(signal);\n\t\t}\n\t\treturn accountCount > 0;\n\t};\n\n\treturn {\n\t\tname: CLAUDE_SDK_OAUTH_NAME,\n\n\t\tasync check({ ctx, credential, signal }) {\n\t\t\tconst requestEnvironment = requestClaudeEnvironment(credential?.env);\n\t\t\treturn (await configuredFor(\n\t\t\t\tctx,\n\t\t\t\tcredential as ClaudeSdkOauthCredential | undefined,\n\t\t\t\tsignal,\n\t\t\t\tObject.keys(requestEnvironment).length > 0 ? requestEnvironment : undefined,\n\t\t\t))\n\t\t\t\t? AUTH_CHECK\n\t\t\t\t: undefined;\n\t\t},\n\n\t\tasync resolveAmbient({ ctx, env, signal }) {\n\t\t\tconst requestEnvironment = requestClaudeEnvironment(env);\n\t\t\tconst environment =\n\t\t\t\tObject.keys(requestEnvironment).length > 0 ? requestEnvironment : await claudeEnvironment(ctx);\n\t\t\tif (!(await configuredFor(ctx, undefined, signal, environment))) return undefined;\n\t\t\treturn {\n\t\t\t\tauth: { apiKey: SENTINEL_OAUTH_FIELDS.access },\n\t\t\t\t...(Object.keys(environment).length > 0 ? { env: environment } : {}),\n\t\t\t\tsource: AUTH_CHECK.source,\n\t\t\t};\n\t\t},\n\n\t\tasync login(callbacks) {\n\t\t\tconst current = (await deps.readCurrent()) ?? emptyCredential();\n\t\t\tconst existing = listAccounts(current);\n\t\t\tif (existing.length === 0 && deps.readAnthropicCredential && callbacks.onPrompt) {\n\t\t\t\tconst imported = await deps.readAnthropicCredential();\n\t\t\t\tif (imported) {\n\t\t\t\t\tconst answer = (\n\t\t\t\t\t\tawait callbacks.onPrompt({\n\t\t\t\t\t\t\tmessage: \"An Anthropic OAuth login already exists. Import it instead of a new login? [y/N]\",\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t\t\t.trim()\n\t\t\t\t\t\t.toLowerCase();\n\t\t\t\t\tif (answer === \"y\" || answer === \"yes\") {\n\t\t\t\t\t\treturn addAccount(current, toSlot(imported, \"imported-anthropic\", \"import\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst interaction: ProviderAuthInteraction = {\n\t\t\t\tsignal: callbacks.signal ?? new AbortController().signal,\n\t\t\t\tprompt: async (prompt) => {\n\t\t\t\t\tif (prompt.type === \"select\") return \"\";\n\t\t\t\t\treturn callbacks.onPrompt ? callbacks.onPrompt({ message: prompt.message }) : \"\";\n\t\t\t\t},\n\t\t\t\tnotify: (event) => {\n\t\t\t\t\tif (event.type === \"auth_url\" && callbacks.onAuth) void callbacks.onAuth({ url: event.url });\n\t\t\t\t\tif (event.type === \"progress\" && callbacks.onProgress) callbacks.onProgress(event.message);\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst flow = deps.loginFlow ?? (await loadAnthropicOAuth());\n\t\t\tconst credential = await flow.login(interaction);\n\n\t\t\tconst existingAfter = listAccounts(current);\n\t\t\tconst name = await promptAccountName(callbacks, existingAfter);\n\t\t\treturn addAccount(current, toSlot(credential, name, \"login\"));\n\t\t},\n\n\t\tasync refreshToken(credentials) {\n\t\t\treturn credentials;\n\t\t},\n\n\t\tgetApiKey(_credentials) {\n\t\t\treturn SENTINEL_OAUTH_FIELDS.access;\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,aAAa,CAC5B,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,EACpC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,MAAM,CAWR;AAMD,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,OAAO,EAChB,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACjD,aAAa,CAAC,EAAE,MAAM,GACpB,iBAAiB,EAAE,CA+CrB;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC,CASlG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { appendSdkContentBlocks } from "./content-blocks.js";
|
|
1
2
|
import { mapPiToolNameToSdk } from "./tools.js";
|
|
2
3
|
export { mapPiToolNameToSdk } from "./tools.js";
|
|
3
4
|
export function contentToText(content, customToolNameToSdk) {
|
|
@@ -15,29 +16,7 @@ export function contentToText(content, customToolNameToSdk) {
|
|
|
15
16
|
.join("\n");
|
|
16
17
|
}
|
|
17
18
|
function appendContentBlocks(blocks, content) {
|
|
18
|
-
|
|
19
|
-
if (content.length > 0)
|
|
20
|
-
blocks.push({ type: "text", text: content });
|
|
21
|
-
return content.trim().length > 0;
|
|
22
|
-
}
|
|
23
|
-
let hasText = false;
|
|
24
|
-
for (const block of content) {
|
|
25
|
-
if (block.type === "text") {
|
|
26
|
-
blocks.push({ type: "text", text: block.text });
|
|
27
|
-
hasText ||= block.text.trim().length > 0;
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
blocks.push({
|
|
31
|
-
type: "image",
|
|
32
|
-
source: {
|
|
33
|
-
type: "base64",
|
|
34
|
-
media_type: block.mimeType,
|
|
35
|
-
data: block.data,
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return hasText;
|
|
19
|
+
return appendSdkContentBlocks(blocks, content);
|
|
41
20
|
}
|
|
42
21
|
export function buildPromptBlocks(context, customToolNameToSdk, toolWatchNote) {
|
|
43
22
|
const blocks = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-bridge.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompt-bridge.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, Context } from \"@earendil-works/pi-ai\";\nimport { appendSdkContentBlocks } from \"./content-blocks.ts\";\nimport type { ContentBlockParam, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport { mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport function contentToText(\n\tcontent: AssistantMessage[\"content\"],\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n): string {\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\") return block.text;\n\t\t\tif (block.type === \"thinking\") return block.thinking;\n\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\treturn `Historical tool call (non-executable): ${mapPiToolNameToSdk(block.name, customToolNameToSdk)} args=${JSON.stringify(block.arguments)}`;\n\t\t\t}\n\t\t\treturn `[${block.type}]`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction appendContentBlocks(blocks: ContentBlockParam[], content: string | readonly unknown[]): boolean {\n\treturn appendSdkContentBlocks(blocks, content);\n}\n\nexport function buildPromptBlocks(\n\tcontext: Context,\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n\ttoolWatchNote?: string,\n): ContentBlockParam[] {\n\tconst blocks: ContentBlockParam[] = [];\n\tconst pushText = (text: string): void => {\n\t\tblocks.push({ type: \"text\", text });\n\t};\n\tconst finalMessage = context.messages.at(-1);\n\tconst finalUserMessage = finalMessage?.role === \"user\" ? finalMessage : undefined;\n\tconst history = finalUserMessage ? context.messages.slice(0, -1) : context.messages;\n\n\tif (history.length > 0) {\n\t\tpushText(\"<conversation_history>\\n\");\n\t\tlet hasPreviousTurn = false;\n\t\tconst pushPrefix = (label: string): void => {\n\t\t\tpushText(`${hasPreviousTurn ? \"\\n\\n\" : \"\"}${label}\\n`);\n\t\t\thasPreviousTurn = true;\n\t\t};\n\n\t\tfor (const message of history) {\n\t\t\tif (message.role === \"user\") {\n\t\t\t\tpushPrefix(\"USER:\");\n\t\t\t\tif (!appendContentBlocks(blocks, message.content)) pushText(\"(see attached image)\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tpushPrefix(\"ASSISTANT:\");\n\t\t\t\tconst text = contentToText(message.content, customToolNameToSdk);\n\t\t\t\tif (text.length > 0) pushText(text);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpushPrefix(\n\t\t\t\t`TOOL RESULT (historical ${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):`,\n\t\t\t);\n\t\t\tif (!appendContentBlocks(blocks, message.content)) pushText(\"(see attached image)\");\n\t\t}\n\t\tpushText(\"\\n</conversation_history>\");\n\t}\n\n\tif (toolWatchNote?.trim()) {\n\t\tpushText(\"<recovered_tool_results>\\n\");\n\t\tpushText(toolWatchNote.trim());\n\t\tpushText(\"\\n</recovered_tool_results>\");\n\t}\n\tpushText(\n\t\t'The above is the conversation history so far, provided as context. Respond as the assistant to the user message below only. Never emit \"USER:\" or \"ASSISTANT:\" labels or continue the transcript.',\n\t);\n\tif (finalUserMessage && !appendContentBlocks(blocks, finalUserMessage.content)) pushText(\"(see attached image)\");\n\treturn blocks;\n}\n\nexport function buildPromptStream(promptBlocks: ContentBlockParam[]): AsyncIterable<SDKUserMessage> {\n\treturn (async function* () {\n\t\tyield {\n\t\t\ttype: \"user\",\n\t\t\tmessage: { role: \"user\", content: promptBlocks } as SDKUserMessage[\"message\"],\n\t\t\tparent_tool_use_id: null,\n\t\t\tsession_id: \"prompt\",\n\t\t};\n\t})();\n}\n"]}
|
|
@@ -39,8 +39,8 @@ export type BindingEntryState = {
|
|
|
39
39
|
* absent sent-stream.
|
|
40
40
|
*/
|
|
41
41
|
export declare function storedBindingFromEntry(entry: BindingEntryState, hashes: readonly string[], anchor: StoredBindingAnchor): StoredBinding;
|
|
42
|
-
/**
|
|
43
|
-
export declare function
|
|
42
|
+
/** Persist a completed turn whose resident registry entry closed before `message_end`. */
|
|
43
|
+
export declare function storedBindingFromBinding(binding: ContinuityBinding, hashes: readonly string[], anchor: StoredBindingAnchor): StoredBinding | undefined;
|
|
44
44
|
export declare function bindingFromStoredBranch(branch: readonly BranchEntry[], stored: StoredBinding): ContinuityBinding | undefined;
|
|
45
45
|
export {};
|
|
46
46
|
//# sourceMappingURL=session-binding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-binding.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-binding.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAC7D,eAAO,MAAM,cAAc;;;CAA8C,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,WAAW,GAAG;IAClB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,mBAAmB,GACzB,aAAa,CAgBf;AAED,0FAA0F;AAC1F,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,mBAAmB,GACzB,aAAa,GAAG,SAAS,CAsB3B;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,aAAa,GACnB,iBAAiB,GAAG,SAAS,CAe/B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { GOAL_CONTINUATION_MESSAGE_TYPE } from "../../../messages.js";
|
|
1
2
|
import { assistantContentHash } from "./session-commit-boundary.js";
|
|
2
|
-
import {
|
|
3
|
+
import { sentHashPrefixDigest } from "./session-sync.js";
|
|
3
4
|
export const BINDING_ENTRY_TYPE = "claude-sdk-oauth-binding";
|
|
4
5
|
export const BINDING_MARKER = { schemaVersion: 2, marker: true };
|
|
5
6
|
/**
|
|
@@ -26,29 +27,31 @@ export function storedBindingFromEntry(entry, hashes, anchor) {
|
|
|
26
27
|
toolsetHash: entry.toolsetHash,
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
|
-
/**
|
|
30
|
-
export function
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
30
|
+
/** Persist a completed turn whose resident registry entry closed before `message_end`. */
|
|
31
|
+
export function storedBindingFromBinding(binding, hashes, anchor) {
|
|
32
|
+
if (binding.sdkSessionIdConfirmed === false)
|
|
33
|
+
return undefined;
|
|
34
|
+
if (binding.sentCount !== hashes.length)
|
|
35
|
+
return undefined;
|
|
36
|
+
const expectedDigest = sentHashPrefixDigest(hashes);
|
|
37
|
+
const bindingDigest = binding.sentPrefixHash ?? (binding.sentHashes.length > 0 ? sentHashPrefixDigest(binding.sentHashes) : undefined);
|
|
38
|
+
if (bindingDigest === undefined || bindingDigest !== expectedDigest)
|
|
39
|
+
return undefined;
|
|
40
|
+
return {
|
|
41
|
+
schemaVersion: 1,
|
|
42
|
+
sessionPath: anchor.sessionPath,
|
|
43
|
+
sessionId: anchor.sessionId,
|
|
44
|
+
markerEntryId: anchor.markerEntryId,
|
|
45
|
+
sdkSessionId: binding.sdkSessionId,
|
|
46
|
+
sentCount: hashes.length,
|
|
47
|
+
sentPrefixHash: sentHashPrefixDigest(hashes),
|
|
48
|
+
assistantContentHash: anchor.assistantContentHash,
|
|
49
|
+
lastAssistantUuid: binding.lastAssistantUuid,
|
|
50
|
+
accountName: binding.accountName,
|
|
51
|
+
modelId: binding.modelId,
|
|
52
|
+
systemPromptHash: binding.systemPromptHash,
|
|
53
|
+
toolsetHash: binding.toolsetHash,
|
|
54
|
+
};
|
|
52
55
|
}
|
|
53
56
|
export function bindingFromStoredBranch(branch, stored) {
|
|
54
57
|
const markerIndex = newestBindingEntryIndex(branch);
|
|
@@ -78,10 +81,13 @@ const SAFE_BINDING_SUFFIX_TYPES = new Set([
|
|
|
78
81
|
"senpi.hooks.stop-output",
|
|
79
82
|
"pi-rules.scan",
|
|
80
83
|
"rule-activation",
|
|
84
|
+
"goal-cache-warmup",
|
|
81
85
|
]);
|
|
82
86
|
function isSafeBindingSuffix(entry) {
|
|
83
87
|
if (entry.type === "label")
|
|
84
88
|
return true;
|
|
89
|
+
if (entry.type === "custom_message")
|
|
90
|
+
return entry.customType === GOAL_CONTINUATION_MESSAGE_TYPE;
|
|
85
91
|
return entry.type === "custom" && entry.customType !== undefined && SAFE_BINDING_SUFFIX_TYPES.has(entry.customType);
|
|
86
92
|
}
|
|
87
93
|
function newestBindingEntryIndex(branch) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-binding.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport type { StoredBinding } from \"./session-binding-store.ts\";\nimport { assistantContentHash } from \"./session-commit-boundary.ts\";\nimport type { ContinuityBinding } from \"./session-reattach.ts\";\nimport { isTransmittedMessage, type SentMessage, sentHashPrefixDigest, sentMessageHashes } from \"./session-sync.ts\";\n\nexport const BINDING_ENTRY_TYPE = \"claude-sdk-oauth-binding\";\nexport const BINDING_MARKER = { schemaVersion: 2, marker: true } as const;\n\nexport type BindingInvalidation = {\n\treadonly schemaVersion: 1;\n\treadonly invalidated: true;\n\treadonly reason: string;\n};\n\ntype BranchEntry = {\n\treadonly id?: string;\n\treadonly type: string;\n\treadonly customType?: string;\n\treadonly data?: unknown;\n\treadonly message?: unknown;\n};\n\nexport type StoredBindingAnchor = {\n\treadonly sessionPath: string;\n\treadonly sessionId: string;\n\treadonly markerEntryId: string;\n\treadonly assistantContentHash: string;\n};\n\nexport type BindingEntryState = {\n\treadonly sdkSessionId: string;\n\treadonly accountName: string;\n\treadonly modelId: string;\n\treadonly systemPromptHash: string;\n\treadonly toolsetHash: string;\n\treadonly assistantUuidByIndex: ReadonlyMap<number, string>;\n};\n\n/**\n * The record is derived from the registry entry plus the hashes the branch\n * actually carries, never from the process binding map: that map holds the\n * previous turn's state while `message_end` runs (and only a prefix digest right\n * after a restart), so reading it would anchor this turn's marker to a stale or\n * absent sent-stream.\n */\nexport function storedBindingFromEntry(\n\tentry: BindingEntryState,\n\thashes: readonly string[],\n\tanchor: StoredBindingAnchor,\n): StoredBinding {\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsessionPath: anchor.sessionPath,\n\t\tsessionId: anchor.sessionId,\n\t\tmarkerEntryId: anchor.markerEntryId,\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tsentCount: hashes.length,\n\t\tsentPrefixHash: sentHashPrefixDigest(hashes),\n\t\tassistantContentHash: anchor.assistantContentHash,\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(hashes.length) ?? null,\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t};\n}\n\n/** Hashes for the user/toolResult messages the persisted branch already carries. */\nexport function sentHashesFromBranch(branch: readonly BranchEntry[]): string[] {\n\t// This walk is not compaction-aware, but admission compares against the\n\t// compaction-truncated context. Anchoring across a boundary would inflate\n\t// sentCount and flatten every later restart, so decline to anchor instead.\n\tif (branch.some((entry) => entry.type === \"compaction\")) return [];\n\tconst messages: SentMessage[] = [];\n\tfor (const entry of branch) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tif (isSentMessage(entry.message)) messages.push(entry.message);\n\t}\n\treturn sentMessageHashes(messages);\n}\n\nfunction isSentMessage(value: unknown): value is SentMessage {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(\"role\" in value) || typeof value.role !== \"string\" || !(\"content\" in value)) return false;\n\t// Same selection rule the context path uses, so the digests cannot diverge.\n\treturn isTransmittedMessage(value as { role: string });\n}\n\nexport function bindingFromStoredBranch(\n\tbranch: readonly BranchEntry[],\n\tstored: StoredBinding,\n): ContinuityBinding | undefined {\n\tconst markerIndex = newestBindingEntryIndex(branch);\n\tif (markerIndex < 0) return undefined;\n\tconst marker = branch[markerIndex];\n\tif (\n\t\tmarker?.id !== stored.markerEntryId ||\n\t\t!isBindingMarker(marker.data) ||\n\t\t!branch.slice(markerIndex + 2).every(isSafeBindingSuffix)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst committedAssistant = branch[markerIndex + 1]?.message;\n\tif (!isAssistantMessage(committedAssistant)) return undefined;\n\tif (assistantContentHash(committedAssistant) !== stored.assistantContentHash) return undefined;\n\treturn bindingFromStored(stored);\n}\n\n/**\n * Display-only metadata the co-resident builtins append after the committed\n * assistant (stop-hook state/diagnostics/output, rule activations, rule scans).\n * None participates in the sent stream, so none can shift the prefix digest.\n */\nconst SAFE_BINDING_SUFFIX_TYPES: ReadonlySet<string> = new Set([\n\t\"senpi.hooks.stop-state\",\n\t\"senpi.hooks.stop-diagnostics\",\n\t\"senpi.hooks.stop-output\",\n\t\"pi-rules.scan\",\n\t\"rule-activation\",\n]);\n\nfunction isSafeBindingSuffix(entry: BranchEntry): boolean {\n\tif (entry.type === \"label\") return true;\n\treturn entry.type === \"custom\" && entry.customType !== undefined && SAFE_BINDING_SUFFIX_TYPES.has(entry.customType);\n}\n\nfunction newestBindingEntryIndex(branch: readonly BranchEntry[]): number {\n\tfor (let index = branch.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = branch[index];\n\t\tif (entry?.type === \"custom\" && entry.customType === BINDING_ENTRY_TYPE) return index;\n\t}\n\treturn -1;\n}\n\nfunction isBindingMarker(value: unknown): boolean {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn \"schemaVersion\" in value && value.schemaVersion === 2 && \"marker\" in value && value.marker === true;\n}\n\nfunction isAssistantMessage(value: unknown): value is AssistantMessage {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn (\n\t\t\"role\" in value &&\n\t\tvalue.role === \"assistant\" &&\n\t\t\"api\" in value &&\n\t\ttypeof value.api === \"string\" &&\n\t\t\"provider\" in value &&\n\t\ttypeof value.provider === \"string\" &&\n\t\t\"model\" in value &&\n\t\ttypeof value.model === \"string\" &&\n\t\t\"content\" in value &&\n\t\tArray.isArray(value.content)\n\t);\n}\n\nfunction bindingFromStored(stored: StoredBinding): ContinuityBinding {\n\treturn {\n\t\tsenpiSessionId: stored.sessionId,\n\t\tsdkSessionId: stored.sdkSessionId,\n\t\tsentCount: stored.sentCount,\n\t\tsentHashes: [],\n\t\tsentPrefixHash: stored.sentPrefixHash,\n\t\tlastAssistantUuid: stored.lastAssistantUuid,\n\t\tassistantUuidByIndex: stored.lastAssistantUuid === null ? [] : [[stored.sentCount, stored.lastAssistantUuid]],\n\t\taccountName: stored.accountName,\n\t\tmodelId: stored.modelId,\n\t\tsystemPromptHash: stored.systemPromptHash,\n\t\ttoolsetHash: stored.toolsetHash,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-binding.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAW,CAAC;AAgC1E;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACrC,KAAwB,EACxB,MAAyB,EACzB,MAA2B;IAE3B,OAAO;QACN,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,cAAc,EAAE,oBAAoB,CAAC,MAAM,CAAC;QAC5C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,iBAAiB,EAAE,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI;QACxE,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;KAC9B,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,wBAAwB,CACvC,OAA0B,EAC1B,MAAyB,EACzB,MAA2B;IAE3B,IAAI,OAAO,CAAC,qBAAqB,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC9D,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,aAAa,GAClB,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClH,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,cAAc;QAAE,OAAO,SAAS,CAAC;IACtF,OAAO;QACN,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,cAAc,EAAE,oBAAoB,CAAC,MAAM,CAAC;QAC5C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;KAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CACtC,MAA8B,EAC9B,MAAqB;IAErB,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACnC,IACC,MAAM,EAAE,EAAE,KAAK,MAAM,CAAC,aAAa;QACnC,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,EACxD,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAC5D,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,IAAI,oBAAoB,CAAC,kBAAkB,CAAC,KAAK,MAAM,CAAC,oBAAoB;QAAE,OAAO,SAAS,CAAC;IAC/F,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAAC;IAC9D,wBAAwB;IACxB,8BAA8B;IAC9B,yBAAyB;IACzB,eAAe;IACf,iBAAiB;IACjB,mBAAmB;CACnB,CAAC,CAAC;AAEH,SAAS,mBAAmB,CAAC,KAAkB;IAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAC,UAAU,KAAK,8BAA8B,CAAC;IAChG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA8B;IAC9D,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,kBAAkB;YAAE,OAAO,KAAK,CAAC;IACvF,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,eAAe,IAAI,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;AAC5G,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,CACN,MAAM,IAAI,KAAK;QACf,KAAK,CAAC,IAAI,KAAK,WAAW;QAC1B,KAAK,IAAI,KAAK;QACd,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,UAAU,IAAI,KAAK;QACnB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,SAAS,IAAI,KAAK;QAClB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAC5B,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAqB;IAC/C,OAAO;QACN,cAAc,EAAE,MAAM,CAAC,SAAS;QAChC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,EAAE;QACd,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,oBAAoB,EAAE,MAAM,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC7G,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,WAAW,EAAE,MAAM,CAAC,WAAW;KAC/B,CAAC;AACH,CAAC","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { GOAL_CONTINUATION_MESSAGE_TYPE } from \"../../../messages.ts\";\nimport type { StoredBinding } from \"./session-binding-store.ts\";\nimport { assistantContentHash } from \"./session-commit-boundary.ts\";\nimport type { ContinuityBinding } from \"./session-reattach.ts\";\nimport { sentHashPrefixDigest } from \"./session-sync.ts\";\n\nexport const BINDING_ENTRY_TYPE = \"claude-sdk-oauth-binding\";\nexport const BINDING_MARKER = { schemaVersion: 2, marker: true } as const;\n\nexport type BindingInvalidation = {\n\treadonly schemaVersion: 1;\n\treadonly invalidated: true;\n\treadonly reason: string;\n};\n\ntype BranchEntry = {\n\treadonly id?: string;\n\treadonly type: string;\n\treadonly customType?: string;\n\treadonly data?: unknown;\n\treadonly message?: unknown;\n};\n\nexport type StoredBindingAnchor = {\n\treadonly sessionPath: string;\n\treadonly sessionId: string;\n\treadonly markerEntryId: string;\n\treadonly assistantContentHash: string;\n};\n\nexport type BindingEntryState = {\n\treadonly sdkSessionId: string;\n\treadonly accountName: string;\n\treadonly modelId: string;\n\treadonly systemPromptHash: string;\n\treadonly toolsetHash: string;\n\treadonly assistantUuidByIndex: ReadonlyMap<number, string>;\n};\n\n/**\n * The record is derived from the registry entry plus the hashes the branch\n * actually carries, never from the process binding map: that map holds the\n * previous turn's state while `message_end` runs (and only a prefix digest right\n * after a restart), so reading it would anchor this turn's marker to a stale or\n * absent sent-stream.\n */\nexport function storedBindingFromEntry(\n\tentry: BindingEntryState,\n\thashes: readonly string[],\n\tanchor: StoredBindingAnchor,\n): StoredBinding {\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsessionPath: anchor.sessionPath,\n\t\tsessionId: anchor.sessionId,\n\t\tmarkerEntryId: anchor.markerEntryId,\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tsentCount: hashes.length,\n\t\tsentPrefixHash: sentHashPrefixDigest(hashes),\n\t\tassistantContentHash: anchor.assistantContentHash,\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(hashes.length) ?? null,\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t};\n}\n\n/** Persist a completed turn whose resident registry entry closed before `message_end`. */\nexport function storedBindingFromBinding(\n\tbinding: ContinuityBinding,\n\thashes: readonly string[],\n\tanchor: StoredBindingAnchor,\n): StoredBinding | undefined {\n\tif (binding.sdkSessionIdConfirmed === false) return undefined;\n\tif (binding.sentCount !== hashes.length) return undefined;\n\tconst expectedDigest = sentHashPrefixDigest(hashes);\n\tconst bindingDigest =\n\t\tbinding.sentPrefixHash ?? (binding.sentHashes.length > 0 ? sentHashPrefixDigest(binding.sentHashes) : undefined);\n\tif (bindingDigest === undefined || bindingDigest !== expectedDigest) return undefined;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsessionPath: anchor.sessionPath,\n\t\tsessionId: anchor.sessionId,\n\t\tmarkerEntryId: anchor.markerEntryId,\n\t\tsdkSessionId: binding.sdkSessionId,\n\t\tsentCount: hashes.length,\n\t\tsentPrefixHash: sentHashPrefixDigest(hashes),\n\t\tassistantContentHash: anchor.assistantContentHash,\n\t\tlastAssistantUuid: binding.lastAssistantUuid,\n\t\taccountName: binding.accountName,\n\t\tmodelId: binding.modelId,\n\t\tsystemPromptHash: binding.systemPromptHash,\n\t\ttoolsetHash: binding.toolsetHash,\n\t};\n}\n\nexport function bindingFromStoredBranch(\n\tbranch: readonly BranchEntry[],\n\tstored: StoredBinding,\n): ContinuityBinding | undefined {\n\tconst markerIndex = newestBindingEntryIndex(branch);\n\tif (markerIndex < 0) return undefined;\n\tconst marker = branch[markerIndex];\n\tif (\n\t\tmarker?.id !== stored.markerEntryId ||\n\t\t!isBindingMarker(marker.data) ||\n\t\t!branch.slice(markerIndex + 2).every(isSafeBindingSuffix)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst committedAssistant = branch[markerIndex + 1]?.message;\n\tif (!isAssistantMessage(committedAssistant)) return undefined;\n\tif (assistantContentHash(committedAssistant) !== stored.assistantContentHash) return undefined;\n\treturn bindingFromStored(stored);\n}\n\n/**\n * Display-only metadata the co-resident builtins append after the committed\n * assistant (stop-hook state/diagnostics/output, rule activations, rule scans).\n * None participates in the sent stream, so none can shift the prefix digest.\n */\nconst SAFE_BINDING_SUFFIX_TYPES: ReadonlySet<string> = new Set([\n\t\"senpi.hooks.stop-state\",\n\t\"senpi.hooks.stop-diagnostics\",\n\t\"senpi.hooks.stop-output\",\n\t\"pi-rules.scan\",\n\t\"rule-activation\",\n\t\"goal-cache-warmup\",\n]);\n\nfunction isSafeBindingSuffix(entry: BranchEntry): boolean {\n\tif (entry.type === \"label\") return true;\n\tif (entry.type === \"custom_message\") return entry.customType === GOAL_CONTINUATION_MESSAGE_TYPE;\n\treturn entry.type === \"custom\" && entry.customType !== undefined && SAFE_BINDING_SUFFIX_TYPES.has(entry.customType);\n}\n\nfunction newestBindingEntryIndex(branch: readonly BranchEntry[]): number {\n\tfor (let index = branch.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = branch[index];\n\t\tif (entry?.type === \"custom\" && entry.customType === BINDING_ENTRY_TYPE) return index;\n\t}\n\treturn -1;\n}\n\nfunction isBindingMarker(value: unknown): boolean {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn \"schemaVersion\" in value && value.schemaVersion === 2 && \"marker\" in value && value.marker === true;\n}\n\nfunction isAssistantMessage(value: unknown): value is AssistantMessage {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn (\n\t\t\"role\" in value &&\n\t\tvalue.role === \"assistant\" &&\n\t\t\"api\" in value &&\n\t\ttypeof value.api === \"string\" &&\n\t\t\"provider\" in value &&\n\t\ttypeof value.provider === \"string\" &&\n\t\t\"model\" in value &&\n\t\ttypeof value.model === \"string\" &&\n\t\t\"content\" in value &&\n\t\tArray.isArray(value.content)\n\t);\n}\n\nfunction bindingFromStored(stored: StoredBinding): ContinuityBinding {\n\treturn {\n\t\tsenpiSessionId: stored.sessionId,\n\t\tsdkSessionId: stored.sdkSessionId,\n\t\tsentCount: stored.sentCount,\n\t\tsentHashes: [],\n\t\tsentPrefixHash: stored.sentPrefixHash,\n\t\tlastAssistantUuid: stored.lastAssistantUuid,\n\t\tassistantUuidByIndex: stored.lastAssistantUuid === null ? [] : [[stored.sentCount, stored.lastAssistantUuid]],\n\t\taccountName: stored.accountName,\n\t\tmodelId: stored.modelId,\n\t\tsystemPromptHash: stored.systemPromptHash,\n\t\ttoolsetHash: stored.toolsetHash,\n\t};\n}\n"]}
|
|
@@ -24,6 +24,8 @@ export type ContinuityBindingSnapshot = {
|
|
|
24
24
|
toolsetHash: string;
|
|
25
25
|
/** Sent-stream digest of a turn that was pushed but never answered (retry checkpoint). */
|
|
26
26
|
unansweredTurnDigest?: string;
|
|
27
|
+
/** False until the SDK acknowledged the id; a resume/fork of an unconfirmed id is never attempted. */
|
|
28
|
+
sdkSessionIdConfirmed?: boolean;
|
|
27
29
|
};
|
|
28
30
|
export type ContinuityDecisionInput = {
|
|
29
31
|
entry: ContinuityEntrySnapshot | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-continuity.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-continuity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,MAAM,MAAM,uBAAuB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,oBAAoB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session-continuity.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-continuity.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,6 +78,20 @@ function retryCheckpointDecision(input, binding) {
|
|
|
78
78
|
reason: "timeout_retry",
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* A binding whose SDK id was minted locally and never acknowledged (no init, no
|
|
83
|
+
* replay echo before the attempt failed) must not be resumed: Claude Code
|
|
84
|
+
* answers "No conversation found with session ID" and every retry would mint
|
|
85
|
+
* another dead id (oh-my-openagent#7562). Cold-seed instead.
|
|
86
|
+
*/
|
|
87
|
+
function withoutUnconfirmedResume(decision, binding) {
|
|
88
|
+
if (binding.sdkSessionIdConfirmed !== false)
|
|
89
|
+
return decision;
|
|
90
|
+
if (decision.kind === "reattach" || decision.kind === "fork") {
|
|
91
|
+
return { kind: "flatten", reason: "session_unconfirmed" };
|
|
92
|
+
}
|
|
93
|
+
return decision;
|
|
94
|
+
}
|
|
81
95
|
function decideFromBinding(input, binding) {
|
|
82
96
|
if (!input.transcriptAvailable)
|
|
83
97
|
return { kind: "flatten", reason: "transcript_missing" };
|
|
@@ -155,7 +169,7 @@ export function decideNativeContinuity(input) {
|
|
|
155
169
|
if (!entry) {
|
|
156
170
|
if (!binding)
|
|
157
171
|
return { kind: "bootstrap" };
|
|
158
|
-
return decideFromBinding(input, binding);
|
|
172
|
+
return withoutUnconfirmedResume(decideFromBinding(input, binding), binding);
|
|
159
173
|
}
|
|
160
174
|
const divergence = entry.pendingForkReason ?? entry.taintedReason;
|
|
161
175
|
if (divergence) {
|