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.
Files changed (203) hide show
  1. package/README.md +82 -5
  2. package/dist/commands/hud.d.ts +1 -8
  3. package/dist/commands/hud.d.ts.map +1 -1
  4. package/dist/commands/hud.js +4 -18
  5. package/dist/commands/hud.js.map +1 -1
  6. package/dist/core/config/feature-flags.d.ts +25 -1
  7. package/dist/core/config/feature-flags.d.ts.map +1 -1
  8. package/dist/core/config/feature-flags.js +7 -1
  9. package/dist/core/config/feature-flags.js.map +1 -1
  10. package/dist/core/context/__tests__/budget-thresholds.test.d.ts +5 -0
  11. package/dist/core/context/__tests__/budget-thresholds.test.d.ts.map +1 -0
  12. package/dist/core/context/__tests__/budget-thresholds.test.js +223 -0
  13. package/dist/core/context/__tests__/budget-thresholds.test.js.map +1 -0
  14. package/dist/core/context/__tests__/compaction-engine.test.d.ts +5 -0
  15. package/dist/core/context/__tests__/compaction-engine.test.d.ts.map +1 -0
  16. package/dist/core/context/__tests__/compaction-engine.test.js +474 -0
  17. package/dist/core/context/__tests__/compaction-engine.test.js.map +1 -0
  18. package/dist/core/context/__tests__/output-persistence.test.d.ts +5 -0
  19. package/dist/core/context/__tests__/output-persistence.test.d.ts.map +1 -0
  20. package/dist/core/context/__tests__/output-persistence.test.js +246 -0
  21. package/dist/core/context/__tests__/output-persistence.test.js.map +1 -0
  22. package/dist/core/context/auto-injection-engine.d.ts +10 -1
  23. package/dist/core/context/auto-injection-engine.d.ts.map +1 -1
  24. package/dist/core/context/auto-injection-engine.js +45 -2
  25. package/dist/core/context/auto-injection-engine.js.map +1 -1
  26. package/dist/core/context/budget-thresholds.d.ts +167 -0
  27. package/dist/core/context/budget-thresholds.d.ts.map +1 -0
  28. package/dist/core/context/budget-thresholds.js +234 -0
  29. package/dist/core/context/budget-thresholds.js.map +1 -0
  30. package/dist/core/context/compaction-engine.d.ts +193 -0
  31. package/dist/core/context/compaction-engine.d.ts.map +1 -0
  32. package/dist/core/context/compaction-engine.js +376 -0
  33. package/dist/core/context/compaction-engine.js.map +1 -0
  34. package/dist/core/context/context-health.d.ts +27 -2
  35. package/dist/core/context/context-health.d.ts.map +1 -1
  36. package/dist/core/context/context-health.js +98 -12
  37. package/dist/core/context/context-health.js.map +1 -1
  38. package/dist/core/context/focus-resource-loader.d.ts +143 -0
  39. package/dist/core/context/focus-resource-loader.d.ts.map +1 -0
  40. package/dist/core/context/focus-resource-loader.js +305 -0
  41. package/dist/core/context/focus-resource-loader.js.map +1 -0
  42. package/dist/core/context/index.d.ts +10 -5
  43. package/dist/core/context/index.d.ts.map +1 -1
  44. package/dist/core/context/index.js +40 -5
  45. package/dist/core/context/index.js.map +1 -1
  46. package/dist/core/context/lazy-loader.d.ts +44 -1
  47. package/dist/core/context/lazy-loader.d.ts.map +1 -1
  48. package/dist/core/context/lazy-loader.js +59 -1
  49. package/dist/core/context/lazy-loader.js.map +1 -1
  50. package/dist/core/context/output-persistence.d.ts +142 -0
  51. package/dist/core/context/output-persistence.d.ts.map +1 -0
  52. package/dist/core/context/output-persistence.js +242 -0
  53. package/dist/core/context/output-persistence.js.map +1 -0
  54. package/dist/core/context-repl/__tests__/repl-environment.test.d.ts +7 -0
  55. package/dist/core/context-repl/__tests__/repl-environment.test.d.ts.map +1 -0
  56. package/dist/core/context-repl/__tests__/repl-environment.test.js +335 -0
  57. package/dist/core/context-repl/__tests__/repl-environment.test.js.map +1 -0
  58. package/dist/core/context-repl/context-window-monitor.d.ts +181 -0
  59. package/dist/core/context-repl/context-window-monitor.d.ts.map +1 -0
  60. package/dist/core/context-repl/context-window-monitor.js +309 -0
  61. package/dist/core/context-repl/context-window-monitor.js.map +1 -0
  62. package/dist/core/context-repl/index.d.ts +8 -3
  63. package/dist/core/context-repl/index.d.ts.map +1 -1
  64. package/dist/core/context-repl/index.js +11 -3
  65. package/dist/core/context-repl/index.js.map +1 -1
  66. package/dist/core/context-repl/repl-environment.d.ts +66 -0
  67. package/dist/core/context-repl/repl-environment.d.ts.map +1 -0
  68. package/dist/core/context-repl/repl-environment.js +795 -0
  69. package/dist/core/context-repl/repl-environment.js.map +1 -0
  70. package/dist/core/context-repl/types.d.ts +277 -1
  71. package/dist/core/context-repl/types.d.ts.map +1 -1
  72. package/dist/core/context-repl/types.js +52 -1
  73. package/dist/core/context-repl/types.js.map +1 -1
  74. package/dist/core/environment/__tests__/pre-verify.test.d.ts +5 -0
  75. package/dist/core/environment/__tests__/pre-verify.test.d.ts.map +1 -0
  76. package/dist/core/environment/__tests__/pre-verify.test.js +343 -0
  77. package/dist/core/environment/__tests__/pre-verify.test.js.map +1 -0
  78. package/dist/core/environment/index.d.ts +8 -0
  79. package/dist/core/environment/index.d.ts.map +1 -0
  80. package/dist/core/environment/index.js +7 -0
  81. package/dist/core/environment/index.js.map +1 -0
  82. package/dist/core/environment/pre-verify.d.ts +63 -0
  83. package/dist/core/environment/pre-verify.d.ts.map +1 -0
  84. package/dist/core/environment/pre-verify.js +221 -0
  85. package/dist/core/environment/pre-verify.js.map +1 -0
  86. package/dist/core/environment/types.d.ts +37 -0
  87. package/dist/core/environment/types.d.ts.map +1 -0
  88. package/dist/core/environment/types.js +5 -0
  89. package/dist/core/environment/types.js.map +1 -0
  90. package/dist/core/generator/claude-md.js +1 -1
  91. package/dist/core/intelligence/context-budget.d.ts +10 -5
  92. package/dist/core/intelligence/context-budget.d.ts.map +1 -1
  93. package/dist/core/intelligence/context-budget.js +12 -5
  94. package/dist/core/intelligence/context-budget.js.map +1 -1
  95. package/dist/core/provider/storage.d.ts.map +1 -1
  96. package/dist/core/provider/storage.js +1 -2
  97. package/dist/core/provider/storage.js.map +1 -1
  98. package/dist/hooks/post-edit.js +73 -0
  99. package/dist/hooks/post-edit.js.map +1 -1
  100. package/dist/hooks/session-start.js +115 -0
  101. package/dist/hooks/session-start.js.map +1 -1
  102. package/dist/hooks/types.js +1 -1
  103. package/dist/hooks/user-prompt-submit.js +100 -0
  104. package/dist/hooks/user-prompt-submit.js.map +1 -1
  105. package/dist/hud/config.d.ts +3 -28
  106. package/dist/hud/config.d.ts.map +1 -1
  107. package/dist/hud/config.js +8 -60
  108. package/dist/hud/config.js.map +1 -1
  109. package/dist/hud/index.d.ts.map +1 -1
  110. package/dist/hud/index.js +0 -1
  111. package/dist/hud/index.js.map +1 -1
  112. package/dist/hud/render/budget-bar.d.ts +0 -2
  113. package/dist/hud/render/budget-bar.d.ts.map +1 -1
  114. package/dist/hud/render/budget-bar.js +5 -8
  115. package/dist/hud/render/budget-bar.js.map +1 -1
  116. package/dist/hud/stdin.d.ts +0 -3
  117. package/dist/hud/stdin.d.ts.map +1 -1
  118. package/dist/hud/stdin.js +2 -29
  119. package/dist/hud/stdin.js.map +1 -1
  120. package/dist/hud/types.d.ts +0 -2
  121. package/dist/hud/types.d.ts.map +1 -1
  122. package/dist/mcp/__tests__/dynamic-updates.test.d.ts +5 -0
  123. package/dist/mcp/__tests__/dynamic-updates.test.d.ts.map +1 -0
  124. package/dist/mcp/__tests__/dynamic-updates.test.js +314 -0
  125. package/dist/mcp/__tests__/dynamic-updates.test.js.map +1 -0
  126. package/dist/mcp/dynamic-updates.d.ts +167 -0
  127. package/dist/mcp/dynamic-updates.d.ts.map +1 -0
  128. package/dist/mcp/dynamic-updates.js +313 -0
  129. package/dist/mcp/dynamic-updates.js.map +1 -0
  130. package/dist/mcp/focus-filter.d.ts +74 -0
  131. package/dist/mcp/focus-filter.d.ts.map +1 -0
  132. package/dist/mcp/focus-filter.js +229 -0
  133. package/dist/mcp/focus-filter.js.map +1 -0
  134. package/dist/mcp/index.d.ts +4 -2
  135. package/dist/mcp/index.d.ts.map +1 -1
  136. package/dist/mcp/index.js +5 -2
  137. package/dist/mcp/index.js.map +1 -1
  138. package/dist/mcp/registry.d.ts +4 -4
  139. package/dist/mcp/registry.d.ts.map +1 -1
  140. package/dist/mcp/registry.js +16 -16
  141. package/dist/mcp/registry.js.map +1 -1
  142. package/dist/mcp/server.d.ts +2 -1
  143. package/dist/mcp/server.d.ts.map +1 -1
  144. package/dist/mcp/server.js +12 -3
  145. package/dist/mcp/server.js.map +1 -1
  146. package/dist/mcp/tool-tiers.d.ts.map +1 -1
  147. package/dist/mcp/tool-tiers.js +5 -0
  148. package/dist/mcp/tool-tiers.js.map +1 -1
  149. package/dist/mcp/tools/__tests__/environment.test.d.ts +5 -0
  150. package/dist/mcp/tools/__tests__/environment.test.d.ts.map +1 -0
  151. package/dist/mcp/tools/__tests__/environment.test.js +219 -0
  152. package/dist/mcp/tools/__tests__/environment.test.js.map +1 -0
  153. package/dist/mcp/tools/auto-inject.d.ts +36 -0
  154. package/dist/mcp/tools/auto-inject.d.ts.map +1 -0
  155. package/dist/mcp/tools/auto-inject.js +143 -0
  156. package/dist/mcp/tools/auto-inject.js.map +1 -0
  157. package/dist/mcp/tools/auto-unload.d.ts +29 -0
  158. package/dist/mcp/tools/auto-unload.d.ts.map +1 -0
  159. package/dist/mcp/tools/auto-unload.js +151 -0
  160. package/dist/mcp/tools/auto-unload.js.map +1 -0
  161. package/dist/mcp/tools/context-repl.d.ts +48 -0
  162. package/dist/mcp/tools/context-repl.d.ts.map +1 -0
  163. package/dist/mcp/tools/context-repl.js +290 -0
  164. package/dist/mcp/tools/context-repl.js.map +1 -0
  165. package/dist/mcp/tools/environment.d.ts +27 -0
  166. package/dist/mcp/tools/environment.d.ts.map +1 -0
  167. package/dist/mcp/tools/environment.js +97 -0
  168. package/dist/mcp/tools/environment.js.map +1 -0
  169. package/dist/mcp/tools/health.d.ts +29 -0
  170. package/dist/mcp/tools/health.d.ts.map +1 -0
  171. package/dist/mcp/tools/health.js +171 -0
  172. package/dist/mcp/tools/health.js.map +1 -0
  173. package/dist/mcp/tools/index.d.ts +9 -2
  174. package/dist/mcp/tools/index.d.ts.map +1 -1
  175. package/dist/mcp/tools/index.js +37 -2
  176. package/dist/mcp/tools/index.js.map +1 -1
  177. package/dist/mcp/tools/output-persistence.d.ts +44 -0
  178. package/dist/mcp/tools/output-persistence.d.ts.map +1 -0
  179. package/dist/mcp/tools/output-persistence.js +208 -0
  180. package/dist/mcp/tools/output-persistence.js.map +1 -0
  181. package/dist/mcp-server.d.ts +2 -1
  182. package/dist/mcp-server.d.ts.map +1 -1
  183. package/dist/mcp-server.js +36 -7
  184. package/dist/mcp-server.js.map +1 -1
  185. package/dist/rules/index.js +2 -2
  186. package/dist/utils/exec.js +2 -2
  187. package/dist/utils/exec.js.map +1 -1
  188. package/dist/utils/gitignore.d.ts.map +1 -1
  189. package/dist/utils/gitignore.js +5 -0
  190. package/dist/utils/gitignore.js.map +1 -1
  191. package/package.json +76 -77
  192. package/dist/hud/config-tui.d.ts +0 -25
  193. package/dist/hud/config-tui.d.ts.map +0 -1
  194. package/dist/hud/config-tui.js +0 -199
  195. package/dist/hud/config-tui.js.map +0 -1
  196. package/dist/hud/models.d.ts +0 -58
  197. package/dist/hud/models.d.ts.map +0 -1
  198. package/dist/hud/models.js +0 -124
  199. package/dist/hud/models.js.map +0 -1
  200. package/dist/hud/token-estimator.d.ts +0 -79
  201. package/dist/hud/token-estimator.d.ts.map +0 -1
  202. package/dist/hud/token-estimator.js +0 -126
  203. 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;AAQ1B;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,eAAe,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iCAAiC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAkBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,mBAAmB,GAAG,MAAM,CAoBhF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,gBAAgB,GAC1B,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,mBAAmB,GAC/B,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,mBAAmB,GAC/B,mBAAmB,CAAC,iBAAiB,CAAC,CAoBxC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAQ9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,EAC7C,eAAe,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,GACtD,MAAM,EAAE,CA4BV;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,mBAAmB,EAChC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAkD9B;AAqBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CA+BtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAEtE"}
1
+ {"version":3,"file":"context-health.d.ts","sourceRoot":"","sources":["../../../src/core/context/context-health.ts"],"names":[],"mappings":"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"}