@pentoshi/clai 4.0.3 → 4.2.0
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/README.md +45 -9
- package/dist/agent/compaction-executor.d.ts +68 -0
- package/dist/agent/compaction-executor.js +343 -0
- package/dist/agent/compaction-executor.js.map +1 -0
- package/dist/agent/confirm-port.js +6 -3
- package/dist/agent/confirm-port.js.map +1 -1
- package/dist/agent/context-breakdown.js +2 -0
- package/dist/agent/context-breakdown.js.map +1 -1
- package/dist/agent/context-manager.d.ts +23 -9
- package/dist/agent/context-manager.js +72 -43
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/events.d.ts +3 -0
- package/dist/agent/loop-guard.d.ts +2 -0
- package/dist/agent/loop-guard.js +48 -3
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/prompt-composer.js +6 -6
- package/dist/agent/prompt-composer.js.map +1 -1
- package/dist/agent/reliability-policy.d.ts +1 -0
- package/dist/agent/reliability-policy.js +6 -3
- package/dist/agent/reliability-policy.js.map +1 -1
- package/dist/agent/request-accounting.d.ts +97 -0
- package/dist/agent/request-accounting.js +207 -0
- package/dist/agent/request-accounting.js.map +1 -0
- package/dist/agent/request-budget.d.ts +2 -2
- package/dist/agent/request-budget.js +2 -4
- package/dist/agent/request-budget.js.map +1 -1
- package/dist/agent/runner.d.ts +8 -2
- package/dist/agent/runner.js +412 -181
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-title.d.ts +0 -26
- package/dist/agent/session-title.js +0 -80
- package/dist/agent/session-title.js.map +1 -1
- package/dist/agent/tool-history.d.ts +2 -2
- package/dist/agent/tool-history.js +19 -6
- package/dist/agent/tool-history.js.map +1 -1
- package/dist/agent/turn-outcome.d.ts +1 -1
- package/dist/agent/turn-outcome.js +2 -12
- package/dist/agent/turn-outcome.js.map +1 -1
- package/dist/app/adapters/agent-event-adapter.js +19 -0
- package/dist/app/adapters/agent-event-adapter.js.map +1 -1
- package/dist/app/adapters/current-agent-adapter.js +4 -0
- package/dist/app/adapters/current-agent-adapter.js.map +1 -1
- package/dist/app/commands/catalog.js +23 -16
- package/dist/app/commands/catalog.js.map +1 -1
- package/dist/app/controllers/cancel-coordinator.d.ts +51 -0
- package/dist/app/controllers/cancel-coordinator.js +48 -0
- package/dist/app/controllers/cancel-coordinator.js.map +1 -0
- package/dist/app/controllers/session-compact-helper.d.ts +19 -2
- package/dist/app/controllers/session-compact-helper.js +100 -127
- package/dist/app/controllers/session-compact-helper.js.map +1 -1
- package/dist/app/controllers/session-context-usage.d.ts +32 -15
- package/dist/app/controllers/session-context-usage.js +186 -51
- package/dist/app/controllers/session-context-usage.js.map +1 -1
- package/dist/app/controllers/session-controller.d.ts +22 -11
- package/dist/app/controllers/session-controller.js +137 -92
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/session-naming.d.ts +31 -0
- package/dist/app/controllers/session-naming.js +173 -0
- package/dist/app/controllers/session-naming.js.map +1 -0
- package/dist/app/controllers/session-persistence.d.ts +2 -2
- package/dist/app/controllers/session-persistence.js +3 -6
- package/dist/app/controllers/session-persistence.js.map +1 -1
- package/dist/app/controllers/session-turn-request.d.ts +2 -1
- package/dist/app/controllers/session-turn-request.js +3 -0
- package/dist/app/controllers/session-turn-request.js.map +1 -1
- package/dist/app/controllers/turn-continuation.d.ts +0 -6
- package/dist/app/controllers/turn-continuation.js +4 -21
- package/dist/app/controllers/turn-continuation.js.map +1 -1
- package/dist/app/controllers/turn-controller.d.ts +2 -1
- package/dist/app/controllers/turn-controller.js +1 -0
- package/dist/app/controllers/turn-controller.js.map +1 -1
- package/dist/app/events/app-event.d.ts +9 -0
- package/dist/app/events/app-event.js.map +1 -1
- package/dist/app/ports/agent-port.d.ts +8 -1
- package/dist/app/ports/transcript-item.d.ts +9 -1
- package/dist/classic/app/ClassicApp.js +3 -3
- package/dist/classic/app/ClassicApp.js.map +1 -1
- package/dist/classic/app/app-wiring.js +1 -2
- package/dist/classic/app/app-wiring.js.map +1 -1
- package/dist/classic/app/wiring-interactions.js +4 -9
- package/dist/classic/app/wiring-interactions.js.map +1 -1
- package/dist/classic/blocks/TurnSummaryBlock.d.ts +3 -0
- package/dist/classic/blocks/TurnSummaryBlock.js +6 -0
- package/dist/classic/blocks/TurnSummaryBlock.js.map +1 -0
- package/dist/classic/blocks/tool-lines.js +2 -1
- package/dist/classic/blocks/tool-lines.js.map +1 -1
- package/dist/classic/blocks/turn-summary-lines.d.ts +3 -0
- package/dist/classic/blocks/turn-summary-lines.js +7 -0
- package/dist/classic/blocks/turn-summary-lines.js.map +1 -0
- package/dist/classic/chrome/status-rows.d.ts +0 -1
- package/dist/classic/chrome/status-rows.js +0 -12
- package/dist/classic/chrome/status-rows.js.map +1 -1
- package/dist/classic/feed/Feed.js +2 -0
- package/dist/classic/feed/Feed.js.map +1 -1
- package/dist/classic/feed/feed-blocks.d.ts +1 -1
- package/dist/classic/feed/feed-blocks.js +3 -0
- package/dist/classic/feed/feed-blocks.js.map +1 -1
- package/dist/classic/input/cancel-ladder.d.ts +2 -19
- package/dist/classic/input/cancel-ladder.js +13 -20
- package/dist/classic/input/cancel-ladder.js.map +1 -1
- package/dist/commands/providers.js +2 -0
- package/dist/commands/providers.js.map +1 -1
- package/dist/llm/adapters/anthropic-tools.d.ts +31 -14
- package/dist/llm/adapters/anthropic-tools.js +124 -29
- package/dist/llm/adapters/anthropic-tools.js.map +1 -1
- package/dist/llm/adapters/gemini-tools.d.ts +16 -4
- package/dist/llm/adapters/gemini-tools.js +117 -16
- package/dist/llm/adapters/gemini-tools.js.map +1 -1
- package/dist/llm/adapters/openai-tools.d.ts +13 -2
- package/dist/llm/adapters/openai-tools.js +58 -11
- package/dist/llm/adapters/openai-tools.js.map +1 -1
- package/dist/llm/agentrouter.js +68 -45
- package/dist/llm/agentrouter.js.map +1 -1
- package/dist/llm/anthropic.js +69 -36
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +70 -32
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/bynara.js +26 -69
- package/dist/llm/bynara.js.map +1 -1
- package/dist/llm/capabilities.d.ts +2 -1
- package/dist/llm/capabilities.js +56 -1
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/context-snapshot.d.ts +100 -0
- package/dist/llm/context-snapshot.js +277 -0
- package/dist/llm/context-snapshot.js.map +1 -0
- package/dist/llm/context-windows.d.ts +10 -0
- package/dist/llm/context-windows.js +129 -0
- package/dist/llm/context-windows.js.map +1 -0
- package/dist/llm/custom-provider-profile.d.ts +75 -0
- package/dist/llm/custom-provider-profile.js +558 -0
- package/dist/llm/custom-provider-profile.js.map +1 -0
- package/dist/llm/custom-providers.d.ts +13 -1
- package/dist/llm/custom-providers.js +77 -25
- package/dist/llm/custom-providers.js.map +1 -1
- package/dist/llm/effort-fallback.d.ts +44 -0
- package/dist/llm/effort-fallback.js +101 -0
- package/dist/llm/effort-fallback.js.map +1 -0
- package/dist/llm/fireworks.d.ts +3 -0
- package/dist/llm/fireworks.js +103 -0
- package/dist/llm/fireworks.js.map +1 -0
- package/dist/llm/free.js +4 -0
- package/dist/llm/free.js.map +1 -1
- package/dist/llm/gemini.d.ts +1 -1
- package/dist/llm/gemini.js +89 -51
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/groq.js +4 -0
- package/dist/llm/groq.js.map +1 -1
- package/dist/llm/hetzner.d.ts +3 -0
- package/dist/llm/hetzner.js +98 -0
- package/dist/llm/hetzner.js.map +1 -0
- package/dist/llm/http.d.ts +60 -10
- package/dist/llm/http.js +465 -156
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/kimchi.js +4 -0
- package/dist/llm/kimchi.js.map +1 -1
- package/dist/llm/lightning.js +4 -0
- package/dist/llm/lightning.js.map +1 -1
- package/dist/llm/meta.d.ts +2 -0
- package/dist/llm/meta.js +839 -624
- package/dist/llm/meta.js.map +1 -1
- package/dist/llm/modal.js +4 -0
- package/dist/llm/modal.js.map +1 -1
- package/dist/llm/model-families.d.ts +9 -0
- package/dist/llm/model-families.js +39 -0
- package/dist/llm/model-families.js.map +1 -0
- package/dist/llm/nvidia.js +4 -0
- package/dist/llm/nvidia.js.map +1 -1
- package/dist/llm/ollama.js +44 -40
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openai.js +4 -0
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/openrouter.js +4 -0
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/operation-ledger.d.ts +60 -0
- package/dist/llm/operation-ledger.js +136 -0
- package/dist/llm/operation-ledger.js.map +1 -0
- package/dist/llm/operation-usage.d.ts +32 -0
- package/dist/llm/operation-usage.js +172 -0
- package/dist/llm/operation-usage.js.map +1 -0
- package/dist/llm/orcarouter.d.ts +7 -0
- package/dist/llm/orcarouter.js +166 -0
- package/dist/llm/orcarouter.js.map +1 -0
- package/dist/llm/provider-profile-layers.d.ts +7 -0
- package/dist/llm/provider-profile-layers.js +961 -0
- package/dist/llm/provider-profile-layers.js.map +1 -0
- package/dist/llm/provider-profile.d.ts +181 -0
- package/dist/llm/provider-profile.js +329 -0
- package/dist/llm/provider-profile.js.map +1 -0
- package/dist/llm/provider-profiles.d.ts +13 -0
- package/dist/llm/provider-profiles.js +86 -0
- package/dist/llm/provider-profiles.js.map +1 -0
- package/dist/llm/provider.d.ts +2 -0
- package/dist/llm/provider.js +198 -21
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/qwen-cloud.js +4 -0
- package/dist/llm/qwen-cloud.js.map +1 -1
- package/dist/llm/reasoning-artifacts.d.ts +101 -0
- package/dist/llm/reasoning-artifacts.js +440 -0
- package/dist/llm/reasoning-artifacts.js.map +1 -0
- package/dist/llm/request-fingerprint.d.ts +10 -0
- package/dist/llm/request-fingerprint.js +313 -0
- package/dist/llm/request-fingerprint.js.map +1 -0
- package/dist/llm/request-plan.d.ts +119 -0
- package/dist/llm/request-plan.js +279 -0
- package/dist/llm/request-plan.js.map +1 -0
- package/dist/llm/router.d.ts +19 -1
- package/dist/llm/router.js +504 -102
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/stream-events.d.ts +47 -0
- package/dist/llm/stream-events.js +55 -0
- package/dist/llm/stream-events.js.map +1 -0
- package/dist/llm/stream-terminal.d.ts +30 -0
- package/dist/llm/stream-terminal.js +51 -0
- package/dist/llm/stream-terminal.js.map +1 -0
- package/dist/llm/token-estimate-calibration.d.ts +23 -0
- package/dist/llm/token-estimate-calibration.js +140 -0
- package/dist/llm/token-estimate-calibration.js.map +1 -0
- package/dist/llm/token-usage.d.ts +35 -5
- package/dist/llm/token-usage.js +212 -162
- package/dist/llm/token-usage.js.map +1 -1
- package/dist/llm/tokenrouter.js +13 -6
- package/dist/llm/tokenrouter.js.map +1 -1
- package/dist/modes/ask.js +11 -5
- package/dist/modes/ask.js.map +1 -1
- package/dist/noninteractive/start-noninteractive.js +31 -2
- package/dist/noninteractive/start-noninteractive.js.map +1 -1
- package/dist/noninteractive/stream-blocks.js +15 -4
- package/dist/noninteractive/stream-blocks.js.map +1 -1
- package/dist/prompts/embedded.js +1 -1
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/system.agent.md +6 -0
- package/dist/store/config.js +7 -1
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.d.ts +2 -0
- package/dist/store/history.js +19 -10
- package/dist/store/history.js.map +1 -1
- package/dist/store/plan.js +20 -14
- package/dist/store/plan.js.map +1 -1
- package/dist/tools/elevated-shell.d.ts +1 -1
- package/dist/tools/elevated-shell.js +24 -72
- package/dist/tools/elevated-shell.js.map +1 -1
- package/dist/tools/fs.d.ts +5 -3
- package/dist/tools/fs.js +8 -5
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/nmap-runner.js +30 -36
- package/dist/tools/nmap-runner.js.map +1 -1
- package/dist/tools/sudo-session.d.ts +83 -0
- package/dist/tools/sudo-session.js +124 -0
- package/dist/tools/sudo-session.js.map +1 -0
- package/dist/tui-v2/app/App.js +9 -24
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/components/plan/plan-view.js +5 -3
- package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
- package/dist/tui-v2/components/status/context-limit-chip.js +2 -2
- package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -1
- package/dist/tui-v2/components/status/status-line.js +1 -14
- package/dist/tui-v2/components/status/status-line.js.map +1 -1
- package/dist/tui-v2/components/transcript/intro-card.js +2 -1
- package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/notice-row.d.ts +3 -1
- package/dist/tui-v2/components/transcript/notice-row.js +28 -3
- package/dist/tui-v2/components/transcript/notice-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/thinking-block.d.ts +0 -5
- package/dist/tui-v2/components/transcript/thinking-block.js +3 -8
- package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.js +16 -7
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.d.ts +0 -2
- package/dist/tui-v2/components/transcript/transcript-row.js +7 -3
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-view.js +1 -3
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.js +2 -1
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/types.d.ts +156 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/ui-core/bootstrap/composition-root.d.ts +2 -0
- package/dist/ui-core/bootstrap/composition-root.js +26 -3
- package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
- package/dist/ui-core/commands/picker-commands.js +11 -5
- package/dist/ui-core/commands/picker-commands.js.map +1 -1
- package/dist/ui-core/commands/session-commands.js +41 -5
- package/dist/ui-core/commands/session-commands.js.map +1 -1
- package/dist/ui-core/plan/plan-lifecycle.js +3 -2
- package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
- package/dist/ui-core/rendering/context-limit.js +4 -1
- package/dist/ui-core/rendering/context-limit.js.map +1 -1
- package/dist/ui-core/rendering/duration.d.ts +5 -0
- package/dist/ui-core/rendering/duration.js +43 -0
- package/dist/ui-core/rendering/duration.js.map +1 -0
- package/dist/ui-core/rendering/intro-header.js +2 -2
- package/dist/ui-core/rendering/intro-header.js.map +1 -1
- package/dist/ui-core/rendering/theme.d.ts +1 -0
- package/dist/ui-core/rendering/theme.js +2 -0
- package/dist/ui-core/rendering/theme.js.map +1 -1
- package/dist/ui-core/rendering/transcript-semantic.js +2 -0
- package/dist/ui-core/rendering/transcript-semantic.js.map +1 -1
- package/dist/ui-core/state/transcript-compaction.js +2 -0
- package/dist/ui-core/state/transcript-compaction.js.map +1 -1
- package/dist/ui-core/state/transcript-hydrate.js +34 -4
- package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
- package/dist/ui-core/state/transcript-reducer.d.ts +5 -0
- package/dist/ui-core/state/transcript-reducer.js +96 -8
- package/dist/ui-core/state/transcript-reducer.js.map +1 -1
- package/dist/ui-core/state/transcript-store.d.ts +10 -1
- package/dist/ui-core/state/transcript-store.js +22 -1
- package/dist/ui-core/state/transcript-store.js.map +1 -1
- package/dist/ui-core/state/transcript-types.d.ts +9 -1
- package/dist/ui-core/state/transcript-types.js +3 -1
- package/dist/ui-core/state/transcript-types.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +6 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// Context
|
|
1
|
+
// Context snapshot projection for the session footer.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// count; compaction policy is resolved independently by the agent runner.
|
|
3
|
+
// ContextSnapshotV1 is the runtime source of truth. ContextUsageSnapshot is a
|
|
4
|
+
// deliberately narrow legacy projection for existing renderers and history.
|
|
6
5
|
import { estimateMessagesTokens } from "../../agent/context-manager.js";
|
|
7
|
-
import {
|
|
6
|
+
import { contextLimitFromSessionOverride, contextSnapshotFromLegacy, createContextSnapshot, isContextSnapshotV1, toLegacyContextUsage, withContextSnapshotLimit, } from "../../llm/context-snapshot.js";
|
|
7
|
+
const systemNow = () => Date.now();
|
|
8
8
|
// The footer denominator is the explicit model window, never a guessed window
|
|
9
9
|
// or compaction trigger. Zero means no session override was set.
|
|
10
10
|
export function contextUsageLimit(target) {
|
|
@@ -13,54 +13,143 @@ export function contextUsageLimit(target) {
|
|
|
13
13
|
? Math.floor(limit)
|
|
14
14
|
: 0;
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
function limitFor(target) {
|
|
17
|
+
return contextLimitFromSessionOverride(contextUsageLimit(target));
|
|
18
|
+
}
|
|
19
|
+
function sameLimit(left, right) {
|
|
20
|
+
return left.source === right.source && left.tokens === right.tokens;
|
|
21
|
+
}
|
|
22
|
+
function hasPromptMeasurement(usage) {
|
|
23
|
+
return usage.promptTokensKnown !== false;
|
|
24
|
+
}
|
|
25
|
+
function reportedCache(usage) {
|
|
26
|
+
const readTokens = usage.cachedPromptTokens;
|
|
27
|
+
const creationTokens = usage.cacheCreationTokens;
|
|
28
|
+
const uncachedTokens = usage.uncachedPromptTokens;
|
|
29
|
+
if (readTokens === undefined &&
|
|
30
|
+
creationTokens === undefined &&
|
|
31
|
+
uncachedTokens === undefined) {
|
|
32
|
+
return undefined;
|
|
22
33
|
}
|
|
23
|
-
|
|
24
|
-
|
|
34
|
+
return {
|
|
35
|
+
kind: "reported",
|
|
36
|
+
...(readTokens !== undefined ? { readTokens } : {}),
|
|
37
|
+
...(creationTokens !== undefined ? { creationTokens } : {}),
|
|
38
|
+
...(uncachedTokens !== undefined ? { uncachedTokens } : {}),
|
|
39
|
+
};
|
|
25
40
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
41
|
+
function reportedReasoning(usage) {
|
|
42
|
+
if (usage.reasoningTokens === undefined)
|
|
43
|
+
return undefined;
|
|
44
|
+
return { kind: "reported", outputTokens: usage.reasoningTokens };
|
|
29
45
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
46
|
+
function historyEstimateSnapshot(target, current, history, now) {
|
|
47
|
+
return createContextSnapshot({
|
|
48
|
+
contextTokens: estimateMessagesTokens(history),
|
|
49
|
+
lastCompletionTokens: current?.lastCompletionTokens,
|
|
50
|
+
sessionPromptTokens: current?.sessionPromptTokens,
|
|
51
|
+
sessionCompletionTokens: current?.sessionCompletionTokens,
|
|
52
|
+
scope: "message-history",
|
|
53
|
+
precision: "estimate",
|
|
54
|
+
limit: limitFor(target),
|
|
55
|
+
observedAt: now(),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Scopes that describe the occupancy of a real model request. Both the
|
|
60
|
+
* pre-dispatch assembled estimate and the provider's post-dispatch count
|
|
61
|
+
* measure the same thing, so either may be presented as the current fill.
|
|
62
|
+
*/
|
|
63
|
+
const REQUEST_SCOPES = new Set([
|
|
64
|
+
"provider-request",
|
|
65
|
+
"assembled-request",
|
|
66
|
+
]);
|
|
67
|
+
/**
|
|
68
|
+
* Keep the most recent request-scoped measurement. The message-history estimate
|
|
69
|
+
* omits the system prefix and tool schemas, so substituting it for a live
|
|
70
|
+
* measurement made the displayed number oscillate between two different scopes
|
|
71
|
+
* every step; it is now only a cold-start fallback.
|
|
72
|
+
*/
|
|
73
|
+
export function resolveContextSnapshot(target, history, current, now = systemNow) {
|
|
74
|
+
const limit = limitFor(target);
|
|
75
|
+
if (current && current.contextTokens > 0 && REQUEST_SCOPES.has(current.scope)) {
|
|
76
|
+
return sameLimit(current.limit, limit)
|
|
77
|
+
? current
|
|
78
|
+
: withContextSnapshotLimit(current, limit);
|
|
79
|
+
}
|
|
80
|
+
return historyEstimateSnapshot(target, current, history, now);
|
|
81
|
+
}
|
|
82
|
+
/** Fold provider usage into one canonical provider-request observation. */
|
|
83
|
+
export function recordContextUsageSnapshot(target, current, usage, attempt, now = systemNow) {
|
|
84
|
+
const promptMeasured = hasPromptMeasurement(usage);
|
|
85
|
+
const sessionPromptTokens = (current?.sessionPromptTokens ?? 0) +
|
|
86
|
+
(usage.exact && promptMeasured ? usage.promptTokens : 0);
|
|
87
|
+
const sessionCompletionTokens = (current?.sessionCompletionTokens ?? 0) +
|
|
88
|
+
(usage.exact ? usage.completionTokens : 0);
|
|
89
|
+
const cache = reportedCache(usage);
|
|
90
|
+
const reasoning = reportedReasoning(usage);
|
|
91
|
+
return createContextSnapshot({
|
|
92
|
+
// A completion-only report cannot refresh current context occupancy. Keep
|
|
93
|
+
// the prior number only as an explicitly unknown observation so the next
|
|
94
|
+
// estimate replaces it instead of presenting stale provider exactness.
|
|
95
|
+
contextTokens: promptMeasured
|
|
96
|
+
? usage.promptTokens
|
|
97
|
+
: (current?.contextTokens ?? 0),
|
|
98
|
+
lastCompletionTokens: usage.completionTokens,
|
|
99
|
+
sessionPromptTokens,
|
|
100
|
+
sessionCompletionTokens,
|
|
101
|
+
scope: promptMeasured ? "provider-request" : "unknown",
|
|
102
|
+
precision: usage.exact && promptMeasured
|
|
103
|
+
? "provider-exact"
|
|
104
|
+
: promptMeasured
|
|
105
|
+
? "estimate"
|
|
106
|
+
: "unknown",
|
|
107
|
+
limit: limitFor(target),
|
|
108
|
+
...(cache ? { cache } : {}),
|
|
109
|
+
...(reasoning ? { reasoning } : {}),
|
|
110
|
+
...(attempt ? { attempt } : {}),
|
|
111
|
+
observedAt: now(),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/** After compaction, exact provider fill is stale and the new scope is explicit. */
|
|
115
|
+
export function compactedContextSnapshot(target, current, history, afterTokens, scope, now = systemNow) {
|
|
116
|
+
const contextTokens = typeof afterTokens === "number" && Number.isFinite(afterTokens) && afterTokens > 0
|
|
117
|
+
? Math.floor(afterTokens)
|
|
35
118
|
: estimateMessagesTokens(history);
|
|
36
|
-
return {
|
|
37
|
-
contextTokens
|
|
38
|
-
contextLimit: contextUsageLimit(target),
|
|
119
|
+
return createContextSnapshot({
|
|
120
|
+
contextTokens,
|
|
39
121
|
lastCompletionTokens: 0,
|
|
40
|
-
sessionPromptTokens: current?.sessionPromptTokens
|
|
41
|
-
sessionCompletionTokens: current?.sessionCompletionTokens
|
|
42
|
-
|
|
43
|
-
|
|
122
|
+
sessionPromptTokens: current?.sessionPromptTokens,
|
|
123
|
+
sessionCompletionTokens: current?.sessionCompletionTokens,
|
|
124
|
+
scope,
|
|
125
|
+
precision: "estimate",
|
|
126
|
+
limit: limitFor(target),
|
|
127
|
+
observedAt: now(),
|
|
128
|
+
});
|
|
44
129
|
}
|
|
45
|
-
export function
|
|
130
|
+
export function estimatedContextSnapshot(target, current, estimatedTokens, now = systemNow) {
|
|
46
131
|
if (!Number.isFinite(estimatedTokens) || estimatedTokens <= 0)
|
|
47
132
|
return current;
|
|
48
|
-
if (current?.
|
|
133
|
+
if (current?.scope === "provider-request" &&
|
|
134
|
+
current.precision === "provider-exact") {
|
|
49
135
|
return current;
|
|
50
|
-
|
|
136
|
+
}
|
|
137
|
+
return createContextSnapshot({
|
|
51
138
|
contextTokens: Math.floor(estimatedTokens),
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
139
|
+
lastCompletionTokens: current?.lastCompletionTokens,
|
|
140
|
+
sessionPromptTokens: current?.sessionPromptTokens,
|
|
141
|
+
sessionCompletionTokens: current?.sessionCompletionTokens,
|
|
142
|
+
scope: "assembled-request",
|
|
143
|
+
precision: "estimate",
|
|
144
|
+
limit: limitFor(target),
|
|
145
|
+
observedAt: now(),
|
|
146
|
+
});
|
|
58
147
|
}
|
|
59
148
|
// The estimate walks the whole transcript, so the projection is memoized
|
|
60
149
|
// against the inputs that can change it instead of recomputed per render.
|
|
61
150
|
export function createContextProjector(formatChip) {
|
|
62
151
|
let cache;
|
|
63
|
-
return (target, history, current) => {
|
|
152
|
+
return (target, history, current, now = systemNow) => {
|
|
64
153
|
const first = history[0];
|
|
65
154
|
const last = history[history.length - 1];
|
|
66
155
|
const key = [
|
|
@@ -70,15 +159,37 @@ export function createContextProjector(formatChip) {
|
|
|
70
159
|
history.length,
|
|
71
160
|
first?.content.length ?? 0,
|
|
72
161
|
last?.content.length ?? 0,
|
|
162
|
+
current?.version ?? 0,
|
|
73
163
|
current?.contextTokens ?? -1,
|
|
74
|
-
current?.
|
|
75
|
-
current?.
|
|
76
|
-
current?.
|
|
164
|
+
current?.scope ?? "",
|
|
165
|
+
current?.precision ?? "",
|
|
166
|
+
current?.limit.source ?? "",
|
|
167
|
+
current?.limit.tokens ?? -1,
|
|
168
|
+
current?.cache.kind ?? "",
|
|
169
|
+
current?.cache.kind === "reported" ? current.cache.readTokens ?? -1 : -1,
|
|
170
|
+
current?.cache.kind === "reported"
|
|
171
|
+
? current.cache.creationTokens ?? -1
|
|
172
|
+
: -1,
|
|
173
|
+
current?.cache.kind === "reported"
|
|
174
|
+
? current.cache.uncachedTokens ?? -1
|
|
175
|
+
: -1,
|
|
176
|
+
current?.reasoning.kind ?? "",
|
|
177
|
+
current?.reasoning.kind === "reported"
|
|
178
|
+
? current.reasoning.outputTokens ?? -1
|
|
179
|
+
: -1,
|
|
180
|
+
current?.reasoning.kind === "reported"
|
|
181
|
+
? current.reasoning.inputArtifactTokens ?? -1
|
|
182
|
+
: -1,
|
|
183
|
+
current?.observedAt ?? -1,
|
|
77
184
|
].join("|");
|
|
78
185
|
if (cache?.key === key)
|
|
79
186
|
return cache.value;
|
|
80
|
-
const
|
|
187
|
+
const contextSnapshot = resolveContextSnapshot(target, history, current, now);
|
|
188
|
+
const contextUsage = contextSnapshot
|
|
189
|
+
? toLegacyContextUsage(contextSnapshot)
|
|
190
|
+
: undefined;
|
|
81
191
|
const value = {
|
|
192
|
+
contextSnapshot,
|
|
82
193
|
contextUsage,
|
|
83
194
|
contextChip: contextUsage ? formatChip(contextUsage) : undefined,
|
|
84
195
|
};
|
|
@@ -86,20 +197,44 @@ export function createContextProjector(formatChip) {
|
|
|
86
197
|
return value;
|
|
87
198
|
};
|
|
88
199
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (!usage || usage.contextTokens <= 0)
|
|
200
|
+
/** Restore V1 when available, otherwise migrate the unversioned legacy shape. */
|
|
201
|
+
export function restoredContextSnapshot(target, usage, now = systemNow) {
|
|
202
|
+
if (!usage)
|
|
93
203
|
return undefined;
|
|
94
|
-
|
|
204
|
+
if (isContextSnapshotV1(usage)) {
|
|
205
|
+
return usage.contextTokens > 0
|
|
206
|
+
? withContextSnapshotLimit(usage, limitFor(target))
|
|
207
|
+
: undefined;
|
|
208
|
+
}
|
|
209
|
+
const persisted = usage.contextSnapshot;
|
|
210
|
+
if (isContextSnapshotV1(persisted) && persisted.contextTokens > 0) {
|
|
211
|
+
// A saved denominator might have been an old auto-compact trigger. The
|
|
212
|
+
// live session override remains the only display limit after restore.
|
|
213
|
+
return withContextSnapshotLimit(persisted, limitFor(target));
|
|
214
|
+
}
|
|
215
|
+
if (usage.contextTokens <= 0)
|
|
216
|
+
return undefined;
|
|
217
|
+
return contextSnapshotFromLegacy({
|
|
95
218
|
contextTokens: usage.contextTokens,
|
|
96
|
-
|
|
97
|
-
// here. Only a live explicit session override may become a denominator.
|
|
98
|
-
contextLimit: contextUsageLimit(target),
|
|
219
|
+
contextLimit: usage.contextLimit ?? 0,
|
|
99
220
|
lastCompletionTokens: usage.lastCompletionTokens ?? 0,
|
|
100
221
|
sessionPromptTokens: usage.sessionPromptTokens ?? 0,
|
|
101
222
|
sessionCompletionTokens: usage.sessionCompletionTokens ?? 0,
|
|
102
223
|
exact: usage.exact === true,
|
|
103
|
-
};
|
|
224
|
+
}, limitFor(target), now());
|
|
225
|
+
}
|
|
226
|
+
// Compatibility exports retained for old callers and legacy-focused tests.
|
|
227
|
+
export function resolveContextUsageSnapshot(target, history, current) {
|
|
228
|
+
const canonical = resolveContextSnapshot(target, history, current
|
|
229
|
+
? contextSnapshotFromLegacy(current, limitFor(target))
|
|
230
|
+
: undefined);
|
|
231
|
+
return canonical ? toLegacyContextUsage(canonical) : undefined;
|
|
232
|
+
}
|
|
233
|
+
export function compactedUsageSnapshot(target, current, history, afterTokens) {
|
|
234
|
+
return toLegacyContextUsage(compactedContextSnapshot(target, current ? contextSnapshotFromLegacy(current, limitFor(target)) : undefined, history, afterTokens, "message-history"));
|
|
235
|
+
}
|
|
236
|
+
export function estimatedUsageSnapshot(target, current, estimatedTokens) {
|
|
237
|
+
const canonical = estimatedContextSnapshot(target, current ? contextSnapshotFromLegacy(current, limitFor(target)) : undefined, estimatedTokens);
|
|
238
|
+
return canonical ? toLegacyContextUsage(canonical) : undefined;
|
|
104
239
|
}
|
|
105
240
|
//# sourceMappingURL=session-context-usage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context-usage.js","sourceRoot":"","sources":["../../../src/app/controllers/session-context-usage.ts"],"names":[],"mappings":"AAAA,
|
|
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,7 @@
|
|
|
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 { ContextAttemptReference, ContextSnapshotV1 } from "../../llm/context-snapshot.js";
|
|
4
5
|
import { type PartialUsageSnapshot } from "./session-context-usage.js";
|
|
5
6
|
import type { PreviousTurnSignal } from "../../agent/continue-orient.js";
|
|
6
7
|
import { type SessionWorkspace } from "../../store/session-workspace.js";
|
|
@@ -29,6 +30,9 @@ export interface SessionState {
|
|
|
29
30
|
readonly queued: readonly string[];
|
|
30
31
|
readonly responder: ResponderRuntimeState;
|
|
31
32
|
readonly title: string | undefined;
|
|
33
|
+
/** Canonical versioned context measurement for runtime consumers. */
|
|
34
|
+
readonly contextSnapshot: ContextSnapshotV1 | undefined;
|
|
35
|
+
/** Six-field legacy projection retained for existing renderers. */
|
|
32
36
|
readonly contextUsage: ContextUsageSnapshot | undefined;
|
|
33
37
|
readonly contextChip: string | undefined;
|
|
34
38
|
}
|
|
@@ -52,6 +56,7 @@ export interface SessionControllerDeps {
|
|
|
52
56
|
/** When true, never persist sessions or generate AI titles (CLI --no-history). */
|
|
53
57
|
readonly noHistory?: boolean | undefined;
|
|
54
58
|
readonly notifyResponderDelivery?: ((summary: string) => void) | undefined;
|
|
59
|
+
readonly titleCompleter?: ((messages: ChatMessage[]) => Promise<string>) | undefined;
|
|
55
60
|
}
|
|
56
61
|
export type TurnEndListener = (result: TurnResult) => void;
|
|
57
62
|
export type SessionStateListener = () => void;
|
|
@@ -72,20 +77,22 @@ export declare class SessionController implements Disposable {
|
|
|
72
77
|
private model;
|
|
73
78
|
private mode;
|
|
74
79
|
private compactingFlag;
|
|
80
|
+
private readonly activeCompactions;
|
|
75
81
|
private compactAbort;
|
|
76
|
-
/** Display name written into history.db
|
|
82
|
+
/** Display name written into history.db. */
|
|
77
83
|
private sessionTitle;
|
|
78
|
-
|
|
79
|
-
private
|
|
80
|
-
private titleInFlight;
|
|
84
|
+
private readonly namer;
|
|
85
|
+
private lastMainRequestSnapshot;
|
|
81
86
|
/** Throttle mid-turn history autosaves so abort/crash still keep tools on disk. */
|
|
82
87
|
private lastAutosaveAt;
|
|
83
88
|
private autosaveInFlight;
|
|
84
89
|
/** Orders autosave, terminal, compaction, title, switch, and shutdown writes. */
|
|
85
90
|
private readonly persistence;
|
|
86
91
|
private static readonly AUTOSAVE_MIN_MS;
|
|
87
|
-
/** Last known context
|
|
88
|
-
private
|
|
92
|
+
/** Last known versioned context measurement for the session. */
|
|
93
|
+
private contextSnapshot;
|
|
94
|
+
/** Avoid applying the same manual compaction in both commit and event paths. */
|
|
95
|
+
private lastContextCompactionId;
|
|
89
96
|
private readonly contextLimits;
|
|
90
97
|
/** Bumped by reset/history load/dispose so late callbacks can be ignored. */
|
|
91
98
|
private lifecycleGeneration;
|
|
@@ -101,9 +108,13 @@ export declare class SessionController implements Disposable {
|
|
|
101
108
|
private contextUsageProjection;
|
|
102
109
|
private get contextLimitTokens();
|
|
103
110
|
private get usageTarget();
|
|
104
|
-
private
|
|
105
|
-
|
|
106
|
-
|
|
111
|
+
private contextTimestamp;
|
|
112
|
+
private setContextSnapshot;
|
|
113
|
+
private resolveContextSnapshot;
|
|
114
|
+
/** Next-request occupancy, only when a request-scoped measurement exists. */
|
|
115
|
+
private requestScopedContextTokens;
|
|
116
|
+
recordTokenUsage(usage: TokenUsage, model?: string, provider?: ProviderId, attempt?: ContextAttemptReference): void;
|
|
117
|
+
noteContextCompacted(afterTokens?: number, scope?: "message-history" | "assembled-request", compactionId?: string): void;
|
|
107
118
|
noteContextEstimate(estimatedTokens: number): void;
|
|
108
119
|
private refreshEstimatedContext;
|
|
109
120
|
get messages(): readonly ChatMessage[];
|
|
@@ -146,7 +157,7 @@ export declare class SessionController implements Disposable {
|
|
|
146
157
|
mintNewId?: boolean;
|
|
147
158
|
}): void;
|
|
148
159
|
/** Roll back history after a rejected plan-implement compaction. */
|
|
149
|
-
restoreMessages(messages: readonly ChatMessage[],
|
|
160
|
+
restoreMessages(messages: readonly ChatMessage[], contextSnapshot?: ContextSnapshotV1 | ContextUsageSnapshot | undefined): void;
|
|
150
161
|
compact(sessionTranscript?: string, keepRecent?: number, signal?: AbortSignal, options?: {
|
|
151
162
|
purpose?: "default" | "plan-implement" | undefined;
|
|
152
163
|
/** Default true: emit compacted event + persist. */
|
|
@@ -155,7 +166,6 @@ export declare class SessionController implements Disposable {
|
|
|
155
166
|
private settlePersistedResponderResults;
|
|
156
167
|
private continuationCheckpoint;
|
|
157
168
|
persistNow(name?: string): Promise<void>;
|
|
158
|
-
maybeRefreshTitle(): Promise<void>;
|
|
159
169
|
estimateContext(): {
|
|
160
170
|
messages: number;
|
|
161
171
|
tokens: number;
|
|
@@ -190,4 +200,5 @@ export declare class SessionController implements Disposable {
|
|
|
190
200
|
private beginLifecycleGeneration;
|
|
191
201
|
dispose(): void;
|
|
192
202
|
private notifyState;
|
|
203
|
+
private observeEmit;
|
|
193
204
|
}
|