@duckcodeailabs/dql-agent 1.10.0 → 1.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/agent-run-engine.d.ts.map +1 -1
  2. package/dist/agent-run-engine.js +6 -1
  3. package/dist/agent-run-engine.js.map +1 -1
  4. package/dist/analytical-compatibility.d.ts +61 -0
  5. package/dist/analytical-compatibility.d.ts.map +1 -0
  6. package/dist/analytical-compatibility.js +515 -0
  7. package/dist/analytical-compatibility.js.map +1 -0
  8. package/dist/analytical-execution-graph.d.ts +174 -0
  9. package/dist/analytical-execution-graph.d.ts.map +1 -0
  10. package/dist/analytical-execution-graph.js +599 -0
  11. package/dist/analytical-execution-graph.js.map +1 -0
  12. package/dist/analytical-failure-repair.d.ts +91 -0
  13. package/dist/analytical-failure-repair.d.ts.map +1 -0
  14. package/dist/analytical-failure-repair.js +325 -0
  15. package/dist/analytical-failure-repair.js.map +1 -0
  16. package/dist/analytical-frame.d.ts +19 -0
  17. package/dist/analytical-frame.d.ts.map +1 -0
  18. package/dist/analytical-frame.js +299 -0
  19. package/dist/analytical-frame.js.map +1 -0
  20. package/dist/analytical-period-resolution.d.ts +53 -0
  21. package/dist/analytical-period-resolution.d.ts.map +1 -0
  22. package/dist/analytical-period-resolution.js +218 -0
  23. package/dist/analytical-period-resolution.js.map +1 -0
  24. package/dist/analytical-readiness.d.ts +17 -0
  25. package/dist/analytical-readiness.d.ts.map +1 -0
  26. package/dist/analytical-readiness.js +95 -0
  27. package/dist/analytical-readiness.js.map +1 -0
  28. package/dist/analytical-result-facts.d.ts +79 -0
  29. package/dist/analytical-result-facts.d.ts.map +1 -0
  30. package/dist/analytical-result-facts.js +301 -0
  31. package/dist/analytical-result-facts.js.map +1 -0
  32. package/dist/answer-loop.d.ts +51 -4
  33. package/dist/answer-loop.d.ts.map +1 -1
  34. package/dist/answer-loop.js +866 -35
  35. package/dist/answer-loop.js.map +1 -1
  36. package/dist/governed-relational-compiler.d.ts +51 -0
  37. package/dist/governed-relational-compiler.d.ts.map +1 -1
  38. package/dist/governed-relational-compiler.js +144 -1
  39. package/dist/governed-relational-compiler.js.map +1 -1
  40. package/dist/index.d.ts +16 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +9 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/kg/build.d.ts +2 -2
  45. package/dist/kg/build.d.ts.map +1 -1
  46. package/dist/kg/build.js +270 -13
  47. package/dist/kg/build.js.map +1 -1
  48. package/dist/meaning-resolution.d.ts +13 -0
  49. package/dist/meaning-resolution.d.ts.map +1 -1
  50. package/dist/meaning-resolution.js +69 -0
  51. package/dist/meaning-resolution.js.map +1 -1
  52. package/dist/metadata/analysis-planner.js +3 -1
  53. package/dist/metadata/analysis-planner.js.map +1 -1
  54. package/dist/metadata/catalog.d.ts +4 -2
  55. package/dist/metadata/catalog.d.ts.map +1 -1
  56. package/dist/metadata/catalog.js +264 -9
  57. package/dist/metadata/catalog.js.map +1 -1
  58. package/dist/metadata/meaning-evidence.d.ts +9 -2
  59. package/dist/metadata/meaning-evidence.d.ts.map +1 -1
  60. package/dist/metadata/meaning-evidence.js +105 -7
  61. package/dist/metadata/meaning-evidence.js.map +1 -1
  62. package/dist/plan-execution-adapter.d.ts +72 -1
  63. package/dist/plan-execution-adapter.d.ts.map +1 -1
  64. package/dist/plan-execution-adapter.js +208 -0
  65. package/dist/plan-execution-adapter.js.map +1 -1
  66. package/dist/resolved-analytical-plan.d.ts +14 -3
  67. package/dist/resolved-analytical-plan.d.ts.map +1 -1
  68. package/dist/resolved-analytical-plan.js +74 -20
  69. package/dist/resolved-analytical-plan.js.map +1 -1
  70. package/dist/router.d.ts +1 -1
  71. package/dist/router.d.ts.map +1 -1
  72. package/dist/router.js +167 -21
  73. package/dist/router.js.map +1 -1
  74. package/dist/semantic-bridge/compose.d.ts +1 -1
  75. package/dist/semantic-bridge/compose.d.ts.map +1 -1
  76. package/dist/semantic-bridge/compose.js +27 -5
  77. package/dist/semantic-bridge/compose.js.map +1 -1
  78. package/dist/semantic-bridge/member-select.d.ts +1 -1
  79. package/dist/semantic-bridge/member-select.d.ts.map +1 -1
  80. package/dist/semantic-bridge/member-select.js +32 -12
  81. package/dist/semantic-bridge/member-select.js.map +1 -1
  82. package/dist/skills/loader.d.ts +17 -0
  83. package/dist/skills/loader.d.ts.map +1 -1
  84. package/dist/skills/loader.js +62 -4
  85. package/dist/skills/loader.js.map +1 -1
  86. package/package.json +4 -4
@@ -0,0 +1,599 @@
1
+ /**
2
+ * Route-neutral executable graph for a fully resolved RFC 0005 analytical
3
+ * tuple. The graph never searches for members or changes metric meaning. It
4
+ * expresses period aggregation, alignment, exact-decimal arithmetic, ranking,
5
+ * projection, and result validation over IDs already frozen in the plan.
6
+ *
7
+ * Acceptance: AGT-018, AGT-019.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ export function buildAnalyticalExecutionGraph(input) {
11
+ const { plan, capability, route } = input;
12
+ const frame = plan.analyticalFrame;
13
+ if (plan.schemaVersion !== 2 || !frame) {
14
+ return blocked('PLAN_V2_REQUIRED', 'Analytical execution graphs require a resolved v2 plan.');
15
+ }
16
+ if (plan.capability === 'blocked' || plan.missingInformation.length > 0) {
17
+ return blocked('PLAN_BLOCKED', plan.missingInformation.join(' ') || 'The resolved plan is blocked.');
18
+ }
19
+ if (frame.metricConceptIds.length !== 1 || frame.metricConceptIds[0] !== capability.metricId) {
20
+ return blocked('CAPABILITY_MISMATCH', 'The selected capability does not match the plan metric.', 'metricConceptIds');
21
+ }
22
+ const routeCapability = capability.executionCapabilities.find((candidate) => candidate.route === route && (!input.adapterId || candidate.adapterId === input.adapterId));
23
+ if (!routeCapability) {
24
+ return blocked('ROUTE_MISMATCH', `${capability.metricId} does not declare the selected ${route} adapter.`, 'executionCapabilities');
25
+ }
26
+ const requestedOutputIds = frame.requestedOutputs.map((output) => output.id);
27
+ if (requestedOutputIds.length === 0 || new Set(requestedOutputIds).size !== requestedOutputIds.length) {
28
+ return blocked('OUTPUT_CONTRACT_INVALID', 'Requested output IDs must be non-empty and unique.', 'requestedOutputs');
29
+ }
30
+ const groupDimensions = unique(frame.dimensions
31
+ .filter((dimension) => dimension.role === 'group_by'
32
+ || (frame.questionType === 'trend' && dimension.role === 'time_axis'))
33
+ .map((dimension) => dimension.dimensionId));
34
+ const dimensionOutputs = frame.requestedOutputs.filter((output) => output.kind === 'dimension');
35
+ if (dimensionOutputs.length !== groupDimensions.length) {
36
+ return blocked('OUTPUT_CONTRACT_INVALID', 'Every grouping dimension must have exactly one requested dimension output.', 'requestedOutputs');
37
+ }
38
+ const dimensionAliases = groupDimensions.map((dimensionId, index) => ({
39
+ dimensionId,
40
+ outputId: dimensionOutputs[index].id,
41
+ }));
42
+ const memberFilters = frame.memberBindings.map((binding) => ({
43
+ dimensionId: binding.dimensionId,
44
+ canonicalValues: [...binding.canonicalValues],
45
+ }));
46
+ const nodes = [];
47
+ if (route === 'certified') {
48
+ const source = {
49
+ id: 'source:complete_asset',
50
+ kind: 'source_invocation',
51
+ dependencies: [],
52
+ strategy: 'complete_asset',
53
+ route,
54
+ ...(routeCapability.adapterId ? { adapterId: routeCapability.adapterId } : {}),
55
+ metricId: capability.metricId,
56
+ entityGrainIds: [...frame.entityGrainIds],
57
+ groupByDimensionIds: groupDimensions,
58
+ memberFilters,
59
+ outputAliases: {
60
+ dimensions: dimensionAliases,
61
+ completeAssetOutputIds: requestedOutputIds,
62
+ },
63
+ };
64
+ nodes.push(source);
65
+ const validate = validationNode(source.id, requestedOutputIds, frame.entityGrainIds, input.maxRows);
66
+ nodes.push(validate);
67
+ return readyGraph(input, capability, nodes, validate.id);
68
+ }
69
+ const periods = frame.timeContext?.periods ?? [];
70
+ if (frame.timeContext && periods.length === 0) {
71
+ return blocked('PERIOD_CONTRACT_INVALID', 'A time context must contain at least one period.', 'timeContext.periods');
72
+ }
73
+ const periodIds = periods.map((period) => period.id);
74
+ if (new Set(periodIds).size !== periodIds.length) {
75
+ return blocked('PERIOD_CONTRACT_INVALID', 'Period IDs must be unique.', 'timeContext.periods');
76
+ }
77
+ if (periods.some((period) => !period.start || !period.end)) {
78
+ return blocked('PERIOD_BOUNDS_REQUIRED', 'Every executable analytical period must be resolved to start-inclusive and end-exclusive bounds.', 'timeContext.periods');
79
+ }
80
+ if (frame.timeContext &&
81
+ (!frame.timeContext.timeDimensionId ||
82
+ !frame.timeContext.timeRole ||
83
+ !frame.timeContext.grain ||
84
+ !frame.timeContext.calendarId ||
85
+ !frame.timeContext.timezone ||
86
+ !frame.timeContext.completenessPolicy)) {
87
+ return blocked('PERIOD_CONTRACT_INVALID', 'Executable periods require an exact time dimension, role, grain, calendar, timezone, and completeness policy.', 'timeContext');
88
+ }
89
+ const sourcePeriods = periods.length > 0 ? periods : [undefined];
90
+ for (const period of sourcePeriods) {
91
+ const metricOutput = metricOutputForPeriod(frame, period?.id);
92
+ if (!metricOutput) {
93
+ return blocked('OUTPUT_CONTRACT_INVALID', `No unique metric output is declared for ${period ? `period ${period.id}` : 'the aggregate result'}.`, 'requestedOutputs');
94
+ }
95
+ const source = {
96
+ id: `source:${period?.id ?? 'all_time'}`,
97
+ kind: 'source_invocation',
98
+ dependencies: [],
99
+ strategy: 'period_aggregate',
100
+ route,
101
+ ...(routeCapability.adapterId ? { adapterId: routeCapability.adapterId } : {}),
102
+ metricId: capability.metricId,
103
+ entityGrainIds: [...frame.entityGrainIds],
104
+ groupByDimensionIds: groupDimensions,
105
+ memberFilters,
106
+ ...(period && frame.timeContext
107
+ ? {
108
+ period: {
109
+ id: period.id,
110
+ kind: period.kind,
111
+ timeDimensionId: frame.timeContext.timeDimensionId,
112
+ timeRole: frame.timeContext.timeRole,
113
+ grain: frame.timeContext.grain,
114
+ calendarId: frame.timeContext.calendarId,
115
+ timezone: frame.timeContext.timezone,
116
+ completenessPolicy: frame.timeContext.completenessPolicy,
117
+ startInclusive: period.start,
118
+ endExclusive: period.end,
119
+ },
120
+ }
121
+ : {}),
122
+ outputAliases: {
123
+ dimensions: dimensionAliases,
124
+ metric: {
125
+ metricId: capability.metricId,
126
+ ...(period ? { periodId: period.id } : {}),
127
+ outputId: metricOutput.id,
128
+ },
129
+ },
130
+ };
131
+ nodes.push(source);
132
+ }
133
+ let previousNodeId = nodes.at(-1).id;
134
+ if (sourcePeriods.length > 1) {
135
+ if (!frame.comparison?.alignment) {
136
+ return blocked('PERIOD_CONTRACT_INVALID', 'Multiple periods require an explicit comparison alignment.', 'comparison.alignment');
137
+ }
138
+ const align = {
139
+ id: 'align:periods',
140
+ kind: 'align_periods',
141
+ dependencies: nodes
142
+ .filter((node) => node.kind === 'source_invocation')
143
+ .map((node) => node.id),
144
+ keyOutputIds: dimensionAliases.map((item) => item.outputId),
145
+ periodMetricOutputIds: periods.map((period) => ({
146
+ periodId: period.id,
147
+ outputId: metricOutputForPeriod(frame, period.id).id,
148
+ })),
149
+ alignment: frame.comparison.alignment,
150
+ };
151
+ nodes.push(align);
152
+ previousNodeId = align.id;
153
+ }
154
+ if (frame.comparison) {
155
+ const expressions = [];
156
+ const baseOutput = metricOutputForPeriod(frame, frame.comparison.basePeriodId);
157
+ if (!baseOutput) {
158
+ return blocked('OUTPUT_CONTRACT_INVALID', 'The comparison base period has no metric output.', 'comparison.basePeriodId');
159
+ }
160
+ for (const comparisonPeriodId of frame.comparison.comparisonPeriodIds) {
161
+ const comparisonOutput = metricOutputForPeriod(frame, comparisonPeriodId);
162
+ if (!comparisonOutput) {
163
+ return blocked('OUTPUT_CONTRACT_INVALID', `Comparison period ${comparisonPeriodId} has no metric output.`, 'requestedOutputs');
164
+ }
165
+ const deltaOutput = comparisonDerivedOutput(frame, 'delta', comparisonPeriodId);
166
+ const percentOutput = comparisonDerivedOutput(frame, 'percent_delta', comparisonPeriodId);
167
+ if (frame.comparison.outputs.includes('absolute_delta') && !deltaOutput) {
168
+ return blocked('OUTPUT_CONTRACT_INVALID', `Comparison period ${comparisonPeriodId} has no unique delta output.`, 'requestedOutputs');
169
+ }
170
+ if (frame.comparison.outputs.includes('percent_delta') && !percentOutput) {
171
+ return blocked('OUTPUT_CONTRACT_INVALID', `Comparison period ${comparisonPeriodId} has no unique percent-delta output.`, 'requestedOutputs');
172
+ }
173
+ if (deltaOutput) {
174
+ expressions.push({
175
+ outputId: deltaOutput.id,
176
+ kind: 'delta',
177
+ baseOutputId: baseOutput.id,
178
+ comparisonOutputId: comparisonOutput.id,
179
+ zeroDenominatorPolicy: frame.comparison.zeroDenominatorPolicy,
180
+ });
181
+ }
182
+ if (percentOutput) {
183
+ expressions.push({
184
+ outputId: percentOutput.id,
185
+ kind: 'percent_delta',
186
+ baseOutputId: baseOutput.id,
187
+ comparisonOutputId: comparisonOutput.id,
188
+ zeroDenominatorPolicy: frame.comparison.zeroDenominatorPolicy,
189
+ });
190
+ }
191
+ }
192
+ if (expressions.length > 0) {
193
+ const calculate = {
194
+ id: 'calculate:comparison',
195
+ kind: 'calculate_comparison',
196
+ dependencies: [previousNodeId],
197
+ expressions,
198
+ };
199
+ nodes.push(calculate);
200
+ previousNodeId = calculate.id;
201
+ }
202
+ }
203
+ if (frame.ranking) {
204
+ const entityAlias = dimensionAliases.find((item) => item.dimensionId === frame.ranking.entityDimensionId);
205
+ const byOutput = metricOutputForPeriod(frame, frame.ranking.byPeriodId);
206
+ if (!entityAlias || !byOutput) {
207
+ return blocked('RANKING_CONTRACT_INVALID', 'Ranking requires a projected entity dimension and a unique metric output for the ranking period.', 'ranking');
208
+ }
209
+ const rankOutput = frame.requestedOutputs.filter((output) => output.kind === 'rank');
210
+ if (rankOutput.length > 1) {
211
+ return blocked('OUTPUT_CONTRACT_INVALID', 'At most one rank output may be requested.', 'requestedOutputs');
212
+ }
213
+ const rank = {
214
+ id: 'rank:result',
215
+ kind: 'rank',
216
+ dependencies: [previousNodeId],
217
+ entityDimensionId: frame.ranking.entityDimensionId,
218
+ entityOutputId: entityAlias.outputId,
219
+ byMetricId: frame.ranking.byMetricId,
220
+ ...(frame.ranking.byPeriodId ? { byPeriodId: frame.ranking.byPeriodId } : {}),
221
+ byOutputId: byOutput.id,
222
+ direction: frame.ranking.direction,
223
+ limit: frame.ranking.limit,
224
+ tiePolicy: frame.ranking.tiePolicy,
225
+ ...(rankOutput[0] ? { rankOutputId: rankOutput[0].id } : {}),
226
+ };
227
+ nodes.push(rank);
228
+ previousNodeId = rank.id;
229
+ }
230
+ const validate = validationNode(previousNodeId, requestedOutputIds, frame.entityGrainIds, input.maxRows);
231
+ nodes.push(validate);
232
+ return readyGraph(input, capability, nodes, validate.id);
233
+ }
234
+ export function executeAnalyticalExecutionGraph(input) {
235
+ const results = new Map();
236
+ const subReceipts = [];
237
+ let outputColumns = [];
238
+ let rowBound = 0;
239
+ for (const node of input.graph.nodes) {
240
+ if (node.kind === 'source_invocation') {
241
+ const source = input.sourceResults[node.id];
242
+ if (!source)
243
+ return executionFailure('SOURCE_RESULT_MISSING', `No result was supplied for ${node.id}.`, node.id);
244
+ if (!source.receiptFingerprint.trim()) {
245
+ return executionFailure('SUB_RECEIPT_REQUIRED', `Source ${node.id} has no execution receipt fingerprint.`, node.id);
246
+ }
247
+ const expected = node.strategy === 'complete_asset'
248
+ ? node.outputAliases.completeAssetOutputIds ?? []
249
+ : [
250
+ ...node.outputAliases.dimensions.map((item) => item.outputId),
251
+ ...(node.outputAliases.metric ? [node.outputAliases.metric.outputId] : []),
252
+ ];
253
+ const missing = expected.filter((outputId) => !source.columns.includes(outputId));
254
+ if (missing.length > 0) {
255
+ return executionFailure('RESULT_CONTRACT_MISMATCH', `Source ${node.id} is missing required outputs: ${missing.join(', ')}.`, node.id, missing);
256
+ }
257
+ results.set(node.id, source.rows.map((row) => ({ ...row })));
258
+ subReceipts.push({ nodeId: node.id, receiptFingerprint: source.receiptFingerprint });
259
+ continue;
260
+ }
261
+ const dependencyRows = results.get(node.dependencies[0]);
262
+ if (!dependencyRows) {
263
+ return executionFailure('SOURCE_RESULT_MISSING', `Dependency ${node.dependencies[0]} was not produced.`, node.id);
264
+ }
265
+ if (node.kind === 'align_periods') {
266
+ const aligned = alignPeriodRows(node, results);
267
+ if ('failure' in aligned)
268
+ return aligned.failure;
269
+ results.set(node.id, aligned.rows);
270
+ continue;
271
+ }
272
+ if (node.kind === 'calculate_comparison') {
273
+ const calculated = [];
274
+ for (const row of dependencyRows) {
275
+ const next = { ...row };
276
+ for (const expression of node.expressions) {
277
+ const base = parseExactDecimal(row[expression.baseOutputId]);
278
+ const comparison = parseExactDecimal(row[expression.comparisonOutputId]);
279
+ if (!base || !comparison) {
280
+ if (row[expression.baseOutputId] == null || row[expression.comparisonOutputId] == null) {
281
+ next[expression.outputId] = null;
282
+ continue;
283
+ }
284
+ return executionFailure('DECIMAL_VALUE_REQUIRED', `${expression.outputId} requires exact decimal inputs.`, node.id);
285
+ }
286
+ const delta = subtractDecimal(base, comparison);
287
+ if (expression.kind === 'delta') {
288
+ next[expression.outputId] = formatDecimal(delta);
289
+ }
290
+ else if (comparison.coefficient === 0n) {
291
+ next[expression.outputId] = expression.zeroDenominatorPolicy === 'not_applicable' ? 'not_applicable' : null;
292
+ }
293
+ else {
294
+ next[expression.outputId] = percentChange(delta, comparison, input.percentScale ?? 12);
295
+ }
296
+ }
297
+ calculated.push(next);
298
+ }
299
+ results.set(node.id, calculated);
300
+ continue;
301
+ }
302
+ if (node.kind === 'rank') {
303
+ const ranked = rankRows(node, dependencyRows);
304
+ if ('failure' in ranked)
305
+ return ranked.failure;
306
+ results.set(node.id, ranked.rows);
307
+ continue;
308
+ }
309
+ outputColumns = [...node.outputIds];
310
+ rowBound = node.maxRows;
311
+ if (dependencyRows.length > node.maxRows) {
312
+ return executionFailure('ROW_BOUND_EXCEEDED', `Result returned ${dependencyRows.length} rows, above the ${node.maxRows} row contract.`, node.id);
313
+ }
314
+ const missing = node.outputIds.filter((outputId) => dependencyRows.some((row) => !Object.prototype.hasOwnProperty.call(row, outputId)));
315
+ if (missing.length > 0) {
316
+ return executionFailure('RESULT_CONTRACT_MISMATCH', `Terminal result is missing required outputs: ${missing.join(', ')}.`, node.id, missing);
317
+ }
318
+ results.set(node.id, dependencyRows.map((row) => Object.fromEntries(node.outputIds.map((outputId) => [outputId, row[outputId]]))));
319
+ }
320
+ const rows = results.get(input.graph.terminalNodeId);
321
+ if (!rows)
322
+ return executionFailure('SOURCE_RESULT_MISSING', 'The terminal graph node produced no result.', input.graph.terminalNodeId);
323
+ const resultFingerprint = hash(stableStringify({ columns: outputColumns, rows }));
324
+ const receiptPayload = {
325
+ version: 1,
326
+ graphId: input.graph.graphId,
327
+ graphFingerprint: input.graph.fingerprint,
328
+ planId: input.graph.planId,
329
+ planFingerprint: input.graph.planFingerprint,
330
+ snapshotId: input.graph.snapshotId,
331
+ route: input.graph.route,
332
+ trustState: trustForRoute(input.graph.route),
333
+ subReceipts: subReceipts.sort((left, right) => left.nodeId.localeCompare(right.nodeId)),
334
+ outputColumns,
335
+ rowCount: rows.length,
336
+ rowBound,
337
+ resultFingerprint,
338
+ };
339
+ return {
340
+ status: 'completed',
341
+ columns: outputColumns,
342
+ rows,
343
+ receipt: {
344
+ ...receiptPayload,
345
+ receiptId: `analytical-receipt:${hash(stableStringify(receiptPayload)).slice(0, 24)}`,
346
+ },
347
+ };
348
+ }
349
+ function alignPeriodRows(node, results) {
350
+ const aligned = new Map();
351
+ for (const dependency of node.dependencies) {
352
+ const rows = results.get(dependency);
353
+ if (!rows)
354
+ return { failure: executionFailure('SOURCE_RESULT_MISSING', `Dependency ${dependency} was not produced.`, node.id) };
355
+ for (const row of rows) {
356
+ const missingKeys = node.keyOutputIds.filter((key) => !Object.prototype.hasOwnProperty.call(row, key));
357
+ if (missingKeys.length > 0) {
358
+ return {
359
+ failure: executionFailure('RESULT_CONTRACT_MISMATCH', `Alignment input ${dependency} is missing keys: ${missingKeys.join(', ')}.`, node.id, missingKeys),
360
+ };
361
+ }
362
+ const key = stableStringify(node.keyOutputIds.map((outputId) => row[outputId]));
363
+ const existing = aligned.get(key) ?? Object.fromEntries(node.keyOutputIds.map((outputId) => [outputId, row[outputId]]));
364
+ const metricOutput = node.periodMetricOutputIds.find((item) => Object.prototype.hasOwnProperty.call(row, item.outputId));
365
+ if (!metricOutput) {
366
+ return {
367
+ failure: executionFailure('RESULT_CONTRACT_MISMATCH', `Alignment input ${dependency} has no declared period metric output.`, node.id),
368
+ };
369
+ }
370
+ if (Object.prototype.hasOwnProperty.call(existing, metricOutput.outputId)) {
371
+ return {
372
+ failure: executionFailure('RESULT_CONTRACT_MISMATCH', `Alignment input ${dependency} contains duplicate entity keys.`, node.id),
373
+ };
374
+ }
375
+ existing[metricOutput.outputId] = row[metricOutput.outputId];
376
+ aligned.set(key, existing);
377
+ }
378
+ }
379
+ const rows = [...aligned.entries()]
380
+ .sort(([left], [right]) => left.localeCompare(right))
381
+ .map(([, row]) => {
382
+ const completed = { ...row };
383
+ for (const output of node.periodMetricOutputIds)
384
+ completed[output.outputId] ??= null;
385
+ return completed;
386
+ });
387
+ return { rows };
388
+ }
389
+ function rankRows(node, inputRows) {
390
+ const rows = inputRows.map((row) => ({ ...row }));
391
+ const parsed = new Map();
392
+ for (const row of rows) {
393
+ const value = parseExactDecimal(row[node.byOutputId]);
394
+ if (!value) {
395
+ return {
396
+ failure: executionFailure('DECIMAL_VALUE_REQUIRED', `Ranking output ${node.byOutputId} must be numeric.`, node.id),
397
+ };
398
+ }
399
+ parsed.set(row, value);
400
+ }
401
+ rows.sort((left, right) => {
402
+ const compared = compareDecimal(parsed.get(left), parsed.get(right));
403
+ if (compared !== 0)
404
+ return node.direction === 'desc' ? -compared : compared;
405
+ return stableStringify(left[node.entityOutputId]).localeCompare(stableStringify(right[node.entityOutputId]));
406
+ });
407
+ let selected = rows.slice(0, node.limit);
408
+ if (node.tiePolicy === 'include_ties' && rows.length > node.limit && node.limit > 0) {
409
+ const cutoff = parsed.get(rows[node.limit - 1]);
410
+ selected = rows.filter((row, index) => index < node.limit || compareDecimal(parsed.get(row), cutoff) === 0);
411
+ }
412
+ if (node.rankOutputId) {
413
+ let last;
414
+ let lastRank = 0;
415
+ selected.forEach((row, index) => {
416
+ const value = parsed.get(row);
417
+ if (node.tiePolicy === 'include_ties' && last && compareDecimal(last, value) === 0) {
418
+ row[node.rankOutputId] = lastRank;
419
+ }
420
+ else {
421
+ lastRank = index + 1;
422
+ row[node.rankOutputId] = lastRank;
423
+ }
424
+ last = value;
425
+ });
426
+ }
427
+ return { rows: selected };
428
+ }
429
+ function metricOutputForPeriod(frame, periodId) {
430
+ const metrics = frame.requestedOutputs.filter((output) => output.kind === 'metric_value' &&
431
+ output.metricId === frame.metricConceptIds[0] &&
432
+ (periodId ? output.periodId === periodId : output.periodId === undefined));
433
+ if (metrics.length === 1)
434
+ return metrics[0];
435
+ if (!periodId) {
436
+ const allMetricOutputs = frame.requestedOutputs.filter((output) => output.kind === 'metric_value' && output.metricId === frame.metricConceptIds[0]);
437
+ return allMetricOutputs.length === 1 ? allMetricOutputs[0] : undefined;
438
+ }
439
+ return undefined;
440
+ }
441
+ function comparisonDerivedOutput(frame, kind, comparisonPeriodId) {
442
+ const outputs = frame.requestedOutputs.filter((output) => output.kind === kind && output.metricId === frame.metricConceptIds[0]);
443
+ const exact = outputs.filter((output) => output.periodId === comparisonPeriodId);
444
+ if (exact.length === 1)
445
+ return exact[0];
446
+ return outputs.length === 1 && !outputs[0].periodId ? outputs[0] : undefined;
447
+ }
448
+ function validationNode(dependency, outputIds, entityGrainIds, maxRows = 10_000) {
449
+ return {
450
+ id: 'validate:result_contract',
451
+ kind: 'project_validate',
452
+ dependencies: [dependency],
453
+ outputIds: [...outputIds],
454
+ entityGrainIds: [...entityGrainIds],
455
+ maxRows: Math.min(Math.max(1, maxRows), 100_000),
456
+ };
457
+ }
458
+ function readyGraph(input, capability, nodes, terminalNodeId) {
459
+ const payload = {
460
+ schemaVersion: 1,
461
+ planId: input.plan.planId,
462
+ planFingerprint: input.plan.fingerprint,
463
+ snapshotId: input.plan.snapshotId,
464
+ route: input.route,
465
+ ...(input.adapterId ? { adapterId: input.adapterId } : {}),
466
+ fitClass: input.fitClass ?? 'exact',
467
+ metricId: capability.metricId,
468
+ capabilityFingerprint: capability.sourceFingerprint,
469
+ nodes,
470
+ terminalNodeId,
471
+ };
472
+ const fingerprint = hash(stableStringify(payload));
473
+ return {
474
+ status: 'ready',
475
+ graph: deepFreeze({
476
+ ...payload,
477
+ graphId: `analytical-graph:${fingerprint.slice(0, 24)}`,
478
+ fingerprint,
479
+ }),
480
+ };
481
+ }
482
+ function blocked(code, reason, field) {
483
+ return { status: 'blocked', code, reason, ...(field ? { field } : {}) };
484
+ }
485
+ function executionFailure(code, reason, nodeId, missingOutputIds) {
486
+ return { status: 'failed', code, reason, nodeId, ...(missingOutputIds?.length ? { missingOutputIds } : {}) };
487
+ }
488
+ function parseExactDecimal(value) {
489
+ if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'bigint')
490
+ return undefined;
491
+ if (typeof value === 'number' && !Number.isFinite(value))
492
+ return undefined;
493
+ const expanded = expandExponent(String(value).trim());
494
+ const match = /^([+-]?)(\d+)(?:\.(\d+))?$/.exec(expanded);
495
+ if (!match)
496
+ return undefined;
497
+ const fraction = match[3] ?? '';
498
+ const sign = match[1] === '-' ? -1n : 1n;
499
+ return normalizeDecimal({ coefficient: sign * BigInt(`${match[2]}${fraction}`), scale: fraction.length });
500
+ }
501
+ function expandExponent(value) {
502
+ const match = /^([+-]?)(\d+)(?:\.(\d*))?[eE]([+-]?\d+)$/.exec(value);
503
+ if (!match)
504
+ return value;
505
+ const sign = match[1] ?? '';
506
+ const integer = match[2];
507
+ const fraction = match[3] ?? '';
508
+ const exponent = Number(match[4]);
509
+ const digits = `${integer}${fraction}`;
510
+ const decimalIndex = integer.length + exponent;
511
+ if (decimalIndex <= 0)
512
+ return `${sign}0.${'0'.repeat(-decimalIndex)}${digits}`;
513
+ if (decimalIndex >= digits.length)
514
+ return `${sign}${digits}${'0'.repeat(decimalIndex - digits.length)}`;
515
+ return `${sign}${digits.slice(0, decimalIndex)}.${digits.slice(decimalIndex)}`;
516
+ }
517
+ function normalizeDecimal(value) {
518
+ let { coefficient, scale } = value;
519
+ while (scale > 0 && coefficient % 10n === 0n) {
520
+ coefficient /= 10n;
521
+ scale -= 1;
522
+ }
523
+ return { coefficient, scale };
524
+ }
525
+ function subtractDecimal(left, right) {
526
+ const scale = Math.max(left.scale, right.scale);
527
+ return normalizeDecimal({
528
+ coefficient: left.coefficient * pow10(scale - left.scale) -
529
+ right.coefficient * pow10(scale - right.scale),
530
+ scale,
531
+ });
532
+ }
533
+ function compareDecimal(left, right) {
534
+ const scale = Math.max(left.scale, right.scale);
535
+ const leftValue = left.coefficient * pow10(scale - left.scale);
536
+ const rightValue = right.coefficient * pow10(scale - right.scale);
537
+ return leftValue < rightValue ? -1 : leftValue > rightValue ? 1 : 0;
538
+ }
539
+ function percentChange(delta, denominator, scale) {
540
+ const safeScale = Math.min(Math.max(0, scale), 18);
541
+ const numerator = delta.coefficient * 100n * pow10(denominator.scale + safeScale);
542
+ const divisor = denominator.coefficient * pow10(delta.scale);
543
+ let quotient = numerator / divisor;
544
+ const remainder = numerator % divisor;
545
+ if (abs(remainder) * 2n >= abs(divisor)) {
546
+ quotient += (numerator < 0n) !== (divisor < 0n) ? -1n : 1n;
547
+ }
548
+ return formatDecimal(normalizeDecimal({ coefficient: quotient, scale: safeScale }));
549
+ }
550
+ function formatDecimal(value) {
551
+ const sign = value.coefficient < 0n ? '-' : '';
552
+ const digits = abs(value.coefficient).toString().padStart(value.scale + 1, '0');
553
+ if (value.scale === 0)
554
+ return `${sign}${digits}`;
555
+ return `${sign}${digits.slice(0, -value.scale)}.${digits.slice(-value.scale)}`;
556
+ }
557
+ function pow10(exponent) {
558
+ return 10n ** BigInt(exponent);
559
+ }
560
+ function abs(value) {
561
+ return value < 0n ? -value : value;
562
+ }
563
+ function trustForRoute(route) {
564
+ if (route === 'certified')
565
+ return 'certified';
566
+ if (route === 'semantic' || route === 'governed_sql')
567
+ return 'governed';
568
+ return 'review_required';
569
+ }
570
+ function unique(values) {
571
+ return [...new Set(values)];
572
+ }
573
+ function hash(value) {
574
+ return createHash('sha256').update(value).digest('hex');
575
+ }
576
+ function stableStringify(value) {
577
+ if (value === undefined || value === null)
578
+ return 'null';
579
+ if (typeof value === 'bigint')
580
+ return JSON.stringify(value.toString());
581
+ if (typeof value !== 'object')
582
+ return JSON.stringify(value);
583
+ if (Array.isArray(value))
584
+ return `[${value.map(stableStringify).join(',')}]`;
585
+ const record = value;
586
+ return `{${Object.keys(record)
587
+ .sort()
588
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
589
+ .join(',')}}`;
590
+ }
591
+ function deepFreeze(value) {
592
+ if (value && typeof value === 'object' && !Object.isFrozen(value)) {
593
+ Object.freeze(value);
594
+ for (const nested of Object.values(value))
595
+ deepFreeze(nested);
596
+ }
597
+ return value;
598
+ }
599
+ //# sourceMappingURL=analytical-execution-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytical-execution-graph.js","sourceRoot":"","sources":["../src/analytical-execution-graph.ts"],"names":[],"mappings":"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"}