@bastani/atomic 0.8.31-alpha.5 → 0.9.0-alpha.1
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 +5 -1
- package/dist/builtin/cursor/CHANGELOG.md +4 -1
- package/dist/builtin/cursor/package.json +2 -2
- package/dist/builtin/cursor/src/proto/protobuf-codec-json.ts +44 -0
- package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +271 -0
- package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +231 -0
- package/dist/builtin/cursor/src/proto/protobuf-codec.ts +5 -523
- package/dist/builtin/cursor/src/stream.ts +6 -70
- package/dist/builtin/cursor/src/transport-errors.ts +74 -0
- package/dist/builtin/cursor/src/transport-frame.ts +56 -0
- package/dist/builtin/cursor/src/transport-http2.ts +122 -0
- package/dist/builtin/cursor/src/transport-native-client.ts +161 -0
- package/dist/builtin/cursor/src/transport-run-stream.ts +188 -0
- package/dist/builtin/cursor/src/transport-timeouts.ts +87 -0
- package/dist/builtin/cursor/src/transport-types.ts +140 -0
- package/dist/builtin/cursor/src/transport.ts +24 -790
- package/dist/builtin/intercom/CHANGELOG.md +3 -0
- package/dist/builtin/intercom/broker/client.ts +0 -35
- package/dist/builtin/intercom/contact-supervisor-tool.ts +289 -0
- package/dist/builtin/intercom/index-heavy.ts +77 -1336
- package/dist/builtin/intercom/intercom-tool.ts +409 -0
- package/dist/builtin/intercom/intercom-utils.ts +401 -0
- package/dist/builtin/intercom/lifecycle.ts +133 -0
- package/dist/builtin/intercom/overlay.ts +96 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/subagent-relay.ts +137 -0
- package/dist/builtin/mcp/CHANGELOG.md +3 -0
- package/dist/builtin/mcp/config-write-utils.ts +104 -0
- package/dist/builtin/mcp/config.ts +4 -180
- package/dist/builtin/mcp/mcp-panel-renderer.ts +243 -0
- package/dist/builtin/mcp/mcp-panel-state.ts +227 -0
- package/dist/builtin/mcp/mcp-panel-types.ts +86 -0
- package/dist/builtin/mcp/mcp-panel.ts +145 -579
- package/dist/builtin/mcp/mcp-setup-panel.ts +4 -81
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/mcp/proxy-auth.ts +61 -0
- package/dist/builtin/mcp/proxy-call.ts +373 -0
- package/dist/builtin/mcp/proxy-connect.ts +58 -0
- package/dist/builtin/mcp/proxy-info-modes.ts +326 -0
- package/dist/builtin/mcp/proxy-modes.ts +3 -805
- package/dist/builtin/mcp/proxy-types.ts +3 -0
- package/dist/builtin/mcp/ui-server-http.ts +81 -0
- package/dist/builtin/mcp/ui-server.ts +2 -127
- package/dist/builtin/subagents/CHANGELOG.md +3 -0
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/agents/agent-discovery.ts +127 -0
- package/dist/builtin/subagents/src/agents/agent-loaders.ts +175 -0
- package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +310 -0
- package/dist/builtin/subagents/src/agents/agent-management.ts +3 -309
- package/dist/builtin/subagents/src/agents/agent-overrides.ts +397 -0
- package/dist/builtin/subagents/src/agents/agent-paths.ts +88 -0
- package/dist/builtin/subagents/src/agents/agent-types.ts +136 -0
- package/dist/builtin/subagents/src/agents/agents.ts +22 -895
- package/dist/builtin/subagents/src/agents/skills-paths.ts +333 -0
- package/dist/builtin/subagents/src/agents/skills.ts +3 -326
- package/dist/builtin/subagents/src/extension/index.ts +4 -118
- package/dist/builtin/subagents/src/extension/prompt-guidance.ts +13 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +401 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +131 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +213 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +84 -0
- package/dist/builtin/subagents/src/runs/background/async-execution.ts +13 -795
- package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +215 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-finalize.ts +136 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-output.ts +105 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel-helpers.ts +112 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +159 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +127 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-state.ts +427 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +273 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +269 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +196 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-utils.ts +70 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +44 -2233
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +75 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +202 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +97 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +160 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +72 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +161 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +203 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +234 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +103 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +29 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +4 -1328
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +117 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-details.ts +35 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +194 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +183 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +185 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +229 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +194 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +94 -1043
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-control.ts +135 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +107 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-types.ts +17 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +454 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +219 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-structured-retries.ts +77 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +34 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +56 -0
- package/dist/builtin/subagents/src/runs/foreground/execution.ts +6 -1082
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +207 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +140 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +266 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +270 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +157 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +375 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +463 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +17 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +320 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +207 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +121 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +113 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +150 -2522
- package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +0 -16
- package/dist/builtin/subagents/src/runs/shared/nested-events-control.ts +167 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-core.ts +219 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-projection.ts +121 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-registry.ts +289 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-sanitize.ts +201 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events.ts +50 -935
- package/dist/builtin/subagents/src/runs/shared/worktree.ts +0 -78
- package/dist/builtin/subagents/src/shared/types-async.ts +265 -0
- package/dist/builtin/subagents/src/shared/types-config.ts +125 -0
- package/dist/builtin/subagents/src/shared/types-depth.ts +121 -0
- package/dist/builtin/subagents/src/shared/types-output.ts +63 -0
- package/dist/builtin/subagents/src/shared/types-results.ts +318 -0
- package/dist/builtin/subagents/src/shared/types-runtime.ts +136 -0
- package/dist/builtin/subagents/src/shared/types.ts +10 -975
- package/dist/builtin/subagents/src/slash/slash-commands.ts +0 -12
- package/dist/builtin/subagents/src/tui/render-chain-graph.ts +247 -0
- package/dist/builtin/subagents/src/tui/render-event-formatting.ts +259 -0
- package/dist/builtin/subagents/src/tui/render-layout.ts +120 -0
- package/dist/builtin/subagents/src/tui/render-result-animation.ts +56 -0
- package/dist/builtin/subagents/src/tui/render-result-compact.ts +154 -0
- package/dist/builtin/subagents/src/tui/render-result.ts +390 -0
- package/dist/builtin/subagents/src/tui/render-stable-output.ts +83 -0
- package/dist/builtin/subagents/src/tui/render-status-progress.ts +133 -0
- package/dist/builtin/subagents/src/tui/render-widget-graph.ts +166 -0
- package/dist/builtin/subagents/src/tui/render-widget.ts +273 -0
- package/dist/builtin/subagents/src/tui/render.ts +14 -1801
- package/dist/builtin/web-access/CHANGELOG.md +3 -0
- package/dist/builtin/web-access/content-tools.ts +348 -0
- package/dist/builtin/web-access/curator-page-assets/script-1.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-2.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-3.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-4.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-5.ts +398 -0
- package/dist/builtin/web-access/curator-page-assets/styles-1.ts +394 -0
- package/dist/builtin/web-access/curator-page-assets/styles-2.ts +394 -0
- package/dist/builtin/web-access/curator-page-assets/styles-3.ts +393 -0
- package/dist/builtin/web-access/curator-page.ts +17 -3180
- package/dist/builtin/web-access/curator-server-helpers.ts +115 -0
- package/dist/builtin/web-access/curator-server.ts +2 -113
- package/dist/builtin/web-access/exa-mcp.ts +218 -0
- package/dist/builtin/web-access/exa.ts +2 -207
- package/dist/builtin/web-access/extract-frames.ts +228 -0
- package/dist/builtin/web-access/extract.ts +13 -214
- package/dist/builtin/web-access/github-config.ts +156 -0
- package/dist/builtin/web-access/github-extract.ts +3 -154
- package/dist/builtin/web-access/index-heavy.ts +8 -1904
- package/dist/builtin/web-access/package.json +2 -1
- package/dist/builtin/web-access/web-search-activity.ts +102 -0
- package/dist/builtin/web-access/web-search-browser.ts +116 -0
- package/dist/builtin/web-access/web-search-command.ts +242 -0
- package/dist/builtin/web-access/web-search-config.ts +163 -0
- package/dist/builtin/web-access/web-search-curator.ts +214 -0
- package/dist/builtin/web-access/web-search-features.ts +165 -0
- package/dist/builtin/web-access/web-search-formatting.ts +117 -0
- package/dist/builtin/web-access/web-search-return.ts +136 -0
- package/dist/builtin/web-access/web-search-summary.ts +170 -0
- package/dist/builtin/web-access/web-search-tool.ts +290 -0
- package/dist/builtin/web-access/web-search-types.ts +50 -0
- package/dist/builtin/workflows/CHANGELOG.md +4 -1
- package/dist/builtin/workflows/builtin/deep-research-codebase-runner.ts +492 -0
- package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +346 -0
- package/dist/builtin/workflows/builtin/deep-research-codebase.ts +6 -822
- package/dist/builtin/workflows/builtin/goal-artifacts.ts +43 -0
- package/dist/builtin/workflows/builtin/goal-ledger.ts +54 -0
- package/dist/builtin/workflows/builtin/goal-prompts.ts +360 -0
- package/dist/builtin/workflows/builtin/goal-reducer.ts +141 -0
- package/dist/builtin/workflows/builtin/goal-reports.ts +56 -0
- package/dist/builtin/workflows/builtin/goal-review.ts +84 -0
- package/dist/builtin/workflows/builtin/goal-runner.ts +343 -0
- package/dist/builtin/workflows/builtin/goal-schemas.ts +60 -0
- package/dist/builtin/workflows/builtin/goal-types.ts +132 -0
- package/dist/builtin/workflows/builtin/goal.ts +4 -1160
- package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +432 -0
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +477 -0
- package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +312 -0
- package/dist/builtin/workflows/builtin/open-claude-design.ts +7 -1083
- package/dist/builtin/workflows/builtin/ralph-core.ts +408 -0
- package/dist/builtin/workflows/builtin/ralph-models.ts +123 -0
- package/dist/builtin/workflows/builtin/ralph-runner.ts +499 -0
- package/dist/builtin/workflows/builtin/ralph.ts +7 -979
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +8 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +13 -15
- package/dist/builtin/workflows/skills/impeccable/scripts/live-manual-edit-evidence.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +9 -0
- package/dist/builtin/workflows/src/extension/atomic-stage-session.ts +186 -0
- package/dist/builtin/workflows/src/extension/config-file-loader.ts +152 -0
- package/dist/builtin/workflows/src/extension/config-loader.ts +2 -167
- package/dist/builtin/workflows/src/extension/discovery-loaders.ts +115 -0
- package/dist/builtin/workflows/src/extension/discovery.ts +3 -117
- package/dist/builtin/workflows/src/extension/extension-factory.ts +120 -0
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +109 -0
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +270 -0
- package/dist/builtin/workflows/src/extension/index.ts +42 -4166
- package/dist/builtin/workflows/src/extension/public-types.ts +295 -0
- package/dist/builtin/workflows/src/extension/render-component.ts +14 -0
- package/dist/builtin/workflows/src/extension/runtime-direct.ts +96 -0
- package/dist/builtin/workflows/src/extension/runtime.ts +1 -92
- package/dist/builtin/workflows/src/extension/ui-surface.ts +286 -0
- package/dist/builtin/workflows/src/extension/wiring.ts +6 -475
- package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +111 -0
- package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +213 -0
- package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +81 -0
- package/dist/builtin/workflows/src/extension/workflow-command-utils.ts +181 -0
- package/dist/builtin/workflows/src/extension/workflow-policy.ts +15 -0
- package/dist/builtin/workflows/src/extension/workflow-ports.ts +41 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +23 -0
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +286 -0
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-stage-results.ts +264 -0
- package/dist/builtin/workflows/src/extension/workflow-targets.ts +181 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +175 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +205 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +66 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +164 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-registration.ts +54 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +164 -0
- package/dist/builtin/workflows/src/extension/workflow-tool.ts +102 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-abort.ts +431 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +232 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-child-helpers.ts +74 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-child-workflow.ts +158 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +167 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +450 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +233 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-exit-manager.ts +195 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +368 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-inputs.ts +83 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +441 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-outputs.ts +160 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +274 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-run-finalizers.ts +122 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-run.ts +359 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +204 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +197 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +120 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +126 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +351 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +134 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +54 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-task-context.ts +132 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +293 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +109 -0
- package/dist/builtin/workflows/src/runs/foreground/executor.ts +19 -5354
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +219 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +500 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +129 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +53 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +146 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +55 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +82 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +141 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +13 -1355
- package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +453 -0
- package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +442 -0
- package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +2 -836
- package/dist/builtin/workflows/src/runs/shared/worktree-diff.ts +165 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +220 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +335 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +92 -0
- package/dist/builtin/workflows/src/runs/shared/worktree.ts +18 -791
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +365 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +425 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +236 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +354 -0
- package/dist/builtin/workflows/src/shared/authoring-contract.d.ts +5 -598
- package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +428 -0
- package/dist/builtin/workflows/src/shared/persistence-restore.ts +9 -431
- package/dist/builtin/workflows/src/shared/store-factory.ts +16 -0
- package/dist/builtin/workflows/src/shared/store-internal.ts +219 -0
- package/dist/builtin/workflows/src/shared/store-prompt-methods.ts +219 -0
- package/dist/builtin/workflows/src/shared/store-public-types.ts +215 -0
- package/dist/builtin/workflows/src/shared/store-run-methods.ts +223 -0
- package/dist/builtin/workflows/src/shared/store-stage-methods.ts +305 -0
- package/dist/builtin/workflows/src/shared/store.ts +11 -1138
- package/dist/builtin/workflows/src/shared/workflow-failures-classifier.ts +266 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-contract.ts +75 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +477 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-signals.ts +248 -0
- package/dist/builtin/workflows/src/shared/workflow-failures.ts +13 -1001
- package/dist/builtin/workflows/src/tui/chat-surface.ts +0 -66
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +45 -0
- package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +161 -0
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +333 -0
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +336 -0
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +194 -0
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +306 -0
- package/dist/builtin/workflows/src/tui/graph-view-types.ts +70 -0
- package/dist/builtin/workflows/src/tui/graph-view.ts +4 -1386
- package/dist/builtin/workflows/src/tui/inline-form-editor-text.ts +121 -0
- package/dist/builtin/workflows/src/tui/inline-form-editor.ts +11 -223
- package/dist/builtin/workflows/src/tui/inputs-picker-editing.ts +151 -0
- package/dist/builtin/workflows/src/tui/inputs-picker-input.ts +305 -0
- package/dist/builtin/workflows/src/tui/inputs-picker-render.ts +300 -0
- package/dist/builtin/workflows/src/tui/inputs-picker-types.ts +190 -0
- package/dist/builtin/workflows/src/tui/inputs-picker.ts +19 -997
- package/dist/builtin/workflows/src/tui/prompt-card-input.ts +226 -0
- package/dist/builtin/workflows/src/tui/prompt-card-render.ts +373 -0
- package/dist/builtin/workflows/src/tui/prompt-card-select.ts +116 -0
- package/dist/builtin/workflows/src/tui/prompt-card-state.ts +61 -0
- package/dist/builtin/workflows/src/tui/prompt-card-text.ts +129 -0
- package/dist/builtin/workflows/src/tui/prompt-card.ts +8 -910
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +315 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-custom-ui.ts +127 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +187 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +222 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +152 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +464 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-transcript.ts +242 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +151 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +141 -1777
- package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +85 -0
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +1 -129
- package/dist/config-self-update.d.ts +21 -0
- package/dist/config-self-update.d.ts.map +1 -0
- package/dist/config-self-update.js +265 -0
- package/dist/config-self-update.js.map +1 -0
- package/dist/config.d.ts +3 -12
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -252
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-accessors.d.ts +3 -0
- package/dist/core/agent-session-accessors.d.ts.map +1 -0
- package/dist/core/agent-session-accessors.js +36 -0
- package/dist/core/agent-session-accessors.js.map +1 -0
- package/dist/core/agent-session-auto-compaction.d.ts +32 -0
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -0
- package/dist/core/agent-session-auto-compaction.js +214 -0
- package/dist/core/agent-session-auto-compaction.js.map +1 -0
- package/dist/core/agent-session-bash.d.ts +30 -0
- package/dist/core/agent-session-bash.d.ts.map +1 -0
- package/dist/core/agent-session-bash.js +84 -0
- package/dist/core/agent-session-bash.js.map +1 -0
- package/dist/core/agent-session-compaction.d.ts +44 -0
- package/dist/core/agent-session-compaction.d.ts.map +1 -0
- package/dist/core/agent-session-compaction.js +282 -0
- package/dist/core/agent-session-compaction.js.map +1 -0
- package/dist/core/agent-session-events.d.ts +65 -0
- package/dist/core/agent-session-events.d.ts.map +1 -0
- package/dist/core/agent-session-events.js +373 -0
- package/dist/core/agent-session-events.js.map +1 -0
- package/dist/core/agent-session-export.d.ts +42 -0
- package/dist/core/agent-session-export.d.ts.map +1 -0
- package/dist/core/agent-session-export.js +199 -0
- package/dist/core/agent-session-export.js.map +1 -0
- package/dist/core/agent-session-extension-bindings.d.ts +37 -0
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -0
- package/dist/core/agent-session-extension-bindings.js +231 -0
- package/dist/core/agent-session-extension-bindings.js.map +1 -0
- package/dist/core/agent-session-message-queue.d.ts +85 -0
- package/dist/core/agent-session-message-queue.d.ts.map +1 -0
- package/dist/core/agent-session-message-queue.js +264 -0
- package/dist/core/agent-session-message-queue.js.map +1 -0
- package/dist/core/agent-session-methods.d.ts +302 -0
- package/dist/core/agent-session-methods.d.ts.map +1 -0
- package/dist/core/agent-session-methods.js +2 -0
- package/dist/core/agent-session-methods.js.map +1 -0
- package/dist/core/agent-session-models.d.ts +111 -0
- package/dist/core/agent-session-models.d.ts.map +1 -0
- package/dist/core/agent-session-models.js +368 -0
- package/dist/core/agent-session-models.js.map +1 -0
- package/dist/core/agent-session-prompt.d.ts +61 -0
- package/dist/core/agent-session-prompt.d.ts.map +1 -0
- package/dist/core/agent-session-prompt.js +330 -0
- package/dist/core/agent-session-prompt.js.map +1 -0
- package/dist/core/agent-session-retry.d.ts +62 -0
- package/dist/core/agent-session-retry.d.ts.map +1 -0
- package/dist/core/agent-session-retry.js +202 -0
- package/dist/core/agent-session-retry.js.map +1 -0
- package/dist/core/agent-session-skill-block.d.ts +13 -0
- package/dist/core/agent-session-skill-block.d.ts.map +1 -0
- package/dist/core/agent-session-skill-block.js +37 -0
- package/dist/core/agent-session-skill-block.js.map +1 -0
- package/dist/core/agent-session-state.d.ts +48 -0
- package/dist/core/agent-session-state.d.ts.map +1 -0
- package/dist/core/agent-session-state.js +129 -0
- package/dist/core/agent-session-state.js.map +1 -0
- package/dist/core/agent-session-tool-hooks.d.ts +7 -0
- package/dist/core/agent-session-tool-hooks.d.ts.map +1 -0
- package/dist/core/agent-session-tool-hooks.js +72 -0
- package/dist/core/agent-session-tool-hooks.js.map +1 -0
- package/dist/core/agent-session-tool-registry.d.ts +15 -0
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -0
- package/dist/core/agent-session-tool-registry.js +151 -0
- package/dist/core/agent-session-tool-registry.js.map +1 -0
- package/dist/core/agent-session-tree.d.ts +46 -0
- package/dist/core/agent-session-tree.d.ts.map +1 -0
- package/dist/core/agent-session-tree.js +217 -0
- package/dist/core/agent-session-tree.js.map +1 -0
- package/dist/core/agent-session-types.d.ts +159 -0
- package/dist/core/agent-session-types.d.ts.map +1 -0
- package/dist/core/agent-session-types.js +41 -0
- package/dist/core/agent-session-types.js.map +1 -0
- package/dist/core/agent-session.d.ts +68 -688
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +26 -3152
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts +49 -0
- package/dist/core/auth-storage-backends.d.ts.map +1 -0
- package/dist/core/auth-storage-backends.js +185 -0
- package/dist/core/auth-storage-backends.js.map +1 -0
- package/dist/core/auth-storage.d.ts +2 -49
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -183
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/context-compaction-metrics.d.ts +16 -0
- package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-metrics.js +58 -0
- package/dist/core/compaction/context-compaction-metrics.js.map +1 -0
- package/dist/core/compaction/context-compaction-prompt.d.ts +9 -0
- package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-prompt.js +161 -0
- package/dist/core/compaction/context-compaction-prompt.js.map +1 -0
- package/dist/core/compaction/context-compaction-runner.d.ts +5 -0
- package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-runner.js +181 -0
- package/dist/core/compaction/context-compaction-runner.js.map +1 -0
- package/dist/core/compaction/context-compaction-strategy.d.ts +5 -0
- package/dist/core/compaction/context-compaction-strategy.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-strategy.js +27 -0
- package/dist/core/compaction/context-compaction-strategy.js.map +1 -0
- package/dist/core/compaction/context-compaction-types.d.ts +73 -0
- package/dist/core/compaction/context-compaction-types.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-types.js +6 -0
- package/dist/core/compaction/context-compaction-types.js.map +1 -0
- package/dist/core/compaction/context-compaction.d.ts +9 -200
- package/dist/core/compaction/context-compaction.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction.js +7 -1943
- package/dist/core/compaction/context-compaction.js.map +1 -1
- package/dist/core/compaction/context-deletion-application.d.ts +13 -0
- package/dist/core/compaction/context-deletion-application.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-application.js +259 -0
- package/dist/core/compaction/context-deletion-application.js.map +1 -0
- package/dist/core/compaction/context-deletion-store.d.ts +78 -0
- package/dist/core/compaction/context-deletion-store.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-store.js +162 -0
- package/dist/core/compaction/context-deletion-store.js.map +1 -0
- package/dist/core/compaction/context-deletion-targets.d.ts +40 -0
- package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-targets.js +267 -0
- package/dist/core/compaction/context-deletion-targets.js.map +1 -0
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts +187 -0
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-tool-definitions.js +98 -0
- package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -0
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts +19 -0
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-tool-helpers.js +137 -0
- package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -0
- package/dist/core/compaction/context-deletion-tools.d.ts +4 -0
- package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-tools.js +395 -0
- package/dist/core/compaction/context-deletion-tools.js.map +1 -0
- package/dist/core/compaction/context-transcript-analysis.d.ts +9 -0
- package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -0
- package/dist/core/compaction/context-transcript-analysis.js +234 -0
- package/dist/core/compaction/context-transcript-analysis.js.map +1 -0
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +2 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template-js/data-tree.js +287 -0
- package/dist/core/export-html/template-js/entries-navigation.js +424 -0
- package/dist/core/export-html/template-js/initialization.js +312 -0
- package/dist/core/export-html/template-js/message-tools.js +415 -0
- package/dist/core/export-html/template-js/tree-filter-render.js +421 -0
- package/dist/core/export-html/template-script.d.ts +3 -0
- package/dist/core/export-html/template-script.d.ts.map +1 -0
- package/dist/core/export-html/template-script.js +13 -0
- package/dist/core/export-html/template-script.js.map +1 -0
- package/dist/core/export-html/template.js +3 -1
- package/dist/core/extensions/agent-events.d.ts +159 -0
- package/dist/core/extensions/agent-events.d.ts.map +1 -0
- package/dist/core/extensions/agent-events.js +2 -0
- package/dist/core/extensions/agent-events.js.map +1 -0
- package/dist/core/extensions/api-types.d.ts +189 -0
- package/dist/core/extensions/api-types.d.ts.map +1 -0
- package/dist/core/extensions/api-types.js +2 -0
- package/dist/core/extensions/api-types.js.map +1 -0
- package/dist/core/extensions/command-types.d.ts +14 -0
- package/dist/core/extensions/command-types.d.ts.map +1 -0
- package/dist/core/extensions/command-types.js +2 -0
- package/dist/core/extensions/command-types.js.map +1 -0
- package/dist/core/extensions/context-types.d.ts +130 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -0
- package/dist/core/extensions/context-types.js +2 -0
- package/dist/core/extensions/context-types.js.map +1 -0
- package/dist/core/extensions/event-results.d.ts +61 -0
- package/dist/core/extensions/event-results.d.ts.map +1 -0
- package/dist/core/extensions/event-results.js +2 -0
- package/dist/core/extensions/event-results.js.map +1 -0
- package/dist/core/extensions/event-types.d.ts +6 -0
- package/dist/core/extensions/event-types.d.ts.map +1 -0
- package/dist/core/extensions/event-types.js +2 -0
- package/dist/core/extensions/event-types.js.map +1 -0
- package/dist/core/extensions/loader-api.d.ts +10 -0
- package/dist/core/extensions/loader-api.d.ts.map +1 -0
- package/dist/core/extensions/loader-api.js +143 -0
- package/dist/core/extensions/loader-api.js.map +1 -0
- package/dist/core/extensions/loader-core.d.ts +12 -0
- package/dist/core/extensions/loader-core.d.ts.map +1 -0
- package/dist/core/extensions/loader-core.js +91 -0
- package/dist/core/extensions/loader-core.js.map +1 -0
- package/dist/core/extensions/loader-discovery.d.ts +7 -0
- package/dist/core/extensions/loader-discovery.d.ts.map +1 -0
- package/dist/core/extensions/loader-discovery.js +139 -0
- package/dist/core/extensions/loader-discovery.js.map +1 -0
- package/dist/core/extensions/loader-resources.d.ts +11 -0
- package/dist/core/extensions/loader-resources.d.ts.map +1 -0
- package/dist/core/extensions/loader-resources.js +10 -0
- package/dist/core/extensions/loader-resources.js.map +1 -0
- package/dist/core/extensions/loader-runtime.d.ts +7 -0
- package/dist/core/extensions/loader-runtime.d.ts.map +1 -0
- package/dist/core/extensions/loader-runtime.js +51 -0
- package/dist/core/extensions/loader-runtime.js.map +1 -0
- package/dist/core/extensions/loader-virtual-modules.d.ts +3 -0
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/loader-virtual-modules.js +92 -0
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +4 -28
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +3 -542
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/message-types.d.ts +34 -0
- package/dist/core/extensions/message-types.d.ts.map +1 -0
- package/dist/core/extensions/message-types.js +2 -0
- package/dist/core/extensions/message-types.js.map +1 -0
- package/dist/core/extensions/provider-types.d.ts +71 -0
- package/dist/core/extensions/provider-types.d.ts.map +1 -0
- package/dist/core/extensions/provider-types.js +2 -0
- package/dist/core/extensions/provider-types.js.map +1 -0
- package/dist/core/extensions/runner-context.d.ts +42 -0
- package/dist/core/extensions/runner-context.d.ts.map +1 -0
- package/dist/core/extensions/runner-context.js +112 -0
- package/dist/core/extensions/runner-context.js.map +1 -0
- package/dist/core/extensions/runner-events.d.ts +47 -0
- package/dist/core/extensions/runner-events.d.ts.map +1 -0
- package/dist/core/extensions/runner-events.js +280 -0
- package/dist/core/extensions/runner-events.js.map +1 -0
- package/dist/core/extensions/runner-handlers.d.ts +32 -0
- package/dist/core/extensions/runner-handlers.d.ts.map +1 -0
- package/dist/core/extensions/runner-handlers.js +2 -0
- package/dist/core/extensions/runner-handlers.js.map +1 -0
- package/dist/core/extensions/runner-project-trust.d.ts +6 -0
- package/dist/core/extensions/runner-project-trust.d.ts.map +1 -0
- package/dist/core/extensions/runner-project-trust.js +27 -0
- package/dist/core/extensions/runner-project-trust.js.map +1 -0
- package/dist/core/extensions/runner-registries.d.ts +8 -0
- package/dist/core/extensions/runner-registries.d.ts.map +1 -0
- package/dist/core/extensions/runner-registries.js +76 -0
- package/dist/core/extensions/runner-registries.js.map +1 -0
- package/dist/core/extensions/runner-shortcuts.d.ts +10 -0
- package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -0
- package/dist/core/extensions/runner-shortcuts.js +71 -0
- package/dist/core/extensions/runner-shortcuts.js.map +1 -0
- package/dist/core/extensions/runner-ui.d.ts +3 -0
- package/dist/core/extensions/runner-ui.d.ts.map +1 -0
- package/dist/core/extensions/runner-ui.js +50 -0
- package/dist/core/extensions/runner-ui.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +7 -74
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +67 -673
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +179 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -0
- package/dist/core/extensions/runtime-types.js +2 -0
- package/dist/core/extensions/runtime-types.js.map +1 -0
- package/dist/core/extensions/session-events.d.ts +89 -0
- package/dist/core/extensions/session-events.d.ts.map +1 -0
- package/dist/core/extensions/session-events.js +2 -0
- package/dist/core/extensions/session-events.js.map +1 -0
- package/dist/core/extensions/tool-events.d.ts +127 -0
- package/dist/core/extensions/tool-events.d.ts.map +1 -0
- package/dist/core/extensions/tool-events.js +26 -0
- package/dist/core/extensions/tool-events.js.map +1 -0
- package/dist/core/extensions/tool-types.d.ts +100 -0
- package/dist/core/extensions/tool-types.d.ts.map +1 -0
- package/dist/core/extensions/tool-types.js +11 -0
- package/dist/core/extensions/tool-types.js.map +1 -0
- package/dist/core/extensions/types.d.ts +20 -1288
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +4 -34
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +200 -0
- package/dist/core/extensions/ui-types.d.ts.map +1 -0
- package/dist/core/extensions/ui-types.js +2 -0
- package/dist/core/extensions/ui-types.js.map +1 -0
- package/dist/core/model-registry-auth.d.ts +7 -0
- package/dist/core/model-registry-auth.d.ts.map +1 -0
- package/dist/core/model-registry-auth.js +64 -0
- package/dist/core/model-registry-auth.js.map +1 -0
- package/dist/core/model-registry-builtins.d.ts +9 -0
- package/dist/core/model-registry-builtins.d.ts.map +1 -0
- package/dist/core/model-registry-builtins.js +120 -0
- package/dist/core/model-registry-builtins.js.map +1 -0
- package/dist/core/model-registry-custom-loader.d.ts +3 -0
- package/dist/core/model-registry-custom-loader.d.ts.map +1 -0
- package/dist/core/model-registry-custom-loader.js +213 -0
- package/dist/core/model-registry-custom-loader.js.map +1 -0
- package/dist/core/model-registry-dynamic.d.ts +6 -0
- package/dist/core/model-registry-dynamic.d.ts.map +1 -0
- package/dist/core/model-registry-dynamic.js +155 -0
- package/dist/core/model-registry-dynamic.js.map +1 -0
- package/dist/core/model-registry-loader.d.ts +4 -0
- package/dist/core/model-registry-loader.d.ts.map +1 -0
- package/dist/core/model-registry-loader.js +20 -0
- package/dist/core/model-registry-loader.js.map +1 -0
- package/dist/core/model-registry-schemas.d.ts +1084 -0
- package/dist/core/model-registry-schemas.d.ts.map +1 -0
- package/dist/core/model-registry-schemas.js +161 -0
- package/dist/core/model-registry-schemas.js.map +1 -0
- package/dist/core/model-registry-types.d.ts +74 -0
- package/dist/core/model-registry-types.d.ts.map +1 -0
- package/dist/core/model-registry-types.js +2 -0
- package/dist/core/model-registry-types.js.map +1 -0
- package/dist/core/model-registry.d.ts +3 -76
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +24 -733
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts +19 -0
- package/dist/core/model-resolver-cli.d.ts.map +1 -0
- package/dist/core/model-resolver-cli.js +118 -0
- package/dist/core/model-resolver-cli.js.map +1 -0
- package/dist/core/model-resolver-defaults.d.ts +5 -0
- package/dist/core/model-resolver-defaults.d.ts.map +1 -0
- package/dist/core/model-resolver-defaults.js +47 -0
- package/dist/core/model-resolver-defaults.js.map +1 -0
- package/dist/core/model-resolver-initial.d.ts +31 -0
- package/dist/core/model-resolver-initial.d.ts.map +1 -0
- package/dist/core/model-resolver-initial.js +116 -0
- package/dist/core/model-resolver-initial.js.map +1 -0
- package/dist/core/model-resolver-patterns.d.ts +26 -0
- package/dist/core/model-resolver-patterns.d.ts.map +1 -0
- package/dist/core/model-resolver-patterns.js +139 -0
- package/dist/core/model-resolver-patterns.js.map +1 -0
- package/dist/core/model-resolver-scope.d.ts +15 -0
- package/dist/core/model-resolver-scope.d.ts.map +1 -0
- package/dist/core/model-resolver-scope.js +66 -0
- package/dist/core/model-resolver-scope.js.map +1 -0
- package/dist/core/model-resolver-types.d.ts +29 -0
- package/dist/core/model-resolver-types.d.ts.map +1 -0
- package/dist/core/model-resolver-types.js +2 -0
- package/dist/core/model-resolver-types.js.map +1 -0
- package/dist/core/model-resolver.d.ts +6 -107
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +5 -549
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager-auto-resources.d.ts +5 -0
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -0
- package/dist/core/package-manager-auto-resources.js +109 -0
- package/dist/core/package-manager-auto-resources.js.map +1 -0
- package/dist/core/package-manager-command.d.ts +11 -0
- package/dist/core/package-manager-command.d.ts.map +1 -0
- package/dist/core/package-manager-command.js +102 -0
- package/dist/core/package-manager-command.js.map +1 -0
- package/dist/core/package-manager-constants.d.ts +4 -0
- package/dist/core/package-manager-constants.d.ts.map +1 -0
- package/dist/core/package-manager-constants.js +4 -0
- package/dist/core/package-manager-constants.js.map +1 -0
- package/dist/core/package-manager-env.d.ts +4 -0
- package/dist/core/package-manager-env.d.ts.map +1 -0
- package/dist/core/package-manager-env.js +40 -0
- package/dist/core/package-manager-env.js.map +1 -0
- package/dist/core/package-manager-git.d.ts +10 -0
- package/dist/core/package-manager-git.d.ts.map +1 -0
- package/dist/core/package-manager-git.js +271 -0
- package/dist/core/package-manager-git.js.map +1 -0
- package/dist/core/package-manager-manifest.d.ts +7 -0
- package/dist/core/package-manager-manifest.d.ts.map +1 -0
- package/dist/core/package-manager-manifest.js +45 -0
- package/dist/core/package-manager-manifest.js.map +1 -0
- package/dist/core/package-manager-npm.d.ts +25 -0
- package/dist/core/package-manager-npm.d.ts.map +1 -0
- package/dist/core/package-manager-npm.js +252 -0
- package/dist/core/package-manager-npm.js.map +1 -0
- package/dist/core/package-manager-operations.d.ts +11 -0
- package/dist/core/package-manager-operations.d.ts.map +1 -0
- package/dist/core/package-manager-operations.js +196 -0
- package/dist/core/package-manager-operations.js.map +1 -0
- package/dist/core/package-manager-paths.d.ts +14 -0
- package/dist/core/package-manager-paths.d.ts.map +1 -0
- package/dist/core/package-manager-paths.js +61 -0
- package/dist/core/package-manager-paths.js.map +1 -0
- package/dist/core/package-manager-progress.d.ts +4 -0
- package/dist/core/package-manager-progress.d.ts.map +1 -0
- package/dist/core/package-manager-progress.js +16 -0
- package/dist/core/package-manager-progress.js.map +1 -0
- package/dist/core/package-manager-resolver.d.ts +5 -0
- package/dist/core/package-manager-resolver.d.ts.map +1 -0
- package/dist/core/package-manager-resolver.js +149 -0
- package/dist/core/package-manager-resolver.js.map +1 -0
- package/dist/core/package-manager-resource-accumulator.d.ts +6 -0
- package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -0
- package/dist/core/package-manager-resource-accumulator.js +67 -0
- package/dist/core/package-manager-resource-accumulator.js.map +1 -0
- package/dist/core/package-manager-resource-collector.d.ts +5 -0
- package/dist/core/package-manager-resource-collector.d.ts.map +1 -0
- package/dist/core/package-manager-resource-collector.js +148 -0
- package/dist/core/package-manager-resource-collector.js.map +1 -0
- package/dist/core/package-manager-resource-files.d.ts +14 -0
- package/dist/core/package-manager-resource-files.d.ts.map +1 -0
- package/dist/core/package-manager-resource-files.js +265 -0
- package/dist/core/package-manager-resource-files.js.map +1 -0
- package/dist/core/package-manager-resource-patterns.d.ts +12 -0
- package/dist/core/package-manager-resource-patterns.d.ts.map +1 -0
- package/dist/core/package-manager-resource-patterns.js +136 -0
- package/dist/core/package-manager-resource-patterns.js.map +1 -0
- package/dist/core/package-manager-settings.d.ts +10 -0
- package/dist/core/package-manager-settings.d.ts.map +1 -0
- package/dist/core/package-manager-settings.js +91 -0
- package/dist/core/package-manager-settings.js.map +1 -0
- package/dist/core/package-manager-source.d.ts +21 -0
- package/dist/core/package-manager-source.d.ts.map +1 -0
- package/dist/core/package-manager-source.js +146 -0
- package/dist/core/package-manager-source.js.map +1 -0
- package/dist/core/package-manager-types.d.ts +169 -0
- package/dist/core/package-manager-types.d.ts.map +1 -0
- package/dist/core/package-manager-types.js +9 -0
- package/dist/core/package-manager-types.js.map +1 -0
- package/dist/core/package-manager.d.ts +9 -174
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +56 -2100
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader-assets.d.ts +6 -0
- package/dist/core/resource-loader-assets.d.ts.map +1 -0
- package/dist/core/resource-loader-assets.js +209 -0
- package/dist/core/resource-loader-assets.js.map +1 -0
- package/dist/core/resource-loader-context-files.d.ts +10 -0
- package/dist/core/resource-loader-context-files.d.ts.map +1 -0
- package/dist/core/resource-loader-context-files.js +74 -0
- package/dist/core/resource-loader-context-files.js.map +1 -0
- package/dist/core/resource-loader-core.d.ts +82 -0
- package/dist/core/resource-loader-core.d.ts.map +1 -0
- package/dist/core/resource-loader-core.js +168 -0
- package/dist/core/resource-loader-core.js.map +1 -0
- package/dist/core/resource-loader-discovery.d.ts +4 -0
- package/dist/core/resource-loader-discovery.d.ts.map +1 -0
- package/dist/core/resource-loader-discovery.js +28 -0
- package/dist/core/resource-loader-discovery.js.map +1 -0
- package/dist/core/resource-loader-extensions.d.ts +13 -0
- package/dist/core/resource-loader-extensions.d.ts.map +1 -0
- package/dist/core/resource-loader-extensions.js +110 -0
- package/dist/core/resource-loader-extensions.js.map +1 -0
- package/dist/core/resource-loader-helpers.d.ts +4 -0
- package/dist/core/resource-loader-helpers.d.ts.map +1 -0
- package/dist/core/resource-loader-helpers.js +23 -0
- package/dist/core/resource-loader-helpers.js.map +1 -0
- package/dist/core/resource-loader-internals.d.ts +96 -0
- package/dist/core/resource-loader-internals.d.ts.map +1 -0
- package/dist/core/resource-loader-internals.js +4 -0
- package/dist/core/resource-loader-internals.js.map +1 -0
- package/dist/core/resource-loader-package-resources.d.ts +31 -0
- package/dist/core/resource-loader-package-resources.d.ts.map +1 -0
- package/dist/core/resource-loader-package-resources.js +112 -0
- package/dist/core/resource-loader-package-resources.js.map +1 -0
- package/dist/core/resource-loader-paths.d.ts +4 -0
- package/dist/core/resource-loader-paths.d.ts.map +1 -0
- package/dist/core/resource-loader-paths.js +22 -0
- package/dist/core/resource-loader-paths.js.map +1 -0
- package/dist/core/resource-loader-reload.d.ts +6 -0
- package/dist/core/resource-loader-reload.d.ts.map +1 -0
- package/dist/core/resource-loader-reload.js +226 -0
- package/dist/core/resource-loader-reload.js.map +1 -0
- package/dist/core/resource-loader-source-info.d.ts +9 -0
- package/dist/core/resource-loader-source-info.d.ts.map +1 -0
- package/dist/core/resource-loader-source-info.js +101 -0
- package/dist/core/resource-loader-source-info.js.map +1 -0
- package/dist/core/resource-loader-types.d.ts +130 -0
- package/dist/core/resource-loader-types.d.ts.map +1 -0
- package/dist/core/resource-loader-types.js +2 -0
- package/dist/core/resource-loader-types.js.map +1 -0
- package/dist/core/resource-loader.d.ts +3 -242
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +2 -976
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk-exports.d.ts +7 -0
- package/dist/core/sdk-exports.d.ts.map +1 -0
- package/dist/core/sdk-exports.js +5 -0
- package/dist/core/sdk-exports.js.map +1 -0
- package/dist/core/sdk-types.d.ts +86 -0
- package/dist/core/sdk-types.d.ts.map +1 -0
- package/dist/core/sdk-types.js +2 -0
- package/dist/core/sdk-types.js.map +1 -0
- package/dist/core/sdk.d.ts +3 -91
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-archive.d.ts +27 -0
- package/dist/core/session-manager-archive.d.ts.map +1 -0
- package/dist/core/session-manager-archive.js +114 -0
- package/dist/core/session-manager-archive.js.map +1 -0
- package/dist/core/session-manager-core.d.ts +104 -0
- package/dist/core/session-manager-core.d.ts.map +1 -0
- package/dist/core/session-manager-core.js +346 -0
- package/dist/core/session-manager-core.js.map +1 -0
- package/dist/core/session-manager-entries.d.ts +38 -0
- package/dist/core/session-manager-entries.d.ts.map +1 -0
- package/dist/core/session-manager-entries.js +124 -0
- package/dist/core/session-manager-entries.js.map +1 -0
- package/dist/core/session-manager-history.d.ts +38 -0
- package/dist/core/session-manager-history.d.ts.map +1 -0
- package/dist/core/session-manager-history.js +378 -0
- package/dist/core/session-manager-history.js.map +1 -0
- package/dist/core/session-manager-list.d.ts +5 -0
- package/dist/core/session-manager-list.d.ts.map +1 -0
- package/dist/core/session-manager-list.js +196 -0
- package/dist/core/session-manager-list.js.map +1 -0
- package/dist/core/session-manager-migrations.d.ts +11 -0
- package/dist/core/session-manager-migrations.d.ts.map +1 -0
- package/dist/core/session-manager-migrations.js +80 -0
- package/dist/core/session-manager-migrations.js.map +1 -0
- package/dist/core/session-manager-paths.d.ts +7 -0
- package/dist/core/session-manager-paths.d.ts.map +1 -0
- package/dist/core/session-manager-paths.js +22 -0
- package/dist/core/session-manager-paths.js.map +1 -0
- package/dist/core/session-manager-storage.d.ts +15 -0
- package/dist/core/session-manager-storage.d.ts.map +1 -0
- package/dist/core/session-manager-storage.js +127 -0
- package/dist/core/session-manager-storage.js.map +1 -0
- package/dist/core/session-manager-types.d.ts +172 -0
- package/dist/core/session-manager-types.d.ts.map +1 -0
- package/dist/core/session-manager-types.js +2 -0
- package/dist/core/session-manager-types.js.map +1 -0
- package/dist/core/session-manager-validation.d.ts +7 -0
- package/dist/core/session-manager-validation.d.ts.map +1 -0
- package/dist/core/session-manager-validation.js +34 -0
- package/dist/core/session-manager-validation.js.map +1 -0
- package/dist/core/session-manager.d.ts +8 -390
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +7 -1418
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +65 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -0
- package/dist/core/settings-manager-basic-accessors.js +253 -0
- package/dist/core/settings-manager-basic-accessors.js.map +1 -0
- package/dist/core/settings-manager-core.d.ts +57 -0
- package/dist/core/settings-manager-core.d.ts.map +1 -0
- package/dist/core/settings-manager-core.js +387 -0
- package/dist/core/settings-manager-core.js.map +1 -0
- package/dist/core/settings-manager-internals.d.ts +13 -0
- package/dist/core/settings-manager-internals.d.ts.map +1 -0
- package/dist/core/settings-manager-internals.js +4 -0
- package/dist/core/settings-manager-internals.js.map +1 -0
- package/dist/core/settings-manager-resource-accessors.d.ts +43 -0
- package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -0
- package/dist/core/settings-manager-resource-accessors.js +172 -0
- package/dist/core/settings-manager-resource-accessors.js.map +1 -0
- package/dist/core/settings-manager-ui-accessors.d.ts +44 -0
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -0
- package/dist/core/settings-manager-ui-accessors.js +208 -0
- package/dist/core/settings-manager-ui-accessors.js.map +1 -0
- package/dist/core/settings-manager.d.ts +6 -321
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +5 -1060
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-merge.d.ts +4 -0
- package/dist/core/settings-merge.d.ts.map +1 -0
- package/dist/core/settings-merge.js +26 -0
- package/dist/core/settings-merge.js.map +1 -0
- package/dist/core/settings-storage.d.ts +20 -0
- package/dist/core/settings-storage.d.ts.map +1 -0
- package/dist/core/settings-storage.js +100 -0
- package/dist/core/settings-storage.js.map +1 -0
- package/dist/core/settings-types.d.ts +123 -0
- package/dist/core/settings-types.d.ts.map +1 -0
- package/dist/core/settings-types.js +2 -0
- package/dist/core/settings-types.js.map +1 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +7 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash-policy-compile.d.ts +5 -0
- package/dist/core/tools/bash-policy-compile.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-compile.js +241 -0
- package/dist/core/tools/bash-policy-compile.js.map +1 -0
- package/dist/core/tools/bash-policy-evaluate.d.ts +3 -0
- package/dist/core/tools/bash-policy-evaluate.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-evaluate.js +92 -0
- package/dist/core/tools/bash-policy-evaluate.js.map +1 -0
- package/dist/core/tools/bash-policy-format.d.ts +5 -0
- package/dist/core/tools/bash-policy-format.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-format.js +49 -0
- package/dist/core/tools/bash-policy-format.js.map +1 -0
- package/dist/core/tools/bash-policy-parser.d.ts +4 -0
- package/dist/core/tools/bash-policy-parser.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-parser.js +155 -0
- package/dist/core/tools/bash-policy-parser.js.map +1 -0
- package/dist/core/tools/bash-policy-segment.d.ts +3 -0
- package/dist/core/tools/bash-policy-segment.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-segment.js +275 -0
- package/dist/core/tools/bash-policy-segment.js.map +1 -0
- package/dist/core/tools/bash-policy-shell.d.ts +11 -0
- package/dist/core/tools/bash-policy-shell.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-shell.js +267 -0
- package/dist/core/tools/bash-policy-shell.js.map +1 -0
- package/dist/core/tools/bash-policy-types.d.ts +146 -0
- package/dist/core/tools/bash-policy-types.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-types.js +2 -0
- package/dist/core/tools/bash-policy-types.js.map +1 -0
- package/dist/core/tools/bash-policy.d.ts +5 -61
- package/dist/core/tools/bash-policy.d.ts.map +1 -1
- package/dist/core/tools/bash-policy.js +4 -1068
- package/dist/core/tools/bash-policy.js.map +1 -1
- package/dist/core/tools/todos-execute.d.ts +5 -0
- package/dist/core/tools/todos-execute.d.ts.map +1 -0
- package/dist/core/tools/todos-execute.js +200 -0
- package/dist/core/tools/todos-execute.js.map +1 -0
- package/dist/core/tools/todos-locks.d.ts +4 -0
- package/dist/core/tools/todos-locks.d.ts.map +1 -0
- package/dist/core/tools/todos-locks.js +80 -0
- package/dist/core/tools/todos-locks.js.map +1 -0
- package/dist/core/tools/todos-model.d.ts +21 -0
- package/dist/core/tools/todos-model.d.ts.map +1 -0
- package/dist/core/tools/todos-model.js +71 -0
- package/dist/core/tools/todos-model.js.map +1 -0
- package/dist/core/tools/todos-mutations.d.ts +6 -0
- package/dist/core/tools/todos-mutations.d.ts.map +1 -0
- package/dist/core/tools/todos-mutations.js +85 -0
- package/dist/core/tools/todos-mutations.js.map +1 -0
- package/dist/core/tools/todos-paths.d.ts +5 -0
- package/dist/core/tools/todos-paths.d.ts.map +1 -0
- package/dist/core/tools/todos-paths.js +25 -0
- package/dist/core/tools/todos-paths.js.map +1 -0
- package/dist/core/tools/todos-render.d.ts +10 -0
- package/dist/core/tools/todos-render.d.ts.map +1 -0
- package/dist/core/tools/todos-render.js +159 -0
- package/dist/core/tools/todos-render.js.map +1 -0
- package/dist/core/tools/todos-storage.d.ts +9 -0
- package/dist/core/tools/todos-storage.d.ts.map +1 -0
- package/dist/core/tools/todos-storage.js +183 -0
- package/dist/core/tools/todos-storage.js.map +1 -0
- package/dist/core/tools/todos-types.d.ts +46 -0
- package/dist/core/tools/todos-types.d.ts.map +1 -0
- package/dist/core/tools/todos-types.js +27 -0
- package/dist/core/tools/todos-types.js.map +1 -0
- package/dist/core/tools/todos.d.ts +12 -32
- package/dist/core/tools/todos.d.ts.map +1 -1
- package/dist/core/tools/todos.js +7 -893
- package/dist/core/tools/todos.js.map +1 -1
- package/dist/index-extensions.d.ts +3 -0
- package/dist/index-extensions.d.ts.map +1 -0
- package/dist/index-extensions.js +2 -0
- package/dist/index-extensions.js.map +1 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main-app-mode.d.ts +15 -0
- package/dist/main-app-mode.d.ts.map +1 -0
- package/dist/main-app-mode.js +51 -0
- package/dist/main-app-mode.js.map +1 -0
- package/dist/main-session-options.d.ts +12 -0
- package/dist/main-session-options.d.ts.map +1 -0
- package/dist/main-session-options.js +87 -0
- package/dist/main-session-options.js.map +1 -0
- package/dist/main-session.d.ts +9 -0
- package/dist/main-session.d.ts.map +1 -0
- package/dist/main-session.js +188 -0
- package/dist/main-session.js.map +1 -0
- package/dist/main-stdio.d.ts +12 -0
- package/dist/main-stdio.d.ts.map +1 -0
- package/dist/main-stdio.js +68 -0
- package/dist/main-stdio.js.map +1 -0
- package/dist/main.d.ts +2 -3
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +11 -388
- package/dist/main.js.map +1 -1
- package/dist/migrations-config-values.d.ts +9 -0
- package/dist/migrations-config-values.d.ts.map +1 -0
- package/dist/migrations-config-values.js +298 -0
- package/dist/migrations-config-values.js.map +1 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -296
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js +0 -7
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts +9 -0
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-actions.js +244 -0
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts +18 -0
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-editor.js +165 -0
- package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-events.d.ts +5 -0
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-events.js +200 -0
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts +13 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.js +185 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +13 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.js +101 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +53 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-state.js +42 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-types.d.ts +63 -0
- package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-types.js +2 -0
- package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-utils.d.ts +28 -0
- package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-utils.js +103 -0
- package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts +6 -129
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +50 -1022
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.d.ts +65 -0
- package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector-list.js +458 -0
- package/dist/modes/interactive/components/config-selector-list.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +3 -58
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +2 -457
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-delete.d.ts +10 -0
- package/dist/modes/interactive/components/session-selector-delete.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-delete.js +40 -0
- package/dist/modes/interactive/components/session-selector-delete.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-header.d.ts +33 -0
- package/dist/modes/interactive/components/session-selector-header.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-header.js +117 -0
- package/dist/modes/interactive/components/session-selector-header.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-list.d.ts +49 -0
- package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-list.js +307 -0
- package/dist/modes/interactive/components/session-selector-list.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-tree.d.ts +25 -0
- package/dist/modes/interactive/components/session-selector-tree.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-tree.js +53 -0
- package/dist/modes/interactive/components/session-selector-tree.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-types.d.ts +4 -0
- package/dist/modes/interactive/components/session-selector-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-types.js +2 -0
- package/dist/modes/interactive/components/session-selector-types.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-utils.d.ts +4 -0
- package/dist/modes/interactive/components/session-selector-utils.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-utils.js +37 -0
- package/dist/modes/interactive/components/session-selector-utils.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +3 -49
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +5 -542
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts +3 -0
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js +84 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-items.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-items.js +211 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-options.d.ts +6 -0
- package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-options.js +14 -0
- package/dist/modes/interactive/components/settings-selector-options.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts +44 -0
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-submenus.js +228 -0
- package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts +67 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-types.js +2 -0
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -63
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +5 -538
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-component.d.ts +21 -0
- package/dist/modes/interactive/components/tree-selector-component.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-component.js +80 -0
- package/dist/modes/interactive/components/tree-selector-component.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-content.d.ts +8 -0
- package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-content.js +263 -0
- package/dist/modes/interactive/components/tree-selector-content.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-help.d.ts +16 -0
- package/dist/modes/interactive/components/tree-selector-help.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-help.js +103 -0
- package/dist/modes/interactive/components/tree-selector-help.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-label-input.d.ts +16 -0
- package/dist/modes/interactive/components/tree-selector-label-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-label-input.js +46 -0
- package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-list.d.ts +33 -0
- package/dist/modes/interactive/components/tree-selector-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-list.js +336 -0
- package/dist/modes/interactive/components/tree-selector-list.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-model.d.ts +7 -0
- package/dist/modes/interactive/components/tree-selector-model.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-model.js +358 -0
- package/dist/modes/interactive/components/tree-selector-model.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-types.d.ts +57 -0
- package/dist/modes/interactive/components/tree-selector-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-types.js +6 -0
- package/dist/modes/interactive/components/tree-selector-types.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-viewport.d.ts +10 -0
- package/dist/modes/interactive/components/tree-selector-viewport.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-viewport.js +32 -0
- package/dist/modes/interactive/components/tree-selector-viewport.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +2 -88
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +1 -1200
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.d.ts +2 -0
- package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-agent-events.js +370 -0
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -0
- package/dist/modes/interactive/interactive-auth-login.d.ts +2 -0
- package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-auth-login.js +214 -0
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -0
- package/dist/modes/interactive/interactive-auth-routing.d.ts +2 -0
- package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-auth-routing.js +128 -0
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -0
- package/dist/modes/interactive/interactive-autocomplete.d.ts +2 -0
- package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-autocomplete.js +140 -0
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -0
- package/dist/modes/interactive/interactive-bash-compact.d.ts +2 -0
- package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-bash-compact.js +112 -0
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -0
- package/dist/modes/interactive/interactive-editor-actions.d.ts +2 -0
- package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-editor-actions.js +131 -0
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-context.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-context.js +159 -0
- package/dist/modes/interactive/interactive-extension-context.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.js +208 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-dialogs.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-dialogs.js +162 -0
- package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-runtime.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-runtime.js +179 -0
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-widgets.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-widgets.js +113 -0
- package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts +2 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.js +186 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -0
- package/dist/modes/interactive/interactive-input-handling.d.ts +2 -0
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-input-handling.js +275 -0
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts +103 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-base.js +130 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-deps.d.ts +81 -0
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-deps.js +74 -0
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-helpers.d.ts +21 -0
- package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-helpers.js +77 -0
- package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-surface.d.ts +313 -0
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-surface.js +2 -0
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-types.d.ts +29 -0
- package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-types.js +2 -0
- package/dist/modes/interactive/interactive-mode-types.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +30 -404
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +29 -5260
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.d.ts +2 -0
- package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-model-routing.js +269 -0
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -0
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts +2 -0
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-process-lifecycle.js +189 -0
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -0
- package/dist/modes/interactive/interactive-queueing.d.ts +2 -0
- package/dist/modes/interactive/interactive-queueing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-queueing.js +163 -0
- package/dist/modes/interactive/interactive-queueing.js.map +1 -0
- package/dist/modes/interactive/interactive-render-chat.d.ts +2 -0
- package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-render-chat.js +170 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -0
- package/dist/modes/interactive/interactive-resource-disclosure.d.ts +2 -0
- package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resource-disclosure.js +101 -0
- package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -0
- package/dist/modes/interactive/interactive-resource-paths.d.ts +2 -0
- package/dist/modes/interactive/interactive-resource-paths.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resource-paths.js +228 -0
- package/dist/modes/interactive/interactive-resource-paths.js.map +1 -0
- package/dist/modes/interactive/interactive-resource-rendering.d.ts +2 -0
- package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resource-rendering.js +181 -0
- package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -0
- package/dist/modes/interactive/interactive-selectors.d.ts +2 -0
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-selectors.js +198 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -0
- package/dist/modes/interactive/interactive-session-routing.d.ts +2 -0
- package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-session-routing.js +232 -0
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -0
- package/dist/modes/interactive/interactive-session-runtime.d.ts +2 -0
- package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-session-runtime.js +131 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -0
- package/dist/modes/interactive/interactive-slash-commands.d.ts +2 -0
- package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-slash-commands.js +338 -0
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -0
- package/dist/modes/interactive/interactive-startup.d.ts +2 -0
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-startup.js +348 -0
- package/dist/modes/interactive/interactive-startup.js.map +1 -0
- package/dist/modes/interactive/theme/color-utils.d.ts +20 -0
- package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -0
- package/dist/modes/interactive/theme/color-utils.js +204 -0
- package/dist/modes/interactive/theme/color-utils.js.map +1 -0
- package/dist/modes/interactive/theme/export-colors.d.ts +19 -0
- package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -0
- package/dist/modes/interactive/theme/export-colors.js +69 -0
- package/dist/modes/interactive/theme/export-colors.js.map +1 -0
- package/dist/modes/interactive/theme/global-theme.d.ts +12 -0
- package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/global-theme.js +150 -0
- package/dist/modes/interactive/theme/global-theme.js.map +1 -0
- package/dist/modes/interactive/theme/terminal-detection.d.ts +30 -0
- package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -0
- package/dist/modes/interactive/theme/terminal-detection.js +89 -0
- package/dist/modes/interactive/theme/terminal-detection.js.map +1 -0
- package/dist/modes/interactive/theme/theme-class.d.ts +30 -0
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-class.js +83 -0
- package/dist/modes/interactive/theme/theme-class.js.map +1 -0
- package/dist/modes/interactive/theme/theme-loading.d.ts +17 -0
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-loading.js +155 -0
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -0
- package/dist/modes/interactive/theme/theme-parse.d.ts +5 -0
- package/dist/modes/interactive/theme/theme-parse.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-parse.js +52 -0
- package/dist/modes/interactive/theme/theme-parse.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts +255 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.js +78 -0
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts +6 -108
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +6 -1065
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/theme/tui-theme.d.ts +15 -0
- package/dist/modes/interactive/theme/tui-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/tui-theme.js +199 -0
- package/dist/modes/interactive/theme/tui-theme.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -61
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +1 -72
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts +14 -0
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-command-handler.js +226 -0
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -0
- package/dist/modes/rpc/rpc-extension-ui.d.ts +15 -0
- package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-extension-ui.js +196 -0
- package/dist/modes/rpc/rpc-extension-ui.js.map +1 -0
- package/dist/modes/rpc/rpc-input.d.ts +12 -0
- package/dist/modes/rpc/rpc-input.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-input.js +54 -0
- package/dist/modes/rpc/rpc-input.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +43 -607
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-responses.d.ts +8 -0
- package/dist/modes/rpc/rpc-responses.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-responses.js +27 -0
- package/dist/modes/rpc/rpc-responses.js.map +1 -0
- package/dist/modes/rpc/rpc-session-binding.d.ts +25 -0
- package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-session-binding.js +70 -0
- package/dist/modes/rpc/rpc-session-binding.js.map +1 -0
- package/dist/package-manager-cli-parser.d.ts +28 -0
- package/dist/package-manager-cli-parser.d.ts.map +1 -0
- package/dist/package-manager-cli-parser.js +269 -0
- package/dist/package-manager-cli-parser.js.map +1 -0
- package/dist/package-manager-cli.d.ts +0 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +2 -267
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +10 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/version-check.d.ts +1 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +17 -0
- package/dist/utils/version-check.js.map +1 -1
- package/docs/development.md +4 -0
- package/docs/workflows.md +8 -6
- package/examples/extensions/custom-provider-anthropic/index.ts +1 -106
- package/examples/extensions/gondolin/index.ts +0 -23
- package/examples/extensions/overlay-qa-animation-components.ts +255 -0
- package/examples/extensions/overlay-qa-focus-components.ts +222 -0
- package/examples/extensions/overlay-qa-position-components.ts +433 -0
- package/examples/extensions/overlay-qa-shared.ts +37 -0
- package/examples/extensions/overlay-qa-streaming-input-components.ts +205 -0
- package/examples/extensions/overlay-qa-tests.ts +17 -1156
- package/examples/extensions/overlay-qa-toggle-passive-components.ts +169 -0
- package/examples/extensions/space-invaders.ts +0 -60
- package/examples/extensions/subagent/display.ts +148 -0
- package/examples/extensions/subagent/index.ts +11 -858
- package/examples/extensions/subagent/render.ts +383 -0
- package/examples/extensions/subagent/runner.ts +252 -0
- package/examples/extensions/subagent/schemas.ts +59 -0
- package/examples/extensions/subagent/types.ts +36 -0
- package/examples/extensions/tic-tac-toe-instructions.ts +65 -0
- package/examples/extensions/tic-tac-toe-rendering.ts +414 -0
- package/examples/extensions/tic-tac-toe-state.ts +158 -0
- package/examples/extensions/tic-tac-toe.ts +92 -754
- package/examples/rpc-extension-ui-components.ts +189 -0
- package/examples/rpc-extension-ui.ts +2 -179
- package/package.json +4 -4
|
@@ -1,1944 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { createBranchSummaryMessage, createCustomMessage } from "../messages.js";
|
|
9
|
-
import { isAssistantThinkingBlockType, messageHasAssistantThinkingContentBlock, } from "../thinking-blocks.js";
|
|
10
|
-
import { buildContextDeletionFilteredPath, buildEffectiveContextDeletionFilters, } from "../session-manager.js";
|
|
11
|
-
import { estimateTokens } from "./compaction.js";
|
|
12
|
-
export const CONTEXT_COMPACTION_PROMPT_VERSION = 1;
|
|
13
|
-
const CONTEXT_DELETE_TOOL_NAME = "context_delete";
|
|
14
|
-
const CONTEXT_GREP_DELETE_TOOL_NAME = "context_grep_delete";
|
|
15
|
-
const CONTEXT_SEARCH_TRANSCRIPT_TOOL_NAME = "context_search_transcript";
|
|
16
|
-
const CONTEXT_READ_ENTRY_TOOL_NAME = "context_read_entry";
|
|
17
|
-
const CONTEXT_COMPACTION_BUDGET_TOOL_NAME = "context_compaction_budget";
|
|
18
|
-
export const CONTEXT_COMPACTION_DEFAULT_COMPRESSION_RATIO = 0.5;
|
|
19
|
-
export const CONTEXT_COMPACTION_TARGET_REDUCTION_PERCENT = 50;
|
|
20
|
-
export const CONTEXT_COMPACTION_DEFAULT_PRESERVE_RECENT = 2;
|
|
21
|
-
export const CONTEXT_COMPACTION_AUTO_QUERY = "auto-detected";
|
|
22
|
-
const CONTEXT_GREP_DELETE_DEFAULT_MAX_MATCHES = 50;
|
|
23
|
-
const CONTEXT_GREP_DELETE_MAX_REGEX_PATTERN_CHARS = 512;
|
|
24
|
-
const CONTEXT_GREP_DELETE_MAX_REGEX_SCAN_CHARS = 250_000;
|
|
25
|
-
const CONTEXT_MANIFEST_MAX_ENTRIES = 80;
|
|
26
|
-
const CONTEXT_MANIFEST_PREVIEW_CHARS = 240;
|
|
27
|
-
const CONTEXT_READ_ENTRY_DEFAULT_MAX_CHARS = 4000;
|
|
28
|
-
const CONTEXT_READ_ENTRY_MAX_CHARS = 12_000;
|
|
29
|
-
const CONTEXT_SEARCH_DEFAULT_MAX_MATCHES = 20;
|
|
30
|
-
const CONTEXT_SEARCH_MAX_MATCHES = 100;
|
|
31
|
-
const CONTEXT_SEARCH_DEFAULT_CONTEXT_CHARS = 160;
|
|
32
|
-
const CONTEXT_SEARCH_MAX_CONTEXT_CHARS = 500;
|
|
33
|
-
const ContextDeleteToolParameters = Type.Object({
|
|
34
|
-
deletions: Type.Array(Type.Object({
|
|
35
|
-
kind: StringEnum(["entry", "content_block"], {
|
|
36
|
-
description: "Delete an entire transcript entry or a single content block within one entry.",
|
|
37
|
-
}),
|
|
38
|
-
entryId: Type.String({ minLength: 1, description: "Stable transcript entry id to delete from." }),
|
|
39
|
-
blockIndex: Type.Optional(Type.Integer({
|
|
40
|
-
minimum: 0,
|
|
41
|
-
description: "Required when kind is content_block; omit when kind is entry.",
|
|
42
|
-
})),
|
|
43
|
-
}, { additionalProperties: false }), {
|
|
44
|
-
description: "ID-only deletion targets. Include only kind, entryId, and blockIndex when needed; do not include transcript text, block contents, summaries, or replacement content. Invalid targets are rejected by the tool with correction guidance.",
|
|
45
|
-
}),
|
|
46
|
-
}, { additionalProperties: false });
|
|
47
|
-
const ContextGrepDeleteToolParameters = Type.Object({
|
|
48
|
-
pattern: Type.String({ minLength: 1, description: "Literal text or regular expression to match in transcript text." }),
|
|
49
|
-
regex: Type.Optional(Type.Boolean({ description: "Treat pattern as a JavaScript regular expression. Defaults to false." })),
|
|
50
|
-
caseSensitive: Type.Optional(Type.Boolean({ description: "Use case-sensitive matching. Defaults to false." })),
|
|
51
|
-
target: Type.Optional(StringEnum(["entry", "content_block"], {
|
|
52
|
-
description: "Delete whole matching entries or matching content blocks. Defaults to entry.",
|
|
53
|
-
})),
|
|
54
|
-
maxMatches: Type.Optional(Type.Integer({
|
|
55
|
-
minimum: 1,
|
|
56
|
-
maximum: 200,
|
|
57
|
-
description: "Per-call safety cap. If more not-yet-deleted candidate targets are found in this tool call, no deletions are applied. Defaults to 50. This is not a cumulative compaction cap; call the tool again for additional batches.",
|
|
58
|
-
})),
|
|
59
|
-
expectedMatchCount: Type.Optional(Type.Integer({
|
|
60
|
-
minimum: 0,
|
|
61
|
-
description: "Optional safety check. If the match count differs, no deletions are applied.",
|
|
62
|
-
})),
|
|
63
|
-
}, { additionalProperties: false });
|
|
64
|
-
const ContextSearchTranscriptToolParameters = Type.Object({
|
|
65
|
-
pattern: Type.String({ minLength: 1, description: "Literal text or regular expression to search for." }),
|
|
66
|
-
regex: Type.Optional(Type.Boolean({ description: "Treat pattern as a JavaScript regular expression. Defaults to false." })),
|
|
67
|
-
caseSensitive: Type.Optional(Type.Boolean({ description: "Use case-sensitive matching. Defaults to false." })),
|
|
68
|
-
target: Type.Optional(StringEnum(["entry", "content_block"], {
|
|
69
|
-
description: "Search whole entry text or individual content-block text. Defaults to entry.",
|
|
70
|
-
})),
|
|
71
|
-
maxMatches: Type.Optional(Type.Integer({ minimum: 1, maximum: CONTEXT_SEARCH_MAX_MATCHES, description: "Maximum matches to return. Defaults to 20." })),
|
|
72
|
-
contextChars: Type.Optional(Type.Integer({
|
|
73
|
-
minimum: 0,
|
|
74
|
-
maximum: CONTEXT_SEARCH_MAX_CONTEXT_CHARS,
|
|
75
|
-
description: "Characters of context to include before and after each match. Defaults to 160.",
|
|
76
|
-
})),
|
|
77
|
-
}, { additionalProperties: false });
|
|
78
|
-
const ContextReadEntryToolParameters = Type.Object({
|
|
79
|
-
entryId: Type.String({ minLength: 1, description: "Stable transcript entry id to read." }),
|
|
80
|
-
blockIndex: Type.Optional(Type.Integer({ minimum: 0, description: "Optional content block index to read instead of the whole entry text." })),
|
|
81
|
-
offset: Type.Optional(Type.Integer({ minimum: 0, description: "Character offset to begin reading. Defaults to 0." })),
|
|
82
|
-
maxChars: Type.Optional(Type.Integer({
|
|
83
|
-
minimum: 1,
|
|
84
|
-
maximum: CONTEXT_READ_ENTRY_MAX_CHARS,
|
|
85
|
-
description: "Maximum characters to return. Defaults to 4000; keep reads small to avoid overflowing context.",
|
|
86
|
-
})),
|
|
87
|
-
}, { additionalProperties: false });
|
|
88
|
-
const ContextCompactionBudgetToolParameters = Type.Object({}, { additionalProperties: false });
|
|
89
|
-
const CONTEXT_DELETE_TOOL = {
|
|
90
|
-
name: CONTEXT_DELETE_TOOL_NAME,
|
|
91
|
-
description: "Record context compaction deletion targets directly against the transcript.",
|
|
92
|
-
parameters: ContextDeleteToolParameters,
|
|
93
|
-
};
|
|
94
|
-
const CONTEXT_GREP_DELETE_TOOL = {
|
|
95
|
-
name: CONTEXT_GREP_DELETE_TOOL_NAME,
|
|
96
|
-
description: "Bulk-delete transcript entries or content blocks matching a guarded grep/regex query.",
|
|
97
|
-
parameters: ContextGrepDeleteToolParameters,
|
|
98
|
-
};
|
|
99
|
-
const CONTEXT_SEARCH_TRANSCRIPT_TOOL = {
|
|
100
|
-
name: CONTEXT_SEARCH_TRANSCRIPT_TOOL_NAME,
|
|
101
|
-
description: "Search the full transcript working copy and return small snippets without mutating deletion state.",
|
|
102
|
-
parameters: ContextSearchTranscriptToolParameters,
|
|
103
|
-
};
|
|
104
|
-
const CONTEXT_READ_ENTRY_TOOL = {
|
|
105
|
-
name: CONTEXT_READ_ENTRY_TOOL_NAME,
|
|
106
|
-
description: "Read a small slice of one transcript entry or content block from the full transcript working copy.",
|
|
107
|
-
parameters: ContextReadEntryToolParameters,
|
|
108
|
-
};
|
|
109
|
-
const CONTEXT_COMPACTION_BUDGET_TOOL = {
|
|
110
|
-
name: CONTEXT_COMPACTION_BUDGET_TOOL_NAME,
|
|
111
|
-
description: "Report current context-window fullness and reduction progress for the selected deletion targets without mutating deletion state.",
|
|
112
|
-
parameters: ContextCompactionBudgetToolParameters,
|
|
113
|
-
};
|
|
114
|
-
const CONTEXT_COMPACTION_SYSTEM_PROMPT = `You are a context compaction assistant.
|
|
115
|
-
|
|
116
|
-
Your task is to read relevant parts of a conversation between a user and an AI assistant provided via a transcript file, then run a series of tools to apply deletion-only verbatim compaction using the exact context_delete or context_grep_delete format specified.`;
|
|
117
|
-
function contextCompactionFixedPrompt(parameters) {
|
|
118
|
-
const targetLabel = contextCompactionTargetLabel(parameters);
|
|
119
|
-
return `Reference the provided transcript file transcript and use your search/read tools for small inspections, then use context_delete or context_grep_delete for deletions.
|
|
120
|
-
|
|
121
|
-
Compaction records deletion targets, not replacement content.
|
|
122
|
-
For context_delete, use id-only targets: stable entryId values and optional blockIndex values only.
|
|
123
|
-
For context_grep_delete, use a concise literal or regex pattern to select matching entries or blocks; do not paste full transcript entries or content-block bodies.
|
|
124
|
-
Do not summarize, paraphrase, or generate replacement context; those are not accepted compaction outputs.
|
|
125
|
-
Do not mutate retained transcript objects or content.
|
|
126
|
-
Deletion tool calls are the compaction action.
|
|
127
|
-
|
|
128
|
-
Strategy:
|
|
129
|
-
- Start by calling context_compaction_budget to see how much of the context window is full and how much reduction is needed.
|
|
130
|
-
- Spend a few turns exploring with search/read tools to gain high confidence of candidate blocks to remove.
|
|
131
|
-
- Prefer high-confidence exploit actions after that: delete obvious low-value entries via context_grep_delete or context_delete.
|
|
132
|
-
- Use grep deletion for repeated low-value patterns.
|
|
133
|
-
- Use exact id deletion for inspected one-off stale entries.
|
|
134
|
-
- Check context_compaction_budget after deletion batches to track progress.
|
|
135
|
-
- Strict requirement: reduce current context by at least ${targetLabel} before finishing. This is a hard completion gate, not a loose goal.
|
|
136
|
-
- Do not send a final plain-text completion message until context_compaction_budget reports at least ${targetLabel} currentReductionPercent.
|
|
137
|
-
- If the strict ${targetLabel} reduction is not met yet, continue removing low-value message entries or content blocks with context_delete/context_grep_delete.
|
|
138
|
-
- Use the focus query to preserve relevant context: ${JSON.stringify(parameters.query)}.
|
|
139
|
-
|
|
140
|
-
What Gets Deleted:
|
|
141
|
-
- Redundant tool outputs: file reads already acted on, grep/search results already processed, passing test output no longer needed.
|
|
142
|
-
- Exploratory dead ends: irrelevant files read, unhelpful or empty searches.
|
|
143
|
-
- Verbose boilerplate: license headers, import blocks the agent isn't modifying, configuration files read for reference.
|
|
144
|
-
- Superseded information: earlier versions of files that have since been edited, old error messages from bugs already fixed.
|
|
145
|
-
|
|
146
|
-
What Survives:
|
|
147
|
-
- Active file paths and line numbers: Any reference the agent might need to navigate.
|
|
148
|
-
- Current error messages: Unresolved bugs and their exact text.
|
|
149
|
-
- Reasoning decisions: Why the agent chose approach A over B. An agent's chain of thought (why it chose this file, what pattern it noticed, what fix it decided on) carries more information-per-token than the raw grep output or file content that informed those decisions.
|
|
150
|
-
- Recent tool calls and their results: The last 3-5 operations.
|
|
151
|
-
- User instructions: The original task and any clarifications.
|
|
152
|
-
|
|
153
|
-
Conditionally Deleted:
|
|
154
|
-
- Old Reasoning decisions: If there is nothing else to remove and the target reduction is not met, you can remove entire stale assistant entries, EXCEPT do not delete individual content blocks from any retained assistant message that contains thinking or redacted_thinking blocks. Thinking-bearing assistant messages are all-or-nothing for replay safety.
|
|
155
|
-
|
|
156
|
-
<output_format>
|
|
157
|
-
Call the context_delete tool one or more times with deletion targets in this shape:
|
|
158
|
-
{ "deletions": [{ "kind": "entry", "entryId": "..." }] }
|
|
159
|
-
|
|
160
|
-
For content-block deletions, use:
|
|
161
|
-
{ "kind": "content_block", "entryId": "...", "blockIndex": 0 }
|
|
162
|
-
|
|
163
|
-
The tool applies and validates deletion targets immediately. You can continue calling it for additional deletions if useful.
|
|
164
|
-
|
|
165
|
-
For guarded bulk deletion by text match, call context_grep_delete with a literal pattern or regex. It removes valid matching context, silently ignores candidates that validation does not allow so they are not counted as removals, enforces a per-call maxMatches safety cap and optional expectedMatchCount, and validates through the same tool-call/tool-result safety rules. maxMatches only limits one tool call; there is no cumulative cap across corrected or repeated deletion calls.
|
|
166
|
-
|
|
167
|
-
The full transcript is available as a JSONL file path in the prompt, but do NOT try to load the whole file into context. Use context_search_transcript to find candidate entry IDs and context_read_entry to read only small slices (for example maxChars 1000-4000) before deleting.
|
|
168
|
-
|
|
169
|
-
When the strict ${targetLabel} reduction requirement is met, reply with a brief plain-text completion message. Do not include deletion target IDs outside tool calls.
|
|
170
|
-
</output_format>`;
|
|
171
|
-
}
|
|
172
|
-
function getMessageFromEntry(entry) {
|
|
173
|
-
if (entry.type === "message") {
|
|
174
|
-
return entry.message;
|
|
175
|
-
}
|
|
176
|
-
if (entry.type === "custom_message") {
|
|
177
|
-
return createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp, entry.excludeFromContext);
|
|
178
|
-
}
|
|
179
|
-
if (entry.type === "branch_summary") {
|
|
180
|
-
return createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);
|
|
181
|
-
}
|
|
182
|
-
return undefined;
|
|
183
|
-
}
|
|
184
|
-
function isExcludedFromLlmContext(message) {
|
|
185
|
-
switch (message.role) {
|
|
186
|
-
case "bashExecution":
|
|
187
|
-
return Boolean(message.excludeFromContext);
|
|
188
|
-
case "custom":
|
|
189
|
-
return message.excludeFromContext === true;
|
|
190
|
-
default:
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
function getContextEligibleMessageFromEntry(entry) {
|
|
195
|
-
const message = getMessageFromEntry(entry);
|
|
196
|
-
if (!message || isExcludedFromLlmContext(message))
|
|
197
|
-
return undefined;
|
|
198
|
-
return message;
|
|
199
|
-
}
|
|
200
|
-
function textFromUnknownContent(content) {
|
|
201
|
-
if (typeof content === "string")
|
|
202
|
-
return content;
|
|
203
|
-
if (!Array.isArray(content))
|
|
204
|
-
return JSON.stringify(content);
|
|
205
|
-
return content.map((block) => textFromContentBlock(block)).join("\n");
|
|
206
|
-
}
|
|
207
|
-
function textFromContentBlock(block) {
|
|
208
|
-
if (!block || typeof block !== "object")
|
|
209
|
-
return String(block);
|
|
210
|
-
const record = block;
|
|
211
|
-
if (record.type === "text" && typeof record.text === "string")
|
|
212
|
-
return record.text;
|
|
213
|
-
if (record.type === "thinking" && typeof record.thinking === "string")
|
|
214
|
-
return record.thinking;
|
|
215
|
-
if (record.type === "toolCall") {
|
|
216
|
-
const name = typeof record.name === "string" ? record.name : "tool";
|
|
217
|
-
const id = typeof record.id === "string" ? record.id : "unknown";
|
|
218
|
-
const args = "arguments" in record ? JSON.stringify(record.arguments) : "";
|
|
219
|
-
return `toolCall ${id} ${name} ${args}`.trim();
|
|
220
|
-
}
|
|
221
|
-
if (record.type === "image")
|
|
222
|
-
return "[image]";
|
|
223
|
-
return JSON.stringify(record);
|
|
224
|
-
}
|
|
225
|
-
function assistantEntryHasThinkingContentBlock(entry) {
|
|
226
|
-
return (entry.role === "assistant" &&
|
|
227
|
-
(entry.contentBlocks.some((block) => isAssistantThinkingBlockType(block.type)) ||
|
|
228
|
-
messageHasAssistantThinkingContentBlock(entry.message)));
|
|
229
|
-
}
|
|
230
|
-
const IMAGE_BLOCK_CHAR_ESTIMATE = 4800;
|
|
231
|
-
const IMAGE_BLOCK_TOKEN_ESTIMATE = Math.ceil(IMAGE_BLOCK_CHAR_ESTIMATE / 4);
|
|
232
|
-
function estimateTextTokens(text) {
|
|
233
|
-
return Math.max(1, Math.ceil(text.length / 4));
|
|
234
|
-
}
|
|
235
|
-
function estimateContentBlockTokens(block, text) {
|
|
236
|
-
if (block && typeof block === "object" && block.type === "image") {
|
|
237
|
-
return IMAGE_BLOCK_TOKEN_ESTIMATE;
|
|
238
|
-
}
|
|
239
|
-
return estimateTextTokens(text);
|
|
240
|
-
}
|
|
241
|
-
function getToolCallIdFromBlock(block) {
|
|
242
|
-
if (!block || typeof block !== "object")
|
|
243
|
-
return undefined;
|
|
244
|
-
const record = block;
|
|
245
|
-
if (record.type !== "toolCall")
|
|
246
|
-
return undefined;
|
|
247
|
-
return typeof record.id === "string" ? record.id : undefined;
|
|
248
|
-
}
|
|
249
|
-
function getToolResultCallId(message) {
|
|
250
|
-
if (message.role !== "toolResult")
|
|
251
|
-
return undefined;
|
|
252
|
-
const callId = message.toolCallId;
|
|
253
|
-
return typeof callId === "string" ? callId : undefined;
|
|
254
|
-
}
|
|
255
|
-
function contentBlocksForEntry(entryId, message, protectedEntry, existingDeletedBlocks) {
|
|
256
|
-
const content = message.content;
|
|
257
|
-
if (!Array.isArray(content))
|
|
258
|
-
return [];
|
|
259
|
-
return content
|
|
260
|
-
.map((block, blockIndex) => {
|
|
261
|
-
if (existingDeletedBlocks?.has(blockIndex)) {
|
|
262
|
-
return undefined;
|
|
263
|
-
}
|
|
264
|
-
const type = block && typeof block === "object" && typeof block.type === "string"
|
|
265
|
-
? (block.type)
|
|
266
|
-
: "unknown";
|
|
267
|
-
const text = textFromContentBlock(block);
|
|
268
|
-
return {
|
|
269
|
-
entryId,
|
|
270
|
-
blockIndex,
|
|
271
|
-
type,
|
|
272
|
-
text,
|
|
273
|
-
tokenEstimate: estimateContentBlockTokens(block, text),
|
|
274
|
-
protected: protectedEntry,
|
|
275
|
-
toolCallId: getToolCallIdFromBlock(block),
|
|
276
|
-
};
|
|
277
|
-
})
|
|
278
|
-
.filter((block) => block !== undefined);
|
|
279
|
-
}
|
|
280
|
-
function messageText(message) {
|
|
281
|
-
switch (message.role) {
|
|
282
|
-
case "bashExecution":
|
|
283
|
-
return `Ran ${message.command}\n${message.output}`;
|
|
284
|
-
case "branchSummary":
|
|
285
|
-
return message.summary;
|
|
286
|
-
case "custom":
|
|
287
|
-
case "toolResult":
|
|
288
|
-
case "user":
|
|
289
|
-
return textFromUnknownContent(message.content);
|
|
290
|
-
case "assistant":
|
|
291
|
-
return textFromUnknownContent(message.content);
|
|
292
|
-
case "compactionSummary":
|
|
293
|
-
// Legacy summary-compaction message type retained in the upstream AgentMessage union
|
|
294
|
-
// after summary compaction was removed; surface its archival summary text.
|
|
295
|
-
return message.summary;
|
|
296
|
-
default: {
|
|
297
|
-
// Exhaustiveness guard: adding a new AgentMessage role must fail the build here instead
|
|
298
|
-
// of silently degrading to an empty string.
|
|
299
|
-
const _exhaustiveCheck = message;
|
|
300
|
-
void _exhaustiveCheck;
|
|
301
|
-
return "";
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
function hasAssistantError(message) {
|
|
306
|
-
return message.role === "assistant" && message.stopReason === "error";
|
|
307
|
-
}
|
|
308
|
-
function hasToolResultError(message) {
|
|
309
|
-
return message.role === "toolResult" && message.isError === true;
|
|
310
|
-
}
|
|
311
|
-
function hasFailedBashExecution(message) {
|
|
312
|
-
return message.role === "bashExecution" && typeof message.exitCode === "number" && message.exitCode !== 0;
|
|
313
|
-
}
|
|
314
|
-
const CONTEXT_COMPACTION_QUERY_MAX_CHARS = 1000;
|
|
315
|
-
function normalizeCompressionRatio(value) {
|
|
316
|
-
return typeof value === "number" && Number.isFinite(value) && value > 0 && value < 1
|
|
317
|
-
? value
|
|
318
|
-
: CONTEXT_COMPACTION_DEFAULT_COMPRESSION_RATIO;
|
|
319
|
-
}
|
|
320
|
-
function normalizePreserveRecent(value) {
|
|
321
|
-
return typeof value === "number" && Number.isFinite(value) ? Math.max(0, Math.floor(value)) : CONTEXT_COMPACTION_DEFAULT_PRESERVE_RECENT;
|
|
322
|
-
}
|
|
323
|
-
function normalizeQuery(value, fallbackQuery) {
|
|
324
|
-
const query = value?.trim() || fallbackQuery.trim() || CONTEXT_COMPACTION_AUTO_QUERY;
|
|
325
|
-
return query.length > CONTEXT_COMPACTION_QUERY_MAX_CHARS
|
|
326
|
-
? `${query.slice(0, CONTEXT_COMPACTION_QUERY_MAX_CHARS)}\n[... ${query.length - CONTEXT_COMPACTION_QUERY_MAX_CHARS} more characters omitted from compaction query]`
|
|
327
|
-
: query;
|
|
328
|
-
}
|
|
329
|
-
export function autoDetectContextCompactionQuery(pathEntries) {
|
|
330
|
-
for (let index = pathEntries.length - 1; index >= 0; index--) {
|
|
331
|
-
const entry = pathEntries[index];
|
|
332
|
-
if (entry.type === "context_compaction")
|
|
333
|
-
continue;
|
|
334
|
-
const message = getContextEligibleMessageFromEntry(entry);
|
|
335
|
-
if (!message || message.role !== "user")
|
|
336
|
-
continue;
|
|
337
|
-
const text = messageText(message).trim();
|
|
338
|
-
if (text.length > 0)
|
|
339
|
-
return normalizeQuery(text, CONTEXT_COMPACTION_AUTO_QUERY);
|
|
340
|
-
}
|
|
341
|
-
return CONTEXT_COMPACTION_AUTO_QUERY;
|
|
342
|
-
}
|
|
343
|
-
export function normalizeContextCompactionParameters(input = {}, fallbackQuery = CONTEXT_COMPACTION_AUTO_QUERY) {
|
|
344
|
-
return {
|
|
345
|
-
compression_ratio: normalizeCompressionRatio(input.compression_ratio),
|
|
346
|
-
preserve_recent: normalizePreserveRecent(input.preserve_recent),
|
|
347
|
-
query: normalizeQuery(input.query, fallbackQuery),
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
function getTranscriptCompactionParameters(transcript) {
|
|
351
|
-
return normalizeContextCompactionParameters(transcript.parameters ?? transcript.settings, transcript.parameters?.query ?? transcript.settings.query ?? CONTEXT_COMPACTION_AUTO_QUERY);
|
|
352
|
-
}
|
|
353
|
-
function contextCompactionTargetReductionPercent(parameters) {
|
|
354
|
-
return roundPercent((1 - parameters.compression_ratio) * 100);
|
|
355
|
-
}
|
|
356
|
-
function contextCompactionTargetLabel(parameters) {
|
|
357
|
-
return `${contextCompactionTargetReductionPercent(parameters)}%`;
|
|
358
|
-
}
|
|
359
|
-
function isProtectedEntry(entry, message, recentEntryIds) {
|
|
360
|
-
if (recentEntryIds.has(entry.id))
|
|
361
|
-
return true;
|
|
362
|
-
if (message.role === "user")
|
|
363
|
-
return true;
|
|
364
|
-
if (message.role === "custom")
|
|
365
|
-
return true;
|
|
366
|
-
if (message.role === "branchSummary")
|
|
367
|
-
return true;
|
|
368
|
-
if (hasAssistantError(message) || hasToolResultError(message))
|
|
369
|
-
return true;
|
|
370
|
-
if (hasFailedBashExecution(message))
|
|
371
|
-
return true;
|
|
372
|
-
if (entry.type === "branch_summary")
|
|
373
|
-
return true;
|
|
374
|
-
return false;
|
|
375
|
-
}
|
|
376
|
-
export function prepareContextCompaction(pathEntries, settings, options = {}) {
|
|
377
|
-
if (pathEntries.length === 0)
|
|
378
|
-
return undefined;
|
|
379
|
-
const effectiveDeletionFilters = buildEffectiveContextDeletionFilters(pathEntries);
|
|
380
|
-
const filteredPathEntries = buildContextDeletionFilteredPath(pathEntries, effectiveDeletionFilters);
|
|
381
|
-
const parameters = normalizeContextCompactionParameters({ ...settings, ...options }, autoDetectContextCompactionQuery(filteredPathEntries));
|
|
382
|
-
const rawEntryById = new Map(pathEntries.map((entry) => [entry.id, entry]));
|
|
383
|
-
const messageEntryIds = filteredPathEntries
|
|
384
|
-
.filter((entry) => entry.type !== "context_compaction" && getContextEligibleMessageFromEntry(entry) !== undefined)
|
|
385
|
-
.map((entry) => entry.id);
|
|
386
|
-
const recentEntryIds = new Set(parameters.preserve_recent > 0 ? messageEntryIds.slice(-parameters.preserve_recent) : []);
|
|
387
|
-
const protectedEntryIds = new Set();
|
|
388
|
-
const entries = [];
|
|
389
|
-
for (const entry of filteredPathEntries) {
|
|
390
|
-
if (entry.type === "context_compaction")
|
|
391
|
-
continue;
|
|
392
|
-
const message = getContextEligibleMessageFromEntry(entry);
|
|
393
|
-
if (!message)
|
|
394
|
-
continue;
|
|
395
|
-
const rawEntry = rawEntryById.get(entry.id) ?? entry;
|
|
396
|
-
const protectedEntry = isProtectedEntry(entry, message, recentEntryIds);
|
|
397
|
-
if (protectedEntry)
|
|
398
|
-
protectedEntryIds.add(entry.id);
|
|
399
|
-
const rawMessage = getContextEligibleMessageFromEntry(rawEntry) ?? message;
|
|
400
|
-
const contentBlocks = contentBlocksForEntry(entry.id, rawMessage, protectedEntry, effectiveDeletionFilters.deletedContentBlocks.get(entry.id));
|
|
401
|
-
const toolCallIds = contentBlocks.map((block) => block.toolCallId).filter((id) => id !== undefined);
|
|
402
|
-
const text = contentBlocks.length > 0 ? contentBlocks.map((block) => block.text).join("\n") : messageText(message);
|
|
403
|
-
entries.push({
|
|
404
|
-
entryId: entry.id,
|
|
405
|
-
entryType: entry.type,
|
|
406
|
-
role: message.role,
|
|
407
|
-
text,
|
|
408
|
-
tokenEstimate: estimateTokens(message),
|
|
409
|
-
protected: protectedEntry,
|
|
410
|
-
contentBlocks,
|
|
411
|
-
message,
|
|
412
|
-
toolCallIds,
|
|
413
|
-
toolResultFor: getToolResultCallId(message),
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
if (entries.length < 2)
|
|
417
|
-
return undefined;
|
|
418
|
-
return {
|
|
419
|
-
branchEntries: pathEntries,
|
|
420
|
-
parameters,
|
|
421
|
-
transcript: {
|
|
422
|
-
entries,
|
|
423
|
-
protectedEntryIds: [...protectedEntryIds],
|
|
424
|
-
tokensBefore: entries.reduce((total, entry) => total + entry.tokenEstimate, 0),
|
|
425
|
-
settings,
|
|
426
|
-
parameters,
|
|
427
|
-
},
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
function targetKey(target) {
|
|
431
|
-
return target.kind === "entry" ? `entry:${target.entryId}` : `content_block:${target.entryId}:${target.blockIndex}`;
|
|
432
|
-
}
|
|
433
|
-
function rawTargetKey(target) {
|
|
434
|
-
return target.kind === "entry" ? `entry:${target.entryId}` : `content_block:${target.entryId}:${target.blockIndex}`;
|
|
435
|
-
}
|
|
436
|
-
function normalizeRawTarget(target) {
|
|
437
|
-
if (target.kind === "entry")
|
|
438
|
-
return { kind: "entry", entryId: target.entryId };
|
|
439
|
-
return { kind: "content_block", entryId: target.entryId, blockIndex: target.blockIndex };
|
|
440
|
-
}
|
|
441
|
-
function assertIdOnlyDeletionTarget(target) {
|
|
442
|
-
const allowedKeys = target.kind === "content_block" ? new Set(["kind", "entryId", "blockIndex"]) : new Set(["kind", "entryId"]);
|
|
443
|
-
for (const key of Object.keys(target)) {
|
|
444
|
-
if (!allowedKeys.has(key)) {
|
|
445
|
-
throw new Error(`Deletion target includes unsupported property ${JSON.stringify(key)}; context deletion targets are id-only and must contain only kind, entryId${target.kind === "content_block" ? ", and blockIndex" : ""}`);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
function rawDeletionFromTarget(target) {
|
|
450
|
-
if (target.kind === "entry")
|
|
451
|
-
return { kind: "entry", entryId: target.entryId };
|
|
452
|
-
return { kind: "content_block", entryId: target.entryId, blockIndex: target.blockIndex };
|
|
453
|
-
}
|
|
454
|
-
function deletionRequestFromTargets(targets) {
|
|
455
|
-
return { deletions: targets.map(rawDeletionFromTarget) };
|
|
456
|
-
}
|
|
457
|
-
function getDeletedEntryIds(targets) {
|
|
458
|
-
return new Set(targets.filter((target) => target.kind === "entry").map((target) => target.entryId));
|
|
459
|
-
}
|
|
460
|
-
function getDeletedContentBlocks(targets) {
|
|
461
|
-
const blocksByEntry = new Map();
|
|
462
|
-
for (const target of targets) {
|
|
463
|
-
if (target.kind !== "content_block")
|
|
464
|
-
continue;
|
|
465
|
-
const blocks = blocksByEntry.get(target.entryId) ?? new Set();
|
|
466
|
-
blocks.add(target.blockIndex);
|
|
467
|
-
blocksByEntry.set(target.entryId, blocks);
|
|
468
|
-
}
|
|
469
|
-
return blocksByEntry;
|
|
470
|
-
}
|
|
471
|
-
function recentContextEntryBoundary(transcript) {
|
|
472
|
-
const { preserve_recent } = getTranscriptCompactionParameters(transcript);
|
|
473
|
-
return preserve_recent > 0 ? Math.max(0, transcript.entries.length - preserve_recent) : transcript.entries.length;
|
|
474
|
-
}
|
|
475
|
-
function getRecentContextEntryIds(transcript) {
|
|
476
|
-
const { preserve_recent } = getTranscriptCompactionParameters(transcript);
|
|
477
|
-
if (preserve_recent <= 0)
|
|
478
|
-
return new Set();
|
|
479
|
-
return new Set(transcript.entries.slice(recentContextEntryBoundary(transcript)).map((entry) => entry.entryId));
|
|
480
|
-
}
|
|
481
|
-
function isRecentContextEntry(entry, transcript) {
|
|
482
|
-
const { preserve_recent } = getTranscriptCompactionParameters(transcript);
|
|
483
|
-
if (preserve_recent <= 0)
|
|
484
|
-
return false;
|
|
485
|
-
const entryIndex = transcript.entries.findIndex((candidate) => candidate.entryId === entry.entryId);
|
|
486
|
-
return entryIndex >= 0 && entryIndex >= recentContextEntryBoundary(transcript);
|
|
487
|
-
}
|
|
488
|
-
function formatRecentContextDeletionError(transcript, target) {
|
|
489
|
-
const { preserve_recent } = getTranscriptCompactionParameters(transcript);
|
|
490
|
-
const recentWindow = `last ${preserve_recent} context ${preserve_recent === 1 ? "entry" : "entries"}`;
|
|
491
|
-
if (target.kind === "entry") {
|
|
492
|
-
return `Cannot delete recent context entry ${target.entryId} because the ${recentWindow} must remain available for active continuity. Choose an older entry.`;
|
|
493
|
-
}
|
|
494
|
-
return `Cannot delete content block ${target.entryId}:${target.blockIndex} because entry ${target.entryId} is one of the ${recentWindow} that must remain available for active continuity. Choose an older entry or content block.`;
|
|
495
|
-
}
|
|
496
|
-
function deletionGuidance() {
|
|
497
|
-
return "Choose another deletion candidate.";
|
|
498
|
-
}
|
|
499
|
-
function findTranscriptEntry(transcript, entryId) {
|
|
500
|
-
return transcript.entries.find((entry) => entry.entryId === entryId);
|
|
501
|
-
}
|
|
502
|
-
function findTranscriptContentBlock(transcript, target) {
|
|
503
|
-
if (target.kind !== "content_block")
|
|
504
|
-
return undefined;
|
|
505
|
-
return findTranscriptEntry(transcript, target.entryId)?.contentBlocks.find((block) => block.blockIndex === target.blockIndex);
|
|
506
|
-
}
|
|
507
|
-
function firstToolCallBlockTarget(entry, callId) {
|
|
508
|
-
const blockIndex = toolCallBlockIndexes(entry, callId)[0];
|
|
509
|
-
return blockIndex === undefined ? undefined : { kind: "content_block", entryId: entry.entryId, blockIndex };
|
|
510
|
-
}
|
|
511
|
-
function formatProtectedDeletionError(transcript, target) {
|
|
512
|
-
const entry = findTranscriptEntry(transcript, target.entryId);
|
|
513
|
-
if (target.kind === "entry") {
|
|
514
|
-
const toolResultSuffix = entry?.toolResultFor ? ` for tool call ${entry.toolResultFor}` : "";
|
|
515
|
-
const toolCallSuffix = entry && entry.toolCallIds.length > 0 ? ` containing tool call ${entry.toolCallIds.join(", ")}` : "";
|
|
516
|
-
return `Deletion target ${target.entryId}${toolResultSuffix}${toolCallSuffix} is protected. ${deletionGuidance()}`;
|
|
517
|
-
}
|
|
518
|
-
const block = findTranscriptContentBlock(transcript, target);
|
|
519
|
-
const toolBlockSuffix = block?.toolCallId ? ` It is a protected tool block for tool call ${block.toolCallId}.` : "";
|
|
520
|
-
return `Content block ${target.entryId}:${target.blockIndex} is protected.${toolBlockSuffix} ${deletionGuidance()}`;
|
|
521
|
-
}
|
|
522
|
-
function formatProtectedToolDependencyError(transcript, blockedTarget, context) {
|
|
523
|
-
const protectedMessage = formatProtectedDeletionError(transcript, blockedTarget);
|
|
524
|
-
return `${context} ${protectedMessage}`;
|
|
525
|
-
}
|
|
526
|
-
function isProtectedContextDeletionErrorMessage(message) {
|
|
527
|
-
return (/\bprotected\b/i.test(message) ||
|
|
528
|
-
/Cannot delete (?:recent context entry|content block .* because entry .* is one of the last)/u.test(message) ||
|
|
529
|
-
/latest assistant message|thinking\/redacted_thinking block in (?:the latest|a retained) assistant message/u.test(message));
|
|
530
|
-
}
|
|
531
|
-
function assertNoRecentContextDeletionTargets(transcript, targets) {
|
|
532
|
-
const recentEntryIds = getRecentContextEntryIds(transcript);
|
|
533
|
-
for (const target of targets) {
|
|
534
|
-
if (recentEntryIds.has(target.entryId)) {
|
|
535
|
-
throw new Error(formatRecentContextDeletionError(transcript, target));
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
function latestAssistantEntry(transcript, deletedEntryIds = new Set()) {
|
|
540
|
-
for (let index = transcript.entries.length - 1; index >= 0; index--) {
|
|
541
|
-
const entry = transcript.entries[index];
|
|
542
|
-
if (entry.role === "assistant" && !deletedEntryIds.has(entry.entryId))
|
|
543
|
-
return entry;
|
|
544
|
-
}
|
|
545
|
-
return undefined;
|
|
546
|
-
}
|
|
547
|
-
function findAssistantThinkingContentBlockDeletionViolation(transcript, targets) {
|
|
548
|
-
const deletedEntryIds = getDeletedEntryIds(targets);
|
|
549
|
-
for (const target of targets) {
|
|
550
|
-
if (target.kind !== "content_block")
|
|
551
|
-
continue;
|
|
552
|
-
if (deletedEntryIds.has(target.entryId))
|
|
553
|
-
continue;
|
|
554
|
-
const entry = findTranscriptEntry(transcript, target.entryId);
|
|
555
|
-
if (entry && assistantEntryHasThinkingContentBlock(entry))
|
|
556
|
-
return target;
|
|
557
|
-
}
|
|
558
|
-
return undefined;
|
|
559
|
-
}
|
|
560
|
-
function findLatestAssistantThinkingDeletionViolation(transcript, targets) {
|
|
561
|
-
const deletedEntryIds = getDeletedEntryIds(targets);
|
|
562
|
-
const latestRetainedAssistant = latestAssistantEntry(transcript, deletedEntryIds);
|
|
563
|
-
for (const target of targets) {
|
|
564
|
-
if (target.kind === "entry") {
|
|
565
|
-
const entry = findTranscriptEntry(transcript, target.entryId);
|
|
566
|
-
if (!entry || !assistantEntryHasThinkingContentBlock(entry))
|
|
567
|
-
continue;
|
|
568
|
-
const deletedEntryIdsIfTargetWereKept = new Set(deletedEntryIds);
|
|
569
|
-
deletedEntryIdsIfTargetWereKept.delete(target.entryId);
|
|
570
|
-
if (latestAssistantEntry(transcript, deletedEntryIdsIfTargetWereKept)?.entryId === target.entryId) {
|
|
571
|
-
return target;
|
|
572
|
-
}
|
|
573
|
-
continue;
|
|
574
|
-
}
|
|
575
|
-
if (latestRetainedAssistant?.entryId === target.entryId &&
|
|
576
|
-
assistantEntryHasThinkingContentBlock(latestRetainedAssistant)) {
|
|
577
|
-
return target;
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
return undefined;
|
|
581
|
-
}
|
|
582
|
-
function assertNoAssistantThinkingContentBlockDeletionTargets(transcript, targets) {
|
|
583
|
-
const violation = findAssistantThinkingContentBlockDeletionViolation(transcript, targets);
|
|
584
|
-
if (!violation)
|
|
585
|
-
return;
|
|
586
|
-
throw new Error(`Cannot delete content block ${violation.entryId}:${violation.blockIndex} because a thinking/redacted_thinking block in a retained assistant message must remain unmodified; retained assistant messages containing thinking/redacted_thinking content blocks are all-or-nothing`);
|
|
587
|
-
}
|
|
588
|
-
function assertNoLatestAssistantThinkingDeletionTargets(transcript, targets) {
|
|
589
|
-
const violation = findLatestAssistantThinkingDeletionViolation(transcript, targets);
|
|
590
|
-
if (!violation)
|
|
591
|
-
return;
|
|
592
|
-
if (violation.kind === "entry") {
|
|
593
|
-
throw new Error(`Cannot delete assistant entry ${violation.entryId} because it is the latest assistant message retained after other deletions and contains thinking/redacted_thinking content blocks`);
|
|
594
|
-
}
|
|
595
|
-
throw new Error(`Cannot delete content block ${violation.entryId}:${violation.blockIndex} because a thinking/redacted_thinking block in the latest assistant message must remain unmodified; the latest retained assistant message contains thinking/redacted_thinking content blocks`);
|
|
596
|
-
}
|
|
597
|
-
function isToolCallBlockDeleted(entry, callId, deletedEntryIds, deletedContentBlocks) {
|
|
598
|
-
if (deletedEntryIds.has(entry.entryId))
|
|
599
|
-
return true;
|
|
600
|
-
const deletedBlocks = deletedContentBlocks.get(entry.entryId);
|
|
601
|
-
if (!deletedBlocks)
|
|
602
|
-
return false;
|
|
603
|
-
return entry.contentBlocks.some((block) => block.toolCallId === callId && deletedBlocks.has(block.blockIndex));
|
|
604
|
-
}
|
|
605
|
-
function toolCallBlockIndexes(entry, callId) {
|
|
606
|
-
return entry.contentBlocks
|
|
607
|
-
.filter((block) => block.toolCallId === callId)
|
|
608
|
-
.map((block) => block.blockIndex);
|
|
609
|
-
}
|
|
610
|
-
function addTarget(targets, target) {
|
|
611
|
-
if (targets.some((existing) => targetKey(existing) === targetKey(target)))
|
|
612
|
-
return false;
|
|
613
|
-
targets.push(target);
|
|
614
|
-
return true;
|
|
615
|
-
}
|
|
616
|
-
function deleteEntryTarget(targets, entryId) {
|
|
617
|
-
let changed = false;
|
|
618
|
-
for (let index = targets.length - 1; index >= 0; index--) {
|
|
619
|
-
const target = targets[index];
|
|
620
|
-
if (target.kind === "content_block" && target.entryId === entryId) {
|
|
621
|
-
targets.splice(index, 1);
|
|
622
|
-
changed = true;
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
return addTarget(targets, { kind: "entry", entryId }) || changed;
|
|
626
|
-
}
|
|
627
|
-
function mergeContextDeletionTargets(baseTargets, additionalTargets) {
|
|
628
|
-
const targets = [...baseTargets];
|
|
629
|
-
for (const target of additionalTargets) {
|
|
630
|
-
if (target.kind === "entry") {
|
|
631
|
-
deleteEntryTarget(targets, target.entryId);
|
|
632
|
-
continue;
|
|
633
|
-
}
|
|
634
|
-
if (!getDeletedEntryIds(targets).has(target.entryId)) {
|
|
635
|
-
addTarget(targets, target);
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
return targets;
|
|
639
|
-
}
|
|
640
|
-
function canonicalizeEntryTargets(transcript, targets, entry) {
|
|
641
|
-
if (!canDeleteTarget(transcript, { kind: "entry", entryId: entry.entryId }))
|
|
642
|
-
return false;
|
|
643
|
-
if (getDeletedEntryIds(targets).has(entry.entryId))
|
|
644
|
-
return false;
|
|
645
|
-
const deletedBlocks = getDeletedContentBlocks(targets).get(entry.entryId);
|
|
646
|
-
if (!deletedBlocks || !entry.contentBlocks.every((block) => deletedBlocks.has(block.blockIndex)))
|
|
647
|
-
return false;
|
|
648
|
-
// Only repair/promote when dependency reconciliation reaches this entry. Non-tool entries that
|
|
649
|
-
// request every block individually stay invalid so the assistant must choose explicit entry deletion.
|
|
650
|
-
return deleteEntryTarget(targets, entry.entryId);
|
|
651
|
-
}
|
|
652
|
-
function addToolCallDeletion(transcript, targets, entry, callId) {
|
|
653
|
-
if (assistantEntryHasThinkingContentBlock(entry)) {
|
|
654
|
-
if (!canDeleteTarget(transcript, { kind: "entry", entryId: entry.entryId }))
|
|
655
|
-
return false;
|
|
656
|
-
return deleteEntryTarget(targets, entry.entryId);
|
|
657
|
-
}
|
|
658
|
-
let changed = false;
|
|
659
|
-
for (const blockIndex of toolCallBlockIndexes(entry, callId)) {
|
|
660
|
-
const target = { kind: "content_block", entryId: entry.entryId, blockIndex };
|
|
661
|
-
if (!canDeleteTarget(transcript, target))
|
|
662
|
-
continue;
|
|
663
|
-
if (!getDeletedEntryIds(targets).has(entry.entryId)) {
|
|
664
|
-
changed = addTarget(targets, target) || changed;
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
return canonicalizeEntryTargets(transcript, targets, entry) || changed;
|
|
668
|
-
}
|
|
669
|
-
let warnedReconciliationNonConvergence = false;
|
|
670
|
-
function reconcileToolDependencies(transcript, initialTargets) {
|
|
671
|
-
const targets = [...initialTargets];
|
|
672
|
-
const callEntries = new Map();
|
|
673
|
-
const entriesWithToolCalls = new Set();
|
|
674
|
-
const resultEntries = new Map();
|
|
675
|
-
for (const entry of transcript.entries) {
|
|
676
|
-
for (const callId of entry.toolCallIds) {
|
|
677
|
-
callEntries.set(callId, entry);
|
|
678
|
-
entriesWithToolCalls.add(entry);
|
|
679
|
-
}
|
|
680
|
-
if (entry.toolResultFor) {
|
|
681
|
-
const results = resultEntries.get(entry.toolResultFor) ?? [];
|
|
682
|
-
results.push(entry);
|
|
683
|
-
resultEntries.set(entry.toolResultFor, results);
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
// Bounded fixpoint repair: each pass can add/remove paired call/result targets. In practice this
|
|
687
|
-
// converges within one or two passes; the cap protects against accidental oscillation.
|
|
688
|
-
let changed = true;
|
|
689
|
-
let remainingPasses = Math.max(1, transcript.entries.length * 2);
|
|
690
|
-
while (changed && remainingPasses > 0) {
|
|
691
|
-
changed = false;
|
|
692
|
-
remainingPasses -= 1;
|
|
693
|
-
let deletedEntryIds = getDeletedEntryIds(targets);
|
|
694
|
-
let deletedContentBlocks = getDeletedContentBlocks(targets);
|
|
695
|
-
const recordChange = (nextChanged) => {
|
|
696
|
-
if (!nextChanged)
|
|
697
|
-
return;
|
|
698
|
-
changed = true;
|
|
699
|
-
deletedEntryIds = getDeletedEntryIds(targets);
|
|
700
|
-
deletedContentBlocks = getDeletedContentBlocks(targets);
|
|
701
|
-
};
|
|
702
|
-
for (const [callId, callEntry] of callEntries) {
|
|
703
|
-
const callDeleted = isToolCallBlockDeleted(callEntry, callId, deletedEntryIds, deletedContentBlocks);
|
|
704
|
-
const results = resultEntries.get(callId) ?? [];
|
|
705
|
-
if (callDeleted) {
|
|
706
|
-
const retainedProtectedResult = results.find((entry) => !deletedEntryIds.has(entry.entryId) &&
|
|
707
|
-
!canDeleteTarget(transcript, { kind: "entry", entryId: entry.entryId }));
|
|
708
|
-
if (retainedProtectedResult) {
|
|
709
|
-
const retainedResultTarget = { kind: "entry", entryId: retainedProtectedResult.entryId };
|
|
710
|
-
if (isRecentTarget(transcript, retainedResultTarget)) {
|
|
711
|
-
throw new Error(formatRecentContextDeletionError(transcript, retainedResultTarget));
|
|
712
|
-
}
|
|
713
|
-
throw new Error(formatProtectedToolDependencyError(transcript, retainedResultTarget, `Cannot delete tool call ${callId} because its paired tool result entry ${retainedProtectedResult.entryId} is protected.`));
|
|
714
|
-
}
|
|
715
|
-
else {
|
|
716
|
-
for (const result of results) {
|
|
717
|
-
recordChange(deleteEntryTarget(targets, result.entryId));
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
if (isToolCallBlockDeleted(callEntry, callId, deletedEntryIds, deletedContentBlocks))
|
|
722
|
-
continue;
|
|
723
|
-
for (const result of results) {
|
|
724
|
-
if (!deletedEntryIds.has(result.entryId))
|
|
725
|
-
continue;
|
|
726
|
-
recordChange(deleteEntryTarget(targets, result.entryId));
|
|
727
|
-
const callEntryTarget = { kind: "entry", entryId: callEntry.entryId };
|
|
728
|
-
const callBlockTarget = assistantEntryHasThinkingContentBlock(callEntry)
|
|
729
|
-
? callEntryTarget
|
|
730
|
-
: firstToolCallBlockTarget(callEntry, callId) ?? callEntryTarget;
|
|
731
|
-
if (!canDeleteTarget(transcript, callBlockTarget)) {
|
|
732
|
-
if (isRecentTarget(transcript, callBlockTarget)) {
|
|
733
|
-
throw new Error(formatRecentContextDeletionError(transcript, callBlockTarget));
|
|
734
|
-
}
|
|
735
|
-
throw new Error(formatProtectedToolDependencyError(transcript, callBlockTarget, `Cannot delete tool result entry ${result.entryId} because that would require deleting protected tool block for tool call ${callId}.`));
|
|
736
|
-
}
|
|
737
|
-
recordChange(addToolCallDeletion(transcript, targets, callEntry, callId));
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
for (const entry of entriesWithToolCalls) {
|
|
741
|
-
recordChange(canonicalizeEntryTargets(transcript, targets, entry));
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
if (changed && !warnedReconciliationNonConvergence) {
|
|
745
|
-
warnedReconciliationNonConvergence = true;
|
|
746
|
-
console.warn(`Context compaction tool dependency reconciliation did not converge within the bounded pass limit; validation will continue with the last reconciled target set. entries=${transcript.entries.length} callEntries=${callEntries.size} targets=${targets.length}`);
|
|
747
|
-
}
|
|
748
|
-
return targets;
|
|
749
|
-
}
|
|
750
|
-
function validateToolDependencies(transcript, targets) {
|
|
751
|
-
const deletedEntryIds = getDeletedEntryIds(targets);
|
|
752
|
-
const deletedContentBlocks = getDeletedContentBlocks(targets);
|
|
753
|
-
const callEntries = new Map();
|
|
754
|
-
const resultEntries = new Map();
|
|
755
|
-
for (const entry of transcript.entries) {
|
|
756
|
-
for (const callId of entry.toolCallIds) {
|
|
757
|
-
callEntries.set(callId, entry);
|
|
758
|
-
}
|
|
759
|
-
if (entry.toolResultFor) {
|
|
760
|
-
const results = resultEntries.get(entry.toolResultFor) ?? [];
|
|
761
|
-
results.push(entry);
|
|
762
|
-
resultEntries.set(entry.toolResultFor, results);
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
for (const [callId, callEntry] of callEntries) {
|
|
766
|
-
const callDeleted = isToolCallBlockDeleted(callEntry, callId, deletedEntryIds, deletedContentBlocks);
|
|
767
|
-
const results = resultEntries.get(callId) ?? [];
|
|
768
|
-
if (callDeleted) {
|
|
769
|
-
const danglingResult = results.find((entry) => !deletedEntryIds.has(entry.entryId));
|
|
770
|
-
if (danglingResult) {
|
|
771
|
-
throw new Error(`Deleting tool call ${callId} would leave tool result entry ${danglingResult.entryId} orphaned`);
|
|
772
|
-
}
|
|
773
|
-
continue;
|
|
774
|
-
}
|
|
775
|
-
const deletedResult = results.find((entry) => deletedEntryIds.has(entry.entryId));
|
|
776
|
-
if (deletedResult) {
|
|
777
|
-
throw new Error(`Deleting tool result entry ${deletedResult.entryId} would leave tool call ${callId} dangling`);
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
function computeContextCompactionStats(transcript, targets) {
|
|
782
|
-
const entryById = new Map(transcript.entries.map((entry) => [entry.entryId, entry]));
|
|
783
|
-
const deletedEntryIds = getDeletedEntryIds(targets);
|
|
784
|
-
let deletedTokens = 0;
|
|
785
|
-
let objectsDeleted = 0;
|
|
786
|
-
for (const entryId of deletedEntryIds) {
|
|
787
|
-
const entry = entryById.get(entryId);
|
|
788
|
-
if (!entry)
|
|
789
|
-
continue;
|
|
790
|
-
deletedTokens += entry.tokenEstimate;
|
|
791
|
-
objectsDeleted += 1 + entry.contentBlocks.length;
|
|
792
|
-
}
|
|
793
|
-
for (const target of targets) {
|
|
794
|
-
if (target.kind !== "content_block" || deletedEntryIds.has(target.entryId))
|
|
795
|
-
continue;
|
|
796
|
-
const entry = entryById.get(target.entryId);
|
|
797
|
-
if (!entry)
|
|
798
|
-
continue;
|
|
799
|
-
const block = entry.contentBlocks.find((item) => item.blockIndex === target.blockIndex);
|
|
800
|
-
if (!block)
|
|
801
|
-
continue;
|
|
802
|
-
deletedTokens += block.tokenEstimate;
|
|
803
|
-
objectsDeleted += 1;
|
|
804
|
-
}
|
|
805
|
-
const objectsBefore = transcript.entries.length + transcript.entries.reduce((total, entry) => total + entry.contentBlocks.length, 0);
|
|
806
|
-
const tokensBefore = transcript.tokensBefore;
|
|
807
|
-
const tokensAfter = Math.max(0, tokensBefore - deletedTokens);
|
|
808
|
-
const percentReduction = tokensBefore > 0 ? Math.round(((tokensBefore - tokensAfter) / tokensBefore) * 1000) / 10 : 0;
|
|
809
|
-
return {
|
|
810
|
-
objectsBefore,
|
|
811
|
-
objectsAfter: Math.max(0, objectsBefore - objectsDeleted),
|
|
812
|
-
objectsDeleted,
|
|
813
|
-
tokensBefore,
|
|
814
|
-
tokensAfter,
|
|
815
|
-
percentReduction,
|
|
816
|
-
};
|
|
817
|
-
}
|
|
818
|
-
/**
|
|
819
|
-
* An entry "bears task context" when it carries the user's intent for the session: a real `user`
|
|
820
|
-
* message, an extension-injected `custom` message, or a branch summary (`branchSummary` role /
|
|
821
|
-
* `branch_summary` entry type) that recaps an earlier branch's task.
|
|
822
|
-
*
|
|
823
|
-
* Verbatim compaction must always leave at least one task-bearing entry in context.
|
|
824
|
-
*/
|
|
825
|
-
function isTaskBearingEntry(entry) {
|
|
826
|
-
return (entry.role === "user" ||
|
|
827
|
-
entry.role === "custom" ||
|
|
828
|
-
entry.role === "branchSummary" ||
|
|
829
|
-
entry.entryType === "branch_summary");
|
|
830
|
-
}
|
|
831
|
-
function isRecentTarget(transcript, target) {
|
|
832
|
-
const entry = transcript.entries.find((candidate) => candidate.entryId === target.entryId);
|
|
833
|
-
return entry !== undefined && isRecentContextEntry(entry, transcript);
|
|
834
|
-
}
|
|
835
|
-
function canDeleteTarget(transcript, target) {
|
|
836
|
-
const entry = transcript.entries.find((candidate) => candidate.entryId === target.entryId);
|
|
837
|
-
if (!entry)
|
|
838
|
-
return false;
|
|
839
|
-
if (isRecentTarget(transcript, target))
|
|
840
|
-
return false;
|
|
841
|
-
if (entry.protected)
|
|
842
|
-
return false;
|
|
843
|
-
if (target.kind === "entry")
|
|
844
|
-
return true;
|
|
845
|
-
const block = entry.contentBlocks.find((candidate) => candidate.blockIndex === target.blockIndex);
|
|
846
|
-
if (!block)
|
|
847
|
-
return false;
|
|
848
|
-
return !block.protected;
|
|
849
|
-
}
|
|
850
|
-
export function validateContextDeletionRequest(request, transcript) {
|
|
851
|
-
if (!request || typeof request !== "object" || !Array.isArray(request.deletions)) {
|
|
852
|
-
throw new Error("Context deletion request must be an object with a deletions array");
|
|
853
|
-
}
|
|
854
|
-
const entryById = new Map(transcript.entries.map((entry) => [entry.entryId, entry]));
|
|
855
|
-
const recentEntryIds = getRecentContextEntryIds(transcript);
|
|
856
|
-
const seen = new Set();
|
|
857
|
-
const deletedTargets = [];
|
|
858
|
-
for (const deletion of request.deletions) {
|
|
859
|
-
if (!deletion || typeof deletion !== "object") {
|
|
860
|
-
throw new Error("Deletion target must be an object");
|
|
861
|
-
}
|
|
862
|
-
if (deletion.kind !== "entry" && deletion.kind !== "content_block") {
|
|
863
|
-
throw new Error(`Unsupported deletion target kind: ${String(deletion.kind)}`);
|
|
864
|
-
}
|
|
865
|
-
assertIdOnlyDeletionTarget(deletion);
|
|
866
|
-
if (typeof deletion.entryId !== "string" || deletion.entryId.length === 0) {
|
|
867
|
-
throw new Error("Deletion target entryId must be a non-empty string");
|
|
868
|
-
}
|
|
869
|
-
const entry = entryById.get(deletion.entryId);
|
|
870
|
-
if (!entry) {
|
|
871
|
-
throw new Error(`Unknown deletion target entryId: ${deletion.entryId}`);
|
|
872
|
-
}
|
|
873
|
-
const normalized = normalizeRawTarget(deletion);
|
|
874
|
-
if (deletion.kind === "entry") {
|
|
875
|
-
if (recentEntryIds.has(deletion.entryId)) {
|
|
876
|
-
throw new Error(formatRecentContextDeletionError(transcript, normalized));
|
|
877
|
-
}
|
|
878
|
-
if (entry.protected) {
|
|
879
|
-
throw new Error(formatProtectedDeletionError(transcript, normalized));
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
if (deletion.kind === "content_block") {
|
|
883
|
-
if (typeof deletion.blockIndex !== "number" || !Number.isInteger(deletion.blockIndex) || deletion.blockIndex < 0) {
|
|
884
|
-
throw new Error(`Invalid content block index for entry ${deletion.entryId}`);
|
|
885
|
-
}
|
|
886
|
-
if (recentEntryIds.has(deletion.entryId)) {
|
|
887
|
-
throw new Error(formatRecentContextDeletionError(transcript, normalized));
|
|
888
|
-
}
|
|
889
|
-
if (entry.protected) {
|
|
890
|
-
throw new Error(formatProtectedDeletionError(transcript, normalized));
|
|
891
|
-
}
|
|
892
|
-
const block = entry.contentBlocks.find((item) => item.blockIndex === deletion.blockIndex);
|
|
893
|
-
if (!block) {
|
|
894
|
-
throw new Error(`Unknown content block ${deletion.blockIndex} for entry ${deletion.entryId}`);
|
|
895
|
-
}
|
|
896
|
-
if (block.protected) {
|
|
897
|
-
throw new Error(formatProtectedDeletionError(transcript, normalized));
|
|
898
|
-
}
|
|
899
|
-
if (entry.contentBlocks.length <= 1) {
|
|
900
|
-
throw new Error(`Deleting the only content block of ${deletion.entryId} must be an entry deletion`);
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
const key = rawTargetKey(deletion);
|
|
904
|
-
if (seen.has(key)) {
|
|
905
|
-
throw new Error(`Duplicate deletion target: ${key}`);
|
|
906
|
-
}
|
|
907
|
-
seen.add(key);
|
|
908
|
-
deletedTargets.push(normalized);
|
|
909
|
-
}
|
|
910
|
-
const reconciledTargets = reconcileToolDependencies(transcript, deletedTargets);
|
|
911
|
-
// Tool reconciliation can add targets after the per-request checks above, so
|
|
912
|
-
// these post-reconcile assertions remain authoritative.
|
|
913
|
-
assertNoRecentContextDeletionTargets(transcript, reconciledTargets);
|
|
914
|
-
assertNoAssistantThinkingContentBlockDeletionTargets(transcript, reconciledTargets);
|
|
915
|
-
assertNoLatestAssistantThinkingDeletionTargets(transcript, reconciledTargets);
|
|
916
|
-
const reconciledDeletedEntryIds = getDeletedEntryIds(reconciledTargets);
|
|
917
|
-
for (const target of reconciledTargets) {
|
|
918
|
-
if (target.kind === "content_block" && reconciledDeletedEntryIds.has(target.entryId)) {
|
|
919
|
-
throw new Error(`Deletion target ${targetKey(target)} overlaps with entry deletion`);
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
const deletedContentBlocks = getDeletedContentBlocks(reconciledTargets);
|
|
923
|
-
for (const [entryId, blockIndexes] of deletedContentBlocks) {
|
|
924
|
-
const entry = entryById.get(entryId);
|
|
925
|
-
if (entry?.contentBlocks.every((block) => blockIndexes.has(block.blockIndex))) {
|
|
926
|
-
throw new Error(`Content-block deletions for ${entryId} would remove every content block`);
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
validateToolDependencies(transcript, reconciledTargets);
|
|
930
|
-
const remainingEntries = transcript.entries.filter((entry) => !reconciledDeletedEntryIds.has(entry.entryId));
|
|
931
|
-
if (remainingEntries.length === 0) {
|
|
932
|
-
throw new Error("Deletion request would remove all context entries");
|
|
933
|
-
}
|
|
934
|
-
const hasTaskBearingContext = remainingEntries.some(isTaskBearingEntry);
|
|
935
|
-
if (!hasTaskBearingContext) {
|
|
936
|
-
throw new Error("Deletion request would leave no user task in context");
|
|
937
|
-
}
|
|
938
|
-
return {
|
|
939
|
-
deletedTargets: reconciledTargets,
|
|
940
|
-
protectedEntryIds: [...transcript.protectedEntryIds],
|
|
941
|
-
stats: computeContextCompactionStats(transcript, reconciledTargets),
|
|
942
|
-
};
|
|
943
|
-
}
|
|
944
|
-
function contextDeletionRequestFromObject(value, source) {
|
|
945
|
-
if (!value || typeof value !== "object" || !Array.isArray(value.deletions)) {
|
|
946
|
-
throw new Error(`${source} must contain a deletions array`);
|
|
947
|
-
}
|
|
948
|
-
return value;
|
|
949
|
-
}
|
|
950
|
-
function escapeRegExpLiteral(text) {
|
|
951
|
-
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
952
|
-
}
|
|
953
|
-
function formatErrorMessage(error) {
|
|
954
|
-
return error instanceof Error ? error.message : String(error);
|
|
955
|
-
}
|
|
956
|
-
function createContextDeletionToolResult(text, details) {
|
|
957
|
-
return { content: [{ type: "text", text }], details, terminate: false };
|
|
958
|
-
}
|
|
959
|
-
function roundPercent(value) {
|
|
960
|
-
return Math.round(value * 10) / 10;
|
|
961
|
-
}
|
|
962
|
-
function percentOf(part, total) {
|
|
963
|
-
return total > 0 ? roundPercent((part / total) * 100) : 0;
|
|
964
|
-
}
|
|
965
|
-
function finitePositiveNumber(value) {
|
|
966
|
-
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined;
|
|
967
|
-
}
|
|
968
|
-
function createContextCompactionBudgetDetails(stats, callCount, contextWindow, parameters) {
|
|
969
|
-
const targetTokensAfter = Math.max(0, Math.floor(stats.tokensBefore * parameters.compression_ratio));
|
|
970
|
-
const targetReductionPercent = contextCompactionTargetReductionPercent(parameters);
|
|
971
|
-
const details = {
|
|
972
|
-
...(contextWindow !== undefined ? { contextWindow } : {}),
|
|
973
|
-
compression_ratio: parameters.compression_ratio,
|
|
974
|
-
tokensBefore: stats.tokensBefore,
|
|
975
|
-
currentTokensAfter: stats.tokensAfter,
|
|
976
|
-
deletedTokens: Math.max(0, stats.tokensBefore - stats.tokensAfter),
|
|
977
|
-
currentReductionPercent: stats.percentReduction,
|
|
978
|
-
targetReductionPercent,
|
|
979
|
-
targetTokensAfter,
|
|
980
|
-
tokensToDeleteForTarget: Math.max(0, stats.tokensAfter - targetTokensAfter),
|
|
981
|
-
...(contextWindow !== undefined
|
|
982
|
-
? {
|
|
983
|
-
contextWindowBeforePercent: percentOf(stats.tokensBefore, contextWindow),
|
|
984
|
-
contextWindowAfterPercent: percentOf(stats.tokensAfter, contextWindow),
|
|
985
|
-
}
|
|
986
|
-
: {}),
|
|
987
|
-
callCount,
|
|
988
|
-
};
|
|
989
|
-
return details;
|
|
990
|
-
}
|
|
991
|
-
function contextCompactionTargetMet(result, parameters) {
|
|
992
|
-
return (result !== undefined &&
|
|
993
|
-
result.deletedTargets.length > 0 &&
|
|
994
|
-
result.stats.percentReduction >= contextCompactionTargetReductionPercent(parameters));
|
|
995
|
-
}
|
|
996
|
-
function contextCompactionProgressKey(result) {
|
|
997
|
-
if (!result)
|
|
998
|
-
return "none:0";
|
|
999
|
-
return `${result.deletedTargets.length}:${result.stats.percentReduction}:${result.stats.tokensAfter}`;
|
|
1000
|
-
}
|
|
1001
|
-
function contextCompactionProgressPercent(result) {
|
|
1002
|
-
return result?.stats.percentReduction ?? 0;
|
|
1003
|
-
}
|
|
1004
|
-
function createContextCompactionTargetNudgeMessage(result, parameters) {
|
|
1005
|
-
const currentReductionPercent = contextCompactionProgressPercent(result);
|
|
1006
|
-
const targetLabel = contextCompactionTargetLabel(parameters);
|
|
1007
|
-
const tokensToDelete = result
|
|
1008
|
-
? createContextCompactionBudgetDetails(result.stats, 0, undefined, parameters).tokensToDeleteForTarget
|
|
1009
|
-
: undefined;
|
|
1010
|
-
const remainingText = tokensToDelete !== undefined ? ` Delete about ${tokensToDelete} more token(s) if safe candidates exist.` : "";
|
|
1011
|
-
return {
|
|
1012
|
-
role: "user",
|
|
1013
|
-
content: [
|
|
1014
|
-
{
|
|
1015
|
-
type: "text",
|
|
1016
|
-
text: `The strict ${targetLabel} context-reduction requirement is not met yet; current validated reduction is ${currentReductionPercent}%.${remainingText} Continue removing low-value message entries or message content blocks using ${CONTEXT_DELETE_TOOL_NAME} or ${CONTEXT_GREP_DELETE_TOOL_NAME}. Use the focus query ${JSON.stringify(parameters.query)} to preserve relevant context. Call ${CONTEXT_COMPACTION_BUDGET_TOOL_NAME} to verify progress, and do not provide a final answer until the validated reduction is at least ${targetLabel}.`,
|
|
1017
|
-
},
|
|
1018
|
-
],
|
|
1019
|
-
timestamp: Date.now(),
|
|
1020
|
-
};
|
|
1021
|
-
}
|
|
1022
|
-
function assertSafeRegexPattern(pattern) {
|
|
1023
|
-
if (pattern.length > CONTEXT_GREP_DELETE_MAX_REGEX_PATTERN_CHARS) {
|
|
1024
|
-
throw new Error(`Regex pattern is too long (${pattern.length} characters); maximum is ${CONTEXT_GREP_DELETE_MAX_REGEX_PATTERN_CHARS}`);
|
|
1025
|
-
}
|
|
1026
|
-
// Heuristic ReDoS guard for common catastrophic-backtracking shapes. JavaScript's RegExp engine
|
|
1027
|
-
// does not expose a timeout, so reject nested quantified groups and backreferences instead of
|
|
1028
|
-
// relying only on transcript scan-size caps.
|
|
1029
|
-
const hasNestedQuantifiedGroup = /\((?:[^()\\]|\\.)*[+*](?:[^()\\]|\\.)*\)\s*(?:[+*]|\{\d)/u.test(pattern);
|
|
1030
|
-
const hasQuantifiedAlternation = /\((?:[^()\\]|\\.)*\|(?:[^()\\]|\\.)*\)\s*(?:[+*]|\{\d)/u.test(pattern);
|
|
1031
|
-
const hasBackreference = /\\[1-9]/u.test(pattern);
|
|
1032
|
-
if (hasNestedQuantifiedGroup || hasQuantifiedAlternation || hasBackreference) {
|
|
1033
|
-
throw new Error("Regex pattern is not allowed because it may cause excessive backtracking; use a literal pattern or exact deletion targets instead.");
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
function createGrepMatcher(pattern, regex, caseSensitive) {
|
|
1037
|
-
if (regex) {
|
|
1038
|
-
assertSafeRegexPattern(pattern);
|
|
1039
|
-
}
|
|
1040
|
-
try {
|
|
1041
|
-
return new RegExp(regex ? pattern : escapeRegExpLiteral(pattern), caseSensitive ? "u" : "iu");
|
|
1042
|
-
}
|
|
1043
|
-
catch (error) {
|
|
1044
|
-
throw new Error(`Invalid grep ${regex ? "regex" : "pattern"}: ${formatErrorMessage(error)}`);
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
function assertSafeRegexScan(scanChars) {
|
|
1048
|
-
if (scanChars <= CONTEXT_GREP_DELETE_MAX_REGEX_SCAN_CHARS)
|
|
1049
|
-
return;
|
|
1050
|
-
throw new Error(`Regex grep would scan ${scanChars} characters; maximum is ${CONTEXT_GREP_DELETE_MAX_REGEX_SCAN_CHARS}. Use a literal pattern or exact deletion targets instead.`);
|
|
1051
|
-
}
|
|
1052
|
-
function clampInteger(value, defaultValue, minimum, maximum) {
|
|
1053
|
-
if (value === undefined)
|
|
1054
|
-
return defaultValue;
|
|
1055
|
-
return Math.max(minimum, Math.min(maximum, value));
|
|
1056
|
-
}
|
|
1057
|
-
function textSlice(text, offset, maxChars) {
|
|
1058
|
-
return text.slice(offset, Math.min(text.length, offset + maxChars));
|
|
1059
|
-
}
|
|
1060
|
-
function findMatchIndex(matcher, text) {
|
|
1061
|
-
const match = matcher.exec(text);
|
|
1062
|
-
matcher.lastIndex = 0;
|
|
1063
|
-
return match?.index ?? -1;
|
|
1064
|
-
}
|
|
1065
|
-
function snippetForMatch(text, matchIndex, contextChars) {
|
|
1066
|
-
const start = Math.max(0, matchIndex - contextChars);
|
|
1067
|
-
const end = Math.min(text.length, matchIndex + contextChars);
|
|
1068
|
-
const prefix = start > 0 ? "…" : "";
|
|
1069
|
-
const suffix = end < text.length ? "…" : "";
|
|
1070
|
-
return `${prefix}${text.slice(start, end)}${suffix}`;
|
|
1071
|
-
}
|
|
1072
|
-
function currentTargetDeleted(targets, target) {
|
|
1073
|
-
const deletedEntryIds = getDeletedEntryIds(targets);
|
|
1074
|
-
if (deletedEntryIds.has(target.entryId))
|
|
1075
|
-
return true;
|
|
1076
|
-
if (target.kind === "entry")
|
|
1077
|
-
return false;
|
|
1078
|
-
return getDeletedContentBlocks(targets).get(target.entryId)?.has(target.blockIndex) === true;
|
|
1079
|
-
}
|
|
1080
|
-
function addGrepCandidate(candidates, matches, seenTargets, candidate, match) {
|
|
1081
|
-
const key = targetKey(candidate);
|
|
1082
|
-
if (seenTargets.has(key))
|
|
1083
|
-
return;
|
|
1084
|
-
seenTargets.add(key);
|
|
1085
|
-
candidates.push(candidate);
|
|
1086
|
-
matches.push(match);
|
|
1087
|
-
}
|
|
1088
|
-
function pushProtectedGrepSkip(skipped, match) {
|
|
1089
|
-
skipped.push({
|
|
1090
|
-
entryId: match.entryId,
|
|
1091
|
-
target: match.target,
|
|
1092
|
-
...(match.blockIndex === undefined ? {} : { blockIndex: match.blockIndex }),
|
|
1093
|
-
reason: match.target === "content_block" ? "protected_block" : "protected_entry",
|
|
1094
|
-
text: match.text,
|
|
1095
|
-
});
|
|
1096
|
-
}
|
|
1097
|
-
function filterProtectedGrepCandidates(candidates, matches, currentTargets, transcript, skipped) {
|
|
1098
|
-
const eligibleCandidates = [];
|
|
1099
|
-
const eligibleMatches = [];
|
|
1100
|
-
for (let index = 0; index < candidates.length; index++) {
|
|
1101
|
-
const candidate = candidates[index];
|
|
1102
|
-
const match = matches[index];
|
|
1103
|
-
if (!candidate || !match)
|
|
1104
|
-
continue;
|
|
1105
|
-
try {
|
|
1106
|
-
const mergedTargets = mergeContextDeletionTargets(currentTargets, [candidate]);
|
|
1107
|
-
validateContextDeletionRequest(deletionRequestFromTargets(mergedTargets), transcript);
|
|
1108
|
-
eligibleCandidates.push(candidate);
|
|
1109
|
-
eligibleMatches.push(match);
|
|
1110
|
-
}
|
|
1111
|
-
catch (error) {
|
|
1112
|
-
const message = formatErrorMessage(error);
|
|
1113
|
-
if (isProtectedContextDeletionErrorMessage(message)) {
|
|
1114
|
-
pushProtectedGrepSkip(skipped, match);
|
|
1115
|
-
continue;
|
|
1116
|
-
}
|
|
1117
|
-
eligibleCandidates.push(candidate);
|
|
1118
|
-
eligibleMatches.push(match);
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1121
|
-
// Some latest-assistant thinking violations only become visible after a grep batch also
|
|
1122
|
-
// deletes newer assistant entries. Classify the newly-unsafe grep candidates as
|
|
1123
|
-
// protected/skipped before maxMatches, expectedMatchCount, stats, or removals are computed.
|
|
1124
|
-
let changed = true;
|
|
1125
|
-
while (changed) {
|
|
1126
|
-
changed = false;
|
|
1127
|
-
const mergedTargets = mergeContextDeletionTargets(currentTargets, eligibleCandidates);
|
|
1128
|
-
const violation = findLatestAssistantThinkingDeletionViolation(transcript, mergedTargets);
|
|
1129
|
-
if (!violation)
|
|
1130
|
-
continue;
|
|
1131
|
-
const violationKey = targetKey(violation);
|
|
1132
|
-
let violationIndex = eligibleCandidates.findIndex((candidate) => targetKey(candidate) === violationKey);
|
|
1133
|
-
if (violationIndex < 0) {
|
|
1134
|
-
violationIndex = eligibleCandidates.findIndex((_candidate, candidateIndex) => {
|
|
1135
|
-
const remainingCandidates = eligibleCandidates.filter((_candidateToKeep, index) => index !== candidateIndex);
|
|
1136
|
-
const remainingTargets = mergeContextDeletionTargets(currentTargets, remainingCandidates);
|
|
1137
|
-
const remainingViolation = findLatestAssistantThinkingDeletionViolation(transcript, remainingTargets);
|
|
1138
|
-
return !remainingViolation || targetKey(remainingViolation) !== violationKey;
|
|
1139
|
-
});
|
|
1140
|
-
}
|
|
1141
|
-
if (violationIndex < 0)
|
|
1142
|
-
continue;
|
|
1143
|
-
const [skippedMatch] = eligibleMatches.splice(violationIndex, 1);
|
|
1144
|
-
eligibleCandidates.splice(violationIndex, 1);
|
|
1145
|
-
if (skippedMatch)
|
|
1146
|
-
pushProtectedGrepSkip(skipped, skippedMatch);
|
|
1147
|
-
changed = true;
|
|
1148
|
-
}
|
|
1149
|
-
return { candidates: eligibleCandidates, matches: eligibleMatches };
|
|
1150
|
-
}
|
|
1151
|
-
function copyDeletionTarget(target) {
|
|
1152
|
-
return target.kind === "entry"
|
|
1153
|
-
? { kind: "entry", entryId: target.entryId }
|
|
1154
|
-
: { kind: "content_block", entryId: target.entryId, blockIndex: target.blockIndex };
|
|
1155
|
-
}
|
|
1156
|
-
class ContextDeletionMemoryStore {
|
|
1157
|
-
constructor(transcript) {
|
|
1158
|
-
this.deletionTargets = [];
|
|
1159
|
-
this.callCount = 0;
|
|
1160
|
-
const entryIds = new Set();
|
|
1161
|
-
const blockKeys = new Set();
|
|
1162
|
-
this.entries = transcript.entries.map((entry) => {
|
|
1163
|
-
if (entryIds.has(entry.entryId)) {
|
|
1164
|
-
throw new Error(`Duplicate transcript entry id: ${entry.entryId}`);
|
|
1165
|
-
}
|
|
1166
|
-
entryIds.add(entry.entryId);
|
|
1167
|
-
return {
|
|
1168
|
-
entryId: entry.entryId,
|
|
1169
|
-
role: entry.role,
|
|
1170
|
-
protected: entry.protected,
|
|
1171
|
-
hasAssistantThinkingBlocks: assistantEntryHasThinkingContentBlock(entry),
|
|
1172
|
-
tokenEstimate: entry.tokenEstimate,
|
|
1173
|
-
text: entry.text,
|
|
1174
|
-
};
|
|
1175
|
-
});
|
|
1176
|
-
this.entriesById = new Map(this.entries.map((entry) => [entry.entryId, entry]));
|
|
1177
|
-
this.contentBlocks = transcript.entries.flatMap((entry, entryPosition) => {
|
|
1178
|
-
const hasAssistantThinkingBlocks = assistantEntryHasThinkingContentBlock(entry);
|
|
1179
|
-
return entry.contentBlocks.map((block) => {
|
|
1180
|
-
if (block.entryId !== entry.entryId) {
|
|
1181
|
-
throw new Error(`Transcript content block ${block.entryId}:${block.blockIndex} does not belong to entry ${entry.entryId}`);
|
|
1182
|
-
}
|
|
1183
|
-
const blockKey = `${block.entryId}:${block.blockIndex}`;
|
|
1184
|
-
if (blockKeys.has(blockKey)) {
|
|
1185
|
-
throw new Error(`Duplicate transcript content block: ${blockKey}`);
|
|
1186
|
-
}
|
|
1187
|
-
blockKeys.add(blockKey);
|
|
1188
|
-
return {
|
|
1189
|
-
entryPosition,
|
|
1190
|
-
entryId: block.entryId,
|
|
1191
|
-
blockIndex: block.blockIndex,
|
|
1192
|
-
role: entry.role,
|
|
1193
|
-
type: block.type,
|
|
1194
|
-
protected: block.protected,
|
|
1195
|
-
hasAssistantThinkingBlocks,
|
|
1196
|
-
tokenEstimate: block.tokenEstimate,
|
|
1197
|
-
text: block.text,
|
|
1198
|
-
};
|
|
1199
|
-
});
|
|
1200
|
-
});
|
|
1201
|
-
this.contentBlockCountByEntryId = new Map();
|
|
1202
|
-
for (const block of this.contentBlocks) {
|
|
1203
|
-
this.contentBlockCountByEntryId.set(block.entryId, (this.contentBlockCountByEntryId.get(block.entryId) ?? 0) + 1);
|
|
1204
|
-
}
|
|
1205
|
-
}
|
|
1206
|
-
transaction(operation) {
|
|
1207
|
-
const snapshot = this.snapshot();
|
|
1208
|
-
try {
|
|
1209
|
-
return operation();
|
|
1210
|
-
}
|
|
1211
|
-
catch (error) {
|
|
1212
|
-
this.restore(snapshot);
|
|
1213
|
-
throw error;
|
|
1214
|
-
}
|
|
1215
|
-
}
|
|
1216
|
-
readTargets() {
|
|
1217
|
-
return this.deletionTargets.map(copyDeletionTarget);
|
|
1218
|
-
}
|
|
1219
|
-
replaceTargets(targets) {
|
|
1220
|
-
this.deletionTargets = targets.map(copyDeletionTarget);
|
|
1221
|
-
}
|
|
1222
|
-
listEntriesForGrep() {
|
|
1223
|
-
return this.entries.map((entry) => ({
|
|
1224
|
-
entry_id: entry.entryId,
|
|
1225
|
-
text: entry.text,
|
|
1226
|
-
is_protected: entry.protected ? 1 : 0,
|
|
1227
|
-
has_assistant_thinking_blocks: entry.hasAssistantThinkingBlocks ? 1 : 0,
|
|
1228
|
-
}));
|
|
1229
|
-
}
|
|
1230
|
-
listContentBlocksForGrep() {
|
|
1231
|
-
return [...this.contentBlocks]
|
|
1232
|
-
.sort((a, b) => a.entryPosition - b.entryPosition || a.blockIndex - b.blockIndex)
|
|
1233
|
-
.map((block) => ({
|
|
1234
|
-
entry_id: block.entryId,
|
|
1235
|
-
block_index: block.blockIndex,
|
|
1236
|
-
role: block.role,
|
|
1237
|
-
type: block.type,
|
|
1238
|
-
text: block.text,
|
|
1239
|
-
entry_protected: this.entriesById.get(block.entryId)?.protected ? 1 : 0,
|
|
1240
|
-
block_protected: block.protected ? 1 : 0,
|
|
1241
|
-
block_count: this.contentBlockCountByEntryId.get(block.entryId) ?? 0,
|
|
1242
|
-
has_assistant_thinking_blocks: block.hasAssistantThinkingBlocks ? 1 : 0,
|
|
1243
|
-
}));
|
|
1244
|
-
}
|
|
1245
|
-
getEntryForRead(entryId) {
|
|
1246
|
-
const entry = this.entriesById.get(entryId);
|
|
1247
|
-
if (!entry)
|
|
1248
|
-
return undefined;
|
|
1249
|
-
return {
|
|
1250
|
-
entry_id: entry.entryId,
|
|
1251
|
-
role: entry.role,
|
|
1252
|
-
is_protected: entry.protected ? 1 : 0,
|
|
1253
|
-
has_assistant_thinking_blocks: entry.hasAssistantThinkingBlocks ? 1 : 0,
|
|
1254
|
-
token_estimate: entry.tokenEstimate,
|
|
1255
|
-
text: entry.text,
|
|
1256
|
-
};
|
|
1257
|
-
}
|
|
1258
|
-
getContentBlockForRead(entryId, blockIndex) {
|
|
1259
|
-
const block = this.contentBlocks.find((candidate) => candidate.entryId === entryId && candidate.blockIndex === blockIndex);
|
|
1260
|
-
if (!block)
|
|
1261
|
-
return undefined;
|
|
1262
|
-
return {
|
|
1263
|
-
entry_id: block.entryId,
|
|
1264
|
-
block_index: block.blockIndex,
|
|
1265
|
-
role: block.role,
|
|
1266
|
-
type: block.type,
|
|
1267
|
-
token_estimate: block.tokenEstimate,
|
|
1268
|
-
text: block.text,
|
|
1269
|
-
entry_protected: this.entriesById.get(block.entryId)?.protected ? 1 : 0,
|
|
1270
|
-
block_protected: block.protected ? 1 : 0,
|
|
1271
|
-
block_count: this.contentBlockCountByEntryId.get(block.entryId) ?? 0,
|
|
1272
|
-
has_assistant_thinking_blocks: block.hasAssistantThinkingBlocks ? 1 : 0,
|
|
1273
|
-
};
|
|
1274
|
-
}
|
|
1275
|
-
getGrepScanTextLength(target) {
|
|
1276
|
-
const texts = target === "entry" ? this.entries : this.contentBlocks;
|
|
1277
|
-
return texts.reduce((sum, item) => sum + item.text.length, 0);
|
|
1278
|
-
}
|
|
1279
|
-
incrementCallCount() {
|
|
1280
|
-
this.callCount += 1;
|
|
1281
|
-
return this.callCount;
|
|
1282
|
-
}
|
|
1283
|
-
getCallCount() {
|
|
1284
|
-
return this.callCount;
|
|
1285
|
-
}
|
|
1286
|
-
setLastError(message) {
|
|
1287
|
-
this.lastError = message;
|
|
1288
|
-
}
|
|
1289
|
-
clearLastError() {
|
|
1290
|
-
this.lastError = undefined;
|
|
1291
|
-
}
|
|
1292
|
-
getLastError() {
|
|
1293
|
-
return this.lastError;
|
|
1294
|
-
}
|
|
1295
|
-
snapshot() {
|
|
1296
|
-
return {
|
|
1297
|
-
deletionTargets: this.readTargets(),
|
|
1298
|
-
callCount: this.callCount,
|
|
1299
|
-
...(this.lastError === undefined ? {} : { lastError: this.lastError }),
|
|
1300
|
-
};
|
|
1301
|
-
}
|
|
1302
|
-
restore(snapshot) {
|
|
1303
|
-
this.deletionTargets = snapshot.deletionTargets.map(copyDeletionTarget);
|
|
1304
|
-
this.callCount = snapshot.callCount;
|
|
1305
|
-
this.lastError = snapshot.lastError;
|
|
1306
|
-
}
|
|
1307
|
-
}
|
|
1308
|
-
function createContextDeletionStore(transcript) {
|
|
1309
|
-
return new ContextDeletionMemoryStore(transcript);
|
|
1310
|
-
}
|
|
1311
|
-
export function createContextDeletionTool(inputTranscript, options = {}) {
|
|
1312
|
-
const contextWindow = finitePositiveNumber(options.contextWindow);
|
|
1313
|
-
const parameters = normalizeContextCompactionParameters({ ...getTranscriptCompactionParameters(inputTranscript), ...options }, inputTranscript.parameters?.query ?? CONTEXT_COMPACTION_AUTO_QUERY);
|
|
1314
|
-
const transcript = { ...inputTranscript, parameters };
|
|
1315
|
-
const store = createContextDeletionStore(transcript);
|
|
1316
|
-
let validatedResult;
|
|
1317
|
-
function readTargets() {
|
|
1318
|
-
return store.readTargets();
|
|
1319
|
-
}
|
|
1320
|
-
function applyValidatedTargets(additionalTargets) {
|
|
1321
|
-
const mergedTargets = mergeContextDeletionTargets(readTargets(), additionalTargets);
|
|
1322
|
-
validatedResult = validateContextDeletionRequest(deletionRequestFromTargets(mergedTargets), transcript);
|
|
1323
|
-
store.replaceTargets(validatedResult.deletedTargets);
|
|
1324
|
-
return validatedResult;
|
|
1325
|
-
}
|
|
1326
|
-
function currentStats() {
|
|
1327
|
-
return validatedResult?.stats ?? computeContextCompactionStats(transcript, readTargets());
|
|
1328
|
-
}
|
|
1329
|
-
function canDeleteProtectedTarget(target) {
|
|
1330
|
-
return canDeleteTarget(transcript, target);
|
|
1331
|
-
}
|
|
1332
|
-
const tool = {
|
|
1333
|
-
...CONTEXT_DELETE_TOOL,
|
|
1334
|
-
label: "context deletion request",
|
|
1335
|
-
executionMode: "parallel",
|
|
1336
|
-
async execute(_toolCallId, params) {
|
|
1337
|
-
return store.transaction(() => {
|
|
1338
|
-
const callCount = store.incrementCallCount();
|
|
1339
|
-
try {
|
|
1340
|
-
const incomingRequest = contextDeletionRequestFromObject(params, `${CONTEXT_DELETE_TOOL_NAME} arguments`);
|
|
1341
|
-
const incomingValidated = validateContextDeletionRequest(incomingRequest, transcript);
|
|
1342
|
-
const applied = applyValidatedTargets(incomingValidated.deletedTargets);
|
|
1343
|
-
store.clearLastError();
|
|
1344
|
-
const deletedTargets = readTargets();
|
|
1345
|
-
const details = {
|
|
1346
|
-
deletions: deletionRequestFromTargets(deletedTargets).deletions,
|
|
1347
|
-
deletedTargets,
|
|
1348
|
-
stats: applied.stats,
|
|
1349
|
-
callCount,
|
|
1350
|
-
};
|
|
1351
|
-
const text = `Recorded ${incomingValidated.deletedTargets.length} deletion target(s); ${deletedTargets.length} total validated deletion target(s) are selected. Continue calling ${CONTEXT_DELETE_TOOL_NAME} or ${CONTEXT_GREP_DELETE_TOOL_NAME} for additional deletions, or respond done when finished.`;
|
|
1352
|
-
return createContextDeletionToolResult(text, details);
|
|
1353
|
-
}
|
|
1354
|
-
catch (error) {
|
|
1355
|
-
const message = formatErrorMessage(error);
|
|
1356
|
-
store.setLastError(message);
|
|
1357
|
-
const deletedTargets = readTargets();
|
|
1358
|
-
const details = {
|
|
1359
|
-
deletions: deletionRequestFromTargets(deletedTargets).deletions,
|
|
1360
|
-
deletedTargets,
|
|
1361
|
-
stats: currentStats(),
|
|
1362
|
-
callCount,
|
|
1363
|
-
error: message,
|
|
1364
|
-
};
|
|
1365
|
-
return createContextDeletionToolResult(`Error recording context deletion targets: ${message}. No new deletion targets were applied; continue with a corrected tool call.`, details);
|
|
1366
|
-
}
|
|
1367
|
-
});
|
|
1368
|
-
},
|
|
1369
|
-
};
|
|
1370
|
-
const grepTool = {
|
|
1371
|
-
...CONTEXT_GREP_DELETE_TOOL,
|
|
1372
|
-
label: "context grep delete",
|
|
1373
|
-
executionMode: "parallel",
|
|
1374
|
-
async execute(_toolCallId, params) {
|
|
1375
|
-
return store.transaction(() => {
|
|
1376
|
-
const callCount = store.incrementCallCount();
|
|
1377
|
-
const pattern = params.pattern;
|
|
1378
|
-
const regex = params.regex === true;
|
|
1379
|
-
const caseSensitive = params.caseSensitive === true;
|
|
1380
|
-
const target = params.target ?? "entry";
|
|
1381
|
-
const maxMatches = params.maxMatches ?? CONTEXT_GREP_DELETE_DEFAULT_MAX_MATCHES;
|
|
1382
|
-
const candidates = [];
|
|
1383
|
-
const matches = [];
|
|
1384
|
-
let reportedMatches = matches;
|
|
1385
|
-
const skipped = [];
|
|
1386
|
-
const seenTargets = new Set();
|
|
1387
|
-
try {
|
|
1388
|
-
if (regex) {
|
|
1389
|
-
assertSafeRegexScan(store.getGrepScanTextLength(target));
|
|
1390
|
-
}
|
|
1391
|
-
const matcher = createGrepMatcher(pattern, regex, caseSensitive);
|
|
1392
|
-
const currentTargets = readTargets();
|
|
1393
|
-
const recentEntryIds = getRecentContextEntryIds(transcript);
|
|
1394
|
-
if (target === "entry") {
|
|
1395
|
-
for (const entry of store.listEntriesForGrep()) {
|
|
1396
|
-
if (!matcher.test(entry.text))
|
|
1397
|
-
continue;
|
|
1398
|
-
const candidate = { kind: "entry", entryId: entry.entry_id };
|
|
1399
|
-
if (recentEntryIds.has(candidate.entryId)) {
|
|
1400
|
-
skipped.push({ entryId: entry.entry_id, target, reason: "protected_entry", text: entry.text });
|
|
1401
|
-
continue;
|
|
1402
|
-
}
|
|
1403
|
-
if (entry.is_protected === 1 && !canDeleteProtectedTarget(candidate)) {
|
|
1404
|
-
skipped.push({ entryId: entry.entry_id, target, reason: "protected_entry", text: entry.text });
|
|
1405
|
-
continue;
|
|
1406
|
-
}
|
|
1407
|
-
if (currentTargetDeleted(currentTargets, candidate)) {
|
|
1408
|
-
skipped.push({ entryId: entry.entry_id, target, reason: "already_deleted", text: entry.text });
|
|
1409
|
-
continue;
|
|
1410
|
-
}
|
|
1411
|
-
addGrepCandidate(candidates, matches, seenTargets, candidate, {
|
|
1412
|
-
entryId: entry.entry_id,
|
|
1413
|
-
target,
|
|
1414
|
-
text: entry.text,
|
|
1415
|
-
});
|
|
1416
|
-
}
|
|
1417
|
-
}
|
|
1418
|
-
else {
|
|
1419
|
-
for (const block of store.listContentBlocksForGrep()) {
|
|
1420
|
-
if (!matcher.test(block.text))
|
|
1421
|
-
continue;
|
|
1422
|
-
const candidate = block.block_count <= 1
|
|
1423
|
-
? { kind: "entry", entryId: block.entry_id }
|
|
1424
|
-
: { kind: "content_block", entryId: block.entry_id, blockIndex: block.block_index };
|
|
1425
|
-
if (recentEntryIds.has(candidate.entryId)) {
|
|
1426
|
-
skipped.push({
|
|
1427
|
-
entryId: block.entry_id,
|
|
1428
|
-
target: candidate.kind,
|
|
1429
|
-
...(candidate.kind === "content_block" ? { blockIndex: candidate.blockIndex } : {}),
|
|
1430
|
-
reason: "protected_entry",
|
|
1431
|
-
text: block.text,
|
|
1432
|
-
});
|
|
1433
|
-
continue;
|
|
1434
|
-
}
|
|
1435
|
-
if (block.entry_protected === 1 && !canDeleteProtectedTarget(candidate)) {
|
|
1436
|
-
skipped.push({
|
|
1437
|
-
entryId: block.entry_id,
|
|
1438
|
-
target,
|
|
1439
|
-
blockIndex: block.block_index,
|
|
1440
|
-
reason: "protected_entry",
|
|
1441
|
-
text: block.text,
|
|
1442
|
-
});
|
|
1443
|
-
continue;
|
|
1444
|
-
}
|
|
1445
|
-
if (block.block_protected === 1 && !canDeleteProtectedTarget(candidate)) {
|
|
1446
|
-
skipped.push({
|
|
1447
|
-
entryId: block.entry_id,
|
|
1448
|
-
target,
|
|
1449
|
-
blockIndex: block.block_index,
|
|
1450
|
-
reason: "protected_block",
|
|
1451
|
-
text: block.text,
|
|
1452
|
-
});
|
|
1453
|
-
continue;
|
|
1454
|
-
}
|
|
1455
|
-
if (currentTargetDeleted(currentTargets, candidate)) {
|
|
1456
|
-
skipped.push({
|
|
1457
|
-
entryId: block.entry_id,
|
|
1458
|
-
target: candidate.kind,
|
|
1459
|
-
...(candidate.kind === "content_block" ? { blockIndex: candidate.blockIndex } : {}),
|
|
1460
|
-
reason: "already_deleted",
|
|
1461
|
-
text: block.text,
|
|
1462
|
-
});
|
|
1463
|
-
continue;
|
|
1464
|
-
}
|
|
1465
|
-
addGrepCandidate(candidates, matches, seenTargets, candidate, {
|
|
1466
|
-
entryId: block.entry_id,
|
|
1467
|
-
target: candidate.kind,
|
|
1468
|
-
...(candidate.kind === "content_block" ? { blockIndex: candidate.blockIndex } : {}),
|
|
1469
|
-
text: block.text,
|
|
1470
|
-
});
|
|
1471
|
-
}
|
|
1472
|
-
}
|
|
1473
|
-
const eligible = filterProtectedGrepCandidates(candidates, matches, currentTargets, transcript, skipped);
|
|
1474
|
-
reportedMatches = eligible.matches;
|
|
1475
|
-
let applied;
|
|
1476
|
-
if (params.expectedMatchCount !== undefined && eligible.candidates.length !== params.expectedMatchCount) {
|
|
1477
|
-
skipped.push({ reason: "expected_match_count_mismatch" });
|
|
1478
|
-
}
|
|
1479
|
-
else if (eligible.candidates.length > maxMatches) {
|
|
1480
|
-
skipped.push({ reason: "max_matches_exceeded" });
|
|
1481
|
-
}
|
|
1482
|
-
else if (eligible.candidates.length > 0) {
|
|
1483
|
-
applied = applyValidatedTargets(eligible.candidates);
|
|
1484
|
-
}
|
|
1485
|
-
store.clearLastError();
|
|
1486
|
-
const deletedTargets = readTargets();
|
|
1487
|
-
const details = {
|
|
1488
|
-
pattern,
|
|
1489
|
-
regex,
|
|
1490
|
-
caseSensitive,
|
|
1491
|
-
target,
|
|
1492
|
-
matches: eligible.matches,
|
|
1493
|
-
skipped,
|
|
1494
|
-
deletedTargets,
|
|
1495
|
-
stats: applied?.stats ?? currentStats(),
|
|
1496
|
-
callCount,
|
|
1497
|
-
};
|
|
1498
|
-
const text = `Matched ${eligible.matches.length} deletion target(s), skipped ${skipped.length}, and ${applied ? "applied" : "did not apply"} grep deletion for pattern ${JSON.stringify(pattern)}. Total validated deletion target(s): ${deletedTargets.length}.`;
|
|
1499
|
-
return createContextDeletionToolResult(text, details);
|
|
1500
|
-
}
|
|
1501
|
-
catch (error) {
|
|
1502
|
-
const message = formatErrorMessage(error);
|
|
1503
|
-
store.setLastError(message);
|
|
1504
|
-
const deletedTargets = readTargets();
|
|
1505
|
-
const details = {
|
|
1506
|
-
pattern,
|
|
1507
|
-
regex,
|
|
1508
|
-
caseSensitive,
|
|
1509
|
-
target,
|
|
1510
|
-
matches: reportedMatches,
|
|
1511
|
-
skipped,
|
|
1512
|
-
deletedTargets,
|
|
1513
|
-
stats: currentStats(),
|
|
1514
|
-
callCount,
|
|
1515
|
-
error: message,
|
|
1516
|
-
};
|
|
1517
|
-
return createContextDeletionToolResult(`Error applying grep deletion for pattern ${JSON.stringify(pattern)}: ${message}. No new deletion targets were applied; continue with a corrected tool call.`, details);
|
|
1518
|
-
}
|
|
1519
|
-
});
|
|
1520
|
-
},
|
|
1521
|
-
};
|
|
1522
|
-
const searchTool = {
|
|
1523
|
-
...CONTEXT_SEARCH_TRANSCRIPT_TOOL,
|
|
1524
|
-
label: "context transcript search",
|
|
1525
|
-
executionMode: "parallel",
|
|
1526
|
-
async execute(_toolCallId, params) {
|
|
1527
|
-
return store.transaction(() => {
|
|
1528
|
-
const callCount = store.incrementCallCount();
|
|
1529
|
-
const pattern = params.pattern;
|
|
1530
|
-
const regex = params.regex === true;
|
|
1531
|
-
const caseSensitive = params.caseSensitive === true;
|
|
1532
|
-
const target = params.target ?? "entry";
|
|
1533
|
-
const maxMatches = clampInteger(params.maxMatches, CONTEXT_SEARCH_DEFAULT_MAX_MATCHES, 1, CONTEXT_SEARCH_MAX_MATCHES);
|
|
1534
|
-
const contextChars = clampInteger(params.contextChars, CONTEXT_SEARCH_DEFAULT_CONTEXT_CHARS, 0, CONTEXT_SEARCH_MAX_CONTEXT_CHARS);
|
|
1535
|
-
const matches = [];
|
|
1536
|
-
let truncated = false;
|
|
1537
|
-
try {
|
|
1538
|
-
if (regex) {
|
|
1539
|
-
assertSafeRegexScan(store.getGrepScanTextLength(target));
|
|
1540
|
-
}
|
|
1541
|
-
const matcher = createGrepMatcher(pattern, regex, caseSensitive);
|
|
1542
|
-
if (target === "entry") {
|
|
1543
|
-
for (const entry of store.listEntriesForGrep()) {
|
|
1544
|
-
const matchIndex = findMatchIndex(matcher, entry.text);
|
|
1545
|
-
if (matchIndex < 0)
|
|
1546
|
-
continue;
|
|
1547
|
-
if (matches.length >= maxMatches) {
|
|
1548
|
-
truncated = true;
|
|
1549
|
-
break;
|
|
1550
|
-
}
|
|
1551
|
-
matches.push({
|
|
1552
|
-
entryId: entry.entry_id,
|
|
1553
|
-
target,
|
|
1554
|
-
matchIndex,
|
|
1555
|
-
snippet: snippetForMatch(entry.text, matchIndex, contextChars),
|
|
1556
|
-
protected: entry.is_protected === 1,
|
|
1557
|
-
});
|
|
1558
|
-
}
|
|
1559
|
-
}
|
|
1560
|
-
else {
|
|
1561
|
-
for (const block of store.listContentBlocksForGrep()) {
|
|
1562
|
-
const matchIndex = findMatchIndex(matcher, block.text);
|
|
1563
|
-
if (matchIndex < 0)
|
|
1564
|
-
continue;
|
|
1565
|
-
if (matches.length >= maxMatches) {
|
|
1566
|
-
truncated = true;
|
|
1567
|
-
break;
|
|
1568
|
-
}
|
|
1569
|
-
matches.push({
|
|
1570
|
-
entryId: block.entry_id,
|
|
1571
|
-
target,
|
|
1572
|
-
blockIndex: block.block_index,
|
|
1573
|
-
matchIndex,
|
|
1574
|
-
snippet: snippetForMatch(block.text, matchIndex, contextChars),
|
|
1575
|
-
protected: block.entry_protected === 1 || block.block_protected === 1,
|
|
1576
|
-
});
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
store.clearLastError();
|
|
1580
|
-
const details = {
|
|
1581
|
-
pattern,
|
|
1582
|
-
regex,
|
|
1583
|
-
caseSensitive,
|
|
1584
|
-
target,
|
|
1585
|
-
matches,
|
|
1586
|
-
truncated,
|
|
1587
|
-
callCount,
|
|
1588
|
-
};
|
|
1589
|
-
const text = `Found ${matches.length}${truncated ? "+" : ""} ${target} match(es) for ${JSON.stringify(pattern)}. Use ${CONTEXT_READ_ENTRY_TOOL_NAME} with small maxChars to inspect exact content before deleting.`;
|
|
1590
|
-
return createContextDeletionToolResult(text, details);
|
|
1591
|
-
}
|
|
1592
|
-
catch (error) {
|
|
1593
|
-
const message = formatErrorMessage(error);
|
|
1594
|
-
store.setLastError(message);
|
|
1595
|
-
const details = {
|
|
1596
|
-
pattern,
|
|
1597
|
-
regex,
|
|
1598
|
-
caseSensitive,
|
|
1599
|
-
target,
|
|
1600
|
-
matches,
|
|
1601
|
-
truncated,
|
|
1602
|
-
callCount,
|
|
1603
|
-
error: message,
|
|
1604
|
-
};
|
|
1605
|
-
return createContextDeletionToolResult(`Error searching transcript for ${JSON.stringify(pattern)}: ${message}. Try a literal pattern or narrower query.`, details);
|
|
1606
|
-
}
|
|
1607
|
-
});
|
|
1608
|
-
},
|
|
1609
|
-
};
|
|
1610
|
-
const readEntryTool = {
|
|
1611
|
-
...CONTEXT_READ_ENTRY_TOOL,
|
|
1612
|
-
label: "context read entry",
|
|
1613
|
-
executionMode: "parallel",
|
|
1614
|
-
async execute(_toolCallId, params) {
|
|
1615
|
-
return store.transaction(() => {
|
|
1616
|
-
const callCount = store.incrementCallCount();
|
|
1617
|
-
const offset = clampInteger(params.offset, 0, 0, Number.MAX_SAFE_INTEGER);
|
|
1618
|
-
const maxChars = clampInteger(params.maxChars, CONTEXT_READ_ENTRY_DEFAULT_MAX_CHARS, 1, CONTEXT_READ_ENTRY_MAX_CHARS);
|
|
1619
|
-
try {
|
|
1620
|
-
const row = params.blockIndex === undefined
|
|
1621
|
-
? store.getEntryForRead(params.entryId)
|
|
1622
|
-
: store.getContentBlockForRead(params.entryId, params.blockIndex);
|
|
1623
|
-
if (!row) {
|
|
1624
|
-
throw new Error(params.blockIndex === undefined
|
|
1625
|
-
? `Unknown transcript entry: ${params.entryId}`
|
|
1626
|
-
: `Unknown transcript content block: ${params.entryId}:${params.blockIndex}`);
|
|
1627
|
-
}
|
|
1628
|
-
const text = row.text;
|
|
1629
|
-
const slice = textSlice(text, offset, maxChars);
|
|
1630
|
-
store.clearLastError();
|
|
1631
|
-
const details = {
|
|
1632
|
-
entryId: params.entryId,
|
|
1633
|
-
...(params.blockIndex === undefined ? {} : { blockIndex: params.blockIndex }),
|
|
1634
|
-
offset,
|
|
1635
|
-
maxChars,
|
|
1636
|
-
totalChars: text.length,
|
|
1637
|
-
text: slice,
|
|
1638
|
-
truncatedBefore: offset > 0,
|
|
1639
|
-
truncatedAfter: offset + maxChars < text.length,
|
|
1640
|
-
callCount,
|
|
1641
|
-
};
|
|
1642
|
-
const textResult = `Read ${slice.length} of ${text.length} characters from ${params.blockIndex === undefined ? params.entryId : `${params.entryId}:${params.blockIndex}`}. Keep reads small; increase offset for the next slice if needed.`;
|
|
1643
|
-
return createContextDeletionToolResult(textResult, details);
|
|
1644
|
-
}
|
|
1645
|
-
catch (error) {
|
|
1646
|
-
const message = formatErrorMessage(error);
|
|
1647
|
-
store.setLastError(message);
|
|
1648
|
-
const details = {
|
|
1649
|
-
entryId: params.entryId,
|
|
1650
|
-
...(params.blockIndex === undefined ? {} : { blockIndex: params.blockIndex }),
|
|
1651
|
-
offset,
|
|
1652
|
-
maxChars,
|
|
1653
|
-
totalChars: 0,
|
|
1654
|
-
text: "",
|
|
1655
|
-
truncatedBefore: false,
|
|
1656
|
-
truncatedAfter: false,
|
|
1657
|
-
callCount,
|
|
1658
|
-
error: message,
|
|
1659
|
-
};
|
|
1660
|
-
return createContextDeletionToolResult(`Error reading transcript entry: ${message}`, details);
|
|
1661
|
-
}
|
|
1662
|
-
});
|
|
1663
|
-
},
|
|
1664
|
-
};
|
|
1665
|
-
const budgetTool = {
|
|
1666
|
-
...CONTEXT_COMPACTION_BUDGET_TOOL,
|
|
1667
|
-
label: "context compaction budget",
|
|
1668
|
-
executionMode: "parallel",
|
|
1669
|
-
async execute(_toolCallId) {
|
|
1670
|
-
return store.transaction(() => {
|
|
1671
|
-
const callCount = store.incrementCallCount();
|
|
1672
|
-
store.clearLastError();
|
|
1673
|
-
const details = createContextCompactionBudgetDetails(currentStats(), callCount, contextWindow, parameters);
|
|
1674
|
-
const windowText = details.contextWindowBeforePercent !== undefined
|
|
1675
|
-
? ` Context window fullness: ${details.contextWindowBeforePercent}% before selected deletions, ${details.contextWindowAfterPercent}% after selected deletions.`
|
|
1676
|
-
: " Context window size is unknown for this model, so fullness percentages are unavailable.";
|
|
1677
|
-
const targetText = details.tokensToDeleteForTarget > 0
|
|
1678
|
-
? ` Delete about ${details.tokensToDeleteForTarget} more token(s) to reach the ${details.targetReductionPercent}% reduction target.`
|
|
1679
|
-
: ` The selected deletions meet or exceed the ${details.targetReductionPercent}% reduction target.`;
|
|
1680
|
-
return createContextDeletionToolResult(`Current selected deletions reduce context by ${details.currentReductionPercent}% (${details.deletedTokens} token(s)); tokens after selected deletions: ${details.currentTokensAfter}/${details.tokensBefore}.${windowText}${targetText} Keep maximizing useful retained context while aggressively removing low-value blocks.`, details);
|
|
1681
|
-
});
|
|
1682
|
-
},
|
|
1683
|
-
};
|
|
1684
|
-
return {
|
|
1685
|
-
tool,
|
|
1686
|
-
grepTool,
|
|
1687
|
-
searchTool,
|
|
1688
|
-
readEntryTool,
|
|
1689
|
-
budgetTool,
|
|
1690
|
-
tools: [tool, grepTool, searchTool, readEntryTool, budgetTool],
|
|
1691
|
-
getDeletionRequest: () => deletionRequestFromTargets(readTargets()),
|
|
1692
|
-
getValidatedResult: () => validatedResult,
|
|
1693
|
-
getLastError: () => store.getLastError(),
|
|
1694
|
-
getCallCount: () => store.getCallCount(),
|
|
1695
|
-
};
|
|
1696
|
-
}
|
|
1697
|
-
function truncateForPrompt(text, maxChars) {
|
|
1698
|
-
if (text.length <= maxChars)
|
|
1699
|
-
return text;
|
|
1700
|
-
return `${text.slice(0, maxChars)}\n[... ${text.length - maxChars} more characters omitted from context compaction prompt]`;
|
|
1701
|
-
}
|
|
1702
|
-
function transcriptEntryFilePayload(entry) {
|
|
1703
|
-
return {
|
|
1704
|
-
entryId: entry.entryId,
|
|
1705
|
-
entryType: entry.entryType,
|
|
1706
|
-
role: entry.role,
|
|
1707
|
-
protected: entry.protected,
|
|
1708
|
-
tokenEstimate: entry.tokenEstimate,
|
|
1709
|
-
toolCallIds: entry.toolCallIds,
|
|
1710
|
-
toolResultFor: entry.toolResultFor,
|
|
1711
|
-
text: entry.text,
|
|
1712
|
-
contentBlocks: entry.contentBlocks.map((block) => ({
|
|
1713
|
-
blockIndex: block.blockIndex,
|
|
1714
|
-
type: block.type,
|
|
1715
|
-
protected: block.protected,
|
|
1716
|
-
toolCallId: block.toolCallId,
|
|
1717
|
-
tokenEstimate: block.tokenEstimate,
|
|
1718
|
-
text: block.text,
|
|
1719
|
-
})),
|
|
1720
|
-
};
|
|
1721
|
-
}
|
|
1722
|
-
function writeContextCompactionTranscriptFile(transcript) {
|
|
1723
|
-
const directory = mkdtempSync(join(tmpdir(), "atomic-context-transcript-"));
|
|
1724
|
-
const path = join(directory, "transcript.jsonl");
|
|
1725
|
-
const lines = transcript.entries
|
|
1726
|
-
.filter((entry) => !isExcludedFromLlmContext(entry.message))
|
|
1727
|
-
.map((entry) => JSON.stringify(transcriptEntryFilePayload(entry)));
|
|
1728
|
-
writeFileSync(path, `${lines.join("\n")}\n`, "utf8");
|
|
1729
|
-
return {
|
|
1730
|
-
path,
|
|
1731
|
-
cleanup: () => rmSync(directory, { recursive: true, force: true }),
|
|
1732
|
-
};
|
|
1733
|
-
}
|
|
1734
|
-
function contextCompactionTranscriptManifest(transcript, transcriptFilePath) {
|
|
1735
|
-
const eligibleEntries = transcript.entries.filter((entry) => !isExcludedFromLlmContext(entry.message));
|
|
1736
|
-
const selectedEntryIds = new Set();
|
|
1737
|
-
const selectedEntries = [];
|
|
1738
|
-
const addEntry = (entry) => {
|
|
1739
|
-
if (selectedEntryIds.has(entry.entryId) || selectedEntries.length >= CONTEXT_MANIFEST_MAX_ENTRIES)
|
|
1740
|
-
return;
|
|
1741
|
-
selectedEntryIds.add(entry.entryId);
|
|
1742
|
-
selectedEntries.push(entry);
|
|
1743
|
-
};
|
|
1744
|
-
for (const entry of eligibleEntries.filter((entry) => entry.protected)) {
|
|
1745
|
-
addEntry(entry);
|
|
1746
|
-
}
|
|
1747
|
-
for (const entry of [...eligibleEntries]
|
|
1748
|
-
.filter((entry) => !entry.protected)
|
|
1749
|
-
.sort((left, right) => right.tokenEstimate - left.tokenEstimate)) {
|
|
1750
|
-
addEntry(entry);
|
|
1751
|
-
}
|
|
1752
|
-
selectedEntries.sort((left, right) => eligibleEntries.indexOf(left) - eligibleEntries.indexOf(right));
|
|
1753
|
-
return {
|
|
1754
|
-
transcriptFilePath,
|
|
1755
|
-
transcriptFileFormat: "jsonl: one compactable transcript entry per line with full text and contentBlocks text",
|
|
1756
|
-
totalEntries: eligibleEntries.length,
|
|
1757
|
-
manifestEntries: selectedEntries.length,
|
|
1758
|
-
omittedEntries: Math.max(0, eligibleEntries.length - selectedEntries.length),
|
|
1759
|
-
tokensBefore: transcript.tokensBefore,
|
|
1760
|
-
protectedEntryIds: transcript.protectedEntryIds,
|
|
1761
|
-
entries: selectedEntries.map((entry) => ({
|
|
1762
|
-
entryId: entry.entryId,
|
|
1763
|
-
role: entry.role,
|
|
1764
|
-
protected: entry.protected,
|
|
1765
|
-
tokenEstimate: entry.tokenEstimate,
|
|
1766
|
-
toolCallIds: entry.toolCallIds,
|
|
1767
|
-
toolResultFor: entry.toolResultFor,
|
|
1768
|
-
contentBlockCount: entry.contentBlocks.length,
|
|
1769
|
-
contentBlocks: entry.contentBlocks.map((block) => ({
|
|
1770
|
-
blockIndex: block.blockIndex,
|
|
1771
|
-
type: block.type,
|
|
1772
|
-
protected: block.protected,
|
|
1773
|
-
toolCallId: block.toolCallId,
|
|
1774
|
-
tokenEstimate: block.tokenEstimate,
|
|
1775
|
-
})),
|
|
1776
|
-
preview: truncateForPrompt(entry.text, CONTEXT_MANIFEST_PREVIEW_CHARS),
|
|
1777
|
-
})),
|
|
1778
|
-
};
|
|
1779
|
-
}
|
|
1780
|
-
function contextCompactionParametersPrompt(parameters) {
|
|
1781
|
-
return `\n<compaction-parameters>\n${JSON.stringify({
|
|
1782
|
-
compression_ratio: parameters.compression_ratio,
|
|
1783
|
-
preserve_recent: parameters.preserve_recent,
|
|
1784
|
-
query: parameters.query,
|
|
1785
|
-
target_reduction_percent: contextCompactionTargetReductionPercent(parameters),
|
|
1786
|
-
}, null, 2)}\n</compaction-parameters>`;
|
|
1787
|
-
}
|
|
1788
|
-
export function buildContextCompactionPrompt(transcript, transcriptFilePath = "<transcript file will be written during context compaction>", parameters = getTranscriptCompactionParameters(transcript)) {
|
|
1789
|
-
return `${contextCompactionFixedPrompt(parameters)}${contextCompactionParametersPrompt(parameters)}\n\n<transcript-file>\n${transcriptFilePath}\n</transcript-file>\n\n<context-manifest>\n${JSON.stringify(contextCompactionTranscriptManifest(transcript, transcriptFilePath), null, 2)}\n</context-manifest>`;
|
|
1790
|
-
}
|
|
1791
|
-
function createContextCompactionAssistantMessage(model, content, stopReason, errorMessage) {
|
|
1792
|
-
return {
|
|
1793
|
-
role: "assistant",
|
|
1794
|
-
content,
|
|
1795
|
-
api: model.api,
|
|
1796
|
-
provider: model.provider,
|
|
1797
|
-
model: model.id,
|
|
1798
|
-
usage: {
|
|
1799
|
-
input: 0,
|
|
1800
|
-
output: 0,
|
|
1801
|
-
cacheRead: 0,
|
|
1802
|
-
cacheWrite: 0,
|
|
1803
|
-
totalTokens: 0,
|
|
1804
|
-
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
1805
|
-
},
|
|
1806
|
-
stopReason,
|
|
1807
|
-
...(errorMessage !== undefined ? { errorMessage } : {}),
|
|
1808
|
-
timestamp: Date.now(),
|
|
1809
|
-
};
|
|
1810
|
-
}
|
|
1811
|
-
function createContextCompactionStopStream(model, text) {
|
|
1812
|
-
const stream = createAssistantMessageEventStream();
|
|
1813
|
-
queueMicrotask(() => {
|
|
1814
|
-
const message = createContextCompactionAssistantMessage(model, [{ type: "text", text }], "stop");
|
|
1815
|
-
stream.push({ type: "done", reason: "stop", message });
|
|
1816
|
-
stream.end(message);
|
|
1817
|
-
});
|
|
1818
|
-
return stream;
|
|
1819
|
-
}
|
|
1820
|
-
function isContextCompactionOverflowError(model, errorMessage) {
|
|
1821
|
-
return isContextOverflow(createContextCompactionAssistantMessage(model, [], "error", errorMessage), model.contextWindow);
|
|
1822
|
-
}
|
|
1823
|
-
async function runContextDeletionAssistant(inputTranscript, model, apiKey, headers, signal, thinkingLevel = "off", parameters = getTranscriptCompactionParameters(inputTranscript)) {
|
|
1824
|
-
const transcript = { ...inputTranscript, parameters };
|
|
1825
|
-
const maxTokens = model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY;
|
|
1826
|
-
if (signal?.aborted) {
|
|
1827
|
-
throw new Error("Context compaction failed: Request was aborted");
|
|
1828
|
-
}
|
|
1829
|
-
const transcriptFile = writeContextCompactionTranscriptFile(transcript);
|
|
1830
|
-
const promptMessage = {
|
|
1831
|
-
role: "user",
|
|
1832
|
-
content: [{ type: "text", text: buildContextCompactionPrompt(transcript, transcriptFile.path, parameters) }],
|
|
1833
|
-
timestamp: Date.now(),
|
|
1834
|
-
};
|
|
1835
|
-
const deletionTool = createContextDeletionTool(transcript, { contextWindow: model.contextWindow, ...parameters });
|
|
1836
|
-
const agent = new Agent({
|
|
1837
|
-
initialState: {
|
|
1838
|
-
systemPrompt: CONTEXT_COMPACTION_SYSTEM_PROMPT,
|
|
1839
|
-
model,
|
|
1840
|
-
thinkingLevel,
|
|
1841
|
-
tools: deletionTool.tools,
|
|
1842
|
-
},
|
|
1843
|
-
toolExecution: "parallel",
|
|
1844
|
-
streamFn: async (requestModel, context, streamOptions) => {
|
|
1845
|
-
const currentResult = deletionTool.getValidatedResult();
|
|
1846
|
-
if (contextCompactionTargetMet(currentResult, parameters)) {
|
|
1847
|
-
return createContextCompactionStopStream(requestModel, `Reached the strict ${contextCompactionTargetLabel(parameters)} context-reduction requirement (${currentResult.stats.percentReduction}%); using the validated deletions recorded so far.`);
|
|
1848
|
-
}
|
|
1849
|
-
return streamSimple(requestModel, context, {
|
|
1850
|
-
...streamOptions,
|
|
1851
|
-
maxTokens,
|
|
1852
|
-
apiKey,
|
|
1853
|
-
headers: headers ?? streamOptions?.headers,
|
|
1854
|
-
});
|
|
1855
|
-
},
|
|
1856
|
-
});
|
|
1857
|
-
let lastNudgedProgressKey;
|
|
1858
|
-
const unsubscribeNudge = agent.subscribe((event, eventSignal) => {
|
|
1859
|
-
if (event.type !== "turn_end" || signal?.aborted || eventSignal.aborted)
|
|
1860
|
-
return;
|
|
1861
|
-
if (event.message.role !== "assistant")
|
|
1862
|
-
return;
|
|
1863
|
-
if (event.message.stopReason === "error" || event.message.stopReason === "aborted")
|
|
1864
|
-
return;
|
|
1865
|
-
if (event.message.content.some((content) => content.type === "toolCall"))
|
|
1866
|
-
return;
|
|
1867
|
-
const currentResult = deletionTool.getValidatedResult();
|
|
1868
|
-
if (contextCompactionTargetMet(currentResult, parameters))
|
|
1869
|
-
return;
|
|
1870
|
-
const progressKey = contextCompactionProgressKey(currentResult);
|
|
1871
|
-
if (progressKey === lastNudgedProgressKey)
|
|
1872
|
-
return;
|
|
1873
|
-
lastNudgedProgressKey = progressKey;
|
|
1874
|
-
agent.followUp(createContextCompactionTargetNudgeMessage(currentResult, parameters));
|
|
1875
|
-
});
|
|
1876
|
-
const abortOnSignal = () => agent.abort();
|
|
1877
|
-
signal?.addEventListener("abort", abortOnSignal, { once: true });
|
|
1878
|
-
try {
|
|
1879
|
-
await agent.prompt(promptMessage);
|
|
1880
|
-
}
|
|
1881
|
-
catch (error) {
|
|
1882
|
-
if (signal?.aborted) {
|
|
1883
|
-
throw new Error("Context compaction failed: Request was aborted");
|
|
1884
|
-
}
|
|
1885
|
-
throw new Error(`Context compaction failed: ${formatCopilotProviderError(model.provider, formatErrorMessage(error))}`);
|
|
1886
|
-
}
|
|
1887
|
-
finally {
|
|
1888
|
-
signal?.removeEventListener("abort", abortOnSignal);
|
|
1889
|
-
unsubscribeNudge();
|
|
1890
|
-
transcriptFile.cleanup();
|
|
1891
|
-
}
|
|
1892
|
-
if (signal?.aborted) {
|
|
1893
|
-
throw new Error("Context compaction failed: Request was aborted");
|
|
1894
|
-
}
|
|
1895
|
-
if (agent.state.errorMessage) {
|
|
1896
|
-
const formattedErrorMessage = formatCopilotProviderError(model.provider, agent.state.errorMessage);
|
|
1897
|
-
if (isContextCompactionOverflowError(model, agent.state.errorMessage)) {
|
|
1898
|
-
return {
|
|
1899
|
-
validatedResult: deletionTool.getValidatedResult(),
|
|
1900
|
-
lastToolError: deletionTool.getLastError(),
|
|
1901
|
-
providerError: formattedErrorMessage === agent.state.errorMessage ? undefined : formattedErrorMessage,
|
|
1902
|
-
};
|
|
1903
|
-
}
|
|
1904
|
-
throw new Error(`Context compaction failed: ${formattedErrorMessage}`);
|
|
1905
|
-
}
|
|
1906
|
-
if (deletionTool.getCallCount() === 0) {
|
|
1907
|
-
throw new Error(`Context compaction did not call any transcript inspection, budget, or deletion tools (${CONTEXT_SEARCH_TRANSCRIPT_TOOL_NAME}, ${CONTEXT_READ_ENTRY_TOOL_NAME}, ${CONTEXT_COMPACTION_BUDGET_TOOL_NAME}, ${CONTEXT_DELETE_TOOL_NAME}, or ${CONTEXT_GREP_DELETE_TOOL_NAME})`);
|
|
1908
|
-
}
|
|
1909
|
-
return {
|
|
1910
|
-
validatedResult: deletionTool.getValidatedResult(),
|
|
1911
|
-
lastToolError: deletionTool.getLastError(),
|
|
1912
|
-
providerError: undefined,
|
|
1913
|
-
};
|
|
1914
|
-
}
|
|
1915
|
-
function hasMetContextCompactionTarget(run, parameters) {
|
|
1916
|
-
return contextCompactionTargetMet(run.validatedResult, parameters);
|
|
1917
|
-
}
|
|
1918
|
-
function formatContextCompactionTargetFailureMessage(attempts, parameters) {
|
|
1919
|
-
const targetLabel = contextCompactionTargetLabel(parameters);
|
|
1920
|
-
if (attempts.length === 0) {
|
|
1921
|
-
return `Context compaction did not meet the strict ${targetLabel} reduction requirement`;
|
|
1922
|
-
}
|
|
1923
|
-
const attemptDetails = attempts
|
|
1924
|
-
.map((attempt) => {
|
|
1925
|
-
const reduction = contextCompactionProgressPercent(attempt.validatedResult);
|
|
1926
|
-
const deletionCount = attempt.validatedResult?.deletedTargets.length ?? 0;
|
|
1927
|
-
const toolErrorText = attempt.lastToolError ? `; last deletion tool error: ${attempt.lastToolError}` : "";
|
|
1928
|
-
const providerErrorText = attempt.providerError ? `; provider error: ${attempt.providerError}` : "";
|
|
1929
|
-
return `attempt reached ${reduction}% with ${deletionCount} validated deletion target(s)${toolErrorText}${providerErrorText}`;
|
|
1930
|
-
})
|
|
1931
|
-
.join("; ");
|
|
1932
|
-
return `Context compaction did not meet the strict ${targetLabel} reduction requirement; ${attemptDetails}`;
|
|
1933
|
-
}
|
|
1934
|
-
export async function contextCompact(preparation, model, apiKey, headers, signal, thinkingLevel = "off") {
|
|
1935
|
-
const parameters = normalizeContextCompactionParameters(preparation.parameters ?? preparation.transcript.parameters, preparation.parameters?.query ?? preparation.transcript.parameters?.query ?? CONTEXT_COMPACTION_AUTO_QUERY);
|
|
1936
|
-
const transcript = { ...preparation.transcript, parameters };
|
|
1937
|
-
const attempts = [];
|
|
1938
|
-
const standardRun = await runContextDeletionAssistant(transcript, model, apiKey, headers, signal, thinkingLevel, parameters);
|
|
1939
|
-
if (hasMetContextCompactionTarget(standardRun, parameters))
|
|
1940
|
-
return standardRun.validatedResult;
|
|
1941
|
-
attempts.push({ ...standardRun });
|
|
1942
|
-
throw new Error(formatContextCompactionTargetFailureMessage(attempts, parameters));
|
|
1943
|
-
}
|
|
1
|
+
export { CONTEXT_COMPACTION_AUTO_QUERY, CONTEXT_COMPACTION_DEFAULT_COMPRESSION_RATIO, CONTEXT_COMPACTION_DEFAULT_PRESERVE_RECENT, CONTEXT_COMPACTION_PROMPT_VERSION, CONTEXT_COMPACTION_TARGET_REDUCTION_PERCENT, } from "./context-compaction-types.js";
|
|
2
|
+
export { normalizeContextCompactionParameters } from "./context-compaction-strategy.js";
|
|
3
|
+
export { autoDetectContextCompactionQuery, prepareContextCompaction, } from "./context-transcript-analysis.js";
|
|
4
|
+
export { validateContextDeletionRequest } from "./context-deletion-application.js";
|
|
5
|
+
export { createContextDeletionTool } from "./context-deletion-tools.js";
|
|
6
|
+
export { buildContextCompactionPrompt } from "./context-compaction-prompt.js";
|
|
7
|
+
export { contextCompact } from "./context-compaction-runner.js";
|
|
1944
8
|
//# sourceMappingURL=context-compaction.js.map
|