@code-yeongyu/senpi 2026.9.21-2 → 2026.9.22-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 +56 -0
- package/dist/bundle/chunks/{anthropic-messages-C3ZY2ANT.js → anthropic-messages-2P7APOOQ.js} +1 -1
- package/dist/bundle/chunks/{app-server-command-HSX5RFAP.js → app-server-command-PRNA6QQU.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-7TAGS2VU.js → azure-openai-responses-3AH7MJWF.js} +1 -1
- package/dist/bundle/chunks/{bun-extension-importer-UO7V2MZ7.js → bun-extension-importer-H4IJCWWQ.js} +1 -1
- package/dist/bundle/chunks/{chunk-OSDJ2SYO.js → chunk-5XC2FNJ5.js} +1 -1
- package/dist/bundle/chunks/{chunk-D5CL7PPD.js → chunk-64JQFFHH.js} +2 -2
- package/dist/bundle/chunks/{chunk-Z3KQB2R3.js → chunk-6OD4TT33.js} +95 -39
- package/dist/bundle/chunks/{chunk-NEEAKXDT.js → chunk-7EH64T6E.js} +2 -2
- package/dist/bundle/chunks/{chunk-MIVOQT3Q.js → chunk-ARJJU3MS.js} +1 -1
- package/dist/bundle/chunks/chunk-BOZ37BOT.js +14 -0
- package/dist/bundle/chunks/{chunk-POMPEGWQ.js → chunk-F3DXL5MX.js} +1 -1
- package/dist/bundle/chunks/{chunk-GLKVDRNP.js → chunk-GXUYWMN2.js} +1 -1
- package/dist/bundle/chunks/chunk-HH3KJDWA.js +2 -0
- package/dist/bundle/chunks/{chunk-B7W62BM7.js → chunk-IPRJIKLL.js} +1 -1
- package/dist/bundle/chunks/chunk-JEFYJDHP.js +8 -0
- package/dist/bundle/chunks/{chunk-T6XA2IZR.js → chunk-JR4X6ECO.js} +1 -1
- package/dist/bundle/chunks/{chunk-I425CMTO.js → chunk-JZ6YQU3A.js} +4 -4
- package/dist/bundle/chunks/{chunk-KNM6SRPE.js → chunk-K3HEWWSS.js} +1 -1
- package/dist/bundle/chunks/{chunk-M2XAY6I7.js → chunk-M2HSO7MH.js} +1 -1
- package/dist/bundle/chunks/{chunk-UYVPLEOL.js → chunk-NK2RNX25.js} +1 -1
- package/dist/bundle/chunks/chunk-NMB4C6ZZ.js +2 -0
- package/dist/bundle/chunks/{chunk-VEO3ABZR.js → chunk-OLJ7LQJY.js} +1 -1
- package/dist/bundle/chunks/{chunk-GVI2HP7N.js → chunk-OPNVT7BU.js} +1 -1
- package/dist/bundle/chunks/{chunk-XHMOFY4T.js → chunk-R6LVC7SP.js} +4 -4
- package/dist/bundle/chunks/{chunk-3SLCHXZO.js → chunk-UCPWK6TZ.js} +2 -2
- package/dist/bundle/chunks/{chunk-B2IM56LB.js → chunk-VYIJQQ5I.js} +1 -1
- package/dist/bundle/chunks/{chunk-47GF6XYZ.js → chunk-YT2ZSZOY.js} +1 -1
- package/dist/bundle/chunks/{cli-main-GQTEEZ2V.js → cli-main-AFJNXUSL.js} +1 -1
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-JWIH75VF.js → google-generative-ai-Y2IYMUVC.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-IRGAY5XR.js → google-vertex-TKBBMPHV.js} +1 -1
- package/dist/bundle/chunks/{host-command-KOEKIHIZ.js → host-command-OVA6GEWC.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle-IDQPLYEA.js +3 -0
- package/dist/bundle/chunks/host-lifecycle.js +10 -6
- package/dist/bundle/chunks/{interactive-host-runtime-2KTFEW7O.js → interactive-host-runtime-F5L4USLR.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-I3ILWXQB.js → interactive-mode-UFBSCOP7.js} +1 -1
- package/dist/bundle/chunks/kimi-coding.js +2 -2
- package/dist/bundle/chunks/{list-tips-2KX65NWZ.js → list-tips-2QG7ASHS.js} +1 -1
- package/dist/bundle/chunks/{mistral-conversations-VOBYATVJ.js → mistral-conversations-ZYDVFRYF.js} +1 -1
- package/dist/bundle/chunks/multi-session-host-EUTEGVLS.js +21 -0
- package/dist/bundle/chunks/openai-codex-responses-MEIUNROM.js +10 -0
- package/dist/bundle/chunks/{openai-completions-YK6QTYOH.js → openai-completions-4V76L5ZJ.js} +1 -1
- package/dist/bundle/chunks/openai-responses-YR7WRBG3.js +2 -0
- package/dist/bundle/chunks/{package-manager-cli-HOL6CAI6.js → package-manager-cli-JPUWMUEJ.js} +1 -1
- package/dist/bundle/chunks/rotation-stream-S56Y7WMM.js +2 -0
- package/dist/bundle/chunks/{rpc-mode-L3DSGTVM.js → rpc-mode-JDVHUBZY.js} +1 -1
- package/dist/bundle/chunks/{session-picker-L3FYEQBL.js → session-picker-PFPJVVIC.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +225 -164
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts +6 -4
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +9 -7
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/credential-pool/classify.d.ts.map +1 -1
- package/dist/core/credential-pool/classify.js +12 -0
- package/dist/core/credential-pool/classify.js.map +1 -1
- package/dist/core/credential-pool/failover.d.ts +37 -5
- package/dist/core/credential-pool/failover.d.ts.map +1 -1
- package/dist/core/credential-pool/failover.js +60 -24
- package/dist/core/credential-pool/failover.js.map +1 -1
- package/dist/core/credential-pool/rotation-events.d.ts +5 -0
- package/dist/core/credential-pool/rotation-events.d.ts.map +1 -0
- package/dist/core/credential-pool/rotation-events.js +25 -0
- package/dist/core/credential-pool/rotation-events.js.map +1 -0
- package/dist/core/credential-pool/rotation-stream.d.ts +4 -3
- package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
- package/dist/core/credential-pool/rotation-stream.js +8 -11
- package/dist/core/credential-pool/rotation-stream.js.map +1 -1
- package/dist/core/extensions/builtin/ask-user/schema.d.ts +2 -25
- package/dist/core/extensions/builtin/ask-user/schema.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ask-user/schema.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/api-id.d.ts +7 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/api-id.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/api-id.js +7 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/api-id.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js +3 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +22 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js +4 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +18 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.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 +18 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +2 -7
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +2 -8
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/naming.d.ts +0 -1
- package/dist/core/extensions/builtin/mcp/expose/naming.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/naming.js +0 -3
- package/dist/core/extensions/builtin/mcp/expose/naming.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/register.d.ts +1 -2
- package/dist/core/extensions/builtin/mcp/expose/register.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/register.js +0 -21
- package/dist/core/extensions/builtin/mcp/expose/register.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/schema-compat.d.ts +2 -2
- package/dist/core/extensions/builtin/mcp/expose/schema-compat.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/schema-compat.js +2 -2
- package/dist/core/extensions/builtin/mcp/expose/schema-compat.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/file-operations.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/file-operations.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.7.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.7.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.7.js +105 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.7.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +14 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/bun-extension-importer.d.ts +1 -0
- package/dist/core/extensions/bun-extension-importer.d.ts.map +1 -1
- package/dist/core/extensions/bun-extension-importer.js +4 -0
- package/dist/core/extensions/bun-extension-importer.js.map +1 -1
- package/dist/core/extensions/extension-module-cache.d.ts +48 -0
- package/dist/core/extensions/extension-module-cache.d.ts.map +1 -0
- package/dist/core/extensions/extension-module-cache.js +111 -0
- package/dist/core/extensions/extension-module-cache.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +14 -56
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts +29 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +30 -3
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/retry-fallback/billing.d.ts.map +1 -1
- package/dist/core/retry-fallback/billing.js +20 -1
- package/dist/core/retry-fallback/billing.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +12 -6
- package/dist/core/session-manager.js.map +1 -1
- package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-render-descriptors.js +8 -7
- package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +7 -5
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +7 -0
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +7 -0
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/handoff-activity.d.ts +4 -0
- package/dist/modes/rpc/handoff-activity.d.ts.map +1 -0
- package/dist/modes/rpc/handoff-activity.js +6 -0
- package/dist/modes/rpc/handoff-activity.js.map +1 -0
- package/dist/modes/rpc/host-child-exit.d.ts +19 -0
- package/dist/modes/rpc/host-child-exit.d.ts.map +1 -0
- package/dist/modes/rpc/host-child-exit.js +35 -0
- package/dist/modes/rpc/host-child-exit.js.map +1 -0
- package/dist/modes/rpc/host-crash-record.d.ts +24 -0
- package/dist/modes/rpc/host-crash-record.d.ts.map +1 -0
- package/dist/modes/rpc/host-crash-record.js +75 -0
- package/dist/modes/rpc/host-crash-record.js.map +1 -0
- package/dist/modes/rpc/host-crash-record.test.d.ts +2 -0
- package/dist/modes/rpc/host-crash-record.test.d.ts.map +1 -0
- package/dist/modes/rpc/host-crash-record.test.js +91 -0
- package/dist/modes/rpc/host-crash-record.test.js.map +1 -0
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +60 -17
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts +4 -10
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +83 -51
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-supersession.d.ts +13 -2
- package/dist/modes/rpc/host-supersession.d.ts.map +1 -1
- package/dist/modes/rpc/host-supersession.js +40 -7
- package/dist/modes/rpc/host-supersession.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.d.ts +1 -0
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +40 -7
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/observer-link.d.ts +48 -0
- package/dist/modes/rpc/observer-link.d.ts.map +1 -0
- package/dist/modes/rpc/observer-link.js +56 -0
- package/dist/modes/rpc/observer-link.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +12 -2
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +12 -2
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +36 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +10 -4
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +95 -19
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +5 -3
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +21 -2
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +6 -1
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +34 -3
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/session-worker-client.d.ts +1 -0
- package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-client.js +3 -0
- package/dist/modes/rpc/session-worker-client.js.map +1 -1
- package/dist/modes/rpc/session-worker-protocol.d.ts +3 -1
- package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-protocol.js.map +1 -1
- package/dist/modes/rpc/session-worker.js +7 -1
- package/dist/modes/rpc/session-worker.js.map +1 -1
- package/dist/modes/rpc/socket-ownership.d.ts +16 -0
- package/dist/modes/rpc/socket-ownership.d.ts.map +1 -1
- package/dist/modes/rpc/socket-ownership.js +28 -4
- package/dist/modes/rpc/socket-ownership.js.map +1 -1
- package/dist/modes/rpc/worker-session-registry.d.ts +12 -5
- package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/worker-session-registry.js +10 -2
- package/dist/modes/rpc/worker-session-registry.js.map +1 -1
- package/docs/providers.md +9 -1
- package/docs/rpc.md +72 -10
- package/docs/settings.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +29 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +51 -13
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +53 -9
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/reserved-dispatch.ts +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/config/settings.ts +18 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +9 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/AGENTS.md +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +10 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +18 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +2 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/run-queue.ts +17 -7
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +37 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +11 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +2 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +14 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +18 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +3 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/idle-timeout.ts +9 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/AGENTS.md +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +19 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +11 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-contract.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +72 -20
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +28 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-state.ts +5 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-status.ts +5 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +76 -25
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-execution-event.ts +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-kernel-reset-refused-error.ts +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +2 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +3 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +58 -37
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/managed-cell.ts +15 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +32 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +89 -25
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/terminal-snapshot-store.ts +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +51 -10
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts +2 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -13
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-arguments.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-arguments.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-arguments.js +20 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-arguments.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +14 -56
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +18 -27
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.d.ts +40 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.js +102 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts +4 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +28 -14
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.d.ts +44 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.js +120 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +21 -15
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/legacy-provider-ids.d.ts +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/legacy-provider-ids.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/legacy-provider-ids.js +26 -0
- package/node_modules/@earendil-works/pi-ai/dist/legacy-provider-ids.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.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/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/xai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.js +43 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.js +63 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/classifiers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/classifiers.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/classifiers.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +17 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +22 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.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/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +12 -2
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/chunk-5J5R5AMP.js +0 -8
- package/dist/bundle/chunks/chunk-I3F6VZZF.js +0 -2
- package/dist/bundle/chunks/chunk-IDTLJYJ5.js +0 -10
- package/dist/bundle/chunks/chunk-U6Z6OBX4.js +0 -2
- package/dist/bundle/chunks/host-lifecycle-DGZJTBDJ.js +0 -3
- package/dist/bundle/chunks/multi-session-host-S5FWCIWE.js +0 -20
- package/dist/bundle/chunks/openai-codex-responses-L2PO2D6F.js +0 -10
- package/dist/bundle/chunks/openai-responses-YDUBVF4S.js +0 -2
- package/dist/bundle/chunks/rotation-stream-Y4YU6HV4.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-attempt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoundedAsyncQueue, SESSION_STREAM_QUEUE_CAPACITY } from \"./bounded-queue.ts\";\nimport { sdkResultFailure } from \"./errors.ts\";\nimport type { SDKMessage, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { bindingFromEntry, forgetBinding, rememberBinding } from \"./session-reattach.ts\";\nimport {\n\ttype ClaudeSdkOauthSessionEntry,\n\tcloseSession,\n\tisCurrentGeneration,\n\tsessionRegistry,\n} from \"./session-registry.ts\";\nimport { submitSessionTurn } from \"./session-registry-pump.ts\";\nimport { recordSyncedStream, sentHashPrefixDigest } from \"./session-sync.ts\";\n\ntype StagedContinuityDecision = { emit(): void };\n\nfunction successfulTurn(messages: readonly SDKMessage[]): boolean {\n\treturn messages.some(\n\t\t(message) =>\n\t\t\tmessage.type === \"result\" && message.subtype === \"success\" && sdkResultFailure(message) === undefined,\n\t);\n}\n\nfunction recordAssistantUuid(entry: ClaudeSdkOauthSessionEntry, sentCount: number, message: SDKMessage): void {\n\tif (message.type === \"assistant\" && message.parent_tool_use_id === null) {\n\t\tentry.assistantUuidByIndex.set(sentCount, message.uuid);\n\t}\n}\n\n/**\n * An attempt that pushed its user payload and then aborted or failed leaves that\n * message on the lineage un-answered: `recordSyncedStream` never ran, so the\n * entry still points at the PRE-TURN boundary. Remembering the binding at that\n * boundary, tagged with the attempted turn's full sent-stream digest, lets the\n * SAME turn's retry fork past the orphaned message instead of appending it\n * twice (issue #723 retry storm). In-memory only — nothing here is persisted.\n */\n/** Claude Code answered \"No conversation found with session ID\": the bound id is dead, never resume it again. */\nconst RESUME_TARGET_MISSING = /no conversation found with session id/i;\n\nfunction publishBinding(entry: ClaudeSdkOauthSessionEntry, binding: Parameters<typeof rememberBinding>[0]): void {\n\trememberBinding({ ...binding, sdkSessionIdConfirmed: entry.sdkSessionIdConfirmed });\n}\n\nfunction rememberRetryCheckpoint(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]): void {\n\tif (entry.sentCount < 0 || entry.sentCount > hashes.length) return;\n\tpublishBinding(entry, {\n\t\t...bindingFromEntry(entry, hashes.slice(0, entry.sentCount)),\n\t\tunansweredTurnDigest: sentHashPrefixDigest(hashes, hashes.length),\n\t});\n}\n\nexport function createSessionTurnAttempt(\n\tentry: ClaudeSdkOauthSessionEntry,\n\tmessage: SDKUserMessage[\"message\"],\n\thashes: readonly string[],\n\tsignal: AbortSignal | undefined,\n\tstaged: StagedContinuityDecision,\n) {\n\tconst generation = entry.generation;\n\t// Claude Code declared the bound id dead: no later cleanup may re-publish it.\n\tlet resumeTargetMissing = false;\n\treturn {\n\t\tmessages: (async function* (): AsyncGenerator<SDKMessage> {\n\t\t\tconst queue = new BoundedAsyncQueue<SDKMessage>(SESSION_STREAM_QUEUE_CAPACITY);\n\t\t\tconst completion = submitSessionTurn(sessionRegistry, entry, {\n\t\t\t\tmessage,\n\t\t\t\tsignal,\n\t\t\t\tonMessage: (sdkMessage) => {\n\t\t\t\t\trecordAssistantUuid(entry, hashes.length, sdkMessage);\n\t\t\t\t\tqueue.push(sdkMessage);\n\t\t\t\t},\n\t\t\t});\n\t\t\tvoid completion.then(\n\t\t\t\t() => queue.close(),\n\t\t\t\t(error: unknown) => queue.fail(error),\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tfor await (const sdkMessage of queue) yield sdkMessage;\n\t\t\t\tconst turn = await completion;\n\t\t\t\tif (!turn.aborted && successfulTurn(turn.messages)) {\n\t\t\t\t\trecordSyncedStream(entry, hashes);\n\t\t\t\t\tpublishBinding(entry, bindingFromEntry(entry, hashes));\n\t\t\t\t} else {\n\t\t\t\t\trememberRetryCheckpoint(entry, hashes);\n\t\t\t\t}\n\t\t\t\t// Emit only when this attempt was consumed to completion (retained). A\n\t\t\t\t// discarded attempt (failover to another account) unwinds through the\n\t\t\t\t// generator's return() and never reaches here; an internally-failed\n\t\t\t\t// attempt throws to the catch below. Both stay silent so the turn yields\n\t\t\t\t// exactly one continuity observation - this retained attempt, or the\n\t\t\t\t// single terminal observation residentSessionMessages emits when every\n\t\t\t\t// attempt fails.\n\t\t\t\tstaged.emit();\n\t\t\t} catch (error) {\n\t\t\t\t// The queue failed (completion rejected: pump failure, query end,\n\t\t\t\t// attribution error). The payload was still pushed, so the retry needs\n\t\t\t\t// the same checkpoint the aborted path records.\n\t\t\t\tif (error instanceof Error && RESUME_TARGET_MISSING.test(error.message)) {\n\t\t\t\t\tresumeTargetMissing = true;\n\t\t\t\t\tforgetBinding(entry.senpiSessionId);\n\t\t\t\t} else {\n\t\t\t\t\trememberRetryCheckpoint(entry, hashes);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})(),\n\t\tdiscard: (): void => {\n\t\t\tif (resumeTargetMissing) forgetBinding(entry.senpiSessionId);\n\t\t\telse rememberRetryCheckpoint(entry, hashes);\n\t\t\tif (isCurrentGeneration(entry.senpiSessionId, generation)) {\n\t\t\t\tcloseSession(entry.senpiSessionId, \"attempt_discarded\");\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-turn-attempt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAEN,YAAY,EACZ,mBAAmB,EACnB,eAAe,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI7E,SAAS,cAAc,CAAC,QAA+B;IACtD,OAAO,QAAQ,CAAC,IAAI,CACnB,CAAC,OAAO,EAAE,EAAE,CACX,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,SAAS,CACtG,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAiC,EAAE,SAAiB,EAAE,OAAmB;IACrG,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;QACzE,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,iHAAiH;AACjH,MAAM,qBAAqB,GAAG,wCAAwC,CAAC;AAEvE,0GAA0G;AAC1G,MAAM,sBAAsB,GAAG,mEAAmE,CAAC;AAEnG;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,KAAiC,EAAE,OAAe;IACrF,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;QACxD,IAAI,IAAI,KAAK,OAAO;YAAE,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,KAAiC,EAAE,OAA8C;IACxG,eAAe,CAAC,EAAE,GAAG,OAAO,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAiC,EAAE,MAAyB;IAC5F,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM;QAAE,OAAO;IACnE,cAAc,CAAC,KAAK,EAAE;QACrB,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5D,oBAAoB,EAAE,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;KACjE,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,KAAiC,EACjC,OAAkC,EAClC,MAAyB,EACzB,MAA+B,EAC/B,MAAgC;IAEhC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,8EAA8E;IAC9E,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,OAAO;QACN,QAAQ,EAAE,CAAC,KAAK,SAAS,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAa,6BAA6B,CAAC,CAAC;YAC/E,MAAM,UAAU,GAAG,iBAAiB,CAAC,eAAe,EAAE,KAAK,EAAE;gBAC5D,OAAO;gBACP,MAAM;gBACN,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE;oBACzB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;oBACtD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxB,CAAC;aACD,CAAC,CAAC;YACH,KAAK,UAAU,CAAC,IAAI,CACnB,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EACnB,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CACrC,CAAC;YACF,IAAI,CAAC;gBACJ,IAAI,KAAK,EAAE,MAAM,UAAU,IAAI,KAAK;oBAAE,MAAM,UAAU,CAAC;gBACvD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpD,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBAClC,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxD,CAAC;qBAAM,CAAC;oBACP,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,CAAC;gBACD,uEAAuE;gBACvE,sEAAsE;gBACtE,oEAAoE;gBACpE,yEAAyE;gBACzE,qEAAqE;gBACrE,uEAAuE;gBACvE,iBAAiB;gBACjB,MAAM,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,kEAAkE;gBAClE,uEAAuE;gBACvE,gDAAgD;gBAChD,IAAI,KAAK,YAAY,KAAK,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzE,mBAAmB,GAAG,IAAI,CAAC;oBAC3B,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACP,IAAI,KAAK,YAAY,KAAK;wBAAE,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC7E,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM,KAAK,CAAC;YACb,CAAC;QACF,CAAC,CAAC,EAAE;QACJ,OAAO,EAAE,GAAS,EAAE;YACnB,IAAI,mBAAmB;gBAAE,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;;gBACxD,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5C,IAAI,mBAAmB,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC3D,YAAY,CAAC,KAAK,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACzD,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import { BoundedAsyncQueue, SESSION_STREAM_QUEUE_CAPACITY } from \"./bounded-queue.ts\";\nimport { sdkResultFailure } from \"./errors.ts\";\nimport type { SDKMessage, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { bindingFromEntry, forgetBinding, rememberBinding } from \"./session-reattach.ts\";\nimport {\n\ttype ClaudeSdkOauthSessionEntry,\n\tcloseSession,\n\tisCurrentGeneration,\n\tsessionRegistry,\n} from \"./session-registry.ts\";\nimport { submitSessionTurn } from \"./session-registry-pump.ts\";\nimport { recordSyncedStream, sentHashPrefixDigest } from \"./session-sync.ts\";\n\ntype StagedContinuityDecision = { emit(): void };\n\nfunction successfulTurn(messages: readonly SDKMessage[]): boolean {\n\treturn messages.some(\n\t\t(message) =>\n\t\t\tmessage.type === \"result\" && message.subtype === \"success\" && sdkResultFailure(message) === undefined,\n\t);\n}\n\nfunction recordAssistantUuid(entry: ClaudeSdkOauthSessionEntry, sentCount: number, message: SDKMessage): void {\n\tif (message.type === \"assistant\" && message.parent_tool_use_id === null) {\n\t\tentry.assistantUuidByIndex.set(sentCount, message.uuid);\n\t}\n}\n\n/**\n * An attempt that pushed its user payload and then aborted or failed leaves that\n * message on the lineage un-answered: `recordSyncedStream` never ran, so the\n * entry still points at the PRE-TURN boundary. Remembering the binding at that\n * boundary, tagged with the attempted turn's full sent-stream digest, lets the\n * SAME turn's retry fork past the orphaned message instead of appending it\n * twice (issue #723 retry storm). In-memory only — nothing here is persisted.\n */\n/** Claude Code answered \"No conversation found with session ID\": the bound id is dead, never resume it again. */\nconst RESUME_TARGET_MISSING = /no conversation found with session id/i;\n\n/** Claude Code's wording for a fork point absent from its transcript; the captured id is the dead one. */\nconst RESUME_MESSAGE_MISSING = /no message found with message\\.uuid(?:\\s+of)?:\\s*([0-9a-fA-F-]+)/i;\n\n/**\n * Drops only the boundary Claude Code rejected. Republishing it would make the next admission ask\n * for the same dead id, fail the same way, and flatten again (senpi#1958); earlier boundaries stay\n * mapped so the retry can still fork at one of them instead of re-sending the conversation.\n */\nfunction forgetMissingAssistantUuid(entry: ClaudeSdkOauthSessionEntry, message: string): void {\n\tconst missing = RESUME_MESSAGE_MISSING.exec(message)?.[1];\n\tif (missing === undefined) return;\n\tfor (const [index, uuid] of entry.assistantUuidByIndex) {\n\t\tif (uuid === missing) entry.assistantUuidByIndex.delete(index);\n\t}\n}\n\nfunction publishBinding(entry: ClaudeSdkOauthSessionEntry, binding: Parameters<typeof rememberBinding>[0]): void {\n\trememberBinding({ ...binding, sdkSessionIdConfirmed: entry.sdkSessionIdConfirmed });\n}\n\nfunction rememberRetryCheckpoint(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]): void {\n\tif (entry.sentCount < 0 || entry.sentCount > hashes.length) return;\n\tpublishBinding(entry, {\n\t\t...bindingFromEntry(entry, hashes.slice(0, entry.sentCount)),\n\t\tunansweredTurnDigest: sentHashPrefixDigest(hashes, hashes.length),\n\t});\n}\n\nexport function createSessionTurnAttempt(\n\tentry: ClaudeSdkOauthSessionEntry,\n\tmessage: SDKUserMessage[\"message\"],\n\thashes: readonly string[],\n\tsignal: AbortSignal | undefined,\n\tstaged: StagedContinuityDecision,\n) {\n\tconst generation = entry.generation;\n\t// Claude Code declared the bound id dead: no later cleanup may re-publish it.\n\tlet resumeTargetMissing = false;\n\treturn {\n\t\tmessages: (async function* (): AsyncGenerator<SDKMessage> {\n\t\t\tconst queue = new BoundedAsyncQueue<SDKMessage>(SESSION_STREAM_QUEUE_CAPACITY);\n\t\t\tconst completion = submitSessionTurn(sessionRegistry, entry, {\n\t\t\t\tmessage,\n\t\t\t\tsignal,\n\t\t\t\tonMessage: (sdkMessage) => {\n\t\t\t\t\trecordAssistantUuid(entry, hashes.length, sdkMessage);\n\t\t\t\t\tqueue.push(sdkMessage);\n\t\t\t\t},\n\t\t\t});\n\t\t\tvoid completion.then(\n\t\t\t\t() => queue.close(),\n\t\t\t\t(error: unknown) => queue.fail(error),\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tfor await (const sdkMessage of queue) yield sdkMessage;\n\t\t\t\tconst turn = await completion;\n\t\t\t\tif (!turn.aborted && successfulTurn(turn.messages)) {\n\t\t\t\t\trecordSyncedStream(entry, hashes);\n\t\t\t\t\tpublishBinding(entry, bindingFromEntry(entry, hashes));\n\t\t\t\t} else {\n\t\t\t\t\trememberRetryCheckpoint(entry, hashes);\n\t\t\t\t}\n\t\t\t\t// Emit only when this attempt was consumed to completion (retained). A\n\t\t\t\t// discarded attempt (failover to another account) unwinds through the\n\t\t\t\t// generator's return() and never reaches here; an internally-failed\n\t\t\t\t// attempt throws to the catch below. Both stay silent so the turn yields\n\t\t\t\t// exactly one continuity observation - this retained attempt, or the\n\t\t\t\t// single terminal observation residentSessionMessages emits when every\n\t\t\t\t// attempt fails.\n\t\t\t\tstaged.emit();\n\t\t\t} catch (error) {\n\t\t\t\t// The queue failed (completion rejected: pump failure, query end,\n\t\t\t\t// attribution error). The payload was still pushed, so the retry needs\n\t\t\t\t// the same checkpoint the aborted path records.\n\t\t\t\tif (error instanceof Error && RESUME_TARGET_MISSING.test(error.message)) {\n\t\t\t\t\tresumeTargetMissing = true;\n\t\t\t\t\tforgetBinding(entry.senpiSessionId);\n\t\t\t\t} else {\n\t\t\t\t\tif (error instanceof Error) forgetMissingAssistantUuid(entry, error.message);\n\t\t\t\t\trememberRetryCheckpoint(entry, hashes);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})(),\n\t\tdiscard: (): void => {\n\t\t\tif (resumeTargetMissing) forgetBinding(entry.senpiSessionId);\n\t\t\telse rememberRetryCheckpoint(entry, hashes);\n\t\t\tif (isCurrentGeneration(entry.senpiSessionId, generation)) {\n\t\t\t\tcloseSession(entry.senpiSessionId, \"attempt_discarded\");\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { stripTurnRetrySuppressionPrefix } from "@earendil-works/pi-ai";
|
|
1
2
|
import { type CompactionPreparation, type CompactionResult } from "../../../compaction/index.ts";
|
|
2
3
|
import { type SessionEntry } from "../../../session-manager.ts";
|
|
3
4
|
export type RequiredCompactionFallbackFailure = "summarization-timeout" | "summarization-provider-failure" | "upstream-stream-truncated" | "summarization-overflow-exhausted" | "summarization-empty-summary";
|
|
@@ -32,12 +33,7 @@ export interface DeterministicFallbackDiagnostic {
|
|
|
32
33
|
}
|
|
33
34
|
export declare function formatRequiredCompactionFallbackRejection(diagnostics: DeterministicFallbackDiagnostic): string;
|
|
34
35
|
export declare function classifyRequiredCompactionFallbackFailure(error: unknown): RequiredCompactionFallbackFailure | undefined;
|
|
35
|
-
|
|
36
|
-
* `senpi:no-turn-retry:` is a session-internal replay-suppression signal read by
|
|
37
|
-
* `_isRetryableError` / `_isHardErrorFallbackEligible`. It must stay on the error
|
|
38
|
-
* object those predicates inspect and must never reach user-visible text.
|
|
39
|
-
*/
|
|
40
|
-
export declare function stripTurnRetrySuppressionPrefix(message: string): string;
|
|
36
|
+
export { stripTurnRetrySuppressionPrefix };
|
|
41
37
|
/**
|
|
42
38
|
* What the user is told when a required compaction recovered through the
|
|
43
39
|
* deterministic checkpoint. States the outcome plainly and never carries the
|
|
@@ -45,5 +41,4 @@ export declare function stripTurnRetrySuppressionPrefix(message: string): string
|
|
|
45
41
|
*/
|
|
46
42
|
export declare function formatRequiredCompactionFallbackNotice(failureKind: RequiredCompactionFallbackFailure, cause?: unknown): string;
|
|
47
43
|
export declare function createRequiredCompactionFallback(preparation: CompactionPreparation, contextWindow: number, failureKind: RequiredCompactionFallbackFailure, metadata: RecoveryMetadata, branchEntries?: SessionEntry[], diagnostics?: DeterministicFallbackDiagnostic): CompactionResult<DeterministicFallbackDetails> | undefined;
|
|
48
|
-
export {};
|
|
49
44
|
//# sourceMappingURL=deterministic-fallback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAQjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;AAQrC,MAAM,MAAM,iCAAiC,GAC1C,uBAAuB,GACvB,gCAAgC,GAChC,2BAA2B,GAC3B,kCAAkC,GAClC,6BAA6B,CAAC;AAEjC,UAAU,gBAAgB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAC7C,8BAA8B,GAC9B,yBAAyB,GACzB,gCAAgC,GAChC,uBAAuB,GACvB,+BAA+B,CAAC;AAEnC,UAAU,4BAA4B;IACrC,MAAM,EAAE,4CAA4C,CAAC;IACrD,MAAM,EAAE,8BAA8B,CAAC;IACvC,WAAW,EAAE,iCAAiC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,UAAU,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC3E;AAED,MAAM,WAAW,+BAA+B;IAC/C,eAAe,CAAC,EAAE,oCAAoC,CAAC;IACvD,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,oCAAoC,CAAC;QACtD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,yCAAyC,CAAC,WAAW,EAAE,+BAA+B,GAAG,MAAM,CAoC9G;AAwED,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,OAAO,GACZ,iCAAiC,GAAG,SAAS,CAqB/C;AAED
|
|
1
|
+
{"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAQjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;AAQrC,MAAM,MAAM,iCAAiC,GAC1C,uBAAuB,GACvB,gCAAgC,GAChC,2BAA2B,GAC3B,kCAAkC,GAClC,6BAA6B,CAAC;AAEjC,UAAU,gBAAgB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAC7C,8BAA8B,GAC9B,yBAAyB,GACzB,gCAAgC,GAChC,uBAAuB,GACvB,+BAA+B,CAAC;AAEnC,UAAU,4BAA4B;IACrC,MAAM,EAAE,4CAA4C,CAAC;IACrD,MAAM,EAAE,8BAA8B,CAAC;IACvC,WAAW,EAAE,iCAAiC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,UAAU,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC3E;AAED,MAAM,WAAW,+BAA+B;IAC/C,eAAe,CAAC,EAAE,oCAAoC,CAAC;IACvD,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,oCAAoC,CAAC;QACtD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,yCAAyC,CAAC,WAAW,EAAE,+BAA+B,GAAG,MAAM,CAoC9G;AAwED,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,OAAO,GACZ,iCAAiC,GAAG,SAAS,CAqB/C;AAED,OAAO,EAAE,+BAA+B,EAAE,CAAC;AAU3C;;;;GAIG;AACH,wBAAgB,sCAAsC,CACrD,WAAW,EAAE,iCAAiC,EAC9C,KAAK,CAAC,EAAE,OAAO,GACb,MAAM,CAUR;AAED,wBAAgB,gCAAgC,CAC/C,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,iCAAiC,EAC9C,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,GAAE,YAAY,EAAO,EAClC,WAAW,CAAC,EAAE,+BAA+B,GAC3C,gBAAgB,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAiS5D"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { stripTurnRetrySuppressionPrefix } from "@earendil-works/pi-ai";
|
|
1
2
|
import { estimateTokens } from "../../../compaction/index.js";
|
|
2
3
|
import { StreamDurationBudgetError, StreamIdleTimeoutError, SummarizationTotalBudgetError, } from "../../../compaction/stream-watchdog.js";
|
|
3
4
|
import { CredentialFailoverError, TURN_RETRY_SUPPRESSION_PREFIX } from "../../../credential-pool/failover.js";
|
|
@@ -141,14 +142,7 @@ export function classifyRequiredCompactionFallbackFailure(error) {
|
|
|
141
142
|
}
|
|
142
143
|
return undefined;
|
|
143
144
|
}
|
|
144
|
-
|
|
145
|
-
* `senpi:no-turn-retry:` is a session-internal replay-suppression signal read by
|
|
146
|
-
* `_isRetryableError` / `_isHardErrorFallbackEligible`. It must stay on the error
|
|
147
|
-
* object those predicates inspect and must never reach user-visible text.
|
|
148
|
-
*/
|
|
149
|
-
export function stripTurnRetrySuppressionPrefix(message) {
|
|
150
|
-
return message.replaceAll(TURN_RETRY_SUPPRESSION_PREFIX, "");
|
|
151
|
-
}
|
|
145
|
+
export { stripTurnRetrySuppressionPrefix };
|
|
152
146
|
const FALLBACK_FAILURE_CAUSE = {
|
|
153
147
|
"summarization-timeout": "the summary stream ran out of its time budget",
|
|
154
148
|
"summarization-provider-failure": "the provider ended the summary stream with an error",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deterministic-fallback.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqD,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACjH,OAAO,EACN,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,GAC7B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAC9G,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EACN,mBAAmB,EAEnB,wBAAwB,GAExB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+ChD,MAAM,UAAU,yCAAyC,CAAC,WAA4C;IACrG,MAAM,SAAS,GAAG,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,IAAI,+BAA+B,CAAC;IAC9E,MAAM,QAAQ,GAAyD;QACtE,gCAAgC,EAC/B,0JAA0J;QAC3J,uBAAuB,EACtB,mMAAmM;QACpM,yBAAyB,EACxB,yJAAyJ;QAC1J,8BAA8B,EAC7B,uFAAuF;QACxF,+BAA+B,EAC9B,uFAAuF;KACxF,CAAC;IACF,MAAM,UAAU,GAAG;QAClB,eAAe,EAAE,MAAM;QACvB,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,cAAc,EAAE,WAAW,CAAC,cAAc,IAAI,KAAK;QACnD,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,IAAI,CAAC;QACrD,GAAG,CAAC,SAAS;YACZ,CAAC,CAAC;gBACA,SAAS,EAAE;oBACV,GAAG,SAAS;oBACZ,gBAAgB,EAAE,YAAY,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC;oBAC/D,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjG,GAAG,CAAC,SAAS,CAAC,iBAAiB;wBAC9B,CAAC,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE;wBACtE,CAAC,CAAC,EAAE,CAAC;iBACN;aACD;YACF,CAAC,CAAC,EAAE,CAAC;KACN,CAAC;IACF,OAAO,qEAAqE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,gDAAgD,CAAC;AAC7K,CAAC;AAED,MAAM,qBAAqB,GAAG,qDAAqD,CAAC;AAEpF,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAmB;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACxG,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,MAAM,cAAc,GAAG,CAAC,IAAa,EAAW,EAAE,CACjD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAClG,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACxG,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,KAAc,EAAE,IAAI,GAAG,IAAI,GAAG,EAAU,EAAE,KAAK,GAAG,CAAC;IAC9E,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;IAC1B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACvF,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/D,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjF,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC/E,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,sCAAsC,CAAC,KAAc;IAC7D,IAAI,KAAK,YAAY,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,6BAA6B,CAAC;QAAE,OAAO,IAAI,CAAC;IACnG,OAAO,KAAK,YAAY,mBAAmB,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,yCAAyC,CACxD,KAAc;IAEd,IACC,KAAK,YAAY,yBAAyB;QAC1C,KAAK,YAAY,sBAAsB;QACvC,KAAK,YAAY,6BAA6B,EAC7C,CAAC;QACF,OAAO,uBAAuB,CAAC;IAChC,CAAC;IACD,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,2BAA2B,EAAE,CAAC;QAClH,OAAO,2BAA2B,CAAC;IACpC,CAAC;IACD,IAAI,KAAK,YAAY,mCAAmC,EAAE,CAAC;QAC1D,OAAO,kCAAkC,CAAC;IAC3C,CAAC;IACD,IAAI,KAAK,YAAY,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAC/E,OAAO,6BAA6B,CAAC;IACtC,CAAC;IACD,IAAI,sCAAsC,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,gCAAgC,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAAC,OAAe;IAC9D,OAAO,OAAO,CAAC,UAAU,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,sBAAsB,GAAsD;IACjF,uBAAuB,EAAE,+CAA+C;IACxE,gCAAgC,EAAE,qDAAqD;IACvF,2BAA2B,EAAE,2CAA2C;IACxE,kCAAkC,EAAE,4DAA4D;IAChG,6BAA6B,EAAE,uCAAuC;CACtE,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,sCAAsC,CACrD,WAA8C,EAC9C,KAAe;IAEf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,+BAA+B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,OAAO;QACN,qDAAqD,sBAAsB,CAAC,WAAW,CAAC,GAAG;QAC3F,4GAA4G;QAC5G,MAAM,CAAC,CAAC,CAAC,sBAAsB,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAChE,yDAAyD;KACzD;SACC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC/C,WAAkC,EAClC,aAAqB,EACrB,WAA8C,EAC9C,QAA0B,EAC1B,aAAa,GAAmB,EAAE,EAClC,WAA6C;IAE7C,MAAM,aAAa,GAAG,6BAA6B,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC;IAC7C,MAAM,qBAAqB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAC5G,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,qBAAqB,KAAK,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC1B,eAAe,EAAE,8BAA8B;gBAC/C,aAAa;gBACb,aAAa;gBACb,YAAY,EAAE,MAAM;aACpB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG;QACd,gDAAgD;QAChD,0GAA0G;QAC1G,yGAAyG;KACzG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,qBAAqB,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACnF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,OAAO,GAAG,SAAS,CAAC;IACxB,IAAI,eAAe,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,4BAA4B,CAAC,CAAC,CAAC;QAClH,MAAM,gBAAgB,GAAG,gCAAgC,CAAC;QAC1D,MAAM,eAAe,GACpB,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,cAAc;YACnD,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,GAAG,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,EAAE,CAAC;QAC7H,OAAO,GAAG,GAAG,SAAS,6BAA6B,eAAe,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAiC;QACjD,MAAM,EAAE,4CAA4C;QACpD,MAAM,EAAE,8BAA8B;QACtC,WAAW;QACX,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrC,CAAC;IACF,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,MAAM,mBAAmB,GAAoB;QAC5C,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,0CAA0C;QAC9C,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI;QAC1C,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QACpC,OAAO;QACP,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,WAAW,CAAC,gBAAgB;QACtE,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE;QACvD,QAAQ,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,iBAAmE,CAAC;IACxE,IAAI,CAAC;QACJ,iBAAiB,GAAG,6BAA6B,CAChD,mBAAmB,CAAC,CAAC,GAAG,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CACrE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC1B,eAAe,EAAE,+BAA+B;gBAChD,aAAa;gBACb,aAAa;gBACb,YAAY,EAAE,MAAM;aACpB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,6EAA6E;IAC7E,gFAAgF;IAChF,gFAAgF;IAChF,+EAA+E;IAC/E,wEAAwE;IACxE,MAAM,gCAAgC,GAAG,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;IAEpF,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,SAAS;YAAE,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,iBAAiB,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4D,CAAC;IACtF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAChD,KAAK,IAAI,KAAK,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzC,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5C,iBAAiB,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxD,IAAI,gCAAgC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9C,SAAS;QACV,CAAC;QACD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,UAA8B,CAAC;QACnC,IAAI,CAAC;YACJ,aAAa,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5C,aAAa,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;wBAAE,OAAO,KAAK,CAAC;oBACzC,WAAW,IAAI,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAChE,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACP,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,CAAC;YACD,mEAAmE;YACnE,yEAAyE;YACzE,WAAW,CAAC,KAAK,CAAC;gBACjB,UAAU,KAAK,SAAS;oBACvB,CAAC,CAAC,MAAM,CAAC,iBAAiB;oBAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CACR,cAAc,CAAC,OAAO,CAAC,EACvB,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,GAAG,WAAW,CACjF,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACR,aAAa,GAAG,IAAI,CAAC;YACrB,WAAW,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAC/C,CAAC;QACD,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC;QAC/D,IAAI,aAAa;YAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3E,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;oBAAE,SAAS;gBAC5F,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACrG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,oBAAoB,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,YAAoB,EAAE,EAAE;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;QACxE,IAAI,YAAY,IAAI,UAAU;YAAE,OAAO;QACvC,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;IACpC,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3E,SAAS;QACV,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,4EAA4E;QAC5E,mEAAmE;QACnE,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,gBAAgB,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;YACvD,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACP,gBAAgB,CAAC,SAAS,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAChC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9D,qBAAqB,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrD,gBAAgB,CAAC,KAAK,CAAC,GAAG,qBAAqB,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,gBAAgB,GAAG,CACxB,gBAAwB,EACxB,cAA2E,EACd,EAAE;QAC/D,cAAc,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,cAAc,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,CACd,eAAqD,EACrD,MAAM,GAGF,EAAE,EACM,EAAE;YACd,IAAI,WAAW,EAAE,CAAC;gBACjB,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC;gBAC9C,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC;gBAC1C,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC;gBAC1C,WAAW,CAAC,YAAY,GAAG,MAAM,CAAC;gBAClC,WAAW,CAAC,mBAAmB,KAAK,EAAE,CAAC;gBACvC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,MAAM,GAAmD;YAC9D,OAAO;YACP,gBAAgB;YAChB,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,OAAO;SACP,CAAC;QACF,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,+BAA+B,CAAC,CAAC;QAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,aAAa,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC,yBAAyB,EAAE;gBACxC,kBAAkB;gBAClB,aAAa,EAAE,wBAAwB,CAAC,aAAa,CAAC;gBACtD,iBAAiB,EAAE,aAAa,CAAC,IAAI;aACrC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;YAAE,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC7E,gFAAgF;QAChF,kFAAkF;QAClF,MAAM,aAAa,GAClB,YAAY,KAAK,SAAS;YACzB,CAAC,CAAC,MAAM,CAAC,iBAAiB;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CACR,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,EAC/C,cAAc,CAAC;gBACd,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACxD,SAAS,EAAE,CAAC;aACZ,CAAC,CACF,CAAC;QACL,MAAM,cAAc,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,GAAG,aAAa,CAAC;QAChG,IAAI,cAAc,GAAG,MAAM,EAAE,CAAC;YAC7B,IAAI,WAAW;gBAAE,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;YACnD,OAAO,MAAM,CAAC,gCAAgC,EAAE,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,EAAE,GAAG,MAAM,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC;IAC5D,CAAC,CAAC;IAEF,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC5E,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,WAAW;YAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;QAChE,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,oFAAoF;IACpF,+EAA+E;IAC/E,KAAK,IAAI,KAAK,GAAG,qBAAqB,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM;QACvC,6DAA6D;QAC7D,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACpE,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,WAAW;gBAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;YAChE,OAAO,OAAO,CAAC;QAChB,CAAC;IACF,CAAC;IAED,qCAAqC;IACrC,KAAK,IAAI,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,qBAAqB,EAAE,KAAK,EAAE,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YAAE,SAAS;QAC5C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAClE,IAAI,UAAU,EAAE,CAAC;YAChB,IAAI,WAAW;gBAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;YAChE,OAAO,UAAU,CAAC;QACnB,CAAC;QACD,2EAA2E;QAC3E,4EAA4E;QAC5E,KAAK,IAAI,YAAY,GAAG,KAAK,GAAG,CAAC,EAAE,YAAY,GAAG,qBAAqB,EAAE,YAAY,EAAE,EAAE,CAAC;YACzF,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY;gBAAE,MAAM;YAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAC3E,IAAI,OAAO,EAAE,CAAC;gBACb,IAAI,WAAW;oBAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;gBAChE,OAAO,OAAO,CAAC;YAChB,CAAC;QACF,CAAC;QACD,MAAM;IACP,CAAC;IAED,IAAI,WAAW;QAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;IAChE,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["import { type CompactionPreparation, type CompactionResult, estimateTokens } from \"../../../compaction/index.ts\";\nimport {\n\tStreamDurationBudgetError,\n\tStreamIdleTimeoutError,\n\tSummarizationTotalBudgetError,\n} from \"../../../compaction/stream-watchdog.ts\";\nimport { CredentialFailoverError, TURN_RETRY_SUPPRESSION_PREFIX } from \"../../../credential-pool/failover.ts\";\nimport { filterContextExcludedMessages } from \"../../../messages.ts\";\nimport {\n\tbuildSessionContext,\n\ttype CompactionEntry,\n\tgetSessionContextEntryId,\n\ttype SessionEntry,\n} from \"../../../session-manager.ts\";\nimport { markFailedTurnFragments } from \"./fallback-failed-turn-normalization.ts\";\nimport { SummarizationOverflowExhaustedError } from \"./overflow-retry.ts\";\nimport { resolveEffectiveReserveTokens } from \"./policy.ts\";\nimport { hasUnsafeRetainedContent } from \"./retained-message-safety.ts\";\nimport { SummaryGenerationError, SummaryRequestError } from \"./speculative.ts\";\nimport { capUtf8Bytes } from \"./task-intent.ts\";\n\nexport type RequiredCompactionFallbackFailure =\n\t| \"summarization-timeout\"\n\t| \"summarization-provider-failure\"\n\t| \"upstream-stream-truncated\"\n\t| \"summarization-overflow-exhausted\"\n\t| \"summarization-empty-summary\";\n\ninterface RecoveryMetadata {\n\ttaskIntent?: string;\n\ttodoSnapshot?: unknown;\n\tcheckpoint?: unknown;\n}\n\nexport type DeterministicFallbackRejectionReason =\n\t| \"missing-preparation-boundary\"\n\t| \"unsafe-retained-content\"\n\t| \"retained-token-budget-exceeded\"\n\t| \"atomic-tool-chain-cut\"\n\t| \"context-reconstruction-failed\";\n\ninterface DeterministicFallbackDetails {\n\tschema: \"senpi.compaction.deterministic-fallback.v1\";\n\torigin: \"required-compaction-recovery\";\n\tfailureKind: RequiredCompactionFallbackFailure;\n\ttaskIntent?: string;\n\tretainedSuffix?: \"prepared\" | \"latest-user-turn\" | \"earlier-safe-boundary\";\n}\n\nexport interface DeterministicFallbackDiagnostic {\n\trejectionReason?: DeterministicFallbackRejectionReason;\n\tcandidateRejections?: Array<{\n\t\tfirstKeptEntryId: string;\n\t\trejectionReason: DeterministicFallbackRejectionReason;\n\t\testimatedTokens?: number;\n\t\tunsafeMessageIndex?: number;\n\t\tunsafeEntryId?: string;\n\t\tunsafeMessageRole?: string;\n\t}>;\n\tcandidatesChecked?: number;\n\tbudgetExceeded?: boolean;\n\tcontextWindow?: number;\n\treserveTokens?: number;\n\tbudgetTokens?: number;\n}\n\nexport function formatRequiredCompactionFallbackRejection(diagnostics: DeterministicFallbackDiagnostic): string {\n\tconst candidate = diagnostics.candidateRejections?.at(-1);\n\tconst reason = diagnostics.rejectionReason ?? \"context-reconstruction-failed\";\n\tconst recovery: Record<DeterministicFallbackRejectionReason, string> = {\n\t\t\"retained-token-budget-exceeded\":\n\t\t\t\"The retained turn exceeds the usable context. Select a model with a larger context and run /compact, or start a new session with an explicit checkpoint.\",\n\t\t\"atomic-tool-chain-cut\":\n\t\t\t\"The retained tool calls and results do not form complete pairs. Finish the pending tool operation before /compact; if the transcript is damaged, start a new session with an explicit checkpoint.\",\n\t\t\"unsafe-retained-content\":\n\t\t\t\"The retained message cannot be replayed safely. Inspect the identified entry; start a new session with an explicit checkpoint if it cannot be repaired.\",\n\t\t\"missing-preparation-boundary\":\n\t\t\t\"The prepared boundary is absent from the branch. Reload the session and run /compact.\",\n\t\t\"context-reconstruction-failed\":\n\t\t\t\"The retained context could not be reconstructed. Reload the session and run /compact.\",\n\t};\n\tconst diagnostic = {\n\t\trejectionReason: reason,\n\t\tcontextWindow: diagnostics.contextWindow,\n\t\treserveTokens: diagnostics.reserveTokens,\n\t\tbudgetTokens: diagnostics.budgetTokens,\n\t\tbudgetExceeded: diagnostics.budgetExceeded ?? false,\n\t\tcandidatesChecked: diagnostics.candidatesChecked ?? 0,\n\t\t...(candidate\n\t\t\t? {\n\t\t\t\t\tcandidate: {\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\tfirstKeptEntryId: capUtf8Bytes(candidate.firstKeptEntryId, 128),\n\t\t\t\t\t\t...(candidate.unsafeEntryId ? { unsafeEntryId: capUtf8Bytes(candidate.unsafeEntryId, 128) } : {}),\n\t\t\t\t\t\t...(candidate.unsafeMessageRole\n\t\t\t\t\t\t\t? { unsafeMessageRole: capUtf8Bytes(candidate.unsafeMessageRole, 32) }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\treturn `deterministic compaction fallback could not retain a safe suffix\\n${JSON.stringify(diagnostic)}\\n${recovery[reason]} The original transcript has not been changed.`;\n}\n\nconst NON_VISIBLE_USER_TEXT = /[\\p{White_Space}\\p{Default_Ignorable_Code_Point}]/gu;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction hasMeaningfulUserText(entry: SessionEntry): boolean {\n\tif (entry.type !== \"message\" || !isRecord(entry.message) || entry.message.role !== \"user\") return false;\n\tconst content = entry.message.content;\n\tconst hasVisibleText = (text: unknown): boolean =>\n\t\ttypeof text === \"string\" && text.normalize(\"NFKC\").replace(NON_VISIBLE_USER_TEXT, \"\").length > 0;\n\tif (typeof content === \"string\") return hasVisibleText(content);\n\tif (!Array.isArray(content)) return false;\n\treturn content.some((block) => isRecord(block) && block.type === \"text\" && hasVisibleText(block.text));\n}\n\n/**\n * Bound a value graph that came from persisted, potentially hostile session data.\n * Returns false when the graph contains anything we must not read (accessors,\n * non-plain prototypes, cycles, functions, symbols) so callers fail closed\n * instead of executing persisted code or walking unbounded structures.\n */\nfunction isSafeBoundedValue(value: unknown, seen = new Set<object>(), depth = 0): boolean {\n\tif (depth > 32) return false;\n\tif (value === null || value === undefined) return true;\n\tconst kind = typeof value;\n\tif (kind === \"string\" || kind === \"number\" || kind === \"boolean\") return true;\n\tif (kind !== \"object\") return false;\n\tif (seen.has(value as object)) return false;\n\tseen.add(value as object);\n\tif (Array.isArray(value)) {\n\t\tfor (const item of value) if (!isSafeBoundedValue(item, seen, depth + 1)) return false;\n\t\treturn true;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return false;\n\tfor (const descriptor of Object.values(Object.getOwnPropertyDescriptors(value))) {\n\t\tif (descriptor.get !== undefined || descriptor.set !== undefined) return false;\n\t\tif (typeof descriptor.value === \"function\" || typeof descriptor.value === \"symbol\") return false;\n\t\tif (!isSafeBoundedValue(descriptor.value, seen, depth + 1)) return false;\n\t}\n\treturn true;\n}\n\n/**\n * A provider or credential fault that ended the summary stream with no usable\n * summary and no cheaper recovery left.\n *\n * Credential rotation rethrows EVERY terminal outcome as `CredentialFailoverError`,\n * and once any event past `start` reached the caller it prepends the\n * `senpi:no-turn-retry:` marker so the session layer never replays a partially\n * delivered turn. That marker also disables session retry and model fallback, so\n * before #1741 such an error left required compaction with no recovery at all:\n * it applied no summary, authorized no fallback, and repeated identically on the\n * next prompt because the context stayed above the threshold. Single-key\n * providers have no rotation wrapper and surface the same outage as a\n * non-transient `SummaryRequestError`, so the authorization keys on the outcome\n * (\"the summary stream is dead\") rather than on the marker alone.\n *\n * Deliberately NOT authorized: user aborts (they resolve `undefined` upstream),\n * policy refusals (reducing context would not make the model comply), missing\n * credentials (a configuration fault with an actionable message), and ordinary\n * bugs - destructive context reduction must never be a bug's recovery path.\n */\nfunction isTerminalSummarizationProviderFailure(error: unknown): boolean {\n\tif (error instanceof CredentialFailoverError) return true;\n\tif (error instanceof Error && error.message.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)) return true;\n\treturn error instanceof SummaryRequestError && !error.transient && !error.refused && error.failureKind === undefined;\n}\n\nexport function classifyRequiredCompactionFallbackFailure(\n\terror: unknown,\n): RequiredCompactionFallbackFailure | undefined {\n\tif (\n\t\terror instanceof StreamDurationBudgetError ||\n\t\terror instanceof StreamIdleTimeoutError ||\n\t\terror instanceof SummarizationTotalBudgetError\n\t) {\n\t\treturn \"summarization-timeout\";\n\t}\n\tif (error instanceof SummaryRequestError && error.transient && error.failureKind === \"upstream-stream-truncated\") {\n\t\treturn \"upstream-stream-truncated\";\n\t}\n\tif (error instanceof SummarizationOverflowExhaustedError) {\n\t\treturn \"summarization-overflow-exhausted\";\n\t}\n\tif (error instanceof SummaryGenerationError && error.kind === \"empty-summary\") {\n\t\treturn \"summarization-empty-summary\";\n\t}\n\tif (isTerminalSummarizationProviderFailure(error)) {\n\t\treturn \"summarization-provider-failure\";\n\t}\n\treturn undefined;\n}\n\n/**\n * `senpi:no-turn-retry:` is a session-internal replay-suppression signal read by\n * `_isRetryableError` / `_isHardErrorFallbackEligible`. It must stay on the error\n * object those predicates inspect and must never reach user-visible text.\n */\nexport function stripTurnRetrySuppressionPrefix(message: string): string {\n\treturn message.replaceAll(TURN_RETRY_SUPPRESSION_PREFIX, \"\");\n}\n\nconst FALLBACK_FAILURE_CAUSE: Record<RequiredCompactionFallbackFailure, string> = {\n\t\"summarization-timeout\": \"the summary stream ran out of its time budget\",\n\t\"summarization-provider-failure\": \"the provider ended the summary stream with an error\",\n\t\"upstream-stream-truncated\": \"the provider truncated the summary stream\",\n\t\"summarization-overflow-exhausted\": \"the summary input stayed over the provider's context limit\",\n\t\"summarization-empty-summary\": \"the provider returned no summary text\",\n};\n\n/**\n * What the user is told when a required compaction recovered through the\n * deterministic checkpoint. States the outcome plainly and never carries the\n * internal retry-suppression marker.\n */\nexport function formatRequiredCompactionFallbackNotice(\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tcause?: unknown,\n): string {\n\tconst detail = cause instanceof Error ? stripTurnRetrySuppressionPrefix(cause.message).trim() : \"\";\n\treturn [\n\t\t`Compaction could not complete a provider summary: ${FALLBACK_FAILURE_CAUSE[failureKind]}.`,\n\t\t\"A deterministic checkpoint was applied and older transcript detail was dropped, so it is safe to continue.\",\n\t\tdetail ? `Provider reported: ${capUtf8Bytes(detail, 512)}.` : \"\",\n\t\t\"Run /compact on a different model for a richer summary.\",\n\t]\n\t\t.filter((part) => part.length > 0)\n\t\t.join(\" \");\n}\n\nexport function createRequiredCompactionFallback(\n\tpreparation: CompactionPreparation,\n\tcontextWindow: number,\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tmetadata: RecoveryMetadata,\n\tbranchEntries: SessionEntry[] = [],\n\tdiagnostics?: DeterministicFallbackDiagnostic,\n): CompactionResult<DeterministicFallbackDetails> | undefined {\n\tconst reserveTokens = resolveEffectiveReserveTokens(contextWindow, preparation.settings);\n\tconst budget = contextWindow - reserveTokens;\n\tconst preparedBoundaryIndex = branchEntries.findIndex((entry) => entry.id === preparation.firstKeptEntryId);\n\tif (!preparation.firstKeptEntryId || preparedBoundaryIndex === -1) {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"missing-preparation-boundary\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconst marker = [\n\t\t\"[Deterministic compaction recovery checkpoint]\",\n\t\t\"Generated summarization did not complete, so older context was reduced without another provider request.\",\n\t\t\"Continue from the retained messages after this checkpoint. Treat omitted transcript details as unknown.\",\n\t].join(\"\\n\");\n\tconst taskIntent = metadata.taskIntent?.trim();\n\tconst fixedText = taskIntent ? `${marker}\\n\\nTask intent:\\n${taskIntent}` : marker;\n\tconst maxSummaryBytes = Math.max(1_024, Math.floor(contextWindow * 0.4));\n\tconst previousSummary = preparation.previousSummary?.trim();\n\tlet summary = fixedText;\n\tif (previousSummary) {\n\t\tconst availableBytes = Math.max(0, maxSummaryBytes - Buffer.byteLength(`${fixedText}\\n\\nPrevious checkpoint:\\n`));\n\t\tconst truncationMarker = \"\\n[Older checkpoint truncated]\";\n\t\tconst boundedPrevious =\n\t\t\tBuffer.byteLength(previousSummary) <= availableBytes\n\t\t\t\t? previousSummary\n\t\t\t\t: `${capUtf8Bytes(previousSummary, Math.max(0, availableBytes - Buffer.byteLength(truncationMarker)))}${truncationMarker}`;\n\t\tsummary = `${fixedText}\\n\\nPrevious checkpoint:\\n${boundedPrevious}`;\n\t}\n\n\tconst baseDetails: DeterministicFallbackDetails = {\n\t\tschema: \"senpi.compaction.deterministic-fallback.v1\",\n\t\torigin: \"required-compaction-recovery\",\n\t\tfailureKind,\n\t\t...(taskIntent ? { taskIntent } : {}),\n\t};\n\tlet candidateCount = 0;\n\n\tconst syntheticCompaction: CompactionEntry = {\n\t\ttype: \"compaction\",\n\t\tid: \"__senpi_deterministic_fallback_preview__\",\n\t\tparentId: branchEntries.at(-1)?.id ?? null,\n\t\ttimestamp: new Date(0).toISOString(),\n\t\tsummary,\n\t\tfirstKeptEntryId: branchEntries[0]?.id ?? preparation.firstKeptEntryId,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\tdetails: { ...baseDetails, retainedSuffix: \"prepared\" },\n\t\tfromHook: true,\n\t};\n\n\tlet projectedMessages: ReturnType<typeof filterContextExcludedMessages>;\n\ttry {\n\t\tprojectedMessages = filterContextExcludedMessages(\n\t\t\tbuildSessionContext([...branchEntries, syntheticCompaction]).messages,\n\t\t);\n\t} catch {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"context-reconstruction-failed\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t// Evaluate the candidate the provider would actually receive: `convertToLlm`\n\t// drops failed/aborted assistant turns (and their orphaned tool results) before\n\t// every request, so their dangling toolCall blocks are neither incomplete calls\n\t// nor retained tokens here. Raw session history stays untouched - this mask is\n\t// local to the fallback projection (code-yeongyu/oh-my-openagent#7921).\n\tconst droppedByFailedTurnNormalization = markFailedTurnFragments(projectedMessages);\n\n\tconst messageIndexesByEntryId = new Map<string, number>();\n\tfor (const [index, message] of projectedMessages.entries()) {\n\t\tconst entryId = getSessionContextEntryId(message);\n\t\tif (entryId !== undefined) messageIndexesByEntryId.set(entryId, index);\n\t}\n\tconst summaryIndex = messageIndexesByEntryId.get(syntheticCompaction.id);\n\tconst unsafeSuffix = new Array(projectedMessages.length + 1).fill(false);\n\tconst unsafeIndexSuffix = new Int32Array(projectedMessages.length + 1).fill(-1);\n\tconst tokenSuffix = new Array(projectedMessages.length + 1).fill(0);\n\tconst toolCalls = new Map<string, { indexes: number[]; newestIncomplete: boolean }>();\n\tconst toolResults = new Map<string, number[]>();\n\tfor (let index = projectedMessages.length - 1; index >= 0; index--) {\n\t\tconst message = projectedMessages[index];\n\t\ttokenSuffix[index] = tokenSuffix[index + 1];\n\t\tunsafeIndexSuffix[index] = unsafeIndexSuffix[index + 1];\n\t\tif (droppedByFailedTurnNormalization[index]) {\n\t\t\tunsafeSuffix[index] = unsafeSuffix[index + 1];\n\t\t\tcontinue;\n\t\t}\n\t\tlet messageUnsafe = false;\n\t\tlet serialized: string | undefined;\n\t\ttry {\n\t\t\tmessageUnsafe = hasUnsafeRetainedContent([message]);\n\t\t\tconst bounded = isSafeBoundedValue(message);\n\t\t\tmessageUnsafe ||= !bounded;\n\t\t\tlet imageTokens = 0;\n\t\t\tif (!messageUnsafe && message.role === \"toolResult\") {\n\t\t\t\tconst content = message.content.map((block) => {\n\t\t\t\t\tif (block.type !== \"image\") return block;\n\t\t\t\t\timageTokens += estimateTokens({ ...message, content: [block] });\n\t\t\t\t\treturn { ...block, data: \"\" };\n\t\t\t\t});\n\t\t\t\tserialized = JSON.stringify({ ...message, content });\n\t\t\t} else {\n\t\t\t\tserialized = bounded ? JSON.stringify(message) : undefined;\n\t\t\t}\n\t\t\t// Apply the shared weighted chars/4 estimator to the envelope too.\n\t\t\t// Storage bytes are not tokens; opaque text and image costs still count.\n\t\t\ttokenSuffix[index] +=\n\t\t\t\tserialized === undefined\n\t\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t\t: Math.max(\n\t\t\t\t\t\t\testimateTokens(message),\n\t\t\t\t\t\t\testimateTokens({ role: \"user\", content: serialized, timestamp: 0 }) + imageTokens,\n\t\t\t\t\t\t);\n\t\t} catch {\n\t\t\tmessageUnsafe = true;\n\t\t\ttokenSuffix[index] = Number.POSITIVE_INFINITY;\n\t\t}\n\t\tunsafeSuffix[index] = unsafeSuffix[index + 1] || messageUnsafe;\n\t\tif (messageUnsafe) unsafeIndexSuffix[index] = index;\n\t\tif (!isRecord(message)) continue;\n\t\tif (message.role === \"toolResult\" && typeof message.toolCallId === \"string\") {\n\t\t\tconst indexes = toolResults.get(message.toolCallId) ?? [];\n\t\t\tindexes.push(index);\n\t\t\ttoolResults.set(message.toolCallId, indexes);\n\t\t} else if (message.role === \"assistant\" && Array.isArray(message.content)) {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (!isRecord(block) || block.type !== \"toolCall\" || typeof block.id !== \"string\") continue;\n\t\t\t\tconst call = toolCalls.get(block.id) ?? { indexes: [], newestIncomplete: block.incomplete === true };\n\t\t\t\tcall.indexes.push(index);\n\t\t\t\ttoolCalls.set(block.id, call);\n\t\t\t}\n\t\t}\n\t}\n\tconst invalidToolChainDiff = new Int32Array(projectedMessages.length + 2);\n\tconst markInvalidRange = (start: number, endExclusive: number) => {\n\t\tconst boundedStart = Math.max(0, start);\n\t\tconst boundedEnd = Math.min(projectedMessages.length + 1, endExclusive);\n\t\tif (boundedStart >= boundedEnd) return;\n\t\tinvalidToolChainDiff[boundedStart]++;\n\t\tinvalidToolChainDiff[boundedEnd]--;\n\t};\n\tfor (const [id, call] of toolCalls) {\n\t\tconst results = toolResults.get(id) ?? [];\n\t\tif (results.length === 0) {\n\t\t\tmarkInvalidRange(0, Math.max(call.indexes[0] ?? -1, results[0] ?? -1) + 1);\n\t\t\tcontinue;\n\t\t}\n\t\tconst callIndex = call.indexes[0];\n\t\tconst resultIndex = results[0];\n\t\t// Indexes are newest-first. Older duplicate IDs matter only while retained;\n\t\t// dropping an entire historical pair leaves the newest pair valid.\n\t\tmarkInvalidRange(0, Math.max(call.indexes[1] ?? -1, results[1] ?? -1) + 1);\n\t\tif (call.newestIncomplete || callIndex >= resultIndex) {\n\t\t\tmarkInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t\t} else {\n\t\t\tmarkInvalidRange(callIndex + 1, resultIndex + 1);\n\t\t}\n\t}\n\tfor (const [id, results] of toolResults) {\n\t\tif (toolCalls.has(id)) continue;\n\t\tmarkInvalidRange(0, results[0] + 1);\n\t}\n\tconst toolChainValidAt = new Array(projectedMessages.length + 1).fill(true);\n\tlet invalidToolChainCount = 0;\n\tfor (let index = 0; index < toolChainValidAt.length; index++) {\n\t\tinvalidToolChainCount += invalidToolChainDiff[index];\n\t\ttoolChainValidAt[index] = invalidToolChainCount === 0;\n\t}\n\n\tconst projectCandidate = (\n\t\tfirstKeptEntryId: string,\n\t\tretainedSuffix: NonNullable<DeterministicFallbackDetails[\"retainedSuffix\"]>,\n\t): CompactionResult<DeterministicFallbackDetails> | undefined => {\n\t\tcandidateCount++;\n\t\tconst details = { ...baseDetails, retainedSuffix };\n\t\tconst reject = (\n\t\t\trejectionReason: DeterministicFallbackRejectionReason,\n\t\t\tdetail: Omit<\n\t\t\t\tNonNullable<DeterministicFallbackDiagnostic[\"candidateRejections\"]>[number],\n\t\t\t\t\"firstKeptEntryId\" | \"rejectionReason\"\n\t\t\t> = {},\n\t\t): undefined => {\n\t\t\tif (diagnostics) {\n\t\t\t\tdiagnostics.rejectionReason = rejectionReason;\n\t\t\t\tdiagnostics.contextWindow = contextWindow;\n\t\t\t\tdiagnostics.reserveTokens = reserveTokens;\n\t\t\t\tdiagnostics.budgetTokens = budget;\n\t\t\t\tdiagnostics.candidateRejections ??= [];\n\t\t\t\tdiagnostics.candidateRejections.push({ firstKeptEntryId, rejectionReason, ...detail });\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\t\tconst result: CompactionResult<DeterministicFallbackDetails> = {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\tdetails,\n\t\t};\n\t\tconst startIndex = messageIndexesByEntryId.get(firstKeptEntryId);\n\t\tif (startIndex === undefined) return reject(\"context-reconstruction-failed\");\n\t\tconst retainedStart = Math.min(startIndex, projectedMessages.length);\n\t\tif (unsafeSuffix[retainedStart]) {\n\t\t\tconst unsafeMessageIndex = unsafeIndexSuffix[retainedStart];\n\t\t\tconst unsafeMessage = projectedMessages[unsafeMessageIndex];\n\t\t\treturn reject(\"unsafe-retained-content\", {\n\t\t\t\tunsafeMessageIndex,\n\t\t\t\tunsafeEntryId: getSessionContextEntryId(unsafeMessage),\n\t\t\t\tunsafeMessageRole: unsafeMessage.role,\n\t\t\t});\n\t\t}\n\t\tif (!toolChainValidAt[retainedStart]) return reject(\"atomic-tool-chain-cut\");\n\t\t// The hard-limit valve reserves the scaled budget, so accepting against the raw\n\t\t// configured reserve would admit a context that valve immediately compacts again.\n\t\tconst summaryTokens =\n\t\t\tsummaryIndex === undefined\n\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t: Math.max(\n\t\t\t\t\t\testimateTokens(projectedMessages[summaryIndex]),\n\t\t\t\t\t\testimateTokens({\n\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\tcontent: JSON.stringify(projectedMessages[summaryIndex]),\n\t\t\t\t\t\t\ttimestamp: 0,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\tconst retainedTokens = (tokenSuffix[retainedStart] ?? Number.POSITIVE_INFINITY) + summaryTokens;\n\t\tif (retainedTokens > budget) {\n\t\t\tif (diagnostics) diagnostics.budgetExceeded = true;\n\t\t\treturn reject(\"retained-token-budget-exceeded\", { estimatedTokens: retainedTokens });\n\t\t}\n\t\treturn { ...result, estimatedTokensAfter: retainedTokens };\n\t};\n\n\t// 1. Try prepared boundary\n\tconst prepared = projectCandidate(preparation.firstKeptEntryId, \"prepared\");\n\tif (prepared) {\n\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\treturn prepared;\n\t}\n\n\t// 2. If prepared boundary cut an atomic signed chain or was rejected, walk backward\n\t// to the actual chain boundary. The chain length is determined by the session.\n\tfor (let index = preparedBoundaryIndex - 1; index >= 0; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (entry.type === \"compaction\") break;\n\t\t// Only consider message turn starts or assistant call starts\n\t\tconst earlier = projectCandidate(entry.id, \"earlier-safe-boundary\");\n\t\tif (earlier) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn earlier;\n\t\t}\n\t}\n\n\t// 3. Try latest meaningful user turn\n\tfor (let index = branchEntries.length - 1; index > preparedBoundaryIndex; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (!hasMeaningfulUserText(entry)) continue;\n\t\tconst latestUser = projectCandidate(entry.id, \"latest-user-turn\");\n\t\tif (latestUser) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn latestUser;\n\t\t}\n\t\t// A steering user message can occur inside a tool chain. Keep that request\n\t\t// and walk back to its declaring assistant instead of orphaning the result.\n\t\tfor (let earlierIndex = index - 1; earlierIndex > preparedBoundaryIndex; earlierIndex--) {\n\t\t\tconst earlierEntry = branchEntries[earlierIndex];\n\t\t\tif (earlierEntry.type === \"compaction\") break;\n\t\t\tconst earlier = projectCandidate(earlierEntry.id, \"earlier-safe-boundary\");\n\t\t\tif (earlier) {\n\t\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\t\treturn earlier;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\treturn undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"deterministic-fallback.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAqD,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACjH,OAAO,EACN,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,GAC7B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAC9G,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EACN,mBAAmB,EAEnB,wBAAwB,GAExB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+ChD,MAAM,UAAU,yCAAyC,CAAC,WAA4C;IACrG,MAAM,SAAS,GAAG,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,IAAI,+BAA+B,CAAC;IAC9E,MAAM,QAAQ,GAAyD;QACtE,gCAAgC,EAC/B,0JAA0J;QAC3J,uBAAuB,EACtB,mMAAmM;QACpM,yBAAyB,EACxB,yJAAyJ;QAC1J,8BAA8B,EAC7B,uFAAuF;QACxF,+BAA+B,EAC9B,uFAAuF;KACxF,CAAC;IACF,MAAM,UAAU,GAAG;QAClB,eAAe,EAAE,MAAM;QACvB,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,cAAc,EAAE,WAAW,CAAC,cAAc,IAAI,KAAK;QACnD,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,IAAI,CAAC;QACrD,GAAG,CAAC,SAAS;YACZ,CAAC,CAAC;gBACA,SAAS,EAAE;oBACV,GAAG,SAAS;oBACZ,gBAAgB,EAAE,YAAY,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC;oBAC/D,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjG,GAAG,CAAC,SAAS,CAAC,iBAAiB;wBAC9B,CAAC,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE;wBACtE,CAAC,CAAC,EAAE,CAAC;iBACN;aACD;YACF,CAAC,CAAC,EAAE,CAAC;KACN,CAAC;IACF,OAAO,qEAAqE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,gDAAgD,CAAC;AAC7K,CAAC;AAED,MAAM,qBAAqB,GAAG,qDAAqD,CAAC;AAEpF,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAmB;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACxG,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,MAAM,cAAc,GAAG,CAAC,IAAa,EAAW,EAAE,CACjD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAClG,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACxG,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,KAAc,EAAE,IAAI,GAAG,IAAI,GAAG,EAAU,EAAE,KAAK,GAAG,CAAC;IAC9E,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;IAC1B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACvF,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/D,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjF,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC/E,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,sCAAsC,CAAC,KAAc;IAC7D,IAAI,KAAK,YAAY,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,6BAA6B,CAAC;QAAE,OAAO,IAAI,CAAC;IACnG,OAAO,KAAK,YAAY,mBAAmB,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,yCAAyC,CACxD,KAAc;IAEd,IACC,KAAK,YAAY,yBAAyB;QAC1C,KAAK,YAAY,sBAAsB;QACvC,KAAK,YAAY,6BAA6B,EAC7C,CAAC;QACF,OAAO,uBAAuB,CAAC;IAChC,CAAC;IACD,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,2BAA2B,EAAE,CAAC;QAClH,OAAO,2BAA2B,CAAC;IACpC,CAAC;IACD,IAAI,KAAK,YAAY,mCAAmC,EAAE,CAAC;QAC1D,OAAO,kCAAkC,CAAC;IAC3C,CAAC;IACD,IAAI,KAAK,YAAY,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAC/E,OAAO,6BAA6B,CAAC;IACtC,CAAC;IACD,IAAI,sCAAsC,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,gCAAgC,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,+BAA+B,EAAE,CAAC;AAE3C,MAAM,sBAAsB,GAAsD;IACjF,uBAAuB,EAAE,+CAA+C;IACxE,gCAAgC,EAAE,qDAAqD;IACvF,2BAA2B,EAAE,2CAA2C;IACxE,kCAAkC,EAAE,4DAA4D;IAChG,6BAA6B,EAAE,uCAAuC;CACtE,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,sCAAsC,CACrD,WAA8C,EAC9C,KAAe;IAEf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,+BAA+B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,OAAO;QACN,qDAAqD,sBAAsB,CAAC,WAAW,CAAC,GAAG;QAC3F,4GAA4G;QAC5G,MAAM,CAAC,CAAC,CAAC,sBAAsB,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAChE,yDAAyD;KACzD;SACC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC/C,WAAkC,EAClC,aAAqB,EACrB,WAA8C,EAC9C,QAA0B,EAC1B,aAAa,GAAmB,EAAE,EAClC,WAA6C;IAE7C,MAAM,aAAa,GAAG,6BAA6B,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC;IAC7C,MAAM,qBAAqB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAC5G,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,qBAAqB,KAAK,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC1B,eAAe,EAAE,8BAA8B;gBAC/C,aAAa;gBACb,aAAa;gBACb,YAAY,EAAE,MAAM;aACpB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG;QACd,gDAAgD;QAChD,0GAA0G;QAC1G,yGAAyG;KACzG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,qBAAqB,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACnF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,OAAO,GAAG,SAAS,CAAC;IACxB,IAAI,eAAe,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,4BAA4B,CAAC,CAAC,CAAC;QAClH,MAAM,gBAAgB,GAAG,gCAAgC,CAAC;QAC1D,MAAM,eAAe,GACpB,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,cAAc;YACnD,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,GAAG,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,EAAE,CAAC;QAC7H,OAAO,GAAG,GAAG,SAAS,6BAA6B,eAAe,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAiC;QACjD,MAAM,EAAE,4CAA4C;QACpD,MAAM,EAAE,8BAA8B;QACtC,WAAW;QACX,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrC,CAAC;IACF,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,MAAM,mBAAmB,GAAoB;QAC5C,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,0CAA0C;QAC9C,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI;QAC1C,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QACpC,OAAO;QACP,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,WAAW,CAAC,gBAAgB;QACtE,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE;QACvD,QAAQ,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,iBAAmE,CAAC;IACxE,IAAI,CAAC;QACJ,iBAAiB,GAAG,6BAA6B,CAChD,mBAAmB,CAAC,CAAC,GAAG,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CACrE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC1B,eAAe,EAAE,+BAA+B;gBAChD,aAAa;gBACb,aAAa;gBACb,YAAY,EAAE,MAAM;aACpB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,6EAA6E;IAC7E,gFAAgF;IAChF,gFAAgF;IAChF,+EAA+E;IAC/E,wEAAwE;IACxE,MAAM,gCAAgC,GAAG,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;IAEpF,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,SAAS;YAAE,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,iBAAiB,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4D,CAAC;IACtF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAChD,KAAK,IAAI,KAAK,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzC,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5C,iBAAiB,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxD,IAAI,gCAAgC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9C,SAAS;QACV,CAAC;QACD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,UAA8B,CAAC;QACnC,IAAI,CAAC;YACJ,aAAa,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5C,aAAa,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;wBAAE,OAAO,KAAK,CAAC;oBACzC,WAAW,IAAI,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAChE,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACP,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,CAAC;YACD,mEAAmE;YACnE,yEAAyE;YACzE,WAAW,CAAC,KAAK,CAAC;gBACjB,UAAU,KAAK,SAAS;oBACvB,CAAC,CAAC,MAAM,CAAC,iBAAiB;oBAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CACR,cAAc,CAAC,OAAO,CAAC,EACvB,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,GAAG,WAAW,CACjF,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACR,aAAa,GAAG,IAAI,CAAC;YACrB,WAAW,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAC/C,CAAC;QACD,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC;QAC/D,IAAI,aAAa;YAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3E,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;oBAAE,SAAS;gBAC5F,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACrG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,oBAAoB,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,YAAoB,EAAE,EAAE;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;QACxE,IAAI,YAAY,IAAI,UAAU;YAAE,OAAO;QACvC,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;IACpC,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3E,SAAS;QACV,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,4EAA4E;QAC5E,mEAAmE;QACnE,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,gBAAgB,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;YACvD,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACP,gBAAgB,CAAC,SAAS,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAChC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9D,qBAAqB,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrD,gBAAgB,CAAC,KAAK,CAAC,GAAG,qBAAqB,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,gBAAgB,GAAG,CACxB,gBAAwB,EACxB,cAA2E,EACd,EAAE;QAC/D,cAAc,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,cAAc,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,CACd,eAAqD,EACrD,MAAM,GAGF,EAAE,EACM,EAAE;YACd,IAAI,WAAW,EAAE,CAAC;gBACjB,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC;gBAC9C,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC;gBAC1C,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC;gBAC1C,WAAW,CAAC,YAAY,GAAG,MAAM,CAAC;gBAClC,WAAW,CAAC,mBAAmB,KAAK,EAAE,CAAC;gBACvC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,MAAM,GAAmD;YAC9D,OAAO;YACP,gBAAgB;YAChB,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,OAAO;SACP,CAAC;QACF,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,+BAA+B,CAAC,CAAC;QAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,aAAa,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC,yBAAyB,EAAE;gBACxC,kBAAkB;gBAClB,aAAa,EAAE,wBAAwB,CAAC,aAAa,CAAC;gBACtD,iBAAiB,EAAE,aAAa,CAAC,IAAI;aACrC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;YAAE,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC7E,gFAAgF;QAChF,kFAAkF;QAClF,MAAM,aAAa,GAClB,YAAY,KAAK,SAAS;YACzB,CAAC,CAAC,MAAM,CAAC,iBAAiB;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CACR,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,EAC/C,cAAc,CAAC;gBACd,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACxD,SAAS,EAAE,CAAC;aACZ,CAAC,CACF,CAAC;QACL,MAAM,cAAc,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,GAAG,aAAa,CAAC;QAChG,IAAI,cAAc,GAAG,MAAM,EAAE,CAAC;YAC7B,IAAI,WAAW;gBAAE,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;YACnD,OAAO,MAAM,CAAC,gCAAgC,EAAE,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,EAAE,GAAG,MAAM,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC;IAC5D,CAAC,CAAC;IAEF,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC5E,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,WAAW;YAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;QAChE,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,oFAAoF;IACpF,+EAA+E;IAC/E,KAAK,IAAI,KAAK,GAAG,qBAAqB,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM;QACvC,6DAA6D;QAC7D,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACpE,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,WAAW;gBAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;YAChE,OAAO,OAAO,CAAC;QAChB,CAAC;IACF,CAAC;IAED,qCAAqC;IACrC,KAAK,IAAI,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,qBAAqB,EAAE,KAAK,EAAE,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YAAE,SAAS;QAC5C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAClE,IAAI,UAAU,EAAE,CAAC;YAChB,IAAI,WAAW;gBAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;YAChE,OAAO,UAAU,CAAC;QACnB,CAAC;QACD,2EAA2E;QAC3E,4EAA4E;QAC5E,KAAK,IAAI,YAAY,GAAG,KAAK,GAAG,CAAC,EAAE,YAAY,GAAG,qBAAqB,EAAE,YAAY,EAAE,EAAE,CAAC;YACzF,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY;gBAAE,MAAM;YAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAC3E,IAAI,OAAO,EAAE,CAAC;gBACb,IAAI,WAAW;oBAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;gBAChE,OAAO,OAAO,CAAC;YAChB,CAAC;QACF,CAAC;QACD,MAAM;IACP,CAAC;IAED,IAAI,WAAW;QAAE,WAAW,CAAC,iBAAiB,GAAG,cAAc,CAAC;IAChE,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["import { stripTurnRetrySuppressionPrefix } from \"@earendil-works/pi-ai\";\nimport { type CompactionPreparation, type CompactionResult, estimateTokens } from \"../../../compaction/index.ts\";\nimport {\n\tStreamDurationBudgetError,\n\tStreamIdleTimeoutError,\n\tSummarizationTotalBudgetError,\n} from \"../../../compaction/stream-watchdog.ts\";\nimport { CredentialFailoverError, TURN_RETRY_SUPPRESSION_PREFIX } from \"../../../credential-pool/failover.ts\";\nimport { filterContextExcludedMessages } from \"../../../messages.ts\";\nimport {\n\tbuildSessionContext,\n\ttype CompactionEntry,\n\tgetSessionContextEntryId,\n\ttype SessionEntry,\n} from \"../../../session-manager.ts\";\nimport { markFailedTurnFragments } from \"./fallback-failed-turn-normalization.ts\";\nimport { SummarizationOverflowExhaustedError } from \"./overflow-retry.ts\";\nimport { resolveEffectiveReserveTokens } from \"./policy.ts\";\nimport { hasUnsafeRetainedContent } from \"./retained-message-safety.ts\";\nimport { SummaryGenerationError, SummaryRequestError } from \"./speculative.ts\";\nimport { capUtf8Bytes } from \"./task-intent.ts\";\n\nexport type RequiredCompactionFallbackFailure =\n\t| \"summarization-timeout\"\n\t| \"summarization-provider-failure\"\n\t| \"upstream-stream-truncated\"\n\t| \"summarization-overflow-exhausted\"\n\t| \"summarization-empty-summary\";\n\ninterface RecoveryMetadata {\n\ttaskIntent?: string;\n\ttodoSnapshot?: unknown;\n\tcheckpoint?: unknown;\n}\n\nexport type DeterministicFallbackRejectionReason =\n\t| \"missing-preparation-boundary\"\n\t| \"unsafe-retained-content\"\n\t| \"retained-token-budget-exceeded\"\n\t| \"atomic-tool-chain-cut\"\n\t| \"context-reconstruction-failed\";\n\ninterface DeterministicFallbackDetails {\n\tschema: \"senpi.compaction.deterministic-fallback.v1\";\n\torigin: \"required-compaction-recovery\";\n\tfailureKind: RequiredCompactionFallbackFailure;\n\ttaskIntent?: string;\n\tretainedSuffix?: \"prepared\" | \"latest-user-turn\" | \"earlier-safe-boundary\";\n}\n\nexport interface DeterministicFallbackDiagnostic {\n\trejectionReason?: DeterministicFallbackRejectionReason;\n\tcandidateRejections?: Array<{\n\t\tfirstKeptEntryId: string;\n\t\trejectionReason: DeterministicFallbackRejectionReason;\n\t\testimatedTokens?: number;\n\t\tunsafeMessageIndex?: number;\n\t\tunsafeEntryId?: string;\n\t\tunsafeMessageRole?: string;\n\t}>;\n\tcandidatesChecked?: number;\n\tbudgetExceeded?: boolean;\n\tcontextWindow?: number;\n\treserveTokens?: number;\n\tbudgetTokens?: number;\n}\n\nexport function formatRequiredCompactionFallbackRejection(diagnostics: DeterministicFallbackDiagnostic): string {\n\tconst candidate = diagnostics.candidateRejections?.at(-1);\n\tconst reason = diagnostics.rejectionReason ?? \"context-reconstruction-failed\";\n\tconst recovery: Record<DeterministicFallbackRejectionReason, string> = {\n\t\t\"retained-token-budget-exceeded\":\n\t\t\t\"The retained turn exceeds the usable context. Select a model with a larger context and run /compact, or start a new session with an explicit checkpoint.\",\n\t\t\"atomic-tool-chain-cut\":\n\t\t\t\"The retained tool calls and results do not form complete pairs. Finish the pending tool operation before /compact; if the transcript is damaged, start a new session with an explicit checkpoint.\",\n\t\t\"unsafe-retained-content\":\n\t\t\t\"The retained message cannot be replayed safely. Inspect the identified entry; start a new session with an explicit checkpoint if it cannot be repaired.\",\n\t\t\"missing-preparation-boundary\":\n\t\t\t\"The prepared boundary is absent from the branch. Reload the session and run /compact.\",\n\t\t\"context-reconstruction-failed\":\n\t\t\t\"The retained context could not be reconstructed. Reload the session and run /compact.\",\n\t};\n\tconst diagnostic = {\n\t\trejectionReason: reason,\n\t\tcontextWindow: diagnostics.contextWindow,\n\t\treserveTokens: diagnostics.reserveTokens,\n\t\tbudgetTokens: diagnostics.budgetTokens,\n\t\tbudgetExceeded: diagnostics.budgetExceeded ?? false,\n\t\tcandidatesChecked: diagnostics.candidatesChecked ?? 0,\n\t\t...(candidate\n\t\t\t? {\n\t\t\t\t\tcandidate: {\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\tfirstKeptEntryId: capUtf8Bytes(candidate.firstKeptEntryId, 128),\n\t\t\t\t\t\t...(candidate.unsafeEntryId ? { unsafeEntryId: capUtf8Bytes(candidate.unsafeEntryId, 128) } : {}),\n\t\t\t\t\t\t...(candidate.unsafeMessageRole\n\t\t\t\t\t\t\t? { unsafeMessageRole: capUtf8Bytes(candidate.unsafeMessageRole, 32) }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\treturn `deterministic compaction fallback could not retain a safe suffix\\n${JSON.stringify(diagnostic)}\\n${recovery[reason]} The original transcript has not been changed.`;\n}\n\nconst NON_VISIBLE_USER_TEXT = /[\\p{White_Space}\\p{Default_Ignorable_Code_Point}]/gu;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction hasMeaningfulUserText(entry: SessionEntry): boolean {\n\tif (entry.type !== \"message\" || !isRecord(entry.message) || entry.message.role !== \"user\") return false;\n\tconst content = entry.message.content;\n\tconst hasVisibleText = (text: unknown): boolean =>\n\t\ttypeof text === \"string\" && text.normalize(\"NFKC\").replace(NON_VISIBLE_USER_TEXT, \"\").length > 0;\n\tif (typeof content === \"string\") return hasVisibleText(content);\n\tif (!Array.isArray(content)) return false;\n\treturn content.some((block) => isRecord(block) && block.type === \"text\" && hasVisibleText(block.text));\n}\n\n/**\n * Bound a value graph that came from persisted, potentially hostile session data.\n * Returns false when the graph contains anything we must not read (accessors,\n * non-plain prototypes, cycles, functions, symbols) so callers fail closed\n * instead of executing persisted code or walking unbounded structures.\n */\nfunction isSafeBoundedValue(value: unknown, seen = new Set<object>(), depth = 0): boolean {\n\tif (depth > 32) return false;\n\tif (value === null || value === undefined) return true;\n\tconst kind = typeof value;\n\tif (kind === \"string\" || kind === \"number\" || kind === \"boolean\") return true;\n\tif (kind !== \"object\") return false;\n\tif (seen.has(value as object)) return false;\n\tseen.add(value as object);\n\tif (Array.isArray(value)) {\n\t\tfor (const item of value) if (!isSafeBoundedValue(item, seen, depth + 1)) return false;\n\t\treturn true;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return false;\n\tfor (const descriptor of Object.values(Object.getOwnPropertyDescriptors(value))) {\n\t\tif (descriptor.get !== undefined || descriptor.set !== undefined) return false;\n\t\tif (typeof descriptor.value === \"function\" || typeof descriptor.value === \"symbol\") return false;\n\t\tif (!isSafeBoundedValue(descriptor.value, seen, depth + 1)) return false;\n\t}\n\treturn true;\n}\n\n/**\n * A provider or credential fault that ended the summary stream with no usable\n * summary and no cheaper recovery left.\n *\n * Credential rotation rethrows EVERY terminal outcome as `CredentialFailoverError`,\n * and once any event past `start` reached the caller it prepends the\n * `senpi:no-turn-retry:` marker so the session layer never replays a partially\n * delivered turn. That marker also disables session retry and model fallback, so\n * before #1741 such an error left required compaction with no recovery at all:\n * it applied no summary, authorized no fallback, and repeated identically on the\n * next prompt because the context stayed above the threshold. Single-key\n * providers have no rotation wrapper and surface the same outage as a\n * non-transient `SummaryRequestError`, so the authorization keys on the outcome\n * (\"the summary stream is dead\") rather than on the marker alone.\n *\n * Deliberately NOT authorized: user aborts (they resolve `undefined` upstream),\n * policy refusals (reducing context would not make the model comply), missing\n * credentials (a configuration fault with an actionable message), and ordinary\n * bugs - destructive context reduction must never be a bug's recovery path.\n */\nfunction isTerminalSummarizationProviderFailure(error: unknown): boolean {\n\tif (error instanceof CredentialFailoverError) return true;\n\tif (error instanceof Error && error.message.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)) return true;\n\treturn error instanceof SummaryRequestError && !error.transient && !error.refused && error.failureKind === undefined;\n}\n\nexport function classifyRequiredCompactionFallbackFailure(\n\terror: unknown,\n): RequiredCompactionFallbackFailure | undefined {\n\tif (\n\t\terror instanceof StreamDurationBudgetError ||\n\t\terror instanceof StreamIdleTimeoutError ||\n\t\terror instanceof SummarizationTotalBudgetError\n\t) {\n\t\treturn \"summarization-timeout\";\n\t}\n\tif (error instanceof SummaryRequestError && error.transient && error.failureKind === \"upstream-stream-truncated\") {\n\t\treturn \"upstream-stream-truncated\";\n\t}\n\tif (error instanceof SummarizationOverflowExhaustedError) {\n\t\treturn \"summarization-overflow-exhausted\";\n\t}\n\tif (error instanceof SummaryGenerationError && error.kind === \"empty-summary\") {\n\t\treturn \"summarization-empty-summary\";\n\t}\n\tif (isTerminalSummarizationProviderFailure(error)) {\n\t\treturn \"summarization-provider-failure\";\n\t}\n\treturn undefined;\n}\n\nexport { stripTurnRetrySuppressionPrefix };\n\nconst FALLBACK_FAILURE_CAUSE: Record<RequiredCompactionFallbackFailure, string> = {\n\t\"summarization-timeout\": \"the summary stream ran out of its time budget\",\n\t\"summarization-provider-failure\": \"the provider ended the summary stream with an error\",\n\t\"upstream-stream-truncated\": \"the provider truncated the summary stream\",\n\t\"summarization-overflow-exhausted\": \"the summary input stayed over the provider's context limit\",\n\t\"summarization-empty-summary\": \"the provider returned no summary text\",\n};\n\n/**\n * What the user is told when a required compaction recovered through the\n * deterministic checkpoint. States the outcome plainly and never carries the\n * internal retry-suppression marker.\n */\nexport function formatRequiredCompactionFallbackNotice(\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tcause?: unknown,\n): string {\n\tconst detail = cause instanceof Error ? stripTurnRetrySuppressionPrefix(cause.message).trim() : \"\";\n\treturn [\n\t\t`Compaction could not complete a provider summary: ${FALLBACK_FAILURE_CAUSE[failureKind]}.`,\n\t\t\"A deterministic checkpoint was applied and older transcript detail was dropped, so it is safe to continue.\",\n\t\tdetail ? `Provider reported: ${capUtf8Bytes(detail, 512)}.` : \"\",\n\t\t\"Run /compact on a different model for a richer summary.\",\n\t]\n\t\t.filter((part) => part.length > 0)\n\t\t.join(\" \");\n}\n\nexport function createRequiredCompactionFallback(\n\tpreparation: CompactionPreparation,\n\tcontextWindow: number,\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tmetadata: RecoveryMetadata,\n\tbranchEntries: SessionEntry[] = [],\n\tdiagnostics?: DeterministicFallbackDiagnostic,\n): CompactionResult<DeterministicFallbackDetails> | undefined {\n\tconst reserveTokens = resolveEffectiveReserveTokens(contextWindow, preparation.settings);\n\tconst budget = contextWindow - reserveTokens;\n\tconst preparedBoundaryIndex = branchEntries.findIndex((entry) => entry.id === preparation.firstKeptEntryId);\n\tif (!preparation.firstKeptEntryId || preparedBoundaryIndex === -1) {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"missing-preparation-boundary\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconst marker = [\n\t\t\"[Deterministic compaction recovery checkpoint]\",\n\t\t\"Generated summarization did not complete, so older context was reduced without another provider request.\",\n\t\t\"Continue from the retained messages after this checkpoint. Treat omitted transcript details as unknown.\",\n\t].join(\"\\n\");\n\tconst taskIntent = metadata.taskIntent?.trim();\n\tconst fixedText = taskIntent ? `${marker}\\n\\nTask intent:\\n${taskIntent}` : marker;\n\tconst maxSummaryBytes = Math.max(1_024, Math.floor(contextWindow * 0.4));\n\tconst previousSummary = preparation.previousSummary?.trim();\n\tlet summary = fixedText;\n\tif (previousSummary) {\n\t\tconst availableBytes = Math.max(0, maxSummaryBytes - Buffer.byteLength(`${fixedText}\\n\\nPrevious checkpoint:\\n`));\n\t\tconst truncationMarker = \"\\n[Older checkpoint truncated]\";\n\t\tconst boundedPrevious =\n\t\t\tBuffer.byteLength(previousSummary) <= availableBytes\n\t\t\t\t? previousSummary\n\t\t\t\t: `${capUtf8Bytes(previousSummary, Math.max(0, availableBytes - Buffer.byteLength(truncationMarker)))}${truncationMarker}`;\n\t\tsummary = `${fixedText}\\n\\nPrevious checkpoint:\\n${boundedPrevious}`;\n\t}\n\n\tconst baseDetails: DeterministicFallbackDetails = {\n\t\tschema: \"senpi.compaction.deterministic-fallback.v1\",\n\t\torigin: \"required-compaction-recovery\",\n\t\tfailureKind,\n\t\t...(taskIntent ? { taskIntent } : {}),\n\t};\n\tlet candidateCount = 0;\n\n\tconst syntheticCompaction: CompactionEntry = {\n\t\ttype: \"compaction\",\n\t\tid: \"__senpi_deterministic_fallback_preview__\",\n\t\tparentId: branchEntries.at(-1)?.id ?? null,\n\t\ttimestamp: new Date(0).toISOString(),\n\t\tsummary,\n\t\tfirstKeptEntryId: branchEntries[0]?.id ?? preparation.firstKeptEntryId,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\tdetails: { ...baseDetails, retainedSuffix: \"prepared\" },\n\t\tfromHook: true,\n\t};\n\n\tlet projectedMessages: ReturnType<typeof filterContextExcludedMessages>;\n\ttry {\n\t\tprojectedMessages = filterContextExcludedMessages(\n\t\t\tbuildSessionContext([...branchEntries, syntheticCompaction]).messages,\n\t\t);\n\t} catch {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"context-reconstruction-failed\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t// Evaluate the candidate the provider would actually receive: `convertToLlm`\n\t// drops failed/aborted assistant turns (and their orphaned tool results) before\n\t// every request, so their dangling toolCall blocks are neither incomplete calls\n\t// nor retained tokens here. Raw session history stays untouched - this mask is\n\t// local to the fallback projection (code-yeongyu/oh-my-openagent#7921).\n\tconst droppedByFailedTurnNormalization = markFailedTurnFragments(projectedMessages);\n\n\tconst messageIndexesByEntryId = new Map<string, number>();\n\tfor (const [index, message] of projectedMessages.entries()) {\n\t\tconst entryId = getSessionContextEntryId(message);\n\t\tif (entryId !== undefined) messageIndexesByEntryId.set(entryId, index);\n\t}\n\tconst summaryIndex = messageIndexesByEntryId.get(syntheticCompaction.id);\n\tconst unsafeSuffix = new Array(projectedMessages.length + 1).fill(false);\n\tconst unsafeIndexSuffix = new Int32Array(projectedMessages.length + 1).fill(-1);\n\tconst tokenSuffix = new Array(projectedMessages.length + 1).fill(0);\n\tconst toolCalls = new Map<string, { indexes: number[]; newestIncomplete: boolean }>();\n\tconst toolResults = new Map<string, number[]>();\n\tfor (let index = projectedMessages.length - 1; index >= 0; index--) {\n\t\tconst message = projectedMessages[index];\n\t\ttokenSuffix[index] = tokenSuffix[index + 1];\n\t\tunsafeIndexSuffix[index] = unsafeIndexSuffix[index + 1];\n\t\tif (droppedByFailedTurnNormalization[index]) {\n\t\t\tunsafeSuffix[index] = unsafeSuffix[index + 1];\n\t\t\tcontinue;\n\t\t}\n\t\tlet messageUnsafe = false;\n\t\tlet serialized: string | undefined;\n\t\ttry {\n\t\t\tmessageUnsafe = hasUnsafeRetainedContent([message]);\n\t\t\tconst bounded = isSafeBoundedValue(message);\n\t\t\tmessageUnsafe ||= !bounded;\n\t\t\tlet imageTokens = 0;\n\t\t\tif (!messageUnsafe && message.role === \"toolResult\") {\n\t\t\t\tconst content = message.content.map((block) => {\n\t\t\t\t\tif (block.type !== \"image\") return block;\n\t\t\t\t\timageTokens += estimateTokens({ ...message, content: [block] });\n\t\t\t\t\treturn { ...block, data: \"\" };\n\t\t\t\t});\n\t\t\t\tserialized = JSON.stringify({ ...message, content });\n\t\t\t} else {\n\t\t\t\tserialized = bounded ? JSON.stringify(message) : undefined;\n\t\t\t}\n\t\t\t// Apply the shared weighted chars/4 estimator to the envelope too.\n\t\t\t// Storage bytes are not tokens; opaque text and image costs still count.\n\t\t\ttokenSuffix[index] +=\n\t\t\t\tserialized === undefined\n\t\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t\t: Math.max(\n\t\t\t\t\t\t\testimateTokens(message),\n\t\t\t\t\t\t\testimateTokens({ role: \"user\", content: serialized, timestamp: 0 }) + imageTokens,\n\t\t\t\t\t\t);\n\t\t} catch {\n\t\t\tmessageUnsafe = true;\n\t\t\ttokenSuffix[index] = Number.POSITIVE_INFINITY;\n\t\t}\n\t\tunsafeSuffix[index] = unsafeSuffix[index + 1] || messageUnsafe;\n\t\tif (messageUnsafe) unsafeIndexSuffix[index] = index;\n\t\tif (!isRecord(message)) continue;\n\t\tif (message.role === \"toolResult\" && typeof message.toolCallId === \"string\") {\n\t\t\tconst indexes = toolResults.get(message.toolCallId) ?? [];\n\t\t\tindexes.push(index);\n\t\t\ttoolResults.set(message.toolCallId, indexes);\n\t\t} else if (message.role === \"assistant\" && Array.isArray(message.content)) {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (!isRecord(block) || block.type !== \"toolCall\" || typeof block.id !== \"string\") continue;\n\t\t\t\tconst call = toolCalls.get(block.id) ?? { indexes: [], newestIncomplete: block.incomplete === true };\n\t\t\t\tcall.indexes.push(index);\n\t\t\t\ttoolCalls.set(block.id, call);\n\t\t\t}\n\t\t}\n\t}\n\tconst invalidToolChainDiff = new Int32Array(projectedMessages.length + 2);\n\tconst markInvalidRange = (start: number, endExclusive: number) => {\n\t\tconst boundedStart = Math.max(0, start);\n\t\tconst boundedEnd = Math.min(projectedMessages.length + 1, endExclusive);\n\t\tif (boundedStart >= boundedEnd) return;\n\t\tinvalidToolChainDiff[boundedStart]++;\n\t\tinvalidToolChainDiff[boundedEnd]--;\n\t};\n\tfor (const [id, call] of toolCalls) {\n\t\tconst results = toolResults.get(id) ?? [];\n\t\tif (results.length === 0) {\n\t\t\tmarkInvalidRange(0, Math.max(call.indexes[0] ?? -1, results[0] ?? -1) + 1);\n\t\t\tcontinue;\n\t\t}\n\t\tconst callIndex = call.indexes[0];\n\t\tconst resultIndex = results[0];\n\t\t// Indexes are newest-first. Older duplicate IDs matter only while retained;\n\t\t// dropping an entire historical pair leaves the newest pair valid.\n\t\tmarkInvalidRange(0, Math.max(call.indexes[1] ?? -1, results[1] ?? -1) + 1);\n\t\tif (call.newestIncomplete || callIndex >= resultIndex) {\n\t\t\tmarkInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t\t} else {\n\t\t\tmarkInvalidRange(callIndex + 1, resultIndex + 1);\n\t\t}\n\t}\n\tfor (const [id, results] of toolResults) {\n\t\tif (toolCalls.has(id)) continue;\n\t\tmarkInvalidRange(0, results[0] + 1);\n\t}\n\tconst toolChainValidAt = new Array(projectedMessages.length + 1).fill(true);\n\tlet invalidToolChainCount = 0;\n\tfor (let index = 0; index < toolChainValidAt.length; index++) {\n\t\tinvalidToolChainCount += invalidToolChainDiff[index];\n\t\ttoolChainValidAt[index] = invalidToolChainCount === 0;\n\t}\n\n\tconst projectCandidate = (\n\t\tfirstKeptEntryId: string,\n\t\tretainedSuffix: NonNullable<DeterministicFallbackDetails[\"retainedSuffix\"]>,\n\t): CompactionResult<DeterministicFallbackDetails> | undefined => {\n\t\tcandidateCount++;\n\t\tconst details = { ...baseDetails, retainedSuffix };\n\t\tconst reject = (\n\t\t\trejectionReason: DeterministicFallbackRejectionReason,\n\t\t\tdetail: Omit<\n\t\t\t\tNonNullable<DeterministicFallbackDiagnostic[\"candidateRejections\"]>[number],\n\t\t\t\t\"firstKeptEntryId\" | \"rejectionReason\"\n\t\t\t> = {},\n\t\t): undefined => {\n\t\t\tif (diagnostics) {\n\t\t\t\tdiagnostics.rejectionReason = rejectionReason;\n\t\t\t\tdiagnostics.contextWindow = contextWindow;\n\t\t\t\tdiagnostics.reserveTokens = reserveTokens;\n\t\t\t\tdiagnostics.budgetTokens = budget;\n\t\t\t\tdiagnostics.candidateRejections ??= [];\n\t\t\t\tdiagnostics.candidateRejections.push({ firstKeptEntryId, rejectionReason, ...detail });\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\t\tconst result: CompactionResult<DeterministicFallbackDetails> = {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\tdetails,\n\t\t};\n\t\tconst startIndex = messageIndexesByEntryId.get(firstKeptEntryId);\n\t\tif (startIndex === undefined) return reject(\"context-reconstruction-failed\");\n\t\tconst retainedStart = Math.min(startIndex, projectedMessages.length);\n\t\tif (unsafeSuffix[retainedStart]) {\n\t\t\tconst unsafeMessageIndex = unsafeIndexSuffix[retainedStart];\n\t\t\tconst unsafeMessage = projectedMessages[unsafeMessageIndex];\n\t\t\treturn reject(\"unsafe-retained-content\", {\n\t\t\t\tunsafeMessageIndex,\n\t\t\t\tunsafeEntryId: getSessionContextEntryId(unsafeMessage),\n\t\t\t\tunsafeMessageRole: unsafeMessage.role,\n\t\t\t});\n\t\t}\n\t\tif (!toolChainValidAt[retainedStart]) return reject(\"atomic-tool-chain-cut\");\n\t\t// The hard-limit valve reserves the scaled budget, so accepting against the raw\n\t\t// configured reserve would admit a context that valve immediately compacts again.\n\t\tconst summaryTokens =\n\t\t\tsummaryIndex === undefined\n\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t: Math.max(\n\t\t\t\t\t\testimateTokens(projectedMessages[summaryIndex]),\n\t\t\t\t\t\testimateTokens({\n\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\tcontent: JSON.stringify(projectedMessages[summaryIndex]),\n\t\t\t\t\t\t\ttimestamp: 0,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\tconst retainedTokens = (tokenSuffix[retainedStart] ?? Number.POSITIVE_INFINITY) + summaryTokens;\n\t\tif (retainedTokens > budget) {\n\t\t\tif (diagnostics) diagnostics.budgetExceeded = true;\n\t\t\treturn reject(\"retained-token-budget-exceeded\", { estimatedTokens: retainedTokens });\n\t\t}\n\t\treturn { ...result, estimatedTokensAfter: retainedTokens };\n\t};\n\n\t// 1. Try prepared boundary\n\tconst prepared = projectCandidate(preparation.firstKeptEntryId, \"prepared\");\n\tif (prepared) {\n\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\treturn prepared;\n\t}\n\n\t// 2. If prepared boundary cut an atomic signed chain or was rejected, walk backward\n\t// to the actual chain boundary. The chain length is determined by the session.\n\tfor (let index = preparedBoundaryIndex - 1; index >= 0; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (entry.type === \"compaction\") break;\n\t\t// Only consider message turn starts or assistant call starts\n\t\tconst earlier = projectCandidate(entry.id, \"earlier-safe-boundary\");\n\t\tif (earlier) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn earlier;\n\t\t}\n\t}\n\n\t// 3. Try latest meaningful user turn\n\tfor (let index = branchEntries.length - 1; index > preparedBoundaryIndex; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (!hasMeaningfulUserText(entry)) continue;\n\t\tconst latestUser = projectCandidate(entry.id, \"latest-user-turn\");\n\t\tif (latestUser) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn latestUser;\n\t\t}\n\t\t// A steering user message can occur inside a tool chain. Keep that request\n\t\t// and walk back to its declaring assistant instead of orphaning the result.\n\t\tfor (let earlierIndex = index - 1; earlierIndex > preparedBoundaryIndex; earlierIndex--) {\n\t\t\tconst earlierEntry = branchEntries[earlierIndex];\n\t\t\tif (earlierEntry.type === \"compaction\") break;\n\t\t\tconst earlier = projectCandidate(earlierEntry.id, \"earlier-safe-boundary\");\n\t\t\tif (earlier) {\n\t\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\t\treturn earlier;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\treturn undefined;\n}\n"]}
|
|
@@ -8,7 +8,7 @@ const APPLY_PATCH_JSON_APIS = new Set(["openai-completions"]);
|
|
|
8
8
|
const EDIT_TOOL_NAMES = new Set(["write", "edit"]);
|
|
9
9
|
const APPLY_PATCH_NAME = "apply_patch";
|
|
10
10
|
function isGptId(model) {
|
|
11
|
-
return model
|
|
11
|
+
return model !== undefined && /(?:^|[/@:._-])gpt(?:[._-]|\d)/i.test(model.id);
|
|
12
12
|
}
|
|
13
13
|
export function getApplyPatchWireMode(model) {
|
|
14
14
|
if (!isGptId(model))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { createApplyPatchTool } from \"./tool.ts\";\nimport type {\n\tApplyPatchExtensionAPI,\n\tApplyPatchToolsetState,\n\tApplyPatchToolVariant,\n\tApplyPatchWireMode,\n} from \"./types.ts\";\n\nconst APPLY_PATCH_FREEFORM_APIS = new Set<Api>([\n\t\"openai-responses\",\n\t\"azure-openai-responses\",\n\t\"openai-codex-responses\",\n]);\nconst APPLY_PATCH_JSON_APIS = new Set<Api>([\"openai-completions\"]);\nconst EDIT_TOOL_NAMES = new Set([\"write\", \"edit\"]);\nconst APPLY_PATCH_NAME = \"apply_patch\";\n\nfunction isGptId(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): model is Pick<Model<string>, \"api\" | \"id\"> {\n\treturn model?.id.startsWith(\"gpt-\") ?? false;\n}\n\nexport function getApplyPatchWireMode(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): ApplyPatchWireMode {\n\tif (!isGptId(model)) return \"none\";\n\tif (APPLY_PATCH_FREEFORM_APIS.has(model.api)) return \"freeform\";\n\tif (APPLY_PATCH_JSON_APIS.has(model.api)) return \"json\";\n\treturn \"none\";\n}\n\nexport function isOpenAIGptModel(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): boolean {\n\treturn getApplyPatchWireMode(model) === \"freeform\";\n}\n\nfunction hasEditTools(toolNames: string[]): boolean {\n\treturn toolNames.some((toolName) => EDIT_TOOL_NAMES.has(toolName));\n}\n\nfunction withoutApplyPatch(toolNames: string[]): string[] {\n\treturn toolNames.filter((toolName) => toolName !== APPLY_PATCH_NAME);\n}\n\nfunction replaceEditToolsWithApplyPatch(toolNames: string[]): string[] {\n\tconst hadApplyPatch = toolNames.includes(APPLY_PATCH_NAME);\n\tconst insertIndex = toolNames.findIndex(\n\t\t(toolName) => EDIT_TOOL_NAMES.has(toolName) || toolName === APPLY_PATCH_NAME,\n\t);\n\tconst filteredToolNames = withoutApplyPatch(toolNames).filter((toolName) => !EDIT_TOOL_NAMES.has(toolName));\n\tif (!hasEditTools(toolNames) && !hadApplyPatch) return filteredToolNames;\n\tconst at = insertIndex === -1 ? filteredToolNames.length : Math.min(insertIndex, filteredToolNames.length);\n\treturn [...filteredToolNames.slice(0, at), APPLY_PATCH_NAME, ...filteredToolNames.slice(at)];\n}\n\nfunction hasApplyPatchFailures(details: unknown): boolean {\n\tif (typeof details !== \"object\" || details === null) return false;\n\tconst result = Reflect.get(details, \"result\");\n\tif (typeof result !== \"object\" || result === null) return false;\n\tconst failures = Reflect.get(result, \"failures\");\n\treturn Array.isArray(failures) && failures.length > 0;\n}\n\nfunction syncToolset(\n\tpi: ApplyPatchExtensionAPI,\n\tmodel: Model<string> | undefined,\n\tstate: ApplyPatchToolsetState & {\n\t\tactiveVariant?: ApplyPatchToolVariant;\n\t\twireMode: ApplyPatchWireMode;\n\t},\n\tvariants: Readonly<Record<ApplyPatchToolVariant, ReturnType<typeof createApplyPatchTool>>>,\n): void {\n\tconst mode = getApplyPatchWireMode(model);\n\tstate.wireMode = mode;\n\tconst currentToolNames = pi.getActiveTools();\n\tif (mode !== \"none\") {\n\t\tif (state.activeVariant !== mode) {\n\t\t\tpi.registerTool(variants[mode]);\n\t\t\tstate.activeVariant = mode;\n\t\t}\n\t\tconst activeEdit = currentToolNames.filter((toolName) => EDIT_TOOL_NAMES.has(toolName));\n\t\tif (activeEdit.length > 0) state.removedEditToolNames = activeEdit;\n\t\tpi.setActiveTools(replaceEditToolsWithApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tif (state.removedEditToolNames.length === 0) {\n\t\tif (currentToolNames.includes(APPLY_PATCH_NAME)) pi.setActiveTools(withoutApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tconst registeredNames = new Set(pi.getAllTools().map((tool) => tool.name));\n\tconst restorable = state.removedEditToolNames.filter((toolName) => registeredNames.has(toolName));\n\tconst restored = [...withoutApplyPatch(currentToolNames), ...restorable];\n\tstate.removedEditToolNames = [];\n\tpi.setActiveTools([...new Set(restored)]);\n}\n\nfunction registerApplyPatchLazyActivator(\n\tpi: ApplyPatchExtensionAPI,\n\tstate: { readonly wireMode: ApplyPatchWireMode },\n): void {\n\tpi.registerLazyToolActivator?.((toolName) => {\n\t\tif (toolName !== APPLY_PATCH_NAME || state.wireMode === \"none\") return false;\n\t\tconst activeToolNames = pi.getActiveTools();\n\t\tif (activeToolNames.includes(APPLY_PATCH_NAME)) return false;\n\t\tpi.setActiveTools([...activeToolNames, APPLY_PATCH_NAME]);\n\t\treturn true;\n\t});\n}\n\nexport function registerApplyPatchExtension(pi: ApplyPatchExtensionAPI): void {\n\tconst state: ApplyPatchToolsetState & {\n\t\tactiveVariant?: ApplyPatchToolVariant;\n\t\twireMode: ApplyPatchWireMode;\n\t} = { removedEditToolNames: [], wireMode: \"none\" };\n\tconst variants = {\n\t\tfreeform: createApplyPatchTool(\"freeform\"),\n\t\tjson: createApplyPatchTool(\"json\"),\n\t} as const;\n\tstate.activeVariant = \"freeform\";\n\tpi.registerTool(variants.freeform);\n\tregisterApplyPatchLazyActivator(pi, state);\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== APPLY_PATCH_NAME || event.isError || !hasApplyPatchFailures(event.details)) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { isError: true };\n\t});\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncToolset(pi, ctx.model, state, variants);\n\t});\n\tpi.on(\"model_select\", async (event) => {\n\t\tsyncToolset(pi, event.model, state, variants);\n\t});\n}\n\nexport default registerApplyPatchExtension;\n"]}
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { createApplyPatchTool } from \"./tool.ts\";\nimport type {\n\tApplyPatchExtensionAPI,\n\tApplyPatchToolsetState,\n\tApplyPatchToolVariant,\n\tApplyPatchWireMode,\n} from \"./types.ts\";\n\nconst APPLY_PATCH_FREEFORM_APIS = new Set<Api>([\n\t\"openai-responses\",\n\t\"azure-openai-responses\",\n\t\"openai-codex-responses\",\n]);\nconst APPLY_PATCH_JSON_APIS = new Set<Api>([\"openai-completions\"]);\nconst EDIT_TOOL_NAMES = new Set([\"write\", \"edit\"]);\nconst APPLY_PATCH_NAME = \"apply_patch\";\n\nfunction isGptId(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): model is Pick<Model<string>, \"api\" | \"id\"> {\n\treturn model !== undefined && /(?:^|[/@:._-])gpt(?:[._-]|\\d)/i.test(model.id);\n}\n\nexport function getApplyPatchWireMode(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): ApplyPatchWireMode {\n\tif (!isGptId(model)) return \"none\";\n\tif (APPLY_PATCH_FREEFORM_APIS.has(model.api)) return \"freeform\";\n\tif (APPLY_PATCH_JSON_APIS.has(model.api)) return \"json\";\n\treturn \"none\";\n}\n\nexport function isOpenAIGptModel(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): boolean {\n\treturn getApplyPatchWireMode(model) === \"freeform\";\n}\n\nfunction hasEditTools(toolNames: string[]): boolean {\n\treturn toolNames.some((toolName) => EDIT_TOOL_NAMES.has(toolName));\n}\n\nfunction withoutApplyPatch(toolNames: string[]): string[] {\n\treturn toolNames.filter((toolName) => toolName !== APPLY_PATCH_NAME);\n}\n\nfunction replaceEditToolsWithApplyPatch(toolNames: string[]): string[] {\n\tconst hadApplyPatch = toolNames.includes(APPLY_PATCH_NAME);\n\tconst insertIndex = toolNames.findIndex(\n\t\t(toolName) => EDIT_TOOL_NAMES.has(toolName) || toolName === APPLY_PATCH_NAME,\n\t);\n\tconst filteredToolNames = withoutApplyPatch(toolNames).filter((toolName) => !EDIT_TOOL_NAMES.has(toolName));\n\tif (!hasEditTools(toolNames) && !hadApplyPatch) return filteredToolNames;\n\tconst at = insertIndex === -1 ? filteredToolNames.length : Math.min(insertIndex, filteredToolNames.length);\n\treturn [...filteredToolNames.slice(0, at), APPLY_PATCH_NAME, ...filteredToolNames.slice(at)];\n}\n\nfunction hasApplyPatchFailures(details: unknown): boolean {\n\tif (typeof details !== \"object\" || details === null) return false;\n\tconst result = Reflect.get(details, \"result\");\n\tif (typeof result !== \"object\" || result === null) return false;\n\tconst failures = Reflect.get(result, \"failures\");\n\treturn Array.isArray(failures) && failures.length > 0;\n}\n\nfunction syncToolset(\n\tpi: ApplyPatchExtensionAPI,\n\tmodel: Model<string> | undefined,\n\tstate: ApplyPatchToolsetState & {\n\t\tactiveVariant?: ApplyPatchToolVariant;\n\t\twireMode: ApplyPatchWireMode;\n\t},\n\tvariants: Readonly<Record<ApplyPatchToolVariant, ReturnType<typeof createApplyPatchTool>>>,\n): void {\n\tconst mode = getApplyPatchWireMode(model);\n\tstate.wireMode = mode;\n\tconst currentToolNames = pi.getActiveTools();\n\tif (mode !== \"none\") {\n\t\tif (state.activeVariant !== mode) {\n\t\t\tpi.registerTool(variants[mode]);\n\t\t\tstate.activeVariant = mode;\n\t\t}\n\t\tconst activeEdit = currentToolNames.filter((toolName) => EDIT_TOOL_NAMES.has(toolName));\n\t\tif (activeEdit.length > 0) state.removedEditToolNames = activeEdit;\n\t\tpi.setActiveTools(replaceEditToolsWithApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tif (state.removedEditToolNames.length === 0) {\n\t\tif (currentToolNames.includes(APPLY_PATCH_NAME)) pi.setActiveTools(withoutApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tconst registeredNames = new Set(pi.getAllTools().map((tool) => tool.name));\n\tconst restorable = state.removedEditToolNames.filter((toolName) => registeredNames.has(toolName));\n\tconst restored = [...withoutApplyPatch(currentToolNames), ...restorable];\n\tstate.removedEditToolNames = [];\n\tpi.setActiveTools([...new Set(restored)]);\n}\n\nfunction registerApplyPatchLazyActivator(\n\tpi: ApplyPatchExtensionAPI,\n\tstate: { readonly wireMode: ApplyPatchWireMode },\n): void {\n\tpi.registerLazyToolActivator?.((toolName) => {\n\t\tif (toolName !== APPLY_PATCH_NAME || state.wireMode === \"none\") return false;\n\t\tconst activeToolNames = pi.getActiveTools();\n\t\tif (activeToolNames.includes(APPLY_PATCH_NAME)) return false;\n\t\tpi.setActiveTools([...activeToolNames, APPLY_PATCH_NAME]);\n\t\treturn true;\n\t});\n}\n\nexport function registerApplyPatchExtension(pi: ApplyPatchExtensionAPI): void {\n\tconst state: ApplyPatchToolsetState & {\n\t\tactiveVariant?: ApplyPatchToolVariant;\n\t\twireMode: ApplyPatchWireMode;\n\t} = { removedEditToolNames: [], wireMode: \"none\" };\n\tconst variants = {\n\t\tfreeform: createApplyPatchTool(\"freeform\"),\n\t\tjson: createApplyPatchTool(\"json\"),\n\t} as const;\n\tstate.activeVariant = \"freeform\";\n\tpi.registerTool(variants.freeform);\n\tregisterApplyPatchLazyActivator(pi, state);\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== APPLY_PATCH_NAME || event.isError || !hasApplyPatchFailures(event.details)) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { isError: true };\n\t});\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncToolset(pi, ctx.model, state, variants);\n\t});\n\tpi.on(\"model_select\", async (event) => {\n\t\tsyncToolset(pi, event.model, state, variants);\n\t});\n}\n\nexport default registerApplyPatchExtension;\n"]}
|
|
@@ -5,6 +5,5 @@ export interface McpToolNameEntry {
|
|
|
5
5
|
export declare const MCP_TOOL_NAME_MAX_LENGTH = 64;
|
|
6
6
|
type WarnFn = (message: string) => void;
|
|
7
7
|
export declare function buildMcpToolNames(entries: readonly McpToolNameEntry[], warn?: WarnFn): string[];
|
|
8
|
-
export declare function buildMcpToolName(entry: McpToolNameEntry): string;
|
|
9
8
|
export {};
|
|
10
9
|
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B/F
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B/F"}
|
|
@@ -28,9 +28,6 @@ export function buildMcpToolNames(entries, warn) {
|
|
|
28
28
|
}
|
|
29
29
|
return names;
|
|
30
30
|
}
|
|
31
|
-
export function buildMcpToolName(entry) {
|
|
32
|
-
return ellipsizeMiddle(buildBaseName(entry), MCP_TOOL_NAME_MAX_LENGTH);
|
|
33
|
-
}
|
|
34
31
|
function buildBaseName(entry) {
|
|
35
32
|
return `mcp_${sanitizeNamePart(entry.serverName)}_${sanitizeNamePart(entry.toolName)}`;
|
|
36
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAI3C,MAAM,UAAU,iBAAiB,CAAC,OAAoC,EAAE,IAAa;IACpF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,wBAAwB,CAAC;QACrE,KAAK;QACL,KAAK;KACL,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,EAAE,CAAC,oDAAoD,KAAK,CAAC,IAAI,qCAAqC,CAAC,CAAC;QAC5G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;QACxG,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport interface McpToolNameEntry {\n\tserverName: string;\n\ttoolName: string;\n}\n\nexport const MCP_TOOL_NAME_MAX_LENGTH = 64;\n\ntype WarnFn = (message: string) => void;\n\nexport function buildMcpToolNames(entries: readonly McpToolNameEntry[], warn?: WarnFn): string[] {\n\tconst items = entries.map((entry, index) => ({\n\t\tbase: ellipsizeMiddle(buildBaseName(entry), MCP_TOOL_NAME_MAX_LENGTH),\n\t\tentry,\n\t\tindex,\n\t}));\n\tconst groups = new Map<string, typeof items>();\n\tfor (const item of items) {\n\t\tconst key = matcherKey(item.base);\n\t\tconst group = groups.get(key) ?? [];\n\t\tgroup.push(item);\n\t\tgroups.set(key, group);\n\t}\n\n\tconst names = items.map((item) => item.base);\n\tfor (const group of groups.values()) {\n\t\tif (group.length < 2) continue;\n\t\tconst [first] = group;\n\t\tif (!first) continue;\n\t\twarn?.(`MCP tool name collision after normalization for '${first.base}'; appended deterministic suffixes.`);\n\t\tfor (const item of group) {\n\t\t\tconst suffix = hashSuffix(item.entry);\n\t\t\tnames[item.index] = `${ellipsizeMiddle(item.base, MCP_TOOL_NAME_MAX_LENGTH - suffix.length)}${suffix}`;\n\t\t}\n\t}\n\treturn names;\n}\n\nfunction buildBaseName(entry: McpToolNameEntry): string {\n\treturn `mcp_${sanitizeNamePart(entry.serverName)}_${sanitizeNamePart(entry.toolName)}`;\n}\n\nfunction sanitizeNamePart(name: string): string {\n\treturn name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction matcherKey(name: string): string {\n\treturn name.replace(/-/g, \"_\");\n}\n\nfunction hashSuffix(entry: McpToolNameEntry): string {\n\treturn `_${createHash(\"sha1\").update(`${entry.serverName}\\0${entry.toolName}`).digest(\"hex\").slice(0, 4)}`;\n}\n\nfunction ellipsizeMiddle(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) return value;\n\tif (maxLength <= 3) return value.slice(0, maxLength);\n\tconst marker = \"...\";\n\tconst remaining = maxLength - marker.length;\n\tconst prefixLength = Math.ceil(remaining / 2);\n\tconst suffixLength = Math.floor(remaining / 2);\n\treturn `${value.slice(0, prefixLength)}${marker}${value.slice(value.length - suffixLength)}`;\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { Progress } from "@modelcontextprotocol/sdk/types.js";
|
|
3
3
|
import type { TSchema } from "typebox";
|
|
4
|
-
import type {
|
|
4
|
+
import type { ToolDefinition } from "../../../types.ts";
|
|
5
5
|
import type { McpToolCatalogEntry } from "../catalog.ts";
|
|
6
6
|
export interface McpToolDetails {
|
|
7
7
|
server: string;
|
|
@@ -14,7 +14,6 @@ type WarnFn = (message: string) => void;
|
|
|
14
14
|
export interface McpCatalogRegistrationOptions {
|
|
15
15
|
readonly refreshActiveSetWhenEmpty?: boolean;
|
|
16
16
|
}
|
|
17
|
-
export declare function registerMcpCatalogTools(pi: Pick<ExtensionAPI, "getActiveTools" | "setActiveTools" | "registerTool">, entries: readonly McpToolCatalogEntry[], activeEntries: readonly McpToolCatalogEntry[], warn?: WarnFn, options?: McpCatalogRegistrationOptions): void;
|
|
18
17
|
export interface McpNamedCatalogEntry {
|
|
19
18
|
readonly entry: McpToolCatalogEntry;
|
|
20
19
|
readonly name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAczD,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACpB;AAGD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;AAC7F,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED;;4BAE4B;AAC5B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAOjH;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAEnH;AA2BD;4EAC4E;AAC5E,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GACnD,OAAO,CAAC,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC,CAetD"}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { Text } from "@earendil-works/pi-tui";
|
|
2
|
-
import { registerToolsPreservingActiveSet } from "../active-set.js";
|
|
3
2
|
import { ToolExecError } from "../errors.js";
|
|
4
3
|
import { applyMcpOutputGuard } from "../guard/output-guard.js";
|
|
5
4
|
import { ensureMcpToolCallConnection, withMcpRetriableFailedSendRetry, withMcpSessionExpiryRetry } from "../health.js";
|
|
6
5
|
import { runMcpConnectionLifecycleCall } from "../idle.js";
|
|
7
6
|
import { buildMcpToolNames, convertJsonSchemaToTypeBox, mapMcpToolResult, } from "./schema-compat.js";
|
|
8
|
-
export function registerMcpCatalogTools(pi, entries, activeEntries, warn, options = {}) {
|
|
9
|
-
if (entries.length === 0 && activeEntries.length === 0 && options.refreshActiveSetWhenEmpty !== true)
|
|
10
|
-
return;
|
|
11
|
-
const tools = buildMcpToolDefinitions(entries, warn);
|
|
12
|
-
const currentActive = pi.getActiveTools().filter((name) => !name.startsWith("mcp_"));
|
|
13
|
-
const mcpNames = buildActiveToolNames(entries, activeEntries, warn);
|
|
14
|
-
registerToolsPreservingActiveSet(pi, tools, [...currentActive, ...mcpNames]);
|
|
15
|
-
}
|
|
16
7
|
/** Pair each catalog entry with its stable, collision-resolved mcp tool name.
|
|
17
8
|
* Shared by the full-tool builder and the Tier-B search catalog so names never
|
|
18
9
|
* drift between the two. */
|
|
@@ -144,16 +135,4 @@ function truncatePreview(value) {
|
|
|
144
135
|
function compareCatalogEntries(left, right) {
|
|
145
136
|
return left.server.localeCompare(right.server) || left.tool.localeCompare(right.tool);
|
|
146
137
|
}
|
|
147
|
-
function buildActiveToolNames(entries, activeEntries, warn) {
|
|
148
|
-
const activeKeys = new Set(activeEntries.map(catalogEntryKey));
|
|
149
|
-
const sorted = [...entries].sort(compareCatalogEntries);
|
|
150
|
-
const names = buildMcpToolNames(sorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })), warn);
|
|
151
|
-
return sorted
|
|
152
|
-
.map((entry, index) => (activeKeys.has(catalogEntryKey(entry)) ? (names[index] ?? "") : ""))
|
|
153
|
-
.filter((name) => name.length > 0)
|
|
154
|
-
.sort();
|
|
155
|
-
}
|
|
156
|
-
function catalogEntryKey(entry) {
|
|
157
|
-
return `${entry.server}\0${entry.tool}`;
|
|
158
|
-
}
|
|
159
138
|
//# sourceMappingURL=register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { Progress } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { TSchema } from \"typebox\";\nimport type { ExtensionAPI, ToolDefinition } from \"../../../types.ts\";\nimport { registerToolsPreservingActiveSet } from \"../active-set.ts\";\nimport type { McpToolCatalogEntry } from \"../catalog.ts\";\nimport { ToolExecError } from \"../errors.ts\";\nimport { applyMcpOutputGuard } from \"../guard/output-guard.ts\";\nimport { ensureMcpToolCallConnection, withMcpRetriableFailedSendRetry, withMcpSessionExpiryRetry } from \"../health.ts\";\nimport { runMcpConnectionLifecycleCall } from \"../idle.ts\";\nimport {\n\tbuildMcpToolNames,\n\tconvertJsonSchemaToTypeBox,\n\ttype McpContentBlock,\n\ttype McpMappedContentBlock,\n\ttype McpToolResultLike,\n\tmapMcpToolResult,\n} from \"./schema-compat.ts\";\n\nexport interface McpToolDetails {\n\tserver: string;\n\ttool: string;\n\tpreview?: string;\n\tprogress?: Progress;\n}\n\ntype McpAgentContent = TextContent | ImageContent;\nexport type McpToolDefinition = ToolDefinition<TSchema, McpToolDetails | undefined, unknown>;\ntype WarnFn = (message: string) => void;\n\nexport interface McpCatalogRegistrationOptions {\n\treadonly refreshActiveSetWhenEmpty?: boolean;\n}\n\nexport function registerMcpCatalogTools(\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tentries: readonly McpToolCatalogEntry[],\n\tactiveEntries: readonly McpToolCatalogEntry[],\n\twarn?: WarnFn,\n\toptions: McpCatalogRegistrationOptions = {},\n): void {\n\tif (entries.length === 0 && activeEntries.length === 0 && options.refreshActiveSetWhenEmpty !== true) return;\n\tconst tools = buildMcpToolDefinitions(entries, warn);\n\tconst currentActive = pi.getActiveTools().filter((name) => !name.startsWith(\"mcp_\"));\n\tconst mcpNames = buildActiveToolNames(entries, activeEntries, warn);\n\tregisterToolsPreservingActiveSet(pi, tools, [...currentActive, ...mcpNames]);\n}\n\nexport interface McpNamedCatalogEntry {\n\treadonly entry: McpToolCatalogEntry;\n\treadonly name: string;\n}\n\n/** Pair each catalog entry with its stable, collision-resolved mcp tool name.\n * Shared by the full-tool builder and the Tier-B search catalog so names never\n * drift between the two. */\nexport function mapMcpCatalogNames(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpNamedCatalogEntry[] {\n\tconst sorted = [...entries].sort(compareCatalogEntries);\n\tconst names = buildMcpToolNames(\n\t\tsorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })),\n\t\twarn,\n\t);\n\treturn sorted.map((entry, index) => ({ entry, name: names[index] ?? \"\" }));\n}\n\nexport function buildMcpToolDefinitions(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpToolDefinition[] {\n\treturn mapMcpCatalogNames(entries, warn).map(({ entry, name }) => createMcpToolDefinition(entry, name));\n}\n\nfunction createMcpToolDefinition(entry: McpToolCatalogEntry, name: string): McpToolDefinition {\n\tconst converted = convertJsonSchemaToTypeBox(entry.schema);\n\tconst label = `${entry.server}/${entry.tool}`;\n\treturn {\n\t\tname,\n\t\tlabel,\n\t\tdescription: entry.description ?? `MCP tool ${label}`,\n\t\tparameters: converted.schema,\n\t\texecutionMode: \"parallel\",\n\t\tasync execute(_toolCallId, params, signal, onUpdate): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\t\t\tconst args: Record<string, unknown> = isRecord(params) ? params : {};\n\t\t\treturn await executeMcpCatalogEntry(entry, args, signal, onUpdate);\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(`${name} ${previewArgs(args)}`.trim())), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme) {\n\t\t\tconst title = options.isPartial\n\t\t\t\t? `${name}: running`\n\t\t\t\t: `${name}: ${result.details?.preview ?? \"(empty result)\"}`;\n\t\t\treturn new Text(theme.fg(\"toolOutput\", title), 0, 0);\n\t\t},\n\t};\n}\n\n/** Full guarded call path for one catalog entry (lifecycle + retry + output\n * guard). Shared by direct/search tool definitions and the Tier-C proxy. */\nexport async function executeMcpCatalogEntry(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\tconst label = `${entry.server}/${entry.tool}`;\n\tconst result = await callMcpTool(entry, args, signal, onUpdate, label);\n\tconst mapped = mapMcpToolResult(normalizeCallToolResult(result));\n\tif (!mapped.ok) {\n\t\tthrow new ToolExecError(mapped.error.message, { phase: \"call\", serverName: entry.server });\n\t}\n\tconst guarded = await applyMcpOutputGuard(mapped.content, {\n\t\tagentDir: entry.agentDir,\n\t\tartifacts: entry.artifacts,\n\t\toutputGuard: entry.outputGuard,\n\t\tserver: entry.server,\n\t});\n\tconst content = toAgentContent(guarded);\n\treturn { content, details: { preview: previewContent(content), server: entry.server, tool: entry.tool } };\n}\n\nasync function callMcpTool(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n\tlabel: string,\n): Promise<Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>> {\n\ttry {\n\t\treturn await runMcpConnectionLifecycleCall(entry.connection, () =>\n\t\t\twithMcpSessionExpiryRetry(entry.connection, async () => {\n\t\t\t\tawait ensureMcpToolCallConnection(entry.connection, entry.ensureFresh);\n\t\t\t\tawait entry.ensureConnected?.();\n\t\t\t\treturn await withMcpRetriableFailedSendRetry(entry.connection, async () => {\n\t\t\t\t\treturn await entry.connection.client.callTool({ name: entry.tool, arguments: args }, undefined, {\n\t\t\t\t\t\tonprogress: (progress) => {\n\t\t\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: formatProgress(label, progress) }],\n\t\t\t\t\t\t\t\tdetails: { progress, server: entry.server, tool: entry.tool },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\ttimeout: entry.requestTimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t} catch (error) {\n\t\tthrow new ToolExecError(`ToolExecError: ${errorLabel(error)}`, {\n\t\t\tcause: error,\n\t\t\tphase: \"call\",\n\t\t\tserverName: entry.server,\n\t\t});\n\t}\n}\n\nfunction normalizeCallToolResult(\n\tresult: Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>,\n): McpToolResultLike {\n\tif (\"content\" in result || \"structuredContent\" in result || \"isError\" in result) {\n\t\tconst candidate = result as Record<string, unknown>;\n\t\tconst normalized: McpToolResultLike = {};\n\t\tif (isMcpContentBlockArray(candidate.content)) normalized.content = candidate.content;\n\t\tif (typeof candidate.isError === \"boolean\") normalized.isError = candidate.isError;\n\t\tif (\"structuredContent\" in candidate) normalized.structuredContent = candidate.structuredContent;\n\t\treturn normalized;\n\t}\n\treturn { structuredContent: result.toolResult };\n}\n\nfunction isMcpContentBlockArray(value: unknown): value is McpContentBlock[] {\n\treturn Array.isArray(value);\n}\n\nfunction toAgentContent(blocks: readonly McpMappedContentBlock[]): McpAgentContent[] {\n\treturn blocks.map((block) => {\n\t\tif (block.type === \"text\" || block.type === \"image\") return block;\n\t\treturn { type: \"text\", text: JSON.stringify(block) };\n\t});\n}\n\nfunction previewContent(content: readonly McpAgentContent[]): string {\n\treturn truncatePreview(\n\t\tcontent\n\t\t\t.map((block) => (block.type === \"text\" ? block.text : `[${block.mimeType} image]`))\n\t\t\t.join(\" \")\n\t\t\t.trim() || \"(empty result)\",\n\t);\n}\n\nfunction previewArgs(args: unknown): string {\n\tconst text = JSON.stringify(args);\n\treturn text === undefined ? \"\" : truncatePreview(text);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorLabel(error: unknown): string {\n\treturn error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n}\n\nfunction formatProgress(label: string, progress: Progress): string {\n\tconst total = progress.total === undefined ? \"\" : `/${progress.total}`;\n\tconst message = progress.message === undefined ? \"\" : ` ${progress.message}`;\n\treturn `${label} progress ${progress.progress}${total}${message}`.trim();\n}\n\nfunction truncatePreview(value: string): string {\n\treturn value.length <= 120 ? value : `${value.slice(0, 117)}...`;\n}\n\nfunction compareCatalogEntries(left: McpToolCatalogEntry, right: McpToolCatalogEntry): number {\n\treturn left.server.localeCompare(right.server) || left.tool.localeCompare(right.tool);\n}\n\nfunction buildActiveToolNames(\n\tentries: readonly McpToolCatalogEntry[],\n\tactiveEntries: readonly McpToolCatalogEntry[],\n\twarn?: WarnFn,\n): string[] {\n\tconst activeKeys = new Set(activeEntries.map(catalogEntryKey));\n\tconst sorted = [...entries].sort(compareCatalogEntries);\n\tconst names = buildMcpToolNames(\n\t\tsorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })),\n\t\twarn,\n\t);\n\treturn sorted\n\t\t.map((entry, index) => (activeKeys.has(catalogEntryKey(entry)) ? (names[index] ?? \"\") : \"\"))\n\t\t.filter((name) => name.length > 0)\n\t\t.sort();\n}\n\nfunction catalogEntryKey(entry: McpToolCatalogEntry): string {\n\treturn `${entry.server}\\0${entry.tool}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { Progress } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { TSchema } from \"typebox\";\nimport type { ToolDefinition } from \"../../../types.ts\";\nimport type { McpToolCatalogEntry } from \"../catalog.ts\";\nimport { ToolExecError } from \"../errors.ts\";\nimport { applyMcpOutputGuard } from \"../guard/output-guard.ts\";\nimport { ensureMcpToolCallConnection, withMcpRetriableFailedSendRetry, withMcpSessionExpiryRetry } from \"../health.ts\";\nimport { runMcpConnectionLifecycleCall } from \"../idle.ts\";\nimport {\n\tbuildMcpToolNames,\n\tconvertJsonSchemaToTypeBox,\n\ttype McpContentBlock,\n\ttype McpMappedContentBlock,\n\ttype McpToolResultLike,\n\tmapMcpToolResult,\n} from \"./schema-compat.ts\";\n\nexport interface McpToolDetails {\n\tserver: string;\n\ttool: string;\n\tpreview?: string;\n\tprogress?: Progress;\n}\n\ntype McpAgentContent = TextContent | ImageContent;\nexport type McpToolDefinition = ToolDefinition<TSchema, McpToolDetails | undefined, unknown>;\ntype WarnFn = (message: string) => void;\n\nexport interface McpCatalogRegistrationOptions {\n\treadonly refreshActiveSetWhenEmpty?: boolean;\n}\n\nexport interface McpNamedCatalogEntry {\n\treadonly entry: McpToolCatalogEntry;\n\treadonly name: string;\n}\n\n/** Pair each catalog entry with its stable, collision-resolved mcp tool name.\n * Shared by the full-tool builder and the Tier-B search catalog so names never\n * drift between the two. */\nexport function mapMcpCatalogNames(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpNamedCatalogEntry[] {\n\tconst sorted = [...entries].sort(compareCatalogEntries);\n\tconst names = buildMcpToolNames(\n\t\tsorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })),\n\t\twarn,\n\t);\n\treturn sorted.map((entry, index) => ({ entry, name: names[index] ?? \"\" }));\n}\n\nexport function buildMcpToolDefinitions(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpToolDefinition[] {\n\treturn mapMcpCatalogNames(entries, warn).map(({ entry, name }) => createMcpToolDefinition(entry, name));\n}\n\nfunction createMcpToolDefinition(entry: McpToolCatalogEntry, name: string): McpToolDefinition {\n\tconst converted = convertJsonSchemaToTypeBox(entry.schema);\n\tconst label = `${entry.server}/${entry.tool}`;\n\treturn {\n\t\tname,\n\t\tlabel,\n\t\tdescription: entry.description ?? `MCP tool ${label}`,\n\t\tparameters: converted.schema,\n\t\texecutionMode: \"parallel\",\n\t\tasync execute(_toolCallId, params, signal, onUpdate): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\t\t\tconst args: Record<string, unknown> = isRecord(params) ? params : {};\n\t\t\treturn await executeMcpCatalogEntry(entry, args, signal, onUpdate);\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(`${name} ${previewArgs(args)}`.trim())), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme) {\n\t\t\tconst title = options.isPartial\n\t\t\t\t? `${name}: running`\n\t\t\t\t: `${name}: ${result.details?.preview ?? \"(empty result)\"}`;\n\t\t\treturn new Text(theme.fg(\"toolOutput\", title), 0, 0);\n\t\t},\n\t};\n}\n\n/** Full guarded call path for one catalog entry (lifecycle + retry + output\n * guard). Shared by direct/search tool definitions and the Tier-C proxy. */\nexport async function executeMcpCatalogEntry(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\tconst label = `${entry.server}/${entry.tool}`;\n\tconst result = await callMcpTool(entry, args, signal, onUpdate, label);\n\tconst mapped = mapMcpToolResult(normalizeCallToolResult(result));\n\tif (!mapped.ok) {\n\t\tthrow new ToolExecError(mapped.error.message, { phase: \"call\", serverName: entry.server });\n\t}\n\tconst guarded = await applyMcpOutputGuard(mapped.content, {\n\t\tagentDir: entry.agentDir,\n\t\tartifacts: entry.artifacts,\n\t\toutputGuard: entry.outputGuard,\n\t\tserver: entry.server,\n\t});\n\tconst content = toAgentContent(guarded);\n\treturn { content, details: { preview: previewContent(content), server: entry.server, tool: entry.tool } };\n}\n\nasync function callMcpTool(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n\tlabel: string,\n): Promise<Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>> {\n\ttry {\n\t\treturn await runMcpConnectionLifecycleCall(entry.connection, () =>\n\t\t\twithMcpSessionExpiryRetry(entry.connection, async () => {\n\t\t\t\tawait ensureMcpToolCallConnection(entry.connection, entry.ensureFresh);\n\t\t\t\tawait entry.ensureConnected?.();\n\t\t\t\treturn await withMcpRetriableFailedSendRetry(entry.connection, async () => {\n\t\t\t\t\treturn await entry.connection.client.callTool({ name: entry.tool, arguments: args }, undefined, {\n\t\t\t\t\t\tonprogress: (progress) => {\n\t\t\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: formatProgress(label, progress) }],\n\t\t\t\t\t\t\t\tdetails: { progress, server: entry.server, tool: entry.tool },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\ttimeout: entry.requestTimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t} catch (error) {\n\t\tthrow new ToolExecError(`ToolExecError: ${errorLabel(error)}`, {\n\t\t\tcause: error,\n\t\t\tphase: \"call\",\n\t\t\tserverName: entry.server,\n\t\t});\n\t}\n}\n\nfunction normalizeCallToolResult(\n\tresult: Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>,\n): McpToolResultLike {\n\tif (\"content\" in result || \"structuredContent\" in result || \"isError\" in result) {\n\t\tconst candidate = result as Record<string, unknown>;\n\t\tconst normalized: McpToolResultLike = {};\n\t\tif (isMcpContentBlockArray(candidate.content)) normalized.content = candidate.content;\n\t\tif (typeof candidate.isError === \"boolean\") normalized.isError = candidate.isError;\n\t\tif (\"structuredContent\" in candidate) normalized.structuredContent = candidate.structuredContent;\n\t\treturn normalized;\n\t}\n\treturn { structuredContent: result.toolResult };\n}\n\nfunction isMcpContentBlockArray(value: unknown): value is McpContentBlock[] {\n\treturn Array.isArray(value);\n}\n\nfunction toAgentContent(blocks: readonly McpMappedContentBlock[]): McpAgentContent[] {\n\treturn blocks.map((block) => {\n\t\tif (block.type === \"text\" || block.type === \"image\") return block;\n\t\treturn { type: \"text\", text: JSON.stringify(block) };\n\t});\n}\n\nfunction previewContent(content: readonly McpAgentContent[]): string {\n\treturn truncatePreview(\n\t\tcontent\n\t\t\t.map((block) => (block.type === \"text\" ? block.text : `[${block.mimeType} image]`))\n\t\t\t.join(\" \")\n\t\t\t.trim() || \"(empty result)\",\n\t);\n}\n\nfunction previewArgs(args: unknown): string {\n\tconst text = JSON.stringify(args);\n\treturn text === undefined ? \"\" : truncatePreview(text);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorLabel(error: unknown): string {\n\treturn error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n}\n\nfunction formatProgress(label: string, progress: Progress): string {\n\tconst total = progress.total === undefined ? \"\" : `/${progress.total}`;\n\tconst message = progress.message === undefined ? \"\" : ` ${progress.message}`;\n\treturn `${label} progress ${progress.progress}${total}${message}`.trim();\n}\n\nfunction truncatePreview(value: string): string {\n\treturn value.length <= 120 ? value : `${value.slice(0, 117)}...`;\n}\n\nfunction compareCatalogEntries(left: McpToolCatalogEntry, right: McpToolCatalogEntry): number {\n\treturn left.server.localeCompare(right.server) || left.tool.localeCompare(right.tool);\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
|
|
2
2
|
import { type TSchema } from "typebox";
|
|
3
|
-
import {
|
|
3
|
+
import { buildMcpToolNames, type McpToolNameEntry } from "./naming.ts";
|
|
4
4
|
import { collectAllPages, type McpListPage, type McpPaginationResult } from "./pagination.ts";
|
|
5
5
|
export type { McpListPage, McpPaginationResult, McpToolNameEntry };
|
|
6
|
-
export {
|
|
6
|
+
export { buildMcpToolNames, collectAllPages };
|
|
7
7
|
interface SchemaConversionResult {
|
|
8
8
|
schema: TSchema;
|
|
9
9
|
warnings: string[];
|