@bastani/atomic 0.9.8 → 0.9.9-alpha.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 +36 -0
- package/dist/builtin/cursor/CHANGELOG.md +12 -0
- package/dist/builtin/cursor/package.json +3 -3
- package/dist/builtin/intercom/CHANGELOG.md +13 -0
- package/dist/builtin/intercom/package.json +3 -3
- package/dist/builtin/mcp/CHANGELOG.md +13 -0
- package/dist/builtin/mcp/package.json +4 -4
- package/dist/builtin/subagents/CHANGELOG.md +13 -0
- package/dist/builtin/subagents/package.json +5 -5
- package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +2 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +7 -1
- package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +2 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +8 -2
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +2 -1
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +2 -0
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +6 -0
- package/dist/builtin/subagents/src/shared/types-config.ts +4 -0
- package/dist/builtin/subagents/src/shared/types-depth.ts +29 -2
- package/dist/builtin/web-access/CHANGELOG.md +13 -0
- package/dist/builtin/web-access/package.json +3 -3
- package/dist/builtin/web-access/web-search-tool.ts +1 -2
- package/dist/builtin/workflows/CHANGELOG.md +29 -0
- package/dist/builtin/workflows/README.md +17 -8
- package/dist/builtin/workflows/builtin/goal-prompts.ts +8 -2
- package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +26 -9
- package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +1 -1
- package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +8 -3
- package/dist/builtin/workflows/builtin/ralph-runner.ts +2 -0
- package/dist/builtin/workflows/builtin/shared-prompts.ts +24 -1
- package/dist/builtin/workflows/package.json +3 -3
- package/dist/builtin/workflows/src/durable/backend.ts +53 -15
- package/dist/builtin/workflows/src/durable/completed-catalog.ts +245 -0
- package/dist/builtin/workflows/src/durable/completed-inspection.ts +213 -0
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +120 -170
- package/dist/builtin/workflows/src/durable/dbos-envelope.ts +84 -8
- package/dist/builtin/workflows/src/durable/dbos-metadata.ts +98 -0
- package/dist/builtin/workflows/src/durable/dbos-tombstone.ts +27 -0
- package/dist/builtin/workflows/src/durable/factory.ts +1 -1
- package/dist/builtin/workflows/src/durable/file-backend.ts +247 -241
- package/dist/builtin/workflows/src/durable/file-lock.ts +153 -0
- package/dist/builtin/workflows/src/durable/file-state.ts +104 -0
- package/dist/builtin/workflows/src/durable/format-version.ts +12 -0
- package/dist/builtin/workflows/src/durable/index.ts +12 -0
- package/dist/builtin/workflows/src/durable/resume-catalog.ts +16 -27
- package/dist/builtin/workflows/src/durable/resume-eligibility.ts +20 -0
- package/dist/builtin/workflows/src/durable/resume-runtime.ts +29 -29
- package/dist/builtin/workflows/src/durable/scoped-backend.ts +20 -3
- package/dist/builtin/workflows/src/durable/stage-primitive.ts +29 -8
- package/dist/builtin/workflows/src/durable/types.ts +3 -0
- package/dist/builtin/workflows/src/engine/primitives/task.ts +1 -0
- package/dist/builtin/workflows/src/engine/run.ts +14 -14
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +39 -9
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +10 -0
- package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +133 -0
- package/dist/builtin/workflows/src/extension/runtime.ts +15 -40
- package/dist/builtin/workflows/src/extension/wiring.ts +9 -6
- package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +226 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +1 -0
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +66 -112
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +5 -5
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +16 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +50 -43
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-output.ts +91 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +95 -46
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +3 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +1 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +3 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +1 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +36 -7
- package/dist/builtin/workflows/src/runs/shared/worktree-cache-lifecycle.ts +25 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-cwd.ts +103 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-generation.ts +57 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +134 -8
- package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -0
- package/dist/builtin/workflows/src/shared/resumable-workflow-notices.ts +43 -0
- package/dist/builtin/workflows/src/shared/serializable.ts +1 -1
- package/dist/builtin/workflows/src/shared/timing.ts +4 -0
- package/dist/builtin/workflows/src/shared/types.ts +5 -3
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +1 -0
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +24 -14
- package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +43 -13
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/internal-intercom-broker.d.ts.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/split-loader.d.ts.map +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/project-trust.d.ts.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/config-self-update.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/core/agent-session-accessors.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +5 -7
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.d.ts +6 -34
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +95 -233
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-export.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts +0 -4
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +1 -5
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +5 -6
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-models.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-skill-block.d.ts.map +1 -1
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tree.d.ts.map +1 -1
- package/dist/core/agent-session-types.d.ts +2 -12
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
- package/dist/core/async/format.d.ts.map +1 -1
- package/dist/core/async/job-manager.d.ts.map +1 -1
- package/dist/core/async/session-manager.d.ts.map +1 -1
- package/dist/core/async/types.d.ts.map +1 -1
- package/dist/core/atomic-guide-command.d.ts.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-storage-backends.d.ts.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/builtin-packages.d.ts.map +1 -1
- package/dist/core/codex-fast-mode.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -2
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction-boundary.d.ts +9 -0
- package/dist/core/compaction/compaction-boundary.d.ts.map +1 -0
- package/dist/core/compaction/compaction-boundary.js +115 -0
- package/dist/core/compaction/compaction-boundary.js.map +1 -0
- package/dist/core/compaction/compaction-parameters.d.ts +5 -0
- package/dist/core/compaction/compaction-parameters.d.ts.map +1 -0
- package/dist/core/compaction/compaction-parameters.js +27 -0
- package/dist/core/compaction/compaction-parameters.js.map +1 -0
- package/dist/core/compaction/compaction-runner.d.ts +14 -0
- package/dist/core/compaction/compaction-runner.d.ts.map +1 -0
- package/dist/core/compaction/compaction-runner.js +29 -0
- package/dist/core/compaction/compaction-runner.js.map +1 -0
- package/dist/core/compaction/compaction-types.d.ts +79 -0
- package/dist/core/compaction/compaction-types.d.ts.map +1 -0
- package/dist/core/compaction/compaction-types.js +6 -0
- package/dist/core/compaction/compaction-types.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/deleted-ranges.d.ts +6 -0
- package/dist/core/compaction/deleted-ranges.d.ts.map +1 -0
- package/dist/core/compaction/deleted-ranges.js +134 -0
- package/dist/core/compaction/deleted-ranges.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -1
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +7 -1
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/range-planner.d.ts +21 -0
- package/dist/core/compaction/range-planner.d.ts.map +1 -0
- package/dist/core/compaction/range-planner.js +145 -0
- package/dist/core/compaction/range-planner.js.map +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts +11 -0
- package/dist/core/compaction/transcript-serialization.d.ts.map +1 -0
- package/dist/core/compaction/transcript-serialization.js +104 -0
- package/dist/core/compaction/transcript-serialization.js.map +1 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/context-window.d.ts.map +1 -1
- package/dist/core/copilot-anthropic-sse-repair.d.ts.map +1 -1
- package/dist/core/copilot-errors.d.ts.map +1 -1
- package/dist/core/copilot-gemini-payload-sanitizer.d.ts.map +1 -1
- package/dist/core/copilot-gemini-reasoning.d.ts.map +1 -1
- package/dist/core/copilot-gemini-tool-arguments.d.ts.map +1 -1
- package/dist/core/copilot-hosts.d.ts.map +1 -1
- package/dist/core/copilot-model-catalog.d.ts.map +1 -1
- package/dist/core/copilot-model-static-fallbacks.d.ts.map +1 -1
- package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/template-script.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/extensions/agent-events.d.ts.map +1 -1
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/command-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.d.ts +2 -2
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/event-results.d.ts +2 -2
- package/dist/core/extensions/event-results.d.ts.map +1 -1
- package/dist/core/extensions/event-results.js.map +1 -1
- package/dist/core/extensions/event-types.d.ts.map +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-core.d.ts.map +1 -1
- package/dist/core/extensions/loader-discovery.d.ts.map +1 -1
- package/dist/core/extensions/loader-resources.d.ts.map +1 -1
- package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/message-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/reactive-widget.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-events.d.ts.map +1 -1
- package/dist/core/extensions/runner-handlers.d.ts.map +1 -1
- package/dist/core/extensions/runner-project-trust.d.ts.map +1 -1
- package/dist/core/extensions/runner-registries.d.ts.map +1 -1
- package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -1
- package/dist/core/extensions/runner-ui.d.ts.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/session-events.d.ts +7 -7
- package/dist/core/extensions/session-events.d.ts.map +1 -1
- package/dist/core/extensions/session-events.js.map +1 -1
- package/dist/core/extensions/tool-events.d.ts.map +1 -1
- package/dist/core/extensions/tool-types.d.ts.map +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/messages.d.ts +4 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +11 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry-auth.d.ts.map +1 -1
- package/dist/core/model-registry-builtins.d.ts.map +1 -1
- package/dist/core/model-registry-builtins.js.map +1 -1
- package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
- package/dist/core/model-registry-custom-loader.js.map +1 -1
- package/dist/core/model-registry-dynamic.d.ts.map +1 -1
- package/dist/core/model-registry-loader.d.ts.map +1 -1
- package/dist/core/model-registry-schemas.d.ts +65 -13
- package/dist/core/model-registry-schemas.d.ts.map +1 -1
- package/dist/core/model-registry-schemas.js +5 -1
- package/dist/core/model-registry-schemas.js.map +1 -1
- package/dist/core/model-registry-types.d.ts.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-resolver-cli.d.ts.map +1 -1
- package/dist/core/model-resolver-defaults.d.ts.map +1 -1
- package/dist/core/model-resolver-initial.d.ts.map +1 -1
- package/dist/core/model-resolver-patterns.d.ts.map +1 -1
- package/dist/core/model-resolver-scope.d.ts.map +1 -1
- package/dist/core/model-resolver-types.d.ts.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
- package/dist/core/package-manager-command.d.ts.map +1 -1
- package/dist/core/package-manager-constants.d.ts.map +1 -1
- package/dist/core/package-manager-env.d.ts.map +1 -1
- package/dist/core/package-manager-git.d.ts.map +1 -1
- package/dist/core/package-manager-manifest.d.ts.map +1 -1
- package/dist/core/package-manager-npm.d.ts.map +1 -1
- package/dist/core/package-manager-operations.d.ts.map +1 -1
- package/dist/core/package-manager-paths.d.ts.map +1 -1
- package/dist/core/package-manager-progress.d.ts.map +1 -1
- package/dist/core/package-manager-resolver.d.ts.map +1 -1
- package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -1
- package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
- package/dist/core/package-manager-resource-files.d.ts.map +1 -1
- package/dist/core/package-manager-resource-patterns.d.ts.map +1 -1
- package/dist/core/package-manager-settings.d.ts.map +1 -1
- package/dist/core/package-manager-source.d.ts.map +1 -1
- package/dist/core/package-manager-types.d.ts.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/prompt-templates-async.d.ts.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-context-usage.d.ts.map +1 -1
- package/dist/core/provider-context-usage.js +1 -2
- package/dist/core/provider-context-usage.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resource-loader-assets.d.ts.map +1 -1
- package/dist/core/resource-loader-context-files.d.ts.map +1 -1
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-discovery.d.ts.map +1 -1
- package/dist/core/resource-loader-extensions.d.ts.map +1 -1
- package/dist/core/resource-loader-helpers.d.ts.map +1 -1
- package/dist/core/resource-loader-internals.d.ts.map +1 -1
- package/dist/core/resource-loader-package-resources.d.ts.map +1 -1
- package/dist/core/resource-loader-paths.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-source-info.d.ts.map +1 -1
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/sdk-exports.d.ts.map +1 -1
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-entry-normalization.d.ts.map +1 -1
- package/dist/core/session-manager-archive.d.ts +2 -1
- package/dist/core/session-manager-archive.d.ts.map +1 -1
- package/dist/core/session-manager-archive.js +2 -2
- package/dist/core/session-manager-archive.js.map +1 -1
- package/dist/core/session-manager-classification.d.ts +9 -0
- package/dist/core/session-manager-classification.d.ts.map +1 -0
- package/dist/core/session-manager-classification.js +37 -0
- package/dist/core/session-manager-classification.js.map +1 -0
- package/dist/core/session-manager-core.d.ts +4 -4
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +13 -8
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +4 -3
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js +12 -10
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-history.d.ts +6 -23
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +23 -256
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/session-manager-list.d.ts.map +1 -1
- package/dist/core/session-manager-list.js +3 -3
- package/dist/core/session-manager-list.js.map +1 -1
- package/dist/core/session-manager-migrations.d.ts.map +1 -1
- package/dist/core/session-manager-paths.d.ts.map +1 -1
- package/dist/core/session-manager-storage.d.ts +1 -1
- package/dist/core/session-manager-storage.d.ts.map +1 -1
- package/dist/core/session-manager-storage.js +3 -2
- package/dist/core/session-manager-storage.js.map +1 -1
- package/dist/core/session-manager-types.d.ts +14 -15
- package/dist/core/session-manager-types.d.ts.map +1 -1
- package/dist/core/session-manager-types.js.map +1 -1
- package/dist/core/session-manager-validation.d.ts.map +1 -1
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-core.d.ts.map +1 -1
- package/dist/core/settings-manager-internals.d.ts.map +1 -1
- package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-merge.d.ts.map +1 -1
- package/dist/core/settings-storage.d.ts.map +1 -1
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/skills-async.d.ts.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/thinking-blocks.d.ts.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/tools/artifact-protocol.d.ts.map +1 -1
- package/dist/core/tools/artifacts.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/config.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/index.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/inline-input.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/key-router.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/row-intent.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/selectors/derivations.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/selectors/focus.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/selectors/projections.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/state-reducer.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/state/state.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/tool/format-answer.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/tool/response-envelope.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/tool/types.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/tool/validate-questionnaire.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/body-residual-spacer.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/component-binding.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/chat-row-view.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/props-adapter.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/stateful-view.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/tab-components.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts.map +1 -1
- package/dist/core/tools/bash-async-execution.d.ts.map +1 -1
- package/dist/core/tools/bash-async-jobs.d.ts.map +1 -1
- package/dist/core/tools/bash-async-output.d.ts.map +1 -1
- package/dist/core/tools/bash-interceptor.d.ts.map +1 -1
- package/dist/core/tools/bash-leading-cd.d.ts.map +1 -1
- package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/block-resolver.d.ts.map +1 -1
- package/dist/core/tools/conflict-registry.d.ts.map +1 -1
- package/dist/core/tools/directory-tree.d.ts.map +1 -1
- package/dist/core/tools/edit-diff-preserve.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/fetch-url.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/glob-path-utils.d.ts.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/apply.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/block.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/diff-preview.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/fs.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/index.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/input.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/mismatch.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/normalize.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/patcher.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/prefixes.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/recovery.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/snapshots.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/stream.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/types.d.ts.map +1 -1
- package/dist/core/tools/hashline.d.ts.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/notebook.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/oversized-tool-result.d.ts.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/read-document-extract.d.ts.map +1 -1
- package/dist/core/tools/read-selectors.d.ts.map +1 -1
- package/dist/core/tools/read-url.d.ts.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/resource-selectors.d.ts.map +1 -1
- package/dist/core/tools/search-details.d.ts.map +1 -1
- package/dist/core/tools/search-line-ranges.d.ts.map +1 -1
- package/dist/core/tools/search-native.d.ts.map +1 -1
- package/dist/core/tools/search.d.ts.map +1 -1
- package/dist/core/tools/structured-output.d.ts.map +1 -1
- package/dist/core/tools/todos-execute.d.ts.map +1 -1
- package/dist/core/tools/todos-locks.d.ts.map +1 -1
- package/dist/core/tools/todos-model.d.ts.map +1 -1
- package/dist/core/tools/todos-mutations.d.ts.map +1 -1
- package/dist/core/tools/todos-paths.d.ts.map +1 -1
- package/dist/core/tools/todos-render.d.ts.map +1 -1
- package/dist/core/tools/todos-storage.d.ts.map +1 -1
- package/dist/core/tools/todos-types.d.ts.map +1 -1
- package/dist/core/tools/todos-types.js +1 -1
- package/dist/core/tools/todos-types.js.map +1 -1
- package/dist/core/tools/todos.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +6 -2
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/tool-limits.d.ts.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/url-ip-guards.d.ts.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/typebox-compat.d.ts +12 -0
- package/dist/core/typebox-compat.d.ts.map +1 -0
- package/dist/core/typebox-compat.js +10 -0
- package/dist/core/typebox-compat.js.map +1 -0
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/main-app-mode.d.ts.map +1 -1
- package/dist/main-deferred-startup.d.ts.map +1 -1
- package/dist/main-early-input.d.ts.map +1 -1
- package/dist/main-session-options.d.ts.map +1 -1
- package/dist/main-session.d.ts +1 -0
- package/dist/main-session.d.ts.map +1 -1
- package/dist/main-session.js +7 -0
- package/dist/main-session.js.map +1 -1
- package/dist/main-stdio.d.ts.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/migrations-config-values.d.ts.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts +4 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js +12 -22
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.js +5 -11
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js +3 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +1 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +1 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-utils.js +1 -1
- package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +1 -0
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts +20 -0
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-boundary-message.js +48 -0
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/context-window-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/fast-mode-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-delete.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-header.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-list.js +3 -0
- package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-tree.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-utils.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-component.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-help.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-label-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-model.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-viewport.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/working-status.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +3 -47
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-extension-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -2
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +5 -3
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-queueing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +21 -12
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-resource-paths.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/model-search.d.ts.map +1 -1
- package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
- package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -1
- package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-parse.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/tui-theme.d.ts.map +1 -1
- package/dist/modes/interactive/whimsical-messages.d.ts.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +3 -5
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +1 -6
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +0 -4
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-responses.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -11
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli-parser.d.ts.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/rpc-entry.d.ts.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/event-loop.d.ts.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/git-env.d.ts.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-process.d.ts.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/markit.d.ts.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/module-require.d.ts.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/split-launcher.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/docs/compaction.md +97 -772
- package/docs/custom-provider.md +7 -1
- package/docs/extensions.md +31 -33
- package/docs/json.md +2 -2
- package/docs/rpc.md +32 -24
- package/docs/sdk.md +3 -3
- package/docs/session-format.md +49 -30
- package/docs/sessions.md +5 -3
- package/docs/settings.md +14 -4
- package/docs/usage.md +1 -1
- package/docs/workflows.md +30 -15
- package/examples/extensions/README.md +3 -1
- package/examples/extensions/custom-compaction.ts +14 -58
- package/examples/extensions/handoff.ts +2 -3
- package/examples/extensions/subagent/schemas.ts +1 -1
- package/examples/extensions/tic-tac-toe.ts +1 -2
- package/examples/extensions/todo.ts +1 -2
- package/npm-shrinkwrap.json +214 -98
- package/package.json +12 -12
- package/dist/core/compaction/context-assistant-turns.d.ts +0 -42
- package/dist/core/compaction/context-assistant-turns.d.ts.map +0 -1
- package/dist/core/compaction/context-assistant-turns.js +0 -87
- package/dist/core/compaction/context-assistant-turns.js.map +0 -1
- package/dist/core/compaction/context-compaction-critical.d.ts +0 -15
- package/dist/core/compaction/context-compaction-critical.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-critical.js +0 -57
- package/dist/core/compaction/context-compaction-critical.js.map +0 -1
- package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +0 -18
- package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-eviction-alternates.js +0 -186
- package/dist/core/compaction/context-compaction-eviction-alternates.js.map +0 -1
- package/dist/core/compaction/context-compaction-eviction.d.ts +0 -12
- package/dist/core/compaction/context-compaction-eviction.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-eviction.js +0 -222
- package/dist/core/compaction/context-compaction-eviction.js.map +0 -1
- package/dist/core/compaction/context-compaction-metrics.d.ts +0 -28
- package/dist/core/compaction/context-compaction-metrics.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-metrics.js +0 -107
- package/dist/core/compaction/context-compaction-metrics.js.map +0 -1
- package/dist/core/compaction/context-compaction-prompt.d.ts +0 -9
- package/dist/core/compaction/context-compaction-prompt.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-prompt.js +0 -163
- package/dist/core/compaction/context-compaction-prompt.js.map +0 -1
- package/dist/core/compaction/context-compaction-runner.d.ts +0 -11
- package/dist/core/compaction/context-compaction-runner.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-runner.js +0 -273
- package/dist/core/compaction/context-compaction-runner.js.map +0 -1
- package/dist/core/compaction/context-compaction-strategy.d.ts +0 -5
- package/dist/core/compaction/context-compaction-strategy.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-strategy.js +0 -27
- package/dist/core/compaction/context-compaction-strategy.js.map +0 -1
- package/dist/core/compaction/context-compaction-types.d.ts +0 -75
- package/dist/core/compaction/context-compaction-types.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction-types.js +0 -6
- package/dist/core/compaction/context-compaction-types.js.map +0 -1
- package/dist/core/compaction/context-compaction.d.ts +0 -10
- package/dist/core/compaction/context-compaction.d.ts.map +0 -1
- package/dist/core/compaction/context-compaction.js +0 -8
- package/dist/core/compaction/context-compaction.js.map +0 -1
- package/dist/core/compaction/context-deletion-application.d.ts +0 -14
- package/dist/core/compaction/context-deletion-application.d.ts.map +0 -1
- package/dist/core/compaction/context-deletion-application.js +0 -261
- package/dist/core/compaction/context-deletion-application.js.map +0 -1
- package/dist/core/compaction/context-deletion-store.d.ts +0 -78
- package/dist/core/compaction/context-deletion-store.d.ts.map +0 -1
- package/dist/core/compaction/context-deletion-store.js +0 -162
- package/dist/core/compaction/context-deletion-store.js.map +0 -1
- package/dist/core/compaction/context-deletion-targets.d.ts +0 -43
- package/dist/core/compaction/context-deletion-targets.d.ts.map +0 -1
- package/dist/core/compaction/context-deletion-targets.js +0 -292
- package/dist/core/compaction/context-deletion-targets.js.map +0 -1
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts +0 -193
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +0 -1
- package/dist/core/compaction/context-deletion-tool-definitions.js +0 -98
- package/dist/core/compaction/context-deletion-tool-definitions.js.map +0 -1
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts +0 -19
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +0 -1
- package/dist/core/compaction/context-deletion-tool-helpers.js +0 -210
- package/dist/core/compaction/context-deletion-tool-helpers.js.map +0 -1
- package/dist/core/compaction/context-deletion-tools.d.ts +0 -4
- package/dist/core/compaction/context-deletion-tools.d.ts.map +0 -1
- package/dist/core/compaction/context-deletion-tools.js +0 -403
- package/dist/core/compaction/context-deletion-tools.js.map +0 -1
- package/dist/core/compaction/context-transcript-analysis.d.ts +0 -11
- package/dist/core/compaction/context-transcript-analysis.d.ts.map +0 -1
- package/dist/core/compaction/context-transcript-analysis.js +0 -228
- package/dist/core/compaction/context-transcript-analysis.js.map +0 -1
- package/dist/core/session-manager-tool-dependencies.d.ts +0 -10
- package/dist/core/session-manager-tool-dependencies.d.ts.map +0 -1
- package/dist/core/session-manager-tool-dependencies.js +0 -133
- package/dist/core/session-manager-tool-dependencies.js.map +0 -1
- package/dist/modes/interactive/components/context-compaction-summary-message.d.ts +0 -17
- package/dist/modes/interactive/components/context-compaction-summary-message.d.ts.map +0 -1
- package/dist/modes/interactive/components/context-compaction-summary-message.js +0 -83
- package/dist/modes/interactive/components/context-compaction-summary-message.js.map +0 -1
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { messageStartsLlmUserTurn, userLikeContentBlockIsLlmVisible } from "../messages.js";
|
|
2
|
-
import { isAssistantThinkingBlockType, messageHasAssistantThinkingContentBlock } from "../thinking-blocks.js";
|
|
3
|
-
export function assistantEntryHasThinkingContentBlock(entry) {
|
|
4
|
-
return (entry.role === "assistant" &&
|
|
5
|
-
(entry.contentBlocks.some((block) => isAssistantThinkingBlockType(block.type)) ||
|
|
6
|
-
messageHasAssistantThinkingContentBlock(entry.message)));
|
|
7
|
-
}
|
|
8
|
-
export function compactableContentBlockIsLlmVisible(entry, block) {
|
|
9
|
-
if (typeof block.llmVisible === "boolean")
|
|
10
|
-
return block.llmVisible;
|
|
11
|
-
const rawContent = entry.message.content;
|
|
12
|
-
return Array.isArray(rawContent) && userLikeContentBlockIsLlmVisible(rawContent[block.blockIndex]);
|
|
13
|
-
}
|
|
14
|
-
export function transcriptEntryStartsNewTurn(entry, deletedContentBlocks = new Set()) {
|
|
15
|
-
if (entry.role === "user" || entry.role === "custom") {
|
|
16
|
-
const content = entry.message.content;
|
|
17
|
-
if (typeof content === "string" || entry.contentBlocks.length === 0) {
|
|
18
|
-
return messageStartsLlmUserTurn(entry.message, deletedContentBlocks);
|
|
19
|
-
}
|
|
20
|
-
return entry.contentBlocks.some((block) => !deletedContentBlocks.has(block.blockIndex) && compactableContentBlockIsLlmVisible(entry, block));
|
|
21
|
-
}
|
|
22
|
-
return messageStartsLlmUserTurn(entry.message, deletedContentBlocks);
|
|
23
|
-
}
|
|
24
|
-
export function isTranscriptEntryEffectivelyDeleted(entry, deletedEntryIds, deletedContentBlocks) {
|
|
25
|
-
if (deletedEntryIds.has(entry.entryId))
|
|
26
|
-
return true;
|
|
27
|
-
const deletedBlocks = deletedContentBlocks.get(entry.entryId);
|
|
28
|
-
return (entry.contentBlocks.length > 0 &&
|
|
29
|
-
deletedBlocks !== undefined &&
|
|
30
|
-
entry.contentBlocks.every((block) => deletedBlocks.has(block.blockIndex)));
|
|
31
|
-
}
|
|
32
|
-
/** Shared adaptation from compactable transcript entries to logical assistant-turn inputs. */
|
|
33
|
-
export function compactableTranscriptToAssistantTurnEntries(transcript, deletedEntryIds, deletedContentBlocks) {
|
|
34
|
-
return transcript.entries.map((entry) => ({
|
|
35
|
-
entryId: entry.entryId,
|
|
36
|
-
role: entry.role,
|
|
37
|
-
hasSignedThinking: assistantEntryHasThinkingContentBlock(entry),
|
|
38
|
-
startsNewTurn: !isTranscriptEntryEffectivelyDeleted(entry, deletedEntryIds, deletedContentBlocks) &&
|
|
39
|
-
transcriptEntryStartsNewTurn(entry, deletedContentBlocks.get(entry.entryId)),
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
/** Analyze assistant turns after projecting a compactable transcript through deletion targets. */
|
|
43
|
-
export function analyzeCompactableAssistantTurns(transcript, targets) {
|
|
44
|
-
const deletedEntryIds = new Set();
|
|
45
|
-
const deletedContentBlocks = new Map();
|
|
46
|
-
for (const target of targets) {
|
|
47
|
-
if (target.kind === "entry") {
|
|
48
|
-
deletedEntryIds.add(target.entryId);
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
const blockIndexes = deletedContentBlocks.get(target.entryId) ?? new Set();
|
|
52
|
-
blockIndexes.add(target.blockIndex);
|
|
53
|
-
deletedContentBlocks.set(target.entryId, blockIndexes);
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
deletedEntryIds,
|
|
57
|
-
deletedContentBlocks,
|
|
58
|
-
turns: analyzeAssistantToolUseTurns(compactableTranscriptToAssistantTurnEntries(transcript, deletedEntryIds, deletedContentBlocks)),
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Analyze chronological LLM-visible entries as logical assistant tool-use turns.
|
|
63
|
-
* Callers adapt each context-visible user-like message into `startsNewTurn`;
|
|
64
|
-
* tool results remain in the current turn. A trailing input-only turn is omitted,
|
|
65
|
-
* intentionally leaving the preceding assistant turn historical rather than active.
|
|
66
|
-
*/
|
|
67
|
-
export function analyzeAssistantToolUseTurns(entries) {
|
|
68
|
-
const groups = [];
|
|
69
|
-
let current;
|
|
70
|
-
for (const entry of entries) {
|
|
71
|
-
if (entry.startsNewTurn || current === undefined) {
|
|
72
|
-
current = { entryIds: [], assistantEntryIds: [], signedThinkingEntryIds: [] };
|
|
73
|
-
groups.push(current);
|
|
74
|
-
}
|
|
75
|
-
current.entryIds.push(entry.entryId);
|
|
76
|
-
if (entry.role !== "assistant")
|
|
77
|
-
continue;
|
|
78
|
-
current.assistantEntryIds.push(entry.entryId);
|
|
79
|
-
if (entry.hasSignedThinking)
|
|
80
|
-
current.signedThinkingEntryIds.push(entry.entryId);
|
|
81
|
-
}
|
|
82
|
-
const activeIndex = groups.length - 1;
|
|
83
|
-
return groups
|
|
84
|
-
.map((turn, index) => ({ ...turn, active: index === activeIndex }))
|
|
85
|
-
.filter((turn) => turn.assistantEntryIds.length > 0);
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=context-assistant-turns.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-assistant-turns.js","sourceRoot":"","sources":["../../../src/core/compaction/context-assistant-turns.ts"],"names":[],"mappings":"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","sourcesContent":["import { messageStartsLlmUserTurn, userLikeContentBlockIsLlmVisible } from \"../messages.js\";\nimport type {\n\tCompactableContentBlock,\n\tCompactableTranscript,\n\tCompactableTranscriptEntry,\n} from \"./context-compaction-types.js\";\nimport { isAssistantThinkingBlockType, messageHasAssistantThinkingContentBlock } from \"../thinking-blocks.js\";\n\nexport function assistantEntryHasThinkingContentBlock(entry: CompactableTranscriptEntry): boolean {\n\treturn (\n\t\tentry.role === \"assistant\" &&\n\t\t(entry.contentBlocks.some((block) => isAssistantThinkingBlockType(block.type)) ||\n\t\t\tmessageHasAssistantThinkingContentBlock(entry.message))\n\t);\n}\n\nexport interface AssistantTurnEntry {\n\tentryId: string;\n\trole: string;\n\thasSignedThinking: boolean;\n\tstartsNewTurn: boolean;\n}\n\nexport interface AssistantToolUseTurn {\n\tentryIds: string[];\n\tassistantEntryIds: string[];\n\tsignedThinkingEntryIds: string[];\n\tactive: boolean;\n}\n\nexport type CompactableTranscriptDeletionTarget =\n\t| { readonly kind: \"entry\"; readonly entryId: string }\n\t| { readonly kind: \"content_block\"; readonly entryId: string; readonly blockIndex: number };\n\nexport interface CompactableAssistantTurnAnalysis {\n\tdeletedEntryIds: ReadonlySet<string>;\n\tdeletedContentBlocks: ReadonlyMap<string, ReadonlySet<number>>;\n\tturns: AssistantToolUseTurn[];\n}\n\nexport function compactableContentBlockIsLlmVisible(\n\tentry: CompactableTranscriptEntry,\n\tblock: CompactableContentBlock,\n): boolean {\n\tif (typeof block.llmVisible === \"boolean\") return block.llmVisible;\n\tconst rawContent = (entry.message as { content?: unknown }).content;\n\treturn Array.isArray(rawContent) && userLikeContentBlockIsLlmVisible(rawContent[block.blockIndex]);\n}\n\nexport function transcriptEntryStartsNewTurn(\n\tentry: CompactableTranscriptEntry,\n\tdeletedContentBlocks: ReadonlySet<number> = new Set<number>(),\n): boolean {\n\tif (entry.role === \"user\" || entry.role === \"custom\") {\n\t\tconst content = (entry.message as { content?: unknown }).content;\n\t\tif (typeof content === \"string\" || entry.contentBlocks.length === 0) {\n\t\t\treturn messageStartsLlmUserTurn(entry.message, deletedContentBlocks);\n\t\t}\n\t\treturn entry.contentBlocks.some(\n\t\t\t(block) => !deletedContentBlocks.has(block.blockIndex) && compactableContentBlockIsLlmVisible(entry, block),\n\t\t);\n\t}\n\treturn messageStartsLlmUserTurn(entry.message, deletedContentBlocks);\n}\n\nexport function isTranscriptEntryEffectivelyDeleted(\n\tentry: CompactableTranscriptEntry,\n\tdeletedEntryIds: ReadonlySet<string>,\n\tdeletedContentBlocks: ReadonlyMap<string, ReadonlySet<number>>,\n): boolean {\n\tif (deletedEntryIds.has(entry.entryId)) return true;\n\tconst deletedBlocks = deletedContentBlocks.get(entry.entryId);\n\treturn (\n\t\tentry.contentBlocks.length > 0 &&\n\t\tdeletedBlocks !== undefined &&\n\t\tentry.contentBlocks.every((block) => deletedBlocks.has(block.blockIndex))\n\t);\n}\n\n/** Shared adaptation from compactable transcript entries to logical assistant-turn inputs. */\nexport function compactableTranscriptToAssistantTurnEntries(\n\ttranscript: CompactableTranscript,\n\tdeletedEntryIds: ReadonlySet<string>,\n\tdeletedContentBlocks: ReadonlyMap<string, ReadonlySet<number>>,\n): AssistantTurnEntry[] {\n\treturn transcript.entries.map((entry) => ({\n\t\tentryId: entry.entryId,\n\t\trole: entry.role,\n\t\thasSignedThinking: assistantEntryHasThinkingContentBlock(entry),\n\t\tstartsNewTurn:\n\t\t\t!isTranscriptEntryEffectivelyDeleted(entry, deletedEntryIds, deletedContentBlocks) &&\n\t\t\ttranscriptEntryStartsNewTurn(entry, deletedContentBlocks.get(entry.entryId)),\n\t}));\n}\n\n/** Analyze assistant turns after projecting a compactable transcript through deletion targets. */\nexport function analyzeCompactableAssistantTurns(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly CompactableTranscriptDeletionTarget[],\n): CompactableAssistantTurnAnalysis {\n\tconst deletedEntryIds = new Set<string>();\n\tconst deletedContentBlocks = new Map<string, Set<number>>();\n\tfor (const target of targets) {\n\t\tif (target.kind === \"entry\") {\n\t\t\tdeletedEntryIds.add(target.entryId);\n\t\t\tcontinue;\n\t\t}\n\t\tconst blockIndexes = deletedContentBlocks.get(target.entryId) ?? new Set<number>();\n\t\tblockIndexes.add(target.blockIndex);\n\t\tdeletedContentBlocks.set(target.entryId, blockIndexes);\n\t}\n\treturn {\n\t\tdeletedEntryIds,\n\t\tdeletedContentBlocks,\n\t\tturns: analyzeAssistantToolUseTurns(\n\t\t\tcompactableTranscriptToAssistantTurnEntries(transcript, deletedEntryIds, deletedContentBlocks),\n\t\t),\n\t};\n}\n\n/**\n * Analyze chronological LLM-visible entries as logical assistant tool-use turns.\n * Callers adapt each context-visible user-like message into `startsNewTurn`;\n * tool results remain in the current turn. A trailing input-only turn is omitted,\n * intentionally leaving the preceding assistant turn historical rather than active.\n */\nexport function analyzeAssistantToolUseTurns(entries: readonly AssistantTurnEntry[]): AssistantToolUseTurn[] {\n\tconst groups: Array<Omit<AssistantToolUseTurn, \"active\">> = [];\n\tlet current: Omit<AssistantToolUseTurn, \"active\"> | undefined;\n\n\tfor (const entry of entries) {\n\t\tif (entry.startsNewTurn || current === undefined) {\n\t\t\tcurrent = { entryIds: [], assistantEntryIds: [], signedThinkingEntryIds: [] };\n\t\t\tgroups.push(current);\n\t\t}\n\t\tcurrent.entryIds.push(entry.entryId);\n\t\tif (entry.role !== \"assistant\") continue;\n\t\tcurrent.assistantEntryIds.push(entry.entryId);\n\t\tif (entry.hasSignedThinking) current.signedThinkingEntryIds.push(entry.entryId);\n\t}\n\n\tconst activeIndex = groups.length - 1;\n\treturn groups\n\t\t.map((turn, index) => ({ ...turn, active: index === activeIndex }))\n\t\t.filter((turn) => turn.assistantEntryIds.length > 0);\n}\n"]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { CompactableTranscript, CompactableTranscriptEntry, ContextCompactionParameters } from "./context-compaction-types.ts";
|
|
2
|
-
export declare const CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT = 5;
|
|
3
|
-
export declare function criticalCompactionParameters(parameters: ContextCompactionParameters): ContextCompactionParameters;
|
|
4
|
-
export declare function isCriticalOverflowProtectedEntryDeletable(entry: CompactableTranscriptEntry, transcript: CompactableTranscript): boolean;
|
|
5
|
-
/**
|
|
6
|
-
* Return a transcript for critical overflow passes. The effective recent guard is
|
|
7
|
-
* widened to max(configured preserve_recent, 5) over all entries, restoring the
|
|
8
|
-
* pre-#1399 critical-overflow last-5 floor through the existing recent-target
|
|
9
|
-
* validation path. Only stale protected task-bearing entries outside that floor
|
|
10
|
-
* are relaxed; `protectedEntryIds` is rebuilt from still-protected entries so
|
|
11
|
-
* persisted results/events stay disjoint from deleted targets.
|
|
12
|
-
*/
|
|
13
|
-
export declare function relaxTranscriptForCriticalEviction(transcript: CompactableTranscript): CompactableTranscript;
|
|
14
|
-
export declare const CONTEXT_COMPACTION_CRITICAL_OVERFLOW_PROMPT = "\n<critical-overflow-mode>\nThe previous model request overflowed its context window. This is a critical LRU-style compaction pass. First delete stale unprotected context. If that is not enough, you may also delete the earliest formerly-protected entries or protected content shown in the manifest. Evict old low-signal context first, then older user/custom/summary context while preserving recent entries, unresolved errors, failed commands, and enough task-bearing context for the assistant to continue.\n\nSafety invariant: each provider-visible user-like input starts a logical assistant tool-use turn: a non-empty user/custom input, a context-eligible bash execution, or a non-empty branch summary. Empty or whitespace-only user/custom inputs and empty branch summaries do not split turns; whitespace-only branch summaries remain visible through their wrapper. Assistant messages and intervening tool results remain in the turn until the next visible input. Never delete a thinking/redacted_thinking-bearing assistant entry from the current final logical turn; a trailing visible input without an assistant response makes the preceding assistant turn historical. For a completed historical turn, retain every thinking/redacted_thinking-bearing assistant entry or delete all of them as whole entries. Never retain a proper subset or partially delete a retained thinking-bearing assistant message.\n</critical-overflow-mode>";
|
|
15
|
-
//# sourceMappingURL=context-compaction-critical.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-compaction-critical.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-critical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAKpI,eAAO,MAAM,4CAA4C,IAAI,CAAC;AAE9D,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,2BAA2B,GAAG,2BAA2B,CAKjH;AAED,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,0BAA0B,EACjC,UAAU,EAAE,qBAAqB,GAC/B,OAAO,CAUT;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,qBAAqB,GAAG,qBAAqB,CAgB3G;AAED,eAAO,MAAM,2CAA2C,w5CAK9B,CAAC","sourcesContent":["import type { CompactableTranscript, CompactableTranscriptEntry, ContextCompactionParameters } from \"./context-compaction-types.ts\";\nimport { getTranscriptCompactionParameters } from \"./context-compaction-strategy.ts\";\nimport { isTaskBearingEntry } from \"./context-deletion-targets.ts\";\nimport { hasAssistantError, hasFailedBashExecution, hasToolResultError } from \"./context-transcript-analysis.ts\";\n\nexport const CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT = 5;\n\nexport function criticalCompactionParameters(parameters: ContextCompactionParameters): ContextCompactionParameters {\n\treturn {\n\t\t...parameters,\n\t\tpreserve_recent: Math.max(parameters.preserve_recent, CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT),\n\t};\n}\n\nexport function isCriticalOverflowProtectedEntryDeletable(\n\tentry: CompactableTranscriptEntry,\n\ttranscript: CompactableTranscript,\n): boolean {\n\tif (!entry.protected) return true;\n\tconst entryIndex = transcript.entries.findIndex((candidate) => candidate.entryId === entry.entryId);\n\tif (entryIndex < 0) return false;\n\tconst recentBoundary = Math.max(0, transcript.entries.length - CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT);\n\tif (entryIndex >= recentBoundary) return false;\n\tif (hasAssistantError(entry.message) || hasToolResultError(entry.message) || hasFailedBashExecution(entry.message)) {\n\t\treturn false;\n\t}\n\treturn isTaskBearingEntry(entry);\n}\n\n/**\n * Return a transcript for critical overflow passes. The effective recent guard is\n * widened to max(configured preserve_recent, 5) over all entries, restoring the\n * pre-#1399 critical-overflow last-5 floor through the existing recent-target\n * validation path. Only stale protected task-bearing entries outside that floor\n * are relaxed; `protectedEntryIds` is rebuilt from still-protected entries so\n * persisted results/events stay disjoint from deleted targets.\n */\nexport function relaxTranscriptForCriticalEviction(transcript: CompactableTranscript): CompactableTranscript {\n\tconst entries = transcript.entries.map((entry) => {\n\t\tif (!entry.protected || !isCriticalOverflowProtectedEntryDeletable(entry, transcript)) return entry;\n\t\treturn {\n\t\t\t...entry,\n\t\t\tprotected: false,\n\t\t\tcontentBlocks: entry.contentBlocks.map((block) => ({ ...block, protected: false })),\n\t\t};\n\t});\n\tconst parameters = criticalCompactionParameters(getTranscriptCompactionParameters(transcript));\n\treturn {\n\t\t...transcript,\n\t\tentries,\n\t\tparameters,\n\t\tprotectedEntryIds: entries.filter((entry) => entry.protected).map((entry) => entry.entryId),\n\t};\n}\n\nexport const CONTEXT_COMPACTION_CRITICAL_OVERFLOW_PROMPT = `\n<critical-overflow-mode>\nThe previous model request overflowed its context window. This is a critical LRU-style compaction pass. First delete stale unprotected context. If that is not enough, you may also delete the earliest formerly-protected entries or protected content shown in the manifest. Evict old low-signal context first, then older user/custom/summary context while preserving recent entries, unresolved errors, failed commands, and enough task-bearing context for the assistant to continue.\n\nSafety invariant: each provider-visible user-like input starts a logical assistant tool-use turn: a non-empty user/custom input, a context-eligible bash execution, or a non-empty branch summary. Empty or whitespace-only user/custom inputs and empty branch summaries do not split turns; whitespace-only branch summaries remain visible through their wrapper. Assistant messages and intervening tool results remain in the turn until the next visible input. Never delete a thinking/redacted_thinking-bearing assistant entry from the current final logical turn; a trailing visible input without an assistant response makes the preceding assistant turn historical. For a completed historical turn, retain every thinking/redacted_thinking-bearing assistant entry or delete all of them as whole entries. Never retain a proper subset or partially delete a retained thinking-bearing assistant message.\n</critical-overflow-mode>`;\n"]}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { getTranscriptCompactionParameters } from "./context-compaction-strategy.js";
|
|
2
|
-
import { isTaskBearingEntry } from "./context-deletion-targets.js";
|
|
3
|
-
import { hasAssistantError, hasFailedBashExecution, hasToolResultError } from "./context-transcript-analysis.js";
|
|
4
|
-
export const CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT = 5;
|
|
5
|
-
export function criticalCompactionParameters(parameters) {
|
|
6
|
-
return {
|
|
7
|
-
...parameters,
|
|
8
|
-
preserve_recent: Math.max(parameters.preserve_recent, CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT),
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export function isCriticalOverflowProtectedEntryDeletable(entry, transcript) {
|
|
12
|
-
if (!entry.protected)
|
|
13
|
-
return true;
|
|
14
|
-
const entryIndex = transcript.entries.findIndex((candidate) => candidate.entryId === entry.entryId);
|
|
15
|
-
if (entryIndex < 0)
|
|
16
|
-
return false;
|
|
17
|
-
const recentBoundary = Math.max(0, transcript.entries.length - CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT);
|
|
18
|
-
if (entryIndex >= recentBoundary)
|
|
19
|
-
return false;
|
|
20
|
-
if (hasAssistantError(entry.message) || hasToolResultError(entry.message) || hasFailedBashExecution(entry.message)) {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
return isTaskBearingEntry(entry);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Return a transcript for critical overflow passes. The effective recent guard is
|
|
27
|
-
* widened to max(configured preserve_recent, 5) over all entries, restoring the
|
|
28
|
-
* pre-#1399 critical-overflow last-5 floor through the existing recent-target
|
|
29
|
-
* validation path. Only stale protected task-bearing entries outside that floor
|
|
30
|
-
* are relaxed; `protectedEntryIds` is rebuilt from still-protected entries so
|
|
31
|
-
* persisted results/events stay disjoint from deleted targets.
|
|
32
|
-
*/
|
|
33
|
-
export function relaxTranscriptForCriticalEviction(transcript) {
|
|
34
|
-
const entries = transcript.entries.map((entry) => {
|
|
35
|
-
if (!entry.protected || !isCriticalOverflowProtectedEntryDeletable(entry, transcript))
|
|
36
|
-
return entry;
|
|
37
|
-
return {
|
|
38
|
-
...entry,
|
|
39
|
-
protected: false,
|
|
40
|
-
contentBlocks: entry.contentBlocks.map((block) => ({ ...block, protected: false })),
|
|
41
|
-
};
|
|
42
|
-
});
|
|
43
|
-
const parameters = criticalCompactionParameters(getTranscriptCompactionParameters(transcript));
|
|
44
|
-
return {
|
|
45
|
-
...transcript,
|
|
46
|
-
entries,
|
|
47
|
-
parameters,
|
|
48
|
-
protectedEntryIds: entries.filter((entry) => entry.protected).map((entry) => entry.entryId),
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
export const CONTEXT_COMPACTION_CRITICAL_OVERFLOW_PROMPT = `
|
|
52
|
-
<critical-overflow-mode>
|
|
53
|
-
The previous model request overflowed its context window. This is a critical LRU-style compaction pass. First delete stale unprotected context. If that is not enough, you may also delete the earliest formerly-protected entries or protected content shown in the manifest. Evict old low-signal context first, then older user/custom/summary context while preserving recent entries, unresolved errors, failed commands, and enough task-bearing context for the assistant to continue.
|
|
54
|
-
|
|
55
|
-
Safety invariant: each provider-visible user-like input starts a logical assistant tool-use turn: a non-empty user/custom input, a context-eligible bash execution, or a non-empty branch summary. Empty or whitespace-only user/custom inputs and empty branch summaries do not split turns; whitespace-only branch summaries remain visible through their wrapper. Assistant messages and intervening tool results remain in the turn until the next visible input. Never delete a thinking/redacted_thinking-bearing assistant entry from the current final logical turn; a trailing visible input without an assistant response makes the preceding assistant turn historical. For a completed historical turn, retain every thinking/redacted_thinking-bearing assistant entry or delete all of them as whole entries. Never retain a proper subset or partially delete a retained thinking-bearing assistant message.
|
|
56
|
-
</critical-overflow-mode>`;
|
|
57
|
-
//# sourceMappingURL=context-compaction-critical.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-compaction-critical.js","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-critical.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEjH,MAAM,CAAC,MAAM,4CAA4C,GAAG,CAAC,CAAC;AAE9D,MAAM,UAAU,4BAA4B,CAAC,UAAuC;IACnF,OAAO;QACN,GAAG,UAAU;QACb,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,4CAA4C,CAAC;KACnG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yCAAyC,CACxD,KAAiC,EACjC,UAAiC;IAEjC,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;IACpG,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,4CAA4C,CAAC,CAAC;IAC7G,IAAI,UAAU,IAAI,cAAc;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACpH,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kCAAkC,CAAC,UAAiC;IACnF,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAChD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,yCAAyC,CAAC,KAAK,EAAE,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACpG,OAAO;YACN,GAAG,KAAK;YACR,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;SACnF,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,4BAA4B,CAAC,iCAAiC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/F,OAAO;QACN,GAAG,UAAU;QACb,OAAO;QACP,UAAU;QACV,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;KAC3F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,2CAA2C,GAAG;;;;;0BAKjC,CAAC","sourcesContent":["import type { CompactableTranscript, CompactableTranscriptEntry, ContextCompactionParameters } from \"./context-compaction-types.ts\";\nimport { getTranscriptCompactionParameters } from \"./context-compaction-strategy.ts\";\nimport { isTaskBearingEntry } from \"./context-deletion-targets.ts\";\nimport { hasAssistantError, hasFailedBashExecution, hasToolResultError } from \"./context-transcript-analysis.ts\";\n\nexport const CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT = 5;\n\nexport function criticalCompactionParameters(parameters: ContextCompactionParameters): ContextCompactionParameters {\n\treturn {\n\t\t...parameters,\n\t\tpreserve_recent: Math.max(parameters.preserve_recent, CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT),\n\t};\n}\n\nexport function isCriticalOverflowProtectedEntryDeletable(\n\tentry: CompactableTranscriptEntry,\n\ttranscript: CompactableTranscript,\n): boolean {\n\tif (!entry.protected) return true;\n\tconst entryIndex = transcript.entries.findIndex((candidate) => candidate.entryId === entry.entryId);\n\tif (entryIndex < 0) return false;\n\tconst recentBoundary = Math.max(0, transcript.entries.length - CONTEXT_CRITICAL_OVERFLOW_RECENT_ENTRY_COUNT);\n\tif (entryIndex >= recentBoundary) return false;\n\tif (hasAssistantError(entry.message) || hasToolResultError(entry.message) || hasFailedBashExecution(entry.message)) {\n\t\treturn false;\n\t}\n\treturn isTaskBearingEntry(entry);\n}\n\n/**\n * Return a transcript for critical overflow passes. The effective recent guard is\n * widened to max(configured preserve_recent, 5) over all entries, restoring the\n * pre-#1399 critical-overflow last-5 floor through the existing recent-target\n * validation path. Only stale protected task-bearing entries outside that floor\n * are relaxed; `protectedEntryIds` is rebuilt from still-protected entries so\n * persisted results/events stay disjoint from deleted targets.\n */\nexport function relaxTranscriptForCriticalEviction(transcript: CompactableTranscript): CompactableTranscript {\n\tconst entries = transcript.entries.map((entry) => {\n\t\tif (!entry.protected || !isCriticalOverflowProtectedEntryDeletable(entry, transcript)) return entry;\n\t\treturn {\n\t\t\t...entry,\n\t\t\tprotected: false,\n\t\t\tcontentBlocks: entry.contentBlocks.map((block) => ({ ...block, protected: false })),\n\t\t};\n\t});\n\tconst parameters = criticalCompactionParameters(getTranscriptCompactionParameters(transcript));\n\treturn {\n\t\t...transcript,\n\t\tentries,\n\t\tparameters,\n\t\tprotectedEntryIds: entries.filter((entry) => entry.protected).map((entry) => entry.entryId),\n\t};\n}\n\nexport const CONTEXT_COMPACTION_CRITICAL_OVERFLOW_PROMPT = `\n<critical-overflow-mode>\nThe previous model request overflowed its context window. This is a critical LRU-style compaction pass. First delete stale unprotected context. If that is not enough, you may also delete the earliest formerly-protected entries or protected content shown in the manifest. Evict old low-signal context first, then older user/custom/summary context while preserving recent entries, unresolved errors, failed commands, and enough task-bearing context for the assistant to continue.\n\nSafety invariant: each provider-visible user-like input starts a logical assistant tool-use turn: a non-empty user/custom input, a context-eligible bash execution, or a non-empty branch summary. Empty or whitespace-only user/custom inputs and empty branch summaries do not split turns; whitespace-only branch summaries remain visible through their wrapper. Assistant messages and intervening tool results remain in the turn until the next visible input. Never delete a thinking/redacted_thinking-bearing assistant entry from the current final logical turn; a trailing visible input without an assistant response makes the preceding assistant turn historical. For a completed historical turn, retain every thinking/redacted_thinking-bearing assistant entry or delete all of them as whole entries. Never retain a proper subset or partially delete a retained thinking-bearing assistant message.\n</critical-overflow-mode>`;\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ContextDeletionTarget } from "../session-manager.js";
|
|
2
|
-
import type { CompactableTranscript, ValidatedContextDeletionResult } from "./context-compaction-types.js";
|
|
3
|
-
export interface EvictionGroup {
|
|
4
|
-
entryIds: string[];
|
|
5
|
-
order: number;
|
|
6
|
-
tokens: number;
|
|
7
|
-
boundary: boolean;
|
|
8
|
-
}
|
|
9
|
-
export declare function hasFitBudget(result: ValidatedContextDeletionResult | undefined, tokenBudget: number): result is ValidatedContextDeletionResult;
|
|
10
|
-
export declare function assistantTurnsForTargets(transcript: CompactableTranscript, targets: readonly ContextDeletionTarget[]): import("./context-assistant-turns.js").AssistantToolUseTurn[];
|
|
11
|
-
export declare function repairSignedTurnTargets(transcript: CompactableTranscript, targets: readonly ContextDeletionTarget[]): ContextDeletionTarget[];
|
|
12
|
-
export declare function targetsWithGroup(planned: readonly ContextDeletionTarget[], entryIds: readonly string[]): ContextDeletionTarget[];
|
|
13
|
-
export declare function validateTargets(transcript: CompactableTranscript, targets: readonly ContextDeletionTarget[]): ValidatedContextDeletionResult | undefined;
|
|
14
|
-
export declare function tryGroup(transcript: CompactableTranscript, planned: readonly ContextDeletionTarget[], group: EvictionGroup, repairBoundary: boolean): ValidatedContextDeletionResult | undefined;
|
|
15
|
-
export declare function currentHistoricalSignedGroups(transcript: CompactableTranscript, planned: readonly ContextDeletionTarget[]): EvictionGroup[];
|
|
16
|
-
export declare function skippedBoundaryRestorationGroups(transcript: CompactableTranscript, planned: readonly ContextDeletionTarget[], skipped: readonly EvictionGroup[]): EvictionGroup[][];
|
|
17
|
-
export declare function alternateBoundaryPlan(transcript: CompactableTranscript, initialTargets: readonly ContextDeletionTarget[], initialResult: ValidatedContextDeletionResult | undefined, groups: readonly EvictionGroup[], tokenBudget: number): ValidatedContextDeletionResult | undefined;
|
|
18
|
-
//# sourceMappingURL=context-compaction-eviction-alternates.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-compaction-eviction-alternates.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-eviction-alternates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAQ3G,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,YAAY,CAC3B,MAAM,EAAE,8BAA8B,GAAG,SAAS,EAClD,WAAW,EAAE,MAAM,GACjB,MAAM,IAAI,8BAA8B,CAE1C;AAED,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,qBAAqB,EAAE,iEAGzC;AAED,wBAAgB,uBAAuB,CACtC,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GACvC,qBAAqB,EAAE,CA0BzB;AAED,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,QAAQ,EAAE,SAAS,MAAM,EAAE,GACzB,qBAAqB,EAAE,CAQzB;AAED,wBAAgB,eAAe,CAC9B,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GACvC,8BAA8B,GAAG,SAAS,CAmB5C;AAED,wBAAgB,QAAQ,CACvB,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,KAAK,EAAE,aAAa,EACpB,cAAc,EAAE,OAAO,GACrB,8BAA8B,GAAG,SAAS,CAU5C;AAED,wBAAgB,6BAA6B,CAC5C,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GACvC,aAAa,EAAE,CAejB;AA0BD,wBAAgB,gCAAgC,CAC/C,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,OAAO,EAAE,SAAS,aAAa,EAAE,GAC/B,aAAa,EAAE,EAAE,CAUnB;AA8BD,wBAAgB,qBAAqB,CACpC,UAAU,EAAE,qBAAqB,EACjC,cAAc,EAAE,SAAS,qBAAqB,EAAE,EAChD,aAAa,EAAE,8BAA8B,GAAG,SAAS,EACzD,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,WAAW,EAAE,MAAM,GACjB,8BAA8B,GAAG,SAAS,CAuC5C","sourcesContent":["import type { ContextDeletionTarget } from \"../session-manager.js\";\nimport { analyzeCompactableAssistantTurns } from \"./context-assistant-turns.js\";\nimport type { CompactableTranscript, ValidatedContextDeletionResult } from \"./context-compaction-types.js\";\nimport { reconcileToolDependencies, validateContextDeletionRequest } from \"./context-deletion-application.js\";\nimport {\n\tcanDeleteTarget,\n\tdeletionRequestFromTargets,\n\tgetDeletedEntryIds,\n} from \"./context-deletion-targets.js\";\n\nexport interface EvictionGroup {\n\tentryIds: string[];\n\torder: number;\n\ttokens: number;\n\tboundary: boolean;\n}\n\nexport function hasFitBudget(\n\tresult: ValidatedContextDeletionResult | undefined,\n\ttokenBudget: number,\n): result is ValidatedContextDeletionResult {\n\treturn result !== undefined && result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget;\n}\n\nexport function assistantTurnsForTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n) {\n\treturn analyzeCompactableAssistantTurns(transcript, targets).turns;\n}\n\nexport function repairSignedTurnTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n): ContextDeletionTarget[] {\n\tconst reconciled = reconcileToolDependencies(transcript, targets);\n\tconst deletedEntryIds = getDeletedEntryIds(reconciled);\n\tconst restoredSignedIds = new Set<string>();\n\tfor (const turn of assistantTurnsForTargets(transcript, reconciled)) {\n\t\tconst deleted = turn.signedThinkingEntryIds.filter((entryId) => deletedEntryIds.has(entryId));\n\t\tif (deleted.length === 0) continue;\n\t\tif (!turn.active && deleted.length === turn.signedThinkingEntryIds.length) continue;\n\t\tfor (const entryId of turn.signedThinkingEntryIds) restoredSignedIds.add(entryId);\n\t}\n\tif (restoredSignedIds.size === 0) return reconciled;\n\n\tconst restoredCallIds = new Set<string>();\n\tfor (const entry of transcript.entries) {\n\t\tif (!restoredSignedIds.has(entry.entryId)) continue;\n\t\tfor (const callId of entry.toolCallIds) restoredCallIds.add(callId);\n\t}\n\tconst restoredResultIds = new Set(\n\t\ttranscript.entries\n\t\t\t.filter((entry) => entry.toolResultFor && restoredCallIds.has(entry.toolResultFor))\n\t\t\t.map((entry) => entry.entryId),\n\t);\n\treturn reconcileToolDependencies(\n\t\ttranscript,\n\t\treconciled.filter((target) => !restoredSignedIds.has(target.entryId) && !restoredResultIds.has(target.entryId)),\n\t);\n}\n\nexport function targetsWithGroup(\n\tplanned: readonly ContextDeletionTarget[],\n\tentryIds: readonly string[],\n): ContextDeletionTarget[] {\n\tconst deleted = getDeletedEntryIds(planned);\n\treturn [\n\t\t...planned,\n\t\t...entryIds\n\t\t\t.filter((entryId) => !deleted.has(entryId))\n\t\t\t.map((entryId): ContextDeletionTarget => ({ kind: \"entry\", entryId })),\n\t];\n}\n\nexport function validateTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n): ValidatedContextDeletionResult | undefined {\n\ttry {\n\t\tconst result = validateContextDeletionRequest(deletionRequestFromTargets(targets), transcript);\n\t\tconst order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));\n\t\treturn {\n\t\t\t...result,\n\t\t\tdeletedTargets: [...result.deletedTargets].sort((left, right) => {\n\t\t\t\tconst entryDelta =\n\t\t\t\t\t(order.get(left.entryId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t\t(order.get(right.entryId) ?? Number.MAX_SAFE_INTEGER);\n\t\t\t\tif (entryDelta !== 0) return entryDelta;\n\t\t\t\tconst leftBlock = left.kind === \"content_block\" ? left.blockIndex : -1;\n\t\t\t\tconst rightBlock = right.kind === \"content_block\" ? right.blockIndex : -1;\n\t\t\t\treturn leftBlock - rightBlock;\n\t\t\t}),\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function tryGroup(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroup: EvictionGroup,\n\trepairBoundary: boolean,\n): ValidatedContextDeletionResult | undefined {\n\tconst directTargets = targetsWithGroup(planned, group.entryIds);\n\tconst direct = validateTargets(transcript, directTargets);\n\tif (direct) return direct;\n\tif (!repairBoundary) return undefined;\n\tconst repaired = repairSignedTurnTargets(transcript, directTargets);\n\tconst result = validateTargets(transcript, repaired);\n\tif (!result) return undefined;\n\tconst deleted = getDeletedEntryIds(result.deletedTargets);\n\treturn group.entryIds.every((entryId) => deleted.has(entryId)) ? result : undefined;\n}\n\nexport function currentHistoricalSignedGroups(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n): EvictionGroup[] {\n\tconst deleted = getDeletedEntryIds(planned);\n\tconst order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));\n\tconst tokens = new Map(transcript.entries.map((entry) => [entry.entryId, entry.tokenEstimate]));\n\treturn assistantTurnsForTargets(transcript, planned)\n\t\t.filter((turn) => !turn.active)\n\t\t.map((turn) => turn.signedThinkingEntryIds.filter((entryId) => !deleted.has(entryId)))\n\t\t.filter((entryIds) => entryIds.length > 0)\n\t\t.filter((entryIds) => entryIds.every((entryId) => canDeleteTarget(transcript, { kind: \"entry\", entryId })))\n\t\t.map((entryIds) => ({\n\t\t\tentryIds,\n\t\t\torder: order.get(entryIds[0]!) ?? Number.MAX_SAFE_INTEGER,\n\t\t\ttokens: entryIds.reduce((sum, entryId) => sum + (tokens.get(entryId) ?? 0), 0),\n\t\t\tboundary: false,\n\t\t}));\n}\n\nfunction targetIdentity(target: ContextDeletionTarget): string {\n\treturn target.kind === \"entry\"\n\t\t? `entry:${target.entryId}`\n\t\t: `content_block:${target.entryId}:${target.blockIndex}`;\n}\n\nfunction boundaryRestorationSignature(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroup: EvictionGroup,\n): string | undefined {\n\ttry {\n\t\tconst repaired = repairSignedTurnTargets(transcript, targetsWithGroup(planned, group.entryIds));\n\t\tconst retainedKeys = new Set(repaired.map(targetIdentity));\n\t\tconst restoredKeys = planned\n\t\t\t.map(targetIdentity)\n\t\t\t.filter((key) => !retainedKeys.has(key))\n\t\t\t.sort();\n\t\treturn restoredKeys.length > 0 ? restoredKeys.join(\"|\") : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function skippedBoundaryRestorationGroups(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tskipped: readonly EvictionGroup[],\n): EvictionGroup[][] {\n\tconst bySignature = new Map<string, EvictionGroup[]>();\n\tfor (const group of skipped) {\n\t\tconst signature = boundaryRestorationSignature(transcript, planned, group);\n\t\tif (!signature) continue;\n\t\tconst matches = bySignature.get(signature) ?? [];\n\t\tmatches.push(group);\n\t\tbySignature.set(signature, matches);\n\t}\n\treturn [...bySignature.values()].filter((groups) => groups.length > 1);\n}\n\ninterface AlternateBoundaryState {\n\ttargets: ContextDeletionTarget[];\n\ttokensAfter: number;\n\tsignature: string;\n}\n\nfunction deletionPlanSignature(targets: readonly ContextDeletionTarget[]): string {\n\treturn targets.map(targetIdentity).sort().join(\"|\");\n}\n\nconst ALTERNATE_BOUNDARY_STATE_LIMIT = 16;\n\nfunction retainBoundedAlternateStates(states: readonly AlternateBoundaryState[]): AlternateBoundaryState[] {\n\tconst deduplicated = [...new Map(states.map((state) => [state.signature, state])).values()].sort(\n\t\t(left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature),\n\t);\n\t// Retain both near-fit and less-committed plans so different turn topologies survive the bounded search.\n\tif (deduplicated.length <= ALTERNATE_BOUNDARY_STATE_LIMIT) return deduplicated;\n\n\tconst retained: AlternateBoundaryState[] = [];\n\tfor (let index = 0; index < ALTERNATE_BOUNDARY_STATE_LIMIT / 2; index++) {\n\t\tretained.push(deduplicated[index]!, deduplicated[deduplicated.length - 1 - index]!);\n\t}\n\treturn retained.sort(\n\t\t(left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature),\n\t);\n}\n\nexport function alternateBoundaryPlan(\n\ttranscript: CompactableTranscript,\n\tinitialTargets: readonly ContextDeletionTarget[],\n\tinitialResult: ValidatedContextDeletionResult | undefined,\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n): ValidatedContextDeletionResult | undefined {\n\tlet states: AlternateBoundaryState[] = [\n\t\t{\n\t\t\ttargets: [...initialTargets],\n\t\t\ttokensAfter: initialResult?.stats.tokensAfter ?? transcript.tokensBefore,\n\t\t\tsignature: deletionPlanSignature(initialTargets),\n\t\t},\n\t];\n\n\tfor (const group of groups) {\n\t\tconst expanded = [...states];\n\t\tlet fitting: ValidatedContextDeletionResult | undefined;\n\t\tfor (const state of states) {\n\t\t\tconst result = tryGroup(transcript, state.targets, group, true);\n\t\t\tif (!result) continue;\n\t\t\tif (result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget) {\n\t\t\t\tif (!fitting || result.stats.tokensAfter > fitting.stats.tokensAfter) fitting = result;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\texpanded.push({\n\t\t\t\ttargets: [...result.deletedTargets],\n\t\t\t\ttokensAfter: result.stats.tokensAfter,\n\t\t\t\tsignature: deletionPlanSignature(result.deletedTargets),\n\t\t\t});\n\t\t}\n\t\tif (fitting) return fitting;\n\t\tstates = retainBoundedAlternateStates(expanded);\n\t}\n\n\tfor (const state of states) {\n\t\tlet targets = state.targets;\n\t\tfor (const group of currentHistoricalSignedGroups(transcript, targets)) {\n\t\t\tconst result = tryGroup(transcript, targets, group, false);\n\t\t\tif (!result) continue;\n\t\t\ttargets = [...result.deletedTargets];\n\t\t\tif (hasFitBudget(result, tokenBudget)) return result;\n\t\t}\n\t}\n\treturn undefined;\n}\n"]}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { analyzeCompactableAssistantTurns } from "./context-assistant-turns.js";
|
|
2
|
-
import { reconcileToolDependencies, validateContextDeletionRequest } from "./context-deletion-application.js";
|
|
3
|
-
import { canDeleteTarget, deletionRequestFromTargets, getDeletedEntryIds, } from "./context-deletion-targets.js";
|
|
4
|
-
export function hasFitBudget(result, tokenBudget) {
|
|
5
|
-
return result !== undefined && result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget;
|
|
6
|
-
}
|
|
7
|
-
export function assistantTurnsForTargets(transcript, targets) {
|
|
8
|
-
return analyzeCompactableAssistantTurns(transcript, targets).turns;
|
|
9
|
-
}
|
|
10
|
-
export function repairSignedTurnTargets(transcript, targets) {
|
|
11
|
-
const reconciled = reconcileToolDependencies(transcript, targets);
|
|
12
|
-
const deletedEntryIds = getDeletedEntryIds(reconciled);
|
|
13
|
-
const restoredSignedIds = new Set();
|
|
14
|
-
for (const turn of assistantTurnsForTargets(transcript, reconciled)) {
|
|
15
|
-
const deleted = turn.signedThinkingEntryIds.filter((entryId) => deletedEntryIds.has(entryId));
|
|
16
|
-
if (deleted.length === 0)
|
|
17
|
-
continue;
|
|
18
|
-
if (!turn.active && deleted.length === turn.signedThinkingEntryIds.length)
|
|
19
|
-
continue;
|
|
20
|
-
for (const entryId of turn.signedThinkingEntryIds)
|
|
21
|
-
restoredSignedIds.add(entryId);
|
|
22
|
-
}
|
|
23
|
-
if (restoredSignedIds.size === 0)
|
|
24
|
-
return reconciled;
|
|
25
|
-
const restoredCallIds = new Set();
|
|
26
|
-
for (const entry of transcript.entries) {
|
|
27
|
-
if (!restoredSignedIds.has(entry.entryId))
|
|
28
|
-
continue;
|
|
29
|
-
for (const callId of entry.toolCallIds)
|
|
30
|
-
restoredCallIds.add(callId);
|
|
31
|
-
}
|
|
32
|
-
const restoredResultIds = new Set(transcript.entries
|
|
33
|
-
.filter((entry) => entry.toolResultFor && restoredCallIds.has(entry.toolResultFor))
|
|
34
|
-
.map((entry) => entry.entryId));
|
|
35
|
-
return reconcileToolDependencies(transcript, reconciled.filter((target) => !restoredSignedIds.has(target.entryId) && !restoredResultIds.has(target.entryId)));
|
|
36
|
-
}
|
|
37
|
-
export function targetsWithGroup(planned, entryIds) {
|
|
38
|
-
const deleted = getDeletedEntryIds(planned);
|
|
39
|
-
return [
|
|
40
|
-
...planned,
|
|
41
|
-
...entryIds
|
|
42
|
-
.filter((entryId) => !deleted.has(entryId))
|
|
43
|
-
.map((entryId) => ({ kind: "entry", entryId })),
|
|
44
|
-
];
|
|
45
|
-
}
|
|
46
|
-
export function validateTargets(transcript, targets) {
|
|
47
|
-
try {
|
|
48
|
-
const result = validateContextDeletionRequest(deletionRequestFromTargets(targets), transcript);
|
|
49
|
-
const order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));
|
|
50
|
-
return {
|
|
51
|
-
...result,
|
|
52
|
-
deletedTargets: [...result.deletedTargets].sort((left, right) => {
|
|
53
|
-
const entryDelta = (order.get(left.entryId) ?? Number.MAX_SAFE_INTEGER) -
|
|
54
|
-
(order.get(right.entryId) ?? Number.MAX_SAFE_INTEGER);
|
|
55
|
-
if (entryDelta !== 0)
|
|
56
|
-
return entryDelta;
|
|
57
|
-
const leftBlock = left.kind === "content_block" ? left.blockIndex : -1;
|
|
58
|
-
const rightBlock = right.kind === "content_block" ? right.blockIndex : -1;
|
|
59
|
-
return leftBlock - rightBlock;
|
|
60
|
-
}),
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
export function tryGroup(transcript, planned, group, repairBoundary) {
|
|
68
|
-
const directTargets = targetsWithGroup(planned, group.entryIds);
|
|
69
|
-
const direct = validateTargets(transcript, directTargets);
|
|
70
|
-
if (direct)
|
|
71
|
-
return direct;
|
|
72
|
-
if (!repairBoundary)
|
|
73
|
-
return undefined;
|
|
74
|
-
const repaired = repairSignedTurnTargets(transcript, directTargets);
|
|
75
|
-
const result = validateTargets(transcript, repaired);
|
|
76
|
-
if (!result)
|
|
77
|
-
return undefined;
|
|
78
|
-
const deleted = getDeletedEntryIds(result.deletedTargets);
|
|
79
|
-
return group.entryIds.every((entryId) => deleted.has(entryId)) ? result : undefined;
|
|
80
|
-
}
|
|
81
|
-
export function currentHistoricalSignedGroups(transcript, planned) {
|
|
82
|
-
const deleted = getDeletedEntryIds(planned);
|
|
83
|
-
const order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));
|
|
84
|
-
const tokens = new Map(transcript.entries.map((entry) => [entry.entryId, entry.tokenEstimate]));
|
|
85
|
-
return assistantTurnsForTargets(transcript, planned)
|
|
86
|
-
.filter((turn) => !turn.active)
|
|
87
|
-
.map((turn) => turn.signedThinkingEntryIds.filter((entryId) => !deleted.has(entryId)))
|
|
88
|
-
.filter((entryIds) => entryIds.length > 0)
|
|
89
|
-
.filter((entryIds) => entryIds.every((entryId) => canDeleteTarget(transcript, { kind: "entry", entryId })))
|
|
90
|
-
.map((entryIds) => ({
|
|
91
|
-
entryIds,
|
|
92
|
-
order: order.get(entryIds[0]) ?? Number.MAX_SAFE_INTEGER,
|
|
93
|
-
tokens: entryIds.reduce((sum, entryId) => sum + (tokens.get(entryId) ?? 0), 0),
|
|
94
|
-
boundary: false,
|
|
95
|
-
}));
|
|
96
|
-
}
|
|
97
|
-
function targetIdentity(target) {
|
|
98
|
-
return target.kind === "entry"
|
|
99
|
-
? `entry:${target.entryId}`
|
|
100
|
-
: `content_block:${target.entryId}:${target.blockIndex}`;
|
|
101
|
-
}
|
|
102
|
-
function boundaryRestorationSignature(transcript, planned, group) {
|
|
103
|
-
try {
|
|
104
|
-
const repaired = repairSignedTurnTargets(transcript, targetsWithGroup(planned, group.entryIds));
|
|
105
|
-
const retainedKeys = new Set(repaired.map(targetIdentity));
|
|
106
|
-
const restoredKeys = planned
|
|
107
|
-
.map(targetIdentity)
|
|
108
|
-
.filter((key) => !retainedKeys.has(key))
|
|
109
|
-
.sort();
|
|
110
|
-
return restoredKeys.length > 0 ? restoredKeys.join("|") : undefined;
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
export function skippedBoundaryRestorationGroups(transcript, planned, skipped) {
|
|
117
|
-
const bySignature = new Map();
|
|
118
|
-
for (const group of skipped) {
|
|
119
|
-
const signature = boundaryRestorationSignature(transcript, planned, group);
|
|
120
|
-
if (!signature)
|
|
121
|
-
continue;
|
|
122
|
-
const matches = bySignature.get(signature) ?? [];
|
|
123
|
-
matches.push(group);
|
|
124
|
-
bySignature.set(signature, matches);
|
|
125
|
-
}
|
|
126
|
-
return [...bySignature.values()].filter((groups) => groups.length > 1);
|
|
127
|
-
}
|
|
128
|
-
function deletionPlanSignature(targets) {
|
|
129
|
-
return targets.map(targetIdentity).sort().join("|");
|
|
130
|
-
}
|
|
131
|
-
const ALTERNATE_BOUNDARY_STATE_LIMIT = 16;
|
|
132
|
-
function retainBoundedAlternateStates(states) {
|
|
133
|
-
const deduplicated = [...new Map(states.map((state) => [state.signature, state])).values()].sort((left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature));
|
|
134
|
-
// Retain both near-fit and less-committed plans so different turn topologies survive the bounded search.
|
|
135
|
-
if (deduplicated.length <= ALTERNATE_BOUNDARY_STATE_LIMIT)
|
|
136
|
-
return deduplicated;
|
|
137
|
-
const retained = [];
|
|
138
|
-
for (let index = 0; index < ALTERNATE_BOUNDARY_STATE_LIMIT / 2; index++) {
|
|
139
|
-
retained.push(deduplicated[index], deduplicated[deduplicated.length - 1 - index]);
|
|
140
|
-
}
|
|
141
|
-
return retained.sort((left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature));
|
|
142
|
-
}
|
|
143
|
-
export function alternateBoundaryPlan(transcript, initialTargets, initialResult, groups, tokenBudget) {
|
|
144
|
-
let states = [
|
|
145
|
-
{
|
|
146
|
-
targets: [...initialTargets],
|
|
147
|
-
tokensAfter: initialResult?.stats.tokensAfter ?? transcript.tokensBefore,
|
|
148
|
-
signature: deletionPlanSignature(initialTargets),
|
|
149
|
-
},
|
|
150
|
-
];
|
|
151
|
-
for (const group of groups) {
|
|
152
|
-
const expanded = [...states];
|
|
153
|
-
let fitting;
|
|
154
|
-
for (const state of states) {
|
|
155
|
-
const result = tryGroup(transcript, state.targets, group, true);
|
|
156
|
-
if (!result)
|
|
157
|
-
continue;
|
|
158
|
-
if (result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget) {
|
|
159
|
-
if (!fitting || result.stats.tokensAfter > fitting.stats.tokensAfter)
|
|
160
|
-
fitting = result;
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
expanded.push({
|
|
164
|
-
targets: [...result.deletedTargets],
|
|
165
|
-
tokensAfter: result.stats.tokensAfter,
|
|
166
|
-
signature: deletionPlanSignature(result.deletedTargets),
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
if (fitting)
|
|
170
|
-
return fitting;
|
|
171
|
-
states = retainBoundedAlternateStates(expanded);
|
|
172
|
-
}
|
|
173
|
-
for (const state of states) {
|
|
174
|
-
let targets = state.targets;
|
|
175
|
-
for (const group of currentHistoricalSignedGroups(transcript, targets)) {
|
|
176
|
-
const result = tryGroup(transcript, targets, group, false);
|
|
177
|
-
if (!result)
|
|
178
|
-
continue;
|
|
179
|
-
targets = [...result.deletedTargets];
|
|
180
|
-
if (hasFitBudget(result, tokenBudget))
|
|
181
|
-
return result;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return undefined;
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=context-compaction-eviction-alternates.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-compaction-eviction-alternates.js","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-eviction-alternates.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextDeletionTarget } from \"../session-manager.js\";\nimport { analyzeCompactableAssistantTurns } from \"./context-assistant-turns.js\";\nimport type { CompactableTranscript, ValidatedContextDeletionResult } from \"./context-compaction-types.js\";\nimport { reconcileToolDependencies, validateContextDeletionRequest } from \"./context-deletion-application.js\";\nimport {\n\tcanDeleteTarget,\n\tdeletionRequestFromTargets,\n\tgetDeletedEntryIds,\n} from \"./context-deletion-targets.js\";\n\nexport interface EvictionGroup {\n\tentryIds: string[];\n\torder: number;\n\ttokens: number;\n\tboundary: boolean;\n}\n\nexport function hasFitBudget(\n\tresult: ValidatedContextDeletionResult | undefined,\n\ttokenBudget: number,\n): result is ValidatedContextDeletionResult {\n\treturn result !== undefined && result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget;\n}\n\nexport function assistantTurnsForTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n) {\n\treturn analyzeCompactableAssistantTurns(transcript, targets).turns;\n}\n\nexport function repairSignedTurnTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n): ContextDeletionTarget[] {\n\tconst reconciled = reconcileToolDependencies(transcript, targets);\n\tconst deletedEntryIds = getDeletedEntryIds(reconciled);\n\tconst restoredSignedIds = new Set<string>();\n\tfor (const turn of assistantTurnsForTargets(transcript, reconciled)) {\n\t\tconst deleted = turn.signedThinkingEntryIds.filter((entryId) => deletedEntryIds.has(entryId));\n\t\tif (deleted.length === 0) continue;\n\t\tif (!turn.active && deleted.length === turn.signedThinkingEntryIds.length) continue;\n\t\tfor (const entryId of turn.signedThinkingEntryIds) restoredSignedIds.add(entryId);\n\t}\n\tif (restoredSignedIds.size === 0) return reconciled;\n\n\tconst restoredCallIds = new Set<string>();\n\tfor (const entry of transcript.entries) {\n\t\tif (!restoredSignedIds.has(entry.entryId)) continue;\n\t\tfor (const callId of entry.toolCallIds) restoredCallIds.add(callId);\n\t}\n\tconst restoredResultIds = new Set(\n\t\ttranscript.entries\n\t\t\t.filter((entry) => entry.toolResultFor && restoredCallIds.has(entry.toolResultFor))\n\t\t\t.map((entry) => entry.entryId),\n\t);\n\treturn reconcileToolDependencies(\n\t\ttranscript,\n\t\treconciled.filter((target) => !restoredSignedIds.has(target.entryId) && !restoredResultIds.has(target.entryId)),\n\t);\n}\n\nexport function targetsWithGroup(\n\tplanned: readonly ContextDeletionTarget[],\n\tentryIds: readonly string[],\n): ContextDeletionTarget[] {\n\tconst deleted = getDeletedEntryIds(planned);\n\treturn [\n\t\t...planned,\n\t\t...entryIds\n\t\t\t.filter((entryId) => !deleted.has(entryId))\n\t\t\t.map((entryId): ContextDeletionTarget => ({ kind: \"entry\", entryId })),\n\t];\n}\n\nexport function validateTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n): ValidatedContextDeletionResult | undefined {\n\ttry {\n\t\tconst result = validateContextDeletionRequest(deletionRequestFromTargets(targets), transcript);\n\t\tconst order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));\n\t\treturn {\n\t\t\t...result,\n\t\t\tdeletedTargets: [...result.deletedTargets].sort((left, right) => {\n\t\t\t\tconst entryDelta =\n\t\t\t\t\t(order.get(left.entryId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t\t(order.get(right.entryId) ?? Number.MAX_SAFE_INTEGER);\n\t\t\t\tif (entryDelta !== 0) return entryDelta;\n\t\t\t\tconst leftBlock = left.kind === \"content_block\" ? left.blockIndex : -1;\n\t\t\t\tconst rightBlock = right.kind === \"content_block\" ? right.blockIndex : -1;\n\t\t\t\treturn leftBlock - rightBlock;\n\t\t\t}),\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function tryGroup(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroup: EvictionGroup,\n\trepairBoundary: boolean,\n): ValidatedContextDeletionResult | undefined {\n\tconst directTargets = targetsWithGroup(planned, group.entryIds);\n\tconst direct = validateTargets(transcript, directTargets);\n\tif (direct) return direct;\n\tif (!repairBoundary) return undefined;\n\tconst repaired = repairSignedTurnTargets(transcript, directTargets);\n\tconst result = validateTargets(transcript, repaired);\n\tif (!result) return undefined;\n\tconst deleted = getDeletedEntryIds(result.deletedTargets);\n\treturn group.entryIds.every((entryId) => deleted.has(entryId)) ? result : undefined;\n}\n\nexport function currentHistoricalSignedGroups(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n): EvictionGroup[] {\n\tconst deleted = getDeletedEntryIds(planned);\n\tconst order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));\n\tconst tokens = new Map(transcript.entries.map((entry) => [entry.entryId, entry.tokenEstimate]));\n\treturn assistantTurnsForTargets(transcript, planned)\n\t\t.filter((turn) => !turn.active)\n\t\t.map((turn) => turn.signedThinkingEntryIds.filter((entryId) => !deleted.has(entryId)))\n\t\t.filter((entryIds) => entryIds.length > 0)\n\t\t.filter((entryIds) => entryIds.every((entryId) => canDeleteTarget(transcript, { kind: \"entry\", entryId })))\n\t\t.map((entryIds) => ({\n\t\t\tentryIds,\n\t\t\torder: order.get(entryIds[0]!) ?? Number.MAX_SAFE_INTEGER,\n\t\t\ttokens: entryIds.reduce((sum, entryId) => sum + (tokens.get(entryId) ?? 0), 0),\n\t\t\tboundary: false,\n\t\t}));\n}\n\nfunction targetIdentity(target: ContextDeletionTarget): string {\n\treturn target.kind === \"entry\"\n\t\t? `entry:${target.entryId}`\n\t\t: `content_block:${target.entryId}:${target.blockIndex}`;\n}\n\nfunction boundaryRestorationSignature(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroup: EvictionGroup,\n): string | undefined {\n\ttry {\n\t\tconst repaired = repairSignedTurnTargets(transcript, targetsWithGroup(planned, group.entryIds));\n\t\tconst retainedKeys = new Set(repaired.map(targetIdentity));\n\t\tconst restoredKeys = planned\n\t\t\t.map(targetIdentity)\n\t\t\t.filter((key) => !retainedKeys.has(key))\n\t\t\t.sort();\n\t\treturn restoredKeys.length > 0 ? restoredKeys.join(\"|\") : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function skippedBoundaryRestorationGroups(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tskipped: readonly EvictionGroup[],\n): EvictionGroup[][] {\n\tconst bySignature = new Map<string, EvictionGroup[]>();\n\tfor (const group of skipped) {\n\t\tconst signature = boundaryRestorationSignature(transcript, planned, group);\n\t\tif (!signature) continue;\n\t\tconst matches = bySignature.get(signature) ?? [];\n\t\tmatches.push(group);\n\t\tbySignature.set(signature, matches);\n\t}\n\treturn [...bySignature.values()].filter((groups) => groups.length > 1);\n}\n\ninterface AlternateBoundaryState {\n\ttargets: ContextDeletionTarget[];\n\ttokensAfter: number;\n\tsignature: string;\n}\n\nfunction deletionPlanSignature(targets: readonly ContextDeletionTarget[]): string {\n\treturn targets.map(targetIdentity).sort().join(\"|\");\n}\n\nconst ALTERNATE_BOUNDARY_STATE_LIMIT = 16;\n\nfunction retainBoundedAlternateStates(states: readonly AlternateBoundaryState[]): AlternateBoundaryState[] {\n\tconst deduplicated = [...new Map(states.map((state) => [state.signature, state])).values()].sort(\n\t\t(left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature),\n\t);\n\t// Retain both near-fit and less-committed plans so different turn topologies survive the bounded search.\n\tif (deduplicated.length <= ALTERNATE_BOUNDARY_STATE_LIMIT) return deduplicated;\n\n\tconst retained: AlternateBoundaryState[] = [];\n\tfor (let index = 0; index < ALTERNATE_BOUNDARY_STATE_LIMIT / 2; index++) {\n\t\tretained.push(deduplicated[index]!, deduplicated[deduplicated.length - 1 - index]!);\n\t}\n\treturn retained.sort(\n\t\t(left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature),\n\t);\n}\n\nexport function alternateBoundaryPlan(\n\ttranscript: CompactableTranscript,\n\tinitialTargets: readonly ContextDeletionTarget[],\n\tinitialResult: ValidatedContextDeletionResult | undefined,\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n): ValidatedContextDeletionResult | undefined {\n\tlet states: AlternateBoundaryState[] = [\n\t\t{\n\t\t\ttargets: [...initialTargets],\n\t\t\ttokensAfter: initialResult?.stats.tokensAfter ?? transcript.tokensBefore,\n\t\t\tsignature: deletionPlanSignature(initialTargets),\n\t\t},\n\t];\n\n\tfor (const group of groups) {\n\t\tconst expanded = [...states];\n\t\tlet fitting: ValidatedContextDeletionResult | undefined;\n\t\tfor (const state of states) {\n\t\t\tconst result = tryGroup(transcript, state.targets, group, true);\n\t\t\tif (!result) continue;\n\t\t\tif (result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget) {\n\t\t\t\tif (!fitting || result.stats.tokensAfter > fitting.stats.tokensAfter) fitting = result;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\texpanded.push({\n\t\t\t\ttargets: [...result.deletedTargets],\n\t\t\t\ttokensAfter: result.stats.tokensAfter,\n\t\t\t\tsignature: deletionPlanSignature(result.deletedTargets),\n\t\t\t});\n\t\t}\n\t\tif (fitting) return fitting;\n\t\tstates = retainBoundedAlternateStates(expanded);\n\t}\n\n\tfor (const state of states) {\n\t\tlet targets = state.targets;\n\t\tfor (const group of currentHistoricalSignedGroups(transcript, targets)) {\n\t\t\tconst result = tryGroup(transcript, targets, group, false);\n\t\t\tif (!result) continue;\n\t\t\ttargets = [...result.deletedTargets];\n\t\t\tif (hasFitBudget(result, tokenBudget)) return result;\n\t\t}\n\t}\n\treturn undefined;\n}\n"]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { CompactableTranscript, ValidatedContextDeletionResult } from "./context-compaction-types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Finite deterministic eviction phases:
|
|
4
|
-
* 1. Batch or sweep non-boundary groups in transcript order.
|
|
5
|
-
* 2. Try repaired boundary prefixes, then individual boundaries by token value.
|
|
6
|
-
* 3. Sweep newly historical signed groups exposed by those deletions.
|
|
7
|
-
* 4. Retry skipped boundaries by shared restoration component, then individually.
|
|
8
|
-
* 5. Search bounded alternate boundary states (at most 16 per boundary) and their signed groups.
|
|
9
|
-
* 6. Fail with the best validated stats after every finite candidate set is exhausted.
|
|
10
|
-
*/
|
|
11
|
-
export declare function runDeterministicContextEviction(transcript: CompactableTranscript, tokenBudget: number): ValidatedContextDeletionResult;
|
|
12
|
-
//# sourceMappingURL=context-compaction-eviction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-compaction-eviction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-eviction.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAgH3G;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC9C,UAAU,EAAE,qBAAqB,EACjC,WAAW,EAAE,MAAM,GACjB,8BAA8B,CAmHhC","sourcesContent":["import type { ContextDeletionTarget } from \"../session-manager.js\";\nimport { relaxTranscriptForCriticalEviction } from \"./context-compaction-critical.js\";\nimport {\n\talternateBoundaryPlan,\n\tassistantTurnsForTargets,\n\tcurrentHistoricalSignedGroups,\n\ttype EvictionGroup,\n\thasFitBudget,\n\trepairSignedTurnTargets,\n\tskippedBoundaryRestorationGroups,\n\ttargetsWithGroup,\n\ttryGroup,\n\tvalidateTargets,\n} from \"./context-compaction-eviction-alternates.js\";\nimport type { CompactableTranscript, ValidatedContextDeletionResult } from \"./context-compaction-types.js\";\nimport { transcriptEntryStartsNewTurn } from \"./context-assistant-turns.js\";\nimport { canDeleteTarget, getDeletedEntryIds } from \"./context-deletion-targets.js\";\n\nfunction terminalDeterministicEvictionError(\n\treason: string,\n\tlastValidated: ValidatedContextDeletionResult | undefined,\n\ttokenBudget: number,\n): Error {\n\tconst statsText = lastValidated\n\t\t? `achieved tokensAfter=${lastValidated.stats.tokensAfter}, reduction=${lastValidated.stats.percentReduction}%, deletionTargets=${lastValidated.deletedTargets.length}`\n\t\t: \"achieved no validated deletion targets\";\n\treturn new Error(\n\t\t`Context deterministic overflow eviction failed: ${reason}; ${statsText}; budget=${tokenBudget}; nothing more was safely deletable`,\n\t);\n}\n\nfunction initialEvictionGroups(transcript: CompactableTranscript): EvictionGroup[] {\n\tconst turns = assistantTurnsForTargets(transcript, []);\n\tconst signedGroupByEntryId = new Map<string, string[]>();\n\tconst activeSignedIds = new Set<string>();\n\tfor (const turn of turns) {\n\t\tif (turn.active) {\n\t\t\tfor (const entryId of turn.signedThinkingEntryIds) activeSignedIds.add(entryId);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const entryId of turn.signedThinkingEntryIds) {\n\t\t\tsignedGroupByEntryId.set(entryId, turn.signedThinkingEntryIds);\n\t\t}\n\t}\n\n\tconst entryById = new Map(transcript.entries.map((entry, index) => [entry.entryId, { entry, index }]));\n\tconst grouped = new Set<string>();\n\tconst groups: EvictionGroup[] = [];\n\tfor (let index = 0; index < transcript.entries.length; index++) {\n\t\tconst entry = transcript.entries[index]!;\n\t\tif (activeSignedIds.has(entry.entryId) || grouped.has(entry.entryId)) continue;\n\t\tconst entryIds = signedGroupByEntryId.get(entry.entryId) ?? [entry.entryId];\n\t\tfor (const entryId of entryIds) grouped.add(entryId);\n\t\tif (!entryIds.every((entryId) => canDeleteTarget(transcript, { kind: \"entry\", entryId }))) continue;\n\t\tgroups.push({\n\t\t\tentryIds: [...entryIds],\n\t\t\torder: index,\n\t\t\ttokens: entryIds.reduce((sum, entryId) => sum + (entryById.get(entryId)?.entry.tokenEstimate ?? 0), 0),\n\t\t\tboundary: entryIds.length === 1 && transcriptEntryStartsNewTurn(entry),\n\t\t});\n\t}\n\treturn groups;\n}\n\nfunction repairedFittingBoundaryPrefix(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n\tcurrentTokens: number,\n): ValidatedContextDeletionResult | undefined {\n\tconst required = currentTokens - tokenBudget;\n\tif (required <= 0) return undefined;\n\tlet rawRemoved = 0;\n\tlet lowerBound = 0;\n\twhile (lowerBound < groups.length && rawRemoved < required) {\n\t\trawRemoved += groups[lowerBound]!.tokens;\n\t\tlowerBound += 1;\n\t}\n\tif (rawRemoved < required) return undefined;\n\n\tlet prospective = [...planned];\n\tfor (let index = 0; index < groups.length; index++) {\n\t\tprospective = targetsWithGroup(prospective, groups[index]!.entryIds);\n\t\tif (index + 1 < lowerBound) continue;\n\t\tconst repaired = repairSignedTurnTargets(transcript, prospective);\n\t\tconst validated = validateTargets(transcript, repaired);\n\t\tif (!validated || !hasFitBudget(validated, tokenBudget)) continue;\n\t\tconst deleted = getDeletedEntryIds(validated.deletedTargets);\n\t\tconst prefixRetained = groups\n\t\t\t.slice(0, index + 1)\n\t\t\t.some((group) => group.entryIds.some((entryId) => !deleted.has(entryId)));\n\t\tif (!prefixRetained) return validated;\n\t}\n\treturn undefined;\n}\n\nfunction adoptSmallestFittingPrefix(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n): ValidatedContextDeletionResult | undefined {\n\tif (groups.length === 0) return undefined;\n\tconst prefixTargets = (count: number): ContextDeletionTarget[] =>\n\t\tgroups.slice(0, count).reduce((targets, group) => targetsWithGroup(targets, group.entryIds), [...planned]);\n\tconst full = validateTargets(transcript, prefixTargets(groups.length));\n\tif (!full) return undefined;\n\tif (!hasFitBudget(full, tokenBudget)) return full;\n\n\tlet low = 1;\n\tlet high = groups.length;\n\tlet best = full;\n\twhile (low <= high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tconst result = validateTargets(transcript, prefixTargets(middle));\n\t\tif (result && hasFitBudget(result, tokenBudget)) {\n\t\t\tbest = result;\n\t\t\thigh = middle - 1;\n\t\t} else {\n\t\t\tlow = middle + 1;\n\t\t}\n\t}\n\treturn best;\n}\n\n/**\n * Finite deterministic eviction phases:\n * 1. Batch or sweep non-boundary groups in transcript order.\n * 2. Try repaired boundary prefixes, then individual boundaries by token value.\n * 3. Sweep newly historical signed groups exposed by those deletions.\n * 4. Retry skipped boundaries by shared restoration component, then individually.\n * 5. Search bounded alternate boundary states (at most 16 per boundary) and their signed groups.\n * 6. Fail with the best validated stats after every finite candidate set is exhausted.\n */\nexport function runDeterministicContextEviction(\n\ttranscript: CompactableTranscript,\n\ttokenBudget: number,\n): ValidatedContextDeletionResult {\n\tconst relaxed = relaxTranscriptForCriticalEviction(transcript);\n\tconst groups = initialEvictionGroups(relaxed);\n\tconst nonBoundaries = groups.filter((group) => !group.boundary).sort((left, right) => left.order - right.order);\n\tconst boundaries = groups\n\t\t.filter((group) => group.boundary)\n\t\t.sort((left, right) => right.tokens - left.tokens || left.order - right.order);\n\tlet planned: ContextDeletionTarget[] = [];\n\tlet lastValidated: ValidatedContextDeletionResult | undefined;\n\tconst skippedBoundaries: EvictionGroup[] = [];\n\n\tif (relaxed.tokensBefore > tokenBudget) {\n\t\tconst batch = adoptSmallestFittingPrefix(relaxed, planned, nonBoundaries, tokenBudget);\n\t\tif (batch) {\n\t\t\tplanned = [...batch.deletedTargets];\n\t\t\tlastValidated = batch;\n\t\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t\t} else {\n\t\t\tfor (const group of nonBoundaries) {\n\t\t\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\t\t\tif (!result) continue;\n\t\t\t\tplanned = [...result.deletedTargets];\n\t\t\t\tlastValidated = result;\n\t\t\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const group of nonBoundaries) {\n\t\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\t\tif (!result) continue;\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tconst boundaryBaseTargets = [...planned];\n\tconst boundaryBaseResult = lastValidated;\n\tconst boundaryBatch = repairedFittingBoundaryPrefix(\n\t\trelaxed,\n\t\tplanned,\n\t\tboundaries,\n\t\ttokenBudget,\n\t\tlastValidated?.stats.tokensAfter ?? relaxed.tokensBefore,\n\t);\n\tif (boundaryBatch) {\n\t\tconst standalone = boundaries[0] ? tryGroup(relaxed, [], boundaries[0], true) : undefined;\n\t\treturn standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > boundaryBatch.stats.tokensAfter\n\t\t\t? standalone\n\t\t\t: boundaryBatch;\n\t}\n\n\tfor (const group of boundaries) {\n\t\tconst result = tryGroup(relaxed, planned, group, true);\n\t\tif (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter)) {\n\t\t\tskippedBoundaries.push(group);\n\t\t\tcontinue;\n\t\t}\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) {\n\t\t\tconst standalone = tryGroup(relaxed, [], group, true);\n\t\t\treturn standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > result.stats.tokensAfter\n\t\t\t\t? standalone\n\t\t\t\t: result;\n\t\t}\n\t}\n\n\tfor (const group of currentHistoricalSignedGroups(relaxed, planned)) {\n\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\tif (!result) continue;\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tconst groupedRetryIds = new Set<string>();\n\tfor (const component of skippedBoundaryRestorationGroups(relaxed, planned, skippedBoundaries)) {\n\t\tconst entryIds = component.flatMap((group) => group.entryIds);\n\t\tfor (const entryId of entryIds) groupedRetryIds.add(entryId);\n\t\tconst combined: EvictionGroup = {\n\t\t\tentryIds,\n\t\t\torder: Math.min(...component.map((group) => group.order)),\n\t\t\ttokens: component.reduce((sum, group) => sum + group.tokens, 0),\n\t\t\tboundary: true,\n\t\t};\n\t\tconst result = tryGroup(relaxed, planned, combined, true);\n\t\tif (!result) continue;\n\t\tconst deleted = getDeletedEntryIds(result.deletedTargets);\n\t\tif (!entryIds.every((entryId) => deleted.has(entryId))) continue;\n\t\tif (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter && !hasFitBudget(result, tokenBudget)) {\n\t\t\tcontinue;\n\t\t}\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tfor (const group of skippedBoundaries) {\n\t\tif (group.entryIds.some((entryId) => groupedRetryIds.has(entryId))) continue;\n\t\tconst result = tryGroup(relaxed, planned, group, true);\n\t\tif (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter)) continue;\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tconst alternate = alternateBoundaryPlan(\n\t\trelaxed,\n\t\tboundaryBaseTargets,\n\t\tboundaryBaseResult,\n\t\tboundaries,\n\t\ttokenBudget,\n\t);\n\tif (alternate) return alternate;\n\n\tthrow terminalDeterministicEvictionError(\"candidate sweep exhausted\", lastValidated, tokenBudget);\n}\n"]}
|