@duckcodeailabs/dql-agent 1.9.4 → 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.
- 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 +59 -1
- package/dist/agent-run-engine.js.map +1 -1
- package/dist/answer-loop.d.ts +34 -1
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +490 -57
- 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 +138 -0
- package/dist/governed-relational-compiler.d.ts.map +1 -0
- package/dist/governed-relational-compiler.js +315 -0
- package/dist/governed-relational-compiler.js.map +1 -0
- package/dist/index.d.ts +13 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -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.map +1 -1
- package/dist/kg/build.js +81 -1
- package/dist/kg/build.js.map +1 -1
- package/dist/meaning-resolution.d.ts +4 -0
- package/dist/meaning-resolution.d.ts.map +1 -1
- package/dist/meaning-resolution.js +14 -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 +34 -6
- package/dist/metadata/analysis-planner.js.map +1 -1
- package/dist/metadata/catalog.d.ts +83 -2
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +381 -28
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/meaning-evidence.d.ts +10 -1
- package/dist/metadata/meaning-evidence.d.ts.map +1 -1
- package/dist/metadata/meaning-evidence.js +78 -1
- package/dist/metadata/meaning-evidence.js.map +1 -1
- package/dist/plan-execution-adapter.d.ts +60 -0
- package/dist/plan-execution-adapter.d.ts.map +1 -0
- package/dist/plan-execution-adapter.js +239 -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 +112 -0
- package/dist/resolved-analytical-plan.d.ts.map +1 -0
- package/dist/resolved-analytical-plan.js +346 -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 +34 -10
- package/dist/router.js.map +1 -1
- package/dist/semantic-bridge/member-select.d.ts +6 -0
- package/dist/semantic-bridge/member-select.d.ts.map +1 -1
- package/dist/semantic-bridge/member-select.js +4 -0
- package/dist/semantic-bridge/member-select.js.map +1 -1
- package/dist/semantic-bridge/query-shape.d.ts +26 -0
- package/dist/semantic-bridge/query-shape.d.ts.map +1 -0
- package/dist/semantic-bridge/query-shape.js +48 -0
- package/dist/semantic-bridge/query-shape.js.map +1 -0
- 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":"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"}
|
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. */
|
package/dist/router.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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;
|