@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,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql semantic` CLI subcommands:
|
|
3
|
+
* dql semantic list [path] — List metrics, dimensions, hierarchies
|
|
4
|
+
* dql semantic validate [path] — Validate semantic layer definitions
|
|
5
|
+
* dql semantic query [path] — Compose a SQL query from metric/dimension names
|
|
6
|
+
* dql semantic pull [path] — Pull/refresh a remote semantic layer repo cache
|
|
7
|
+
* dql semantic import <provider> [path] — Import provider metadata into local semantic-layer YAML
|
|
8
|
+
* dql semantic sync [path] — Re-run the last semantic import from manifest
|
|
9
|
+
*/
|
|
10
|
+
import type { CLIFlags } from '../args.js';
|
|
11
|
+
export declare function runSemantic(subcommand: string | null, rest: string[], flags: CLIFlags): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=semantic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/commands/semantic.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CAgDf"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql semantic` CLI subcommands:
|
|
3
|
+
* dql semantic list [path] — List metrics, dimensions, hierarchies
|
|
4
|
+
* dql semantic validate [path] — Validate semantic layer definitions
|
|
5
|
+
* dql semantic query [path] — Compose a SQL query from metric/dimension names
|
|
6
|
+
* dql semantic pull [path] — Pull/refresh a remote semantic layer repo cache
|
|
7
|
+
* dql semantic import <provider> [path] — Import provider metadata into local semantic-layer YAML
|
|
8
|
+
* dql semantic sync [path] — Re-run the last semantic import from manifest
|
|
9
|
+
*/
|
|
10
|
+
import { resolve, join } from 'node:path';
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { resolveSemanticLayerWithDiagnostics, pullCachedRepo, } from '@duckcodeailabs/dql-core';
|
|
13
|
+
import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
|
|
14
|
+
import { findProjectRoot, loadProjectConfig } from '../local-runtime.js';
|
|
15
|
+
import { loadSemanticImportManifest, performSemanticImport, syncSemanticImport } from '../semantic-import.js';
|
|
16
|
+
export async function runSemantic(subcommand, rest, flags) {
|
|
17
|
+
const targetArg = subcommand === 'import'
|
|
18
|
+
? (rest[1] ?? '.')
|
|
19
|
+
: subcommand === 'query'
|
|
20
|
+
? '.'
|
|
21
|
+
: (rest[0] ?? '.');
|
|
22
|
+
const baseDir = resolve(targetArg);
|
|
23
|
+
const projectRoot = findProjectRoot(baseDir);
|
|
24
|
+
if (!existsSync(join(projectRoot, 'dql.config.json'))) {
|
|
25
|
+
console.error(`No DQL project found at "${baseDir}". Run from a project root or pass a project path.`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const config = loadProjectConfig(projectRoot);
|
|
29
|
+
const semanticConfig = config.semanticLayer;
|
|
30
|
+
switch (subcommand) {
|
|
31
|
+
case 'list':
|
|
32
|
+
return semanticList(semanticConfig, projectRoot, flags);
|
|
33
|
+
case 'validate':
|
|
34
|
+
return semanticValidate(semanticConfig, projectRoot, flags);
|
|
35
|
+
case 'query':
|
|
36
|
+
return semanticQuery(semanticConfig, projectRoot, rest.slice(1), flags);
|
|
37
|
+
case 'pull':
|
|
38
|
+
return semanticPull(semanticConfig, flags);
|
|
39
|
+
case 'import':
|
|
40
|
+
return semanticImport(projectRoot, rest, flags);
|
|
41
|
+
case 'sync':
|
|
42
|
+
return semanticSync(projectRoot, flags);
|
|
43
|
+
default:
|
|
44
|
+
console.log(`
|
|
45
|
+
dql semantic — Semantic layer management
|
|
46
|
+
|
|
47
|
+
Subcommands:
|
|
48
|
+
dql semantic list [path] List all metrics, dimensions, hierarchies
|
|
49
|
+
dql semantic validate [path] Validate semantic layer definitions
|
|
50
|
+
dql semantic query <metrics> [dims] Compose a SQL query from metric/dimension names
|
|
51
|
+
dql semantic pull [path] Refresh remote semantic layer cache
|
|
52
|
+
dql semantic import <provider> [path] Import provider metadata into local semantic-layer YAML
|
|
53
|
+
dql semantic sync [path] Refresh the last semantic import from manifest
|
|
54
|
+
|
|
55
|
+
Options:
|
|
56
|
+
--format json|text Output format (default: text)
|
|
57
|
+
--verbose Show detailed output
|
|
58
|
+
`.trim());
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ── list ──────────────────────────────────────────────────────────────────────
|
|
63
|
+
function semanticList(semanticConfig, projectRoot, flags) {
|
|
64
|
+
const result = resolveSemanticLayerWithDiagnostics(semanticConfig, projectRoot);
|
|
65
|
+
if (result.errors.length > 0) {
|
|
66
|
+
for (const err of result.errors) {
|
|
67
|
+
console.error(` ✗ ${err}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (!result.layer) {
|
|
71
|
+
console.error('No semantic layer found. Add YAML files to semantic-layer/ or configure a provider in dql.config.json.');
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
const layer = result.layer;
|
|
75
|
+
const metrics = layer.listMetrics();
|
|
76
|
+
const dimensions = layer.listDimensions();
|
|
77
|
+
const hierarchies = layer.listHierarchies();
|
|
78
|
+
if (flags.format === 'json') {
|
|
79
|
+
console.log(JSON.stringify({
|
|
80
|
+
provider: result.detectedProvider ?? 'configured',
|
|
81
|
+
metrics: metrics.map(m => ({ name: m.name, label: m.label, type: m.type, table: m.table, domain: m.domain })),
|
|
82
|
+
dimensions: dimensions.map(d => ({ name: d.name, label: d.label, type: d.type, table: d.table })),
|
|
83
|
+
hierarchies: hierarchies.map(h => ({ name: h.name, label: h.label, levels: h.levels.length })),
|
|
84
|
+
}, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const provider = result.detectedProvider ?? 'configured';
|
|
88
|
+
console.log(`\n Semantic Layer (${provider})`);
|
|
89
|
+
console.log(` ${'─'.repeat(50)}`);
|
|
90
|
+
if (metrics.length > 0) {
|
|
91
|
+
console.log(`\n Metrics (${metrics.length}):`);
|
|
92
|
+
for (const m of metrics) {
|
|
93
|
+
console.log(` • ${m.name} [${m.type}] ${m.label}`);
|
|
94
|
+
if (flags.verbose && m.description) {
|
|
95
|
+
console.log(` ${m.description}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log('\n Metrics: none');
|
|
101
|
+
}
|
|
102
|
+
if (dimensions.length > 0) {
|
|
103
|
+
console.log(`\n Dimensions (${dimensions.length}):`);
|
|
104
|
+
for (const d of dimensions) {
|
|
105
|
+
console.log(` • ${d.name} [${d.type}] ${d.label}`);
|
|
106
|
+
if (flags.verbose && d.description) {
|
|
107
|
+
console.log(` ${d.description}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log('\n Dimensions: none');
|
|
113
|
+
}
|
|
114
|
+
if (hierarchies.length > 0) {
|
|
115
|
+
console.log(`\n Hierarchies (${hierarchies.length}):`);
|
|
116
|
+
for (const h of hierarchies) {
|
|
117
|
+
console.log(` • ${h.name} (${h.levels.length} levels) ${h.label}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
console.log('');
|
|
121
|
+
}
|
|
122
|
+
// ── validate ──────────────────────────────────────────────────────────────────
|
|
123
|
+
function semanticValidate(semanticConfig, projectRoot, flags) {
|
|
124
|
+
const result = resolveSemanticLayerWithDiagnostics(semanticConfig, projectRoot);
|
|
125
|
+
const issues = [];
|
|
126
|
+
// Collect loading errors
|
|
127
|
+
for (const err of result.errors) {
|
|
128
|
+
issues.push({ level: 'error', message: err });
|
|
129
|
+
}
|
|
130
|
+
if (!result.layer) {
|
|
131
|
+
issues.push({ level: 'error', message: 'No semantic layer could be loaded.' });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const layer = result.layer;
|
|
135
|
+
const metrics = layer.listMetrics();
|
|
136
|
+
const dimensions = layer.listDimensions();
|
|
137
|
+
// Validate metrics
|
|
138
|
+
for (const m of metrics) {
|
|
139
|
+
if (!m.sql || m.sql.trim().length === 0) {
|
|
140
|
+
issues.push({ level: 'error', message: `Metric "${m.name}" has empty SQL expression.` });
|
|
141
|
+
}
|
|
142
|
+
if (!m.table || m.table.trim().length === 0) {
|
|
143
|
+
issues.push({ level: 'warning', message: `Metric "${m.name}" has no table reference.` });
|
|
144
|
+
}
|
|
145
|
+
if (!m.label || m.label.trim().length === 0) {
|
|
146
|
+
issues.push({ level: 'warning', message: `Metric "${m.name}" has no label.` });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Validate dimensions
|
|
150
|
+
for (const d of dimensions) {
|
|
151
|
+
if (!d.sql || d.sql.trim().length === 0) {
|
|
152
|
+
issues.push({ level: 'error', message: `Dimension "${d.name}" has empty SQL expression.` });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Check for duplicate names
|
|
156
|
+
const metricNames = new Set();
|
|
157
|
+
for (const m of metrics) {
|
|
158
|
+
if (metricNames.has(m.name)) {
|
|
159
|
+
issues.push({ level: 'error', message: `Duplicate metric name: "${m.name}".` });
|
|
160
|
+
}
|
|
161
|
+
metricNames.add(m.name);
|
|
162
|
+
}
|
|
163
|
+
const dimNames = new Set();
|
|
164
|
+
for (const d of dimensions) {
|
|
165
|
+
if (dimNames.has(d.name)) {
|
|
166
|
+
issues.push({ level: 'error', message: `Duplicate dimension name: "${d.name}".` });
|
|
167
|
+
}
|
|
168
|
+
dimNames.add(d.name);
|
|
169
|
+
}
|
|
170
|
+
if (metrics.length === 0 && dimensions.length === 0) {
|
|
171
|
+
issues.push({ level: 'warning', message: 'Semantic layer is empty — no metrics or dimensions found.' });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (flags.format === 'json') {
|
|
175
|
+
console.log(JSON.stringify({ valid: issues.filter(i => i.level === 'error').length === 0, issues }, null, 2));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const errors = issues.filter(i => i.level === 'error');
|
|
179
|
+
const warnings = issues.filter(i => i.level === 'warning');
|
|
180
|
+
if (errors.length > 0) {
|
|
181
|
+
console.log(`\n ✗ ${errors.length} error(s):`);
|
|
182
|
+
for (const e of errors) {
|
|
183
|
+
console.log(` ✗ ${e.message}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (warnings.length > 0) {
|
|
187
|
+
console.log(`\n ⚠ ${warnings.length} warning(s):`);
|
|
188
|
+
for (const w of warnings) {
|
|
189
|
+
console.log(` ⚠ ${w.message}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (errors.length === 0 && warnings.length === 0) {
|
|
193
|
+
console.log('\n ✓ Semantic layer is valid.');
|
|
194
|
+
}
|
|
195
|
+
console.log('');
|
|
196
|
+
if (errors.length > 0) {
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// ── query ─────────────────────────────────────────────────────────────────────
|
|
201
|
+
function semanticQuery(semanticConfig, projectRoot, args, flags) {
|
|
202
|
+
if (args.length === 0) {
|
|
203
|
+
console.error('Usage: dql semantic query <metric1,metric2> [dim1,dim2] [--format json]');
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
const result = resolveSemanticLayerWithDiagnostics(semanticConfig, projectRoot);
|
|
207
|
+
if (!result.layer) {
|
|
208
|
+
console.error('No semantic layer found.');
|
|
209
|
+
for (const err of result.errors)
|
|
210
|
+
console.error(` ✗ ${err}`);
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
const metricNames = args[0].split(',').map(s => s.trim()).filter(Boolean);
|
|
214
|
+
const dimNames = args[1] ? args[1].split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
215
|
+
const composed = result.layer.composeQuery({
|
|
216
|
+
metrics: metricNames,
|
|
217
|
+
dimensions: dimNames,
|
|
218
|
+
});
|
|
219
|
+
if (!composed) {
|
|
220
|
+
console.error(`Could not compose query for metrics [${metricNames.join(', ')}].`);
|
|
221
|
+
console.error('Ensure the metrics exist in your semantic layer definitions.');
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
if (flags.format === 'json') {
|
|
225
|
+
console.log(JSON.stringify({ sql: composed, metrics: metricNames, dimensions: dimNames }, null, 2));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log(`\n Composed SQL:\n`);
|
|
229
|
+
console.log(` ${composed}`);
|
|
230
|
+
console.log('');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// ── pull ──────────────────────────────────────────────────────────────────────
|
|
234
|
+
function semanticPull(semanticConfig, flags) {
|
|
235
|
+
const cfg = semanticConfig;
|
|
236
|
+
if (!cfg?.repoUrl) {
|
|
237
|
+
console.error('No remote repo configured. Set semanticLayer.repoUrl in dql.config.json.');
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
const result = pullCachedRepo(cfg.repoUrl, cfg.branch);
|
|
241
|
+
if (flags.format === 'json') {
|
|
242
|
+
console.log(JSON.stringify(result, null, 2));
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
if (result.freshClone) {
|
|
246
|
+
console.log(` ✓ Pulled latest from ${cfg.repoUrl} (branch: ${cfg.branch ?? 'main'})`);
|
|
247
|
+
}
|
|
248
|
+
if (result.warnings.length > 0) {
|
|
249
|
+
for (const w of result.warnings) {
|
|
250
|
+
console.log(` ⚠ ${w}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
console.log(` Cache: ${result.localPath}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async function semanticImport(projectRoot, rest, flags) {
|
|
257
|
+
const provider = rest[0];
|
|
258
|
+
if (!provider || (provider !== 'dbt' && provider !== 'cubejs' && provider !== 'snowflake')) {
|
|
259
|
+
console.error('Usage: dql semantic import <dbt|cubejs|snowflake> [path] [--input <source-path>]');
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
262
|
+
const config = loadProjectConfig(projectRoot);
|
|
263
|
+
const sourceConfig = buildImportSourceConfig(provider, config.semanticLayer, flags.input, projectRoot);
|
|
264
|
+
const executeQuery = provider === 'snowflake'
|
|
265
|
+
? createSnowflakeQueryExecutor(config, projectRoot)
|
|
266
|
+
: undefined;
|
|
267
|
+
const result = await performSemanticImport({
|
|
268
|
+
targetProjectRoot: projectRoot,
|
|
269
|
+
provider,
|
|
270
|
+
sourceConfig,
|
|
271
|
+
executeQuery,
|
|
272
|
+
});
|
|
273
|
+
if (flags.format === 'json') {
|
|
274
|
+
console.log(JSON.stringify(result, null, 2));
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
console.log(`\n ✓ Imported semantic layer from ${provider}`);
|
|
278
|
+
console.log(` Target: ${projectRoot}`);
|
|
279
|
+
console.log(` Manifest: ${join(projectRoot, 'semantic-layer', 'imports', 'manifest.json')}`);
|
|
280
|
+
console.log('');
|
|
281
|
+
console.log(' Imported objects:');
|
|
282
|
+
for (const [kind, count] of Object.entries(result.counts)) {
|
|
283
|
+
console.log(` ${kind}: ${count}`);
|
|
284
|
+
}
|
|
285
|
+
if (result.manifest.warnings.length > 0) {
|
|
286
|
+
console.log('');
|
|
287
|
+
console.log(' Warnings:');
|
|
288
|
+
for (const warning of result.manifest.warnings) {
|
|
289
|
+
console.log(` - ${warning}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
console.log('');
|
|
293
|
+
}
|
|
294
|
+
async function semanticSync(projectRoot, flags) {
|
|
295
|
+
const config = loadProjectConfig(projectRoot);
|
|
296
|
+
const manifest = loadSemanticImportManifest(projectRoot);
|
|
297
|
+
if (!manifest) {
|
|
298
|
+
console.error('No semantic import manifest found. Run `dql semantic import <provider>` first.');
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
const executeQuery = manifest.provider === 'snowflake'
|
|
302
|
+
? createSnowflakeQueryExecutor(config, projectRoot)
|
|
303
|
+
: undefined;
|
|
304
|
+
const result = await syncSemanticImport({
|
|
305
|
+
targetProjectRoot: projectRoot,
|
|
306
|
+
executeQuery,
|
|
307
|
+
});
|
|
308
|
+
if (flags.format === 'json') {
|
|
309
|
+
console.log(JSON.stringify(result, null, 2));
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
console.log(`\n ✓ Synced semantic import from ${manifest.provider}`);
|
|
313
|
+
console.log(` Imported at: ${result.manifest.importedAt}`);
|
|
314
|
+
console.log(` Manifest: ${join(projectRoot, 'semantic-layer', 'imports', 'manifest.json')}`);
|
|
315
|
+
console.log('');
|
|
316
|
+
}
|
|
317
|
+
function buildImportSourceConfig(provider, semanticConfig, inputPath, projectRoot) {
|
|
318
|
+
const current = (semanticConfig ?? {});
|
|
319
|
+
if (provider === 'snowflake') {
|
|
320
|
+
return {
|
|
321
|
+
provider,
|
|
322
|
+
projectPath: current.projectPath,
|
|
323
|
+
connection: current.connection,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
if (inputPath) {
|
|
327
|
+
return {
|
|
328
|
+
provider,
|
|
329
|
+
projectPath: resolve(projectRoot, inputPath),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
provider,
|
|
334
|
+
projectPath: current.projectPath,
|
|
335
|
+
repoUrl: current.repoUrl,
|
|
336
|
+
branch: current.branch,
|
|
337
|
+
subPath: current.subPath,
|
|
338
|
+
source: current.source,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function createSnowflakeQueryExecutor(config, projectRoot) {
|
|
342
|
+
const connection = config.defaultConnection;
|
|
343
|
+
if (!connection || connection.driver !== 'snowflake') {
|
|
344
|
+
throw new Error('Snowflake semantic import requires a default Snowflake connection in dql.config.json.');
|
|
345
|
+
}
|
|
346
|
+
const executor = new QueryExecutor();
|
|
347
|
+
const normalizedConnection = {
|
|
348
|
+
...connection,
|
|
349
|
+
filepath: connection.filepath ? resolve(projectRoot, connection.filepath) : connection.filepath,
|
|
350
|
+
};
|
|
351
|
+
return async (sql) => {
|
|
352
|
+
const result = await executor.executeQuery(sql, [], {}, normalizedConnection);
|
|
353
|
+
return { rows: result.rows };
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/commands/semantic.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,mCAAmC,EACnC,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE9G,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAyB,EACzB,IAAc,EACd,KAAe;IAEf,MAAM,SAAS,GAAG,UAAU,KAAK,QAAQ;QACvC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAClB,CAAC,CAAC,UAAU,KAAK,OAAO;YACtB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,4BAA4B,OAAO,oDAAoD,CAAC,CAAC;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;IAE5C,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1D,KAAK,UAAU;YACb,OAAO,gBAAgB,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC9D,KAAK,OAAO;YACV,OAAO,aAAa,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1E,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC7C,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C;YACE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcjB,CAAC,IAAI,EAAE,CAAC,CAAC;YACJ,MAAM;IACV,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY,CACnB,cAAuB,EACvB,WAAmB,EACnB,KAAe;IAEf,MAAM,MAAM,GAAG,mCAAmC,CAChD,cAA2E,EAC3E,WAAW,CACZ,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,wGAAwG,CAAC,CAAC;QACxH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;IAE5C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,gBAAgB,IAAI,YAAY;YACjD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7G,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACjG,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SAC/F,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,IAAI,YAAY,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxD,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxD,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AAEjF,SAAS,gBAAgB,CACvB,cAAuB,EACvB,WAAmB,EACnB,KAAe;IAEf,MAAM,MAAM,GAAG,mCAAmC,CAChD,cAA2E,EAC3E,WAAW,CACZ,CAAC;IAEF,MAAM,MAAM,GAA2D,EAAE,CAAC;IAE1E,yBAAyB;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QAE1C,mBAAmB;QACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,2BAA2B,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,2BAA2B,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAClF,CAAC;YACD,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,8BAA8B,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,2DAA2D,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9G,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,aAAa,CACpB,cAAuB,EACvB,WAAmB,EACnB,IAAc,EACd,KAAe;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,mCAAmC,CAChD,cAA2E,EAC3E,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,wCAAwC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY,CACnB,cAAuB,EACvB,KAAe;IAEf,MAAM,GAAG,GAAG,cAAmE,CAAC;IAEhF,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAEvD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,CAAC,OAAO,aAAa,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,WAAmB,EACnB,IAAc,EACd,KAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAA+C,CAAC;IACvE,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,WAAW,CAAC,EAAE,CAAC;QAC3F,OAAO,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAC;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACvG,MAAM,YAAY,GAAG,QAAQ,KAAK,WAAW;QAC3C,CAAC,CAAC,4BAA4B,CAAC,MAAM,EAAE,WAAW,CAAC;QACnD,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;QACzC,iBAAiB,EAAE,WAAW;QAC9B,QAAQ;QACR,YAAY;QACZ,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,WAAmB,EACnB,KAAe;IAEf,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,KAAK,WAAW;QACpD,CAAC,CAAC,4BAA4B,CAAC,MAAM,EAAE,WAAW,CAAC;QACnD,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,iBAAiB,EAAE,WAAW;QAC9B,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,uBAAuB,CAC9B,QAAwC,EACxC,cAAuB,EACvB,SAAiB,EACjB,WAAmB;IAEnB,MAAM,OAAO,GAAG,CAAC,cAAc,IAAI,EAAE,CAOpC,CAAC;IAEF,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO;YACL,QAAQ;YACR,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,QAAQ;YACR,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CACnC,MAA4C,EAC5C,WAAmB;IAEnB,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC5C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,oBAAoB,GAAG;QAC3B,GAAG,UAAU;QACb,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ;KAChG,CAAC;IACF,OAAO,KAAK,EAAE,GAAW,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBvF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
|
|
4
|
+
import { assertLocalQueryRuntimeReady, findProjectRoot, loadProjectConfig, startLocalServer } from '../local-runtime.js';
|
|
5
|
+
import { maybeOpenBrowser } from '../open-browser.js';
|
|
6
|
+
export async function runServe(targetDir, flags) {
|
|
7
|
+
const rootDir = resolve(targetDir || 'dist');
|
|
8
|
+
if (!existsSync(join(rootDir, 'index.html'))) {
|
|
9
|
+
throw new Error(`No built DQL bundle found at ${rootDir}. Run "dql build <file.dql>" first or pass a directory containing index.html.`);
|
|
10
|
+
}
|
|
11
|
+
const projectRoot = findProjectRoot(rootDir);
|
|
12
|
+
const config = loadProjectConfig(projectRoot);
|
|
13
|
+
const executor = new QueryExecutor();
|
|
14
|
+
const connection = config.defaultConnection ?? { driver: 'file', filepath: ':memory:' };
|
|
15
|
+
process.chdir(projectRoot);
|
|
16
|
+
await assertLocalQueryRuntimeReady(executor, connection);
|
|
17
|
+
const port = await startLocalServer({
|
|
18
|
+
rootDir,
|
|
19
|
+
executor,
|
|
20
|
+
connection,
|
|
21
|
+
preferredPort: flags.port ?? config.preview?.port ?? 3474,
|
|
22
|
+
});
|
|
23
|
+
const url = `http://127.0.0.1:${port}`;
|
|
24
|
+
maybeOpenBrowser(url, flags.open ?? config.preview?.open ?? true);
|
|
25
|
+
console.log(`\n ✓ Serving DQL bundle: ${url}`);
|
|
26
|
+
console.log(` Root: ${rootDir}`);
|
|
27
|
+
console.log(' Press Ctrl+C to stop.');
|
|
28
|
+
console.log('');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAwB,EAAE,KAAe;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,+EAA+E,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEjG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,4BAA4B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;QAClC,OAAO;QACP,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;KAC1D,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql slack serve` — boot the Slack slash-command bot.
|
|
3
|
+
*
|
|
4
|
+
* dql slack serve [--port 3479] [--provider claude|openai|gemini|ollama]
|
|
5
|
+
*
|
|
6
|
+
* Reads `SLACK_SIGNING_SECRET` (required) + `SLACK_BOT_TOKEN` (optional, only
|
|
7
|
+
* needed for outbound posts beyond response_url replies). The bot answers
|
|
8
|
+
* `/dql ask <q>` and `/dql block <id>` via the existing block-first agent loop,
|
|
9
|
+
* so Slack reuses the same Certified/Uncertified semantics as the desktop UI.
|
|
10
|
+
*/
|
|
11
|
+
import type { CLIFlags } from '../args.js';
|
|
12
|
+
export declare function runSlack(sub: string | null, _rest: string[], flags: CLIFlags): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=slack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/commands/slack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql slack serve` — boot the Slack slash-command bot.
|
|
3
|
+
*
|
|
4
|
+
* dql slack serve [--port 3479] [--provider claude|openai|gemini|ollama]
|
|
5
|
+
*
|
|
6
|
+
* Reads `SLACK_SIGNING_SECRET` (required) + `SLACK_BOT_TOKEN` (optional, only
|
|
7
|
+
* needed for outbound posts beyond response_url replies). The bot answers
|
|
8
|
+
* `/dql ask <q>` and `/dql block <id>` via the existing block-first agent loop,
|
|
9
|
+
* so Slack reuses the same Certified/Uncertified semantics as the desktop UI.
|
|
10
|
+
*/
|
|
11
|
+
import { findProjectRoot } from '../local-runtime.js';
|
|
12
|
+
export async function runSlack(sub, _rest, flags) {
|
|
13
|
+
if (sub !== 'serve') {
|
|
14
|
+
throw new Error('Usage: dql slack serve [--port 3479] [--provider claude|openai|gemini|ollama]');
|
|
15
|
+
}
|
|
16
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
17
|
+
const signingSecret = process.env.SLACK_SIGNING_SECRET;
|
|
18
|
+
if (!signingSecret) {
|
|
19
|
+
throw new Error('SLACK_SIGNING_SECRET is required. Set it in your environment before running `dql slack serve`.');
|
|
20
|
+
}
|
|
21
|
+
const port = parsePort(flags.port);
|
|
22
|
+
const provider = flags.provider;
|
|
23
|
+
const { startSlackServer } = await import('@duckcodeailabs/dql-slack');
|
|
24
|
+
const server = await startSlackServer({
|
|
25
|
+
projectRoot,
|
|
26
|
+
signingSecret,
|
|
27
|
+
port,
|
|
28
|
+
provider,
|
|
29
|
+
});
|
|
30
|
+
console.log(` ✓ Slack bot listening on http://127.0.0.1:${server.port}`);
|
|
31
|
+
console.log(` POST /slack/commands (slash commands)`);
|
|
32
|
+
console.log(` POST /slack/actions (block-kit interactivity)`);
|
|
33
|
+
console.log(` GET /health`);
|
|
34
|
+
console.log('\n Forward Slack to this port via ngrok or a similar tunnel.');
|
|
35
|
+
// Keep the process alive on Ctrl+C.
|
|
36
|
+
for (const sig of ['SIGINT', 'SIGTERM']) {
|
|
37
|
+
process.on(sig, async () => {
|
|
38
|
+
console.log('\n Shutting down…');
|
|
39
|
+
await server.close();
|
|
40
|
+
process.exit(0);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function parsePort(raw) {
|
|
45
|
+
if (raw === null || raw === undefined || raw === '')
|
|
46
|
+
return 3479;
|
|
47
|
+
const n = typeof raw === 'number' ? raw : Number.parseInt(raw, 10);
|
|
48
|
+
if (!Number.isFinite(n) || n < 1 || n > 65535) {
|
|
49
|
+
throw new Error(`Invalid --port "${String(raw)}"`);
|
|
50
|
+
}
|
|
51
|
+
return n;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/commands/slack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAkB,EAClB,KAAe,EACf,KAAe;IAEf,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACvD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAE,KAAsD,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAI,KAA+B,CAAC,QACO,CAAC;IAE1D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;QACpC,WAAW;QACX,aAAa;QACb,IAAI;QACJ,QAAQ;KACT,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,oCAAoC;IACpC,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAuC;IACxD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgB3C,wBAAsB,OAAO,CAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CA0Gf"}
|