midas-mcp 5.41.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.
Files changed (34) hide show
  1. package/dist/analyzer.d.ts.map +1 -1
  2. package/dist/analyzer.js +9 -2
  3. package/dist/analyzer.js.map +1 -1
  4. package/dist/context.d.ts +264 -5
  5. package/dist/context.d.ts.map +1 -1
  6. package/dist/context.js +634 -7
  7. package/dist/context.js.map +1 -1
  8. package/dist/experiments/recursive-planning/recursive-session.d.ts +201 -0
  9. package/dist/experiments/recursive-planning/recursive-session.d.ts.map +1 -0
  10. package/dist/experiments/recursive-planning/recursive-session.js +348 -0
  11. package/dist/experiments/recursive-planning/recursive-session.js.map +1 -0
  12. package/dist/experiments/recursive-planning/recursive-session.test.d.ts +19 -0
  13. package/dist/experiments/recursive-planning/recursive-session.test.d.ts.map +1 -0
  14. package/dist/experiments/recursive-planning/recursive-session.test.js +799 -0
  15. package/dist/experiments/recursive-planning/recursive-session.test.js.map +1 -0
  16. package/dist/preflight.d.ts +140 -0
  17. package/dist/preflight.d.ts.map +1 -0
  18. package/dist/preflight.js +1100 -0
  19. package/dist/preflight.js.map +1 -0
  20. package/dist/server.js +4 -4
  21. package/dist/server.js.map +1 -1
  22. package/dist/tools/index.d.ts +1 -1
  23. package/dist/tools/index.d.ts.map +1 -1
  24. package/dist/tools/index.js +4 -2
  25. package/dist/tools/index.js.map +1 -1
  26. package/dist/tools/preflight.d.ts +121 -0
  27. package/dist/tools/preflight.d.ts.map +1 -0
  28. package/dist/tools/preflight.js +144 -0
  29. package/dist/tools/preflight.js.map +1 -0
  30. package/dist/tools/verify.js +2 -2
  31. package/dist/tools/verify.js.map +1 -1
  32. package/dist/tui.js +53 -53
  33. package/dist/tui.js.map +1 -1
  34. package/package.json +1 -1
package/dist/context.js CHANGED
@@ -1,14 +1,641 @@
1
1
  /**
2
- * Context Utilities for Midas
2
+ * Context Management for Midas
3
3
  *
4
- * Token estimation for prompt building.
4
+ * Comprehensive context budget tracking, tier-based content management,
5
+ * and compaction alerts for optimal LLM context window usage.
5
6
  *
6
- * Note: Context compression via system/user prompt split is handled in analyzer.ts.
7
- * The system prompt contains stable methodology (cached by Claude API).
8
- * The user prompt contains dynamic project state (not cached).
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
- return Math.ceil(text.length / 4);
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
@@ -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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"}