@duckcodeailabs/dql-cli 1.4.0 → 1.4.3
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/package.json +21 -28
- package/LICENSE +0 -123
- package/README.md +0 -71
- package/dist/apps-api.d.ts +0 -16
- package/dist/apps-api.d.ts.map +0 -1
- package/dist/apps-api.js +0 -249
- package/dist/apps-api.js.map +0 -1
- package/dist/args.d.ts +0 -30
- package/dist/args.d.ts.map +0 -1
- package/dist/args.js +0 -105
- package/dist/args.js.map +0 -1
- package/dist/args.test.d.ts +0 -2
- package/dist/args.test.d.ts.map +0 -1
- package/dist/args.test.js +0 -33
- package/dist/args.test.js.map +0 -1
- package/dist/assets/dql-notebook/assets/codemirror-DJYUkPr1.js +0 -11
- package/dist/assets/dql-notebook/assets/index-BJ7MV8Gv.js +0 -847
- package/dist/assets/dql-notebook/assets/index-DrhoZmtv.css +0 -1
- package/dist/assets/dql-notebook/assets/react-CRB3T2We.js +0 -32
- package/dist/assets/dql-notebook/index.html +0 -18
- package/dist/assets/notebook-browser/app.js +0 -548
- package/dist/assets/notebook-browser/index.html +0 -83
- package/dist/assets/notebook-browser/styles.css +0 -336
- package/dist/block-templates.d.ts +0 -8
- package/dist/block-templates.d.ts.map +0 -1
- package/dist/block-templates.js +0 -60
- package/dist/block-templates.js.map +0 -1
- package/dist/commands/agent.d.ts +0 -19
- package/dist/commands/agent.d.ts.map +0 -1
- package/dist/commands/agent.js +0 -117
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/app.d.ts +0 -32
- package/dist/commands/app.d.ts.map +0 -1
- package/dist/commands/app.js +0 -296
- package/dist/commands/app.js.map +0 -1
- package/dist/commands/build.d.ts +0 -3
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -69
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/build.test.d.ts +0 -2
- package/dist/commands/build.test.d.ts.map +0 -1
- package/dist/commands/build.test.js +0 -44
- package/dist/commands/build.test.js.map +0 -1
- package/dist/commands/certify.d.ts +0 -3
- package/dist/commands/certify.d.ts.map +0 -1
- package/dist/commands/certify.js +0 -228
- package/dist/commands/certify.js.map +0 -1
- package/dist/commands/compile.d.ts +0 -21
- package/dist/commands/compile.d.ts.map +0 -1
- package/dist/commands/compile.js +0 -198
- package/dist/commands/compile.js.map +0 -1
- package/dist/commands/compile.test.d.ts +0 -2
- package/dist/commands/compile.test.d.ts.map +0 -1
- package/dist/commands/compile.test.js +0 -115
- package/dist/commands/compile.test.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -3
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -52
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -191
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/doctor.test.d.ts +0 -2
- package/dist/commands/doctor.test.d.ts.map +0 -1
- package/dist/commands/doctor.test.js +0 -43
- package/dist/commands/doctor.test.js.map +0 -1
- package/dist/commands/fmt.d.ts +0 -3
- package/dist/commands/fmt.d.ts.map +0 -1
- package/dist/commands/fmt.js +0 -53
- package/dist/commands/fmt.js.map +0 -1
- package/dist/commands/info.d.ts +0 -3
- package/dist/commands/info.d.ts.map +0 -1
- package/dist/commands/info.js +0 -56
- package/dist/commands/info.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -250
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/init.test.d.ts +0 -2
- package/dist/commands/init.test.d.ts.map +0 -1
- package/dist/commands/init.test.js +0 -118
- package/dist/commands/init.test.js.map +0 -1
- package/dist/commands/lineage.d.ts +0 -24
- package/dist/commands/lineage.d.ts.map +0 -1
- package/dist/commands/lineage.js +0 -634
- package/dist/commands/lineage.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -7
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -16
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/migrate.d.ts +0 -12
- package/dist/commands/migrate.d.ts.map +0 -1
- package/dist/commands/migrate.js +0 -192
- package/dist/commands/migrate.js.map +0 -1
- package/dist/commands/new.d.ts +0 -3
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -490
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/new.test.d.ts +0 -2
- package/dist/commands/new.test.d.ts.map +0 -1
- package/dist/commands/new.test.js +0 -191
- package/dist/commands/new.test.js.map +0 -1
- package/dist/commands/notebook.d.ts +0 -3
- package/dist/commands/notebook.d.ts.map +0 -1
- package/dist/commands/notebook.js +0 -46
- package/dist/commands/notebook.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -3
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -63
- package/dist/commands/parse.js.map +0 -1
- package/dist/commands/preview.d.ts +0 -3
- package/dist/commands/preview.d.ts.map +0 -1
- package/dist/commands/preview.js +0 -42
- package/dist/commands/preview.js.map +0 -1
- package/dist/commands/schedule.d.ts +0 -3
- package/dist/commands/schedule.d.ts.map +0 -1
- package/dist/commands/schedule.js +0 -215
- package/dist/commands/schedule.js.map +0 -1
- package/dist/commands/semantic.d.ts +0 -12
- package/dist/commands/semantic.d.ts.map +0 -1
- package/dist/commands/semantic.js +0 -356
- package/dist/commands/semantic.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -3
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -30
- package/dist/commands/serve.js.map +0 -1
- package/dist/commands/slack.d.ts +0 -13
- package/dist/commands/slack.d.ts.map +0 -1
- package/dist/commands/slack.js +0 -53
- package/dist/commands/slack.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -3
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js +0 -192
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/sync.test.d.ts +0 -2
- package/dist/commands/sync.test.d.ts.map +0 -1
- package/dist/commands/sync.test.js +0 -147
- package/dist/commands/sync.test.js.map +0 -1
- package/dist/commands/test.d.ts +0 -3
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js +0 -167
- package/dist/commands/test.js.map +0 -1
- package/dist/commands/validate.d.ts +0 -3
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/validate.js +0 -116
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/verify.d.ts +0 -11
- package/dist/commands/verify.d.ts.map +0 -1
- package/dist/commands/verify.js +0 -74
- package/dist/commands/verify.js.map +0 -1
- package/dist/digest.d.ts +0 -10
- package/dist/digest.d.ts.map +0 -1
- package/dist/digest.js +0 -83
- package/dist/digest.js.map +0 -1
- package/dist/git-service.d.ts +0 -17
- package/dist/git-service.d.ts.map +0 -1
- package/dist/git-service.js +0 -54
- package/dist/git-service.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/llm/index.d.ts +0 -4
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/index.js +0 -16
- package/dist/llm/index.js.map +0 -1
- package/dist/llm/providers/claude-agent-sdk.d.ts +0 -3
- package/dist/llm/providers/claude-agent-sdk.d.ts.map +0 -1
- package/dist/llm/providers/claude-agent-sdk.js +0 -174
- package/dist/llm/providers/claude-agent-sdk.js.map +0 -1
- package/dist/llm/providers/claude-code.d.ts +0 -8
- package/dist/llm/providers/claude-code.d.ts.map +0 -1
- package/dist/llm/providers/claude-code.js +0 -171
- package/dist/llm/providers/claude-code.js.map +0 -1
- package/dist/llm/tools.d.ts +0 -9
- package/dist/llm/tools.d.ts.map +0 -1
- package/dist/llm/tools.js +0 -112
- package/dist/llm/tools.js.map +0 -1
- package/dist/llm/types.d.ts +0 -70
- package/dist/llm/types.d.ts.map +0 -1
- package/dist/llm/types.js +0 -2
- package/dist/llm/types.js.map +0 -1
- package/dist/local-runtime.d.ts +0 -142
- package/dist/local-runtime.d.ts.map +0 -1
- package/dist/local-runtime.js +0 -3836
- package/dist/local-runtime.js.map +0 -1
- package/dist/local-runtime.test.d.ts +0 -2
- package/dist/local-runtime.test.d.ts.map +0 -1
- package/dist/local-runtime.test.js +0 -241
- package/dist/local-runtime.test.js.map +0 -1
- package/dist/open-browser.d.ts +0 -2
- package/dist/open-browser.d.ts.map +0 -1
- package/dist/open-browser.js +0 -29
- package/dist/open-browser.js.map +0 -1
- package/dist/schedule/alerts.d.ts +0 -5
- package/dist/schedule/alerts.d.ts.map +0 -1
- package/dist/schedule/alerts.js +0 -54
- package/dist/schedule/alerts.js.map +0 -1
- package/dist/schedule/discovery.d.ts +0 -4
- package/dist/schedule/discovery.d.ts.map +0 -1
- package/dist/schedule/discovery.js +0 -36
- package/dist/schedule/discovery.js.map +0 -1
- package/dist/schedule/notifiers/email.d.ts +0 -3
- package/dist/schedule/notifiers/email.d.ts.map +0 -1
- package/dist/schedule/notifiers/email.js +0 -76
- package/dist/schedule/notifiers/email.js.map +0 -1
- package/dist/schedule/notifiers/file.d.ts +0 -3
- package/dist/schedule/notifiers/file.d.ts.map +0 -1
- package/dist/schedule/notifiers/file.js +0 -50
- package/dist/schedule/notifiers/file.js.map +0 -1
- package/dist/schedule/notifiers/index.d.ts +0 -10
- package/dist/schedule/notifiers/index.d.ts.map +0 -1
- package/dist/schedule/notifiers/index.js +0 -33
- package/dist/schedule/notifiers/index.js.map +0 -1
- package/dist/schedule/notifiers/slack.d.ts +0 -3
- package/dist/schedule/notifiers/slack.d.ts.map +0 -1
- package/dist/schedule/notifiers/slack.js +0 -58
- package/dist/schedule/notifiers/slack.js.map +0 -1
- package/dist/schedule/runner.d.ts +0 -11
- package/dist/schedule/runner.d.ts.map +0 -1
- package/dist/schedule/runner.js +0 -109
- package/dist/schedule/runner.js.map +0 -1
- package/dist/schedule/runs.d.ts +0 -5
- package/dist/schedule/runs.d.ts.map +0 -1
- package/dist/schedule/runs.js +0 -41
- package/dist/schedule/runs.js.map +0 -1
- package/dist/schedule/service.d.ts +0 -12
- package/dist/schedule/service.d.ts.map +0 -1
- package/dist/schedule/service.js +0 -49
- package/dist/schedule/service.js.map +0 -1
- package/dist/schedule/types.d.ts +0 -64
- package/dist/schedule/types.d.ts.map +0 -1
- package/dist/schedule/types.js +0 -2
- package/dist/schedule/types.js.map +0 -1
- package/dist/semantic-import.d.ts +0 -127
- package/dist/semantic-import.d.ts.map +0 -1
- package/dist/semantic-import.js +0 -713
- package/dist/semantic-import.js.map +0 -1
- package/dist/semantic-import.test.d.ts +0 -2
- package/dist/semantic-import.test.d.ts.map +0 -1
- package/dist/semantic-import.test.js +0 -95
- package/dist/semantic-import.test.js.map +0 -1
- /package/{dist/index.js → index.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/schedule/notifiers/slack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AAE7D,wBAAgB,mBAAmB,IAAI,QAAQ,CAyD9C"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
export function createSlackNotifier() {
|
|
2
|
-
return {
|
|
3
|
-
type: 'slack',
|
|
4
|
-
async send(recipients, payload) {
|
|
5
|
-
const webhook = process.env.DQL_SLACK_WEBHOOK;
|
|
6
|
-
if (!webhook) {
|
|
7
|
-
return {
|
|
8
|
-
delivered: false,
|
|
9
|
-
error: 'DQL_SLACK_WEBHOOK environment variable is not set',
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
const breached = payload.alerts.filter((a) => a.breached);
|
|
13
|
-
const hasDigest = Boolean(payload.markdown);
|
|
14
|
-
// Skip noise: no digest to deliver AND no alert breached.
|
|
15
|
-
if (!hasDigest && breached.length === 0) {
|
|
16
|
-
return { delivered: true };
|
|
17
|
-
}
|
|
18
|
-
const channels = recipients.length > 0 ? recipients : ['#default'];
|
|
19
|
-
const text = hasDigest
|
|
20
|
-
? [
|
|
21
|
-
`*[DQL Digest] ${payload.digestTitle ?? payload.block}*`,
|
|
22
|
-
`Generated: ${payload.startedAt} (${payload.trigger})`,
|
|
23
|
-
'',
|
|
24
|
-
truncateMarkdown(payload.markdown, 2500),
|
|
25
|
-
].join('\n')
|
|
26
|
-
: [
|
|
27
|
-
`*[DQL] ${payload.block}* — ${breached.length} alert(s) breached`,
|
|
28
|
-
`Triggered: ${payload.trigger} at ${payload.startedAt}`,
|
|
29
|
-
...breached.map((a) => `• \`${a.alert.conditionSQL}\` ${a.alert.operator ?? '>'} ${a.alert.threshold ?? 0} — observed \`${a.observedValue}\`${a.alert.message ? ` — ${a.alert.message}` : ''}`),
|
|
30
|
-
].join('\n');
|
|
31
|
-
try {
|
|
32
|
-
for (const channel of channels) {
|
|
33
|
-
const res = await fetch(webhook, {
|
|
34
|
-
method: 'POST',
|
|
35
|
-
headers: { 'Content-Type': 'application/json' },
|
|
36
|
-
body: JSON.stringify({ channel, text }),
|
|
37
|
-
});
|
|
38
|
-
if (!res.ok) {
|
|
39
|
-
return {
|
|
40
|
-
delivered: false,
|
|
41
|
-
error: `slack webhook returned ${res.status} ${res.statusText}`,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return { delivered: true };
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
return { delivered: false, error: err instanceof Error ? err.message : String(err) };
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
function truncateMarkdown(md, limit) {
|
|
54
|
-
if (md.length <= limit)
|
|
55
|
-
return md;
|
|
56
|
-
return md.slice(0, limit).trimEnd() + '\n…';
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=slack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/schedule/notifiers/slack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { QueryExecutor, ConnectionConfig } from '@duckcodeailabs/dql-connectors';
|
|
2
|
-
import type { RunRecord } from './types.js';
|
|
3
|
-
export interface RunOptions {
|
|
4
|
-
executor: QueryExecutor;
|
|
5
|
-
connection: ConnectionConfig;
|
|
6
|
-
projectRoot?: string;
|
|
7
|
-
trigger?: 'manual' | 'cron';
|
|
8
|
-
previewRows?: number;
|
|
9
|
-
}
|
|
10
|
-
export declare function runBlock(absPath: string, options: RunOptions): Promise<RunRecord>;
|
|
11
|
-
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/schedule/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAOtF,OAAO,KAAK,EAAmC,SAAS,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAwHvF"}
|
package/dist/schedule/runner.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { compile } from '@duckcodeailabs/dql-compiler';
|
|
3
|
-
import { findProjectRoot, loadProjectConfig, prepareLocalExecution } from '../local-runtime.js';
|
|
4
|
-
import { isDigestOutput, runDigestBuild } from '../digest.js';
|
|
5
|
-
import { evaluateAlerts } from './alerts.js';
|
|
6
|
-
import { deriveBlockName } from './discovery.js';
|
|
7
|
-
import { dispatchNotifications } from './notifiers/index.js';
|
|
8
|
-
import { writeRunRecord } from './runs.js';
|
|
9
|
-
export async function runBlock(absPath, options) {
|
|
10
|
-
const projectRoot = options.projectRoot ?? findProjectRoot(process.cwd());
|
|
11
|
-
const projectConfig = loadProjectConfig(projectRoot);
|
|
12
|
-
const trigger = options.trigger ?? 'manual';
|
|
13
|
-
const previewRows = options.previewRows ?? 3;
|
|
14
|
-
const startedAt = new Date().toISOString();
|
|
15
|
-
const block = deriveBlockName(projectRoot, absPath);
|
|
16
|
-
let queries = [];
|
|
17
|
-
let alertResults = [];
|
|
18
|
-
let notifications = [];
|
|
19
|
-
let error;
|
|
20
|
-
try {
|
|
21
|
-
const source = readFileSync(absPath, 'utf-8');
|
|
22
|
-
const compiled = compile(source, { file: absPath });
|
|
23
|
-
if (compiled.errors.length > 0) {
|
|
24
|
-
error = compiled.errors.join('; ');
|
|
25
|
-
}
|
|
26
|
-
const dashboard = compiled.dashboards[0];
|
|
27
|
-
if (!dashboard) {
|
|
28
|
-
error = error ?? 'compile produced no dashboards';
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
// Execute each chart query.
|
|
32
|
-
for (const q of dashboard.metadata.queries) {
|
|
33
|
-
const t0 = Date.now();
|
|
34
|
-
try {
|
|
35
|
-
const prepared = prepareLocalExecution(q.sql, options.connection, projectRoot, projectConfig);
|
|
36
|
-
const result = await options.executor.executeQuery(prepared.sql, [], {}, prepared.connection);
|
|
37
|
-
queries.push({
|
|
38
|
-
chartId: q.id,
|
|
39
|
-
sql: q.sql,
|
|
40
|
-
rowCount: result.rows.length,
|
|
41
|
-
durationMs: Date.now() - t0,
|
|
42
|
-
preview: result.rows.slice(0, previewRows),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
queries.push({
|
|
47
|
-
chartId: q.id,
|
|
48
|
-
sql: q.sql,
|
|
49
|
-
rowCount: 0,
|
|
50
|
-
durationMs: Date.now() - t0,
|
|
51
|
-
error: err instanceof Error ? err.message : String(err),
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// Evaluate alerts.
|
|
56
|
-
alertResults = await evaluateAlerts(dashboard.metadata.alerts ?? [], options.executor, options.connection);
|
|
57
|
-
// Fire notifications only if at least one alert breached OR no alerts were
|
|
58
|
-
// declared (so scheduled runs without alerts still produce an audit entry).
|
|
59
|
-
const anyBreached = alertResults.some((a) => a.breached);
|
|
60
|
-
const hasAlerts = alertResults.length > 0;
|
|
61
|
-
const shouldNotify = anyBreached || !hasAlerts;
|
|
62
|
-
if (shouldNotify && (dashboard.metadata.notifications?.length ?? 0) > 0) {
|
|
63
|
-
const payload = {
|
|
64
|
-
block,
|
|
65
|
-
path: absPath,
|
|
66
|
-
startedAt,
|
|
67
|
-
alerts: alertResults,
|
|
68
|
-
queries,
|
|
69
|
-
trigger,
|
|
70
|
-
};
|
|
71
|
-
if (isDigestOutput(dashboard)) {
|
|
72
|
-
try {
|
|
73
|
-
const digest = await runDigestBuild(dashboard, projectRoot);
|
|
74
|
-
payload.html = digest.html;
|
|
75
|
-
payload.markdown = digest.markdown;
|
|
76
|
-
payload.digestTitle = dashboard.metadata.title ?? block;
|
|
77
|
-
payload.digestDiagnostics = digest.diagnostics;
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
80
|
-
payload.digestDiagnostics = [
|
|
81
|
-
{
|
|
82
|
-
level: 'warning',
|
|
83
|
-
message: `digest build failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
84
|
-
},
|
|
85
|
-
];
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
notifications = await dispatchNotifications(dashboard.metadata.notifications ?? [], payload, projectRoot);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch (err) {
|
|
93
|
-
error = err instanceof Error ? err.message : String(err);
|
|
94
|
-
}
|
|
95
|
-
const record = {
|
|
96
|
-
startedAt,
|
|
97
|
-
finishedAt: new Date().toISOString(),
|
|
98
|
-
block,
|
|
99
|
-
path: absPath,
|
|
100
|
-
trigger,
|
|
101
|
-
queries,
|
|
102
|
-
alerts: alertResults,
|
|
103
|
-
notifications,
|
|
104
|
-
error,
|
|
105
|
-
};
|
|
106
|
-
writeRunRecord(projectRoot, record);
|
|
107
|
-
return record;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/schedule/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/schedule/runs.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { RunRecord } from './types.js';
|
|
2
|
-
export declare function ensureRunsDir(projectRoot: string): string;
|
|
3
|
-
export declare function writeRunRecord(projectRoot: string, record: RunRecord): string;
|
|
4
|
-
export declare function listRunRecords(projectRoot: string, limit?: number): RunRecord[];
|
|
5
|
-
//# sourceMappingURL=runs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/schedule/runs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAO7E;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE,CAqB3E"}
|
package/dist/schedule/runs.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
const RUNS_DIR = '.dql/runs';
|
|
4
|
-
export function ensureRunsDir(projectRoot) {
|
|
5
|
-
const dir = join(projectRoot, RUNS_DIR);
|
|
6
|
-
if (!existsSync(dir)) {
|
|
7
|
-
mkdirSync(dir, { recursive: true });
|
|
8
|
-
}
|
|
9
|
-
return dir;
|
|
10
|
-
}
|
|
11
|
-
export function writeRunRecord(projectRoot, record) {
|
|
12
|
-
const dir = ensureRunsDir(projectRoot);
|
|
13
|
-
const stamp = record.startedAt.replace(/[:.]/g, '-');
|
|
14
|
-
const safeName = record.block.replace(/[^a-zA-Z0-9_-]+/g, '_');
|
|
15
|
-
const file = join(dir, `${stamp}-${safeName}.json`);
|
|
16
|
-
writeFileSync(file, JSON.stringify(record, null, 2) + '\n', 'utf-8');
|
|
17
|
-
return file;
|
|
18
|
-
}
|
|
19
|
-
export function listRunRecords(projectRoot, limit = 20) {
|
|
20
|
-
const dir = join(projectRoot, RUNS_DIR);
|
|
21
|
-
if (!existsSync(dir))
|
|
22
|
-
return [];
|
|
23
|
-
const files = readdirSync(dir)
|
|
24
|
-
.filter((f) => f.endsWith('.json'))
|
|
25
|
-
.sort()
|
|
26
|
-
.reverse()
|
|
27
|
-
.slice(0, limit);
|
|
28
|
-
const records = [];
|
|
29
|
-
for (const f of files) {
|
|
30
|
-
try {
|
|
31
|
-
const raw = readFileSync(join(dir, f), 'utf-8');
|
|
32
|
-
records.push(JSON.parse(raw));
|
|
33
|
-
}
|
|
34
|
-
catch (err) {
|
|
35
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
36
|
-
console.warn(`[dql schedule] skipping malformed run record ${f}: ${msg}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return records;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=runs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/schedule/runs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,QAAQ,GAAG,WAAW,CAAC;AAE7B,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,MAAiB;IACnE,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,QAAQ,OAAO,CAAC,CAAC;IACpD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,KAAK,GAAG,EAAE;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAClC,IAAI,EAAE;SACN,OAAO,EAAE;SACT,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { type ConnectionConfig } from '@duckcodeailabs/dql-connectors';
|
|
2
|
-
import type { ScheduledBlock } from './types.js';
|
|
3
|
-
export interface ServiceOptions {
|
|
4
|
-
projectRoot?: string;
|
|
5
|
-
connection?: ConnectionConfig;
|
|
6
|
-
}
|
|
7
|
-
export interface StartedService {
|
|
8
|
-
blocks: ScheduledBlock[];
|
|
9
|
-
stop: () => Promise<void>;
|
|
10
|
-
}
|
|
11
|
-
export declare function startScheduleService(options?: ServiceOptions): Promise<StartedService>;
|
|
12
|
-
//# sourceMappingURL=service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/schedule/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAItF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiDhG"}
|
package/dist/schedule/service.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
|
|
2
|
-
import { findProjectRoot, loadProjectConfig, normalizeProjectConnection } from '../local-runtime.js';
|
|
3
|
-
import { discoverScheduledBlocks } from './discovery.js';
|
|
4
|
-
import { runBlock } from './runner.js';
|
|
5
|
-
export async function startScheduleService(options = {}) {
|
|
6
|
-
const projectRoot = options.projectRoot ?? findProjectRoot(process.cwd());
|
|
7
|
-
const projectConfig = loadProjectConfig(projectRoot);
|
|
8
|
-
const connection = options.connection ??
|
|
9
|
-
normalizeProjectConnection(projectConfig.defaultConnection ?? { driver: 'duckdb' }, projectRoot);
|
|
10
|
-
const executor = new QueryExecutor();
|
|
11
|
-
const blocks = discoverScheduledBlocks(projectRoot);
|
|
12
|
-
// Dynamic import so node-cron stays off the hot path for one-shot commands.
|
|
13
|
-
const nodeCron = (await import('node-cron'));
|
|
14
|
-
const tasks = [];
|
|
15
|
-
for (const block of blocks) {
|
|
16
|
-
if (!nodeCron.validate(block.schedule.cron)) {
|
|
17
|
-
console.error(`[schedule] invalid cron "${block.schedule.cron}" on ${block.name}, skipping`);
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
const task = nodeCron.schedule(block.schedule.cron, () => {
|
|
21
|
-
void (async () => {
|
|
22
|
-
try {
|
|
23
|
-
const record = await runBlock(block.path, {
|
|
24
|
-
executor,
|
|
25
|
-
connection,
|
|
26
|
-
projectRoot,
|
|
27
|
-
trigger: 'cron',
|
|
28
|
-
});
|
|
29
|
-
const breached = record.alerts.filter((a) => a.breached).length;
|
|
30
|
-
const tag = record.error ? 'error' : breached > 0 ? `breached:${breached}` : 'ok';
|
|
31
|
-
console.log(`[schedule] ${record.startedAt} ${block.name} → ${tag}`);
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
35
|
-
console.error(`[schedule] run failed for ${block.name}: ${msg}`);
|
|
36
|
-
}
|
|
37
|
-
})();
|
|
38
|
-
});
|
|
39
|
-
tasks.push({ stop: () => task.stop() });
|
|
40
|
-
}
|
|
41
|
-
return {
|
|
42
|
-
blocks,
|
|
43
|
-
async stop() {
|
|
44
|
-
for (const t of tasks)
|
|
45
|
-
t.stop();
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/schedule/service.ts"],"names":[],"mappings":"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"}
|
package/dist/schedule/types.d.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { ScheduleIR, NotificationIR, AlertIR, DigestDiagnostic } from '@duckcodeailabs/dql-compiler';
|
|
2
|
-
export interface ScheduledBlock {
|
|
3
|
-
/** Absolute path to the .dql file. */
|
|
4
|
-
path: string;
|
|
5
|
-
/** Name derived from the path, e.g. "finance/revenue_by_month". */
|
|
6
|
-
name: string;
|
|
7
|
-
schedule: ScheduleIR;
|
|
8
|
-
notifications: NotificationIR[];
|
|
9
|
-
alerts: AlertIR[];
|
|
10
|
-
}
|
|
11
|
-
export interface AlertEvaluation {
|
|
12
|
-
alert: AlertIR;
|
|
13
|
-
breached: boolean;
|
|
14
|
-
observedValue?: number;
|
|
15
|
-
reason?: string;
|
|
16
|
-
error?: string;
|
|
17
|
-
}
|
|
18
|
-
export interface QueryRunResult {
|
|
19
|
-
chartId: string;
|
|
20
|
-
sql: string;
|
|
21
|
-
rowCount: number;
|
|
22
|
-
durationMs: number;
|
|
23
|
-
error?: string;
|
|
24
|
-
preview?: Array<Record<string, unknown>>;
|
|
25
|
-
}
|
|
26
|
-
export interface RunRecord {
|
|
27
|
-
startedAt: string;
|
|
28
|
-
finishedAt: string;
|
|
29
|
-
block: string;
|
|
30
|
-
path: string;
|
|
31
|
-
trigger: 'manual' | 'cron';
|
|
32
|
-
queries: QueryRunResult[];
|
|
33
|
-
alerts: AlertEvaluation[];
|
|
34
|
-
notifications: Array<{
|
|
35
|
-
type: string;
|
|
36
|
-
recipients: string[];
|
|
37
|
-
delivered: boolean;
|
|
38
|
-
error?: string;
|
|
39
|
-
}>;
|
|
40
|
-
error?: string;
|
|
41
|
-
}
|
|
42
|
-
export interface NotifierPayload {
|
|
43
|
-
block: string;
|
|
44
|
-
path: string;
|
|
45
|
-
startedAt: string;
|
|
46
|
-
alerts: AlertEvaluation[];
|
|
47
|
-
queries: QueryRunResult[];
|
|
48
|
-
trigger: 'manual' | 'cron';
|
|
49
|
-
/** Rendered digest HTML (present when the block is a digest). */
|
|
50
|
-
html?: string;
|
|
51
|
-
/** Digest markdown sibling — preferred as an email/slack preview body. */
|
|
52
|
-
markdown?: string;
|
|
53
|
-
/** Title/name shown in digest headers, defaults to `block` when absent. */
|
|
54
|
-
digestTitle?: string;
|
|
55
|
-
digestDiagnostics?: DigestDiagnostic[];
|
|
56
|
-
}
|
|
57
|
-
export interface Notifier {
|
|
58
|
-
type: 'email' | 'slack' | 'file';
|
|
59
|
-
send(recipients: string[], payload: NotifierPayload): Promise<{
|
|
60
|
-
delivered: boolean;
|
|
61
|
-
error?: string;
|
|
62
|
-
}>;
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schedule/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE1G,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvG"}
|
package/dist/schedule/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schedule/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { type CubeDefinition, type HierarchyDefinition, type SemanticLayer, type SemanticLayerProviderConfig, type SemanticSourceMetadata, type SnowflakeQueryExecutor } from '@duckcodeailabs/dql-core';
|
|
2
|
-
export interface SemanticImportManifestObject {
|
|
3
|
-
id: string;
|
|
4
|
-
kind: 'cube' | 'metric' | 'dimension' | 'hierarchy' | 'segment' | 'pre_aggregation';
|
|
5
|
-
name: string;
|
|
6
|
-
label: string;
|
|
7
|
-
domain: string;
|
|
8
|
-
cube?: string;
|
|
9
|
-
filePath: string;
|
|
10
|
-
source?: SemanticSourceMetadata;
|
|
11
|
-
}
|
|
12
|
-
export interface SemanticImportManifest {
|
|
13
|
-
version: 1;
|
|
14
|
-
mode: 'imported';
|
|
15
|
-
provider: 'dbt' | 'cubejs' | 'snowflake';
|
|
16
|
-
importedAt: string;
|
|
17
|
-
source: {
|
|
18
|
-
projectPath?: string;
|
|
19
|
-
repoUrl?: string;
|
|
20
|
-
branch?: string;
|
|
21
|
-
subPath?: string;
|
|
22
|
-
connection?: string;
|
|
23
|
-
};
|
|
24
|
-
warnings: string[];
|
|
25
|
-
generatedFiles: string[];
|
|
26
|
-
objects: SemanticImportManifestObject[];
|
|
27
|
-
}
|
|
28
|
-
export interface SemanticImportResult {
|
|
29
|
-
manifest: SemanticImportManifest;
|
|
30
|
-
counts: Record<SemanticImportManifestObject['kind'], number>;
|
|
31
|
-
}
|
|
32
|
-
export interface SemanticImportPreview {
|
|
33
|
-
provider: 'dbt' | 'cubejs' | 'snowflake';
|
|
34
|
-
counts: Record<SemanticImportManifestObject['kind'], number>;
|
|
35
|
-
domains: string[];
|
|
36
|
-
warnings: string[];
|
|
37
|
-
objects: Array<{
|
|
38
|
-
kind: SemanticImportManifestObject['kind'];
|
|
39
|
-
name: string;
|
|
40
|
-
label: string;
|
|
41
|
-
domain: string;
|
|
42
|
-
}>;
|
|
43
|
-
}
|
|
44
|
-
export interface SemanticSyncDiff {
|
|
45
|
-
added: Array<{
|
|
46
|
-
kind: SemanticImportManifestObject['kind'];
|
|
47
|
-
name: string;
|
|
48
|
-
label: string;
|
|
49
|
-
domain: string;
|
|
50
|
-
}>;
|
|
51
|
-
removed: Array<{
|
|
52
|
-
kind: SemanticImportManifestObject['kind'];
|
|
53
|
-
name: string;
|
|
54
|
-
label: string;
|
|
55
|
-
domain: string;
|
|
56
|
-
}>;
|
|
57
|
-
changed: Array<{
|
|
58
|
-
kind: SemanticImportManifestObject['kind'];
|
|
59
|
-
name: string;
|
|
60
|
-
label: string;
|
|
61
|
-
domain: string;
|
|
62
|
-
}>;
|
|
63
|
-
unchanged: number;
|
|
64
|
-
}
|
|
65
|
-
export interface SemanticTreeNode {
|
|
66
|
-
id: string;
|
|
67
|
-
label: string;
|
|
68
|
-
kind: 'provider' | 'domain' | 'cube' | 'group' | SemanticImportManifestObject['kind'];
|
|
69
|
-
count?: number;
|
|
70
|
-
meta?: Record<string, string | number | boolean | null | undefined>;
|
|
71
|
-
children?: SemanticTreeNode[];
|
|
72
|
-
}
|
|
73
|
-
export interface SemanticObjectDetail {
|
|
74
|
-
id: string;
|
|
75
|
-
kind: SemanticImportManifestObject['kind'];
|
|
76
|
-
name: string;
|
|
77
|
-
label: string;
|
|
78
|
-
description: string;
|
|
79
|
-
domain: string;
|
|
80
|
-
cube?: string;
|
|
81
|
-
table?: string;
|
|
82
|
-
sql?: string;
|
|
83
|
-
type?: string;
|
|
84
|
-
tags: string[];
|
|
85
|
-
owner: string | null;
|
|
86
|
-
source: SemanticSourceMetadata | null;
|
|
87
|
-
filePath: string | null;
|
|
88
|
-
importedAt: string | null;
|
|
89
|
-
joins?: CubeDefinition['joins'];
|
|
90
|
-
levels?: HierarchyDefinition['levels'];
|
|
91
|
-
measures?: string[];
|
|
92
|
-
dimensions?: string[];
|
|
93
|
-
timeDimension?: string;
|
|
94
|
-
granularity?: string;
|
|
95
|
-
refreshKey?: string;
|
|
96
|
-
}
|
|
97
|
-
export declare function performSemanticImport(opts: {
|
|
98
|
-
targetProjectRoot: string;
|
|
99
|
-
provider: 'dbt' | 'cubejs' | 'snowflake';
|
|
100
|
-
sourceConfig: SemanticLayerProviderConfig;
|
|
101
|
-
executeQuery?: SnowflakeQueryExecutor;
|
|
102
|
-
}): Promise<SemanticImportResult>;
|
|
103
|
-
export declare function syncSemanticImport(opts: {
|
|
104
|
-
targetProjectRoot: string;
|
|
105
|
-
executeQuery?: SnowflakeQueryExecutor;
|
|
106
|
-
}): Promise<SemanticImportResult>;
|
|
107
|
-
export declare function loadSemanticImportManifest(projectRoot: string): SemanticImportManifest | null;
|
|
108
|
-
export declare function buildSemanticTree(layer: SemanticLayer, manifest: SemanticImportManifest | null): SemanticTreeNode;
|
|
109
|
-
export declare function buildSemanticObjectDetail(layer: SemanticLayer, manifest: SemanticImportManifest | null, id: string): SemanticObjectDetail | null;
|
|
110
|
-
/**
|
|
111
|
-
* Preview a semantic import without writing any files.
|
|
112
|
-
* Returns counts, domains, warnings, and object summaries.
|
|
113
|
-
*/
|
|
114
|
-
export declare function previewSemanticImport(opts: {
|
|
115
|
-
targetProjectRoot: string;
|
|
116
|
-
provider: 'dbt' | 'cubejs' | 'snowflake';
|
|
117
|
-
sourceConfig: SemanticLayerProviderConfig;
|
|
118
|
-
executeQuery?: SnowflakeQueryExecutor;
|
|
119
|
-
}): Promise<SemanticImportPreview>;
|
|
120
|
-
/**
|
|
121
|
-
* Compute the diff between the current manifest and a fresh import, without applying changes.
|
|
122
|
-
*/
|
|
123
|
-
export declare function computeSyncDiff(opts: {
|
|
124
|
-
targetProjectRoot: string;
|
|
125
|
-
executeQuery?: SnowflakeQueryExecutor;
|
|
126
|
-
}): Promise<SemanticSyncDiff>;
|
|
127
|
-
//# sourceMappingURL=semantic-import.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-import.d.ts","sourceRoot":"","sources":["../src/semantic-import.ts"],"names":[],"mappings":"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"}
|