@duckcodeailabs/dql-cli 1.6.28 → 1.6.30
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/dist/apps-api.d.ts +1 -1
- package/dist/apps-api.d.ts.map +1 -1
- package/dist/apps-api.js +88 -9
- package/dist/apps-api.js.map +1 -1
- package/dist/assets/dql-notebook/assets/{index-g0QVJ0wA.js → index-QJKCrLXe.js} +290 -290
- package/dist/assets/dql-notebook/index.html +1 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +4 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/providers/dql-agent-provider.d.ts +15 -2
- package/dist/llm/providers/dql-agent-provider.d.ts.map +1 -1
- package/dist/llm/providers/dql-agent-provider.js +50 -1
- package/dist/llm/providers/dql-agent-provider.js.map +1 -1
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/local-runtime.d.ts.map +1 -1
- package/dist/local-runtime.js +338 -16
- package/dist/local-runtime.js.map +1 -1
- package/dist/package.json +11 -11
- package/dist/providers/subscription-cli.d.ts +66 -0
- package/dist/providers/subscription-cli.d.ts.map +1 -0
- package/dist/providers/subscription-cli.js +314 -0
- package/dist/providers/subscription-cli.js.map +1 -0
- package/dist/settings/provider-settings.d.ts +13 -1
- package/dist/settings/provider-settings.d.ts.map +1 -1
- package/dist/settings/provider-settings.js +34 -6
- package/dist/settings/provider-settings.js.map +1 -1
- package/package.json +12 -12
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duckcodeailabs/dql-cli",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.30",
|
|
4
4
|
"description": "Public CLI for parsing, formatting, testing, and certifying DQL blocks",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -25,15 +25,15 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@anthropic-ai/sdk": "^0.104.2",
|
|
28
|
-
"@duckcodeailabs/dql-agent": "^1.6.
|
|
29
|
-
"@duckcodeailabs/dql-compiler": "^1.6.
|
|
30
|
-
"@duckcodeailabs/dql-connectors": "^1.6.
|
|
31
|
-
"@duckcodeailabs/dql-core": "^1.6.
|
|
32
|
-
"@duckcodeailabs/dql-governance": "^1.6.
|
|
33
|
-
"@duckcodeailabs/dql-mcp": "^1.6.
|
|
34
|
-
"@duckcodeailabs/dql-notebook": "^1.6.
|
|
35
|
-
"@duckcodeailabs/dql-project": "^1.6.
|
|
36
|
-
"@duckcodeailabs/dql-slack": "^1.6.
|
|
28
|
+
"@duckcodeailabs/dql-agent": "^1.6.30",
|
|
29
|
+
"@duckcodeailabs/dql-compiler": "^1.6.30",
|
|
30
|
+
"@duckcodeailabs/dql-connectors": "^1.6.30",
|
|
31
|
+
"@duckcodeailabs/dql-core": "^1.6.30",
|
|
32
|
+
"@duckcodeailabs/dql-governance": "^1.6.30",
|
|
33
|
+
"@duckcodeailabs/dql-mcp": "^1.6.30",
|
|
34
|
+
"@duckcodeailabs/dql-notebook": "^1.6.30",
|
|
35
|
+
"@duckcodeailabs/dql-project": "^1.6.30",
|
|
36
|
+
"@duckcodeailabs/dql-slack": "^1.6.30",
|
|
37
37
|
"isomorphic-git": "^1.27.0",
|
|
38
38
|
"js-yaml": "^4.1.0",
|
|
39
39
|
"node-cron": "^3.0.3",
|
|
@@ -41,6 +41,6 @@
|
|
|
41
41
|
"openai": "^6.44.0"
|
|
42
42
|
},
|
|
43
43
|
"engines": {
|
|
44
|
-
"node": ">=20
|
|
44
|
+
"node": ">=20"
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription-backed providers — use an installed agentic coding CLI (Claude Code,
|
|
3
|
+
* Codex) as a plain text-completion backend, authenticated by the user's *login*
|
|
4
|
+
* rather than an API key.
|
|
5
|
+
*
|
|
6
|
+
* The value: a user with a Claude Pro/Max or ChatGPT Plus/Pro subscription can power
|
|
7
|
+
* DQL's AI without pasting an API key. There is no "subscription API key" — the only
|
|
8
|
+
* sanctioned path is to shell out to the vendor's own client, which owns the OAuth
|
|
9
|
+
* login. We constrain each CLI to behave as a one-shot text generator (no tools, no
|
|
10
|
+
* file access, isolated cwd, neutral system prompt) so it slots into the existing
|
|
11
|
+
* {@link AgentProvider} interface and every downstream flow (routing, synthesis,
|
|
12
|
+
* conversation) works unchanged.
|
|
13
|
+
*
|
|
14
|
+
* Tradeoffs the caller should know: each call spawns a fresh CLI process (seconds of
|
|
15
|
+
* cold-start latency), and — for Claude — programmatic usage draws from the plan's
|
|
16
|
+
* Agent-SDK credit, then standard API rates, not the interactive chat pool.
|
|
17
|
+
*/
|
|
18
|
+
import type { AgentMessage, AgentProvider, ProviderName, ProviderRunOptions } from '@duckcodeailabs/dql-agent';
|
|
19
|
+
/** Detection status surfaced to the UI so users know whether a CLI is usable. */
|
|
20
|
+
export interface CliAuthStatus {
|
|
21
|
+
installed: boolean;
|
|
22
|
+
loggedIn: boolean;
|
|
23
|
+
authMethod?: string;
|
|
24
|
+
subscriptionType?: string;
|
|
25
|
+
email?: string;
|
|
26
|
+
detail?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class ClaudeCodeCliProvider implements AgentProvider {
|
|
29
|
+
readonly name: ProviderName;
|
|
30
|
+
private readonly command;
|
|
31
|
+
private readonly defaultModel?;
|
|
32
|
+
constructor(opts?: {
|
|
33
|
+
command?: string;
|
|
34
|
+
model?: string;
|
|
35
|
+
});
|
|
36
|
+
/** Installed AND logged in (checked via `claude auth status --json`). */
|
|
37
|
+
available(): Promise<boolean>;
|
|
38
|
+
/** Rich detection for the settings UI. */
|
|
39
|
+
static detect(command?: string): Promise<CliAuthStatus>;
|
|
40
|
+
generate(messages: AgentMessage[], options?: ProviderRunOptions): Promise<string>;
|
|
41
|
+
}
|
|
42
|
+
/** Parse `claude -p --output-format json` stdout (a single result object). */
|
|
43
|
+
export declare function parseClaudeResult(stdout: string): {
|
|
44
|
+
text: string;
|
|
45
|
+
isError: boolean;
|
|
46
|
+
} | undefined;
|
|
47
|
+
export declare class CodexCliProvider implements AgentProvider {
|
|
48
|
+
readonly name: ProviderName;
|
|
49
|
+
private readonly command;
|
|
50
|
+
private readonly defaultModel?;
|
|
51
|
+
constructor(opts?: {
|
|
52
|
+
command?: string;
|
|
53
|
+
model?: string;
|
|
54
|
+
});
|
|
55
|
+
available(): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Detection: binary present + a stored auth file. Codex has no documented
|
|
58
|
+
* non-interactive `login status` command, so we check `~/.codex/auth.json`
|
|
59
|
+
* (written by `codex login` for both ChatGPT-account and API-key auth).
|
|
60
|
+
*/
|
|
61
|
+
static detect(command?: string): Promise<CliAuthStatus>;
|
|
62
|
+
generate(messages: AgentMessage[], options?: ProviderRunOptions): Promise<string>;
|
|
63
|
+
}
|
|
64
|
+
/** Parse `codex exec --json` JSONL for the final `agent_message` text. */
|
|
65
|
+
export declare function parseCodexFinalMessage(stdout: string): string | undefined;
|
|
66
|
+
//# sourceMappingURL=subscription-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription-cli.d.ts","sourceRoot":"","sources":["../../src/providers/subscription-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAsE/G,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAoBD,qBAAa,qBAAsB,YAAW,aAAa;IACzD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;gBAE3B,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;IAK3D,yEAAyE;IACnE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAKnC,0CAA0C;WAC7B,MAAM,CAAC,OAAO,SAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAqBzD,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;CA2C5F;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAoBhG;AAMD,qBAAa,gBAAiB,YAAW,aAAa;IACpD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;gBAE3B,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;IAKrD,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAKnC;;;;OAIG;WACU,MAAM,CAAC,OAAO,SAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAaxD,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;CA2C5F;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBzE"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription-backed providers — use an installed agentic coding CLI (Claude Code,
|
|
3
|
+
* Codex) as a plain text-completion backend, authenticated by the user's *login*
|
|
4
|
+
* rather than an API key.
|
|
5
|
+
*
|
|
6
|
+
* The value: a user with a Claude Pro/Max or ChatGPT Plus/Pro subscription can power
|
|
7
|
+
* DQL's AI without pasting an API key. There is no "subscription API key" — the only
|
|
8
|
+
* sanctioned path is to shell out to the vendor's own client, which owns the OAuth
|
|
9
|
+
* login. We constrain each CLI to behave as a one-shot text generator (no tools, no
|
|
10
|
+
* file access, isolated cwd, neutral system prompt) so it slots into the existing
|
|
11
|
+
* {@link AgentProvider} interface and every downstream flow (routing, synthesis,
|
|
12
|
+
* conversation) works unchanged.
|
|
13
|
+
*
|
|
14
|
+
* Tradeoffs the caller should know: each call spawns a fresh CLI process (seconds of
|
|
15
|
+
* cold-start latency), and — for Claude — programmatic usage draws from the plan's
|
|
16
|
+
* Agent-SDK credit, then standard API rates, not the interactive chat pool.
|
|
17
|
+
*/
|
|
18
|
+
import { spawn } from 'node:child_process';
|
|
19
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
20
|
+
import { homedir, tmpdir } from 'node:os';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
/** Spawn a process, optionally feed stdin, and collect stdout/stderr. Never throws. */
|
|
23
|
+
function runProcess(command, args, options = {}) {
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
let settled = false;
|
|
26
|
+
const finish = (result) => { if (!settled) {
|
|
27
|
+
settled = true;
|
|
28
|
+
resolve(result);
|
|
29
|
+
} };
|
|
30
|
+
let child;
|
|
31
|
+
try {
|
|
32
|
+
child = spawn(command, args, {
|
|
33
|
+
cwd: options.cwd,
|
|
34
|
+
env: options.env ?? process.env,
|
|
35
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
finish({ code: null, stdout: '', stderr: '', spawnError: error instanceof Error ? error : new Error(String(error)) });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const stdout = [];
|
|
43
|
+
const stderr = [];
|
|
44
|
+
const timer = options.timeoutMs
|
|
45
|
+
? setTimeout(() => { try {
|
|
46
|
+
child.kill('SIGTERM');
|
|
47
|
+
}
|
|
48
|
+
catch { /* noop */ } }, options.timeoutMs)
|
|
49
|
+
: undefined;
|
|
50
|
+
const onAbort = () => { try {
|
|
51
|
+
child.kill('SIGTERM');
|
|
52
|
+
}
|
|
53
|
+
catch { /* noop */ } };
|
|
54
|
+
options.signal?.addEventListener('abort', onAbort);
|
|
55
|
+
child.stdout.on('data', (chunk) => stdout.push(chunk.toString()));
|
|
56
|
+
child.stderr.on('data', (chunk) => stderr.push(chunk.toString()));
|
|
57
|
+
child.on('error', (error) => {
|
|
58
|
+
if (timer)
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
61
|
+
finish({ code: null, stdout: stdout.join(''), stderr: stderr.join(''), spawnError: error });
|
|
62
|
+
});
|
|
63
|
+
child.on('close', (code) => {
|
|
64
|
+
if (timer)
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
67
|
+
finish({ code, stdout: stdout.join(''), stderr: stderr.join('') });
|
|
68
|
+
});
|
|
69
|
+
if (options.input !== undefined) {
|
|
70
|
+
child.stdin.end(options.input);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
child.stdin.end();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Split messages into a single system string and a flattened conversation prompt. */
|
|
78
|
+
function flattenMessages(messages) {
|
|
79
|
+
const system = messages.filter((m) => m.role === 'system').map((m) => m.content).join('\n\n');
|
|
80
|
+
const convo = messages.filter((m) => m.role !== 'system');
|
|
81
|
+
const prompt = convo.length <= 1
|
|
82
|
+
? (convo[0]?.content ?? '')
|
|
83
|
+
: convo.map((m) => `${m.role === 'user' ? 'User' : 'Assistant'}: ${m.content}`).join('\n\n');
|
|
84
|
+
return { system, prompt };
|
|
85
|
+
}
|
|
86
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
// Claude Code (Claude Pro / Max / Team / Enterprise subscription)
|
|
88
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Force OAuth-subscription auth: Claude Code's credential precedence puts an API key
|
|
91
|
+
* / gateway token / cloud-provider flags ABOVE the logged-in subscription. Scrubbing
|
|
92
|
+
* them from the child env makes "use my Claude subscription" deterministic.
|
|
93
|
+
*/
|
|
94
|
+
function claudeSubscriptionEnv() {
|
|
95
|
+
const env = { ...process.env };
|
|
96
|
+
delete env.ANTHROPIC_API_KEY;
|
|
97
|
+
delete env.ANTHROPIC_AUTH_TOKEN;
|
|
98
|
+
delete env.CLAUDE_CODE_USE_BEDROCK;
|
|
99
|
+
delete env.CLAUDE_CODE_USE_VERTEX;
|
|
100
|
+
return env;
|
|
101
|
+
}
|
|
102
|
+
export class ClaudeCodeCliProvider {
|
|
103
|
+
name = 'claude';
|
|
104
|
+
command;
|
|
105
|
+
defaultModel;
|
|
106
|
+
constructor(opts = {}) {
|
|
107
|
+
this.command = opts.command ?? 'claude';
|
|
108
|
+
this.defaultModel = opts.model;
|
|
109
|
+
}
|
|
110
|
+
/** Installed AND logged in (checked via `claude auth status --json`). */
|
|
111
|
+
async available() {
|
|
112
|
+
const status = await ClaudeCodeCliProvider.detect(this.command);
|
|
113
|
+
return status.installed && status.loggedIn;
|
|
114
|
+
}
|
|
115
|
+
/** Rich detection for the settings UI. */
|
|
116
|
+
static async detect(command = 'claude') {
|
|
117
|
+
const res = await runProcess(command, ['auth', 'status', '--json'], { timeoutMs: 8000 });
|
|
118
|
+
if (res.spawnError)
|
|
119
|
+
return { installed: false, loggedIn: false, detail: 'Claude Code CLI not found on PATH.' };
|
|
120
|
+
try {
|
|
121
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
122
|
+
return {
|
|
123
|
+
installed: true,
|
|
124
|
+
loggedIn: parsed.loggedIn === true,
|
|
125
|
+
authMethod: parsed.authMethod,
|
|
126
|
+
subscriptionType: parsed.subscriptionType,
|
|
127
|
+
email: parsed.email,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Binary present but `auth status --json` shape unknown — treat as installed,
|
|
132
|
+
// login unverified (generate() will surface a clear error if not logged in).
|
|
133
|
+
return { installed: res.code === 0, loggedIn: res.code === 0, detail: res.stderr.trim() || undefined };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async generate(messages, options = {}) {
|
|
137
|
+
const { system, prompt } = flattenMessages(messages);
|
|
138
|
+
const model = options.model ?? this.defaultModel;
|
|
139
|
+
const args = [
|
|
140
|
+
'-p',
|
|
141
|
+
'--output-format', 'json',
|
|
142
|
+
'--tools', '', // pure text generation, no tool/file access
|
|
143
|
+
'--max-turns', '1',
|
|
144
|
+
'--permission-mode', 'dontAsk',
|
|
145
|
+
'--strict-mcp-config', // ignore any ambient MCP config
|
|
146
|
+
'--no-session-persistence',
|
|
147
|
+
...(model ? ['--model', model] : []),
|
|
148
|
+
...(system ? ['--system-prompt', system] : []),
|
|
149
|
+
];
|
|
150
|
+
// Isolated cwd so no project CLAUDE.md / .claude settings leak into the completion.
|
|
151
|
+
const cwd = mkdtempSync(join(tmpdir(), 'dql-claude-'));
|
|
152
|
+
try {
|
|
153
|
+
const res = await runProcess(this.command, args, {
|
|
154
|
+
input: prompt,
|
|
155
|
+
cwd,
|
|
156
|
+
env: claudeSubscriptionEnv(),
|
|
157
|
+
timeoutMs: options.signal ? undefined : 120000,
|
|
158
|
+
signal: options.signal,
|
|
159
|
+
});
|
|
160
|
+
if (res.spawnError) {
|
|
161
|
+
throw new Error(`Claude Code CLI not found. Install it (https://claude.com/claude-code) and run \`claude /login\`, or switch to an API-key provider. (${res.spawnError.message})`);
|
|
162
|
+
}
|
|
163
|
+
const parsed = parseClaudeResult(res.stdout);
|
|
164
|
+
if (parsed === undefined) {
|
|
165
|
+
throw new Error(`claude did not return a parseable result${res.stderr ? `: ${res.stderr.trim()}` : '.'}`);
|
|
166
|
+
}
|
|
167
|
+
if (parsed.isError) {
|
|
168
|
+
const message = parsed.text || res.stderr.trim() || 'unknown error';
|
|
169
|
+
if (/not logged in|\/login|unauthor/i.test(message)) {
|
|
170
|
+
throw new Error('Claude Code is not logged in. Run `claude /login` with your Claude subscription, then retry.');
|
|
171
|
+
}
|
|
172
|
+
throw new Error(`claude returned an error: ${message}`);
|
|
173
|
+
}
|
|
174
|
+
return parsed.text;
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
try {
|
|
178
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
179
|
+
}
|
|
180
|
+
catch { /* noop */ }
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Parse `claude -p --output-format json` stdout (a single result object). */
|
|
185
|
+
export function parseClaudeResult(stdout) {
|
|
186
|
+
const trimmed = stdout.trim();
|
|
187
|
+
if (!trimmed)
|
|
188
|
+
return undefined;
|
|
189
|
+
const tryParse = (raw) => {
|
|
190
|
+
try {
|
|
191
|
+
const obj = JSON.parse(raw);
|
|
192
|
+
return { text: typeof obj.result === 'string' ? obj.result : '', isError: obj.is_error === true };
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
const whole = tryParse(trimmed);
|
|
199
|
+
if (whole)
|
|
200
|
+
return whole;
|
|
201
|
+
// Fallback: last non-empty line that parses as the result object.
|
|
202
|
+
const lines = trimmed.split(/\r?\n/).filter(Boolean);
|
|
203
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
204
|
+
const parsed = tryParse(lines[i]);
|
|
205
|
+
if (parsed)
|
|
206
|
+
return parsed;
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
211
|
+
// Codex (ChatGPT Plus / Pro / Team subscription)
|
|
212
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
213
|
+
export class CodexCliProvider {
|
|
214
|
+
name = 'openai';
|
|
215
|
+
command;
|
|
216
|
+
defaultModel;
|
|
217
|
+
constructor(opts = {}) {
|
|
218
|
+
this.command = opts.command ?? 'codex';
|
|
219
|
+
this.defaultModel = opts.model;
|
|
220
|
+
}
|
|
221
|
+
async available() {
|
|
222
|
+
const status = await CodexCliProvider.detect(this.command);
|
|
223
|
+
return status.installed && status.loggedIn;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Detection: binary present + a stored auth file. Codex has no documented
|
|
227
|
+
* non-interactive `login status` command, so we check `~/.codex/auth.json`
|
|
228
|
+
* (written by `codex login` for both ChatGPT-account and API-key auth).
|
|
229
|
+
*/
|
|
230
|
+
static async detect(command = 'codex') {
|
|
231
|
+
const version = await runProcess(command, ['--version'], { timeoutMs: 8000 });
|
|
232
|
+
if (version.spawnError)
|
|
233
|
+
return { installed: false, loggedIn: false, detail: 'Codex CLI not found on PATH.' };
|
|
234
|
+
const authPath = join(homedir(), '.codex', 'auth.json');
|
|
235
|
+
const loggedIn = existsSync(authPath);
|
|
236
|
+
return {
|
|
237
|
+
installed: true,
|
|
238
|
+
loggedIn,
|
|
239
|
+
authMethod: loggedIn ? 'chatgpt' : undefined,
|
|
240
|
+
detail: loggedIn ? undefined : 'Run `codex login` to sign in with your ChatGPT plan.',
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
async generate(messages, options = {}) {
|
|
244
|
+
const { system, prompt } = flattenMessages(messages);
|
|
245
|
+
const model = options.model ?? this.defaultModel;
|
|
246
|
+
// Codex exec has no --system-prompt; prepend the system text as a labeled preamble.
|
|
247
|
+
const fullPrompt = system ? `${system}\n\n---\n\n${prompt}` : prompt;
|
|
248
|
+
const cwd = mkdtempSync(join(tmpdir(), 'dql-codex-'));
|
|
249
|
+
const outFile = join(cwd, 'last-message.txt');
|
|
250
|
+
const args = [
|
|
251
|
+
'exec',
|
|
252
|
+
'-', // read the prompt from stdin
|
|
253
|
+
'--sandbox', 'read-only', // no writes / no side effects
|
|
254
|
+
'--skip-git-repo-check',
|
|
255
|
+
'--cd', cwd,
|
|
256
|
+
'--ephemeral', // do not persist a session
|
|
257
|
+
'--output-last-message', outFile, // write just the final assistant text
|
|
258
|
+
...(model ? ['--model', model] : []),
|
|
259
|
+
];
|
|
260
|
+
try {
|
|
261
|
+
const res = await runProcess(this.command, args, {
|
|
262
|
+
input: fullPrompt,
|
|
263
|
+
cwd,
|
|
264
|
+
timeoutMs: options.signal ? undefined : 120000,
|
|
265
|
+
signal: options.signal,
|
|
266
|
+
});
|
|
267
|
+
if (res.spawnError) {
|
|
268
|
+
throw new Error(`Codex CLI not found. Install it and run \`codex login\` with your ChatGPT plan, or switch to an API-key provider. (${res.spawnError.message})`);
|
|
269
|
+
}
|
|
270
|
+
if (existsSync(outFile)) {
|
|
271
|
+
const text = readFileSync(outFile, 'utf-8').trim();
|
|
272
|
+
if (text)
|
|
273
|
+
return text;
|
|
274
|
+
}
|
|
275
|
+
// Fallback: parse the JSONL event stream for the final agent_message.
|
|
276
|
+
const fromStream = parseCodexFinalMessage(res.stdout);
|
|
277
|
+
if (fromStream)
|
|
278
|
+
return fromStream;
|
|
279
|
+
const message = res.stderr.trim() || 'no output';
|
|
280
|
+
if (/not (logged|signed) in|login|unauthor|401/i.test(message)) {
|
|
281
|
+
throw new Error('Codex is not logged in. Run `codex login` with your ChatGPT plan, then retry.');
|
|
282
|
+
}
|
|
283
|
+
throw new Error(`codex exec produced no message: ${message}`);
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
try {
|
|
287
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
288
|
+
}
|
|
289
|
+
catch { /* noop */ }
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/** Parse `codex exec --json` JSONL for the final `agent_message` text. */
|
|
294
|
+
export function parseCodexFinalMessage(stdout) {
|
|
295
|
+
const lines = stdout.trim().split(/\r?\n/).filter(Boolean);
|
|
296
|
+
let last;
|
|
297
|
+
for (const line of lines) {
|
|
298
|
+
try {
|
|
299
|
+
const event = JSON.parse(line);
|
|
300
|
+
const item = event.item;
|
|
301
|
+
if (event.type === 'item.completed' && item?.type === 'agent_message' && typeof item.text === 'string') {
|
|
302
|
+
last = item.text;
|
|
303
|
+
}
|
|
304
|
+
else if (item?.type === 'agent_message' && typeof item.text === 'string') {
|
|
305
|
+
last = item.text;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
// ignore non-JSON lines
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return last?.trim() || undefined;
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=subscription-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription-cli.js","sourceRoot":"","sources":["../../src/providers/subscription-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
export type ProviderSettingsId = 'anthropic' | 'openai' | 'gemini' | 'ollama' | 'custom-openai';
|
|
1
|
+
export type ProviderSettingsId = 'anthropic' | 'openai' | 'gemini' | 'ollama' | 'custom-openai' | 'claude-code' | 'codex';
|
|
2
|
+
/**
|
|
3
|
+
* How a provider authenticates:
|
|
4
|
+
* - `api_key`: paste an API key (or set the env var).
|
|
5
|
+
* - `local`: a local daemon, no credential (Ollama).
|
|
6
|
+
* - `subscription_cli`: authenticated by an installed coding CLI's own login
|
|
7
|
+
* (Claude Code / Codex) — no API key; usability is "installed + logged in".
|
|
8
|
+
*/
|
|
9
|
+
export type ProviderAuthMode = 'api_key' | 'local' | 'subscription_cli';
|
|
2
10
|
export interface ProviderSettingsInput {
|
|
3
11
|
id: ProviderSettingsId;
|
|
4
12
|
enabled?: boolean;
|
|
@@ -20,6 +28,10 @@ export interface RedactedProviderSettings {
|
|
|
20
28
|
model?: string;
|
|
21
29
|
source: 'local' | 'env' | 'none';
|
|
22
30
|
envVars: string[];
|
|
31
|
+
/** How this provider authenticates (drives the settings UI). */
|
|
32
|
+
authMode: ProviderAuthMode;
|
|
33
|
+
/** For subscription_cli providers: the CLI binary the user must install + log into. */
|
|
34
|
+
command?: string;
|
|
23
35
|
}
|
|
24
36
|
export interface EffectiveProviderConfig {
|
|
25
37
|
apiKey?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-settings.d.ts","sourceRoot":"","sources":["../../src/settings/provider-settings.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-settings.d.ts","sourceRoot":"","sources":["../../src/settings/provider-settings.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,GAAG,OAAO,CAAC;AAE1H;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,kBAAkB,CAAC;AAExE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,kBAAkB,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,kBAAkB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gEAAgE;IAChE,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAiBD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,EAAE,CA2CpF;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,kBAAkB,GAAG,uBAAuB,CAS/G;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAErF;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,wBAAwB,EAAE,CAoBlH"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, join } from 'node:path';
|
|
3
3
|
const PROVIDER_META = {
|
|
4
|
-
anthropic: { label: 'Anthropic Claude', keyEnv: 'ANTHROPIC_API_KEY', modelEnv: 'ANTHROPIC_MODEL', baseUrlEnv: 'ANTHROPIC_BASE_URL' },
|
|
5
|
-
openai: { label: 'OpenAI', keyEnv: 'OPENAI_API_KEY', modelEnv: 'OPENAI_MODEL', baseUrlEnv: 'OPENAI_BASE_URL' },
|
|
6
|
-
gemini: { label: 'Google Gemini', keyEnv: 'GEMINI_API_KEY', modelEnv: 'GEMINI_MODEL', baseUrlEnv: 'GEMINI_BASE_URL' },
|
|
7
|
-
ollama: { label: 'Ollama', modelEnv: 'OLLAMA_MODEL', baseUrlEnv: 'OLLAMA_BASE_URL' },
|
|
8
|
-
'custom-openai': { label: 'Custom OpenAI-compatible', keyEnv: 'DQL_OPENAI_COMPAT_API_KEY', modelEnv: 'DQL_OPENAI_COMPAT_MODEL', baseUrlEnv: 'DQL_OPENAI_COMPAT_BASE_URL' },
|
|
4
|
+
anthropic: { label: 'Anthropic Claude', authMode: 'api_key', keyEnv: 'ANTHROPIC_API_KEY', modelEnv: 'ANTHROPIC_MODEL', baseUrlEnv: 'ANTHROPIC_BASE_URL' },
|
|
5
|
+
openai: { label: 'OpenAI', authMode: 'api_key', keyEnv: 'OPENAI_API_KEY', modelEnv: 'OPENAI_MODEL', baseUrlEnv: 'OPENAI_BASE_URL' },
|
|
6
|
+
gemini: { label: 'Google Gemini', authMode: 'api_key', keyEnv: 'GEMINI_API_KEY', modelEnv: 'GEMINI_MODEL', baseUrlEnv: 'GEMINI_BASE_URL' },
|
|
7
|
+
ollama: { label: 'Ollama', authMode: 'local', modelEnv: 'OLLAMA_MODEL', baseUrlEnv: 'OLLAMA_BASE_URL' },
|
|
8
|
+
'custom-openai': { label: 'Custom OpenAI-compatible', authMode: 'api_key', keyEnv: 'DQL_OPENAI_COMPAT_API_KEY', modelEnv: 'DQL_OPENAI_COMPAT_MODEL', baseUrlEnv: 'DQL_OPENAI_COMPAT_BASE_URL' },
|
|
9
|
+
'claude-code': { label: 'Claude subscription (Claude Code CLI)', authMode: 'subscription_cli', command: 'claude', modelEnv: 'CLAUDE_CODE_MODEL' },
|
|
10
|
+
codex: { label: 'ChatGPT subscription (Codex CLI)', authMode: 'subscription_cli', command: 'codex', modelEnv: 'CODEX_MODEL' },
|
|
9
11
|
};
|
|
10
12
|
export function providerSettingsPath(projectRoot) {
|
|
11
13
|
return join(projectRoot, '.dql', 'provider-settings.json');
|
|
@@ -20,6 +22,24 @@ export function listProviderSettings(projectRoot) {
|
|
|
20
22
|
const hasLocalKey = Boolean(local?.apiKey?.trim());
|
|
21
23
|
const hasEnvKey = Boolean(envKey?.trim());
|
|
22
24
|
const hasNoAuthEndpoint = id === 'custom-openai' && Boolean(local?.baseUrl?.trim());
|
|
25
|
+
// Subscription CLI providers carry no API key — their usability is "installed +
|
|
26
|
+
// logged in", checked at runtime. In settings they're simply on/off (default off).
|
|
27
|
+
if (meta.authMode === 'subscription_cli') {
|
|
28
|
+
const enabled = local?.enabled ?? false;
|
|
29
|
+
return {
|
|
30
|
+
id,
|
|
31
|
+
label: meta.label,
|
|
32
|
+
enabled,
|
|
33
|
+
active: state.activeProvider === id,
|
|
34
|
+
hasApiKey: false,
|
|
35
|
+
baseUrl: undefined,
|
|
36
|
+
model: local?.model || (meta.modelEnv ? process.env[meta.modelEnv] : undefined),
|
|
37
|
+
source: enabled ? 'local' : 'none',
|
|
38
|
+
envVars: [meta.modelEnv].filter(Boolean),
|
|
39
|
+
authMode: meta.authMode,
|
|
40
|
+
command: meta.command,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
23
43
|
return {
|
|
24
44
|
id,
|
|
25
45
|
label: meta.label,
|
|
@@ -31,6 +51,8 @@ export function listProviderSettings(projectRoot) {
|
|
|
31
51
|
model: local?.model || (meta.modelEnv ? process.env[meta.modelEnv] : undefined),
|
|
32
52
|
source: hasLocalKey || local?.baseUrl || local?.model ? 'local' : hasEnvKey || envHas(meta) ? 'env' : 'none',
|
|
33
53
|
envVars: [meta.keyEnv, meta.modelEnv, meta.baseUrlEnv].filter(Boolean),
|
|
54
|
+
authMode: meta.authMode,
|
|
55
|
+
command: meta.command,
|
|
34
56
|
};
|
|
35
57
|
});
|
|
36
58
|
}
|
|
@@ -106,6 +128,10 @@ function providerCanBeActive(id, stored) {
|
|
|
106
128
|
if (stored.enabled === true)
|
|
107
129
|
return true;
|
|
108
130
|
const meta = PROVIDER_META[id];
|
|
131
|
+
// Subscription CLI providers need no key/URL — an explicit `enabled: true` (handled
|
|
132
|
+
// above) is the only way to auto-activate them; reaching here means not enabled.
|
|
133
|
+
if (meta.authMode === 'subscription_cli')
|
|
134
|
+
return false;
|
|
109
135
|
const hasKey = Boolean(stored.apiKey?.trim() || (meta.keyEnv && process.env[meta.keyEnv]?.trim()));
|
|
110
136
|
const hasBaseUrl = Boolean(stored.baseUrl?.trim() || (meta.baseUrlEnv && process.env[meta.baseUrlEnv]?.trim()));
|
|
111
137
|
const hasModel = Boolean(stored.model?.trim() || (meta.modelEnv && process.env[meta.modelEnv]?.trim()));
|
|
@@ -120,7 +146,9 @@ function isProviderSettingsId(value) {
|
|
|
120
146
|
|| value === 'openai'
|
|
121
147
|
|| value === 'gemini'
|
|
122
148
|
|| value === 'ollama'
|
|
123
|
-
|| value === 'custom-openai'
|
|
149
|
+
|| value === 'custom-openai'
|
|
150
|
+
|| value === 'claude-code'
|
|
151
|
+
|| value === 'codex';
|
|
124
152
|
}
|
|
125
153
|
function previewSecret(secret) {
|
|
126
154
|
if (secret.length <= 8)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-settings.js","sourceRoot":"","sources":["../../src/settings/provider-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-settings.js","sourceRoot":"","sources":["../../src/settings/provider-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsD1C,MAAM,aAAa,GAAyJ;IAC1K,SAAS,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACzJ,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE;IACnI,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE;IAC1I,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE;IACvG,eAAe,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,2BAA2B,EAAE,QAAQ,EAAE,yBAAyB,EAAE,UAAU,EAAE,4BAA4B,EAAE;IAC/L,aAAa,EAAE,EAAE,KAAK,EAAE,uCAAuC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACjJ,KAAK,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE;CAC9H,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,KAAK,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAC/B,OAAQ,MAAM,CAAC,IAAI,CAAC,aAAa,CAA0B,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACrE,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,iBAAiB,GAAG,EAAE,KAAK,eAAe,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,gFAAgF;QAChF,mFAAmF;QACnF,IAAI,IAAI,CAAC,QAAQ,KAAK,kBAAkB,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YACxC,OAAO;gBACL,EAAE;gBACF,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO;gBACP,MAAM,EAAE,KAAK,CAAC,cAAc,KAAK,EAAE;gBACnC,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,SAAS;gBAClB,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/E,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBAClC,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa;gBACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,EAAE;YACF,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,WAAW,IAAI,SAAS,IAAI,iBAAiB,IAAI,EAAE,KAAK,QAAQ,CAAC;YAC7F,MAAM,EAAE,KAAK,CAAC,cAAc,KAAK,EAAE;YACnC,SAAS,EAAE,WAAW,IAAI,SAAS,IAAI,iBAAiB,IAAI,EAAE,KAAK,QAAQ;YAC3E,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,KAAM,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS;YACzG,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvF,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,MAAM,EAAE,WAAW,IAAI,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC5G,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa;YAClF,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAmB,EAAE,EAAsB;IACpF,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/B,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,uBAAuB,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,KAA4B;IACpF,MAAM,KAAK,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,IAAI,GAA2B;QACnC,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,IAAI;QACnD,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS;QACxF,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,SAAS;QAC5F,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS;QACpF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;QAChE,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;IACnC,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QACzE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC;IAClC,CAAC;IACD,wBAAwB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAmB;IAClD,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAGpD,CAAC;QACF,OAAO;YACL,cAAc,EAAE,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;YAC/F,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;SAClC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,WAAmB,EAAE,KAA0B;IAC/E,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC/C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;QACjC,OAAO,EAAE,CAAC;QACV,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAgD;IAC9D,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAsB,EAAE,MAA8B;IACjF,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/B,oFAAoF;IACpF,iFAAiF;IACjF,IAAI,IAAI,CAAC,QAAQ,KAAK,kBAAkB;QAAE,OAAO,KAAK,CAAC;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnG,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChH,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxG,IAAI,EAAE,KAAK,QAAQ;QAAE,OAAO,UAAU,IAAI,QAAQ,CAAC;IACnD,IAAI,EAAE,KAAK,eAAe;QAAE,OAAO,UAAU,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,KAAK,KAAK,WAAW;WACvB,KAAK,KAAK,QAAQ;WAClB,KAAK,KAAK,QAAQ;WAClB,KAAK,KAAK,QAAQ;WAClB,KAAK,KAAK,eAAe;WACzB,KAAK,KAAK,aAAa;WACvB,KAAK,KAAK,OAAO,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1C,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duckcodeailabs/dql-cli",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.30",
|
|
4
4
|
"description": "Public CLI for parsing, formatting, testing, and certifying DQL blocks",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -20,15 +20,15 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@anthropic-ai/sdk": "^0.104.2",
|
|
23
|
-
"@duckcodeailabs/dql-agent": "^1.6.
|
|
24
|
-
"@duckcodeailabs/dql-compiler": "^1.6.
|
|
25
|
-
"@duckcodeailabs/dql-connectors": "^1.6.
|
|
26
|
-
"@duckcodeailabs/dql-core": "^1.6.
|
|
27
|
-
"@duckcodeailabs/dql-governance": "^1.6.
|
|
28
|
-
"@duckcodeailabs/dql-mcp": "^1.6.
|
|
29
|
-
"@duckcodeailabs/dql-notebook": "^1.6.
|
|
30
|
-
"@duckcodeailabs/dql-project": "^1.6.
|
|
31
|
-
"@duckcodeailabs/dql-slack": "^1.6.
|
|
23
|
+
"@duckcodeailabs/dql-agent": "^1.6.30",
|
|
24
|
+
"@duckcodeailabs/dql-compiler": "^1.6.30",
|
|
25
|
+
"@duckcodeailabs/dql-connectors": "^1.6.30",
|
|
26
|
+
"@duckcodeailabs/dql-core": "^1.6.30",
|
|
27
|
+
"@duckcodeailabs/dql-governance": "^1.6.30",
|
|
28
|
+
"@duckcodeailabs/dql-mcp": "^1.6.30",
|
|
29
|
+
"@duckcodeailabs/dql-notebook": "^1.6.30",
|
|
30
|
+
"@duckcodeailabs/dql-project": "^1.6.30",
|
|
31
|
+
"@duckcodeailabs/dql-slack": "^1.6.30",
|
|
32
32
|
"isomorphic-git": "^1.27.0",
|
|
33
33
|
"js-yaml": "^4.1.0",
|
|
34
34
|
"node-cron": "^3.0.3",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"openai": "^6.44.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@duckcodeailabs/dql-notebook-app": "^1.6.
|
|
39
|
+
"@duckcodeailabs/dql-notebook-app": "^1.6.30",
|
|
40
40
|
"@types/js-yaml": "^4.0.9",
|
|
41
41
|
"@types/node-cron": "^3.0.11",
|
|
42
42
|
"@types/nodemailer": "^6.4.17",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"vitest": "^3.0.0"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
|
-
"node": ">=20
|
|
48
|
+
"node": ">=20"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "rm -rf dist tsconfig.tsbuildinfo && tsc -b && node ./scripts/copy-runtime-assets.mjs",
|