@duckcodeailabs/dql-cli 1.6.30 → 1.6.31

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 (34) hide show
  1. package/dist/assets/dql-notebook/assets/{index-QJKCrLXe.js → index-BpPs6_rz.js} +176 -176
  2. package/dist/assets/dql-notebook/index.html +1 -1
  3. package/dist/llm/providers/claude-agent-sdk.d.ts.map +1 -1
  4. package/dist/llm/providers/claude-agent-sdk.js +5 -3
  5. package/dist/llm/providers/claude-agent-sdk.js.map +1 -1
  6. package/dist/llm/providers/dql-agent-provider.d.ts.map +1 -1
  7. package/dist/llm/providers/dql-agent-provider.js +20 -6
  8. package/dist/llm/providers/dql-agent-provider.js.map +1 -1
  9. package/dist/llm/providers/native-sdk-provider.d.ts.map +1 -1
  10. package/dist/llm/providers/native-sdk-provider.js +7 -1
  11. package/dist/llm/providers/native-sdk-provider.js.map +1 -1
  12. package/dist/llm/types.d.ts +7 -1
  13. package/dist/llm/types.d.ts.map +1 -1
  14. package/dist/local-runtime.d.ts.map +1 -1
  15. package/dist/local-runtime.js +113 -4
  16. package/dist/local-runtime.js.map +1 -1
  17. package/dist/package.json +10 -10
  18. package/dist/providers/oauth/claude-oauth.d.ts +80 -0
  19. package/dist/providers/oauth/claude-oauth.d.ts.map +1 -0
  20. package/dist/providers/oauth/claude-oauth.js +352 -0
  21. package/dist/providers/oauth/claude-oauth.js.map +1 -0
  22. package/dist/providers/oauth/codex-oauth.d.ts +71 -0
  23. package/dist/providers/oauth/codex-oauth.d.ts.map +1 -0
  24. package/dist/providers/oauth/codex-oauth.js +410 -0
  25. package/dist/providers/oauth/codex-oauth.js.map +1 -0
  26. package/dist/providers/oauth/oauth-store.d.ts +31 -0
  27. package/dist/providers/oauth/oauth-store.d.ts.map +1 -0
  28. package/dist/providers/oauth/oauth-store.js +61 -0
  29. package/dist/providers/oauth/oauth-store.js.map +1 -0
  30. package/dist/settings/provider-settings.d.ts +17 -0
  31. package/dist/settings/provider-settings.d.ts.map +1 -1
  32. package/dist/settings/provider-settings.js +43 -9
  33. package/dist/settings/provider-settings.js.map +1 -1
  34. package/package.json +11 -11
@@ -0,0 +1,410 @@
1
+ import * as os from 'node:os';
2
+ import * as crypto from 'node:crypto';
3
+ import * as http from 'node:http';
4
+ import { URL } from 'node:url';
5
+ import { getCodexCredentials, setCodexCredentials, clearOAuthProvider, } from './oauth-store.js';
6
+ import { CodexCliProvider } from '../subscription-cli.js';
7
+ /**
8
+ * ChatGPT Plus/Pro subscription login via OpenAI OAuth 2.0 + PKCE, and a provider
9
+ * that drives the ChatGPT Codex backend with the resulting bearer token.
10
+ *
11
+ * Ported from the reference coding-extension flow. Tokens live in the `chmod 600`
12
+ * `.dql/oauth-credentials.json` file. Same ToS caveat as the Claude flow: this
13
+ * reuses the official Codex OAuth client id against a subscription; the provider
14
+ * falls back to the CLI-passthrough path when not connected.
15
+ */
16
+ export const CODEX_OAUTH_CONFIG = {
17
+ authorizationEndpoint: 'https://auth.openai.com/oauth/authorize',
18
+ tokenEndpoint: 'https://auth.openai.com/oauth/token',
19
+ clientId: 'app_EMoamEEZ73f0CkXaXp7hrann',
20
+ redirectUri: 'http://localhost:1455/auth/callback',
21
+ scopes: 'openid profile email offline_access',
22
+ callbackPort: 1455,
23
+ };
24
+ const CODEX_API_BASE_URL = 'https://chatgpt.com/backend-api/codex';
25
+ /** ChatGPT subscription models exposed after login (static list; default first). */
26
+ export const CODEX_OAUTH_MODELS = ['gpt-5.2-codex', 'gpt-5.1-codex', 'gpt-5-codex', 'gpt-5-codex-mini'];
27
+ export const CODEX_OAUTH_DEFAULT_MODEL = 'gpt-5.2-codex';
28
+ export function generateCodeVerifier() {
29
+ return crypto.randomBytes(32).toString('base64url');
30
+ }
31
+ export function generateCodeChallenge(verifier) {
32
+ return crypto.createHash('sha256').update(verifier).digest().toString('base64url');
33
+ }
34
+ export function generateState() {
35
+ return crypto.randomBytes(16).toString('hex');
36
+ }
37
+ export function buildAuthorizationUrl(codeChallenge, state) {
38
+ const params = new URLSearchParams({
39
+ client_id: CODEX_OAUTH_CONFIG.clientId,
40
+ redirect_uri: CODEX_OAUTH_CONFIG.redirectUri,
41
+ scope: CODEX_OAUTH_CONFIG.scopes,
42
+ code_challenge: codeChallenge,
43
+ code_challenge_method: 'S256',
44
+ response_type: 'code',
45
+ state,
46
+ codex_cli_simplified_flow: 'true',
47
+ originator: 'roo-code',
48
+ });
49
+ return `${CODEX_OAUTH_CONFIG.authorizationEndpoint}?${params.toString()}`;
50
+ }
51
+ function parseJwtClaims(token) {
52
+ const parts = token.split('.');
53
+ if (parts.length !== 3)
54
+ return undefined;
55
+ try {
56
+ return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ }
62
+ function extractAccountIdFromClaims(claims) {
63
+ return (claims.chatgpt_account_id ||
64
+ claims['https://api.openai.com/auth']?.chatgpt_account_id ||
65
+ claims.organizations?.[0]?.id);
66
+ }
67
+ export function extractAccountId(tokens) {
68
+ if (tokens.id_token) {
69
+ const claims = parseJwtClaims(tokens.id_token);
70
+ const accountId = claims && extractAccountIdFromClaims(claims);
71
+ if (accountId)
72
+ return accountId;
73
+ }
74
+ const claims = parseJwtClaims(tokens.access_token);
75
+ return claims ? extractAccountIdFromClaims(claims) : undefined;
76
+ }
77
+ function parseTokenResponse(data) {
78
+ const d = data;
79
+ if (!d || typeof d.access_token !== 'string' || typeof d.expires_in !== 'number') {
80
+ throw new Error('Codex OAuth: malformed token response');
81
+ }
82
+ return { access_token: d.access_token, refresh_token: d.refresh_token, id_token: d.id_token, expires_in: d.expires_in, email: d.email };
83
+ }
84
+ export async function exchangeCodeForTokens(code, codeVerifier) {
85
+ const body = new URLSearchParams({
86
+ grant_type: 'authorization_code',
87
+ client_id: CODEX_OAUTH_CONFIG.clientId,
88
+ code,
89
+ redirect_uri: CODEX_OAUTH_CONFIG.redirectUri,
90
+ code_verifier: codeVerifier,
91
+ });
92
+ const response = await fetch(CODEX_OAUTH_CONFIG.tokenEndpoint, {
93
+ method: 'POST',
94
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
95
+ body: body.toString(),
96
+ signal: AbortSignal.timeout(30000),
97
+ });
98
+ if (!response.ok) {
99
+ throw new Error(`Codex OAuth token exchange failed: ${response.status} ${await response.text().catch(() => response.statusText)}`);
100
+ }
101
+ const token = parseTokenResponse(await response.json());
102
+ if (!token.refresh_token)
103
+ throw new Error('Codex OAuth: token exchange did not return a refresh_token');
104
+ return {
105
+ type: 'openai-codex',
106
+ access_token: token.access_token,
107
+ refresh_token: token.refresh_token,
108
+ expires: Date.now() + token.expires_in * 1000,
109
+ email: token.email,
110
+ accountId: extractAccountId({ id_token: token.id_token, access_token: token.access_token }),
111
+ };
112
+ }
113
+ export async function refreshAccessToken(credentials) {
114
+ const body = new URLSearchParams({
115
+ grant_type: 'refresh_token',
116
+ client_id: CODEX_OAUTH_CONFIG.clientId,
117
+ refresh_token: credentials.refresh_token,
118
+ });
119
+ const response = await fetch(CODEX_OAUTH_CONFIG.tokenEndpoint, {
120
+ method: 'POST',
121
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
122
+ body: body.toString(),
123
+ signal: AbortSignal.timeout(30000),
124
+ });
125
+ if (!response.ok) {
126
+ throw new Error(`Codex OAuth token refresh failed: ${response.status} ${await response.text().catch(() => response.statusText)}`);
127
+ }
128
+ const token = parseTokenResponse(await response.json());
129
+ return {
130
+ type: 'openai-codex',
131
+ access_token: token.access_token,
132
+ refresh_token: token.refresh_token ?? credentials.refresh_token,
133
+ expires: Date.now() + token.expires_in * 1000,
134
+ email: token.email ?? credentials.email,
135
+ accountId: extractAccountId({ id_token: token.id_token, access_token: token.access_token }) ?? credentials.accountId,
136
+ };
137
+ }
138
+ export function isTokenExpired(credentials) {
139
+ const bufferMs = 5 * 60 * 1000;
140
+ return Date.now() >= credentials.expires - bufferMs;
141
+ }
142
+ export class CodexOAuthManager {
143
+ projectRoot;
144
+ pendingAuth = null;
145
+ refreshPromise = null;
146
+ constructor(projectRoot) {
147
+ this.projectRoot = projectRoot;
148
+ }
149
+ cancelAuthorizationFlow() {
150
+ const prior = this.pendingAuth;
151
+ this.pendingAuth = null;
152
+ if (!prior)
153
+ return;
154
+ // Settle the in-flight callback promise so its port + closure are released.
155
+ if (prior.reject)
156
+ prior.reject(new Error('Authorization flow superseded'));
157
+ if (prior.server) {
158
+ try {
159
+ prior.server.close();
160
+ }
161
+ catch { /* noop */ }
162
+ }
163
+ }
164
+ /** True while a login is in flight (callback server listening). */
165
+ isPending() {
166
+ return this.pendingAuth !== null;
167
+ }
168
+ startAuthorizationFlow() {
169
+ this.cancelAuthorizationFlow();
170
+ const codeVerifier = generateCodeVerifier();
171
+ const codeChallenge = generateCodeChallenge(codeVerifier);
172
+ const state = generateState();
173
+ this.pendingAuth = { codeVerifier, state };
174
+ return buildAuthorizationUrl(codeChallenge, state);
175
+ }
176
+ async waitForCallback() {
177
+ if (!this.pendingAuth)
178
+ throw new Error('No pending authorization flow');
179
+ const pending = this.pendingAuth;
180
+ const { codeVerifier, state } = pending;
181
+ return new Promise((resolve, reject) => {
182
+ pending.reject = reject;
183
+ const server = http.createServer(async (req, res) => {
184
+ try {
185
+ const url = new URL(req.url || '', `http://localhost:${CODEX_OAUTH_CONFIG.callbackPort}`);
186
+ if (url.pathname !== '/auth/callback') {
187
+ res.writeHead(404);
188
+ res.end('Not Found');
189
+ return;
190
+ }
191
+ const code = url.searchParams.get('code');
192
+ const receivedState = url.searchParams.get('state');
193
+ if (!code || !receivedState) {
194
+ res.writeHead(400);
195
+ res.end('Missing code or state');
196
+ return;
197
+ }
198
+ if (receivedState !== state) {
199
+ res.writeHead(400);
200
+ res.end('Invalid state');
201
+ return;
202
+ }
203
+ const credentials = await exchangeCodeForTokens(code, codeVerifier);
204
+ setCodexCredentials(this.projectRoot, credentials);
205
+ res.writeHead(200, { 'Content-Type': 'text/html' });
206
+ res.end('<html><body style="font-family:system-ui;padding:40px">Signed in to ChatGPT. You can close this tab and return to DQL.</body></html>');
207
+ server.close();
208
+ this.pendingAuth = null;
209
+ resolve(credentials);
210
+ }
211
+ catch (error) {
212
+ try {
213
+ res.writeHead(500);
214
+ res.end('Authentication failed');
215
+ }
216
+ catch { /* noop */ }
217
+ try {
218
+ server.close();
219
+ }
220
+ catch { /* noop */ }
221
+ this.pendingAuth = null;
222
+ reject(error);
223
+ }
224
+ });
225
+ pending.server = server;
226
+ const timeout = setTimeout(() => {
227
+ try {
228
+ server.close();
229
+ }
230
+ catch { /* noop */ }
231
+ if (this.pendingAuth === pending)
232
+ this.pendingAuth = null;
233
+ reject(new Error('Codex OAuth callback timed out'));
234
+ }, 5 * 60 * 1000);
235
+ server.on('close', () => clearTimeout(timeout));
236
+ server.on('error', (err) => {
237
+ clearTimeout(timeout);
238
+ if (this.pendingAuth === pending)
239
+ this.pendingAuth = null;
240
+ reject(err);
241
+ });
242
+ server.listen(CODEX_OAUTH_CONFIG.callbackPort);
243
+ });
244
+ }
245
+ async getAccessToken() {
246
+ let creds = getCodexCredentials(this.projectRoot);
247
+ if (!creds)
248
+ return null;
249
+ if (isTokenExpired(creds)) {
250
+ try {
251
+ if (!this.refreshPromise)
252
+ this.refreshPromise = refreshAccessToken(creds);
253
+ creds = await this.refreshPromise;
254
+ this.refreshPromise = null;
255
+ setCodexCredentials(this.projectRoot, creds);
256
+ }
257
+ catch {
258
+ this.refreshPromise = null;
259
+ return null;
260
+ }
261
+ }
262
+ return creds.access_token;
263
+ }
264
+ getAccountId() {
265
+ return getCodexCredentials(this.projectRoot)?.accountId ?? null;
266
+ }
267
+ getEmail() {
268
+ return getCodexCredentials(this.projectRoot)?.email ?? null;
269
+ }
270
+ async isAuthenticated() {
271
+ return (await this.getAccessToken()) !== null;
272
+ }
273
+ signOut() {
274
+ this.cancelAuthorizationFlow();
275
+ clearOAuthProvider(this.projectRoot, 'codex');
276
+ }
277
+ }
278
+ export function codexOAuthConnected(projectRoot) {
279
+ return getCodexCredentials(projectRoot) !== null;
280
+ }
281
+ /** Format DQL messages into the ChatGPT Codex Responses `input` shape. */
282
+ function formatInput(messages) {
283
+ const formatted = [];
284
+ for (const m of messages) {
285
+ if (m.role === 'user') {
286
+ formatted.push({ role: 'user', content: [{ type: 'input_text', text: m.content }] });
287
+ }
288
+ else if (m.role === 'assistant') {
289
+ if (m.content.trim())
290
+ formatted.push({ role: 'assistant', content: [{ type: 'output_text', text: m.content }] });
291
+ }
292
+ }
293
+ return formatted;
294
+ }
295
+ function parseSse(raw) {
296
+ let eventType;
297
+ let data = '';
298
+ for (const line of raw.split('\n').map((l) => l.trimEnd()).filter(Boolean)) {
299
+ if (line.startsWith('event:'))
300
+ eventType = line.slice(6).trim();
301
+ else if (line.startsWith('data:'))
302
+ data += line.slice(5).trim();
303
+ }
304
+ if (!data)
305
+ return null;
306
+ try {
307
+ const parsed = JSON.parse(data);
308
+ return eventType ? { ...parsed, type: eventType } : parsed;
309
+ }
310
+ catch {
311
+ return null;
312
+ }
313
+ }
314
+ /**
315
+ * AgentProvider that drives ChatGPT Codex via the subscription OAuth token.
316
+ * Streams the Responses SSE and accumulates visible text (reasoning deltas are
317
+ * dropped from the returned string). Requires a prior `Sign in with ChatGPT`.
318
+ */
319
+ export class CodexOAuthProvider {
320
+ name = 'openai';
321
+ manager;
322
+ projectRoot;
323
+ defaultModel;
324
+ cliModel;
325
+ sessionId;
326
+ cliFallback;
327
+ constructor(opts) {
328
+ this.manager = new CodexOAuthManager(opts.projectRoot);
329
+ this.projectRoot = opts.projectRoot;
330
+ this.defaultModel = opts.model || CODEX_OAUTH_DEFAULT_MODEL;
331
+ this.cliModel = opts.model;
332
+ this.sessionId = crypto.randomUUID();
333
+ }
334
+ async available() {
335
+ return this.manager.isAuthenticated();
336
+ }
337
+ async generate(messages, options = {}) {
338
+ const accessToken = await this.manager.getAccessToken();
339
+ if (!accessToken) {
340
+ // Credential present but unusable → CLI fallback; none at all → prompt sign-in.
341
+ if (codexOAuthConnected(this.projectRoot)) {
342
+ if (!this.cliFallback)
343
+ this.cliFallback = new CodexCliProvider({ model: this.cliModel });
344
+ if (await this.cliFallback.available()) {
345
+ return this.cliFallback.generate(messages, options);
346
+ }
347
+ }
348
+ throw new Error('Your ChatGPT subscription session expired. Open Settings → ChatGPT subscription and click "Sign in with ChatGPT" again.');
349
+ }
350
+ const accountId = this.manager.getAccountId();
351
+ const systemText = messages.filter((m) => m.role === 'system').map((m) => m.content).join('\n\n');
352
+ const body = {
353
+ model: options.model || this.defaultModel,
354
+ input: formatInput(messages.filter((m) => m.role !== 'system')),
355
+ stream: true,
356
+ store: false,
357
+ instructions: systemText || undefined,
358
+ };
359
+ if (options.reasoningEffort) {
360
+ body.reasoning = { effort: options.reasoningEffort, summary: 'auto' };
361
+ body.include = ['reasoning.encrypted_content'];
362
+ }
363
+ const res = await fetch(`${CODEX_API_BASE_URL}/responses`, {
364
+ method: 'POST',
365
+ headers: {
366
+ Authorization: `Bearer ${accessToken}`,
367
+ 'Content-Type': 'application/json',
368
+ originator: 'roo-code',
369
+ session_id: this.sessionId,
370
+ 'User-Agent': `dql/${os.platform()} node/${process.version.slice(1)}`,
371
+ ...(accountId ? { 'ChatGPT-Account-Id': accountId } : {}),
372
+ },
373
+ body: JSON.stringify(body),
374
+ signal: options.signal,
375
+ });
376
+ if (!res.ok || !res.body) {
377
+ throw new Error(`chatgpt (subscription): ${res.status} ${await res.text().catch(() => res.statusText)}`);
378
+ }
379
+ const reader = res.body.getReader();
380
+ const decoder = new TextDecoder();
381
+ let buffer = '';
382
+ let out = '';
383
+ const consume = (raw) => {
384
+ const evt = parseSse(raw);
385
+ if (!evt)
386
+ return;
387
+ const type = evt.type;
388
+ if ((type === 'response.output_text.delta' || type === 'response.text.delta') && typeof evt.delta === 'string') {
389
+ out += evt.delta;
390
+ }
391
+ };
392
+ for (;;) {
393
+ const { value, done } = await reader.read();
394
+ if (value)
395
+ buffer += decoder.decode(value, { stream: !done });
396
+ let idx;
397
+ while ((idx = buffer.indexOf('\n\n')) !== -1) {
398
+ consume(buffer.slice(0, idx));
399
+ buffer = buffer.slice(idx + 2);
400
+ }
401
+ if (done)
402
+ break;
403
+ }
404
+ // Flush a final event not terminated by a blank line.
405
+ if (buffer.trim())
406
+ consume(buffer);
407
+ return out;
408
+ }
409
+ }
410
+ //# sourceMappingURL=codex-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-oauth.js","sourceRoot":"","sources":["../../../src/providers/oauth/codex-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,qBAAqB,EAAE,yCAAyC;IAChE,aAAa,EAAE,qCAAqC;IACpD,QAAQ,EAAE,8BAA8B;IACxC,WAAW,EAAE,qCAAqC;IAClD,MAAM,EAAE,qCAAqC;IAC7C,YAAY,EAAE,IAAI;CACV,CAAC;AAEX,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAEnE,oFAAoF;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,CAAU,CAAC;AACjH,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAEzD,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAAqB,EAAE,KAAa;IACxE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,SAAS,EAAE,kBAAkB,CAAC,QAAQ;QACtC,YAAY,EAAE,kBAAkB,CAAC,WAAW;QAC5C,KAAK,EAAE,kBAAkB,CAAC,MAAM;QAChC,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,MAAM;QAC7B,aAAa,EAAE,MAAM;QACrB,KAAK;QACL,yBAAyB,EAAE,MAAM;QACjC,UAAU,EAAE,UAAU;KACvB,CAAC,CAAC;IACH,OAAO,GAAG,kBAAkB,CAAC,qBAAqB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC5E,CAAC;AASD,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAkB,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAqB;IACvD,OAAO,CACL,MAAM,CAAC,kBAAkB;QACzB,MAAM,CAAC,6BAA6B,CAAC,EAAE,kBAAkB;QACzD,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAmD;IAClF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;IAClC,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAUD,SAAS,kBAAkB,CAAC,IAAa;IACvC,MAAM,CAAC,GAAG,IAA0C,CAAC;IACrD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAC1I,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,YAAoB;IAC5E,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,UAAU,EAAE,oBAAoB;QAChC,SAAS,EAAE,kBAAkB,CAAC,QAAQ;QACtC,IAAI;QACJ,YAAY,EAAE,kBAAkB,CAAC,WAAW;QAC5C,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,aAAa,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;QACrB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrI,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IACxG,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI;QAC7C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,gBAAgB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;KAC5F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAkC;IACzE,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,UAAU,EAAE,eAAe;QAC3B,SAAS,EAAE,kBAAkB,CAAC,QAAQ;QACtC,aAAa,EAAE,WAAW,CAAC,aAAa;KACzC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,aAAa,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;QACrB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpI,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,WAAW,CAAC,aAAa;QAC/D,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI;QAC7C,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK;QACvC,SAAS,EAAE,gBAAgB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,WAAW,CAAC,SAAS;KACrH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAkC;IAC/D,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/B,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AACtD,CAAC;AAED,MAAM,OAAO,iBAAiB;IAIC;IAHrB,WAAW,GAAwG,IAAI,CAAC;IACxH,cAAc,GAA0C,IAAI,CAAC;IAErE,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD,uBAAuB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,4EAA4E;QAC5E,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC;gBAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,SAAS;QACP,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;IACnC,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC3C,OAAO,qBAAqB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAExC,OAAO,IAAI,OAAO,CAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5D,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;gBAClD,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,oBAAoB,kBAAkB,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC1F,IAAI,GAAG,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;wBACtC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;wBACrB,OAAO;oBACT,CAAC;oBACD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1C,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACpD,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBACnB,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;wBACjC,OAAO;oBACT,CAAC;oBACD,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;wBAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBACnB,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;wBACzB,OAAO;oBACT,CAAC;oBACD,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;oBACpE,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBACnD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,sIAAsI,CAAC,CAAC;oBAChJ,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,OAAO,CAAC,WAAW,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC;wBAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;oBAClF,IAAI,CAAC;wBAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;oBAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC;oBAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC5C,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;oBAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1D,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACtD,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAClB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;oBAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,cAAc;oBAAE,IAAI,CAAC,cAAc,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC1E,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;gBAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,YAAY,CAAC;IAC5B,CAAC;IAED,YAAY;QACV,OAAO,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC;IAClE,CAAC;IAED,QAAQ;QACN,OAAO,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,IAAI,CAAC;IAChD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,mBAAmB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AACnD,CAAC;AAED,0EAA0E;AAC1E,SAAS,WAAW,CAAC,QAAwB;IAC3C,MAAM,SAAS,GAAmC,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;gBAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,SAA6B,CAAC;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3E,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC3D,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QAC3D,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,QAAiB,CAAC;IACjB,OAAO,CAAoB;IAC3B,WAAW,CAAS;IACpB,YAAY,CAAS;IACrB,QAAQ,CAAU;IAClB,SAAS,CAAS;IAC3B,WAAW,CAAoB;IAEvC,YAAY,IAA6C;QACvD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,yBAAyB,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAwB,EAAE,UAA8B,EAAE;QACvE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,gFAAgF;YAChF,IAAI,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzF,IAAI,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;oBACvC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yHAAyH,CAAC,CAAC;QAC7I,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAElG,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;YACzC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC/D,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,UAAU,IAAI,SAAS;SACtC,CAAC;QACF,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YACtE,IAAI,CAAC,OAAO,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,kBAAkB,YAAY,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI,CAAC,SAAS;gBAC1B,YAAY,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACrE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,IAAI,GAAG,GAAG,CAAC,IAA0B,CAAC;YAC5C,IAAI,CAAC,IAAI,KAAK,4BAA4B,IAAI,IAAI,KAAK,qBAAqB,CAAC,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/G,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QACF,SAAS,CAAC;YACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,KAAK;gBAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,GAAW,CAAC;YAChB,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC9B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,IAAI;gBAAE,MAAM;QAClB,CAAC;QACD,sDAAsD;QACtD,IAAI,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Secure on-disk store for subscription OAuth credentials (Claude Pro/Max,
3
+ * ChatGPT Plus/Pro). Replaces the VSCode SecretStorage the reference flow used
4
+ * with a `chmod 600` JSON file under `.dql/`, mirroring how `provider-settings.json`
5
+ * already guards API keys. Tokens never leave the machine.
6
+ */
7
+ export interface ClaudeOAuthCredentials {
8
+ type: 'claude';
9
+ access_token: string;
10
+ refresh_token: string;
11
+ /** ISO-8601 expiry timestamp. */
12
+ expired: string;
13
+ email?: string;
14
+ }
15
+ export interface CodexOAuthCredentials {
16
+ type: 'openai-codex';
17
+ access_token: string;
18
+ refresh_token: string;
19
+ /** Expiry as a Unix epoch in milliseconds. */
20
+ expires: number;
21
+ email?: string;
22
+ accountId?: string;
23
+ }
24
+ export type OAuthProviderKey = 'claude' | 'codex';
25
+ export declare function oauthCredentialsPath(projectRoot: string): string;
26
+ export declare function getClaudeCredentials(projectRoot: string): ClaudeOAuthCredentials | null;
27
+ export declare function setClaudeCredentials(projectRoot: string, creds: ClaudeOAuthCredentials): void;
28
+ export declare function getCodexCredentials(projectRoot: string): CodexOAuthCredentials | null;
29
+ export declare function setCodexCredentials(projectRoot: string, creds: CodexOAuthCredentials): void;
30
+ export declare function clearOAuthProvider(projectRoot: string, key: OAuthProviderKey): void;
31
+ //# sourceMappingURL=oauth-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../../../src/providers/oauth/oauth-store.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAmCD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAGvF;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAI7F;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAGrF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAI3F;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAInF"}
@@ -0,0 +1,61 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ export function oauthCredentialsPath(projectRoot) {
4
+ return join(projectRoot, '.dql', 'oauth-credentials.json');
5
+ }
6
+ function readStore(projectRoot) {
7
+ const path = oauthCredentialsPath(projectRoot);
8
+ if (!existsSync(path))
9
+ return { version: 1 };
10
+ try {
11
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
12
+ return { version: 1, claude: parsed.claude, codex: parsed.codex };
13
+ }
14
+ catch {
15
+ return { version: 1 };
16
+ }
17
+ }
18
+ function writeStore(projectRoot, store) {
19
+ const path = oauthCredentialsPath(projectRoot);
20
+ mkdirSync(dirname(path), { recursive: true });
21
+ writeFileSync(path, JSON.stringify(store, null, 2) + '\n', 'utf-8');
22
+ try {
23
+ chmodSync(path, 0o600);
24
+ }
25
+ catch {
26
+ // Best effort on filesystems without chmod.
27
+ }
28
+ }
29
+ /** Basic shape validation — a corrupt/partial entry is treated as "not connected". */
30
+ function isClaudeCreds(v) {
31
+ const c = v;
32
+ return Boolean(c && c.type === 'claude' && typeof c.access_token === 'string' && typeof c.refresh_token === 'string' && typeof c.expired === 'string');
33
+ }
34
+ function isCodexCreds(v) {
35
+ const c = v;
36
+ return Boolean(c && c.type === 'openai-codex' && typeof c.access_token === 'string' && typeof c.refresh_token === 'string' && typeof c.expires === 'number');
37
+ }
38
+ export function getClaudeCredentials(projectRoot) {
39
+ const creds = readStore(projectRoot).claude;
40
+ return isClaudeCreds(creds) ? creds : null;
41
+ }
42
+ export function setClaudeCredentials(projectRoot, creds) {
43
+ const store = readStore(projectRoot);
44
+ store.claude = creds;
45
+ writeStore(projectRoot, store);
46
+ }
47
+ export function getCodexCredentials(projectRoot) {
48
+ const creds = readStore(projectRoot).codex;
49
+ return isCodexCreds(creds) ? creds : null;
50
+ }
51
+ export function setCodexCredentials(projectRoot, creds) {
52
+ const store = readStore(projectRoot);
53
+ store.codex = creds;
54
+ writeStore(projectRoot, store);
55
+ }
56
+ export function clearOAuthProvider(projectRoot, key) {
57
+ const store = readStore(projectRoot);
58
+ delete store[key];
59
+ writeStore(projectRoot, store);
60
+ }
61
+ //# sourceMappingURL=oauth-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-store.js","sourceRoot":"","sources":["../../../src/providers/oauth/oauth-store.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,11 @@
1
+ import { type ReasoningEffort } from '@duckcodeailabs/dql-agent';
1
2
  export type ProviderSettingsId = 'anthropic' | 'openai' | 'gemini' | 'ollama' | 'custom-openai' | 'claude-code' | 'codex';
3
+ /**
4
+ * Reasoning-effort ceiling for a provider. `'auto'` (the default when unset)
5
+ * lets the agent pick effort per task/route up to `high`; an explicit level caps
6
+ * it there. See `@duckcodeailabs/dql-agent`'s reasoning-effort helpers.
7
+ */
8
+ export type ReasoningEffortSetting = ReasoningEffort | 'auto';
2
9
  /**
3
10
  * How a provider authenticates:
4
11
  * - `api_key`: paste an API key (or set the env var).
@@ -13,9 +20,13 @@ export interface ProviderSettingsInput {
13
20
  apiKey?: string;
14
21
  baseUrl?: string;
15
22
  model?: string;
23
+ /** Reasoning-effort ceiling. `'auto'` clears it; omitted leaves it unchanged. */
24
+ reasoningEffort?: ReasoningEffortSetting;
16
25
  }
17
26
  export interface StoredProviderSettings extends ProviderSettingsInput {
18
27
  updatedAt: string;
28
+ /** Persisted ceiling — `'auto'` is normalized to `undefined` on write. */
29
+ reasoningEffort?: ReasoningEffort;
19
30
  }
20
31
  export interface RedactedProviderSettings {
21
32
  id: ProviderSettingsId;
@@ -32,12 +43,18 @@ export interface RedactedProviderSettings {
32
43
  authMode: ProviderAuthMode;
33
44
  /** For subscription_cli providers: the CLI binary the user must install + log into. */
34
45
  command?: string;
46
+ /** Reasoning-effort ceiling (`'auto'` when unset). Only meaningful for reasoning-capable providers. */
47
+ reasoningEffort: ReasoningEffortSetting;
48
+ /** Whether this provider has a reasoning surface at all (drives whether the UI shows the control). */
49
+ supportsReasoningEffort: boolean;
35
50
  }
36
51
  export interface EffectiveProviderConfig {
37
52
  apiKey?: string;
38
53
  baseUrl?: string;
39
54
  model?: string;
40
55
  enabled: boolean;
56
+ /** Resolved ceiling (local → env), `undefined` means auto (no cap). */
57
+ reasoningEffort?: ReasoningEffort;
41
58
  }
42
59
  export declare function providerSettingsPath(projectRoot: string): string;
43
60
  export declare function listProviderSettings(projectRoot: string): RedactedProviderSettings[];
@@ -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,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
+ {"version":3,"file":"provider-settings.d.ts","sourceRoot":"","sources":["../../src/settings/provider-settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,GAAG,OAAO,CAAC;AAE1H;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,MAAM,CAAC;AAE9D;;;;;;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;IACf,iFAAiF;IACjF,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC1C;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;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;IACjB,uGAAuG;IACvG,eAAe,EAAE,sBAAsB,CAAC;IACxC,sGAAsG;IACtG,uBAAuB,EAAE,OAAO,CAAC;CAClC;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;IACjB,uEAAuE;IACvE,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AA8CD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,EAAE,CAgDpF;AAYD,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,kBAAkB,GAAG,uBAAuB,CAU/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,CA0BlH"}