dino-spec 13.6.0 → 14.0.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/bin/dino-hud.js +1 -1
- package/bin/dino.js +1 -1
- package/dist/core/agents/context-isolation.js +26 -26
- package/dist/core/context/__tests__/budget-thresholds.test.d.ts +5 -0
- package/dist/core/context/__tests__/budget-thresholds.test.d.ts.map +1 -0
- package/dist/core/context/__tests__/budget-thresholds.test.js +223 -0
- package/dist/core/context/__tests__/budget-thresholds.test.js.map +1 -0
- package/dist/core/context/__tests__/compaction-engine.test.d.ts +5 -0
- package/dist/core/context/__tests__/compaction-engine.test.d.ts.map +1 -0
- package/dist/core/context/__tests__/compaction-engine.test.js +474 -0
- package/dist/core/context/__tests__/compaction-engine.test.js.map +1 -0
- package/dist/core/context/__tests__/output-persistence.test.d.ts +5 -0
- package/dist/core/context/__tests__/output-persistence.test.d.ts.map +1 -0
- package/dist/core/context/__tests__/output-persistence.test.js +246 -0
- package/dist/core/context/__tests__/output-persistence.test.js.map +1 -0
- package/dist/core/context/budget-thresholds.d.ts +167 -0
- package/dist/core/context/budget-thresholds.d.ts.map +1 -0
- package/dist/core/context/budget-thresholds.js +234 -0
- package/dist/core/context/budget-thresholds.js.map +1 -0
- package/dist/core/context/compaction-engine.d.ts +193 -0
- package/dist/core/context/compaction-engine.d.ts.map +1 -0
- package/dist/core/context/compaction-engine.js +376 -0
- package/dist/core/context/compaction-engine.js.map +1 -0
- package/dist/core/context/index.d.ts +7 -3
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +22 -3
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/output-persistence.d.ts +142 -0
- package/dist/core/context/output-persistence.d.ts.map +1 -0
- package/dist/core/context/output-persistence.js +242 -0
- package/dist/core/context/output-persistence.js.map +1 -0
- package/dist/core/environment/__tests__/pre-verify.test.d.ts +5 -0
- package/dist/core/environment/__tests__/pre-verify.test.d.ts.map +1 -0
- package/dist/core/environment/__tests__/pre-verify.test.js +343 -0
- package/dist/core/environment/__tests__/pre-verify.test.js.map +1 -0
- package/dist/core/environment/index.d.ts +8 -0
- package/dist/core/environment/index.d.ts.map +1 -0
- package/dist/core/environment/index.js +7 -0
- package/dist/core/environment/index.js.map +1 -0
- package/dist/core/environment/pre-verify.d.ts +63 -0
- package/dist/core/environment/pre-verify.d.ts.map +1 -0
- package/dist/core/environment/pre-verify.js +221 -0
- package/dist/core/environment/pre-verify.js.map +1 -0
- package/dist/core/environment/types.d.ts +37 -0
- package/dist/core/environment/types.d.ts.map +1 -0
- package/dist/core/environment/types.js +5 -0
- package/dist/core/environment/types.js.map +1 -0
- package/dist/core/intelligence/context-budget.d.ts +10 -5
- package/dist/core/intelligence/context-budget.d.ts.map +1 -1
- package/dist/core/intelligence/context-budget.js +12 -5
- package/dist/core/intelligence/context-budget.js.map +1 -1
- package/dist/mcp/__tests__/dynamic-updates.test.d.ts +5 -0
- package/dist/mcp/__tests__/dynamic-updates.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/dynamic-updates.test.js +314 -0
- package/dist/mcp/__tests__/dynamic-updates.test.js.map +1 -0
- package/dist/mcp/dynamic-updates.d.ts +167 -0
- package/dist/mcp/dynamic-updates.d.ts.map +1 -0
- package/dist/mcp/dynamic-updates.js +313 -0
- package/dist/mcp/dynamic-updates.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +5 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/registry.d.ts +4 -4
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +16 -16
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/tools/__tests__/environment.test.d.ts +5 -0
- package/dist/mcp/tools/__tests__/environment.test.d.ts.map +1 -0
- package/dist/mcp/tools/__tests__/environment.test.js +219 -0
- package/dist/mcp/tools/__tests__/environment.test.js.map +1 -0
- package/dist/mcp/tools/environment.d.ts +27 -0
- package/dist/mcp/tools/environment.d.ts.map +1 -0
- package/dist/mcp/tools/environment.js +97 -0
- package/dist/mcp/tools/environment.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +3 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +13 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/output-persistence.d.ts +44 -0
- package/dist/mcp/tools/output-persistence.d.ts.map +1 -0
- package/dist/mcp/tools/output-persistence.js +208 -0
- package/dist/mcp/tools/output-persistence.js.map +1 -0
- package/dist/mcp-server.d.ts +2 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +27 -2
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto Compaction Engine Tests - v14.0.0
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { mkdir, rm, writeFile, readFile } from 'fs/promises';
|
|
7
|
+
import { AUTO_COMPACT_THRESHOLD, COMPACT_OUTPUT_DIR, AUTO_COMPACT_FEATURE_FLAG, shouldAutoCompact, getUsagePercent, generateSessionId, extractDecisions, extractBlockers, extractProgress, createStructuredCompaction, persistStructuredCompaction, listCompactions, runAutoCompaction, formatCompactionEngineResult, getCompactionEngineStats, } from '../compaction-engine.js';
|
|
8
|
+
describe('Auto Compaction Engine', () => {
|
|
9
|
+
const testDir = join(process.cwd(), 'test-compaction-engine-temp');
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
await mkdir(testDir, { recursive: true });
|
|
12
|
+
await mkdir(join(testDir, '.dino'), { recursive: true });
|
|
13
|
+
});
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
try {
|
|
16
|
+
await rm(testDir, { recursive: true, force: true });
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Ignore errors
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
describe('Constants', () => {
|
|
23
|
+
it('should have correct auto-compact threshold', () => {
|
|
24
|
+
expect(AUTO_COMPACT_THRESHOLD).toBe(0.75);
|
|
25
|
+
});
|
|
26
|
+
it('should have correct output directory', () => {
|
|
27
|
+
expect(COMPACT_OUTPUT_DIR).toBe('.dino/compacted');
|
|
28
|
+
});
|
|
29
|
+
it('should have correct feature flag name', () => {
|
|
30
|
+
expect(AUTO_COMPACT_FEATURE_FLAG).toBe('enableAutoCompaction');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('shouldAutoCompact', () => {
|
|
34
|
+
it('should return false when below threshold', () => {
|
|
35
|
+
expect(shouldAutoCompact(100_000, 200_000, 0.75)).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
it('should return true when at threshold', () => {
|
|
38
|
+
expect(shouldAutoCompact(150_000, 200_000, 0.75)).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
it('should return true when above threshold', () => {
|
|
41
|
+
expect(shouldAutoCompact(170_000, 200_000, 0.75)).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('should use default threshold if not specified', () => {
|
|
44
|
+
// 150K / 200K = 75% = exactly at threshold
|
|
45
|
+
expect(shouldAutoCompact(150_000, 200_000)).toBe(true);
|
|
46
|
+
// 140K / 200K = 70% = below threshold
|
|
47
|
+
expect(shouldAutoCompact(140_000, 200_000)).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
it('should use default limit if not specified', () => {
|
|
50
|
+
expect(shouldAutoCompact(150_000)).toBe(true); // 150K / 200K = 75%
|
|
51
|
+
});
|
|
52
|
+
it('should respect custom threshold', () => {
|
|
53
|
+
expect(shouldAutoCompact(100_000, 200_000, 0.5)).toBe(true); // 50%
|
|
54
|
+
expect(shouldAutoCompact(90_000, 200_000, 0.5)).toBe(false); // 45%
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('getUsagePercent', () => {
|
|
58
|
+
it('should calculate correct percentage', () => {
|
|
59
|
+
expect(getUsagePercent(100_000, 200_000)).toBe(50);
|
|
60
|
+
expect(getUsagePercent(150_000, 200_000)).toBe(75);
|
|
61
|
+
expect(getUsagePercent(200_000, 200_000)).toBe(100);
|
|
62
|
+
});
|
|
63
|
+
it('should round to whole number', () => {
|
|
64
|
+
expect(getUsagePercent(133_333, 200_000)).toBe(67);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('generateSessionId', () => {
|
|
68
|
+
it('should generate valid session ID', () => {
|
|
69
|
+
const id = generateSessionId();
|
|
70
|
+
expect(id).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}$/);
|
|
71
|
+
});
|
|
72
|
+
it('should generate unique IDs', () => {
|
|
73
|
+
const id1 = generateSessionId();
|
|
74
|
+
// Wait a tiny bit to ensure different timestamp
|
|
75
|
+
const id2 = generateSessionId();
|
|
76
|
+
// They might be same if called in same second, which is OK
|
|
77
|
+
expect(typeof id1).toBe('string');
|
|
78
|
+
expect(typeof id2).toBe('string');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('extractDecisions', () => {
|
|
82
|
+
it('should extract decisions from notes section', () => {
|
|
83
|
+
const sections = [{
|
|
84
|
+
name: 'Notes',
|
|
85
|
+
content: '- Decided to use TypeScript for better type safety',
|
|
86
|
+
lines: ['- Decided to use TypeScript for better type safety'],
|
|
87
|
+
}];
|
|
88
|
+
const decisions = extractDecisions(sections);
|
|
89
|
+
expect(decisions.length).toBe(1);
|
|
90
|
+
expect(decisions[0].text).toContain('TypeScript');
|
|
91
|
+
expect(decisions[0].type).toBe('approach');
|
|
92
|
+
});
|
|
93
|
+
it('should extract choice type decisions', () => {
|
|
94
|
+
const sections = [{
|
|
95
|
+
name: 'Session Notes',
|
|
96
|
+
content: '- Chose Redux over MobX for state management',
|
|
97
|
+
lines: ['- Chose Redux over MobX for state management'],
|
|
98
|
+
}];
|
|
99
|
+
const decisions = extractDecisions(sections);
|
|
100
|
+
expect(decisions.length).toBe(1);
|
|
101
|
+
expect(decisions[0].type).toBe('choice');
|
|
102
|
+
});
|
|
103
|
+
it('should extract topic and choice', () => {
|
|
104
|
+
const sections = [{
|
|
105
|
+
name: 'Notes',
|
|
106
|
+
content: '- Decided to use ESM because CommonJS is outdated',
|
|
107
|
+
lines: ['- Decided to use ESM because CommonJS is outdated'],
|
|
108
|
+
}];
|
|
109
|
+
const decisions = extractDecisions(sections);
|
|
110
|
+
expect(decisions.length).toBe(1);
|
|
111
|
+
expect(decisions[0].choice).toContain('ESM');
|
|
112
|
+
expect(decisions[0].rationale).toContain('CommonJS');
|
|
113
|
+
});
|
|
114
|
+
it('should handle empty sections', () => {
|
|
115
|
+
const sections = [{
|
|
116
|
+
name: 'Notes',
|
|
117
|
+
content: '',
|
|
118
|
+
lines: [],
|
|
119
|
+
}];
|
|
120
|
+
const decisions = extractDecisions(sections);
|
|
121
|
+
expect(decisions).toEqual([]);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('extractBlockers', () => {
|
|
125
|
+
it('should extract blockers from blocker section', () => {
|
|
126
|
+
const sections = [{
|
|
127
|
+
name: 'Blockers',
|
|
128
|
+
content: '- Fix failing test in auth module',
|
|
129
|
+
lines: ['- Fix failing test in auth module'],
|
|
130
|
+
}];
|
|
131
|
+
const blockers = extractBlockers(sections);
|
|
132
|
+
expect(blockers.length).toBe(1);
|
|
133
|
+
expect(blockers[0].text).toBe('Fix failing test in auth module');
|
|
134
|
+
expect(blockers[0].status).toBe('active');
|
|
135
|
+
});
|
|
136
|
+
it('should skip empty blocker placeholder', () => {
|
|
137
|
+
const sections = [{
|
|
138
|
+
name: 'Blockers',
|
|
139
|
+
content: '_No active blockers._',
|
|
140
|
+
lines: ['- _No active blockers._'],
|
|
141
|
+
}];
|
|
142
|
+
const blockers = extractBlockers(sections);
|
|
143
|
+
expect(blockers).toEqual([]);
|
|
144
|
+
});
|
|
145
|
+
it('should extract timestamp from blocker', () => {
|
|
146
|
+
const sections = [{
|
|
147
|
+
name: 'Blockers',
|
|
148
|
+
content: '- 2026-01-27: Fix failing test',
|
|
149
|
+
lines: ['- 2026-01-27: Fix failing test'],
|
|
150
|
+
}];
|
|
151
|
+
const blockers = extractBlockers(sections);
|
|
152
|
+
expect(blockers.length).toBe(1);
|
|
153
|
+
expect(blockers[0].addedAt).toBe('2026-01-27');
|
|
154
|
+
expect(blockers[0].text).toBe('Fix failing test');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe('extractProgress', () => {
|
|
158
|
+
it('should extract progress signals', () => {
|
|
159
|
+
const sections = [{
|
|
160
|
+
name: 'Progress',
|
|
161
|
+
content: '- 2026-01-27 10:00: tests-fixed - All tests now passing',
|
|
162
|
+
lines: ['- 2026-01-27 10:00: tests-fixed - All tests now passing'],
|
|
163
|
+
}];
|
|
164
|
+
const progress = extractProgress(sections);
|
|
165
|
+
expect(progress.length).toBe(1);
|
|
166
|
+
expect(progress[0].type).toBe('tests-fixed');
|
|
167
|
+
expect(progress[0].text).toBe('All tests now passing');
|
|
168
|
+
expect(progress[0].timestamp).toBe('2026-01-27 10:00');
|
|
169
|
+
});
|
|
170
|
+
it('should handle empty progress section', () => {
|
|
171
|
+
const sections = [{
|
|
172
|
+
name: 'Progress',
|
|
173
|
+
content: '',
|
|
174
|
+
lines: [],
|
|
175
|
+
}];
|
|
176
|
+
const progress = extractProgress(sections);
|
|
177
|
+
expect(progress).toEqual([]);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe('createStructuredCompaction', () => {
|
|
181
|
+
it('should create complete structured output', () => {
|
|
182
|
+
const sections = [
|
|
183
|
+
{
|
|
184
|
+
name: 'Notes',
|
|
185
|
+
content: '- Decided to use TypeScript',
|
|
186
|
+
lines: ['- Decided to use TypeScript'],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'Blockers',
|
|
190
|
+
content: '- Fix failing test',
|
|
191
|
+
lines: ['- Fix failing test'],
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: 'Progress',
|
|
195
|
+
content: '- 2026-01-27 10:00: tests-fixed - Tests passing',
|
|
196
|
+
lines: ['- 2026-01-27 10:00: tests-fixed - Tests passing'],
|
|
197
|
+
},
|
|
198
|
+
];
|
|
199
|
+
const output = createStructuredCompaction(sections, 10000, 3000, 'test-session');
|
|
200
|
+
expect(output.sessionId).toBe('test-session');
|
|
201
|
+
expect(output.originalTokens).toBe(10000);
|
|
202
|
+
expect(output.tokensRecovered).toBe(3000);
|
|
203
|
+
expect(output.decisions.length).toBe(1);
|
|
204
|
+
expect(output.blockers.length).toBe(1);
|
|
205
|
+
expect(output.progress.length).toBe(1);
|
|
206
|
+
expect(output.timestamp).toBeTruthy();
|
|
207
|
+
});
|
|
208
|
+
it('should generate session ID if not provided', () => {
|
|
209
|
+
const output = createStructuredCompaction([], 1000, 500);
|
|
210
|
+
expect(output.sessionId).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}$/);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe('persistStructuredCompaction', () => {
|
|
214
|
+
it('should persist compaction to disk', async () => {
|
|
215
|
+
const compaction = {
|
|
216
|
+
decisions: [],
|
|
217
|
+
blockers: [],
|
|
218
|
+
progress: [],
|
|
219
|
+
timestamp: new Date().toISOString(),
|
|
220
|
+
sessionId: 'test-persist',
|
|
221
|
+
originalTokens: 5000,
|
|
222
|
+
tokensRecovered: 2000,
|
|
223
|
+
};
|
|
224
|
+
const outputPath = await persistStructuredCompaction(compaction, testDir);
|
|
225
|
+
// Use path-agnostic assertion (Windows uses backslashes)
|
|
226
|
+
expect(outputPath.replace(/\\/g, '/')).toBe('.dino/compacted/test-persist.json');
|
|
227
|
+
// Verify file exists and content is correct
|
|
228
|
+
const content = await readFile(join(testDir, outputPath), 'utf-8');
|
|
229
|
+
const saved = JSON.parse(content);
|
|
230
|
+
expect(saved.sessionId).toBe('test-persist');
|
|
231
|
+
expect(saved.originalTokens).toBe(5000);
|
|
232
|
+
});
|
|
233
|
+
it('should create compacted directory if not exists', async () => {
|
|
234
|
+
const compaction = {
|
|
235
|
+
decisions: [],
|
|
236
|
+
blockers: [],
|
|
237
|
+
progress: [],
|
|
238
|
+
timestamp: new Date().toISOString(),
|
|
239
|
+
sessionId: 'test-mkdir',
|
|
240
|
+
originalTokens: 1000,
|
|
241
|
+
tokensRecovered: 500,
|
|
242
|
+
};
|
|
243
|
+
const outputPath = await persistStructuredCompaction(compaction, testDir);
|
|
244
|
+
expect(outputPath).toContain('test-mkdir.json');
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
describe('listCompactions', () => {
|
|
248
|
+
it('should return empty array when no compactions', async () => {
|
|
249
|
+
const compactions = await listCompactions(testDir);
|
|
250
|
+
expect(compactions).toEqual([]);
|
|
251
|
+
});
|
|
252
|
+
it('should list persisted compactions', async () => {
|
|
253
|
+
// Create multiple compactions
|
|
254
|
+
const compaction1 = {
|
|
255
|
+
decisions: [],
|
|
256
|
+
blockers: [],
|
|
257
|
+
progress: [],
|
|
258
|
+
timestamp: '2026-01-27T10:00:00.000Z',
|
|
259
|
+
sessionId: 'session-1',
|
|
260
|
+
originalTokens: 5000,
|
|
261
|
+
tokensRecovered: 2000,
|
|
262
|
+
};
|
|
263
|
+
const compaction2 = {
|
|
264
|
+
decisions: [],
|
|
265
|
+
blockers: [],
|
|
266
|
+
progress: [],
|
|
267
|
+
timestamp: '2026-01-27T11:00:00.000Z',
|
|
268
|
+
sessionId: 'session-2',
|
|
269
|
+
originalTokens: 6000,
|
|
270
|
+
tokensRecovered: 2500,
|
|
271
|
+
};
|
|
272
|
+
await persistStructuredCompaction(compaction1, testDir);
|
|
273
|
+
await persistStructuredCompaction(compaction2, testDir);
|
|
274
|
+
const compactions = await listCompactions(testDir);
|
|
275
|
+
expect(compactions.length).toBe(2);
|
|
276
|
+
// Should be sorted by timestamp (newest first)
|
|
277
|
+
expect(compactions[0].sessionId).toBe('session-2');
|
|
278
|
+
expect(compactions[1].sessionId).toBe('session-1');
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
describe('runAutoCompaction', () => {
|
|
282
|
+
beforeEach(async () => {
|
|
283
|
+
// Create a session.md file
|
|
284
|
+
const sessionContent = `# Session
|
|
285
|
+
|
|
286
|
+
## Notes
|
|
287
|
+
- Decided to use TypeScript for type safety
|
|
288
|
+
- Regular note
|
|
289
|
+
|
|
290
|
+
## Blockers
|
|
291
|
+
- Fix failing test
|
|
292
|
+
|
|
293
|
+
## Progress
|
|
294
|
+
- 2026-01-27 10:00: tests-fixed - Tests now passing
|
|
295
|
+
`;
|
|
296
|
+
await writeFile(join(testDir, '.dino', 'session.md'), sessionContent);
|
|
297
|
+
});
|
|
298
|
+
it('should not trigger when below threshold', async () => {
|
|
299
|
+
const result = await runAutoCompaction({
|
|
300
|
+
projectDir: testDir,
|
|
301
|
+
threshold: 0.99, // Very high threshold
|
|
302
|
+
limit: 200_000,
|
|
303
|
+
});
|
|
304
|
+
expect(result.triggered).toBe(false);
|
|
305
|
+
expect(result.executed).toBe(false);
|
|
306
|
+
expect(result.reason).toContain('below threshold');
|
|
307
|
+
});
|
|
308
|
+
it('should trigger with force option', async () => {
|
|
309
|
+
const result = await runAutoCompaction({
|
|
310
|
+
projectDir: testDir,
|
|
311
|
+
force: true,
|
|
312
|
+
persistOutput: true,
|
|
313
|
+
});
|
|
314
|
+
expect(result.triggered).toBe(true);
|
|
315
|
+
expect(result.executed).toBe(true);
|
|
316
|
+
expect(result.reason).toBe('Forced compaction');
|
|
317
|
+
expect(result.compactionResult).toBeTruthy();
|
|
318
|
+
});
|
|
319
|
+
it('should support dry run mode', async () => {
|
|
320
|
+
const result = await runAutoCompaction({
|
|
321
|
+
projectDir: testDir,
|
|
322
|
+
force: true,
|
|
323
|
+
dryRun: true,
|
|
324
|
+
});
|
|
325
|
+
expect(result.triggered).toBe(true);
|
|
326
|
+
expect(result.executed).toBe(false);
|
|
327
|
+
expect(result.reason).toBe('Dry run - compaction not executed');
|
|
328
|
+
expect(result.structuredOutput).toBeTruthy();
|
|
329
|
+
expect(result.compactionResult).toBeUndefined();
|
|
330
|
+
});
|
|
331
|
+
it('should extract structured output when triggered', async () => {
|
|
332
|
+
const result = await runAutoCompaction({
|
|
333
|
+
projectDir: testDir,
|
|
334
|
+
force: true,
|
|
335
|
+
persistOutput: false,
|
|
336
|
+
});
|
|
337
|
+
expect(result.structuredOutput).toBeTruthy();
|
|
338
|
+
expect(result.structuredOutput.decisions.length).toBeGreaterThanOrEqual(1);
|
|
339
|
+
expect(result.structuredOutput.blockers.length).toBe(1);
|
|
340
|
+
expect(result.structuredOutput.progress.length).toBe(1);
|
|
341
|
+
});
|
|
342
|
+
it('should persist structured output when enabled', async () => {
|
|
343
|
+
const result = await runAutoCompaction({
|
|
344
|
+
projectDir: testDir,
|
|
345
|
+
force: true,
|
|
346
|
+
persistOutput: true,
|
|
347
|
+
sessionId: 'test-run',
|
|
348
|
+
});
|
|
349
|
+
// Use path-agnostic assertion (Windows uses backslashes)
|
|
350
|
+
expect(result.outputPath.replace(/\\/g, '/')).toBe('.dino/compacted/test-run.json');
|
|
351
|
+
// Verify file was created
|
|
352
|
+
const compactions = await listCompactions(testDir);
|
|
353
|
+
expect(compactions.length).toBe(1);
|
|
354
|
+
expect(compactions[0].sessionId).toBe('test-run');
|
|
355
|
+
});
|
|
356
|
+
it('should include compaction result when executed', async () => {
|
|
357
|
+
const result = await runAutoCompaction({
|
|
358
|
+
projectDir: testDir,
|
|
359
|
+
force: true,
|
|
360
|
+
});
|
|
361
|
+
expect(result.compactionResult).toBeTruthy();
|
|
362
|
+
expect(result.compactionResult.originalTokens).toBeGreaterThan(0);
|
|
363
|
+
expect(result.compactionResult.compactedTokens).toBeGreaterThan(0);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
describe('formatCompactionEngineResult', () => {
|
|
367
|
+
it('should format non-triggered result', () => {
|
|
368
|
+
const result = {
|
|
369
|
+
triggered: false,
|
|
370
|
+
executed: false,
|
|
371
|
+
reason: 'Context usage (50%) below threshold (75%)',
|
|
372
|
+
usagePercent: 50,
|
|
373
|
+
currentTokens: 100_000,
|
|
374
|
+
limit: 200_000,
|
|
375
|
+
};
|
|
376
|
+
const formatted = formatCompactionEngineResult(result);
|
|
377
|
+
expect(formatted).toContain('Not Triggered');
|
|
378
|
+
expect(formatted).toContain('50%');
|
|
379
|
+
expect(formatted).toContain('100,000');
|
|
380
|
+
});
|
|
381
|
+
it('should format dry run result', () => {
|
|
382
|
+
const result = {
|
|
383
|
+
triggered: true,
|
|
384
|
+
executed: false,
|
|
385
|
+
reason: 'Dry run - compaction not executed',
|
|
386
|
+
usagePercent: 80,
|
|
387
|
+
currentTokens: 160_000,
|
|
388
|
+
limit: 200_000,
|
|
389
|
+
structuredOutput: {
|
|
390
|
+
decisions: [{ text: 'test', topic: 't', choice: 'c', type: 'decision' }],
|
|
391
|
+
blockers: [],
|
|
392
|
+
progress: [],
|
|
393
|
+
timestamp: '2026-01-27T10:00:00Z',
|
|
394
|
+
sessionId: 'test',
|
|
395
|
+
originalTokens: 160_000,
|
|
396
|
+
tokensRecovered: 50_000,
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
const formatted = formatCompactionEngineResult(result);
|
|
400
|
+
expect(formatted).toContain('Dry Run');
|
|
401
|
+
expect(formatted).toContain('Decisions: 1');
|
|
402
|
+
expect(formatted).toContain('50,000');
|
|
403
|
+
});
|
|
404
|
+
it('should format executed result', () => {
|
|
405
|
+
const result = {
|
|
406
|
+
triggered: true,
|
|
407
|
+
executed: true,
|
|
408
|
+
reason: 'Context usage (80%) exceeded threshold (75%)',
|
|
409
|
+
usagePercent: 80,
|
|
410
|
+
currentTokens: 160_000,
|
|
411
|
+
limit: 200_000,
|
|
412
|
+
compactionResult: {
|
|
413
|
+
originalTokens: 160_000,
|
|
414
|
+
compactedTokens: 100_000,
|
|
415
|
+
reductionPercent: 37,
|
|
416
|
+
preservedDecisions: ['test'],
|
|
417
|
+
archivedItems: 5,
|
|
418
|
+
deduplicatedBlockers: 1,
|
|
419
|
+
decisionsExtractedToMemory: 2,
|
|
420
|
+
learningsExtractedToMemory: 1,
|
|
421
|
+
},
|
|
422
|
+
outputPath: '.dino/compacted/test.json',
|
|
423
|
+
};
|
|
424
|
+
const formatted = formatCompactionEngineResult(result);
|
|
425
|
+
expect(formatted).toContain('Executed');
|
|
426
|
+
expect(formatted).toContain('Reduction: 37%');
|
|
427
|
+
expect(formatted).toContain('Archived items: 5');
|
|
428
|
+
expect(formatted).toContain('.dino/compacted/test.json');
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
describe('getCompactionEngineStats', () => {
|
|
432
|
+
it('should return zero stats when no compactions', async () => {
|
|
433
|
+
const stats = await getCompactionEngineStats(testDir);
|
|
434
|
+
expect(stats.compactionCount).toBe(0);
|
|
435
|
+
expect(stats.totalTokensRecovered).toBe(0);
|
|
436
|
+
expect(stats.totalDecisionsExtracted).toBe(0);
|
|
437
|
+
expect(stats.totalBlockersExtracted).toBe(0);
|
|
438
|
+
expect(stats.latestCompaction).toBeNull();
|
|
439
|
+
});
|
|
440
|
+
it('should calculate correct stats', async () => {
|
|
441
|
+
// Create compactions
|
|
442
|
+
const compaction1 = {
|
|
443
|
+
decisions: [{ text: 'd1', topic: 't', choice: 'c', type: 'decision' }],
|
|
444
|
+
blockers: [{ text: 'b1', status: 'active' }],
|
|
445
|
+
progress: [],
|
|
446
|
+
timestamp: '2026-01-27T10:00:00.000Z',
|
|
447
|
+
sessionId: 'session-1',
|
|
448
|
+
originalTokens: 10000,
|
|
449
|
+
tokensRecovered: 3000,
|
|
450
|
+
};
|
|
451
|
+
const compaction2 = {
|
|
452
|
+
decisions: [
|
|
453
|
+
{ text: 'd2', topic: 't', choice: 'c', type: 'decision' },
|
|
454
|
+
{ text: 'd3', topic: 't', choice: 'c', type: 'decision' },
|
|
455
|
+
],
|
|
456
|
+
blockers: [],
|
|
457
|
+
progress: [],
|
|
458
|
+
timestamp: '2026-01-27T11:00:00.000Z',
|
|
459
|
+
sessionId: 'session-2',
|
|
460
|
+
originalTokens: 8000,
|
|
461
|
+
tokensRecovered: 2500,
|
|
462
|
+
};
|
|
463
|
+
await persistStructuredCompaction(compaction1, testDir);
|
|
464
|
+
await persistStructuredCompaction(compaction2, testDir);
|
|
465
|
+
const stats = await getCompactionEngineStats(testDir);
|
|
466
|
+
expect(stats.compactionCount).toBe(2);
|
|
467
|
+
expect(stats.totalTokensRecovered).toBe(5500);
|
|
468
|
+
expect(stats.totalDecisionsExtracted).toBe(3);
|
|
469
|
+
expect(stats.totalBlockersExtracted).toBe(1);
|
|
470
|
+
expect(stats.latestCompaction).toBe('2026-01-27T11:00:00.000Z');
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
//# sourceMappingURL=compaction-engine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-engine.test.js","sourceRoot":"","sources":["../../../../src/core/context/__tests__/compaction-engine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-persistence.test.d.ts","sourceRoot":"","sources":["../../../../src/core/context/__tests__/output-persistence.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|