@stackmemoryai/stackmemory 0.2.8 → 0.2.9

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 (57) hide show
  1. package/dist/src/core/context/compaction-handler.d.ts.map +1 -1
  2. package/dist/src/core/context/compaction-handler.js +1 -1
  3. package/dist/src/core/context/compaction-handler.js.map +1 -1
  4. package/dist/src/core/digest/hybrid-digest-generator.d.ts +76 -0
  5. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -0
  6. package/dist/src/core/digest/hybrid-digest-generator.js +629 -0
  7. package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -0
  8. package/dist/src/core/digest/index.d.ts +7 -0
  9. package/dist/src/core/digest/index.d.ts.map +1 -0
  10. package/dist/src/core/digest/index.js +7 -0
  11. package/dist/src/core/digest/index.js.map +1 -0
  12. package/dist/src/core/digest/types.d.ts +154 -0
  13. package/dist/src/core/digest/types.d.ts.map +1 -0
  14. package/dist/src/core/digest/types.js +18 -0
  15. package/dist/src/core/digest/types.js.map +1 -0
  16. package/dist/src/core/monitoring/logger.d.ts +2 -2
  17. package/dist/src/core/monitoring/logger.d.ts.map +1 -1
  18. package/dist/src/core/monitoring/logger.js +10 -5
  19. package/dist/src/core/monitoring/logger.js.map +1 -1
  20. package/dist/src/core/monitoring/metrics.d.ts +3 -0
  21. package/dist/src/core/monitoring/metrics.d.ts.map +1 -1
  22. package/dist/src/core/monitoring/metrics.js +142 -3
  23. package/dist/src/core/monitoring/metrics.js.map +1 -1
  24. package/dist/src/core/persistence/postgres-adapter.d.ts +31 -0
  25. package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -0
  26. package/dist/src/core/persistence/postgres-adapter.js +316 -0
  27. package/dist/src/core/persistence/postgres-adapter.js.map +1 -0
  28. package/dist/src/core/trace/trace-detector.demo.js +5 -5
  29. package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
  30. package/dist/src/core/types.d.ts +35 -0
  31. package/dist/src/core/types.d.ts.map +1 -0
  32. package/dist/src/core/types.js +2 -0
  33. package/dist/src/core/types.js.map +1 -0
  34. package/dist/src/integrations/mcp/server.js +2 -2
  35. package/dist/src/integrations/mcp/server.js.map +1 -1
  36. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +48 -0
  37. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +1 -0
  38. package/dist/src/integrations/pg-aiguide/embedding-provider.js +190 -0
  39. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +1 -0
  40. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +34 -0
  41. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -0
  42. package/dist/src/integrations/pg-aiguide/semantic-search.js +154 -0
  43. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -0
  44. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +44 -0
  45. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +1 -0
  46. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +215 -0
  47. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +1 -0
  48. package/dist/src/models/user.model.d.ts +55 -0
  49. package/dist/src/models/user.model.d.ts.map +1 -0
  50. package/dist/src/models/user.model.js +263 -0
  51. package/dist/src/models/user.model.js.map +1 -0
  52. package/dist/src/servers/production/auth-middleware.d.ts +7 -0
  53. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  54. package/dist/src/servers/production/auth-middleware.js +201 -26
  55. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  56. package/dist/src/servers/railway/index.js.map +1 -1
  57. package/package.json +6 -1
@@ -0,0 +1,629 @@
1
+ /**
2
+ * Hybrid Digest Generator
3
+ * Implements 80/20 split: deterministic extraction + AI review/insights
4
+ */
5
+ import { DEFAULT_DIGEST_CONFIG, } from './types.js';
6
+ import { logger } from '../monitoring/logger.js';
7
+ /**
8
+ * Hybrid Digest Generator
9
+ * Generates 80% deterministic + 20% AI review for frames
10
+ */
11
+ export class HybridDigestGenerator {
12
+ db;
13
+ config;
14
+ llmProvider;
15
+ queue = [];
16
+ processing = false;
17
+ idleTimer;
18
+ stats = {
19
+ pending: 0,
20
+ processing: 0,
21
+ completed: 0,
22
+ failed: 0,
23
+ avgProcessingTimeMs: 0,
24
+ };
25
+ constructor(db, config = {}, llmProvider) {
26
+ this.db = db;
27
+ this.config = { ...DEFAULT_DIGEST_CONFIG, ...config };
28
+ this.llmProvider = llmProvider;
29
+ this.initializeSchema();
30
+ }
31
+ initializeSchema() {
32
+ this.db.exec(`
33
+ CREATE TABLE IF NOT EXISTS digest_queue (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ frame_id TEXT NOT NULL UNIQUE,
36
+ frame_name TEXT NOT NULL,
37
+ frame_type TEXT NOT NULL,
38
+ priority TEXT DEFAULT 'normal',
39
+ status TEXT DEFAULT 'pending',
40
+ retry_count INTEGER DEFAULT 0,
41
+ created_at INTEGER DEFAULT (unixepoch()),
42
+ updated_at INTEGER DEFAULT (unixepoch()),
43
+ error_message TEXT
44
+ );
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_digest_queue_status ON digest_queue(status);
47
+ CREATE INDEX IF NOT EXISTS idx_digest_queue_priority ON digest_queue(priority, created_at);
48
+ `);
49
+ }
50
+ /**
51
+ * Generate digest for a frame (immediate deterministic, queued AI)
52
+ */
53
+ generateDigest(input) {
54
+ const startTime = Date.now();
55
+ // 1. Generate deterministic fields (60%) - always immediate
56
+ const deterministic = this.extractDeterministicFields(input);
57
+ // 2. Generate initial text summary from deterministic data
58
+ const text = this.generateDeterministicText(input.frame, deterministic);
59
+ // 3. Create the hybrid digest
60
+ const digest = {
61
+ frameId: input.frame.frame_id,
62
+ frameName: input.frame.name,
63
+ frameType: input.frame.type,
64
+ deterministic,
65
+ status: 'deterministic_only',
66
+ text,
67
+ version: 1,
68
+ createdAt: Date.now(),
69
+ updatedAt: Date.now(),
70
+ };
71
+ // 4. Queue for AI generation if enabled
72
+ if (this.config.enableAIGeneration && this.llmProvider) {
73
+ this.queueForAIGeneration({
74
+ frameId: input.frame.frame_id,
75
+ frameName: input.frame.name,
76
+ frameType: input.frame.type,
77
+ priority: this.determinePriority(input),
78
+ createdAt: Date.now(),
79
+ retryCount: 0,
80
+ maxRetries: this.config.maxRetries,
81
+ });
82
+ digest.status = 'ai_pending';
83
+ }
84
+ logger.debug('Generated deterministic digest', {
85
+ frameId: input.frame.frame_id,
86
+ durationMs: Date.now() - startTime,
87
+ aiQueued: digest.status === 'ai_pending',
88
+ });
89
+ return digest;
90
+ }
91
+ /**
92
+ * Extract deterministic fields from frame data (60%)
93
+ */
94
+ extractDeterministicFields(input) {
95
+ const { frame, anchors, events } = input;
96
+ // Extract files modified from events
97
+ const filesModified = this.extractFilesModified(events);
98
+ // Extract test results
99
+ const testsRun = this.extractTestResults(events);
100
+ // Extract errors
101
+ const errorsEncountered = this.extractErrors(events);
102
+ // Count tool calls by type
103
+ const toolCalls = events.filter((e) => e.event_type === 'tool_call');
104
+ const toolCallsByType = {};
105
+ for (const tc of toolCalls) {
106
+ const toolName = tc.payload?.tool_name || 'unknown';
107
+ toolCallsByType[toolName] = (toolCallsByType[toolName] || 0) + 1;
108
+ }
109
+ // Count anchors by type
110
+ const anchorCounts = {};
111
+ for (const anchor of anchors) {
112
+ anchorCounts[anchor.type] = (anchorCounts[anchor.type] || 0) + 1;
113
+ }
114
+ // Extract decisions, constraints, risks
115
+ const decisions = anchors
116
+ .filter((a) => a.type === 'DECISION')
117
+ .map((a) => a.text);
118
+ const constraints = anchors
119
+ .filter((a) => a.type === 'CONSTRAINT')
120
+ .map((a) => a.text);
121
+ const risks = anchors.filter((a) => a.type === 'RISK').map((a) => a.text);
122
+ // Calculate duration
123
+ const durationSeconds = frame.closed_at
124
+ ? frame.closed_at - frame.created_at
125
+ : Math.floor(Date.now() / 1000 - frame.created_at);
126
+ // Determine exit status
127
+ const exitStatus = this.determineExitStatus(frame, errorsEncountered);
128
+ return {
129
+ filesModified,
130
+ testsRun,
131
+ errorsEncountered,
132
+ toolCallCount: toolCalls.length,
133
+ toolCallsByType,
134
+ durationSeconds,
135
+ exitStatus,
136
+ anchorCounts,
137
+ decisions,
138
+ constraints,
139
+ risks,
140
+ };
141
+ }
142
+ extractFilesModified(events) {
143
+ const fileMap = new Map();
144
+ for (const event of events) {
145
+ if (event.event_type === 'tool_call' ||
146
+ event.event_type === 'tool_result') {
147
+ const payload = event.payload || {};
148
+ // Handle various tool patterns
149
+ const filePath = payload.file_path || payload.path || payload.file;
150
+ if (filePath && typeof filePath === 'string') {
151
+ const toolName = payload.tool_name || '';
152
+ let operation = 'read';
153
+ if (toolName.includes('write') ||
154
+ toolName.includes('edit') ||
155
+ toolName.includes('create')) {
156
+ operation = 'modify';
157
+ }
158
+ else if (toolName.includes('delete') ||
159
+ toolName.includes('remove')) {
160
+ operation = 'delete';
161
+ }
162
+ else if (toolName.includes('read') ||
163
+ toolName.includes('cat') ||
164
+ toolName.includes('view')) {
165
+ operation = 'read';
166
+ }
167
+ const existing = fileMap.get(filePath);
168
+ if (!existing ||
169
+ this.operationPriority(operation) >
170
+ this.operationPriority(existing.operation)) {
171
+ fileMap.set(filePath, {
172
+ path: filePath,
173
+ operation,
174
+ linesChanged: payload.lines_changed,
175
+ });
176
+ }
177
+ }
178
+ // Handle filesAffected array
179
+ const filesAffected = payload.filesAffected || payload.files_affected;
180
+ if (Array.isArray(filesAffected)) {
181
+ for (const f of filesAffected) {
182
+ if (typeof f === 'string' && !fileMap.has(f)) {
183
+ fileMap.set(f, { path: f, operation: 'modify' });
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ return Array.from(fileMap.values());
190
+ }
191
+ operationPriority(op) {
192
+ const priorities = { delete: 4, create: 3, modify: 2, read: 1 };
193
+ return priorities[op] || 0;
194
+ }
195
+ extractTestResults(events) {
196
+ const tests = [];
197
+ for (const event of events) {
198
+ const payload = event.payload || {};
199
+ // Look for test-related events
200
+ if (payload.tool_name?.includes('test') ||
201
+ payload.command?.includes('test') ||
202
+ payload.test_name) {
203
+ const testName = payload.test_name || payload.command || 'unknown test';
204
+ const success = payload.success !== false && !payload.error;
205
+ tests.push({
206
+ name: testName,
207
+ status: success ? 'passed' : 'failed',
208
+ duration: payload.duration,
209
+ });
210
+ }
211
+ // Parse test output for results
212
+ const output = payload.output || payload.result;
213
+ if (typeof output === 'string') {
214
+ // Match common test output patterns
215
+ const passMatch = output.match(/(\d+)\s*(?:tests?\s*)?passed/i);
216
+ const failMatch = output.match(/(\d+)\s*(?:tests?\s*)?failed/i);
217
+ if (passMatch || failMatch) {
218
+ const passed = passMatch ? parseInt(passMatch[1], 10) : 0;
219
+ const failed = failMatch ? parseInt(failMatch[1], 10) : 0;
220
+ if (passed > 0) {
221
+ tests.push({ name: `${passed} tests`, status: 'passed' });
222
+ }
223
+ if (failed > 0) {
224
+ tests.push({ name: `${failed} tests`, status: 'failed' });
225
+ }
226
+ }
227
+ }
228
+ }
229
+ return tests;
230
+ }
231
+ extractErrors(events) {
232
+ const errorMap = new Map();
233
+ for (const event of events) {
234
+ const payload = event.payload || {};
235
+ // Check for explicit errors
236
+ if (payload.error || payload.success === false) {
237
+ const errorType = payload.error_type || 'UnknownError';
238
+ const message = payload.error?.message || payload.error || 'Unknown error';
239
+ const key = `${errorType}:${message.substring(0, 50)}`;
240
+ const existing = errorMap.get(key);
241
+ if (existing) {
242
+ existing.count++;
243
+ }
244
+ else {
245
+ errorMap.set(key, {
246
+ type: errorType,
247
+ message: String(message).substring(0, 200),
248
+ resolved: false,
249
+ count: 1,
250
+ });
251
+ }
252
+ }
253
+ }
254
+ // Mark errors as resolved if there's a subsequent success
255
+ // (simplified heuristic)
256
+ return Array.from(errorMap.values());
257
+ }
258
+ determineExitStatus(frame, errors) {
259
+ // Frame state is 'active' or 'closed', check outputs for cancellation
260
+ const outputs = frame.outputs || {};
261
+ if (outputs.cancelled || outputs.status === 'cancelled')
262
+ return 'cancelled';
263
+ if (errors.length === 0)
264
+ return 'success';
265
+ if (errors.some((e) => !e.resolved))
266
+ return 'failure';
267
+ return 'partial';
268
+ }
269
+ /**
270
+ * Generate text summary from deterministic data
271
+ */
272
+ generateDeterministicText(frame, det) {
273
+ const parts = [];
274
+ // Header
275
+ parts.push(`## ${frame.name} (${frame.type})`);
276
+ parts.push(`Status: ${det.exitStatus}`);
277
+ // Duration
278
+ if (det.durationSeconds > 0) {
279
+ const mins = Math.floor(det.durationSeconds / 60);
280
+ const secs = det.durationSeconds % 60;
281
+ parts.push(`Duration: ${mins}m ${secs}s`);
282
+ }
283
+ // Files
284
+ if (det.filesModified.length > 0) {
285
+ parts.push(`\n### Files Modified (${det.filesModified.length})`);
286
+ for (const f of det.filesModified.slice(0, 10)) {
287
+ parts.push(`- ${f.operation}: ${f.path}`);
288
+ }
289
+ if (det.filesModified.length > 10) {
290
+ parts.push(` ...and ${det.filesModified.length - 10} more`);
291
+ }
292
+ }
293
+ // Tool calls
294
+ if (det.toolCallCount > 0) {
295
+ parts.push(`\n### Tool Calls (${det.toolCallCount})`);
296
+ const sorted = Object.entries(det.toolCallsByType)
297
+ .sort((a, b) => b[1] - a[1])
298
+ .slice(0, 5);
299
+ for (const [tool, count] of sorted) {
300
+ parts.push(`- ${tool}: ${count}`);
301
+ }
302
+ }
303
+ // Decisions
304
+ if (det.decisions.length > 0) {
305
+ parts.push(`\n### Decisions (${det.decisions.length})`);
306
+ for (const d of det.decisions.slice(0, 5)) {
307
+ parts.push(`- ${d}`);
308
+ }
309
+ }
310
+ // Constraints
311
+ if (det.constraints.length > 0) {
312
+ parts.push(`\n### Constraints (${det.constraints.length})`);
313
+ for (const c of det.constraints.slice(0, 3)) {
314
+ parts.push(`- ${c}`);
315
+ }
316
+ }
317
+ // Errors
318
+ if (det.errorsEncountered.length > 0) {
319
+ parts.push(`\n### Errors (${det.errorsEncountered.length})`);
320
+ for (const e of det.errorsEncountered.slice(0, 3)) {
321
+ parts.push(`- ${e.type}: ${e.message.substring(0, 80)}`);
322
+ }
323
+ }
324
+ // Tests
325
+ if (det.testsRun.length > 0) {
326
+ const passed = det.testsRun.filter((t) => t.status === 'passed').length;
327
+ const failed = det.testsRun.filter((t) => t.status === 'failed').length;
328
+ parts.push(`\n### Tests: ${passed} passed, ${failed} failed`);
329
+ }
330
+ return parts.join('\n');
331
+ }
332
+ /**
333
+ * Queue frame for AI generation
334
+ */
335
+ queueForAIGeneration(request) {
336
+ try {
337
+ this.db
338
+ .prepare(`
339
+ INSERT OR REPLACE INTO digest_queue
340
+ (frame_id, frame_name, frame_type, priority, status, retry_count, created_at)
341
+ VALUES (?, ?, ?, ?, 'pending', ?, ?)
342
+ `)
343
+ .run(request.frameId, request.frameName, request.frameType, request.priority, request.retryCount, Math.floor(request.createdAt / 1000));
344
+ this.stats.pending++;
345
+ this.scheduleIdleProcessing();
346
+ logger.debug('Queued frame for AI digest generation', {
347
+ frameId: request.frameId,
348
+ priority: request.priority,
349
+ });
350
+ }
351
+ catch (error) {
352
+ logger.error('Failed to queue digest generation', error);
353
+ }
354
+ }
355
+ /**
356
+ * Determine priority based on frame characteristics
357
+ */
358
+ determinePriority(input) {
359
+ const { frame, anchors, events } = input;
360
+ // High priority for frames with many decisions or errors
361
+ const decisionCount = anchors.filter((a) => a.type === 'DECISION').length;
362
+ const errorCount = events.filter((e) => e.payload?.error || e.payload?.success === false).length;
363
+ if (decisionCount >= 3 || errorCount >= 2)
364
+ return 'high';
365
+ if (decisionCount >= 1 || events.length >= 20)
366
+ return 'normal';
367
+ return 'low';
368
+ }
369
+ /**
370
+ * Schedule idle-time processing
371
+ */
372
+ scheduleIdleProcessing() {
373
+ if (this.idleTimer) {
374
+ clearTimeout(this.idleTimer);
375
+ }
376
+ this.idleTimer = setTimeout(() => {
377
+ this.processQueue();
378
+ }, this.config.idleThresholdMs);
379
+ }
380
+ /**
381
+ * Process queued AI generation requests
382
+ */
383
+ async processQueue() {
384
+ if (this.processing || !this.llmProvider)
385
+ return;
386
+ this.processing = true;
387
+ try {
388
+ // Get pending items ordered by priority and age
389
+ const pending = this.db
390
+ .prepare(`
391
+ SELECT * FROM digest_queue
392
+ WHERE status = 'pending'
393
+ ORDER BY
394
+ CASE priority
395
+ WHEN 'high' THEN 1
396
+ WHEN 'normal' THEN 2
397
+ WHEN 'low' THEN 3
398
+ END,
399
+ created_at ASC
400
+ LIMIT ?
401
+ `)
402
+ .all(this.config.batchSize);
403
+ for (const item of pending) {
404
+ await this.processQueueItem(item);
405
+ }
406
+ }
407
+ finally {
408
+ this.processing = false;
409
+ }
410
+ }
411
+ async processQueueItem(item) {
412
+ const startTime = Date.now();
413
+ try {
414
+ // Mark as processing
415
+ this.db
416
+ .prepare(`UPDATE digest_queue SET status = 'processing', updated_at = unixepoch() WHERE frame_id = ?`)
417
+ .run(item.frame_id);
418
+ this.stats.processing++;
419
+ this.stats.pending--;
420
+ // Get frame data
421
+ const frame = this.db
422
+ .prepare(`SELECT * FROM frames WHERE frame_id = ?`)
423
+ .get(item.frame_id);
424
+ if (!frame) {
425
+ throw new Error(`Frame not found: ${item.frame_id}`);
426
+ }
427
+ const anchors = this.db
428
+ .prepare(`SELECT * FROM anchors WHERE frame_id = ?`)
429
+ .all(item.frame_id);
430
+ const events = this.db
431
+ .prepare(`SELECT * FROM events WHERE frame_id = ? ORDER BY ts ASC`)
432
+ .all(item.frame_id);
433
+ // Parse JSON fields
434
+ const parsedFrame = {
435
+ ...frame,
436
+ inputs: JSON.parse(frame.inputs || '{}'),
437
+ outputs: JSON.parse(frame.outputs || '{}'),
438
+ digest_json: JSON.parse(frame.digest_json || '{}'),
439
+ };
440
+ const input = {
441
+ frame: parsedFrame,
442
+ anchors: anchors.map((a) => ({
443
+ ...a,
444
+ metadata: JSON.parse(a.metadata || '{}'),
445
+ })),
446
+ events: events.map((e) => ({
447
+ ...e,
448
+ payload: JSON.parse(e.payload || '{}'),
449
+ })),
450
+ };
451
+ // Generate deterministic first (needed for AI context)
452
+ const deterministic = this.extractDeterministicFields(input);
453
+ // Generate AI summary
454
+ const aiGenerated = await this.llmProvider.generateSummary(input, deterministic, this.config.maxTokens);
455
+ // Update digest in frames table
456
+ const existingDigest = parsedFrame.digest_json || {};
457
+ const updatedDigest = {
458
+ ...existingDigest,
459
+ aiGenerated,
460
+ status: 'complete',
461
+ updatedAt: Date.now(),
462
+ };
463
+ // Generate enhanced text with AI summary
464
+ const enhancedText = this.generateEnhancedText(parsedFrame, deterministic, aiGenerated);
465
+ this.db
466
+ .prepare(`
467
+ UPDATE frames
468
+ SET digest_json = ?, digest_text = ?
469
+ WHERE frame_id = ?
470
+ `)
471
+ .run(JSON.stringify(updatedDigest), enhancedText, item.frame_id);
472
+ // Mark as completed
473
+ this.db
474
+ .prepare(`UPDATE digest_queue SET status = 'completed', updated_at = unixepoch() WHERE frame_id = ?`)
475
+ .run(item.frame_id);
476
+ this.stats.processing--;
477
+ this.stats.completed++;
478
+ // Update average processing time
479
+ const processingTime = Date.now() - startTime;
480
+ this.stats.avgProcessingTimeMs =
481
+ (this.stats.avgProcessingTimeMs * (this.stats.completed - 1) +
482
+ processingTime) /
483
+ this.stats.completed;
484
+ logger.info('Generated AI digest', {
485
+ frameId: item.frame_id,
486
+ processingTimeMs: processingTime,
487
+ });
488
+ }
489
+ catch (error) {
490
+ // Handle retry logic
491
+ const newRetryCount = item.retry_count + 1;
492
+ if (newRetryCount < this.config.maxRetries) {
493
+ this.db
494
+ .prepare(`
495
+ UPDATE digest_queue
496
+ SET status = 'pending', retry_count = ?, error_message = ?, updated_at = unixepoch()
497
+ WHERE frame_id = ?
498
+ `)
499
+ .run(newRetryCount, error.message, item.frame_id);
500
+ this.stats.processing--;
501
+ this.stats.pending++;
502
+ logger.warn('AI digest generation failed, will retry', {
503
+ frameId: item.frame_id,
504
+ retryCount: newRetryCount,
505
+ error: error.message,
506
+ });
507
+ }
508
+ else {
509
+ // Mark as failed
510
+ this.db
511
+ .prepare(`
512
+ UPDATE digest_queue
513
+ SET status = 'failed', error_message = ?, updated_at = unixepoch()
514
+ WHERE frame_id = ?
515
+ `)
516
+ .run(error.message, item.frame_id);
517
+ this.stats.processing--;
518
+ this.stats.failed++;
519
+ logger.error('AI digest generation failed permanently', error, {
520
+ frameId: item.frame_id,
521
+ });
522
+ }
523
+ }
524
+ }
525
+ /**
526
+ * Generate enhanced text with AI review (20%)
527
+ */
528
+ generateEnhancedText(frame, det, ai) {
529
+ const parts = [];
530
+ // Deterministic content first (80%)
531
+ parts.push(this.generateDeterministicText(frame, det));
532
+ // AI review section (20%) - compact
533
+ parts.push(`\n---`);
534
+ parts.push(`**AI Review**: ${ai.summary}`);
535
+ if (ai.insight) {
536
+ parts.push(`**Insight**: ${ai.insight}`);
537
+ }
538
+ if (ai.flaggedIssue) {
539
+ parts.push(`**Flag**: ${ai.flaggedIssue}`);
540
+ }
541
+ return parts.join('\n');
542
+ }
543
+ /**
544
+ * Get queue statistics
545
+ */
546
+ getStats() {
547
+ return { ...this.stats };
548
+ }
549
+ /**
550
+ * Set LLM provider
551
+ */
552
+ setLLMProvider(provider) {
553
+ this.llmProvider = provider;
554
+ }
555
+ /**
556
+ * Force process queue (for testing or manual trigger)
557
+ */
558
+ async forceProcessQueue() {
559
+ if (this.idleTimer) {
560
+ clearTimeout(this.idleTimer);
561
+ }
562
+ await this.processQueue();
563
+ }
564
+ /**
565
+ * Get digest for a frame
566
+ */
567
+ getDigest(frameId) {
568
+ const frame = this.db
569
+ .prepare(`SELECT * FROM frames WHERE frame_id = ?`)
570
+ .get(frameId);
571
+ if (!frame)
572
+ return null;
573
+ const digestJson = JSON.parse(frame.digest_json || '{}');
574
+ const anchors = this.db
575
+ .prepare(`SELECT * FROM anchors WHERE frame_id = ?`)
576
+ .all(frameId);
577
+ const events = this.db
578
+ .prepare(`SELECT * FROM events WHERE frame_id = ?`)
579
+ .all(frameId);
580
+ const parsedFrame = {
581
+ ...frame,
582
+ inputs: JSON.parse(frame.inputs || '{}'),
583
+ outputs: JSON.parse(frame.outputs || '{}'),
584
+ digest_json: digestJson,
585
+ };
586
+ const input = {
587
+ frame: parsedFrame,
588
+ anchors: anchors.map((a) => ({
589
+ ...a,
590
+ metadata: JSON.parse(a.metadata || '{}'),
591
+ })),
592
+ events: events.map((e) => ({
593
+ ...e,
594
+ payload: JSON.parse(e.payload || '{}'),
595
+ })),
596
+ };
597
+ const deterministic = this.extractDeterministicFields(input);
598
+ // Check queue status
599
+ const queueItem = this.db
600
+ .prepare(`SELECT status FROM digest_queue WHERE frame_id = ?`)
601
+ .get(frameId);
602
+ let status = 'deterministic_only';
603
+ if (digestJson.aiGenerated) {
604
+ status = 'complete';
605
+ }
606
+ else if (queueItem) {
607
+ status =
608
+ queueItem.status === 'processing'
609
+ ? 'ai_processing'
610
+ : queueItem.status === 'failed'
611
+ ? 'ai_failed'
612
+ : 'ai_pending';
613
+ }
614
+ return {
615
+ frameId: frame.frame_id,
616
+ frameName: frame.name,
617
+ frameType: frame.type,
618
+ deterministic,
619
+ aiGenerated: digestJson.aiGenerated,
620
+ status,
621
+ text: frame.digest_text ||
622
+ this.generateDeterministicText(parsedFrame, deterministic),
623
+ version: 1,
624
+ createdAt: frame.created_at * 1000,
625
+ updatedAt: digestJson.updatedAt || frame.created_at * 1000,
626
+ };
627
+ }
628
+ }
629
+ //# sourceMappingURL=hybrid-digest-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-digest-generator.js","sourceRoot":"","sources":["../../../../src/core/digest/hybrid-digest-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAaL,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IACxB,EAAE,CAAoB;IACtB,MAAM,CAAe;IACrB,WAAW,CAAqB;IAChC,KAAK,GAA8B,EAAE,CAAC;IACtC,UAAU,GAAY,KAAK,CAAC;IAC5B,SAAS,CAAkB;IAC3B,KAAK,GAAqB;QAChC,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,mBAAmB,EAAE,CAAC;KACvB,CAAC;IAEF,YACE,EAAqB,EACrB,SAAgC,EAAE,EAClC,WAA+B;QAE/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,MAAM,EAAE,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;KAgBZ,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,KAAkB;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAE7D,2DAA2D;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAExE,8BAA8B;QAC9B,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ;YAC7B,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;YAC3B,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;YAC3B,aAAa;YACb,MAAM,EAAE,oBAAoB;YAC5B,IAAI;YACJ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,wCAAwC;QACxC,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvD,IAAI,CAAC,oBAAoB,CAAC;gBACxB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ;gBAC7B,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;gBAC3B,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;gBAC3B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;gBACvC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;aACnC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;QAC/B,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;YAC7C,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ;YAC7B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,YAAY;SACzC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,0BAA0B,CAAC,KAAkB;QACnD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QAEzC,qCAAqC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAExD,uBAAuB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEjD,iBAAiB;QACjB,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAErD,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC;QACrE,MAAM,eAAe,GAA2B,EAAE,CAAC;QACnD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC;YACpD,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,wBAAwB;QACxB,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,wCAAwC;QACxC,MAAM,SAAS,GAAG,OAAO;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,WAAW,GAAG,OAAO;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE1E,qBAAqB;QACrB,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS;YACrC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU;YACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QAErD,wBAAwB;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAEtE,OAAO;YACL,aAAa;YACb,QAAQ;YACR,iBAAiB;YACjB,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,eAAe;YACf,eAAe;YACf,UAAU;YACV,YAAY;YACZ,SAAS;YACT,WAAW;YACX,KAAK;SACN,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAAC,MAAe;QAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;QAEpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IACE,KAAK,CAAC,UAAU,KAAK,WAAW;gBAChC,KAAK,CAAC,UAAU,KAAK,aAAa,EAClC,CAAC;gBACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;gBAEpC,+BAA+B;gBAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;gBACnE,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;oBACzC,IAAI,SAAS,GAAkC,MAAM,CAAC;oBAEtD,IACE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAC1B,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;wBACzB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC3B,CAAC;wBACD,SAAS,GAAG,QAAQ,CAAC;oBACvB,CAAC;yBAAM,IACL,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBAC3B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC3B,CAAC;wBACD,SAAS,GAAG,QAAQ,CAAC;oBACvB,CAAC;yBAAM,IACL,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;wBACzB,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EACzB,CAAC;wBACD,SAAS,GAAG,MAAM,CAAC;oBACrB,CAAC;oBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACvC,IACE,CAAC,QAAQ;wBACT,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;4BAC/B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC5C,CAAC;wBACD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;4BACpB,IAAI,EAAE,QAAQ;4BACd,SAAS;4BACT,YAAY,EAAE,OAAO,CAAC,aAAa;yBACpC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,6BAA6B;gBAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC;gBACtE,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;oBACjC,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;wBAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC7C,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;wBACnD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAEO,iBAAiB,CAAC,EAAiC;QACzD,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,OAAO,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAEO,kBAAkB,CAAC,MAAe;QACxC,MAAM,KAAK,GAAiB,EAAE,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YAEpC,+BAA+B;YAC/B,IACE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;gBACnC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;gBACjC,OAAO,CAAC,SAAS,EACjB,CAAC;gBACD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC;gBACxE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAE5D,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;oBACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CAAC,CAAC;YACL,CAAC;YAED,gCAAgC;YAChC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;YAChD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,oCAAoC;gBACpC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAChE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAEhE,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;oBAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE1D,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;wBACf,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC5D,CAAC;oBACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;wBACf,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,aAAa,CAAC,MAAe;QACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;QAE9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YAEpC,4BAA4B;YAC5B,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;gBACvD,MAAM,OAAO,GACX,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,eAAe,CAAC;gBAE7D,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEnC,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;wBAChB,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;wBAC1C,QAAQ,EAAE,KAAK;wBACf,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,yBAAyB;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAEO,mBAAmB,CACzB,KAAY,EACZ,MAAmB;QAEnB,sEAAsE;QACtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,WAAW,CAAC;QAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,yBAAyB,CAC/B,KAAY,EACZ,GAAwB;QAExB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,SAAS;QACT,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAExC,WAAW;QACX,IAAI,GAAG,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC;QAC5C,CAAC;QAED,QAAQ;QACR,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YACjE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,aAAa;QACb,IAAI,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;iBAC/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,cAAc;QACd,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,SAAS;QACT,IAAI,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,QAAQ;QACR,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;YACxE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,YAAY,MAAM,SAAS,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,OAAgC;QAC3D,IAAI,CAAC;YACH,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;;;SAID,CACA;iBACA,GAAG,CACF,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,UAAU,EAClB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CACrC,CAAC;YAEJ,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAE9B,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;gBACpD,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,KAAkB;QAElB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QAEzC,yDAAyD;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,KAAK,CACxD,CAAC,MAAM,CAAC;QAET,IAAI,aAAa,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QACzD,IAAI,aAAa,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE;YAAE,OAAO,QAAQ,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY;QACvB,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAEjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC;YACH,gDAAgD;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;iBACpB,OAAO,CACN;;;;;;;;;;;SAWD,CACA;iBACA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAU,CAAC;YAEvC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAS;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,qBAAqB;YACrB,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN,4FAA4F,CAC7F;iBACA,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAErB,iBAAiB;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE;iBAClB,OAAO,CAAC,yCAAyC,CAAC;iBAClD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAQ,CAAC;YAE7B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;iBACpB,OAAO,CAAC,0CAA0C,CAAC;iBACnD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAa,CAAC;YAElC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;iBACnB,OAAO,CAAC,yDAAyD,CAAC;iBAClE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAY,CAAC;YAEjC,oBAAoB;YACpB,MAAM,WAAW,GAAU;gBACzB,GAAG,KAAK;gBACR,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;gBACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;gBAC1C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC;aACnD,CAAC;YAEF,MAAM,KAAK,GAAgB;gBACzB,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBAChC,GAAG,CAAC;oBACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;iBACzC,CAAC,CAAC;gBACH,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBAC9B,GAAG,CAAC;oBACJ,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;iBACvC,CAAC,CAAC;aACJ,CAAC;YAEF,uDAAuD;YACvD,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;YAE7D,sBAAsB;YACtB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAY,CAAC,eAAe,CACzD,KAAK,EACL,aAAa,EACb,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAC;YAEF,gCAAgC;YAChC,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC;YACrD,MAAM,aAAa,GAAG;gBACpB,GAAG,cAAc;gBACjB,WAAW;gBACX,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,yCAAyC;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAC5C,WAAW,EACX,aAAa,EACb,WAAW,CACZ,CAAC;YAEF,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;;;SAID,CACA;iBACA,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnE,oBAAoB;YACpB,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN,2FAA2F,CAC5F;iBACA,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAEvB,iCAAiC;YACjC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,mBAAmB;gBAC5B,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;oBAC1D,cAAc,CAAC;oBACjB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YAEvB,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBACjC,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,gBAAgB,EAAE,cAAc;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,qBAAqB;YACrB,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YAE3C,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC3C,IAAI,CAAC,EAAE;qBACJ,OAAO,CACN;;;;WAID,CACA;qBACA,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEpD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAErB,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE;oBACrD,OAAO,EAAE,IAAI,CAAC,QAAQ;oBACtB,UAAU,EAAE,aAAa;oBACzB,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,iBAAiB;gBACjB,IAAI,CAAC,EAAE;qBACJ,OAAO,CACN;;;;WAID,CACA;qBACA,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAErC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAEpB,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,EAAE;oBAC7D,OAAO,EAAE,IAAI,CAAC,QAAQ;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,KAAY,EACZ,GAAwB,EACxB,EAAqB;QAErB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,oCAAoC;QACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,oCAAoC;QACpC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAE3C,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,QAA2B;QAC/C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,OAAe;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE;aAClB,OAAO,CAAC,yCAAyC,CAAC;aAClD,GAAG,CAAC,OAAO,CAAQ,CAAC;QAEvB,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,OAAO,CAAC,0CAA0C,CAAC;aACnD,GAAG,CAAC,OAAO,CAAU,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,yCAAyC,CAAC;aAClD,GAAG,CAAC,OAAO,CAAU,CAAC;QAEzB,MAAM,WAAW,GAAU;YACzB,GAAG,KAAK;YACR,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;YACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;YAC1C,WAAW,EAAE,UAAU;SACxB,CAAC;QAEF,MAAM,KAAK,GAAgB;YACzB,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,GAAG,CAAC;gBACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;aACzC,CAAC,CAAC;YACH,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,GAAG,CAAC;gBACJ,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;aACvC,CAAC,CAAC;SACJ,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAE7D,qBAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,oDAAoD,CAAC;aAC7D,GAAG,CAAC,OAAO,CAAQ,CAAC;QAEvB,IAAI,MAAM,GAAiB,oBAAoB,CAAC;QAChD,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3B,MAAM,GAAG,UAAU,CAAC;QACtB,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,MAAM;gBACJ,SAAS,CAAC,MAAM,KAAK,YAAY;oBAC/B,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ;wBAC7B,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,YAAY,CAAC;QACvB,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,QAAQ;YACvB,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,aAAa;YACb,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,MAAM;YACN,IAAI,EACF,KAAK,CAAC,WAAW;gBACjB,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,aAAa,CAAC;YAC5D,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI;YAClC,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,GAAG,IAAI;SAC3D,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hybrid Digest Generation Module
3
+ * 80% deterministic extraction, 20% AI review/insights
4
+ */
5
+ export * from './types.js';
6
+ export * from './hybrid-digest-generator.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/digest/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC"}