@duckcodeailabs/dql-agent 1.6.20 → 1.6.22
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 +287 -0
- package/dist/agent-run-engine.d.ts.map +1 -0
- package/dist/agent-run-engine.js +916 -0
- package/dist/agent-run-engine.js.map +1 -0
- package/dist/agent-run-gates.d.ts +26 -0
- package/dist/agent-run-gates.d.ts.map +1 -0
- package/dist/agent-run-gates.js +170 -0
- package/dist/agent-run-gates.js.map +1 -0
- package/dist/agent-run-planner.d.ts +32 -0
- package/dist/agent-run-planner.d.ts.map +1 -0
- package/dist/agent-run-planner.js +280 -0
- package/dist/agent-run-planner.js.map +1 -0
- package/dist/answer-loop.d.ts +49 -0
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +292 -17
- package/dist/answer-loop.js.map +1 -1
- package/dist/app-builder.d.ts +44 -2
- package/dist/app-builder.d.ts.map +1 -1
- package/dist/app-builder.js +558 -123
- package/dist/app-builder.js.map +1 -1
- package/dist/app-planner.d.ts +78 -0
- package/dist/app-planner.d.ts.map +1 -0
- package/dist/app-planner.js +145 -0
- package/dist/app-planner.js.map +1 -0
- package/dist/embeddings/provider.d.ts +66 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +105 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/hints/git-store.d.ts +69 -0
- package/dist/hints/git-store.d.ts.map +1 -0
- package/dist/hints/git-store.js +244 -0
- package/dist/hints/git-store.js.map +1 -0
- package/dist/hints/retrieval.d.ts +49 -0
- package/dist/hints/retrieval.d.ts.map +1 -0
- package/dist/hints/retrieval.js +60 -0
- package/dist/hints/retrieval.js.map +1 -0
- package/dist/hints/store.d.ts +39 -0
- package/dist/hints/store.d.ts.map +1 -0
- package/dist/hints/store.js +279 -0
- package/dist/hints/store.js.map +1 -0
- package/dist/hints/types.d.ts +147 -0
- package/dist/hints/types.d.ts.map +1 -0
- package/dist/hints/types.js +92 -0
- package/dist/hints/types.js.map +1 -0
- package/dist/index.d.ts +43 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -3
- package/dist/index.js.map +1 -1
- package/dist/intent-controller.d.ts +63 -0
- package/dist/intent-controller.d.ts.map +1 -0
- package/dist/intent-controller.js +150 -0
- package/dist/intent-controller.js.map +1 -0
- package/dist/kg/build.d.ts.map +1 -1
- package/dist/kg/build.js +2 -0
- package/dist/kg/build.js.map +1 -1
- package/dist/kg/sqlite-fts.js +4 -0
- package/dist/kg/sqlite-fts.js.map +1 -1
- package/dist/kg/types.d.ts +10 -0
- package/dist/kg/types.d.ts.map +1 -1
- package/dist/metadata/catalog.d.ts +81 -4
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +208 -1
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/drafts.d.ts +22 -0
- package/dist/metadata/drafts.d.ts.map +1 -1
- package/dist/metadata/drafts.js +126 -2
- package/dist/metadata/drafts.js.map +1 -1
- package/dist/metadata/grain-gate.d.ts +61 -0
- package/dist/metadata/grain-gate.d.ts.map +1 -0
- package/dist/metadata/grain-gate.js +265 -0
- package/dist/metadata/grain-gate.js.map +1 -0
- package/dist/metadata/identity.d.ts +47 -0
- package/dist/metadata/identity.d.ts.map +1 -0
- package/dist/metadata/identity.js +147 -0
- package/dist/metadata/identity.js.map +1 -0
- package/dist/metadata/metric-match.d.ts +93 -0
- package/dist/metadata/metric-match.d.ts.map +1 -0
- package/dist/metadata/metric-match.js +233 -0
- package/dist/metadata/metric-match.js.map +1 -0
- package/dist/metadata/sql-grounding.d.ts +149 -0
- package/dist/metadata/sql-grounding.d.ts.map +1 -0
- package/dist/metadata/sql-grounding.js +397 -0
- package/dist/metadata/sql-grounding.js.map +1 -0
- package/dist/metadata/sql-retrieval.d.ts +29 -0
- package/dist/metadata/sql-retrieval.d.ts.map +1 -0
- package/dist/metadata/sql-retrieval.js +79 -0
- package/dist/metadata/sql-retrieval.js.map +1 -0
- package/dist/narrate.d.ts +52 -0
- package/dist/narrate.d.ts.map +1 -0
- package/dist/narrate.js +263 -0
- package/dist/narrate.js.map +1 -0
- package/dist/propose/build-from-prompt.d.ts +160 -0
- package/dist/propose/build-from-prompt.d.ts.map +1 -0
- package/dist/propose/build-from-prompt.js +815 -0
- package/dist/propose/build-from-prompt.js.map +1 -0
- package/dist/propose/classify.d.ts +55 -0
- package/dist/propose/classify.d.ts.map +1 -0
- package/dist/propose/classify.js +167 -0
- package/dist/propose/classify.js.map +1 -0
- package/dist/propose/config.d.ts +39 -0
- package/dist/propose/config.d.ts.map +1 -0
- package/dist/propose/config.js +52 -0
- package/dist/propose/config.js.map +1 -0
- package/dist/propose/dbt-artifacts.d.ts +134 -0
- package/dist/propose/dbt-artifacts.d.ts.map +1 -0
- package/dist/propose/dbt-artifacts.js +320 -0
- package/dist/propose/dbt-artifacts.js.map +1 -0
- package/dist/propose/edit-block.d.ts +74 -0
- package/dist/propose/edit-block.d.ts.map +1 -0
- package/dist/propose/edit-block.js +133 -0
- package/dist/propose/edit-block.js.map +1 -0
- package/dist/propose/enrich.d.ts +48 -0
- package/dist/propose/enrich.d.ts.map +1 -0
- package/dist/propose/enrich.js +125 -0
- package/dist/propose/enrich.js.map +1 -0
- package/dist/propose/generate-sql.d.ts +61 -0
- package/dist/propose/generate-sql.d.ts.map +1 -0
- package/dist/propose/generate-sql.js +180 -0
- package/dist/propose/generate-sql.js.map +1 -0
- package/dist/propose/index.d.ts +24 -0
- package/dist/propose/index.d.ts.map +1 -0
- package/dist/propose/index.js +15 -0
- package/dist/propose/index.js.map +1 -0
- package/dist/propose/propose.d.ts +226 -0
- package/dist/propose/propose.d.ts.map +1 -0
- package/dist/propose/propose.js +668 -0
- package/dist/propose/propose.js.map +1 -0
- package/dist/propose/reflect-block.d.ts +99 -0
- package/dist/propose/reflect-block.d.ts.map +1 -0
- package/dist/propose/reflect-block.js +220 -0
- package/dist/propose/reflect-block.js.map +1 -0
- package/dist/propose/write-draft.d.ts +90 -0
- package/dist/propose/write-draft.d.ts.map +1 -0
- package/dist/propose/write-draft.js +185 -0
- package/dist/propose/write-draft.js.map +1 -0
- package/dist/providers/claude.d.ts +13 -1
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +20 -2
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts +13 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +24 -3
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +3 -3
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -3
- package/dist/providers/index.js.map +1 -1
- package/dist/research-loop.d.ts +62 -0
- package/dist/research-loop.d.ts.map +1 -0
- package/dist/research-loop.js +210 -0
- package/dist/research-loop.js.map +1 -0
- package/dist/skills/defaults.d.ts +37 -0
- package/dist/skills/defaults.d.ts.map +1 -0
- package/dist/skills/defaults.js +152 -0
- package/dist/skills/defaults.js.map +1 -0
- package/dist/skills/loader.d.ts +60 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +164 -2
- package/dist/skills/loader.js.map +1 -1
- package/package.json +7 -5
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional AI enrichment for proposed draft blocks.
|
|
3
|
+
*
|
|
4
|
+
* Principle (spec 13): **structure deterministic, content AI-optional.** The
|
|
5
|
+
* propose engine (`propose.ts`) is fully deterministic — classification, grain,
|
|
6
|
+
* outputs, SQL, ranking, selection. This module is the *only* place an LLM is
|
|
7
|
+
* used, and only to improve human-facing *content* — `description`, `llmContext`,
|
|
8
|
+
* and example questions — for the bounded set the human approved.
|
|
9
|
+
*
|
|
10
|
+
* It is best-effort and isolated: every call has a timeout, any failure (no
|
|
11
|
+
* provider, network, bad JSON, timeout) returns `null` and the caller keeps the
|
|
12
|
+
* deterministic dbt-derived content. The engine consumes the result as plain
|
|
13
|
+
* data (`ProposeOptions.enrichedBySlug`); it never calls a provider itself.
|
|
14
|
+
*/
|
|
15
|
+
const SYSTEM_PROMPT = 'You write concise governance metadata for a certified analytics block built on a dbt model. ' +
|
|
16
|
+
'You are given deterministic facts; do not invent columns, grains, or metrics that are not listed. ' +
|
|
17
|
+
'Respond with ONLY a JSON object — no prose, no markdown fences.';
|
|
18
|
+
function buildUserPrompt(facts) {
|
|
19
|
+
const lines = [
|
|
20
|
+
`Model: ${facts.model}`,
|
|
21
|
+
`Domain: ${facts.domain}`,
|
|
22
|
+
facts.description ? `dbt description: ${facts.description}` : 'dbt description: (none)',
|
|
23
|
+
facts.grain ? `Grain: one row per ${facts.grain}` : 'Grain: (unknown)',
|
|
24
|
+
`Pattern: ${facts.pattern}`,
|
|
25
|
+
facts.metric ? `Backs semantic metric: ${facts.metric}` : null,
|
|
26
|
+
`Columns: ${facts.columns.slice(0, 30).join(', ') || '(unknown)'}`,
|
|
27
|
+
facts.entities.length ? `Entities: ${facts.entities.join(', ')}` : null,
|
|
28
|
+
].filter(Boolean);
|
|
29
|
+
return (`${lines.join('\n')}\n\n` +
|
|
30
|
+
'Produce JSON with exactly these keys:\n' +
|
|
31
|
+
'- "description": one or two sentences, business-facing, what this block answers.\n' +
|
|
32
|
+
'- "llmContext": one to three sentences telling an AI agent when to use this block, its grain, and any caveat.\n' +
|
|
33
|
+
'- "examples": an array of exactly 3 real business questions this block can answer (strings).\n' +
|
|
34
|
+
'Only reference the facts above. Output JSON only.');
|
|
35
|
+
}
|
|
36
|
+
/** Pull the first balanced JSON object out of a model response. */
|
|
37
|
+
function extractJson(text) {
|
|
38
|
+
const start = text.indexOf('{');
|
|
39
|
+
if (start < 0)
|
|
40
|
+
return null;
|
|
41
|
+
let depth = 0;
|
|
42
|
+
let inStr = false;
|
|
43
|
+
let esc = false;
|
|
44
|
+
for (let i = start; i < text.length; i += 1) {
|
|
45
|
+
const ch = text[i];
|
|
46
|
+
if (inStr) {
|
|
47
|
+
if (esc)
|
|
48
|
+
esc = false;
|
|
49
|
+
else if (ch === '\\')
|
|
50
|
+
esc = true;
|
|
51
|
+
else if (ch === '"')
|
|
52
|
+
inStr = false;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (ch === '"')
|
|
56
|
+
inStr = true;
|
|
57
|
+
else if (ch === '{')
|
|
58
|
+
depth += 1;
|
|
59
|
+
else if (ch === '}') {
|
|
60
|
+
depth -= 1;
|
|
61
|
+
if (depth === 0) {
|
|
62
|
+
try {
|
|
63
|
+
return JSON.parse(text.slice(start, i + 1));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function coerce(parsed) {
|
|
74
|
+
if (!parsed || typeof parsed !== 'object')
|
|
75
|
+
return null;
|
|
76
|
+
const obj = parsed;
|
|
77
|
+
const out = {};
|
|
78
|
+
if (typeof obj.description === 'string' && obj.description.trim())
|
|
79
|
+
out.description = obj.description.trim();
|
|
80
|
+
if (typeof obj.llmContext === 'string' && obj.llmContext.trim())
|
|
81
|
+
out.llmContext = obj.llmContext.trim();
|
|
82
|
+
if (Array.isArray(obj.examples)) {
|
|
83
|
+
const qs = obj.examples
|
|
84
|
+
.filter((q) => typeof q === 'string' && q.trim().length > 0)
|
|
85
|
+
.map((q) => q.trim())
|
|
86
|
+
.slice(0, 3);
|
|
87
|
+
if (qs.length > 0)
|
|
88
|
+
out.examples = qs;
|
|
89
|
+
}
|
|
90
|
+
return out.description || out.llmContext || out.examples ? out : null;
|
|
91
|
+
}
|
|
92
|
+
/** Enrich a single proposal. Best-effort: returns null on any failure/timeout. */
|
|
93
|
+
export async function enrichProposal(facts, provider, options = {}) {
|
|
94
|
+
const timeoutMs = options.timeoutMs ?? 25_000;
|
|
95
|
+
try {
|
|
96
|
+
const response = await provider.generate([
|
|
97
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
98
|
+
{ role: 'user', content: buildUserPrompt(facts) },
|
|
99
|
+
], { maxTokens: 400, temperature: 0.2, signal: AbortSignal.timeout(timeoutMs) });
|
|
100
|
+
return coerce(extractJson(response));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Enrich many proposals with bounded concurrency. Always resolves (best-effort);
|
|
108
|
+
* proposals that fail simply stay deterministic. Keyed by slug.
|
|
109
|
+
*/
|
|
110
|
+
export async function enrichProposals(items, provider, options = {}) {
|
|
111
|
+
const result = new Map();
|
|
112
|
+
const concurrency = Math.max(1, options.concurrency ?? 4);
|
|
113
|
+
let cursor = 0;
|
|
114
|
+
async function worker() {
|
|
115
|
+
while (cursor < items.length) {
|
|
116
|
+
const facts = items[cursor++];
|
|
117
|
+
const enriched = await enrichProposal(facts, provider, options);
|
|
118
|
+
if (enriched)
|
|
119
|
+
result.set(facts.slug, enriched);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/propose/enrich.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic business-block SQL generation for `dql propose` (Slice 2).
|
|
3
|
+
*
|
|
4
|
+
* Replaces the old `SELECT * FROM {{ ref(model) }}` passthrough with SQL that
|
|
5
|
+
* reflects the model's business shape — still a SCAFFOLD the human refines, but
|
|
6
|
+
* one whose value (grain, declared outputs, measure aggregation) is real:
|
|
7
|
+
*
|
|
8
|
+
* - metric-backed model (semantic measure) → a real AGGREGATION block: the
|
|
9
|
+
* measure aggregation + declared dimensions/grain from the semantic manifest
|
|
10
|
+
* (the existing `metric_wrapper` pattern). NOT select-star.
|
|
11
|
+
* - entity / dim mart → a NARROWED projection over the canonical columns
|
|
12
|
+
* (grain + declared outputs), not a blind `SELECT *`.
|
|
13
|
+
* - everything else in the selection → a narrowed projection over the declared
|
|
14
|
+
* outputs (falls back to `SELECT *` only when no columns are known).
|
|
15
|
+
*
|
|
16
|
+
* Everything here is deterministic (no LLM). AI enrichment stays an isolated,
|
|
17
|
+
* optional hook elsewhere — this module only uses dbt + semantic evidence.
|
|
18
|
+
*/
|
|
19
|
+
import type { DbtArtifacts, DbtModelNode } from './dbt-artifacts.js';
|
|
20
|
+
import type { ProposalInference } from './propose.js';
|
|
21
|
+
/**
|
|
22
|
+
* Build the business-block SQL for a selected model. Deterministic; chooses the
|
|
23
|
+
* aggregation form for metric-backed models and a narrowed projection otherwise.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildBusinessQuery(model: DbtModelNode, inference: ProposalInference, artifacts: DbtArtifacts): string;
|
|
26
|
+
/**
|
|
27
|
+
* Derive App-ready filters for a block from its filterable columns (output
|
|
28
|
+
* dimensions — NOT measures). Each becomes an `allowedFilter` with an identity
|
|
29
|
+
* `filterBinding` (business filter name = physical column), which the runtime
|
|
30
|
+
* injects as a safe bound WHERE wrapper. This is what makes a generated block
|
|
31
|
+
* immediately drivable by a dashboard control without re-authoring SQL.
|
|
32
|
+
*/
|
|
33
|
+
export declare function deriveBlockFilters(filterColumns: string[]): {
|
|
34
|
+
allowedFilters: string[];
|
|
35
|
+
filterBindings: Array<{
|
|
36
|
+
filter: string;
|
|
37
|
+
binding: string;
|
|
38
|
+
}>;
|
|
39
|
+
};
|
|
40
|
+
/** One metric-bound (semantic) block: the governed metric + its pre-compiled query. */
|
|
41
|
+
export interface MetricWrapperBlock {
|
|
42
|
+
/** Governed metric name to bind via `metric = "<name>"`. */
|
|
43
|
+
metricName: string;
|
|
44
|
+
/** Output column the aggregate is aliased to. */
|
|
45
|
+
alias: string;
|
|
46
|
+
/** Pre-compiled, runnable query (import-adapter shape). */
|
|
47
|
+
sql: string;
|
|
48
|
+
/** Group-by dimensions, surfaced as the block's `dimensions`. */
|
|
49
|
+
dimensions: string[];
|
|
50
|
+
/** Metric description from the semantic manifest, when present. */
|
|
51
|
+
description?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build ONE semantic block per governed metric a model backs. Each block binds the
|
|
55
|
+
* metric (`metric = "<name>"`) and carries the metric's own aggregate as a
|
|
56
|
+
* pre-compiled `query`, so it references the semantic layer AND runs offline. This
|
|
57
|
+
* is what makes proposed metric_wrapper blocks actually use the governed metrics
|
|
58
|
+
* instead of an unbound hand-rolled aggregation.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildMetricWrapperBlocks(model: DbtModelNode, artifacts: DbtArtifacts): MetricWrapperBlock[];
|
|
61
|
+
//# sourceMappingURL=generate-sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-sql.d.ts","sourceRoot":"","sources":["../../src/propose/generate-sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAiGtD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,YAAY,GACtB,MAAM,CAOR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EAAE,GACtB;IAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAS1F;AAED,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,GAAG,kBAAkB,EAAE,CAkC3G"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic business-block SQL generation for `dql propose` (Slice 2).
|
|
3
|
+
*
|
|
4
|
+
* Replaces the old `SELECT * FROM {{ ref(model) }}` passthrough with SQL that
|
|
5
|
+
* reflects the model's business shape — still a SCAFFOLD the human refines, but
|
|
6
|
+
* one whose value (grain, declared outputs, measure aggregation) is real:
|
|
7
|
+
*
|
|
8
|
+
* - metric-backed model (semantic measure) → a real AGGREGATION block: the
|
|
9
|
+
* measure aggregation + declared dimensions/grain from the semantic manifest
|
|
10
|
+
* (the existing `metric_wrapper` pattern). NOT select-star.
|
|
11
|
+
* - entity / dim mart → a NARROWED projection over the canonical columns
|
|
12
|
+
* (grain + declared outputs), not a blind `SELECT *`.
|
|
13
|
+
* - everything else in the selection → a narrowed projection over the declared
|
|
14
|
+
* outputs (falls back to `SELECT *` only when no columns are known).
|
|
15
|
+
*
|
|
16
|
+
* Everything here is deterministic (no LLM). AI enrichment stays an isolated,
|
|
17
|
+
* optional hook elsewhere — this module only uses dbt + semantic evidence.
|
|
18
|
+
*/
|
|
19
|
+
/** Map MetricFlow agg names to a SQL aggregate expression over `expr`. */
|
|
20
|
+
function aggToSql(agg, expr) {
|
|
21
|
+
switch ((agg ?? '').toLowerCase()) {
|
|
22
|
+
case 'count_distinct':
|
|
23
|
+
return `COUNT(DISTINCT ${expr})`;
|
|
24
|
+
case 'count':
|
|
25
|
+
return `COUNT(${expr})`;
|
|
26
|
+
case 'average':
|
|
27
|
+
case 'avg':
|
|
28
|
+
return `AVG(${expr})`;
|
|
29
|
+
case 'min':
|
|
30
|
+
return `MIN(${expr})`;
|
|
31
|
+
case 'max':
|
|
32
|
+
return `MAX(${expr})`;
|
|
33
|
+
case 'median':
|
|
34
|
+
return `MEDIAN(${expr})`;
|
|
35
|
+
case 'sum':
|
|
36
|
+
case 'sum_boolean':
|
|
37
|
+
default:
|
|
38
|
+
return `SUM(${expr})`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** A safe SQL identifier alias for a measure/metric. */
|
|
42
|
+
function aliasFor(name) {
|
|
43
|
+
const safe = name.trim().toLowerCase().replace(/[^a-z0-9_]+/g, '_').replace(/^_+|_+$/g, '');
|
|
44
|
+
return safe || 'metric';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build an AGGREGATION query for a metric-backed model from the semantic
|
|
48
|
+
* manifest: group by the declared dimensions/grain, aggregate each bound
|
|
49
|
+
* measure. Returns undefined when there is no usable semantic measure (caller
|
|
50
|
+
* falls back to a projection).
|
|
51
|
+
*/
|
|
52
|
+
function buildMetricAggregation(model, artifacts) {
|
|
53
|
+
const metrics = artifacts.semanticMetrics.filter((m) => m.model && m.model.toLowerCase() === model.name.toLowerCase() && (m.measure || m.expr));
|
|
54
|
+
if (metrics.length === 0)
|
|
55
|
+
return undefined;
|
|
56
|
+
const semanticModel = artifacts.semanticModels.get(model.name);
|
|
57
|
+
// Group-by dimensions: declared time dimensions first, then the primary entity.
|
|
58
|
+
const groupCols = [];
|
|
59
|
+
if (semanticModel) {
|
|
60
|
+
for (const dim of semanticModel.timeDimensions) {
|
|
61
|
+
if (!groupCols.includes(dim))
|
|
62
|
+
groupCols.push(dim);
|
|
63
|
+
}
|
|
64
|
+
if (semanticModel.primaryEntity && !groupCols.includes(semanticModel.primaryEntity)) {
|
|
65
|
+
groupCols.push(semanticModel.primaryEntity);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// One aggregate column per distinct measure (dedupe by alias).
|
|
69
|
+
const seen = new Set();
|
|
70
|
+
const aggregates = [];
|
|
71
|
+
for (const metric of metrics) {
|
|
72
|
+
const expr = metric.expr || metric.measure;
|
|
73
|
+
const alias = aliasFor(metric.measure || metric.name);
|
|
74
|
+
if (seen.has(alias))
|
|
75
|
+
continue;
|
|
76
|
+
seen.add(alias);
|
|
77
|
+
aggregates.push(`${aggToSql(metric.agg, expr)} AS ${alias}`);
|
|
78
|
+
}
|
|
79
|
+
if (aggregates.length === 0)
|
|
80
|
+
return undefined;
|
|
81
|
+
const ref = `{{ ref('${model.name}') }}`;
|
|
82
|
+
const selectLines = [...groupCols, ...aggregates];
|
|
83
|
+
const select = selectLines.map((line) => ` ${line}`).join(',\n');
|
|
84
|
+
let sql = `SELECT\n${select}\nFROM ${ref}`;
|
|
85
|
+
if (groupCols.length > 0) {
|
|
86
|
+
sql += `\nGROUP BY ${groupCols.map((_, i) => i + 1).join(', ')}`;
|
|
87
|
+
}
|
|
88
|
+
return sql;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build a NARROWED projection over the model's declared outputs (canonical
|
|
92
|
+
* columns), grain column first when known. Falls back to `SELECT *` only when no
|
|
93
|
+
* columns are known at all.
|
|
94
|
+
*/
|
|
95
|
+
function buildProjection(model, inference) {
|
|
96
|
+
const ref = `{{ ref('${model.name}') }}`;
|
|
97
|
+
const outputs = inference.declaredOutputs ?? [];
|
|
98
|
+
if (outputs.length === 0) {
|
|
99
|
+
return `SELECT * FROM ${ref}`;
|
|
100
|
+
}
|
|
101
|
+
// Grain column leads the projection so the row identity is obvious.
|
|
102
|
+
const grain = inference.grain;
|
|
103
|
+
const ordered = grain && outputs.includes(grain)
|
|
104
|
+
? [grain, ...outputs.filter((c) => c !== grain)]
|
|
105
|
+
: outputs;
|
|
106
|
+
const select = ordered.map((c) => ` ${c}`).join(',\n');
|
|
107
|
+
return `SELECT\n${select}\nFROM ${ref}`;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Build the business-block SQL for a selected model. Deterministic; chooses the
|
|
111
|
+
* aggregation form for metric-backed models and a narrowed projection otherwise.
|
|
112
|
+
*/
|
|
113
|
+
export function buildBusinessQuery(model, inference, artifacts) {
|
|
114
|
+
if (inference.pattern === 'metric_wrapper') {
|
|
115
|
+
const aggregation = buildMetricAggregation(model, artifacts);
|
|
116
|
+
if (aggregation)
|
|
117
|
+
return aggregation;
|
|
118
|
+
// No usable measure metadata → fall back to a narrowed projection.
|
|
119
|
+
}
|
|
120
|
+
return buildProjection(model, inference);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Derive App-ready filters for a block from its filterable columns (output
|
|
124
|
+
* dimensions — NOT measures). Each becomes an `allowedFilter` with an identity
|
|
125
|
+
* `filterBinding` (business filter name = physical column), which the runtime
|
|
126
|
+
* injects as a safe bound WHERE wrapper. This is what makes a generated block
|
|
127
|
+
* immediately drivable by a dashboard control without re-authoring SQL.
|
|
128
|
+
*/
|
|
129
|
+
export function deriveBlockFilters(filterColumns) {
|
|
130
|
+
const cols = filterColumns
|
|
131
|
+
.map((c) => c.trim())
|
|
132
|
+
.filter((c, i, arr) => c && /^[A-Za-z_][A-Za-z0-9_]*$/.test(c) && arr.indexOf(c) === i)
|
|
133
|
+
.slice(0, 6);
|
|
134
|
+
return {
|
|
135
|
+
allowedFilters: cols,
|
|
136
|
+
filterBindings: cols.map((c) => ({ filter: c, binding: c })),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Build ONE semantic block per governed metric a model backs. Each block binds the
|
|
141
|
+
* metric (`metric = "<name>"`) and carries the metric's own aggregate as a
|
|
142
|
+
* pre-compiled `query`, so it references the semantic layer AND runs offline. This
|
|
143
|
+
* is what makes proposed metric_wrapper blocks actually use the governed metrics
|
|
144
|
+
* instead of an unbound hand-rolled aggregation.
|
|
145
|
+
*/
|
|
146
|
+
export function buildMetricWrapperBlocks(model, artifacts) {
|
|
147
|
+
const metrics = artifacts.semanticMetrics.filter((m) => m.model && m.model.toLowerCase() === model.name.toLowerCase() && (m.measure || m.expr));
|
|
148
|
+
if (metrics.length === 0)
|
|
149
|
+
return [];
|
|
150
|
+
const semanticModel = artifacts.semanticModels.get(model.name);
|
|
151
|
+
// Group a metric ONLY by time dimensions (e.g. daily revenue) — NOT by the
|
|
152
|
+
// primary entity id. Grouping a measure by its own grain (order_item_id) is
|
|
153
|
+
// degenerate (SUM over one row = the row's value), which made the metric blocks
|
|
154
|
+
// meaningless. No time dimension → no GROUP BY → the metric's grand total.
|
|
155
|
+
const groupCols = [];
|
|
156
|
+
if (semanticModel) {
|
|
157
|
+
for (const dim of semanticModel.timeDimensions) {
|
|
158
|
+
if (!groupCols.includes(dim))
|
|
159
|
+
groupCols.push(dim);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const ref = `{{ ref('${model.name}') }}`;
|
|
163
|
+
const seen = new Set();
|
|
164
|
+
const blocks = [];
|
|
165
|
+
for (const metric of metrics) {
|
|
166
|
+
if (seen.has(metric.name))
|
|
167
|
+
continue;
|
|
168
|
+
seen.add(metric.name);
|
|
169
|
+
const expr = metric.expr || metric.measure;
|
|
170
|
+
const alias = aliasFor(metric.measure || metric.name);
|
|
171
|
+
const selectLines = [...groupCols, `${aggToSql(metric.agg, expr)} AS ${alias}`];
|
|
172
|
+
let sql = `SELECT\n${selectLines.map((line) => ` ${line}`).join(',\n')}\nFROM ${ref}`;
|
|
173
|
+
if (groupCols.length > 0) {
|
|
174
|
+
sql += `\nGROUP BY ${groupCols.map((_, i) => i + 1).join(', ')}`;
|
|
175
|
+
}
|
|
176
|
+
blocks.push({ metricName: metric.name, alias, sql, dimensions: groupCols, description: metric.description });
|
|
177
|
+
}
|
|
178
|
+
return blocks;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=generate-sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-sql.js","sourceRoot":"","sources":["../../src/propose/generate-sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql propose` — turn dbt evidence into a ranked queue of DRAFT blocks.
|
|
3
|
+
* AI drafts, humans certify. Nothing here is ever written as certified.
|
|
4
|
+
*/
|
|
5
|
+
export { propose, proposePlan, buildProposePreview } from './propose.js';
|
|
6
|
+
export type { ProposeOptions, ProposeSummary, ProposalResult, ProposalInference, ProposalRanking, ProposedPattern, ProposePlan, ProposePlanOptions, ProposePlanDomain, ProposePlanCandidate, ProposePreviewOptions, } from './propose.js';
|
|
7
|
+
export { buildFromPrompt } from './build-from-prompt.js';
|
|
8
|
+
export type { BuildFromPromptOptions, BuildFromPromptContext, BuildFromPromptResult, BuildCellResult, BuildBlockResult, BuildMode, BuildRoute, CertifierVerdict, AppliedSkill, } from './build-from-prompt.js';
|
|
9
|
+
export { loadBlockForEdit, renderEditedBlock, resolveEditedStatus, } from './edit-block.js';
|
|
10
|
+
export type { LoadedBlock, EditedBlockFields } from './edit-block.js';
|
|
11
|
+
export { resolveProposeConfig, DEFAULT_PROPOSE_CONFIG, } from './config.js';
|
|
12
|
+
export type { ProposeConfig, ProposeConfigInput } from './config.js';
|
|
13
|
+
export { classifyModel, resolveDomain } from './classify.js';
|
|
14
|
+
export type { Classification, ClassificationResult } from './classify.js';
|
|
15
|
+
export { loadDbtArtifacts, buildQualifiedRelation } from './dbt-artifacts.js';
|
|
16
|
+
export type { DbtArtifacts, DbtModelNode, DbtSourceNode, DbtColumn, SemanticMetricRef, SemanticModelRef, } from './dbt-artifacts.js';
|
|
17
|
+
export { buildBusinessQuery } from './generate-sql.js';
|
|
18
|
+
export { upsertProposedDraft, renderProposedDraft, blockSlug, } from './write-draft.js';
|
|
19
|
+
export type { ProposedDraftRecord, WrittenDraft } from './write-draft.js';
|
|
20
|
+
export { enrichProposal, enrichProposals } from './enrich.js';
|
|
21
|
+
export type { EnrichFacts, EnrichedContent, EnrichOptions } from './enrich.js';
|
|
22
|
+
export { reflectAndReviseBlock } from './reflect-block.js';
|
|
23
|
+
export type { ReflectableDraft, ExecutionProbe, BlockReflection, ReflectionFix, } from './reflect-block.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/propose/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql propose` — turn dbt evidence into a ranked queue of DRAFT blocks.
|
|
3
|
+
* AI drafts, humans certify. Nothing here is ever written as certified.
|
|
4
|
+
*/
|
|
5
|
+
export { propose, proposePlan, buildProposePreview } from './propose.js';
|
|
6
|
+
export { buildFromPrompt } from './build-from-prompt.js';
|
|
7
|
+
export { loadBlockForEdit, renderEditedBlock, resolveEditedStatus, } from './edit-block.js';
|
|
8
|
+
export { resolveProposeConfig, DEFAULT_PROPOSE_CONFIG, } from './config.js';
|
|
9
|
+
export { classifyModel, resolveDomain } from './classify.js';
|
|
10
|
+
export { loadDbtArtifacts, buildQualifiedRelation } from './dbt-artifacts.js';
|
|
11
|
+
export { buildBusinessQuery } from './generate-sql.js';
|
|
12
|
+
export { upsertProposedDraft, renderProposedDraft, blockSlug, } from './write-draft.js';
|
|
13
|
+
export { enrichProposal, enrichProposals } from './enrich.js';
|
|
14
|
+
export { reflectAndReviseBlock } from './reflect-block.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/propose/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAczE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAYzD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAS9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,GACV,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
|