@duckcodeailabs/dql-agent 1.6.31 → 1.6.32

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 (160) hide show
  1. package/dist/agent-run-engine.d.ts +42 -6
  2. package/dist/agent-run-engine.d.ts.map +1 -1
  3. package/dist/agent-run-engine.js +133 -79
  4. package/dist/agent-run-engine.js.map +1 -1
  5. package/dist/agent-run-gates.d.ts.map +1 -1
  6. package/dist/agent-run-gates.js +72 -5
  7. package/dist/agent-run-gates.js.map +1 -1
  8. package/dist/agent-run-planner.d.ts.map +1 -1
  9. package/dist/agent-run-planner.js +13 -0
  10. package/dist/agent-run-planner.js.map +1 -1
  11. package/dist/answer-loop.d.ts +110 -8
  12. package/dist/answer-loop.d.ts.map +1 -1
  13. package/dist/answer-loop.js +1679 -1299
  14. package/dist/answer-loop.js.map +1 -1
  15. package/dist/answer-shape.d.ts +16 -0
  16. package/dist/answer-shape.d.ts.map +1 -0
  17. package/dist/answer-shape.js +85 -0
  18. package/dist/answer-shape.js.map +1 -0
  19. package/dist/cascade/budgets.d.ts +101 -0
  20. package/dist/cascade/budgets.d.ts.map +1 -0
  21. package/dist/cascade/budgets.js +184 -0
  22. package/dist/cascade/budgets.js.map +1 -0
  23. package/dist/cascade/cascade.d.ts +86 -0
  24. package/dist/cascade/cascade.d.ts.map +1 -0
  25. package/dist/cascade/cascade.js +115 -0
  26. package/dist/cascade/cascade.js.map +1 -0
  27. package/dist/cascade/route-policy.d.ts +14 -0
  28. package/dist/cascade/route-policy.d.ts.map +1 -0
  29. package/dist/cascade/route-policy.js +48 -0
  30. package/dist/cascade/route-policy.js.map +1 -0
  31. package/dist/cascade/triage.d.ts +20 -0
  32. package/dist/cascade/triage.d.ts.map +1 -0
  33. package/dist/cascade/triage.js +25 -0
  34. package/dist/cascade/triage.js.map +1 -0
  35. package/dist/conversation/rolling-summary.d.ts +13 -0
  36. package/dist/conversation/rolling-summary.d.ts.map +1 -0
  37. package/dist/conversation/rolling-summary.js +43 -0
  38. package/dist/conversation/rolling-summary.js.map +1 -0
  39. package/dist/conversation/session-store.d.ts +110 -0
  40. package/dist/conversation/session-store.d.ts.map +1 -0
  41. package/dist/conversation/session-store.js +387 -0
  42. package/dist/conversation/session-store.js.map +1 -0
  43. package/dist/conversation/snapshot.d.ts +59 -0
  44. package/dist/conversation/snapshot.d.ts.map +1 -0
  45. package/dist/conversation/snapshot.js +153 -0
  46. package/dist/conversation/snapshot.js.map +1 -0
  47. package/dist/conversation/working-state.d.ts +49 -0
  48. package/dist/conversation/working-state.d.ts.map +1 -0
  49. package/dist/conversation/working-state.js +249 -0
  50. package/dist/conversation/working-state.js.map +1 -0
  51. package/dist/embeddings/provider.d.ts +62 -0
  52. package/dist/embeddings/provider.d.ts.map +1 -1
  53. package/dist/embeddings/provider.js +98 -0
  54. package/dist/embeddings/provider.js.map +1 -1
  55. package/dist/grounding/context-ledger.d.ts +30 -0
  56. package/dist/grounding/context-ledger.d.ts.map +1 -0
  57. package/dist/grounding/context-ledger.js +54 -0
  58. package/dist/grounding/context-ledger.js.map +1 -0
  59. package/dist/grounding/regrounding.d.ts +24 -0
  60. package/dist/grounding/regrounding.d.ts.map +1 -0
  61. package/dist/grounding/regrounding.js +219 -0
  62. package/dist/grounding/regrounding.js.map +1 -0
  63. package/dist/grounding/value-index.d.ts +32 -0
  64. package/dist/grounding/value-index.d.ts.map +1 -0
  65. package/dist/grounding/value-index.js +67 -0
  66. package/dist/grounding/value-index.js.map +1 -0
  67. package/dist/index.d.ts +45 -14
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +102 -11
  70. package/dist/index.js.map +1 -1
  71. package/dist/intent-controller.d.ts +7 -0
  72. package/dist/intent-controller.d.ts.map +1 -1
  73. package/dist/intent-controller.js +22 -1
  74. package/dist/intent-controller.js.map +1 -1
  75. package/dist/kg/build.d.ts.map +1 -1
  76. package/dist/kg/build.js +44 -17
  77. package/dist/kg/build.js.map +1 -1
  78. package/dist/kg/sqlite-fts.d.ts +3 -1
  79. package/dist/kg/sqlite-fts.d.ts.map +1 -1
  80. package/dist/kg/sqlite-fts.js +16 -2
  81. package/dist/kg/sqlite-fts.js.map +1 -1
  82. package/dist/kg/types.d.ts +23 -1
  83. package/dist/kg/types.d.ts.map +1 -1
  84. package/dist/memory/fts-query.d.ts +7 -0
  85. package/dist/memory/fts-query.d.ts.map +1 -0
  86. package/dist/memory/fts-query.js +36 -0
  87. package/dist/memory/fts-query.js.map +1 -0
  88. package/dist/memory/sqlite-memory.d.ts.map +1 -1
  89. package/dist/memory/sqlite-memory.js +1 -30
  90. package/dist/memory/sqlite-memory.js.map +1 -1
  91. package/dist/metadata/analysis-planner.d.ts +23 -0
  92. package/dist/metadata/analysis-planner.d.ts.map +1 -1
  93. package/dist/metadata/analysis-planner.js +432 -2
  94. package/dist/metadata/analysis-planner.js.map +1 -1
  95. package/dist/metadata/block-fit.d.ts +24 -0
  96. package/dist/metadata/block-fit.d.ts.map +1 -0
  97. package/dist/metadata/block-fit.js +373 -0
  98. package/dist/metadata/block-fit.js.map +1 -0
  99. package/dist/metadata/catalog.d.ts +72 -3
  100. package/dist/metadata/catalog.d.ts.map +1 -1
  101. package/dist/metadata/catalog.js +1452 -72
  102. package/dist/metadata/catalog.js.map +1 -1
  103. package/dist/metadata/drafts.d.ts +25 -0
  104. package/dist/metadata/drafts.d.ts.map +1 -1
  105. package/dist/metadata/drafts.js +112 -2
  106. package/dist/metadata/drafts.js.map +1 -1
  107. package/dist/metadata/metric-match.d.ts +55 -6
  108. package/dist/metadata/metric-match.d.ts.map +1 -1
  109. package/dist/metadata/metric-match.js +158 -13
  110. package/dist/metadata/metric-match.js.map +1 -1
  111. package/dist/metadata/sql-context-validation.d.ts +13 -1
  112. package/dist/metadata/sql-context-validation.d.ts.map +1 -1
  113. package/dist/metadata/sql-context-validation.js +172 -19
  114. package/dist/metadata/sql-context-validation.js.map +1 -1
  115. package/dist/metadata/sql-retrieval.d.ts +3 -2
  116. package/dist/metadata/sql-retrieval.d.ts.map +1 -1
  117. package/dist/metadata/sql-retrieval.js +6 -4
  118. package/dist/metadata/sql-retrieval.js.map +1 -1
  119. package/dist/providers/claude.d.ts +2 -1
  120. package/dist/providers/claude.d.ts.map +1 -1
  121. package/dist/providers/claude.js +95 -0
  122. package/dist/providers/claude.js.map +1 -1
  123. package/dist/providers/index.d.ts +1 -1
  124. package/dist/providers/index.d.ts.map +1 -1
  125. package/dist/providers/index.js.map +1 -1
  126. package/dist/providers/openai.d.ts +2 -1
  127. package/dist/providers/openai.d.ts.map +1 -1
  128. package/dist/providers/openai.js +143 -0
  129. package/dist/providers/openai.js.map +1 -1
  130. package/dist/providers/tool-output.d.ts +2 -0
  131. package/dist/providers/tool-output.d.ts.map +1 -0
  132. package/dist/providers/tool-output.js +22 -0
  133. package/dist/providers/tool-output.js.map +1 -0
  134. package/dist/providers/types.d.ts +23 -0
  135. package/dist/providers/types.d.ts.map +1 -1
  136. package/dist/providers/types.js.map +1 -1
  137. package/dist/semantic-bridge/compose.d.ts +89 -0
  138. package/dist/semantic-bridge/compose.d.ts.map +1 -0
  139. package/dist/semantic-bridge/compose.js +528 -0
  140. package/dist/semantic-bridge/compose.js.map +1 -0
  141. package/dist/semantic-bridge/member-select.d.ts +23 -0
  142. package/dist/semantic-bridge/member-select.d.ts.map +1 -0
  143. package/dist/semantic-bridge/member-select.js +106 -0
  144. package/dist/semantic-bridge/member-select.js.map +1 -0
  145. package/dist/skills/defaults.d.ts.map +1 -1
  146. package/dist/skills/defaults.js +5 -0
  147. package/dist/skills/defaults.js.map +1 -1
  148. package/dist/synthesize.d.ts +26 -0
  149. package/dist/synthesize.d.ts.map +1 -1
  150. package/dist/synthesize.js +72 -3
  151. package/dist/synthesize.js.map +1 -1
  152. package/dist/tools/registry.d.ts +15 -0
  153. package/dist/tools/registry.d.ts.map +1 -0
  154. package/dist/tools/registry.js +692 -0
  155. package/dist/tools/registry.js.map +1 -0
  156. package/dist/trust/stamp.d.ts +26 -0
  157. package/dist/trust/stamp.d.ts.map +1 -0
  158. package/dist/trust/stamp.js +33 -0
  159. package/dist/trust/stamp.js.map +1 -0
  160. package/package.json +4 -4
@@ -1,3 +1,21 @@
1
+ import type { DqlArtifactReference } from '@duckcodeailabs/dql-core';
2
+ export type GeneratedDraftSourceDqlArtifact = DqlArtifactReference;
3
+ export interface GeneratedDqlArtifactDraftRecord {
4
+ slug: string;
5
+ question: string;
6
+ proposedContractId: string;
7
+ /** Accountable owner; defaults to the resolved local owner so a draft is never owner-less. */
8
+ owner?: string;
9
+ proposedDomain?: string;
10
+ dqlArtifact: GeneratedDraftSourceDqlArtifact;
11
+ sourceQuestion?: string;
12
+ sourceBlock?: string;
13
+ followupKind?: string;
14
+ contextPackId?: string;
15
+ routeIntent?: string;
16
+ validationWarnings?: string[];
17
+ outputs?: string[];
18
+ }
1
19
  export interface GeneratedDraftRecord {
2
20
  slug: string;
3
21
  question: string;
@@ -8,11 +26,13 @@ export interface GeneratedDraftRecord {
8
26
  proposedDomain?: string;
9
27
  proposedEntity?: string;
10
28
  upstreamRefs?: string[];
29
+ sourceDqlArtifact?: GeneratedDraftSourceDqlArtifact;
11
30
  sourceQuestion?: string;
12
31
  sourceBlock?: string;
13
32
  followupKind?: string;
14
33
  requestedFilters?: string[];
15
34
  requestedDimensions?: string[];
35
+ outputs?: string[];
16
36
  contextPackId?: string;
17
37
  routeIntent?: string;
18
38
  validationWarnings?: string[];
@@ -22,6 +42,9 @@ export interface GeneratedDraftBlock {
22
42
  askedTimes: number;
23
43
  proposedContractId: string;
24
44
  }
45
+ export interface GeneratedSqlDqlArtifactInput extends GeneratedDraftRecord {
46
+ draftPath?: string;
47
+ }
25
48
  export declare function deriveGeneratedDraftSlug(question: string): string;
26
49
  export interface SemanticDraftNameInput {
27
50
  /** The user prompt / question that motivated the block. */
@@ -44,4 +67,6 @@ export interface SemanticDraftNameInput {
44
67
  */
45
68
  export declare function deriveSemanticDraftName(input: SemanticDraftNameInput): string;
46
69
  export declare function upsertGeneratedDraft(projectRoot: string, rec: GeneratedDraftRecord): GeneratedDraftBlock;
70
+ export declare function upsertGeneratedDqlArtifactDraft(projectRoot: string, rec: GeneratedDqlArtifactDraftRecord): GeneratedDraftBlock;
71
+ export declare function renderGeneratedSqlDqlArtifact(rec: GeneratedSqlDqlArtifactInput): string;
47
72
  //# sourceMappingURL=drafts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drafts.d.ts","sourceRoot":"","sources":["../../src/metadata/drafts.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQjE;AAqGD,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAW7E;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,oBAAoB,GACxB,mBAAmB,CAiCrB"}
1
+ {"version":3,"file":"drafts.d.ts","sourceRoot":"","sources":["../../src/metadata/drafts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyC,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAG5G,MAAM,MAAM,+BAA+B,GAAG,oBAAoB,CAAC;AAEnE,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,+BAA+B,CAAC;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,+BAA+B,CAAC;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQjE;AAqGD,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAW7E;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,oBAAoB,GACxB,mBAAmB,CAiCrB;AAED,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,+BAA+B,GACnC,mBAAmB,CA8BrB;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,4BAA4B,GAAG,MAAM,CAGvF"}
@@ -1,4 +1,5 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { createHash } from 'node:crypto';
2
3
  import { dirname, join } from 'node:path';
3
4
  import { resolveLocalOwner } from './identity.js';
4
5
  const STOPWORDS = new Set([
@@ -164,6 +165,39 @@ export function upsertGeneratedDraft(projectRoot, rec) {
164
165
  proposedContractId: rec.proposedContractId,
165
166
  };
166
167
  }
168
+ export function upsertGeneratedDqlArtifactDraft(projectRoot, rec) {
169
+ const { filePath, relativePath } = resolveGeneratedDraftPath(projectRoot, rec);
170
+ const owner = rec.owner?.trim() || resolveLocalOwner(projectRoot);
171
+ if (existsSync(filePath)) {
172
+ const existing = readFileSync(filePath, 'utf-8');
173
+ const m = existing.match(/asked_times\s*=\s*(\d+)/);
174
+ const prev = m ? Number.parseInt(m[1], 10) : 1;
175
+ const next = Number.isFinite(prev) ? prev + 1 : 2;
176
+ let updated = m
177
+ ? existing.replace(/asked_times\s*=\s*\d+/, `asked_times = ${next}`)
178
+ : insertBeforeFinalBrace(existing, `\n asked_times = ${next}`);
179
+ if (!/\n\s*owner\s*=/.test(updated)) {
180
+ updated = insertOwner(updated, owner);
181
+ }
182
+ writeFileSync(filePath, stampLastAsked(updated));
183
+ return {
184
+ path: relativePath,
185
+ askedTimes: next,
186
+ proposedContractId: rec.proposedContractId,
187
+ };
188
+ }
189
+ mkdirSync(dirname(filePath), { recursive: true });
190
+ writeFileSync(filePath, stampGeneratedDqlArtifactDraft(rec, relativePath, owner));
191
+ return {
192
+ path: relativePath,
193
+ askedTimes: 1,
194
+ proposedContractId: rec.proposedContractId,
195
+ };
196
+ }
197
+ export function renderGeneratedSqlDqlArtifact(rec) {
198
+ const draftPath = rec.draftPath ?? `blocks/_drafts/${rec.slug}.dql`;
199
+ return renderGeneratedDraft(rec, draftPath);
200
+ }
167
201
  function resolveGeneratedDraftPath(projectRoot, rec) {
168
202
  const safeDomain = (rec.proposedDomain ?? '')
169
203
  .trim()
@@ -181,8 +215,10 @@ function resolveGeneratedDraftPath(projectRoot, rec) {
181
215
  function renderGeneratedDraft(rec, draftPath) {
182
216
  const now = new Date().toISOString();
183
217
  const upstream = arrayField('upstream_refs', rec.upstreamRefs ?? []);
218
+ const sourceDql = renderSourceDqlMetadata(rec.sourceDqlArtifact);
184
219
  const requestedFilters = arrayField('requested_filters', rec.requestedFilters ?? []);
185
220
  const requestedDimensions = arrayField('requested_dimensions', rec.requestedDimensions ?? []);
221
+ const outputs = arrayField('outputs', rec.outputs ?? []);
186
222
  const warnings = arrayField('validation_warnings', rec.validationWarnings ?? []);
187
223
  const safeSql = rec.proposedSql.replace(/"""/g, '\\"\\"\\"');
188
224
  return `block "${escapeDqlString(rec.slug)}" {
@@ -190,7 +226,7 @@ function renderGeneratedDraft(rec, draftPath) {
190
226
  type = "custom"
191
227
  status = "draft"
192
228
  owner = "${escapeDqlString(rec.owner ?? '')}"
193
- description = """${rec.question.replace(/"""/g, '\\"\\"\\"')}"""
229
+ description = """${rec.question.replace(/"""/g, '\\"\\"\\"')}"""${outputs}
194
230
 
195
231
  // Tier-2 generated proposal. This block is NOT certified.
196
232
  // Reviewer must validate filters, joins, grain, metric definition, lineage,
@@ -215,7 +251,7 @@ function renderGeneratedDraft(rec, draftPath) {
215
251
  source_block = "${escapeDqlString(rec.sourceBlock ?? '')}"
216
252
  followup_kind = "${escapeDqlString(rec.followupKind ?? '')}"
217
253
  context_pack_id = "${escapeDqlString(rec.contextPackId ?? '')}"
218
- route_intent = "${escapeDqlString(rec.routeIntent ?? '')}"${upstream}${requestedFilters}${requestedDimensions}${warnings}
254
+ route_intent = "${escapeDqlString(rec.routeIntent ?? '')}"${upstream}${sourceDql}${requestedFilters}${requestedDimensions}${warnings}
219
255
 
220
256
  query = """
221
257
  ${safeSql.split('\n').join('\n ')}
@@ -223,6 +259,80 @@ function renderGeneratedDraft(rec, draftPath) {
223
259
  }
224
260
  `;
225
261
  }
262
+ function stampGeneratedDqlArtifactDraft(rec, draftPath, owner) {
263
+ const now = new Date().toISOString();
264
+ const sourceWithOwner = insertOwner(rec.dqlArtifact.source.trimEnd(), owner);
265
+ const metadata = [
266
+ '',
267
+ ' // Generated DQL artifact metadata. This artifact was assembled before execution;',
268
+ ' // promotion should persist this reviewed block rather than translating SQL.',
269
+ ` asked_times = 1`,
270
+ ` first_asked = "${now}"`,
271
+ ` last_asked = "${now}"`,
272
+ ` proposed_contract_id = "${escapeDqlString(rec.proposedContractId)}"`,
273
+ ` proposed_domain = "${escapeDqlString(rec.proposedDomain ?? '')}"`,
274
+ ` source_question = "${escapeDqlString(rec.sourceQuestion ?? '')}"`,
275
+ ` source_block = "${escapeDqlString(rec.sourceBlock ?? '')}"`,
276
+ ` followup_kind = "${escapeDqlString(rec.followupKind ?? '')}"`,
277
+ ` context_pack_id = "${escapeDqlString(rec.contextPackId ?? '')}"`,
278
+ ` route_intent = "${escapeDqlString(rec.routeIntent ?? '')}"`,
279
+ ` draft_path = "${escapeDqlString(draftPath)}"`,
280
+ arrayField('outputs', rec.outputs ?? []).trimEnd(),
281
+ arrayField('validation_warnings', rec.validationWarnings ?? []).trimEnd(),
282
+ ].filter(Boolean).join('\n');
283
+ return `${insertBeforeFinalBrace(sourceWithOwner, `\n${metadata}`)}\n`;
284
+ }
285
+ function insertOwner(source, owner) {
286
+ if (!owner || /\n\s*owner\s*=/.test(source))
287
+ return source;
288
+ if (/\n\s*status\s*=/.test(source)) {
289
+ return source.replace(/(\n\s*status\s*=\s*"[^"]*")/, `$1\n owner = "${escapeDqlString(owner)}"`);
290
+ }
291
+ return source.replace(/(\bblock\s+"[^"]+"\s*\{)/, `$1\n owner = "${escapeDqlString(owner)}"`);
292
+ }
293
+ function insertBeforeFinalBrace(source, insertion) {
294
+ const trimmed = source.trimEnd();
295
+ const index = trimmed.lastIndexOf('}');
296
+ if (index < 0)
297
+ return `${trimmed}${insertion}`;
298
+ return `${trimmed.slice(0, index).trimEnd()}${insertion}\n${trimmed.slice(index)}`;
299
+ }
300
+ function renderSourceDqlMetadata(artifact) {
301
+ if (!artifact?.source?.trim())
302
+ return '';
303
+ const metrics = arrayField('source_dql_metrics', artifact.metrics ?? []);
304
+ const dimensions = arrayField('source_dql_dimensions', artifact.dimensions ?? []);
305
+ const filters = arrayField('source_dql_filters', flattenDqlFilters(artifact.filters));
306
+ const timeDimension = artifact.timeDimension
307
+ ? `
308
+ source_dql_time_dimension = "${escapeDqlString(artifact.timeDimension.name)}"
309
+ source_dql_granularity = "${escapeDqlString(artifact.timeDimension.granularity)}"`
310
+ : '';
311
+ const orderBy = arrayField('source_dql_order_by', flattenDqlOrderBy(artifact.orderBy));
312
+ const limit = typeof artifact.limit === 'number' && Number.isFinite(artifact.limit) && artifact.limit > 0
313
+ ? `
314
+ source_dql_limit = ${Math.floor(artifact.limit)}`
315
+ : '';
316
+ return `
317
+ source_dql_kind = "${escapeDqlString(artifact.kind)}"
318
+ source_dql_name = "${escapeDqlString(artifact.name ?? '')}"
319
+ source_dql_path = "${escapeDqlString(artifact.sourcePath ?? '')}"
320
+ source_dql_hash = "${hashSourceDql(artifact.source)}"${metrics}${dimensions}${filters}${timeDimension}${orderBy}${limit}`;
321
+ }
322
+ function flattenDqlFilters(filters) {
323
+ return (filters ?? []).flatMap((filter) => {
324
+ const values = filter.values.length ? filter.values : [''];
325
+ return values.map((value) => filter.operator === 'equals'
326
+ ? `${filter.dimension}=${value}`.trim()
327
+ : `${filter.dimension} ${filter.operator} ${value}`.trim());
328
+ });
329
+ }
330
+ function flattenDqlOrderBy(orderBy) {
331
+ return (orderBy ?? []).map((order) => `${order.name} ${order.direction}`);
332
+ }
333
+ function hashSourceDql(source) {
334
+ return createHash('sha256').update(source.trim()).digest('hex');
335
+ }
226
336
  function arrayField(name, values) {
227
337
  if (values.length === 0)
228
338
  return '';
@@ -1 +1 @@
1
- {"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../src/metadata/drafts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../src/metadata/drafts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAqDlD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;IACpE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;IACrE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IACxE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;IACxE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CACrC,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,MAAM,GAAG,QAAQ;SACpB,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,IAAI,IAAI,mBAAmB,CAAC;AACrC,CAAC;AAED,0EAA0E;AAC1E,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C;;;GAGG;AACH,MAAM,WAAW,GAAyC;IACxD,EAAE,EAAE,EAAE,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE;IAC9D,EAAE,EAAE,EAAE,0CAA0C,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnE,EAAE,EAAE,EAAE,8CAA8C,EAAE,KAAK,EAAE,SAAS,EAAE;IACxE,EAAE,EAAE,EAAE,yCAAyC,EAAE,KAAK,EAAE,WAAW,EAAE;IACrE,EAAE,EAAE,EAAE,gDAAgD,EAAE,KAAK,EAAE,QAAQ,EAAE;CAC1E,CAAC;AAEF,kFAAkF;AAClF,MAAM,YAAY,GAAG;IACnB,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM;IAC/E,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc;IAC7E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAC9E,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO;IAC9E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa;CAC9E,CAAC;AAEF,6EAA6E;AAC7E,MAAM,YAAY,GAAG,uFAAuF,CAAC;AAE7G,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,SAA6B,EAAE,QAAqB;IAChF,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,+EAA+E;IAC/E,+EAA+E;IAC/E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,SAAS,GAAG,SAAS;aAClB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;aACtC,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,OAAO,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAErC,uEAAuE;IACvE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;IAEjC,sEAAsE;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,GAAG,KAAK,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,sCAAsC;IACtC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,IAAI,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,IAAI,IAAI,SAAS,CAAC;AAC3B,CAAC;AAED,qDAAqD;AACrD,SAAS,UAAU,CAAC,IAAY,EAAE,QAAqB;IACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AACxB,CAAC;AAWD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA6B;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAE5D,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACxE,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,QAAQ;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEpF,6EAA6E;IAC7E,OAAO,UAAU,CAAC,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,GAAyB;IAEzB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,yBAAyB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC/E,gFAAgF;IAChF,8EAA8E;IAC9E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAElE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,iBAAiB,IAAI,EAAE,CAAC;YACpE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,uBAAuB,IAAI,iBAAiB,CAAC,CAAC;QACrF,iFAAiF;QACjF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,oBAAoB,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1G,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,IAAI;YAChB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;SAC3C,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/E,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,CAAC;QACb,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,WAAmB,EACnB,GAAoC;IAEpC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,yBAAyB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAElE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,iBAAiB,IAAI,EAAE,CAAC;YACpE,CAAC,CAAC,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,IAAI;YAChB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;SAC3C,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,8BAA8B,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAClF,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,CAAC;QACb,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAiC;IAC7E,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,kBAAkB,GAAG,CAAC,IAAI,MAAM,CAAC;IACpE,OAAO,oBAAoB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,yBAAyB,CAChC,WAAmB,EACnB,GAA0D;IAE1D,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;SAC1C,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,YAAY,GAAG,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACrF,CAAC,CAAC,WAAW,UAAU,mBAAmB,GAAG,CAAC,IAAI,MAAM;QACxD,CAAC,CAAC,kBAAkB,GAAG,CAAC,IAAI,MAAM,CAAC;IACrC,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;QACzC,YAAY;KACb,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAyB,EAAE,SAAiB;IACxE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,gBAAgB,GAAG,UAAU,CAAC,mBAAmB,EAAE,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,mBAAmB,GAAG,UAAU,CAAC,sBAAsB,EAAE,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,qBAAqB,EAAE,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO,UAAU,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC5B,eAAe,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC;;;eAG9C,eAAe,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;uBACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,OAAO;;;;;;;oCAOzC,SAAS;gCACb,GAAG,CAAC,cAAc,IAAI,MAAM;kCAC1B,GAAG,CAAC,kBAAkB;;;;;;;qBAOnC,GAAG;oBACJ,GAAG;8BACO,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC;yBAC5C,eAAe,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;yBACzC,eAAe,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;yBACzC,eAAe,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;sBAC5C,eAAe,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;uBACrC,eAAe,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;yBACrC,eAAe,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;sBAC3C,eAAe,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,IAAI,QAAQ,GAAG,SAAS,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,QAAQ;;;UAG9H,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;;;CAG/C,CAAC;AACF,CAAC;AAED,SAAS,8BAA8B,CACrC,GAAoC,EACpC,SAAiB,EACjB,KAAa;IAEb,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG;QACf,EAAE;QACF,qFAAqF;QACrF,gFAAgF;QAChF,mBAAmB;QACnB,oBAAoB,GAAG,GAAG;QAC1B,mBAAmB,GAAG,GAAG;QACzB,6BAA6B,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG;QACvE,wBAAwB,eAAe,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,GAAG;QACpE,wBAAwB,eAAe,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,GAAG;QACpE,qBAAqB,eAAe,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG;QAC9D,sBAAsB,eAAe,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,GAAG;QAChE,wBAAwB,eAAe,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,GAAG;QACnE,qBAAqB,eAAe,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG;QAC9D,mBAAmB,eAAe,CAAC,SAAS,CAAC,GAAG;QAChD,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;QAClD,UAAU,CAAC,qBAAqB,EAAE,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;KAC1E,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,GAAG,sBAAsB,CAAC,eAAe,EAAE,KAAK,QAAQ,EAAE,CAAC,IAAI,CAAC;AACzE,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,KAAa;IAChD,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,kBAAkB,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,kBAAkB,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAc,EAAE,SAAiB;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;IAC/C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAqD;IACpF,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,UAAU,CAAC,uBAAuB,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACtF,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa;QAC1C,CAAC,CAAC;mCAC6B,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC;gCAC/C,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG;QAClF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC;QACvG,CAAC,CAAC;yBACmB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACjD,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;yBACgB,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;yBAC9B,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;yBACpC,eAAe,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;yBAC1C,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;AAC9H,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAwC;IACjE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1B,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAC1B,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE;YACvC,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAyC;IAClE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,MAAgB;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,SAAS,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAChG,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,0BAA0B,EAAE,iBAAiB,GAAG,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC"}
@@ -15,7 +15,7 @@
15
15
  * spend/sales/income/arr; orders ⇄ purchases; ...), and of each metric's
16
16
  * searchable text (name + synonyms + label + description + tags),
17
17
  * - lexical token overlap blended through the spec-11 `hybridRank`
18
- * (alpha defaults to 0 pure lexical, offline-stable for tests),
18
+ * (small non-zero alpha by default when lexical signal exists),
19
19
  * - a strong boost when a measure FAMILY (e.g. "revenue") is shared between
20
20
  * the question and the metric, which is what makes "total revenue" reach the
21
21
  * revenue family even though the exact word never appears in a metric name.
@@ -27,6 +27,7 @@
27
27
  */
28
28
  import { type EmbeddingProvider } from '../embeddings/provider.js';
29
29
  import type { KGNode } from '../kg/types.js';
30
+ import type { SemanticLayer } from '@duckcodeailabs/dql-core';
30
31
  /** The measure families a metric KG node resolves to (revenue, orders, ...). */
31
32
  export declare function metricFamilies(metric: KGNode): Set<string>;
32
33
  export interface MetricMatch {
@@ -42,13 +43,15 @@ export interface MatchSemanticMetricOptions {
42
43
  * so ad-hoc questions still fall through to generated SQL. Default 0.34.
43
44
  */
44
45
  threshold?: number;
45
- /** Vector-similarity weight; 0 (default) = offline-stable pure lexical. */
46
+ /** Vector-similarity weight; defaults to a small conservative blend. */
46
47
  alpha?: number;
47
48
  provider?: EmbeddingProvider;
48
49
  }
50
+ export declare const DEFAULT_METRIC_MATCH_EMBEDDING_ALPHA = 0.18;
49
51
  /**
50
52
  * Pick the single best governed metric for a question, or `null` when no metric
51
- * clears the confidence bar. Deterministic + offline by default (alpha=0).
53
+ * clears the confidence bar. Deterministic + offline by default because the
54
+ * default provider is the hashed-token embedding.
52
55
  *
53
56
  * Scoring per candidate metric:
54
57
  * base = lexical token overlap fraction (question content tokens present in
@@ -66,7 +69,7 @@ export declare function matchSemanticMetric(question: string, metrics: KGNode[],
66
69
  * `sql:` is not an aggregate expression (a bare metric-name reference) or there is
67
70
  * no table — those are not directly executable.
68
71
  */
69
- export declare function parseMetricDefinition(metric: KGNode): {
72
+ export declare function parseMetricDefinition(metric: KGNode, semanticLayer?: SemanticLayer): {
70
73
  expr: string;
71
74
  table: string;
72
75
  } | undefined;
@@ -76,7 +79,7 @@ export declare function parseMetricDefinition(metric: KGNode): {
76
79
  * metric's governed definition. Returns undefined when the definition is too thin
77
80
  * to execute, preserving honest refusal.
78
81
  */
79
- export declare function metricToGovernedSql(metric: KGNode): string | undefined;
82
+ export declare function metricToGovernedSql(metric: KGNode, semanticLayer?: SemanticLayer): string | undefined;
80
83
  /**
81
84
  * Resolve a matched metric to executable governed SQL. dbt's semantic layer splits
82
85
  * a metric from its measure: a derived MetricFlow metric (e.g. `revenue`, type=simple
@@ -86,8 +89,54 @@ export declare function metricToGovernedSql(metric: KGNode): string | undefined;
86
89
  * otherwise we fall back to a sibling whose LEAF name matches (`revenue` ⇒
87
90
  * `<model>.revenue`). No fuzzy family guessing — precise resolution or nothing.
88
91
  */
89
- export declare function resolveGovernedMetricSql(metric: KGNode, pool: KGNode[]): {
92
+ export declare function resolveGovernedMetricSql(metric: KGNode, pool: KGNode[], semanticLayer?: SemanticLayer): {
90
93
  sql: string;
91
94
  metric: KGNode;
92
95
  } | undefined;
96
+ /** Resolve a metric (or its leaf-named sibling measure) to an executable definition. */
97
+ export declare function resolveGovernedMetricDefinition(metric: KGNode, pool: KGNode[], semanticLayer?: SemanticLayer): {
98
+ def: {
99
+ expr: string;
100
+ table: string;
101
+ };
102
+ metric: KGNode;
103
+ } | undefined;
104
+ export interface GovernedMetricFirstResult {
105
+ sql: string;
106
+ metric: KGNode;
107
+ dimensions: string[];
108
+ }
109
+ /**
110
+ * Tier 2 of the governed answer hierarchy (certified blocks → semantic-layer
111
+ * metrics + dimensions → generated SQL): deterministically synthesize executable
112
+ * SQL for a confidently matched metric WHEN its governed definition can express
113
+ * the question's full requested shape — a scalar KPI, or a group-by whose
114
+ * requested dimensions ALL resolve to real columns on the metric's own table
115
+ * (verified against the runtime schema). Precise-or-nothing: any unresolvable
116
+ * dimension, explicit filter, extra measure, or per-group top-N returns
117
+ * undefined so the question falls through to generation, where the metric still
118
+ * grounds the prompt as context.
119
+ */
120
+ export declare function buildGovernedMetricFirstSql(input: {
121
+ metric: KGNode;
122
+ pool: KGNode[];
123
+ requestedShape: {
124
+ dimensions: string[];
125
+ measures: string[];
126
+ filters: string[];
127
+ topN?: {
128
+ n: number;
129
+ scope: 'overall' | 'per_group';
130
+ };
131
+ rankingDirection?: 'top' | 'bottom';
132
+ };
133
+ schemaTables: Array<{
134
+ relation: string;
135
+ name?: string;
136
+ columns: Array<{
137
+ name: string;
138
+ }>;
139
+ }>;
140
+ semanticLayer?: SemanticLayer;
141
+ }): GovernedMetricFirstResult | undefined;
93
142
  //# sourceMappingURL=metric-match.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metric-match.d.ts","sourceRoot":"","sources":["../../src/metadata/metric-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AA0F7C,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAE1D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAyD7B;AAOD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAMjG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,GACb;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAW7C"}
1
+ {"version":3,"file":"metric-match.d.ts","sourceRoot":"","sources":["../../src/metadata/metric-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AA0F9D,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAE1D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA6D7B;AAOD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,aAAa,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAa7C;AAkCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAKrG;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,CAAC,EAAE,aAAa,GAC5B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAG7C;AAED,wFAAwF;AACxF,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,CAAC,EAAE,aAAa,GAC5B;IAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAWtE;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE;QACd,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;SAAE,CAAC;QACrD,gBAAgB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;KACrC,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IAC3F,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,GAAG,yBAAyB,GAAG,SAAS,CA+CxC"}
@@ -15,7 +15,7 @@
15
15
  * spend/sales/income/arr; orders ⇄ purchases; ...), and of each metric's
16
16
  * searchable text (name + synonyms + label + description + tags),
17
17
  * - lexical token overlap blended through the spec-11 `hybridRank`
18
- * (alpha defaults to 0 pure lexical, offline-stable for tests),
18
+ * (small non-zero alpha by default when lexical signal exists),
19
19
  * - a strong boost when a measure FAMILY (e.g. "revenue") is shared between
20
20
  * the question and the metric, which is what makes "total revenue" reach the
21
21
  * revenue family even though the exact word never appears in a metric name.
@@ -109,9 +109,11 @@ function metricFamilyText(metric) {
109
109
  export function metricFamilies(metric) {
110
110
  return familiesFor(contentTokens(metricFamilyText(metric)));
111
111
  }
112
+ export const DEFAULT_METRIC_MATCH_EMBEDDING_ALPHA = 0.18;
112
113
  /**
113
114
  * Pick the single best governed metric for a question, or `null` when no metric
114
- * clears the confidence bar. Deterministic + offline by default (alpha=0).
115
+ * clears the confidence bar. Deterministic + offline by default because the
116
+ * default provider is the hashed-token embedding.
115
117
  *
116
118
  * Scoring per candidate metric:
117
119
  * base = lexical token overlap fraction (question content tokens present in
@@ -168,7 +170,11 @@ export async function matchSemanticMetric(question, metrics, options = {}) {
168
170
  const fts = clamp01(0.35 * lexical + familyBoost + 0.35 * nameFraction);
169
171
  return { metric, text: metricSearchText(metric), ftsScore: fts, family: sharedFamily };
170
172
  });
171
- const ranked = await hybridRank(question, items.map((entry) => ({ item: entry, text: entry.text, ftsScore: entry.ftsScore })), { alpha: options.alpha ?? 0, provider: options.provider ?? (options.alpha ? defaultEmbeddingProvider() : undefined) });
173
+ const hasLexicalSignal = items.some((entry) => entry.ftsScore > 0);
174
+ const ranked = await hybridRank(question, items.map((entry) => ({ item: entry, text: entry.text, ftsScore: entry.ftsScore })), {
175
+ alpha: hasLexicalSignal ? options.alpha ?? DEFAULT_METRIC_MATCH_EMBEDDING_ALPHA : 0,
176
+ provider: options.provider ?? defaultEmbeddingProvider(),
177
+ });
172
178
  const best = ranked[0];
173
179
  if (!best || best.score < threshold)
174
180
  return null;
@@ -185,22 +191,57 @@ function clamp01(value) {
185
191
  * `sql:` is not an aggregate expression (a bare metric-name reference) or there is
186
192
  * no table — those are not directly executable.
187
193
  */
188
- export function parseMetricDefinition(metric) {
194
+ export function parseMetricDefinition(metric, semanticLayer) {
195
+ // Prefer the STRUCTURED metric definition from the semantic layer when
196
+ // available — no fragile text parsing. Fall back to reading the KG node's
197
+ // llmContext blob for manifest-native metrics that carry no structured def.
198
+ if (semanticLayer) {
199
+ const structured = structuredMetricDefinition(metric, semanticLayer);
200
+ if (structured)
201
+ return structured;
202
+ }
189
203
  const context = metric.llmContext ?? '';
190
204
  const expr = context.match(/(?:^|\n)\s*sql:\s*(.+?)\s*(?:\n|$)/i)?.[1]?.trim();
191
205
  const table = context.match(/(?:^|\n)\s*table:\s*(.+?)\s*(?:\n|$)/i)?.[1]?.trim();
192
- if (!expr || !table || !/[()]/.test(expr))
206
+ if (!expr || !table || !looksLikeExecutableMetricExpr(expr))
193
207
  return undefined;
194
208
  return { expr, table };
195
209
  }
210
+ /**
211
+ * A metric expression is only executable when it is a real aggregate/function call
212
+ * with a NON-EMPTY argument — SUM(x), COUNT(*), AVG(order_total). The old bare
213
+ * `/[()]/` presence test accepted degenerate exprs like `COUNT()` / `()`, which
214
+ * synthesize a hollow `SELECT COUNT() AS x` that errors or returns a meaningless
215
+ * value. Require an identifier head, `(`, then at least one non-`)` argument char
216
+ * (or `*`), so degenerate exprs fall through to honest refusal / generation instead.
217
+ */
218
+ function looksLikeExecutableMetricExpr(expr) {
219
+ return /[A-Za-z_][A-Za-z0-9_]*\s*\(\s*(?:\*|[^)\s])/.test(expr);
220
+ }
221
+ /** Look up a metric's structured {expr, table} from the semantic layer by name/leaf. */
222
+ function structuredMetricDefinition(metric, semanticLayer) {
223
+ const candidates = [metric.name, metric.name.split('.').pop() ?? metric.name];
224
+ for (const name of candidates) {
225
+ const def = semanticLayer.getMetric(name);
226
+ // Trim the structured definition (the blob path already trims); an untrimmed
227
+ // `table: ' '` would synthesize a broken `FROM `. Require a real executable
228
+ // aggregate expression, same gate as the blob path.
229
+ const sql = def?.sql?.trim();
230
+ const table = def?.table?.trim();
231
+ if (sql && table && looksLikeExecutableMetricExpr(sql)) {
232
+ return { expr: sql, table };
233
+ }
234
+ }
235
+ return undefined;
236
+ }
196
237
  /**
197
238
  * Deterministic, offline-safe governed SQL for a matched metric (spec 17, part C):
198
239
  * a single read-only `SELECT <expr> AS <alias> FROM <table>` synthesised from the
199
240
  * metric's governed definition. Returns undefined when the definition is too thin
200
241
  * to execute, preserving honest refusal.
201
242
  */
202
- export function metricToGovernedSql(metric) {
203
- const def = parseMetricDefinition(metric);
243
+ export function metricToGovernedSql(metric, semanticLayer) {
244
+ const def = parseMetricDefinition(metric, semanticLayer);
204
245
  if (!def)
205
246
  return undefined;
206
247
  const alias = metric.name.replace(/[^a-zA-Z0-9_]+/g, '_').replace(/^_+|_+$/g, '') || 'metric_value';
@@ -215,19 +256,123 @@ export function metricToGovernedSql(metric) {
215
256
  * otherwise we fall back to a sibling whose LEAF name matches (`revenue` ⇒
216
257
  * `<model>.revenue`). No fuzzy family guessing — precise resolution or nothing.
217
258
  */
218
- export function resolveGovernedMetricSql(metric, pool) {
219
- const direct = metricToGovernedSql(metric);
259
+ export function resolveGovernedMetricSql(metric, pool, semanticLayer) {
260
+ const resolved = resolveGovernedMetricDefinition(metric, pool, semanticLayer);
261
+ return resolved ? { sql: metricToGovernedSql(resolved.metric, semanticLayer), metric: resolved.metric } : undefined;
262
+ }
263
+ /** Resolve a metric (or its leaf-named sibling measure) to an executable definition. */
264
+ export function resolveGovernedMetricDefinition(metric, pool, semanticLayer) {
265
+ const direct = parseMetricDefinition(metric, semanticLayer);
220
266
  if (direct)
221
- return { sql: direct, metric };
267
+ return { def: direct, metric };
222
268
  const leaf = metric.name.split('.').pop()?.toLowerCase();
223
269
  if (!leaf)
224
270
  return undefined;
225
271
  const leafSibling = pool
226
272
  .filter((node) => node.nodeId !== metric.nodeId && node.name.split('.').pop()?.toLowerCase() === leaf)
227
273
  .sort((a, b) => a.name.length - b.name.length)
228
- .find((node) => metricToGovernedSql(node));
229
- if (leafSibling)
230
- return { sql: metricToGovernedSql(leafSibling), metric: leafSibling };
274
+ .find((node) => parseMetricDefinition(node, semanticLayer));
275
+ if (!leafSibling)
276
+ return undefined;
277
+ return { def: parseMetricDefinition(leafSibling, semanticLayer), metric: leafSibling };
278
+ }
279
+ /**
280
+ * Tier 2 of the governed answer hierarchy (certified blocks → semantic-layer
281
+ * metrics + dimensions → generated SQL): deterministically synthesize executable
282
+ * SQL for a confidently matched metric WHEN its governed definition can express
283
+ * the question's full requested shape — a scalar KPI, or a group-by whose
284
+ * requested dimensions ALL resolve to real columns on the metric's own table
285
+ * (verified against the runtime schema). Precise-or-nothing: any unresolvable
286
+ * dimension, explicit filter, extra measure, or per-group top-N returns
287
+ * undefined so the question falls through to generation, where the metric still
288
+ * grounds the prompt as context.
289
+ */
290
+ export function buildGovernedMetricFirstSql(input) {
291
+ const { requestedShape } = input;
292
+ // Conservative gates: ONE measure family (the planner expands a single ask
293
+ // into variants — 'revenue'/'total'/'total_revenue' — so count families, not
294
+ // terms), no explicit filter values (value binding stays with generation),
295
+ // and no per-group ranking.
296
+ const families = new Set(requestedShape.measures
297
+ .map((measure) => measureFamilyOf(measure))
298
+ .filter((family) => Boolean(family)));
299
+ if (families.size > 1)
300
+ return undefined;
301
+ if (requestedShape.filters.length > 0)
302
+ return undefined;
303
+ if (requestedShape.topN?.scope === 'per_group')
304
+ return undefined;
305
+ const resolved = resolveGovernedMetricDefinition(input.metric, input.pool, input.semanticLayer);
306
+ if (!resolved)
307
+ return undefined;
308
+ const alias = resolved.metric.name.replace(/[^a-zA-Z0-9_]+/g, '_').replace(/^_+|_+$/g, '') || 'metric_value';
309
+ if (requestedShape.dimensions.length === 0) {
310
+ return {
311
+ sql: `SELECT ${resolved.def.expr} AS ${alias}\nFROM ${resolved.def.table}`,
312
+ metric: resolved.metric,
313
+ dimensions: [],
314
+ };
315
+ }
316
+ const table = findSchemaTable(resolved.def.table, input.schemaTables);
317
+ if (!table)
318
+ return undefined;
319
+ const columns = [];
320
+ for (const dimension of requestedShape.dimensions) {
321
+ const column = resolveDimensionColumn(dimension, table.columns);
322
+ if (!column)
323
+ return undefined;
324
+ if (!columns.includes(column))
325
+ columns.push(column);
326
+ }
327
+ const direction = requestedShape.rankingDirection === 'bottom' ? 'ASC' : 'DESC';
328
+ const limit = requestedShape.topN?.n;
329
+ return {
330
+ sql: [
331
+ `SELECT ${columns.join(', ')}, ${resolved.def.expr} AS ${alias}`,
332
+ `FROM ${resolved.def.table}`,
333
+ `GROUP BY ${columns.join(', ')}`,
334
+ `ORDER BY ${alias} ${direction}`,
335
+ ...(limit ? [`LIMIT ${limit}`] : []),
336
+ ].join('\n'),
337
+ metric: resolved.metric,
338
+ dimensions: columns,
339
+ };
340
+ }
341
+ /** Resolve a measure term to its synonym family (undefined for generic words like 'total'). */
342
+ function measureFamilyOf(term) {
343
+ const tokens = term.toLowerCase().match(TOKEN_RE) ?? [];
344
+ for (const [family, words] of Object.entries(MEASURE_FAMILIES)) {
345
+ if (tokens.some((token) => words.includes(token)))
346
+ return family;
347
+ }
231
348
  return undefined;
232
349
  }
350
+ function findSchemaTable(table, schemaTables) {
351
+ const target = table.toLowerCase();
352
+ const targetLeaf = target.split('.').pop() ?? target;
353
+ return schemaTables.find((candidate) => {
354
+ const relation = candidate.relation.toLowerCase();
355
+ const name = candidate.name?.toLowerCase();
356
+ return relation === target
357
+ || relation.split('.').pop() === targetLeaf
358
+ || name === target
359
+ || name === targetLeaf;
360
+ });
361
+ }
362
+ /** Map a requested dimension term to a real column on the metric's table (exact-ish only). */
363
+ function resolveDimensionColumn(dimension, columns) {
364
+ const term = dimension.toLowerCase().replace(/[^a-z0-9_]+/g, '_');
365
+ const singular = term.replace(/s$/, '');
366
+ const candidates = [term, singular, `${term}_name`, `${singular}_name`];
367
+ for (const candidate of candidates) {
368
+ const hit = columns.find((column) => column.name.toLowerCase() === candidate);
369
+ if (hit)
370
+ return hit.name;
371
+ }
372
+ const suffixHit = columns.find((column) => {
373
+ const name = column.name.toLowerCase();
374
+ return name.endsWith(`_${singular}`) || name.endsWith(`_${term}`);
375
+ });
376
+ return suffixHit?.name;
377
+ }
233
378
  //# sourceMappingURL=metric-match.js.map