@vybestack/llxprt-code-agents 0.10.0-nightly.260613.1adad3b34

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.
Files changed (176) hide show
  1. package/dist/.last_build +0 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +11 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/agents/executor-prompt-builder.d.ts +19 -0
  6. package/dist/src/agents/executor-prompt-builder.js +44 -0
  7. package/dist/src/agents/executor-prompt-builder.js.map +1 -0
  8. package/dist/src/agents/executor-termination.d.ts +22 -0
  9. package/dist/src/agents/executor-termination.js +44 -0
  10. package/dist/src/agents/executor-termination.js.map +1 -0
  11. package/dist/src/agents/executor-validation.d.ts +17 -0
  12. package/dist/src/agents/executor-validation.js +35 -0
  13. package/dist/src/agents/executor-validation.js.map +1 -0
  14. package/dist/src/agents/executor.d.ts +136 -0
  15. package/dist/src/agents/executor.js +874 -0
  16. package/dist/src/agents/executor.js.map +1 -0
  17. package/dist/src/agents/invocation.d.ts +45 -0
  18. package/dist/src/agents/invocation.js +118 -0
  19. package/dist/src/agents/invocation.js.map +1 -0
  20. package/dist/src/agents/recovery.d.ts +75 -0
  21. package/dist/src/agents/recovery.js +107 -0
  22. package/dist/src/agents/recovery.js.map +1 -0
  23. package/dist/src/agents/types.d.ts +149 -0
  24. package/dist/src/agents/types.js +18 -0
  25. package/dist/src/agents/types.js.map +1 -0
  26. package/dist/src/agents/utils.d.ts +15 -0
  27. package/dist/src/agents/utils.js +28 -0
  28. package/dist/src/agents/utils.js.map +1 -0
  29. package/dist/src/compression/CompressionHandler.d.ts +178 -0
  30. package/dist/src/compression/CompressionHandler.js +630 -0
  31. package/dist/src/compression/CompressionHandler.js.map +1 -0
  32. package/dist/src/compression/HighDensityStrategy.d.ts +113 -0
  33. package/dist/src/compression/HighDensityStrategy.js +769 -0
  34. package/dist/src/compression/HighDensityStrategy.js.map +1 -0
  35. package/dist/src/compression/MiddleOutStrategy.d.ts +27 -0
  36. package/dist/src/compression/MiddleOutStrategy.js +347 -0
  37. package/dist/src/compression/MiddleOutStrategy.js.map +1 -0
  38. package/dist/src/compression/OneShotStrategy.d.ts +22 -0
  39. package/dist/src/compression/OneShotStrategy.js +235 -0
  40. package/dist/src/compression/OneShotStrategy.js.map +1 -0
  41. package/dist/src/compression/TopDownTruncationStrategy.d.ts +13 -0
  42. package/dist/src/compression/TopDownTruncationStrategy.js +74 -0
  43. package/dist/src/compression/TopDownTruncationStrategy.js.map +1 -0
  44. package/dist/src/compression/compressionBudgeting.d.ts +34 -0
  45. package/dist/src/compression/compressionBudgeting.js +139 -0
  46. package/dist/src/compression/compressionBudgeting.js.map +1 -0
  47. package/dist/src/compression/compressionStrategyFactory.d.ts +23 -0
  48. package/dist/src/compression/compressionStrategyFactory.js +40 -0
  49. package/dist/src/compression/compressionStrategyFactory.js.map +1 -0
  50. package/dist/src/compression/index.d.ts +16 -0
  51. package/dist/src/compression/index.js +17 -0
  52. package/dist/src/compression/index.js.map +1 -0
  53. package/dist/src/compression/reasoningUtils.d.ts +18 -0
  54. package/dist/src/compression/reasoningUtils.js +22 -0
  55. package/dist/src/compression/reasoningUtils.js.map +1 -0
  56. package/dist/src/compression/utils.d.ts +114 -0
  57. package/dist/src/compression/utils.js +316 -0
  58. package/dist/src/compression/utils.js.map +1 -0
  59. package/dist/src/core/AgentHookManager.d.ts +41 -0
  60. package/dist/src/core/AgentHookManager.js +65 -0
  61. package/dist/src/core/AgentHookManager.js.map +1 -0
  62. package/dist/src/core/ChatSessionFactory.d.ts +50 -0
  63. package/dist/src/core/ChatSessionFactory.js +216 -0
  64. package/dist/src/core/ChatSessionFactory.js.map +1 -0
  65. package/dist/src/core/ConversationManager.d.ts +113 -0
  66. package/dist/src/core/ConversationManager.js +311 -0
  67. package/dist/src/core/ConversationManager.js.map +1 -0
  68. package/dist/src/core/DirectMessageProcessor.d.ts +79 -0
  69. package/dist/src/core/DirectMessageProcessor.js +478 -0
  70. package/dist/src/core/DirectMessageProcessor.js.map +1 -0
  71. package/dist/src/core/IdeContextTracker.d.ts +56 -0
  72. package/dist/src/core/IdeContextTracker.js +207 -0
  73. package/dist/src/core/IdeContextTracker.js.map +1 -0
  74. package/dist/src/core/MessageConverter.d.ts +78 -0
  75. package/dist/src/core/MessageConverter.js +492 -0
  76. package/dist/src/core/MessageConverter.js.map +1 -0
  77. package/dist/src/core/MessageStreamOrchestrator.d.ts +85 -0
  78. package/dist/src/core/MessageStreamOrchestrator.js +448 -0
  79. package/dist/src/core/MessageStreamOrchestrator.js.map +1 -0
  80. package/dist/src/core/MessageStreamTerminalHandler.d.ts +16 -0
  81. package/dist/src/core/MessageStreamTerminalHandler.js +170 -0
  82. package/dist/src/core/MessageStreamTerminalHandler.js.map +1 -0
  83. package/dist/src/core/StreamProcessor.d.ts +105 -0
  84. package/dist/src/core/StreamProcessor.js +660 -0
  85. package/dist/src/core/StreamProcessor.js.map +1 -0
  86. package/dist/src/core/TodoContinuationService.d.ts +74 -0
  87. package/dist/src/core/TodoContinuationService.js +312 -0
  88. package/dist/src/core/TodoContinuationService.js.map +1 -0
  89. package/dist/src/core/TurnProcessor.d.ts +91 -0
  90. package/dist/src/core/TurnProcessor.js +540 -0
  91. package/dist/src/core/TurnProcessor.js.map +1 -0
  92. package/dist/src/core/baseLlmClient.d.ts +115 -0
  93. package/dist/src/core/baseLlmClient.js +231 -0
  94. package/dist/src/core/baseLlmClient.js.map +1 -0
  95. package/dist/src/core/bucketFailoverIntegration.d.ts +62 -0
  96. package/dist/src/core/bucketFailoverIntegration.js +186 -0
  97. package/dist/src/core/bucketFailoverIntegration.js.map +1 -0
  98. package/dist/src/core/chatSession.d.ts +121 -0
  99. package/dist/src/core/chatSession.js +720 -0
  100. package/dist/src/core/chatSession.js.map +1 -0
  101. package/dist/src/core/client.d.ts +132 -0
  102. package/dist/src/core/client.js +524 -0
  103. package/dist/src/core/client.js.map +1 -0
  104. package/dist/src/core/clientHelpers.d.ts +15 -0
  105. package/dist/src/core/clientHelpers.js +122 -0
  106. package/dist/src/core/clientHelpers.js.map +1 -0
  107. package/dist/src/core/clientLlmUtilities.d.ts +30 -0
  108. package/dist/src/core/clientLlmUtilities.js +125 -0
  109. package/dist/src/core/clientLlmUtilities.js.map +1 -0
  110. package/dist/src/core/clientToolGovernance.d.ts +37 -0
  111. package/dist/src/core/clientToolGovernance.js +104 -0
  112. package/dist/src/core/clientToolGovernance.js.map +1 -0
  113. package/dist/src/core/compression-config.d.ts +12 -0
  114. package/dist/src/core/compression-config.js +21 -0
  115. package/dist/src/core/compression-config.js.map +1 -0
  116. package/dist/src/core/coreToolScheduler.d.ts +105 -0
  117. package/dist/src/core/coreToolScheduler.js +453 -0
  118. package/dist/src/core/coreToolScheduler.js.map +1 -0
  119. package/dist/src/core/hookToolRestrictions.d.ts +18 -0
  120. package/dist/src/core/hookToolRestrictions.js +187 -0
  121. package/dist/src/core/hookToolRestrictions.js.map +1 -0
  122. package/dist/src/core/nonInteractiveToolExecutor.d.ts +17 -0
  123. package/dist/src/core/nonInteractiveToolExecutor.js +102 -0
  124. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  125. package/dist/src/core/subagent.d.ts +105 -0
  126. package/dist/src/core/subagent.js +650 -0
  127. package/dist/src/core/subagent.js.map +1 -0
  128. package/dist/src/core/subagentExecution.d.ts +104 -0
  129. package/dist/src/core/subagentExecution.js +275 -0
  130. package/dist/src/core/subagentExecution.js.map +1 -0
  131. package/dist/src/core/subagentOrchestrator.d.ts +84 -0
  132. package/dist/src/core/subagentOrchestrator.js +503 -0
  133. package/dist/src/core/subagentOrchestrator.js.map +1 -0
  134. package/dist/src/core/subagentRuntimeSetup.d.ts +75 -0
  135. package/dist/src/core/subagentRuntimeSetup.js +387 -0
  136. package/dist/src/core/subagentRuntimeSetup.js.map +1 -0
  137. package/dist/src/core/subagentScheduler.d.ts +17 -0
  138. package/dist/src/core/subagentScheduler.js +7 -0
  139. package/dist/src/core/subagentScheduler.js.map +1 -0
  140. package/dist/src/core/subagentToolProcessing.d.ts +51 -0
  141. package/dist/src/core/subagentToolProcessing.js +359 -0
  142. package/dist/src/core/subagentToolProcessing.js.map +1 -0
  143. package/dist/src/core/toolGovernance.d.ts +18 -0
  144. package/dist/src/core/toolGovernance.js +50 -0
  145. package/dist/src/core/toolGovernance.js.map +1 -0
  146. package/dist/src/core/turn.d.ts +47 -0
  147. package/dist/src/core/turn.js +455 -0
  148. package/dist/src/core/turn.js.map +1 -0
  149. package/dist/src/core/turnLogging.d.ts +35 -0
  150. package/dist/src/core/turnLogging.js +80 -0
  151. package/dist/src/core/turnLogging.js.map +1 -0
  152. package/dist/src/index.d.ts +32 -0
  153. package/dist/src/index.js +44 -0
  154. package/dist/src/index.js.map +1 -0
  155. package/dist/src/scheduler/confirmation-coordinator.d.ts +139 -0
  156. package/dist/src/scheduler/confirmation-coordinator.js +443 -0
  157. package/dist/src/scheduler/confirmation-coordinator.js.map +1 -0
  158. package/dist/src/scheduler/result-aggregator.d.ts +127 -0
  159. package/dist/src/scheduler/result-aggregator.js +302 -0
  160. package/dist/src/scheduler/result-aggregator.js.map +1 -0
  161. package/dist/src/scheduler/status-transitions.d.ts +39 -0
  162. package/dist/src/scheduler/status-transitions.js +184 -0
  163. package/dist/src/scheduler/status-transitions.js.map +1 -0
  164. package/dist/src/scheduler/tool-dispatcher.d.ts +40 -0
  165. package/dist/src/scheduler/tool-dispatcher.js +120 -0
  166. package/dist/src/scheduler/tool-dispatcher.js.map +1 -0
  167. package/dist/src/scheduler/tool-executor.d.ts +44 -0
  168. package/dist/src/scheduler/tool-executor.js +117 -0
  169. package/dist/src/scheduler/tool-executor.js.map +1 -0
  170. package/dist/src/scheduler/utils.d.ts +11 -0
  171. package/dist/src/scheduler/utils.js +19 -0
  172. package/dist/src/scheduler/utils.js.map +1 -0
  173. package/dist/src/tools/task.d.ts +128 -0
  174. package/dist/src/tools/task.js +932 -0
  175. package/dist/src/tools/task.js.map +1 -0
  176. package/package.json +54 -0
@@ -0,0 +1,630 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import os from 'node:os';
7
+ import path from 'node:path';
8
+ import { shouldRetryCompressionError, isTransientCompressionError, } from '@vybestack/llxprt-code-core/core/compression/types.js';
9
+ import { getCompressionStrategy, parseCompressionStrategyName, } from './compressionStrategyFactory.js';
10
+ /**
11
+ * @plan:PLAN-20260603-ISSUE1584.P05
12
+ * @requirement:REQ-DEP-001
13
+ * @pseudocode component-boundaries.md C-CB-08, lines 80-85
14
+ *
15
+ * extractThinkingBlocks and estimateThinkingTokens are retained from
16
+ * the providers path for backward compatibility. The ReasoningOutput
17
+ * contract is available for the injection path where providers pass
18
+ * pre-extracted reasoning data through the RuntimeProvider contract.
19
+ */
20
+ import { extractThinkingBlocks, estimateThinkingTokens, } from './reasoningUtils.js';
21
+ import { PromptResolver } from '@vybestack/llxprt-code-core/prompt-config/prompt-resolver.js';
22
+ import { DebugLogger } from '@vybestack/llxprt-code-core/debug/index.js';
23
+ import { retryWithBackoff } from '@vybestack/llxprt-code-core/utils/retry.js';
24
+ import { tokenLimit } from '@vybestack/llxprt-code-core/core/tokenLimits.js';
25
+ import { PerformCompressionResult } from '@vybestack/llxprt-code-core/core/turn.js';
26
+ import { estimatePendingTokens, getCompletionBudget, } from './compressionBudgeting.js';
27
+ /**
28
+ * CompressionHandler orchestrates all compression logic for ChatSession.
29
+ * Manages compression state, retry/fallback logic, and density optimization.
30
+ *
31
+ * @plan PLAN-20260220-DECOMPOSE.P03
32
+ * @requirement Module 3 specification
33
+ */
34
+ export class CompressionHandler {
35
+ runtimeContext;
36
+ historyService;
37
+ generationConfig;
38
+ providerResolver;
39
+ hookTrigger;
40
+ static TOKEN_SAFETY_MARGIN = 1000;
41
+ static DEFAULT_COMPLETION_BUDGET = 65_536;
42
+ static COMPRESSION_COOLDOWN_MS = 60_000;
43
+ static COMPRESSION_FAILURE_THRESHOLD = 3;
44
+ static INEFFECTIVE_COMPRESSION_REDUCTION_THRESHOLD = 0.05;
45
+ static RECENT_COMPRESSION_WINDOW_MS = CompressionHandler.COMPRESSION_COOLDOWN_MS;
46
+ compressionPromise = null;
47
+ compressionFailureCount = 0;
48
+ lastCompressionFailureTime = null;
49
+ lastSuccessfulCompressionTime = null;
50
+ densityDirty = true;
51
+ _suppressDensityDirty = false;
52
+ activeTodosProvider;
53
+ lastPromptTokenCount = null;
54
+ logger = new DebugLogger('llxprt:gemini:compression');
55
+ constructor(runtimeContext, historyService, generationConfig, providerResolver, hookTrigger) {
56
+ this.runtimeContext = runtimeContext;
57
+ this.historyService = historyService;
58
+ this.generationConfig = generationConfig;
59
+ this.providerResolver = providerResolver;
60
+ this.hookTrigger = hookTrigger;
61
+ }
62
+ /**
63
+ * Calculate effective token count based on reasoning settings.
64
+ * Accounts for whether reasoning will be included in API calls.
65
+ *
66
+ * @plan PLAN-20251202-THINKING.P15
67
+ * @requirement REQ-THINK-005.1, REQ-THINK-005.2
68
+ */
69
+ getEffectiveTokenCount() {
70
+ const includeInContext = this.runtimeContext.ephemerals.reasoning.includeInContext();
71
+ const stripPolicy = this.runtimeContext.ephemerals.reasoning.stripFromContext();
72
+ // If reasoning IS included in context, all tokens count
73
+ if (includeInContext) {
74
+ return this.historyService.getTotalTokens();
75
+ }
76
+ // If reasoning is NOT included, calculate actual reduction
77
+ const allContents = this.historyService.getCurated();
78
+ const rawTokens = this.historyService.getTotalTokens();
79
+ let thinkingTokensToStrip = 0;
80
+ if (stripPolicy === 'allButLast') {
81
+ // Find last content with thinking blocks
82
+ let lastIndexWithThinking = -1;
83
+ for (let i = allContents.length - 1; i >= 0; i--) {
84
+ if (extractThinkingBlocks(allContents[i]).length > 0) {
85
+ lastIndexWithThinking = i;
86
+ break;
87
+ }
88
+ }
89
+ // Strip thinking from all except that last one
90
+ for (let i = 0; i < allContents.length; i++) {
91
+ if (i !== lastIndexWithThinking) {
92
+ const thinkingBlocks = extractThinkingBlocks(allContents[i]);
93
+ thinkingTokensToStrip += estimateThinkingTokens(thinkingBlocks);
94
+ }
95
+ }
96
+ }
97
+ else {
98
+ // stripPolicy === 'all' explicitly strips all thinking; stripPolicy === 'none'
99
+ // also removes all thinking from the effective count when includeInContext=false.
100
+ for (const content of allContents) {
101
+ const thinkingBlocks = extractThinkingBlocks(content);
102
+ thinkingTokensToStrip += estimateThinkingTokens(thinkingBlocks);
103
+ }
104
+ }
105
+ return Math.max(0, rawTokens - thinkingTokensToStrip);
106
+ }
107
+ /**
108
+ * Run density optimization if the active strategy supports it and new content exists.
109
+ * Called before threshold check in ensureCompressionBeforeSend and enforceContextWindow.
110
+ *
111
+ * @plan PLAN-20260211-HIGHDENSITY.P20
112
+ * @requirement REQ-HD-002.1-002.9
113
+ */
114
+ async ensureDensityOptimized() {
115
+ // REQ-HD-002.3: Skip if no new content since last optimization
116
+ if (!this.densityDirty) {
117
+ return;
118
+ }
119
+ try {
120
+ // Step 1: Resolve the active compression strategy
121
+ const strategyName = parseCompressionStrategyName(this.runtimeContext.ephemerals.compressionStrategy());
122
+ const strategy = getCompressionStrategy(strategyName);
123
+ // REQ-HD-002.2: If strategy has no optimize method or trigger isn't continuous
124
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Compression history runtime data.
125
+ if (!strategy.optimize || strategy.trigger?.mode !== 'continuous') {
126
+ return;
127
+ }
128
+ // Check threshold: use ephemeral override or strategy's defaultThreshold
129
+ const contextLimit = this.runtimeContext.ephemerals.contextLimit();
130
+ const optimizeThreshold = this.runtimeContext.ephemerals.densityOptimizeThreshold() ??
131
+ strategy.trigger.defaultThreshold;
132
+ const currentTokens = this.historyService.getTotalTokens();
133
+ const currentUsage = currentTokens / contextLimit;
134
+ if (currentUsage < optimizeThreshold) {
135
+ this.logger.debug(() => `[CompressionHandler] Skipping density optimization: ${(currentUsage * 100).toFixed(1)}% < ${(optimizeThreshold * 100).toFixed(1)}% threshold`);
136
+ return;
137
+ }
138
+ // Step 2: Build DensityConfig from ephemerals
139
+ const config = {
140
+ readWritePruning: this.runtimeContext.ephemerals.densityReadWritePruning(),
141
+ fileDedupe: this.runtimeContext.ephemerals.densityFileDedupe(),
142
+ recencyPruning: this.runtimeContext.ephemerals.densityRecencyPruning(),
143
+ recencyRetention: this.runtimeContext.ephemerals.densityRecencyRetention(),
144
+ workspaceRoot: process.cwd(),
145
+ };
146
+ // Step 3: Get raw history (REQ-HD-002.9)
147
+ const history = this.historyService.getRawHistory();
148
+ // Step 4: Run optimization
149
+ const result = strategy.optimize(history, config);
150
+ // REQ-HD-002.5: Short-circuit if no changes
151
+ if (result.removals.length === 0 && result.replacements.size === 0) {
152
+ this.logger.debug(() => '[CompressionHandler] Density optimization produced no changes');
153
+ return;
154
+ }
155
+ // Step 5: Apply result (REQ-HD-002.4)
156
+ this.logger.debug(() => '[CompressionHandler] Applying density optimization', {
157
+ removals: result.removals.length,
158
+ replacements: result.replacements.size,
159
+ metadata: result.metadata,
160
+ });
161
+ await this.historyService.applyDensityResult(result);
162
+ await this.historyService.waitForTokenUpdates();
163
+ }
164
+ finally {
165
+ // REQ-HD-002.7: Always clear dirty flag, even on error or no-op
166
+ this.densityDirty = false;
167
+ }
168
+ }
169
+ /**
170
+ * Check if compression is needed based on token count.
171
+ * Includes system prompt in both actual API count and estimated count paths.
172
+ *
173
+ * @plan PLAN-20251028-STATELESS6.P10
174
+ * @requirement REQ-STAT6-002.2
175
+ */
176
+ shouldCompress(pendingTokens = 0) {
177
+ // Calculate fresh each time to respect runtime setting changes
178
+ const threshold = this.runtimeContext.ephemerals.compressionThreshold();
179
+ const contextLimit = this.runtimeContext.ephemerals.contextLimit();
180
+ const completionBudget = Math.max(0, getCompletionBudget(this.generationConfig, this.runtimeContext.state.model, undefined,
181
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Compression history runtime data.
182
+ this.runtimeContext.providerRuntime?.settingsService));
183
+ const effectiveLimit = Math.max(0, contextLimit - completionBudget);
184
+ const compressionThreshold = threshold * effectiveLimit;
185
+ this.logger.debug('Compression threshold:', {
186
+ threshold,
187
+ contextLimit,
188
+ completionBudget,
189
+ effectiveLimit,
190
+ compressionThreshold,
191
+ });
192
+ // Use lastPromptTokenCount (actual API data) when available, else fall back
193
+ const baseTokenCount = this.lastPromptTokenCount !== null && this.lastPromptTokenCount > 0
194
+ ? this.lastPromptTokenCount
195
+ : this.getEffectiveTokenCount();
196
+ const currentTokens = baseTokenCount + Math.max(0, pendingTokens);
197
+ const shouldCompress = currentTokens >= compressionThreshold;
198
+ if (shouldCompress) {
199
+ this.logger.debug('Compression needed:', {
200
+ currentTokens,
201
+ threshold: compressionThreshold,
202
+ usingActualApiCount: this.lastPromptTokenCount !== null && this.lastPromptTokenCount > 0,
203
+ });
204
+ }
205
+ return shouldCompress;
206
+ }
207
+ /**
208
+ * Ensure compression runs before sending a message if needed.
209
+ * Waits for ongoing compression and triggers new compression if threshold reached.
210
+ *
211
+ * @plan PLAN-20260220-DECOMPOSE.P03
212
+ */
213
+ async ensureCompressionBeforeSend(prompt_id, pendingTokens, source, trigger = 'auto') {
214
+ if (this.compressionPromise) {
215
+ this.logger.debug('Waiting for ongoing compression to complete');
216
+ try {
217
+ await this.compressionPromise;
218
+ }
219
+ finally {
220
+ this.compressionPromise = null;
221
+ }
222
+ }
223
+ await this.historyService.waitForTokenUpdates();
224
+ // @plan PLAN-20260211-HIGHDENSITY.P18
225
+ // @requirement REQ-HD-002.1
226
+ await this.ensureDensityOptimized();
227
+ if (this.shouldCompress(pendingTokens)) {
228
+ const triggerMessage = source === 'stream'
229
+ ? 'Triggering compression before message send in stream'
230
+ : 'Triggering compression before message send';
231
+ this.logger.debug(triggerMessage, {
232
+ pendingTokens,
233
+ historyTokens: this.historyService.getTotalTokens(),
234
+ });
235
+ this.compressionPromise = this.performCompression(prompt_id, {
236
+ trigger,
237
+ });
238
+ try {
239
+ await this.compressionPromise;
240
+ }
241
+ finally {
242
+ this.compressionPromise = null;
243
+ }
244
+ }
245
+ }
246
+ /**
247
+ * Enforce hard context window limits with compression and density optimization.
248
+ * Throws if limits cannot be satisfied even after compression.
249
+ *
250
+ * @plan PLAN-20260220-DECOMPOSE.P03
251
+ */
252
+ /**
253
+ * Compute the baseline prompt token count for hard-limit projection.
254
+ * Prefer API-observed prompt tokens when available (includes cache read/write).
255
+ */
256
+ getProjectedPromptBaseline() {
257
+ return this.lastPromptTokenCount !== null && this.lastPromptTokenCount > 0
258
+ ? this.lastPromptTokenCount
259
+ : this.getEffectiveTokenCount();
260
+ }
261
+ /**
262
+ * Compute the projected token count for a pending request.
263
+ */
264
+ computeProjectedTokens(pendingTokens, completionBudget) {
265
+ return (this.getProjectedPromptBaseline() +
266
+ Math.max(0, pendingTokens) +
267
+ completionBudget);
268
+ }
269
+ /**
270
+ * Compute context-window limits and completion budget for enforcement.
271
+ */
272
+ computeContextLimits(provider) {
273
+ const completionBudget = Math.max(0, getCompletionBudget(this.generationConfig, this.runtimeContext.state.model, provider,
274
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Compression history runtime data.
275
+ this.runtimeContext.providerRuntime?.settingsService));
276
+ const userContextLimit = this.runtimeContext.ephemerals.contextLimit();
277
+ const limit = tokenLimit(this.runtimeContext.state.model, userContextLimit);
278
+ const marginAdjustedLimit = Math.max(0, limit - CompressionHandler.TOKEN_SAFETY_MARGIN);
279
+ return { completionBudget, limit, marginAdjustedLimit };
280
+ }
281
+ async enforceContextWindow(pendingTokens, promptId, provider) {
282
+ await this.historyService.waitForTokenUpdates();
283
+ const { completionBudget, limit, marginAdjustedLimit } = this.computeContextLimits(provider);
284
+ const initialProjected = this.computeProjectedTokens(pendingTokens, completionBudget);
285
+ if (initialProjected <= marginAdjustedLimit) {
286
+ return;
287
+ }
288
+ this.logger.warn(() => `[CompressionHandler] Projected token usage exceeds context limit, attempting compression`, {
289
+ projected: initialProjected,
290
+ marginAdjustedLimit,
291
+ completionBudget,
292
+ pendingTokens,
293
+ });
294
+ // @plan PLAN-20260211-HIGHDENSITY.P18
295
+ // @requirement REQ-HD-002.8
296
+ await this.ensureDensityOptimized();
297
+ await this.historyService.waitForTokenUpdates();
298
+ const postOptProjected = this.computeProjectedTokens(pendingTokens, completionBudget);
299
+ if (postOptProjected <= marginAdjustedLimit) {
300
+ this.logger.debug(() => '[CompressionHandler] Density optimization reduced tokens below limit', { postOptProjected, marginAdjustedLimit });
301
+ return;
302
+ }
303
+ const preCompressionProjected = postOptProjected;
304
+ await this.performCompression(promptId, {
305
+ bypassCooldown: true,
306
+ trigger: 'auto',
307
+ });
308
+ await this.historyService.waitForTokenUpdates();
309
+ let recomputed = this.computeProjectedTokens(pendingTokens, completionBudget);
310
+ if (recomputed <= marginAdjustedLimit) {
311
+ this.logger.debug(() => '[CompressionHandler] Compression reduced tokens below limit', { recomputed, marginAdjustedLimit });
312
+ return;
313
+ }
314
+ // If compression barely reduced tokens, force truncation fallback
315
+ recomputed = await this.forceTruncationIfIneffective(promptId, preCompressionProjected, recomputed, marginAdjustedLimit, pendingTokens, completionBudget);
316
+ if (recomputed <= marginAdjustedLimit) {
317
+ return;
318
+ }
319
+ throw this.buildContextOverflowError(limit, initialProjected, recomputed, marginAdjustedLimit, completionBudget);
320
+ }
321
+ /**
322
+ * Force truncation fallback when primary compression was ineffective.
323
+ * Returns the recomputed projected token count after fallback attempt.
324
+ */
325
+ async forceTruncationIfIneffective(promptId, preCompressionProjected, postCompressionProjected, marginAdjustedLimit, pendingTokens, completionBudget) {
326
+ const reduction = preCompressionProjected - postCompressionProjected;
327
+ const reductionRatio = preCompressionProjected > 0 ? reduction / preCompressionProjected : 0;
328
+ if (reductionRatio >=
329
+ CompressionHandler.INEFFECTIVE_COMPRESSION_REDUCTION_THRESHOLD ||
330
+ postCompressionProjected <= marginAdjustedLimit) {
331
+ return postCompressionProjected;
332
+ }
333
+ this.logger.warn(() => '[CompressionHandler] Primary compression was ineffective, forcing truncation fallback', {
334
+ preCompressionProjected,
335
+ postCompressionProjected,
336
+ reductionRatio,
337
+ });
338
+ this._suppressDensityDirty = true;
339
+ try {
340
+ const context = await this.buildCompressionContext(promptId);
341
+ await this.performFallbackCompression(context, new Error('Primary compression was ineffective'), (newHistory) => {
342
+ this.historyService.clear();
343
+ for (const content of newHistory) {
344
+ this.historyService.add(content, this.runtimeContext.state.model);
345
+ }
346
+ this.lastPromptTokenCount = null;
347
+ });
348
+ await this.historyService.waitForTokenUpdates();
349
+ }
350
+ catch (error) {
351
+ this.logger.warn(() => '[CompressionHandler] Truncation fallback failed during hard-limit enforcement', error);
352
+ }
353
+ finally {
354
+ this._suppressDensityDirty = false;
355
+ }
356
+ return this.computeProjectedTokens(pendingTokens, completionBudget);
357
+ }
358
+ /**
359
+ * Build a diagnostic error for context window overflow after all reduction attempts.
360
+ */
361
+ buildContextOverflowError(limit, initialProjected, finalProjected, marginAdjustedLimit, completionBudget) {
362
+ const totalReduction = Math.max(0, initialProjected - finalProjected);
363
+ const tokensStillNeeded = finalProjected - marginAdjustedLimit;
364
+ const parts = [
365
+ `Request still exceeds the safety-adjusted context limit (${marginAdjustedLimit} tokens).`,
366
+ `density optimization and compression reduced ${totalReduction} tokens (from ${initialProjected} to ${finalProjected} projected).`,
367
+ `completionBudget=${completionBudget}, tokensStillNeeded=${tokensStillNeeded}.`,
368
+ ];
369
+ if (completionBudget > 0.8 * limit) {
370
+ parts.push(`The completion budget (${completionBudget}) consumes more than 80% of the context window (${limit}). Consider lowering maxOutputTokens.`);
371
+ }
372
+ return new Error(parts.join(' '));
373
+ }
374
+ /**
375
+ * Perform compression with retry, fallback, and cooldown logic.
376
+ *
377
+ * @plan PLAN-20260218-COMPRESSION-RETRY.P01
378
+ * @requirement REQ-CS-006.1, REQ-CS-002.9, REQ-CR-003-005
379
+ */
380
+ async performCompression(prompt_id, options) {
381
+ // Cooldown: skip compression if we have too many recent failures
382
+ // When bypassCooldown is true (called from enforceContextWindow), skip this check
383
+ if (options?.bypassCooldown !== true && this.isCompressionInCooldown()) {
384
+ this.logger.debug('Skipping compression — in cooldown after repeated failures', {
385
+ failureCount: this.compressionFailureCount,
386
+ lastFailureTime: this.lastCompressionFailureTime,
387
+ });
388
+ return PerformCompressionResult.SKIPPED_COOLDOWN;
389
+ }
390
+ // Trigger PreCompress hook (fail-open) before checking history.
391
+ // This ensures automatic/manual compression attempts emit PreCompress hooks
392
+ // even when the attempt is later skipped due to empty history.
393
+ const context = await this.buildCompressionContext(prompt_id);
394
+ try {
395
+ await this.hookTrigger({
396
+ ...context,
397
+ trigger: options?.trigger ?? 'manual',
398
+ });
399
+ }
400
+ catch {
401
+ // Hooks are fail-open - continue even if hook fails
402
+ }
403
+ // Skip compression if history is empty
404
+ const currentHistory = this.historyService.getCurated();
405
+ if (currentHistory.length === 0) {
406
+ this.logger.debug('Skipping compression — empty history');
407
+ return PerformCompressionResult.SKIPPED_EMPTY;
408
+ }
409
+ this.logger.debug('Starting compression');
410
+ const preCompressionCount = this.historyService.getStatistics().totalMessages;
411
+ this.historyService.startCompression();
412
+ let compressionSummary;
413
+ let compressionSucceeded = false;
414
+ // @plan PLAN-20260211-HIGHDENSITY.P20
415
+ // @requirement REQ-HD-002.6
416
+ // Suppress densityDirty during compression rebuild (clear+add loop)
417
+ this._suppressDensityDirty = true;
418
+ let didCompress = false;
419
+ try {
420
+ didCompress = await this.runCompressionWithRetryAndFallback(prompt_id, (newHistory) => {
421
+ // Apply result: clear history, add each entry from newHistory
422
+ this.historyService.clear();
423
+ for (const content of newHistory) {
424
+ this.historyService.add(content, this.runtimeContext.state.model);
425
+ }
426
+ this.lastPromptTokenCount = null;
427
+ compressionSummary = newHistory[0];
428
+ compressionSucceeded = true;
429
+ });
430
+ }
431
+ finally {
432
+ this._suppressDensityDirty = false;
433
+ this.historyService.endCompression(compressionSummary, preCompressionCount);
434
+ }
435
+ await this.historyService.waitForTokenUpdates();
436
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Compression history runtime data.
437
+ if (didCompress && compressionSucceeded) {
438
+ this.lastSuccessfulCompressionTime = Date.now();
439
+ return PerformCompressionResult.COMPRESSED;
440
+ }
441
+ if (didCompress) {
442
+ this.logger.warn('Compression strategy reported success without applying history updates');
443
+ }
444
+ return PerformCompressionResult.FAILED;
445
+ }
446
+ /**
447
+ * Check if compression is in cooldown after repeated failures.
448
+ *
449
+ * @plan PLAN-20260218-COMPRESSION-RETRY.P01
450
+ * @requirement REQ-CR-005
451
+ */
452
+ isCompressionInCooldown() {
453
+ if (this.compressionFailureCount <
454
+ CompressionHandler.COMPRESSION_FAILURE_THRESHOLD) {
455
+ return false;
456
+ }
457
+ if (this.lastCompressionFailureTime === null) {
458
+ return false;
459
+ }
460
+ const elapsed = Date.now() - this.lastCompressionFailureTime;
461
+ return elapsed < CompressionHandler.COMPRESSION_COOLDOWN_MS;
462
+ }
463
+ /**
464
+ * Returns true if compression completed successfully within the recent window.
465
+ * Used to distinguish ALREADY_COMPRESSED from NOOP in the /compress command.
466
+ */
467
+ wasRecentlyCompressed() {
468
+ if (this.lastSuccessfulCompressionTime === null) {
469
+ return false;
470
+ }
471
+ return (Date.now() - this.lastSuccessfulCompressionTime <
472
+ CompressionHandler.RECENT_COMPRESSION_WINDOW_MS);
473
+ }
474
+ /**
475
+ * Execute compression with retry for transient errors and fallback to truncation.
476
+ *
477
+ * @plan PLAN-20260218-COMPRESSION-RETRY.P01
478
+ * @requirement REQ-CR-003-005
479
+ */
480
+ async runCompressionWithRetryAndFallback(promptId, applyResult) {
481
+ const context = await this.buildCompressionContext(promptId);
482
+ const attemptPrimary = async () => {
483
+ const strategyName = parseCompressionStrategyName(this.runtimeContext.ephemerals.compressionStrategy());
484
+ const strategy = getCompressionStrategy(strategyName);
485
+ const result = await strategy.compress(context);
486
+ return result.newHistory;
487
+ };
488
+ let primaryError;
489
+ try {
490
+ const newHistory = await retryWithBackoff(attemptPrimary, {
491
+ maxAttempts: 3,
492
+ initialDelayMs: 2000,
493
+ maxDelayMs: 10000,
494
+ shouldRetryOnError: (err) => shouldRetryCompressionError(err),
495
+ });
496
+ applyResult(newHistory);
497
+ // Primary strategy succeeded — reset failure counters
498
+ this.compressionFailureCount = 0;
499
+ this.lastCompressionFailureTime = null;
500
+ this.logger.debug('Compression completed with primary strategy');
501
+ return true;
502
+ }
503
+ catch (err) {
504
+ primaryError = err;
505
+ }
506
+ // Permanent errors are rethrown immediately — no fallback
507
+ if (!isTransientCompressionError(primaryError)) {
508
+ throw primaryError;
509
+ }
510
+ this.logger.warn('Primary compression strategy failed after retries (transient), attempting fallback', primaryError);
511
+ return this.performFallbackCompression(context, primaryError, applyResult);
512
+ }
513
+ /**
514
+ * Attempt fallback compression using TopDownTruncationStrategy.
515
+ *
516
+ * @plan PLAN-20260218-COMPRESSION-RETRY.P01
517
+ * @requirement REQ-CR-004-005
518
+ */
519
+ async performFallbackCompression(context, primaryError, applyResult) {
520
+ try {
521
+ // Use the strategy factory so tests can intercept
522
+ const fallback = getCompressionStrategy('top-down-truncation');
523
+ const result = await fallback.compress(context);
524
+ applyResult(result.newHistory);
525
+ // Fallback succeeded — reset failure counters
526
+ this.compressionFailureCount = 0;
527
+ this.lastCompressionFailureTime = null;
528
+ this.lastSuccessfulCompressionTime = Date.now();
529
+ this.logger.debug('Compression completed with fallback (TopDownTruncation)');
530
+ return true;
531
+ }
532
+ catch (fallbackError) {
533
+ // Both strategies failed — track the failure and continue without compression
534
+ this.compressionFailureCount++;
535
+ this.lastCompressionFailureTime = Date.now();
536
+ this.logger.error('Fallback compression also failed — continuing without compression', { primaryError, fallbackError });
537
+ // Swallow error to avoid blocking the conversation turn
538
+ return false;
539
+ }
540
+ }
541
+ /**
542
+ * Build CompressionContext for compression strategies.
543
+ *
544
+ * @plan PLAN-20260211-COMPRESSION.P14
545
+ * @requirement REQ-CS-001.6
546
+ */
547
+ async buildCompressionContext(promptId) {
548
+ const promptResolver = new PromptResolver();
549
+ const promptBaseDir = path.join(os.homedir(), '.llxprt', 'prompts');
550
+ let activeTodos;
551
+ if (this.activeTodosProvider) {
552
+ try {
553
+ activeTodos = await this.activeTodosProvider();
554
+ }
555
+ catch (error) {
556
+ this.logger.debug('Failed to fetch active todos for compression', error);
557
+ }
558
+ }
559
+ // Get config from runtimeContext for bucket failover handling
560
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Compression history runtime data.
561
+ const config = this.runtimeContext.providerRuntime?.config;
562
+ return {
563
+ history: this.historyService.getCurated(),
564
+ runtimeContext: this.runtimeContext,
565
+ runtimeState: this.runtimeContext.state,
566
+ estimateTokens: (contents) => this.historyService.estimateTokensForContents(contents),
567
+ currentTokenCount: this.historyService.getTotalTokens(),
568
+ logger: this.logger,
569
+ resolveProvider: (profileName) => Promise.resolve(this.providerResolver(profileName)),
570
+ promptResolver,
571
+ promptBaseDir,
572
+ promptContext: {
573
+ provider: this.runtimeContext.state.provider,
574
+ model: this.runtimeContext.state.model,
575
+ },
576
+ promptId,
577
+ ...(activeTodos ? { activeTodos } : {}),
578
+ compressionVerification:
579
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Compression history runtime data.
580
+ this.runtimeContext.ephemerals.compressionVerification?.() ?? false,
581
+ ...(config ? { config } : {}),
582
+ };
583
+ }
584
+ /**
585
+ * Mark density optimization as dirty (new content added).
586
+ * Respects _suppressDensityDirty flag during compression rebuilds.
587
+ *
588
+ * @plan PLAN-20260211-HIGHDENSITY.P20
589
+ * @requirement REQ-HD-002.6
590
+ */
591
+ markDensityDirty() {
592
+ if (!this._suppressDensityDirty) {
593
+ this.densityDirty = true;
594
+ }
595
+ }
596
+ /**
597
+ * Set the active todos provider callback.
598
+ *
599
+ * @plan PLAN-20260220-DECOMPOSE.P03
600
+ */
601
+ setActiveTodosProvider(provider) {
602
+ this.activeTodosProvider = provider;
603
+ }
604
+ /**
605
+ * Get the last prompt token count from API.
606
+ *
607
+ * @plan PLAN-20260220-DECOMPOSE.P03
608
+ */
609
+ getLastPromptTokenCount() {
610
+ return this.lastPromptTokenCount ?? 0;
611
+ }
612
+ /**
613
+ * Set the last prompt token count from API response.
614
+ *
615
+ * @plan PLAN-20260220-DECOMPOSE.P03
616
+ */
617
+ setLastPromptTokenCount(count) {
618
+ this.lastPromptTokenCount = count;
619
+ }
620
+ /**
621
+ * Estimate token count for pending content.
622
+ * Delegates to compressionBudgeting helper.
623
+ *
624
+ * @plan PLAN-20260220-DECOMPOSE.P03
625
+ */
626
+ async estimatePendingTokens(contents) {
627
+ return estimatePendingTokens(contents, this.historyService, this.runtimeContext.state.model);
628
+ }
629
+ }
630
+ //# sourceMappingURL=CompressionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompressionHandler.js","sourceRoot":"","sources":["../../../src/compression/CompressionHandler.ts"],"names":[],"mappings":"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"}