@duckcodeailabs/dql-agent 1.9.5 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-run-engine.d.ts +13 -0
- package/dist/agent-run-engine.d.ts.map +1 -1
- package/dist/agent-run-engine.js +65 -2
- package/dist/agent-run-engine.js.map +1 -1
- package/dist/analytical-compatibility.d.ts +61 -0
- package/dist/analytical-compatibility.d.ts.map +1 -0
- package/dist/analytical-compatibility.js +515 -0
- package/dist/analytical-compatibility.js.map +1 -0
- package/dist/analytical-execution-graph.d.ts +174 -0
- package/dist/analytical-execution-graph.d.ts.map +1 -0
- package/dist/analytical-execution-graph.js +599 -0
- package/dist/analytical-execution-graph.js.map +1 -0
- package/dist/analytical-failure-repair.d.ts +91 -0
- package/dist/analytical-failure-repair.d.ts.map +1 -0
- package/dist/analytical-failure-repair.js +325 -0
- package/dist/analytical-failure-repair.js.map +1 -0
- package/dist/analytical-frame.d.ts +19 -0
- package/dist/analytical-frame.d.ts.map +1 -0
- package/dist/analytical-frame.js +299 -0
- package/dist/analytical-frame.js.map +1 -0
- package/dist/analytical-period-resolution.d.ts +53 -0
- package/dist/analytical-period-resolution.d.ts.map +1 -0
- package/dist/analytical-period-resolution.js +218 -0
- package/dist/analytical-period-resolution.js.map +1 -0
- package/dist/analytical-readiness.d.ts +17 -0
- package/dist/analytical-readiness.d.ts.map +1 -0
- package/dist/analytical-readiness.js +95 -0
- package/dist/analytical-readiness.js.map +1 -0
- package/dist/analytical-result-facts.d.ts +79 -0
- package/dist/analytical-result-facts.d.ts.map +1 -0
- package/dist/analytical-result-facts.js +301 -0
- package/dist/analytical-result-facts.js.map +1 -0
- package/dist/answer-loop.d.ts +82 -2
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +1129 -38
- package/dist/answer-loop.js.map +1 -1
- package/dist/embeddings/provider.d.ts +1 -1
- package/dist/embeddings/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js.map +1 -1
- package/dist/governed-relational-compiler.d.ts +189 -0
- package/dist/governed-relational-compiler.d.ts.map +1 -0
- package/dist/governed-relational-compiler.js +458 -0
- package/dist/governed-relational-compiler.js.map +1 -0
- package/dist/index.d.ts +25 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -4
- package/dist/index.js.map +1 -1
- package/dist/intent-controller.d.ts +5 -0
- package/dist/intent-controller.d.ts.map +1 -1
- package/dist/intent-controller.js.map +1 -1
- package/dist/kg/build.d.ts +2 -2
- package/dist/kg/build.d.ts.map +1 -1
- package/dist/kg/build.js +329 -9
- package/dist/kg/build.js.map +1 -1
- package/dist/meaning-resolution.d.ts +17 -0
- package/dist/meaning-resolution.d.ts.map +1 -1
- package/dist/meaning-resolution.js +83 -4
- package/dist/meaning-resolution.js.map +1 -1
- package/dist/metadata/analysis-planner.d.ts.map +1 -1
- package/dist/metadata/analysis-planner.js +37 -7
- package/dist/metadata/analysis-planner.js.map +1 -1
- package/dist/metadata/catalog.d.ts +86 -3
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +607 -36
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/meaning-evidence.d.ts +18 -2
- package/dist/metadata/meaning-evidence.d.ts.map +1 -1
- package/dist/metadata/meaning-evidence.js +182 -7
- package/dist/metadata/meaning-evidence.js.map +1 -1
- package/dist/plan-execution-adapter.d.ts +131 -0
- package/dist/plan-execution-adapter.d.ts.map +1 -0
- package/dist/plan-execution-adapter.js +447 -0
- package/dist/plan-execution-adapter.js.map +1 -0
- package/dist/research-governance.d.ts +56 -0
- package/dist/research-governance.d.ts.map +1 -0
- package/dist/research-governance.js +68 -0
- package/dist/research-governance.js.map +1 -0
- package/dist/research-loop.d.ts +14 -0
- package/dist/research-loop.d.ts.map +1 -1
- package/dist/research-loop.js +77 -23
- package/dist/research-loop.js.map +1 -1
- package/dist/resolved-analytical-plan.d.ts +123 -0
- package/dist/resolved-analytical-plan.d.ts.map +1 -0
- package/dist/resolved-analytical-plan.js +400 -0
- package/dist/resolved-analytical-plan.js.map +1 -0
- package/dist/router.d.ts +3 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +195 -25
- package/dist/router.js.map +1 -1
- package/dist/skills/loader.d.ts +17 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +62 -4
- package/dist/skills/loader.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single identity adapter between a ResolvedAnalyticalPlan and execution.
|
|
3
|
+
* It does no question search and no fuzzy rematching: every executable member
|
|
4
|
+
* must resolve by an identity captured in the immutable registry snapshot.
|
|
5
|
+
*
|
|
6
|
+
* Acceptance: AGT-013, AGT-014, API-006.
|
|
7
|
+
*/
|
|
8
|
+
export function buildPlanExecutionRegistry(input) {
|
|
9
|
+
const byNodeId = new Map(input.nodes.map((node) => [node.nodeId, node]));
|
|
10
|
+
const identitiesByNode = new Map();
|
|
11
|
+
for (const node of input.nodes) {
|
|
12
|
+
identitiesByNode.set(node.nodeId, new Set(nodeIdentities(node)));
|
|
13
|
+
}
|
|
14
|
+
for (const object of input.objects ?? []) {
|
|
15
|
+
const nodeId = nodeIdForMetadataObject(object);
|
|
16
|
+
if (!nodeId || !byNodeId.has(nodeId))
|
|
17
|
+
continue;
|
|
18
|
+
const identities = identitiesByNode.get(nodeId) ?? new Set();
|
|
19
|
+
for (const identity of metadataObjectIdentities(object))
|
|
20
|
+
identities.add(identity);
|
|
21
|
+
identitiesByNode.set(nodeId, identities);
|
|
22
|
+
}
|
|
23
|
+
return input.nodes.map((node) => ({
|
|
24
|
+
node,
|
|
25
|
+
identities: [...(identitiesByNode.get(node.nodeId) ?? [])].filter(Boolean).sort(),
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
export function adaptResolvedAnalyticalPlan(input) {
|
|
29
|
+
const { plan } = input;
|
|
30
|
+
const block = (code, reason, candidateIds) => ({
|
|
31
|
+
schemaVersion: 1,
|
|
32
|
+
status: 'blocked',
|
|
33
|
+
kind: 'blocked',
|
|
34
|
+
planId: plan.planId,
|
|
35
|
+
fingerprint: plan.fingerprint,
|
|
36
|
+
code,
|
|
37
|
+
reason,
|
|
38
|
+
...(candidateIds?.length ? { candidateIds: [...candidateIds].sort() } : {}),
|
|
39
|
+
});
|
|
40
|
+
if (input.expectedSnapshotId && plan.snapshotId !== input.expectedSnapshotId) {
|
|
41
|
+
return block('SNAPSHOT_MISMATCH', `Plan snapshot ${plan.snapshotId} does not match active snapshot ${input.expectedSnapshotId}.`);
|
|
42
|
+
}
|
|
43
|
+
if (plan.capability === 'blocked') {
|
|
44
|
+
return block('PLAN_BLOCKED', plan.missingInformation.join(' ') || 'The resolved plan is not executable.');
|
|
45
|
+
}
|
|
46
|
+
if (plan.capability === 'governed_relational' || plan.capability === 'bounded_exploration') {
|
|
47
|
+
return {
|
|
48
|
+
schemaVersion: 1,
|
|
49
|
+
status: 'delegated',
|
|
50
|
+
kind: plan.capability,
|
|
51
|
+
planId: plan.planId,
|
|
52
|
+
fingerprint: plan.fingerprint,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (!plan.executionId)
|
|
56
|
+
return block('EXECUTION_ID_MISSING', 'The resolved plan has no qualified execution ID.');
|
|
57
|
+
const execution = resolveRegistryIdentity(plan.executionId, input.registry);
|
|
58
|
+
if (execution.length === 0) {
|
|
59
|
+
return block('EXECUTION_ID_MISSING', `Qualified execution ID ${plan.executionId} is not present in the pinned registry.`);
|
|
60
|
+
}
|
|
61
|
+
if (execution.length > 1) {
|
|
62
|
+
return block('EXECUTION_ID_AMBIGUOUS', `Qualified execution ID ${plan.executionId} resolves to more than one registry object.`, execution.map((entry) => entry.node.nodeId));
|
|
63
|
+
}
|
|
64
|
+
const entry = execution[0];
|
|
65
|
+
if (plan.capability === 'certified_execution') {
|
|
66
|
+
if (entry.node.kind !== 'block') {
|
|
67
|
+
return block('EXECUTION_KIND_MISMATCH', `${plan.executionId} is ${entry.node.kind}, not a certified block.`);
|
|
68
|
+
}
|
|
69
|
+
if (entry.node.status !== 'certified') {
|
|
70
|
+
return block('CERTIFICATION_REQUIRED', `${plan.executionId} is not certified in the pinned snapshot.`);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
schemaVersion: 1,
|
|
74
|
+
status: 'ready',
|
|
75
|
+
kind: 'certified',
|
|
76
|
+
planId: plan.planId,
|
|
77
|
+
fingerprint: plan.fingerprint,
|
|
78
|
+
node: entry.node,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (entry.node.kind !== 'metric') {
|
|
82
|
+
return block('EXECUTION_KIND_MISMATCH', `${plan.executionId} is ${entry.node.kind}, not a semantic metric.`);
|
|
83
|
+
}
|
|
84
|
+
if (!input.semanticLayer)
|
|
85
|
+
return block('SEMANTIC_LAYER_REQUIRED', 'The pinned semantic layer is unavailable.');
|
|
86
|
+
const metricNames = semanticMetricNames(entry.node, input.semanticLayer);
|
|
87
|
+
if (metricNames.length === 0)
|
|
88
|
+
return block('SEMANTIC_MEMBER_MISSING', `${plan.executionId} is not present in the pinned semantic layer.`);
|
|
89
|
+
if (metricNames.length > 1)
|
|
90
|
+
return block('SEMANTIC_MEMBER_AMBIGUOUS', `${plan.executionId} maps to multiple semantic metrics.`, metricNames);
|
|
91
|
+
const dimensions = [];
|
|
92
|
+
let timeDimension;
|
|
93
|
+
let timeFilterDimensionName;
|
|
94
|
+
for (const binding of plan.query.dimensions) {
|
|
95
|
+
const resolved = resolveSemanticDimension(binding, input.registry, input.semanticLayer);
|
|
96
|
+
if ('code' in resolved)
|
|
97
|
+
return block(resolved.code, resolved.reason, resolved.candidateIds);
|
|
98
|
+
if (isTimeDimension(resolved.definition)) {
|
|
99
|
+
timeFilterDimensionName = resolved.name;
|
|
100
|
+
if (timeDimension && timeDimension.name !== resolved.name) {
|
|
101
|
+
return block('SEMANTIC_MEMBER_AMBIGUOUS', 'The plan selects more than one time dimension.', [timeDimension.name, resolved.name]);
|
|
102
|
+
}
|
|
103
|
+
if (plan.query.timeGrain)
|
|
104
|
+
timeDimension = { name: resolved.name, granularity: plan.query.timeGrain };
|
|
105
|
+
else
|
|
106
|
+
dimensions.push(resolved.name);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
dimensions.push(resolved.name);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const filters = [];
|
|
113
|
+
for (const filter of plan.query.filters) {
|
|
114
|
+
const resolved = resolveSemanticDimension(filter.binding, input.registry, input.semanticLayer);
|
|
115
|
+
if ('code' in resolved)
|
|
116
|
+
return block(resolved.code, resolved.reason, resolved.candidateIds);
|
|
117
|
+
filters.push({ dimension: resolved.name, operator: 'equals', values: [filter.value] });
|
|
118
|
+
}
|
|
119
|
+
if ((plan.query.timeGrain || plan.query.timeBounds) && !timeFilterDimensionName) {
|
|
120
|
+
const metric = input.semanticLayer.listMetrics().find((candidate) => candidate.name === metricNames[0]);
|
|
121
|
+
const defaultName = metric?.aggTimeDimension;
|
|
122
|
+
const defaultDimension = defaultName ? input.semanticLayer.getTimeDimension(defaultName) : undefined;
|
|
123
|
+
if (!defaultDimension) {
|
|
124
|
+
return block('TIME_DIMENSION_REQUIRED', `Metric ${metricNames[0]} has no unambiguous default time dimension for the requested time scope.`);
|
|
125
|
+
}
|
|
126
|
+
timeFilterDimensionName = defaultDimension.name;
|
|
127
|
+
if (plan.query.timeGrain)
|
|
128
|
+
timeDimension = { name: defaultDimension.name, granularity: plan.query.timeGrain };
|
|
129
|
+
}
|
|
130
|
+
if (plan.query.timeBounds && timeFilterDimensionName) {
|
|
131
|
+
filters.push({ dimension: timeFilterDimensionName, operator: 'gte', values: [plan.query.timeBounds.startInclusive] }, { dimension: timeFilterDimensionName, operator: 'lt', values: [plan.query.timeBounds.endExclusive] });
|
|
132
|
+
}
|
|
133
|
+
else if (plan.query.timeRange) {
|
|
134
|
+
return block('TIME_RANGE_UNBOUND', `Time range "${plan.query.timeRange}" must be resolved to typed bounds before execution.`);
|
|
135
|
+
}
|
|
136
|
+
const selection = {
|
|
137
|
+
metrics: metricNames,
|
|
138
|
+
dimensions,
|
|
139
|
+
...(timeDimension ? { timeDimension } : {}),
|
|
140
|
+
...(filters.length ? { filters } : {}),
|
|
141
|
+
...(plan.query.order ? { orderBy: [{ name: metricNames[0], direction: plan.query.order }] } : {}),
|
|
142
|
+
...(plan.query.limit !== undefined ? { limit: plan.query.limit } : {}),
|
|
143
|
+
};
|
|
144
|
+
return {
|
|
145
|
+
schemaVersion: 1,
|
|
146
|
+
status: 'ready',
|
|
147
|
+
kind: 'semantic',
|
|
148
|
+
planId: plan.planId,
|
|
149
|
+
fingerprint: plan.fingerprint,
|
|
150
|
+
metricNode: entry.node,
|
|
151
|
+
selection,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Bind a freshness observation to the same exact semantic identities as the
|
|
156
|
+
* selected plan. This is intentionally not a search API: the request, plan,
|
|
157
|
+
* registry, and semantic layer must all agree before the host receives adapter
|
|
158
|
+
* member names. Acceptance: AGT-019, SEC-004.
|
|
159
|
+
*/
|
|
160
|
+
export function adaptAnalyticalFreshnessRequest(input) {
|
|
161
|
+
const block = (code, reason, candidateIds) => ({
|
|
162
|
+
schemaVersion: 1,
|
|
163
|
+
status: 'blocked',
|
|
164
|
+
kind: 'semantic_freshness',
|
|
165
|
+
code,
|
|
166
|
+
reason,
|
|
167
|
+
...(candidateIds?.length ? { candidateIds: [...candidateIds].sort() } : {}),
|
|
168
|
+
});
|
|
169
|
+
const frame = input.plan.analyticalFrame;
|
|
170
|
+
const time = frame?.timeContext;
|
|
171
|
+
if (input.plan.schemaVersion !== 2 || input.plan.capability !== 'semantic_execution' || !frame || !time) {
|
|
172
|
+
return block('PLAN_BLOCKED', 'The selected plan does not define a semantic analytical freshness route.');
|
|
173
|
+
}
|
|
174
|
+
if (input.request.snapshotId !== input.plan.snapshotId
|
|
175
|
+
|| (input.expectedSnapshotId && input.request.snapshotId !== input.expectedSnapshotId)) {
|
|
176
|
+
return block('SNAPSHOT_MISMATCH', 'The freshness request does not match the pinned analytical snapshot.');
|
|
177
|
+
}
|
|
178
|
+
if (input.request.metricId !== frame.metricConceptIds[0]) {
|
|
179
|
+
return block('EXECUTION_ID_MISSING', 'The freshness metric does not match the immutable analytical frame.');
|
|
180
|
+
}
|
|
181
|
+
if (!time.timeDimensionId || input.request.timeDimensionId !== time.timeDimensionId) {
|
|
182
|
+
return block('TIME_DIMENSION_REQUIRED', 'The freshness time dimension does not match the immutable analytical frame.');
|
|
183
|
+
}
|
|
184
|
+
if (!input.plan.executionId) {
|
|
185
|
+
return block('EXECUTION_ID_MISSING', 'The semantic plan has no qualified execution identity.');
|
|
186
|
+
}
|
|
187
|
+
const executions = resolveRegistryIdentity(input.plan.executionId, input.registry);
|
|
188
|
+
if (executions.length !== 1) {
|
|
189
|
+
return block(executions.length > 1 ? 'EXECUTION_ID_AMBIGUOUS' : 'EXECUTION_ID_MISSING', `Qualified execution ID ${input.plan.executionId} resolves to ${executions.length} pinned registry objects.`, executions.map((entry) => entry.node.nodeId));
|
|
190
|
+
}
|
|
191
|
+
const metricNode = executions[0].node;
|
|
192
|
+
if (metricNode.kind !== 'metric') {
|
|
193
|
+
return block('EXECUTION_KIND_MISMATCH', `${input.plan.executionId} is ${metricNode.kind}, not a semantic metric.`);
|
|
194
|
+
}
|
|
195
|
+
const metricNames = semanticMetricNames(metricNode, input.semanticLayer);
|
|
196
|
+
if (metricNames.length !== 1) {
|
|
197
|
+
return block(metricNames.length > 1 ? 'SEMANTIC_MEMBER_AMBIGUOUS' : 'SEMANTIC_MEMBER_MISSING', `${input.plan.executionId} maps to ${metricNames.length} semantic metrics.`, metricNames);
|
|
198
|
+
}
|
|
199
|
+
const resolvedTime = resolveSemanticDimensionId(time.timeDimensionId, input.registry, input.semanticLayer);
|
|
200
|
+
if ('code' in resolvedTime)
|
|
201
|
+
return block(resolvedTime.code, resolvedTime.reason, resolvedTime.candidateIds);
|
|
202
|
+
const resolvedTimeDefinition = resolvedTime.definition;
|
|
203
|
+
if (!resolvedTimeDefinition || !isTimeDimension(resolvedTimeDefinition)) {
|
|
204
|
+
return block('TIME_DIMENSION_REQUIRED', `${time.timeDimensionId} is not a semantic time dimension.`);
|
|
205
|
+
}
|
|
206
|
+
const timeDefinitions = input.semanticLayer.listTimeDimensions().filter((candidate) => candidate.name === resolvedTimeDefinition.name
|
|
207
|
+
&& candidate.table === resolvedTimeDefinition.table);
|
|
208
|
+
if (timeDefinitions.length !== 1) {
|
|
209
|
+
return block(timeDefinitions.length > 1 ? 'SEMANTIC_MEMBER_AMBIGUOUS' : 'SEMANTIC_MEMBER_MISSING', `${time.timeDimensionId} maps to ${timeDefinitions.length} semantic time definitions.`, timeDefinitions.map((candidate) => `${candidate.cube ?? candidate.table}.${candidate.name}`));
|
|
210
|
+
}
|
|
211
|
+
const timeDefinition = timeDefinitions[0];
|
|
212
|
+
const availableGrains = timeDefinition.granularities;
|
|
213
|
+
const requestedGrain = availableGrains.find((candidate) => candidate === time.grain);
|
|
214
|
+
const granularity = availableGrains.includes('day')
|
|
215
|
+
? 'day'
|
|
216
|
+
: requestedGrain ?? availableGrains[0] ?? 'day';
|
|
217
|
+
const outputField = `${timeDefinition.name}_${granularity}`;
|
|
218
|
+
return {
|
|
219
|
+
schemaVersion: 1,
|
|
220
|
+
status: 'ready',
|
|
221
|
+
kind: 'semantic_freshness',
|
|
222
|
+
request: {
|
|
223
|
+
route: 'semantic',
|
|
224
|
+
metric: metricNames[0],
|
|
225
|
+
timeDimension: resolvedTime.name,
|
|
226
|
+
granularity,
|
|
227
|
+
outputField,
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Convert semantic source nodes into exact adapter selections. Every metric,
|
|
233
|
+
* dimension, filter, and period comes from the frozen graph/plan; this adapter
|
|
234
|
+
* performs identity lookup only and never searches or rematches question text.
|
|
235
|
+
*
|
|
236
|
+
* Acceptance: AGT-014, AGT-018, AGT-019.
|
|
237
|
+
*/
|
|
238
|
+
export function adaptAnalyticalSemanticGraph(input) {
|
|
239
|
+
const { graph, plan } = input;
|
|
240
|
+
const block = (code, reason, candidateIds) => ({
|
|
241
|
+
schemaVersion: 1,
|
|
242
|
+
status: 'blocked',
|
|
243
|
+
kind: 'semantic_graph',
|
|
244
|
+
graphId: graph.graphId,
|
|
245
|
+
graphFingerprint: graph.fingerprint,
|
|
246
|
+
planId: plan.planId,
|
|
247
|
+
planFingerprint: plan.fingerprint,
|
|
248
|
+
code,
|
|
249
|
+
reason,
|
|
250
|
+
...(candidateIds?.length ? { candidateIds: [...candidateIds].sort() } : {}),
|
|
251
|
+
});
|
|
252
|
+
if (graph.planId !== plan.planId ||
|
|
253
|
+
graph.planFingerprint !== plan.fingerprint ||
|
|
254
|
+
graph.snapshotId !== plan.snapshotId) {
|
|
255
|
+
return block('EXECUTION_GRAPH_MISMATCH', 'The executable graph does not bind the supplied immutable plan.');
|
|
256
|
+
}
|
|
257
|
+
if (input.expectedSnapshotId && graph.snapshotId !== input.expectedSnapshotId) {
|
|
258
|
+
return block('SNAPSHOT_MISMATCH', `Graph snapshot ${graph.snapshotId} does not match active snapshot ${input.expectedSnapshotId}.`);
|
|
259
|
+
}
|
|
260
|
+
if (graph.route !== 'semantic') {
|
|
261
|
+
return block('EXECUTION_GRAPH_ROUTE_MISMATCH', `Graph route ${graph.route} is not semantic.`);
|
|
262
|
+
}
|
|
263
|
+
if (!plan.executionId)
|
|
264
|
+
return block('EXECUTION_ID_MISSING', 'The resolved plan has no qualified semantic execution ID.');
|
|
265
|
+
const execution = resolveRegistryIdentity(plan.executionId, input.registry);
|
|
266
|
+
if (execution.length !== 1) {
|
|
267
|
+
return block(execution.length > 1 ? 'EXECUTION_ID_AMBIGUOUS' : 'EXECUTION_ID_MISSING', `Qualified execution ID ${plan.executionId} resolves to ${execution.length} pinned registry objects.`, execution.map((entry) => entry.node.nodeId));
|
|
268
|
+
}
|
|
269
|
+
const metricNode = execution[0].node;
|
|
270
|
+
if (metricNode.kind !== 'metric') {
|
|
271
|
+
return block('EXECUTION_KIND_MISMATCH', `${plan.executionId} is ${metricNode.kind}, not a semantic metric.`);
|
|
272
|
+
}
|
|
273
|
+
const metricNames = semanticMetricNames(metricNode, input.semanticLayer);
|
|
274
|
+
if (metricNames.length !== 1) {
|
|
275
|
+
return block(metricNames.length > 1 ? 'SEMANTIC_MEMBER_AMBIGUOUS' : 'SEMANTIC_MEMBER_MISSING', `${plan.executionId} maps to ${metricNames.length} semantic metrics.`, metricNames);
|
|
276
|
+
}
|
|
277
|
+
const invocations = [];
|
|
278
|
+
for (const source of graph.nodes.filter((node) => node.kind === 'source_invocation')) {
|
|
279
|
+
if (source.strategy !== 'period_aggregate') {
|
|
280
|
+
return block('EXECUTION_GRAPH_ROUTE_MISMATCH', 'A semantic graph cannot invoke a complete certified asset.');
|
|
281
|
+
}
|
|
282
|
+
const dimensions = [];
|
|
283
|
+
let timeDimension;
|
|
284
|
+
for (const dimensionId of source.groupByDimensionIds) {
|
|
285
|
+
const resolved = resolveSemanticDimensionId(dimensionId, input.registry, input.semanticLayer);
|
|
286
|
+
if ('code' in resolved)
|
|
287
|
+
return block(resolved.code, resolved.reason, resolved.candidateIds);
|
|
288
|
+
if (source.period?.timeDimensionId === dimensionId) {
|
|
289
|
+
timeDimension = { name: resolved.name, granularity: source.period.grain };
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
dimensions.push(resolved.name);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const filters = [];
|
|
296
|
+
for (const member of source.memberFilters) {
|
|
297
|
+
const resolved = resolveSemanticDimensionId(member.dimensionId, input.registry, input.semanticLayer);
|
|
298
|
+
if ('code' in resolved)
|
|
299
|
+
return block(resolved.code, resolved.reason, resolved.candidateIds);
|
|
300
|
+
const values = member.canonicalValues.flatMap((value) => scalarFilterValue(value));
|
|
301
|
+
if (values.length !== member.canonicalValues.length) {
|
|
302
|
+
return block('SEMANTIC_MEMBER_MISSING', `Filter ${member.dimensionId} contains a non-scalar canonical value.`);
|
|
303
|
+
}
|
|
304
|
+
filters.push({ dimension: resolved.name, operator: 'equals', values });
|
|
305
|
+
}
|
|
306
|
+
if (source.period) {
|
|
307
|
+
const resolvedTime = resolveSemanticDimensionId(source.period.timeDimensionId, input.registry, input.semanticLayer);
|
|
308
|
+
if ('code' in resolvedTime)
|
|
309
|
+
return block(resolvedTime.code, resolvedTime.reason, resolvedTime.candidateIds);
|
|
310
|
+
filters.push({
|
|
311
|
+
dimension: resolvedTime.name,
|
|
312
|
+
operator: 'gte',
|
|
313
|
+
values: [source.period.startInclusive],
|
|
314
|
+
}, {
|
|
315
|
+
dimension: resolvedTime.name,
|
|
316
|
+
operator: 'lt',
|
|
317
|
+
values: [source.period.endExclusive],
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
invocations.push({
|
|
321
|
+
nodeId: source.id,
|
|
322
|
+
...(source.adapterId ? { adapterId: source.adapterId } : {}),
|
|
323
|
+
selection: {
|
|
324
|
+
metrics: metricNames,
|
|
325
|
+
dimensions,
|
|
326
|
+
...(timeDimension ? { timeDimension } : {}),
|
|
327
|
+
...(filters.length ? { filters } : {}),
|
|
328
|
+
},
|
|
329
|
+
outputAliases: structuredClone(source.outputAliases),
|
|
330
|
+
...(source.period ? { period: structuredClone(source.period) } : {}),
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
schemaVersion: 1,
|
|
335
|
+
status: 'ready',
|
|
336
|
+
kind: 'semantic_graph',
|
|
337
|
+
graphId: graph.graphId,
|
|
338
|
+
graphFingerprint: graph.fingerprint,
|
|
339
|
+
planId: plan.planId,
|
|
340
|
+
planFingerprint: plan.fingerprint,
|
|
341
|
+
metricNode,
|
|
342
|
+
invocations,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
function resolveRegistryIdentity(identity, registry) {
|
|
346
|
+
return registry.filter((entry) => entry.identities.includes(identity));
|
|
347
|
+
}
|
|
348
|
+
function resolveSemanticDimension(binding, registry, layer) {
|
|
349
|
+
if (binding.status !== 'resolved' || !binding.qualifiedId) {
|
|
350
|
+
return {
|
|
351
|
+
code: binding.status === 'ambiguous' ? 'SEMANTIC_MEMBER_AMBIGUOUS' : 'SEMANTIC_MEMBER_MISSING',
|
|
352
|
+
reason: `Dimension ${binding.requested} is ${binding.status} in the resolved plan.`,
|
|
353
|
+
candidateIds: binding.candidateIds,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
const matches = resolveRegistryIdentity(binding.qualifiedId, registry).filter((entry) => entry.node.kind === 'dimension');
|
|
357
|
+
if (matches.length !== 1) {
|
|
358
|
+
return {
|
|
359
|
+
code: matches.length > 1 ? 'SEMANTIC_MEMBER_AMBIGUOUS' : 'SEMANTIC_MEMBER_MISSING',
|
|
360
|
+
reason: `Qualified dimension ${binding.qualifiedId} resolves to ${matches.length} pinned registry objects.`,
|
|
361
|
+
candidateIds: matches.map((entry) => entry.node.nodeId),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
const node = matches[0].node;
|
|
365
|
+
const localId = stringValue(node.payload?.localId) ?? node.name;
|
|
366
|
+
const candidates = uniqueDefinitions([
|
|
367
|
+
layer.resolveGroupBy(node.name),
|
|
368
|
+
layer.resolveGroupBy(localId),
|
|
369
|
+
...stringArray(node.payload?.aliases).map((alias) => layer.resolveGroupBy(alias)),
|
|
370
|
+
]);
|
|
371
|
+
if (candidates.length !== 1) {
|
|
372
|
+
return {
|
|
373
|
+
code: candidates.length > 1 ? 'SEMANTIC_MEMBER_AMBIGUOUS' : 'SEMANTIC_MEMBER_MISSING',
|
|
374
|
+
reason: `Qualified dimension ${binding.qualifiedId} maps to ${candidates.length} semantic definitions.`,
|
|
375
|
+
candidateIds: candidates.map((candidate) => `${candidate.cube ?? candidate.table}.${candidate.name}`),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
return { name: candidates[0].qualifiedName ?? candidates[0].name, definition: candidates[0] };
|
|
379
|
+
}
|
|
380
|
+
function resolveSemanticDimensionId(dimensionId, registry, layer) {
|
|
381
|
+
return resolveSemanticDimension({
|
|
382
|
+
requested: dimensionId,
|
|
383
|
+
qualifiedId: dimensionId,
|
|
384
|
+
status: 'resolved',
|
|
385
|
+
candidateIds: [dimensionId],
|
|
386
|
+
}, registry, layer);
|
|
387
|
+
}
|
|
388
|
+
function semanticMetricNames(node, layer) {
|
|
389
|
+
const localId = stringValue(node.payload?.localId) ?? node.name;
|
|
390
|
+
const exactIdentities = new Set([node.name, localId, ...stringArray(node.payload?.aliases)]);
|
|
391
|
+
return [...new Set(layer.listMetrics().filter((metric) => exactIdentities.has(metric.name)
|
|
392
|
+
|| exactIdentities.has(`${metric.cube ?? ''}.${metric.name}`)
|
|
393
|
+
|| (metric.source?.objectId ? exactIdentities.has(metric.source.objectId) : false)).map((metric) => metric.name))].sort();
|
|
394
|
+
}
|
|
395
|
+
function nodeIdentities(node) {
|
|
396
|
+
return [
|
|
397
|
+
node.nodeId,
|
|
398
|
+
stringValue(node.payload?.qualifiedId),
|
|
399
|
+
stringValue(node.payload?.sourceNativeId),
|
|
400
|
+
...stringArray(node.payload?.aliases),
|
|
401
|
+
].filter((value) => Boolean(value));
|
|
402
|
+
}
|
|
403
|
+
function metadataObjectIdentities(object) {
|
|
404
|
+
return [
|
|
405
|
+
object.objectKey,
|
|
406
|
+
object.fullName,
|
|
407
|
+
stringValue(object.payload?.qualifiedId),
|
|
408
|
+
stringValue(object.payload?.sourceNativeId),
|
|
409
|
+
...stringArray(object.payload?.aliases),
|
|
410
|
+
].filter((value) => Boolean(value));
|
|
411
|
+
}
|
|
412
|
+
function nodeIdForMetadataObject(object) {
|
|
413
|
+
if (object.objectType === 'dql_block')
|
|
414
|
+
return `block:${object.name}`;
|
|
415
|
+
if (object.objectType === 'semantic_metric')
|
|
416
|
+
return `metric:${object.name}`;
|
|
417
|
+
if (object.objectType === 'semantic_dimension' || object.objectType === 'semantic_time_dimension')
|
|
418
|
+
return `dimension:${object.name}`;
|
|
419
|
+
return undefined;
|
|
420
|
+
}
|
|
421
|
+
function stringValue(value) {
|
|
422
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
423
|
+
}
|
|
424
|
+
function stringArray(value) {
|
|
425
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string' && Boolean(item.trim())) : [];
|
|
426
|
+
}
|
|
427
|
+
function scalarFilterValue(value) {
|
|
428
|
+
if (typeof value === 'string')
|
|
429
|
+
return [value];
|
|
430
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
431
|
+
return [String(value)];
|
|
432
|
+
if (typeof value === 'boolean' || typeof value === 'bigint')
|
|
433
|
+
return [String(value)];
|
|
434
|
+
return [];
|
|
435
|
+
}
|
|
436
|
+
function uniqueDefinitions(values) {
|
|
437
|
+
const byId = new Map();
|
|
438
|
+
for (const value of values) {
|
|
439
|
+
if (value)
|
|
440
|
+
byId.set(`${value.cube ?? ''}:${value.table ?? ''}:${value.name}`, value);
|
|
441
|
+
}
|
|
442
|
+
return [...byId.values()];
|
|
443
|
+
}
|
|
444
|
+
function isTimeDimension(value) {
|
|
445
|
+
return Boolean(value && (value.isTimeDimension || value.source?.objectType === 'time_dimension'));
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=plan-execution-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-execution-adapter.js","sourceRoot":"","sources":["../src/plan-execution-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6HH,MAAM,UAAU,0BAA0B,CAAC,KAG1C;IACC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACrE,KAAK,MAAM,QAAQ,IAAI,wBAAwB,CAAC,MAAM,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClF,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI;QACJ,UAAU,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;KAClF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAuC;IAEvC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,IAA8B,EAAE,MAAc,EAAE,YAAuB,EAAwB,EAAE,CAAC,CAAC;QAChH,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI;QACJ,MAAM;QACN,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC,mBAAmB,EAAE,iBAAiB,IAAI,CAAC,UAAU,mCAAmC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;IACpI,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,sCAAsC,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,qBAAqB,IAAI,IAAI,CAAC,UAAU,KAAK,qBAAqB,EAAE,CAAC;QAC3F,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC,sBAAsB,EAAE,kDAAkD,CAAC,CAAC;IAChH,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,sBAAsB,EAAE,0BAA0B,IAAI,CAAC,WAAW,yCAAyC,CAAC,CAAC;IAC5H,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,wBAAwB,EAAE,0BAA0B,IAAI,CAAC,WAAW,6CAA6C,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/K,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,UAAU,KAAK,qBAAqB,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,yBAAyB,EAAE,GAAG,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC,wBAAwB,EAAE,GAAG,IAAI,CAAC,WAAW,2CAA2C,CAAC,CAAC;QACzG,CAAC;QACD,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,yBAAyB,EAAE,GAAG,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC,yBAAyB,EAAE,2CAA2C,CAAC,CAAC;IAC/G,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACzE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,yBAAyB,EAAE,GAAG,IAAI,CAAC,WAAW,+CAA+C,CAAC,CAAC;IAC1I,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,2BAA2B,EAAE,GAAG,IAAI,CAAC,WAAW,qCAAqC,EAAE,WAAW,CAAC,CAAC;IAE7I,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,aAAuD,CAAC;IAC5D,IAAI,uBAA2C,CAAC;IAChD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QACxF,IAAI,MAAM,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5F,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,uBAAuB,GAAG,QAAQ,CAAC,IAAI,CAAC;YACxC,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC1D,OAAO,KAAK,CAAC,2BAA2B,EAAE,gDAAgD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACnI,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,aAAa,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;;gBAChG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAoD,EAAE,CAAC;IACpE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/F,IAAI,MAAM,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACxG,MAAM,WAAW,GAAG,MAAM,EAAE,gBAAgB,CAAC;QAC7C,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,yBAAyB,EAAE,UAAU,WAAW,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC;QAC9I,CAAC;QACD,uBAAuB,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAChD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,aAAa,GAAG,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IAC/G,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,uBAAuB,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CACV,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,EACvG,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CACrG,CAAC;IACJ,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,oBAAoB,EAAE,eAAe,IAAI,CAAC,KAAK,CAAC,SAAS,sDAAsD,CAAC,CAAC;IAChI,CAAC;IACD,MAAM,SAAS,GAA4B;QACzC,OAAO,EAAE,WAAW;QACpB,UAAU;QACV,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;IACF,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAAC,KAM/C;IACC,MAAM,KAAK,GAAG,CACZ,IAA8B,EAC9B,MAAc,EACd,YAAuB,EACY,EAAE,CAAC,CAAC;QACvC,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,oBAAoB;QAC1B,IAAI;QACJ,MAAM;QACN,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;IACzC,MAAM,IAAI,GAAG,KAAK,EAAE,WAAW,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,oBAAoB,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACxG,OAAO,KAAK,CAAC,cAAc,EAAE,0EAA0E,CAAC,CAAC;IAC3G,CAAC;IACD,IACE,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU;WAC/C,CAAC,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,kBAAkB,CAAC,EACtF,CAAC;QACD,OAAO,KAAK,CAAC,mBAAmB,EAAE,sEAAsE,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC,sBAAsB,EAAE,qEAAqE,CAAC,CAAC;IAC9G,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QACpF,OAAO,KAAK,CAAC,yBAAyB,EAAE,6EAA6E,CAAC,CAAC;IACzH,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,sBAAsB,EAAE,wDAAwD,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CACV,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,EACzE,0BAA0B,KAAK,CAAC,IAAI,CAAC,WAAW,gBAAgB,UAAU,CAAC,MAAM,2BAA2B,EAC5G,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAC7C,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;IACvC,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,yBAAyB,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,UAAU,CAAC,IAAI,0BAA0B,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACzE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CACV,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB,EAChF,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,YAAY,WAAW,CAAC,MAAM,oBAAoB,EAC3E,WAAW,CACZ,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,0BAA0B,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3G,IAAI,MAAM,IAAI,YAAY;QAAE,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5G,MAAM,sBAAsB,GAAG,YAAY,CAAC,UAAU,CAAC;IACvD,IAAI,CAAC,sBAAsB,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC,yBAAyB,EAAE,GAAG,IAAI,CAAC,eAAe,oCAAoC,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,eAAe,GAAG,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACpF,SAAS,CAAC,IAAI,KAAK,sBAAsB,CAAC,IAAI;WAC3C,SAAS,CAAC,KAAK,KAAK,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CACV,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB,EACpF,GAAG,IAAI,CAAC,eAAe,YAAY,eAAe,CAAC,MAAM,6BAA6B,EACtF,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAC7F,CAAC;IACJ,CAAC;IACD,MAAM,cAAc,GAAG,eAAe,CAAC,CAAC,CAAE,CAAC;IAC3C,MAAM,eAAe,GAAG,cAAc,CAAC,aAAa,CAAC;IACrD,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;IACrF,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,cAAc,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAClD,MAAM,WAAW,GAAG,GAAG,cAAc,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;IAC5D,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE;YACP,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAE;YACvB,aAAa,EAAE,YAAY,CAAC,IAAI;YAChC,WAAW;YACX,WAAW;SACZ;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAM5C;IACC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAC9B,MAAM,KAAK,GAAG,CACZ,IAA8B,EAC9B,MAAc,EACd,YAAuB,EACQ,EAAE,CAAC,CAAC;QACnC,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,KAAK,CAAC,WAAW;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,eAAe,EAAE,IAAI,CAAC,WAAW;QACjC,IAAI;QACJ,MAAM;QACN,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC,CAAC;IACH,IACE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC5B,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC,WAAW;QAC1C,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EACpC,CAAC;QACD,OAAO,KAAK,CAAC,0BAA0B,EAAE,iEAAiE,CAAC,CAAC;IAC9G,CAAC;IACD,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC9E,OAAO,KAAK,CACV,mBAAmB,EACnB,kBAAkB,KAAK,CAAC,UAAU,mCAAmC,KAAK,CAAC,kBAAkB,GAAG,CACjG,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,gCAAgC,EAAE,eAAe,KAAK,CAAC,KAAK,mBAAmB,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC,sBAAsB,EAAE,2DAA2D,CAAC,CAAC;IACzH,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CACV,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,EACxE,0BAA0B,IAAI,CAAC,WAAW,gBAAgB,SAAS,CAAC,MAAM,2BAA2B,EACrG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAC5C,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;IACtC,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,yBAAyB,EAAE,GAAG,IAAI,CAAC,WAAW,OAAO,UAAU,CAAC,IAAI,0BAA0B,CAAC,CAAC;IAC/G,CAAC;IACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACzE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CACV,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB,EAChF,GAAG,IAAI,CAAC,WAAW,YAAY,WAAW,CAAC,MAAM,oBAAoB,EACrE,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAA8B,EAAE,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CACrC,CAAC,IAAI,EAA+C,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,mBAAmB,CACzF,EAAE,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,kBAAkB,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC,gCAAgC,EAAE,4DAA4D,CAAC,CAAC;QAC/G,CAAC;QACD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,aAAuD,CAAC;QAC5D,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAC9F,IAAI,MAAM,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC5F,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,KAAK,WAAW,EAAE,CAAC;gBACnD,aAAa,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAoD,EAAE,CAAC;QACpE,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YACrG,IAAI,MAAM,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACnF,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;gBACpD,OAAO,KAAK,CAAC,yBAAyB,EAAE,UAAU,MAAM,CAAC,WAAW,yCAAyC,CAAC,CAAC;YACjH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,0BAA0B,CAC7C,MAAM,CAAC,MAAM,CAAC,eAAe,EAC7B,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,aAAa,CACpB,CAAC;YACF,IAAI,MAAM,IAAI,YAAY;gBAAE,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC5G,OAAO,CAAC,IAAI,CACV;gBACE,SAAS,EAAE,YAAY,CAAC,IAAI;gBAC5B,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;aACvC,EACD;gBACE,SAAS,EAAE,YAAY,CAAC,IAAI;gBAC5B,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;aACrC,CACF,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,MAAM,CAAC,EAAE;YACjB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,SAAS,EAAE;gBACT,OAAO,EAAE,WAAW;gBACpB,UAAU;gBACV,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvC;YACD,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC;YACpD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,KAAK,CAAC,WAAW;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,eAAe,EAAE,IAAI,CAAC,WAAW;QACjC,UAAU;QACV,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,QAAsC;IACvF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAAkC,EAClC,QAAsC,EACtC,KAAoB;IAMpB,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC1D,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB;YAC9F,MAAM,EAAE,aAAa,OAAO,CAAC,SAAS,OAAO,OAAO,CAAC,MAAM,wBAAwB;YACnF,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAC1H,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB;YAClF,MAAM,EAAE,uBAAuB,OAAO,CAAC,WAAW,gBAAgB,OAAO,CAAC,MAAM,2BAA2B;YAC3G,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SACxD,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;IAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;IAChE,MAAM,UAAU,GAAG,iBAAiB,CAAC;QACnC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;QAC7B,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;KAClF,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB;YACrF,MAAM,EAAE,uBAAuB,OAAO,CAAC,WAAW,YAAY,UAAU,CAAC,MAAM,wBAAwB;YACvG,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;SACtG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAE,CAAC,aAAa,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AAClG,CAAC;AAED,SAAS,0BAA0B,CACjC,WAAmB,EACnB,QAAsC,EACtC,KAAoB;IAEpB,OAAO,wBAAwB,CAC7B;QACE,SAAS,EAAE,WAAW;QACtB,WAAW,EAAE,WAAW;QACxB,MAAM,EAAE,UAAU;QAClB,YAAY,EAAE,CAAC,WAAW,CAAC;KAC5B,EACD,QAAQ,EACR,KAAK,CACN,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,KAAoB;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;IAChE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACvD,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;eAC7B,eAAe,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;eAC1D,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CACnF,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,IAAI,CAAC,MAAM;QACX,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QACtC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QACzC,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;KACtC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAsB;IACtD,OAAO;QACL,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,QAAQ;QACf,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;QACxC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC;QAC3C,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;KACxC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAsB;IACrD,IAAI,MAAM,CAAC,UAAU,KAAK,WAAW;QAAE,OAAO,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC;IACrE,IAAI,MAAM,CAAC,UAAU,KAAK,iBAAiB;QAAE,OAAO,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5E,IAAI,MAAM,CAAC,UAAU,KAAK,oBAAoB,IAAI,MAAM,CAAC,UAAU,KAAK,yBAAyB;QAAE,OAAO,aAAa,MAAM,CAAC,IAAI,EAAE,CAAC;IACrI,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9H,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAA4D,MAA4B;IAChH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAa,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,CAAC,KAAkD;IACzE,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,gBAAgB,CAAC,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Bounded, receipt-backed research built from typed deltas over one root plan. */
|
|
2
|
+
import { type ResolvedAnalyticalPlan, type ResolvedAnalyticalPlanDelta } from './resolved-analytical-plan.js';
|
|
3
|
+
import { type ResearchBudget } from './research-loop.js';
|
|
4
|
+
export type ResearchBudgetCounter = 'plannerCalls' | 'sqlExecutions' | 'repairs' | 'narratorCalls';
|
|
5
|
+
export declare class ResearchBudgetExceededError extends Error {
|
|
6
|
+
readonly counter: ResearchBudgetCounter | 'wallClockMs';
|
|
7
|
+
readonly code = "RESEARCH_BUDGET_EXCEEDED";
|
|
8
|
+
constructor(counter: ResearchBudgetCounter | 'wallClockMs');
|
|
9
|
+
}
|
|
10
|
+
export declare class ResearchBudgetController {
|
|
11
|
+
readonly budget: ResearchBudget;
|
|
12
|
+
private readonly now;
|
|
13
|
+
private readonly used;
|
|
14
|
+
private readonly startedAt;
|
|
15
|
+
constructor(budget?: ResearchBudget, now?: () => number);
|
|
16
|
+
consume(counter: ResearchBudgetCounter): void;
|
|
17
|
+
assertWithinDeadline(): void;
|
|
18
|
+
snapshot(): Readonly<typeof this.used & {
|
|
19
|
+
elapsedMs: number;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
export interface TypedResearchBranchInput {
|
|
23
|
+
id: string;
|
|
24
|
+
label: string;
|
|
25
|
+
delta: ResolvedAnalyticalPlanDelta;
|
|
26
|
+
evidenceIds: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface TypedResearchBranch {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
plan: ResolvedAnalyticalPlan;
|
|
32
|
+
evidenceIds: string[];
|
|
33
|
+
}
|
|
34
|
+
export declare function buildTypedResearchBranches(root: ResolvedAnalyticalPlan, inputs: TypedResearchBranchInput[]): TypedResearchBranch[];
|
|
35
|
+
export interface ResearchObservation {
|
|
36
|
+
branchId: string;
|
|
37
|
+
status: 'executed' | 'failed' | 'not_run';
|
|
38
|
+
numericClaims: string[];
|
|
39
|
+
executionReceipt?: {
|
|
40
|
+
sqlFingerprint?: string;
|
|
41
|
+
compiledSqlFingerprint?: string;
|
|
42
|
+
resultFingerprint?: string;
|
|
43
|
+
result?: {
|
|
44
|
+
resultFingerprint?: string;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface ResearchConclusionGate {
|
|
49
|
+
status: 'complete' | 'partial';
|
|
50
|
+
supportedClaimIds: string[];
|
|
51
|
+
unsupportedClaimIds: string[];
|
|
52
|
+
message: string;
|
|
53
|
+
}
|
|
54
|
+
/** Every numeric claim needs a successful execution and a result fingerprint. */
|
|
55
|
+
export declare function gateResearchConclusion(observations: ResearchObservation[]): ResearchConclusionGate;
|
|
56
|
+
//# sourceMappingURL=research-governance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-governance.d.ts","sourceRoot":"","sources":["../src/research-governance.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,eAAe,CAAC;AAEnG,qBAAa,2BAA4B,SAAQ,KAAK;IAExC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa;IADnE,QAAQ,CAAC,IAAI,8BAA8B;gBACtB,OAAO,EAAE,qBAAqB,GAAG,aAAa;CAIpE;AAED,qBAAa,wBAAwB;IAIjC,QAAQ,CAAC,MAAM,EAAE,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuE;IAC5F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAExB,MAAM,GAAE,cAAgC,EAChC,GAAG,GAAE,MAAM,MAAiB;IAK/C,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAO7C,oBAAoB,IAAI,IAAI;IAM5B,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAG/D;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,2BAA2B,CAAC;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,sBAAsB,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAE,wBAAwB,EAAE,GACjC,mBAAmB,EAAE,CAOvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE;YAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACzC,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,mBAAmB,EAAE,GAAG,sBAAsB,CAkBlG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** Bounded, receipt-backed research built from typed deltas over one root plan. */
|
|
2
|
+
import { deriveResolvedAnalyticalPlan, } from './resolved-analytical-plan.js';
|
|
3
|
+
import { RESEARCH_BUDGET } from './research-loop.js';
|
|
4
|
+
export class ResearchBudgetExceededError extends Error {
|
|
5
|
+
counter;
|
|
6
|
+
code = 'RESEARCH_BUDGET_EXCEEDED';
|
|
7
|
+
constructor(counter) {
|
|
8
|
+
super(`Research budget exceeded: ${counter}.`);
|
|
9
|
+
this.counter = counter;
|
|
10
|
+
this.name = 'ResearchBudgetExceededError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ResearchBudgetController {
|
|
14
|
+
budget;
|
|
15
|
+
now;
|
|
16
|
+
used = { plannerCalls: 0, sqlExecutions: 0, repairs: 0, narratorCalls: 0 };
|
|
17
|
+
startedAt;
|
|
18
|
+
constructor(budget = RESEARCH_BUDGET, now = Date.now) {
|
|
19
|
+
this.budget = budget;
|
|
20
|
+
this.now = now;
|
|
21
|
+
this.startedAt = now();
|
|
22
|
+
}
|
|
23
|
+
consume(counter) {
|
|
24
|
+
this.assertWithinDeadline();
|
|
25
|
+
const next = this.used[counter] + 1;
|
|
26
|
+
if (next > this.budget[counter])
|
|
27
|
+
throw new ResearchBudgetExceededError(counter);
|
|
28
|
+
this.used[counter] = next;
|
|
29
|
+
}
|
|
30
|
+
assertWithinDeadline() {
|
|
31
|
+
if (this.now() - this.startedAt > this.budget.wallClockMs) {
|
|
32
|
+
throw new ResearchBudgetExceededError('wallClockMs');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
snapshot() {
|
|
36
|
+
return Object.freeze({ ...this.used, elapsedMs: Math.max(0, this.now() - this.startedAt) });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function buildTypedResearchBranches(root, inputs) {
|
|
40
|
+
return inputs.slice(0, RESEARCH_BUDGET.sqlExecutions).map((input) => ({
|
|
41
|
+
id: input.id,
|
|
42
|
+
label: input.label,
|
|
43
|
+
plan: deriveResolvedAnalyticalPlan(root, input.delta),
|
|
44
|
+
evidenceIds: [...new Set(input.evidenceIds)].sort(),
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
/** Every numeric claim needs a successful execution and a result fingerprint. */
|
|
48
|
+
export function gateResearchConclusion(observations) {
|
|
49
|
+
const supported = [];
|
|
50
|
+
const unsupported = [];
|
|
51
|
+
for (const observation of observations) {
|
|
52
|
+
const hasReceipt = observation.status === 'executed'
|
|
53
|
+
&& Boolean(observation.executionReceipt?.resultFingerprint
|
|
54
|
+
?? observation.executionReceipt?.result?.resultFingerprint);
|
|
55
|
+
for (const claim of observation.numericClaims)
|
|
56
|
+
(hasReceipt ? supported : unsupported).push(claim);
|
|
57
|
+
}
|
|
58
|
+
const status = unsupported.length === 0 ? 'complete' : 'partial';
|
|
59
|
+
return {
|
|
60
|
+
status,
|
|
61
|
+
supportedClaimIds: [...new Set(supported)].sort(),
|
|
62
|
+
unsupportedClaimIds: [...new Set(unsupported)].sort(),
|
|
63
|
+
message: status === 'complete'
|
|
64
|
+
? 'Every numeric research claim is backed by a successful execution receipt.'
|
|
65
|
+
: 'Research evidence is partial; unsupported numeric claims cannot be presented as a completed causal conclusion.',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=research-governance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-governance.js","sourceRoot":"","sources":["../src/research-governance.ts"],"names":[],"mappings":"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"}
|
package/dist/research-loop.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { type AgentAction } from './intent-controller.js';
|
|
|
14
14
|
import type { MetadataAgentIntent } from './metadata/catalog.js';
|
|
15
15
|
import type { KGNode } from './kg/types.js';
|
|
16
16
|
import type { PlanBlock } from './app-planner.js';
|
|
17
|
+
import type { ResolvedAnalyticalPlan } from './resolved-analytical-plan.js';
|
|
17
18
|
/** One ReAct step: a thought, the asset-bound action, and what observing it tells us. */
|
|
18
19
|
export interface ResearchStep {
|
|
19
20
|
thought: string;
|
|
@@ -42,7 +43,18 @@ export interface ResearchPlan {
|
|
|
42
43
|
sources: string[];
|
|
43
44
|
/** True when the question is answerable directly (single step, no research needed). */
|
|
44
45
|
done: boolean;
|
|
46
|
+
/** Root analytical contract reused by every research branch. */
|
|
47
|
+
rootPlanId?: string;
|
|
48
|
+
budget: ResearchBudget;
|
|
45
49
|
}
|
|
50
|
+
export interface ResearchBudget {
|
|
51
|
+
plannerCalls: 1;
|
|
52
|
+
sqlExecutions: 6;
|
|
53
|
+
repairs: 1;
|
|
54
|
+
narratorCalls: 1;
|
|
55
|
+
wallClockMs: 120_000;
|
|
56
|
+
}
|
|
57
|
+
export declare const RESEARCH_BUDGET: ResearchBudget;
|
|
46
58
|
/**
|
|
47
59
|
* Plan how to handle a research / follow-up question. Returns the decision plus a
|
|
48
60
|
* grounded plan: a direct answer, a multi-step research trace, or a follow-up with
|
|
@@ -60,5 +72,7 @@ export declare function planResearch(input: {
|
|
|
60
72
|
}>;
|
|
61
73
|
/** The user explicitly asked to research/dig deeper — don't collapse to a single-step answer. */
|
|
62
74
|
forceInvestigate?: boolean;
|
|
75
|
+
/** Authoritative root plan. When present, research never re-matches meaning. */
|
|
76
|
+
rootPlan?: ResolvedAnalyticalPlan;
|
|
63
77
|
}): Promise<ResearchPlan>;
|
|
64
78
|
//# sourceMappingURL=research-loop.d.ts.map
|