@duckcodeailabs/dql-agent 1.9.5 → 1.10.0

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 (61) hide show
  1. package/dist/agent-run-engine.d.ts +13 -0
  2. package/dist/agent-run-engine.d.ts.map +1 -1
  3. package/dist/agent-run-engine.js +59 -1
  4. package/dist/agent-run-engine.js.map +1 -1
  5. package/dist/answer-loop.d.ts +34 -1
  6. package/dist/answer-loop.d.ts.map +1 -1
  7. package/dist/answer-loop.js +295 -35
  8. package/dist/answer-loop.js.map +1 -1
  9. package/dist/embeddings/provider.d.ts +1 -1
  10. package/dist/embeddings/provider.d.ts.map +1 -1
  11. package/dist/embeddings/provider.js.map +1 -1
  12. package/dist/governed-relational-compiler.d.ts +138 -0
  13. package/dist/governed-relational-compiler.d.ts.map +1 -0
  14. package/dist/governed-relational-compiler.js +315 -0
  15. package/dist/governed-relational-compiler.js.map +1 -0
  16. package/dist/index.d.ts +13 -5
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +8 -4
  19. package/dist/index.js.map +1 -1
  20. package/dist/intent-controller.d.ts +5 -0
  21. package/dist/intent-controller.d.ts.map +1 -1
  22. package/dist/intent-controller.js.map +1 -1
  23. package/dist/kg/build.d.ts.map +1 -1
  24. package/dist/kg/build.js +81 -1
  25. package/dist/kg/build.js.map +1 -1
  26. package/dist/meaning-resolution.d.ts +4 -0
  27. package/dist/meaning-resolution.d.ts.map +1 -1
  28. package/dist/meaning-resolution.js +14 -4
  29. package/dist/meaning-resolution.js.map +1 -1
  30. package/dist/metadata/analysis-planner.d.ts.map +1 -1
  31. package/dist/metadata/analysis-planner.js +34 -6
  32. package/dist/metadata/analysis-planner.js.map +1 -1
  33. package/dist/metadata/catalog.d.ts +83 -2
  34. package/dist/metadata/catalog.d.ts.map +1 -1
  35. package/dist/metadata/catalog.js +381 -28
  36. package/dist/metadata/catalog.js.map +1 -1
  37. package/dist/metadata/meaning-evidence.d.ts +10 -1
  38. package/dist/metadata/meaning-evidence.d.ts.map +1 -1
  39. package/dist/metadata/meaning-evidence.js +78 -1
  40. package/dist/metadata/meaning-evidence.js.map +1 -1
  41. package/dist/plan-execution-adapter.d.ts +60 -0
  42. package/dist/plan-execution-adapter.d.ts.map +1 -0
  43. package/dist/plan-execution-adapter.js +239 -0
  44. package/dist/plan-execution-adapter.js.map +1 -0
  45. package/dist/research-governance.d.ts +56 -0
  46. package/dist/research-governance.d.ts.map +1 -0
  47. package/dist/research-governance.js +68 -0
  48. package/dist/research-governance.js.map +1 -0
  49. package/dist/research-loop.d.ts +14 -0
  50. package/dist/research-loop.d.ts.map +1 -1
  51. package/dist/research-loop.js +77 -23
  52. package/dist/research-loop.js.map +1 -1
  53. package/dist/resolved-analytical-plan.d.ts +112 -0
  54. package/dist/resolved-analytical-plan.d.ts.map +1 -0
  55. package/dist/resolved-analytical-plan.js +346 -0
  56. package/dist/resolved-analytical-plan.js.map +1 -0
  57. package/dist/router.d.ts +3 -0
  58. package/dist/router.d.ts.map +1 -1
  59. package/dist/router.js +34 -10
  60. package/dist/router.js.map +1 -1
  61. package/package.json +4 -4
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Immutable, snapshot-bound analytical plan shared by every downstream route.
3
+ * The router emits it authoritatively by default. Shadow mode remains the
4
+ * bounded route-level rollback switch while integration verification closes.
5
+ *
6
+ * Acceptance: AGT-013, API-006.
7
+ */
8
+ import { createHash } from 'node:crypto';
9
+ export function buildResolvedAnalyticalPlan(input) {
10
+ const byLegacyId = new Map(input.candidates.map((candidate) => [candidate.id, candidate]));
11
+ const selectedCandidates = input.resolution.selectedConceptIds
12
+ .flatMap((id) => byLegacyId.get(id) ? [byLegacyId.get(id)] : []);
13
+ const executionCandidate = input.resolution.recommendedExecutionId
14
+ ? byLegacyId.get(input.resolution.recommendedExecutionId)
15
+ : selectedCandidates[0];
16
+ const bindingCandidates = resolutionUsesRelationalEvidence(input.resolution)
17
+ ? input.candidates
18
+ : selectedCandidates.length > 0
19
+ ? selectedCandidates
20
+ : executionCandidate
21
+ ? [executionCandidate]
22
+ : input.candidates;
23
+ const canonicalId = (candidate) => candidate.qualifiedId ?? candidate.id;
24
+ const selectedConceptIds = selectedCandidates.map(canonicalId);
25
+ const executionId = executionCandidate ? canonicalId(executionCandidate) : undefined;
26
+ const measures = input.resolution.queryIntent.measures.length > 0
27
+ ? input.resolution.queryIntent.measures.map((requested) => bindRequestedMember(requested, bindingCandidates, 'measure'))
28
+ : selectedCandidates
29
+ .filter((candidate) => candidate.kind === 'semantic_metric')
30
+ .map((candidate) => ({
31
+ requested: candidate.name,
32
+ qualifiedId: canonicalId(candidate),
33
+ status: 'resolved',
34
+ candidateIds: [canonicalId(candidate)],
35
+ }));
36
+ const dimensions = input.resolution.queryIntent.dimensions
37
+ .map((requested) => bindRequestedMember(requested, bindingCandidates, 'dimension'));
38
+ const filters = input.resolution.queryIntent.filters.map((filter) => ({
39
+ ...filter,
40
+ binding: bindRequestedMember(filter.field, bindingCandidates, 'dimension'),
41
+ }));
42
+ const compatibilityProof = selectedCandidates.map((candidate) => ({
43
+ candidateId: canonicalId(candidate),
44
+ compatibility: candidate.compatibility,
45
+ facts: [...(candidate.compatibilityFacts ?? [])].sort(),
46
+ }));
47
+ const capability = resolveCapability(input.resolution, executionCandidate, measures, dimensions, filters);
48
+ const timeBounds = input.resolution.queryIntent.timeRange
49
+ ? resolvePlanTimeRange(input.resolution.queryIntent.timeRange, input.referenceTime ?? new Date())
50
+ : undefined;
51
+ const payload = {
52
+ schemaVersion: 1,
53
+ mode: input.mode ?? 'shadow',
54
+ revision: 0,
55
+ snapshotId: input.evidence.knowledgeLens?.snapshotId
56
+ ?? input.evidence.snapshotId
57
+ ?? input.evidence.sourceFingerprint
58
+ ?? 'snapshot-unavailable',
59
+ sourceFingerprint: input.evidence.sourceFingerprint,
60
+ question: input.question,
61
+ interpretedQuestion: input.resolution.interpretedQuestion,
62
+ questionType: input.resolution.questionType,
63
+ confidence: input.resolution.confidence,
64
+ selectedConceptIds,
65
+ executionId,
66
+ recommendedRoute: input.resolution.recommendedRoute,
67
+ capability,
68
+ query: {
69
+ measures,
70
+ dimensions,
71
+ filters,
72
+ ...(input.resolution.queryIntent.timeRange ? { timeRange: input.resolution.queryIntent.timeRange } : {}),
73
+ ...(timeBounds ? { timeBounds } : {}),
74
+ ...(input.resolution.queryIntent.timeGrain ? { timeGrain: input.resolution.queryIntent.timeGrain } : {}),
75
+ ...(input.resolution.queryIntent.order ? { order: input.resolution.queryIntent.order } : {}),
76
+ ...(input.resolution.queryIntent.limit !== undefined ? { limit: input.resolution.queryIntent.limit } : {}),
77
+ },
78
+ entityGrain: executionCandidate?.primaryEntity,
79
+ sourceRelationIds: uniqueSorted(selectedCandidates.flatMap((candidate) => candidate.sourceObjects ?? [])),
80
+ relationshipPathIds: uniqueSorted(selectedCandidates.flatMap((candidate) => candidate.relationshipEvidence ?? [])),
81
+ compatibilityProof,
82
+ outputContract: {
83
+ measures: uniqueSorted(measures.flatMap((binding) => binding.qualifiedId ? [binding.qualifiedId] : [binding.requested])),
84
+ dimensions: uniqueSorted(dimensions.flatMap((binding) => binding.qualifiedId ? [binding.qualifiedId] : [binding.requested])),
85
+ ...(input.resolution.queryIntent.timeGrain ? { timeGrain: input.resolution.queryIntent.timeGrain } : {}),
86
+ },
87
+ evidenceIds: uniqueSorted(input.candidates.map(canonicalId)),
88
+ rejectedCandidates: input.resolution.rejectedCandidates.map((candidate) => {
89
+ const retrieved = byLegacyId.get(candidate.id);
90
+ return { id: retrieved ? canonicalId(retrieved) : candidate.id, reason: candidate.reason };
91
+ }),
92
+ missingInformation: [...input.resolution.missingInformation],
93
+ clarification: input.resolution.clarifyingQuestion,
94
+ knowledgeLens: input.evidence.knowledgeLens,
95
+ };
96
+ const fingerprint = sha256(stableStringify(payload));
97
+ return deepFreeze({
98
+ ...payload,
99
+ planId: `rap:${fingerprint.slice(0, 24)}`,
100
+ fingerprint,
101
+ });
102
+ }
103
+ /**
104
+ * Apply an explicitly typed follow-up delta. No prose, prior SQL, or answer text
105
+ * is inspected; every carried member remains a qualified binding from the root.
106
+ * Acceptance: CTX-003, AGT-013, AGT-016.
107
+ */
108
+ export function deriveResolvedAnalyticalPlan(parent, delta) {
109
+ const dimensions = delta.dimensions ? delta.dimensions.map(cloneBinding) : parent.query.dimensions.map(cloneBinding);
110
+ const measures = delta.measures ? delta.measures.map(cloneBinding) : parent.query.measures.map(cloneBinding);
111
+ const filters = delta.filters
112
+ ? delta.filters.map(cloneFilter)
113
+ : parent.query.filters.map(cloneFilter);
114
+ if (delta.selectedResultFilter) {
115
+ filters.push({
116
+ field: delta.selectedResultFilter.binding.requested,
117
+ value: delta.selectedResultFilter.value,
118
+ binding: cloneBinding(delta.selectedResultFilter.binding),
119
+ });
120
+ }
121
+ const timeRange = delta.timeRange !== undefined ? delta.timeRange : parent.query.timeRange;
122
+ // An inherited relative range is already bound to the root plan's captured
123
+ // clock. Re-resolving "last month" during a later turn would silently change
124
+ // the analytical contract, so only an explicit time delta gets a new clock.
125
+ const timeBounds = delta.timeRange !== undefined
126
+ ? (timeRange ? resolvePlanTimeRange(timeRange, delta.referenceTime ?? new Date()) : undefined)
127
+ : parent.query.timeBounds;
128
+ const unresolved = [...measures, ...dimensions, ...filters.map((filter) => filter.binding)]
129
+ .filter((binding) => binding.status !== 'resolved');
130
+ const payload = {
131
+ ...parent,
132
+ parentPlanId: parent.planId,
133
+ rootPlanId: parent.rootPlanId ?? parent.planId,
134
+ revision: parent.revision + 1,
135
+ question: delta.question,
136
+ interpretedQuestion: delta.question,
137
+ capability: unresolved.length > 0 ? 'blocked' : parent.capability,
138
+ query: {
139
+ measures,
140
+ dimensions,
141
+ filters,
142
+ ...(timeRange ? { timeRange } : {}),
143
+ ...(timeBounds ? { timeBounds } : {}),
144
+ ...((delta.timeGrain ?? parent.query.timeGrain) ? { timeGrain: delta.timeGrain ?? parent.query.timeGrain } : {}),
145
+ ...((delta.order ?? parent.query.order) ? { order: delta.order ?? parent.query.order } : {}),
146
+ ...(delta.limit !== undefined || parent.query.limit !== undefined ? { limit: delta.limit ?? parent.query.limit } : {}),
147
+ },
148
+ outputContract: {
149
+ measures: uniqueSorted(measures.flatMap((binding) => binding.qualifiedId ? [binding.qualifiedId] : [binding.requested])),
150
+ dimensions: uniqueSorted(dimensions.flatMap((binding) => binding.qualifiedId ? [binding.qualifiedId] : [binding.requested])),
151
+ ...((delta.timeGrain ?? parent.query.timeGrain) ? { timeGrain: delta.timeGrain ?? parent.query.timeGrain } : {}),
152
+ },
153
+ missingInformation: unresolved.length > 0
154
+ ? uniqueSorted([...parent.missingInformation, ...unresolved.map((binding) => `${binding.requested} is ${binding.status}.`)])
155
+ : [...parent.missingInformation],
156
+ };
157
+ const { planId: _oldPlanId, fingerprint: _oldFingerprint, ...fingerprintPayload } = payload;
158
+ const fingerprint = sha256(stableStringify(fingerprintPayload));
159
+ return deepFreeze({
160
+ ...fingerprintPayload,
161
+ planId: `rap:${fingerprint.slice(0, 24)}`,
162
+ fingerprint,
163
+ });
164
+ }
165
+ function cloneBinding(binding) {
166
+ return { ...binding, candidateIds: [...binding.candidateIds] };
167
+ }
168
+ function cloneFilter(filter) {
169
+ return { ...filter, binding: cloneBinding(filter.binding) };
170
+ }
171
+ function bindRequestedMember(requested, candidates, kind) {
172
+ const normalized = normalize(requested);
173
+ const directCandidates = candidates.filter((candidate) => {
174
+ const kindMatches = kind === 'measure'
175
+ ? candidate.kind === 'semantic_metric' || candidate.kind === 'sql_column'
176
+ : candidate.kind === 'semantic_member' || candidate.kind === 'sql_column';
177
+ return kindMatches
178
+ && candidateTerms(candidate).some((term) => memberTermMatches(term, normalized));
179
+ });
180
+ const ids = uniqueSorted([
181
+ ...directCandidates.map((candidate) => candidate.qualifiedId ?? candidate.id),
182
+ ...(kind === 'dimension' ? candidates.flatMap((candidate) => (candidate.dimensions ?? []).filter((dimension) => {
183
+ const value = normalize(dimension);
184
+ return value === normalized || value.endsWith(` ${normalized}`);
185
+ }).map((dimension) => qualifyDeclaredDimension(candidate, dimension))) : []),
186
+ ]);
187
+ if (ids.length === 0 && kind === 'measure' && candidates.length === 1) {
188
+ const certified = candidates[0];
189
+ if (certified.kind === 'certified_block' && certified.compatibility === 'compatible') {
190
+ const id = certified.qualifiedId ?? certified.id;
191
+ return {
192
+ requested,
193
+ qualifiedId: id,
194
+ status: 'resolved',
195
+ candidateIds: [id],
196
+ };
197
+ }
198
+ }
199
+ const direct = ids.length === 1
200
+ ? directCandidates.find((candidate) => (candidate.qualifiedId ?? candidate.id) === ids[0])
201
+ : undefined;
202
+ return {
203
+ requested,
204
+ ...(ids.length === 1 ? { qualifiedId: ids[0] } : {}),
205
+ ...(direct?.aggregation ? { aggregation: direct.aggregation } : {}),
206
+ status: ids.length === 1 ? 'resolved' : ids.length > 1 ? 'ambiguous' : 'unresolved',
207
+ candidateIds: ids,
208
+ };
209
+ }
210
+ function qualifyDeclaredDimension(candidate, dimension) {
211
+ if (/[:./]/.test(dimension) || !candidate.domain)
212
+ return dimension;
213
+ const domain = candidate.domain.toLowerCase().replace(/[^a-z0-9_-]+/g, '_');
214
+ const local = dimension.toLowerCase().replace(/[^a-z0-9_-]+/g, '_');
215
+ return `semantic:${domain}:dimension:${local}`;
216
+ }
217
+ function resolutionUsesRelationalEvidence(resolution) {
218
+ return resolution.recommendedRoute === 'governed_sql' || resolution.recommendedRoute === 'exploratory';
219
+ }
220
+ function memberTermMatches(candidateTerm, requested) {
221
+ if (candidateTerm === requested || candidateTerm.endsWith(` ${requested}`))
222
+ return true;
223
+ if (!requested)
224
+ return false;
225
+ return ` ${candidateTerm} `.includes(` ${requested} `);
226
+ }
227
+ function candidateTerms(candidate) {
228
+ return [candidate.name, ...(candidate.aliases ?? []), candidate.qualifiedId ?? '', candidate.id]
229
+ .map(normalize)
230
+ .filter(Boolean);
231
+ }
232
+ function resolveCapability(resolution, execution, measures, dimensions, filters) {
233
+ if (resolution.confidence === 'low' || resolution.recommendedRoute === 'clarify' || !execution)
234
+ return 'blocked';
235
+ if (((measures.some((binding) => binding.status !== 'resolved') && resolution.queryIntent.measures.length > 0)
236
+ || (dimensions.some((binding) => binding.status !== 'resolved') && resolution.queryIntent.dimensions.length > 0))
237
+ && (resolution.recommendedRoute === 'certified' || resolution.recommendedRoute === 'semantic'))
238
+ return 'blocked';
239
+ if (filters.some((filter) => filter.binding.status !== 'resolved')
240
+ && (resolution.recommendedRoute === 'certified' || resolution.recommendedRoute === 'semantic'))
241
+ return 'blocked';
242
+ if (execution.compatibility === 'incompatible')
243
+ return 'blocked';
244
+ if (resolution.recommendedRoute === 'certified' && execution.kind === 'certified_block' && execution.compatibility === 'compatible') {
245
+ return 'certified_execution';
246
+ }
247
+ if (resolution.recommendedRoute === 'semantic'
248
+ && (execution.kind === 'semantic_metric' || execution.kind === 'semantic_member')
249
+ && execution.compatibility === 'compatible')
250
+ return 'semantic_execution';
251
+ if (resolution.recommendedRoute === 'governed_sql')
252
+ return 'governed_relational';
253
+ if (resolution.recommendedRoute === 'exploratory')
254
+ return 'bounded_exploration';
255
+ return 'blocked';
256
+ }
257
+ function normalize(value) {
258
+ return value.toLowerCase().replace(/[_./:-]+/g, ' ').replace(/[^a-z0-9 ]+/g, ' ').replace(/\s+/g, ' ').trim();
259
+ }
260
+ /** Resolve common analytical ranges once so no executor reinterprets "last month". */
261
+ export function resolvePlanTimeRange(expression, referenceTime) {
262
+ const text = expression.trim().toLowerCase();
263
+ const reference = new Date(Date.UTC(referenceTime.getUTCFullYear(), referenceTime.getUTCMonth(), referenceTime.getUTCDate()));
264
+ const explicit = /^(\d{4}-\d{2}-\d{2})\s+(?:to|through)\s+(\d{4}-\d{2}-\d{2})$/.exec(text);
265
+ if (explicit) {
266
+ const start = new Date(`${explicit[1]}T00:00:00.000Z`);
267
+ const inclusiveEnd = new Date(`${explicit[2]}T00:00:00.000Z`);
268
+ if (!Number.isNaN(start.valueOf()) && !Number.isNaN(inclusiveEnd.valueOf()) && start <= inclusiveEnd) {
269
+ inclusiveEnd.setUTCDate(inclusiveEnd.getUTCDate() + 1);
270
+ return temporalBounds(expression, start, inclusiveEnd);
271
+ }
272
+ }
273
+ const match = /^(?:the\s+)?(last|this)\s+(?:(\d+)\s+)?(day|week|month|quarter|year)s?$/.exec(text);
274
+ if (!match)
275
+ return undefined;
276
+ const mode = match[1];
277
+ const count = Math.max(1, Number(match[2] ?? 1));
278
+ const unit = match[3];
279
+ if (mode === 'this') {
280
+ const start = startOfUnit(reference, unit);
281
+ return temporalBounds(expression, start, addUnits(start, unit, count));
282
+ }
283
+ if (match[2])
284
+ return temporalBounds(expression, addUnits(reference, unit, -count), reference);
285
+ const end = startOfUnit(reference, unit);
286
+ return temporalBounds(expression, addUnits(end, unit, -1), end);
287
+ }
288
+ function temporalBounds(expression, start, end) {
289
+ return {
290
+ expression,
291
+ startInclusive: start.toISOString(),
292
+ endExclusive: end.toISOString(),
293
+ timeZone: 'UTC',
294
+ };
295
+ }
296
+ function startOfUnit(value, unit) {
297
+ const out = new Date(value);
298
+ if (unit === 'year')
299
+ out.setUTCMonth(0, 1);
300
+ else if (unit === 'quarter')
301
+ out.setUTCMonth(Math.floor(out.getUTCMonth() / 3) * 3, 1);
302
+ else if (unit === 'month')
303
+ out.setUTCDate(1);
304
+ else if (unit === 'week')
305
+ out.setUTCDate(out.getUTCDate() - ((out.getUTCDay() + 6) % 7));
306
+ return out;
307
+ }
308
+ function addUnits(value, unit, count) {
309
+ const out = new Date(value);
310
+ if (unit === 'year')
311
+ out.setUTCFullYear(out.getUTCFullYear() + count);
312
+ else if (unit === 'quarter')
313
+ out.setUTCMonth(out.getUTCMonth() + count * 3);
314
+ else if (unit === 'month')
315
+ out.setUTCMonth(out.getUTCMonth() + count);
316
+ else if (unit === 'week')
317
+ out.setUTCDate(out.getUTCDate() + count * 7);
318
+ else
319
+ out.setUTCDate(out.getUTCDate() + count);
320
+ return out;
321
+ }
322
+ function uniqueSorted(values) {
323
+ return [...new Set(values.filter(Boolean))].sort();
324
+ }
325
+ function sha256(value) {
326
+ return createHash('sha256').update(value).digest('hex');
327
+ }
328
+ function stableStringify(value) {
329
+ if (value === undefined || value === null)
330
+ return 'null';
331
+ if (typeof value !== 'object')
332
+ return JSON.stringify(value);
333
+ if (Array.isArray(value))
334
+ return `[${value.map(stableStringify).join(',')}]`;
335
+ const record = value;
336
+ return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(',')}}`;
337
+ }
338
+ function deepFreeze(value) {
339
+ if (!value || typeof value !== 'object' || Object.isFrozen(value))
340
+ return value;
341
+ Object.freeze(value);
342
+ for (const nested of Object.values(value))
343
+ deepFreeze(nested);
344
+ return value;
345
+ }
346
+ //# sourceMappingURL=resolved-analytical-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolved-analytical-plan.js","sourceRoot":"","sources":["../src/resolved-analytical-plan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA+GzC,MAAM,UAAU,2BAA2B,CACzC,KAAuC;IAEvC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC,kBAAkB;SAC3D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC,sBAAsB;QAChE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC;QACzD,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,iBAAiB,GAAG,gCAAgC,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1E,CAAC,CAAC,KAAK,CAAC,UAAU;QAClB,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,kBAAkB;gBAClB,CAAC,CAAC,CAAC,kBAAkB,CAAC;gBACtB,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;IACzB,MAAM,WAAW,GAAG,CAAC,SAAiC,EAAU,EAAE,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;IACzG,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC/D,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QACxH,CAAC,CAAC,kBAAkB;aACjB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,iBAAiB,CAAC;aAC3D,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACnB,SAAS,EAAE,SAAS,CAAC,IAAI;YACzB,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC;YACnC,MAAM,EAAE,UAAmB;YAC3B,YAAY,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;SACvC,CAAC,CAAC,CAAC;IACR,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU;SACvD,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpE,GAAG,MAAM;QACT,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,CAAC;KAC3E,CAAC,CAAC,CAAC;IACJ,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChE,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC;QACnC,aAAa,EAAE,SAAS,CAAC,aAAa;QACtC,KAAK,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;KACxD,CAAC,CAAC,CAAC;IACJ,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1G,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS;QACvD,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI,IAAI,EAAE,CAAC;QACjG,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,CAAU;QACzB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAiB;QACrC,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU;eAC/C,KAAK,CAAC,QAAQ,CAAC,UAAU;eACzB,KAAK,CAAC,QAAQ,CAAC,iBAAiB;eAChC,sBAAsB;QAC3B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,iBAAiB;QACnD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,mBAAmB,EAAE,KAAK,CAAC,UAAU,CAAC,mBAAmB;QACzD,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY;QAC3C,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU;QACvC,kBAAkB;QAClB,WAAW;QACX,gBAAgB,EAAE,KAAK,CAAC,UAAU,CAAC,gBAAgB;QACnD,UAAU;QACV,KAAK,EAAE;YACL,QAAQ;YACR,UAAU;YACV,OAAO;YACP,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3G;QACD,WAAW,EAAE,kBAAkB,EAAE,aAAa;QAC9C,iBAAiB,EAAE,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QACzG,mBAAmB,EAAE,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QAClH,kBAAkB;QAClB,cAAc,EAAE;YACd,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACxH,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5H,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzG;QACD,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5D,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACxE,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QAC7F,CAAC,CAAC;QACF,kBAAkB,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAC5D,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,kBAAkB;QAClD,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,aAAa;KAC5C,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC;QAChB,GAAG,OAAO;QACV,MAAM,EAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QACzC,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAA8B,EAC9B,KAAkC;IAElC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACrH,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7G,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;QAC3B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAChC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC;YACX,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,SAAS;YACnD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,KAAK;YACvC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3F,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS;QAC9C,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IAC5B,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SACxF,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG;QACd,GAAG,MAAM;QACT,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM;QAC9C,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,CAAC;QAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,mBAAmB,EAAE,KAAK,CAAC,QAAQ;QACnC,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU;QAC1E,KAAK,EAAE;YACL,QAAQ;YACR,UAAU;YACV,OAAO;YACP,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChH,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvH;QACD,cAAc,EAAE;YACd,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACxH,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5H,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjH;QACD,kBAAkB,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,kBAAkB,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5H,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC;KACnC,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAC5F,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChE,OAAO,UAAU,CAAC;QAChB,GAAG,kBAAkB;QACrB,MAAM,EAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QACzC,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,OAAkC;IACtD,OAAO,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,MAA0D;IAC7E,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,UAAoC,EACpC,IAA6B;IAE7B,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;QACvD,MAAM,WAAW,GAAG,IAAI,KAAK,SAAS;YACpC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,iBAAiB,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY;YACzE,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,iBAAiB,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,CAAC;QAC5E,OAAO,WAAW;eACb,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,YAAY,CAAC;QACvB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAC1D,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;YACnC,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/E,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QACjC,IAAI,SAAS,CAAC,IAAI,KAAK,iBAAiB,IAAI,SAAS,CAAC,aAAa,KAAK,YAAY,EAAE,CAAC;YACrF,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO;gBACL,SAAS;gBACT,WAAW,EAAE,EAAE;gBACf,MAAM,EAAE,UAAU;gBAClB,YAAY,EAAE,CAAC,EAAE,CAAC;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC;QAC7B,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,SAAS;QACT,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;QACnF,YAAY,EAAE,GAAG;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,SAAiC,EAAE,SAAiB;IACpF,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACnE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACpE,OAAO,YAAY,MAAM,cAAc,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,gCAAgC,CAAC,UAA6B;IACrE,OAAO,UAAU,CAAC,gBAAgB,KAAK,cAAc,IAAI,UAAU,CAAC,gBAAgB,KAAK,aAAa,CAAC;AACzG,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB,EAAE,SAAiB;IACjE,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,IAAI,aAAa,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,cAAc,CAAC,SAAiC;IACvD,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;SAC7F,GAAG,CAAC,SAAS,CAAC;SACd,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CACxB,UAA6B,EAC7B,SAA6C,EAC7C,QAAqC,EACrC,UAAuC,EACvC,OAAmD;IAEnD,IAAI,UAAU,CAAC,UAAU,KAAK,KAAK,IAAI,UAAU,CAAC,gBAAgB,KAAK,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjH,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;WACzG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;WAC9G,CAAC,UAAU,CAAC,gBAAgB,KAAK,WAAW,IAAI,UAAU,CAAC,gBAAgB,KAAK,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACnH,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC;WAC7D,CAAC,UAAU,CAAC,gBAAgB,KAAK,WAAW,IAAI,UAAU,CAAC,gBAAgB,KAAK,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACnH,IAAI,SAAS,CAAC,aAAa,KAAK,cAAc;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,UAAU,CAAC,gBAAgB,KAAK,WAAW,IAAI,SAAS,CAAC,IAAI,KAAK,iBAAiB,IAAI,SAAS,CAAC,aAAa,KAAK,YAAY,EAAE,CAAC;QACpI,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,IAAI,UAAU,CAAC,gBAAgB,KAAK,UAAU;WACzC,CAAC,SAAS,CAAC,IAAI,KAAK,iBAAiB,IAAI,SAAS,CAAC,IAAI,KAAK,iBAAiB,CAAC;WAC9E,SAAS,CAAC,aAAa,KAAK,YAAY;QAAE,OAAO,oBAAoB,CAAC;IAC3E,IAAI,UAAU,CAAC,gBAAgB,KAAK,cAAc;QAAE,OAAO,qBAAqB,CAAC;IACjF,IAAI,UAAU,CAAC,gBAAgB,KAAK,aAAa;QAAE,OAAO,qBAAqB,CAAC;IAChF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAChH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,aAAmB;IAEnB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CACjC,aAAa,CAAC,cAAc,EAAE,EAC9B,aAAa,CAAC,WAAW,EAAE,EAC3B,aAAa,CAAC,UAAU,EAAE,CAC3B,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,8DAA8D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3F,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,IAAI,YAAY,EAAE,CAAC;YACrG,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnG,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACvB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3C,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzC,OAAO,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,KAAW,EAAE,GAAS;IAChE,OAAO;QACL,UAAU;QACV,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE;QACnC,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE;QAC/B,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAW,EAAE,IAAY;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,MAAM;QAAE,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACtC,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;SAClF,IAAI,IAAI,KAAK,OAAO;QAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACxC,IAAI,IAAI,KAAK,MAAM;QAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,KAAW,EAAE,IAAY,EAAE,KAAa;IACxD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,MAAM;QAAE,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC;SACjE,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;SACvE,IAAI,IAAI,KAAK,OAAO;QAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;SACjE,IAAI,IAAI,KAAK,MAAM;QAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;;QAClE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB;IACpC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5H,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC;QAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/router.d.ts CHANGED
@@ -17,6 +17,7 @@
17
17
  import type { AgentRunRequest, AgentRouter } from "./agent-run-engine.js";
18
18
  import type { MetadataAgentIntent } from "./metadata/catalog.js";
19
19
  import { type AgentMeaningResolver, type AgentRetrievalEvidence, type MeaningResolution } from "./meaning-resolution.js";
20
+ import { type ResolvedAnalyticalPlan } from './resolved-analytical-plan.js';
20
21
  /** The router's fine-grained classification of a turn. */
21
22
  export interface RouterClassification {
22
23
  category: "conversational" | "capability" | "general_knowledge" | "data_lookup" | "data_analysis" | "authoring" | "app" | "unclear";
@@ -45,6 +46,8 @@ export interface HybridRouterOptions {
45
46
  resolveMeaning?: AgentMeaningResolver;
46
47
  /** Maximum candidate cards sent to meaning resolution. Default 12. */
47
48
  maxMeaningCandidates?: number;
49
+ /** Authoritative by default; `shadow` is the bounded rollback switch. */
50
+ resolvedPlanMode?: ResolvedAnalyticalPlan['mode'];
48
51
  /** Deterministic confidence at/above which the LLM is never called. Default 0.7. */
49
52
  llmThreshold?: number;
50
53
  /** Max cached classifications. Default 200. */
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAQL,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAE3B,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EACJ,gBAAgB,GAChB,YAAY,GACZ,mBAAmB,GACnB,aAAa,GACb,eAAe,GACf,WAAW,GACX,KAAK,GACL,SAAS,CAAC;IACd,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mGAAmG;AACnG,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtB,MAAM,WAAW,mBAAmB;IAClC,gGAAgG;IAChG,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,sBAAsB,GAAG,SAAS,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAC7H,iFAAiF;IACjF,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAWD;;;;GAIG;AACH,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,GAAG,mBAAmB,GAAG,SAAS,CAWtG;AAkOD,iBAAS,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CA4D1E;AAwND;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,WAAW,CAmLjF;AAED,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAQL,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAE3B,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA+B,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEzG,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EACJ,gBAAgB,GAChB,YAAY,GACZ,mBAAmB,GACnB,aAAa,GACb,eAAe,GACf,WAAW,GACX,KAAK,GACL,SAAS,CAAC;IACd,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mGAAmG;AACnG,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtB,MAAM,WAAW,mBAAmB;IAClC,gGAAgG;IAChG,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,sBAAsB,GAAG,SAAS,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAC7H,iFAAiF;IACjF,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAClD,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAWD;;;;GAIG;AACH,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,GAAG,mBAAmB,GAAG,SAAS,CAWtG;AAkOD,iBAAS,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CA4D1E;AA0OD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,WAAW,CAyMjF;AAED,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,CAAC"}
package/dist/router.js CHANGED
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import { classifyConversationalTurn, decideAgentAction, } from "./intent-controller.js";
18
18
  import { buildMeaningEvidencePackage, defaultQueryIntent, findExplicitEvidenceReference, questionTypeFromText, routeForEvidenceCandidate, validateMeaningResolution, } from "./meaning-resolution.js";
19
+ import { buildResolvedAnalyticalPlan } from './resolved-analytical-plan.js';
19
20
  const DEFAULT_THRESHOLD = 0.7;
20
21
  const DEFAULT_CACHE_SIZE = 200;
21
22
  const DEFAULT_CACHE_TTL_MS = 10 * 60 * 1000;
@@ -349,12 +350,19 @@ function retrievalTrace(evidence, candidates) {
349
350
  candidateIds: candidates.map((candidate) => candidate.id),
350
351
  };
351
352
  }
352
- function routeDecisionForResolution(base, evidence, candidates, resolution, source) {
353
+ function routeDecisionForResolution(base, evidence, candidates, resolution, source, question = resolution.interpretedQuestion, mode = 'authoritative') {
353
354
  const needsClarification = resolution.confidence === "low" || resolution.recommendedRoute === "clarify";
354
355
  const analytical = resolution.questionType === "diagnosis" || resolution.questionType === "research";
355
356
  const reason = needsClarification
356
357
  ? `The retrieved evidence supports multiple business meanings: ${resolution.interpretedQuestion}`
357
358
  : `Resolved the question against ${resolution.selectedConceptIds.join(", ")}: ${resolution.interpretedQuestion}`;
359
+ const resolvedAnalyticalPlan = buildResolvedAnalyticalPlan({
360
+ question,
361
+ resolution,
362
+ evidence,
363
+ candidates,
364
+ mode,
365
+ });
358
366
  return {
359
367
  ...base,
360
368
  action: needsClarification ? "clarify" : analytical ? "investigate" : "answer",
@@ -364,6 +372,7 @@ function routeDecisionForResolution(base, evidence, candidates, resolution, sour
364
372
  category: analytical ? "data_analysis" : needsClarification ? "unclear" : "data_lookup",
365
373
  depth: analytical ? "deep" : "quick",
366
374
  meaningResolution: resolution,
375
+ resolvedAnalyticalPlan,
367
376
  retrievalEvidence: retrievalTrace(evidence, candidates),
368
377
  requiresClarification: needsClarification,
369
378
  ...(needsClarification ? { clarificationOptions: buildClarificationOptions(candidates) } : {}),
@@ -414,10 +423,10 @@ function directResolution(request, evidence, candidate) {
414
423
  recommendedRoute: routeForEvidenceCandidate(candidate),
415
424
  };
416
425
  }
417
- function routeWithoutMeaningModel(request, base, evidence, candidates) {
426
+ function routeWithoutMeaningModel(request, base, evidence, candidates, planMode = 'authoritative') {
418
427
  const exactCompatible = candidates.filter((candidate) => candidate.exactMatch && candidate.compatibility !== "incompatible");
419
428
  if (exactCompatible.length === 1 && !hasMateriallyRelatedCompetitor(exactCompatible[0], candidates)) {
420
- return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, exactCompatible[0]), "heuristic");
429
+ return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, exactCompatible[0]), "heuristic", request.question, planMode);
421
430
  }
422
431
  if (base.action === "investigate") {
423
432
  return {
@@ -461,6 +470,13 @@ function dominantCompatibleGovernedCandidate(candidates) {
461
470
  return undefined;
462
471
  if (best.relevanceScore < 0.82)
463
472
  return undefined;
473
+ // Deterministic fit proves executability, not business meaning. Preserve the
474
+ // one bounded meaning call whenever a plausible semantic interpretation is
475
+ // present, even if the certified block won lexical ranking.
476
+ if (candidates.some((candidate) => (candidate.kind === 'semantic_metric' || candidate.kind === 'semantic_member')
477
+ && candidate.compatibility !== 'incompatible'
478
+ && candidate.relevanceScore >= 0.45))
479
+ return undefined;
464
480
  const competitorFloor = Math.max(0.7, best.relevanceScore - 0.12);
465
481
  const hasExecutableCompetitor = compatible.some((candidate) => candidate.id !== best.id && candidate.relevanceScore >= competitorFloor);
466
482
  return hasExecutableCompetitor ? undefined : best;
@@ -562,18 +578,18 @@ export function createHybridRouter(options = {}) {
562
578
  if (candidates.length > 0) {
563
579
  const explicit = selectedEvidence ?? findExplicitEvidenceReference(request.question, candidates);
564
580
  if (explicit && explicit.compatibility !== "incompatible") {
565
- return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, explicit), "heuristic");
581
+ return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, explicit), "heuristic", request.question, options.resolvedPlanMode ?? 'authoritative');
566
582
  }
567
583
  const exactCompatible = candidates.filter((candidate) => candidate.exactMatch && candidate.compatibility !== "incompatible");
568
584
  if (exactCompatible.length === 1 && !hasMateriallyRelatedCompetitor(exactCompatible[0], candidates)) {
569
- return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, exactCompatible[0]), "heuristic");
585
+ return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, exactCompatible[0]), "heuristic", request.question, options.resolvedPlanMode ?? 'authoritative');
570
586
  }
571
587
  const dominant = dominantCompatibleGovernedCandidate(candidates);
572
588
  if (dominant) {
573
- return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, dominant), "heuristic");
589
+ return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, dominant), "heuristic", request.question, options.resolvedPlanMode ?? 'authoritative');
574
590
  }
575
591
  if (shouldDeferCompositionalFollowUpToExecutor(base, candidates)) {
576
- return routeWithoutMeaningModel(request, base, evidence, candidates);
592
+ return routeWithoutMeaningModel(request, base, evidence, candidates, options.resolvedPlanMode ?? 'authoritative');
577
593
  }
578
594
  const key = cacheKey(request, evidence);
579
595
  const cached = cache.get(key);
@@ -593,7 +609,7 @@ export function createHybridRouter(options = {}) {
593
609
  if (resolution) {
594
610
  const validated = validateMeaningResolution(resolution, candidates);
595
611
  if (validated.ok) {
596
- return remember(key, routeDecisionForResolution(base, evidence, candidates, validated.resolution, "llm"));
612
+ return remember(key, routeDecisionForResolution(base, evidence, candidates, validated.resolution, "llm", request.question, options.resolvedPlanMode ?? 'authoritative'));
597
613
  }
598
614
  const invalidResolution = {
599
615
  interpretedQuestion: request.question,
@@ -606,7 +622,15 @@ export function createHybridRouter(options = {}) {
606
622
  recommendedRoute: "clarify",
607
623
  clarifyingQuestion: buildEvidenceClarification(candidates, [validated.reason]),
608
624
  };
609
- return remember(key, routeDecisionForResolution(base, evidence, candidates, invalidResolution, "llm"));
625
+ const invalidDecision = routeDecisionForResolution(base, evidence, candidates, invalidResolution, "llm", request.question, options.resolvedPlanMode ?? 'authoritative');
626
+ return remember(key, {
627
+ ...invalidDecision,
628
+ action: 'answer',
629
+ requiresClarification: false,
630
+ clarificationOptions: undefined,
631
+ clarifyingQuestion: undefined,
632
+ meaningResolutionErrorCode: 'invalid_evidence_reference',
633
+ });
610
634
  }
611
635
  }
612
636
  catch (error) {
@@ -614,7 +638,7 @@ export function createHybridRouter(options = {}) {
614
638
  // A resolver transport/parse failure falls back without losing the
615
639
  // retrieval signal or permitting a general-knowledge misroute.
616
640
  }
617
- return routeWithoutMeaningModel(request, base, evidence, candidates);
641
+ return routeWithoutMeaningModel(request, base, evidence, candidates, options.resolvedPlanMode ?? 'authoritative');
618
642
  }
619
643
  }
620
644
  // Legacy/no-evidence path. A confident analytical heuristic stays offline;