@code-yeongyu/senpi 2026.7.31 → 2026.8.1
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 +237 -0
- package/dist/core/agent-session.d.ts +49 -13
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +120 -37
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/build.js +4 -0
- package/dist/core/dynamic-prompt/build.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts +2 -2
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js +25 -25
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js +2 -2
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts +9 -9
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js +2 -2
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js +3 -3
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts +21 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js +30 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.d.ts +8 -4
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.js +34 -25
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts +14 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/guidance.js +37 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/index.js +12 -10
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts +3 -3
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.js +2 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts +18 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.js +70 -10
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.js +32 -19
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts +30 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js +197 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts +18 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js +33 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +134 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +85 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +270 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts +17 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +217 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts +49 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +204 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts +28 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js +107 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js +10 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.js +72 -53
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js +25 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js +2 -2
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +18 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +69 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +28 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts +4 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +22 -17
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/task-intent.d.ts +2 -6
- package/dist/core/extensions/builtin/compaction/task-intent.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/task-intent.js +10 -9
- package/dist/core/extensions/builtin/compaction/task-intent.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/continuation-recovery.js +20 -0
- package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -0
- package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -4
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js +2 -8
- package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts +19 -0
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js +48 -0
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js.map +1 -0
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +17 -15
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +12 -10
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +5 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +94 -52
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/persistence.d.ts +16 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/persistence.js +185 -11
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js +11 -2
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +15 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +30 -3
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +5 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/detectors.d.ts +31 -0
- package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/detectors.js +111 -0
- package/dist/core/extensions/builtin/loop-guard/detectors.js.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/index.d.ts +3 -0
- package/dist/core/extensions/builtin/loop-guard/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/index.js +31 -0
- package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/notice.d.ts +5 -0
- package/dist/core/extensions/builtin/loop-guard/notice.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/notice.js +42 -0
- package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/policy.d.ts +30 -0
- package/dist/core/extensions/builtin/loop-guard/policy.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/policy.js +30 -0
- package/dist/core/extensions/builtin/loop-guard/policy.js.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/renderer.d.ts +4 -0
- package/dist/core/extensions/builtin/loop-guard/renderer.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/renderer.js +50 -0
- package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/similarity.d.ts +13 -0
- package/dist/core/extensions/builtin/loop-guard/similarity.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/similarity.js +51 -0
- package/dist/core/extensions/builtin/loop-guard/similarity.js.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/tracker.d.ts +13 -0
- package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -0
- package/dist/core/extensions/builtin/loop-guard/tracker.js +39 -0
- package/dist/core/extensions/builtin/loop-guard/tracker.js.map +1 -0
- package/dist/core/extensions/builtin/monitor-state-event.d.ts +10 -0
- package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
- package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js +10 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js +10 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js +11 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts +13 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js +60 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.js +8 -4
- package/dist/core/extensions/builtin/prompt-preset/index.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 +42 -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 +3 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/recommended-models/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/recommended-models/index.js +2 -1
- package/dist/core/extensions/builtin/recommended-models/index.js.map +1 -1
- package/dist/core/extensions/builtin/rules/index.js +4 -3
- package/dist/core/extensions/builtin/rules/index.js.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/constants.d.ts +11 -0
- package/dist/core/extensions/builtin/rules/rules/constants.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/constants.js +11 -0
- package/dist/core/extensions/builtin/rules/rules/constants.js.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/formatter.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/formatter.js +15 -1
- package/dist/core/extensions/builtin/rules/rules/formatter.js.map +1 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +23 -21
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +21 -7
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.js +42 -5
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +2 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +2 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts +37 -0
- package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js +61 -0
- package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-status.d.ts +9 -1
- package/dist/core/extensions/builtin/terminal/monitor-status.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-status.js +35 -2
- package/dist/core/extensions/builtin/terminal/monitor-status.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/commands.d.ts +2 -2
- package/dist/core/extensions/builtin/todotools/commands.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/commands.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js +6 -3
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +1 -1
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts +19 -0
- package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/todo-widget-component.js +78 -0
- package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/todo-widget.d.ts +13 -1
- package/dist/core/extensions/builtin/todotools/todo-widget.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-widget.js +32 -14
- package/dist/core/extensions/builtin/todotools/todo-widget.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +2 -2
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js +88 -29
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
- package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tps.js +5 -2
- package/dist/core/extensions/builtin/tps.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts +4 -0
- package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ttsr/builtin-rules.js +20 -0
- package/dist/core/extensions/builtin/ttsr/builtin-rules.js.map +1 -0
- package/dist/core/extensions/builtin/ttsr/commands.js +9 -1
- package/dist/core/extensions/builtin/ttsr/commands.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/index.js +4 -3
- package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/manager.js +1 -1
- package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.js +16 -5
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts +4 -1
- package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js +44 -37
- package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts +3 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js +12 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/providers.js +2 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +3 -3
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +1 -3
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +2 -2
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +5 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +3 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +22 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-resolver.js +2 -2
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/thinking-levels.d.ts +5 -0
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +9 -39
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/app-server/server/account.d.ts +1 -1
- package/dist/modes/app-server/server/account.js +1 -1
- package/dist/modes/app-server/server/account.js.map +1 -1
- package/dist/modes/app-server/server/server-core.js +1 -1
- package/dist/modes/app-server/server/server-core.js.map +1 -1
- package/dist/modes/interactive/compaction-queue-transfer.d.ts +2 -0
- package/dist/modes/interactive/compaction-queue-transfer.d.ts.map +1 -1
- package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +9 -5
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +38 -12
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/risky-main-model-warning.d.ts +1 -1
- package/dist/modes/interactive/risky-main-model-warning.d.ts.map +1 -1
- package/dist/modes/interactive/risky-main-model-warning.js +1 -1
- package/dist/modes/interactive/risky-main-model-warning.js.map +1 -1
- package/dist/modes/rpc/connection-handler.js +3 -3
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/docs/extensions.md +10 -0
- package/docs/providers.md +21 -5
- package/docs/release-guide.md +2 -2
- package/docs/settings.md +1 -1
- package/examples/extensions/overlay-test.ts +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +33 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +6 -3
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status-ticker.ts +79 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +36 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +26 -12
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +146 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +21 -119
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +157 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +62 -208
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +98 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +81 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-state.ts +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +140 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-notification-queue.ts +53 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +45 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +45 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +20 -342
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +10 -15
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js +70 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +2 -16
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +10 -58
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js +7 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +14 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +95 -19
- 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/amazon-bedrock.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/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.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/providers/data/zai-coding-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.js +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +17 -3
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +6 -6
- package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.js.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts +0 -6
- package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/guidance.js.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts +0 -4
- package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/index.js.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/oauth-login.js.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/options.d.ts +0 -16
- package/dist/core/extensions/builtin/claude-agent-sdk/options.js.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/prompt-bridge.js.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts +0 -15
- package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/settings.js +0 -41
- package/dist/core/extensions/builtin/claude-agent-sdk/settings.js.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/stream.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-agent-sdk/stream.js.map +0 -1
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AccountSlot } from "./accounts.ts";
|
|
2
|
+
import type { Options, SDKMessage, SdkQuery } from "./sdk-boundary.ts";
|
|
3
|
+
import type { ClaudeSdkOauthTokenInjection } from "./settings.ts";
|
|
4
|
+
export type AuthenticatedAttemptInput = {
|
|
5
|
+
accountName: string;
|
|
6
|
+
accounts: readonly AccountSlot[];
|
|
7
|
+
authLane: ClaudeSdkOauthTokenInjection;
|
|
8
|
+
options: Options;
|
|
9
|
+
};
|
|
10
|
+
export interface RetainableAttempt<TEvent> {
|
|
11
|
+
messages: AsyncIterable<TEvent>;
|
|
12
|
+
discard(): void;
|
|
13
|
+
}
|
|
14
|
+
export type AttemptFactoryInput = {
|
|
15
|
+
prompt: Parameters<SdkQuery>[0]["prompt"];
|
|
16
|
+
query: SdkQuery;
|
|
17
|
+
onQuery?: (query: ReturnType<SdkQuery>) => void;
|
|
18
|
+
createAttempt?: (input: AuthenticatedAttemptInput) => RetainableAttempt<SDKMessage> | Promise<RetainableAttempt<SDKMessage>>;
|
|
19
|
+
};
|
|
20
|
+
export declare function createAttemptMessages(input: AttemptFactoryInput, auth: AuthenticatedAttemptInput): Promise<AsyncIterable<SDKMessage>>;
|
|
21
|
+
//# sourceMappingURL=auth-attempt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-attempt.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/auth-attempt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAElE,MAAM,MAAM,yBAAyB,GAAG;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,QAAQ,EAAE,4BAA4B,CAAC;IACvC,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAAC,MAAM;IACxC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1C,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAChD,aAAa,CAAC,EAAE,CACf,KAAK,EAAE,yBAAyB,KAC5B,iBAAiB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;CAC5E,CAAC;AAqBF,wBAAsB,qBAAqB,CAC1C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,yBAAyB,GAC7B,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAKpC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Discards an attempt unless its event stream is consumed to successful completion. */
|
|
2
|
+
async function* retainedAttemptMessages(attempt) {
|
|
3
|
+
let retained = false;
|
|
4
|
+
try {
|
|
5
|
+
for await (const event of attempt.messages)
|
|
6
|
+
yield event;
|
|
7
|
+
retained = true;
|
|
8
|
+
}
|
|
9
|
+
finally {
|
|
10
|
+
if (!retained)
|
|
11
|
+
attempt.discard();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function* closingQueryMessages(query) {
|
|
15
|
+
try {
|
|
16
|
+
for await (const message of query)
|
|
17
|
+
yield message;
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
query.close();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function createAttemptMessages(input, auth) {
|
|
24
|
+
if (input.createAttempt)
|
|
25
|
+
return retainedAttemptMessages(await input.createAttempt(auth));
|
|
26
|
+
const query = input.query({ prompt: input.prompt, options: auth.options });
|
|
27
|
+
input.onQuery?.(query);
|
|
28
|
+
return closingQueryMessages(query);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=auth-attempt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-attempt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/auth-attempt.ts"],"names":[],"mappings":"AAyBA,wFAAwF;AACxF,KAAK,SAAS,CAAC,CAAC,uBAAuB,CAAS,OAAkC;IACjF,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACJ,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAM,KAAK,CAAC;QACxD,QAAQ,GAAG,IAAI,CAAC;IACjB,CAAC;YAAS,CAAC;QACV,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;AACF,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,oBAAoB,CAAC,KAA2B;IAC/D,IAAI,CAAC;QACJ,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,KAAK;YAAE,MAAM,OAAO,CAAC;IAClD,CAAC;YAAS,CAAC;QACV,KAAK,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,KAA0B,EAC1B,IAA+B;IAE/B,IAAI,KAAK,CAAC,aAAa;QAAE,OAAO,uBAAuB,CAAC,MAAM,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC","sourcesContent":["import type { AccountSlot } from \"./accounts.ts\";\nimport type { Options, SDKMessage, SdkQuery } from \"./sdk-boundary.ts\";\nimport type { ClaudeSdkOauthTokenInjection } from \"./settings.ts\";\n\nexport type AuthenticatedAttemptInput = {\n\taccountName: string;\n\taccounts: readonly AccountSlot[];\n\tauthLane: ClaudeSdkOauthTokenInjection;\n\toptions: Options;\n};\n\nexport interface RetainableAttempt<TEvent> {\n\tmessages: AsyncIterable<TEvent>;\n\tdiscard(): void;\n}\n\nexport type AttemptFactoryInput = {\n\tprompt: Parameters<SdkQuery>[0][\"prompt\"];\n\tquery: SdkQuery;\n\tonQuery?: (query: ReturnType<SdkQuery>) => void;\n\tcreateAttempt?: (\n\t\tinput: AuthenticatedAttemptInput,\n\t) => RetainableAttempt<SDKMessage> | Promise<RetainableAttempt<SDKMessage>>;\n};\n\n/** Discards an attempt unless its event stream is consumed to successful completion. */\nasync function* retainedAttemptMessages<TEvent>(attempt: RetainableAttempt<TEvent>): AsyncGenerator<TEvent> {\n\tlet retained = false;\n\ttry {\n\t\tfor await (const event of attempt.messages) yield event;\n\t\tretained = true;\n\t} finally {\n\t\tif (!retained) attempt.discard();\n\t}\n}\n\nasync function* closingQueryMessages(query: ReturnType<SdkQuery>): AsyncGenerator<SDKMessage> {\n\ttry {\n\t\tfor await (const message of query) yield message;\n\t} finally {\n\t\tquery.close();\n\t}\n}\n\nexport async function createAttemptMessages(\n\tinput: AttemptFactoryInput,\n\tauth: AuthenticatedAttemptInput,\n): Promise<AsyncIterable<SDKMessage>> {\n\tif (input.createAttempt) return retainedAttemptMessages(await input.createAttempt(auth));\n\tconst query = input.query({ prompt: input.prompt, options: auth.options });\n\tinput.onQuery?.(query);\n\treturn closingQueryMessages(query);\n}\n"]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { CredentialStore } from "@earendil-works/pi-ai";
|
|
2
2
|
import { type SlotRefresher } from "./accounts.ts";
|
|
3
|
+
import { type AuthenticatedAttemptInput, type RetainableAttempt } from "./auth-attempt.ts";
|
|
3
4
|
import type { Options, SDKMessage, SdkQuery } from "./sdk-boundary.ts";
|
|
4
|
-
import type {
|
|
5
|
-
export {
|
|
5
|
+
import type { ClaudeSdkOauthProviderSettings, ClaudeSdkOauthTokenInjection } from "./settings.ts";
|
|
6
|
+
export { CLAUDE_SDK_OAUTH_PROVIDER_ID } from "./account-management.ts";
|
|
7
|
+
export declare const EXPIRING_WITHIN_MS: number;
|
|
6
8
|
type AuthLaneBoundary = {
|
|
7
9
|
createStore: () => CredentialStore;
|
|
8
10
|
env: () => NodeJS.ProcessEnv;
|
|
@@ -12,15 +14,17 @@ type AuthLaneBoundary = {
|
|
|
12
14
|
};
|
|
13
15
|
export declare function overrideAuthLaneBoundary(override: Partial<AuthLaneBoundary>): void;
|
|
14
16
|
export declare function resetAuthLaneBoundary(): void;
|
|
17
|
+
export type { AuthenticatedAttemptInput } from "./auth-attempt.ts";
|
|
15
18
|
export type AuthenticatedQueryInput = {
|
|
16
19
|
prompt: Parameters<SdkQuery>[0]["prompt"];
|
|
17
20
|
query: SdkQuery;
|
|
18
|
-
buildOptions: (lane:
|
|
19
|
-
providerSettings:
|
|
21
|
+
buildOptions: (lane: ClaudeSdkOauthTokenInjection) => Options;
|
|
22
|
+
providerSettings: ClaudeSdkOauthProviderSettings;
|
|
20
23
|
sessionId?: string;
|
|
21
24
|
/** Request-scoped CLI pin; takes precedence over persistent settings and account pins. */
|
|
22
25
|
pinnedAccount?: string;
|
|
23
26
|
onQuery?: (query: ReturnType<SdkQuery>) => void;
|
|
27
|
+
createAttempt?: (input: AuthenticatedAttemptInput) => RetainableAttempt<SDKMessage> | Promise<RetainableAttempt<SDKMessage>>;
|
|
24
28
|
};
|
|
25
29
|
/** Resolves managed OAuth immediately before each subprocess spawn and retries only pre-delta failures. */
|
|
26
30
|
export declare function queryWithAuthLane(input: AuthenticatedQueryInput): AsyncGenerator<SDKMessage>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-lane.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/auth-lane.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,OAAO,EAQN,KAAK,aAAa,EAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,yBAAyB,EAAyB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGlH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvE,eAAO,MAAM,kBAAkB,QAAa,CAAC;AAU7C,KAAK,gBAAgB,GAAG;IACvB,WAAW,EAAE,MAAM,eAAe,CAAC;IACnC,GAAG,EAAE,MAAM,MAAM,CAAC,UAAU,CAAC;IAC7B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;CACzB,CAAC;AAiBF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAElF;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,YAAY,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1C,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,OAAO,CAAC;IAC9D,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAChD,aAAa,CAAC,EAAE,CACf,KAAK,EAAE,yBAAyB,KAC5B,iBAAiB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;CAC5E,CAAC;AAgIF,2GAA2G;AAC3G,wBAAuB,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,GAAG,cAAc,CAAC,UAAU,CAAC,CAuDnG"}
|
|
@@ -4,13 +4,14 @@ import { loadAnthropicOAuth } from "@earendil-works/pi-ai/oauth";
|
|
|
4
4
|
import { getAgentDir } from "../../../../config.js";
|
|
5
5
|
import { AuthStorage } from "../../../auth-storage.js";
|
|
6
6
|
import { emitProviderAccountFailover, emitProviderAccountsChanged } from "./account-events.js";
|
|
7
|
-
import {
|
|
7
|
+
import { CLAUDE_SDK_OAUTH_PROVIDER_ID } from "./account-management.js";
|
|
8
8
|
import { assertValidAccountName, emptyCredential, envSlotToken, listAccounts, refreshSlot, } from "./accounts.js";
|
|
9
9
|
import { selectAccount } from "./affinity.js";
|
|
10
|
+
import { createAttemptMessages } from "./auth-attempt.js";
|
|
10
11
|
import { classifySdkError } from "./errors.js";
|
|
11
12
|
import { runFailover } from "./failover.js";
|
|
12
|
-
export {
|
|
13
|
-
const EXPIRING_WITHIN_MS = 5 * 60_000;
|
|
13
|
+
export { CLAUDE_SDK_OAUTH_PROVIDER_ID } from "./account-management.js";
|
|
14
|
+
export const EXPIRING_WITHIN_MS = 5 * 60_000;
|
|
14
15
|
const CLI_OAUTH_SCOPES = [
|
|
15
16
|
"org:create_api_key",
|
|
16
17
|
"user:profile",
|
|
@@ -43,12 +44,14 @@ function managedEnvironment(parent) {
|
|
|
43
44
|
for (const name of Object.keys(environment)) {
|
|
44
45
|
if (/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name))
|
|
45
46
|
delete environment[name];
|
|
47
|
+
if (name.startsWith("SENPI_"))
|
|
48
|
+
delete environment[name];
|
|
46
49
|
}
|
|
47
50
|
return environment;
|
|
48
51
|
}
|
|
49
52
|
function configDirectory(slot) {
|
|
50
53
|
assertValidAccountName(slot.name);
|
|
51
|
-
return join(activeBoundary.getAgentDir(), "claude-
|
|
54
|
+
return join(activeBoundary.getAgentDir(), "claude-sdk-oauth-accounts", slot.name);
|
|
52
55
|
}
|
|
53
56
|
function writeConfigCredentials(directory, slot, access) {
|
|
54
57
|
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
@@ -67,11 +70,11 @@ async function managedPool(settings) {
|
|
|
67
70
|
if (lane === "ambient")
|
|
68
71
|
return undefined;
|
|
69
72
|
const store = activeBoundary.createStore();
|
|
70
|
-
let credential = await store.read(
|
|
73
|
+
let credential = await store.read(CLAUDE_SDK_OAUTH_PROVIDER_ID);
|
|
71
74
|
const environment = activeBoundary.env();
|
|
72
75
|
let accounts = listAccounts(credential ?? emptyCredential(), (name) => environment[name]);
|
|
73
76
|
if (!credential && accounts.length > 0) {
|
|
74
|
-
credential = await store.modify(
|
|
77
|
+
credential = await store.modify(CLAUDE_SDK_OAUTH_PROVIDER_ID, async () => emptyCredential());
|
|
75
78
|
accounts = listAccounts(credential ?? emptyCredential(), (name) => environment[name]);
|
|
76
79
|
}
|
|
77
80
|
if (accounts.length === 0)
|
|
@@ -84,7 +87,7 @@ async function prepareSlot(pool, selected) {
|
|
|
84
87
|
const slot = selected;
|
|
85
88
|
if (slot.source !== "env" && activeBoundary.now() >= slot.expires - EXPIRING_WITHIN_MS) {
|
|
86
89
|
try {
|
|
87
|
-
const refreshed = await refreshSlot(pool.store,
|
|
90
|
+
const refreshed = await refreshSlot(pool.store, CLAUDE_SDK_OAUTH_PROVIDER_ID, slot.name, activeBoundary.refresher, (expires) => activeBoundary.now() >= expires - EXPIRING_WITHIN_MS);
|
|
88
91
|
const credential = refreshed?.type === "oauth" ? refreshed : undefined;
|
|
89
92
|
const updated = listAccounts(credential ?? emptyCredential(), (name) => environment[name]).find((candidate) => candidate.name === slot.name);
|
|
90
93
|
if (!updated)
|
|
@@ -129,22 +132,24 @@ function visibleSdkMessage(message) {
|
|
|
129
132
|
return false;
|
|
130
133
|
return /^(?:content_block_start|content_block_delta|content_block_stop)$/.test(message.event.type);
|
|
131
134
|
}
|
|
132
|
-
async function* messagesFrom(query) {
|
|
133
|
-
try {
|
|
134
|
-
for await (const message of query)
|
|
135
|
-
yield message;
|
|
136
|
-
}
|
|
137
|
-
finally {
|
|
138
|
-
query.close();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
135
|
/** Resolves managed OAuth immediately before each subprocess spawn and retries only pre-delta failures. */
|
|
142
136
|
export async function* queryWithAuthLane(input) {
|
|
143
137
|
const pool = await managedPool(input.providerSettings);
|
|
144
138
|
if (!pool) {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
139
|
+
const options = input.buildOptions("ambient");
|
|
140
|
+
const parentEnvironment = activeBoundary.env();
|
|
141
|
+
const ambientEnvironment = { ...parentEnvironment };
|
|
142
|
+
for (const name of Object.keys(ambientEnvironment)) {
|
|
143
|
+
if (name.startsWith("SENPI_"))
|
|
144
|
+
delete ambientEnvironment[name];
|
|
145
|
+
}
|
|
146
|
+
options.env = ambientEnvironment;
|
|
147
|
+
yield* await createAttemptMessages(input, {
|
|
148
|
+
accountName: "ambient",
|
|
149
|
+
accounts: [],
|
|
150
|
+
authLane: "ambient",
|
|
151
|
+
options,
|
|
152
|
+
});
|
|
148
153
|
return;
|
|
149
154
|
}
|
|
150
155
|
yield* runFailover({
|
|
@@ -156,21 +161,25 @@ export async function* queryWithAuthLane(input) {
|
|
|
156
161
|
}),
|
|
157
162
|
runAttempt: async (slot) => {
|
|
158
163
|
const options = input.buildOptions(pool.lane);
|
|
164
|
+
const accounts = pool.accounts.map((account) => ({ ...account }));
|
|
159
165
|
options.env = await prepareSlot(pool, slot);
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
166
|
+
return createAttemptMessages(input, {
|
|
167
|
+
accountName: slot.name,
|
|
168
|
+
accounts,
|
|
169
|
+
authLane: pool.lane,
|
|
170
|
+
options,
|
|
171
|
+
});
|
|
163
172
|
},
|
|
164
173
|
classify: classifySdkError,
|
|
165
174
|
store: pool.store,
|
|
166
|
-
providerId:
|
|
175
|
+
providerId: CLAUDE_SDK_OAUTH_PROVIDER_ID,
|
|
167
176
|
now: activeBoundary.now,
|
|
168
177
|
errorFromEvent: sdkFailure,
|
|
169
178
|
isVisibleDelta: visibleSdkMessage,
|
|
170
179
|
onFailover: ({ account, nextAccount, classification }) => {
|
|
171
|
-
emitProviderAccountsChanged(
|
|
180
|
+
emitProviderAccountsChanged(CLAUDE_SDK_OAUTH_PROVIDER_ID);
|
|
172
181
|
if (nextAccount) {
|
|
173
|
-
emitProviderAccountFailover(
|
|
182
|
+
emitProviderAccountFailover(CLAUDE_SDK_OAUTH_PROVIDER_ID, account.name, nextAccount.name, classification.kind);
|
|
174
183
|
}
|
|
175
184
|
},
|
|
176
185
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-lane.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/auth-lane.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CredentialStore } from \"@earendil-works/pi-ai\";\nimport { loadAnthropicOAuth } from \"@earendil-works/pi-ai/oauth\";\nimport { getAgentDir } from \"../../../../config.ts\";\nimport { AuthStorage } from \"../../../auth-storage.ts\";\nimport { emitProviderAccountFailover, emitProviderAccountsChanged } from \"./account-events.ts\";\nimport { CLAUDE_SDK_OAUTH_PROVIDER_ID } from \"./account-management.ts\";\nimport {\n\ttype AccountSlot,\n\tassertValidAccountName,\n\ttype ClaudeSdkOauthCredential,\n\temptyCredential,\n\tenvSlotToken,\n\tlistAccounts,\n\trefreshSlot,\n\ttype SlotRefresher,\n} from \"./accounts.ts\";\nimport { selectAccount } from \"./affinity.ts\";\nimport { type AuthenticatedAttemptInput, createAttemptMessages, type RetainableAttempt } from \"./auth-attempt.ts\";\nimport { classifySdkError } from \"./errors.ts\";\nimport { runFailover } from \"./failover.ts\";\nimport type { Options, SDKMessage, SdkQuery } from \"./sdk-boundary.ts\";\nimport type { ClaudeSdkOauthProviderSettings, ClaudeSdkOauthTokenInjection } from \"./settings.ts\";\n\nexport { CLAUDE_SDK_OAUTH_PROVIDER_ID } from \"./account-management.ts\";\n\nexport const EXPIRING_WITHIN_MS = 5 * 60_000;\nconst CLI_OAUTH_SCOPES = [\n\t\"org:create_api_key\",\n\t\"user:profile\",\n\t\"user:inference\",\n\t\"user:sessions:claude_code\",\n\t\"user:mcp_servers\",\n\t\"user:file_upload\",\n] as const;\n\ntype AuthLaneBoundary = {\n\tcreateStore: () => CredentialStore;\n\tenv: () => NodeJS.ProcessEnv;\n\tgetAgentDir: () => string;\n\tnow: () => number;\n\trefresher: SlotRefresher;\n};\n\nasync function refreshWithAnthropicOAuth(refresh: string) {\n\tconst oauth = await loadAnthropicOAuth();\n\tconst credential = await oauth.refresh({ type: \"oauth\", access: \"\", refresh, expires: 0 });\n\treturn { access: credential.access, refresh: credential.refresh, expires: credential.expires };\n}\n\nconst defaultBoundary: AuthLaneBoundary = {\n\tcreateStore: () => AuthStorage.create(),\n\tenv: () => process.env,\n\tgetAgentDir,\n\tnow: () => Date.now(),\n\trefresher: refreshWithAnthropicOAuth,\n};\nlet activeBoundary = defaultBoundary;\n\nexport function overrideAuthLaneBoundary(override: Partial<AuthLaneBoundary>): void {\n\tactiveBoundary = { ...activeBoundary, ...override };\n}\n\nexport function resetAuthLaneBoundary(): void {\n\tactiveBoundary = defaultBoundary;\n}\n\nexport type { AuthenticatedAttemptInput } from \"./auth-attempt.ts\";\n\nexport type AuthenticatedQueryInput = {\n\tprompt: Parameters<SdkQuery>[0][\"prompt\"];\n\tquery: SdkQuery;\n\tbuildOptions: (lane: ClaudeSdkOauthTokenInjection) => Options;\n\tproviderSettings: ClaudeSdkOauthProviderSettings;\n\tsessionId?: string;\n\t/** Request-scoped CLI pin; takes precedence over persistent settings and account pins. */\n\tpinnedAccount?: string;\n\tonQuery?: (query: ReturnType<SdkQuery>) => void;\n\tcreateAttempt?: (\n\t\tinput: AuthenticatedAttemptInput,\n\t) => RetainableAttempt<SDKMessage> | Promise<RetainableAttempt<SDKMessage>>;\n};\n\ntype ManagedPool = {\n\taccounts: AccountSlot[];\n\tlane: Exclude<ClaudeSdkOauthTokenInjection, \"ambient\">;\n\tpinnedAccount?: string;\n\tstore: CredentialStore;\n};\n\nfunction managedEnvironment(parent: NodeJS.ProcessEnv): Record<string, string | undefined> {\n\tconst {\n\t\tANTHROPIC_API_KEY: _apiKey,\n\t\tANTHROPIC_AUTH_TOKEN: _authToken,\n\t\tANTHROPIC_BASE_URL: _gateway,\n\t\tANTHROPIC_CUSTOM_HEADERS: _customHeaders,\n\t\tCLAUDE_CODE_OAUTH_TOKEN: _oauthToken,\n\t\tCLAUDE_CODE_USE_BEDROCK: _bedrock,\n\t\tCLAUDE_CODE_USE_FOUNDRY: _foundry,\n\t\tCLAUDE_CODE_USE_GATEWAY: _gatewayMode,\n\t\tCLAUDE_CODE_USE_VERTEX: _vertex,\n\t\t...environment\n\t} = parent;\n\tfor (const name of Object.keys(environment)) {\n\t\tif (/^CLAUDE_CODE_OAUTH_TOKEN_\\d+$/.test(name)) delete environment[name];\n\t\tif (name.startsWith(\"SENPI_\")) delete environment[name];\n\t}\n\treturn environment;\n}\n\nfunction configDirectory(slot: AccountSlot): string {\n\tassertValidAccountName(slot.name);\n\treturn join(activeBoundary.getAgentDir(), \"claude-sdk-oauth-accounts\", slot.name);\n}\n\nfunction writeConfigCredentials(directory: string, slot: AccountSlot, access: string): void {\n\tmkdirSync(directory, { recursive: true, mode: 0o700 });\n\tchmodSync(directory, 0o700);\n\twriteFileSync(\n\t\tjoin(directory, \".credentials.json\"),\n\t\tJSON.stringify({\n\t\t\tclaudeAiOauth: {\n\t\t\t\taccessToken: access,\n\t\t\t\trefreshToken: slot.refresh,\n\t\t\t\texpiresAt: slot.expires,\n\t\t\t\tscopes: CLI_OAUTH_SCOPES,\n\t\t\t},\n\t\t}),\n\t\t{ encoding: \"utf8\", mode: 0o600 },\n\t);\n}\n\nasync function managedPool(settings: ClaudeSdkOauthProviderSettings): Promise<ManagedPool | undefined> {\n\tconst lane = settings.tokenInjection ?? \"ambient\";\n\tif (lane === \"ambient\") return undefined;\n\tconst store = activeBoundary.createStore();\n\tlet credential = await store.read(CLAUDE_SDK_OAUTH_PROVIDER_ID);\n\tconst environment = activeBoundary.env();\n\tlet accounts = listAccounts(\n\t\t(credential as ClaudeSdkOauthCredential | undefined) ?? emptyCredential(),\n\t\t(name) => environment[name],\n\t);\n\tif (!credential && accounts.length > 0) {\n\t\tcredential = await store.modify(CLAUDE_SDK_OAUTH_PROVIDER_ID, async () => emptyCredential());\n\t\taccounts = listAccounts(\n\t\t\t(credential as ClaudeSdkOauthCredential) ?? emptyCredential(),\n\t\t\t(name) => environment[name],\n\t\t);\n\t}\n\tif (accounts.length === 0) return undefined;\n\tconst stored = credential?.type === \"oauth\" ? (credential as ClaudeSdkOauthCredential) : undefined;\n\treturn { accounts, lane, pinnedAccount: settings.pinnedAccount ?? stored?.pinned, store };\n}\n\nasync function prepareSlot(pool: ManagedPool, selected: AccountSlot): Promise<Record<string, string | undefined>> {\n\tconst environment = activeBoundary.env();\n\tconst slot = selected;\n\tif (slot.source !== \"env\" && activeBoundary.now() >= slot.expires - EXPIRING_WITHIN_MS) {\n\t\ttry {\n\t\t\tconst refreshed = await refreshSlot(\n\t\t\t\tpool.store,\n\t\t\t\tCLAUDE_SDK_OAUTH_PROVIDER_ID,\n\t\t\t\tslot.name,\n\t\t\t\tactiveBoundary.refresher,\n\t\t\t\t(expires) => activeBoundary.now() >= expires - EXPIRING_WITHIN_MS,\n\t\t\t);\n\t\t\tconst credential = refreshed?.type === \"oauth\" ? (refreshed as ClaudeSdkOauthCredential) : undefined;\n\t\t\tconst updated = listAccounts(credential ?? emptyCredential(), (name) => environment[name]).find(\n\t\t\t\t(candidate) => candidate.name === slot.name,\n\t\t\t);\n\t\t\tif (!updated) throw new Error(\"selected account disappeared during refresh\");\n\t\t\tObject.assign(slot, updated);\n\t\t} catch (error) {\n\t\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`authentication_failed: ${detail}`);\n\t\t}\n\t}\n\tconst access = slot.source === \"env\" ? envSlotToken((name) => environment[name], slot.name) : slot.access;\n\tif (!access) throw new Error(\"authentication_failed: selected OAuth token is unavailable\");\n\tconst childEnvironment = managedEnvironment(environment);\n\tif (pool.lane === \"oauth-slots\") return { ...childEnvironment, CLAUDE_CODE_OAUTH_TOKEN: access };\n\tconst directory = configDirectory(slot);\n\twriteConfigCredentials(directory, slot, access);\n\treturn { ...childEnvironment, CLAUDE_CONFIG_DIR: directory };\n}\n\nfunction sdkFailure(message: SDKMessage): unknown | undefined {\n\tif (message.type === \"assistant\" && message.error) return message.error;\n\tif (message.type === \"result\" && message.subtype !== \"success\") {\n\t\tconst errors = \"errors\" in message && Array.isArray(message.errors) ? (message.errors as unknown[]) : [];\n\t\tif (errors.length > 0) return new Error(String(errors[0]));\n\t\t// `subtype` alone is too coarse to classify: a subscription limit and an\n\t\t// ordinary tool failure both arrive as \"error_during_execution\". The SDK\n\t\t// carries the real cause in `terminal_reason` (e.g. \"blocking_limit\"), so\n\t\t// append it — otherwise classifySdkError() scores every result error as\n\t\t// non-retryable \"other\", the exhausted account is never blocked, and a\n\t\t// multi-account pool never rotates past it.\n\t\tconst reason =\n\t\t\t\"terminal_reason\" in message && typeof message.terminal_reason === \"string\" ? message.terminal_reason : \"\";\n\t\treturn new Error(reason ? `Claude Code ${message.subtype}: ${reason}` : `Claude Code ${message.subtype}`);\n\t}\n\treturn undefined;\n}\n\nfunction visibleSdkMessage(message: SDKMessage): boolean {\n\tif (message.type !== \"stream_event\") return false;\n\treturn /^(?:content_block_start|content_block_delta|content_block_stop)$/.test(message.event.type);\n}\n\n/** Resolves managed OAuth immediately before each subprocess spawn and retries only pre-delta failures. */\nexport async function* queryWithAuthLane(input: AuthenticatedQueryInput): AsyncGenerator<SDKMessage> {\n\tconst pool = await managedPool(input.providerSettings);\n\tif (!pool) {\n\t\tconst options = input.buildOptions(\"ambient\");\n\t\tconst parentEnvironment = activeBoundary.env();\n\t\tconst ambientEnvironment: Record<string, string | undefined> = { ...parentEnvironment };\n\t\tfor (const name of Object.keys(ambientEnvironment)) {\n\t\t\tif (name.startsWith(\"SENPI_\")) delete ambientEnvironment[name];\n\t\t}\n\t\toptions.env = ambientEnvironment;\n\t\tyield* await createAttemptMessages(input, {\n\t\t\taccountName: \"ambient\",\n\t\t\taccounts: [],\n\t\t\tauthLane: \"ambient\",\n\t\t\toptions,\n\t\t});\n\t\treturn;\n\t}\n\tyield* runFailover({\n\t\taccounts: pool.accounts,\n\t\tselectFn: (accounts) =>\n\t\t\tselectAccount(accounts, {\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\tpinnedAccount: input.pinnedAccount ?? pool.pinnedAccount,\n\t\t\t\tnow: activeBoundary.now(),\n\t\t\t}),\n\t\trunAttempt: async (slot) => {\n\t\t\tconst options = input.buildOptions(pool.lane);\n\t\t\tconst accounts = pool.accounts.map((account) => ({ ...account }));\n\t\t\toptions.env = await prepareSlot(pool, slot);\n\t\t\treturn createAttemptMessages(input, {\n\t\t\t\taccountName: slot.name,\n\t\t\t\taccounts,\n\t\t\t\tauthLane: pool.lane,\n\t\t\t\toptions,\n\t\t\t});\n\t\t},\n\t\tclassify: classifySdkError,\n\t\tstore: pool.store,\n\t\tproviderId: CLAUDE_SDK_OAUTH_PROVIDER_ID,\n\t\tnow: activeBoundary.now,\n\t\terrorFromEvent: sdkFailure,\n\t\tisVisibleDelta: visibleSdkMessage,\n\t\tonFailover: ({ account, nextAccount, classification }) => {\n\t\t\temitProviderAccountsChanged(CLAUDE_SDK_OAUTH_PROVIDER_ID);\n\t\t\tif (nextAccount) {\n\t\t\t\temitProviderAccountFailover(\n\t\t\t\t\tCLAUDE_SDK_OAUTH_PROVIDER_ID,\n\t\t\t\t\taccount.name,\n\t\t\t\t\tnextAccount.name,\n\t\t\t\t\tclassification.kind,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-tools-schema.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"custom-tools-schema.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/custom-tools-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAK,MAAM,KAAK,CAAC;AAE3D,KAAK,UAAU,GAAG;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA8CF,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE5D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,CAUjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-tools-schema.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"custom-tools-schema.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/custom-tools-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ZodRawShape, type ZodTypeAny, z } from \"zod\";\n\ntype JsonSchema = {\n\ttype?: string | string[];\n\tproperties?: Record<string, JsonSchema>;\n\trequired?: string[];\n\titems?: JsonSchema;\n\tenum?: Array<string | number | boolean>;\n\tconst?: string | number | boolean | null;\n\tanyOf?: JsonSchema[];\n\toneOf?: JsonSchema[];\n\tdescription?: string;\n};\n\nfunction schemaToZod(schema: JsonSchema): ZodTypeAny {\n\tif (schema.const !== undefined) {\n\t\treturn schema.const === null ? z.null() : z.literal(schema.const);\n\t}\n\tif (schema.enum && schema.enum.length > 0) {\n\t\tconst values = schema.enum.filter((value): value is string | number | boolean =>\n\t\t\t[\"string\", \"number\", \"boolean\"].includes(typeof value),\n\t\t);\n\t\tif (values.length === 1) {\n\t\t\treturn z.literal(values[0]!);\n\t\t}\n\t\tif (values.length > 1) {\n\t\t\tconst [first, second, ...rest] = values.map((value) => z.literal(value));\n\t\t\treturn z.union([first!, second!, ...rest]);\n\t\t}\n\t}\n\tconst variants = schema.anyOf ?? schema.oneOf;\n\tif (variants && variants.length > 0) {\n\t\tconst converted = variants.map((variant) => schemaToZod(variant));\n\t\tif (converted.length === 1) return converted[0]!;\n\t\tconst [first, second, ...rest] = converted;\n\t\treturn z.union([first!, second!, ...rest]);\n\t}\n\tconst type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n\tswitch (type) {\n\t\tcase \"string\":\n\t\t\treturn z.string();\n\t\tcase \"number\":\n\t\t\treturn z.number();\n\t\tcase \"integer\":\n\t\t\treturn z.number().int();\n\t\tcase \"boolean\":\n\t\t\treturn z.boolean();\n\t\tcase \"null\":\n\t\t\treturn z.null();\n\t\tcase \"array\":\n\t\t\treturn z.array(schema.items ? schemaToZod(schema.items) : z.unknown());\n\t\tcase \"object\":\n\t\t\treturn objectToShape(schema);\n\t\tdefault:\n\t\t\treturn z.unknown();\n\t}\n}\n\nexport function objectToShape(schema: JsonSchema): ZodTypeAny {\n\treturn z.object(jsonSchemaToZodShape(schema));\n}\n\nexport function jsonSchemaToZodShape(schema: unknown): ZodRawShape {\n\tconst object = (schema ?? {}) as JsonSchema;\n\tconst properties = object.properties ?? {};\n\tconst required = new Set(object.required ?? []);\n\tconst shape: Record<string, ZodTypeAny> = {};\n\tfor (const [key, value] of Object.entries(properties)) {\n\t\tconst converted = schemaToZod(value);\n\t\tshape[key] = required.has(key) ? converted : converted.optional();\n\t}\n\treturn shape;\n}\n"]}
|
package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts.map
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"custom-tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/custom-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrE,KAAK,oBAAoB,GAAG,UAAU,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAE1E,wBAAsB,uBAAuB;;cAEzB,MAAM;;;;GAGzB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,SAAS,CAarH"}
|
package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js.map
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"custom-tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/custom-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAoB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAIzF,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC5C,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC;QACzE,OAAO,EAAE,IAAI;KACb,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAA4B;IAClE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,kBAAkB,CAAC;QAClD,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;YAClD,OAAO,EAAE,uBAAuB;SAChC,CAAC,CAAC;KACH,CAAC,CAAC;IACH,OAAO,EAAE,CAAC,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC","sourcesContent":["import type { Tool } from \"@earendil-works/pi-ai\";\nimport { jsonSchemaToZodShape } from \"./custom-tools-schema.ts\";\nimport { getSdkBoundary, type SdkBoundary } from \"./sdk-boundary.ts\";\nimport { CUSTOM_TOOLS_MCP_SERVER_NAME, TOOL_EXECUTION_DENIED_MESSAGE } from \"./tools.ts\";\n\ntype CustomToolsMcpServer = ReturnType<SdkBoundary[\"createSdkMcpServer\"]>;\n\nexport async function denyCustomToolExecution() {\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: TOOL_EXECUTION_DENIED_MESSAGE }],\n\t\tisError: true,\n\t};\n}\n\n/**\n * Exposes senpi-only tools to Claude Code's planner. The SDK handler is deliberately\n * unusable: senpi receives the matching streamed tool call and executes it itself.\n */\nexport function buildCustomToolServers(customTools: readonly Tool[]): Record<string, CustomToolsMcpServer> | undefined {\n\tif (customTools.length === 0) return undefined;\n\tconst server = getSdkBoundary().createSdkMcpServer({\n\t\tname: CUSTOM_TOOLS_MCP_SERVER_NAME,\n\t\tversion: \"1.0.0\",\n\t\ttools: customTools.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tinputSchema: jsonSchemaToZodShape(tool.parameters),\n\t\t\thandler: denyCustomToolExecution,\n\t\t})),\n\t});\n\treturn { [CUSTOM_TOOLS_MCP_SERVER_NAME]: server };\n}\n"]}
|
|
@@ -3,6 +3,6 @@ export type SdkErrorClassification = {
|
|
|
3
3
|
kind: SdkErrorKind;
|
|
4
4
|
retryable: boolean;
|
|
5
5
|
};
|
|
6
|
-
/** Classifies Claude
|
|
6
|
+
/** Classifies Claude SDK OAuth error codes and HTTP-shaped fallback text in one place. */
|
|
7
7
|
export declare function classifySdkError(error: unknown): SdkErrorClassification;
|
|
8
8
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,iBAAiB,GAAG,OAAO,CAAC;AAEhH,MAAM,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC;AAgCF,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAwBvE"}
|
|
@@ -29,7 +29,7 @@ function errorText(error) {
|
|
|
29
29
|
return code;
|
|
30
30
|
return String(error);
|
|
31
31
|
}
|
|
32
|
-
/** Classifies Claude
|
|
32
|
+
/** Classifies Claude SDK OAuth error codes and HTTP-shaped fallback text in one place. */
|
|
33
33
|
export function classifySdkError(error) {
|
|
34
34
|
const text = errorText(error).toLowerCase();
|
|
35
35
|
for (const [code, classification] of Object.entries(SDK_ERROR_CLASSIFICATIONS)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
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"]}
|
package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts.map
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executable.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"executable.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/executable.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;CACpD,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CASvF;AAaD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAwBxE;AAOD,wBAAgB,qBAAqB,IAAI,cAAc,CActD"}
|
package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js.map
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executable.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"executable.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/executable.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\";\nimport { extractFromBunfs } from \"@anthropic-ai/claude-agent-sdk/extract\";\n\nexport type ExecutableDeps = {\n\tplatform: string;\n\tarch: string;\n\tenv: (name: string) => string | undefined;\n\tresolve: (spec: string) => string;\n\tisCompiledBun?: () => boolean;\n\textractFromBunfs?: (embeddedPath: string) => string;\n};\n\nexport function claudeCodeExecutableCandidates(platform: string, arch: string): string[] {\n\tconst ext = platform === \"win32\" ? \".exe\" : \"\";\n\tif (platform === \"linux\") {\n\t\treturn [\n\t\t\t`@anthropic-ai/claude-agent-sdk-linux-${arch}-musl/claude${ext}`,\n\t\t\t`@anthropic-ai/claude-agent-sdk-linux-${arch}/claude${ext}`,\n\t\t];\n\t}\n\treturn [`@anthropic-ai/claude-agent-sdk-${platform}-${arch}/claude${ext}`];\n}\n\nfunction firstResolvable(candidates: string[], resolve: (spec: string) => string): string | undefined {\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\treturn resolve(candidate);\n\t\t} catch {\n\t\t\t// try next candidate\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function resolveClaudeCodeExecutable(deps: ExecutableDeps): string {\n\tconst override = deps.env(\"CLAUDE_CODE_EXECUTABLE\");\n\tif (override) return override;\n\n\tconst candidates = claudeCodeExecutableCandidates(deps.platform, deps.arch);\n\n\tif (deps.isCompiledBun?.() && deps.extractFromBunfs) {\n\t\tconst embedded = firstResolvable(candidates, deps.resolve);\n\t\tif (embedded !== undefined) {\n\t\t\ttry {\n\t\t\t\treturn deps.extractFromBunfs(embedded);\n\t\t\t} catch {\n\t\t\t\t// not embedded in the bundle - fall through to the on-disk probe\n\t\t\t}\n\t\t}\n\t}\n\n\tconst resolved = firstResolvable(candidates, deps.resolve);\n\tif (resolved !== undefined) return resolved;\n\n\tthrow new Error(\n\t\t`Claude native binary not found for ${deps.platform}-${deps.arch}. ` +\n\t\t\t\"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, or set CLAUDE_CODE_EXECUTABLE.\",\n\t);\n}\n\nlet defaultRequire: ReturnType<typeof createRequire> | null = null;\n\nconst isCompiledBunBinary =\n\timport.meta.url.includes(\"$bunfs\") || import.meta.url.includes(\"~BUN\") || import.meta.url.includes(\"%7EBUN\");\n\nexport function defaultExecutableDeps(): ExecutableDeps {\n\treturn {\n\t\tplatform: process.platform,\n\t\tarch: process.arch,\n\t\tenv: (name) => process.env[name],\n\t\tisCompiledBun: () => isCompiledBunBinary,\n\t\textractFromBunfs,\n\t\tresolve: (spec) => {\n\t\t\tif (!defaultRequire) {\n\t\t\t\tdefaultRequire = createRequire(import.meta.resolve(\"@anthropic-ai/claude-agent-sdk\"));\n\t\t\t}\n\t\t\treturn defaultRequire.resolve(spec);\n\t\t},\n\t};\n}\n"]}
|
package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts.map
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failover.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-
|
|
1
|
+
{"version":3,"file":"failover.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/failover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,eAAe,CAAC;AAE3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,uBAAuB,QAAuB,CAAC;AAC5D,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAClD,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AAIpE,MAAM,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,MAAM,IAAI;IACrC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,KAAK,WAAW,CAAC;IAC5D,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,sBAAsB,CAAC;IACrD,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IACxD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,cAAc,EAAE,sBAAsB,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAEpC,YAAY,cAAc,EAAE,sBAAsB,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAOhG;CACD;AA8ED;;;;GAIG;AACH,wBAAuB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CA4CnG"}
|
|
@@ -128,6 +128,6 @@ export async function* runFailover(options) {
|
|
|
128
128
|
throw classified;
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
|
-
throw lastError ?? new Error("Claude
|
|
131
|
+
throw lastError ?? new Error("Claude SDK OAuth failover exhausted without an attempt");
|
|
132
132
|
}
|
|
133
133
|
//# sourceMappingURL=failover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failover.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/failover.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CredentialStore } from \"@earendil-works/pi-ai\";\nimport type { AccountSlot, ClaudeAgentSdkCredential } from \"./accounts.ts\";\nimport { clearExpiredBlocks } from \"./affinity.ts\";\nimport type { SdkErrorClassification } from \"./errors.ts\";\n\nexport const MAX_RATE_LIMIT_BLOCK_MS = 48 * 60 * 60 * 1_000;\nexport const DEFAULT_RATE_LIMIT_BLOCK_MS = 60_000;\nexport const TURN_RETRY_SUPPRESSION_PREFIX = \"senpi:no-turn-retry:\";\n\ntype RecordValue = Record<string, unknown>;\n\nexport type FailoverEvent = {\n\taccount: AccountSlot;\n\tnextAccount?: AccountSlot;\n\tclassification: SdkErrorClassification;\n\tattempt: number;\n\tvisibleDeltaEmitted: boolean;\n};\n\nexport type FailoverOptions<TEvent> = {\n\taccounts: readonly AccountSlot[];\n\tselectFn: (accounts: readonly AccountSlot[]) => AccountSlot;\n\trunAttempt: (slot: AccountSlot) => AsyncIterable<TEvent> | Promise<AsyncIterable<TEvent>>;\n\tclassify: (error: unknown) => SdkErrorClassification;\n\tstore: CredentialStore;\n\tproviderId: string;\n\tnow?: () => number;\n\tbaseBlockMs?: number;\n\tonFailover?: (event: FailoverEvent) => void | Promise<void>;\n\terrorFromEvent?: (event: TEvent) => unknown | undefined;\n\tisVisibleDelta?: (event: TEvent) => boolean;\n};\n\nexport class ClassifiedSdkError extends Error {\n\treadonly classification: SdkErrorClassification;\n\treadonly original: unknown;\n\treadonly suppressTurnRetry: boolean;\n\n\tconstructor(classification: SdkErrorClassification, original: unknown, suppressTurnRetry: boolean) {\n\t\tconst detail = original instanceof Error ? original.message : String(original);\n\t\tsuper(`${suppressTurnRetry ? TURN_RETRY_SUPPRESSION_PREFIX : \"\"}${detail}`);\n\t\tthis.name = \"ClassifiedSdkError\";\n\t\tthis.classification = classification;\n\t\tthis.original = original;\n\t\tthis.suppressTurnRetry = suppressTurnRetry;\n\t}\n}\n\nfunction record(value: unknown): RecordValue | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value) ? (value as RecordValue) : undefined;\n}\n\nfunction defaultErrorFromEvent<TEvent>(event: TEvent): unknown | undefined {\n\tconst value = record(event);\n\treturn value?.type === \"error\" ? value.error : undefined;\n}\n\nfunction defaultIsVisibleDelta<TEvent>(event: TEvent): boolean {\n\tconst value = record(event);\n\tif (typeof value?.type !== \"string\") return false;\n\treturn /^(?:text|thinking|toolcall)_(?:start|delta|end)$/.test(value.type);\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\treturn typeof value?.message === \"string\" ? value.message : String(error);\n}\n\nfunction retryAfterMs(error: unknown): number | undefined {\n\tconst value = record(error);\n\tconst explicit = value?.retryAfterMs;\n\tif (typeof explicit === \"number\" && Number.isFinite(explicit) && explicit > 0) return Math.ceil(explicit);\n\tconst text = errorText(error);\n\tconst milliseconds = text.match(/\\bretry[-_ ]?after[-_ ]?ms\\s*[:=]\\s*(\\d+(?:\\.\\d+)?)/i);\n\tif (milliseconds) return Math.ceil(Number(milliseconds[1]));\n\tconst seconds = text.match(/\\bretry[-_ ]?after\\s*[:=]\\s*(\\d+(?:\\.\\d+)?)/i);\n\treturn seconds ? Math.ceil(Number(seconds[1]) * 1_000) : undefined;\n}\n\nfunction blockedAccount(\n\taccount: AccountSlot,\n\tclassification: SdkErrorClassification,\n\tnow: number,\n\tattempt: number,\n\tbaseBlockMs: number,\n\terror: unknown,\n): AccountSlot {\n\tif (classification.kind === \"auth_error\") {\n\t\tconst { blockedUntil: _blockedUntil, ...withoutExpiry } = account;\n\t\treturn { ...withoutExpiry, blockReason: \"auth_error\" };\n\t}\n\tconst fallback = Math.min(MAX_RATE_LIMIT_BLOCK_MS, baseBlockMs * 2 ** attempt);\n\tconst duration = Math.min(MAX_RATE_LIMIT_BLOCK_MS, retryAfterMs(error) ?? fallback);\n\treturn { ...account, blockedUntil: now + duration, blockReason: classification.kind };\n}\n\nfunction replaceAccount(accounts: readonly AccountSlot[], replacement: AccountSlot): AccountSlot[] {\n\treturn accounts.map((account) => (account.name === replacement.name ? replacement : account));\n}\n\nasync function persistBlock(store: CredentialStore, providerId: string, account: AccountSlot): Promise<void> {\n\tawait store.modify(providerId, async (current) => {\n\t\tif (current?.type !== \"oauth\") return current;\n\t\tconst credential = current as ClaudeAgentSdkCredential;\n\t\tif (account.source === \"env\") {\n\t\t\treturn {\n\t\t\t\t...credential,\n\t\t\t\tslotState: {\n\t\t\t\t\t...credential.slotState,\n\t\t\t\t\t[account.name]: { blockedUntil: account.blockedUntil, blockReason: account.blockReason },\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconst accounts = (credential.accounts ?? []).map((existing) =>\n\t\t\texisting.name === account.name\n\t\t\t\t? { ...existing, blockedUntil: account.blockedUntil, blockReason: account.blockReason }\n\t\t\t\t: existing,\n\t\t);\n\t\treturn { ...credential, accounts };\n\t});\n}\n\n/**\n * Runs at most one attempt per account. A retry is transparent only before a\n * text, thinking, or tool-call event reaches the caller; post-delta failures\n * are marked so AgentSession never replays the partial turn.\n */\nexport async function* runFailover<TEvent>(options: FailoverOptions<TEvent>): AsyncGenerator<TEvent> {\n\tconst now = options.now ?? Date.now;\n\tconst baseBlockMs = options.baseBlockMs ?? DEFAULT_RATE_LIMIT_BLOCK_MS;\n\tlet accounts = clearExpiredBlocks(options.accounts, now());\n\tlet lastError: ClassifiedSdkError | undefined;\n\n\tfor (let attempt = 0; attempt < accounts.length; attempt++) {\n\t\tconst account = options.selectFn(accounts);\n\t\tlet visibleDeltaEmitted = false;\n\t\ttry {\n\t\t\tconst attemptStream = await options.runAttempt(account);\n\t\t\tfor await (const event of attemptStream) {\n\t\t\t\tconst failure = (options.errorFromEvent ?? defaultErrorFromEvent)(event);\n\t\t\t\tif (failure !== undefined) throw failure;\n\t\t\t\tvisibleDeltaEmitted ||= (options.isVisibleDelta ?? defaultIsVisibleDelta)(event);\n\t\t\t\tyield event;\n\t\t\t}\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tconst classification = options.classify(error);\n\t\t\tconst classified = new ClassifiedSdkError(classification, error, visibleDeltaEmitted);\n\t\t\tlastError = classified;\n\t\t\tif (!classification.retryable) throw classified;\n\n\t\t\tconst blocked = blockedAccount(account, classification, now(), attempt, baseBlockMs, error);\n\t\t\taccounts = replaceAccount(accounts, blocked);\n\t\t\tawait persistBlock(options.store, options.providerId, blocked);\n\t\t\tconst event: FailoverEvent = {\n\t\t\t\taccount: blocked,\n\t\t\t\tclassification,\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\tvisibleDeltaEmitted,\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tif (!visibleDeltaEmitted && attempt + 1 < accounts.length) {\n\t\t\t\t\tevent.nextAccount = options.selectFn(accounts);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait options.onFailover?.(event);\n\t\t\t}\n\t\t\tif (visibleDeltaEmitted) throw classified;\n\t\t}\n\t}\n\tthrow lastError ?? new Error(\"Claude Agent SDK failover exhausted without an attempt\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"failover.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/failover.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AAC5D,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAClD,MAAM,CAAC,MAAM,6BAA6B,GAAG,sBAAsB,CAAC;AA0BpE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAK5C,YAAY,cAAsC,EAAE,QAAiB,EAAE,iBAA0B;QAChG,MAAM,MAAM,GAAG,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/E,KAAK,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC5C,CAAC;CACD;AAED,SAAS,MAAM,CAAC,KAAc;IAC7B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;AAClH,CAAC;AAED,SAAS,qBAAqB,CAAS,KAAa;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,SAAS,qBAAqB,CAAS,KAAa;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,kDAAkD,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5E,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,OAAO,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,KAAK,EAAE,YAAY,CAAC;IACrC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACxF,IAAI,YAAY;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC3E,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,cAAc,CACtB,OAAoB,EACpB,cAAsC,EACtC,GAAW,EACX,OAAe,EACf,WAAmB,EACnB,KAAc;IAEd,IAAI,cAAc,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;QAClE,OAAO,EAAE,GAAG,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;IACpF,OAAO,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,GAAG,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,cAAc,CAAC,QAAgC,EAAE,WAAwB;IACjF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAsB,EAAE,UAAkB,EAAE,OAAoB;IAC3F,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChD,IAAI,OAAO,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC;QAC9C,MAAM,UAAU,GAAG,OAAmC,CAAC;QACvD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC9B,OAAO;gBACN,GAAG,UAAU;gBACb,SAAS,EAAE;oBACV,GAAG,UAAU,CAAC,SAAS;oBACvB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;iBACxF;aACD,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7D,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;YAC7B,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;YACvF,CAAC,CAAC,QAAQ,CACX,CAAC;QACF,OAAO,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,WAAW,CAAS,OAAgC;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,2BAA2B,CAAC;IACvE,IAAI,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,IAAI,SAAyC,CAAC;IAE9C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,CAAC;gBACzE,IAAI,OAAO,KAAK,SAAS;oBAAE,MAAM,OAAO,CAAC;gBACzC,mBAAmB,KAAK,CAAC,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,CAAC;gBACjF,MAAM,KAAK,CAAC;YACb,CAAC;YACD,OAAO;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,cAAc,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;YACtF,SAAS,GAAG,UAAU,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,SAAS;gBAAE,MAAM,UAAU,CAAC;YAEhD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAC5F,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAkB;gBAC5B,OAAO,EAAE,OAAO;gBAChB,cAAc;gBACd,OAAO,EAAE,OAAO,GAAG,CAAC;gBACpB,mBAAmB;aACnB,CAAC;YACF,IAAI,CAAC;gBACJ,IAAI,CAAC,mBAAmB,IAAI,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC3D,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAChD,CAAC;YACF,CAAC;oBAAS,CAAC;gBACV,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,mBAAmB;gBAAE,MAAM,UAAU,CAAC;QAC3C,CAAC;IACF,CAAC;IACD,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AACxF,CAAC","sourcesContent":["import type { CredentialStore } from \"@earendil-works/pi-ai\";\nimport type { AccountSlot, ClaudeSdkOauthCredential } from \"./accounts.ts\";\nimport { clearExpiredBlocks } from \"./affinity.ts\";\nimport type { SdkErrorClassification } from \"./errors.ts\";\n\nexport const MAX_RATE_LIMIT_BLOCK_MS = 48 * 60 * 60 * 1_000;\nexport const DEFAULT_RATE_LIMIT_BLOCK_MS = 60_000;\nexport const TURN_RETRY_SUPPRESSION_PREFIX = \"senpi:no-turn-retry:\";\n\ntype RecordValue = Record<string, unknown>;\n\nexport type FailoverEvent = {\n\taccount: AccountSlot;\n\tnextAccount?: AccountSlot;\n\tclassification: SdkErrorClassification;\n\tattempt: number;\n\tvisibleDeltaEmitted: boolean;\n};\n\nexport type FailoverOptions<TEvent> = {\n\taccounts: readonly AccountSlot[];\n\tselectFn: (accounts: readonly AccountSlot[]) => AccountSlot;\n\trunAttempt: (slot: AccountSlot) => AsyncIterable<TEvent> | Promise<AsyncIterable<TEvent>>;\n\tclassify: (error: unknown) => SdkErrorClassification;\n\tstore: CredentialStore;\n\tproviderId: string;\n\tnow?: () => number;\n\tbaseBlockMs?: number;\n\tonFailover?: (event: FailoverEvent) => void | Promise<void>;\n\terrorFromEvent?: (event: TEvent) => unknown | undefined;\n\tisVisibleDelta?: (event: TEvent) => boolean;\n};\n\nexport class ClassifiedSdkError extends Error {\n\treadonly classification: SdkErrorClassification;\n\treadonly original: unknown;\n\treadonly suppressTurnRetry: boolean;\n\n\tconstructor(classification: SdkErrorClassification, original: unknown, suppressTurnRetry: boolean) {\n\t\tconst detail = original instanceof Error ? original.message : String(original);\n\t\tsuper(`${suppressTurnRetry ? TURN_RETRY_SUPPRESSION_PREFIX : \"\"}${detail}`);\n\t\tthis.name = \"ClassifiedSdkError\";\n\t\tthis.classification = classification;\n\t\tthis.original = original;\n\t\tthis.suppressTurnRetry = suppressTurnRetry;\n\t}\n}\n\nfunction record(value: unknown): RecordValue | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value) ? (value as RecordValue) : undefined;\n}\n\nfunction defaultErrorFromEvent<TEvent>(event: TEvent): unknown | undefined {\n\tconst value = record(event);\n\treturn value?.type === \"error\" ? value.error : undefined;\n}\n\nfunction defaultIsVisibleDelta<TEvent>(event: TEvent): boolean {\n\tconst value = record(event);\n\tif (typeof value?.type !== \"string\") return false;\n\treturn /^(?:text|thinking|toolcall)_(?:start|delta|end)$/.test(value.type);\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\treturn typeof value?.message === \"string\" ? value.message : String(error);\n}\n\nfunction retryAfterMs(error: unknown): number | undefined {\n\tconst value = record(error);\n\tconst explicit = value?.retryAfterMs;\n\tif (typeof explicit === \"number\" && Number.isFinite(explicit) && explicit > 0) return Math.ceil(explicit);\n\tconst text = errorText(error);\n\tconst milliseconds = text.match(/\\bretry[-_ ]?after[-_ ]?ms\\s*[:=]\\s*(\\d+(?:\\.\\d+)?)/i);\n\tif (milliseconds) return Math.ceil(Number(milliseconds[1]));\n\tconst seconds = text.match(/\\bretry[-_ ]?after\\s*[:=]\\s*(\\d+(?:\\.\\d+)?)/i);\n\treturn seconds ? Math.ceil(Number(seconds[1]) * 1_000) : undefined;\n}\n\nfunction blockedAccount(\n\taccount: AccountSlot,\n\tclassification: SdkErrorClassification,\n\tnow: number,\n\tattempt: number,\n\tbaseBlockMs: number,\n\terror: unknown,\n): AccountSlot {\n\tif (classification.kind === \"auth_error\") {\n\t\tconst { blockedUntil: _blockedUntil, ...withoutExpiry } = account;\n\t\treturn { ...withoutExpiry, blockReason: \"auth_error\" };\n\t}\n\tconst fallback = Math.min(MAX_RATE_LIMIT_BLOCK_MS, baseBlockMs * 2 ** attempt);\n\tconst duration = Math.min(MAX_RATE_LIMIT_BLOCK_MS, retryAfterMs(error) ?? fallback);\n\treturn { ...account, blockedUntil: now + duration, blockReason: classification.kind };\n}\n\nfunction replaceAccount(accounts: readonly AccountSlot[], replacement: AccountSlot): AccountSlot[] {\n\treturn accounts.map((account) => (account.name === replacement.name ? replacement : account));\n}\n\nasync function persistBlock(store: CredentialStore, providerId: string, account: AccountSlot): Promise<void> {\n\tawait store.modify(providerId, async (current) => {\n\t\tif (current?.type !== \"oauth\") return current;\n\t\tconst credential = current as ClaudeSdkOauthCredential;\n\t\tif (account.source === \"env\") {\n\t\t\treturn {\n\t\t\t\t...credential,\n\t\t\t\tslotState: {\n\t\t\t\t\t...credential.slotState,\n\t\t\t\t\t[account.name]: { blockedUntil: account.blockedUntil, blockReason: account.blockReason },\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconst accounts = (credential.accounts ?? []).map((existing) =>\n\t\t\texisting.name === account.name\n\t\t\t\t? { ...existing, blockedUntil: account.blockedUntil, blockReason: account.blockReason }\n\t\t\t\t: existing,\n\t\t);\n\t\treturn { ...credential, accounts };\n\t});\n}\n\n/**\n * Runs at most one attempt per account. A retry is transparent only before a\n * text, thinking, or tool-call event reaches the caller; post-delta failures\n * are marked so AgentSession never replays the partial turn.\n */\nexport async function* runFailover<TEvent>(options: FailoverOptions<TEvent>): AsyncGenerator<TEvent> {\n\tconst now = options.now ?? Date.now;\n\tconst baseBlockMs = options.baseBlockMs ?? DEFAULT_RATE_LIMIT_BLOCK_MS;\n\tlet accounts = clearExpiredBlocks(options.accounts, now());\n\tlet lastError: ClassifiedSdkError | undefined;\n\n\tfor (let attempt = 0; attempt < accounts.length; attempt++) {\n\t\tconst account = options.selectFn(accounts);\n\t\tlet visibleDeltaEmitted = false;\n\t\ttry {\n\t\t\tconst attemptStream = await options.runAttempt(account);\n\t\t\tfor await (const event of attemptStream) {\n\t\t\t\tconst failure = (options.errorFromEvent ?? defaultErrorFromEvent)(event);\n\t\t\t\tif (failure !== undefined) throw failure;\n\t\t\t\tvisibleDeltaEmitted ||= (options.isVisibleDelta ?? defaultIsVisibleDelta)(event);\n\t\t\t\tyield event;\n\t\t\t}\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tconst classification = options.classify(error);\n\t\t\tconst classified = new ClassifiedSdkError(classification, error, visibleDeltaEmitted);\n\t\t\tlastError = classified;\n\t\t\tif (!classification.retryable) throw classified;\n\n\t\t\tconst blocked = blockedAccount(account, classification, now(), attempt, baseBlockMs, error);\n\t\t\taccounts = replaceAccount(accounts, blocked);\n\t\t\tawait persistBlock(options.store, options.providerId, blocked);\n\t\t\tconst event: FailoverEvent = {\n\t\t\t\taccount: blocked,\n\t\t\t\tclassification,\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\tvisibleDeltaEmitted,\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tif (!visibleDeltaEmitted && attempt + 1 < accounts.length) {\n\t\t\t\t\tevent.nextAccount = options.selectFn(accounts);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait options.onFailover?.(event);\n\t\t\t}\n\t\t\tif (visibleDeltaEmitted) throw classified;\n\t\t}\n\t}\n\tthrow lastError ?? new Error(\"Claude SDK OAuth failover exhausted without an attempt\");\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SdkErrorKind } from "./errors.ts";
|
|
2
|
+
export declare function noAccountGuidance(hasAnthropicCredential: boolean): string;
|
|
3
|
+
export declare function allAccountsBlockedGuidance(soonestUnblockAt: number | undefined): string;
|
|
4
|
+
export declare function sdkErrorGuidance(kind: SdkErrorKind): string | undefined;
|
|
5
|
+
export declare function missingBinaryGuidance(platform: string, arch: string): string;
|
|
6
|
+
export type SystemPromptMode = "full" | "override" | "preset-append";
|
|
7
|
+
export declare function overrideSystemPromptGuidance(path: string | undefined, reason: string): string;
|
|
8
|
+
export declare function resetPresetAppendDeprecation(sessionId?: string): void;
|
|
9
|
+
export declare function presetAppendDeprecationGuidance(options: {
|
|
10
|
+
mode: SystemPromptMode;
|
|
11
|
+
conflict?: boolean;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
}): string | undefined;
|
|
14
|
+
//# sourceMappingURL=guidance.d.ts.map
|
|
@@ -0,0 +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,CAWvE;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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const PROVIDER = "claude-
|
|
1
|
+
const PROVIDER = "claude-sdk-oauth";
|
|
2
2
|
export function noAccountGuidance(hasAnthropicCredential) {
|
|
3
3
|
const lines = [
|
|
4
4
|
`No Claude account configured for ${PROVIDER}.`,
|
|
@@ -39,4 +39,40 @@ export function missingBinaryGuidance(platform, arch) {
|
|
|
39
39
|
"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, or set CLAUDE_CODE_EXECUTABLE.",
|
|
40
40
|
].join("\n");
|
|
41
41
|
}
|
|
42
|
+
export function overrideSystemPromptGuidance(path, reason) {
|
|
43
|
+
const target = path === undefined ? "systemPromptFile" : `systemPromptFile "${path}"`;
|
|
44
|
+
return [
|
|
45
|
+
`Claude SDK OAuth override prompt could not load ${target}: ${reason}.`,
|
|
46
|
+
'Set claudeSdkOauthProvider.systemPromptFile to a readable, non-empty UTF-8 prompt file, or select systemPromptMode "full".',
|
|
47
|
+
].join(" ");
|
|
48
|
+
}
|
|
49
|
+
const armedSessions = new Set();
|
|
50
|
+
export function resetPresetAppendDeprecation(sessionId) {
|
|
51
|
+
if (sessionId !== undefined) {
|
|
52
|
+
armedSessions.delete(sessionId);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
armedSessions.clear();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function presetAppendDeprecationGuidance(options) {
|
|
59
|
+
if (armedSessions.has(options.sessionId)) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const isDeprecated = options.mode === "preset-append";
|
|
63
|
+
if (!options.conflict && !isDeprecated) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
armedSessions.add(options.sessionId);
|
|
67
|
+
const parts = [];
|
|
68
|
+
if (isDeprecated) {
|
|
69
|
+
parts.push("preset-append system-prompt mode is deprecated; " +
|
|
70
|
+
"`full` mode delivers the complete senpi system prompt; " +
|
|
71
|
+
"preset-append will be removed after one release.");
|
|
72
|
+
}
|
|
73
|
+
if (options.conflict) {
|
|
74
|
+
parts.push("systemPromptMode wins.");
|
|
75
|
+
}
|
|
76
|
+
return parts.join(" ");
|
|
77
|
+
}
|
|
42
78
|
//# sourceMappingURL=guidance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 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"]}
|