@code-yeongyu/senpi 2026.9.5 → 2026.9.7-2
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 +104 -0
- package/dist/core/agent-session.d.ts +60 -5
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +262 -78
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +6 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +6 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/stuck-overflow.d.ts +11 -0
- package/dist/core/compaction/stuck-overflow.d.ts.map +1 -0
- package/dist/core/compaction/stuck-overflow.js +17 -0
- package/dist/core/compaction/stuck-overflow.js.map +1 -0
- package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.js +3 -21
- package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.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-registry-pump.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js +15 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.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/session-turn-claim.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-claim.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-claim.js +2 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-claim.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 +4 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +40 -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.js +2 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +12 -0
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js +47 -18
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote-convert.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote-convert.js +2 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-convert.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/retained-message-safety.js +14 -1
- package/dist/core/extensions/builtin/compaction/retained-message-safety.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 +19 -1
- package/dist/core/extensions/builtin/goal/cache-warm.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm.js +23 -10
- package/dist/core/extensions/builtin/goal/cache-warm.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation-recovery.js +2 -0
- package/dist/core/extensions/builtin/goal/continuation-recovery.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 +4 -0
- package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +14 -3
- 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 +7 -3
- package/dist/core/extensions/builtin/goal/monitor-continuation.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/permission-system/external-dir.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.js +5 -22
- 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/gpt-6-astra.d.ts +2 -2
- 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 +8 -2
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +14 -7
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/messages.d.ts +7 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +2 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/package-identity.d.ts +12 -0
- package/dist/core/package-identity.d.ts.map +1 -0
- package/dist/core/package-identity.js +57 -0
- package/dist/core/package-identity.js.map +1 -0
- package/dist/core/resource-loader.d.ts +0 -2
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +8 -60
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +5 -4
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +12 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +29 -3
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +4 -1
- package/dist/core/settings-manager.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 +5 -1
- 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 +3 -7
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +57 -29
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +1 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +0 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +1 -4
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +0 -15
- package/dist/modes/rpc/session-registry.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/compaction-guide.md +2 -2
- package/docs/compaction.md +2 -2
- package/docs/development.md +3 -2
- package/docs/providers.md +1 -1
- package/docs/rpc.md +6 -7
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +74 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +34 -5
- 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/bridge/reserved.ts +2 -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 +6 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +73 -129
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/interrupt-bounds.ts +66 -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/run-queue.ts +18 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +59 -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-runtime.js +16 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.d.ts +25 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.js +70 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-slot.ts +106 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +70 -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 +11 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +6 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/session-env.ts +56 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/runtime-asset.ts +40 -14
- 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 +10 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +9 -11
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-contract.ts +45 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +43 -71
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +4 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-status.ts +30 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-notification-queue.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +12 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +29 -15
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +3 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +17 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.js +6 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.d.ts +2 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.js +5 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts +7 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.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/mistral-conversations.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +4 -4
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cerebras.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.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/moonshotai-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai.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-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/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/providers/faux.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +8 -1
- 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/estimate.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.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/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":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cache-keepalive/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Context,\n\tisAnthropicApiBaseUrl,\n\ttype Model,\n\tresolvePromptCacheTtlSeconds,\n\ttype Tool,\n\ttype WarmPromptCacheOptions,\n\ttype WarmPromptCacheResult,\n\twarmPromptCache,\n} from \"@earendil-works/pi-ai\";\nimport { convertToLlm, filterContextExcludedMessages } from \"../../../messages.ts\";\nimport { noticeEntryRenderer } from \"../../notice/index.ts\";\nimport type { EntryRenderer, ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../types.ts\";\nimport { formatWarmTokenCount } from \"../goal/cache-warm.ts\";\nimport { GOAL_CONTINUATION_TIMER_STATE_EVENT } from \"../goal/monitor-continuation.ts\";\n\nexport const CACHE_KEEPALIVE_ENTRY_TYPE = \"cache-keepalive\";\nexport const CACHE_WARM_PING_EVENT = \"cache_warm_ping\";\n\ninterface StartedEntry {\n\treadonly phase: \"started\";\n}\n\ninterface PingEntry {\n\treadonly phase: \"ping\";\n\treadonly iteration: number;\n\treadonly cacheRead: number;\n\treadonly cacheWrite: number;\n\treadonly estimatedCostUsd: number;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\ninterface StoppedEntry {\n\treadonly phase: \"stopped\";\n\treadonly iterations: number;\n\treadonly stopReason: string;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\nexport type CacheKeepAliveEntryData = StartedEntry | PingEntry | StoppedEntry;\n\ntype WarmPromptCacheFn = (\n\tmodel: Model<any>,\n\tcontext: Context,\n\toptions?: WarmPromptCacheOptions,\n) => Promise<WarmPromptCacheResult>;\n\nexport const renderCacheKeepAliveEntry: EntryRenderer<CacheKeepAliveEntryData> = noticeEntryRenderer((entry) => {\n\tconst data = entry.data;\n\tif (data?.phase !== \"ping\") return undefined;\n\tconst refreshed = data.cacheRead + data.cacheWrite;\n\treturn {\n\t\ttitle: `⚡ Warm ping #${data.iteration} · ~${formatWarmTokenCount(refreshed)} tokens refreshed · ${formatUsd(data.estimatedCostUsd)}`,\n\t\twhy: \"Refreshed the active Anthropic prompt cache while the session was idle.\",\n\t\texpandedLine: `cache read ${data.cacheRead} · cache write ${data.cacheWrite} · session total ${formatUsd(data.cumulativeEstimatedUsd)}`,\n\t};\n});\n\nexport function createCacheKeepAliveExtension(\n\tdependencies: { readonly warmPromptCache?: WarmPromptCacheFn } = {},\n): ExtensionFactory {\n\tconst warm = dependencies.warmPromptCache ?? warmPromptCache;\n\treturn (pi: ExtensionAPI) => {\n\t\tlet ctx: ExtensionContext | undefined;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tlet inFlight = false;\n\t\tlet generation = 0;\n\t\tlet active = false;\n\t\tlet goalTimerArmed = false;\n\t\tlet attempts = 0;\n\t\tlet cumulativeEstimatedUsd = 0;\n\t\tlet lastCompletedAtMs: number | undefined;\n\t\tlet lastMessages: AgentMessage[] = [];\n\t\tlet lastUsage: { input: number; cacheRead: number; cacheWrite: number } | undefined;\n\n\t\tpi.registerEntryRenderer(CACHE_KEEPALIVE_ENTRY_TYPE, renderCacheKeepAliveEntry);\n\n\t\tconst unsubscribeGoalTimer = pi.events?.on(GOAL_CONTINUATION_TIMER_STATE_EVENT, (data) => {\n\t\t\tif (!isGoalTimerState(data)) return;\n\t\t\tgoalTimerArmed = data.armed;\n\t\t\tif (data.armed) stop(\"goal-timer-armed\");\n\t\t});\n\n\t\tfunction append(data: CacheKeepAliveEntryData): void {\n\t\t\tpi.appendEntry(CACHE_KEEPALIVE_ENTRY_TYPE, data);\n\t\t}\n\n\t\tfunction stop(reason: string, forceEntry = false): void {\n\t\t\tconst shouldAppend = active || inFlight || timer !== undefined || forceEntry;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tactive = false;\n\t\t\tif (shouldAppend) {\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"stopped\",\n\t\t\t\t\titerations: attempts,\n\t\t\t\t\tstopReason: reason,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction arm(): void {\n\t\t\tif (timer !== undefined || inFlight) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (!settings?.enabled || current?.model === undefined || lastCompletedAtMs === undefined) return;\n\t\t\tif (!isWarmSupportedModel(current.model)) return;\n\t\t\tif (!current.isIdle()) {\n\t\t\t\tstop(\"agent-busy\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (current.hasPendingMessages()) {\n\t\t\t\tstop(\"pending-messages\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (goalTimerArmed) {\n\t\t\t\tstop(\"goal-timer-armed\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst safeWaitSeconds = current.getPromptCacheSafeWaitSeconds?.();\n\t\t\tif (safeWaitSeconds === undefined || !Number.isFinite(safeWaitSeconds)) return;\n\t\t\tif (attempts >= Math.max(0, settings.maxRequestsPerSession)) {\n\t\t\t\tstop(\"max-requests\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst projectedUsd = projectedPingCost(current.model, lastUsage);\n\t\t\tif (cumulativeEstimatedUsd + projectedUsd > Math.max(0, settings.maxCostUsdPerSession)) {\n\t\t\t\tstop(\"cost-cap\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!active) {\n\t\t\t\tactive = true;\n\t\t\t\tappend({ phase: \"started\" });\n\t\t\t}\n\t\t\tconst intervalMs = Math.max(0, safeWaitSeconds - Math.max(0, settings.marginSeconds)) * 1000;\n\t\t\tconst delayMs = Math.max(0, lastCompletedAtMs + intervalMs - Date.now());\n\t\t\tconst scheduledGeneration = generation;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tvoid ping(scheduledGeneration);\n\t\t\t}, delayMs);\n\t\t}\n\n\t\tasync function ping(scheduledGeneration: number): Promise<void> {\n\t\t\tif (scheduledGeneration !== generation) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (\n\t\t\t\tcurrent === undefined ||\n\t\t\t\tsettings?.enabled !== true ||\n\t\t\t\tcurrent.model === undefined ||\n\t\t\t\t!isWarmSupportedModel(current.model) ||\n\t\t\t\t!current.isIdle() ||\n\t\t\t\tcurrent.hasPendingMessages() ||\n\t\t\t\tgoalTimerArmed ||\n\t\t\t\tattempts >= Math.max(0, settings.maxRequestsPerSession) ||\n\t\t\t\tcumulativeEstimatedUsd + projectedPingCost(current.model, lastUsage) >\n\t\t\t\t\tMath.max(0, settings.maxCostUsdPerSession)\n\t\t\t) {\n\t\t\t\tarm();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinFlight = true;\n\t\t\tattempts += 1;\n\t\t\tconst iteration = attempts;\n\t\t\tconst pingGeneration = generation;\n\t\t\ttry {\n\t\t\t\tconst preparation = await current.prepareProviderRequest?.(lastMessages);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst preparedMessages = preparation?.messages ?? lastMessages;\n\t\t\t\tconst activeToolNames = new Set(pi.getActiveTools());\n\t\t\t\tconst tools: Tool[] = pi\n\t\t\t\t\t.getAllTools()\n\t\t\t\t\t.filter((tool) => activeToolNames.has(tool.name))\n\t\t\t\t\t.map(({ name, description, parameters }) => ({ name, description, parameters }));\n\t\t\t\tconst auth = await current.modelRegistry.getApiKeyAndHeaders(current.model);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!auth.ok) throw new Error(auth.error);\n\t\t\t\tconst authHeaders = auth.headers ?? {};\n\t\t\t\tconst headers = preparation ? await preparation.transformHeaders(authHeaders) : authHeaders;\n\t\t\t\tconst result = await warm(\n\t\t\t\t\tcurrent.model,\n\t\t\t\t\t{\n\t\t\t\t\t\tsystemPrompt: current.getSystemPrompt(),\n\t\t\t\t\t\tmessages: convertToLlm(filterContextExcludedMessages(preparedMessages)),\n\t\t\t\t\t\t...(tools.length > 0 ? { tools } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\tsessionId: current.sessionManager.getSessionId(),\n\t\t\t\t\t\tcacheRetention: current.model.cacheRetention,\n\t\t\t\t\t\tonPayload: preparation ? async (payload) => await preparation.transformPayload(payload) : undefined,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!result.supported) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tstop(\"unsupported-model\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst estimatedCostUsd = actualPingCost(current.model, result.usage);\n\t\t\t\tcumulativeEstimatedUsd += estimatedCostUsd;\n\t\t\t\tlastCompletedAtMs = Date.now();\n\t\t\t\tconst cachedTokens = result.usage.cacheRead + result.usage.cacheWrite;\n\t\t\t\tconst ttlSeconds = resolvePromptCacheTtlSeconds(current.model) ?? 0;\n\t\t\t\tpi.events?.emit(CACHE_WARM_PING_EVENT, { iteration, cachedTokens, ttlSeconds, estimatedCostUsd });\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"ping\",\n\t\t\t\t\titeration,\n\t\t\t\t\tcacheRead: result.usage.cacheRead,\n\t\t\t\t\tcacheWrite: result.usage.cacheWrite,\n\t\t\t\t\testimatedCostUsd,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t\tinFlight = false;\n\t\t\t\tarm();\n\t\t\t} catch {\n\t\t\t\tinFlight = false;\n\t\t\t\tif (pingGeneration === generation) stop(\"provider-error\");\n\t\t\t\telse arm();\n\t\t\t}\n\t\t}\n\n\t\tpi.on(\"session_start\", (_event, nextCtx) => {\n\t\t\tstop(\"session-restart\");\n\t\t\tctx = nextCtx;\n\t\t\tattempts = 0;\n\t\t\tcumulativeEstimatedUsd = 0;\n\t\t\tlastMessages = nextCtx.sessionManager.buildSessionContext().messages;\n\t\t\tconst usage = lastAssistantUsage(lastMessages);\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = lastAssistantTimestamp(lastMessages);\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"agent_end\", (event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tconst usage = lastAssistantUsage(event.messages);\n\t\t\tif (usage?.stopReason === \"error\") {\n\t\t\t\tstop(\"provider-error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastMessages = [...event.messages];\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = Date.now();\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"model_select\", (_event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tstop(\"model-changed\");\n\t\t\tarm();\n\t\t});\n\t\tpi.on(\"agent_start\", () => stop(\"agent-busy\"));\n\t\tpi.on(\"input\", () => stop(\"user-input\"));\n\t\tpi.on(\"session_shutdown\", () => {\n\t\t\tstop(\"session-dispose\");\n\t\t\tunsubscribeGoalTimer?.();\n\t\t\tctx = undefined;\n\t\t});\n\t};\n}\n\nfunction isWarmSupportedModel(model: Model<any>): model is Model<\"anthropic-messages\"> {\n\treturn model.api === \"anthropic-messages\" && isAnthropicApiBaseUrl(model.baseUrl);\n}\n\nfunction lastAssistantUsage(\n\tmessages: readonly AgentMessage[],\n): { input: number; cacheRead: number; cacheWrite: number; stopReason?: string } | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role !== \"assistant\") continue;\n\t\treturn {\n\t\t\tinput: finiteTokens(message.usage.input),\n\t\t\tcacheRead: finiteTokens(message.usage.cacheRead),\n\t\t\tcacheWrite: finiteTokens(message.usage.cacheWrite),\n\t\t\tstopReason: message.stopReason,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction lastAssistantTimestamp(messages: readonly AgentMessage[]): number | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"assistant\" && Number.isFinite(message.timestamp)) return message.timestamp;\n\t}\n\treturn undefined;\n}\n\nfunction projectedPingCost(\n\tmodel: Model<any>,\n\tusage: { input: number; cacheRead: number; cacheWrite: number } | undefined,\n): number {\n\tconst promptTokens = (usage?.input ?? 0) + (usage?.cacheRead ?? 0) + (usage?.cacheWrite ?? 0);\n\treturn (promptTokens * Math.max(model.cost.cacheRead, model.cost.cacheWrite)) / 1_000_000;\n}\n\nfunction actualPingCost(model: Model<any>, usage: { input: number; cacheRead: number; cacheWrite: number }): number {\n\treturn (\n\t\t(usage.cacheRead * model.cost.cacheRead +\n\t\t\tusage.cacheWrite * model.cost.cacheWrite +\n\t\t\tusage.input * model.cost.input) /\n\t\t1_000_000\n\t);\n}\n\nfunction finiteTokens(value: number): number {\n\treturn Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(3)}`;\n}\n\nfunction isGoalTimerState(value: unknown): value is { armed: boolean; kind: string } {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\ttypeof (value as { armed?: unknown }).armed === \"boolean\" &&\n\t\ttypeof (value as { kind?: unknown }).kind === \"string\"\n\t);\n}\n\nexport default createCacheKeepAliveExtension();\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cache-keepalive/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Context,\n\tisAnthropicApiBaseUrl,\n\ttype Model,\n\tresolvePromptCacheTtlSeconds,\n\ttype Tool,\n\ttype WarmPromptCacheOptions,\n\ttype WarmPromptCacheResult,\n\twarmPromptCache,\n} from \"@earendil-works/pi-ai\";\nimport { convertToLlm, filterContextExcludedMessages } from \"../../../messages.ts\";\nimport { noticeEntryRenderer } from \"../../notice/index.ts\";\nimport type { EntryRenderer, ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../types.ts\";\nimport { formatWarmTokenCount } from \"../goal/cache-warm.ts\";\n\nexport const CACHE_KEEPALIVE_ENTRY_TYPE = \"cache-keepalive\";\nexport const CACHE_WARM_PING_EVENT = \"cache_warm_ping\";\n\ninterface StartedEntry {\n\treadonly phase: \"started\";\n}\n\ninterface PingEntry {\n\treadonly phase: \"ping\";\n\treadonly iteration: number;\n\treadonly cacheRead: number;\n\treadonly cacheWrite: number;\n\treadonly estimatedCostUsd: number;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\ninterface StoppedEntry {\n\treadonly phase: \"stopped\";\n\treadonly iterations: number;\n\treadonly stopReason: string;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\nexport type CacheKeepAliveEntryData = StartedEntry | PingEntry | StoppedEntry;\n\ntype WarmPromptCacheFn = (\n\tmodel: Model<any>,\n\tcontext: Context,\n\toptions?: WarmPromptCacheOptions,\n) => Promise<WarmPromptCacheResult>;\n\nexport const renderCacheKeepAliveEntry: EntryRenderer<CacheKeepAliveEntryData> = noticeEntryRenderer((entry) => {\n\tconst data = entry.data;\n\tif (data?.phase !== \"ping\") return undefined;\n\tconst refreshed = data.cacheRead + data.cacheWrite;\n\treturn {\n\t\ttitle: `⚡ Warm ping #${data.iteration} · ~${formatWarmTokenCount(refreshed)} tokens refreshed · ${formatUsd(data.estimatedCostUsd)}`,\n\t\twhy: \"Refreshed the active Anthropic prompt cache while the session was idle.\",\n\t\texpandedLine: `cache read ${data.cacheRead} · cache write ${data.cacheWrite} · session total ${formatUsd(data.cumulativeEstimatedUsd)}`,\n\t};\n});\n\nexport function createCacheKeepAliveExtension(\n\tdependencies: { readonly warmPromptCache?: WarmPromptCacheFn } = {},\n): ExtensionFactory {\n\tconst warm = dependencies.warmPromptCache ?? warmPromptCache;\n\treturn (pi: ExtensionAPI) => {\n\t\tlet ctx: ExtensionContext | undefined;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tlet inFlight = false;\n\t\tlet generation = 0;\n\t\tlet active = false;\n\t\tlet attempts = 0;\n\t\tlet cumulativeEstimatedUsd = 0;\n\t\tlet lastCompletedAtMs: number | undefined;\n\t\tlet lastMessages: AgentMessage[] = [];\n\t\tlet lastUsage: { input: number; cacheRead: number; cacheWrite: number } | undefined;\n\n\t\tpi.registerEntryRenderer(CACHE_KEEPALIVE_ENTRY_TYPE, renderCacheKeepAliveEntry);\n\n\t\t// No goal-timer coupling: an armed goal continuation timer is now a long\n\t\t// stall backstop that issues no provider request, so it cannot refresh the\n\t\t// prompt cache on this loop's behalf.\n\t\tfunction append(data: CacheKeepAliveEntryData): void {\n\t\t\tpi.appendEntry(CACHE_KEEPALIVE_ENTRY_TYPE, data);\n\t\t}\n\n\t\tfunction stop(reason: string, forceEntry = false): void {\n\t\t\tconst shouldAppend = active || inFlight || timer !== undefined || forceEntry;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tactive = false;\n\t\t\tif (shouldAppend) {\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"stopped\",\n\t\t\t\t\titerations: attempts,\n\t\t\t\t\tstopReason: reason,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction arm(): void {\n\t\t\tif (timer !== undefined || inFlight) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (!settings?.enabled || current?.model === undefined || lastCompletedAtMs === undefined) return;\n\t\t\tif (!isWarmSupportedModel(current.model)) return;\n\t\t\tif (!current.isIdle()) {\n\t\t\t\tstop(\"agent-busy\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (current.hasPendingMessages()) {\n\t\t\t\tstop(\"pending-messages\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst safeWaitSeconds = current.getPromptCacheSafeWaitSeconds?.();\n\t\t\tif (safeWaitSeconds === undefined || !Number.isFinite(safeWaitSeconds)) return;\n\t\t\tif (attempts >= Math.max(0, settings.maxRequestsPerSession)) {\n\t\t\t\tstop(\"max-requests\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst projectedUsd = projectedPingCost(current.model, lastUsage);\n\t\t\tif (cumulativeEstimatedUsd + projectedUsd > Math.max(0, settings.maxCostUsdPerSession)) {\n\t\t\t\tstop(\"cost-cap\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!active) {\n\t\t\t\tactive = true;\n\t\t\t\tappend({ phase: \"started\" });\n\t\t\t}\n\t\t\tconst intervalMs = Math.max(0, safeWaitSeconds - Math.max(0, settings.marginSeconds)) * 1000;\n\t\t\tconst delayMs = Math.max(0, lastCompletedAtMs + intervalMs - Date.now());\n\t\t\tconst scheduledGeneration = generation;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tvoid ping(scheduledGeneration);\n\t\t\t}, delayMs);\n\t\t}\n\n\t\tasync function ping(scheduledGeneration: number): Promise<void> {\n\t\t\tif (scheduledGeneration !== generation) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (\n\t\t\t\tcurrent === undefined ||\n\t\t\t\tsettings?.enabled !== true ||\n\t\t\t\tcurrent.model === undefined ||\n\t\t\t\t!isWarmSupportedModel(current.model) ||\n\t\t\t\t!current.isIdle() ||\n\t\t\t\tcurrent.hasPendingMessages() ||\n\t\t\t\tattempts >= Math.max(0, settings.maxRequestsPerSession) ||\n\t\t\t\tcumulativeEstimatedUsd + projectedPingCost(current.model, lastUsage) >\n\t\t\t\t\tMath.max(0, settings.maxCostUsdPerSession)\n\t\t\t) {\n\t\t\t\tarm();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinFlight = true;\n\t\t\tattempts += 1;\n\t\t\tconst iteration = attempts;\n\t\t\tconst pingGeneration = generation;\n\t\t\ttry {\n\t\t\t\tconst preparation = await current.prepareProviderRequest?.(lastMessages);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst preparedMessages = preparation?.messages ?? lastMessages;\n\t\t\t\tconst activeToolNames = new Set(pi.getActiveTools());\n\t\t\t\tconst tools: Tool[] = pi\n\t\t\t\t\t.getAllTools()\n\t\t\t\t\t.filter((tool) => activeToolNames.has(tool.name))\n\t\t\t\t\t.map(({ name, description, parameters }) => ({ name, description, parameters }));\n\t\t\t\tconst auth = await current.modelRegistry.getApiKeyAndHeaders(current.model);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!auth.ok) throw new Error(auth.error);\n\t\t\t\tconst authHeaders = auth.headers ?? {};\n\t\t\t\tconst headers = preparation ? await preparation.transformHeaders(authHeaders) : authHeaders;\n\t\t\t\tconst result = await warm(\n\t\t\t\t\tcurrent.model,\n\t\t\t\t\t{\n\t\t\t\t\t\tsystemPrompt: current.getSystemPrompt(),\n\t\t\t\t\t\tmessages: convertToLlm(filterContextExcludedMessages(preparedMessages)),\n\t\t\t\t\t\t...(tools.length > 0 ? { tools } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\tsessionId: current.sessionManager.getSessionId(),\n\t\t\t\t\t\tcacheRetention: current.model.cacheRetention,\n\t\t\t\t\t\tonPayload: preparation ? async (payload) => await preparation.transformPayload(payload) : undefined,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!result.supported) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tstop(\"unsupported-model\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst estimatedCostUsd = actualPingCost(current.model, result.usage);\n\t\t\t\tcumulativeEstimatedUsd += estimatedCostUsd;\n\t\t\t\tlastCompletedAtMs = Date.now();\n\t\t\t\tconst cachedTokens = result.usage.cacheRead + result.usage.cacheWrite;\n\t\t\t\tconst ttlSeconds = resolvePromptCacheTtlSeconds(current.model) ?? 0;\n\t\t\t\tpi.events?.emit(CACHE_WARM_PING_EVENT, { iteration, cachedTokens, ttlSeconds, estimatedCostUsd });\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"ping\",\n\t\t\t\t\titeration,\n\t\t\t\t\tcacheRead: result.usage.cacheRead,\n\t\t\t\t\tcacheWrite: result.usage.cacheWrite,\n\t\t\t\t\testimatedCostUsd,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t\tinFlight = false;\n\t\t\t\tarm();\n\t\t\t} catch {\n\t\t\t\tinFlight = false;\n\t\t\t\tif (pingGeneration === generation) stop(\"provider-error\");\n\t\t\t\telse arm();\n\t\t\t}\n\t\t}\n\n\t\tpi.on(\"session_start\", (_event, nextCtx) => {\n\t\t\tstop(\"session-restart\");\n\t\t\tctx = nextCtx;\n\t\t\tattempts = 0;\n\t\t\tcumulativeEstimatedUsd = 0;\n\t\t\tlastMessages = nextCtx.sessionManager.buildSessionContext().messages;\n\t\t\tconst usage = lastAssistantUsage(lastMessages);\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = lastAssistantTimestamp(lastMessages);\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"agent_end\", (event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tconst usage = lastAssistantUsage(event.messages);\n\t\t\tif (usage?.stopReason === \"error\") {\n\t\t\t\tstop(\"provider-error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastMessages = [...event.messages];\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = Date.now();\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"model_select\", (_event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tstop(\"model-changed\");\n\t\t\tarm();\n\t\t});\n\t\tpi.on(\"agent_start\", () => stop(\"agent-busy\"));\n\t\tpi.on(\"input\", () => stop(\"user-input\"));\n\t\tpi.on(\"session_shutdown\", () => {\n\t\t\tstop(\"session-dispose\");\n\t\t\tctx = undefined;\n\t\t});\n\t};\n}\n\nfunction isWarmSupportedModel(model: Model<any>): model is Model<\"anthropic-messages\"> {\n\treturn model.api === \"anthropic-messages\" && isAnthropicApiBaseUrl(model.baseUrl);\n}\n\nfunction lastAssistantUsage(\n\tmessages: readonly AgentMessage[],\n): { input: number; cacheRead: number; cacheWrite: number; stopReason?: string } | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role !== \"assistant\") continue;\n\t\treturn {\n\t\t\tinput: finiteTokens(message.usage.input),\n\t\t\tcacheRead: finiteTokens(message.usage.cacheRead),\n\t\t\tcacheWrite: finiteTokens(message.usage.cacheWrite),\n\t\t\tstopReason: message.stopReason,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction lastAssistantTimestamp(messages: readonly AgentMessage[]): number | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"assistant\" && Number.isFinite(message.timestamp)) return message.timestamp;\n\t}\n\treturn undefined;\n}\n\nfunction projectedPingCost(\n\tmodel: Model<any>,\n\tusage: { input: number; cacheRead: number; cacheWrite: number } | undefined,\n): number {\n\tconst promptTokens = (usage?.input ?? 0) + (usage?.cacheRead ?? 0) + (usage?.cacheWrite ?? 0);\n\treturn (promptTokens * Math.max(model.cost.cacheRead, model.cost.cacheWrite)) / 1_000_000;\n}\n\nfunction actualPingCost(model: Model<any>, usage: { input: number; cacheRead: number; cacheWrite: number }): number {\n\treturn (\n\t\t(usage.cacheRead * model.cost.cacheRead +\n\t\t\tusage.cacheWrite * model.cost.cacheWrite +\n\t\t\tusage.input * model.cost.input) /\n\t\t1_000_000\n\t);\n}\n\nfunction finiteTokens(value: number): number {\n\treturn Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(3)}`;\n}\n\nexport default createCacheKeepAliveExtension();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,aAAa,CAC5B,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,EACpC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,MAAM,CAWR;AAMD,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,OAAO,EAChB,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACjD,aAAa,CAAC,EAAE,MAAM,GACpB,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"prompt-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,aAAa,CAC5B,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,EACpC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,MAAM,CAWR;AAMD,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,OAAO,EAChB,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACjD,aAAa,CAAC,EAAE,MAAM,GACpB,iBAAiB,EAAE,CAgDrB;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC,CASlG"}
|
|
@@ -47,6 +47,8 @@ export function buildPromptBlocks(context, customToolNameToSdk, toolWatchNote) {
|
|
|
47
47
|
pushText(text);
|
|
48
48
|
continue;
|
|
49
49
|
}
|
|
50
|
+
if (message.role === "configurationUpdate")
|
|
51
|
+
continue;
|
|
50
52
|
pushPrefix(`TOOL RESULT (historical ${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):`);
|
|
51
53
|
if (!appendContentBlocks(blocks, message.content))
|
|
52
54
|
pushText("(see attached image)");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-bridge.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, Context } from \"@earendil-works/pi-ai\";\nimport { appendSdkContentBlocks } from \"./content-blocks.ts\";\nimport type { ContentBlockParam, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport { mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport function contentToText(\n\tcontent: AssistantMessage[\"content\"],\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n): string {\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\") return block.text;\n\t\t\tif (block.type === \"thinking\") return block.thinking;\n\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\treturn `Historical tool call (non-executable): ${mapPiToolNameToSdk(block.name, customToolNameToSdk)} args=${JSON.stringify(block.arguments)}`;\n\t\t\t}\n\t\t\treturn `[${block.type}]`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction appendContentBlocks(blocks: ContentBlockParam[], content: string | readonly unknown[]): boolean {\n\treturn appendSdkContentBlocks(blocks, content);\n}\n\nexport function buildPromptBlocks(\n\tcontext: Context,\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n\ttoolWatchNote?: string,\n): ContentBlockParam[] {\n\tconst blocks: ContentBlockParam[] = [];\n\tconst pushText = (text: string): void => {\n\t\tblocks.push({ type: \"text\", text });\n\t};\n\tconst finalMessage = context.messages.at(-1);\n\tconst finalUserMessage = finalMessage?.role === \"user\" ? finalMessage : undefined;\n\tconst history = finalUserMessage ? context.messages.slice(0, -1) : context.messages;\n\n\tif (history.length > 0) {\n\t\tpushText(\"<conversation_history>\\n\");\n\t\tlet hasPreviousTurn = false;\n\t\tconst pushPrefix = (label: string): void => {\n\t\t\tpushText(`${hasPreviousTurn ? \"\\n\\n\" : \"\"}${label}\\n`);\n\t\t\thasPreviousTurn = true;\n\t\t};\n\n\t\tfor (const message of history) {\n\t\t\tif (message.role === \"user\") {\n\t\t\t\tpushPrefix(\"USER:\");\n\t\t\t\tif (!appendContentBlocks(blocks, message.content)) pushText(\"(see attached image)\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tpushPrefix(\"ASSISTANT:\");\n\t\t\t\tconst text = contentToText(message.content, customToolNameToSdk);\n\t\t\t\tif (text.length > 0) pushText(text);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpushPrefix(\n\t\t\t\t`TOOL RESULT (historical ${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):`,\n\t\t\t);\n\t\t\tif (!appendContentBlocks(blocks, message.content)) pushText(\"(see attached image)\");\n\t\t}\n\t\tpushText(\"\\n</conversation_history>\");\n\t}\n\n\tif (toolWatchNote?.trim()) {\n\t\tpushText(\"<recovered_tool_results>\\n\");\n\t\tpushText(toolWatchNote.trim());\n\t\tpushText(\"\\n</recovered_tool_results>\");\n\t}\n\tpushText(\n\t\t'The above is the conversation history so far, provided as context. Respond as the assistant to the user message below only. Never emit \"USER:\" or \"ASSISTANT:\" labels or continue the transcript.',\n\t);\n\tif (finalUserMessage && !appendContentBlocks(blocks, finalUserMessage.content)) pushText(\"(see attached image)\");\n\treturn blocks;\n}\n\nexport function buildPromptStream(promptBlocks: ContentBlockParam[]): AsyncIterable<SDKUserMessage> {\n\treturn (async function* () {\n\t\tyield {\n\t\t\ttype: \"user\",\n\t\t\tmessage: { role: \"user\", content: promptBlocks } as SDKUserMessage[\"message\"],\n\t\t\tparent_tool_use_id: null,\n\t\t\tsession_id: \"prompt\",\n\t\t};\n\t})();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"prompt-bridge.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, Context } from \"@earendil-works/pi-ai\";\nimport { appendSdkContentBlocks } from \"./content-blocks.ts\";\nimport type { ContentBlockParam, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport { mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport function contentToText(\n\tcontent: AssistantMessage[\"content\"],\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n): string {\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\") return block.text;\n\t\t\tif (block.type === \"thinking\") return block.thinking;\n\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\treturn `Historical tool call (non-executable): ${mapPiToolNameToSdk(block.name, customToolNameToSdk)} args=${JSON.stringify(block.arguments)}`;\n\t\t\t}\n\t\t\treturn `[${block.type}]`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction appendContentBlocks(blocks: ContentBlockParam[], content: string | readonly unknown[]): boolean {\n\treturn appendSdkContentBlocks(blocks, content);\n}\n\nexport function buildPromptBlocks(\n\tcontext: Context,\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n\ttoolWatchNote?: string,\n): ContentBlockParam[] {\n\tconst blocks: ContentBlockParam[] = [];\n\tconst pushText = (text: string): void => {\n\t\tblocks.push({ type: \"text\", text });\n\t};\n\tconst finalMessage = context.messages.at(-1);\n\tconst finalUserMessage = finalMessage?.role === \"user\" ? finalMessage : undefined;\n\tconst history = finalUserMessage ? context.messages.slice(0, -1) : context.messages;\n\n\tif (history.length > 0) {\n\t\tpushText(\"<conversation_history>\\n\");\n\t\tlet hasPreviousTurn = false;\n\t\tconst pushPrefix = (label: string): void => {\n\t\t\tpushText(`${hasPreviousTurn ? \"\\n\\n\" : \"\"}${label}\\n`);\n\t\t\thasPreviousTurn = true;\n\t\t};\n\n\t\tfor (const message of history) {\n\t\t\tif (message.role === \"user\") {\n\t\t\t\tpushPrefix(\"USER:\");\n\t\t\t\tif (!appendContentBlocks(blocks, message.content)) pushText(\"(see attached image)\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tpushPrefix(\"ASSISTANT:\");\n\t\t\t\tconst text = contentToText(message.content, customToolNameToSdk);\n\t\t\t\tif (text.length > 0) pushText(text);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (message.role === \"configurationUpdate\") continue;\n\t\t\tpushPrefix(\n\t\t\t\t`TOOL RESULT (historical ${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):`,\n\t\t\t);\n\t\t\tif (!appendContentBlocks(blocks, message.content)) pushText(\"(see attached image)\");\n\t\t}\n\t\tpushText(\"\\n</conversation_history>\");\n\t}\n\n\tif (toolWatchNote?.trim()) {\n\t\tpushText(\"<recovered_tool_results>\\n\");\n\t\tpushText(toolWatchNote.trim());\n\t\tpushText(\"\\n</recovered_tool_results>\");\n\t}\n\tpushText(\n\t\t'The above is the conversation history so far, provided as context. Respond as the assistant to the user message below only. Never emit \"USER:\" or \"ASSISTANT:\" labels or continue the transcript.',\n\t);\n\tif (finalUserMessage && !appendContentBlocks(blocks, finalUserMessage.content)) pushText(\"(see attached image)\");\n\treturn blocks;\n}\n\nexport function buildPromptStream(promptBlocks: ContentBlockParam[]): AsyncIterable<SDKUserMessage> {\n\treturn (async function* () {\n\t\tyield {\n\t\t\ttype: \"user\",\n\t\t\tmessage: { role: \"user\", content: promptBlocks } as SDKUserMessage[\"message\"],\n\t\t\tparent_tool_use_id: null,\n\t\t\tsession_id: \"prompt\",\n\t\t};\n\t})();\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-binding.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAC7D,eAAO,MAAM,cAAc;;;CAA8C,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,WAAW,GAAG;IAClB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,mBAAmB,GACzB,aAAa,CAgBf;AAED,0FAA0F;AAC1F,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,mBAAmB,GACzB,aAAa,GAAG,SAAS,CAsB3B;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,aAAa,GACnB,iBAAiB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"session-binding.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAC7D,eAAO,MAAM,cAAc;;;CAA8C,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,WAAW,GAAG;IAClB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,mBAAmB,GACzB,aAAa,CAgBf;AAED,0FAA0F;AAC1F,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,mBAAmB,GACzB,aAAa,GAAG,SAAS,CAsB3B;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,aAAa,GACnB,iBAAiB,GAAG,SAAS,CAW/B"}
|
|
@@ -58,12 +58,12 @@ export function bindingFromStoredBranch(branch, stored) {
|
|
|
58
58
|
if (markerIndex < 0)
|
|
59
59
|
return undefined;
|
|
60
60
|
const marker = branch[markerIndex];
|
|
61
|
-
if (marker?.id !== stored.markerEntryId ||
|
|
62
|
-
!isBindingMarker(marker.data) ||
|
|
63
|
-
!branch.slice(markerIndex + 2).every(isSafeBindingSuffix)) {
|
|
61
|
+
if (marker?.id !== stored.markerEntryId || !isBindingMarker(marker.data))
|
|
64
62
|
return undefined;
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
const assistantIndex = committedAssistantIndex(branch, markerIndex + 1);
|
|
64
|
+
if (assistantIndex < 0 || !branch.slice(assistantIndex + 1).every(isLedgerOnlyEntry))
|
|
65
|
+
return undefined;
|
|
66
|
+
const committedAssistant = branch[assistantIndex]?.message;
|
|
67
67
|
if (!isAssistantMessage(committedAssistant))
|
|
68
68
|
return undefined;
|
|
69
69
|
if (assistantContentHash(committedAssistant) !== stored.assistantContentHash)
|
|
@@ -71,24 +71,41 @@ export function bindingFromStoredBranch(branch, stored) {
|
|
|
71
71
|
return bindingFromStored(stored);
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
74
|
+
* The marker is appended inside `message_end`, so handlers that run after this
|
|
75
|
+
* builtin (and extensions loaded later) can append ledger entries before the
|
|
76
|
+
* assistant itself persists. The committed assistant is the first message after
|
|
77
|
+
* the marker; anything that reaches the model in between fails closed.
|
|
78
|
+
*/
|
|
79
|
+
function committedAssistantIndex(branch, from) {
|
|
80
|
+
for (let index = from; index < branch.length; index += 1) {
|
|
81
|
+
const entry = branch[index];
|
|
82
|
+
if (entry?.type === "message")
|
|
83
|
+
return index;
|
|
84
|
+
if (!entry || !isLedgerOnlyEntry(entry))
|
|
85
|
+
return -1;
|
|
86
|
+
}
|
|
87
|
+
return -1;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Entry types the session-manager never projects into the LLM context. They
|
|
91
|
+
* cannot shift the sent-stream digest the binding is verified against, so any
|
|
92
|
+
* `custom` ledger record (hook state, rule scans, memory bookkeeping, ...) is
|
|
93
|
+
* admitted regardless of who wrote it. Everything the model can see - messages,
|
|
94
|
+
* custom messages other than the goal continuation, compaction and branch
|
|
95
|
+
* summaries - keeps failing closed (oh-my-openagent#7925).
|
|
77
96
|
*/
|
|
78
|
-
const
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
97
|
+
const LEDGER_ONLY_ENTRY_TYPES = new Set([
|
|
98
|
+
"custom",
|
|
99
|
+
"label",
|
|
100
|
+
"session_info",
|
|
101
|
+
"thinking_level_change",
|
|
102
|
+
"model_change",
|
|
103
|
+
"configuration_update",
|
|
85
104
|
]);
|
|
86
|
-
function
|
|
87
|
-
if (entry.type === "label")
|
|
88
|
-
return true;
|
|
105
|
+
function isLedgerOnlyEntry(entry) {
|
|
89
106
|
if (entry.type === "custom_message")
|
|
90
107
|
return entry.customType === GOAL_CONTINUATION_MESSAGE_TYPE;
|
|
91
|
-
return
|
|
108
|
+
return LEDGER_ONLY_ENTRY_TYPES.has(entry.type);
|
|
92
109
|
}
|
|
93
110
|
function newestBindingEntryIndex(branch) {
|
|
94
111
|
for (let index = branch.length - 1; index >= 0; index -= 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-binding.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { GOAL_CONTINUATION_MESSAGE_TYPE } from \"../../../messages.ts\";\nimport type { StoredBinding } from \"./session-binding-store.ts\";\nimport { assistantContentHash } from \"./session-commit-boundary.ts\";\nimport type { ContinuityBinding } from \"./session-reattach.ts\";\nimport { sentHashPrefixDigest } from \"./session-sync.ts\";\n\nexport const BINDING_ENTRY_TYPE = \"claude-sdk-oauth-binding\";\nexport const BINDING_MARKER = { schemaVersion: 2, marker: true } as const;\n\nexport type BindingInvalidation = {\n\treadonly schemaVersion: 1;\n\treadonly invalidated: true;\n\treadonly reason: string;\n};\n\ntype BranchEntry = {\n\treadonly id?: string;\n\treadonly type: string;\n\treadonly customType?: string;\n\treadonly data?: unknown;\n\treadonly message?: unknown;\n};\n\nexport type StoredBindingAnchor = {\n\treadonly sessionPath: string;\n\treadonly sessionId: string;\n\treadonly markerEntryId: string;\n\treadonly assistantContentHash: string;\n};\n\nexport type BindingEntryState = {\n\treadonly sdkSessionId: string;\n\treadonly accountName: string;\n\treadonly modelId: string;\n\treadonly systemPromptHash: string;\n\treadonly toolsetHash: string;\n\treadonly assistantUuidByIndex: ReadonlyMap<number, string>;\n};\n\n/**\n * The record is derived from the registry entry plus the hashes the branch\n * actually carries, never from the process binding map: that map holds the\n * previous turn's state while `message_end` runs (and only a prefix digest right\n * after a restart), so reading it would anchor this turn's marker to a stale or\n * absent sent-stream.\n */\nexport function storedBindingFromEntry(\n\tentry: BindingEntryState,\n\thashes: readonly string[],\n\tanchor: StoredBindingAnchor,\n): StoredBinding {\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsessionPath: anchor.sessionPath,\n\t\tsessionId: anchor.sessionId,\n\t\tmarkerEntryId: anchor.markerEntryId,\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tsentCount: hashes.length,\n\t\tsentPrefixHash: sentHashPrefixDigest(hashes),\n\t\tassistantContentHash: anchor.assistantContentHash,\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(hashes.length) ?? null,\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t};\n}\n\n/** Persist a completed turn whose resident registry entry closed before `message_end`. */\nexport function storedBindingFromBinding(\n\tbinding: ContinuityBinding,\n\thashes: readonly string[],\n\tanchor: StoredBindingAnchor,\n): StoredBinding | undefined {\n\tif (binding.sdkSessionIdConfirmed === false) return undefined;\n\tif (binding.sentCount !== hashes.length) return undefined;\n\tconst expectedDigest = sentHashPrefixDigest(hashes);\n\tconst bindingDigest =\n\t\tbinding.sentPrefixHash ?? (binding.sentHashes.length > 0 ? sentHashPrefixDigest(binding.sentHashes) : undefined);\n\tif (bindingDigest === undefined || bindingDigest !== expectedDigest) return undefined;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsessionPath: anchor.sessionPath,\n\t\tsessionId: anchor.sessionId,\n\t\tmarkerEntryId: anchor.markerEntryId,\n\t\tsdkSessionId: binding.sdkSessionId,\n\t\tsentCount: hashes.length,\n\t\tsentPrefixHash: sentHashPrefixDigest(hashes),\n\t\tassistantContentHash: anchor.assistantContentHash,\n\t\tlastAssistantUuid: binding.lastAssistantUuid,\n\t\taccountName: binding.accountName,\n\t\tmodelId: binding.modelId,\n\t\tsystemPromptHash: binding.systemPromptHash,\n\t\ttoolsetHash: binding.toolsetHash,\n\t};\n}\n\nexport function bindingFromStoredBranch(\n\tbranch: readonly BranchEntry[],\n\tstored: StoredBinding,\n): ContinuityBinding | undefined {\n\tconst markerIndex = newestBindingEntryIndex(branch);\n\tif (markerIndex < 0) return undefined;\n\tconst marker = branch[markerIndex];\n\tif (\n\t\tmarker?.id !== stored.markerEntryId ||\n\t\t!isBindingMarker(marker.data) ||\n\t\t!branch.slice(markerIndex + 2).every(isSafeBindingSuffix)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst committedAssistant = branch[markerIndex + 1]?.message;\n\tif (!isAssistantMessage(committedAssistant)) return undefined;\n\tif (assistantContentHash(committedAssistant) !== stored.assistantContentHash) return undefined;\n\treturn bindingFromStored(stored);\n}\n\n/**\n * Display-only metadata the co-resident builtins append after the committed\n * assistant (stop-hook state/diagnostics/output, rule activations, rule scans).\n * None participates in the sent stream, so none can shift the prefix digest.\n */\nconst SAFE_BINDING_SUFFIX_TYPES: ReadonlySet<string> = new Set([\n\t\"senpi.hooks.stop-state\",\n\t\"senpi.hooks.stop-diagnostics\",\n\t\"senpi.hooks.stop-output\",\n\t\"pi-rules.scan\",\n\t\"rule-activation\",\n\t\"goal-cache-warmup\",\n]);\n\nfunction isSafeBindingSuffix(entry: BranchEntry): boolean {\n\tif (entry.type === \"label\") return true;\n\tif (entry.type === \"custom_message\") return entry.customType === GOAL_CONTINUATION_MESSAGE_TYPE;\n\treturn entry.type === \"custom\" && entry.customType !== undefined && SAFE_BINDING_SUFFIX_TYPES.has(entry.customType);\n}\n\nfunction newestBindingEntryIndex(branch: readonly BranchEntry[]): number {\n\tfor (let index = branch.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = branch[index];\n\t\tif (entry?.type === \"custom\" && entry.customType === BINDING_ENTRY_TYPE) return index;\n\t}\n\treturn -1;\n}\n\nfunction isBindingMarker(value: unknown): boolean {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn \"schemaVersion\" in value && value.schemaVersion === 2 && \"marker\" in value && value.marker === true;\n}\n\nfunction isAssistantMessage(value: unknown): value is AssistantMessage {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn (\n\t\t\"role\" in value &&\n\t\tvalue.role === \"assistant\" &&\n\t\t\"api\" in value &&\n\t\ttypeof value.api === \"string\" &&\n\t\t\"provider\" in value &&\n\t\ttypeof value.provider === \"string\" &&\n\t\t\"model\" in value &&\n\t\ttypeof value.model === \"string\" &&\n\t\t\"content\" in value &&\n\t\tArray.isArray(value.content)\n\t);\n}\n\nfunction bindingFromStored(stored: StoredBinding): ContinuityBinding {\n\treturn {\n\t\tsenpiSessionId: stored.sessionId,\n\t\tsdkSessionId: stored.sdkSessionId,\n\t\tsentCount: stored.sentCount,\n\t\tsentHashes: [],\n\t\tsentPrefixHash: stored.sentPrefixHash,\n\t\tlastAssistantUuid: stored.lastAssistantUuid,\n\t\tassistantUuidByIndex: stored.lastAssistantUuid === null ? [] : [[stored.sentCount, stored.lastAssistantUuid]],\n\t\taccountName: stored.accountName,\n\t\tmodelId: stored.modelId,\n\t\tsystemPromptHash: stored.systemPromptHash,\n\t\ttoolsetHash: stored.toolsetHash,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-binding.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-binding.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { GOAL_CONTINUATION_MESSAGE_TYPE } from \"../../../messages.ts\";\nimport type { StoredBinding } from \"./session-binding-store.ts\";\nimport { assistantContentHash } from \"./session-commit-boundary.ts\";\nimport type { ContinuityBinding } from \"./session-reattach.ts\";\nimport { sentHashPrefixDigest } from \"./session-sync.ts\";\n\nexport const BINDING_ENTRY_TYPE = \"claude-sdk-oauth-binding\";\nexport const BINDING_MARKER = { schemaVersion: 2, marker: true } as const;\n\nexport type BindingInvalidation = {\n\treadonly schemaVersion: 1;\n\treadonly invalidated: true;\n\treadonly reason: string;\n};\n\ntype BranchEntry = {\n\treadonly id?: string;\n\treadonly type: string;\n\treadonly customType?: string;\n\treadonly data?: unknown;\n\treadonly message?: unknown;\n};\n\nexport type StoredBindingAnchor = {\n\treadonly sessionPath: string;\n\treadonly sessionId: string;\n\treadonly markerEntryId: string;\n\treadonly assistantContentHash: string;\n};\n\nexport type BindingEntryState = {\n\treadonly sdkSessionId: string;\n\treadonly accountName: string;\n\treadonly modelId: string;\n\treadonly systemPromptHash: string;\n\treadonly toolsetHash: string;\n\treadonly assistantUuidByIndex: ReadonlyMap<number, string>;\n};\n\n/**\n * The record is derived from the registry entry plus the hashes the branch\n * actually carries, never from the process binding map: that map holds the\n * previous turn's state while `message_end` runs (and only a prefix digest right\n * after a restart), so reading it would anchor this turn's marker to a stale or\n * absent sent-stream.\n */\nexport function storedBindingFromEntry(\n\tentry: BindingEntryState,\n\thashes: readonly string[],\n\tanchor: StoredBindingAnchor,\n): StoredBinding {\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsessionPath: anchor.sessionPath,\n\t\tsessionId: anchor.sessionId,\n\t\tmarkerEntryId: anchor.markerEntryId,\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tsentCount: hashes.length,\n\t\tsentPrefixHash: sentHashPrefixDigest(hashes),\n\t\tassistantContentHash: anchor.assistantContentHash,\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(hashes.length) ?? null,\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t};\n}\n\n/** Persist a completed turn whose resident registry entry closed before `message_end`. */\nexport function storedBindingFromBinding(\n\tbinding: ContinuityBinding,\n\thashes: readonly string[],\n\tanchor: StoredBindingAnchor,\n): StoredBinding | undefined {\n\tif (binding.sdkSessionIdConfirmed === false) return undefined;\n\tif (binding.sentCount !== hashes.length) return undefined;\n\tconst expectedDigest = sentHashPrefixDigest(hashes);\n\tconst bindingDigest =\n\t\tbinding.sentPrefixHash ?? (binding.sentHashes.length > 0 ? sentHashPrefixDigest(binding.sentHashes) : undefined);\n\tif (bindingDigest === undefined || bindingDigest !== expectedDigest) return undefined;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsessionPath: anchor.sessionPath,\n\t\tsessionId: anchor.sessionId,\n\t\tmarkerEntryId: anchor.markerEntryId,\n\t\tsdkSessionId: binding.sdkSessionId,\n\t\tsentCount: hashes.length,\n\t\tsentPrefixHash: sentHashPrefixDigest(hashes),\n\t\tassistantContentHash: anchor.assistantContentHash,\n\t\tlastAssistantUuid: binding.lastAssistantUuid,\n\t\taccountName: binding.accountName,\n\t\tmodelId: binding.modelId,\n\t\tsystemPromptHash: binding.systemPromptHash,\n\t\ttoolsetHash: binding.toolsetHash,\n\t};\n}\n\nexport function bindingFromStoredBranch(\n\tbranch: readonly BranchEntry[],\n\tstored: StoredBinding,\n): ContinuityBinding | undefined {\n\tconst markerIndex = newestBindingEntryIndex(branch);\n\tif (markerIndex < 0) return undefined;\n\tconst marker = branch[markerIndex];\n\tif (marker?.id !== stored.markerEntryId || !isBindingMarker(marker.data)) return undefined;\n\tconst assistantIndex = committedAssistantIndex(branch, markerIndex + 1);\n\tif (assistantIndex < 0 || !branch.slice(assistantIndex + 1).every(isLedgerOnlyEntry)) return undefined;\n\tconst committedAssistant = branch[assistantIndex]?.message;\n\tif (!isAssistantMessage(committedAssistant)) return undefined;\n\tif (assistantContentHash(committedAssistant) !== stored.assistantContentHash) return undefined;\n\treturn bindingFromStored(stored);\n}\n\n/**\n * The marker is appended inside `message_end`, so handlers that run after this\n * builtin (and extensions loaded later) can append ledger entries before the\n * assistant itself persists. The committed assistant is the first message after\n * the marker; anything that reaches the model in between fails closed.\n */\nfunction committedAssistantIndex(branch: readonly BranchEntry[], from: number): number {\n\tfor (let index = from; index < branch.length; index += 1) {\n\t\tconst entry = branch[index];\n\t\tif (entry?.type === \"message\") return index;\n\t\tif (!entry || !isLedgerOnlyEntry(entry)) return -1;\n\t}\n\treturn -1;\n}\n\n/**\n * Entry types the session-manager never projects into the LLM context. They\n * cannot shift the sent-stream digest the binding is verified against, so any\n * `custom` ledger record (hook state, rule scans, memory bookkeeping, ...) is\n * admitted regardless of who wrote it. Everything the model can see - messages,\n * custom messages other than the goal continuation, compaction and branch\n * summaries - keeps failing closed (oh-my-openagent#7925).\n */\nconst LEDGER_ONLY_ENTRY_TYPES: ReadonlySet<string> = new Set([\n\t\"custom\",\n\t\"label\",\n\t\"session_info\",\n\t\"thinking_level_change\",\n\t\"model_change\",\n\t\"configuration_update\",\n]);\n\nfunction isLedgerOnlyEntry(entry: BranchEntry): boolean {\n\tif (entry.type === \"custom_message\") return entry.customType === GOAL_CONTINUATION_MESSAGE_TYPE;\n\treturn LEDGER_ONLY_ENTRY_TYPES.has(entry.type);\n}\n\nfunction newestBindingEntryIndex(branch: readonly BranchEntry[]): number {\n\tfor (let index = branch.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = branch[index];\n\t\tif (entry?.type === \"custom\" && entry.customType === BINDING_ENTRY_TYPE) return index;\n\t}\n\treturn -1;\n}\n\nfunction isBindingMarker(value: unknown): boolean {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn \"schemaVersion\" in value && value.schemaVersion === 2 && \"marker\" in value && value.marker === true;\n}\n\nfunction isAssistantMessage(value: unknown): value is AssistantMessage {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn (\n\t\t\"role\" in value &&\n\t\tvalue.role === \"assistant\" &&\n\t\t\"api\" in value &&\n\t\ttypeof value.api === \"string\" &&\n\t\t\"provider\" in value &&\n\t\ttypeof value.provider === \"string\" &&\n\t\t\"model\" in value &&\n\t\ttypeof value.model === \"string\" &&\n\t\t\"content\" in value &&\n\t\tArray.isArray(value.content)\n\t);\n}\n\nfunction bindingFromStored(stored: StoredBinding): ContinuityBinding {\n\treturn {\n\t\tsenpiSessionId: stored.sessionId,\n\t\tsdkSessionId: stored.sdkSessionId,\n\t\tsentCount: stored.sentCount,\n\t\tsentHashes: [],\n\t\tsentPrefixHash: stored.sentPrefixHash,\n\t\tlastAssistantUuid: stored.lastAssistantUuid,\n\t\tassistantUuidByIndex: stored.lastAssistantUuid === null ? [] : [[stored.sentCount, stored.lastAssistantUuid]],\n\t\taccountName: stored.accountName,\n\t\tmodelId: stored.modelId,\n\t\tsystemPromptHash: stored.systemPromptHash,\n\t\ttoolsetHash: stored.toolsetHash,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-commit-boundary.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,WAAW,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"session-commit-boundary.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,WAAW,GAAG,cAAc,CAAC;AAyB5E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAQtE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAMvF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAEpE;AAED;;;;;GAKG;AACH,qBAAa,uBAAuB;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAEhE,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIlE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,sBAAsB;IAQvF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGzB"}
|
|
@@ -1,21 +1,32 @@
|
|
|
1
1
|
import { CLAUDE_SDK_OAUTH_PROVIDER_ID } from "./account-management.js";
|
|
2
2
|
import { sessionSyncDigest } from "./session-sync.js";
|
|
3
|
+
/**
|
|
4
|
+
* Only the payload the model produced is fingerprinted. Everything the stream
|
|
5
|
+
* pipeline stamps around it (thinking timing, content-block indices, partial
|
|
6
|
+
* JSON) can legitimately differ between the last `message_update` and `message_end`
|
|
7
|
+
* without any extension rewriting the answer; hashing such fields marked plain
|
|
8
|
+
* turns `assistant_rewritten` and forced a full re-send on the next turn
|
|
9
|
+
* (senpi#691, oh-my-openagent#7925). An unknown block shape stays fail-closed.
|
|
10
|
+
*/
|
|
11
|
+
function semanticContentBlock(block) {
|
|
12
|
+
switch (block.type) {
|
|
13
|
+
case "text":
|
|
14
|
+
return { type: block.type, text: block.text };
|
|
15
|
+
case "thinking":
|
|
16
|
+
return { type: block.type, thinking: block.thinking, thinkingSignature: block.thinkingSignature };
|
|
17
|
+
case "toolCall":
|
|
18
|
+
return { type: block.type, id: block.id, name: block.name, arguments: block.arguments };
|
|
19
|
+
default:
|
|
20
|
+
return block;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
3
23
|
export function assistantContentHash(message) {
|
|
4
24
|
return sessionSyncDigest({
|
|
5
25
|
role: message.role,
|
|
6
26
|
api: message.api,
|
|
7
27
|
provider: message.provider,
|
|
8
28
|
model: message.model,
|
|
9
|
-
content: message.content.map(
|
|
10
|
-
if (block.type !== "thinking")
|
|
11
|
-
return block;
|
|
12
|
-
// Agent-core stamps these display-only fields after the final
|
|
13
|
-
// message_update; every semantic thinking field stays fail-closed.
|
|
14
|
-
const stableBlock = { ...block };
|
|
15
|
-
delete stableBlock.startedAt;
|
|
16
|
-
delete stableBlock.endedAt;
|
|
17
|
-
return stableBlock;
|
|
18
|
-
}),
|
|
29
|
+
content: message.content.map(semanticContentBlock),
|
|
19
30
|
});
|
|
20
31
|
}
|
|
21
32
|
export function isResidentAssistant(message, modelId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-commit-boundary.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-commit-boundary.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,KAAmB;IAChD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACV,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,KAAK,UAAU;YACd,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC;QACnG,KAAK,UAAU;YACd,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACzF;YACC,OAAO,KAAK,CAAC;IACf,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC7D,OAAO,iBAAiB,CAAC;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;KAClD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAyB,EAAE,OAAe;IAC7E,OAAO,CACN,OAAO,CAAC,GAAG,KAAK,4BAA4B;QAC5C,OAAO,CAAC,QAAQ,KAAK,4BAA4B;QACjD,OAAO,CAAC,KAAK,KAAK,OAAO,CACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAyB;IAC1D,OAAO,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,uBAAuB;IAApC;QACkB,uBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAiBjE,CAAC;IAfA,oBAAoB,CAAC,GAAW,EAAE,OAAyB;QAC1D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,OAAyB,EAAE,OAAe;QAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,OAAO,cAAc,CAAC;QAClE,IAAI,aAAa,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;QAChD,OAAO,aAAa,KAAK,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,GAAW;QACjB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACD","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { CLAUDE_SDK_OAUTH_PROVIDER_ID } from \"./account-management.ts\";\nimport { sessionSyncDigest } from \"./session-sync.ts\";\n\nexport type AssistantCommitOutcome = \"clean\" | \"rewritten\" | \"not-resident\";\n\ntype ContentBlock = AssistantMessage[\"content\"][number];\n\n/**\n * Only the payload the model produced is fingerprinted. Everything the stream\n * pipeline stamps around it (thinking timing, content-block indices, partial\n * JSON) can legitimately differ between the last `message_update` and `message_end`\n * without any extension rewriting the answer; hashing such fields marked plain\n * turns `assistant_rewritten` and forced a full re-send on the next turn\n * (senpi#691, oh-my-openagent#7925). An unknown block shape stays fail-closed.\n */\nfunction semanticContentBlock(block: ContentBlock): unknown {\n\tswitch (block.type) {\n\t\tcase \"text\":\n\t\t\treturn { type: block.type, text: block.text };\n\t\tcase \"thinking\":\n\t\t\treturn { type: block.type, thinking: block.thinking, thinkingSignature: block.thinkingSignature };\n\t\tcase \"toolCall\":\n\t\t\treturn { type: block.type, id: block.id, name: block.name, arguments: block.arguments };\n\t\tdefault:\n\t\t\treturn block;\n\t}\n}\n\nexport function assistantContentHash(message: AssistantMessage): string {\n\treturn sessionSyncDigest({\n\t\trole: message.role,\n\t\tapi: message.api,\n\t\tprovider: message.provider,\n\t\tmodel: message.model,\n\t\tcontent: message.content.map(semanticContentBlock),\n\t});\n}\n\nexport function isResidentAssistant(message: AssistantMessage, modelId: string): boolean {\n\treturn (\n\t\tmessage.api === CLAUDE_SDK_OAUTH_PROVIDER_ID &&\n\t\tmessage.provider === CLAUDE_SDK_OAUTH_PROVIDER_ID &&\n\t\tmessage.model === modelId\n\t);\n}\n\nexport function isTerminalFailure(message: AssistantMessage): boolean {\n\treturn message.stopReason === \"error\" || message.stopReason === \"aborted\";\n}\n\n/**\n * Divergence is decided by comparing what the provider streamed against what the\n * session ledger committed, never by in-flight staging: a result-only turn fills\n * its content at the terminal message with no preceding delta, so a staged-hash\n * comparison reports false divergence on a perfectly valid SDK response shape.\n */\nexport class AssistantCommitBoundary {\n\tprivate readonly providerFinalByKey = new Map<string, string>();\n\n\tcaptureProviderFinal(key: string, message: AssistantMessage): void {\n\t\tthis.providerFinalByKey.set(key, assistantContentHash(message));\n\t}\n\n\tcommit(key: string, message: AssistantMessage, modelId: string): AssistantCommitOutcome {\n\t\tconst providerFinal = this.providerFinalByKey.get(key);\n\t\tthis.providerFinalByKey.delete(key);\n\t\tif (!isResidentAssistant(message, modelId)) return \"not-resident\";\n\t\tif (providerFinal === undefined) return \"clean\";\n\t\treturn providerFinal === assistantContentHash(message) ? \"clean\" : \"rewritten\";\n\t}\n\n\tforget(key: string): void {\n\t\tthis.providerFinalByKey.delete(key);\n\t}\n}\n"]}
|
|
@@ -38,6 +38,8 @@ export type ContinuityDecisionInput = {
|
|
|
38
38
|
toolsetHash: string;
|
|
39
39
|
};
|
|
40
40
|
transcriptAvailable: boolean;
|
|
41
|
+
/** false only on the config-dir lane, whose per-account credential roots cannot share a transcript root, so cross-account resume is impossible there. */
|
|
42
|
+
crossAccountResumeSupported: boolean;
|
|
41
43
|
idleExpired?: boolean;
|
|
42
44
|
};
|
|
43
45
|
export type ContinuityDecision = {
|
|
@@ -60,25 +62,10 @@ export type ContinuityDecision = {
|
|
|
60
62
|
kind: "flatten";
|
|
61
63
|
reason: ContinuityReason;
|
|
62
64
|
};
|
|
63
|
-
export type FailoverLane = "oauth-slots" | "ambient" | "config-dir";
|
|
64
|
-
export type FailoverContinuityInput = {
|
|
65
|
-
authLane: FailoverLane;
|
|
66
|
-
crossAccountResumeSupported: boolean;
|
|
67
|
-
entry: {
|
|
68
|
-
sdkSessionId: string;
|
|
69
|
-
sentCount: number;
|
|
70
|
-
lastAssistantUuid: string | null;
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* The config-dir lane keeps each account's credentials inside its own
|
|
75
|
-
* CLAUDE_CONFIG_DIR, and no official SDK API moves a transcript across roots, so
|
|
76
|
-
* its failover is the one declared residual that must still flatten.
|
|
77
|
-
*/
|
|
78
|
-
export declare function decideFailoverContinuity(input: FailoverContinuityInput): ContinuityDecision;
|
|
79
65
|
/**
|
|
80
66
|
* Resume-first: a live session is never abandoned for a flattened re-send. Only a
|
|
81
|
-
* missing transcript
|
|
67
|
+
* missing transcript, an unrecoverable boundary, a model identity drift, or account
|
|
68
|
+
* drift on the config-dir lane on a persisted binding reaches `flatten`; every other
|
|
82
69
|
* divergence resolves to `fork` (same lineage, new branch) or `reattach` (same
|
|
83
70
|
* session, new query).
|
|
84
71
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-continuity.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-continuity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,MAAM,MAAM,uBAAuB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sGAAsG;IACtG,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC/C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC3B;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAClF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC9F;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"session-continuity.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-continuity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,MAAM,MAAM,uBAAuB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sGAAsG;IACtG,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC/C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yJAAyJ;IACzJ,2BAA2B,EAAE,OAAO,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC3B;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAClF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC9F;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AA6JjD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,uBAAuB,GAAG,kBAAkB,CA8BzF"}
|
|
@@ -41,9 +41,9 @@ function identityDrift(input, entry) {
|
|
|
41
41
|
if (entry.modelId !== input.modelId)
|
|
42
42
|
return "model_changed";
|
|
43
43
|
if (entry.systemPromptHash !== input.fingerprint.systemPromptHash)
|
|
44
|
-
return "
|
|
44
|
+
return "system_prompt_changed";
|
|
45
45
|
if (entry.toolsetHash !== input.fingerprint.toolsetHash)
|
|
46
|
-
return "
|
|
46
|
+
return "toolset_changed";
|
|
47
47
|
return null;
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
@@ -96,8 +96,19 @@ function decideFromBinding(input, binding) {
|
|
|
96
96
|
if (!input.transcriptAvailable)
|
|
97
97
|
return { kind: "flatten", reason: "transcript_missing" };
|
|
98
98
|
const drift = identityDrift(input, binding);
|
|
99
|
-
|
|
99
|
+
// Model identity drift fails closed: the persisted identity no longer matches the turn.
|
|
100
|
+
// Account drift flattens only on the config-dir lane, whose per-account roots cannot
|
|
101
|
+
// share a transcript; on shared-root lanes it falls through like prompt/toolset drift
|
|
102
|
+
// (senpi#1432), so the retry checkpoint forks a same-turn failover at the pre-turn
|
|
103
|
+
// boundary and a matching prefix reattaches with reason account_changed.
|
|
104
|
+
if (drift === "model_changed")
|
|
100
105
|
return { kind: "flatten", reason: drift };
|
|
106
|
+
if (drift === "account_changed" && !input.crossAccountResumeSupported)
|
|
107
|
+
return { kind: "flatten", reason: "cross_root_unsupported" };
|
|
108
|
+
// Prompt/toolset drift instead reattaches like the live path
|
|
109
|
+
// (oh-my-openagent#7884) - a restart has no live query, so the resume builds a
|
|
110
|
+
// fresh query carrying the CURRENT options and hooks, and flattening would
|
|
111
|
+
// re-send the whole conversation for drift the SDK applies per-query anyway.
|
|
101
112
|
const retry = retryCheckpointDecision(input, binding);
|
|
102
113
|
if (retry)
|
|
103
114
|
return retry;
|
|
@@ -109,7 +120,7 @@ function decideFromBinding(input, binding) {
|
|
|
109
120
|
kind: "reattach",
|
|
110
121
|
sdkSessionId: binding.sdkSessionId,
|
|
111
122
|
from: binding.sentCount,
|
|
112
|
-
reason: "registry_miss",
|
|
123
|
+
reason: drift ?? "registry_miss",
|
|
113
124
|
};
|
|
114
125
|
}
|
|
115
126
|
return {
|
|
@@ -119,7 +130,12 @@ function decideFromBinding(input, binding) {
|
|
|
119
130
|
}
|
|
120
131
|
const shared = commonPrefixLength(binding.sentHashes, input.currentHashes);
|
|
121
132
|
if (shared === binding.sentCount) {
|
|
122
|
-
return {
|
|
133
|
+
return {
|
|
134
|
+
kind: "reattach",
|
|
135
|
+
sdkSessionId: binding.sdkSessionId,
|
|
136
|
+
from: binding.sentCount,
|
|
137
|
+
reason: drift ?? "registry_miss",
|
|
138
|
+
};
|
|
123
139
|
}
|
|
124
140
|
if (!binding.lastAssistantUuid)
|
|
125
141
|
return { kind: "flatten", reason: "registry_miss" };
|
|
@@ -131,36 +147,10 @@ function decideFromBinding(input, binding) {
|
|
|
131
147
|
reason: shared < binding.sentCount ? "history_rolled_back" : "sent_stream_diverged",
|
|
132
148
|
};
|
|
133
149
|
}
|
|
134
|
-
/**
|
|
135
|
-
* The config-dir lane keeps each account's credentials inside its own
|
|
136
|
-
* CLAUDE_CONFIG_DIR, and no official SDK API moves a transcript across roots, so
|
|
137
|
-
* its failover is the one declared residual that must still flatten.
|
|
138
|
-
*/
|
|
139
|
-
export function decideFailoverContinuity(input) {
|
|
140
|
-
const { entry } = input;
|
|
141
|
-
if (input.authLane === "config-dir")
|
|
142
|
-
return { kind: "flatten", reason: "cross_root_unsupported" };
|
|
143
|
-
if (input.crossAccountResumeSupported) {
|
|
144
|
-
return {
|
|
145
|
-
kind: "reattach",
|
|
146
|
-
sdkSessionId: entry.sdkSessionId,
|
|
147
|
-
from: entry.sentCount,
|
|
148
|
-
reason: "account_changed",
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
if (!entry.lastAssistantUuid)
|
|
152
|
-
return { kind: "flatten", reason: "branch_boundary_unavailable" };
|
|
153
|
-
return {
|
|
154
|
-
kind: "fork",
|
|
155
|
-
sdkSessionId: entry.sdkSessionId,
|
|
156
|
-
atUuid: entry.lastAssistantUuid,
|
|
157
|
-
from: entry.sentCount,
|
|
158
|
-
reason: "account_changed",
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
150
|
/**
|
|
162
151
|
* Resume-first: a live session is never abandoned for a flattened re-send. Only a
|
|
163
|
-
* missing transcript
|
|
152
|
+
* missing transcript, an unrecoverable boundary, a model identity drift, or account
|
|
153
|
+
* drift on the config-dir lane on a persisted binding reaches `flatten`; every other
|
|
164
154
|
* divergence resolves to `fork` (same lineage, new branch) or `reattach` (same
|
|
165
155
|
* session, new query).
|
|
166
156
|
*/
|