@duckcodeailabs/dql-agent 1.9.5 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/agent-run-engine.d.ts +13 -0
  2. package/dist/agent-run-engine.d.ts.map +1 -1
  3. package/dist/agent-run-engine.js +65 -2
  4. package/dist/agent-run-engine.js.map +1 -1
  5. package/dist/analytical-compatibility.d.ts +61 -0
  6. package/dist/analytical-compatibility.d.ts.map +1 -0
  7. package/dist/analytical-compatibility.js +515 -0
  8. package/dist/analytical-compatibility.js.map +1 -0
  9. package/dist/analytical-execution-graph.d.ts +174 -0
  10. package/dist/analytical-execution-graph.d.ts.map +1 -0
  11. package/dist/analytical-execution-graph.js +599 -0
  12. package/dist/analytical-execution-graph.js.map +1 -0
  13. package/dist/analytical-failure-repair.d.ts +91 -0
  14. package/dist/analytical-failure-repair.d.ts.map +1 -0
  15. package/dist/analytical-failure-repair.js +325 -0
  16. package/dist/analytical-failure-repair.js.map +1 -0
  17. package/dist/analytical-frame.d.ts +19 -0
  18. package/dist/analytical-frame.d.ts.map +1 -0
  19. package/dist/analytical-frame.js +299 -0
  20. package/dist/analytical-frame.js.map +1 -0
  21. package/dist/analytical-period-resolution.d.ts +53 -0
  22. package/dist/analytical-period-resolution.d.ts.map +1 -0
  23. package/dist/analytical-period-resolution.js +218 -0
  24. package/dist/analytical-period-resolution.js.map +1 -0
  25. package/dist/analytical-readiness.d.ts +17 -0
  26. package/dist/analytical-readiness.d.ts.map +1 -0
  27. package/dist/analytical-readiness.js +95 -0
  28. package/dist/analytical-readiness.js.map +1 -0
  29. package/dist/analytical-result-facts.d.ts +79 -0
  30. package/dist/analytical-result-facts.d.ts.map +1 -0
  31. package/dist/analytical-result-facts.js +301 -0
  32. package/dist/analytical-result-facts.js.map +1 -0
  33. package/dist/answer-loop.d.ts +82 -2
  34. package/dist/answer-loop.d.ts.map +1 -1
  35. package/dist/answer-loop.js +1129 -38
  36. package/dist/answer-loop.js.map +1 -1
  37. package/dist/embeddings/provider.d.ts +1 -1
  38. package/dist/embeddings/provider.d.ts.map +1 -1
  39. package/dist/embeddings/provider.js.map +1 -1
  40. package/dist/governed-relational-compiler.d.ts +189 -0
  41. package/dist/governed-relational-compiler.d.ts.map +1 -0
  42. package/dist/governed-relational-compiler.js +458 -0
  43. package/dist/governed-relational-compiler.js.map +1 -0
  44. package/dist/index.d.ts +25 -5
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +15 -4
  47. package/dist/index.js.map +1 -1
  48. package/dist/intent-controller.d.ts +5 -0
  49. package/dist/intent-controller.d.ts.map +1 -1
  50. package/dist/intent-controller.js.map +1 -1
  51. package/dist/kg/build.d.ts +2 -2
  52. package/dist/kg/build.d.ts.map +1 -1
  53. package/dist/kg/build.js +329 -9
  54. package/dist/kg/build.js.map +1 -1
  55. package/dist/meaning-resolution.d.ts +17 -0
  56. package/dist/meaning-resolution.d.ts.map +1 -1
  57. package/dist/meaning-resolution.js +83 -4
  58. package/dist/meaning-resolution.js.map +1 -1
  59. package/dist/metadata/analysis-planner.d.ts.map +1 -1
  60. package/dist/metadata/analysis-planner.js +37 -7
  61. package/dist/metadata/analysis-planner.js.map +1 -1
  62. package/dist/metadata/catalog.d.ts +86 -3
  63. package/dist/metadata/catalog.d.ts.map +1 -1
  64. package/dist/metadata/catalog.js +607 -36
  65. package/dist/metadata/catalog.js.map +1 -1
  66. package/dist/metadata/meaning-evidence.d.ts +18 -2
  67. package/dist/metadata/meaning-evidence.d.ts.map +1 -1
  68. package/dist/metadata/meaning-evidence.js +182 -7
  69. package/dist/metadata/meaning-evidence.js.map +1 -1
  70. package/dist/plan-execution-adapter.d.ts +131 -0
  71. package/dist/plan-execution-adapter.d.ts.map +1 -0
  72. package/dist/plan-execution-adapter.js +447 -0
  73. package/dist/plan-execution-adapter.js.map +1 -0
  74. package/dist/research-governance.d.ts +56 -0
  75. package/dist/research-governance.d.ts.map +1 -0
  76. package/dist/research-governance.js +68 -0
  77. package/dist/research-governance.js.map +1 -0
  78. package/dist/research-loop.d.ts +14 -0
  79. package/dist/research-loop.d.ts.map +1 -1
  80. package/dist/research-loop.js +77 -23
  81. package/dist/research-loop.js.map +1 -1
  82. package/dist/resolved-analytical-plan.d.ts +123 -0
  83. package/dist/resolved-analytical-plan.d.ts.map +1 -0
  84. package/dist/resolved-analytical-plan.js +400 -0
  85. package/dist/resolved-analytical-plan.js.map +1 -0
  86. package/dist/router.d.ts +3 -0
  87. package/dist/router.d.ts.map +1 -1
  88. package/dist/router.js +195 -25
  89. package/dist/router.js.map +1 -1
  90. package/dist/skills/loader.d.ts +17 -0
  91. package/dist/skills/loader.d.ts.map +1 -1
  92. package/dist/skills/loader.js +62 -4
  93. package/dist/skills/loader.js.map +1 -1
  94. 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":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EACV,0BAA0B,EAC1B,4BAA4B,EAC7B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,wBAAwB,GAChC,OAAO,GACP,cAAc,GACd,OAAO,GACP,eAAe,GACf,MAAM,GACN,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,wBAAwB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,EACD,wBAAwB,GACxB,wBAAwB,GACxB,0BAA0B,GAC1B,6BAA6B,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,sBAAsB,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,gCAAgC,GACxC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,yBAAyB,CAAA;CAAE,GACvD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,kBAAkB,GAAG,0BAA0B,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAED,MAAM,MAAM,mCAAmC,GAC3C;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3C;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,cAAc,GAAG,oBAAoB,GAAG,cAAc,GAAG,wBAAwB,CAAC;IACxF,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,EAAE,0BAA0B,CAAC;IAClC,OAAO,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtC,GAAG,gCAAgC,CAyInC;AAED,wBAAgB,sCAAsC,CAAC,KAAK,EAAE;IAC5D,KAAK,EAAE,yBAAyB,CAAC;IACjC,OAAO,EAAE,yBAAyB,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,qBAAqB,CAgDxB;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,OAAO,EAAE,yBAAyB,CAAC;IACnC,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC,GAAG,mCAAmC,CA2CtC"}
@@ -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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA4EzC,MAAM,UAAU,0BAA0B,CAAC,KAM1C;IACC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACxC,IACE,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QACjC,OAAO,CAAC,gBAAgB,KAAK,KAAK,CAAC,WAAW;QAC9C,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC/B,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,EACjD,CAAC;QACD,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,+DAA+D;SACxE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnE,IACE,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QACxC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,QAAQ;QACtC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAC3G,CAAC;QACD,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,0BAA0B;YAChC,MAAM,EAAE,8EAA8E;SACvF,CAAC;IACJ,CAAC;IACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAChG,MAAM,KAAK,GAA6B,EAAE,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE;YACP,cAAc,EAAE,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC;YACzC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;YACnE,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACrD,GAAG,OAAO;gBACV,eAAe,EAAE,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;aAC9C,CAAC,CAAC;SACJ;KACF,CAAC,CAAC,CAAC;IACJ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;QACnC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YAC1C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,QAAQ;gBACR,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrB,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,CAAC,CAAC,CAAC;QACN,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAClD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAC3E,CAAC;gBACF,IAAI,gBAAgB,IAAI,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;oBACzD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;wBAC3B,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,0BAA0B;wBAChC,SAAS,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAChC,QAAQ;wBACR,QAAQ;wBACR,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACpD,CAAC,CAAC,CAAC;gBACN,CAAC;gBACD,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;gBAC/F,IAAI,gBAAgB,IAAI,aAAa,IAAI,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;oBAChH,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;wBAC3B,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,6BAA6B;wBACnC,SAAS,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC;wBAClD,QAAQ;wBACR,QAAQ;wBACR,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACpD,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC3B,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,KAAK,CAAC,gBAAgB;qBAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;qBACjD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK,EAAE,MAAM,CAAC,GAAG;gBACjB,OAAO,EAAE;oBACP,cAAc,EAAE,MAAM,CAAC,KAAK;oBAC5B,YAAY,EAAE,MAAM,CAAC,GAAG;oBACxB,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,eAAe;oBAClD,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ;oBACpC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU;oBACxC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ;oBACpC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK;oBAC9B,kBAAkB,EAAE,KAAK,CAAC,WAAW,CAAC,kBAAkB;iBACzD;aACF,CAAC,CAAC,CAAC;QACN,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,CAAC,kBAAkB,KAAK,iBAAiB,EAAE,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC3B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,wBAAwB;gBAC9B,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU,EAAE,YAAY,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5L,OAAO,EAAE,EAAE,kBAAkB,EAAE,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE;aACtE,CAAC,CAAC,CAAC;QACN,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,CAAC,kBAAkB,KAAK,iBAAiB,EAAE,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC3B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,wBAAwB;gBAC9B,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU,EAAE,YAAY,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5L,OAAO,EAAE,EAAE,kBAAkB,EAAE,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE;aACtE,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,CAAU;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,KAAK,CAAC,WAAW;QACnC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,KAAK;KACN,CAAC;IACF,OAAO;QACL,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,UAAU,CAAC;YAClB,GAAG,OAAO;YACV,SAAS,EAAE,oBAAoB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;SAC7E,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sCAAsC,CAAC,KAItD;IACC,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;QAClH,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;QAC9E,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,KAAK;aACjB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;aAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;YAChD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACjH,OAAO,GAAG,KAAK,KAAK,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;QACL,MAAM,IAAI,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,aAAa,QAAQ,EAAE;YAChC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACzC,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QACxF,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,CAAC,CAAC;QACxF,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,mBAAmB,SAAS,CAAC,MAAM,EAAE;YAC9C,OAAO,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;YAC3B,IAAI,EAAE,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,GAAG,cAAc,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU;SACxI,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,gBAAgB,MAAM,CAAC,MAAM,EAAE;YACxC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAGjD;IACC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,qFAAqF,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,qDAAqD,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5I,CAAC;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAClD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,wDAAwD,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/I,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC,CACL,CAAC;QACF,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,SAAS,KAAK,CAAC,OAAO,uCAAuC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAC9F,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3G,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,mBAAmB,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,iCAAiC;SACrG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,QAAQ,CACf,OAAqC,EACrC,KAAsG;IAEtG,MAAM,OAAO,GAAG;QACd,GAAG,KAAK;QACR,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;KAC7C,CAAC;IACF,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,UAAU,CAAC,IAA4B;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB;QAAE,OAAO,sEAAsE,CAAC;IAC1H,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB;QAAE,OAAO,+FAA+F,CAAC;IACnJ,IAAI,IAAI,CAAC,IAAI,KAAK,0BAA0B;QAAE,OAAO,oCAAoC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACnH,IAAI,IAAI,CAAC,IAAI,KAAK,6BAA6B;QAAE,OAAO,mEAAmE,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACrJ,OAAO,mDAAmD,CAAC;AAC7D,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA4B;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5F,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,IAAa;IAClD,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,QAAQ,CAAC;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,KAAK,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/G,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7K,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACvH,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5H,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC;YAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}