dino-spec 13.6.1 → 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/README.md +82 -5
- package/dist/commands/hud.d.ts +1 -8
- package/dist/commands/hud.d.ts.map +1 -1
- package/dist/commands/hud.js +4 -18
- package/dist/commands/hud.js.map +1 -1
- package/dist/core/config/feature-flags.d.ts +25 -1
- package/dist/core/config/feature-flags.d.ts.map +1 -1
- package/dist/core/config/feature-flags.js +7 -1
- package/dist/core/config/feature-flags.js.map +1 -1
- 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/auto-injection-engine.d.ts +10 -1
- package/dist/core/context/auto-injection-engine.d.ts.map +1 -1
- package/dist/core/context/auto-injection-engine.js +45 -2
- package/dist/core/context/auto-injection-engine.js.map +1 -1
- 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/context-health.d.ts +27 -2
- package/dist/core/context/context-health.d.ts.map +1 -1
- package/dist/core/context/context-health.js +98 -12
- package/dist/core/context/context-health.js.map +1 -1
- package/dist/core/context/focus-resource-loader.d.ts +143 -0
- package/dist/core/context/focus-resource-loader.d.ts.map +1 -0
- package/dist/core/context/focus-resource-loader.js +305 -0
- package/dist/core/context/focus-resource-loader.js.map +1 -0
- package/dist/core/context/index.d.ts +10 -5
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +40 -5
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/lazy-loader.d.ts +44 -1
- package/dist/core/context/lazy-loader.d.ts.map +1 -1
- package/dist/core/context/lazy-loader.js +59 -1
- package/dist/core/context/lazy-loader.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/context-repl/__tests__/repl-environment.test.d.ts +7 -0
- package/dist/core/context-repl/__tests__/repl-environment.test.d.ts.map +1 -0
- package/dist/core/context-repl/__tests__/repl-environment.test.js +335 -0
- package/dist/core/context-repl/__tests__/repl-environment.test.js.map +1 -0
- package/dist/core/context-repl/context-window-monitor.d.ts +181 -0
- package/dist/core/context-repl/context-window-monitor.d.ts.map +1 -0
- package/dist/core/context-repl/context-window-monitor.js +309 -0
- package/dist/core/context-repl/context-window-monitor.js.map +1 -0
- package/dist/core/context-repl/index.d.ts +8 -3
- package/dist/core/context-repl/index.d.ts.map +1 -1
- package/dist/core/context-repl/index.js +11 -3
- package/dist/core/context-repl/index.js.map +1 -1
- package/dist/core/context-repl/repl-environment.d.ts +66 -0
- package/dist/core/context-repl/repl-environment.d.ts.map +1 -0
- package/dist/core/context-repl/repl-environment.js +795 -0
- package/dist/core/context-repl/repl-environment.js.map +1 -0
- package/dist/core/context-repl/types.d.ts +277 -1
- package/dist/core/context-repl/types.d.ts.map +1 -1
- package/dist/core/context-repl/types.js +52 -1
- package/dist/core/context-repl/types.js.map +1 -1
- 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/generator/claude-md.js +1 -1
- 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/core/provider/storage.d.ts.map +1 -1
- package/dist/core/provider/storage.js +1 -2
- package/dist/core/provider/storage.js.map +1 -1
- package/dist/hooks/post-edit.js +73 -0
- package/dist/hooks/post-edit.js.map +1 -1
- package/dist/hooks/session-start.js +115 -0
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/types.js +1 -1
- package/dist/hooks/user-prompt-submit.js +100 -0
- package/dist/hooks/user-prompt-submit.js.map +1 -1
- package/dist/hud/config.d.ts +3 -28
- package/dist/hud/config.d.ts.map +1 -1
- package/dist/hud/config.js +8 -60
- package/dist/hud/config.js.map +1 -1
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +0 -1
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/render/budget-bar.d.ts +0 -2
- package/dist/hud/render/budget-bar.d.ts.map +1 -1
- package/dist/hud/render/budget-bar.js +5 -8
- package/dist/hud/render/budget-bar.js.map +1 -1
- package/dist/hud/stdin.d.ts +0 -3
- package/dist/hud/stdin.d.ts.map +1 -1
- package/dist/hud/stdin.js +2 -29
- package/dist/hud/stdin.js.map +1 -1
- package/dist/hud/types.d.ts +0 -2
- package/dist/hud/types.d.ts.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/focus-filter.d.ts +74 -0
- package/dist/mcp/focus-filter.d.ts.map +1 -0
- package/dist/mcp/focus-filter.js +229 -0
- package/dist/mcp/focus-filter.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/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +12 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-tiers.d.ts.map +1 -1
- package/dist/mcp/tool-tiers.js +5 -0
- package/dist/mcp/tool-tiers.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/auto-inject.d.ts +36 -0
- package/dist/mcp/tools/auto-inject.d.ts.map +1 -0
- package/dist/mcp/tools/auto-inject.js +143 -0
- package/dist/mcp/tools/auto-inject.js.map +1 -0
- package/dist/mcp/tools/auto-unload.d.ts +29 -0
- package/dist/mcp/tools/auto-unload.d.ts.map +1 -0
- package/dist/mcp/tools/auto-unload.js +151 -0
- package/dist/mcp/tools/auto-unload.js.map +1 -0
- package/dist/mcp/tools/context-repl.d.ts +48 -0
- package/dist/mcp/tools/context-repl.d.ts.map +1 -0
- package/dist/mcp/tools/context-repl.js +290 -0
- package/dist/mcp/tools/context-repl.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/health.d.ts +29 -0
- package/dist/mcp/tools/health.d.ts.map +1 -0
- package/dist/mcp/tools/health.js +171 -0
- package/dist/mcp/tools/health.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +9 -2
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +37 -2
- 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 +36 -7
- package/dist/mcp-server.js.map +1 -1
- package/dist/rules/index.js +2 -2
- package/dist/utils/exec.js +2 -2
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/gitignore.d.ts.map +1 -1
- package/dist/utils/gitignore.js +5 -0
- package/dist/utils/gitignore.js.map +1 -1
- package/package.json +76 -77
- package/dist/hud/config-tui.d.ts +0 -25
- package/dist/hud/config-tui.d.ts.map +0 -1
- package/dist/hud/config-tui.js +0 -199
- package/dist/hud/config-tui.js.map +0 -1
- package/dist/hud/models.d.ts +0 -58
- package/dist/hud/models.d.ts.map +0 -1
- package/dist/hud/models.js +0 -124
- package/dist/hud/models.js.map +0 -1
- package/dist/hud/token-estimator.d.ts +0 -79
- package/dist/hud/token-estimator.d.ts.map +0 -1
- package/dist/hud/token-estimator.js +0 -126
- package/dist/hud/token-estimator.js.map +0 -1
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto Compaction Engine - v14.0.0
|
|
3
|
+
*
|
|
4
|
+
* Automatic context compaction that triggers when context usage
|
|
5
|
+
* exceeds configurable thresholds. Extracts decisions, blockers,
|
|
6
|
+
* and progress to structured format for persistence.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Configurable auto-compact threshold (default: 75%)
|
|
10
|
+
* - Integration with ContextBudgetTracker
|
|
11
|
+
* - Structured JSON output preserving decisions/learnings
|
|
12
|
+
* - CLI command support: dino compact --auto
|
|
13
|
+
*
|
|
14
|
+
* Reference: Anthropic context engineering best practices
|
|
15
|
+
*/
|
|
16
|
+
import { join } from 'path';
|
|
17
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
18
|
+
import { compactSession, getCompactionStats, parseSessionSections, extractArchitecturalDecisions, } from '../intelligence/session-compactor.js';
|
|
19
|
+
import { getEffectiveLimit, } from './budget-thresholds.js';
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Constants
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Default auto-compact threshold (75%)
|
|
25
|
+
* Lower than warning threshold to provide headroom
|
|
26
|
+
*/
|
|
27
|
+
export const AUTO_COMPACT_THRESHOLD = 0.75;
|
|
28
|
+
/**
|
|
29
|
+
* Directory for compacted outputs
|
|
30
|
+
*/
|
|
31
|
+
export const COMPACT_OUTPUT_DIR = '.dino/compacted';
|
|
32
|
+
/**
|
|
33
|
+
* Feature flag for auto-compaction
|
|
34
|
+
*/
|
|
35
|
+
export const AUTO_COMPACT_FEATURE_FLAG = 'enableAutoCompaction';
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// Core Functions
|
|
38
|
+
// =============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Check if auto-compaction should trigger
|
|
41
|
+
*
|
|
42
|
+
* @param currentTokens Current token count
|
|
43
|
+
* @param limit Token limit
|
|
44
|
+
* @param threshold Threshold percentage (0-1)
|
|
45
|
+
* @returns Whether compaction should trigger
|
|
46
|
+
*/
|
|
47
|
+
export function shouldAutoCompact(currentTokens, limit = 200_000, threshold = AUTO_COMPACT_THRESHOLD) {
|
|
48
|
+
const usagePercent = currentTokens / limit;
|
|
49
|
+
return usagePercent >= threshold;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Calculate usage percentage
|
|
53
|
+
*/
|
|
54
|
+
export function getUsagePercent(currentTokens, limit) {
|
|
55
|
+
return Math.round((currentTokens / limit) * 100);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Extract topic from decision text
|
|
59
|
+
*/
|
|
60
|
+
function extractTopic(text) {
|
|
61
|
+
// Try to extract topic from common patterns
|
|
62
|
+
const patterns = [
|
|
63
|
+
/(?:for|regarding|about)\s+(.+?)(?:\.|,|$)/i,
|
|
64
|
+
/^(.+?):\s*/,
|
|
65
|
+
/(?:decided|chose|selected)\s+(?:to\s+)?(?:use\s+)?(.+?)(?:\s+(?:for|because|over|instead))/i,
|
|
66
|
+
];
|
|
67
|
+
for (const pattern of patterns) {
|
|
68
|
+
const match = text.match(pattern);
|
|
69
|
+
if (match && match[1]) {
|
|
70
|
+
const topic = match[1].trim();
|
|
71
|
+
if (topic.length > 5 && topic.length < 100) {
|
|
72
|
+
return topic;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Fallback: use first 50 chars
|
|
77
|
+
const clean = text.replace(/^- /, '').trim();
|
|
78
|
+
return clean.length > 50 ? clean.substring(0, 47) + '...' : clean;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Extract choice from decision text
|
|
82
|
+
*/
|
|
83
|
+
function extractChoice(text) {
|
|
84
|
+
const patterns = [
|
|
85
|
+
/(?:chose|selected|went\s+with|using|use)\s+(.+?)(?:\s+(?:over|instead|because|for)|$)/i,
|
|
86
|
+
/decided\s+to\s+(.+?)(?:\.|,|$)/i,
|
|
87
|
+
/approach:\s*(.+?)(?:\.|$)/i,
|
|
88
|
+
];
|
|
89
|
+
for (const pattern of patterns) {
|
|
90
|
+
const match = text.match(pattern);
|
|
91
|
+
if (match && match[1]) {
|
|
92
|
+
return match[1].trim();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return text.replace(/^- /, '').trim();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extract rationale from decision text
|
|
99
|
+
*/
|
|
100
|
+
function extractRationale(text) {
|
|
101
|
+
const patterns = [
|
|
102
|
+
/because\s+(.+?)(?:\.|$)/i,
|
|
103
|
+
/due\s+to\s+(.+?)(?:\.|$)/i,
|
|
104
|
+
/since\s+(.+?)(?:\.|$)/i,
|
|
105
|
+
];
|
|
106
|
+
for (const pattern of patterns) {
|
|
107
|
+
const match = text.match(pattern);
|
|
108
|
+
if (match && match[1]) {
|
|
109
|
+
return match[1].trim();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Extract structured decisions from session sections
|
|
116
|
+
*/
|
|
117
|
+
export function extractDecisions(sections) {
|
|
118
|
+
const decisions = [];
|
|
119
|
+
for (const section of sections) {
|
|
120
|
+
if (section.name.toLowerCase().includes('notes')) {
|
|
121
|
+
const rawDecisions = extractArchitecturalDecisions(section.lines);
|
|
122
|
+
for (const decision of rawDecisions) {
|
|
123
|
+
decisions.push({
|
|
124
|
+
text: decision.text,
|
|
125
|
+
topic: extractTopic(decision.text),
|
|
126
|
+
choice: extractChoice(decision.text),
|
|
127
|
+
rationale: extractRationale(decision.text),
|
|
128
|
+
timestamp: decision.timestamp,
|
|
129
|
+
type: decision.type,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return decisions;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Extract structured blockers from session sections
|
|
138
|
+
*/
|
|
139
|
+
export function extractBlockers(sections) {
|
|
140
|
+
const blockers = [];
|
|
141
|
+
for (const section of sections) {
|
|
142
|
+
if (section.name.toLowerCase().includes('blocker')) {
|
|
143
|
+
for (const line of section.lines) {
|
|
144
|
+
const text = line.replace(/^- /, '').trim();
|
|
145
|
+
if (text && text !== '_No active blockers._') {
|
|
146
|
+
// Try to extract timestamp
|
|
147
|
+
const timestampMatch = text.match(/^(\d{4}-\d{2}-\d{2}|\d{2}:\d{2})/);
|
|
148
|
+
blockers.push({
|
|
149
|
+
text: text.replace(/^\d{4}-\d{2}-\d{2}\s*:?\s*/, '').replace(/^\d{2}:\d{2}\s*:?\s*/, ''),
|
|
150
|
+
addedAt: timestampMatch?.[1],
|
|
151
|
+
status: 'active',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return blockers;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extract structured progress from session sections
|
|
161
|
+
*/
|
|
162
|
+
export function extractProgress(sections) {
|
|
163
|
+
const progress = [];
|
|
164
|
+
for (const section of sections) {
|
|
165
|
+
if (section.name.toLowerCase().includes('progress')) {
|
|
166
|
+
for (const line of section.lines) {
|
|
167
|
+
// Parse format: "- TIMESTAMP: TYPE - message"
|
|
168
|
+
const match = line.match(/^- ([\d\-\s:]+):\s*(\S+)\s*-\s*(.+)$/);
|
|
169
|
+
if (match) {
|
|
170
|
+
progress.push({
|
|
171
|
+
text: match[3].trim(),
|
|
172
|
+
type: match[2],
|
|
173
|
+
timestamp: match[1].trim(),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return progress;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Generate session ID from timestamp
|
|
183
|
+
*/
|
|
184
|
+
export function generateSessionId() {
|
|
185
|
+
return new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create structured compaction output
|
|
189
|
+
*/
|
|
190
|
+
export function createStructuredCompaction(sections, originalTokens, tokensRecovered, sessionId) {
|
|
191
|
+
return {
|
|
192
|
+
decisions: extractDecisions(sections),
|
|
193
|
+
blockers: extractBlockers(sections),
|
|
194
|
+
progress: extractProgress(sections),
|
|
195
|
+
timestamp: new Date().toISOString(),
|
|
196
|
+
sessionId: sessionId || generateSessionId(),
|
|
197
|
+
originalTokens,
|
|
198
|
+
tokensRecovered,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Persist structured compaction to disk
|
|
203
|
+
*/
|
|
204
|
+
export async function persistStructuredCompaction(compaction, projectDir = process.cwd()) {
|
|
205
|
+
const outputDir = join(projectDir, COMPACT_OUTPUT_DIR);
|
|
206
|
+
await FileSystem.createDirectory(outputDir);
|
|
207
|
+
const filename = `${compaction.sessionId}.json`;
|
|
208
|
+
const outputPath = join(outputDir, filename);
|
|
209
|
+
await FileSystem.writeJson(outputPath, compaction);
|
|
210
|
+
return join(COMPACT_OUTPUT_DIR, filename);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* List persisted compactions
|
|
214
|
+
*/
|
|
215
|
+
export async function listCompactions(projectDir = process.cwd()) {
|
|
216
|
+
const outputDir = join(projectDir, COMPACT_OUTPUT_DIR);
|
|
217
|
+
if (!(await FileSystem.exists(outputDir))) {
|
|
218
|
+
return [];
|
|
219
|
+
}
|
|
220
|
+
const files = await FileSystem.listDirectory(outputDir);
|
|
221
|
+
const compactions = [];
|
|
222
|
+
for (const file of files) {
|
|
223
|
+
if (file.endsWith('.json')) {
|
|
224
|
+
const data = await FileSystem.readJsonSafe(join(outputDir, file));
|
|
225
|
+
if (data) {
|
|
226
|
+
compactions.push(data);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Sort by timestamp (newest first)
|
|
231
|
+
compactions.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
232
|
+
return compactions;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Run auto-compaction engine
|
|
236
|
+
*
|
|
237
|
+
* This is the main entry point for the compaction engine.
|
|
238
|
+
* It checks if compaction should trigger based on current context usage
|
|
239
|
+
* and executes compaction with structured output if needed.
|
|
240
|
+
*/
|
|
241
|
+
export async function runAutoCompaction(options = {}) {
|
|
242
|
+
const { threshold = AUTO_COMPACT_THRESHOLD, limit: customLimit, force = false, projectDir = process.cwd(), persistOutput = true, sessionId, dryRun = false, } = options;
|
|
243
|
+
// Get effective limit (200K is the default Claude context window)
|
|
244
|
+
const limit = customLimit || getEffectiveLimit(200_000);
|
|
245
|
+
// Get current session stats
|
|
246
|
+
const stats = await getCompactionStats(projectDir);
|
|
247
|
+
const usagePercent = getUsagePercent(stats.currentTokens, limit);
|
|
248
|
+
// Check if compaction should trigger
|
|
249
|
+
const shouldTrigger = force || shouldAutoCompact(stats.currentTokens, limit, threshold);
|
|
250
|
+
if (!shouldTrigger) {
|
|
251
|
+
return {
|
|
252
|
+
triggered: false,
|
|
253
|
+
executed: false,
|
|
254
|
+
reason: `Context usage (${usagePercent}%) below threshold (${Math.round(threshold * 100)}%)`,
|
|
255
|
+
usagePercent,
|
|
256
|
+
currentTokens: stats.currentTokens,
|
|
257
|
+
limit,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// Dry run mode - return what would happen
|
|
261
|
+
if (dryRun) {
|
|
262
|
+
const sessionPath = join(projectDir, '.dino', 'session.md');
|
|
263
|
+
const content = await FileSystem.readFileSafe(sessionPath);
|
|
264
|
+
const sections = content ? parseSessionSections(content) : [];
|
|
265
|
+
return {
|
|
266
|
+
triggered: true,
|
|
267
|
+
executed: false,
|
|
268
|
+
reason: 'Dry run - compaction not executed',
|
|
269
|
+
structuredOutput: createStructuredCompaction(sections, stats.currentTokens, stats.currentTokens - stats.estimatedAfterCompaction, sessionId),
|
|
270
|
+
usagePercent,
|
|
271
|
+
currentTokens: stats.currentTokens,
|
|
272
|
+
limit,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// Read session content before compaction for structured output
|
|
276
|
+
const sessionPath = join(projectDir, '.dino', 'session.md');
|
|
277
|
+
const content = await FileSystem.readFileSafe(sessionPath);
|
|
278
|
+
const sections = content ? parseSessionSections(content) : [];
|
|
279
|
+
// Execute compaction
|
|
280
|
+
const compactionResult = await compactSession(projectDir, {
|
|
281
|
+
preserveDecisions: true,
|
|
282
|
+
archive: true,
|
|
283
|
+
});
|
|
284
|
+
// Create structured output
|
|
285
|
+
const structuredOutput = createStructuredCompaction(sections, compactionResult.originalTokens, compactionResult.originalTokens - compactionResult.compactedTokens, sessionId);
|
|
286
|
+
// Persist structured output if enabled
|
|
287
|
+
let outputPath;
|
|
288
|
+
if (persistOutput) {
|
|
289
|
+
outputPath = await persistStructuredCompaction(structuredOutput, projectDir);
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
triggered: true,
|
|
293
|
+
executed: true,
|
|
294
|
+
reason: force
|
|
295
|
+
? 'Forced compaction'
|
|
296
|
+
: `Context usage (${usagePercent}%) exceeded threshold (${Math.round(threshold * 100)}%)`,
|
|
297
|
+
structuredOutput,
|
|
298
|
+
compactionResult,
|
|
299
|
+
outputPath,
|
|
300
|
+
usagePercent,
|
|
301
|
+
currentTokens: stats.currentTokens,
|
|
302
|
+
limit,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Format compaction engine result for display
|
|
307
|
+
*/
|
|
308
|
+
export function formatCompactionEngineResult(result) {
|
|
309
|
+
const lines = [];
|
|
310
|
+
if (!result.triggered) {
|
|
311
|
+
lines.push('## Auto-Compaction: Not Triggered');
|
|
312
|
+
lines.push('');
|
|
313
|
+
lines.push(result.reason);
|
|
314
|
+
lines.push('');
|
|
315
|
+
lines.push(`- Current usage: ${result.usagePercent}%`);
|
|
316
|
+
lines.push(`- Token count: ${result.currentTokens.toLocaleString()} / ${result.limit.toLocaleString()}`);
|
|
317
|
+
return lines.join('\n');
|
|
318
|
+
}
|
|
319
|
+
if (!result.executed) {
|
|
320
|
+
lines.push('## Auto-Compaction: Dry Run');
|
|
321
|
+
lines.push('');
|
|
322
|
+
lines.push(result.reason);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
lines.push('## Auto-Compaction: Executed');
|
|
326
|
+
lines.push('');
|
|
327
|
+
lines.push(result.reason);
|
|
328
|
+
}
|
|
329
|
+
lines.push('');
|
|
330
|
+
lines.push('### Context Usage');
|
|
331
|
+
lines.push(`- Before: ${result.currentTokens.toLocaleString()} tokens (${result.usagePercent}%)`);
|
|
332
|
+
if (result.compactionResult) {
|
|
333
|
+
lines.push(`- After: ${result.compactionResult.compactedTokens.toLocaleString()} tokens`);
|
|
334
|
+
lines.push(`- Reduction: ${result.compactionResult.reductionPercent}%`);
|
|
335
|
+
lines.push(`- Archived items: ${result.compactionResult.archivedItems}`);
|
|
336
|
+
}
|
|
337
|
+
if (result.structuredOutput) {
|
|
338
|
+
lines.push('');
|
|
339
|
+
lines.push('### Extracted Content');
|
|
340
|
+
lines.push(`- Decisions: ${result.structuredOutput.decisions.length}`);
|
|
341
|
+
lines.push(`- Blockers: ${result.structuredOutput.blockers.length}`);
|
|
342
|
+
lines.push(`- Progress signals: ${result.structuredOutput.progress.length}`);
|
|
343
|
+
lines.push(`- Tokens recovered: ~${result.structuredOutput.tokensRecovered.toLocaleString()}`);
|
|
344
|
+
}
|
|
345
|
+
if (result.outputPath) {
|
|
346
|
+
lines.push('');
|
|
347
|
+
lines.push(`Structured output saved to: ${result.outputPath}`);
|
|
348
|
+
}
|
|
349
|
+
return lines.join('\n');
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get compaction engine statistics
|
|
353
|
+
*/
|
|
354
|
+
export async function getCompactionEngineStats(projectDir = process.cwd()) {
|
|
355
|
+
const compactions = await listCompactions(projectDir);
|
|
356
|
+
if (compactions.length === 0) {
|
|
357
|
+
return {
|
|
358
|
+
compactionCount: 0,
|
|
359
|
+
totalTokensRecovered: 0,
|
|
360
|
+
totalDecisionsExtracted: 0,
|
|
361
|
+
totalBlockersExtracted: 0,
|
|
362
|
+
latestCompaction: null,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
const totalTokensRecovered = compactions.reduce((sum, c) => sum + c.tokensRecovered, 0);
|
|
366
|
+
const totalDecisionsExtracted = compactions.reduce((sum, c) => sum + c.decisions.length, 0);
|
|
367
|
+
const totalBlockersExtracted = compactions.reduce((sum, c) => sum + c.blockers.length, 0);
|
|
368
|
+
return {
|
|
369
|
+
compactionCount: compactions.length,
|
|
370
|
+
totalTokensRecovered,
|
|
371
|
+
totalDecisionsExtracted,
|
|
372
|
+
totalBlockersExtracted,
|
|
373
|
+
latestCompaction: compactions[0].timestamp,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=compaction-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-engine.js","sourceRoot":"","sources":["../../../src/core/context/compaction-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,12 +27,19 @@ export interface ContextHealthReport {
|
|
|
27
27
|
redundancy: number;
|
|
28
28
|
budgetPressure: number;
|
|
29
29
|
fragmentation: number;
|
|
30
|
+
focusFragmentation: number;
|
|
30
31
|
};
|
|
31
32
|
ageDistribution: {
|
|
32
33
|
fresh: number;
|
|
33
34
|
warm: number;
|
|
34
35
|
stale: number;
|
|
35
36
|
};
|
|
37
|
+
focusDistribution: {
|
|
38
|
+
inFocus: number;
|
|
39
|
+
nearFocus: number;
|
|
40
|
+
outOfFocus: number;
|
|
41
|
+
focusArea: string;
|
|
42
|
+
};
|
|
36
43
|
recommendations: string[];
|
|
37
44
|
summary: string;
|
|
38
45
|
}
|
|
@@ -46,6 +53,8 @@ export interface HealthCheckOptions {
|
|
|
46
53
|
loadedFilesCount?: number;
|
|
47
54
|
/** Total deferred files count */
|
|
48
55
|
deferredFilesCount?: number;
|
|
56
|
+
/** v13.4.0: Current focus area for focus-aware metrics */
|
|
57
|
+
focusArea?: string;
|
|
49
58
|
}
|
|
50
59
|
/**
|
|
51
60
|
* Calculate context staleness score (0-100)
|
|
@@ -61,28 +70,44 @@ export declare function calculateRedundancyScore(lazyState: LazyContextState): n
|
|
|
61
70
|
* Based on how scattered the loaded resources are
|
|
62
71
|
*/
|
|
63
72
|
export declare function calculateFragmentationScore(accessState: AccessPatternsState): number;
|
|
73
|
+
/**
|
|
74
|
+
* v13.4.0: Calculate focus fragmentation score (0-100)
|
|
75
|
+
* Measures how scattered the loaded context is relative to focus area
|
|
76
|
+
*
|
|
77
|
+
* High fragmentation = many files outside focus area
|
|
78
|
+
* Low fragmentation = most files in or near focus area
|
|
79
|
+
*/
|
|
80
|
+
export declare function calculateFocusFragmentationScore(accessState: AccessPatternsState, focusArea: string): number;
|
|
81
|
+
/**
|
|
82
|
+
* v13.4.0: Calculate focus distribution of loaded context
|
|
83
|
+
*/
|
|
84
|
+
export declare function calculateFocusDistribution(accessState: AccessPatternsState, focusArea: string): ContextHealthReport['focusDistribution'];
|
|
64
85
|
/**
|
|
65
86
|
* Calculate age distribution of loaded context
|
|
66
87
|
*/
|
|
67
88
|
export declare function calculateAgeDistribution(accessState: AccessPatternsState): ContextHealthReport['ageDistribution'];
|
|
68
89
|
/**
|
|
69
90
|
* Calculate context rot index (0-100)
|
|
91
|
+
* v13.4.0: Updated weights to include focus fragmentation
|
|
70
92
|
*/
|
|
71
|
-
export declare function calculateRotIndex(staleness: number, redundancy: number, budgetPressure: number, fragmentation: number): number;
|
|
93
|
+
export declare function calculateRotIndex(staleness: number, redundancy: number, budgetPressure: number, fragmentation: number, focusFragmentation?: number): number;
|
|
72
94
|
/**
|
|
73
95
|
* Determine health status from rot index
|
|
74
96
|
*/
|
|
75
97
|
export declare function getHealthStatus(rotIndex: number): HealthStatus;
|
|
76
98
|
/**
|
|
77
99
|
* Generate recommendations based on health components
|
|
100
|
+
* v13.4.0: Added focus-aware recommendations
|
|
78
101
|
*/
|
|
79
|
-
export declare function generateRecommendations(components: ContextHealthReport['components'], ageDistribution: ContextHealthReport['ageDistribution']): string[];
|
|
102
|
+
export declare function generateRecommendations(components: ContextHealthReport['components'], ageDistribution: ContextHealthReport['ageDistribution'], focusDistribution?: ContextHealthReport['focusDistribution']): string[];
|
|
80
103
|
/**
|
|
81
104
|
* Execute context health check
|
|
105
|
+
* v13.4.0: Includes focus-aware metrics
|
|
82
106
|
*/
|
|
83
107
|
export declare function executeHealthCheck(accessState: AccessPatternsState, lazyState: LazyContextState, options: HealthCheckOptions, projectDir: string): Promise<ContextHealthReport>;
|
|
84
108
|
/**
|
|
85
109
|
* Format health report for display
|
|
110
|
+
* v13.4.0: Includes focus metrics
|
|
86
111
|
*/
|
|
87
112
|
export declare function formatHealthReport(report: ContextHealthReport): string;
|
|
88
113
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-health.d.ts","sourceRoot":"","sources":["../../../src/core/context/context-health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-health.d.ts","sourceRoot":"","sources":["../../../src/core/context/context-health.ts"],"names":[],"mappings":"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"}
|