@code-yeongyu/senpi 2026.9.7 → 2026.9.8
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 +79 -0
- package/dist/core/agent-session.d.ts +40 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +159 -40
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +2 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/dynamic-prompt/working-task.js +1 -1
- package/dist/core/dynamic-prompt/working-task.js.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.js +4 -21
- package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js +10 -25
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +36 -19
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js +21 -10
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +4 -17
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +23 -33
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +5 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js +8 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts +6 -5
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js +6 -5
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts +8 -0
- package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/circuit-breaker.js +8 -0
- package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +125 -20
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts +18 -0
- package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js +20 -0
- package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +54 -11
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +3 -0
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js +47 -23
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js +11 -0
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +6 -4
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm.d.ts +25 -1
- package/dist/core/extensions/builtin/goal/cache-warm.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm.js +29 -10
- package/dist/core/extensions/builtin/goal/cache-warm.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts +3 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js +17 -2
- package/dist/core/extensions/builtin/goal/continuation.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 +1 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +8 -3
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.d.ts +5 -1
- package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.js +9 -26
- package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/plugin-manifest.js +2 -2
- package/dist/core/extensions/builtin/hooks/plugin-manifest.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/safety.js +2 -2
- package/dist/core/extensions/builtin/hooks/safety.js.map +1 -1
- package/dist/core/extensions/builtin/monitor-state-event.d.ts +18 -0
- package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
- package/dist/core/extensions/builtin/monitor-state-event.js +23 -0
- package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +24 -0
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -0
- package/dist/core/extensions/builtin/oauth-login-interaction.js +77 -0
- package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -0
- package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.js +5 -51
- package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +5 -7
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +14 -7
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +34 -13
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +6 -10
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +14 -9
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +15 -15
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +49 -21
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/service-tier.d.ts +2 -0
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +17 -1
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/durable-command.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/durable-command.js +3 -0
- package/dist/core/extensions/builtin/terminal/durable-command.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/durable-file.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/durable-file.js +2 -0
- package/dist/core/extensions/builtin/terminal/durable-file.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +14 -2
- 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 +27 -5
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +17 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +76 -14
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.d.ts +2 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +6 -1
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.d.ts +3 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.js +13 -0
- package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.d.ts +13 -2
- package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.js +15 -2
- package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +8 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
- package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-search/index.js +1 -0
- package/dist/core/extensions/builtin/tool-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/tool-search/service.d.ts +4 -0
- package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-search/service.js +11 -0
- package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +8 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +9 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/high-reasoning-warning.d.ts.map +1 -1
- package/dist/core/high-reasoning-warning.js +4 -6
- package/dist/core/high-reasoning-warning.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +25 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.js +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-shapes.js.map +1 -1
- package/dist/core/tools/bounded-realpath.d.ts +28 -0
- package/dist/core/tools/bounded-realpath.d.ts.map +1 -0
- package/dist/core/tools/bounded-realpath.js +53 -0
- package/dist/core/tools/bounded-realpath.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +15 -13
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/filesystem-policy.d.ts +7 -0
- package/dist/core/tools/filesystem-policy.d.ts.map +1 -1
- package/dist/core/tools/filesystem-policy.js +25 -15
- package/dist/core/tools/filesystem-policy.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +13 -2
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/memory-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/memory-tips.js +6 -0
- package/dist/modes/interactive/tips/catalog/memory-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/subagent-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/subagent-tips.js +6 -0
- package/dist/modes/interactive/tips/catalog/subagent-tips.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +31 -5
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.d.ts +11 -0
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/host-watchdog.js +16 -2
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +54 -16
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/socket-ownership.d.ts +46 -0
- package/dist/modes/rpc/socket-ownership.d.ts.map +1 -0
- package/dist/modes/rpc/socket-ownership.js +178 -0
- package/dist/modes/rpc/socket-ownership.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +17 -0
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js +38 -10
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/paths.d.ts +33 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +109 -3
- package/dist/utils/paths.js.map +1 -1
- package/docs/development.md +3 -2
- package/docs/providers.md +5 -1
- package/docs/settings.md +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +31 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +14 -1
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/runtime-factory.ts +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/AGENTS.md +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +29 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +10 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.d.ts +16 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.js +44 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +9 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/session-env.ts +56 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +9 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/output/output-meta.ts +26 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +17 -24
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +12 -3
- 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 +2 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +7 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +19 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +24 -16
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- 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 +47 -178
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js +260 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js.map +1 -0
- 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 +1 -0
- 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-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts +40 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js +138 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts +2 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js +42 -139
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js +29 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js.map +1 -0
- 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/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.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/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +16 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +7 -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/overflow.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +14 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-continuity.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-continuity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContinuityReason } from \"./session-observability.ts\";\nimport { sentHashPrefixDigest } from \"./session-sync.ts\";\n\nexport type ContinuityEntrySnapshot = {\n\tsdkSessionId: string;\n\taccountName: string;\n\tmodelId: string;\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n\tsentCount: number;\n\tsentHashes: readonly string[];\n\tlastAssistantUuid: string | null;\n\tassistantUuidByIndex: ReadonlyMap<number, string>;\n\tpendingForkReason: string | null;\n\ttaintedReason?: string | null;\n};\n\nexport type ContinuityBindingSnapshot = {\n\tsdkSessionId: string;\n\tsentCount: number;\n\tsentHashes: readonly string[];\n\tsentPrefixHash?: string;\n\tlastAssistantUuid: string | null;\n\taccountName: string;\n\tmodelId: string;\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n\t/** Sent-stream digest of a turn that was pushed but never answered (retry checkpoint). */\n\tunansweredTurnDigest?: string;\n\t/** False until the SDK acknowledged the id; a resume/fork of an unconfirmed id is never attempted. */\n\tsdkSessionIdConfirmed?: boolean;\n};\n\nexport type ContinuityDecisionInput = {\n\tentry: ContinuityEntrySnapshot | undefined;\n\tbinding: ContinuityBindingSnapshot | undefined;\n\tcurrentHashes: readonly string[];\n\taccountName: string;\n\tmodelId: string;\n\tfingerprint: { systemPromptHash: string; toolsetHash: string };\n\ttranscriptAvailable: boolean;\n\tidleExpired?: boolean;\n};\n\nexport type ContinuityDecision =\n\t| { kind: \"bootstrap\" }\n\t| { kind: \"delta\"; from: number }\n\t| { kind: \"reattach\"; sdkSessionId: string; from: number; reason: ContinuityReason }\n\t| { kind: \"fork\"; sdkSessionId: string; atUuid: string; from: number; reason: ContinuityReason }\n\t| { kind: \"flatten\"; reason: ContinuityReason };\n\nconst PENDING_FORK_REASONS: Readonly<Record<string, ContinuityReason>> = {\n\tassistant_rewritten: \"assistant_rewritten\",\n\tcompaction: \"tainted_compaction\",\n};\n\nfunction commonPrefixLength(left: readonly string[], right: readonly string[]): number {\n\tconst limit = Math.min(left.length, right.length);\n\tlet index = 0;\n\twhile (index < limit && left[index] === right[index]) index += 1;\n\treturn index;\n}\n\n/**\n * The fork point is the last assistant boundary STRICTLY BEFORE the divergence:\n * forking at the diverged turn itself would carry the stale assistant into the new\n * branch and leave nothing to re-send.\n */\nfunction boundaryBefore(entry: ContinuityEntrySnapshot, count: number): { index: number; uuid: string } | undefined {\n\tfor (let candidate = count - 1; candidate >= 1; candidate -= 1) {\n\t\tconst uuid = entry.assistantUuidByIndex.get(candidate);\n\t\tif (uuid) return { index: candidate, uuid };\n\t}\n\treturn undefined;\n}\n\nfunction forkOrFlatten(\n\tentry: ContinuityEntrySnapshot,\n\tdivergesAt: number,\n\treason: ContinuityReason,\n): ContinuityDecision {\n\tconst boundary = boundaryBefore(entry, divergesAt);\n\tif (!boundary) return { kind: \"flatten\", reason };\n\treturn {\n\t\tkind: \"fork\",\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tatUuid: boundary.uuid,\n\t\tfrom: boundary.index,\n\t\treason,\n\t};\n}\n\nfunction identityDrift(\n\tinput: ContinuityDecisionInput,\n\tentry: Pick<ContinuityEntrySnapshot, \"accountName\" | \"modelId\" | \"systemPromptHash\" | \"toolsetHash\">,\n): ContinuityReason | null {\n\tif (entry.accountName !== input.accountName) return \"account_changed\";\n\tif (entry.modelId !== input.modelId) return \"model_changed\";\n\tif (entry.systemPromptHash !== input.fingerprint.systemPromptHash) return \"options_changed\";\n\tif (entry.toolsetHash !== input.fingerprint.toolsetHash) return \"options_changed\";\n\treturn null;\n}\n\n/**\n * Same-turn retry after a stream-start timeout: the abandoned attempt already\n * appended its user message to the lineage, so re-attaching would append it a\n * SECOND time and re-bill the whole conversation. Forking at the pre-turn\n * assistant boundary rewinds past the un-answered message, so the retry's\n * request byte-layout matches the failed attempt's (prefix cache read).\n * Requires the FULL current turn to hash-match the checkpoint, so a different\n * turn falls through to the ordinary branches below.\n */\nfunction retryCheckpointDecision(\n\tinput: ContinuityDecisionInput,\n\tbinding: ContinuityBindingSnapshot,\n): ContinuityDecision | undefined {\n\tif (binding.unansweredTurnDigest === undefined) return undefined;\n\tif (sentHashPrefixDigest(input.currentHashes, input.currentHashes.length) !== binding.unansweredTurnDigest) {\n\t\treturn undefined;\n\t}\n\tif (input.currentHashes.length < binding.sentCount) return undefined;\n\tconst prefixMatches =\n\t\tbinding.sentPrefixHash !== undefined\n\t\t\t? sentHashPrefixDigest(input.currentHashes, binding.sentCount) === binding.sentPrefixHash\n\t\t\t: commonPrefixLength(binding.sentHashes, input.currentHashes) === binding.sentCount;\n\tif (!prefixMatches) return undefined;\n\tif (!binding.lastAssistantUuid) return { kind: \"flatten\", reason: \"timeout_retry\" };\n\treturn {\n\t\tkind: \"fork\",\n\t\tsdkSessionId: binding.sdkSessionId,\n\t\tatUuid: binding.lastAssistantUuid,\n\t\tfrom: binding.sentCount,\n\t\treason: \"timeout_retry\",\n\t};\n}\n\n/**\n * A binding whose SDK id was minted locally and never acknowledged (no init, no\n * replay echo before the attempt failed) must not be resumed: Claude Code\n * answers \"No conversation found with session ID\" and every retry would mint\n * another dead id (oh-my-openagent#7562). Cold-seed instead.\n */\nfunction withoutUnconfirmedResume(\n\tdecision: ContinuityDecision,\n\tbinding: ContinuityBindingSnapshot,\n): ContinuityDecision {\n\tif (binding.sdkSessionIdConfirmed !== false) return decision;\n\tif (decision.kind === \"reattach\" || decision.kind === \"fork\") {\n\t\treturn { kind: \"flatten\", reason: \"session_unconfirmed\" };\n\t}\n\treturn decision;\n}\n\nfunction decideFromBinding(input: ContinuityDecisionInput, binding: ContinuityBindingSnapshot): ContinuityDecision {\n\tif (!input.transcriptAvailable) return { kind: \"flatten\", reason: \"transcript_missing\" };\n\tconst drift = identityDrift(input, binding);\n\tif (drift) return { kind: \"flatten\", reason: drift };\n\tconst retry = retryCheckpointDecision(input, binding);\n\tif (retry) return retry;\n\tif (binding.sentPrefixHash !== undefined) {\n\t\tconst prefixMatches =\n\t\t\tinput.currentHashes.length >= binding.sentCount &&\n\t\t\tsentHashPrefixDigest(input.currentHashes, binding.sentCount) === binding.sentPrefixHash;\n\t\tif (prefixMatches) {\n\t\t\treturn {\n\t\t\t\tkind: \"reattach\",\n\t\t\t\tsdkSessionId: binding.sdkSessionId,\n\t\t\t\tfrom: binding.sentCount,\n\t\t\t\treason: \"registry_miss\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"flatten\",\n\t\t\treason: input.currentHashes.length < binding.sentCount ? \"history_rolled_back\" : \"sent_stream_diverged\",\n\t\t};\n\t}\n\tconst shared = commonPrefixLength(binding.sentHashes, input.currentHashes);\n\tif (shared === binding.sentCount) {\n\t\treturn { kind: \"reattach\", sdkSessionId: binding.sdkSessionId, from: binding.sentCount, reason: \"registry_miss\" };\n\t}\n\tif (!binding.lastAssistantUuid) return { kind: \"flatten\", reason: \"registry_miss\" };\n\treturn {\n\t\tkind: \"fork\",\n\t\tsdkSessionId: binding.sdkSessionId,\n\t\tatUuid: binding.lastAssistantUuid,\n\t\tfrom: shared,\n\t\treason: shared < binding.sentCount ? \"history_rolled_back\" : \"sent_stream_diverged\",\n\t};\n}\n\nexport type FailoverLane = \"oauth-slots\" | \"ambient\" | \"config-dir\";\n\nexport type FailoverContinuityInput = {\n\tauthLane: FailoverLane;\n\tcrossAccountResumeSupported: boolean;\n\tentry: { sdkSessionId: string; sentCount: number; lastAssistantUuid: string | null };\n};\n\n/**\n * The config-dir lane keeps each account's credentials inside its own\n * CLAUDE_CONFIG_DIR, and no official SDK API moves a transcript across roots, so\n * its failover is the one declared residual that must still flatten.\n */\nexport function decideFailoverContinuity(input: FailoverContinuityInput): ContinuityDecision {\n\tconst { entry } = input;\n\tif (input.authLane === \"config-dir\") return { kind: \"flatten\", reason: \"cross_root_unsupported\" };\n\tif (input.crossAccountResumeSupported) {\n\t\treturn {\n\t\t\tkind: \"reattach\",\n\t\t\tsdkSessionId: entry.sdkSessionId,\n\t\t\tfrom: entry.sentCount,\n\t\t\treason: \"account_changed\",\n\t\t};\n\t}\n\tif (!entry.lastAssistantUuid) return { kind: \"flatten\", reason: \"branch_boundary_unavailable\" };\n\treturn {\n\t\tkind: \"fork\",\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tatUuid: entry.lastAssistantUuid,\n\t\tfrom: entry.sentCount,\n\t\treason: \"account_changed\",\n\t};\n}\n\n/**\n * Resume-first: a live session is never abandoned for a flattened re-send. Only a\n * missing transcript or an unrecoverable boundary reaches `flatten`; every other\n * divergence resolves to `fork` (same lineage, new branch) or `reattach` (same\n * session, new query).\n */\nexport function decideNativeContinuity(input: ContinuityDecisionInput): ContinuityDecision {\n\tconst { entry, binding } = input;\n\tif (!entry) {\n\t\tif (!binding) return { kind: \"bootstrap\" };\n\t\treturn withoutUnconfirmedResume(decideFromBinding(input, binding), binding);\n\t}\n\n\tconst divergence = entry.pendingForkReason ?? entry.taintedReason;\n\tif (divergence) {\n\t\treturn forkOrFlatten(entry, entry.sentCount, PENDING_FORK_REASONS[divergence] ?? \"other\");\n\t}\n\n\tconst shared = commonPrefixLength(entry.sentHashes, input.currentHashes);\n\tif (shared < entry.sentCount) {\n\t\tconst rolledBack = input.currentHashes.length < entry.sentCount && shared === input.currentHashes.length;\n\t\treturn rolledBack\n\t\t\t? forkOrFlatten(entry, input.currentHashes.length, \"history_rolled_back\")\n\t\t\t: forkOrFlatten(entry, shared + 1, \"sent_stream_diverged\");\n\t}\n\n\tif (input.idleExpired) {\n\t\treturn { kind: \"reattach\", sdkSessionId: entry.sdkSessionId, from: entry.sentCount, reason: \"idle_ttl\" };\n\t}\n\n\tconst drift = identityDrift(input, entry);\n\tif (drift) {\n\t\treturn { kind: \"reattach\", sdkSessionId: entry.sdkSessionId, from: entry.sentCount, reason: drift };\n\t}\n\n\treturn { kind: \"delta\", from: entry.sentCount };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-continuity.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-continuity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContinuityReason } from \"./session-observability.ts\";\nimport { sentHashPrefixDigest } from \"./session-sync.ts\";\n\nexport type ContinuityEntrySnapshot = {\n\tsdkSessionId: string;\n\taccountName: string;\n\tmodelId: string;\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n\tsentCount: number;\n\tsentHashes: readonly string[];\n\tlastAssistantUuid: string | null;\n\tassistantUuidByIndex: ReadonlyMap<number, string>;\n\tpendingForkReason: string | null;\n\ttaintedReason?: string | null;\n};\n\nexport type ContinuityBindingSnapshot = {\n\tsdkSessionId: string;\n\tsentCount: number;\n\tsentHashes: readonly string[];\n\tsentPrefixHash?: string;\n\tlastAssistantUuid: string | null;\n\taccountName: string;\n\tmodelId: string;\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n\t/** Sent-stream digest of a turn that was pushed but never answered (retry checkpoint). */\n\tunansweredTurnDigest?: string;\n\t/** False until the SDK acknowledged the id; a resume/fork of an unconfirmed id is never attempted. */\n\tsdkSessionIdConfirmed?: boolean;\n};\n\nexport type ContinuityDecisionInput = {\n\tentry: ContinuityEntrySnapshot | undefined;\n\tbinding: ContinuityBindingSnapshot | undefined;\n\tcurrentHashes: readonly string[];\n\taccountName: string;\n\tmodelId: string;\n\tfingerprint: { systemPromptHash: string; toolsetHash: string };\n\ttranscriptAvailable: boolean;\n\t/** false only on the config-dir lane, whose per-account credential roots cannot share a transcript root, so cross-account resume is impossible there. */\n\tcrossAccountResumeSupported: boolean;\n\tidleExpired?: boolean;\n};\n\nexport type ContinuityDecision =\n\t| { kind: \"bootstrap\" }\n\t| { kind: \"delta\"; from: number }\n\t| { kind: \"reattach\"; sdkSessionId: string; from: number; reason: ContinuityReason }\n\t| { kind: \"fork\"; sdkSessionId: string; atUuid: string; from: number; reason: ContinuityReason }\n\t| { kind: \"flatten\"; reason: ContinuityReason };\n\nconst PENDING_FORK_REASONS: Readonly<Record<string, ContinuityReason>> = {\n\tassistant_rewritten: \"assistant_rewritten\",\n\tcompaction: \"tainted_compaction\",\n};\n\nfunction commonPrefixLength(left: readonly string[], right: readonly string[]): number {\n\tconst limit = Math.min(left.length, right.length);\n\tlet index = 0;\n\twhile (index < limit && left[index] === right[index]) index += 1;\n\treturn index;\n}\n\n/**\n * The fork point is the last assistant boundary STRICTLY BEFORE the divergence:\n * forking at the diverged turn itself would carry the stale assistant into the new\n * branch and leave nothing to re-send.\n */\nfunction boundaryBefore(entry: ContinuityEntrySnapshot, count: number): { index: number; uuid: string } | undefined {\n\tfor (let candidate = count - 1; candidate >= 1; candidate -= 1) {\n\t\tconst uuid = entry.assistantUuidByIndex.get(candidate);\n\t\tif (uuid) return { index: candidate, uuid };\n\t}\n\treturn undefined;\n}\n\nfunction forkOrFlatten(\n\tentry: ContinuityEntrySnapshot,\n\tdivergesAt: number,\n\treason: ContinuityReason,\n): ContinuityDecision {\n\tconst boundary = boundaryBefore(entry, divergesAt);\n\tif (!boundary) return { kind: \"flatten\", reason };\n\treturn {\n\t\tkind: \"fork\",\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tatUuid: boundary.uuid,\n\t\tfrom: boundary.index,\n\t\treason,\n\t};\n}\n\nfunction identityDrift(\n\tinput: ContinuityDecisionInput,\n\tentry: Pick<ContinuityEntrySnapshot, \"accountName\" | \"modelId\" | \"systemPromptHash\" | \"toolsetHash\">,\n): ContinuityReason | null {\n\tif (entry.accountName !== input.accountName) return \"account_changed\";\n\tif (entry.modelId !== input.modelId) return \"model_changed\";\n\tif (entry.systemPromptHash !== input.fingerprint.systemPromptHash) return \"system_prompt_changed\";\n\tif (entry.toolsetHash !== input.fingerprint.toolsetHash) return \"toolset_changed\";\n\treturn null;\n}\n\n/**\n * Same-turn retry after a stream-start timeout: the abandoned attempt already\n * appended its user message to the lineage, so re-attaching would append it a\n * SECOND time and re-bill the whole conversation. Forking at the pre-turn\n * assistant boundary rewinds past the un-answered message, so the retry's\n * request byte-layout matches the failed attempt's (prefix cache read).\n * Requires the FULL current turn to hash-match the checkpoint, so a different\n * turn falls through to the ordinary branches below.\n */\nfunction retryCheckpointDecision(\n\tinput: ContinuityDecisionInput,\n\tbinding: ContinuityBindingSnapshot,\n): ContinuityDecision | undefined {\n\tif (binding.unansweredTurnDigest === undefined) return undefined;\n\tif (sentHashPrefixDigest(input.currentHashes, input.currentHashes.length) !== binding.unansweredTurnDigest) {\n\t\treturn undefined;\n\t}\n\tif (input.currentHashes.length < binding.sentCount) return undefined;\n\tconst prefixMatches =\n\t\tbinding.sentPrefixHash !== undefined\n\t\t\t? sentHashPrefixDigest(input.currentHashes, binding.sentCount) === binding.sentPrefixHash\n\t\t\t: commonPrefixLength(binding.sentHashes, input.currentHashes) === binding.sentCount;\n\tif (!prefixMatches) return undefined;\n\tif (!binding.lastAssistantUuid) return { kind: \"flatten\", reason: \"timeout_retry\" };\n\treturn {\n\t\tkind: \"fork\",\n\t\tsdkSessionId: binding.sdkSessionId,\n\t\tatUuid: binding.lastAssistantUuid,\n\t\tfrom: binding.sentCount,\n\t\treason: \"timeout_retry\",\n\t};\n}\n\n/**\n * A binding whose SDK id was minted locally and never acknowledged (no init, no\n * replay echo before the attempt failed) must not be resumed: Claude Code\n * answers \"No conversation found with session ID\" and every retry would mint\n * another dead id (oh-my-openagent#7562). Cold-seed instead.\n */\nfunction withoutUnconfirmedResume(\n\tdecision: ContinuityDecision,\n\tbinding: ContinuityBindingSnapshot,\n): ContinuityDecision {\n\tif (binding.sdkSessionIdConfirmed !== false) return decision;\n\tif (decision.kind === \"reattach\" || decision.kind === \"fork\") {\n\t\treturn { kind: \"flatten\", reason: \"session_unconfirmed\" };\n\t}\n\treturn decision;\n}\n\nfunction decideFromBinding(input: ContinuityDecisionInput, binding: ContinuityBindingSnapshot): ContinuityDecision {\n\tif (!input.transcriptAvailable) return { kind: \"flatten\", reason: \"transcript_missing\" };\n\tconst drift = identityDrift(input, binding);\n\t// Model identity drift fails closed: the persisted identity no longer matches the turn.\n\t// Account drift flattens only on the config-dir lane, whose per-account roots cannot\n\t// share a transcript; on shared-root lanes it falls through like prompt/toolset drift\n\t// (senpi#1432), so the retry checkpoint forks a same-turn failover at the pre-turn\n\t// boundary and a matching prefix reattaches with reason account_changed.\n\tif (drift === \"model_changed\") return { kind: \"flatten\", reason: drift };\n\tif (drift === \"account_changed\" && !input.crossAccountResumeSupported)\n\t\treturn { kind: \"flatten\", reason: \"cross_root_unsupported\" };\n\t// Prompt/toolset drift instead reattaches like the live path\n\t// (oh-my-openagent#7884) - a restart has no live query, so the resume builds a\n\t// fresh query carrying the CURRENT options and hooks, and flattening would\n\t// re-send the whole conversation for drift the SDK applies per-query anyway.\n\tconst retry = retryCheckpointDecision(input, binding);\n\tif (retry) return retry;\n\tif (binding.sentPrefixHash !== undefined) {\n\t\tconst prefixMatches =\n\t\t\tinput.currentHashes.length >= binding.sentCount &&\n\t\t\tsentHashPrefixDigest(input.currentHashes, binding.sentCount) === binding.sentPrefixHash;\n\t\tif (prefixMatches) {\n\t\t\treturn {\n\t\t\t\tkind: \"reattach\",\n\t\t\t\tsdkSessionId: binding.sdkSessionId,\n\t\t\t\tfrom: binding.sentCount,\n\t\t\t\treason: drift ?? \"registry_miss\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"flatten\",\n\t\t\treason: input.currentHashes.length < binding.sentCount ? \"history_rolled_back\" : \"sent_stream_diverged\",\n\t\t};\n\t}\n\tconst shared = commonPrefixLength(binding.sentHashes, input.currentHashes);\n\tif (shared === binding.sentCount) {\n\t\treturn {\n\t\t\tkind: \"reattach\",\n\t\t\tsdkSessionId: binding.sdkSessionId,\n\t\t\tfrom: binding.sentCount,\n\t\t\treason: drift ?? \"registry_miss\",\n\t\t};\n\t}\n\tif (!binding.lastAssistantUuid) return { kind: \"flatten\", reason: \"registry_miss\" };\n\treturn {\n\t\tkind: \"fork\",\n\t\tsdkSessionId: binding.sdkSessionId,\n\t\tatUuid: binding.lastAssistantUuid,\n\t\tfrom: shared,\n\t\treason: shared < binding.sentCount ? \"history_rolled_back\" : \"sent_stream_diverged\",\n\t};\n}\n\n/**\n * Resume-first: a live session is never abandoned for a flattened re-send. Only a\n * missing transcript, an unrecoverable boundary, a model identity drift, or account\n * drift on the config-dir lane on a persisted binding reaches `flatten`; every other\n * divergence resolves to `fork` (same lineage, new branch) or `reattach` (same\n * session, new query).\n */\nexport function decideNativeContinuity(input: ContinuityDecisionInput): ContinuityDecision {\n\tconst { entry, binding } = input;\n\tif (!entry) {\n\t\tif (!binding) return { kind: \"bootstrap\" };\n\t\treturn withoutUnconfirmedResume(decideFromBinding(input, binding), binding);\n\t}\n\n\tconst divergence = entry.pendingForkReason ?? entry.taintedReason;\n\tif (divergence) {\n\t\treturn forkOrFlatten(entry, entry.sentCount, PENDING_FORK_REASONS[divergence] ?? \"other\");\n\t}\n\n\tconst shared = commonPrefixLength(entry.sentHashes, input.currentHashes);\n\tif (shared < entry.sentCount) {\n\t\tconst rolledBack = input.currentHashes.length < entry.sentCount && shared === input.currentHashes.length;\n\t\treturn rolledBack\n\t\t\t? forkOrFlatten(entry, input.currentHashes.length, \"history_rolled_back\")\n\t\t\t: forkOrFlatten(entry, shared + 1, \"sent_stream_diverged\");\n\t}\n\n\tif (input.idleExpired) {\n\t\treturn { kind: \"reattach\", sdkSessionId: entry.sdkSessionId, from: entry.sentCount, reason: \"idle_ttl\" };\n\t}\n\n\tconst drift = identityDrift(input, entry);\n\tif (drift) {\n\t\treturn { kind: \"reattach\", sdkSessionId: entry.sdkSessionId, from: entry.sentCount, reason: drift };\n\t}\n\n\treturn { kind: \"delta\", from: entry.sentCount };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAkC,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnF,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EACN,KAAK,qBAAqB,EAM1B,MAAM,4BAA4B,CAAC;AAkBpC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,MAAM,0BAA0B,GAAG;IACxC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,mBAAmB,CAAC;IACnC,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACtE,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACpE,CAAC;
|
|
1
|
+
{"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAkC,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnF,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EACN,KAAK,qBAAqB,EAM1B,MAAM,4BAA4B,CAAC;AAkBpC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,MAAM,0BAA0B,GAAG;IACxC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,mBAAmB,CAAC;IACnC,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACtE,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACpE,CAAC;AA4IF,wBAAuB,uBAAuB,CAAC,KAAK,EAAE,0BAA0B,GAAG,cAAc,CAAC,UAAU,CAAC,CAW5G"}
|
|
@@ -50,6 +50,7 @@ async function createResidentAttempt(input, auth) {
|
|
|
50
50
|
modelId: input.model.id,
|
|
51
51
|
fingerprint,
|
|
52
52
|
transcriptAvailable,
|
|
53
|
+
crossAccountResumeSupported: auth.authLane !== "config-dir",
|
|
53
54
|
idleExpired: existing ? isIdleExpired(existing) : false,
|
|
54
55
|
});
|
|
55
56
|
const firstTurn = existing === undefined && getBinding(sessionId) === undefined && hashes.length <= 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-stream.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Context, Model, SimpleStreamOptions } from \"@earendil-works/pi-ai\";\nimport { type AuthenticatedAttemptInput, queryWithAuthLane } from \"./auth-lane.ts\";\nimport { buildPromptBlocks } from \"./prompt-bridge.ts\";\nimport { dedupeUltraworkBlocks, serializedPayloadBytes } from \"./prompt-directive-dedupe.ts\";\nimport type { SDKMessage, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { getSdkBoundary } from \"./sdk-boundary.ts\";\nimport { type ContinuityDecision, decideNativeContinuity } from \"./session-continuity.ts\";\nimport {\n\ttype ContinuityObservation,\n\tconsumePendingCloseCause,\n\temitContinuityObservation,\n\tobserveSessionSyncDecision,\n\tsanitizeTerminalFailure,\n\tstageContinuityDecision,\n} from \"./session-observability.ts\";\nimport { bindingFromEntry, getBinding, reattachSession } from \"./session-reattach.ts\";\nimport {\n\ttype ClaudeSdkOauthSessionEntry,\n\tcloseSession,\n\tgetOrCreateSession,\n\tgetSession,\n\tisIdleExpired,\n} from \"./session-registry.ts\";\nimport { admitRestoredBinding } from \"./session-restored-admission.ts\";\nimport {\n\tbuildDeltaPromptBlocks,\n\tconfigFingerprint,\n\tsentHashesForEntry,\n\tsentMessageHashes,\n\tsentMessages,\n} from \"./session-sync.ts\";\nimport { createSessionTurnAttempt } from \"./session-turn-attempt.ts\";\nimport type { ClaudeSdkOauthProviderSettings } from \"./settings.ts\";\n\nexport type ResidentSessionStreamInput = {\n\tmodel: Model<Api>;\n\tcontext: Context;\n\tstreamOptions: SimpleStreamOptions;\n\tproviderSettings: ClaudeSdkOauthProviderSettings;\n\tpinnedAccount?: string;\n\tbuildOptions: Parameters<typeof queryWithAuthLane>[0][\"buildOptions\"];\n\tcustomToolNameToSdk: ReadonlyMap<string, string>;\n\ttoolWatchNote?: string;\n\tonResumeFallback: (error: unknown) => void;\n\tonContinuityDecision?: (observation: ContinuityObservation) => void;\n};\n\nfunction userMessage(content: SDKUserMessage[\"message\"][\"content\"]): SDKUserMessage[\"message\"] {\n\treturn { role: \"user\", content } as SDKUserMessage[\"message\"];\n}\n\nconst OBSERVED_KIND: Record<ContinuityDecision[\"kind\"], \"incremental\" | \"resume\" | \"cold-seed\"> = {\n\tdelta: \"incremental\",\n\treattach: \"resume\",\n\tfork: \"resume\",\n\tflatten: \"cold-seed\",\n\tbootstrap: \"cold-seed\",\n};\n\nfunction entrySnapshot(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]) {\n\treturn {\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t\tsentCount: entry.sentCount,\n\t\tsentHashes: hashes.slice(0, entry.sentCount),\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(entry.sentCount) ?? null,\n\t\tassistantUuidByIndex: entry.assistantUuidByIndex,\n\t\tpendingForkReason: entry.pendingForkReason,\n\t\ttaintedReason: entry.taintedReason,\n\t};\n}\n\nasync function createResidentAttempt(\n\tinput: ResidentSessionStreamInput,\n\tauth: AuthenticatedAttemptInput,\n): Promise<ReturnType<typeof createSessionTurnAttempt>> {\n\tconst sessionId = input.streamOptions.sessionId!;\n\tconst messages = sentMessages(input.context);\n\tconst hashes = sentMessageHashes(messages);\n\tconst existing = getSession(sessionId);\n\tconst fingerprint = configFingerprint(auth.options, input.context, auth.authLane, auth.accountName);\n\tconst residentHashes = existing ? (sentHashesForEntry(existing) ?? hashes) : hashes;\n\tconst { binding, transcriptAvailable } = await admitRestoredBinding(sessionId, auth.options.cwd, auth.authLane);\n\tconst decision = decideNativeContinuity({\n\t\tentry: existing ? entrySnapshot(existing, residentHashes) : undefined,\n\t\tbinding,\n\t\tcurrentHashes: hashes,\n\t\taccountName: auth.accountName,\n\t\tmodelId: input.model.id,\n\t\tfingerprint,\n\t\ttranscriptAvailable,\n\t\tidleExpired: existing ? isIdleExpired(existing) : false,\n\t});\n\tconst firstTurn = existing === undefined && getBinding(sessionId) === undefined && hashes.length <= 1;\n\tlet observedReason =\n\t\t\"reason\" in decision ? decision.reason : decision.kind === \"bootstrap\" ? \"registry_miss\" : undefined;\n\tlet observedKind: \"incremental\" | \"resume\" | \"cold-seed\" = OBSERVED_KIND[decision.kind];\n\tlet entry: ClaudeSdkOauthSessionEntry;\n\tlet from = 0;\n\tlet flatten = decision.kind === \"flatten\" || decision.kind === \"bootstrap\";\n\n\tif (decision.kind === \"delta\" && existing) {\n\t\tentry = existing;\n\t\tfrom = decision.from;\n\t} else if (decision.kind === \"reattach\" || decision.kind === \"fork\") {\n\t\tconst source = getBinding(sessionId) ?? (existing ? bindingFromEntry(existing, residentHashes) : undefined);\n\t\tconst binding = source\n\t\t\t? (({ sentPrefixHash: _persistedPrefix, ...rest }) => ({\n\t\t\t\t\t...rest,\n\t\t\t\t\tsentCount: decision.from,\n\t\t\t\t\tsentHashes: hashes.slice(0, decision.from),\n\t\t\t\t\tassistantUuidByIndex: (source.assistantUuidByIndex ?? []).filter(([index]) => index <= decision.from),\n\t\t\t\t\taccountName: auth.accountName,\n\t\t\t\t\tmodelId: input.model.id,\n\t\t\t\t\tsystemPromptHash: fingerprint.systemPromptHash,\n\t\t\t\t\ttoolsetHash: fingerprint.toolsetHash,\n\t\t\t\t\t...(decision.kind === \"fork\" ? { lastAssistantUuid: decision.atUuid } : {}),\n\t\t\t\t}))(source)\n\t\t\t: undefined;\n\t\ttry {\n\t\t\tif (!binding) throw new Error(\"Claude SDK OAuth continuity binding is unavailable\");\n\t\t\tentry = await reattachSession({\n\t\t\t\tbinding,\n\t\t\t\toptions: auth.options,\n\t\t\t\t...(decision.kind === \"fork\" ? { atUuid: decision.atUuid } : {}),\n\t\t\t\t...(input.streamOptions.signal ? { signal: input.streamOptions.signal } : {}),\n\t\t\t});\n\t\t\tfrom = decision.from;\n\t\t} catch (error) {\n\t\t\tif (input.streamOptions.signal?.aborted) throw error;\n\t\t\tinput.onResumeFallback(error);\n\t\t\tobservedKind = \"cold-seed\";\n\t\t\tobservedReason = \"resume_initialization_failed\";\n\t\t\tflatten = true;\n\t\t\tentry = getOrCreateSession({\n\t\t\t\tsenpiSessionId: sessionId,\n\t\t\t\taccountName: auth.accountName,\n\t\t\t\tmodelId: input.model.id,\n\t\t\t\t...fingerprint,\n\t\t\t\toptions: auth.options,\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif (existing) closeSession(sessionId, observedReason ?? \"registry_miss\");\n\t\tentry = getOrCreateSession({\n\t\t\tsenpiSessionId: sessionId,\n\t\t\taccountName: auth.accountName,\n\t\t\tmodelId: input.model.id,\n\t\t\t...fingerprint,\n\t\t\toptions: auth.options,\n\t\t});\n\t}\n\n\tconst flattenResult = flatten\n\t\t? dedupeUltraworkBlocks(buildPromptBlocks(input.context, input.customToolNameToSdk, input.toolWatchNote))\n\t\t: undefined;\n\tconst blocks = flattenResult\n\t\t? flattenResult.blocks\n\t\t: buildDeltaPromptBlocks(messages.slice(from), input.customToolNameToSdk);\n\tconst payloadBytes = flattenResult ? serializedPayloadBytes(flattenResult.blocks) : undefined;\n\tconst staged = stageContinuityDecision(\n\t\tobserveSessionSyncDecision({\n\t\t\tkind: observedKind,\n\t\t\treason: observedReason,\n\t\t\tdeltaMessages: flatten ? hashes.length : hashes.length - from,\n\t\t\tfirstTurn,\n\t\t\tsenpiSessionId: sessionId,\n\t\t\t...(payloadBytes !== undefined ? { payloadBytes } : {}),\n\t\t\t...(flattenResult?.collapsedDirectives !== undefined\n\t\t\t\t? { collapsedDirectives: flattenResult.collapsedDirectives }\n\t\t\t\t: {}),\n\t\t}),\n\t\tinput.onContinuityDecision,\n\t\t// The pending close cause is consumed only when the staged observation\n\t\t// actually emits (attempt retained) — a discarded attempt leaves the\n\t\t// cause pending for the next admission.\n\t\t() => consumePendingCloseCause(sessionId),\n\t);\n\treturn createSessionTurnAttempt(entry, userMessage(blocks), hashes, input.streamOptions.signal, staged);\n}\n\nexport async function* residentSessionMessages(input: ResidentSessionStreamInput): AsyncGenerator<SDKMessage> {\n\ttry {\n\t\tyield* residentAuthLaneMessages(input);\n\t} catch (error) {\n\t\t// Every attempt failed: the turn yields exactly one terminal observation.\n\t\temitContinuityObservation(\n\t\t\t{ kind: \"flatten\", reason: sanitizeTerminalFailure(error) },\n\t\t\tinput.onContinuityDecision,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\nfunction residentAuthLaneMessages(input: ResidentSessionStreamInput): AsyncIterable<SDKMessage> {\n\treturn queryWithAuthLane({\n\t\tprompt: \"\",\n\t\tquery: getSdkBoundary().query,\n\t\tproviderSettings: input.providerSettings,\n\t\tenv: input.streamOptions.env,\n\t\tsignal: input.streamOptions.signal,\n\t\tsessionId: input.streamOptions.affinitySessionId ?? input.streamOptions.sessionId,\n\t\tpinnedAccount: input.pinnedAccount,\n\t\tbuildOptions: input.buildOptions,\n\t\tcreateAttempt: (auth) => createResidentAttempt(input, auth),\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-stream.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Context, Model, SimpleStreamOptions } from \"@earendil-works/pi-ai\";\nimport { type AuthenticatedAttemptInput, queryWithAuthLane } from \"./auth-lane.ts\";\nimport { buildPromptBlocks } from \"./prompt-bridge.ts\";\nimport { dedupeUltraworkBlocks, serializedPayloadBytes } from \"./prompt-directive-dedupe.ts\";\nimport type { SDKMessage, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { getSdkBoundary } from \"./sdk-boundary.ts\";\nimport { type ContinuityDecision, decideNativeContinuity } from \"./session-continuity.ts\";\nimport {\n\ttype ContinuityObservation,\n\tconsumePendingCloseCause,\n\temitContinuityObservation,\n\tobserveSessionSyncDecision,\n\tsanitizeTerminalFailure,\n\tstageContinuityDecision,\n} from \"./session-observability.ts\";\nimport { bindingFromEntry, getBinding, reattachSession } from \"./session-reattach.ts\";\nimport {\n\ttype ClaudeSdkOauthSessionEntry,\n\tcloseSession,\n\tgetOrCreateSession,\n\tgetSession,\n\tisIdleExpired,\n} from \"./session-registry.ts\";\nimport { admitRestoredBinding } from \"./session-restored-admission.ts\";\nimport {\n\tbuildDeltaPromptBlocks,\n\tconfigFingerprint,\n\tsentHashesForEntry,\n\tsentMessageHashes,\n\tsentMessages,\n} from \"./session-sync.ts\";\nimport { createSessionTurnAttempt } from \"./session-turn-attempt.ts\";\nimport type { ClaudeSdkOauthProviderSettings } from \"./settings.ts\";\n\nexport type ResidentSessionStreamInput = {\n\tmodel: Model<Api>;\n\tcontext: Context;\n\tstreamOptions: SimpleStreamOptions;\n\tproviderSettings: ClaudeSdkOauthProviderSettings;\n\tpinnedAccount?: string;\n\tbuildOptions: Parameters<typeof queryWithAuthLane>[0][\"buildOptions\"];\n\tcustomToolNameToSdk: ReadonlyMap<string, string>;\n\ttoolWatchNote?: string;\n\tonResumeFallback: (error: unknown) => void;\n\tonContinuityDecision?: (observation: ContinuityObservation) => void;\n};\n\nfunction userMessage(content: SDKUserMessage[\"message\"][\"content\"]): SDKUserMessage[\"message\"] {\n\treturn { role: \"user\", content } as SDKUserMessage[\"message\"];\n}\n\nconst OBSERVED_KIND: Record<ContinuityDecision[\"kind\"], \"incremental\" | \"resume\" | \"cold-seed\"> = {\n\tdelta: \"incremental\",\n\treattach: \"resume\",\n\tfork: \"resume\",\n\tflatten: \"cold-seed\",\n\tbootstrap: \"cold-seed\",\n};\n\nfunction entrySnapshot(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]) {\n\treturn {\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t\tsentCount: entry.sentCount,\n\t\tsentHashes: hashes.slice(0, entry.sentCount),\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(entry.sentCount) ?? null,\n\t\tassistantUuidByIndex: entry.assistantUuidByIndex,\n\t\tpendingForkReason: entry.pendingForkReason,\n\t\ttaintedReason: entry.taintedReason,\n\t};\n}\n\nasync function createResidentAttempt(\n\tinput: ResidentSessionStreamInput,\n\tauth: AuthenticatedAttemptInput,\n): Promise<ReturnType<typeof createSessionTurnAttempt>> {\n\tconst sessionId = input.streamOptions.sessionId!;\n\tconst messages = sentMessages(input.context);\n\tconst hashes = sentMessageHashes(messages);\n\tconst existing = getSession(sessionId);\n\tconst fingerprint = configFingerprint(auth.options, input.context, auth.authLane, auth.accountName);\n\tconst residentHashes = existing ? (sentHashesForEntry(existing) ?? hashes) : hashes;\n\tconst { binding, transcriptAvailable } = await admitRestoredBinding(sessionId, auth.options.cwd, auth.authLane);\n\tconst decision = decideNativeContinuity({\n\t\tentry: existing ? entrySnapshot(existing, residentHashes) : undefined,\n\t\tbinding,\n\t\tcurrentHashes: hashes,\n\t\taccountName: auth.accountName,\n\t\tmodelId: input.model.id,\n\t\tfingerprint,\n\t\ttranscriptAvailable,\n\t\tcrossAccountResumeSupported: auth.authLane !== \"config-dir\",\n\t\tidleExpired: existing ? isIdleExpired(existing) : false,\n\t});\n\tconst firstTurn = existing === undefined && getBinding(sessionId) === undefined && hashes.length <= 1;\n\tlet observedReason =\n\t\t\"reason\" in decision ? decision.reason : decision.kind === \"bootstrap\" ? \"registry_miss\" : undefined;\n\tlet observedKind: \"incremental\" | \"resume\" | \"cold-seed\" = OBSERVED_KIND[decision.kind];\n\tlet entry: ClaudeSdkOauthSessionEntry;\n\tlet from = 0;\n\tlet flatten = decision.kind === \"flatten\" || decision.kind === \"bootstrap\";\n\n\tif (decision.kind === \"delta\" && existing) {\n\t\tentry = existing;\n\t\tfrom = decision.from;\n\t} else if (decision.kind === \"reattach\" || decision.kind === \"fork\") {\n\t\tconst source = getBinding(sessionId) ?? (existing ? bindingFromEntry(existing, residentHashes) : undefined);\n\t\tconst binding = source\n\t\t\t? (({ sentPrefixHash: _persistedPrefix, ...rest }) => ({\n\t\t\t\t\t...rest,\n\t\t\t\t\tsentCount: decision.from,\n\t\t\t\t\tsentHashes: hashes.slice(0, decision.from),\n\t\t\t\t\tassistantUuidByIndex: (source.assistantUuidByIndex ?? []).filter(([index]) => index <= decision.from),\n\t\t\t\t\taccountName: auth.accountName,\n\t\t\t\t\tmodelId: input.model.id,\n\t\t\t\t\tsystemPromptHash: fingerprint.systemPromptHash,\n\t\t\t\t\ttoolsetHash: fingerprint.toolsetHash,\n\t\t\t\t\t...(decision.kind === \"fork\" ? { lastAssistantUuid: decision.atUuid } : {}),\n\t\t\t\t}))(source)\n\t\t\t: undefined;\n\t\ttry {\n\t\t\tif (!binding) throw new Error(\"Claude SDK OAuth continuity binding is unavailable\");\n\t\t\tentry = await reattachSession({\n\t\t\t\tbinding,\n\t\t\t\toptions: auth.options,\n\t\t\t\t...(decision.kind === \"fork\" ? { atUuid: decision.atUuid } : {}),\n\t\t\t\t...(input.streamOptions.signal ? { signal: input.streamOptions.signal } : {}),\n\t\t\t});\n\t\t\tfrom = decision.from;\n\t\t} catch (error) {\n\t\t\tif (input.streamOptions.signal?.aborted) throw error;\n\t\t\tinput.onResumeFallback(error);\n\t\t\tobservedKind = \"cold-seed\";\n\t\t\tobservedReason = \"resume_initialization_failed\";\n\t\t\tflatten = true;\n\t\t\tentry = getOrCreateSession({\n\t\t\t\tsenpiSessionId: sessionId,\n\t\t\t\taccountName: auth.accountName,\n\t\t\t\tmodelId: input.model.id,\n\t\t\t\t...fingerprint,\n\t\t\t\toptions: auth.options,\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif (existing) closeSession(sessionId, observedReason ?? \"registry_miss\");\n\t\tentry = getOrCreateSession({\n\t\t\tsenpiSessionId: sessionId,\n\t\t\taccountName: auth.accountName,\n\t\t\tmodelId: input.model.id,\n\t\t\t...fingerprint,\n\t\t\toptions: auth.options,\n\t\t});\n\t}\n\n\tconst flattenResult = flatten\n\t\t? dedupeUltraworkBlocks(buildPromptBlocks(input.context, input.customToolNameToSdk, input.toolWatchNote))\n\t\t: undefined;\n\tconst blocks = flattenResult\n\t\t? flattenResult.blocks\n\t\t: buildDeltaPromptBlocks(messages.slice(from), input.customToolNameToSdk);\n\tconst payloadBytes = flattenResult ? serializedPayloadBytes(flattenResult.blocks) : undefined;\n\tconst staged = stageContinuityDecision(\n\t\tobserveSessionSyncDecision({\n\t\t\tkind: observedKind,\n\t\t\treason: observedReason,\n\t\t\tdeltaMessages: flatten ? hashes.length : hashes.length - from,\n\t\t\tfirstTurn,\n\t\t\tsenpiSessionId: sessionId,\n\t\t\t...(payloadBytes !== undefined ? { payloadBytes } : {}),\n\t\t\t...(flattenResult?.collapsedDirectives !== undefined\n\t\t\t\t? { collapsedDirectives: flattenResult.collapsedDirectives }\n\t\t\t\t: {}),\n\t\t}),\n\t\tinput.onContinuityDecision,\n\t\t// The pending close cause is consumed only when the staged observation\n\t\t// actually emits (attempt retained) — a discarded attempt leaves the\n\t\t// cause pending for the next admission.\n\t\t() => consumePendingCloseCause(sessionId),\n\t);\n\treturn createSessionTurnAttempt(entry, userMessage(blocks), hashes, input.streamOptions.signal, staged);\n}\n\nexport async function* residentSessionMessages(input: ResidentSessionStreamInput): AsyncGenerator<SDKMessage> {\n\ttry {\n\t\tyield* residentAuthLaneMessages(input);\n\t} catch (error) {\n\t\t// Every attempt failed: the turn yields exactly one terminal observation.\n\t\temitContinuityObservation(\n\t\t\t{ kind: \"flatten\", reason: sanitizeTerminalFailure(error) },\n\t\t\tinput.onContinuityDecision,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\nfunction residentAuthLaneMessages(input: ResidentSessionStreamInput): AsyncIterable<SDKMessage> {\n\treturn queryWithAuthLane({\n\t\tprompt: \"\",\n\t\tquery: getSdkBoundary().query,\n\t\tproviderSettings: input.providerSettings,\n\t\tenv: input.streamOptions.env,\n\t\tsignal: input.streamOptions.signal,\n\t\tsessionId: input.streamOptions.affinitySessionId ?? input.streamOptions.sessionId,\n\t\tpinnedAccount: input.pinnedAccount,\n\t\tbuildOptions: input.buildOptions,\n\t\tcreateAttempt: (auth) => createResidentAttempt(input, auth),\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-sync.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGxE,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC,CAAC;AAE5E,MAAM,MAAM,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AA4BF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAkBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,IAAI,WAAW,CAGtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAc5E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAgB,GAAG,MAAM,CAE7F;AAED,kFAAkF;AAElF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAEnG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAMrG;
|
|
1
|
+
{"version":3,"file":"session-sync.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGxE,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC,CAAC;AAE5E,MAAM,MAAM,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AA4BF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAkBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,IAAI,WAAW,CAGtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAc5E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAgB,GAAG,MAAM,CAE7F;AAED,kFAAkF;AAElF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAEnG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAMrG;AAiBD,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,GACjB,wBAAwB,CA2B1B;AAaD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,iBAAiB,EAAE,CAarB"}
|
|
@@ -87,12 +87,14 @@ export function recordSyncedStream(entry, hashes) {
|
|
|
87
87
|
entry.syncedPrefixHash = sentHashPrefixDigest(copy);
|
|
88
88
|
entry.branchInfo = null;
|
|
89
89
|
}
|
|
90
|
-
const GENERATED_DATE_LINE = /\nCurrent date: \d{4}-\d{2}-\d{2}(?=\nCurrent working directory: [^\n]
|
|
90
|
+
const GENERATED_DATE_LINE = /\nCurrent date: \d{4}-\d{2}-\d{2}(?=\nCurrent working directory: [^\n]*)/;
|
|
91
91
|
/**
|
|
92
92
|
* The generated date line advances at UTC midnight while the conversation is
|
|
93
93
|
* unchanged; hashing it verbatim retires a live session at midnight for no
|
|
94
|
-
* semantic reason. Only that exact
|
|
95
|
-
* other prompt region stay fail-closed.
|
|
94
|
+
* semantic reason. Only that exact date-plus-cwd pair is neutralized - cwd and
|
|
95
|
+
* every other prompt region stay fail-closed. Extension appends legitimately
|
|
96
|
+
* follow the cwd line (oh-my-openagent#7884), so the pair is matched wherever
|
|
97
|
+
* it appears, not only at the end of the prompt.
|
|
96
98
|
*/
|
|
97
99
|
function fingerprintSystemPrompt(systemPrompt) {
|
|
98
100
|
if (typeof systemPrompt !== "string")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-sync.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Context, Message } from \"@earendil-works/pi-ai\";\nimport { appendSdkContentBlocks } from \"./content-blocks.ts\";\nimport type { ClaudeSdkOauthAuthLane } from \"./options.ts\";\nimport type { ContentBlockParam, Options } from \"./sdk-boundary.ts\";\nimport type { ClaudeSdkOauthSessionEntry } from \"./session-registry.ts\";\nimport { HOST_TOOL_POLICY_FINGERPRINT, mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport type SentMessage = Extract<Message, { role: \"user\" | \"toolResult\" }>;\n\nexport type SessionConfigFingerprint = {\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n};\n\nconst sentHashesByEntry = new WeakMap<ClaudeSdkOauthSessionEntry, string[]>();\n\nfunction stableValue(value: unknown, seen = new WeakSet<object>()): unknown {\n\tif (typeof value === \"function\") return `[function:${value.name}:${value.toString()}]`;\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (seen.has(value)) return \"[circular]\";\n\tseen.add(value);\n\tconst normalized = Array.isArray(value)\n\t\t? value.map((item) => stableValue(item, seen))\n\t\t: Object.fromEntries(\n\t\t\t\tObject.entries(value as Record<string, unknown>)\n\t\t\t\t\t.filter(([, item]) => item !== undefined)\n\t\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t\t.map(([key, item]) => [key, stableValue(item, seen)]),\n\t\t\t);\n\tseen.delete(value);\n\treturn normalized;\n}\n\nfunction digest(value: unknown): string {\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify(stableValue(value)))\n\t\t.digest(\"hex\");\n}\n\nexport function sessionSyncDigest(value: unknown): string {\n\treturn digest(value);\n}\n\n/**\n * A user message with no content blocks carries nothing to transmit and is\n * transient: it is present for a single provider call and gone by the next.\n * Hashing one shifts every later index, so the following turn reports\n * `sent_stream_diverged` and re-sends the whole history even though the\n * conversation never changed. Tool results are never filtered - an empty tool\n * result is a real observation, and its id and name stay hash-significant.\n */\nfunction isContentlessUserMessage(message: SentMessage): boolean {\n\tif (message.role !== \"user\") return false;\n\t// Only a literal zero-block array is content-less. Whitespace-only text and\n\t// explicit empty-text blocks still emit transport blocks, so they must stay\n\t// hash-significant to keep divergence detection fail-closed.\n\treturn Array.isArray(message.content) && message.content.length === 0;\n}\n\nexport function sentMessages(context: Context): SentMessage[] {\n\treturn context.messages.filter(isTransmittedMessage);\n}\n\n/**\n * The one selection rule for \"message the provider was sent\". Branch-derived and\n * context-derived hashes MUST share it: a content-less user message that only one\n * side skips shifts every later index and reports a false divergence.\n */\nexport function isTransmittedMessage(message: { role: string }): message is SentMessage {\n\tif (message.role !== \"user\" && message.role !== \"toolResult\") return false;\n\treturn !isContentlessUserMessage(message as SentMessage);\n}\n\n/**\n * Applies the transmitted-message rule itself, so no caller can produce a hash\n * list that disagrees with another caller's by forgetting the filter.\n */\nexport function sentMessageHashes(messages: readonly SentMessage[]): string[] {\n\tconst hashes = messages.filter(isTransmittedMessage).map((message) =>\n\t\tdigest(\n\t\t\tmessage.role === \"user\"\n\t\t\t\t? { role: message.role, content: message.content }\n\t\t\t\t: {\n\t\t\t\t\t\trole: message.role,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\tcontent: message.content,\n\t\t\t\t\t},\n\t\t),\n\t);\n\treturn hashes;\n}\n\nexport function sentHashPrefixDigest(hashes: readonly string[], count = hashes.length): string {\n\treturn digest(hashes.slice(0, count));\n}\n\n/** Pure divergence guard: every non-proven continuation resolves to cold-seed. */\n\nexport function sentHashesForEntry(entry: ClaudeSdkOauthSessionEntry): readonly string[] | undefined {\n\treturn sentHashesByEntry.get(entry);\n}\n\nexport function recordSyncedStream(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]): void {\n\tconst copy = [...hashes];\n\tsentHashesByEntry.set(entry, copy);\n\tentry.sentCount = copy.length;\n\tentry.syncedPrefixHash = sentHashPrefixDigest(copy);\n\tentry.branchInfo = null;\n}\n\nconst GENERATED_DATE_LINE = /\\nCurrent date: \\d{4}-\\d{2}-\\d{2}(?=\\nCurrent working directory: [^\\n]*$)/;\n\n/**\n * The generated date line advances at UTC midnight while the conversation is\n * unchanged; hashing it verbatim retires a live session at midnight for no\n * semantic reason. Only that exact terminal line is neutralized - cwd and every\n * other prompt region stay fail-closed.\n */\nfunction fingerprintSystemPrompt(systemPrompt: Options[\"systemPrompt\"]): unknown {\n\tif (typeof systemPrompt !== \"string\") return systemPrompt ?? null;\n\treturn systemPrompt.replace(GENERATED_DATE_LINE, \"\\nCurrent date: <session-date>\");\n}\n\nexport function configFingerprint(\n\toptions: Options,\n\tcontext: Context,\n\tauthLane: ClaudeSdkOauthAuthLane,\n\taccountName: string,\n): SessionConfigFingerprint {\n\treturn {\n\t\tsystemPromptHash: digest(fingerprintSystemPrompt(options.systemPrompt)),\n\t\ttoolsetHash: digest({\n\t\t\ttools: options.tools ?? [],\n\t\t\treasoning: {\n\t\t\t\tthinking: options.thinking,\n\t\t\t\teffort: options.effort,\n\t\t\t\tmaxThinkingTokens: options.maxThinkingTokens,\n\t\t\t},\n\t\t\tcontextTools: (context.tools ?? []).map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparameters: tool.parameters,\n\t\t\t})),\n\t\t\tcwd: options.cwd,\n\t\t\tauthLane,\n\t\t\taccountName,\n\t\t\tpermissionMode: options.permissionMode,\n\t\t\t// Bump HOST_TOOL_POLICY_FINGERPRINT in tools.ts when denial copy or hooks change.\n\t\t\thostToolPolicy: HOST_TOOL_POLICY_FINGERPRINT,\n\t\t\tsettingSources: options.settingSources,\n\t\t\textraArgs: options.extraArgs,\n\t\t\tpathToClaudeCodeExecutable: options.pathToClaudeCodeExecutable,\n\t\t\tincludePartialMessages: options.includePartialMessages,\n\t\t}),\n\t};\n}\n\nfunction appendContent(blocks: ContentBlockParam[], content: string | readonly unknown[]): void {\n\t// The delta path has always transmitted a whole-content empty string as an\n\t// empty text block; keep that wire shape so resident sessions see the same\n\t// payload as before the shared mapper (prompt-bridge intentionally skips it).\n\tif (content === \"\") {\n\t\tblocks.push({ type: \"text\", text: \"\" });\n\t\treturn;\n\t}\n\tappendSdkContentBlocks(blocks, content);\n}\n\nexport function buildDeltaPromptBlocks(\n\tmessages: readonly SentMessage[],\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n): ContentBlockParam[] {\n\tconst blocks: ContentBlockParam[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\tif (index > 0) blocks.push({ type: \"text\", text: \"\\n\\n\" });\n\t\tif (message.role === \"toolResult\") {\n\t\t\tblocks.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool result (${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):\\n`,\n\t\t\t});\n\t\t}\n\t\tappendContent(blocks, message.content);\n\t}\n\treturn blocks;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-sync.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Context, Message } from \"@earendil-works/pi-ai\";\nimport { appendSdkContentBlocks } from \"./content-blocks.ts\";\nimport type { ClaudeSdkOauthAuthLane } from \"./options.ts\";\nimport type { ContentBlockParam, Options } from \"./sdk-boundary.ts\";\nimport type { ClaudeSdkOauthSessionEntry } from \"./session-registry.ts\";\nimport { HOST_TOOL_POLICY_FINGERPRINT, mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport type SentMessage = Extract<Message, { role: \"user\" | \"toolResult\" }>;\n\nexport type SessionConfigFingerprint = {\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n};\n\nconst sentHashesByEntry = new WeakMap<ClaudeSdkOauthSessionEntry, string[]>();\n\nfunction stableValue(value: unknown, seen = new WeakSet<object>()): unknown {\n\tif (typeof value === \"function\") return `[function:${value.name}:${value.toString()}]`;\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (seen.has(value)) return \"[circular]\";\n\tseen.add(value);\n\tconst normalized = Array.isArray(value)\n\t\t? value.map((item) => stableValue(item, seen))\n\t\t: Object.fromEntries(\n\t\t\t\tObject.entries(value as Record<string, unknown>)\n\t\t\t\t\t.filter(([, item]) => item !== undefined)\n\t\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t\t.map(([key, item]) => [key, stableValue(item, seen)]),\n\t\t\t);\n\tseen.delete(value);\n\treturn normalized;\n}\n\nfunction digest(value: unknown): string {\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify(stableValue(value)))\n\t\t.digest(\"hex\");\n}\n\nexport function sessionSyncDigest(value: unknown): string {\n\treturn digest(value);\n}\n\n/**\n * A user message with no content blocks carries nothing to transmit and is\n * transient: it is present for a single provider call and gone by the next.\n * Hashing one shifts every later index, so the following turn reports\n * `sent_stream_diverged` and re-sends the whole history even though the\n * conversation never changed. Tool results are never filtered - an empty tool\n * result is a real observation, and its id and name stay hash-significant.\n */\nfunction isContentlessUserMessage(message: SentMessage): boolean {\n\tif (message.role !== \"user\") return false;\n\t// Only a literal zero-block array is content-less. Whitespace-only text and\n\t// explicit empty-text blocks still emit transport blocks, so they must stay\n\t// hash-significant to keep divergence detection fail-closed.\n\treturn Array.isArray(message.content) && message.content.length === 0;\n}\n\nexport function sentMessages(context: Context): SentMessage[] {\n\treturn context.messages.filter(isTransmittedMessage);\n}\n\n/**\n * The one selection rule for \"message the provider was sent\". Branch-derived and\n * context-derived hashes MUST share it: a content-less user message that only one\n * side skips shifts every later index and reports a false divergence.\n */\nexport function isTransmittedMessage(message: { role: string }): message is SentMessage {\n\tif (message.role !== \"user\" && message.role !== \"toolResult\") return false;\n\treturn !isContentlessUserMessage(message as SentMessage);\n}\n\n/**\n * Applies the transmitted-message rule itself, so no caller can produce a hash\n * list that disagrees with another caller's by forgetting the filter.\n */\nexport function sentMessageHashes(messages: readonly SentMessage[]): string[] {\n\tconst hashes = messages.filter(isTransmittedMessage).map((message) =>\n\t\tdigest(\n\t\t\tmessage.role === \"user\"\n\t\t\t\t? { role: message.role, content: message.content }\n\t\t\t\t: {\n\t\t\t\t\t\trole: message.role,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\tcontent: message.content,\n\t\t\t\t\t},\n\t\t),\n\t);\n\treturn hashes;\n}\n\nexport function sentHashPrefixDigest(hashes: readonly string[], count = hashes.length): string {\n\treturn digest(hashes.slice(0, count));\n}\n\n/** Pure divergence guard: every non-proven continuation resolves to cold-seed. */\n\nexport function sentHashesForEntry(entry: ClaudeSdkOauthSessionEntry): readonly string[] | undefined {\n\treturn sentHashesByEntry.get(entry);\n}\n\nexport function recordSyncedStream(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]): void {\n\tconst copy = [...hashes];\n\tsentHashesByEntry.set(entry, copy);\n\tentry.sentCount = copy.length;\n\tentry.syncedPrefixHash = sentHashPrefixDigest(copy);\n\tentry.branchInfo = null;\n}\n\nconst GENERATED_DATE_LINE = /\\nCurrent date: \\d{4}-\\d{2}-\\d{2}(?=\\nCurrent working directory: [^\\n]*)/;\n\n/**\n * The generated date line advances at UTC midnight while the conversation is\n * unchanged; hashing it verbatim retires a live session at midnight for no\n * semantic reason. Only that exact date-plus-cwd pair is neutralized - cwd and\n * every other prompt region stay fail-closed. Extension appends legitimately\n * follow the cwd line (oh-my-openagent#7884), so the pair is matched wherever\n * it appears, not only at the end of the prompt.\n */\nfunction fingerprintSystemPrompt(systemPrompt: Options[\"systemPrompt\"]): unknown {\n\tif (typeof systemPrompt !== \"string\") return systemPrompt ?? null;\n\treturn systemPrompt.replace(GENERATED_DATE_LINE, \"\\nCurrent date: <session-date>\");\n}\n\nexport function configFingerprint(\n\toptions: Options,\n\tcontext: Context,\n\tauthLane: ClaudeSdkOauthAuthLane,\n\taccountName: string,\n): SessionConfigFingerprint {\n\treturn {\n\t\tsystemPromptHash: digest(fingerprintSystemPrompt(options.systemPrompt)),\n\t\ttoolsetHash: digest({\n\t\t\ttools: options.tools ?? [],\n\t\t\treasoning: {\n\t\t\t\tthinking: options.thinking,\n\t\t\t\teffort: options.effort,\n\t\t\t\tmaxThinkingTokens: options.maxThinkingTokens,\n\t\t\t},\n\t\t\tcontextTools: (context.tools ?? []).map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparameters: tool.parameters,\n\t\t\t})),\n\t\t\tcwd: options.cwd,\n\t\t\tauthLane,\n\t\t\taccountName,\n\t\t\tpermissionMode: options.permissionMode,\n\t\t\t// Bump HOST_TOOL_POLICY_FINGERPRINT in tools.ts when denial copy or hooks change.\n\t\t\thostToolPolicy: HOST_TOOL_POLICY_FINGERPRINT,\n\t\t\tsettingSources: options.settingSources,\n\t\t\textraArgs: options.extraArgs,\n\t\t\tpathToClaudeCodeExecutable: options.pathToClaudeCodeExecutable,\n\t\t\tincludePartialMessages: options.includePartialMessages,\n\t\t}),\n\t};\n}\n\nfunction appendContent(blocks: ContentBlockParam[], content: string | readonly unknown[]): void {\n\t// The delta path has always transmitted a whole-content empty string as an\n\t// empty text block; keep that wire shape so resident sessions see the same\n\t// payload as before the shared mapper (prompt-bridge intentionally skips it).\n\tif (content === \"\") {\n\t\tblocks.push({ type: \"text\", text: \"\" });\n\t\treturn;\n\t}\n\tappendSdkContentBlocks(blocks, content);\n}\n\nexport function buildDeltaPromptBlocks(\n\tmessages: readonly SentMessage[],\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n): ContentBlockParam[] {\n\tconst blocks: ContentBlockParam[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\tif (index > 0) blocks.push({ type: \"text\", text: \"\\n\\n\" });\n\t\tif (message.role === \"toolResult\") {\n\t\t\tblocks.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool result (${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):\\n`,\n\t\t\t});\n\t\t}\n\t\tappendContent(blocks, message.content);\n\t}\n\treturn blocks;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-attempt.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,EACN,KAAK,0BAA0B,EAI/B,MAAM,uBAAuB,CAAC;AAI/B,KAAK,wBAAwB,GAAG;IAAE,IAAI,IAAI,IAAI,CAAA;CAAE,CAAC;AAsCjD,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,0BAA0B,EACjC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAClC,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,wBAAwB;;
|
|
1
|
+
{"version":3,"file":"session-turn-attempt.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,EACN,KAAK,0BAA0B,EAI/B,MAAM,uBAAuB,CAAC;AAI/B,KAAK,wBAAwB,GAAG;IAAE,IAAI,IAAI,IAAI,CAAA;CAAE,CAAC;AAsCjD,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,0BAA0B,EACjC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAClC,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,wBAAwB;;mBAkDlB,IAAI;EAQlB"}
|
|
@@ -60,6 +60,14 @@ export function createSessionTurnAttempt(entry, message, hashes, signal, staged)
|
|
|
60
60
|
else {
|
|
61
61
|
rememberRetryCheckpoint(entry, hashes);
|
|
62
62
|
}
|
|
63
|
+
// Emit only when this attempt was consumed to completion (retained). A
|
|
64
|
+
// discarded attempt (failover to another account) unwinds through the
|
|
65
|
+
// generator's return() and never reaches here; an internally-failed
|
|
66
|
+
// attempt throws to the catch below. Both stay silent so the turn yields
|
|
67
|
+
// exactly one continuity observation - this retained attempt, or the
|
|
68
|
+
// single terminal observation residentSessionMessages emits when every
|
|
69
|
+
// attempt fails.
|
|
70
|
+
staged.emit();
|
|
63
71
|
}
|
|
64
72
|
catch (error) {
|
|
65
73
|
// The queue failed (completion rejected: pump failure, query end,
|
|
@@ -74,9 +82,6 @@ export function createSessionTurnAttempt(entry, message, hashes, signal, staged)
|
|
|
74
82
|
}
|
|
75
83
|
throw error;
|
|
76
84
|
}
|
|
77
|
-
finally {
|
|
78
|
-
staged.emit();
|
|
79
|
-
}
|
|
80
85
|
})(),
|
|
81
86
|
discard: () => {
|
|
82
87
|
if (resumeTargetMissing)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-attempt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-turn-attempt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoundedAsyncQueue, SESSION_STREAM_QUEUE_CAPACITY } from \"./bounded-queue.ts\";\nimport { sdkResultFailure } from \"./errors.ts\";\nimport type { SDKMessage, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { bindingFromEntry, forgetBinding, rememberBinding } from \"./session-reattach.ts\";\nimport {\n\ttype ClaudeSdkOauthSessionEntry,\n\tcloseSession,\n\tisCurrentGeneration,\n\tsessionRegistry,\n} from \"./session-registry.ts\";\nimport { submitSessionTurn } from \"./session-registry-pump.ts\";\nimport { recordSyncedStream, sentHashPrefixDigest } from \"./session-sync.ts\";\n\ntype StagedContinuityDecision = { emit(): void };\n\nfunction successfulTurn(messages: readonly SDKMessage[]): boolean {\n\treturn messages.some(\n\t\t(message) =>\n\t\t\tmessage.type === \"result\" && message.subtype === \"success\" && sdkResultFailure(message) === undefined,\n\t);\n}\n\nfunction recordAssistantUuid(entry: ClaudeSdkOauthSessionEntry, sentCount: number, message: SDKMessage): void {\n\tif (message.type === \"assistant\" && message.parent_tool_use_id === null) {\n\t\tentry.assistantUuidByIndex.set(sentCount, message.uuid);\n\t}\n}\n\n/**\n * An attempt that pushed its user payload and then aborted or failed leaves that\n * message on the lineage un-answered: `recordSyncedStream` never ran, so the\n * entry still points at the PRE-TURN boundary. Remembering the binding at that\n * boundary, tagged with the attempted turn's full sent-stream digest, lets the\n * SAME turn's retry fork past the orphaned message instead of appending it\n * twice (issue #723 retry storm). In-memory only — nothing here is persisted.\n */\n/** Claude Code answered \"No conversation found with session ID\": the bound id is dead, never resume it again. */\nconst RESUME_TARGET_MISSING = /no conversation found with session id/i;\n\nfunction publishBinding(entry: ClaudeSdkOauthSessionEntry, binding: Parameters<typeof rememberBinding>[0]): void {\n\trememberBinding({ ...binding, sdkSessionIdConfirmed: entry.sdkSessionIdConfirmed });\n}\n\nfunction rememberRetryCheckpoint(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]): void {\n\tif (entry.sentCount < 0 || entry.sentCount > hashes.length) return;\n\tpublishBinding(entry, {\n\t\t...bindingFromEntry(entry, hashes.slice(0, entry.sentCount)),\n\t\tunansweredTurnDigest: sentHashPrefixDigest(hashes, hashes.length),\n\t});\n}\n\nexport function createSessionTurnAttempt(\n\tentry: ClaudeSdkOauthSessionEntry,\n\tmessage: SDKUserMessage[\"message\"],\n\thashes: readonly string[],\n\tsignal: AbortSignal | undefined,\n\tstaged: StagedContinuityDecision,\n) {\n\tconst generation = entry.generation;\n\t// Claude Code declared the bound id dead: no later cleanup may re-publish it.\n\tlet resumeTargetMissing = false;\n\treturn {\n\t\tmessages: (async function* (): AsyncGenerator<SDKMessage> {\n\t\t\tconst queue = new BoundedAsyncQueue<SDKMessage>(SESSION_STREAM_QUEUE_CAPACITY);\n\t\t\tconst completion = submitSessionTurn(sessionRegistry, entry, {\n\t\t\t\tmessage,\n\t\t\t\tsignal,\n\t\t\t\tonMessage: (sdkMessage) => {\n\t\t\t\t\trecordAssistantUuid(entry, hashes.length, sdkMessage);\n\t\t\t\t\tqueue.push(sdkMessage);\n\t\t\t\t},\n\t\t\t});\n\t\t\tvoid completion.then(\n\t\t\t\t() => queue.close(),\n\t\t\t\t(error: unknown) => queue.fail(error),\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tfor await (const sdkMessage of queue) yield sdkMessage;\n\t\t\t\tconst turn = await completion;\n\t\t\t\tif (!turn.aborted && successfulTurn(turn.messages)) {\n\t\t\t\t\trecordSyncedStream(entry, hashes);\n\t\t\t\t\tpublishBinding(entry, bindingFromEntry(entry, hashes));\n\t\t\t\t} else {\n\t\t\t\t\trememberRetryCheckpoint(entry, hashes);\n\t\t\t\t}\n\t\t\t\t// Emit only when this attempt was consumed to completion (retained). A\n\t\t\t\t// discarded attempt (failover to another account) unwinds through the\n\t\t\t\t// generator's return() and never reaches here; an internally-failed\n\t\t\t\t// attempt throws to the catch below. Both stay silent so the turn yields\n\t\t\t\t// exactly one continuity observation - this retained attempt, or the\n\t\t\t\t// single terminal observation residentSessionMessages emits when every\n\t\t\t\t// attempt fails.\n\t\t\t\tstaged.emit();\n\t\t\t} catch (error) {\n\t\t\t\t// The queue failed (completion rejected: pump failure, query end,\n\t\t\t\t// attribution error). The payload was still pushed, so the retry needs\n\t\t\t\t// the same checkpoint the aborted path records.\n\t\t\t\tif (error instanceof Error && RESUME_TARGET_MISSING.test(error.message)) {\n\t\t\t\t\tresumeTargetMissing = true;\n\t\t\t\t\tforgetBinding(entry.senpiSessionId);\n\t\t\t\t} else {\n\t\t\t\t\trememberRetryCheckpoint(entry, hashes);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})(),\n\t\tdiscard: (): void => {\n\t\t\tif (resumeTargetMissing) forgetBinding(entry.senpiSessionId);\n\t\t\telse rememberRetryCheckpoint(entry, hashes);\n\t\t\tif (isCurrentGeneration(entry.senpiSessionId, generation)) {\n\t\t\t\tcloseSession(entry.senpiSessionId, \"attempt_discarded\");\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
|
|
@@ -4,11 +4,12 @@ export declare const SDK_TO_PI_TOOL_NAME: Readonly<Record<string, string>>;
|
|
|
4
4
|
export declare const PI_TO_SDK_TOOL_NAME: Readonly<Record<string, string>>;
|
|
5
5
|
/**
|
|
6
6
|
* Versioned host-tool denial policy. `configFingerprint` in session-sync.ts hashes this as
|
|
7
|
-
* `hostToolPolicy` into `toolsetHash`; a mismatch is `
|
|
8
|
-
* resident query. The same hash is persisted in the
|
|
9
|
-
* the first admission after an upgrade
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* `hostToolPolicy` into `toolsetHash`; a mismatch is `toolset_changed` and retires the live
|
|
8
|
+
* resident query (reattach with the current hooks). The same hash is persisted in the
|
|
9
|
+
* restart sidecar, so the first admission after an upgrade also reattaches with
|
|
10
|
+
* `toolset_changed` - the resumed query carries the current hooks, so the pre-bump
|
|
11
|
+
* denial text is never served again. Bump when denial copy or hooks change so
|
|
12
|
+
* wording-only edits cannot keep serving the old reason.
|
|
12
13
|
*/
|
|
13
14
|
export declare const HOST_TOOL_POLICY_FINGERPRINT = "host-tool-denial-v2";
|
|
14
15
|
export declare const BUILTIN_SDK_TOOLS: readonly ["Read", "Write", "Edit", "Bash", "Grep", "Glob"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQhE,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQhE,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAElE,eAAO,MAAM,iBAAiB,4DAA6D,CAAC;AAC5F,eAAO,MAAM,6BAA6B,QAEY,CAAC;AACvD,eAAO,MAAM,kCAAkC,QAAgC,CAAC;AAChF,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAC3D,eAAO,MAAM,uBAAuB,wBAA2C,CAAC;AAChF,eAAO,MAAM,8BAA8B,yDAAyD,CAAC;AACrG,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAgBhE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAAC;AAUF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQ1G;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQzG;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GACjD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuCzB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CA6BlE;AAED,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAGxD,CAAC"}
|
|
@@ -17,11 +17,12 @@ export const PI_TO_SDK_TOOL_NAME = {
|
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
19
19
|
* Versioned host-tool denial policy. `configFingerprint` in session-sync.ts hashes this as
|
|
20
|
-
* `hostToolPolicy` into `toolsetHash`; a mismatch is `
|
|
21
|
-
* resident query. The same hash is persisted in the
|
|
22
|
-
* the first admission after an upgrade
|
|
23
|
-
*
|
|
24
|
-
*
|
|
20
|
+
* `hostToolPolicy` into `toolsetHash`; a mismatch is `toolset_changed` and retires the live
|
|
21
|
+
* resident query (reattach with the current hooks). The same hash is persisted in the
|
|
22
|
+
* restart sidecar, so the first admission after an upgrade also reattaches with
|
|
23
|
+
* `toolset_changed` - the resumed query carries the current hooks, so the pre-bump
|
|
24
|
+
* denial text is never served again. Bump when denial copy or hooks change so
|
|
25
|
+
* wording-only edits cannot keep serving the old reason.
|
|
25
26
|
*/
|
|
26
27
|
export const HOST_TOOL_POLICY_FINGERPRINT = "host-tool-denial-v2";
|
|
27
28
|
export const BUILTIN_SDK_TOOLS = ["Read", "Write", "Edit", "Bash", "Grep", "Glob"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, Tool } from \"@earendil-works/pi-ai\";\nimport type { Options } from \"./sdk-boundary.ts\";\n\nexport const SDK_TO_PI_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"read\",\n\twrite: \"write\",\n\tedit: \"edit\",\n\tbash: \"bash\",\n\tgrep: \"grep\",\n\tglob: \"find\",\n};\n\nexport const PI_TO_SDK_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"Read\",\n\twrite: \"Write\",\n\tedit: \"Edit\",\n\tbash: \"Bash\",\n\tgrep: \"Grep\",\n\tfind: \"Glob\",\n\tglob: \"Glob\",\n};\n\n/**\n * Versioned host-tool denial policy. `configFingerprint` in session-sync.ts hashes this as\n * `hostToolPolicy` into `toolsetHash`; a mismatch is `options_changed` and retires the live\n * resident query. The same hash is persisted in the restart sidecar, so a bump also makes\n * the first admission after an upgrade cold-seed (`flatten` / `options_changed`) instead of\n * resuming the pre-bump SDK session - once per session, intended. Bump when denial copy or\n * hooks change so wording-only edits cannot keep serving the old reason.\n */\nexport const HOST_TOOL_POLICY_FINGERPRINT = \"host-tool-denial-v2\";\n\nexport const BUILTIN_SDK_TOOLS = [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Grep\", \"Glob\"] as const;\nexport const TOOL_EXECUTION_DENIED_MESSAGE =\n\t\"Senpi executes this tool on the host and returns its result as the next user message. \" +\n\t\"Wait for that result; this denial is not a failure.\";\nexport const HOST_TOOL_EXECUTION_DENIED_MESSAGE = TOOL_EXECUTION_DENIED_MESSAGE;\nexport const CUSTOM_TOOLS_MCP_SERVER_NAME = \"custom-tools\";\nexport const CUSTOM_TOOLS_MCP_PREFIX = `mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`;\nexport const HOST_CAPTURED_SDK_TOOL_MATCHER = \"Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*\";\nexport const HOST_TOOL_DENIAL_HOOKS: NonNullable<Options[\"hooks\"]> = {\n\tPreToolUse: [\n\t\t{\n\t\t\tmatcher: HOST_CAPTURED_SDK_TOOL_MATCHER,\n\t\t\thooks: [\n\t\t\t\tasync () => ({\n\t\t\t\t\tcontinue: false,\n\t\t\t\t\thookSpecificOutput: {\n\t\t\t\t\t\thookEventName: \"PreToolUse\",\n\t\t\t\t\t\tpermissionDecision: \"deny\",\n\t\t\t\t\t\tpermissionDecisionReason: HOST_TOOL_EXECUTION_DENIED_MESSAGE,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t},\n\t],\n};\n\nexport type ResolvedSdkTools = {\n\tsdkTools: string[];\n\tcustomTools: Tool[];\n\tcustomToolNameToSdk: Map<string, string>;\n\tcustomToolNameToPi: Map<string, string>;\n};\n\nfunction pascalCase(value: string): string {\n\treturn value\n\t\t.split(/[^a-zA-Z0-9]+/)\n\t\t.filter(Boolean)\n\t\t.map((part) => `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`)\n\t\t.join(\"\");\n}\n\nexport function mapPiToolNameToSdk(name: string, customToolNameToSdk?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tcustomToolNameToSdk?.get(name) ??\n\t\tcustomToolNameToSdk?.get(normalized) ??\n\t\tPI_TO_SDK_TOOL_NAME[normalized] ??\n\t\tpascalCase(name)\n\t);\n}\n\nexport function mapSdkToolNameToPi(name: string, customToolNameToPi?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tSDK_TO_PI_TOOL_NAME[normalized] ??\n\t\tcustomToolNameToPi?.get(name) ??\n\t\tcustomToolNameToPi?.get(normalized) ??\n\t\t(normalized.startsWith(CUSTOM_TOOLS_MCP_PREFIX) ? name.slice(CUSTOM_TOOLS_MCP_PREFIX.length) : name)\n\t);\n}\n\n/** Translate Claude Code's built-in-tool inputs into senpi's active tool schemas. */\nexport function mapToolArgs(\n\ttoolName: string,\n\targs: Readonly<Record<string, unknown>> | undefined,\n): Record<string, unknown> {\n\tconst input = args ?? {};\n\tswitch (toolName.toLowerCase()) {\n\t\tcase \"read\":\n\t\t\treturn { path: input.file_path ?? input.path, offset: input.offset, limit: input.limit };\n\t\tcase \"write\":\n\t\t\treturn { path: input.file_path ?? input.path, content: input.content };\n\t\tcase \"edit\":\n\t\t\treturn {\n\t\t\t\tpath: input.file_path ?? input.path,\n\t\t\t\tedits: Array.isArray(input.edits)\n\t\t\t\t\t? input.edits\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toldText: input.old_string ?? input.oldText ?? input.old_text,\n\t\t\t\t\t\t\t\tnewText: input.new_string ?? input.newText ?? input.new_text,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t};\n\t\tcase \"bash\":\n\t\t\treturn {\n\t\t\t\tcommand: input.command,\n\t\t\t\ttimeout: typeof input.timeout === \"number\" ? input.timeout / 1_000 : input.timeout,\n\t\t\t};\n\t\tcase \"grep\":\n\t\t\treturn {\n\t\t\t\tpattern: input.pattern,\n\t\t\t\tpath: input.path,\n\t\t\t\tglob: input.glob,\n\t\t\t\tignoreCase: input[\"-i\"] ?? input.ignoreCase,\n\t\t\t\tcontext: input.context ?? input[\"-C\"],\n\t\t\t\tlimit: input.head_limit ?? input.limit,\n\t\t\t};\n\t\tcase \"glob\":\n\t\tcase \"find\":\n\t\t\treturn { pattern: input.pattern, path: input.path, limit: input.limit };\n\t\tdefault:\n\t\t\treturn { ...input };\n\t}\n}\n\nexport function resolveSdkTools(context: Context): ResolvedSdkTools {\n\tif (!context.tools) {\n\t\treturn {\n\t\t\tsdkTools: [...BUILTIN_SDK_TOOLS],\n\t\t\tcustomTools: [],\n\t\t\tcustomToolNameToSdk: new Map(),\n\t\t\tcustomToolNameToPi: new Map(),\n\t\t};\n\t}\n\n\tconst sdkTools = new Set<string>();\n\tconst customTools: Tool[] = [];\n\tconst customToolNameToSdk = new Map<string, string>();\n\tconst customToolNameToPi = new Map<string, string>();\n\tfor (const tool of context.tools) {\n\t\tconst normalized = tool.name.toLowerCase();\n\t\tconst sdkName = PI_TO_SDK_TOOL_NAME[normalized];\n\t\tif (sdkName) {\n\t\t\tsdkTools.add(sdkName);\n\t\t\tcontinue;\n\t\t}\n\t\tconst customSdkName = `${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;\n\t\tcustomTools.push(tool);\n\t\tcustomToolNameToSdk.set(tool.name, customSdkName);\n\t\tcustomToolNameToSdk.set(normalized, customSdkName);\n\t\tcustomToolNameToPi.set(customSdkName, tool.name);\n\t\tcustomToolNameToPi.set(customSdkName.toLowerCase(), tool.name);\n\t}\n\treturn { sdkTools: [...sdkTools], customTools, customToolNameToSdk, customToolNameToPi };\n}\n\nexport const canUseTool: NonNullable<Options[\"canUseTool\"]> = async () => ({\n\tbehavior: \"deny\",\n\tmessage: TOOL_EXECUTION_DENIED_MESSAGE,\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, Tool } from \"@earendil-works/pi-ai\";\nimport type { Options } from \"./sdk-boundary.ts\";\n\nexport const SDK_TO_PI_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"read\",\n\twrite: \"write\",\n\tedit: \"edit\",\n\tbash: \"bash\",\n\tgrep: \"grep\",\n\tglob: \"find\",\n};\n\nexport const PI_TO_SDK_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"Read\",\n\twrite: \"Write\",\n\tedit: \"Edit\",\n\tbash: \"Bash\",\n\tgrep: \"Grep\",\n\tfind: \"Glob\",\n\tglob: \"Glob\",\n};\n\n/**\n * Versioned host-tool denial policy. `configFingerprint` in session-sync.ts hashes this as\n * `hostToolPolicy` into `toolsetHash`; a mismatch is `toolset_changed` and retires the live\n * resident query (reattach with the current hooks). The same hash is persisted in the\n * restart sidecar, so the first admission after an upgrade also reattaches with\n * `toolset_changed` - the resumed query carries the current hooks, so the pre-bump\n * denial text is never served again. Bump when denial copy or hooks change so\n * wording-only edits cannot keep serving the old reason.\n */\nexport const HOST_TOOL_POLICY_FINGERPRINT = \"host-tool-denial-v2\";\n\nexport const BUILTIN_SDK_TOOLS = [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Grep\", \"Glob\"] as const;\nexport const TOOL_EXECUTION_DENIED_MESSAGE =\n\t\"Senpi executes this tool on the host and returns its result as the next user message. \" +\n\t\"Wait for that result; this denial is not a failure.\";\nexport const HOST_TOOL_EXECUTION_DENIED_MESSAGE = TOOL_EXECUTION_DENIED_MESSAGE;\nexport const CUSTOM_TOOLS_MCP_SERVER_NAME = \"custom-tools\";\nexport const CUSTOM_TOOLS_MCP_PREFIX = `mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`;\nexport const HOST_CAPTURED_SDK_TOOL_MATCHER = \"Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*\";\nexport const HOST_TOOL_DENIAL_HOOKS: NonNullable<Options[\"hooks\"]> = {\n\tPreToolUse: [\n\t\t{\n\t\t\tmatcher: HOST_CAPTURED_SDK_TOOL_MATCHER,\n\t\t\thooks: [\n\t\t\t\tasync () => ({\n\t\t\t\t\tcontinue: false,\n\t\t\t\t\thookSpecificOutput: {\n\t\t\t\t\t\thookEventName: \"PreToolUse\",\n\t\t\t\t\t\tpermissionDecision: \"deny\",\n\t\t\t\t\t\tpermissionDecisionReason: HOST_TOOL_EXECUTION_DENIED_MESSAGE,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t},\n\t],\n};\n\nexport type ResolvedSdkTools = {\n\tsdkTools: string[];\n\tcustomTools: Tool[];\n\tcustomToolNameToSdk: Map<string, string>;\n\tcustomToolNameToPi: Map<string, string>;\n};\n\nfunction pascalCase(value: string): string {\n\treturn value\n\t\t.split(/[^a-zA-Z0-9]+/)\n\t\t.filter(Boolean)\n\t\t.map((part) => `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`)\n\t\t.join(\"\");\n}\n\nexport function mapPiToolNameToSdk(name: string, customToolNameToSdk?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tcustomToolNameToSdk?.get(name) ??\n\t\tcustomToolNameToSdk?.get(normalized) ??\n\t\tPI_TO_SDK_TOOL_NAME[normalized] ??\n\t\tpascalCase(name)\n\t);\n}\n\nexport function mapSdkToolNameToPi(name: string, customToolNameToPi?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tSDK_TO_PI_TOOL_NAME[normalized] ??\n\t\tcustomToolNameToPi?.get(name) ??\n\t\tcustomToolNameToPi?.get(normalized) ??\n\t\t(normalized.startsWith(CUSTOM_TOOLS_MCP_PREFIX) ? name.slice(CUSTOM_TOOLS_MCP_PREFIX.length) : name)\n\t);\n}\n\n/** Translate Claude Code's built-in-tool inputs into senpi's active tool schemas. */\nexport function mapToolArgs(\n\ttoolName: string,\n\targs: Readonly<Record<string, unknown>> | undefined,\n): Record<string, unknown> {\n\tconst input = args ?? {};\n\tswitch (toolName.toLowerCase()) {\n\t\tcase \"read\":\n\t\t\treturn { path: input.file_path ?? input.path, offset: input.offset, limit: input.limit };\n\t\tcase \"write\":\n\t\t\treturn { path: input.file_path ?? input.path, content: input.content };\n\t\tcase \"edit\":\n\t\t\treturn {\n\t\t\t\tpath: input.file_path ?? input.path,\n\t\t\t\tedits: Array.isArray(input.edits)\n\t\t\t\t\t? input.edits\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toldText: input.old_string ?? input.oldText ?? input.old_text,\n\t\t\t\t\t\t\t\tnewText: input.new_string ?? input.newText ?? input.new_text,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t};\n\t\tcase \"bash\":\n\t\t\treturn {\n\t\t\t\tcommand: input.command,\n\t\t\t\ttimeout: typeof input.timeout === \"number\" ? input.timeout / 1_000 : input.timeout,\n\t\t\t};\n\t\tcase \"grep\":\n\t\t\treturn {\n\t\t\t\tpattern: input.pattern,\n\t\t\t\tpath: input.path,\n\t\t\t\tglob: input.glob,\n\t\t\t\tignoreCase: input[\"-i\"] ?? input.ignoreCase,\n\t\t\t\tcontext: input.context ?? input[\"-C\"],\n\t\t\t\tlimit: input.head_limit ?? input.limit,\n\t\t\t};\n\t\tcase \"glob\":\n\t\tcase \"find\":\n\t\t\treturn { pattern: input.pattern, path: input.path, limit: input.limit };\n\t\tdefault:\n\t\t\treturn { ...input };\n\t}\n}\n\nexport function resolveSdkTools(context: Context): ResolvedSdkTools {\n\tif (!context.tools) {\n\t\treturn {\n\t\t\tsdkTools: [...BUILTIN_SDK_TOOLS],\n\t\t\tcustomTools: [],\n\t\t\tcustomToolNameToSdk: new Map(),\n\t\t\tcustomToolNameToPi: new Map(),\n\t\t};\n\t}\n\n\tconst sdkTools = new Set<string>();\n\tconst customTools: Tool[] = [];\n\tconst customToolNameToSdk = new Map<string, string>();\n\tconst customToolNameToPi = new Map<string, string>();\n\tfor (const tool of context.tools) {\n\t\tconst normalized = tool.name.toLowerCase();\n\t\tconst sdkName = PI_TO_SDK_TOOL_NAME[normalized];\n\t\tif (sdkName) {\n\t\t\tsdkTools.add(sdkName);\n\t\t\tcontinue;\n\t\t}\n\t\tconst customSdkName = `${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;\n\t\tcustomTools.push(tool);\n\t\tcustomToolNameToSdk.set(tool.name, customSdkName);\n\t\tcustomToolNameToSdk.set(normalized, customSdkName);\n\t\tcustomToolNameToPi.set(customSdkName, tool.name);\n\t\tcustomToolNameToPi.set(customSdkName.toLowerCase(), tool.name);\n\t}\n\treturn { sdkTools: [...sdkTools], customTools, customToolNameToSdk, customToolNameToPi };\n}\n\nexport const canUseTool: NonNullable<Options[\"canUseTool\"]> = async () => ({\n\tbehavior: \"deny\",\n\tmessage: TOOL_EXECUTION_DENIED_MESSAGE,\n});\n"]}
|
|
@@ -19,5 +19,13 @@ export interface ShouldBypassOptions {
|
|
|
19
19
|
export declare function recordSuccess(state: CompactionExtensionState): CompactionExtensionState;
|
|
20
20
|
export declare function recordFailure(state: CompactionExtensionState, now: number, opts?: RecordFailureOptions): CompactionExtensionState;
|
|
21
21
|
export declare function isTripped(state: CompactionExtensionState, now: number): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* A tripped breaker halts *automatic* compaction only. An explicit `/compact` is the
|
|
24
|
+
* user's escape hatch - and on an SDK-owned lane it is the documented recovery from a
|
|
25
|
+
* rejected model downswitch - so refusing it during the cooldown would strand the very
|
|
26
|
+
* session the recovery exists for. Manual failures are still recorded (see the
|
|
27
|
+
* `ownsCompaction` failure-accounting site in `index.ts`), so they count toward the
|
|
28
|
+
* trip that protects the automatic routes.
|
|
29
|
+
*/
|
|
22
30
|
export declare function shouldBypass(_state: CompactionExtensionState, opts?: ShouldBypassOptions): boolean;
|
|
23
31
|
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/circuit-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,WAAW,QAAS,CAAC;AAElC,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,GAAG,WAAW,CAAC;CACvC;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,KAAK,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAEvF;AAED,wBAAgB,aAAa,CAC5B,KAAK,EAAE,wBAAwB,EAC/B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,oBAAoB,GACzB,wBAAwB,CAmB1B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAIlG"}
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/circuit-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,WAAW,QAAS,CAAC;AAElC,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,GAAG,WAAW,CAAC;CACvC;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,KAAK,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAEvF;AAED,wBAAgB,aAAa,CAC5B,KAAK,EAAE,wBAAwB,EAC/B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,oBAAoB,GACzB,wBAAwB,CAmB1B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAIlG"}
|
|
@@ -26,6 +26,14 @@ export function recordFailure(state, now, opts) {
|
|
|
26
26
|
export function isTripped(state, now) {
|
|
27
27
|
return state.trippedAt !== null && now < state.trippedAt + COOLDOWN_MS;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* A tripped breaker halts *automatic* compaction only. An explicit `/compact` is the
|
|
31
|
+
* user's escape hatch - and on an SDK-owned lane it is the documented recovery from a
|
|
32
|
+
* rejected model downswitch - so refusing it during the cooldown would strand the very
|
|
33
|
+
* session the recovery exists for. Manual failures are still recorded (see the
|
|
34
|
+
* `ownsCompaction` failure-accounting site in `index.ts`), so they count toward the
|
|
35
|
+
* trip that protects the automatic routes.
|
|
36
|
+
*/
|
|
29
37
|
export function shouldBypass(_state, opts) {
|
|
30
38
|
if (opts?.manual === true)
|
|
31
39
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/circuit-breaker.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAmBlC,MAAM,UAAU,aAAa,CAAC,KAA+B;IAC5D,OAAO,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,KAA+B,EAC/B,GAAW,EACX,IAA2B;IAE3B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC;QAC1E,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,mBAAmB,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,IAAI,GAA6B;QACtC,GAAG,OAAO;QACV,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,GAAG,CAAC;KACpD,CAAC;IACF,IAAI,IAAI,CAAC,mBAAmB,IAAI,sBAAsB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACnF,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,EAAE,MAAM,EAAE,CAAC;YACd,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,IAAI,CAAC,mBAAmB;YACtC,SAAS,EAAE,GAAG;YACd,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,WAAW;SACjC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAA+B,EAAE,GAAW;IACrE,OAAO,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAgC,EAAE,IAA0B;IACxF,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import type { CompactionReason } from \"../../types.ts\";\nimport type { CompactionExtensionState } from \"./state.ts\";\n\nexport const FAILURE_TRIP_THRESHOLD = 3;\nexport const COOLDOWN_MS = 60_000;\n\nexport interface BreakerNotification {\n\ttripped: true;\n\tfailureCount: number;\n\ttrippedAt: number;\n\treason: CompactionReason | \"threshold\";\n}\n\nexport interface RecordFailureOptions {\n\tonTrip?: (notification: BreakerNotification) => void;\n\troute?: CompactionReason;\n}\n\nexport interface ShouldBypassOptions {\n\tmanual?: boolean;\n\treason?: CompactionReason;\n}\n\nexport function recordSuccess(state: CompactionExtensionState): CompactionExtensionState {\n\treturn { ...state, consecutiveFailures: 0, trippedAt: null };\n}\n\nexport function recordFailure(\n\tstate: CompactionExtensionState,\n\tnow: number,\n\topts?: RecordFailureOptions,\n): CompactionExtensionState {\n\tlet working = state;\n\tif (working.trippedAt !== null && now >= working.trippedAt + COOLDOWN_MS) {\n\t\tworking = { ...working, consecutiveFailures: 0, trippedAt: null };\n\t}\n\tconst next: CompactionExtensionState = {\n\t\t...working,\n\t\tconsecutiveFailures: working.consecutiveFailures + 1,\n\t};\n\tif (next.consecutiveFailures >= FAILURE_TRIP_THRESHOLD && next.trippedAt === null) {\n\t\tnext.trippedAt = now;\n\t\topts?.onTrip?.({\n\t\t\ttripped: true,\n\t\t\tfailureCount: next.consecutiveFailures,\n\t\t\ttrippedAt: now,\n\t\t\treason: opts.route ?? \"threshold\",\n\t\t});\n\t}\n\treturn next;\n}\n\nexport function isTripped(state: CompactionExtensionState, now: number): boolean {\n\treturn state.trippedAt !== null && now < state.trippedAt + COOLDOWN_MS;\n}\n\nexport function shouldBypass(_state: CompactionExtensionState, opts?: ShouldBypassOptions): boolean {\n\tif (opts?.manual === true) return true;\n\tif (opts?.reason === \"manual\") return true;\n\treturn false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/circuit-breaker.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAmBlC,MAAM,UAAU,aAAa,CAAC,KAA+B;IAC5D,OAAO,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,KAA+B,EAC/B,GAAW,EACX,IAA2B;IAE3B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC;QAC1E,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,mBAAmB,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,IAAI,GAA6B;QACtC,GAAG,OAAO;QACV,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,GAAG,CAAC;KACpD,CAAC;IACF,IAAI,IAAI,CAAC,mBAAmB,IAAI,sBAAsB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACnF,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,EAAE,MAAM,EAAE,CAAC;YACd,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,IAAI,CAAC,mBAAmB;YACtC,SAAS,EAAE,GAAG;YACd,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,WAAW;SACjC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAA+B,EAAE,GAAW;IACrE,OAAO,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC;AACxE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,MAAgC,EAAE,IAA0B;IACxF,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import type { CompactionReason } from \"../../types.ts\";\nimport type { CompactionExtensionState } from \"./state.ts\";\n\nexport const FAILURE_TRIP_THRESHOLD = 3;\nexport const COOLDOWN_MS = 60_000;\n\nexport interface BreakerNotification {\n\ttripped: true;\n\tfailureCount: number;\n\ttrippedAt: number;\n\treason: CompactionReason | \"threshold\";\n}\n\nexport interface RecordFailureOptions {\n\tonTrip?: (notification: BreakerNotification) => void;\n\troute?: CompactionReason;\n}\n\nexport interface ShouldBypassOptions {\n\tmanual?: boolean;\n\treason?: CompactionReason;\n}\n\nexport function recordSuccess(state: CompactionExtensionState): CompactionExtensionState {\n\treturn { ...state, consecutiveFailures: 0, trippedAt: null };\n}\n\nexport function recordFailure(\n\tstate: CompactionExtensionState,\n\tnow: number,\n\topts?: RecordFailureOptions,\n): CompactionExtensionState {\n\tlet working = state;\n\tif (working.trippedAt !== null && now >= working.trippedAt + COOLDOWN_MS) {\n\t\tworking = { ...working, consecutiveFailures: 0, trippedAt: null };\n\t}\n\tconst next: CompactionExtensionState = {\n\t\t...working,\n\t\tconsecutiveFailures: working.consecutiveFailures + 1,\n\t};\n\tif (next.consecutiveFailures >= FAILURE_TRIP_THRESHOLD && next.trippedAt === null) {\n\t\tnext.trippedAt = now;\n\t\topts?.onTrip?.({\n\t\t\ttripped: true,\n\t\t\tfailureCount: next.consecutiveFailures,\n\t\t\ttrippedAt: now,\n\t\t\treason: opts.route ?? \"threshold\",\n\t\t});\n\t}\n\treturn next;\n}\n\nexport function isTripped(state: CompactionExtensionState, now: number): boolean {\n\treturn state.trippedAt !== null && now < state.trippedAt + COOLDOWN_MS;\n}\n\n/**\n * A tripped breaker halts *automatic* compaction only. An explicit `/compact` is the\n * user's escape hatch - and on an SDK-owned lane it is the documented recovery from a\n * rejected model downswitch - so refusing it during the cooldown would strand the very\n * session the recovery exists for. Manual failures are still recorded (see the\n * `ownsCompaction` failure-accounting site in `index.ts`), so they count toward the\n * trip that protects the automatic routes.\n */\nexport function shouldBypass(_state: CompactionExtensionState, opts?: ShouldBypassOptions): boolean {\n\tif (opts?.manual === true) return true;\n\tif (opts?.reason === \"manual\") return true;\n\treturn false;\n}\n"]}
|
|
@@ -19,10 +19,18 @@ export interface DeterministicFallbackDiagnostic {
|
|
|
19
19
|
candidateRejections?: Array<{
|
|
20
20
|
firstKeptEntryId: string;
|
|
21
21
|
rejectionReason: DeterministicFallbackRejectionReason;
|
|
22
|
+
estimatedTokens?: number;
|
|
23
|
+
unsafeMessageIndex?: number;
|
|
24
|
+
unsafeEntryId?: string;
|
|
25
|
+
unsafeMessageRole?: string;
|
|
22
26
|
}>;
|
|
23
27
|
candidatesChecked?: number;
|
|
24
28
|
budgetExceeded?: boolean;
|
|
29
|
+
contextWindow?: number;
|
|
30
|
+
reserveTokens?: number;
|
|
31
|
+
budgetTokens?: number;
|
|
25
32
|
}
|
|
33
|
+
export declare function formatRequiredCompactionFallbackRejection(diagnostics: DeterministicFallbackDiagnostic): string;
|
|
26
34
|
export declare function classifyRequiredCompactionFallbackFailure(error: unknown): RequiredCompactionFallbackFailure | undefined;
|
|
27
35
|
export declare function createRequiredCompactionFallback(preparation: CompactionPreparation, contextWindow: number, failureKind: RequiredCompactionFallbackFailure, metadata: RecoveryMetadata, branchEntries?: SessionEntry[], diagnostics?: DeterministicFallbackDiagnostic): CompactionResult<DeterministicFallbackDetails> | undefined;
|
|
28
36
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAGjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAGjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;AAQrC,MAAM,MAAM,iCAAiC,GAC1C,uBAAuB,GACvB,2BAA2B,GAC3B,kCAAkC,GAClC,6BAA6B,CAAC;AAEjC,UAAU,gBAAgB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAC7C,8BAA8B,GAC9B,yBAAyB,GACzB,gCAAgC,GAChC,uBAAuB,GACvB,+BAA+B,CAAC;AAEnC,UAAU,4BAA4B;IACrC,MAAM,EAAE,4CAA4C,CAAC;IACrD,MAAM,EAAE,8BAA8B,CAAC;IACvC,WAAW,EAAE,iCAAiC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,UAAU,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC3E;AAED,MAAM,WAAW,+BAA+B;IAC/C,eAAe,CAAC,EAAE,oCAAoC,CAAC;IACvD,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,oCAAoC,CAAC;QACtD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,yCAAyC,CAAC,WAAW,EAAE,+BAA+B,GAAG,MAAM,CAoC9G;AA8CD,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,OAAO,GACZ,iCAAiC,GAAG,SAAS,CAc/C;AAED,wBAAgB,gCAAgC,CAC/C,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,iCAAiC,EAC9C,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,GAAE,YAAY,EAAO,EAClC,WAAW,CAAC,EAAE,+BAA+B,GAC3C,gBAAgB,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAiS5D"}
|