@duckcodeailabs/dql-cli 1.4.1 → 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.
Files changed (243) hide show
  1. package/package.json +21 -28
  2. package/LICENSE +0 -123
  3. package/README.md +0 -71
  4. package/dist/apps-api.d.ts +0 -16
  5. package/dist/apps-api.d.ts.map +0 -1
  6. package/dist/apps-api.js +0 -249
  7. package/dist/apps-api.js.map +0 -1
  8. package/dist/args.d.ts +0 -30
  9. package/dist/args.d.ts.map +0 -1
  10. package/dist/args.js +0 -105
  11. package/dist/args.js.map +0 -1
  12. package/dist/args.test.d.ts +0 -2
  13. package/dist/args.test.d.ts.map +0 -1
  14. package/dist/args.test.js +0 -33
  15. package/dist/args.test.js.map +0 -1
  16. package/dist/assets/dql-notebook/assets/codemirror-DJYUkPr1.js +0 -11
  17. package/dist/assets/dql-notebook/assets/index-BJ7MV8Gv.js +0 -847
  18. package/dist/assets/dql-notebook/assets/index-DrhoZmtv.css +0 -1
  19. package/dist/assets/dql-notebook/assets/react-CRB3T2We.js +0 -32
  20. package/dist/assets/dql-notebook/index.html +0 -18
  21. package/dist/assets/notebook-browser/app.js +0 -548
  22. package/dist/assets/notebook-browser/index.html +0 -83
  23. package/dist/assets/notebook-browser/styles.css +0 -336
  24. package/dist/block-templates.d.ts +0 -8
  25. package/dist/block-templates.d.ts.map +0 -1
  26. package/dist/block-templates.js +0 -60
  27. package/dist/block-templates.js.map +0 -1
  28. package/dist/commands/agent.d.ts +0 -19
  29. package/dist/commands/agent.d.ts.map +0 -1
  30. package/dist/commands/agent.js +0 -117
  31. package/dist/commands/agent.js.map +0 -1
  32. package/dist/commands/app.d.ts +0 -32
  33. package/dist/commands/app.d.ts.map +0 -1
  34. package/dist/commands/app.js +0 -307
  35. package/dist/commands/app.js.map +0 -1
  36. package/dist/commands/build.d.ts +0 -3
  37. package/dist/commands/build.d.ts.map +0 -1
  38. package/dist/commands/build.js +0 -69
  39. package/dist/commands/build.js.map +0 -1
  40. package/dist/commands/build.test.d.ts +0 -2
  41. package/dist/commands/build.test.d.ts.map +0 -1
  42. package/dist/commands/build.test.js +0 -44
  43. package/dist/commands/build.test.js.map +0 -1
  44. package/dist/commands/certify.d.ts +0 -3
  45. package/dist/commands/certify.d.ts.map +0 -1
  46. package/dist/commands/certify.js +0 -228
  47. package/dist/commands/certify.js.map +0 -1
  48. package/dist/commands/compile.d.ts +0 -21
  49. package/dist/commands/compile.d.ts.map +0 -1
  50. package/dist/commands/compile.js +0 -198
  51. package/dist/commands/compile.js.map +0 -1
  52. package/dist/commands/compile.test.d.ts +0 -2
  53. package/dist/commands/compile.test.d.ts.map +0 -1
  54. package/dist/commands/compile.test.js +0 -115
  55. package/dist/commands/compile.test.js.map +0 -1
  56. package/dist/commands/diff.d.ts +0 -3
  57. package/dist/commands/diff.d.ts.map +0 -1
  58. package/dist/commands/diff.js +0 -52
  59. package/dist/commands/diff.js.map +0 -1
  60. package/dist/commands/doctor.d.ts +0 -3
  61. package/dist/commands/doctor.d.ts.map +0 -1
  62. package/dist/commands/doctor.js +0 -191
  63. package/dist/commands/doctor.js.map +0 -1
  64. package/dist/commands/doctor.test.d.ts +0 -2
  65. package/dist/commands/doctor.test.d.ts.map +0 -1
  66. package/dist/commands/doctor.test.js +0 -43
  67. package/dist/commands/doctor.test.js.map +0 -1
  68. package/dist/commands/fmt.d.ts +0 -3
  69. package/dist/commands/fmt.d.ts.map +0 -1
  70. package/dist/commands/fmt.js +0 -53
  71. package/dist/commands/fmt.js.map +0 -1
  72. package/dist/commands/info.d.ts +0 -3
  73. package/dist/commands/info.d.ts.map +0 -1
  74. package/dist/commands/info.js +0 -56
  75. package/dist/commands/info.js.map +0 -1
  76. package/dist/commands/init.d.ts +0 -3
  77. package/dist/commands/init.d.ts.map +0 -1
  78. package/dist/commands/init.js +0 -250
  79. package/dist/commands/init.js.map +0 -1
  80. package/dist/commands/init.test.d.ts +0 -2
  81. package/dist/commands/init.test.d.ts.map +0 -1
  82. package/dist/commands/init.test.js +0 -118
  83. package/dist/commands/init.test.js.map +0 -1
  84. package/dist/commands/lineage.d.ts +0 -24
  85. package/dist/commands/lineage.d.ts.map +0 -1
  86. package/dist/commands/lineage.js +0 -634
  87. package/dist/commands/lineage.js.map +0 -1
  88. package/dist/commands/mcp.d.ts +0 -7
  89. package/dist/commands/mcp.d.ts.map +0 -1
  90. package/dist/commands/mcp.js +0 -16
  91. package/dist/commands/mcp.js.map +0 -1
  92. package/dist/commands/migrate.d.ts +0 -12
  93. package/dist/commands/migrate.d.ts.map +0 -1
  94. package/dist/commands/migrate.js +0 -192
  95. package/dist/commands/migrate.js.map +0 -1
  96. package/dist/commands/new.d.ts +0 -3
  97. package/dist/commands/new.d.ts.map +0 -1
  98. package/dist/commands/new.js +0 -490
  99. package/dist/commands/new.js.map +0 -1
  100. package/dist/commands/new.test.d.ts +0 -2
  101. package/dist/commands/new.test.d.ts.map +0 -1
  102. package/dist/commands/new.test.js +0 -191
  103. package/dist/commands/new.test.js.map +0 -1
  104. package/dist/commands/notebook.d.ts +0 -3
  105. package/dist/commands/notebook.d.ts.map +0 -1
  106. package/dist/commands/notebook.js +0 -46
  107. package/dist/commands/notebook.js.map +0 -1
  108. package/dist/commands/parse.d.ts +0 -3
  109. package/dist/commands/parse.d.ts.map +0 -1
  110. package/dist/commands/parse.js +0 -63
  111. package/dist/commands/parse.js.map +0 -1
  112. package/dist/commands/preview.d.ts +0 -3
  113. package/dist/commands/preview.d.ts.map +0 -1
  114. package/dist/commands/preview.js +0 -42
  115. package/dist/commands/preview.js.map +0 -1
  116. package/dist/commands/schedule.d.ts +0 -3
  117. package/dist/commands/schedule.d.ts.map +0 -1
  118. package/dist/commands/schedule.js +0 -215
  119. package/dist/commands/schedule.js.map +0 -1
  120. package/dist/commands/semantic.d.ts +0 -12
  121. package/dist/commands/semantic.d.ts.map +0 -1
  122. package/dist/commands/semantic.js +0 -356
  123. package/dist/commands/semantic.js.map +0 -1
  124. package/dist/commands/serve.d.ts +0 -3
  125. package/dist/commands/serve.d.ts.map +0 -1
  126. package/dist/commands/serve.js +0 -30
  127. package/dist/commands/serve.js.map +0 -1
  128. package/dist/commands/slack.d.ts +0 -13
  129. package/dist/commands/slack.d.ts.map +0 -1
  130. package/dist/commands/slack.js +0 -53
  131. package/dist/commands/slack.js.map +0 -1
  132. package/dist/commands/sync.d.ts +0 -3
  133. package/dist/commands/sync.d.ts.map +0 -1
  134. package/dist/commands/sync.js +0 -192
  135. package/dist/commands/sync.js.map +0 -1
  136. package/dist/commands/sync.test.d.ts +0 -2
  137. package/dist/commands/sync.test.d.ts.map +0 -1
  138. package/dist/commands/sync.test.js +0 -147
  139. package/dist/commands/sync.test.js.map +0 -1
  140. package/dist/commands/test.d.ts +0 -3
  141. package/dist/commands/test.d.ts.map +0 -1
  142. package/dist/commands/test.js +0 -167
  143. package/dist/commands/test.js.map +0 -1
  144. package/dist/commands/validate.d.ts +0 -3
  145. package/dist/commands/validate.d.ts.map +0 -1
  146. package/dist/commands/validate.js +0 -116
  147. package/dist/commands/validate.js.map +0 -1
  148. package/dist/commands/verify.d.ts +0 -11
  149. package/dist/commands/verify.d.ts.map +0 -1
  150. package/dist/commands/verify.js +0 -74
  151. package/dist/commands/verify.js.map +0 -1
  152. package/dist/digest.d.ts +0 -10
  153. package/dist/digest.d.ts.map +0 -1
  154. package/dist/digest.js +0 -83
  155. package/dist/digest.js.map +0 -1
  156. package/dist/git-service.d.ts +0 -17
  157. package/dist/git-service.d.ts.map +0 -1
  158. package/dist/git-service.js +0 -54
  159. package/dist/git-service.js.map +0 -1
  160. package/dist/index.d.ts +0 -3
  161. package/dist/index.d.ts.map +0 -1
  162. package/dist/index.js.map +0 -1
  163. package/dist/llm/index.d.ts +0 -4
  164. package/dist/llm/index.d.ts.map +0 -1
  165. package/dist/llm/index.js +0 -16
  166. package/dist/llm/index.js.map +0 -1
  167. package/dist/llm/providers/claude-agent-sdk.d.ts +0 -3
  168. package/dist/llm/providers/claude-agent-sdk.d.ts.map +0 -1
  169. package/dist/llm/providers/claude-agent-sdk.js +0 -174
  170. package/dist/llm/providers/claude-agent-sdk.js.map +0 -1
  171. package/dist/llm/providers/claude-code.d.ts +0 -8
  172. package/dist/llm/providers/claude-code.d.ts.map +0 -1
  173. package/dist/llm/providers/claude-code.js +0 -171
  174. package/dist/llm/providers/claude-code.js.map +0 -1
  175. package/dist/llm/tools.d.ts +0 -9
  176. package/dist/llm/tools.d.ts.map +0 -1
  177. package/dist/llm/tools.js +0 -112
  178. package/dist/llm/tools.js.map +0 -1
  179. package/dist/llm/types.d.ts +0 -70
  180. package/dist/llm/types.d.ts.map +0 -1
  181. package/dist/llm/types.js +0 -2
  182. package/dist/llm/types.js.map +0 -1
  183. package/dist/local-runtime.d.ts +0 -142
  184. package/dist/local-runtime.d.ts.map +0 -1
  185. package/dist/local-runtime.js +0 -3836
  186. package/dist/local-runtime.js.map +0 -1
  187. package/dist/local-runtime.test.d.ts +0 -2
  188. package/dist/local-runtime.test.d.ts.map +0 -1
  189. package/dist/local-runtime.test.js +0 -241
  190. package/dist/local-runtime.test.js.map +0 -1
  191. package/dist/open-browser.d.ts +0 -2
  192. package/dist/open-browser.d.ts.map +0 -1
  193. package/dist/open-browser.js +0 -29
  194. package/dist/open-browser.js.map +0 -1
  195. package/dist/schedule/alerts.d.ts +0 -5
  196. package/dist/schedule/alerts.d.ts.map +0 -1
  197. package/dist/schedule/alerts.js +0 -54
  198. package/dist/schedule/alerts.js.map +0 -1
  199. package/dist/schedule/discovery.d.ts +0 -4
  200. package/dist/schedule/discovery.d.ts.map +0 -1
  201. package/dist/schedule/discovery.js +0 -36
  202. package/dist/schedule/discovery.js.map +0 -1
  203. package/dist/schedule/notifiers/email.d.ts +0 -3
  204. package/dist/schedule/notifiers/email.d.ts.map +0 -1
  205. package/dist/schedule/notifiers/email.js +0 -76
  206. package/dist/schedule/notifiers/email.js.map +0 -1
  207. package/dist/schedule/notifiers/file.d.ts +0 -3
  208. package/dist/schedule/notifiers/file.d.ts.map +0 -1
  209. package/dist/schedule/notifiers/file.js +0 -50
  210. package/dist/schedule/notifiers/file.js.map +0 -1
  211. package/dist/schedule/notifiers/index.d.ts +0 -10
  212. package/dist/schedule/notifiers/index.d.ts.map +0 -1
  213. package/dist/schedule/notifiers/index.js +0 -33
  214. package/dist/schedule/notifiers/index.js.map +0 -1
  215. package/dist/schedule/notifiers/slack.d.ts +0 -3
  216. package/dist/schedule/notifiers/slack.d.ts.map +0 -1
  217. package/dist/schedule/notifiers/slack.js +0 -58
  218. package/dist/schedule/notifiers/slack.js.map +0 -1
  219. package/dist/schedule/runner.d.ts +0 -11
  220. package/dist/schedule/runner.d.ts.map +0 -1
  221. package/dist/schedule/runner.js +0 -109
  222. package/dist/schedule/runner.js.map +0 -1
  223. package/dist/schedule/runs.d.ts +0 -5
  224. package/dist/schedule/runs.d.ts.map +0 -1
  225. package/dist/schedule/runs.js +0 -41
  226. package/dist/schedule/runs.js.map +0 -1
  227. package/dist/schedule/service.d.ts +0 -12
  228. package/dist/schedule/service.d.ts.map +0 -1
  229. package/dist/schedule/service.js +0 -49
  230. package/dist/schedule/service.js.map +0 -1
  231. package/dist/schedule/types.d.ts +0 -64
  232. package/dist/schedule/types.d.ts.map +0 -1
  233. package/dist/schedule/types.js +0 -2
  234. package/dist/schedule/types.js.map +0 -1
  235. package/dist/semantic-import.d.ts +0 -127
  236. package/dist/semantic-import.d.ts.map +0 -1
  237. package/dist/semantic-import.js +0 -713
  238. package/dist/semantic-import.js.map +0 -1
  239. package/dist/semantic-import.test.d.ts +0 -2
  240. package/dist/semantic-import.test.d.ts.map +0 -1
  241. package/dist/semantic-import.test.js +0 -95
  242. package/dist/semantic-import.test.js.map +0 -1
  243. /package/{dist/index.js → index.js} +0 -0
@@ -1,3 +0,0 @@
1
- import type { Notifier } from '../types.js';
2
- export declare function createSlackNotifier(): Notifier;
3
- //# sourceMappingURL=slack.d.ts.map
@@ -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"}
@@ -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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"}
@@ -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"}
@@ -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"}
@@ -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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"}
@@ -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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -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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"}