@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,116 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join, extname, resolve } from 'node:path';
|
|
3
|
+
import { Parser, analyze, loadSemanticLayerFromDir } from '@duckcodeailabs/dql-core';
|
|
4
|
+
export async function runValidate(path, flags) {
|
|
5
|
+
const projectRoot = resolve(path ?? '.');
|
|
6
|
+
const diagnostics = [];
|
|
7
|
+
// Load semantic layer if present
|
|
8
|
+
let semanticLayer;
|
|
9
|
+
const semanticDir = join(projectRoot, 'semantic-layer');
|
|
10
|
+
if (existsSync(semanticDir)) {
|
|
11
|
+
try {
|
|
12
|
+
semanticLayer = loadSemanticLayerFromDir(semanticDir);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
diagnostics.push({
|
|
16
|
+
file: 'semantic-layer/',
|
|
17
|
+
severity: 'error',
|
|
18
|
+
message: `Failed to load semantic layer: ${err instanceof Error ? err.message : String(err)}`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Scan all .dql files in known directories
|
|
23
|
+
const dirs = ['blocks', 'dashboards', 'workbooks'];
|
|
24
|
+
let fileCount = 0;
|
|
25
|
+
for (const dir of dirs) {
|
|
26
|
+
const dirPath = join(projectRoot, dir);
|
|
27
|
+
if (!existsSync(dirPath))
|
|
28
|
+
continue;
|
|
29
|
+
for (const entry of readdirSync(dirPath, { withFileTypes: true })) {
|
|
30
|
+
if (!entry.isFile() || extname(entry.name) !== '.dql')
|
|
31
|
+
continue;
|
|
32
|
+
const filePath = join(dirPath, entry.name);
|
|
33
|
+
const relativePath = `${dir}/${entry.name}`;
|
|
34
|
+
fileCount++;
|
|
35
|
+
try {
|
|
36
|
+
const source = readFileSync(filePath, 'utf-8');
|
|
37
|
+
const parser = new Parser(source, relativePath);
|
|
38
|
+
const ast = parser.parse();
|
|
39
|
+
// Run semantic analysis
|
|
40
|
+
try {
|
|
41
|
+
const diags = analyze(ast);
|
|
42
|
+
for (const diag of diags) {
|
|
43
|
+
diagnostics.push({
|
|
44
|
+
file: relativePath,
|
|
45
|
+
severity: diag.severity === 'error' ? 'error' : 'warning',
|
|
46
|
+
message: diag.message,
|
|
47
|
+
line: diag.span?.start?.line,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// analyze may throw on some inputs
|
|
53
|
+
}
|
|
54
|
+
// Check semantic block metric references
|
|
55
|
+
for (const stmt of ast.statements) {
|
|
56
|
+
if (stmt.kind !== 'BlockDecl')
|
|
57
|
+
continue;
|
|
58
|
+
const block = stmt;
|
|
59
|
+
if (block.blockType === 'semantic' && block.metricRef) {
|
|
60
|
+
if (semanticLayer) {
|
|
61
|
+
const composed = semanticLayer.composeQuery({
|
|
62
|
+
metrics: [block.metricRef],
|
|
63
|
+
dimensions: [],
|
|
64
|
+
});
|
|
65
|
+
if (!composed) {
|
|
66
|
+
diagnostics.push({
|
|
67
|
+
file: relativePath,
|
|
68
|
+
severity: 'error',
|
|
69
|
+
message: `Metric "${block.metricRef}" referenced in block "${block.name}" not found in semantic layer`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
diagnostics.push({
|
|
75
|
+
file: relativePath,
|
|
76
|
+
severity: 'warning',
|
|
77
|
+
message: `Semantic block "${block.name}" references metric "${block.metricRef}" but no semantic-layer/ directory exists`,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
diagnostics.push({
|
|
85
|
+
file: relativePath,
|
|
86
|
+
severity: 'error',
|
|
87
|
+
message: `Parse error: ${err instanceof Error ? err.message : String(err)}`,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Output
|
|
93
|
+
const errors = diagnostics.filter((d) => d.severity === 'error');
|
|
94
|
+
const warnings = diagnostics.filter((d) => d.severity === 'warning');
|
|
95
|
+
if (flags.format === 'json') {
|
|
96
|
+
console.log(JSON.stringify({ files: fileCount, diagnostics }, null, 2));
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.log(`\n Validated ${fileCount} DQL file(s)\n`);
|
|
100
|
+
if (diagnostics.length === 0) {
|
|
101
|
+
console.log(' All files are valid.\n');
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
for (const d of diagnostics) {
|
|
105
|
+
const loc = d.line ? `:${d.line}` : '';
|
|
106
|
+
const icon = d.severity === 'error' ? 'ERROR' : 'WARN';
|
|
107
|
+
console.log(` ${icon} ${d.file}${loc}: ${d.message}`);
|
|
108
|
+
}
|
|
109
|
+
console.log(`\n ${errors.length} error(s), ${warnings.length} warning(s)\n`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (errors.length > 0) {
|
|
113
|
+
process.exitCode = 1;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAyD,MAAM,0BAA0B,CAAC;AAU5I,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAmB,EAAE,KAAe;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IACzC,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,iCAAiC;IACjC,IAAI,aAAwC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,aAAa,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAC9F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QAEnC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM;gBAAE,SAAS;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5C,SAAS,EAAE,CAAC;YAEZ,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gBAE3B,wBAAwB;gBACxB,IAAI,CAAC;oBACH,MAAM,KAAK,GAAqB,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,WAAW,CAAC,IAAI,CAAC;4BACf,IAAI,EAAE,YAAY;4BAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;4BACzD,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI;yBAC7B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;gBAED,yCAAyC;gBACzC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;oBAClC,IAAK,IAAY,CAAC,IAAI,KAAK,WAAW;wBAAE,SAAS;oBACjD,MAAM,KAAK,GAAG,IAAW,CAAC;oBAC1B,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;wBACtD,IAAI,aAAa,EAAE,CAAC;4BAClB,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC;gCAC1C,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;gCAC1B,UAAU,EAAE,EAAE;6BACf,CAAC,CAAC;4BACH,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACd,WAAW,CAAC,IAAI,CAAC;oCACf,IAAI,EAAE,YAAY;oCAClB,QAAQ,EAAE,OAAO;oCACjB,OAAO,EAAE,WAAW,KAAK,CAAC,SAAS,0BAA0B,KAAK,CAAC,IAAI,+BAA+B;iCACvG,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,WAAW,CAAC,IAAI,CAAC;gCACf,IAAI,EAAE,YAAY;gCAClB,QAAQ,EAAE,SAAS;gCACnB,OAAO,EAAE,mBAAmB,KAAK,CAAC,IAAI,wBAAwB,KAAK,CAAC,SAAS,2CAA2C;6BACzH,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBAC5E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;IACT,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAErE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,gBAAgB,CAAC,CAAC;QACxD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,cAAc,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql verify` — prove the on-disk manifest is reproducible from source.
|
|
3
|
+
*
|
|
4
|
+
* Recompiles the manifest in-memory and diffs it against `dql-manifest.json`.
|
|
5
|
+
* Returns a non-zero exit code (and prints a diff summary) on drift. Used by
|
|
6
|
+
* CI to ensure programmable artifacts (Apps, dashboards, blocks, RLS rules,
|
|
7
|
+
* schedules) stay in lock-step with their source files.
|
|
8
|
+
*/
|
|
9
|
+
import type { CLIFlags } from '../args.js';
|
|
10
|
+
export declare function runVerify(_rest: string[], flags: CLIFlags): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B/E"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dql verify` — prove the on-disk manifest is reproducible from source.
|
|
3
|
+
*
|
|
4
|
+
* Recompiles the manifest in-memory and diffs it against `dql-manifest.json`.
|
|
5
|
+
* Returns a non-zero exit code (and prints a diff summary) on drift. Used by
|
|
6
|
+
* CI to ensure programmable artifacts (Apps, dashboards, blocks, RLS rules,
|
|
7
|
+
* schedules) stay in lock-step with their source files.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { buildManifest } from '@duckcodeailabs/dql-core';
|
|
12
|
+
import { findProjectRoot } from '../local-runtime.js';
|
|
13
|
+
export async function runVerify(_rest, flags) {
|
|
14
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
15
|
+
const manifestPath = join(projectRoot, 'dql-manifest.json');
|
|
16
|
+
if (!existsSync(manifestPath)) {
|
|
17
|
+
throw new Error(`dql-manifest.json not found at ${manifestPath}. Run \`dql compile\` first.`);
|
|
18
|
+
}
|
|
19
|
+
const onDisk = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
20
|
+
const fresh = buildManifest({ projectRoot });
|
|
21
|
+
const drift = diffManifest(onDisk, fresh);
|
|
22
|
+
const json = flags.format === 'json';
|
|
23
|
+
if (drift.length === 0) {
|
|
24
|
+
if (json) {
|
|
25
|
+
console.log(JSON.stringify({ ok: true }));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(' ✓ Manifest verified — no drift between source tree and dql-manifest.json.');
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (json) {
|
|
33
|
+
console.log(JSON.stringify({ ok: false, drift }, null, 2));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.error(` ✗ Manifest drift detected:`);
|
|
37
|
+
for (const item of drift)
|
|
38
|
+
console.error(` - ${item}`);
|
|
39
|
+
console.error('\n Run `dql compile` to regenerate, then commit.');
|
|
40
|
+
}
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
function diffManifest(a, b) {
|
|
44
|
+
const drift = [];
|
|
45
|
+
diffMap('blocks', new Set(Object.keys(a.blocks)), new Set(Object.keys(b.blocks)), drift);
|
|
46
|
+
diffMap('notebooks', new Set(Object.keys(a.notebooks)), new Set(Object.keys(b.notebooks)), drift);
|
|
47
|
+
diffMap('apps', new Set(Object.keys(a.apps ?? {})), new Set(Object.keys(b.apps ?? {})), drift);
|
|
48
|
+
diffMap('dashboards', new Set(Object.keys(a.dashboards ?? {})), new Set(Object.keys(b.dashboards ?? {})), drift);
|
|
49
|
+
diffMap('metrics', new Set(Object.keys(a.metrics)), new Set(Object.keys(b.metrics)), drift);
|
|
50
|
+
diffMap('dimensions', new Set(Object.keys(a.dimensions)), new Set(Object.keys(b.dimensions)), drift);
|
|
51
|
+
diffMap('sources', new Set(Object.keys(a.sources)), new Set(Object.keys(b.sources)), drift);
|
|
52
|
+
// Block-level drift: shape changes that matter for downstream readers.
|
|
53
|
+
for (const [name, block] of Object.entries(a.blocks)) {
|
|
54
|
+
const other = b.blocks[name];
|
|
55
|
+
if (!other)
|
|
56
|
+
continue;
|
|
57
|
+
if (block.sql !== other.sql)
|
|
58
|
+
drift.push(`blocks/${name}: SQL drift`);
|
|
59
|
+
if ((block.status ?? '') !== (other.status ?? ''))
|
|
60
|
+
drift.push(`blocks/${name}: status drift (${block.status} → ${other.status})`);
|
|
61
|
+
if ((block.domain ?? '') !== (other.domain ?? ''))
|
|
62
|
+
drift.push(`blocks/${name}: domain drift`);
|
|
63
|
+
}
|
|
64
|
+
return drift;
|
|
65
|
+
}
|
|
66
|
+
function diffMap(label, a, b, into) {
|
|
67
|
+
for (const k of a)
|
|
68
|
+
if (!b.has(k))
|
|
69
|
+
into.push(`${label}: removed "${k}"`);
|
|
70
|
+
for (const k of b)
|
|
71
|
+
if (!a.has(k))
|
|
72
|
+
into.push(`${label}: added "${k}"`);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAoB,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAe,EAAE,KAAe;IAC9D,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,8BAA8B,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAgB,CAAC;IAC9E,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAI,KAA6B,CAAC,MAAM,KAAK,MAAM,CAAC;IAE9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,CAAc,EAAE,CAAc;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACzF,OAAO,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClG,OAAO,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/F,OAAO,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjH,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5F,OAAO,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrG,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE5F,uEAAuE;IACvE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,mBAAmB,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAClI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,CAAc,EAAE,CAAc,EAAE,IAAc;IAC5E,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC"}
|
package/digest.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Digest build helper — resolves block sources + SHAs and drives digest-emitter.
|
|
3
|
+
*
|
|
4
|
+
* Runs outside compile() so the narrative (potentially LLM-backed) stays an
|
|
5
|
+
* async post-process step and doesn't push async up through the core compiler.
|
|
6
|
+
*/
|
|
7
|
+
import { type CompilationOutput, type DigestBuildResult, type DigestLLMProvider } from '@duckcodeailabs/dql-compiler';
|
|
8
|
+
export declare function isDigestOutput(output: CompilationOutput): boolean;
|
|
9
|
+
export declare function runDigestBuild(output: CompilationOutput, projectRoot: string, llm?: DigestLLMProvider): Promise<DigestBuildResult>;
|
|
10
|
+
//# sourceMappingURL=digest.d.ts.map
|
package/digest.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEjE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,iBAAiB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAsB5B"}
|
package/digest.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Digest build helper — resolves block sources + SHAs and drives digest-emitter.
|
|
3
|
+
*
|
|
4
|
+
* Runs outside compile() so the narrative (potentially LLM-backed) stays an
|
|
5
|
+
* async post-process step and doesn't push async up through the core compiler.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { buildManifest } from '@duckcodeailabs/dql-core';
|
|
11
|
+
import { buildDigest, } from '@duckcodeailabs/dql-compiler';
|
|
12
|
+
export function isDigestOutput(output) {
|
|
13
|
+
return Boolean(output.metadata?.narrative);
|
|
14
|
+
}
|
|
15
|
+
export async function runDigestBuild(output, projectRoot, llm) {
|
|
16
|
+
const narrative = output.metadata?.narrative;
|
|
17
|
+
if (!narrative) {
|
|
18
|
+
throw new Error('runDigestBuild called on non-digest output');
|
|
19
|
+
}
|
|
20
|
+
const sources = loadBlockSources(projectRoot, narrative.sources);
|
|
21
|
+
const digestIR = {
|
|
22
|
+
title: output.metadata.title,
|
|
23
|
+
narrative,
|
|
24
|
+
// The digest-emitter only needs `title` + `narrative` + `sources` for
|
|
25
|
+
// narrative composition; the dashboard HTML is threaded in separately.
|
|
26
|
+
charts: [],
|
|
27
|
+
filters: [],
|
|
28
|
+
params: [],
|
|
29
|
+
notifications: output.metadata.notifications ?? [],
|
|
30
|
+
alerts: output.metadata.alerts ?? [],
|
|
31
|
+
layout: { type: 'grid', columns: 12, items: [] },
|
|
32
|
+
variables: {},
|
|
33
|
+
};
|
|
34
|
+
return buildDigest(digestIR, output.html, sources, llm);
|
|
35
|
+
}
|
|
36
|
+
function loadBlockSources(projectRoot, sourceNames) {
|
|
37
|
+
const manifest = loadOrBuildManifest(projectRoot);
|
|
38
|
+
const sources = new Map();
|
|
39
|
+
for (const name of sourceNames) {
|
|
40
|
+
const block = manifest?.blocks?.[name];
|
|
41
|
+
if (!block) {
|
|
42
|
+
sources.set(name, { path: name, description: undefined });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
sources.set(name, {
|
|
46
|
+
path: block.filePath,
|
|
47
|
+
description: block.description,
|
|
48
|
+
gitCommitSha: resolveGitSha(projectRoot, block.filePath),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return sources;
|
|
52
|
+
}
|
|
53
|
+
function loadOrBuildManifest(projectRoot) {
|
|
54
|
+
const cached = join(projectRoot, 'dql-manifest.json');
|
|
55
|
+
if (existsSync(cached)) {
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(readFileSync(cached, 'utf-8'));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// fall through to fresh build
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
return buildManifest({ projectRoot, dqlVersion: '0.0.0' });
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function resolveGitSha(projectRoot, filePath) {
|
|
71
|
+
try {
|
|
72
|
+
const sha = execSync(`git log -1 --format=%H -- "${filePath}"`, {
|
|
73
|
+
cwd: projectRoot,
|
|
74
|
+
encoding: 'utf-8',
|
|
75
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
76
|
+
}).trim();
|
|
77
|
+
return sha.length > 0 ? sha : undefined;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=digest.js.map
|
package/digest.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"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"}
|
package/git-service.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface RepoContext {
|
|
2
|
+
/** Absolute path to the repository root (where `.git` lives). */
|
|
3
|
+
dir: string;
|
|
4
|
+
/** Relative path of the requested file from the repo root, POSIX-separated. */
|
|
5
|
+
relpath: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Locate the git repository containing `absPath`. Walks upward looking
|
|
9
|
+
* for a `.git` directory. Returns `null` when no repository is found.
|
|
10
|
+
*/
|
|
11
|
+
export declare function findRepoContext(absPath: string): RepoContext | null;
|
|
12
|
+
/**
|
|
13
|
+
* Read the HEAD-committed contents of `relpath` as a UTF-8 string. Returns
|
|
14
|
+
* `null` if HEAD has no such file (newly added in the working copy).
|
|
15
|
+
*/
|
|
16
|
+
export declare function readHeadBlob(ctx: RepoContext): Promise<string | null>;
|
|
17
|
+
//# sourceMappingURL=git-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-service.d.ts","sourceRoot":"","sources":["../src/git-service.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAcnE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc3E"}
|
package/git-service.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Thin isomorphic-git wrapper used by `dql diff <path>` to resolve the
|
|
2
|
+
// HEAD blob for a file inside a git repo.
|
|
3
|
+
import { statSync } from 'node:fs';
|
|
4
|
+
import { join, relative, resolve } from 'node:path';
|
|
5
|
+
import git from 'isomorphic-git';
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
/**
|
|
8
|
+
* Locate the git repository containing `absPath`. Walks upward looking
|
|
9
|
+
* for a `.git` directory. Returns `null` when no repository is found.
|
|
10
|
+
*/
|
|
11
|
+
export function findRepoContext(absPath) {
|
|
12
|
+
let dir = resolve(absPath);
|
|
13
|
+
if (!statSync(dir, { throwIfNoEntry: false })?.isDirectory()) {
|
|
14
|
+
dir = resolve(dir, '..');
|
|
15
|
+
}
|
|
16
|
+
while (true) {
|
|
17
|
+
if (statSync(join(dir, '.git'), { throwIfNoEntry: false })) {
|
|
18
|
+
const rel = relative(dir, absPath).split(/[\\/]/).join('/');
|
|
19
|
+
return { dir, relpath: rel };
|
|
20
|
+
}
|
|
21
|
+
const parent = resolve(dir, '..');
|
|
22
|
+
if (parent === dir)
|
|
23
|
+
return null;
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read the HEAD-committed contents of `relpath` as a UTF-8 string. Returns
|
|
29
|
+
* `null` if HEAD has no such file (newly added in the working copy).
|
|
30
|
+
*/
|
|
31
|
+
export async function readHeadBlob(ctx) {
|
|
32
|
+
try {
|
|
33
|
+
const commitSha = await git.resolveRef({ fs, dir: ctx.dir, ref: 'HEAD' });
|
|
34
|
+
const { blob } = await git.readBlob({
|
|
35
|
+
fs,
|
|
36
|
+
dir: ctx.dir,
|
|
37
|
+
oid: commitSha,
|
|
38
|
+
filepath: ctx.relpath,
|
|
39
|
+
});
|
|
40
|
+
return new TextDecoder('utf-8').decode(blob);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (isNotFoundError(error))
|
|
44
|
+
return null;
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function isNotFoundError(error) {
|
|
49
|
+
if (!error || typeof error !== 'object')
|
|
50
|
+
return false;
|
|
51
|
+
const code = error.code;
|
|
52
|
+
return code === 'NotFoundError' || code === 'ENOENT';
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=git-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-service.js","sourceRoot":"","sources":["../src/git-service.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,0CAA0C;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAS9B;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC;QAC7D,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAgB;IACjD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YAClC,EAAE;YACF,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,GAAG,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,QAAQ,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type AppDocument } from '@duckcodeailabs/dql-core';
|
|
2
|
+
import { type AccessLevel, type DataClassification } from '@duckcodeailabs/dql-governance';
|
|
3
|
+
export declare class DQLAccessDeniedError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function runtimeVariables(base: Record<string, unknown> | undefined): Record<string, unknown>;
|
|
7
|
+
export declare function activePersonaAppId(): string | undefined;
|
|
8
|
+
export declare function loadRuntimeApp(projectRoot: string, appId: string | undefined | null): AppDocument | null;
|
|
9
|
+
export declare function assertAppAccess(opts: {
|
|
10
|
+
app: AppDocument | null;
|
|
11
|
+
domain?: string | null;
|
|
12
|
+
classification?: DataClassification | null;
|
|
13
|
+
level?: AccessLevel;
|
|
14
|
+
}): void;
|
|
15
|
+
//# sourceMappingURL=governance-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-runtime.d.ts","sourceRoot":"","sources":["../src/governance-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAgB,KAAK,WAAW,EAAqB,KAAK,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAM5H,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnG;AAED,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAOxG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,IAAI,CAcP"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { loadAppDocument, findAppDocuments, } from '@duckcodeailabs/dql-core';
|
|
2
|
+
import { PolicyEngine } from '@duckcodeailabs/dql-governance';
|
|
3
|
+
import { defaultPersonaRegistry, mergePersonaVariables, } from '@duckcodeailabs/dql-project';
|
|
4
|
+
export class DQLAccessDeniedError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'DQLAccessDeniedError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function runtimeVariables(base) {
|
|
11
|
+
return mergePersonaVariables(base ?? {}, defaultPersonaRegistry.active);
|
|
12
|
+
}
|
|
13
|
+
export function activePersonaAppId() {
|
|
14
|
+
return defaultPersonaRegistry.active?.appId;
|
|
15
|
+
}
|
|
16
|
+
export function loadRuntimeApp(projectRoot, appId) {
|
|
17
|
+
if (!appId)
|
|
18
|
+
return null;
|
|
19
|
+
for (const p of findAppDocuments(projectRoot)) {
|
|
20
|
+
const { document } = loadAppDocument(p);
|
|
21
|
+
if (document?.id === appId)
|
|
22
|
+
return document;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
export function assertAppAccess(opts) {
|
|
27
|
+
const app = opts.app;
|
|
28
|
+
if (!app)
|
|
29
|
+
return;
|
|
30
|
+
const user = defaultPersonaRegistry.toUserContext();
|
|
31
|
+
const engine = new PolicyEngine(app.policies.map(toAccessPolicy));
|
|
32
|
+
const result = engine.checkAccess(user, opts.domain ?? app.domain, opts.classification ?? 'internal', opts.level ?? 'execute');
|
|
33
|
+
if (!result.allowed) {
|
|
34
|
+
throw new DQLAccessDeniedError(result.reason ?? 'Not authorized');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function toAccessPolicy(policy) {
|
|
38
|
+
return {
|
|
39
|
+
id: policy.id,
|
|
40
|
+
name: policy.id,
|
|
41
|
+
description: policy.description ?? policy.id,
|
|
42
|
+
domain: policy.domain,
|
|
43
|
+
minClassification: policy.minClassification,
|
|
44
|
+
allowedRoles: policy.allowedRoles,
|
|
45
|
+
allowedUsers: policy.allowedUsers ?? [],
|
|
46
|
+
accessLevel: policy.accessLevel,
|
|
47
|
+
enabled: policy.enabled !== false,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=governance-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-runtime.js","sourceRoot":"","sources":["../src/governance-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,gBAAgB,GAEjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAgE,MAAM,gCAAgC,CAAC;AAC5H,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AAErC,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAyC;IACxE,OAAO,qBAAqB,CAAC,IAAI,IAAI,EAAE,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,KAAgC;IAClF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,EAAE,KAAK,KAAK;YAAE,OAAO,QAAQ,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAK/B;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,IAAI,GAAG,sBAAsB,CAAC,aAAa,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,IAAI,EACJ,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EACzB,IAAI,CAAC,cAAc,IAAI,UAAU,EACjC,IAAI,CAAC,KAAK,IAAI,SAAS,CACxB,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAuC;IAC7D,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,EAAE;QACf,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,EAAE;QAC5C,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACvC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,KAAK;KAClC,CAAC;AACJ,CAAC"}
|
package/index.d.ts
ADDED
package/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/llm/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentRunner, ProviderId } from './types.js';
|
|
2
|
+
export { type AgentRunRequest, type AgentRunner, type AgentTurn, type BlockProposal, type ChatTurn, type LLMProvider, type ProviderId, } from './types.js';
|
|
3
|
+
export declare function getRunner(provider: ProviderId): AgentRunner | null;
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AAepB,wBAAgB,SAAS,CAAC,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAElE"}
|
package/llm/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { claudeAgentSdkRunner } from './providers/claude-agent-sdk.js';
|
|
2
|
+
import { claudeCodeRunner } from './providers/claude-code.js';
|
|
3
|
+
import { createDqlAgentProviderRunner } from './providers/dql-agent-provider.js';
|
|
4
|
+
/**
|
|
5
|
+
* Registry of available LLM providers. Claude keeps the tool-use loop; the
|
|
6
|
+
* OpenAI/Gemini/Ollama adapters reuse `@duckcodeailabs/dql-agent` providers
|
|
7
|
+
* and emit the same AgentTurn SSE envelope for notebook Chat.
|
|
8
|
+
*/
|
|
9
|
+
const RUNNERS = {
|
|
10
|
+
'claude-agent-sdk': claudeAgentSdkRunner,
|
|
11
|
+
'claude-code': claudeCodeRunner,
|
|
12
|
+
openai: createDqlAgentProviderRunner('openai'),
|
|
13
|
+
gemini: createDqlAgentProviderRunner('gemini'),
|
|
14
|
+
ollama: createDqlAgentProviderRunner('ollama'),
|
|
15
|
+
};
|
|
16
|
+
export function getRunner(provider) {
|
|
17
|
+
return RUNNERS[provider] ?? null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
package/llm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAajF;;;;GAIG;AACH,MAAM,OAAO,GAAoC;IAC/C,kBAAkB,EAAE,oBAAoB;IACxC,aAAa,EAAE,gBAAgB;IAC/B,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC;IAC9C,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC;IAC9C,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC;CAC/C,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,QAAoB;IAC5C,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent-sdk.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/claude-agent-sdk.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,WAAW,EAA4B,MAAM,aAAa,CAAC;AAsL1F,eAAO,MAAM,oBAAoB,EAAE,WAiBlC,CAAC"}
|