@rengler33/prov 0.1.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 (146) hide show
  1. package/README.md +314 -0
  2. package/dist/cli.d.ts +26 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +381 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/agent.d.ts +107 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +197 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/agent.test.d.ts +5 -0
  11. package/dist/commands/agent.test.d.ts.map +1 -0
  12. package/dist/commands/agent.test.js +199 -0
  13. package/dist/commands/agent.test.js.map +1 -0
  14. package/dist/commands/constraint.d.ts +100 -0
  15. package/dist/commands/constraint.d.ts.map +1 -0
  16. package/dist/commands/constraint.js +763 -0
  17. package/dist/commands/constraint.js.map +1 -0
  18. package/dist/commands/constraint.test.d.ts +9 -0
  19. package/dist/commands/constraint.test.d.ts.map +1 -0
  20. package/dist/commands/constraint.test.js +470 -0
  21. package/dist/commands/constraint.test.js.map +1 -0
  22. package/dist/commands/graph.d.ts +99 -0
  23. package/dist/commands/graph.d.ts.map +1 -0
  24. package/dist/commands/graph.js +552 -0
  25. package/dist/commands/graph.js.map +1 -0
  26. package/dist/commands/graph.test.d.ts +2 -0
  27. package/dist/commands/graph.test.d.ts.map +1 -0
  28. package/dist/commands/graph.test.js +258 -0
  29. package/dist/commands/graph.test.js.map +1 -0
  30. package/dist/commands/impact.d.ts +83 -0
  31. package/dist/commands/impact.d.ts.map +1 -0
  32. package/dist/commands/impact.js +319 -0
  33. package/dist/commands/impact.js.map +1 -0
  34. package/dist/commands/impact.test.d.ts +2 -0
  35. package/dist/commands/impact.test.d.ts.map +1 -0
  36. package/dist/commands/impact.test.js +234 -0
  37. package/dist/commands/impact.test.js.map +1 -0
  38. package/dist/commands/init.d.ts +45 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +94 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/init.test.d.ts +7 -0
  43. package/dist/commands/init.test.d.ts.map +1 -0
  44. package/dist/commands/init.test.js +174 -0
  45. package/dist/commands/init.test.js.map +1 -0
  46. package/dist/commands/integration.test.d.ts +10 -0
  47. package/dist/commands/integration.test.d.ts.map +1 -0
  48. package/dist/commands/integration.test.js +456 -0
  49. package/dist/commands/integration.test.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +21 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +616 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/mcp.test.d.ts +7 -0
  55. package/dist/commands/mcp.test.d.ts.map +1 -0
  56. package/dist/commands/mcp.test.js +132 -0
  57. package/dist/commands/mcp.test.js.map +1 -0
  58. package/dist/commands/plan.d.ts +218 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +1307 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/plan.test.d.ts +9 -0
  63. package/dist/commands/plan.test.d.ts.map +1 -0
  64. package/dist/commands/plan.test.js +569 -0
  65. package/dist/commands/plan.test.js.map +1 -0
  66. package/dist/commands/spec.d.ts +94 -0
  67. package/dist/commands/spec.d.ts.map +1 -0
  68. package/dist/commands/spec.js +635 -0
  69. package/dist/commands/spec.js.map +1 -0
  70. package/dist/commands/spec.test.d.ts +9 -0
  71. package/dist/commands/spec.test.d.ts.map +1 -0
  72. package/dist/commands/spec.test.js +407 -0
  73. package/dist/commands/spec.test.js.map +1 -0
  74. package/dist/commands/trace.d.ts +157 -0
  75. package/dist/commands/trace.d.ts.map +1 -0
  76. package/dist/commands/trace.js +847 -0
  77. package/dist/commands/trace.js.map +1 -0
  78. package/dist/commands/trace.test.d.ts +9 -0
  79. package/dist/commands/trace.test.d.ts.map +1 -0
  80. package/dist/commands/trace.test.js +524 -0
  81. package/dist/commands/trace.test.js.map +1 -0
  82. package/dist/graph.d.ts +204 -0
  83. package/dist/graph.d.ts.map +1 -0
  84. package/dist/graph.js +496 -0
  85. package/dist/graph.js.map +1 -0
  86. package/dist/graph.test.d.ts +2 -0
  87. package/dist/graph.test.d.ts.map +1 -0
  88. package/dist/graph.test.js +382 -0
  89. package/dist/graph.test.js.map +1 -0
  90. package/dist/hash.d.ts +72 -0
  91. package/dist/hash.d.ts.map +1 -0
  92. package/dist/hash.js +137 -0
  93. package/dist/hash.js.map +1 -0
  94. package/dist/hash.test.d.ts +2 -0
  95. package/dist/hash.test.d.ts.map +1 -0
  96. package/dist/hash.test.js +227 -0
  97. package/dist/hash.test.js.map +1 -0
  98. package/dist/index.d.ts +18 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +64 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/index.test.d.ts +2 -0
  103. package/dist/index.test.d.ts.map +1 -0
  104. package/dist/index.test.js +11 -0
  105. package/dist/index.test.js.map +1 -0
  106. package/dist/output.d.ts +84 -0
  107. package/dist/output.d.ts.map +1 -0
  108. package/dist/output.js +175 -0
  109. package/dist/output.js.map +1 -0
  110. package/dist/output.test.d.ts +7 -0
  111. package/dist/output.test.d.ts.map +1 -0
  112. package/dist/output.test.js +146 -0
  113. package/dist/output.test.js.map +1 -0
  114. package/dist/staleness.d.ts +162 -0
  115. package/dist/staleness.d.ts.map +1 -0
  116. package/dist/staleness.js +309 -0
  117. package/dist/staleness.js.map +1 -0
  118. package/dist/staleness.test.d.ts +2 -0
  119. package/dist/staleness.test.d.ts.map +1 -0
  120. package/dist/staleness.test.js +448 -0
  121. package/dist/staleness.test.js.map +1 -0
  122. package/dist/storage.d.ts +267 -0
  123. package/dist/storage.d.ts.map +1 -0
  124. package/dist/storage.js +623 -0
  125. package/dist/storage.js.map +1 -0
  126. package/dist/storage.test.d.ts +5 -0
  127. package/dist/storage.test.d.ts.map +1 -0
  128. package/dist/storage.test.js +434 -0
  129. package/dist/storage.test.js.map +1 -0
  130. package/dist/types.d.ts +270 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +12 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/types.test.d.ts +2 -0
  135. package/dist/types.test.d.ts.map +1 -0
  136. package/dist/types.test.js +232 -0
  137. package/dist/types.test.js.map +1 -0
  138. package/dist/watcher.d.ts +139 -0
  139. package/dist/watcher.d.ts.map +1 -0
  140. package/dist/watcher.js +406 -0
  141. package/dist/watcher.js.map +1 -0
  142. package/dist/watcher.test.d.ts +5 -0
  143. package/dist/watcher.test.d.ts.map +1 -0
  144. package/dist/watcher.test.js +327 -0
  145. package/dist/watcher.test.js.map +1 -0
  146. package/package.json +53 -0
@@ -0,0 +1,448 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { IntentGraph, addPlanToGraph, addSpecToGraph, addTraceToGraph } from './graph.js';
6
+ import { computeArtifactHash, checkPlanStaleness, checkTraceStaleness, findTransitivelyStale, detectStaleness, isNodeStale, getStaleNodes, getStalePlans, getStaleTraces, formatStalenessReason, } from './staleness.js';
7
+ describe('staleness detection', () => {
8
+ let testDir;
9
+ beforeEach(() => {
10
+ // Create a temporary test directory
11
+ testDir = join(tmpdir(), `prov-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
12
+ mkdirSync(testDir, { recursive: true });
13
+ });
14
+ afterEach(() => {
15
+ // Clean up test directory
16
+ if (existsSync(testDir)) {
17
+ rmSync(testDir, { recursive: true, force: true });
18
+ }
19
+ });
20
+ describe('computeArtifactHash', () => {
21
+ it('computes hash of file contents', () => {
22
+ const filePath = join(testDir, 'test.txt');
23
+ writeFileSync(filePath, 'hello world');
24
+ const hash = computeArtifactHash(filePath);
25
+ expect(hash).toMatch(/^sha256:[a-f0-9]{12}$/);
26
+ });
27
+ it('returns null for non-existent files', () => {
28
+ const hash = computeArtifactHash(join(testDir, 'nonexistent.txt'));
29
+ expect(hash).toBeNull();
30
+ });
31
+ it('returns different hashes for different content', () => {
32
+ const file1 = join(testDir, 'file1.txt');
33
+ const file2 = join(testDir, 'file2.txt');
34
+ writeFileSync(file1, 'content one');
35
+ writeFileSync(file2, 'content two');
36
+ const hash1 = computeArtifactHash(file1);
37
+ const hash2 = computeArtifactHash(file2);
38
+ expect(hash1).not.toEqual(hash2);
39
+ });
40
+ it('returns same hash for same content', () => {
41
+ const file1 = join(testDir, 'file1.txt');
42
+ const file2 = join(testDir, 'file2.txt');
43
+ writeFileSync(file1, 'same content');
44
+ writeFileSync(file2, 'same content');
45
+ const hash1 = computeArtifactHash(file1);
46
+ const hash2 = computeArtifactHash(file2);
47
+ expect(hash1).toEqual(hash2);
48
+ });
49
+ it('resolves relative paths from project root', () => {
50
+ const subdir = join(testDir, 'src');
51
+ mkdirSync(subdir);
52
+ writeFileSync(join(subdir, 'module.ts'), 'export const x = 1;');
53
+ const hash = computeArtifactHash('src/module.ts', testDir);
54
+ expect(hash).toMatch(/^sha256:[a-f0-9]{12}$/);
55
+ });
56
+ });
57
+ describe('checkPlanStaleness', () => {
58
+ it('returns not stale when sources match', () => {
59
+ const graph = new IntentGraph();
60
+ const spec = {
61
+ id: 'spec:test:v1',
62
+ version: '1.0.0',
63
+ title: 'Test Spec',
64
+ status: 'active',
65
+ intent: 'Testing',
66
+ requirements: [],
67
+ };
68
+ addSpecToGraph(graph, spec);
69
+ const specHash = graph.getNode('spec:test:v1').hash;
70
+ const plan = {
71
+ id: 'plan:test:v1',
72
+ version: '1.0.0',
73
+ title: 'Test Plan',
74
+ status: 'active',
75
+ sources: [{ id: 'spec:test:v1', hash: specHash }],
76
+ decisions: [],
77
+ steps: [],
78
+ };
79
+ const info = checkPlanStaleness(plan, graph);
80
+ expect(info.stale).toBe(false);
81
+ expect(info.reasons).toHaveLength(0);
82
+ });
83
+ it('detects stale when source hash differs', () => {
84
+ const graph = new IntentGraph();
85
+ const spec = {
86
+ id: 'spec:test:v1',
87
+ version: '1.0.0',
88
+ title: 'Test Spec',
89
+ status: 'active',
90
+ intent: 'Testing',
91
+ requirements: [],
92
+ };
93
+ addSpecToGraph(graph, spec);
94
+ // Plan was created with old hash
95
+ const plan = {
96
+ id: 'plan:test:v1',
97
+ version: '1.0.0',
98
+ title: 'Test Plan',
99
+ status: 'active',
100
+ sources: [{ id: 'spec:test:v1', hash: 'sha256:000000000000' }],
101
+ decisions: [],
102
+ steps: [],
103
+ };
104
+ const info = checkPlanStaleness(plan, graph);
105
+ expect(info.stale).toBe(true);
106
+ expect(info.reasons).toHaveLength(1);
107
+ expect(info.reasons[0].type).toBe('source_changed');
108
+ });
109
+ it('detects missing source', () => {
110
+ const graph = new IntentGraph();
111
+ // No spec added to graph
112
+ const plan = {
113
+ id: 'plan:test:v1',
114
+ version: '1.0.0',
115
+ title: 'Test Plan',
116
+ status: 'active',
117
+ sources: [{ id: 'spec:test:v1', hash: 'sha256:abc123def456' }],
118
+ decisions: [],
119
+ steps: [],
120
+ };
121
+ const info = checkPlanStaleness(plan, graph);
122
+ expect(info.stale).toBe(true);
123
+ expect(info.reasons).toHaveLength(1);
124
+ expect(info.reasons[0].type).toBe('source_missing');
125
+ });
126
+ });
127
+ describe('checkTraceStaleness', () => {
128
+ it('returns not stale when artifact matches', () => {
129
+ const filePath = join(testDir, 'artifact.ts');
130
+ writeFileSync(filePath, 'const x = 1;');
131
+ const fileHash = computeArtifactHash(filePath);
132
+ const trace = {
133
+ id: 'trace:abc123',
134
+ artifact: { path: filePath },
135
+ step: 'step:test:1',
136
+ artifactHash: fileHash,
137
+ createdAt: new Date().toISOString(),
138
+ };
139
+ const info = checkTraceStaleness(trace, testDir);
140
+ expect(info.stale).toBe(false);
141
+ expect(info.reasons).toHaveLength(0);
142
+ });
143
+ it('detects stale when artifact changed', () => {
144
+ const filePath = join(testDir, 'artifact.ts');
145
+ writeFileSync(filePath, 'const x = 1;');
146
+ const trace = {
147
+ id: 'trace:abc123',
148
+ artifact: { path: filePath },
149
+ step: 'step:test:1',
150
+ artifactHash: 'sha256:oldoldhash00',
151
+ createdAt: new Date().toISOString(),
152
+ };
153
+ const info = checkTraceStaleness(trace, testDir);
154
+ expect(info.stale).toBe(true);
155
+ expect(info.reasons).toHaveLength(1);
156
+ expect(info.reasons[0].type).toBe('artifact_changed');
157
+ });
158
+ it('detects missing artifact', () => {
159
+ const trace = {
160
+ id: 'trace:abc123',
161
+ artifact: { path: join(testDir, 'nonexistent.ts') },
162
+ step: 'step:test:1',
163
+ artifactHash: 'sha256:abc123def456',
164
+ createdAt: new Date().toISOString(),
165
+ };
166
+ const info = checkTraceStaleness(trace, testDir);
167
+ expect(info.stale).toBe(true);
168
+ expect(info.reasons).toHaveLength(1);
169
+ expect(info.reasons[0].type).toBe('artifact_missing');
170
+ });
171
+ });
172
+ describe('findTransitivelyStale', () => {
173
+ it('finds downstream nodes from stale nodes', () => {
174
+ const graph = new IntentGraph();
175
+ // Build chain: A -> B -> C
176
+ graph.addNode('spec:a:v1', 'spec', { id: 'spec:a:v1' });
177
+ graph.addNode('plan:b:v1', 'plan', { id: 'plan:b:v1' });
178
+ graph.addNode('step:b:1', 'step', { id: 'step:b:1', number: 1, action: 'test', tracesTo: [] });
179
+ graph.addEdge('plan:b:v1', 'spec:a:v1', 'derives_from');
180
+ graph.addEdge('step:b:1', 'plan:b:v1', 'contains');
181
+ const directlyStale = new Set(['spec:a:v1']);
182
+ const transitive = findTransitivelyStale(graph, directlyStale);
183
+ // Note: derives_from points from plan to spec, so downstream from spec
184
+ // is empty (nothing points from spec)
185
+ expect(transitive.size).toBe(0);
186
+ });
187
+ it('handles complex dependency chains', () => {
188
+ const graph = new IntentGraph();
189
+ // Build: A -> B -> C, A -> D
190
+ graph.addNode('spec:a:v1', 'spec', { id: 'spec:a:v1' });
191
+ graph.addNode('spec:b:v1', 'spec', { id: 'spec:b:v1' });
192
+ graph.addNode('spec:c:v1', 'spec', { id: 'spec:c:v1' });
193
+ graph.addNode('spec:d:v1', 'spec', { id: 'spec:d:v1' });
194
+ graph.addEdge('spec:a:v1', 'spec:b:v1', 'derives_from');
195
+ graph.addEdge('spec:b:v1', 'spec:c:v1', 'derives_from');
196
+ graph.addEdge('spec:a:v1', 'spec:d:v1', 'derives_from');
197
+ const directlyStale = new Set(['spec:a:v1']);
198
+ const transitive = findTransitivelyStale(graph, directlyStale);
199
+ expect(transitive.has('spec:b:v1')).toBe(true);
200
+ expect(transitive.has('spec:c:v1')).toBe(true);
201
+ expect(transitive.has('spec:d:v1')).toBe(true);
202
+ });
203
+ it('excludes directly stale nodes from transitive set', () => {
204
+ const graph = new IntentGraph();
205
+ graph.addNode('spec:a:v1', 'spec', { id: 'spec:a:v1' });
206
+ graph.addNode('spec:b:v1', 'spec', { id: 'spec:b:v1' });
207
+ graph.addEdge('spec:a:v1', 'spec:b:v1', 'derives_from');
208
+ const directlyStale = new Set(['spec:a:v1']);
209
+ const transitive = findTransitivelyStale(graph, directlyStale);
210
+ expect(transitive.has('spec:a:v1')).toBe(false);
211
+ });
212
+ });
213
+ describe('detectStaleness', () => {
214
+ it('returns empty result for fresh graph', () => {
215
+ const graph = new IntentGraph();
216
+ const spec = {
217
+ id: 'spec:test:v1',
218
+ version: '1.0.0',
219
+ title: 'Test',
220
+ status: 'active',
221
+ intent: 'Test',
222
+ requirements: [],
223
+ };
224
+ addSpecToGraph(graph, spec);
225
+ const specHash = graph.getNode('spec:test:v1').hash;
226
+ const plan = {
227
+ id: 'plan:test:v1',
228
+ version: '1.0.0',
229
+ title: 'Test Plan',
230
+ status: 'active',
231
+ sources: [{ id: 'spec:test:v1', hash: specHash }],
232
+ decisions: [],
233
+ steps: [],
234
+ };
235
+ addPlanToGraph(graph, plan);
236
+ const result = detectStaleness(graph);
237
+ expect(result.staleCount).toBe(0);
238
+ expect(result.directlyStale).toHaveLength(0);
239
+ expect(result.transitivelyStale).toHaveLength(0);
240
+ });
241
+ it('detects stale plans', () => {
242
+ const graph = new IntentGraph();
243
+ const spec = {
244
+ id: 'spec:test:v1',
245
+ version: '1.0.0',
246
+ title: 'Test',
247
+ status: 'active',
248
+ intent: 'Test',
249
+ requirements: [],
250
+ };
251
+ addSpecToGraph(graph, spec);
252
+ const plan = {
253
+ id: 'plan:test:v1',
254
+ version: '1.0.0',
255
+ title: 'Test Plan',
256
+ status: 'active',
257
+ sources: [{ id: 'spec:test:v1', hash: 'sha256:outdatedhash' }],
258
+ decisions: [],
259
+ steps: [],
260
+ };
261
+ addPlanToGraph(graph, plan);
262
+ const result = detectStaleness(graph);
263
+ expect(result.staleCount).toBeGreaterThan(0);
264
+ expect(result.directlyStale).toContain('plan:test:v1');
265
+ });
266
+ it('can filter by node type', () => {
267
+ const graph = new IntentGraph();
268
+ // Add a plan with stale source
269
+ const spec = {
270
+ id: 'spec:test:v1',
271
+ version: '1.0.0',
272
+ title: 'Test',
273
+ status: 'active',
274
+ intent: 'Test',
275
+ requirements: [],
276
+ };
277
+ addSpecToGraph(graph, spec);
278
+ const plan = {
279
+ id: 'plan:test:v1',
280
+ version: '1.0.0',
281
+ title: 'Test Plan',
282
+ status: 'active',
283
+ sources: [{ id: 'spec:test:v1', hash: 'sha256:outdatedhash' }],
284
+ decisions: [],
285
+ steps: [],
286
+ };
287
+ addPlanToGraph(graph, plan);
288
+ // Only check artifacts (none exist)
289
+ const result = detectStaleness(graph, { nodeTypes: ['artifact'] });
290
+ expect(result.staleCount).toBe(0);
291
+ });
292
+ });
293
+ describe('isNodeStale', () => {
294
+ it('returns null for non-existent node', () => {
295
+ const graph = new IntentGraph();
296
+ const info = isNodeStale(graph, 'spec:nonexistent:v1');
297
+ expect(info).toBeNull();
298
+ });
299
+ it('checks plan staleness', () => {
300
+ const graph = new IntentGraph();
301
+ const spec = {
302
+ id: 'spec:test:v1',
303
+ version: '1.0.0',
304
+ title: 'Test',
305
+ status: 'active',
306
+ intent: 'Test',
307
+ requirements: [],
308
+ };
309
+ addSpecToGraph(graph, spec);
310
+ const plan = {
311
+ id: 'plan:test:v1',
312
+ version: '1.0.0',
313
+ title: 'Test Plan',
314
+ status: 'active',
315
+ sources: [{ id: 'spec:test:v1', hash: 'sha256:outdatedhash' }],
316
+ decisions: [],
317
+ steps: [],
318
+ };
319
+ addPlanToGraph(graph, plan);
320
+ const info = isNodeStale(graph, 'plan:test:v1');
321
+ expect(info).not.toBeNull();
322
+ expect(info.stale).toBe(true);
323
+ });
324
+ });
325
+ describe('getStaleNodes', () => {
326
+ it('returns all stale node IDs', () => {
327
+ const graph = new IntentGraph();
328
+ const spec = {
329
+ id: 'spec:test:v1',
330
+ version: '1.0.0',
331
+ title: 'Test',
332
+ status: 'active',
333
+ intent: 'Test',
334
+ requirements: [],
335
+ };
336
+ addSpecToGraph(graph, spec);
337
+ const plan = {
338
+ id: 'plan:test:v1',
339
+ version: '1.0.0',
340
+ title: 'Test Plan',
341
+ status: 'active',
342
+ sources: [{ id: 'spec:test:v1', hash: 'sha256:outdatedhash' }],
343
+ decisions: [],
344
+ steps: [],
345
+ };
346
+ addPlanToGraph(graph, plan);
347
+ const stale = getStaleNodes(graph);
348
+ expect(stale).toContain('plan:test:v1');
349
+ });
350
+ });
351
+ describe('getStalePlans', () => {
352
+ it('returns only stale plans', () => {
353
+ const graph = new IntentGraph();
354
+ const spec = {
355
+ id: 'spec:test:v1',
356
+ version: '1.0.0',
357
+ title: 'Test',
358
+ status: 'active',
359
+ intent: 'Test',
360
+ requirements: [],
361
+ };
362
+ addSpecToGraph(graph, spec);
363
+ const plan = {
364
+ id: 'plan:test:v1',
365
+ version: '1.0.0',
366
+ title: 'Test Plan',
367
+ status: 'active',
368
+ sources: [{ id: 'spec:test:v1', hash: 'sha256:outdatedhash' }],
369
+ decisions: [],
370
+ steps: [],
371
+ };
372
+ addPlanToGraph(graph, plan);
373
+ const stalePlans = getStalePlans(graph);
374
+ expect(stalePlans).toHaveLength(1);
375
+ expect(stalePlans[0].id).toBe('plan:test:v1');
376
+ });
377
+ });
378
+ describe('getStaleTraces', () => {
379
+ it('returns only stale traces', () => {
380
+ const graph = new IntentGraph();
381
+ // Add a step first
382
+ graph.addNode('step:test:1', 'step', { id: 'step:test:1', number: 1, action: 'test', tracesTo: [] });
383
+ const trace = {
384
+ id: 'trace:abc123',
385
+ artifact: { path: 'nonexistent.ts' },
386
+ step: 'step:test:1',
387
+ artifactHash: 'sha256:abc123def456',
388
+ createdAt: new Date().toISOString(),
389
+ };
390
+ addTraceToGraph(graph, trace);
391
+ const staleTraces = getStaleTraces(graph, testDir);
392
+ expect(staleTraces).toHaveLength(1);
393
+ expect(staleTraces[0].id).toBe('trace:abc123');
394
+ });
395
+ });
396
+ describe('formatStalenessReason', () => {
397
+ it('formats source_changed reason', () => {
398
+ const reason = {
399
+ type: 'source_changed',
400
+ sourceId: 'spec:test:v1',
401
+ expectedHash: 'sha256:aaaaaaaaaaaa',
402
+ actualHash: 'sha256:bbbbbbbbbbbb',
403
+ };
404
+ const formatted = formatStalenessReason(reason);
405
+ expect(formatted).toContain('spec:test:v1');
406
+ expect(formatted).toContain('changed');
407
+ });
408
+ it('formats artifact_changed reason', () => {
409
+ const reason = {
410
+ type: 'artifact_changed',
411
+ path: 'src/module.ts',
412
+ expectedHash: 'sha256:aaaaaaaaaaaa',
413
+ actualHash: 'sha256:bbbbbbbbbbbb',
414
+ };
415
+ const formatted = formatStalenessReason(reason);
416
+ expect(formatted).toContain('src/module.ts');
417
+ expect(formatted).toContain('changed');
418
+ });
419
+ it('formats artifact_missing reason', () => {
420
+ const reason = {
421
+ type: 'artifact_missing',
422
+ path: 'src/deleted.ts',
423
+ };
424
+ const formatted = formatStalenessReason(reason);
425
+ expect(formatted).toContain('src/deleted.ts');
426
+ expect(formatted).toContain('no longer exists');
427
+ });
428
+ it('formats derived_from_stale reason', () => {
429
+ const reason = {
430
+ type: 'derived_from_stale',
431
+ upstreamId: 'plan:test:v1',
432
+ };
433
+ const formatted = formatStalenessReason(reason);
434
+ expect(formatted).toContain('plan:test:v1');
435
+ expect(formatted).toContain('stale');
436
+ });
437
+ it('formats source_missing reason', () => {
438
+ const reason = {
439
+ type: 'source_missing',
440
+ sourceId: 'spec:deleted:v1',
441
+ };
442
+ const formatted = formatStalenessReason(reason);
443
+ expect(formatted).toContain('spec:deleted:v1');
444
+ expect(formatted).toContain('no longer exists');
445
+ });
446
+ });
447
+ });
448
+ //# sourceMappingURL=staleness.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.test.js","sourceRoot":"","sources":["../src/staleness.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,oCAAoC;QACpC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3F,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B;QAC1B,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC3C,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAEvC,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAE3C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;YAEnE,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACzC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACpC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAEzC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACzC,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YACrC,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAEzC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,qBAAqB,CAAC,CAAC;YAEhE,MAAM,IAAI,GAAG,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAE3D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAE,CAAC,IAAK,CAAC;YAEtD,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACjD,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,iCAAiC;YACjC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAC9D,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAChC,yBAAyB;YAEzB,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAC9D,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC9C,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAE,CAAC;YAEhD,MAAM,KAAK,GAAU;gBACnB,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,IAAI,EAAE,aAAa;gBACnB,YAAY,EAAE,QAAQ;gBACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC9C,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAExC,MAAM,KAAK,GAAU;gBACnB,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,IAAI,EAAE,aAAa;gBACnB,YAAY,EAAE,qBAAqB;gBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,KAAK,GAAU;gBACnB,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE;gBACnD,IAAI,EAAE,aAAa;gBACnB,YAAY,EAAE,qBAAqB;gBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,2BAA2B;YAC3B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAU,CAAC,CAAC;YAEvG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;YACxD,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAEnD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAW,CAAC,WAAW,CAAC,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAE/D,uEAAuE;YACvE,sCAAsC;YACtC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,6BAA6B;YAC7B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAE3E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;YACxD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;YACxD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;YAExD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAW,CAAC,WAAW,CAAC,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAE/D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAqB,CAAC,CAAC;YAE3E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;YAExD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAW,CAAC,WAAW,CAAC,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAE/D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAE,CAAC,IAAK,CAAC;YAEtD,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACjD,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAC9D,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,+BAA+B;YAC/B,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAC9D,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,oCAAoC;YACpC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;YAEvD,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAC9D,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAEhD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAC9D,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;aACjB,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAS;gBACjB,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAC9D,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;YACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAExC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAEhC,mBAAmB;YACnB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAU,CAAC,CAAC;YAE7G,MAAM,KAAK,GAAU;gBACnB,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;gBACpC,IAAI,EAAE,aAAa;gBACnB,YAAY,EAAE,qBAAqB;gBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAE9B,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEnD,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,gBAAyB;gBAC/B,QAAQ,EAAE,cAAuB;gBACjC,YAAY,EAAE,qBAA8B;gBAC5C,UAAU,EAAE,qBAA8B;aAC3C,CAAC;YAEF,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,kBAA2B;gBACjC,IAAI,EAAE,eAAe;gBACrB,YAAY,EAAE,qBAA8B;gBAC5C,UAAU,EAAE,qBAA8B;aAC3C,CAAC;YAEF,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,kBAA2B;gBACjC,IAAI,EAAE,gBAAgB;aACvB,CAAC;YAEF,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,oBAA6B;gBACnC,UAAU,EAAE,cAAuB;aACpC,CAAC;YAEF,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,gBAAyB;gBAC/B,QAAQ,EAAE,iBAA0B;aACrC,CAAC;YAEF,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}