@duckcodeailabs/dql-agent 1.6.31 → 1.6.33

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 (160) hide show
  1. package/dist/agent-run-engine.d.ts +42 -6
  2. package/dist/agent-run-engine.d.ts.map +1 -1
  3. package/dist/agent-run-engine.js +133 -79
  4. package/dist/agent-run-engine.js.map +1 -1
  5. package/dist/agent-run-gates.d.ts.map +1 -1
  6. package/dist/agent-run-gates.js +72 -5
  7. package/dist/agent-run-gates.js.map +1 -1
  8. package/dist/agent-run-planner.d.ts.map +1 -1
  9. package/dist/agent-run-planner.js +13 -0
  10. package/dist/agent-run-planner.js.map +1 -1
  11. package/dist/answer-loop.d.ts +110 -8
  12. package/dist/answer-loop.d.ts.map +1 -1
  13. package/dist/answer-loop.js +1679 -1299
  14. package/dist/answer-loop.js.map +1 -1
  15. package/dist/answer-shape.d.ts +16 -0
  16. package/dist/answer-shape.d.ts.map +1 -0
  17. package/dist/answer-shape.js +85 -0
  18. package/dist/answer-shape.js.map +1 -0
  19. package/dist/cascade/budgets.d.ts +101 -0
  20. package/dist/cascade/budgets.d.ts.map +1 -0
  21. package/dist/cascade/budgets.js +184 -0
  22. package/dist/cascade/budgets.js.map +1 -0
  23. package/dist/cascade/cascade.d.ts +86 -0
  24. package/dist/cascade/cascade.d.ts.map +1 -0
  25. package/dist/cascade/cascade.js +115 -0
  26. package/dist/cascade/cascade.js.map +1 -0
  27. package/dist/cascade/route-policy.d.ts +14 -0
  28. package/dist/cascade/route-policy.d.ts.map +1 -0
  29. package/dist/cascade/route-policy.js +48 -0
  30. package/dist/cascade/route-policy.js.map +1 -0
  31. package/dist/cascade/triage.d.ts +20 -0
  32. package/dist/cascade/triage.d.ts.map +1 -0
  33. package/dist/cascade/triage.js +25 -0
  34. package/dist/cascade/triage.js.map +1 -0
  35. package/dist/conversation/rolling-summary.d.ts +13 -0
  36. package/dist/conversation/rolling-summary.d.ts.map +1 -0
  37. package/dist/conversation/rolling-summary.js +43 -0
  38. package/dist/conversation/rolling-summary.js.map +1 -0
  39. package/dist/conversation/session-store.d.ts +110 -0
  40. package/dist/conversation/session-store.d.ts.map +1 -0
  41. package/dist/conversation/session-store.js +387 -0
  42. package/dist/conversation/session-store.js.map +1 -0
  43. package/dist/conversation/snapshot.d.ts +59 -0
  44. package/dist/conversation/snapshot.d.ts.map +1 -0
  45. package/dist/conversation/snapshot.js +153 -0
  46. package/dist/conversation/snapshot.js.map +1 -0
  47. package/dist/conversation/working-state.d.ts +49 -0
  48. package/dist/conversation/working-state.d.ts.map +1 -0
  49. package/dist/conversation/working-state.js +249 -0
  50. package/dist/conversation/working-state.js.map +1 -0
  51. package/dist/embeddings/provider.d.ts +62 -0
  52. package/dist/embeddings/provider.d.ts.map +1 -1
  53. package/dist/embeddings/provider.js +98 -0
  54. package/dist/embeddings/provider.js.map +1 -1
  55. package/dist/grounding/context-ledger.d.ts +30 -0
  56. package/dist/grounding/context-ledger.d.ts.map +1 -0
  57. package/dist/grounding/context-ledger.js +54 -0
  58. package/dist/grounding/context-ledger.js.map +1 -0
  59. package/dist/grounding/regrounding.d.ts +24 -0
  60. package/dist/grounding/regrounding.d.ts.map +1 -0
  61. package/dist/grounding/regrounding.js +219 -0
  62. package/dist/grounding/regrounding.js.map +1 -0
  63. package/dist/grounding/value-index.d.ts +32 -0
  64. package/dist/grounding/value-index.d.ts.map +1 -0
  65. package/dist/grounding/value-index.js +67 -0
  66. package/dist/grounding/value-index.js.map +1 -0
  67. package/dist/index.d.ts +45 -14
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +102 -11
  70. package/dist/index.js.map +1 -1
  71. package/dist/intent-controller.d.ts +7 -0
  72. package/dist/intent-controller.d.ts.map +1 -1
  73. package/dist/intent-controller.js +22 -1
  74. package/dist/intent-controller.js.map +1 -1
  75. package/dist/kg/build.d.ts.map +1 -1
  76. package/dist/kg/build.js +44 -17
  77. package/dist/kg/build.js.map +1 -1
  78. package/dist/kg/sqlite-fts.d.ts +3 -1
  79. package/dist/kg/sqlite-fts.d.ts.map +1 -1
  80. package/dist/kg/sqlite-fts.js +16 -2
  81. package/dist/kg/sqlite-fts.js.map +1 -1
  82. package/dist/kg/types.d.ts +23 -1
  83. package/dist/kg/types.d.ts.map +1 -1
  84. package/dist/memory/fts-query.d.ts +7 -0
  85. package/dist/memory/fts-query.d.ts.map +1 -0
  86. package/dist/memory/fts-query.js +36 -0
  87. package/dist/memory/fts-query.js.map +1 -0
  88. package/dist/memory/sqlite-memory.d.ts.map +1 -1
  89. package/dist/memory/sqlite-memory.js +1 -30
  90. package/dist/memory/sqlite-memory.js.map +1 -1
  91. package/dist/metadata/analysis-planner.d.ts +23 -0
  92. package/dist/metadata/analysis-planner.d.ts.map +1 -1
  93. package/dist/metadata/analysis-planner.js +432 -2
  94. package/dist/metadata/analysis-planner.js.map +1 -1
  95. package/dist/metadata/block-fit.d.ts +24 -0
  96. package/dist/metadata/block-fit.d.ts.map +1 -0
  97. package/dist/metadata/block-fit.js +373 -0
  98. package/dist/metadata/block-fit.js.map +1 -0
  99. package/dist/metadata/catalog.d.ts +72 -3
  100. package/dist/metadata/catalog.d.ts.map +1 -1
  101. package/dist/metadata/catalog.js +1452 -72
  102. package/dist/metadata/catalog.js.map +1 -1
  103. package/dist/metadata/drafts.d.ts +25 -0
  104. package/dist/metadata/drafts.d.ts.map +1 -1
  105. package/dist/metadata/drafts.js +112 -2
  106. package/dist/metadata/drafts.js.map +1 -1
  107. package/dist/metadata/metric-match.d.ts +55 -6
  108. package/dist/metadata/metric-match.d.ts.map +1 -1
  109. package/dist/metadata/metric-match.js +158 -13
  110. package/dist/metadata/metric-match.js.map +1 -1
  111. package/dist/metadata/sql-context-validation.d.ts +13 -1
  112. package/dist/metadata/sql-context-validation.d.ts.map +1 -1
  113. package/dist/metadata/sql-context-validation.js +172 -19
  114. package/dist/metadata/sql-context-validation.js.map +1 -1
  115. package/dist/metadata/sql-retrieval.d.ts +3 -2
  116. package/dist/metadata/sql-retrieval.d.ts.map +1 -1
  117. package/dist/metadata/sql-retrieval.js +6 -4
  118. package/dist/metadata/sql-retrieval.js.map +1 -1
  119. package/dist/providers/claude.d.ts +2 -1
  120. package/dist/providers/claude.d.ts.map +1 -1
  121. package/dist/providers/claude.js +95 -0
  122. package/dist/providers/claude.js.map +1 -1
  123. package/dist/providers/index.d.ts +1 -1
  124. package/dist/providers/index.d.ts.map +1 -1
  125. package/dist/providers/index.js.map +1 -1
  126. package/dist/providers/openai.d.ts +2 -1
  127. package/dist/providers/openai.d.ts.map +1 -1
  128. package/dist/providers/openai.js +143 -0
  129. package/dist/providers/openai.js.map +1 -1
  130. package/dist/providers/tool-output.d.ts +2 -0
  131. package/dist/providers/tool-output.d.ts.map +1 -0
  132. package/dist/providers/tool-output.js +22 -0
  133. package/dist/providers/tool-output.js.map +1 -0
  134. package/dist/providers/types.d.ts +23 -0
  135. package/dist/providers/types.d.ts.map +1 -1
  136. package/dist/providers/types.js.map +1 -1
  137. package/dist/semantic-bridge/compose.d.ts +89 -0
  138. package/dist/semantic-bridge/compose.d.ts.map +1 -0
  139. package/dist/semantic-bridge/compose.js +528 -0
  140. package/dist/semantic-bridge/compose.js.map +1 -0
  141. package/dist/semantic-bridge/member-select.d.ts +23 -0
  142. package/dist/semantic-bridge/member-select.d.ts.map +1 -0
  143. package/dist/semantic-bridge/member-select.js +106 -0
  144. package/dist/semantic-bridge/member-select.js.map +1 -0
  145. package/dist/skills/defaults.d.ts.map +1 -1
  146. package/dist/skills/defaults.js +5 -0
  147. package/dist/skills/defaults.js.map +1 -1
  148. package/dist/synthesize.d.ts +26 -0
  149. package/dist/synthesize.d.ts.map +1 -1
  150. package/dist/synthesize.js +72 -3
  151. package/dist/synthesize.js.map +1 -1
  152. package/dist/tools/registry.d.ts +15 -0
  153. package/dist/tools/registry.d.ts.map +1 -0
  154. package/dist/tools/registry.js +692 -0
  155. package/dist/tools/registry.js.map +1 -0
  156. package/dist/trust/stamp.d.ts +26 -0
  157. package/dist/trust/stamp.d.ts.map +1 -0
  158. package/dist/trust/stamp.js +33 -0
  159. package/dist/trust/stamp.js.map +1 -0
  160. package/package.json +4 -4
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Server-side conversation session store: threads + ordered turns, persisted in
3
+ * `.dql/cache/agent-conversations.sqlite` so multi-turn context survives page
4
+ * refreshes and process restarts.
5
+ *
6
+ * This is the SESSION layer — auto-captured, compactable, per-thread. It is
7
+ * strictly separate from the governed durable memory (`MemoryStore`): raw chat
8
+ * is never a correctness signal and never enters `agent_memory` except through
9
+ * an explicit promotion action. Modeled on `memory/sqlite-memory.ts`
10
+ * (better-sqlite3, WAL, FTS5 porter).
11
+ */
12
+ import { mkdirSync } from 'node:fs';
13
+ import { dirname, join } from 'node:path';
14
+ import { createRequire } from 'node:module';
15
+ import { sanitizeFtsQuery } from '../memory/fts-query.js';
16
+ const require = createRequire(import.meta.url);
17
+ let databaseCtor = null;
18
+ function loadDatabase() {
19
+ databaseCtor ??= require('better-sqlite3');
20
+ return databaseCtor;
21
+ }
22
+ /** Caps applied at write time so stored turns stay bounded (mirrors the in-request caps). */
23
+ const MAX_SAMPLE_ROWS = 8;
24
+ const MAX_COLUMNS = 24;
25
+ const MAX_DIMENSION_KEYS = 8;
26
+ const MAX_DIMENSION_VALUES = 24;
27
+ const MAX_ANSWER_TEXT = 4000;
28
+ const MAX_SUMMARY = 1200;
29
+ const MAX_DQL_SOURCE = 3000;
30
+ export function defaultConversationPath(projectRoot) {
31
+ return join(projectRoot, '.dql', 'cache', 'agent-conversations.sqlite');
32
+ }
33
+ export class ConversationStore {
34
+ db;
35
+ constructor(dbPath) {
36
+ mkdirSync(dirname(dbPath), { recursive: true });
37
+ const Database = loadDatabase();
38
+ this.db = new Database(dbPath);
39
+ this.db.pragma('journal_mode = WAL');
40
+ this.initSchema();
41
+ }
42
+ initSchema() {
43
+ this.db.exec(`
44
+ CREATE TABLE IF NOT EXISTS conversation_threads (
45
+ id TEXT PRIMARY KEY,
46
+ surface TEXT NOT NULL DEFAULT 'notebook',
47
+ title TEXT,
48
+ notebook_path TEXT,
49
+ working_state_json TEXT NOT NULL DEFAULT '{}',
50
+ rolling_summary TEXT,
51
+ summary_turn_seq INTEGER NOT NULL DEFAULT 0,
52
+ archived INTEGER NOT NULL DEFAULT 0,
53
+ created_at TEXT NOT NULL,
54
+ updated_at TEXT NOT NULL
55
+ );
56
+
57
+ CREATE INDEX IF NOT EXISTS idx_conversation_threads_updated
58
+ ON conversation_threads(archived, updated_at DESC);
59
+
60
+ CREATE TABLE IF NOT EXISTS conversation_turns (
61
+ id TEXT PRIMARY KEY,
62
+ thread_id TEXT NOT NULL,
63
+ seq INTEGER NOT NULL,
64
+ question TEXT NOT NULL,
65
+ answer_summary TEXT,
66
+ answer_text TEXT,
67
+ route TEXT,
68
+ trust_label TEXT,
69
+ certification TEXT,
70
+ source_certified_block TEXT,
71
+ context_pack_id TEXT,
72
+ sql TEXT,
73
+ dql_artifact_json TEXT NOT NULL DEFAULT '{}',
74
+ cascade_json TEXT NOT NULL DEFAULT '{}',
75
+ result_json TEXT NOT NULL DEFAULT '{}',
76
+ contract_json TEXT NOT NULL DEFAULT '{}',
77
+ created_at TEXT NOT NULL,
78
+ UNIQUE (thread_id, seq)
79
+ );
80
+
81
+ CREATE INDEX IF NOT EXISTS idx_conversation_turns_thread
82
+ ON conversation_turns(thread_id, seq DESC);
83
+
84
+ CREATE VIRTUAL TABLE IF NOT EXISTS conversation_turns_fts USING fts5(
85
+ id UNINDEXED,
86
+ thread_id UNINDEXED,
87
+ question,
88
+ answer_summary,
89
+ tags,
90
+ tokenize = 'porter unicode61'
91
+ );
92
+ `);
93
+ this.ensureColumn('conversation_turns', 'dql_artifact_json', "TEXT NOT NULL DEFAULT '{}'");
94
+ this.ensureColumn('conversation_turns', 'cascade_json', "TEXT NOT NULL DEFAULT '{}'");
95
+ }
96
+ ensureColumn(table, column, ddl) {
97
+ const columns = this.db.prepare(`PRAGMA table_info(${table})`).all();
98
+ if (columns.some((item) => item.name === column))
99
+ return;
100
+ this.db.prepare(`ALTER TABLE ${table} ADD COLUMN ${column} ${ddl}`).run();
101
+ }
102
+ createThread(input = {}) {
103
+ const now = new Date().toISOString();
104
+ const id = `thr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
105
+ const thread = {
106
+ id,
107
+ surface: input.surface?.trim() || 'notebook',
108
+ title: input.title?.trim() || undefined,
109
+ notebookPath: input.notebookPath?.trim() || undefined,
110
+ workingState: {},
111
+ rollingSummary: undefined,
112
+ summaryTurnSeq: 0,
113
+ archived: false,
114
+ createdAt: now,
115
+ updatedAt: now,
116
+ };
117
+ this.db.prepare(`
118
+ INSERT INTO conversation_threads (
119
+ id, surface, title, notebook_path, working_state_json, rolling_summary,
120
+ summary_turn_seq, archived, created_at, updated_at
121
+ ) VALUES (?, ?, ?, ?, '{}', NULL, 0, 0, ?, ?)
122
+ `).run(thread.id, thread.surface, thread.title ?? null, thread.notebookPath ?? null, now, now);
123
+ return thread;
124
+ }
125
+ getThread(id) {
126
+ const row = this.db.prepare('SELECT * FROM conversation_threads WHERE id = ?').get(id);
127
+ return row ? rowToThread(row) : null;
128
+ }
129
+ listThreads(options = {}) {
130
+ const rows = options.includeArchived
131
+ ? this.db.prepare('SELECT * FROM conversation_threads ORDER BY updated_at DESC LIMIT ?')
132
+ .all(options.limit ?? 50)
133
+ : this.db.prepare('SELECT * FROM conversation_threads WHERE archived = 0 ORDER BY updated_at DESC LIMIT ?')
134
+ .all(options.limit ?? 50);
135
+ return rows.map(rowToThread);
136
+ }
137
+ archiveThread(id) {
138
+ this.db.prepare('UPDATE conversation_threads SET archived = 1, updated_at = ? WHERE id = ?')
139
+ .run(new Date().toISOString(), id);
140
+ }
141
+ /**
142
+ * Append a turn to a thread (assigns the next seq, dual-writes the FTS index,
143
+ * bumps the thread, and sets the thread title from the first question).
144
+ */
145
+ appendTurn(threadId, input) {
146
+ const now = new Date().toISOString();
147
+ const id = `trn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
148
+ const result = capTurnResult(input.result);
149
+ const dqlArtifact = capDqlArtifact(input.dqlArtifact);
150
+ const turn = {
151
+ ...input,
152
+ answerText: input.answerText?.slice(0, MAX_ANSWER_TEXT),
153
+ answerSummary: input.answerSummary?.slice(0, MAX_SUMMARY),
154
+ dqlArtifact,
155
+ result,
156
+ id,
157
+ threadId,
158
+ seq: 0,
159
+ createdAt: now,
160
+ };
161
+ const txn = this.db.transaction(() => {
162
+ const seqRow = this.db.prepare('SELECT COALESCE(MAX(seq), 0) + 1 AS next FROM conversation_turns WHERE thread_id = ?').get(threadId);
163
+ turn.seq = seqRow.next;
164
+ this.db.prepare(`
165
+ INSERT INTO conversation_turns (
166
+ id, thread_id, seq, question, answer_summary, answer_text, route,
167
+ trust_label, certification, source_certified_block, context_pack_id,
168
+ sql, dql_artifact_json, cascade_json, result_json, contract_json, created_at
169
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
170
+ `).run(turn.id, threadId, turn.seq, turn.question, turn.answerSummary ?? null, turn.answerText ?? null, turn.route ?? null, turn.trustLabel ?? null, turn.certification ?? null, turn.sourceCertifiedBlock ?? null, turn.contextPackId ?? null, turn.sql ?? null, JSON.stringify(turn.dqlArtifact ?? {}), JSON.stringify(turn.cascade ?? {}), JSON.stringify(turn.result ?? {}), JSON.stringify(turn.contract ?? {}), now);
171
+ const tags = [
172
+ turn.sourceCertifiedBlock ?? '',
173
+ turn.route ?? '',
174
+ turn.cascade?.terminalLane ?? '',
175
+ turn.cascade?.routeTier ?? '',
176
+ turn.dqlArtifact?.name ?? '',
177
+ turn.dqlArtifact?.kind ?? '',
178
+ ...(turn.dqlArtifact?.metrics ?? []),
179
+ ...(turn.dqlArtifact?.dimensions ?? []),
180
+ ...(turn.result?.columns ?? []),
181
+ ...Object.keys(turn.result?.dimensionValues ?? {}),
182
+ ].filter(Boolean).join(' ');
183
+ this.db.prepare(`
184
+ INSERT INTO conversation_turns_fts (id, thread_id, question, answer_summary, tags)
185
+ VALUES (?, ?, ?, ?, ?)
186
+ `).run(turn.id, threadId, turn.question, turn.answerSummary ?? '', tags);
187
+ this.db.prepare(`
188
+ UPDATE conversation_threads
189
+ SET updated_at = ?, title = COALESCE(title, ?)
190
+ WHERE id = ?
191
+ `).run(now, turn.question.slice(0, 120), threadId);
192
+ });
193
+ txn();
194
+ return turn;
195
+ }
196
+ recentTurns(threadId, limit = 4) {
197
+ const rows = this.db.prepare(`
198
+ SELECT * FROM conversation_turns WHERE thread_id = ? ORDER BY seq DESC LIMIT ?
199
+ `).all(threadId, limit);
200
+ return rows.map(rowToTurn).reverse();
201
+ }
202
+ /**
203
+ * Which cascade tiers have answered recently, across all threads. Powers a
204
+ * tier-distribution surface so you can see the governance ladder shift upward
205
+ * (more certified/semantic answers) as usage compounds.
206
+ */
207
+ tierDistribution(options = {}) {
208
+ const limit = options.limit ?? 500;
209
+ const rows = this.db.prepare(`
210
+ SELECT * FROM conversation_turns ORDER BY created_at DESC LIMIT ?
211
+ `).all(limit);
212
+ const byRouteTier = {};
213
+ const byTerminalLane = {};
214
+ let total = 0;
215
+ for (const turn of rows.map(rowToTurn)) {
216
+ const routeTier = turn.cascade?.routeTier;
217
+ const terminalLane = turn.cascade?.terminalLane;
218
+ if (routeTier) {
219
+ byRouteTier[routeTier] = (byRouteTier[routeTier] ?? 0) + 1;
220
+ total += 1;
221
+ }
222
+ if (terminalLane)
223
+ byTerminalLane[terminalLane] = (byTerminalLane[terminalLane] ?? 0) + 1;
224
+ }
225
+ return { total, byRouteTier, byTerminalLane };
226
+ }
227
+ /** Turns older than the compaction cursor and outside the recent window (for rolling summary). */
228
+ turnsForCompaction(threadId, afterSeq, beforeSeq) {
229
+ const rows = this.db.prepare(`
230
+ SELECT * FROM conversation_turns
231
+ WHERE thread_id = ? AND seq > ? AND seq < ?
232
+ ORDER BY seq ASC
233
+ `).all(threadId, afterSeq, beforeSeq);
234
+ return rows.map(rowToTurn);
235
+ }
236
+ updateThreadState(threadId, input) {
237
+ const sets = ['updated_at = ?'];
238
+ const params = [new Date().toISOString()];
239
+ if (input.workingState !== undefined) {
240
+ sets.push('working_state_json = ?');
241
+ params.push(JSON.stringify(input.workingState));
242
+ }
243
+ if (input.rollingSummary !== undefined) {
244
+ sets.push('rolling_summary = ?');
245
+ params.push(input.rollingSummary || null);
246
+ }
247
+ if (input.summaryTurnSeq !== undefined) {
248
+ sets.push('summary_turn_seq = ?');
249
+ params.push(input.summaryTurnSeq);
250
+ }
251
+ params.push(threadId);
252
+ this.db.prepare(`UPDATE conversation_threads SET ${sets.join(', ')} WHERE id = ?`).run(...params);
253
+ }
254
+ /** FTS keyword search over turns; hybrid embedding re-ranking layers on top (P5). */
255
+ searchTurns(options) {
256
+ const query = sanitizeFtsQuery(options.query);
257
+ if (!query)
258
+ return [];
259
+ const params = [query];
260
+ let threadFilter = '';
261
+ if (options.threadId) {
262
+ threadFilter = 'AND t.thread_id = ?';
263
+ params.push(options.threadId);
264
+ }
265
+ const rows = this.db.prepare(`
266
+ SELECT t.*, bm25(conversation_turns_fts) AS rank
267
+ FROM conversation_turns_fts AS f
268
+ JOIN conversation_turns AS t ON t.id = f.id
269
+ WHERE conversation_turns_fts MATCH ?
270
+ ${threadFilter}
271
+ ORDER BY rank
272
+ LIMIT ?
273
+ `).all(...params, options.limit ?? 6);
274
+ return rows.map(rowToTurn);
275
+ }
276
+ /** Housekeeping: hard-delete archived threads (and their turns) older than the cutoff. */
277
+ pruneThreads(olderThanDays) {
278
+ const cutoff = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000).toISOString();
279
+ let pruned = 0;
280
+ const txn = this.db.transaction(() => {
281
+ const stale = this.db.prepare('SELECT id FROM conversation_threads WHERE archived = 1 AND updated_at < ?').all(cutoff);
282
+ for (const { id } of stale) {
283
+ this.db.prepare('DELETE FROM conversation_turns_fts WHERE thread_id = ?').run(id);
284
+ this.db.prepare('DELETE FROM conversation_turns WHERE thread_id = ?').run(id);
285
+ this.db.prepare('DELETE FROM conversation_threads WHERE id = ?').run(id);
286
+ pruned += 1;
287
+ }
288
+ });
289
+ txn();
290
+ return pruned;
291
+ }
292
+ close() {
293
+ this.db.close();
294
+ }
295
+ }
296
+ function capTurnResult(result) {
297
+ if (!result)
298
+ return undefined;
299
+ const columns = result.columns?.slice(0, MAX_COLUMNS);
300
+ const rowsSample = result.rowsSample?.slice(0, MAX_SAMPLE_ROWS)
301
+ .map((row) => Array.isArray(row) ? row.slice(0, MAX_COLUMNS) : row);
302
+ const dimensionValues = result.dimensionValues
303
+ ? Object.fromEntries(Object.entries(result.dimensionValues)
304
+ .slice(0, MAX_DIMENSION_KEYS)
305
+ .map(([key, values]) => [key, values.slice(0, MAX_DIMENSION_VALUES)]))
306
+ : undefined;
307
+ return {
308
+ columns,
309
+ rowsSample,
310
+ dimensionValues,
311
+ measureColumns: result.measureColumns?.slice(0, MAX_COLUMNS),
312
+ rowCount: result.rowCount,
313
+ };
314
+ }
315
+ function capDqlArtifact(artifact) {
316
+ if (!artifact?.source?.trim())
317
+ return undefined;
318
+ return {
319
+ kind: artifact.kind,
320
+ source: artifact.source.slice(0, MAX_DQL_SOURCE),
321
+ name: artifact.name?.slice(0, 180),
322
+ sourcePath: artifact.sourcePath?.slice(0, 400),
323
+ metrics: artifact.metrics?.slice(0, MAX_COLUMNS),
324
+ dimensions: artifact.dimensions?.slice(0, MAX_COLUMNS),
325
+ filters: artifact.filters?.slice(0, MAX_DIMENSION_KEYS).map((filter) => ({
326
+ dimension: filter.dimension.slice(0, 180),
327
+ operator: filter.operator.slice(0, 80),
328
+ values: filter.values.slice(0, MAX_DIMENSION_VALUES).map((value) => value.slice(0, 240)),
329
+ })),
330
+ timeDimension: artifact.timeDimension
331
+ ? {
332
+ name: artifact.timeDimension.name.slice(0, 180),
333
+ granularity: artifact.timeDimension.granularity.slice(0, 80),
334
+ }
335
+ : undefined,
336
+ };
337
+ }
338
+ function rowToThread(row) {
339
+ return {
340
+ id: row.id,
341
+ surface: row.surface,
342
+ title: row.title ?? undefined,
343
+ notebookPath: row.notebook_path ?? undefined,
344
+ workingState: safeJSON(row.working_state_json, {}),
345
+ rollingSummary: row.rolling_summary ?? undefined,
346
+ summaryTurnSeq: row.summary_turn_seq,
347
+ archived: Boolean(row.archived),
348
+ createdAt: row.created_at,
349
+ updatedAt: row.updated_at,
350
+ };
351
+ }
352
+ function rowToTurn(row) {
353
+ const result = safeJSON(row.result_json, {});
354
+ const dqlArtifact = safeJSON(row.dql_artifact_json, {});
355
+ const cascade = safeJSON(row.cascade_json, {});
356
+ const contract = safeJSON(row.contract_json, {});
357
+ return {
358
+ id: row.id,
359
+ threadId: row.thread_id,
360
+ seq: row.seq,
361
+ question: row.question,
362
+ answerSummary: row.answer_summary ?? undefined,
363
+ answerText: row.answer_text ?? undefined,
364
+ route: row.route ?? undefined,
365
+ trustLabel: row.trust_label ?? undefined,
366
+ certification: row.certification ?? undefined,
367
+ sourceCertifiedBlock: row.source_certified_block ?? undefined,
368
+ contextPackId: row.context_pack_id ?? undefined,
369
+ sql: row.sql ?? undefined,
370
+ dqlArtifact: Object.keys(dqlArtifact).length > 0 ? capDqlArtifact(dqlArtifact) : undefined,
371
+ cascade: Object.keys(cascade).length > 0 ? cascade : undefined,
372
+ result: Object.keys(result).length > 0 ? result : undefined,
373
+ contract: Object.keys(contract).length > 0 ? contract : undefined,
374
+ createdAt: row.created_at,
375
+ };
376
+ }
377
+ function safeJSON(raw, fallback) {
378
+ if (!raw)
379
+ return fallback;
380
+ try {
381
+ return JSON.parse(raw);
382
+ }
383
+ catch {
384
+ return fallback;
385
+ }
386
+ }
387
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/conversation/session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Conversation snapshot: the bounded, structured view of a thread that every
3
+ * question carries into the answer loop — working state + rolling summary +
4
+ * a few verbatim recent turns + how the new question relates to the topic.
5
+ */
6
+ import type { ConversationStore, ConversationTurn } from './session-store.js';
7
+ import type { AgentDqlArtifactReference } from '../answer-loop.js';
8
+ import type { CascadeAnswerResult } from '../cascade/cascade.js';
9
+ import { type ConversationWorkingState, type TopicRelation } from './working-state.js';
10
+ export interface ConversationSnapshotTurn {
11
+ id: string;
12
+ question: string;
13
+ answerSummary?: string;
14
+ route?: string;
15
+ sourceCertifiedBlock?: string;
16
+ contextPackId?: string;
17
+ resultColumns?: string[];
18
+ resultRowCount?: number;
19
+ resultDimensionValues?: Record<string, string[]>;
20
+ sourceSql?: string;
21
+ dqlArtifact?: AgentDqlArtifactReference;
22
+ cascade?: CascadeAnswerResult;
23
+ }
24
+ export interface ConversationSnapshot {
25
+ threadId: string;
26
+ rollingSummary?: string;
27
+ workingState?: ConversationWorkingState;
28
+ recentTurns: ConversationSnapshotTurn[];
29
+ /** Semantic-recall hits over older turns (P5). */
30
+ recalledTurns?: ConversationSnapshotTurn[];
31
+ /** How the NEW question relates to the ongoing topic (when a question is supplied). */
32
+ topicRelation?: TopicRelation;
33
+ }
34
+ /**
35
+ * Build the snapshot for a new question. When the question starts a genuinely
36
+ * new topic (shift), the carried filters are deterministically cleared in the
37
+ * snapshot — stale-context protection that doesn't rely on the model.
38
+ */
39
+ export declare function buildConversationSnapshot(store: ConversationStore, threadId: string, options?: {
40
+ question?: string;
41
+ recent?: number;
42
+ }): ConversationSnapshot | null;
43
+ /**
44
+ * Post-run maintenance: fold the appended turn into the thread's working state
45
+ * and compact turns that just left the recent window into the rolling summary.
46
+ * Incremental and idempotent (cursor = summaryTurnSeq); never throws.
47
+ */
48
+ export declare function advanceThreadState(store: ConversationStore, threadId: string, turn: ConversationTurn): void;
49
+ /**
50
+ * Semantic recall over the thread's OLDER turns ("what did we discuss about X?").
51
+ * FTS candidates re-ranked with the deterministic hash-embedding blend
52
+ * (alpha 0.4 — FTS still dominates). Turns already in the recent verbatim
53
+ * window are excluded; returns at most `limit` hits. Never throws.
54
+ */
55
+ export declare function recallRelevantTurns(store: ConversationStore, threadId: string, question: string, options?: {
56
+ limit?: number;
57
+ excludeTurnIds?: string[];
58
+ }): Promise<ConversationSnapshotTurn[]>;
59
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/conversation/snapshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAO5B,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,kDAAkD;IAClD,aAAa,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC3C,uFAAuF;IACvF,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,oBAAoB,GAAG,IAAI,CAmB7B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAuB3G;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC1D,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAoBrC"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Conversation snapshot: the bounded, structured view of a thread that every
3
+ * question carries into the answer loop — working state + rolling summary +
4
+ * a few verbatim recent turns + how the new question relates to the topic.
5
+ */
6
+ import { parseWorkingState, reduceWorkingState, } from './working-state.js';
7
+ import { updateRollingSummary } from './rolling-summary.js';
8
+ import { buildAnalysisQuestionPlan } from '../metadata/analysis-planner.js';
9
+ import { hybridRank } from '../embeddings/provider.js';
10
+ const RECENT_TURNS = 4;
11
+ /**
12
+ * Build the snapshot for a new question. When the question starts a genuinely
13
+ * new topic (shift), the carried filters are deterministically cleared in the
14
+ * snapshot — stale-context protection that doesn't rely on the model.
15
+ */
16
+ export function buildConversationSnapshot(store, threadId, options = {}) {
17
+ const thread = store.getThread(threadId);
18
+ if (!thread)
19
+ return null;
20
+ const recent = store.recentTurns(threadId, options.recent ?? RECENT_TURNS);
21
+ let workingState = parseWorkingState(thread.workingState);
22
+ let topicRelation;
23
+ if (options.question && workingState.topicKey) {
24
+ topicRelation = classifyQuestionRelation(workingState, options.question);
25
+ if (topicRelation === 'shift') {
26
+ workingState = { ...workingState, filters: [] };
27
+ }
28
+ }
29
+ return {
30
+ threadId,
31
+ rollingSummary: thread.rollingSummary,
32
+ workingState: hasWorkingState(workingState) ? workingState : undefined,
33
+ recentTurns: recent.map(snapshotTurn),
34
+ topicRelation,
35
+ };
36
+ }
37
+ /**
38
+ * Post-run maintenance: fold the appended turn into the thread's working state
39
+ * and compact turns that just left the recent window into the rolling summary.
40
+ * Incremental and idempotent (cursor = summaryTurnSeq); never throws.
41
+ */
42
+ export function advanceThreadState(store, threadId, turn) {
43
+ try {
44
+ const thread = store.getThread(threadId);
45
+ if (!thread)
46
+ return;
47
+ const { state } = reduceWorkingState(parseWorkingState(thread.workingState), turn);
48
+ // Compact everything older than the recent verbatim window.
49
+ const compactBefore = Math.max(turn.seq - RECENT_TURNS + 1, 1);
50
+ const compactable = thread.summaryTurnSeq < compactBefore - 1
51
+ ? store.turnsForCompaction(threadId, thread.summaryTurnSeq, compactBefore)
52
+ : [];
53
+ const rollingSummary = compactable.length > 0
54
+ ? updateRollingSummary({ previousSummary: thread.rollingSummary, compactedTurns: compactable })
55
+ : thread.rollingSummary;
56
+ store.updateThreadState(threadId, {
57
+ workingState: state,
58
+ rollingSummary,
59
+ summaryTurnSeq: compactable.length > 0
60
+ ? compactable[compactable.length - 1].seq
61
+ : thread.summaryTurnSeq,
62
+ });
63
+ }
64
+ catch {
65
+ // Advisory maintenance — never fail the run for it.
66
+ }
67
+ }
68
+ /**
69
+ * Semantic recall over the thread's OLDER turns ("what did we discuss about X?").
70
+ * FTS candidates re-ranked with the deterministic hash-embedding blend
71
+ * (alpha 0.4 — FTS still dominates). Turns already in the recent verbatim
72
+ * window are excluded; returns at most `limit` hits. Never throws.
73
+ */
74
+ export async function recallRelevantTurns(store, threadId, question, options = {}) {
75
+ try {
76
+ const excluded = new Set(options.excludeTurnIds ?? []);
77
+ const candidates = store.searchTurns({ query: question, threadId, limit: 24 })
78
+ .filter((turn) => !excluded.has(turn.id));
79
+ if (candidates.length === 0)
80
+ return [];
81
+ const ranked = await hybridRank(question, candidates.map((turn, index) => ({
82
+ item: turn,
83
+ // FTS returns rank-ordered rows; convert position to a [0,1] score.
84
+ ftsScore: 1 - index / candidates.length,
85
+ text: `${turn.question} ${turn.answerSummary ?? ''}`,
86
+ })), { alpha: 0.4 });
87
+ return ranked.slice(0, options.limit ?? 3).map((entry) => snapshotTurn(entry.item));
88
+ }
89
+ catch {
90
+ return [];
91
+ }
92
+ }
93
+ /** Classify the NEW question against the current topic key (same Jaccard rule as the reducer). */
94
+ function classifyQuestionRelation(state, question) {
95
+ const plan = buildAnalysisQuestionPlan(question);
96
+ const terms = new Set([
97
+ ...plan.entities.map((entity) => normalizeTerm(entity.text)),
98
+ ...plan.metricTerms.map(normalizeTerm),
99
+ ].filter(Boolean));
100
+ const topicTerms = new Set((state.topicKey ?? '').split('|').filter(Boolean));
101
+ if (terms.size === 0)
102
+ return 'continuation';
103
+ if (topicTerms.size === 0)
104
+ return 'continuation';
105
+ let shared = 0;
106
+ for (const term of terms)
107
+ if (topicTerms.has(term))
108
+ shared += 1;
109
+ const overlap = shared / (terms.size + topicTerms.size - shared);
110
+ if (overlap >= 0.5)
111
+ return 'continuation';
112
+ if (overlap > 0)
113
+ return 'refinement';
114
+ const returned = (state.priorTopics ?? []).some((frame) => {
115
+ const frameTerms = new Set(frame.topicKey.split('|').filter(Boolean));
116
+ let hit = 0;
117
+ for (const term of terms)
118
+ if (frameTerms.has(term))
119
+ hit += 1;
120
+ return frameTerms.size > 0 && hit / (terms.size + frameTerms.size - hit) >= 0.5;
121
+ });
122
+ if (returned)
123
+ return 'return';
124
+ const onlyRefinement = plan.dimensionTerms.length === 0 && plan.metricTerms.length === 0 && plan.entities.length === 0;
125
+ return onlyRefinement ? 'refinement' : 'shift';
126
+ }
127
+ function snapshotTurn(turn) {
128
+ return {
129
+ id: turn.id,
130
+ question: turn.question,
131
+ answerSummary: turn.answerSummary,
132
+ route: turn.route,
133
+ sourceCertifiedBlock: turn.sourceCertifiedBlock,
134
+ contextPackId: turn.contextPackId,
135
+ resultColumns: turn.result?.columns,
136
+ resultRowCount: turn.result?.rowCount,
137
+ resultDimensionValues: turn.result?.dimensionValues,
138
+ sourceSql: turn.sql,
139
+ dqlArtifact: turn.dqlArtifact,
140
+ cascade: turn.cascade,
141
+ };
142
+ }
143
+ function hasWorkingState(state) {
144
+ return state.entities.length > 0
145
+ || state.measures.length > 0
146
+ || state.dimensions.length > 0
147
+ || state.filters.length > 0
148
+ || Boolean(state.topicKey);
149
+ }
150
+ function normalizeTerm(value) {
151
+ return value.toLowerCase().replace(/[^a-z0-9_ ]+/g, '').replace(/s$/, '').trim();
152
+ }
153
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/conversation/snapshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,YAAY,GAAG,CAAC,CAAC;AA4BvB;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAwB,EACxB,QAAgB,EAChB,UAAkD,EAAE;IAEpD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC;IAC3E,IAAI,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,aAAwC,CAAC;IAC7C,IAAI,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC9C,aAAa,GAAG,wBAAwB,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;YAC9B,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO;QACL,QAAQ;QACR,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QACtE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QACrC,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB,EAAE,QAAgB,EAAE,IAAsB;IACnG,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;QACnF,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,GAAG,aAAa,GAAG,CAAC;YAC3D,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC;YAC1E,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;YAC3C,CAAC,CAAC,oBAAoB,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;YAC/F,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;QAC1B,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE;YAChC,YAAY,EAAE,KAA2C;YACzD,cAAc;YACd,cAAc,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;gBACzC,CAAC,CAAC,MAAM,CAAC,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAwB,EACxB,QAAgB,EAChB,QAAgB,EAChB,UAAyD,EAAE;IAE3D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;aAC3E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,QAAQ,EACR,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,IAAI;YACV,oEAAoE;YACpE,QAAQ,EAAE,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM;YACvC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE;SACrD,CAAC,CAAC,EACH,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;QACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,wBAAwB,CAAC,KAA+B,EAAE,QAAgB;IACjF,MAAM,IAAI,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;QACpB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5D,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;KACvC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACnB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAC5C,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IACjD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;IACjE,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,IAAI,CAAC,CAAC;QAC7D,OAAO,UAAU,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACvH,OAAO,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB;IAC1C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;QACnC,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ;QACrC,qBAAqB,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe;QACnD,SAAS,EAAE,IAAI,CAAC,GAAG;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAA+B;IACtD,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;WAC3B,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;WACzB,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;WAC3B,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;WACxB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACnF,CAAC"}