@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.
- package/dist/agent-run-engine.d.ts +42 -6
- package/dist/agent-run-engine.d.ts.map +1 -1
- package/dist/agent-run-engine.js +133 -79
- package/dist/agent-run-engine.js.map +1 -1
- package/dist/agent-run-gates.d.ts.map +1 -1
- package/dist/agent-run-gates.js +72 -5
- package/dist/agent-run-gates.js.map +1 -1
- package/dist/agent-run-planner.d.ts.map +1 -1
- package/dist/agent-run-planner.js +13 -0
- package/dist/agent-run-planner.js.map +1 -1
- package/dist/answer-loop.d.ts +110 -8
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +1679 -1299
- package/dist/answer-loop.js.map +1 -1
- package/dist/answer-shape.d.ts +16 -0
- package/dist/answer-shape.d.ts.map +1 -0
- package/dist/answer-shape.js +85 -0
- package/dist/answer-shape.js.map +1 -0
- package/dist/cascade/budgets.d.ts +101 -0
- package/dist/cascade/budgets.d.ts.map +1 -0
- package/dist/cascade/budgets.js +184 -0
- package/dist/cascade/budgets.js.map +1 -0
- package/dist/cascade/cascade.d.ts +86 -0
- package/dist/cascade/cascade.d.ts.map +1 -0
- package/dist/cascade/cascade.js +115 -0
- package/dist/cascade/cascade.js.map +1 -0
- package/dist/cascade/route-policy.d.ts +14 -0
- package/dist/cascade/route-policy.d.ts.map +1 -0
- package/dist/cascade/route-policy.js +48 -0
- package/dist/cascade/route-policy.js.map +1 -0
- package/dist/cascade/triage.d.ts +20 -0
- package/dist/cascade/triage.d.ts.map +1 -0
- package/dist/cascade/triage.js +25 -0
- package/dist/cascade/triage.js.map +1 -0
- package/dist/conversation/rolling-summary.d.ts +13 -0
- package/dist/conversation/rolling-summary.d.ts.map +1 -0
- package/dist/conversation/rolling-summary.js +43 -0
- package/dist/conversation/rolling-summary.js.map +1 -0
- package/dist/conversation/session-store.d.ts +110 -0
- package/dist/conversation/session-store.d.ts.map +1 -0
- package/dist/conversation/session-store.js +387 -0
- package/dist/conversation/session-store.js.map +1 -0
- package/dist/conversation/snapshot.d.ts +59 -0
- package/dist/conversation/snapshot.d.ts.map +1 -0
- package/dist/conversation/snapshot.js +153 -0
- package/dist/conversation/snapshot.js.map +1 -0
- package/dist/conversation/working-state.d.ts +49 -0
- package/dist/conversation/working-state.d.ts.map +1 -0
- package/dist/conversation/working-state.js +249 -0
- package/dist/conversation/working-state.js.map +1 -0
- package/dist/embeddings/provider.d.ts +62 -0
- package/dist/embeddings/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js +98 -0
- package/dist/embeddings/provider.js.map +1 -1
- package/dist/grounding/context-ledger.d.ts +30 -0
- package/dist/grounding/context-ledger.d.ts.map +1 -0
- package/dist/grounding/context-ledger.js +54 -0
- package/dist/grounding/context-ledger.js.map +1 -0
- package/dist/grounding/regrounding.d.ts +24 -0
- package/dist/grounding/regrounding.d.ts.map +1 -0
- package/dist/grounding/regrounding.js +219 -0
- package/dist/grounding/regrounding.js.map +1 -0
- package/dist/grounding/value-index.d.ts +32 -0
- package/dist/grounding/value-index.d.ts.map +1 -0
- package/dist/grounding/value-index.js +67 -0
- package/dist/grounding/value-index.js.map +1 -0
- package/dist/index.d.ts +45 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -11
- package/dist/index.js.map +1 -1
- package/dist/intent-controller.d.ts +7 -0
- package/dist/intent-controller.d.ts.map +1 -1
- package/dist/intent-controller.js +22 -1
- package/dist/intent-controller.js.map +1 -1
- package/dist/kg/build.d.ts.map +1 -1
- package/dist/kg/build.js +44 -17
- package/dist/kg/build.js.map +1 -1
- package/dist/kg/sqlite-fts.d.ts +3 -1
- package/dist/kg/sqlite-fts.d.ts.map +1 -1
- package/dist/kg/sqlite-fts.js +16 -2
- package/dist/kg/sqlite-fts.js.map +1 -1
- package/dist/kg/types.d.ts +23 -1
- package/dist/kg/types.d.ts.map +1 -1
- package/dist/memory/fts-query.d.ts +7 -0
- package/dist/memory/fts-query.d.ts.map +1 -0
- package/dist/memory/fts-query.js +36 -0
- package/dist/memory/fts-query.js.map +1 -0
- package/dist/memory/sqlite-memory.d.ts.map +1 -1
- package/dist/memory/sqlite-memory.js +1 -30
- package/dist/memory/sqlite-memory.js.map +1 -1
- package/dist/metadata/analysis-planner.d.ts +23 -0
- package/dist/metadata/analysis-planner.d.ts.map +1 -1
- package/dist/metadata/analysis-planner.js +432 -2
- package/dist/metadata/analysis-planner.js.map +1 -1
- package/dist/metadata/block-fit.d.ts +24 -0
- package/dist/metadata/block-fit.d.ts.map +1 -0
- package/dist/metadata/block-fit.js +373 -0
- package/dist/metadata/block-fit.js.map +1 -0
- package/dist/metadata/catalog.d.ts +72 -3
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +1452 -72
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/drafts.d.ts +25 -0
- package/dist/metadata/drafts.d.ts.map +1 -1
- package/dist/metadata/drafts.js +112 -2
- package/dist/metadata/drafts.js.map +1 -1
- package/dist/metadata/metric-match.d.ts +55 -6
- package/dist/metadata/metric-match.d.ts.map +1 -1
- package/dist/metadata/metric-match.js +158 -13
- package/dist/metadata/metric-match.js.map +1 -1
- package/dist/metadata/sql-context-validation.d.ts +13 -1
- package/dist/metadata/sql-context-validation.d.ts.map +1 -1
- package/dist/metadata/sql-context-validation.js +172 -19
- package/dist/metadata/sql-context-validation.js.map +1 -1
- package/dist/metadata/sql-retrieval.d.ts +3 -2
- package/dist/metadata/sql-retrieval.d.ts.map +1 -1
- package/dist/metadata/sql-retrieval.js +6 -4
- package/dist/metadata/sql-retrieval.js.map +1 -1
- package/dist/providers/claude.d.ts +2 -1
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +95 -0
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +2 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +143 -0
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/tool-output.d.ts +2 -0
- package/dist/providers/tool-output.d.ts.map +1 -0
- package/dist/providers/tool-output.js +22 -0
- package/dist/providers/tool-output.js.map +1 -0
- package/dist/providers/types.d.ts +23 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/semantic-bridge/compose.d.ts +89 -0
- package/dist/semantic-bridge/compose.d.ts.map +1 -0
- package/dist/semantic-bridge/compose.js +528 -0
- package/dist/semantic-bridge/compose.js.map +1 -0
- package/dist/semantic-bridge/member-select.d.ts +23 -0
- package/dist/semantic-bridge/member-select.d.ts.map +1 -0
- package/dist/semantic-bridge/member-select.js +106 -0
- package/dist/semantic-bridge/member-select.js.map +1 -0
- package/dist/skills/defaults.d.ts.map +1 -1
- package/dist/skills/defaults.js +5 -0
- package/dist/skills/defaults.js.map +1 -1
- package/dist/synthesize.d.ts +26 -0
- package/dist/synthesize.d.ts.map +1 -1
- package/dist/synthesize.js +72 -3
- package/dist/synthesize.js.map +1 -1
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +692 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/trust/stamp.d.ts +26 -0
- package/dist/trust/stamp.d.ts.map +1 -0
- package/dist/trust/stamp.js +33 -0
- package/dist/trust/stamp.js.map +1 -0
- 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":"
|
|
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"}
|
package/dist/metadata/drafts.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA4BlD,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,SAAS,yBAAyB,CAAC,WAAmB,EAAE,GAAyB;IAC/E,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,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,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;;;;;;;oCAO5B,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,gBAAgB,GAAG,mBAAmB,GAAG,QAAQ;;;UAGlH,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;;;CAG/C,CAAC;AACF,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"}
|
|
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
|
-
* (
|
|
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;
|
|
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
|
|
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;
|
|
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
|
-
* (
|
|
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
|
|
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
|
|
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 ||
|
|
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
|
|
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 {
|
|
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) =>
|
|
229
|
-
if (leafSibling)
|
|
230
|
-
return
|
|
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
|