midas-mcp 5.23.0 → 5.43.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +9 -2
- package/dist/analyzer.js.map +1 -1
- package/dist/context.d.ts +264 -5
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +634 -7
- package/dist/context.js.map +1 -1
- package/dist/experiments/recursive-planning/recursive-session.d.ts +201 -0
- package/dist/experiments/recursive-planning/recursive-session.d.ts.map +1 -0
- package/dist/experiments/recursive-planning/recursive-session.js +348 -0
- package/dist/experiments/recursive-planning/recursive-session.js.map +1 -0
- package/dist/experiments/recursive-planning/recursive-session.test.d.ts +19 -0
- package/dist/experiments/recursive-planning/recursive-session.test.d.ts.map +1 -0
- package/dist/experiments/recursive-planning/recursive-session.test.js +799 -0
- package/dist/experiments/recursive-planning/recursive-session.test.js.map +1 -0
- package/dist/gameplan-tracker.d.ts +63 -0
- package/dist/gameplan-tracker.d.ts.map +1 -0
- package/dist/gameplan-tracker.js +330 -0
- package/dist/gameplan-tracker.js.map +1 -0
- package/dist/preflight.d.ts +140 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +1100 -0
- package/dist/preflight.js.map +1 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +22 -2
- package/dist/security.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -4
- package/dist/server.js.map +1 -1
- package/dist/state/phase.d.ts.map +1 -1
- package/dist/state/phase.js +58 -8
- package/dist/state/phase.js.map +1 -1
- package/dist/tools/gameplan.d.ts +49 -0
- package/dist/tools/gameplan.d.ts.map +1 -0
- package/dist/tools/gameplan.js +79 -0
- package/dist/tools/gameplan.js.map +1 -0
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/preflight.d.ts +121 -0
- package/dist/tools/preflight.d.ts.map +1 -0
- package/dist/tools/preflight.js +144 -0
- package/dist/tools/preflight.js.map +1 -0
- package/dist/tools/verify.js +2 -2
- package/dist/tools/verify.js.map +1 -1
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +38 -2
- package/dist/tracker.js.map +1 -1
- package/dist/tui.js +53 -53
- package/dist/tui.js.map +1 -1
- package/package.json +1 -1
package/dist/context.js
CHANGED
|
@@ -1,14 +1,641 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Context
|
|
2
|
+
* Context Management for Midas
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Comprehensive context budget tracking, tier-based content management,
|
|
5
|
+
* and compaction alerts for optimal LLM context window usage.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - Token estimation for prompt building
|
|
9
|
+
* - Global session-wide context budget tracking
|
|
10
|
+
* - Tier-based content aging (hot → warm → cold → frozen)
|
|
11
|
+
* - Compaction threshold monitoring and alerts
|
|
12
|
+
* - Context saturation reporting
|
|
13
|
+
*
|
|
14
|
+
* Optimal context saturation for Claude Opus 4.5:
|
|
15
|
+
* - 0-60%: Peak quality
|
|
16
|
+
* - 60-80%: Excellent quality (recommended working range)
|
|
17
|
+
* - 80-90%: Good quality, slight drift risk
|
|
18
|
+
* - 90%+: Auto-compaction triggers, quality degrades
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
21
|
+
import { readFileSync } from 'fs';
|
|
22
|
+
import writeFileAtomic from 'write-file-atomic';
|
|
23
|
+
import { join } from 'path';
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// CONSTANTS
|
|
26
|
+
// ============================================================================
|
|
27
|
+
/** Default context window size for Claude Opus 4.5 */
|
|
28
|
+
export const DEFAULT_CONTEXT_WINDOW = 200_000;
|
|
29
|
+
/** Saturation thresholds as percentages */
|
|
30
|
+
export const SATURATION_THRESHOLDS = {
|
|
31
|
+
/** Optimal working range ceiling */
|
|
32
|
+
OPTIMAL: 0.60,
|
|
33
|
+
/** Warning threshold - quality may degrade */
|
|
34
|
+
WARNING: 0.80,
|
|
35
|
+
/** Critical threshold - compaction recommended */
|
|
36
|
+
CRITICAL: 0.90,
|
|
37
|
+
/** Emergency threshold - forced compaction */
|
|
38
|
+
EMERGENCY: 0.95,
|
|
39
|
+
};
|
|
40
|
+
/** Maximum items in each tier */
|
|
41
|
+
export const TIER_LIMITS = {
|
|
42
|
+
HOT: 20, // Recent active items (full detail)
|
|
43
|
+
WARM: 50, // Session history (full detail)
|
|
44
|
+
COLD: 100, // Summarized content
|
|
45
|
+
FROZEN: 200, // Compressed references only
|
|
46
|
+
};
|
|
47
|
+
/** Token budgets per tier (approximate) */
|
|
48
|
+
export const TIER_BUDGETS = {
|
|
49
|
+
HOT: 40_000, // 0-40K: current task, active files
|
|
50
|
+
WARM: 40_000, // 40K-80K: session history
|
|
51
|
+
COLD: 40_000, // 80K-120K: summaries
|
|
52
|
+
FROZEN: 20_000, // 120K-140K: compressed refs
|
|
53
|
+
};
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// TOKEN ESTIMATION
|
|
56
|
+
// ============================================================================
|
|
57
|
+
/**
|
|
58
|
+
* Estimate token count for text
|
|
59
|
+
* Uses 1 token ≈ 4 chars for English as baseline,
|
|
60
|
+
* with adjustments for code and special characters
|
|
9
61
|
*/
|
|
10
|
-
// Token estimation (rough: 1 token ≈ 4 chars for English)
|
|
11
62
|
export function estimateTokens(text) {
|
|
12
|
-
|
|
63
|
+
if (!text || typeof text !== 'string')
|
|
64
|
+
return 0;
|
|
65
|
+
const length = text.length;
|
|
66
|
+
if (length === 0)
|
|
67
|
+
return 0;
|
|
68
|
+
// Base estimate: 4 chars per token
|
|
69
|
+
let estimate = Math.ceil(length / 4);
|
|
70
|
+
// Adjust for code (more symbols = more tokens)
|
|
71
|
+
// Only apply adjustment for strings with enough chars to matter
|
|
72
|
+
if (length > 10) {
|
|
73
|
+
const symbolDensity = countSymbols(text) / length;
|
|
74
|
+
if (symbolDensity > 0.15) {
|
|
75
|
+
// High symbol density (likely code): 3 chars per token
|
|
76
|
+
estimate = Math.ceil(length / 3);
|
|
77
|
+
}
|
|
78
|
+
// Adjust for unicode (non-ASCII uses more tokens)
|
|
79
|
+
// Only apply for significant unicode content
|
|
80
|
+
const unicodeRatio = countUnicode(text) / length;
|
|
81
|
+
if (unicodeRatio > 0.1) {
|
|
82
|
+
estimate = Math.ceil(estimate * (1 + unicodeRatio));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Minimum 1 token for non-empty strings
|
|
86
|
+
return Math.max(1, estimate);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Count programming symbols in text
|
|
90
|
+
*/
|
|
91
|
+
function countSymbols(text) {
|
|
92
|
+
const symbols = text.match(/[{}()\[\]<>;:,.!?@#$%^&*+=|\\\/~`'"]/g);
|
|
93
|
+
return symbols ? symbols.length : 0;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Count non-ASCII characters
|
|
97
|
+
*/
|
|
98
|
+
function countUnicode(text) {
|
|
99
|
+
let count = 0;
|
|
100
|
+
for (let i = 0; i < text.length; i++) {
|
|
101
|
+
if (text.charCodeAt(i) > 127)
|
|
102
|
+
count++;
|
|
103
|
+
}
|
|
104
|
+
return count;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Estimate tokens for structured data (JSON-like)
|
|
108
|
+
*/
|
|
109
|
+
export function estimateStructuredTokens(data) {
|
|
110
|
+
try {
|
|
111
|
+
const json = JSON.stringify(data);
|
|
112
|
+
return estimateTokens(json);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// CONTEXT BUDGET MANAGEMENT
|
|
120
|
+
// ============================================================================
|
|
121
|
+
/**
|
|
122
|
+
* Create a new context budget
|
|
123
|
+
*/
|
|
124
|
+
export function createContextBudget(maxTokens = DEFAULT_CONTEXT_WINDOW) {
|
|
125
|
+
return {
|
|
126
|
+
maxTokens,
|
|
127
|
+
usedTokens: 0,
|
|
128
|
+
tiers: {
|
|
129
|
+
hot: [],
|
|
130
|
+
warm: [],
|
|
131
|
+
cold: [],
|
|
132
|
+
frozen: [],
|
|
133
|
+
},
|
|
134
|
+
lastCompaction: 0,
|
|
135
|
+
compactionHistory: [],
|
|
136
|
+
sessionStart: Date.now(),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Calculate current saturation
|
|
141
|
+
*/
|
|
142
|
+
export function calculateSaturation(budget) {
|
|
143
|
+
if (budget.maxTokens <= 0)
|
|
144
|
+
return 1;
|
|
145
|
+
return budget.usedTokens / budget.maxTokens;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get saturation level name
|
|
149
|
+
*/
|
|
150
|
+
export function getSaturationLevel(saturation) {
|
|
151
|
+
if (saturation >= SATURATION_THRESHOLDS.EMERGENCY)
|
|
152
|
+
return 'emergency';
|
|
153
|
+
if (saturation >= SATURATION_THRESHOLDS.CRITICAL)
|
|
154
|
+
return 'critical';
|
|
155
|
+
if (saturation >= SATURATION_THRESHOLDS.WARNING)
|
|
156
|
+
return 'warning';
|
|
157
|
+
return 'optimal';
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Generate saturation report
|
|
161
|
+
*/
|
|
162
|
+
export function getSaturationReport(budget) {
|
|
163
|
+
const saturation = calculateSaturation(budget);
|
|
164
|
+
const level = getSaturationLevel(saturation);
|
|
165
|
+
const tierBreakdown = {
|
|
166
|
+
hot: { items: budget.tiers.hot.length, tokens: sumTokens(budget.tiers.hot) },
|
|
167
|
+
warm: { items: budget.tiers.warm.length, tokens: sumTokens(budget.tiers.warm) },
|
|
168
|
+
cold: { items: budget.tiers.cold.length, tokens: sumTokens(budget.tiers.cold) },
|
|
169
|
+
frozen: { items: budget.tiers.frozen.length, tokens: sumTokens(budget.tiers.frozen) },
|
|
170
|
+
};
|
|
171
|
+
const recommendations = [];
|
|
172
|
+
let potentialSavings = 0;
|
|
173
|
+
// Check each tier for issues
|
|
174
|
+
if (budget.tiers.hot.length > TIER_LIMITS.HOT) {
|
|
175
|
+
recommendations.push(`Hot tier over limit (${budget.tiers.hot.length}/${TIER_LIMITS.HOT}). Age oldest items to warm.`);
|
|
176
|
+
}
|
|
177
|
+
if (budget.tiers.warm.length > TIER_LIMITS.WARM) {
|
|
178
|
+
recommendations.push(`Warm tier over limit. Consider summarizing to cold tier.`);
|
|
179
|
+
potentialSavings += Math.floor(tierBreakdown.warm.tokens * 0.5); // Summarization saves ~50%
|
|
180
|
+
}
|
|
181
|
+
if (level === 'warning') {
|
|
182
|
+
recommendations.push('Approaching 80% saturation. Consider proactive compaction.');
|
|
183
|
+
potentialSavings += estimatePotentialSavings(budget);
|
|
184
|
+
}
|
|
185
|
+
if (level === 'critical') {
|
|
186
|
+
recommendations.push('At 90%+ saturation. Compaction strongly recommended.');
|
|
187
|
+
potentialSavings += estimatePotentialSavings(budget);
|
|
188
|
+
}
|
|
189
|
+
if (level === 'emergency') {
|
|
190
|
+
recommendations.push('EMERGENCY: At 95%+ saturation. Immediate compaction required.');
|
|
191
|
+
potentialSavings += estimatePotentialSavings(budget);
|
|
192
|
+
}
|
|
193
|
+
// Check for stale hot items
|
|
194
|
+
const now = Date.now();
|
|
195
|
+
const staleHot = budget.tiers.hot.filter(item => now - item.lastAccessedAt > 5 * 60 * 1000);
|
|
196
|
+
if (staleHot.length > 0) {
|
|
197
|
+
recommendations.push(`${staleHot.length} hot items not accessed in 5+ minutes. Consider aging.`);
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
saturation,
|
|
201
|
+
level,
|
|
202
|
+
usedTokens: budget.usedTokens,
|
|
203
|
+
maxTokens: budget.maxTokens,
|
|
204
|
+
remainingTokens: budget.maxTokens - budget.usedTokens,
|
|
205
|
+
tierBreakdown,
|
|
206
|
+
recommendations,
|
|
207
|
+
compactionRecommended: level !== 'optimal' || recommendations.length > 2,
|
|
208
|
+
potentialSavings,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Sum tokens in item array
|
|
213
|
+
*/
|
|
214
|
+
function sumTokens(items) {
|
|
215
|
+
return items.reduce((sum, item) => sum + item.tokens, 0);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Estimate potential savings from compaction
|
|
219
|
+
*/
|
|
220
|
+
function estimatePotentialSavings(budget) {
|
|
221
|
+
let savings = 0;
|
|
222
|
+
// Warm items can be summarized (save ~50%)
|
|
223
|
+
savings += Math.floor(sumTokens(budget.tiers.warm) * 0.5);
|
|
224
|
+
// Cold items can be compressed (save ~70%)
|
|
225
|
+
savings += Math.floor(sumTokens(budget.tiers.cold) * 0.7);
|
|
226
|
+
// Frozen items can be dropped
|
|
227
|
+
savings += sumTokens(budget.tiers.frozen);
|
|
228
|
+
return savings;
|
|
229
|
+
}
|
|
230
|
+
// ============================================================================
|
|
231
|
+
// CONTENT MANAGEMENT
|
|
232
|
+
// ============================================================================
|
|
233
|
+
/**
|
|
234
|
+
* Generate unique ID for context item
|
|
235
|
+
*/
|
|
236
|
+
function generateId() {
|
|
237
|
+
return `ctx_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Add content to the context budget
|
|
241
|
+
*/
|
|
242
|
+
export function addContent(budget, content, type, options = {}) {
|
|
243
|
+
const tokens = estimateTokens(content);
|
|
244
|
+
const now = Date.now();
|
|
245
|
+
const tier = options.tier ?? 'hot';
|
|
246
|
+
const item = {
|
|
247
|
+
id: generateId(),
|
|
248
|
+
content,
|
|
249
|
+
tokens,
|
|
250
|
+
type,
|
|
251
|
+
tier,
|
|
252
|
+
createdAt: now,
|
|
253
|
+
lastAccessedAt: now,
|
|
254
|
+
accessCount: 1,
|
|
255
|
+
summarized: false,
|
|
256
|
+
priority: options.priority ?? getPriorityForType(type),
|
|
257
|
+
};
|
|
258
|
+
// Add to appropriate tier
|
|
259
|
+
budget.tiers[tier].push(item);
|
|
260
|
+
budget.usedTokens += tokens;
|
|
261
|
+
return item;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get default priority for content type
|
|
265
|
+
*/
|
|
266
|
+
function getPriorityForType(type) {
|
|
267
|
+
const priorities = {
|
|
268
|
+
system: 100, // Never drop system prompts
|
|
269
|
+
task: 90, // Current task is critical
|
|
270
|
+
error: 80, // Errors are important for debugging
|
|
271
|
+
file: 70, // Source files are valuable
|
|
272
|
+
response: 60, // AI responses provide continuity
|
|
273
|
+
summary: 50, // Summaries are already condensed
|
|
274
|
+
metadata: 40, // Metadata is recoverable
|
|
275
|
+
reference: 30, // References can be re-fetched
|
|
276
|
+
};
|
|
277
|
+
return priorities[type] ?? 50;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Access an item (updates access time and count)
|
|
281
|
+
*/
|
|
282
|
+
export function accessItem(budget, itemId) {
|
|
283
|
+
for (const tier of ['hot', 'warm', 'cold', 'frozen']) {
|
|
284
|
+
const item = budget.tiers[tier].find(i => i.id === itemId);
|
|
285
|
+
if (item) {
|
|
286
|
+
item.lastAccessedAt = Date.now();
|
|
287
|
+
item.accessCount++;
|
|
288
|
+
return item;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Remove an item from the budget
|
|
295
|
+
*/
|
|
296
|
+
export function removeItem(budget, itemId) {
|
|
297
|
+
for (const tier of ['hot', 'warm', 'cold', 'frozen']) {
|
|
298
|
+
const index = budget.tiers[tier].findIndex(i => i.id === itemId);
|
|
299
|
+
if (index !== -1) {
|
|
300
|
+
const item = budget.tiers[tier][index];
|
|
301
|
+
budget.tiers[tier].splice(index, 1);
|
|
302
|
+
budget.usedTokens -= item.tokens;
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Move item to a different tier
|
|
310
|
+
*/
|
|
311
|
+
export function moveToTier(budget, itemId, targetTier) {
|
|
312
|
+
for (const tier of ['hot', 'warm', 'cold', 'frozen']) {
|
|
313
|
+
const index = budget.tiers[tier].findIndex(i => i.id === itemId);
|
|
314
|
+
if (index !== -1) {
|
|
315
|
+
const item = budget.tiers[tier].splice(index, 1)[0];
|
|
316
|
+
item.tier = targetTier;
|
|
317
|
+
budget.tiers[targetTier].push(item);
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
// ============================================================================
|
|
324
|
+
// TIER AGING
|
|
325
|
+
// ============================================================================
|
|
326
|
+
/**
|
|
327
|
+
* Age items based on access patterns and time
|
|
328
|
+
* Moves items down tiers: hot → warm → cold → frozen
|
|
329
|
+
*/
|
|
330
|
+
export function ageItems(budget, options = {}) {
|
|
331
|
+
const { hotMaxAge = 5 * 60 * 1000, warmMaxAge = 15 * 60 * 1000, coldMaxAge = 30 * 60 * 1000, maxAccessAge = 10 * 60 * 1000, } = options;
|
|
332
|
+
const now = Date.now();
|
|
333
|
+
const result = { aged: 0, byTier: { hot: 0, warm: 0, cold: 0, frozen: 0 } };
|
|
334
|
+
// Process hot → warm
|
|
335
|
+
const hotToAge = budget.tiers.hot.filter(item => {
|
|
336
|
+
const age = now - item.createdAt;
|
|
337
|
+
const accessAge = now - item.lastAccessedAt;
|
|
338
|
+
// System and task items don't age
|
|
339
|
+
if (item.type === 'system' || item.type === 'task')
|
|
340
|
+
return false;
|
|
341
|
+
return age > hotMaxAge || accessAge > maxAccessAge;
|
|
342
|
+
});
|
|
343
|
+
for (const item of hotToAge) {
|
|
344
|
+
moveToTier(budget, item.id, 'warm');
|
|
345
|
+
result.aged++;
|
|
346
|
+
result.byTier.hot++;
|
|
347
|
+
}
|
|
348
|
+
// Process warm → cold
|
|
349
|
+
const warmToAge = budget.tiers.warm.filter(item => {
|
|
350
|
+
const age = now - item.createdAt;
|
|
351
|
+
const accessAge = now - item.lastAccessedAt;
|
|
352
|
+
if (item.type === 'system')
|
|
353
|
+
return false;
|
|
354
|
+
return age > warmMaxAge || accessAge > maxAccessAge * 2;
|
|
355
|
+
});
|
|
356
|
+
for (const item of warmToAge) {
|
|
357
|
+
moveToTier(budget, item.id, 'cold');
|
|
358
|
+
result.aged++;
|
|
359
|
+
result.byTier.warm++;
|
|
360
|
+
}
|
|
361
|
+
// Process cold → frozen
|
|
362
|
+
const coldToAge = budget.tiers.cold.filter(item => {
|
|
363
|
+
const age = now - item.createdAt;
|
|
364
|
+
if (item.type === 'system')
|
|
365
|
+
return false;
|
|
366
|
+
return age > coldMaxAge;
|
|
367
|
+
});
|
|
368
|
+
for (const item of coldToAge) {
|
|
369
|
+
moveToTier(budget, item.id, 'frozen');
|
|
370
|
+
result.aged++;
|
|
371
|
+
result.byTier.cold++;
|
|
372
|
+
}
|
|
373
|
+
return result;
|
|
374
|
+
}
|
|
375
|
+
// ============================================================================
|
|
376
|
+
// COMPACTION
|
|
377
|
+
// ============================================================================
|
|
378
|
+
/**
|
|
379
|
+
* Compact the context budget by summarizing and dropping content
|
|
380
|
+
*
|
|
381
|
+
* Strategy:
|
|
382
|
+
* 1. Drop frozen items with low priority
|
|
383
|
+
* 2. Compress cold items to references
|
|
384
|
+
* 3. Summarize warm items
|
|
385
|
+
* 4. Age hot items if needed
|
|
386
|
+
*/
|
|
387
|
+
export function compactBudget(budget, options = {}) {
|
|
388
|
+
const startTime = Date.now();
|
|
389
|
+
const { targetSaturation = SATURATION_THRESHOLDS.OPTIMAL, preserveTypes = ['system', 'task', 'error'], summarizer = (c, t) => truncateWithPreservation(c, t), } = options;
|
|
390
|
+
const tokensBefore = budget.usedTokens;
|
|
391
|
+
let itemsCompacted = 0;
|
|
392
|
+
let itemsDropped = 0;
|
|
393
|
+
const targetTokens = Math.floor(budget.maxTokens * targetSaturation);
|
|
394
|
+
// Phase 1: Drop frozen items (lowest priority first)
|
|
395
|
+
if (budget.usedTokens > targetTokens) {
|
|
396
|
+
const frozenSorted = [...budget.tiers.frozen].sort((a, b) => a.priority - b.priority);
|
|
397
|
+
for (const item of frozenSorted) {
|
|
398
|
+
if (budget.usedTokens <= targetTokens)
|
|
399
|
+
break;
|
|
400
|
+
if (preserveTypes.includes(item.type))
|
|
401
|
+
continue;
|
|
402
|
+
removeItem(budget, item.id);
|
|
403
|
+
itemsDropped++;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// Phase 2: Compress cold items to minimal references
|
|
407
|
+
if (budget.usedTokens > targetTokens) {
|
|
408
|
+
for (const item of [...budget.tiers.cold]) {
|
|
409
|
+
if (budget.usedTokens <= targetTokens)
|
|
410
|
+
break;
|
|
411
|
+
if (preserveTypes.includes(item.type))
|
|
412
|
+
continue;
|
|
413
|
+
// Compress to ~10% of original
|
|
414
|
+
const targetSize = Math.max(20, Math.floor(item.tokens * 0.1));
|
|
415
|
+
const compressed = summarizer(item.content, targetSize * 4); // chars, not tokens
|
|
416
|
+
const tokenSaved = item.tokens - estimateTokens(compressed);
|
|
417
|
+
item.originalTokens = item.tokens;
|
|
418
|
+
item.content = compressed;
|
|
419
|
+
item.tokens = estimateTokens(compressed);
|
|
420
|
+
item.summarized = true;
|
|
421
|
+
budget.usedTokens -= tokenSaved;
|
|
422
|
+
moveToTier(budget, item.id, 'frozen');
|
|
423
|
+
itemsCompacted++;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Phase 3: Summarize warm items to ~30% size
|
|
427
|
+
if (budget.usedTokens > targetTokens) {
|
|
428
|
+
for (const item of [...budget.tiers.warm]) {
|
|
429
|
+
if (budget.usedTokens <= targetTokens)
|
|
430
|
+
break;
|
|
431
|
+
if (preserveTypes.includes(item.type))
|
|
432
|
+
continue;
|
|
433
|
+
if (item.summarized)
|
|
434
|
+
continue;
|
|
435
|
+
const targetSize = Math.max(50, Math.floor(item.tokens * 0.3));
|
|
436
|
+
const summarized = summarizer(item.content, targetSize * 4);
|
|
437
|
+
const tokenSaved = item.tokens - estimateTokens(summarized);
|
|
438
|
+
item.originalTokens = item.tokens;
|
|
439
|
+
item.content = summarized;
|
|
440
|
+
item.tokens = estimateTokens(summarized);
|
|
441
|
+
item.summarized = true;
|
|
442
|
+
budget.usedTokens -= tokenSaved;
|
|
443
|
+
moveToTier(budget, item.id, 'cold');
|
|
444
|
+
itemsCompacted++;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// Phase 4: Force age hot items if still over budget
|
|
448
|
+
if (budget.usedTokens > targetTokens) {
|
|
449
|
+
ageItems(budget, { hotMaxAge: 0, warmMaxAge: 0, coldMaxAge: 0 });
|
|
450
|
+
}
|
|
451
|
+
// Record compaction in history
|
|
452
|
+
const tokensAfter = budget.usedTokens;
|
|
453
|
+
budget.lastCompaction = Date.now();
|
|
454
|
+
budget.compactionHistory.push({
|
|
455
|
+
timestamp: budget.lastCompaction,
|
|
456
|
+
beforeTokens: tokensBefore,
|
|
457
|
+
afterTokens: tokensAfter,
|
|
458
|
+
itemsCompacted: itemsCompacted + itemsDropped,
|
|
459
|
+
});
|
|
460
|
+
// Keep history bounded
|
|
461
|
+
if (budget.compactionHistory.length > 100) {
|
|
462
|
+
budget.compactionHistory = budget.compactionHistory.slice(-50);
|
|
463
|
+
}
|
|
464
|
+
return {
|
|
465
|
+
success: tokensAfter < tokensBefore || itemsCompacted > 0 || itemsDropped > 0,
|
|
466
|
+
tokensBefore,
|
|
467
|
+
tokensAfter,
|
|
468
|
+
tokensSaved: tokensBefore - tokensAfter,
|
|
469
|
+
itemsCompacted,
|
|
470
|
+
itemsDropped,
|
|
471
|
+
duration: Date.now() - startTime,
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Truncate content while preserving important parts
|
|
476
|
+
*/
|
|
477
|
+
function truncateWithPreservation(content, maxChars) {
|
|
478
|
+
if (content.length <= maxChars)
|
|
479
|
+
return content;
|
|
480
|
+
const lines = content.split('\n');
|
|
481
|
+
// If just a few lines, take from beginning
|
|
482
|
+
if (lines.length <= 5) {
|
|
483
|
+
return content.slice(0, maxChars - 3) + '...';
|
|
484
|
+
}
|
|
485
|
+
// Take first and last lines (often most important)
|
|
486
|
+
const firstLines = lines.slice(0, 2).join('\n');
|
|
487
|
+
const lastLines = lines.slice(-2).join('\n');
|
|
488
|
+
const available = maxChars - firstLines.length - lastLines.length - 10;
|
|
489
|
+
if (available > 50) {
|
|
490
|
+
// Add some middle context
|
|
491
|
+
const middleStart = Math.floor(lines.length / 2) - 1;
|
|
492
|
+
const middleLines = lines.slice(middleStart, middleStart + 2).join('\n').slice(0, available);
|
|
493
|
+
return `${firstLines}\n...\n${middleLines}\n...\n${lastLines}`;
|
|
494
|
+
}
|
|
495
|
+
return `${firstLines}\n...\n${lastLines}`;
|
|
496
|
+
}
|
|
497
|
+
// ============================================================================
|
|
498
|
+
// PERSISTENCE
|
|
499
|
+
// ============================================================================
|
|
500
|
+
const CONTEXT_FILE = 'context-budget.json';
|
|
501
|
+
const MIDAS_DIR = '.midas';
|
|
502
|
+
/**
|
|
503
|
+
* Get context budget file path
|
|
504
|
+
*/
|
|
505
|
+
function getContextPath(projectPath) {
|
|
506
|
+
return join(projectPath, MIDAS_DIR, CONTEXT_FILE);
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Save context budget to disk
|
|
510
|
+
*/
|
|
511
|
+
export function saveContextBudget(projectPath, budget) {
|
|
512
|
+
try {
|
|
513
|
+
const dir = join(projectPath, MIDAS_DIR);
|
|
514
|
+
if (!existsSync(dir)) {
|
|
515
|
+
mkdirSync(dir, { recursive: true });
|
|
516
|
+
}
|
|
517
|
+
const path = getContextPath(projectPath);
|
|
518
|
+
writeFileAtomic.sync(path, JSON.stringify(budget, null, 2));
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
catch {
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Load context budget from disk
|
|
527
|
+
*/
|
|
528
|
+
export function loadContextBudget(projectPath, defaultMaxTokens = DEFAULT_CONTEXT_WINDOW) {
|
|
529
|
+
try {
|
|
530
|
+
const path = getContextPath(projectPath);
|
|
531
|
+
if (!existsSync(path)) {
|
|
532
|
+
return createContextBudget(defaultMaxTokens);
|
|
533
|
+
}
|
|
534
|
+
const raw = readFileSync(path, 'utf-8');
|
|
535
|
+
const data = JSON.parse(raw);
|
|
536
|
+
// Validate structure
|
|
537
|
+
if (!data || typeof data.usedTokens !== 'number' || !data.tiers) {
|
|
538
|
+
return createContextBudget(defaultMaxTokens);
|
|
539
|
+
}
|
|
540
|
+
return data;
|
|
541
|
+
}
|
|
542
|
+
catch {
|
|
543
|
+
return createContextBudget(defaultMaxTokens);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Clear context budget (for new session)
|
|
548
|
+
*/
|
|
549
|
+
export function clearContextBudget(projectPath) {
|
|
550
|
+
const budget = createContextBudget();
|
|
551
|
+
saveContextBudget(projectPath, budget);
|
|
552
|
+
return budget;
|
|
553
|
+
}
|
|
554
|
+
// ============================================================================
|
|
555
|
+
// UTILITY FUNCTIONS
|
|
556
|
+
// ============================================================================
|
|
557
|
+
/**
|
|
558
|
+
* Get all items across all tiers
|
|
559
|
+
*/
|
|
560
|
+
export function getAllItems(budget) {
|
|
561
|
+
return [
|
|
562
|
+
...budget.tiers.hot,
|
|
563
|
+
...budget.tiers.warm,
|
|
564
|
+
...budget.tiers.cold,
|
|
565
|
+
...budget.tiers.frozen,
|
|
566
|
+
];
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Find item by ID
|
|
570
|
+
*/
|
|
571
|
+
export function findItem(budget, itemId) {
|
|
572
|
+
for (const tier of ['hot', 'warm', 'cold', 'frozen']) {
|
|
573
|
+
const item = budget.tiers[tier].find(i => i.id === itemId);
|
|
574
|
+
if (item)
|
|
575
|
+
return item;
|
|
576
|
+
}
|
|
577
|
+
return null;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Count items by type
|
|
581
|
+
*/
|
|
582
|
+
export function countByType(budget) {
|
|
583
|
+
const counts = {
|
|
584
|
+
task: 0,
|
|
585
|
+
file: 0,
|
|
586
|
+
error: 0,
|
|
587
|
+
response: 0,
|
|
588
|
+
summary: 0,
|
|
589
|
+
reference: 0,
|
|
590
|
+
system: 0,
|
|
591
|
+
metadata: 0,
|
|
592
|
+
};
|
|
593
|
+
for (const item of getAllItems(budget)) {
|
|
594
|
+
counts[item.type]++;
|
|
595
|
+
}
|
|
596
|
+
return counts;
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Get budget statistics
|
|
600
|
+
*/
|
|
601
|
+
export function getBudgetStats(budget) {
|
|
602
|
+
const items = getAllItems(budget);
|
|
603
|
+
return {
|
|
604
|
+
totalItems: items.length,
|
|
605
|
+
usedTokens: budget.usedTokens,
|
|
606
|
+
maxTokens: budget.maxTokens,
|
|
607
|
+
saturation: calculateSaturation(budget),
|
|
608
|
+
sessionAge: Date.now() - budget.sessionStart,
|
|
609
|
+
compactionCount: budget.compactionHistory.length,
|
|
610
|
+
averageItemSize: items.length > 0 ? Math.floor(budget.usedTokens / items.length) : 0,
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Validate budget integrity (recalculate tokens)
|
|
615
|
+
*/
|
|
616
|
+
export function validateBudget(budget) {
|
|
617
|
+
let expectedTokens = 0;
|
|
618
|
+
for (const item of getAllItems(budget)) {
|
|
619
|
+
expectedTokens += item.tokens;
|
|
620
|
+
}
|
|
621
|
+
const discrepancy = Math.abs(expectedTokens - budget.usedTokens);
|
|
622
|
+
return {
|
|
623
|
+
valid: discrepancy === 0,
|
|
624
|
+
expectedTokens,
|
|
625
|
+
actualTokens: budget.usedTokens,
|
|
626
|
+
discrepancy,
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Repair budget by recalculating tokens
|
|
631
|
+
*/
|
|
632
|
+
export function repairBudget(budget) {
|
|
633
|
+
let total = 0;
|
|
634
|
+
for (const item of getAllItems(budget)) {
|
|
635
|
+
// Recalculate token count
|
|
636
|
+
item.tokens = estimateTokens(item.content);
|
|
637
|
+
total += item.tokens;
|
|
638
|
+
}
|
|
639
|
+
budget.usedTokens = total;
|
|
13
640
|
}
|
|
14
641
|
//# sourceMappingURL=context.js.map
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|