@pentoshi/clai 3.9.2 → 3.9.4
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/dist/agent/compaction-attempt.d.ts +22 -0
- package/dist/agent/compaction-attempt.js +69 -0
- package/dist/agent/compaction-attempt.js.map +1 -0
- package/dist/agent/compaction-summary.d.ts +27 -0
- package/dist/agent/compaction-summary.js +62 -0
- package/dist/agent/compaction-summary.js.map +1 -1
- package/dist/agent/context-breakdown.d.ts +2 -0
- package/dist/agent/context-breakdown.js +37 -0
- package/dist/agent/context-breakdown.js.map +1 -1
- package/dist/agent/context-manager.d.ts +7 -1
- package/dist/agent/context-manager.js +64 -15
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/continue-orient.d.ts +8 -0
- package/dist/agent/continue-orient.js +26 -3
- package/dist/agent/continue-orient.js.map +1 -1
- package/dist/agent/durable-envelope.d.ts +39 -0
- package/dist/agent/durable-envelope.js +195 -0
- package/dist/agent/durable-envelope.js.map +1 -0
- package/dist/agent/events.d.ts +21 -0
- package/dist/agent/loop-guard.d.ts +13 -5
- package/dist/agent/loop-guard.js +114 -1
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/outcomes.d.ts +29 -0
- package/dist/agent/outcomes.js +118 -3
- package/dist/agent/outcomes.js.map +1 -1
- package/dist/agent/plan-decision.js +8 -3
- package/dist/agent/plan-decision.js.map +1 -1
- package/dist/agent/plan-tool.d.ts +5 -0
- package/dist/agent/plan-tool.js +166 -6
- package/dist/agent/plan-tool.js.map +1 -1
- package/dist/agent/reliability-policy.d.ts +11 -6
- package/dist/agent/reliability-policy.js +19 -13
- package/dist/agent/reliability-policy.js.map +1 -1
- package/dist/agent/request-budget.d.ts +24 -0
- package/dist/agent/request-budget.js +59 -0
- package/dist/agent/request-budget.js.map +1 -0
- package/dist/agent/responder-context.js +2 -2
- package/dist/agent/responder-context.js.map +1 -1
- package/dist/agent/responder-parent.d.ts +30 -0
- package/dist/agent/responder-parent.js +82 -0
- package/dist/agent/responder-parent.js.map +1 -0
- package/dist/agent/runner.d.ts +15 -2
- package/dist/agent/runner.js +766 -213
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/scope-context.d.ts +5 -0
- package/dist/agent/scope-context.js +7 -1
- package/dist/agent/scope-context.js.map +1 -1
- package/dist/agent/session-policy.js +1 -0
- package/dist/agent/session-policy.js.map +1 -1
- package/dist/agent/stop-summary.js +13 -7
- package/dist/agent/stop-summary.js.map +1 -1
- package/dist/agent/task-analyzer.js +7 -3
- package/dist/agent/task-analyzer.js.map +1 -1
- package/dist/agent/task-evidence.js +2 -0
- package/dist/agent/task-evidence.js.map +1 -1
- package/dist/agent/task-sync.d.ts +11 -0
- package/dist/agent/task-sync.js +31 -0
- package/dist/agent/task-sync.js.map +1 -1
- package/dist/agent/tool-call-parser.d.ts +6 -13
- package/dist/agent/tool-call-parser.js +186 -82
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/agent/tool-history.d.ts +8 -2
- package/dist/agent/tool-history.js +8 -1
- package/dist/agent/tool-history.js.map +1 -1
- package/dist/agent/turn-outcome.d.ts +4 -1
- package/dist/agent/turn-outcome.js +16 -2
- package/dist/agent/turn-outcome.js.map +1 -1
- package/dist/app/adapters/agent-event-adapter.js +27 -0
- package/dist/app/adapters/agent-event-adapter.js.map +1 -1
- package/dist/app/adapters/current-agent-adapter.js +1 -0
- package/dist/app/adapters/current-agent-adapter.js.map +1 -1
- package/dist/app/adapters/current-interactive-sessions-adapter.d.ts +4 -0
- package/dist/app/adapters/current-interactive-sessions-adapter.js +11 -0
- package/dist/app/adapters/current-interactive-sessions-adapter.js.map +1 -0
- package/dist/app/adapters/current-jobs-adapter.js +4 -3
- package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
- package/dist/app/adapters/current-store-adapter.js +4 -3
- package/dist/app/adapters/current-store-adapter.js.map +1 -1
- package/dist/app/adapters/current-updates-adapter.d.ts +1 -1
- package/dist/app/adapters/current-updates-adapter.js +34 -5
- package/dist/app/adapters/current-updates-adapter.js.map +1 -1
- package/dist/app/adapters/quiet-meta-tools.js +2 -1
- package/dist/app/adapters/quiet-meta-tools.js.map +1 -1
- package/dist/app/controllers/cancel-all-result.d.ts +8 -0
- package/dist/app/controllers/cancel-all-result.js +32 -0
- package/dist/app/controllers/cancel-all-result.js.map +1 -0
- package/dist/app/controllers/job-controller.d.ts +4 -3
- package/dist/app/controllers/job-controller.js +9 -6
- package/dist/app/controllers/job-controller.js.map +1 -1
- package/dist/app/controllers/plan-controller.js +14 -0
- package/dist/app/controllers/plan-controller.js.map +1 -1
- package/dist/app/controllers/responder-settlement.js +2 -2
- package/dist/app/controllers/responder-settlement.js.map +1 -1
- package/dist/app/controllers/session-compact-helper.d.ts +23 -1
- package/dist/app/controllers/session-compact-helper.js +117 -7
- package/dist/app/controllers/session-compact-helper.js.map +1 -1
- package/dist/app/controllers/session-context-usage.d.ts +24 -0
- package/dist/app/controllers/session-context-usage.js +89 -0
- package/dist/app/controllers/session-context-usage.js.map +1 -0
- package/dist/app/controllers/session-controller.d.ts +25 -17
- package/dist/app/controllers/session-controller.js +142 -128
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/session-prompt-queue.d.ts +3 -0
- package/dist/app/controllers/session-prompt-queue.js +20 -1
- package/dist/app/controllers/session-prompt-queue.js.map +1 -1
- package/dist/app/controllers/session-responder.js +16 -6
- package/dist/app/controllers/session-responder.js.map +1 -1
- package/dist/app/controllers/session-turn-request.d.ts +18 -0
- package/dist/app/controllers/session-turn-request.js +31 -0
- package/dist/app/controllers/session-turn-request.js.map +1 -0
- package/dist/app/controllers/turn-continuation.d.ts +14 -0
- package/dist/app/controllers/turn-continuation.js +46 -0
- package/dist/app/controllers/turn-continuation.js.map +1 -0
- package/dist/app/events/app-event.d.ts +21 -0
- package/dist/app/events/app-event.js +1 -0
- package/dist/app/events/app-event.js.map +1 -1
- package/dist/app/ports/agent-port.d.ts +7 -0
- package/dist/app/ports/interactive-sessions-port.d.ts +21 -0
- package/dist/app/ports/interactive-sessions-port.js +9 -0
- package/dist/app/ports/interactive-sessions-port.js.map +1 -0
- package/dist/app/ports/jobs-port.d.ts +4 -3
- package/dist/app/ports/persistence-port.d.ts +11 -0
- package/dist/app/ports/updates-port.d.ts +8 -0
- package/dist/attachments/service.js +13 -2
- package/dist/attachments/service.js.map +1 -1
- package/dist/commands/providers.js +13 -10
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.js +14 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +21 -8
- package/dist/index.js.map +1 -1
- package/dist/interactive-session/artifact-writer.d.ts +54 -0
- package/dist/interactive-session/artifact-writer.js +161 -0
- package/dist/interactive-session/artifact-writer.js.map +1 -0
- package/dist/interactive-session/cleanup.d.ts +36 -0
- package/dist/interactive-session/cleanup.js +157 -0
- package/dist/interactive-session/cleanup.js.map +1 -0
- package/dist/interactive-session/config.d.ts +118 -0
- package/dist/interactive-session/config.js +141 -0
- package/dist/interactive-session/config.js.map +1 -0
- package/dist/interactive-session/input-policy.d.ts +41 -0
- package/dist/interactive-session/input-policy.js +163 -0
- package/dist/interactive-session/input-policy.js.map +1 -0
- package/dist/interactive-session/manager.d.ts +107 -0
- package/dist/interactive-session/manager.js +927 -0
- package/dist/interactive-session/manager.js.map +1 -0
- package/dist/interactive-session/output-store.d.ts +81 -0
- package/dist/interactive-session/output-store.js +239 -0
- package/dist/interactive-session/output-store.js.map +1 -0
- package/dist/interactive-session/output-view.d.ts +20 -0
- package/dist/interactive-session/output-view.js +142 -0
- package/dist/interactive-session/output-view.js.map +1 -0
- package/dist/interactive-session/recovery-journal.d.ts +55 -0
- package/dist/interactive-session/recovery-journal.js +115 -0
- package/dist/interactive-session/recovery-journal.js.map +1 -0
- package/dist/interactive-session/registry.d.ts +59 -0
- package/dist/interactive-session/registry.js +170 -0
- package/dist/interactive-session/registry.js.map +1 -0
- package/dist/interactive-session/runtime.d.ts +107 -0
- package/dist/interactive-session/runtime.js +191 -0
- package/dist/interactive-session/runtime.js.map +1 -0
- package/dist/interactive-session/session-runtime.d.ts +50 -0
- package/dist/interactive-session/session-runtime.js +63 -0
- package/dist/interactive-session/session-runtime.js.map +1 -0
- package/dist/interactive-session/streaming-redactor.d.ts +53 -0
- package/dist/interactive-session/streaming-redactor.js +263 -0
- package/dist/interactive-session/streaming-redactor.js.map +1 -0
- package/dist/interactive-session/telemetry.d.ts +30 -0
- package/dist/interactive-session/telemetry.js +47 -0
- package/dist/interactive-session/telemetry.js.map +1 -0
- package/dist/interactive-session/transport-factory.d.ts +8 -0
- package/dist/interactive-session/transport-factory.js +16 -0
- package/dist/interactive-session/transport-factory.js.map +1 -0
- package/dist/interactive-session/transport-node-pty.d.ts +49 -0
- package/dist/interactive-session/transport-node-pty.js +219 -0
- package/dist/interactive-session/transport-node-pty.js.map +1 -0
- package/dist/interactive-session/transport-pipe.d.ts +9 -0
- package/dist/interactive-session/transport-pipe.js +215 -0
- package/dist/interactive-session/transport-pipe.js.map +1 -0
- package/dist/interactive-session/transport.d.ts +104 -0
- package/dist/interactive-session/transport.js +89 -0
- package/dist/interactive-session/transport.js.map +1 -0
- package/dist/interactive-session/types.d.ts +254 -0
- package/dist/interactive-session/types.js +191 -0
- package/dist/interactive-session/types.js.map +1 -0
- package/dist/llm/adapters/anthropic-tools.d.ts +14 -1
- package/dist/llm/adapters/anthropic-tools.js +36 -5
- package/dist/llm/adapters/anthropic-tools.js.map +1 -1
- package/dist/llm/adapters/gemini-tools.d.ts +3 -1
- package/dist/llm/adapters/gemini-tools.js +5 -2
- package/dist/llm/adapters/gemini-tools.js.map +1 -1
- package/dist/llm/adapters/ollama-tools.js +8 -3
- package/dist/llm/adapters/ollama-tools.js.map +1 -1
- package/dist/llm/adapters/openai-tools.js +8 -1
- package/dist/llm/adapters/openai-tools.js.map +1 -1
- package/dist/llm/agentrouter.js +2 -0
- package/dist/llm/agentrouter.js.map +1 -1
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.js +68 -9
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +60 -12
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/bynara.js +2 -0
- package/dist/llm/bynara.js.map +1 -1
- package/dist/llm/capabilities.d.ts +7 -0
- package/dist/llm/capabilities.js +22 -0
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/gemini.d.ts +3 -0
- package/dist/llm/gemini.js +71 -11
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/groq.d.ts +20 -1
- package/dist/llm/groq.js +32 -4
- package/dist/llm/groq.js.map +1 -1
- package/dist/llm/http.d.ts +29 -0
- package/dist/llm/http.js +122 -29
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/kimchi.js +2 -0
- package/dist/llm/kimchi.js.map +1 -1
- package/dist/llm/nvidia.js +2 -0
- package/dist/llm/nvidia.js.map +1 -1
- package/dist/llm/ollama.d.ts +5 -0
- package/dist/llm/ollama.js +53 -6
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openai.js +2 -0
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/openrouter.js +2 -0
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/qwen-cloud.js +2 -0
- package/dist/llm/qwen-cloud.js.map +1 -1
- package/dist/llm/router.d.ts +16 -0
- package/dist/llm/router.js +79 -23
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/sampling.d.ts +32 -0
- package/dist/llm/sampling.js +48 -0
- package/dist/llm/sampling.js.map +1 -0
- package/dist/llm/stream-progress.d.ts +4 -0
- package/dist/llm/stream-progress.js +43 -0
- package/dist/llm/stream-progress.js.map +1 -0
- package/dist/llm/system-messages.d.ts +29 -0
- package/dist/llm/system-messages.js +51 -0
- package/dist/llm/system-messages.js.map +1 -0
- package/dist/llm/token-usage.d.ts +4 -1
- package/dist/llm/token-usage.js +56 -4
- package/dist/llm/token-usage.js.map +1 -1
- package/dist/llm/tool-protocol.js +30 -0
- package/dist/llm/tool-protocol.js.map +1 -1
- package/dist/os/process-identity.d.ts +46 -0
- package/dist/os/process-identity.js +147 -0
- package/dist/os/process-identity.js.map +1 -0
- package/dist/os/process-tree.d.ts +15 -0
- package/dist/os/process-tree.js +77 -0
- package/dist/os/process-tree.js.map +1 -0
- package/dist/prompts/embedded.js +1 -1
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/system.agent.md +13 -12
- package/dist/repl/prompt-line.d.ts +5 -0
- package/dist/repl/prompt-line.js +7 -1
- package/dist/repl/prompt-line.js.map +1 -1
- package/dist/repl.js +71 -41
- package/dist/repl.js.map +1 -1
- package/dist/safety/classifier.js +98 -44
- package/dist/safety/classifier.js.map +1 -1
- package/dist/safety/engagement-policy.d.ts +8 -0
- package/dist/safety/engagement-policy.js +52 -7
- package/dist/safety/engagement-policy.js.map +1 -1
- package/dist/safety/patterns.d.ts +44 -0
- package/dist/safety/patterns.js +168 -37
- package/dist/safety/patterns.js.map +1 -1
- package/dist/store/config.d.ts +9 -1
- package/dist/store/config.js +51 -1
- package/dist/store/config.js.map +1 -1
- package/dist/store/history-index.d.ts +12 -0
- package/dist/store/history-index.js +47 -18
- package/dist/store/history-index.js.map +1 -1
- package/dist/store/history.d.ts +5 -2
- package/dist/store/history.js +153 -62
- package/dist/store/history.js.map +1 -1
- package/dist/store/plan.d.ts +81 -5
- package/dist/store/plan.js +406 -46
- package/dist/store/plan.js.map +1 -1
- package/dist/store/redaction-cache.d.ts +12 -0
- package/dist/store/redaction-cache.js +51 -0
- package/dist/store/redaction-cache.js.map +1 -0
- package/dist/store/responder-settlement.d.ts +5 -1
- package/dist/store/responder-settlement.js +42 -30
- package/dist/store/responder-settlement.js.map +1 -1
- package/dist/store/scope.js +36 -27
- package/dist/store/scope.js.map +1 -1
- package/dist/store/task-transitions.d.ts +19 -0
- package/dist/store/task-transitions.js +46 -0
- package/dist/store/task-transitions.js.map +1 -0
- package/dist/tools/capabilities.js +33 -18
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/command-intent.d.ts +24 -0
- package/dist/tools/command-intent.js +158 -4
- package/dist/tools/command-intent.js.map +1 -1
- package/dist/tools/definitions.d.ts +5 -1
- package/dist/tools/definitions.js +257 -21
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/fs.d.ts +16 -0
- package/dist/tools/fs.js +122 -46
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/image.js +1 -1
- package/dist/tools/image.js.map +1 -1
- package/dist/tools/interactive-session-tools.d.ts +11 -0
- package/dist/tools/interactive-session-tools.js +261 -0
- package/dist/tools/interactive-session-tools.js.map +1 -0
- package/dist/tools/jobs.d.ts +78 -4
- package/dist/tools/jobs.js +486 -127
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/net-ping-sweep.d.ts +3 -1
- package/dist/tools/net-ping-sweep.js +64 -26
- package/dist/tools/net-ping-sweep.js.map +1 -1
- package/dist/tools/nmap-runner.js +5 -2
- package/dist/tools/nmap-runner.js.map +1 -1
- package/dist/tools/pdf.js +50 -7
- package/dist/tools/pdf.js.map +1 -1
- package/dist/tools/registry.js +158 -96
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell.d.ts +24 -2
- package/dist/tools/shell.js +113 -28
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/tool-types.d.ts +2 -0
- package/dist/tools/validate.d.ts +8 -5
- package/dist/tools/validate.js +177 -7
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/wordlists.js +69 -17
- package/dist/tools/wordlists.js.map +1 -1
- package/dist/tui/state.d.ts +4 -0
- package/dist/tui/state.js +88 -2
- package/dist/tui/state.js.map +1 -1
- package/dist/tui-v2/actions/keymap.js +3 -8
- package/dist/tui-v2/actions/keymap.js.map +1 -1
- package/dist/tui-v2/app/App.js +52 -4
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/app/commands/config-commands.js +5 -2
- package/dist/tui-v2/app/commands/config-commands.js.map +1 -1
- package/dist/tui-v2/app/commands/picker-commands.js +3 -0
- package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
- package/dist/tui-v2/app/plan-lifecycle.d.ts +1 -1
- package/dist/tui-v2/app/plan-lifecycle.js +2 -1
- package/dist/tui-v2/app/plan-lifecycle.js.map +1 -1
- package/dist/tui-v2/bootstrap/composition-root.d.ts +3 -0
- package/dist/tui-v2/bootstrap/composition-root.js +3 -0
- package/dist/tui-v2/bootstrap/composition-root.js.map +1 -1
- package/dist/tui-v2/bootstrap/start-tui-v2.js +10 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
- package/dist/tui-v2/components/composer/composer-input-box.d.ts +1 -1
- package/dist/tui-v2/components/composer/composer-input-box.js +12 -3
- package/dist/tui-v2/components/composer/composer-input-box.js.map +1 -1
- package/dist/tui-v2/components/jobs/jobs-panel.js +19 -6
- package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
- package/dist/tui-v2/components/plan/plan-view.js +9 -6
- package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
- package/dist/tui-v2/components/status/status-line.d.ts +15 -0
- package/dist/tui-v2/components/status/status-line.js +33 -25
- package/dist/tui-v2/components/status/status-line.js.map +1 -1
- package/dist/tui-v2/components/transcript/assistant-message.js +17 -9
- package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
- package/dist/tui-v2/components/transcript/compacted-row.js +49 -22
- package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/intro-card.js +3 -0
- package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/thinking-block.js +2 -1
- package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-view.js +27 -2
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
- package/dist/tui-v2/components/transcript/use-transcript-selection.js +57 -6
- package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.js +12 -6
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/tui-v2/rendering/incremental-strip.d.ts +11 -0
- package/dist/tui-v2/rendering/incremental-strip.js +89 -0
- package/dist/tui-v2/rendering/incremental-strip.js.map +1 -0
- package/dist/tui-v2/rendering/plan-view.d.ts +12 -0
- package/dist/tui-v2/rendering/plan-view.js +71 -2
- package/dist/tui-v2/rendering/plan-view.js.map +1 -1
- package/dist/tui-v2/rendering/streaming-markdown.d.ts +25 -0
- package/dist/tui-v2/rendering/streaming-markdown.js +108 -0
- package/dist/tui-v2/rendering/streaming-markdown.js.map +1 -0
- package/dist/tui-v2/rendering/thinking-tail.d.ts +5 -0
- package/dist/tui-v2/rendering/thinking-tail.js +26 -0
- package/dist/tui-v2/rendering/thinking-tail.js.map +1 -0
- package/dist/tui-v2/state/transcript-hydrate.js +6 -2
- package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
- package/dist/tui-v2/state/transcript-reducer.js +146 -25
- package/dist/tui-v2/state/transcript-reducer.js.map +1 -1
- package/dist/tui-v2/state/transcript-types.d.ts +6 -0
- package/dist/tui-v2/state/transcript-types.js +17 -0
- package/dist/tui-v2/state/transcript-types.js.map +1 -1
- package/dist/types.d.ts +34 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/intro-header.d.ts +1 -0
- package/dist/ui/intro-header.js +10 -13
- package/dist/ui/intro-header.js.map +1 -1
- package/dist/ui/markdown.js +9 -2
- package/dist/ui/markdown.js.map +1 -1
- package/dist/ui/mentions.d.ts +5 -0
- package/dist/ui/mentions.js +66 -7
- package/dist/ui/mentions.js.map +1 -1
- package/dist/ui/thinking.d.ts +5 -1
- package/dist/ui/thinking.js +3 -2
- package/dist/ui/thinking.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +2 -1
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Summarizer callback used by SessionController.compact (keeps the controller slim).
|
|
3
3
|
*/
|
|
4
|
-
import type { ProviderId } from "../../types.js";
|
|
4
|
+
import type { ChatMessage, ProviderId } from "../../types.js";
|
|
5
|
+
import { type CompactResult } from "../../agent/context-manager.js";
|
|
6
|
+
import type { AnyAppEvent } from "../events/app-event.js";
|
|
7
|
+
import type { EventSequencer } from "../events/sequencer.js";
|
|
5
8
|
export declare function summarizeForSessionCompact(prompt: string, opts: {
|
|
6
9
|
provider: ProviderId | undefined;
|
|
7
10
|
model: string | undefined;
|
|
8
11
|
signal?: AbortSignal | undefined;
|
|
9
12
|
/** plan-implement needs denser handoff memory — allow a larger completion. */
|
|
10
13
|
purpose?: "default" | "plan-implement" | undefined;
|
|
14
|
+
onToken?: ((token: string) => void) | undefined;
|
|
11
15
|
}): Promise<string>;
|
|
16
|
+
interface RunSessionCompactionOptions {
|
|
17
|
+
readonly history: ChatMessage[];
|
|
18
|
+
readonly sessionTranscript?: string | undefined;
|
|
19
|
+
readonly keepRecent: number;
|
|
20
|
+
readonly signal: AbortSignal;
|
|
21
|
+
readonly purpose?: "default" | "plan-implement" | undefined;
|
|
22
|
+
readonly provider: ProviderId | undefined;
|
|
23
|
+
readonly model: string | undefined;
|
|
24
|
+
readonly persist: boolean;
|
|
25
|
+
readonly compactionId: string;
|
|
26
|
+
readonly sequencer: EventSequencer;
|
|
27
|
+
readonly emit: (event: AnyAppEvent) => void;
|
|
28
|
+
readonly isCurrent: () => boolean;
|
|
29
|
+
readonly commit: (result: CompactResult) => void;
|
|
30
|
+
readonly persistNow: () => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export declare function runSessionCompaction(options: RunSessionCompactionOptions): Promise<CompactResult>;
|
|
33
|
+
export {};
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Summarizer callback used by SessionController.compact (keeps the controller slim).
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { compactMessagesWithSummary, estimateMessagesTokens, isCompactionMemoryMessage, } from "../../agent/context-manager.js";
|
|
5
|
+
import { completeWithProvider, streamWithProvider } from "../../llm/router.js";
|
|
6
|
+
import { createThinkingStreamParser, stripThinking, } from "../../ui/thinking.js";
|
|
5
7
|
export async function summarizeForSessionCompact(prompt, opts) {
|
|
6
8
|
const maxTokens = 2_048;
|
|
7
9
|
const systemContent = opts.purpose === "plan-implement"
|
|
8
10
|
? "Write concise, non-redundant research memory for an agent executing an approved plan. Do not add framing: the PLAN MODE HANDOFF wrapper and active plan are injected separately. For coding target 600–1000 tokens; preserve only verified state, reusable research/artifacts, decisions, blockers, and risks. Security handoffs may be longer to preserve findings and coverage. Never invent or cut a fact mid-token. You are summarizing, not continuing: never emit tool calls or fabricate tool results, file receipts, or transcript lines."
|
|
9
11
|
: "You compress conversation history into accurate continuation memory. You are SUMMARIZING the past session, not continuing it: do not answer the user, do not perform the next task, and never emit tool calls or fabricate tool results, file-write receipts (bytes/lines/sha256), exit codes, or 'TOOL:'/'[tools: …]' transcript lines. Describe what already happened in your own words.";
|
|
10
|
-
const completeSummary = async (p) => {
|
|
11
|
-
const
|
|
12
|
+
const completeSummary = async (p, onToken) => {
|
|
13
|
+
const request = {
|
|
12
14
|
provider: opts.provider,
|
|
13
15
|
model: opts.model,
|
|
14
16
|
messages: [
|
|
@@ -21,12 +23,44 @@ export async function summarizeForSessionCompact(prompt, opts) {
|
|
|
21
23
|
temperature: 0.1,
|
|
22
24
|
maxTokens,
|
|
23
25
|
signal: opts.signal,
|
|
26
|
+
};
|
|
27
|
+
let rawSummary;
|
|
28
|
+
if (!onToken) {
|
|
29
|
+
rawSummary = (await completeWithProvider(request)).text;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const parser = createThinkingStreamParser(onToken, undefined, {
|
|
33
|
+
remember: false,
|
|
34
|
+
});
|
|
35
|
+
const response = await streamWithProvider(request, (token) => parser.push(token), { onStatus: () => undefined });
|
|
36
|
+
parser.finish();
|
|
37
|
+
rawSummary = response.text;
|
|
38
|
+
}
|
|
39
|
+
const parsed = stripThinking(rawSummary);
|
|
40
|
+
if (parsed.visible.trim() || !parsed.hasThinking)
|
|
41
|
+
return rawSummary;
|
|
42
|
+
const retry = await completeWithProvider({
|
|
43
|
+
...request,
|
|
44
|
+
messages: [
|
|
45
|
+
{
|
|
46
|
+
role: "system",
|
|
47
|
+
content: `${systemContent}\nReturn only the continuation-memory summary. Do not include analysis, reasoning, or <think> tags.`,
|
|
48
|
+
},
|
|
49
|
+
{ role: "user", content: p },
|
|
50
|
+
],
|
|
51
|
+
temperature: 0,
|
|
52
|
+
maxTokens: 8_192,
|
|
53
|
+
thinking: { enabled: false, effort: "none" },
|
|
24
54
|
});
|
|
25
|
-
|
|
55
|
+
const retryVisible = stripThinking(retry.text).visible.trim();
|
|
56
|
+
if (retryVisible && onToken)
|
|
57
|
+
onToken(retryVisible);
|
|
58
|
+
return retry.text;
|
|
26
59
|
};
|
|
27
60
|
const chunkSize = 50_000;
|
|
28
|
-
if (prompt.length <= chunkSize)
|
|
29
|
-
return completeSummary(prompt);
|
|
61
|
+
if (prompt.length <= chunkSize) {
|
|
62
|
+
return completeSummary(prompt, opts.onToken);
|
|
63
|
+
}
|
|
30
64
|
const chunks = Array.from({ length: Math.ceil(prompt.length / chunkSize) }, (_, index) => prompt.slice(index * chunkSize, (index + 1) * chunkSize));
|
|
31
65
|
const partials = [];
|
|
32
66
|
for (let index = 0; index < chunks.length; index += 1) {
|
|
@@ -40,6 +74,82 @@ export async function summarizeForSessionCompact(prompt, opts) {
|
|
|
40
74
|
? "Merge these ordered partial plan-mode research memories into one non-redundant implement handoff. Use sections: User goals, Research evidence, Coverage ledger, Confirmed findings, Negative/tested-OK, Untested/open, Artifacts, Durable rules, Plan-mode-only notes, Commands/tools, Current state, Remaining work, Open risks. Complete every fact; never cut mid-token.\n\n" +
|
|
41
75
|
partials.map((part, index) => `PART ${index + 1}:\n${part}`).join("\n\n")
|
|
42
76
|
: "Merge these ordered partial session memories into one non-redundant continuation memory. Preserve all concrete facts and unresolved work. Use sections: User goals, Decisions and constraints, Work completed, Commands/tools and results, Current state, Remaining work.\n\n" +
|
|
43
|
-
partials.map((part, index) => `PART ${index + 1}:\n${part}`).join("\n\n"));
|
|
77
|
+
partials.map((part, index) => `PART ${index + 1}:\n${part}`).join("\n\n"), opts.onToken);
|
|
78
|
+
}
|
|
79
|
+
export async function runSessionCompaction(options) {
|
|
80
|
+
const emit = (type, payload) => {
|
|
81
|
+
options.emit(options.sequencer.build(type, payload, undefined));
|
|
82
|
+
};
|
|
83
|
+
const beforeTokens = estimateMessagesTokens(options.history);
|
|
84
|
+
if (options.persist) {
|
|
85
|
+
emit("compaction-started", {
|
|
86
|
+
compactionId: options.compactionId,
|
|
87
|
+
beforeTokens,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
let settled = false;
|
|
91
|
+
try {
|
|
92
|
+
const result = await compactMessagesWithSummary(options.history, (prompt, stage) => summarizeForSessionCompact(prompt, {
|
|
93
|
+
provider: options.provider,
|
|
94
|
+
model: options.model,
|
|
95
|
+
signal: options.signal,
|
|
96
|
+
purpose: options.purpose,
|
|
97
|
+
...(options.persist && stage?.phase !== "map"
|
|
98
|
+
? {
|
|
99
|
+
onToken: (text) => {
|
|
100
|
+
if (options.isCurrent()) {
|
|
101
|
+
emit("compaction-delta", {
|
|
102
|
+
compactionId: options.compactionId,
|
|
103
|
+
text,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
}
|
|
108
|
+
: {}),
|
|
109
|
+
}), {
|
|
110
|
+
budgetTokens: 0,
|
|
111
|
+
keepRecent: options.keepRecent,
|
|
112
|
+
purpose: options.purpose,
|
|
113
|
+
}, options.sessionTranscript);
|
|
114
|
+
if (!options.isCurrent())
|
|
115
|
+
return result;
|
|
116
|
+
options.commit(result);
|
|
117
|
+
if (options.persist && result.summarized) {
|
|
118
|
+
const summary = [...result.messages]
|
|
119
|
+
.reverse()
|
|
120
|
+
.find((message) => isCompactionMemoryMessage(message))?.content ??
|
|
121
|
+
"Compacted context";
|
|
122
|
+
emit("compaction-completed", {
|
|
123
|
+
compactionId: options.compactionId,
|
|
124
|
+
summary,
|
|
125
|
+
beforeTokens: result.beforeTokens,
|
|
126
|
+
afterTokens: result.afterTokens,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else if (options.persist) {
|
|
130
|
+
emit("compaction-failed", {
|
|
131
|
+
compactionId: options.compactionId,
|
|
132
|
+
message: "There was no closed history to compact.",
|
|
133
|
+
retainedTokens: beforeTokens,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (options.persist)
|
|
137
|
+
settled = true;
|
|
138
|
+
if (options.persist && result.summarized && result.after !== result.before) {
|
|
139
|
+
await options.persistNow();
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (options.persist && !settled && options.isCurrent()) {
|
|
145
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
146
|
+
emit("compaction-failed", {
|
|
147
|
+
compactionId: options.compactionId,
|
|
148
|
+
message: /aborted/i.test(message) ? "Compaction was cancelled." : message,
|
|
149
|
+
retainedTokens: beforeTokens,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
44
154
|
}
|
|
45
155
|
//# sourceMappingURL=session-compact-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-compact-helper.js","sourceRoot":"","sources":["../../../src/app/controllers/session-compact-helper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-compact-helper.js","sourceRoot":"","sources":["../../../src/app/controllers/session-compact-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ContextUsageSnapshot } from "../../llm/token-usage.js";
|
|
2
|
+
import type { ChatMessage, ProviderId, TokenUsage } from "../../types.js";
|
|
3
|
+
export interface ContextUsageTarget {
|
|
4
|
+
readonly provider?: ProviderId | undefined;
|
|
5
|
+
readonly model?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare function contextUsageLimit(target: ContextUsageTarget): number;
|
|
8
|
+
export declare function resolveContextUsageSnapshot(target: ContextUsageTarget, history: readonly ChatMessage[], current: ContextUsageSnapshot | undefined): ContextUsageSnapshot | undefined;
|
|
9
|
+
export declare function recordUsageSnapshot(target: ContextUsageTarget, current: ContextUsageSnapshot | undefined, usage: TokenUsage): ContextUsageSnapshot;
|
|
10
|
+
export declare function compactedUsageSnapshot(target: ContextUsageTarget, current: ContextUsageSnapshot | undefined, history: readonly ChatMessage[], afterTokens?: number): ContextUsageSnapshot;
|
|
11
|
+
export interface ContextProjection {
|
|
12
|
+
contextUsage: ContextUsageSnapshot | undefined;
|
|
13
|
+
contextChip: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
export declare function createContextProjector(formatChip: (snapshot: ContextUsageSnapshot) => string): (target: ContextUsageTarget, history: readonly ChatMessage[], current: ContextUsageSnapshot | undefined) => ContextProjection;
|
|
16
|
+
export interface PartialUsageSnapshot {
|
|
17
|
+
contextTokens: number;
|
|
18
|
+
contextLimit?: number | undefined;
|
|
19
|
+
lastCompletionTokens?: number | undefined;
|
|
20
|
+
sessionPromptTokens?: number | undefined;
|
|
21
|
+
sessionCompletionTokens?: number | undefined;
|
|
22
|
+
exact: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function restoredUsageSnapshot(target: ContextUsageTarget, usage: PartialUsageSnapshot | ContextUsageSnapshot | undefined): ContextUsageSnapshot | undefined;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Context-usage projection for the session footer.
|
|
2
|
+
//
|
|
3
|
+
// The denominator shown to the user is the request budget that governs the next
|
|
4
|
+
// request (auto-compaction trigger), not the raw model window, so the footer
|
|
5
|
+
// agrees with the moment compaction actually fires.
|
|
6
|
+
import { requestBudgetDenominator } from "../../agent/request-budget.js";
|
|
7
|
+
import { estimateMessagesTokens } from "../../agent/context-manager.js";
|
|
8
|
+
import { applyUsageToSnapshot, snapshotFromEstimate, } from "../../llm/token-usage.js";
|
|
9
|
+
// Effective request budget used as the footer denominator.
|
|
10
|
+
export function contextUsageLimit(target) {
|
|
11
|
+
return requestBudgetDenominator(target.provider, target.model);
|
|
12
|
+
}
|
|
13
|
+
// Prefer the last API `prompt_tokens` as context fill (exact); otherwise
|
|
14
|
+
// estimate from current history so the footer always has a number.
|
|
15
|
+
export function resolveContextUsageSnapshot(target, history, current) {
|
|
16
|
+
const contextLimit = contextUsageLimit(target);
|
|
17
|
+
if (current?.exact && current.contextTokens > 0) {
|
|
18
|
+
return { ...current, contextLimit };
|
|
19
|
+
}
|
|
20
|
+
if (history.length === 0 && !current)
|
|
21
|
+
return undefined;
|
|
22
|
+
const estimated = snapshotFromEstimate(history, target.model, target.provider, current);
|
|
23
|
+
return { ...estimated, contextLimit };
|
|
24
|
+
}
|
|
25
|
+
// Fold provider-reported usage into the snapshot against the request budget.
|
|
26
|
+
export function recordUsageSnapshot(target, current, usage) {
|
|
27
|
+
return applyUsageToSnapshot(current, usage, contextUsageLimit(target));
|
|
28
|
+
}
|
|
29
|
+
// After /compact or auto-compact the exact prompt_tokens are stale: report the
|
|
30
|
+
// post-compaction size until the next API usage report.
|
|
31
|
+
export function compactedUsageSnapshot(target, current, history, afterTokens) {
|
|
32
|
+
const estimated = typeof afterTokens === "number" && afterTokens > 0
|
|
33
|
+
? afterTokens
|
|
34
|
+
: estimateMessagesTokens(history);
|
|
35
|
+
return {
|
|
36
|
+
contextTokens: estimated,
|
|
37
|
+
contextLimit: contextUsageLimit(target),
|
|
38
|
+
lastCompletionTokens: 0,
|
|
39
|
+
sessionPromptTokens: current?.sessionPromptTokens ?? 0,
|
|
40
|
+
sessionCompletionTokens: current?.sessionCompletionTokens ?? 0,
|
|
41
|
+
exact: false,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// The estimate walks the whole transcript, so the projection is memoized
|
|
45
|
+
// against the inputs that can change it instead of recomputed per render.
|
|
46
|
+
export function createContextProjector(formatChip) {
|
|
47
|
+
let cache;
|
|
48
|
+
return (target, history, current) => {
|
|
49
|
+
const first = history[0];
|
|
50
|
+
const last = history[history.length - 1];
|
|
51
|
+
const key = [
|
|
52
|
+
target.provider ?? "",
|
|
53
|
+
target.model ?? "",
|
|
54
|
+
history.length,
|
|
55
|
+
first?.content.length ?? 0,
|
|
56
|
+
last?.content.length ?? 0,
|
|
57
|
+
current?.contextTokens ?? -1,
|
|
58
|
+
current?.contextLimit ?? -1,
|
|
59
|
+
current?.lastCompletionTokens ?? -1,
|
|
60
|
+
current?.exact ? 1 : 0,
|
|
61
|
+
].join("|");
|
|
62
|
+
if (cache?.key === key)
|
|
63
|
+
return cache.value;
|
|
64
|
+
const contextUsage = resolveContextUsageSnapshot(target, history, current);
|
|
65
|
+
const value = {
|
|
66
|
+
contextUsage,
|
|
67
|
+
contextChip: contextUsage ? formatChip(contextUsage) : undefined,
|
|
68
|
+
};
|
|
69
|
+
cache = { key, value };
|
|
70
|
+
return value;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Prefer the exact snapshot saved during the live turn; older sessions without
|
|
74
|
+
// a usage payload fall back to an estimate at the call site.
|
|
75
|
+
export function restoredUsageSnapshot(target, usage) {
|
|
76
|
+
if (!usage || usage.contextTokens <= 0)
|
|
77
|
+
return undefined;
|
|
78
|
+
return {
|
|
79
|
+
contextTokens: usage.contextTokens,
|
|
80
|
+
contextLimit: typeof usage.contextLimit === "number" && usage.contextLimit > 0
|
|
81
|
+
? usage.contextLimit
|
|
82
|
+
: contextUsageLimit(target),
|
|
83
|
+
lastCompletionTokens: usage.lastCompletionTokens ?? 0,
|
|
84
|
+
sessionPromptTokens: usage.sessionPromptTokens ?? 0,
|
|
85
|
+
sessionCompletionTokens: usage.sessionCompletionTokens ?? 0,
|
|
86
|
+
exact: usage.exact === true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=session-context-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-context-usage.js","sourceRoot":"","sources":["../../../src/app/controllers/session-context-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { ChatMessage, Mode, ProviderId, TokenUsage, ToolResult } from "../../types.js";
|
|
2
2
|
import { type CompactResult } from "../../agent/context-manager.js";
|
|
3
3
|
import { type ContextUsageSnapshot } from "../../llm/token-usage.js";
|
|
4
|
+
import { type PartialUsageSnapshot } from "./session-context-usage.js";
|
|
5
|
+
import type { PreviousTurnSignal } from "../../agent/continue-orient.js";
|
|
4
6
|
import { type SessionWorkspace } from "../../store/session-workspace.js";
|
|
5
7
|
import type { TranscriptItem as ClassicTranscriptItem } from "../../tui/state.js";
|
|
6
8
|
import { type AnyAppEvent, type SessionId, type TurnId } from "../events/app-event.js";
|
|
@@ -8,6 +10,7 @@ import { type Clock, type IdFactory } from "../events/sequencer.js";
|
|
|
8
10
|
import { OutputSpool } from "../events/event-buffer.js";
|
|
9
11
|
import type { AgentPort } from "../ports/agent-port.js";
|
|
10
12
|
import type { JobsPort } from "../ports/jobs-port.js";
|
|
13
|
+
import type { InteractiveSessionsPort } from "../ports/interactive-sessions-port.js";
|
|
11
14
|
import type { PersistencePort } from "../ports/persistence-port.js";
|
|
12
15
|
import type { ConfirmationPort } from "../ports/confirm-port.js";
|
|
13
16
|
import type { SecretPort } from "../ports/secret-port.js";
|
|
@@ -34,6 +37,7 @@ export interface SessionControllerDeps {
|
|
|
34
37
|
readonly agent: AgentPort;
|
|
35
38
|
readonly persistence: PersistencePort;
|
|
36
39
|
readonly jobs?: JobsPort | undefined;
|
|
40
|
+
readonly interactiveSessions?: InteractiveSessionsPort | undefined;
|
|
37
41
|
readonly emit: (event: AnyAppEvent) => void;
|
|
38
42
|
readonly sessionId?: string | undefined;
|
|
39
43
|
readonly provider?: ProviderId | undefined;
|
|
@@ -82,23 +86,23 @@ export declare class SessionController implements Disposable {
|
|
|
82
86
|
private static readonly AUTOSAVE_MIN_MS;
|
|
83
87
|
/** Last known context / session token totals for the status strip. */
|
|
84
88
|
private contextUsage;
|
|
89
|
+
/** Bumped by reset/history load/dispose so late callbacks can be ignored. */
|
|
90
|
+
private lifecycleGeneration;
|
|
91
|
+
private lastTurnResult;
|
|
92
|
+
private restoredPreviousTurn;
|
|
93
|
+
private activeTurnGeneration;
|
|
94
|
+
private readonly projectContext;
|
|
85
95
|
constructor(deps: SessionControllerDeps);
|
|
86
96
|
/** Current per-session scratch/output workspace (always bound while live). */
|
|
87
97
|
get workspace(): SessionWorkspace | undefined;
|
|
88
98
|
get sessionId(): SessionId;
|
|
89
99
|
getState(): SessionState;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
* from current history so the footer always has a number.
|
|
93
|
-
*/
|
|
100
|
+
private contextUsageProjection;
|
|
101
|
+
private get usageTarget();
|
|
94
102
|
private resolveContextUsage;
|
|
95
103
|
/** Record provider-reported usage (from agent token-usage events). */
|
|
96
104
|
recordTokenUsage(usage: TokenUsage, model?: string): void;
|
|
97
|
-
/**
|
|
98
|
-
* After /compact or auto-compact: history was replaced with a short memory
|
|
99
|
-
* + recent turns. Drop stale exact prompt_tokens so the footer shows the
|
|
100
|
-
* live context size until the next API usage report.
|
|
101
|
-
*/
|
|
105
|
+
/** After /compact or auto-compact, report the post-compaction context size. */
|
|
102
106
|
noteContextCompacted(afterTokens?: number): void;
|
|
103
107
|
/** After history loads, estimate fill until the next API usage report. */
|
|
104
108
|
private refreshEstimatedContext;
|
|
@@ -119,16 +123,11 @@ export declare class SessionController implements Disposable {
|
|
|
119
123
|
* Restored from history so the footer matches the live session count.
|
|
120
124
|
* Accepts partial snapshots (contextLimit optional).
|
|
121
125
|
*/
|
|
122
|
-
contextUsage?: ContextUsageSnapshot |
|
|
123
|
-
contextTokens: number;
|
|
124
|
-
contextLimit?: number | undefined;
|
|
125
|
-
lastCompletionTokens?: number | undefined;
|
|
126
|
-
sessionPromptTokens?: number | undefined;
|
|
127
|
-
sessionCompletionTokens?: number | undefined;
|
|
128
|
-
exact: boolean;
|
|
129
|
-
} | undefined;
|
|
126
|
+
contextUsage?: ContextUsageSnapshot | PartialUsageSnapshot | undefined;
|
|
130
127
|
/** Loaded durable revision; resume advances to a fresh writer generation. */
|
|
131
128
|
persistenceRevision?: number | undefined;
|
|
129
|
+
/** Last turn outcome or interrupted in-flight checkpoint from history. */
|
|
130
|
+
previousTurn?: PreviousTurnSignal | undefined;
|
|
132
131
|
/** Per-session scratch/output folder (restored with history). */
|
|
133
132
|
workspaceFolder?: string | undefined;
|
|
134
133
|
workspaceCode?: string | undefined;
|
|
@@ -153,6 +152,7 @@ export declare class SessionController implements Disposable {
|
|
|
153
152
|
persist?: boolean | undefined;
|
|
154
153
|
}): Promise<CompactResult>;
|
|
155
154
|
private settlePersistedResponderResults;
|
|
155
|
+
private continuationCheckpoint;
|
|
156
156
|
persistNow(name?: string): Promise<void>;
|
|
157
157
|
maybeRefreshTitle(): Promise<void>;
|
|
158
158
|
estimateContext(): {
|
|
@@ -160,6 +160,12 @@ export declare class SessionController implements Disposable {
|
|
|
160
160
|
tokens: number;
|
|
161
161
|
};
|
|
162
162
|
cancelAll(): Promise<ToolResult>;
|
|
163
|
+
/**
|
|
164
|
+
* Fence the outgoing owner id and start one tracked teardown before that id is
|
|
165
|
+
* rebound or released, so no new operation can enter the old owner and the old
|
|
166
|
+
* owner never becomes reachable through the new conversation context.
|
|
167
|
+
*/
|
|
168
|
+
private fenceInteractiveOwner;
|
|
163
169
|
enqueue(prompt: string, opts?: TurnDisplayOptions): void;
|
|
164
170
|
queued(): readonly string[];
|
|
165
171
|
removeQueued(index: number): void;
|
|
@@ -182,6 +188,8 @@ export declare class SessionController implements Disposable {
|
|
|
182
188
|
* long agent run still lands tools/messages on disk before abort/crash.
|
|
183
189
|
*/
|
|
184
190
|
private scheduleAutosave;
|
|
191
|
+
/** Fence the previous lifecycle: running turn, compaction and title. */
|
|
192
|
+
private beginLifecycleGeneration;
|
|
185
193
|
dispose(): void;
|
|
186
194
|
private notifyState;
|
|
187
195
|
}
|