@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.
- package/dist/agent-run-engine.d.ts.map +1 -1
- package/dist/agent-run-engine.js +6 -1
- 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 +51 -4
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +866 -35
- package/dist/answer-loop.js.map +1 -1
- package/dist/governed-relational-compiler.d.ts +51 -0
- package/dist/governed-relational-compiler.d.ts.map +1 -1
- package/dist/governed-relational-compiler.js +144 -1
- package/dist/governed-relational-compiler.js.map +1 -1
- package/dist/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.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 +270 -13
- package/dist/kg/build.js.map +1 -1
- package/dist/meaning-resolution.d.ts +13 -0
- package/dist/meaning-resolution.d.ts.map +1 -1
- package/dist/meaning-resolution.js +69 -0
- package/dist/meaning-resolution.js.map +1 -1
- package/dist/metadata/analysis-planner.js +3 -1
- package/dist/metadata/analysis-planner.js.map +1 -1
- package/dist/metadata/catalog.d.ts +4 -2
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +264 -9
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/meaning-evidence.d.ts +9 -2
- package/dist/metadata/meaning-evidence.d.ts.map +1 -1
- package/dist/metadata/meaning-evidence.js +105 -7
- package/dist/metadata/meaning-evidence.js.map +1 -1
- package/dist/plan-execution-adapter.d.ts +72 -1
- package/dist/plan-execution-adapter.d.ts.map +1 -1
- package/dist/plan-execution-adapter.js +208 -0
- package/dist/plan-execution-adapter.js.map +1 -1
- package/dist/resolved-analytical-plan.d.ts +14 -3
- package/dist/resolved-analytical-plan.d.ts.map +1 -1
- package/dist/resolved-analytical-plan.js +74 -20
- package/dist/resolved-analytical-plan.js.map +1 -1
- package/dist/router.d.ts +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +167 -21
- package/dist/router.js.map +1 -1
- package/dist/semantic-bridge/compose.d.ts +1 -1
- package/dist/semantic-bridge/compose.d.ts.map +1 -1
- package/dist/semantic-bridge/compose.js +27 -5
- package/dist/semantic-bridge/compose.js.map +1 -1
- package/dist/semantic-bridge/member-select.d.ts +1 -1
- package/dist/semantic-bridge/member-select.d.ts.map +1 -1
- package/dist/semantic-bridge/member-select.js +32 -12
- package/dist/semantic-bridge/member-select.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,95 @@
|
|
|
1
|
+
/** Deterministic capability-readiness projection for modeling and diagnostics. */
|
|
2
|
+
import { normalizeMetricCapabilityContract } from '@duckcodeailabs/dql-core';
|
|
3
|
+
/**
|
|
4
|
+
* Explain what each retrieved metric/certified asset can answer before route
|
|
5
|
+
* selection. This is a diagnostic report only and grants no capability.
|
|
6
|
+
*
|
|
7
|
+
* Acceptance: CONTRACT-002, SKILL-004.
|
|
8
|
+
*/
|
|
9
|
+
export function buildAnalyticalCapabilityReadiness(candidates) {
|
|
10
|
+
return candidates
|
|
11
|
+
.filter((candidate) => candidate.kind === 'semantic_metric' || candidate.kind === 'certified_block')
|
|
12
|
+
.map((candidate) => {
|
|
13
|
+
const candidateId = candidate.qualifiedId ?? candidate.id;
|
|
14
|
+
const capability = normalizeMetricCapabilityContract(candidate.analyticalCapability);
|
|
15
|
+
if (!capability) {
|
|
16
|
+
const reasons = ['No complete normalized MetricCapabilityContract is present in the active snapshot.'];
|
|
17
|
+
return {
|
|
18
|
+
candidateId,
|
|
19
|
+
status: 'incomplete',
|
|
20
|
+
support: {
|
|
21
|
+
scalar: false,
|
|
22
|
+
filter: false,
|
|
23
|
+
grouping: false,
|
|
24
|
+
trend: false,
|
|
25
|
+
comparison: false,
|
|
26
|
+
ranking: false,
|
|
27
|
+
},
|
|
28
|
+
blockers: {
|
|
29
|
+
scalar: reasons,
|
|
30
|
+
filter: reasons,
|
|
31
|
+
grouping: reasons,
|
|
32
|
+
trend: reasons,
|
|
33
|
+
comparison: reasons,
|
|
34
|
+
ranking: reasons,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const hasRoute = capability.executionCapabilities.length > 0;
|
|
39
|
+
const outputKinds = new Set(capability.supportedOutputKinds);
|
|
40
|
+
const operations = new Set(capability.operations);
|
|
41
|
+
const filterDimension = capability.dimensions.some((dimension) => dimension.supportedRoles.includes('filter'));
|
|
42
|
+
const groupDimension = capability.dimensions.some((dimension) => dimension.supportedRoles.includes('group_by'));
|
|
43
|
+
const rankDimension = capability.dimensions.some((dimension) => dimension.supportedRoles.includes('rank_entity'));
|
|
44
|
+
const checks = {
|
|
45
|
+
scalar: [
|
|
46
|
+
[hasRoute, 'No execution adapter is declared.'],
|
|
47
|
+
[outputKinds.has('metric_value'), 'Metric-value output is not declared.'],
|
|
48
|
+
[Boolean(capability.defaultResultGrainId), 'No default result grain is declared.'],
|
|
49
|
+
],
|
|
50
|
+
filter: [
|
|
51
|
+
[hasRoute, 'No execution adapter is declared.'],
|
|
52
|
+
[operations.has('filter'), 'Filter operation is not supported.'],
|
|
53
|
+
[filterDimension, 'No dimension supports the filter role.'],
|
|
54
|
+
],
|
|
55
|
+
grouping: [
|
|
56
|
+
[hasRoute, 'No execution adapter is declared.'],
|
|
57
|
+
[operations.has('group'), 'Group operation is not supported.'],
|
|
58
|
+
[groupDimension, 'No dimension supports the group_by role.'],
|
|
59
|
+
[outputKinds.has('dimension'), 'Dimension output is not declared.'],
|
|
60
|
+
],
|
|
61
|
+
trend: [
|
|
62
|
+
[hasRoute, 'No execution adapter is declared.'],
|
|
63
|
+
[operations.has('trend'), 'Trend operation is not supported.'],
|
|
64
|
+
[capability.timeDimensions.length > 0, 'No time dimension is declared.'],
|
|
65
|
+
],
|
|
66
|
+
comparison: [
|
|
67
|
+
[hasRoute, 'No execution adapter is declared.'],
|
|
68
|
+
[operations.has('compare'), 'Comparison operation is not supported.'],
|
|
69
|
+
[capability.timeDimensions.length > 0, 'No time dimension is declared.'],
|
|
70
|
+
[outputKinds.has('delta') || outputKinds.has('percent_delta'), 'No comparison output is declared.'],
|
|
71
|
+
],
|
|
72
|
+
ranking: [
|
|
73
|
+
[hasRoute, 'No execution adapter is declared.'],
|
|
74
|
+
[operations.has('rank'), 'Rank operation is not supported.'],
|
|
75
|
+
[operations.has('group'), 'Ranking requires post-aggregation grouping support.'],
|
|
76
|
+
[rankDimension, 'No dimension supports the rank_entity role.'],
|
|
77
|
+
[outputKinds.has('rank'), 'Rank output is not declared.'],
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
const support = Object.fromEntries(Object.entries(checks).map(([question, values]) => [question, values.every(([ok]) => ok)]));
|
|
81
|
+
const blockers = Object.fromEntries(Object.entries(checks).flatMap(([question, values]) => {
|
|
82
|
+
const reasons = values.filter(([ok]) => !ok).map(([, reason]) => reason);
|
|
83
|
+
return reasons.length > 0 ? [[question, reasons]] : [];
|
|
84
|
+
}));
|
|
85
|
+
return {
|
|
86
|
+
candidateId,
|
|
87
|
+
metricId: capability.metricId,
|
|
88
|
+
status: 'complete',
|
|
89
|
+
support,
|
|
90
|
+
blockers,
|
|
91
|
+
};
|
|
92
|
+
})
|
|
93
|
+
.sort((left, right) => left.candidateId.localeCompare(right.candidateId));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=analytical-readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytical-readiness.js","sourceRoot":"","sources":["../src/analytical-readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic result facts and narration guards for RFC 0005. Numeric claims
|
|
3
|
+
* are copied only from validated graph outputs and every fact is bound to the
|
|
4
|
+
* terminal receipt. No causal explanation is inferred from analytical rows.
|
|
5
|
+
*
|
|
6
|
+
* Acceptance: AGT-020.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnalyticalQuestionFrameV2 } from '@duckcodeailabs/dql-core';
|
|
9
|
+
import type { AnalyticalExecutionGraphV1, AnalyticalExecutionReceiptV1 } from './analytical-execution-graph.js';
|
|
10
|
+
export type AnalyticalResultFactKind = 'scope' | 'metric_value' | 'delta' | 'percent_delta' | 'rank' | 'freshness' | 'caveat';
|
|
11
|
+
export interface AnalyticalResultFactV1 {
|
|
12
|
+
factId: string;
|
|
13
|
+
kind: AnalyticalResultFactKind;
|
|
14
|
+
receiptId: string;
|
|
15
|
+
graphFingerprint: string;
|
|
16
|
+
resultFingerprint: string;
|
|
17
|
+
outputIds: string[];
|
|
18
|
+
rowIndex?: number;
|
|
19
|
+
periodId?: string;
|
|
20
|
+
value?: unknown;
|
|
21
|
+
coordinates?: Record<string, unknown>;
|
|
22
|
+
code?: 'PARTIAL_CURRENT_PERIOD' | 'LATEST_COMPLETE_PERIOD' | 'MISSING_COMPARISON_VALUE' | 'ZERO_COMPARISON_DENOMINATOR';
|
|
23
|
+
details?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export interface AnalyticalResultFactSetV1 {
|
|
26
|
+
version: 1;
|
|
27
|
+
factSetId: string;
|
|
28
|
+
planId: string;
|
|
29
|
+
graphId: string;
|
|
30
|
+
graphFingerprint: string;
|
|
31
|
+
receiptId: string;
|
|
32
|
+
resultFingerprint: string;
|
|
33
|
+
facts: AnalyticalResultFactV1[];
|
|
34
|
+
}
|
|
35
|
+
export type BuildAnalyticalResultFactsResult = {
|
|
36
|
+
status: 'ready';
|
|
37
|
+
factSet: AnalyticalResultFactSetV1;
|
|
38
|
+
} | {
|
|
39
|
+
status: 'blocked';
|
|
40
|
+
code: 'RECEIPT_MISMATCH' | 'RESULT_CONTRACT_MISMATCH';
|
|
41
|
+
reason: string;
|
|
42
|
+
};
|
|
43
|
+
export interface AnalyticalNarrativeClaimV1 {
|
|
44
|
+
claimId: string;
|
|
45
|
+
factIds: string[];
|
|
46
|
+
text: string;
|
|
47
|
+
}
|
|
48
|
+
export interface AnalyticalNarrativeV1 {
|
|
49
|
+
version: 1;
|
|
50
|
+
factSetId: string;
|
|
51
|
+
text: string;
|
|
52
|
+
claims: AnalyticalNarrativeClaimV1[];
|
|
53
|
+
}
|
|
54
|
+
export type AnalyticalNarrativeValidationResult = {
|
|
55
|
+
status: 'valid';
|
|
56
|
+
citedFactIds: string[];
|
|
57
|
+
} | {
|
|
58
|
+
status: 'invalid';
|
|
59
|
+
code: 'UNKNOWN_FACT' | 'UNSUPPORTED_NUMBER' | 'CAUSAL_CLAIM' | 'MATERIAL_CAVEAT_HIDDEN';
|
|
60
|
+
reason: string;
|
|
61
|
+
claimId?: string;
|
|
62
|
+
};
|
|
63
|
+
export declare function buildAnalyticalResultFacts(input: {
|
|
64
|
+
frame: AnalyticalQuestionFrameV2;
|
|
65
|
+
graph: AnalyticalExecutionGraphV1;
|
|
66
|
+
receipt: AnalyticalExecutionReceiptV1;
|
|
67
|
+
columns: string[];
|
|
68
|
+
rows: Array<Record<string, unknown>>;
|
|
69
|
+
}): BuildAnalyticalResultFactsResult;
|
|
70
|
+
export declare function renderDeterministicAnalyticalNarrative(input: {
|
|
71
|
+
frame: AnalyticalQuestionFrameV2;
|
|
72
|
+
factSet: AnalyticalResultFactSetV1;
|
|
73
|
+
maxRows?: number;
|
|
74
|
+
}): AnalyticalNarrativeV1;
|
|
75
|
+
export declare function validateAnalyticalNarrativeClaims(input: {
|
|
76
|
+
factSet: AnalyticalResultFactSetV1;
|
|
77
|
+
claims: AnalyticalNarrativeClaimV1[];
|
|
78
|
+
}): AnalyticalNarrativeValidationResult;
|
|
79
|
+
//# sourceMappingURL=analytical-result-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytical-result-facts.d.ts","sourceRoot":"","sources":["../src/analytical-result-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic result facts and narration guards for RFC 0005. Numeric claims
|
|
3
|
+
* are copied only from validated graph outputs and every fact is bound to the
|
|
4
|
+
* terminal receipt. No causal explanation is inferred from analytical rows.
|
|
5
|
+
*
|
|
6
|
+
* Acceptance: AGT-020.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
export function buildAnalyticalResultFacts(input) {
|
|
10
|
+
const { frame, graph, receipt } = input;
|
|
11
|
+
if (receipt.graphId !== graph.graphId ||
|
|
12
|
+
receipt.graphFingerprint !== graph.fingerprint ||
|
|
13
|
+
receipt.planId !== graph.planId ||
|
|
14
|
+
receipt.planFingerprint !== graph.planFingerprint) {
|
|
15
|
+
return {
|
|
16
|
+
status: 'blocked',
|
|
17
|
+
code: 'RECEIPT_MISMATCH',
|
|
18
|
+
reason: 'The result receipt does not bind the supplied graph and plan.',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const expected = frame.requestedOutputs.map((output) => output.id);
|
|
22
|
+
if (input.columns.length !== expected.length ||
|
|
23
|
+
expected.some((outputId, index) => input.columns[index] !== outputId) ||
|
|
24
|
+
input.rows.length !== receipt.rowCount ||
|
|
25
|
+
input.rows.some((row) => expected.some((outputId) => !Object.prototype.hasOwnProperty.call(row, outputId)))) {
|
|
26
|
+
return {
|
|
27
|
+
status: 'blocked',
|
|
28
|
+
code: 'RESULT_CONTRACT_MISMATCH',
|
|
29
|
+
reason: 'The validated rows do not match the frame output order or receipt row count.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const dimensionOutputs = frame.requestedOutputs.filter((output) => output.kind === 'dimension');
|
|
33
|
+
const facts = [];
|
|
34
|
+
facts.push(makeFact(receipt, {
|
|
35
|
+
kind: 'scope',
|
|
36
|
+
outputIds: dimensionOutputs.map((output) => output.id),
|
|
37
|
+
details: {
|
|
38
|
+
entityGrainIds: [...frame.entityGrainIds],
|
|
39
|
+
dimensions: frame.dimensions.map((dimension) => ({ ...dimension })),
|
|
40
|
+
memberBindings: frame.memberBindings.map((binding) => ({
|
|
41
|
+
...binding,
|
|
42
|
+
canonicalValues: [...binding.canonicalValues],
|
|
43
|
+
})),
|
|
44
|
+
},
|
|
45
|
+
}));
|
|
46
|
+
input.rows.forEach((row, rowIndex) => {
|
|
47
|
+
const coordinates = Object.fromEntries(dimensionOutputs.map((output) => [output.id, row[output.id]]));
|
|
48
|
+
for (const output of frame.requestedOutputs) {
|
|
49
|
+
if (output.kind === 'dimension')
|
|
50
|
+
continue;
|
|
51
|
+
facts.push(makeFact(receipt, {
|
|
52
|
+
kind: output.kind,
|
|
53
|
+
outputIds: [output.id],
|
|
54
|
+
rowIndex,
|
|
55
|
+
...(output.periodId ? { periodId: output.periodId } : {}),
|
|
56
|
+
value: row[output.id],
|
|
57
|
+
...(dimensionOutputs.length ? { coordinates } : {}),
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
if (frame.comparison) {
|
|
61
|
+
for (const periodId of frame.comparison.comparisonPeriodIds) {
|
|
62
|
+
const comparisonOutput = frame.requestedOutputs.find((output) => output.kind === 'metric_value' && output.periodId === periodId);
|
|
63
|
+
if (comparisonOutput && row[comparisonOutput.id] == null) {
|
|
64
|
+
facts.push(makeFact(receipt, {
|
|
65
|
+
kind: 'caveat',
|
|
66
|
+
code: 'MISSING_COMPARISON_VALUE',
|
|
67
|
+
outputIds: [comparisonOutput.id],
|
|
68
|
+
rowIndex,
|
|
69
|
+
periodId,
|
|
70
|
+
...(dimensionOutputs.length ? { coordinates } : {}),
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
const percentOutput = frame.requestedOutputs.find((output) => output.kind === 'percent_delta');
|
|
74
|
+
if (comparisonOutput && percentOutput && isExactZero(row[comparisonOutput.id]) && row[percentOutput.id] == null) {
|
|
75
|
+
facts.push(makeFact(receipt, {
|
|
76
|
+
kind: 'caveat',
|
|
77
|
+
code: 'ZERO_COMPARISON_DENOMINATOR',
|
|
78
|
+
outputIds: [comparisonOutput.id, percentOutput.id],
|
|
79
|
+
rowIndex,
|
|
80
|
+
periodId,
|
|
81
|
+
...(dimensionOutputs.length ? { coordinates } : {}),
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
if (frame.timeContext) {
|
|
88
|
+
for (const period of frame.timeContext.periods) {
|
|
89
|
+
facts.push(makeFact(receipt, {
|
|
90
|
+
kind: 'freshness',
|
|
91
|
+
outputIds: frame.requestedOutputs
|
|
92
|
+
.filter((output) => output.periodId === period.id)
|
|
93
|
+
.map((output) => output.id),
|
|
94
|
+
periodId: period.id,
|
|
95
|
+
value: period.end,
|
|
96
|
+
details: {
|
|
97
|
+
startInclusive: period.start,
|
|
98
|
+
endExclusive: period.end,
|
|
99
|
+
timeDimensionId: frame.timeContext.timeDimensionId,
|
|
100
|
+
timeRole: frame.timeContext.timeRole,
|
|
101
|
+
calendarId: frame.timeContext.calendarId,
|
|
102
|
+
timezone: frame.timeContext.timezone,
|
|
103
|
+
grain: frame.timeContext.grain,
|
|
104
|
+
completenessPolicy: frame.timeContext.completenessPolicy,
|
|
105
|
+
},
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
if (frame.timeContext.completenessPolicy === 'partial_current') {
|
|
109
|
+
facts.push(makeFact(receipt, {
|
|
110
|
+
kind: 'caveat',
|
|
111
|
+
code: 'PARTIAL_CURRENT_PERIOD',
|
|
112
|
+
outputIds: frame.requestedOutputs.filter((output) => output.periodId === frame.comparison?.basePeriodId || output.periodId === frame.timeContext?.periods[0]?.id).map((output) => output.id),
|
|
113
|
+
details: { completenessPolicy: frame.timeContext.completenessPolicy },
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
if (frame.timeContext.completenessPolicy === 'latest_complete') {
|
|
117
|
+
facts.push(makeFact(receipt, {
|
|
118
|
+
kind: 'caveat',
|
|
119
|
+
code: 'LATEST_COMPLETE_PERIOD',
|
|
120
|
+
outputIds: frame.requestedOutputs.filter((output) => output.periodId === frame.comparison?.basePeriodId || output.periodId === frame.timeContext?.periods[0]?.id).map((output) => output.id),
|
|
121
|
+
details: { completenessPolicy: frame.timeContext.completenessPolicy },
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const payload = {
|
|
126
|
+
version: 1,
|
|
127
|
+
planId: graph.planId,
|
|
128
|
+
graphId: graph.graphId,
|
|
129
|
+
graphFingerprint: graph.fingerprint,
|
|
130
|
+
receiptId: receipt.receiptId,
|
|
131
|
+
resultFingerprint: receipt.resultFingerprint,
|
|
132
|
+
facts,
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
status: 'ready',
|
|
136
|
+
factSet: deepFreeze({
|
|
137
|
+
...payload,
|
|
138
|
+
factSetId: `analytical-facts:${hash(stableStringify(payload)).slice(0, 24)}`,
|
|
139
|
+
}),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export function renderDeterministicAnalyticalNarrative(input) {
|
|
143
|
+
const claims = [];
|
|
144
|
+
const outputById = new Map(input.frame.requestedOutputs.map((output) => [output.id, output]));
|
|
145
|
+
const rowFacts = new Map();
|
|
146
|
+
for (const fact of input.factSet.facts) {
|
|
147
|
+
if (fact.rowIndex === undefined || fact.kind === 'caveat')
|
|
148
|
+
continue;
|
|
149
|
+
const current = rowFacts.get(fact.rowIndex) ?? [];
|
|
150
|
+
current.push(fact);
|
|
151
|
+
rowFacts.set(fact.rowIndex, current);
|
|
152
|
+
}
|
|
153
|
+
const maxRows = Math.min(Math.max(1, input.maxRows ?? 5), 20);
|
|
154
|
+
for (const [rowIndex, facts] of [...rowFacts.entries()].sort(([left], [right]) => left - right).slice(0, maxRows)) {
|
|
155
|
+
const coordinates = facts.find((fact) => fact.coordinates)?.coordinates ?? {};
|
|
156
|
+
const coordinateText = Object.values(coordinates).map(displayValue).join(' · ');
|
|
157
|
+
const values = facts
|
|
158
|
+
.filter((fact) => fact.kind !== 'freshness')
|
|
159
|
+
.map((fact) => {
|
|
160
|
+
const outputId = fact.outputIds[0] ?? fact.kind;
|
|
161
|
+
const label = humanizeOutput(outputId, outputById.get(outputId)?.kind);
|
|
162
|
+
const suffix = fact.kind === 'percent_delta' && fact.value != null && fact.value !== 'not_applicable' ? '%' : '';
|
|
163
|
+
return `${label}: ${displayValue(fact.value)}${suffix}`;
|
|
164
|
+
});
|
|
165
|
+
const text = `${coordinateText ? `${coordinateText} — ` : ''}${values.join('; ')}.`;
|
|
166
|
+
claims.push({
|
|
167
|
+
claimId: `claim:row:${rowIndex}`,
|
|
168
|
+
factIds: facts.map((fact) => fact.factId),
|
|
169
|
+
text,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
for (const freshness of input.factSet.facts.filter((fact) => fact.kind === 'freshness')) {
|
|
173
|
+
const start = displayValue(freshness.details?.startInclusive);
|
|
174
|
+
const end = displayValue(freshness.details?.endExclusive);
|
|
175
|
+
const policy = String(freshness.details?.completenessPolicy ?? 'declared completeness');
|
|
176
|
+
claims.push({
|
|
177
|
+
claimId: `claim:freshness:${freshness.factId}`,
|
|
178
|
+
factIds: [freshness.factId],
|
|
179
|
+
text: `${humanizeOutput(freshness.periodId ?? 'period')} covers ${start} through ${end} under the ${policy.replace(/_/g, ' ')} policy.`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
for (const caveat of input.factSet.facts.filter((fact) => fact.kind === 'caveat')) {
|
|
183
|
+
claims.push({
|
|
184
|
+
claimId: `claim:caveat:${caveat.factId}`,
|
|
185
|
+
factIds: [caveat.factId],
|
|
186
|
+
text: caveatText(caveat),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
const text = claims.map((claim) => claim.text).join(' ');
|
|
190
|
+
return deepFreeze({ version: 1, factSetId: input.factSet.factSetId, text, claims });
|
|
191
|
+
}
|
|
192
|
+
export function validateAnalyticalNarrativeClaims(input) {
|
|
193
|
+
const facts = new Map(input.factSet.facts.map((fact) => [fact.factId, fact]));
|
|
194
|
+
const cited = new Set();
|
|
195
|
+
for (const claim of input.claims) {
|
|
196
|
+
if (/\b(?:because|caused?|causing|drove|driven by|led to|resulted in|responsible for)\b/i.test(claim.text)) {
|
|
197
|
+
return { status: 'invalid', code: 'CAUSAL_CLAIM', reason: 'Analytical result narration cannot infer causality.', claimId: claim.claimId };
|
|
198
|
+
}
|
|
199
|
+
const claimFacts = claim.factIds.flatMap((factId) => {
|
|
200
|
+
const fact = facts.get(factId);
|
|
201
|
+
return fact ? [fact] : [];
|
|
202
|
+
});
|
|
203
|
+
if (claimFacts.length !== claim.factIds.length || claimFacts.length === 0) {
|
|
204
|
+
return { status: 'invalid', code: 'UNKNOWN_FACT', reason: 'Every narrative claim must cite existing result facts.', claimId: claim.claimId };
|
|
205
|
+
}
|
|
206
|
+
claim.factIds.forEach((factId) => cited.add(factId));
|
|
207
|
+
const allowedNumbers = new Set(claimFacts.flatMap((fact) => numericTokens(stableStringify({
|
|
208
|
+
value: fact.value,
|
|
209
|
+
coordinates: fact.coordinates,
|
|
210
|
+
details: fact.details,
|
|
211
|
+
rowIndex: fact.rowIndex,
|
|
212
|
+
periodId: fact.periodId,
|
|
213
|
+
}))));
|
|
214
|
+
const unsupported = numericTokens(claim.text).filter((token) => !allowedNumbers.has(token));
|
|
215
|
+
if (unsupported.length > 0) {
|
|
216
|
+
return {
|
|
217
|
+
status: 'invalid',
|
|
218
|
+
code: 'UNSUPPORTED_NUMBER',
|
|
219
|
+
reason: `Claim ${claim.claimId} contains unsupported numeric text: ${unsupported.join(', ')}.`,
|
|
220
|
+
claimId: claim.claimId,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const hiddenCaveat = input.factSet.facts.find((fact) => fact.kind === 'caveat' && !cited.has(fact.factId));
|
|
225
|
+
if (hiddenCaveat) {
|
|
226
|
+
return {
|
|
227
|
+
status: 'invalid',
|
|
228
|
+
code: 'MATERIAL_CAVEAT_HIDDEN',
|
|
229
|
+
reason: `Material caveat ${hiddenCaveat.code ?? hiddenCaveat.factId} is not cited by the narrative.`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
return { status: 'valid', citedFactIds: [...cited].sort() };
|
|
233
|
+
}
|
|
234
|
+
function makeFact(receipt, input) {
|
|
235
|
+
const payload = {
|
|
236
|
+
...input,
|
|
237
|
+
receiptId: receipt.receiptId,
|
|
238
|
+
graphFingerprint: receipt.graphFingerprint,
|
|
239
|
+
resultFingerprint: receipt.resultFingerprint,
|
|
240
|
+
};
|
|
241
|
+
return { ...payload, factId: `fact:${hash(stableStringify(payload)).slice(0, 24)}` };
|
|
242
|
+
}
|
|
243
|
+
function caveatText(fact) {
|
|
244
|
+
if (fact.code === 'PARTIAL_CURRENT_PERIOD')
|
|
245
|
+
return 'The current period is partial; values may increase before it closes.';
|
|
246
|
+
if (fact.code === 'LATEST_COMPLETE_PERIOD')
|
|
247
|
+
return 'The current value uses the latest complete governed period, not a partial in-progress period.';
|
|
248
|
+
if (fact.code === 'MISSING_COMPARISON_VALUE')
|
|
249
|
+
return `A comparison value is unavailable${coordinateSuffix(fact)}.`;
|
|
250
|
+
if (fact.code === 'ZERO_COMPARISON_DENOMINATOR')
|
|
251
|
+
return `Percentage change is not available; the comparison value is zero${coordinateSuffix(fact)}.`;
|
|
252
|
+
return 'The result includes a material analytical caveat.';
|
|
253
|
+
}
|
|
254
|
+
function coordinateSuffix(fact) {
|
|
255
|
+
const coordinates = Object.values(fact.coordinates ?? {}).map(displayValue).filter(Boolean);
|
|
256
|
+
return coordinates.length ? ` for ${coordinates.join(' · ')}` : '';
|
|
257
|
+
}
|
|
258
|
+
function humanizeOutput(value, kind) {
|
|
259
|
+
if (kind === 'percent_delta')
|
|
260
|
+
return 'change';
|
|
261
|
+
return value.replace(/[_-]+/g, ' ').replace(/\b\w/g, (letter) => letter.toUpperCase());
|
|
262
|
+
}
|
|
263
|
+
function displayValue(value) {
|
|
264
|
+
if (value === null || value === undefined)
|
|
265
|
+
return 'not available';
|
|
266
|
+
if (typeof value === 'string')
|
|
267
|
+
return value === 'not_applicable' ? 'not applicable' : value;
|
|
268
|
+
if (typeof value === 'number' || typeof value === 'bigint' || typeof value === 'boolean')
|
|
269
|
+
return String(value);
|
|
270
|
+
return JSON.stringify(value);
|
|
271
|
+
}
|
|
272
|
+
function isExactZero(value) {
|
|
273
|
+
return (typeof value === 'number' && value === 0) || (typeof value === 'bigint' && value === 0n) || (typeof value === 'string' && /^[+-]?0+(?:\.0+)?$/.test(value.trim()));
|
|
274
|
+
}
|
|
275
|
+
function numericTokens(value) {
|
|
276
|
+
return value.match(/-?\d+(?:,\d{3})*(?:\.\d+)?%?/g)?.map((token) => token.replace(/,/g, '').replace(/%$/, '')) ?? [];
|
|
277
|
+
}
|
|
278
|
+
function hash(value) {
|
|
279
|
+
return createHash('sha256').update(value).digest('hex');
|
|
280
|
+
}
|
|
281
|
+
function stableStringify(value) {
|
|
282
|
+
if (value === undefined || value === null)
|
|
283
|
+
return 'null';
|
|
284
|
+
if (typeof value === 'bigint')
|
|
285
|
+
return JSON.stringify(value.toString());
|
|
286
|
+
if (typeof value !== 'object')
|
|
287
|
+
return JSON.stringify(value);
|
|
288
|
+
if (Array.isArray(value))
|
|
289
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
290
|
+
const record = value;
|
|
291
|
+
return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(',')}}`;
|
|
292
|
+
}
|
|
293
|
+
function deepFreeze(value) {
|
|
294
|
+
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
295
|
+
Object.freeze(value);
|
|
296
|
+
for (const nested of Object.values(value))
|
|
297
|
+
deepFreeze(nested);
|
|
298
|
+
}
|
|
299
|
+
return value;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=analytical-result-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytical-result-facts.js","sourceRoot":"","sources":["../src/analytical-result-facts.ts"],"names":[],"mappings":"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"}
|
package/dist/answer-loop.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* step. Tests can mock the provider with a canned response and exercise the
|
|
15
15
|
* full pipeline.
|
|
16
16
|
*/
|
|
17
|
-
import { type SemanticLayer, type ResolvedTrustLabel, type TrustLabelId, type DqlArtifactReference, type DqlArtifactExecutionReceipt, type DQLManifest } from '@duckcodeailabs/dql-core';
|
|
17
|
+
import { type SemanticLayer, type ResolvedTrustLabel, type TrustLabelId, type DqlArtifactReference, type DqlArtifactExecutionReceipt, type DQLManifest, type AnalyticalFailureV1 } from '@duckcodeailabs/dql-core';
|
|
18
18
|
import type { KGStore } from './kg/sqlite-fts.js';
|
|
19
19
|
import type { KGNode, KGSearchHit } from './kg/types.js';
|
|
20
20
|
import type { AgentProvider, AgentToolDefinition } from './providers/types.js';
|
|
@@ -34,8 +34,11 @@ import { type AnalyticalExploratoryPath, type AnalyticalPolicyCode } from './met
|
|
|
34
34
|
import { type SemanticFilterValueBinding, type SemanticMemberSelection } from './semantic-bridge/compose.js';
|
|
35
35
|
import { type CascadeAnswerResult } from './cascade/cascade.js';
|
|
36
36
|
import { type ResolvedAnalyticalPlan, type ResolvedAnalyticalPlanDelta } from './resolved-analytical-plan.js';
|
|
37
|
-
import { type PlanExecutionBinding, type PlanExecutionBlockedCode } from './plan-execution-adapter.js';
|
|
38
|
-
import { type GovernedCompilationReceipt, type GovernedRelationalCompileResult } from './governed-relational-compiler.js';
|
|
37
|
+
import { type PlanExecutionBinding, type PlanExecutionBlockedCode, type SemanticGraphExecutionBinding } from './plan-execution-adapter.js';
|
|
38
|
+
import { type GovernedCompilationReceipt, type GovernedAnalyticalGraphCompilationReceipt, type GovernedAnalyticalGraphCompileResult, type GovernedRelationalCompileResult } from './governed-relational-compiler.js';
|
|
39
|
+
import { type AnalyticalExecutionGraphBlockedCode, type AnalyticalExecutionGraphV1, type AnalyticalExecutionReceiptV1, type AnalyticalGraphExecutionFailureCode } from './analytical-execution-graph.js';
|
|
40
|
+
import { type AnalyticalNarrativeV1, type AnalyticalResultFactSetV1 } from './analytical-result-facts.js';
|
|
41
|
+
import { type AnalyticalFreshnessObservationV1, type AnalyticalFreshnessRequestV1, type ResolveAnalyticalPeriodsResult } from './analytical-period-resolution.js';
|
|
39
42
|
import { type CascadeAnalysisDepth, type PartialCascadeBudgetModel } from './cascade/budgets.js';
|
|
40
43
|
export type AnswerKind = 'certified' | 'uncertified' | 'no_answer';
|
|
41
44
|
export type AnswerSourceTier = 'certified_artifact' | 'business_context' | 'semantic_layer' | 'dbt_manifest' | 'no_answer';
|
|
@@ -85,7 +88,11 @@ export interface AgentRefusalDetails {
|
|
|
85
88
|
* grounding gaps, this preserves the exact validation code so repair loops can
|
|
86
89
|
* re-ground the named identifier instead of parsing prose.
|
|
87
90
|
*/
|
|
88
|
-
code?: AnswerRefusalCode | SqlContextValidationCode | AnalyticalPolicyCode | PlanExecutionBlockedCode |
|
|
91
|
+
code?: AnswerRefusalCode | SqlContextValidationCode | AnalyticalPolicyCode | PlanExecutionBlockedCode | AnalyticalExecutionGraphBlockedCode | AnalyticalGraphExecutionFailureCode | Extract<ResolveAnalyticalPeriodsResult, {
|
|
92
|
+
status: 'blocked';
|
|
93
|
+
}>['code'] | Extract<GovernedAnalyticalGraphCompileResult, {
|
|
94
|
+
status: 'blocked';
|
|
95
|
+
}>['code'] | 'COMPILATION_FAILED' | 'EXECUTION_FAILED' | 'semantic_runtime_required';
|
|
89
96
|
message: string;
|
|
90
97
|
offending?: SqlContextValidationOffending;
|
|
91
98
|
}
|
|
@@ -326,8 +333,22 @@ export interface AgentAnswer {
|
|
|
326
333
|
resolvedAnalyticalPlan?: ResolvedAnalyticalPlan;
|
|
327
334
|
/** Versioned identity-only executable projection of the resolved plan. */
|
|
328
335
|
executablePlan?: PlanExecutionBinding;
|
|
336
|
+
/** Immutable multi-period graph compiled from the v2 plan. */
|
|
337
|
+
analyticalExecutionGraph?: AnalyticalExecutionGraphV1;
|
|
338
|
+
/** Terminal receipt binding every source execution and validated output. */
|
|
339
|
+
analyticalExecutionReceipt?: AnalyticalExecutionReceiptV1;
|
|
340
|
+
/** Deterministic facts copied from validated result columns and bound to the receipt. */
|
|
341
|
+
analyticalFacts?: AnalyticalResultFactSetV1;
|
|
342
|
+
/** Business narration whose every claim cites those facts. */
|
|
343
|
+
analyticalNarrative?: AnalyticalNarrativeV1;
|
|
344
|
+
/** Snapshot-bound freshness proof used to resolve relative periods. */
|
|
345
|
+
analyticalFreshnessObservation?: AnalyticalFreshnessObservationV1;
|
|
346
|
+
/** Stable redacted diagnostics for the immutable failed analytical run. */
|
|
347
|
+
analyticalFailure?: AnalyticalFailureV1;
|
|
329
348
|
/** Compiler/result receipt for the authoritative governed relational lane. */
|
|
330
349
|
governedCompilationReceipt?: GovernedCompilationReceipt;
|
|
350
|
+
/** Multi-statement compilation receipt for a governed relational graph. */
|
|
351
|
+
governedAnalyticalGraphCompilationReceipt?: GovernedAnalyticalGraphCompilationReceipt;
|
|
331
352
|
/** Final answer text (NL summary). */
|
|
332
353
|
text: string;
|
|
333
354
|
/**
|
|
@@ -455,8 +476,34 @@ export interface AnswerLoopInput {
|
|
|
455
476
|
resolvedAnalyticalPlan?: ResolvedAnalyticalPlan;
|
|
456
477
|
/** Internal: the single adapter result prepared once at the answer boundary. */
|
|
457
478
|
resolvedPlanExecutionBinding?: PlanExecutionBinding;
|
|
479
|
+
/** Internal: immutable route-neutral graph prepared once at the answer boundary. */
|
|
480
|
+
analyticalExecutionGraph?: AnalyticalExecutionGraphV1;
|
|
481
|
+
/** Internal: deterministic graph-build gap; never reopens routing. */
|
|
482
|
+
analyticalExecutionGraphFailure?: {
|
|
483
|
+
code: AnalyticalExecutionGraphBlockedCode;
|
|
484
|
+
reason: string;
|
|
485
|
+
field?: string;
|
|
486
|
+
};
|
|
487
|
+
/** Internal: governed relative-time binding gap; never reopens routing. */
|
|
488
|
+
analyticalPeriodResolutionFailure?: {
|
|
489
|
+
code: Extract<ResolveAnalyticalPeriodsResult, {
|
|
490
|
+
status: 'blocked';
|
|
491
|
+
}>['code'];
|
|
492
|
+
reason: string;
|
|
493
|
+
error?: unknown;
|
|
494
|
+
};
|
|
495
|
+
/** Internal: exact per-period semantic adapter selections. */
|
|
496
|
+
semanticGraphExecutionBinding?: SemanticGraphExecutionBinding;
|
|
458
497
|
/** Internal: constrained AST/SQL compilation prepared at the answer boundary. */
|
|
459
498
|
governedRelationalCompilation?: GovernedRelationalCompileResult;
|
|
499
|
+
/** Internal: per-period governed relational graph compilation. */
|
|
500
|
+
governedAnalyticalGraphCompilation?: GovernedAnalyticalGraphCompileResult;
|
|
501
|
+
/** Captured once by the host for deterministic relative-period resolution. */
|
|
502
|
+
analyticalReferenceInstant?: string;
|
|
503
|
+
/** Optional pre-fetched authorized freshness proof for this snapshot. */
|
|
504
|
+
analyticalFreshnessObservation?: AnalyticalFreshnessObservationV1;
|
|
505
|
+
/** At most one authorized freshness lookup; it cannot search or change route. */
|
|
506
|
+
resolveAnalyticalFreshness?: (request: AnalyticalFreshnessRequestV1) => Promise<AnalyticalFreshnessObservationV1>;
|
|
460
507
|
/**
|
|
461
508
|
* Current notebook/app context, such as upstream SQL or selected filters.
|
|
462
509
|
* This is prompt context only. It is intentionally excluded from KG and
|