@caupulican/pi-adaptative 0.85.3 → 0.85.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/dist/bun/cli.d.ts +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +1 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +12 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +82 -88
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js +3 -0
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +2 -2
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +2 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +2 -0
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +4 -3
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +4 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +2 -0
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +12 -7
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +55 -19
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/bash-executor.js +2 -2
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/bedrock-scope.d.ts +26 -0
- package/dist/core/bedrock-scope.d.ts.map +1 -0
- package/dist/core/bedrock-scope.js +178 -0
- package/dist/core/bedrock-scope.js.map +1 -0
- package/dist/core/billing-failover-controller.d.ts +2 -2
- package/dist/core/billing-failover-controller.d.ts.map +1 -1
- package/dist/core/billing-failover-controller.js +1 -1
- package/dist/core/billing-failover-controller.js.map +1 -1
- package/dist/core/compaction-controller.d.ts +8 -2
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +73 -3
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/compaction-support.d.ts +2 -2
- package/dist/core/compaction-support.d.ts.map +1 -1
- package/dist/core/compaction-support.js +9 -1
- package/dist/core/compaction-support.js.map +1 -1
- package/dist/core/context/artifact-retrieval.d.ts +1 -1
- package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
- package/dist/core/context/artifact-retrieval.js +1 -1
- package/dist/core/context/artifact-retrieval.js.map +1 -1
- package/dist/core/context/context-artifacts.d.ts +6 -6
- package/dist/core/context/context-artifacts.d.ts.map +1 -1
- package/dist/core/context/context-artifacts.js +151 -63
- package/dist/core/context/context-artifacts.js.map +1 -1
- package/dist/core/context/context-composition.js +1 -1
- package/dist/core/context/context-composition.js.map +1 -1
- package/dist/core/context/context-store-retention.d.ts.map +1 -1
- package/dist/core/context/context-store-retention.js +5 -2
- package/dist/core/context/context-store-retention.js.map +1 -1
- package/dist/core/context/file-store-memory-provider.js +1 -1
- package/dist/core/context/file-store-memory-provider.js.map +1 -1
- package/dist/core/context/tool-output-packer.d.ts +1 -1
- package/dist/core/context/tool-output-packer.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.js +1 -1
- package/dist/core/context/tool-output-packer.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +7 -5
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/context-pipeline.d.ts +2 -2
- package/dist/core/context-pipeline.d.ts.map +1 -1
- package/dist/core/context-pipeline.js +8 -4
- package/dist/core/context-pipeline.js.map +1 -1
- package/dist/core/cost/cost-summary.d.ts +1 -1
- package/dist/core/cost/cost-summary.d.ts.map +1 -1
- package/dist/core/cost/cost-summary.js +1 -1
- package/dist/core/cost/cost-summary.js.map +1 -1
- package/dist/core/cost/daily-usage.d.ts +1 -1
- package/dist/core/cost/daily-usage.d.ts.map +1 -1
- package/dist/core/cost/daily-usage.js +2 -2
- package/dist/core/cost/daily-usage.js.map +1 -1
- package/dist/core/cost/session-usage.d.ts +1 -1
- package/dist/core/cost/session-usage.d.ts.map +1 -1
- package/dist/core/cost/session-usage.js +1 -1
- package/dist/core/cost/session-usage.js.map +1 -1
- package/dist/core/delegation/worker-actions.js +1 -1
- package/dist/core/delegation/worker-actions.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +3 -2
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-conversation-store.d.ts +2 -1
- package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
- package/dist/core/delegation/worker-conversation-store.js +3 -2
- package/dist/core/delegation/worker-conversation-store.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +6 -0
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/extensions/builtin.d.ts +2 -2
- package/dist/core/extensions/builtin.d.ts.map +1 -1
- package/dist/core/extensions/builtin.js +2 -2
- package/dist/core/extensions/builtin.js.map +1 -1
- package/dist/core/extensions/bundled-virtual-modules.d.ts +2 -0
- package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/bundled-virtual-modules.js +129 -0
- package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
- package/dist/core/extensions/factory-runtime.d.ts +22 -0
- package/dist/core/extensions/factory-runtime.d.ts.map +1 -0
- package/dist/core/extensions/factory-runtime.js +334 -0
- package/dist/core/extensions/factory-runtime.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/lifecycle.d.ts +13 -0
- package/dist/core/extensions/lifecycle.d.ts.map +1 -0
- package/dist/core/extensions/lifecycle.js +52 -0
- package/dist/core/extensions/lifecycle.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +3 -24
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +21 -528
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts +51 -0
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/virtual-modules.js +59 -0
- package/dist/core/extensions/virtual-modules.js.map +1 -0
- package/dist/core/foreground-recovery-controller.d.ts +26 -2
- package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
- package/dist/core/foreground-recovery-controller.js +112 -3
- package/dist/core/foreground-recovery-controller.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +27 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -0
- package/dist/core/foreground-terminal-handoff-controller.js +56 -0
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -0
- package/dist/core/goal-loop-controller.d.ts.map +1 -1
- package/dist/core/goal-loop-controller.js +5 -0
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/compact-goal-context.d.ts +1 -1
- package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
- package/dist/core/goals/compact-goal-context.js +1 -1
- package/dist/core/goals/compact-goal-context.js.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.d.ts +3 -0
- package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js +28 -7
- package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +1 -1
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +1 -1
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/human-input-controller.d.ts +9 -0
- package/dist/core/human-input-controller.d.ts.map +1 -1
- package/dist/core/human-input-controller.js +60 -5
- package/dist/core/human-input-controller.js.map +1 -1
- package/dist/core/human-input.d.ts +12 -0
- package/dist/core/human-input.d.ts.map +1 -1
- package/dist/core/human-input.js +59 -12
- package/dist/core/human-input.js.map +1 -1
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/local-runtime-controller.d.ts.map +1 -1
- package/dist/core/local-runtime-controller.js +15 -9
- package/dist/core/local-runtime-controller.js.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts +1 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +253 -126
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory/providers/user-memory-archive.js +1 -1
- package/dist/core/memory/providers/user-memory-archive.js.map +1 -1
- package/dist/core/model-capability.d.ts +15 -1
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +24 -1
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-registry.d.ts +7 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +22 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +6 -6
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +6 -6
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/model-selection-controller.js +1 -1
- package/dist/core/model-selection-controller.js.map +1 -1
- package/dist/core/model-tool-protocol.d.ts +1 -1
- package/dist/core/model-tool-protocol.d.ts.map +1 -1
- package/dist/core/model-tool-protocol.js +1 -1
- package/dist/core/model-tool-protocol.js.map +1 -1
- package/dist/core/models/context-sizing.d.ts +1 -0
- package/dist/core/models/context-sizing.d.ts.map +1 -1
- package/dist/core/models/context-sizing.js +4 -1
- package/dist/core/models/context-sizing.js.map +1 -1
- package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
- package/dist/core/models/default-model-suggestions.js +20 -10
- package/dist/core/models/default-model-suggestions.js.map +1 -1
- package/dist/core/models/llamacpp-runtime.d.ts +39 -11
- package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
- package/dist/core/models/llamacpp-runtime.js +87 -31
- package/dist/core/models/llamacpp-runtime.js.map +1 -1
- package/dist/core/models/local-execution-planner.d.ts +24 -0
- package/dist/core/models/local-execution-planner.d.ts.map +1 -0
- package/dist/core/models/local-execution-planner.js +119 -0
- package/dist/core/models/local-execution-planner.js.map +1 -0
- package/dist/core/models/local-inference-profile.d.ts +34 -0
- package/dist/core/models/local-inference-profile.d.ts.map +1 -0
- package/dist/core/models/local-inference-profile.js +74 -0
- package/dist/core/models/local-inference-profile.js.map +1 -0
- package/dist/core/models/local-runtime.d.ts +23 -4
- package/dist/core/models/local-runtime.d.ts.map +1 -1
- package/dist/core/models/local-runtime.js +12 -9
- package/dist/core/models/local-runtime.js.map +1 -1
- package/dist/core/models/managed-ollama-model.d.ts +26 -0
- package/dist/core/models/managed-ollama-model.d.ts.map +1 -0
- package/dist/core/models/managed-ollama-model.js +59 -0
- package/dist/core/models/managed-ollama-model.js.map +1 -0
- package/dist/core/models/model-ref.js +11 -11
- package/dist/core/models/model-ref.js.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.d.ts +10 -20
- package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.js +11 -31
- package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -1
- package/dist/core/models/prism-llamacpp-server-probe.d.ts +10 -0
- package/dist/core/models/prism-llamacpp-server-probe.d.ts.map +1 -0
- package/dist/core/models/prism-llamacpp-server-probe.js +36 -0
- package/dist/core/models/prism-llamacpp-server-probe.js.map +1 -0
- package/dist/core/models/runtime-arbiter.d.ts +3 -0
- package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
- package/dist/core/models/runtime-arbiter.js +2 -1
- package/dist/core/models/runtime-arbiter.js.map +1 -1
- package/dist/core/orchestration/model-binding.d.ts +1 -1
- package/dist/core/orchestration/model-binding.d.ts.map +1 -1
- package/dist/core/orchestration/model-binding.js +1 -1
- package/dist/core/orchestration/model-binding.js.map +1 -1
- package/dist/core/orchestration/task-profile-writer.js +1 -1
- package/dist/core/orchestration/task-profile-writer.js.map +1 -1
- package/dist/core/process-matrix/runtime.d.ts +15 -1
- package/dist/core/process-matrix/runtime.d.ts.map +1 -1
- package/dist/core/process-matrix/runtime.js +55 -34
- package/dist/core/process-matrix/runtime.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +4 -3
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +2 -2
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/research/model-fitness-controller.js +1 -1
- package/dist/core/research/model-fitness-controller.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts +2 -2
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +15 -6
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +10 -19
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +8 -70
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +5 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +50 -7
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/scout-controller.d.ts +4 -3
- package/dist/core/scout-controller.d.ts.map +1 -1
- package/dist/core/scout-controller.js +2 -1
- package/dist/core/scout-controller.js.map +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +13 -11
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/security/context-threat-scanner.d.ts +14 -0
- package/dist/core/security/context-threat-scanner.d.ts.map +1 -0
- package/dist/core/security/context-threat-scanner.js +71 -0
- package/dist/core/security/context-threat-scanner.js.map +1 -0
- package/dist/core/session-supervision-runtime.d.ts +4 -1
- package/dist/core/session-supervision-runtime.d.ts.map +1 -1
- package/dist/core/session-supervision-runtime.js +49 -11
- package/dist/core/session-supervision-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +60 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt-builder.d.ts +5 -2
- package/dist/core/system-prompt-builder.d.ts.map +1 -1
- package/dist/core/system-prompt-builder.js +22 -10
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.d.ts +3 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +181 -55
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-protocol-controller.d.ts.map +1 -1
- package/dist/core/tool-protocol-controller.js +5 -3
- package/dist/core/tool-protocol-controller.js.map +1 -1
- package/dist/core/tool-recovery-logger.js +1 -1
- package/dist/core/tool-recovery-logger.js.map +1 -1
- package/dist/core/tools/artifact-retrieve.js +1 -1
- package/dist/core/tools/artifact-retrieve.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -4
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +2 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +9 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +5 -8
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +88 -55
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/extensionify-runtime.d.ts +44 -0
- package/dist/core/tools/extensionify-runtime.d.ts.map +1 -0
- package/dist/core/tools/extensionify-runtime.js +115 -0
- package/dist/core/tools/extensionify-runtime.js.map +1 -0
- package/dist/core/tools/extensionify.d.ts +9 -30
- package/dist/core/tools/extensionify.d.ts.map +1 -1
- package/dist/core/tools/extensionify.js +10 -140
- package/dist/core/tools/extensionify.js.map +1 -1
- package/dist/core/tools/file-mutation-intent.d.ts +42 -15
- package/dist/core/tools/file-mutation-intent.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-intent.js +271 -77
- package/dist/core/tools/file-mutation-intent.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/index.d.ts +3 -5
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +8 -44
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/search-command-guard.d.ts +8 -0
- package/dist/core/tools/search-command-guard.d.ts.map +1 -1
- package/dist/core/tools/search-command-guard.js +54 -0
- package/dist/core/tools/search-command-guard.js.map +1 -1
- package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
- package/dist/core/tools/shell-contract-router.js +9 -4
- package/dist/core/tools/shell-contract-router.js.map +1 -1
- package/dist/core/tools/shell-session.d.ts.map +1 -1
- package/dist/core/tools/shell-session.js +6 -4
- package/dist/core/tools/shell-session.js.map +1 -1
- package/dist/core/tools/tool-definition-factory.d.ts +32 -0
- package/dist/core/tools/tool-definition-factory.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-factory.js +55 -0
- package/dist/core/tools/tool-definition-factory.js.map +1 -0
- package/dist/core/tools/write.d.ts +5 -10
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +92 -73
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +79 -32
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +24 -18
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.d.ts +6 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.js +59 -12
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +1 -1
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.js +1 -1
- package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/local-model-commands.d.ts +1 -1
- package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
- package/dist/modes/interactive/local-model-commands.js +51 -8
- package/dist/modes/interactive/local-model-commands.js.map +1 -1
- package/dist/utils/child-process.js +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/docs/providers.md +34 -10
- package/docs/tool-boundary-performance-roadmap-2026-08-02.md +21 -18
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/prompt-customizer.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/ssh.ts +17 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +240 -260
- package/package.json +9 -7
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { discoverBedrockInferenceProfiles, probeBedrockModelAccess, } from "@caupulican/pi-ai/bedrock-provider";
|
|
2
|
+
export const BEDROCK_PROVIDER_ID = "amazon-bedrock";
|
|
3
|
+
const BEDROCK_MODEL_FAMILIES = ["sonnet", "opus", "haiku", "fable"];
|
|
4
|
+
const MODEL_VERSION_COLLATOR = new Intl.Collator("en", { numeric: true, sensitivity: "base" });
|
|
5
|
+
export function isUnscopedBedrockProxy(env = process.env) {
|
|
6
|
+
return env.AWS_BEDROCK_SKIP_AUTH === "1" && Boolean(env.AWS_ENDPOINT_URL_BEDROCK_RUNTIME?.trim());
|
|
7
|
+
}
|
|
8
|
+
function normalizeRegion(region) {
|
|
9
|
+
const normalized = region.trim().toLowerCase();
|
|
10
|
+
if (!/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/.test(normalized)) {
|
|
11
|
+
throw new Error("AWS region must be an explicit valid region name.");
|
|
12
|
+
}
|
|
13
|
+
return normalized;
|
|
14
|
+
}
|
|
15
|
+
function normalizeProfile(profile) {
|
|
16
|
+
if (profile === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
const normalized = profile.trim();
|
|
19
|
+
if (!normalized || normalized.length > 256 || /[\u0000-\u001f\u007f]/.test(normalized)) {
|
|
20
|
+
throw new Error("AWS profile must be a non-empty printable name of at most 256 characters.");
|
|
21
|
+
}
|
|
22
|
+
return normalized;
|
|
23
|
+
}
|
|
24
|
+
function regionInferencePrefix(region) {
|
|
25
|
+
if (region.startsWith("us-gov-"))
|
|
26
|
+
return "us-gov";
|
|
27
|
+
if (region.startsWith("us-"))
|
|
28
|
+
return "us";
|
|
29
|
+
if (region.startsWith("eu-"))
|
|
30
|
+
return "eu";
|
|
31
|
+
if (region.startsWith("ap-"))
|
|
32
|
+
return "apac";
|
|
33
|
+
return "global";
|
|
34
|
+
}
|
|
35
|
+
function modelRegionPrefix(modelId) {
|
|
36
|
+
const marker = ".anthropic.";
|
|
37
|
+
const markerIndex = modelId.indexOf(marker);
|
|
38
|
+
if (markerIndex >= 0)
|
|
39
|
+
return modelId.slice(0, markerIndex);
|
|
40
|
+
return modelId.startsWith("anthropic.") ? undefined : "foreign";
|
|
41
|
+
}
|
|
42
|
+
function regionRank(modelId, preferredPrefix, trustDiscovery) {
|
|
43
|
+
const prefix = modelRegionPrefix(modelId);
|
|
44
|
+
if (prefix === preferredPrefix)
|
|
45
|
+
return 0;
|
|
46
|
+
if (prefix === "global")
|
|
47
|
+
return 1;
|
|
48
|
+
if (prefix === undefined)
|
|
49
|
+
return 2;
|
|
50
|
+
return trustDiscovery && prefix !== "foreign" ? 3 : undefined;
|
|
51
|
+
}
|
|
52
|
+
function isAnthropicBedrockModel(model) {
|
|
53
|
+
return (model.provider === BEDROCK_PROVIDER_ID && (model.id.startsWith("anthropic.") || model.id.includes(".anthropic.")));
|
|
54
|
+
}
|
|
55
|
+
/** Choose one current model per Claude tier, preferring the region's inference-profile prefix. */
|
|
56
|
+
export function selectBedrockTierModelIds(models, discoveredModelIds, region) {
|
|
57
|
+
const normalizedRegion = normalizeRegion(region);
|
|
58
|
+
const preferredPrefix = regionInferencePrefix(normalizedRegion);
|
|
59
|
+
const discovered = discoveredModelIds ? new Set(discoveredModelIds) : undefined;
|
|
60
|
+
const candidates = models.filter((model) => isAnthropicBedrockModel(model) && (!discovered || discovered.has(model.id)));
|
|
61
|
+
const selected = [];
|
|
62
|
+
for (const family of BEDROCK_MODEL_FAMILIES) {
|
|
63
|
+
const familyCandidates = candidates
|
|
64
|
+
.map((model) => ({
|
|
65
|
+
model,
|
|
66
|
+
rank: regionRank(model.id, preferredPrefix, discovered !== undefined),
|
|
67
|
+
}))
|
|
68
|
+
.filter((candidate) => candidate.rank !== undefined && candidate.model.id.toLowerCase().includes(`claude-${family}`))
|
|
69
|
+
.sort((a, b) => a.rank - b.rank ||
|
|
70
|
+
MODEL_VERSION_COLLATOR.compare(b.model.name, a.model.name) ||
|
|
71
|
+
MODEL_VERSION_COLLATOR.compare(b.model.id, a.model.id));
|
|
72
|
+
if (familyCandidates[0])
|
|
73
|
+
selected.push(familyCandidates[0].model.id);
|
|
74
|
+
}
|
|
75
|
+
return selected;
|
|
76
|
+
}
|
|
77
|
+
function connection(request) {
|
|
78
|
+
const region = normalizeRegion(request.region);
|
|
79
|
+
const profile = normalizeProfile(request.profile);
|
|
80
|
+
return {
|
|
81
|
+
region,
|
|
82
|
+
...(profile ? { profile } : {}),
|
|
83
|
+
...(request.signal ? { signal: request.signal } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function noVerifiedModelsError(result) {
|
|
87
|
+
const details = result.failures
|
|
88
|
+
.slice(0, 4)
|
|
89
|
+
.map((failure) => `${failure.modelId}: ${failure.reason}`)
|
|
90
|
+
.join("; ");
|
|
91
|
+
return new Error(`No Anthropic Bedrock model passed runtime verification${details ? ` (${details})` : ""}.`);
|
|
92
|
+
}
|
|
93
|
+
export async function verifyBedrockScope(request, modelRegistry, dependencies = {}) {
|
|
94
|
+
const normalized = connection(request);
|
|
95
|
+
const env = dependencies.env ?? process.env;
|
|
96
|
+
const bearerToken = request.credentialMode === "profile" ? undefined : env.AWS_BEARER_TOKEN_BEDROCK?.trim();
|
|
97
|
+
const models = modelRegistry.getAll();
|
|
98
|
+
let candidates;
|
|
99
|
+
let verification;
|
|
100
|
+
if (bearerToken) {
|
|
101
|
+
candidates = selectBedrockTierModelIds(models, undefined, normalized.region);
|
|
102
|
+
verification = "runtime";
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const discover = dependencies.discoverInferenceProfiles ?? discoverBedrockInferenceProfiles;
|
|
106
|
+
const discovery = await discover(normalized);
|
|
107
|
+
candidates = selectBedrockTierModelIds(models, discovery.inferenceProfileIds, normalized.region);
|
|
108
|
+
verification = "identity+control-plane+runtime";
|
|
109
|
+
}
|
|
110
|
+
if (candidates.length === 0) {
|
|
111
|
+
throw new Error(`No catalogued Anthropic inference profiles were discovered in ${normalized.region}.`);
|
|
112
|
+
}
|
|
113
|
+
const probe = dependencies.probeModelAccess ?? probeBedrockModelAccess;
|
|
114
|
+
const result = await probe({
|
|
115
|
+
...normalized,
|
|
116
|
+
modelIds: candidates,
|
|
117
|
+
...(bearerToken ? { bearerToken } : {}),
|
|
118
|
+
});
|
|
119
|
+
if (result.verifiedModelIds.length === 0)
|
|
120
|
+
throw noVerifiedModelsError(result);
|
|
121
|
+
return {
|
|
122
|
+
region: normalized.region,
|
|
123
|
+
...(normalized.profile ? { profile: normalized.profile } : {}),
|
|
124
|
+
modelIds: result.verifiedModelIds,
|
|
125
|
+
verifiedAt: (dependencies.now ?? (() => new Date()))().toISOString(),
|
|
126
|
+
verification,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function scopeMatchesEnvironment(scope, env) {
|
|
130
|
+
const environmentRegion = env.AWS_REGION?.trim().toLowerCase();
|
|
131
|
+
if (environmentRegion && environmentRegion !== scope.region)
|
|
132
|
+
return false;
|
|
133
|
+
const environmentProfile = env.AWS_PROFILE?.trim();
|
|
134
|
+
return environmentProfile === undefined || environmentProfile === scope.profile;
|
|
135
|
+
}
|
|
136
|
+
function scopedModelIds(scope, modelRegistry) {
|
|
137
|
+
const modelIds = new Set(scope.modelIds);
|
|
138
|
+
for (const model of modelRegistry.getAll()) {
|
|
139
|
+
if (model.provider !== BEDROCK_PROVIDER_ID)
|
|
140
|
+
continue;
|
|
141
|
+
const applicationProfile = model.id.match(/^arn:[^:]+:bedrock:([^:]+):[^:]*:application-inference-profile\//i);
|
|
142
|
+
if (applicationProfile?.[1]?.toLowerCase() === scope.region)
|
|
143
|
+
modelIds.add(model.id);
|
|
144
|
+
}
|
|
145
|
+
return [...modelIds];
|
|
146
|
+
}
|
|
147
|
+
export function getActiveBedrockScope(settingsManager, env = process.env) {
|
|
148
|
+
const scope = settingsManager.getBedrockScopeSettings();
|
|
149
|
+
return scope && scopeMatchesEnvironment(scope, env) ? scope : undefined;
|
|
150
|
+
}
|
|
151
|
+
/** Bind persisted evidence to both provider visibility and the SDK's exact request environment. */
|
|
152
|
+
export function bindSavedBedrockScope(settingsManager, modelRegistry, env = process.env) {
|
|
153
|
+
if (isUnscopedBedrockProxy(env)) {
|
|
154
|
+
modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, undefined);
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
const scope = getActiveBedrockScope(settingsManager, env);
|
|
158
|
+
if (!scope) {
|
|
159
|
+
modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, []);
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
if (!env.AWS_REGION?.trim())
|
|
163
|
+
env.AWS_REGION = scope.region;
|
|
164
|
+
if (scope.profile && !env.AWS_PROFILE?.trim())
|
|
165
|
+
env.AWS_PROFILE = scope.profile;
|
|
166
|
+
modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));
|
|
167
|
+
return scope;
|
|
168
|
+
}
|
|
169
|
+
export function activateVerifiedBedrockScope(settingsManager, modelRegistry, scope, env = process.env) {
|
|
170
|
+
settingsManager.setBedrockScopeSettings(scope);
|
|
171
|
+
env.AWS_REGION = scope.region;
|
|
172
|
+
if (scope.profile)
|
|
173
|
+
env.AWS_PROFILE = scope.profile;
|
|
174
|
+
else
|
|
175
|
+
delete env.AWS_PROFILE;
|
|
176
|
+
modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=bedrock-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock-scope.js","sourceRoot":"","sources":["../../src/core/bedrock-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@caupulican/pi-ai\";\nimport {\n\ttype BedrockModelProbeResult,\n\tdiscoverBedrockInferenceProfiles,\n\tprobeBedrockModelAccess,\n} from \"@caupulican/pi-ai/bedrock-provider\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport type { BedrockScopeSettings, SettingsManager } from \"./settings-manager.ts\";\n\nexport const BEDROCK_PROVIDER_ID = \"amazon-bedrock\";\nconst BEDROCK_MODEL_FAMILIES = [\"sonnet\", \"opus\", \"haiku\", \"fable\"] as const;\nconst MODEL_VERSION_COLLATOR = new Intl.Collator(\"en\", { numeric: true, sensitivity: \"base\" });\n\nexport function isUnscopedBedrockProxy(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env.AWS_BEDROCK_SKIP_AUTH === \"1\" && Boolean(env.AWS_ENDPOINT_URL_BEDROCK_RUNTIME?.trim());\n}\n\nexport interface BedrockScopeVerificationRequest {\n\tregion: string;\n\tprofile?: string;\n\tsignal?: AbortSignal;\n\tcredentialMode?: \"profile\" | \"ambient\";\n}\n\nexport interface BedrockScopeVerificationDependencies {\n\tenv?: NodeJS.ProcessEnv;\n\tdiscoverInferenceProfiles?: typeof discoverBedrockInferenceProfiles;\n\tprobeModelAccess?: typeof probeBedrockModelAccess;\n\tnow?: () => Date;\n}\n\nfunction normalizeRegion(region: string): string {\n\tconst normalized = region.trim().toLowerCase();\n\tif (!/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/.test(normalized)) {\n\t\tthrow new Error(\"AWS region must be an explicit valid region name.\");\n\t}\n\treturn normalized;\n}\n\nfunction normalizeProfile(profile: string | undefined): string | undefined {\n\tif (profile === undefined) return undefined;\n\tconst normalized = profile.trim();\n\tif (!normalized || normalized.length > 256 || /[\\u0000-\\u001f\\u007f]/.test(normalized)) {\n\t\tthrow new Error(\"AWS profile must be a non-empty printable name of at most 256 characters.\");\n\t}\n\treturn normalized;\n}\n\nfunction regionInferencePrefix(region: string): string {\n\tif (region.startsWith(\"us-gov-\")) return \"us-gov\";\n\tif (region.startsWith(\"us-\")) return \"us\";\n\tif (region.startsWith(\"eu-\")) return \"eu\";\n\tif (region.startsWith(\"ap-\")) return \"apac\";\n\treturn \"global\";\n}\n\nfunction modelRegionPrefix(modelId: string): string | undefined {\n\tconst marker = \".anthropic.\";\n\tconst markerIndex = modelId.indexOf(marker);\n\tif (markerIndex >= 0) return modelId.slice(0, markerIndex);\n\treturn modelId.startsWith(\"anthropic.\") ? undefined : \"foreign\";\n}\n\nfunction regionRank(modelId: string, preferredPrefix: string, trustDiscovery: boolean): number | undefined {\n\tconst prefix = modelRegionPrefix(modelId);\n\tif (prefix === preferredPrefix) return 0;\n\tif (prefix === \"global\") return 1;\n\tif (prefix === undefined) return 2;\n\treturn trustDiscovery && prefix !== \"foreign\" ? 3 : undefined;\n}\n\nfunction isAnthropicBedrockModel(model: Model<Api>): boolean {\n\treturn (\n\t\tmodel.provider === BEDROCK_PROVIDER_ID && (model.id.startsWith(\"anthropic.\") || model.id.includes(\".anthropic.\"))\n\t);\n}\n\n/** Choose one current model per Claude tier, preferring the region's inference-profile prefix. */\nexport function selectBedrockTierModelIds(\n\tmodels: readonly Model<Api>[],\n\tdiscoveredModelIds: readonly string[] | undefined,\n\tregion: string,\n): string[] {\n\tconst normalizedRegion = normalizeRegion(region);\n\tconst preferredPrefix = regionInferencePrefix(normalizedRegion);\n\tconst discovered = discoveredModelIds ? new Set(discoveredModelIds) : undefined;\n\tconst candidates = models.filter(\n\t\t(model) => isAnthropicBedrockModel(model) && (!discovered || discovered.has(model.id)),\n\t);\n\tconst selected: string[] = [];\n\tfor (const family of BEDROCK_MODEL_FAMILIES) {\n\t\tconst familyCandidates = candidates\n\t\t\t.map((model) => ({\n\t\t\t\tmodel,\n\t\t\t\trank: regionRank(model.id, preferredPrefix, discovered !== undefined),\n\t\t\t}))\n\t\t\t.filter(\n\t\t\t\t(candidate): candidate is { model: Model<Api>; rank: number } =>\n\t\t\t\t\tcandidate.rank !== undefined && candidate.model.id.toLowerCase().includes(`claude-${family}`),\n\t\t\t)\n\t\t\t.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\ta.rank - b.rank ||\n\t\t\t\t\tMODEL_VERSION_COLLATOR.compare(b.model.name, a.model.name) ||\n\t\t\t\t\tMODEL_VERSION_COLLATOR.compare(b.model.id, a.model.id),\n\t\t\t);\n\t\tif (familyCandidates[0]) selected.push(familyCandidates[0].model.id);\n\t}\n\treturn selected;\n}\n\nfunction connection(request: BedrockScopeVerificationRequest): BedrockScopeVerificationRequest {\n\tconst region = normalizeRegion(request.region);\n\tconst profile = normalizeProfile(request.profile);\n\treturn {\n\t\tregion,\n\t\t...(profile ? { profile } : {}),\n\t\t...(request.signal ? { signal: request.signal } : {}),\n\t};\n}\n\nfunction noVerifiedModelsError(result: BedrockModelProbeResult): Error {\n\tconst details = result.failures\n\t\t.slice(0, 4)\n\t\t.map((failure) => `${failure.modelId}: ${failure.reason}`)\n\t\t.join(\"; \");\n\treturn new Error(`No Anthropic Bedrock model passed runtime verification${details ? ` (${details})` : \"\"}.`);\n}\n\nexport async function verifyBedrockScope(\n\trequest: BedrockScopeVerificationRequest,\n\tmodelRegistry: ModelRegistry,\n\tdependencies: BedrockScopeVerificationDependencies = {},\n): Promise<BedrockScopeSettings> {\n\tconst normalized = connection(request);\n\tconst env = dependencies.env ?? process.env;\n\tconst bearerToken = request.credentialMode === \"profile\" ? undefined : env.AWS_BEARER_TOKEN_BEDROCK?.trim();\n\tconst models = modelRegistry.getAll();\n\tlet candidates: string[];\n\tlet verification: BedrockScopeSettings[\"verification\"];\n\n\tif (bearerToken) {\n\t\tcandidates = selectBedrockTierModelIds(models, undefined, normalized.region);\n\t\tverification = \"runtime\";\n\t} else {\n\t\tconst discover = dependencies.discoverInferenceProfiles ?? discoverBedrockInferenceProfiles;\n\t\tconst discovery = await discover(normalized);\n\t\tcandidates = selectBedrockTierModelIds(models, discovery.inferenceProfileIds, normalized.region);\n\t\tverification = \"identity+control-plane+runtime\";\n\t}\n\tif (candidates.length === 0) {\n\t\tthrow new Error(`No catalogued Anthropic inference profiles were discovered in ${normalized.region}.`);\n\t}\n\n\tconst probe = dependencies.probeModelAccess ?? probeBedrockModelAccess;\n\tconst result = await probe({\n\t\t...normalized,\n\t\tmodelIds: candidates,\n\t\t...(bearerToken ? { bearerToken } : {}),\n\t});\n\tif (result.verifiedModelIds.length === 0) throw noVerifiedModelsError(result);\n\n\treturn {\n\t\tregion: normalized.region,\n\t\t...(normalized.profile ? { profile: normalized.profile } : {}),\n\t\tmodelIds: result.verifiedModelIds,\n\t\tverifiedAt: (dependencies.now ?? (() => new Date()))().toISOString(),\n\t\tverification,\n\t};\n}\n\nfunction scopeMatchesEnvironment(scope: BedrockScopeSettings, env: NodeJS.ProcessEnv): boolean {\n\tconst environmentRegion = env.AWS_REGION?.trim().toLowerCase();\n\tif (environmentRegion && environmentRegion !== scope.region) return false;\n\tconst environmentProfile = env.AWS_PROFILE?.trim();\n\treturn environmentProfile === undefined || environmentProfile === scope.profile;\n}\n\nfunction scopedModelIds(scope: BedrockScopeSettings, modelRegistry: ModelRegistry): string[] {\n\tconst modelIds = new Set(scope.modelIds);\n\tfor (const model of modelRegistry.getAll()) {\n\t\tif (model.provider !== BEDROCK_PROVIDER_ID) continue;\n\t\tconst applicationProfile = model.id.match(/^arn:[^:]+:bedrock:([^:]+):[^:]*:application-inference-profile\\//i);\n\t\tif (applicationProfile?.[1]?.toLowerCase() === scope.region) modelIds.add(model.id);\n\t}\n\treturn [...modelIds];\n}\n\nexport function getActiveBedrockScope(\n\tsettingsManager: SettingsManager,\n\tenv: NodeJS.ProcessEnv = process.env,\n): BedrockScopeSettings | undefined {\n\tconst scope = settingsManager.getBedrockScopeSettings();\n\treturn scope && scopeMatchesEnvironment(scope, env) ? scope : undefined;\n}\n\n/** Bind persisted evidence to both provider visibility and the SDK's exact request environment. */\nexport function bindSavedBedrockScope(\n\tsettingsManager: SettingsManager,\n\tmodelRegistry: ModelRegistry,\n\tenv: NodeJS.ProcessEnv = process.env,\n): BedrockScopeSettings | undefined {\n\tif (isUnscopedBedrockProxy(env)) {\n\t\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, undefined);\n\t\treturn undefined;\n\t}\n\tconst scope = getActiveBedrockScope(settingsManager, env);\n\tif (!scope) {\n\t\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, []);\n\t\treturn undefined;\n\t}\n\tif (!env.AWS_REGION?.trim()) env.AWS_REGION = scope.region;\n\tif (scope.profile && !env.AWS_PROFILE?.trim()) env.AWS_PROFILE = scope.profile;\n\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));\n\treturn scope;\n}\n\nexport function activateVerifiedBedrockScope(\n\tsettingsManager: SettingsManager,\n\tmodelRegistry: ModelRegistry,\n\tscope: BedrockScopeSettings,\n\tenv: NodeJS.ProcessEnv = process.env,\n): void {\n\tsettingsManager.setBedrockScopeSettings(scope);\n\tenv.AWS_REGION = scope.region;\n\tif (scope.profile) env.AWS_PROFILE = scope.profile;\n\telse delete env.AWS_PROFILE;\n\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Agent } from "@caupulican/pi-agent-core";
|
|
2
|
-
import { type ClassifiedError, classifyFailure } from "@caupulican/pi-agent-core";
|
|
1
|
+
import type { Agent } from "@caupulican/pi-agent-core/agent";
|
|
2
|
+
import { type ClassifiedError, classifyFailure } from "@caupulican/pi-agent-core/reliability";
|
|
3
3
|
import type { AssistantMessage } from "@caupulican/pi-ai";
|
|
4
4
|
import type { ModelRegistry } from "./model-registry.ts";
|
|
5
5
|
import type { ModelRouterFailoverStatus } from "./model-router/status.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing-failover-controller.d.ts","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"billing-failover-controller.d.ts","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,KAAK,EAAO,gBAAgB,EAAS,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAM1E,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAEnE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/C;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMhC;IAED,QAAQ,IAAI,MAAM,EAAE,CAEnB;CACD;AAED,MAAM,WAAW,6BAA6B;IAC7C,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,SAAS,EAAE,yBAAyB,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,CAAC,IAAI,EAAE;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;CACT;AAED,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,OAAO,CAAC,UAAU,CAAqB;IAEvC,YAAY,IAAI,EAAE,6BAA6B,EAE9C;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhC;IAED,iBAAiB,IAAI,MAAM,EAAE,CAE5B;IAED,aAAa,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,SAAS,IAAI,yBAAyB,CAErC;IAEK,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBpG;CACD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { classifyFailure } from "@caupulican/pi-agent-core";
|
|
1
|
+
import { classifyFailure } from "@caupulican/pi-agent-core/reliability";
|
|
2
2
|
import { decideBillingFailover } from "./billing-failover.js";
|
|
3
3
|
const DEFAULT_MODEL_PER_PROVIDER = {
|
|
4
4
|
"openai-codex": "gpt-5.6-sol",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing-failover-controller.js","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"billing-failover-controller.js","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAE9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,MAAM,0BAA0B,GAA2B;IAC1D,cAAc,EAAE,aAAa;CAC7B,CAAC;AAEF,MAAM,OAAO,yBAAyB;IAAtC;QACkB,cAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IAiBpE,CAAC;IAfA,aAAa,CAAC,GAAW,EAAE,KAAc;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,GAAW;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,QAAQ;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;CACD;AAgBD,MAAM,OAAO,yBAAyB;IAIrC,YAAY,IAAmC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,WAAW,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,iBAAiB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,SAAS;QACR,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,OAAyB,EAAE,UAA4B;QACjF,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACjD,UAAU,KAAK,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpG,IAAI,UAAU,CAAC,MAAM,KAAK,kBAAkB;YAAE,OAAO,KAAK,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACjH,MAAM,SAAS,GAAG,GAAG,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;QAE5F,MAAM,cAAc,GAAG,0BAA0B,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5G,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACpC,WAAW,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE;YACnE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;YAC5F,sBAAsB,EAAE,cAAc;YACtC,mBAAmB,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACnF,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK;YACxF,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;SAC1C,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAiB,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAED,SAAS,oBAAoB,CAAC,YAAgC;IAC7D,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;AAC3E,CAAC","sourcesContent":["import type { Agent } from \"@caupulican/pi-agent-core/agent\";\nimport { type ClassifiedError, classifyFailure } from \"@caupulican/pi-agent-core/reliability\";\nimport type { Api, AssistantMessage, Model } from \"@caupulican/pi-ai\";\nimport { decideBillingFailover } from \"./billing-failover.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport type { ModelRouterFailoverStatus } from \"./model-router/status.ts\";\n\nconst DEFAULT_MODEL_PER_PROVIDER: Record<string, string> = {\n\t\"openai-codex\": \"gpt-5.6-sol\",\n};\n\nexport class ExhaustedProviderRegistry {\n\tprivate readonly exhausted = new Map<string, number | undefined>();\n\n\tmarkExhausted(ref: string, until?: number): void {\n\t\tthis.exhausted.set(ref, until);\n\t}\n\n\tisExhausted(ref: string): boolean {\n\t\tconst until = this.exhausted.get(ref);\n\t\tif (until === undefined) return this.exhausted.has(ref);\n\t\tif (Date.now() < until) return true;\n\t\tthis.exhausted.delete(ref);\n\t\treturn false;\n\t}\n\n\tsnapshot(): string[] {\n\t\treturn [...this.exhausted.keys()].filter((ref) => this.isExhausted(ref));\n\t}\n}\n\nexport interface BillingFailoverControllerDeps {\n\tagent: Agent;\n\tmodelRegistry: ModelRegistry;\n\temit(event: { type: \"warning\"; message: string }): void;\n\texhausted: ExhaustedProviderRegistry;\n\tsubscriptionHop?: boolean;\n\trecordFailure?(args: {\n\t\tprovider?: string;\n\t\tmodelId?: string;\n\t\tmessage: string;\n\t\tclassified: ReturnType<typeof classifyFailure>;\n\t}): void;\n}\n\nexport class BillingFailoverController {\n\tprivate readonly deps: BillingFailoverControllerDeps;\n\tprivate lastNotice: string | undefined;\n\n\tconstructor(deps: BillingFailoverControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tisExhausted(ref: string): boolean {\n\t\treturn this.deps.exhausted.isExhausted(ref);\n\t}\n\n\tsnapshotExhausted(): string[] {\n\t\treturn this.deps.exhausted.snapshot();\n\t}\n\n\tgetLastNotice(): string | undefined {\n\t\treturn this.lastNotice;\n\t}\n\n\tgetStatus(): ModelRouterFailoverStatus {\n\t\treturn { exhausted: this.snapshotExhausted(), lastNotice: this.lastNotice };\n\t}\n\n\tasync handleAssistantError(message: AssistantMessage, classified?: ClassifiedError): Promise<boolean> {\n\t\tif (message.stopReason !== \"error\") return false;\n\t\tclassified ??= classifyFailure({ message: message.errorMessage ?? \"\", provider: message.provider });\n\t\tif (classified.reason !== \"billing_or_quota\") return false;\n\t\tconst failedModel = this.deps.modelRegistry.find(message.provider, message.model) ?? this.deps.agent.state.model;\n\t\tconst failedRef = `${failedModel.provider}/${failedModel.id}`;\n\t\tthis.deps.exhausted.markExhausted(failedRef, expiryFromRetryAfter(classified.retryAfterMs));\n\n\t\tconst defaultModelId = DEFAULT_MODEL_PER_PROVIDER[failedModel.provider];\n\t\tconst hop = defaultModelId ? this.deps.modelRegistry.find(failedModel.provider, defaultModelId) : undefined;\n\t\tconst action = decideBillingFailover({\n\t\t\tfailedModel: { provider: failedModel.provider, id: failedModel.id },\n\t\t\tbillingClass: this.deps.modelRegistry.isUsingOAuth(failedModel) ? \"subscription\" : \"metered\",\n\t\t\tproviderDefaultModelId: defaultModelId,\n\t\t\thopResolvesWithAuth: Boolean(hop && this.deps.modelRegistry.hasConfiguredAuth(hop)),\n\t\t\thopExhausted: hop ? this.deps.exhausted.isExhausted(`${hop.provider}/${hop.id}`) : false,\n\t\t\tsubscriptionHop: this.deps.subscriptionHop,\n\t\t});\n\t\tif (action.action === \"failover\") {\n\t\t\tthis.deps.agent.state.model = hop as Model<Api>;\n\t\t}\n\t\tthis.lastNotice = action.notice;\n\t\tthis.deps.emit({ type: \"warning\", message: action.notice });\n\t\treturn true;\n\t}\n}\n\nfunction expiryFromRetryAfter(retryAfterMs: number | undefined): number | undefined {\n\treturn retryAfterMs === undefined ? undefined : Date.now() + retryAfterMs;\n}\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type { Agent
|
|
2
|
-
import { type CompactionResult, type CompactionSettings
|
|
1
|
+
import type { Agent } from "@caupulican/pi-agent-core/agent";
|
|
2
|
+
import { type CompactionResult, type CompactionSettings } from "@caupulican/pi-agent-core/compaction/compaction";
|
|
3
|
+
import { type SessionManager } from "@caupulican/pi-agent-core/session";
|
|
4
|
+
import type { AgentMessage, ThinkingLevel } from "@caupulican/pi-agent-core/types";
|
|
3
5
|
import type { Api, AssistantMessage, Model } from "@caupulican/pi-ai";
|
|
4
6
|
import type { ExtensionRunner } from "./extensions/index.ts";
|
|
5
7
|
import type { FailureCorpusRecorder } from "./failure-corpus.ts";
|
|
@@ -72,6 +74,7 @@ export declare class CompactionController {
|
|
|
72
74
|
private autoAbortController;
|
|
73
75
|
private autoRunPromise;
|
|
74
76
|
private overflowRecoveryAttempted;
|
|
77
|
+
private ineffectiveThresholdFrontier;
|
|
75
78
|
private readonly deps;
|
|
76
79
|
constructor(deps: CompactionControllerDeps);
|
|
77
80
|
private buildCompactionInstructions;
|
|
@@ -85,6 +88,9 @@ export declare class CompactionController {
|
|
|
85
88
|
measureLiveContextTokens(): number;
|
|
86
89
|
runAuto(reason: AutoCompactionReason, willRetry: boolean): Promise<boolean>;
|
|
87
90
|
private runAutoOnce;
|
|
91
|
+
private shouldDeferThresholdRetry;
|
|
92
|
+
private recordThresholdFrontier;
|
|
93
|
+
private emitIneffectiveThresholdSkip;
|
|
88
94
|
compactWithRetry(run: () => Promise<CompactionResult>, signal: AbortSignal, provider?: string): Promise<CompactionResult>;
|
|
89
95
|
private findLastAssistantMessage;
|
|
90
96
|
private getExtensionCompaction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction-controller.d.ts","sourceRoot":"","sources":["../../src/core/compaction-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"compaction-controller.d.ts","sourceRoot":"","sources":["../../src/core/compaction-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { calculateContextTokens, compact, createDeterministicCompaction, estimateContextTokens, prepareCompaction, shouldCompact, } from "@caupulican/pi-agent-core/compaction/compaction";
|
|
2
|
+
import { runCompactionLoop } from "@caupulican/pi-agent-core/compaction/loop";
|
|
3
|
+
import { classifyFailure, computeRetryDelayMs, DEFAULT_RETRY_POLICY, sleepAbortable, } from "@caupulican/pi-agent-core/reliability";
|
|
4
|
+
import { getLatestCompactionEntry } from "@caupulican/pi-agent-core/session";
|
|
5
|
+
import { isContextOverflow } from "@caupulican/pi-ai/overflow";
|
|
4
6
|
import { formatNoModelSelectedMessage } from "./auth-guidance.js";
|
|
5
7
|
import { wrapUntrustedText } from "./security/untrusted-boundary.js";
|
|
6
8
|
const COMPACTION_RETRY_PREPARATION_OPTIONS = { allowTrailingCompactionAsPrevious: true };
|
|
9
|
+
const INEFFECTIVE_THRESHOLD_SKIP_REASON = "previous auto-compaction did not restore headroom; waiting for materially new compactable history";
|
|
7
10
|
export async function runCompactionWithRetry(options) {
|
|
8
11
|
const retrySettings = options.getRetrySettings();
|
|
9
12
|
const maxAttempts = retrySettings.enabled ? Math.max(1, retrySettings.maxRetries + 1) : 1;
|
|
@@ -100,12 +103,17 @@ export class CompactionController {
|
|
|
100
103
|
const projectedTokens = this.deps.estimateCurrentContextTokens(projectedMessages);
|
|
101
104
|
if (!shouldCompact(projectedTokens, contextWindow, settings, triggerTokens))
|
|
102
105
|
return false;
|
|
106
|
+
if (this.shouldDeferThresholdRetry(projectedTokens, model, settings)) {
|
|
107
|
+
this.emitIneffectiveThresholdSkip();
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
103
110
|
const latestBefore = getLatestCompactionEntry(this.deps.sessionManager.getBranch())?.id;
|
|
104
111
|
await this.deps.runAutoCompaction("threshold", false);
|
|
105
112
|
const latestAfter = getLatestCompactionEntry(this.deps.sessionManager.getBranch())?.id;
|
|
106
113
|
return Boolean(latestAfter && latestAfter !== latestBefore);
|
|
107
114
|
}
|
|
108
115
|
async compact(customInstructions) {
|
|
116
|
+
this.ineffectiveThresholdFrontier = undefined;
|
|
109
117
|
this.deps.disconnectAgent();
|
|
110
118
|
await this.deps.abortForeground();
|
|
111
119
|
this.manualAbortController = new AbortController();
|
|
@@ -279,6 +287,10 @@ export class CompactionController {
|
|
|
279
287
|
}
|
|
280
288
|
}
|
|
281
289
|
if (shouldCompact(contextTokens, contextWindow, settings, model?.autoCompactionTriggerTokens)) {
|
|
290
|
+
if (model && this.shouldDeferThresholdRetry(contextTokens, model, settings)) {
|
|
291
|
+
this.emitIneffectiveThresholdSkip();
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
282
294
|
return this.deps.runAutoCompaction("threshold", false);
|
|
283
295
|
}
|
|
284
296
|
return false;
|
|
@@ -413,6 +425,10 @@ export class CompactionController {
|
|
|
413
425
|
const result = outcome.kind === "success" ? outcome.result : lastCompaction;
|
|
414
426
|
if (!result)
|
|
415
427
|
throw new Error("Auto-compaction succeeded without a result");
|
|
428
|
+
if (reason === "threshold")
|
|
429
|
+
this.recordThresholdFrontier(model, settings, margin);
|
|
430
|
+
else
|
|
431
|
+
this.ineffectiveThresholdFrontier = undefined;
|
|
416
432
|
this.deps.emit({ type: "compaction_end", reason, result, aborted: false, willRetry });
|
|
417
433
|
if (willRetry) {
|
|
418
434
|
const messages = this.deps.agent.state.messages;
|
|
@@ -439,6 +455,60 @@ export class CompactionController {
|
|
|
439
455
|
return hadQueuedMessages || this.deps.agent.hasQueuedMessages();
|
|
440
456
|
}
|
|
441
457
|
}
|
|
458
|
+
shouldDeferThresholdRetry(contextTokens, model, settings) {
|
|
459
|
+
const frontier = this.ineffectiveThresholdFrontier;
|
|
460
|
+
if (!frontier)
|
|
461
|
+
return false;
|
|
462
|
+
if (frontier.provider !== model.provider ||
|
|
463
|
+
frontier.modelId !== model.id ||
|
|
464
|
+
frontier.contextWindow !== model.contextWindow ||
|
|
465
|
+
frontier.autoCompactionTriggerTokens !== model.autoCompactionTriggerTokens ||
|
|
466
|
+
frontier.reserveTokens !== settings.reserveTokens ||
|
|
467
|
+
frontier.keepRecentTokens !== settings.keepRecentTokens ||
|
|
468
|
+
frontier.triggerPercent !== settings.triggerPercent ||
|
|
469
|
+
contextTokens < frontier.tokensAfter ||
|
|
470
|
+
contextTokens >= frontier.retryAtTokens) {
|
|
471
|
+
this.ineffectiveThresholdFrontier = undefined;
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
recordThresholdFrontier(model, settings, margin) {
|
|
477
|
+
try {
|
|
478
|
+
const tokensAfter = this.deps.measureLiveContextTokens();
|
|
479
|
+
if (!Number.isFinite(tokensAfter) ||
|
|
480
|
+
!shouldCompact(tokensAfter + margin, model.contextWindow, settings, model.autoCompactionTriggerTokens)) {
|
|
481
|
+
this.ineffectiveThresholdFrontier = undefined;
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
const minimumGrowth = Math.max(1, margin, Math.floor(settings.keepRecentTokens / 2));
|
|
485
|
+
this.ineffectiveThresholdFrontier = {
|
|
486
|
+
provider: model.provider,
|
|
487
|
+
modelId: model.id,
|
|
488
|
+
contextWindow: model.contextWindow,
|
|
489
|
+
autoCompactionTriggerTokens: model.autoCompactionTriggerTokens,
|
|
490
|
+
reserveTokens: settings.reserveTokens,
|
|
491
|
+
keepRecentTokens: settings.keepRecentTokens,
|
|
492
|
+
triggerPercent: settings.triggerPercent,
|
|
493
|
+
tokensAfter,
|
|
494
|
+
retryAtTokens: Math.min(Number.MAX_SAFE_INTEGER, tokensAfter + minimumGrowth),
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
this.ineffectiveThresholdFrontier = undefined;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
emitIneffectiveThresholdSkip() {
|
|
502
|
+
this.deps.emit({ type: "compaction_start", reason: "threshold" });
|
|
503
|
+
this.deps.emit({
|
|
504
|
+
type: "compaction_end",
|
|
505
|
+
reason: "threshold",
|
|
506
|
+
result: undefined,
|
|
507
|
+
aborted: false,
|
|
508
|
+
willRetry: false,
|
|
509
|
+
skipReason: INEFFECTIVE_THRESHOLD_SKIP_REASON,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
442
512
|
async compactWithRetry(run, signal, provider) {
|
|
443
513
|
return runCompactionWithRetry({
|
|
444
514
|
run,
|