@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.
Files changed (160) hide show
  1. package/dist/agent-run-engine.d.ts +287 -0
  2. package/dist/agent-run-engine.d.ts.map +1 -0
  3. package/dist/agent-run-engine.js +916 -0
  4. package/dist/agent-run-engine.js.map +1 -0
  5. package/dist/agent-run-gates.d.ts +26 -0
  6. package/dist/agent-run-gates.d.ts.map +1 -0
  7. package/dist/agent-run-gates.js +170 -0
  8. package/dist/agent-run-gates.js.map +1 -0
  9. package/dist/agent-run-planner.d.ts +32 -0
  10. package/dist/agent-run-planner.d.ts.map +1 -0
  11. package/dist/agent-run-planner.js +280 -0
  12. package/dist/agent-run-planner.js.map +1 -0
  13. package/dist/answer-loop.d.ts +49 -0
  14. package/dist/answer-loop.d.ts.map +1 -1
  15. package/dist/answer-loop.js +292 -17
  16. package/dist/answer-loop.js.map +1 -1
  17. package/dist/app-builder.d.ts +44 -2
  18. package/dist/app-builder.d.ts.map +1 -1
  19. package/dist/app-builder.js +558 -123
  20. package/dist/app-builder.js.map +1 -1
  21. package/dist/app-planner.d.ts +78 -0
  22. package/dist/app-planner.d.ts.map +1 -0
  23. package/dist/app-planner.js +145 -0
  24. package/dist/app-planner.js.map +1 -0
  25. package/dist/embeddings/provider.d.ts +66 -0
  26. package/dist/embeddings/provider.d.ts.map +1 -0
  27. package/dist/embeddings/provider.js +105 -0
  28. package/dist/embeddings/provider.js.map +1 -0
  29. package/dist/hints/git-store.d.ts +69 -0
  30. package/dist/hints/git-store.d.ts.map +1 -0
  31. package/dist/hints/git-store.js +244 -0
  32. package/dist/hints/git-store.js.map +1 -0
  33. package/dist/hints/retrieval.d.ts +49 -0
  34. package/dist/hints/retrieval.d.ts.map +1 -0
  35. package/dist/hints/retrieval.js +60 -0
  36. package/dist/hints/retrieval.js.map +1 -0
  37. package/dist/hints/store.d.ts +39 -0
  38. package/dist/hints/store.d.ts.map +1 -0
  39. package/dist/hints/store.js +279 -0
  40. package/dist/hints/store.js.map +1 -0
  41. package/dist/hints/types.d.ts +147 -0
  42. package/dist/hints/types.d.ts.map +1 -0
  43. package/dist/hints/types.js +92 -0
  44. package/dist/hints/types.js.map +1 -0
  45. package/dist/index.d.ts +43 -6
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +35 -3
  48. package/dist/index.js.map +1 -1
  49. package/dist/intent-controller.d.ts +63 -0
  50. package/dist/intent-controller.d.ts.map +1 -0
  51. package/dist/intent-controller.js +150 -0
  52. package/dist/intent-controller.js.map +1 -0
  53. package/dist/kg/build.d.ts.map +1 -1
  54. package/dist/kg/build.js +2 -0
  55. package/dist/kg/build.js.map +1 -1
  56. package/dist/kg/sqlite-fts.js +4 -0
  57. package/dist/kg/sqlite-fts.js.map +1 -1
  58. package/dist/kg/types.d.ts +10 -0
  59. package/dist/kg/types.d.ts.map +1 -1
  60. package/dist/metadata/catalog.d.ts +81 -4
  61. package/dist/metadata/catalog.d.ts.map +1 -1
  62. package/dist/metadata/catalog.js +208 -1
  63. package/dist/metadata/catalog.js.map +1 -1
  64. package/dist/metadata/drafts.d.ts +22 -0
  65. package/dist/metadata/drafts.d.ts.map +1 -1
  66. package/dist/metadata/drafts.js +126 -2
  67. package/dist/metadata/drafts.js.map +1 -1
  68. package/dist/metadata/grain-gate.d.ts +61 -0
  69. package/dist/metadata/grain-gate.d.ts.map +1 -0
  70. package/dist/metadata/grain-gate.js +265 -0
  71. package/dist/metadata/grain-gate.js.map +1 -0
  72. package/dist/metadata/identity.d.ts +47 -0
  73. package/dist/metadata/identity.d.ts.map +1 -0
  74. package/dist/metadata/identity.js +147 -0
  75. package/dist/metadata/identity.js.map +1 -0
  76. package/dist/metadata/metric-match.d.ts +93 -0
  77. package/dist/metadata/metric-match.d.ts.map +1 -0
  78. package/dist/metadata/metric-match.js +233 -0
  79. package/dist/metadata/metric-match.js.map +1 -0
  80. package/dist/metadata/sql-grounding.d.ts +149 -0
  81. package/dist/metadata/sql-grounding.d.ts.map +1 -0
  82. package/dist/metadata/sql-grounding.js +397 -0
  83. package/dist/metadata/sql-grounding.js.map +1 -0
  84. package/dist/metadata/sql-retrieval.d.ts +29 -0
  85. package/dist/metadata/sql-retrieval.d.ts.map +1 -0
  86. package/dist/metadata/sql-retrieval.js +79 -0
  87. package/dist/metadata/sql-retrieval.js.map +1 -0
  88. package/dist/narrate.d.ts +52 -0
  89. package/dist/narrate.d.ts.map +1 -0
  90. package/dist/narrate.js +263 -0
  91. package/dist/narrate.js.map +1 -0
  92. package/dist/propose/build-from-prompt.d.ts +160 -0
  93. package/dist/propose/build-from-prompt.d.ts.map +1 -0
  94. package/dist/propose/build-from-prompt.js +815 -0
  95. package/dist/propose/build-from-prompt.js.map +1 -0
  96. package/dist/propose/classify.d.ts +55 -0
  97. package/dist/propose/classify.d.ts.map +1 -0
  98. package/dist/propose/classify.js +167 -0
  99. package/dist/propose/classify.js.map +1 -0
  100. package/dist/propose/config.d.ts +39 -0
  101. package/dist/propose/config.d.ts.map +1 -0
  102. package/dist/propose/config.js +52 -0
  103. package/dist/propose/config.js.map +1 -0
  104. package/dist/propose/dbt-artifacts.d.ts +134 -0
  105. package/dist/propose/dbt-artifacts.d.ts.map +1 -0
  106. package/dist/propose/dbt-artifacts.js +320 -0
  107. package/dist/propose/dbt-artifacts.js.map +1 -0
  108. package/dist/propose/edit-block.d.ts +74 -0
  109. package/dist/propose/edit-block.d.ts.map +1 -0
  110. package/dist/propose/edit-block.js +133 -0
  111. package/dist/propose/edit-block.js.map +1 -0
  112. package/dist/propose/enrich.d.ts +48 -0
  113. package/dist/propose/enrich.d.ts.map +1 -0
  114. package/dist/propose/enrich.js +125 -0
  115. package/dist/propose/enrich.js.map +1 -0
  116. package/dist/propose/generate-sql.d.ts +61 -0
  117. package/dist/propose/generate-sql.d.ts.map +1 -0
  118. package/dist/propose/generate-sql.js +180 -0
  119. package/dist/propose/generate-sql.js.map +1 -0
  120. package/dist/propose/index.d.ts +24 -0
  121. package/dist/propose/index.d.ts.map +1 -0
  122. package/dist/propose/index.js +15 -0
  123. package/dist/propose/index.js.map +1 -0
  124. package/dist/propose/propose.d.ts +226 -0
  125. package/dist/propose/propose.d.ts.map +1 -0
  126. package/dist/propose/propose.js +668 -0
  127. package/dist/propose/propose.js.map +1 -0
  128. package/dist/propose/reflect-block.d.ts +99 -0
  129. package/dist/propose/reflect-block.d.ts.map +1 -0
  130. package/dist/propose/reflect-block.js +220 -0
  131. package/dist/propose/reflect-block.js.map +1 -0
  132. package/dist/propose/write-draft.d.ts +90 -0
  133. package/dist/propose/write-draft.d.ts.map +1 -0
  134. package/dist/propose/write-draft.js +185 -0
  135. package/dist/propose/write-draft.js.map +1 -0
  136. package/dist/providers/claude.d.ts +13 -1
  137. package/dist/providers/claude.d.ts.map +1 -1
  138. package/dist/providers/claude.js +20 -2
  139. package/dist/providers/claude.js.map +1 -1
  140. package/dist/providers/gemini.d.ts +13 -1
  141. package/dist/providers/gemini.d.ts.map +1 -1
  142. package/dist/providers/gemini.js +24 -3
  143. package/dist/providers/gemini.js.map +1 -1
  144. package/dist/providers/index.d.ts +3 -3
  145. package/dist/providers/index.d.ts.map +1 -1
  146. package/dist/providers/index.js +3 -3
  147. package/dist/providers/index.js.map +1 -1
  148. package/dist/research-loop.d.ts +62 -0
  149. package/dist/research-loop.d.ts.map +1 -0
  150. package/dist/research-loop.js +210 -0
  151. package/dist/research-loop.js.map +1 -0
  152. package/dist/skills/defaults.d.ts +37 -0
  153. package/dist/skills/defaults.d.ts.map +1 -0
  154. package/dist/skills/defaults.js +152 -0
  155. package/dist/skills/defaults.js.map +1 -0
  156. package/dist/skills/loader.d.ts +60 -0
  157. package/dist/skills/loader.d.ts.map +1 -1
  158. package/dist/skills/loader.js +164 -2
  159. package/dist/skills/loader.js.map +1 -1
  160. package/package.json +7 -5
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Narrate service — turns a *grounded, executed* query result into a stakeholder
3
+ * story: a summary, key findings, an optional recommendation, and optional
4
+ * per-item (per-tile) insight captions.
5
+ *
6
+ * It is provider-agnostic by design (mirrors `createLlmAgentRunPlanner`): callers
7
+ * inject a plain text completion (`NarrateCompletion`); any parse/transport
8
+ * failure — or no injected LLM at all — falls back to a deterministic narration
9
+ * computed from the rows (totals, leader, concentration, range). That keeps
10
+ * Research and App storytelling fast, offline, and always-grounded: narration
11
+ * only ever describes data the loop already executed against governed sources.
12
+ */
13
+ export async function narrateResult(input, options = {}) {
14
+ const deterministic = deterministicNarrate(input, options.maxFindings ?? 4);
15
+ if (!options.complete)
16
+ return deterministic;
17
+ try {
18
+ const raw = await options.complete({
19
+ system: buildNarrateSystemPrompt(input.reviewRequired ?? false),
20
+ user: buildNarrateUserPrompt(input),
21
+ signal: options.signal,
22
+ });
23
+ const parsed = parseNarration(raw);
24
+ if (parsed) {
25
+ return {
26
+ summary: parsed.summary ?? deterministic.summary,
27
+ keyFindings: parsed.keyFindings?.length ? parsed.keyFindings : deterministic.keyFindings,
28
+ recommendation: parsed.recommendation ?? deterministic.recommendation,
29
+ // Per-item captions are computed deterministically from each tile's rows
30
+ // unless the model supplied them; keep deterministic as the floor.
31
+ perItemInsight: { ...deterministic.perItemInsight, ...(parsed.perItemInsight ?? {}) },
32
+ source: "llm",
33
+ };
34
+ }
35
+ }
36
+ catch {
37
+ // fall through to deterministic
38
+ }
39
+ return deterministic;
40
+ }
41
+ // ---------- deterministic narration ----------
42
+ function deterministicNarrate(input, maxFindings) {
43
+ const result = input.result;
44
+ const rows = result?.rows ?? [];
45
+ const perItemInsight = buildPerItemInsight(input.items);
46
+ if (rows.length === 0) {
47
+ return {
48
+ summary: `No rows were returned for "${truncate(input.question, 80)}".`,
49
+ keyFindings: [],
50
+ perItemInsight,
51
+ source: "deterministic",
52
+ };
53
+ }
54
+ const { label, value } = pickColumns(result);
55
+ const findings = [];
56
+ if (value) {
57
+ const ranked = [...rows]
58
+ .map((row) => ({ label: label ? formatCell(row[label]) : "row", value: toNumber(row[value]) }))
59
+ .filter((entry) => entry.value !== undefined);
60
+ ranked.sort((a, b) => b.value - a.value);
61
+ const total = ranked.reduce((sum, entry) => sum + entry.value, 0);
62
+ const top = ranked[0];
63
+ let summary = `${rows.length} ${label ?? "row"}${rows.length === 1 ? "" : "s"} analyzed`;
64
+ if (top) {
65
+ summary += `: ${top.label} leads ${value} at ${formatNumber(top.value)}`;
66
+ if (total > 0)
67
+ summary += ` (${formatPct(top.value / total)})`;
68
+ summary += ".";
69
+ findings.push(`${top.label} is the largest ${label ?? "entry"} at ${formatNumber(top.value)}${total > 0 ? ` (${formatPct(top.value / total)} of ${value})` : ""}.`);
70
+ }
71
+ if (total > 0 && ranked.length >= 3) {
72
+ const topThree = ranked.slice(0, 3).reduce((sum, entry) => sum + entry.value, 0);
73
+ findings.push(`Top 3 ${label ?? "entries"} are ${formatPct(topThree / total)} of ${value} — concentration to watch.`);
74
+ }
75
+ const bottom = ranked[ranked.length - 1];
76
+ if (bottom && ranked.length >= 4 && bottom.label !== top?.label) {
77
+ findings.push(`${bottom.label} is the smallest at ${formatNumber(bottom.value)}.`);
78
+ }
79
+ }
80
+ else {
81
+ findings.push(`${rows.length} rows returned across columns: ${(result?.columns ?? []).slice(0, 6).join(", ")}.`);
82
+ }
83
+ return {
84
+ summary: findings[0] ? findings[0] : `${rows.length} rows returned for "${truncate(input.question, 80)}".`,
85
+ keyFindings: findings.slice(0, maxFindings),
86
+ perItemInsight,
87
+ source: "deterministic",
88
+ };
89
+ }
90
+ function buildPerItemInsight(items) {
91
+ if (!items?.length)
92
+ return undefined;
93
+ const out = {};
94
+ for (const item of items) {
95
+ const rows = item.result?.rows ?? [];
96
+ if (rows.length === 0)
97
+ continue;
98
+ const { label, value } = pickColumns(item.result);
99
+ if (!value) {
100
+ out[item.id] = `${rows.length} rows.`;
101
+ continue;
102
+ }
103
+ const ranked = rows
104
+ .map((row) => ({ label: label ? formatCell(row[label]) : "row", value: toNumber(row[value]) }))
105
+ .filter((entry) => entry.value !== undefined);
106
+ ranked.sort((a, b) => b.value - a.value);
107
+ const total = ranked.reduce((sum, entry) => sum + entry.value, 0);
108
+ const top = ranked[0];
109
+ if (!top)
110
+ continue;
111
+ out[item.id] = total > 0
112
+ ? `${top.label} leads at ${formatNumber(top.value)} (${formatPct(top.value / total)}).`
113
+ : `${top.label} leads at ${formatNumber(top.value)}.`;
114
+ }
115
+ return Object.keys(out).length > 0 ? out : undefined;
116
+ }
117
+ function pickColumns(result) {
118
+ const columns = result.columns ?? [];
119
+ const sample = result.rows?.[0] ?? {};
120
+ let value;
121
+ let label;
122
+ for (const column of columns) {
123
+ if (value === undefined && toNumber(sample[column]) !== undefined)
124
+ value = column;
125
+ }
126
+ for (const column of columns) {
127
+ if (column !== value && typeof sample[column] === "string") {
128
+ label = column;
129
+ break;
130
+ }
131
+ }
132
+ if (!label)
133
+ label = columns.find((column) => column !== value);
134
+ return { label, value };
135
+ }
136
+ // ---------- LLM path ----------
137
+ function buildNarrateSystemPrompt(reviewRequired) {
138
+ return [
139
+ "You explain analytics results to a business stakeholder in plain terms.",
140
+ "Given a question and the executed result, write a short story: a one-sentence summary, 2-4 key",
141
+ "findings (numbers + what they mean), and an optional one-line recommendation.",
142
+ "Only describe what the data shows — never invent numbers or sources.",
143
+ reviewRequired
144
+ ? "This result is review-required (uncertified); keep claims cautious and directional."
145
+ : "This result is from certified, governed data.",
146
+ "Respond with ONLY a JSON object, no prose, no code fences:",
147
+ '{"summary": string, "keyFindings": string[], "recommendation"?: string}',
148
+ ].join("\n");
149
+ }
150
+ function buildNarrateUserPrompt(input) {
151
+ const lines = [];
152
+ lines.push(`Question: ${input.question}`);
153
+ if (input.intent)
154
+ lines.push(`Intent: ${input.intent}`);
155
+ if (input.evidence?.length)
156
+ lines.push(`Governed sources: ${input.evidence.join(", ")}`);
157
+ if (input.result) {
158
+ lines.push(`Columns: ${input.result.columns.join(", ")}`);
159
+ const sample = input.result.rows.slice(0, 20);
160
+ lines.push(`Rows (up to 20): ${JSON.stringify(sample)}`);
161
+ }
162
+ lines.push("Return the narration as JSON.");
163
+ return lines.join("\n");
164
+ }
165
+ function parseNarration(raw) {
166
+ const parsed = extractJsonObject(raw);
167
+ if (!parsed || typeof parsed !== "object")
168
+ return undefined;
169
+ const record = parsed;
170
+ const summary = typeof record.summary === "string" && record.summary.trim() ? record.summary.trim() : undefined;
171
+ const keyFindings = Array.isArray(record.keyFindings)
172
+ ? record.keyFindings.filter((value) => typeof value === "string" && value.trim().length > 0)
173
+ : undefined;
174
+ if (!summary && !keyFindings?.length)
175
+ return undefined;
176
+ const recommendation = typeof record.recommendation === "string" && record.recommendation.trim()
177
+ ? record.recommendation.trim()
178
+ : undefined;
179
+ let perItemInsight;
180
+ if (record.perItemInsight && typeof record.perItemInsight === "object" && !Array.isArray(record.perItemInsight)) {
181
+ perItemInsight = {};
182
+ for (const [key, val] of Object.entries(record.perItemInsight)) {
183
+ if (typeof val === "string" && val.trim())
184
+ perItemInsight[key] = val.trim();
185
+ }
186
+ }
187
+ return { summary, keyFindings, recommendation, perItemInsight };
188
+ }
189
+ function extractJsonObject(raw) {
190
+ const trimmed = raw.trim().replace(/^```(?:json)?/i, "").replace(/```$/i, "").trim();
191
+ const start = trimmed.indexOf("{");
192
+ if (start < 0)
193
+ return undefined;
194
+ let depth = 0;
195
+ let inString = false;
196
+ let escaped = false;
197
+ for (let i = start; i < trimmed.length; i += 1) {
198
+ const char = trimmed[i];
199
+ if (inString) {
200
+ if (escaped)
201
+ escaped = false;
202
+ else if (char === "\\")
203
+ escaped = true;
204
+ else if (char === '"')
205
+ inString = false;
206
+ continue;
207
+ }
208
+ if (char === '"')
209
+ inString = true;
210
+ else if (char === "{")
211
+ depth += 1;
212
+ else if (char === "}") {
213
+ depth -= 1;
214
+ if (depth === 0) {
215
+ try {
216
+ return JSON.parse(trimmed.slice(start, i + 1));
217
+ }
218
+ catch {
219
+ return undefined;
220
+ }
221
+ }
222
+ }
223
+ }
224
+ return undefined;
225
+ }
226
+ // ---------- formatting (rounded; no float artifacts on screen) ----------
227
+ function toNumber(value) {
228
+ if (typeof value === "number" && Number.isFinite(value))
229
+ return value;
230
+ if (typeof value === "bigint")
231
+ return Number(value);
232
+ if (typeof value === "string") {
233
+ const cleaned = value.replace(/[$,%\s]/g, "");
234
+ const parsed = Number(cleaned);
235
+ return Number.isFinite(parsed) && cleaned.length > 0 ? parsed : undefined;
236
+ }
237
+ return undefined;
238
+ }
239
+ function formatNumber(value) {
240
+ const abs = Math.abs(value);
241
+ if (abs >= 1_000_000)
242
+ return `${(value / 1_000_000).toFixed(1)}M`;
243
+ if (abs >= 1_000)
244
+ return `${(value / 1_000).toFixed(1)}K`;
245
+ return Number.isInteger(value) ? String(value) : value.toFixed(2);
246
+ }
247
+ function formatPct(ratio) {
248
+ return `${Math.round(ratio * 100)}%`;
249
+ }
250
+ function formatCell(value) {
251
+ if (value === null || value === undefined)
252
+ return "—";
253
+ if (typeof value === "string")
254
+ return value;
255
+ if (typeof value === "number" || typeof value === "bigint")
256
+ return String(value);
257
+ return String(value);
258
+ }
259
+ function truncate(text, max) {
260
+ const clean = text.replace(/\s+/g, " ").trim();
261
+ return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
262
+ }
263
+ //# sourceMappingURL=narrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrate.js","sourceRoot":"","sources":["../src/narrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Unified AI BUILD engine (spec 14, part B) — ONE engine, two targets.
3
+ *
4
+ * `buildFromPrompt` turns a natural-language prompt into either:
5
+ * - target:'cell' → a SQL snippet for an ad-hoc notebook cell (writes nothing).
6
+ * - target:'block' → a COMPLETE governance DRAFT written to disk via
7
+ * `upsertProposedDraft`, with its Certifier verdict stored.
8
+ *
9
+ * It deliberately does NOT route through the governed Q&A answer-loop
10
+ * (`answer()` / `ask_dql`). Building is a different intent: it must not leak the
11
+ * answer-loop's self-correction reasoning, evidence tiers, or reviewStatus. We
12
+ * reuse the lighter plumbing instead:
13
+ * - `pickProvider` / `provider.generate` for AI content (optional),
14
+ * - `loadDbtArtifacts` for offline schema grounding,
15
+ * - `deriveSemanticDraftName` for a semantic block name,
16
+ * - `resolveLocalOwner` so a draft is never born without an owner,
17
+ * - `upsertProposedDraft` + `Certifier` for the draft + stored verdict.
18
+ *
19
+ * Principles enforced here:
20
+ * - AI drafts, humans certify: a block is ALWAYS `status: "draft"`; this engine
21
+ * never writes `certified`.
22
+ * - Structure deterministic, content AI-optional: with no provider, the cell
23
+ * target returns a deterministic templated SELECT (or a helpful message in
24
+ * `explanation`) and the block target falls back to deterministic content.
25
+ * It never crashes on the offline path.
26
+ */
27
+ import { type ExecutionProbe, type BlockReflection } from './reflect-block.js';
28
+ import type { KGNode } from '../kg/types.js';
29
+ import type { Skill } from '../skills/loader.js';
30
+ import type { AgentProvider } from '../providers/types.js';
31
+ import { blockSlug } from './write-draft.js';
32
+ export interface BuildFromPromptContext {
33
+ /** Current SQL in the focused cell (for refine/extend prompts). */
34
+ cellSql?: string;
35
+ /** A selected fragment the user highlighted. */
36
+ selection?: string;
37
+ }
38
+ /** Build mode (spec 17, part A). `edit` updates an existing block in place. */
39
+ export type BuildMode = 'create' | 'edit';
40
+ /** The chosen route surfaced on the build response (spec 17, part C). */
41
+ export interface BuildRoute {
42
+ tier: 'certified_block' | 'semantic_metric' | 'generated_sql' | 'business_context' | 'no_answer';
43
+ label: string;
44
+ ref?: string;
45
+ }
46
+ export interface BuildFromPromptOptions {
47
+ projectRoot: string;
48
+ prompt: string;
49
+ context?: BuildFromPromptContext;
50
+ target: 'cell' | 'block';
51
+ /**
52
+ * Build mode (spec 17, part A). `'create'` (default) writes a NEW deduped
53
+ * draft. `'edit'` loads the existing block at `blockPath`, applies the user's
54
+ * change, and writes back to the SAME path. Edit mode is only meaningful for
55
+ * `target: 'block'`.
56
+ */
57
+ mode?: BuildMode;
58
+ /**
59
+ * Project-relative (or absolute) path of the block to edit. REQUIRED in edit
60
+ * mode. The updated block is written back to exactly this path.
61
+ */
62
+ blockPath?: string;
63
+ /** Explicit owner; when absent the local OSS owner is resolved + stamped. */
64
+ owner?: string;
65
+ /**
66
+ * Provider override (mainly for tests). When omitted the engine picks the
67
+ * first available provider; when none is available it degrades offline.
68
+ */
69
+ provider?: AgentProvider;
70
+ /**
71
+ * Force the offline/deterministic path even if a provider is configured.
72
+ * Used by tests for determinism (mirrors `aiEnrichment: 'off'`).
73
+ */
74
+ offline?: boolean;
75
+ /** Optional explicit dbt manifest path (else auto-discovered under the project). */
76
+ dbtManifestPath?: string;
77
+ /** Domain for a built block draft. Defaults to `misc`. */
78
+ domain?: string;
79
+ /** Active user, for personal-skill selection. */
80
+ userId?: string;
81
+ /**
82
+ * Project + user Skills to inject as business context. When omitted the
83
+ * engine loads them from `.dql/skills/` itself.
84
+ */
85
+ skills?: Skill[];
86
+ /**
87
+ * Optional executor for a bounded preview of generated SQL. When supplied,
88
+ * an execution error triggers the same repair loop a validation miss does.
89
+ */
90
+ executeSql?: (sql: string) => Promise<unknown>;
91
+ /**
92
+ * Optional execution probe for the reflect-before-certify loop (P2). When
93
+ * supplied, the agent runs the block's SQL to learn its REAL output columns and
94
+ * evaluates the declared invariants, so the reflection can reconcile the output
95
+ * contract and produce a grounded tests verdict before a human reviews it.
96
+ */
97
+ executionProbe?: (input: {
98
+ sql: string;
99
+ invariants: string[];
100
+ }) => Promise<ExecutionProbe>;
101
+ }
102
+ /** The Skills that shaped this build (stamped on both targets). */
103
+ export interface AppliedSkill {
104
+ id: string;
105
+ description?: string;
106
+ }
107
+ export interface BuildCellResult {
108
+ target: 'cell';
109
+ sql: string;
110
+ explanation?: string;
111
+ /** Skills that shaped the answer, for UI transparency. */
112
+ appliedSkills?: AppliedSkill[];
113
+ }
114
+ export interface BuildBlockResult {
115
+ target: 'block';
116
+ path: string;
117
+ name: string;
118
+ sqlPreview: string;
119
+ description: string;
120
+ grain?: string;
121
+ outputs: string[];
122
+ examples: string[];
123
+ certifierVerdict: CertifierVerdict;
124
+ /** Skills that shaped the answer, for UI transparency. */
125
+ appliedSkills?: AppliedSkill[];
126
+ /**
127
+ * Edit mode only (spec 17, part A): the block's SQL BEFORE the change, so the
128
+ * UI can render a diff. Absent on a freshly created draft.
129
+ */
130
+ previousSql?: string;
131
+ /** The chosen route for this build (spec 17, part C). */
132
+ route?: BuildRoute;
133
+ /** True when this result updated an existing block in place (edit mode). */
134
+ edited?: boolean;
135
+ /**
136
+ * Reflect-before-certify report (P2): what the agent self-checked, what it
137
+ * auto-fixed (output contract, governance gaps), and what remains for the human.
138
+ */
139
+ reflection?: BlockReflection;
140
+ }
141
+ export type BuildFromPromptResult = BuildCellResult | BuildBlockResult;
142
+ export interface CertifierVerdict {
143
+ blocking: string[];
144
+ warnings: string[];
145
+ ready: boolean;
146
+ }
147
+ /** Load metric KG nodes (read-only, best-effort) so the Build path can reuse the
148
+ * same governed-metric matching the Ask path uses. Returns [] when no KG exists. */
149
+ export declare function loadSemanticMetrics(projectRoot: string): KGNode[];
150
+ /**
151
+ * Build from a natural-language prompt. ONE engine, two targets:
152
+ * - 'cell' → returns SQL (writes nothing).
153
+ * - 'block' → writes a complete DRAFT and returns its path + preview fields.
154
+ *
155
+ * `mode: 'edit'` (block target only) updates the existing block at `blockPath`
156
+ * in place instead of forking a new draft (spec 17, part A).
157
+ */
158
+ export declare function buildFromPrompt(options: BuildFromPromptOptions): Promise<BuildFromPromptResult>;
159
+ export { blockSlug };
160
+ //# sourceMappingURL=build-from-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-from-prompt.d.ts","sourceRoot":"","sources":["../../src/propose/build-from-prompt.ts"],"names":[],"mappings":"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"}