@duckcodeailabs/dql-cli 1.4.3 → 1.4.4
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/apps-api.d.ts +77 -0
- package/apps-api.d.ts.map +1 -0
- package/apps-api.js +612 -0
- package/apps-api.js.map +1 -0
- package/apps-api.test.d.ts +2 -0
- package/apps-api.test.d.ts.map +1 -0
- package/apps-api.test.js +111 -0
- package/apps-api.test.js.map +1 -0
- package/args.d.ts +30 -0
- package/args.d.ts.map +1 -0
- package/args.js +105 -0
- package/args.js.map +1 -0
- package/args.test.d.ts +2 -0
- package/args.test.d.ts.map +1 -0
- package/args.test.js +33 -0
- package/args.test.js.map +1 -0
- package/assets/dql-notebook/assets/codemirror-DJYUkPr1.js +11 -0
- package/assets/dql-notebook/assets/index-DUTeFz5j.js +858 -0
- package/assets/dql-notebook/assets/index-DrhoZmtv.css +1 -0
- package/assets/dql-notebook/assets/react-CRB3T2We.js +32 -0
- package/assets/dql-notebook/index.html +18 -0
- package/assets/notebook-browser/app.js +548 -0
- package/assets/notebook-browser/index.html +83 -0
- package/assets/notebook-browser/styles.css +336 -0
- package/block-templates.d.ts +8 -0
- package/block-templates.d.ts.map +1 -0
- package/block-templates.js +60 -0
- package/block-templates.js.map +1 -0
- package/commands/agent.d.ts +19 -0
- package/commands/agent.d.ts.map +1 -0
- package/commands/agent.js +165 -0
- package/commands/agent.js.map +1 -0
- package/commands/app.d.ts +32 -0
- package/commands/app.d.ts.map +1 -0
- package/commands/app.js +307 -0
- package/commands/app.js.map +1 -0
- package/commands/build.d.ts +3 -0
- package/commands/build.d.ts.map +1 -0
- package/commands/build.js +69 -0
- package/commands/build.js.map +1 -0
- package/commands/build.test.d.ts +2 -0
- package/commands/build.test.d.ts.map +1 -0
- package/commands/build.test.js +44 -0
- package/commands/build.test.js.map +1 -0
- package/commands/certify.d.ts +3 -0
- package/commands/certify.d.ts.map +1 -0
- package/commands/certify.js +228 -0
- package/commands/certify.js.map +1 -0
- package/commands/compile.d.ts +21 -0
- package/commands/compile.d.ts.map +1 -0
- package/commands/compile.js +198 -0
- package/commands/compile.js.map +1 -0
- package/commands/compile.test.d.ts +2 -0
- package/commands/compile.test.d.ts.map +1 -0
- package/commands/compile.test.js +115 -0
- package/commands/compile.test.js.map +1 -0
- package/commands/diff.d.ts +3 -0
- package/commands/diff.d.ts.map +1 -0
- package/commands/diff.js +52 -0
- package/commands/diff.js.map +1 -0
- package/commands/doctor.d.ts +3 -0
- package/commands/doctor.d.ts.map +1 -0
- package/commands/doctor.js +191 -0
- package/commands/doctor.js.map +1 -0
- package/commands/doctor.test.d.ts +2 -0
- package/commands/doctor.test.d.ts.map +1 -0
- package/commands/doctor.test.js +43 -0
- package/commands/doctor.test.js.map +1 -0
- package/commands/fmt.d.ts +3 -0
- package/commands/fmt.d.ts.map +1 -0
- package/commands/fmt.js +53 -0
- package/commands/fmt.js.map +1 -0
- package/commands/info.d.ts +3 -0
- package/commands/info.d.ts.map +1 -0
- package/commands/info.js +56 -0
- package/commands/info.js.map +1 -0
- package/commands/init.d.ts +3 -0
- package/commands/init.d.ts.map +1 -0
- package/commands/init.js +250 -0
- package/commands/init.js.map +1 -0
- package/commands/init.test.d.ts +2 -0
- package/commands/init.test.d.ts.map +1 -0
- package/commands/init.test.js +118 -0
- package/commands/init.test.js.map +1 -0
- package/commands/lineage.d.ts +24 -0
- package/commands/lineage.d.ts.map +1 -0
- package/commands/lineage.js +634 -0
- package/commands/lineage.js.map +1 -0
- package/commands/mcp.d.ts +7 -0
- package/commands/mcp.d.ts.map +1 -0
- package/commands/mcp.js +16 -0
- package/commands/mcp.js.map +1 -0
- package/commands/migrate.d.ts +12 -0
- package/commands/migrate.d.ts.map +1 -0
- package/commands/migrate.js +192 -0
- package/commands/migrate.js.map +1 -0
- package/commands/new.d.ts +3 -0
- package/commands/new.d.ts.map +1 -0
- package/commands/new.js +490 -0
- package/commands/new.js.map +1 -0
- package/commands/new.test.d.ts +2 -0
- package/commands/new.test.d.ts.map +1 -0
- package/commands/new.test.js +191 -0
- package/commands/new.test.js.map +1 -0
- package/commands/notebook.d.ts +3 -0
- package/commands/notebook.d.ts.map +1 -0
- package/commands/notebook.js +46 -0
- package/commands/notebook.js.map +1 -0
- package/commands/parse.d.ts +3 -0
- package/commands/parse.d.ts.map +1 -0
- package/commands/parse.js +63 -0
- package/commands/parse.js.map +1 -0
- package/commands/preview.d.ts +3 -0
- package/commands/preview.d.ts.map +1 -0
- package/commands/preview.js +42 -0
- package/commands/preview.js.map +1 -0
- package/commands/schedule.d.ts +3 -0
- package/commands/schedule.d.ts.map +1 -0
- package/commands/schedule.js +215 -0
- package/commands/schedule.js.map +1 -0
- package/commands/semantic.d.ts +12 -0
- package/commands/semantic.d.ts.map +1 -0
- package/commands/semantic.js +356 -0
- package/commands/semantic.js.map +1 -0
- package/commands/serve.d.ts +3 -0
- package/commands/serve.d.ts.map +1 -0
- package/commands/serve.js +30 -0
- package/commands/serve.js.map +1 -0
- package/commands/slack.d.ts +13 -0
- package/commands/slack.d.ts.map +1 -0
- package/commands/slack.js +53 -0
- package/commands/slack.js.map +1 -0
- package/commands/sync.d.ts +3 -0
- package/commands/sync.d.ts.map +1 -0
- package/commands/sync.js +192 -0
- package/commands/sync.js.map +1 -0
- package/commands/sync.test.d.ts +2 -0
- package/commands/sync.test.d.ts.map +1 -0
- package/commands/sync.test.js +147 -0
- package/commands/sync.test.js.map +1 -0
- package/commands/test.d.ts +3 -0
- package/commands/test.d.ts.map +1 -0
- package/commands/test.js +167 -0
- package/commands/test.js.map +1 -0
- package/commands/validate.d.ts +3 -0
- package/commands/validate.d.ts.map +1 -0
- package/commands/validate.js +116 -0
- package/commands/validate.js.map +1 -0
- package/commands/verify.d.ts +11 -0
- package/commands/verify.d.ts.map +1 -0
- package/commands/verify.js +74 -0
- package/commands/verify.js.map +1 -0
- package/digest.d.ts +10 -0
- package/digest.d.ts.map +1 -0
- package/digest.js +83 -0
- package/digest.js.map +1 -0
- package/git-service.d.ts +17 -0
- package/git-service.d.ts.map +1 -0
- package/git-service.js +54 -0
- package/git-service.js.map +1 -0
- package/governance-runtime.d.ts +15 -0
- package/governance-runtime.d.ts.map +1 -0
- package/governance-runtime.js +50 -0
- package/governance-runtime.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.d.ts.map +1 -0
- package/index.js.map +1 -0
- package/llm/index.d.ts +4 -0
- package/llm/index.d.ts.map +1 -0
- package/llm/index.js +19 -0
- package/llm/index.js.map +1 -0
- package/llm/providers/claude-agent-sdk.d.ts +3 -0
- package/llm/providers/claude-agent-sdk.d.ts.map +1 -0
- package/llm/providers/claude-agent-sdk.js +174 -0
- package/llm/providers/claude-agent-sdk.js.map +1 -0
- package/llm/providers/claude-code.d.ts +8 -0
- package/llm/providers/claude-code.d.ts.map +1 -0
- package/llm/providers/claude-code.js +171 -0
- package/llm/providers/claude-code.js.map +1 -0
- package/llm/providers/dql-agent-provider.d.ts +5 -0
- package/llm/providers/dql-agent-provider.d.ts.map +1 -0
- package/llm/providers/dql-agent-provider.js +99 -0
- package/llm/providers/dql-agent-provider.js.map +1 -0
- package/llm/tools.d.ts +9 -0
- package/llm/tools.d.ts.map +1 -0
- package/llm/tools.js +112 -0
- package/llm/tools.js.map +1 -0
- package/llm/types.d.ts +70 -0
- package/llm/types.d.ts.map +1 -0
- package/llm/types.js +2 -0
- package/llm/types.js.map +1 -0
- package/local-runtime.d.ts +142 -0
- package/local-runtime.d.ts.map +1 -0
- package/local-runtime.js +4357 -0
- package/local-runtime.js.map +1 -0
- package/local-runtime.test.d.ts +2 -0
- package/local-runtime.test.d.ts.map +1 -0
- package/local-runtime.test.js +241 -0
- package/local-runtime.test.js.map +1 -0
- package/metricflow.d.ts +35 -0
- package/metricflow.d.ts.map +1 -0
- package/metricflow.js +122 -0
- package/metricflow.js.map +1 -0
- package/metricflow.test.d.ts +2 -0
- package/metricflow.test.d.ts.map +1 -0
- package/metricflow.test.js +54 -0
- package/metricflow.test.js.map +1 -0
- package/open-browser.d.ts +2 -0
- package/open-browser.d.ts.map +1 -0
- package/open-browser.js +29 -0
- package/open-browser.js.map +1 -0
- package/package.json +10 -13
- package/schedule/alerts.d.ts +5 -0
- package/schedule/alerts.d.ts.map +1 -0
- package/schedule/alerts.js +54 -0
- package/schedule/alerts.js.map +1 -0
- package/schedule/discovery.d.ts +4 -0
- package/schedule/discovery.d.ts.map +1 -0
- package/schedule/discovery.js +36 -0
- package/schedule/discovery.js.map +1 -0
- package/schedule/notifiers/email.d.ts +3 -0
- package/schedule/notifiers/email.d.ts.map +1 -0
- package/schedule/notifiers/email.js +76 -0
- package/schedule/notifiers/email.js.map +1 -0
- package/schedule/notifiers/file.d.ts +3 -0
- package/schedule/notifiers/file.d.ts.map +1 -0
- package/schedule/notifiers/file.js +50 -0
- package/schedule/notifiers/file.js.map +1 -0
- package/schedule/notifiers/index.d.ts +10 -0
- package/schedule/notifiers/index.d.ts.map +1 -0
- package/schedule/notifiers/index.js +33 -0
- package/schedule/notifiers/index.js.map +1 -0
- package/schedule/notifiers/slack.d.ts +3 -0
- package/schedule/notifiers/slack.d.ts.map +1 -0
- package/schedule/notifiers/slack.js +58 -0
- package/schedule/notifiers/slack.js.map +1 -0
- package/schedule/runner.d.ts +14 -0
- package/schedule/runner.d.ts.map +1 -0
- package/schedule/runner.js +221 -0
- package/schedule/runner.js.map +1 -0
- package/schedule/runs.d.ts +5 -0
- package/schedule/runs.d.ts.map +1 -0
- package/schedule/runs.js +41 -0
- package/schedule/runs.js.map +1 -0
- package/schedule/service.d.ts +13 -0
- package/schedule/service.d.ts.map +1 -0
- package/schedule/service.js +87 -0
- package/schedule/service.js.map +1 -0
- package/schedule/types.d.ts +70 -0
- package/schedule/types.d.ts.map +1 -0
- package/schedule/types.js +2 -0
- package/schedule/types.js.map +1 -0
- package/semantic-import.d.ts +135 -0
- package/semantic-import.d.ts.map +1 -0
- package/semantic-import.js +979 -0
- package/semantic-import.js.map +1 -0
- package/semantic-import.test.d.ts +2 -0
- package/semantic-import.test.d.ts.map +1 -0
- package/semantic-import.test.js +95 -0
- package/semantic-import.test.js.map +1 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { DQLContext, findProjectRoot } from '@duckcodeailabs/dql-mcp';
|
|
5
|
+
import { buildAgentTools } from '../tools.js';
|
|
6
|
+
const MODEL = 'claude-opus-4-7';
|
|
7
|
+
const MAX_TOOL_ITERATIONS = 16;
|
|
8
|
+
function loadApiKey() {
|
|
9
|
+
if (process.env.ANTHROPIC_API_KEY)
|
|
10
|
+
return process.env.ANTHROPIC_API_KEY;
|
|
11
|
+
if (process.env.DQL_LLM_KEY)
|
|
12
|
+
return process.env.DQL_LLM_KEY;
|
|
13
|
+
const credPath = join(homedir(), '.dql', 'credentials');
|
|
14
|
+
if (!existsSync(credPath))
|
|
15
|
+
return null;
|
|
16
|
+
try {
|
|
17
|
+
const content = readFileSync(credPath, 'utf-8');
|
|
18
|
+
const match = content.match(/^\s*anthropic\s*=\s*"?([^"\n]+)"?/m);
|
|
19
|
+
return match?.[1]?.trim() ?? null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function loadAnthropic() {
|
|
26
|
+
const apiKey = loadApiKey();
|
|
27
|
+
if (!apiKey) {
|
|
28
|
+
return {
|
|
29
|
+
error: 'No Anthropic API key found. Set ANTHROPIC_API_KEY, or add `anthropic = "sk-..."` to ~/.dql/credentials.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const mod = (await import('@anthropic-ai/sdk'));
|
|
34
|
+
const Ctor = mod.default ?? mod.Anthropic;
|
|
35
|
+
if (!Ctor)
|
|
36
|
+
return { error: '@anthropic-ai/sdk is installed but does not export a client.' };
|
|
37
|
+
return new Ctor({ apiKey });
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return {
|
|
41
|
+
error: '@anthropic-ai/sdk is not installed. Run `pnpm add -w @anthropic-ai/sdk` to enable the Claude Agent SDK provider, or switch to the Claude Code provider.',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function systemPrompt(ctx, upstreamSql) {
|
|
46
|
+
const domains = Array.from(new Set(Object.values(ctx.manifest.blocks).map((b) => b.domain).filter(Boolean))).sort();
|
|
47
|
+
const metricCount = ctx.semanticLayer.listMetrics().length;
|
|
48
|
+
const dimensionCount = ctx.semanticLayer.listDimensions().length;
|
|
49
|
+
return [
|
|
50
|
+
'You are the DQL authoring agent. Your job is to help the analyst turn a business question into a certified, governed DQL block.',
|
|
51
|
+
'',
|
|
52
|
+
'Always ground answers in existing blocks, semantic metrics, and dimensions — do not invent SQL from scratch without checking what already exists. Use the provided tools:',
|
|
53
|
+
'- search_blocks: find existing blocks before writing new ones.',
|
|
54
|
+
'- get_block: inspect a block\'s SQL, dependencies, and lineage.',
|
|
55
|
+
'- list_metrics / list_dimensions: enumerate the semantic layer.',
|
|
56
|
+
'- lineage_impact: understand upstream/downstream blast radius.',
|
|
57
|
+
'- certify: check governance rules against a proposed block.',
|
|
58
|
+
'- suggest_block: END of turn — write a reviewable draft to blocks/_drafts/ once the user is ready.',
|
|
59
|
+
'',
|
|
60
|
+
'When the conversation has produced a concrete block design, call `suggest_block` with all required fields (name, domain, owner, description, sql). The response includes a governance gate — if it fails, refine and retry.',
|
|
61
|
+
'',
|
|
62
|
+
`Project context: ${Object.keys(ctx.manifest.blocks).length} blocks, ${metricCount} metrics, ${dimensionCount} dimensions. Domains: ${domains.join(', ') || '(none yet)'}.`,
|
|
63
|
+
upstreamSql ? `The user is authoring a cell with this upstream SQL:\n\`\`\`sql\n${upstreamSql}\n\`\`\`` : '',
|
|
64
|
+
]
|
|
65
|
+
.filter(Boolean)
|
|
66
|
+
.join('\n');
|
|
67
|
+
}
|
|
68
|
+
async function runToolLoop(client, tools, system, initialMessages, emit, signal) {
|
|
69
|
+
const messages = [...initialMessages];
|
|
70
|
+
const toolDefs = tools.map((t) => ({ name: t.name, description: t.description, input_schema: t.inputSchema }));
|
|
71
|
+
for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
|
|
72
|
+
if (signal.aborted) {
|
|
73
|
+
emit({ kind: 'error', message: 'Aborted by user.' });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const response = await client.messages.create({
|
|
77
|
+
model: MODEL,
|
|
78
|
+
max_tokens: 8192,
|
|
79
|
+
thinking: { type: 'adaptive', display: 'summarized' },
|
|
80
|
+
output_config: { effort: 'xhigh' },
|
|
81
|
+
system,
|
|
82
|
+
tools: toolDefs,
|
|
83
|
+
messages,
|
|
84
|
+
});
|
|
85
|
+
const toolUses = [];
|
|
86
|
+
for (const block of response.content) {
|
|
87
|
+
if (block.type === 'thinking')
|
|
88
|
+
emit({ kind: 'thinking', text: block.thinking });
|
|
89
|
+
else if (block.type === 'text')
|
|
90
|
+
emit({ kind: 'text', text: block.text });
|
|
91
|
+
else if (block.type === 'tool_use') {
|
|
92
|
+
const tu = block;
|
|
93
|
+
toolUses.push(tu);
|
|
94
|
+
emit({ kind: 'tool_call', id: tu.id, name: tu.name, input: tu.input });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
messages.push({ role: 'assistant', content: response.content });
|
|
98
|
+
if (response.stop_reason !== 'tool_use' || toolUses.length === 0) {
|
|
99
|
+
emit({ kind: 'done', stopReason: response.stop_reason ?? undefined });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const results = [];
|
|
103
|
+
for (const tu of toolUses) {
|
|
104
|
+
const tool = tools.find((t) => t.name === tu.name);
|
|
105
|
+
let output;
|
|
106
|
+
let isError = false;
|
|
107
|
+
if (!tool) {
|
|
108
|
+
output = { error: `Unknown tool: ${tu.name}` };
|
|
109
|
+
isError = true;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
try {
|
|
113
|
+
output = await tool.run(tu.input);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
output = { error: err instanceof Error ? err.message : String(err) };
|
|
117
|
+
isError = true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
emit({ kind: 'tool_result', id: tu.id, output, isError });
|
|
121
|
+
if (tu.name === 'suggest_block')
|
|
122
|
+
emitProposal(tu.input, output, emit);
|
|
123
|
+
results.push({ type: 'tool_result', tool_use_id: tu.id, content: JSON.stringify(output), is_error: isError });
|
|
124
|
+
}
|
|
125
|
+
messages.push({ role: 'user', content: results });
|
|
126
|
+
}
|
|
127
|
+
emit({ kind: 'error', message: `Tool loop exceeded ${MAX_TOOL_ITERATIONS} iterations.` });
|
|
128
|
+
}
|
|
129
|
+
function emitProposal(input, output, emit) {
|
|
130
|
+
if (!input || typeof input !== 'object')
|
|
131
|
+
return;
|
|
132
|
+
const p = input;
|
|
133
|
+
if (!p.name || !p.sql)
|
|
134
|
+
return;
|
|
135
|
+
const proposal = {
|
|
136
|
+
name: String(p.name),
|
|
137
|
+
domain: String(p.domain ?? ''),
|
|
138
|
+
owner: String(p.owner ?? ''),
|
|
139
|
+
description: String(p.description ?? ''),
|
|
140
|
+
sql: String(p.sql),
|
|
141
|
+
tags: Array.isArray(p.tags) ? p.tags.map(String) : undefined,
|
|
142
|
+
chartType: typeof p.chartType === 'string' ? p.chartType : undefined,
|
|
143
|
+
};
|
|
144
|
+
const out = (output ?? {});
|
|
145
|
+
emit({
|
|
146
|
+
kind: 'proposal',
|
|
147
|
+
proposal,
|
|
148
|
+
governance: {
|
|
149
|
+
certified: Boolean(out.certified),
|
|
150
|
+
errors: Array.isArray(out.errors) ? out.errors.map(String) : [],
|
|
151
|
+
warnings: Array.isArray(out.warnings) ? out.warnings.map(String) : [],
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
export const claudeAgentSdkRunner = {
|
|
156
|
+
async run(req, emit, signal) {
|
|
157
|
+
const client = await loadAnthropic();
|
|
158
|
+
if ('error' in client) {
|
|
159
|
+
emit({ kind: 'error', message: client.error });
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const ctx = new DQLContext({ projectRoot: findProjectRoot(req.projectRoot) });
|
|
163
|
+
const tools = buildAgentTools(ctx);
|
|
164
|
+
const system = systemPrompt(ctx, req.upstream?.sql);
|
|
165
|
+
const messages = req.messages.map((m) => ({ role: m.role, content: m.content }));
|
|
166
|
+
try {
|
|
167
|
+
await runToolLoop(client, tools, system, messages, emit, signal);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
emit({ kind: 'error', message: err instanceof Error ? err.message : String(err) });
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=claude-agent-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent-sdk.js","sourceRoot":"","sources":["../../../src/llm/providers/claude-agent-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentRunner } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* `claude-code` provider: spawns the `claude` CLI in headless print mode and
|
|
4
|
+
* connects it to DQL's stdio MCP server via `--mcp-config`. Requires the user
|
|
5
|
+
* to have `claude` on PATH — no API key needed (Claude Code uses its own auth).
|
|
6
|
+
*/
|
|
7
|
+
export declare const claudeCodeRunner: AgentRunner;
|
|
8
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/claude-code.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,WAAW,EAA4B,MAAM,aAAa,CAAC;AAE1F;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,WA8E9B,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { mkdtempSync, writeFileSync, rmSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* `claude-code` provider: spawns the `claude` CLI in headless print mode and
|
|
7
|
+
* connects it to DQL's stdio MCP server via `--mcp-config`. Requires the user
|
|
8
|
+
* to have `claude` on PATH — no API key needed (Claude Code uses its own auth).
|
|
9
|
+
*/
|
|
10
|
+
export const claudeCodeRunner = {
|
|
11
|
+
async run(req, emit, signal) {
|
|
12
|
+
const tempDir = mkdtempSync(join(tmpdir(), 'dql-claude-'));
|
|
13
|
+
const mcpConfigPath = join(tempDir, 'mcp.json');
|
|
14
|
+
writeFileSync(mcpConfigPath, JSON.stringify({
|
|
15
|
+
mcpServers: {
|
|
16
|
+
dql: { command: 'dql', args: ['mcp'], cwd: req.projectRoot },
|
|
17
|
+
},
|
|
18
|
+
}));
|
|
19
|
+
const prompt = buildPrompt(req);
|
|
20
|
+
const child = spawn('claude', [
|
|
21
|
+
'-p',
|
|
22
|
+
prompt,
|
|
23
|
+
'--mcp-config',
|
|
24
|
+
mcpConfigPath,
|
|
25
|
+
'--output-format',
|
|
26
|
+
'stream-json',
|
|
27
|
+
'--verbose',
|
|
28
|
+
'--allowedTools',
|
|
29
|
+
'mcp__dql__search_blocks mcp__dql__get_block mcp__dql__list_metrics mcp__dql__list_dimensions mcp__dql__lineage_impact mcp__dql__certify mcp__dql__suggest_block',
|
|
30
|
+
], { cwd: req.projectRoot, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
31
|
+
const cleanup = () => {
|
|
32
|
+
try {
|
|
33
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
catch { /* noop */ }
|
|
36
|
+
};
|
|
37
|
+
signal.addEventListener('abort', () => child.kill('SIGTERM'));
|
|
38
|
+
const stderr = [];
|
|
39
|
+
child.stderr.on('data', (chunk) => stderr.push(chunk.toString()));
|
|
40
|
+
const toolNameById = new Map();
|
|
41
|
+
let buffer = '';
|
|
42
|
+
child.stdout.on('data', (chunk) => {
|
|
43
|
+
buffer += chunk.toString();
|
|
44
|
+
let newlineIdx;
|
|
45
|
+
while ((newlineIdx = buffer.indexOf('\n')) !== -1) {
|
|
46
|
+
const line = buffer.slice(0, newlineIdx).trim();
|
|
47
|
+
buffer = buffer.slice(newlineIdx + 1);
|
|
48
|
+
if (!line)
|
|
49
|
+
continue;
|
|
50
|
+
try {
|
|
51
|
+
const event = JSON.parse(line);
|
|
52
|
+
mapClaudeCodeEvent(event, emit, toolNameById);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* skip non-JSON lines */
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
child.on('error', (err) => {
|
|
61
|
+
emit({
|
|
62
|
+
kind: 'error',
|
|
63
|
+
message: `Failed to spawn 'claude': ${err.message}. Install Claude Code (https://claude.com/claude-code) or switch to the Claude Agent SDK provider.`,
|
|
64
|
+
});
|
|
65
|
+
cleanup();
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
child.on('close', (code) => {
|
|
69
|
+
if (code !== 0) {
|
|
70
|
+
const detail = stderr.join('').trim();
|
|
71
|
+
emit({ kind: 'error', message: `claude exited with code ${code}${detail ? `: ${detail}` : ''}` });
|
|
72
|
+
}
|
|
73
|
+
emit({ kind: 'done' });
|
|
74
|
+
cleanup();
|
|
75
|
+
resolve();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
function buildPrompt(req) {
|
|
81
|
+
const history = req.messages.map((m) => `${m.role === 'user' ? 'User' : 'Assistant'}: ${m.content}`).join('\n\n');
|
|
82
|
+
const upstream = req.upstream?.sql
|
|
83
|
+
? `\n\nThe user is authoring a notebook cell with this upstream SQL:\n\`\`\`sql\n${req.upstream.sql}\n\`\`\`\n`
|
|
84
|
+
: '';
|
|
85
|
+
return [
|
|
86
|
+
'You are the DQL authoring agent. Ground every answer in existing DQL blocks, metrics, and dimensions. Use the mcp__dql__* tools to search, inspect, and ultimately propose a new block.',
|
|
87
|
+
'',
|
|
88
|
+
'When the user is ready for a concrete block, call mcp__dql__suggest_block with name, domain, owner, description, and sql. The response returns governance-gate results.',
|
|
89
|
+
upstream,
|
|
90
|
+
'',
|
|
91
|
+
history,
|
|
92
|
+
].join('\n');
|
|
93
|
+
}
|
|
94
|
+
function mapClaudeCodeEvent(event, emit, toolNameById) {
|
|
95
|
+
const type = event.type;
|
|
96
|
+
if (type === 'assistant') {
|
|
97
|
+
const message = event.message;
|
|
98
|
+
for (const block of message?.content ?? []) {
|
|
99
|
+
const b = block;
|
|
100
|
+
if (b.type === 'text' && b.text)
|
|
101
|
+
emit({ kind: 'text', text: b.text });
|
|
102
|
+
else if (b.type === 'thinking' && b.thinking)
|
|
103
|
+
emit({ kind: 'thinking', text: b.thinking });
|
|
104
|
+
else if (b.type === 'tool_use' && b.id && b.name) {
|
|
105
|
+
const short = stripMcpPrefix(b.name);
|
|
106
|
+
toolNameById.set(b.id, short);
|
|
107
|
+
emit({ kind: 'tool_call', id: b.id, name: short, input: b.input ?? {} });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (type === 'user') {
|
|
113
|
+
const message = event.message;
|
|
114
|
+
for (const block of message?.content ?? []) {
|
|
115
|
+
const b = block;
|
|
116
|
+
if (b.type === 'tool_result' && b.tool_use_id) {
|
|
117
|
+
const output = parseToolOutput(b.content);
|
|
118
|
+
emit({ kind: 'tool_result', id: b.tool_use_id, output, isError: Boolean(b.is_error) });
|
|
119
|
+
if (toolNameById.get(b.tool_use_id) === 'suggest_block')
|
|
120
|
+
emitProposalFromResult(output, emit);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function stripMcpPrefix(name) {
|
|
126
|
+
return name.replace(/^mcp__dql__/, '');
|
|
127
|
+
}
|
|
128
|
+
function parseToolOutput(content) {
|
|
129
|
+
if (typeof content === 'string') {
|
|
130
|
+
try {
|
|
131
|
+
return JSON.parse(content);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return content;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (Array.isArray(content)) {
|
|
138
|
+
const text = content.map((c) => c.text ?? '').join('');
|
|
139
|
+
try {
|
|
140
|
+
return JSON.parse(text);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return text;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return content;
|
|
147
|
+
}
|
|
148
|
+
function emitProposalFromResult(output, emit) {
|
|
149
|
+
if (!output || typeof output !== 'object')
|
|
150
|
+
return;
|
|
151
|
+
const o = output;
|
|
152
|
+
if (!o.name || !o.path)
|
|
153
|
+
return;
|
|
154
|
+
const proposal = {
|
|
155
|
+
name: String(o.name),
|
|
156
|
+
domain: '',
|
|
157
|
+
owner: '',
|
|
158
|
+
description: '',
|
|
159
|
+
sql: '',
|
|
160
|
+
};
|
|
161
|
+
emit({
|
|
162
|
+
kind: 'proposal',
|
|
163
|
+
proposal,
|
|
164
|
+
governance: {
|
|
165
|
+
certified: Boolean(o.certified),
|
|
166
|
+
errors: Array.isArray(o.errors) ? o.errors.map(String) : [],
|
|
167
|
+
warnings: Array.isArray(o.warnings) ? o.warnings.map(String) : [],
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/llm/providers/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AgentRunner, ProviderId } from '../types.js';
|
|
2
|
+
type SimpleProviderId = Extract<ProviderId, 'openai' | 'gemini' | 'ollama'>;
|
|
3
|
+
export declare function createDqlAgentProviderRunner(id: SimpleProviderId): AgentRunner;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=dql-agent-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dql-agent-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/dql-agent-provider.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAmB,WAAW,EAA4B,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtG,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAiF5E,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,gBAAgB,GAAG,WAAW,CAwB9E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { DQLContext, findProjectRoot } from '@duckcodeailabs/dql-mcp';
|
|
2
|
+
import { GeminiProvider, OllamaProvider, OpenAIProvider, } from '@duckcodeailabs/dql-agent';
|
|
3
|
+
const SPECS = {
|
|
4
|
+
openai: {
|
|
5
|
+
label: 'OpenAI',
|
|
6
|
+
setup: 'Set OPENAI_API_KEY. Optional: OPENAI_MODEL and OPENAI_BASE_URL.',
|
|
7
|
+
create: () => new OpenAIProvider({ model: process.env.OPENAI_MODEL }),
|
|
8
|
+
},
|
|
9
|
+
gemini: {
|
|
10
|
+
label: 'Gemini',
|
|
11
|
+
setup: 'Set GEMINI_API_KEY. Optional: GEMINI_MODEL.',
|
|
12
|
+
create: () => new GeminiProvider({ model: process.env.GEMINI_MODEL }),
|
|
13
|
+
},
|
|
14
|
+
ollama: {
|
|
15
|
+
label: 'Ollama',
|
|
16
|
+
setup: 'Start Ollama and set OLLAMA_MODEL if needed. Optional: OLLAMA_BASE_URL.',
|
|
17
|
+
create: () => new OllamaProvider({ model: process.env.OLLAMA_MODEL, baseUrl: process.env.OLLAMA_BASE_URL }),
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
function systemPrompt(ctx, upstreamSql) {
|
|
21
|
+
const blocks = Object.values(ctx.manifest.blocks);
|
|
22
|
+
const domains = Array.from(new Set(blocks.map((b) => b.domain).filter(Boolean))).sort();
|
|
23
|
+
const blockSummary = Object.entries(ctx.manifest.blocks)
|
|
24
|
+
.slice(0, 40)
|
|
25
|
+
.map(([id, b]) => `- ${id} (${b.domain || 'unknown'}): ${b.description || b.name}`)
|
|
26
|
+
.join('\n');
|
|
27
|
+
const metrics = ctx.semanticLayer.listMetrics().slice(0, 40).map((m) => m.name).join(', ');
|
|
28
|
+
const dimensions = ctx.semanticLayer.listDimensions().slice(0, 40).map((d) => d.name).join(', ');
|
|
29
|
+
return [
|
|
30
|
+
'You are the DQL notebook AI Chat assistant.',
|
|
31
|
+
'Answer with concise analytical guidance grounded in existing DQL blocks and the semantic layer.',
|
|
32
|
+
'When a reusable governed block is appropriate, include a single DQL_BLOCK_PROPOSAL JSON object at the end with name, domain, owner, description, sql, tags, and chartType.',
|
|
33
|
+
'Do not claim a block is certified unless it exists in the project context.',
|
|
34
|
+
'',
|
|
35
|
+
`Project context: ${blocks.length} blocks. Domains: ${domains.join(', ') || '(none)'}.`,
|
|
36
|
+
blockSummary ? `Available blocks:\n${blockSummary}` : '',
|
|
37
|
+
metrics ? `Semantic metrics: ${metrics}` : '',
|
|
38
|
+
dimensions ? `Semantic dimensions: ${dimensions}` : '',
|
|
39
|
+
upstreamSql ? `Current upstream SQL:\n\`\`\`sql\n${upstreamSql}\n\`\`\`` : '',
|
|
40
|
+
].filter(Boolean).join('\n');
|
|
41
|
+
}
|
|
42
|
+
function toProviderMessages(req, ctx) {
|
|
43
|
+
return [
|
|
44
|
+
{ role: 'system', content: systemPrompt(ctx, req.upstream?.sql) },
|
|
45
|
+
...req.messages.map((m) => ({ role: m.role, content: m.content })),
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
function emitProposalFromText(text, emit) {
|
|
49
|
+
const match = text.match(/DQL_BLOCK_PROPOSAL\s*[:=]?\s*(\{[\s\S]*\})\s*$/);
|
|
50
|
+
if (!match)
|
|
51
|
+
return;
|
|
52
|
+
try {
|
|
53
|
+
const raw = JSON.parse(match[1]);
|
|
54
|
+
if (!raw.name || !raw.sql)
|
|
55
|
+
return;
|
|
56
|
+
emit({
|
|
57
|
+
kind: 'proposal',
|
|
58
|
+
proposal: {
|
|
59
|
+
name: String(raw.name),
|
|
60
|
+
domain: String(raw.domain ?? ''),
|
|
61
|
+
owner: String(raw.owner ?? ''),
|
|
62
|
+
description: String(raw.description ?? ''),
|
|
63
|
+
sql: String(raw.sql),
|
|
64
|
+
tags: Array.isArray(raw.tags) ? raw.tags.map(String) : undefined,
|
|
65
|
+
chartType: typeof raw.chartType === 'string' ? raw.chartType : undefined,
|
|
66
|
+
},
|
|
67
|
+
governance: { certified: false, errors: [], warnings: ['Generated by a non-tool provider; review before saving.'] },
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Ignore malformed proposal text. The visible assistant response still streams as text.
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function createDqlAgentProviderRunner(id) {
|
|
75
|
+
return {
|
|
76
|
+
async run(req, emit, signal) {
|
|
77
|
+
const spec = SPECS[id];
|
|
78
|
+
const provider = spec.create();
|
|
79
|
+
const available = await provider.available().catch(() => false);
|
|
80
|
+
if (!available) {
|
|
81
|
+
emit({ kind: 'error', message: `${spec.label} is not configured or reachable. ${spec.setup}` });
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
emit({ kind: 'thinking', text: `Using ${spec.label} for this turn.` });
|
|
86
|
+
const ctx = new DQLContext({ projectRoot: findProjectRoot(req.projectRoot) });
|
|
87
|
+
const text = await provider.generate(toProviderMessages(req, ctx), { signal, maxTokens: 2048 });
|
|
88
|
+
emit({ kind: 'text', text });
|
|
89
|
+
emitProposalFromText(text, emit);
|
|
90
|
+
emit({ kind: 'done', stopReason: 'stop' });
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
94
|
+
emit({ kind: 'error', message: `${spec.label} failed: ${message}. ${spec.setup}` });
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=dql-agent-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dql-agent-provider.js","sourceRoot":"","sources":["../../../src/llm/providers/dql-agent-provider.ts"],"names":[],"mappings":"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"}
|
package/llm/tools.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DQLContext } from '@duckcodeailabs/dql-mcp';
|
|
2
|
+
export interface AgentTool {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: Record<string, unknown>;
|
|
6
|
+
run(args: unknown): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildAgentTools(ctx: DQLContext): AgentTool[];
|
|
9
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/llm/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAQX,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAuED,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,EAAE,CA+C5D"}
|
package/llm/tools.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { searchBlocks, getBlock, listMetrics, listDimensions, lineageImpact, certify, suggestBlock, } from '@duckcodeailabs/dql-mcp';
|
|
2
|
+
const SEARCH_BLOCKS_SCHEMA = {
|
|
3
|
+
type: 'object',
|
|
4
|
+
additionalProperties: false,
|
|
5
|
+
properties: {
|
|
6
|
+
query: { type: 'string', description: 'Substring matched against name, description, or tags.' },
|
|
7
|
+
domain: { type: 'string', description: 'Filter to a single business domain.' },
|
|
8
|
+
status: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
enum: ['draft', 'review', 'certified', 'deprecated', 'pending_recertification'],
|
|
11
|
+
description: 'Filter by certification status.',
|
|
12
|
+
},
|
|
13
|
+
limit: { type: 'number', description: 'Max results (default 50).' },
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
const GET_BLOCK_SCHEMA = {
|
|
17
|
+
type: 'object',
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
required: ['name'],
|
|
20
|
+
properties: {
|
|
21
|
+
name: { type: 'string', description: 'Block name (as shown in search_blocks).' },
|
|
22
|
+
includeSource: { type: 'boolean', description: 'Include full .dql source text. Default true.' },
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const DOMAIN_FILTER_SCHEMA = {
|
|
26
|
+
type: 'object',
|
|
27
|
+
additionalProperties: false,
|
|
28
|
+
properties: {
|
|
29
|
+
domain: { type: 'string', description: 'Filter to a single domain.' },
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const LINEAGE_IMPACT_SCHEMA = {
|
|
33
|
+
type: 'object',
|
|
34
|
+
additionalProperties: false,
|
|
35
|
+
required: ['focus'],
|
|
36
|
+
properties: {
|
|
37
|
+
focus: { type: 'string', description: 'Node id ("block:revenue") or bare name.' },
|
|
38
|
+
upstreamDepth: { type: 'number' },
|
|
39
|
+
downstreamDepth: { type: 'number' },
|
|
40
|
+
paths: { type: 'boolean', description: 'Include full source→leaf paths (slower on large graphs).' },
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const CERTIFY_SCHEMA = {
|
|
44
|
+
type: 'object',
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
required: ['name'],
|
|
47
|
+
properties: {
|
|
48
|
+
name: { type: 'string', description: 'Block name to certify.' },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
const SUGGEST_BLOCK_SCHEMA = {
|
|
52
|
+
type: 'object',
|
|
53
|
+
additionalProperties: false,
|
|
54
|
+
required: ['name', 'domain', 'owner', 'description', 'sql'],
|
|
55
|
+
properties: {
|
|
56
|
+
name: { type: 'string', description: 'Proposed block name (kebab_case).' },
|
|
57
|
+
domain: { type: 'string', description: 'Business domain (finance, product, …).' },
|
|
58
|
+
owner: { type: 'string', description: 'Block owner identity (email or team handle).' },
|
|
59
|
+
description: { type: 'string', description: 'One-line description.' },
|
|
60
|
+
sql: { type: 'string', description: 'The block body SQL.' },
|
|
61
|
+
tags: { type: 'array', items: { type: 'string' } },
|
|
62
|
+
chartType: { type: 'string', description: 'Optional visualization type.' },
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
export function buildAgentTools(ctx) {
|
|
66
|
+
return [
|
|
67
|
+
{
|
|
68
|
+
name: 'search_blocks',
|
|
69
|
+
description: 'Find certified DQL blocks by keyword, domain, or status.',
|
|
70
|
+
inputSchema: SEARCH_BLOCKS_SCHEMA,
|
|
71
|
+
run: async (args) => searchBlocks(ctx, args),
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'get_block',
|
|
75
|
+
description: 'Return full metadata, dependencies, and SQL for a block.',
|
|
76
|
+
inputSchema: GET_BLOCK_SCHEMA,
|
|
77
|
+
run: async (args) => getBlock(ctx, args),
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'list_metrics',
|
|
81
|
+
description: 'List semantic-layer metrics, optionally filtered by domain.',
|
|
82
|
+
inputSchema: DOMAIN_FILTER_SCHEMA,
|
|
83
|
+
run: async (args) => listMetrics(ctx, args),
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'list_dimensions',
|
|
87
|
+
description: 'List semantic-layer dimensions, optionally filtered by domain.',
|
|
88
|
+
inputSchema: DOMAIN_FILTER_SCHEMA,
|
|
89
|
+
run: async (args) => listDimensions(ctx, args),
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'lineage_impact',
|
|
93
|
+
description: 'Return upstream/downstream lineage for a block, metric, or model.',
|
|
94
|
+
inputSchema: LINEAGE_IMPACT_SCHEMA,
|
|
95
|
+
run: async (args) => lineageImpact(ctx, args),
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'certify',
|
|
99
|
+
description: 'Run governance rules against a block and report pass/fail.',
|
|
100
|
+
inputSchema: CERTIFY_SCHEMA,
|
|
101
|
+
run: async (args) => certify(ctx, args),
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'suggest_block',
|
|
105
|
+
description: 'Write a proposed block to blocks/_drafts/ and return governance results. ' +
|
|
106
|
+
'Use this at the end of a conversation to hand the user a reviewable draft.',
|
|
107
|
+
inputSchema: SUGGEST_BLOCK_SCHEMA,
|
|
108
|
+
run: async (args) => suggestBlock(ctx, args),
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=tools.js.map
|
package/llm/tools.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/llm/tools.ts"],"names":[],"mappings":"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"}
|