dexto 1.6.7 → 1.6.9
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/README.md +4 -4
- package/dist/analytics/wrapper.d.ts.map +1 -1
- package/dist/analytics/wrapper.js +43 -9
- package/dist/cli/auth/api-client.d.ts +50 -0
- package/dist/cli/auth/api-client.d.ts.map +1 -1
- package/dist/cli/auth/api-client.js +379 -15
- package/dist/cli/auth/browser-launch.d.ts +6 -0
- package/dist/cli/auth/browser-launch.d.ts.map +1 -0
- package/dist/cli/auth/browser-launch.js +24 -0
- package/dist/cli/auth/device.d.ts +14 -0
- package/dist/cli/auth/device.d.ts.map +1 -0
- package/dist/cli/auth/device.js +93 -0
- package/dist/cli/auth/index.d.ts +3 -1
- package/dist/cli/auth/index.d.ts.map +1 -1
- package/dist/cli/auth/index.js +2 -1
- package/dist/cli/auth/login-persistence.d.ts +13 -0
- package/dist/cli/auth/login-persistence.d.ts.map +1 -0
- package/dist/cli/auth/login-persistence.js +22 -0
- package/dist/cli/auth/oauth.d.ts +4 -1
- package/dist/cli/auth/oauth.d.ts.map +1 -1
- package/dist/cli/auth/oauth.js +6 -2
- package/dist/cli/auth/types.d.ts +12 -0
- package/dist/cli/auth/types.d.ts.map +1 -0
- package/dist/cli/auth/types.js +1 -0
- package/dist/cli/commands/agents/register.d.ts +6 -0
- package/dist/cli/commands/agents/register.d.ts.map +1 -0
- package/dist/cli/commands/agents/register.js +85 -0
- package/dist/cli/commands/auth/index.d.ts +1 -1
- package/dist/cli/commands/auth/index.d.ts.map +1 -1
- package/dist/cli/commands/auth/index.js +1 -1
- package/dist/cli/commands/auth/login.d.ts +6 -6
- package/dist/cli/commands/auth/login.d.ts.map +1 -1
- package/dist/cli/commands/auth/login.js +85 -115
- package/dist/cli/commands/auth/logout.d.ts.map +1 -1
- package/dist/cli/commands/auth/logout.js +32 -2
- package/dist/cli/commands/auth/register.d.ts +3 -0
- package/dist/cli/commands/auth/register.d.ts.map +1 -0
- package/dist/cli/commands/auth/register.js +94 -0
- package/dist/cli/commands/billing/register.d.ts +3 -0
- package/dist/cli/commands/billing/register.d.ts.map +1 -0
- package/dist/cli/commands/billing/register.js +20 -0
- package/dist/cli/commands/helpers/formatters.d.ts.map +1 -1
- package/dist/cli/commands/helpers/formatters.js +9 -0
- package/dist/cli/commands/image/register.d.ts +6 -0
- package/dist/cli/commands/image/register.d.ts.map +1 -0
- package/dist/cli/commands/image/register.js +144 -0
- package/dist/cli/commands/install.d.ts +2 -2
- package/dist/cli/commands/list-agents.d.ts.map +1 -1
- package/dist/cli/commands/list-agents.js +3 -3
- package/dist/cli/commands/mcp/register.d.ts +6 -0
- package/dist/cli/commands/mcp/register.d.ts.map +1 -0
- package/dist/cli/commands/mcp/register.js +64 -0
- package/dist/cli/commands/plugin/register.d.ts +6 -0
- package/dist/cli/commands/plugin/register.d.ts.map +1 -0
- package/dist/cli/commands/plugin/register.js +183 -0
- package/dist/cli/commands/plugin.d.ts +4 -4
- package/dist/cli/commands/register-context.d.ts +12 -0
- package/dist/cli/commands/register-context.d.ts.map +1 -0
- package/dist/cli/commands/register-context.js +1 -0
- package/dist/cli/commands/run/headless.d.ts +20 -0
- package/dist/cli/commands/run/headless.d.ts.map +1 -0
- package/dist/cli/commands/run/headless.js +275 -0
- package/dist/cli/commands/run/register.d.ts +3 -0
- package/dist/cli/commands/run/register.d.ts.map +1 -0
- package/dist/cli/commands/run/register.js +78 -0
- package/dist/cli/commands/search/register.d.ts +3 -0
- package/dist/cli/commands/search/register.d.ts.map +1 -0
- package/dist/cli/commands/search/register.js +55 -0
- package/dist/cli/commands/session/register.d.ts +3 -0
- package/dist/cli/commands/session/register.d.ts.map +1 -0
- package/dist/cli/commands/session/register.js +75 -0
- package/dist/cli/commands/setup.js +4 -4
- package/dist/cli/commands/sync-agents.d.ts +3 -3
- package/dist/cli/commands/sync-agents.js +4 -4
- package/dist/cli/commands/uninstall.d.ts +2 -2
- package/dist/cli/modes/cli.d.ts +3 -0
- package/dist/cli/modes/cli.d.ts.map +1 -0
- package/dist/cli/modes/cli.js +170 -0
- package/dist/cli/modes/context.d.ts +20 -0
- package/dist/cli/modes/context.d.ts.map +1 -0
- package/dist/cli/modes/context.js +1 -0
- package/dist/cli/modes/dispatch.d.ts +3 -0
- package/dist/cli/modes/dispatch.d.ts.map +1 -0
- package/dist/cli/modes/dispatch.js +52 -0
- package/dist/cli/modes/mcp.d.ts +3 -0
- package/dist/cli/modes/mcp.d.ts.map +1 -0
- package/dist/cli/modes/mcp.js +23 -0
- package/dist/cli/modes/server.d.ts +3 -0
- package/dist/cli/modes/server.d.ts.map +1 -0
- package/dist/cli/modes/server.js +36 -0
- package/dist/cli/modes/web.d.ts +3 -0
- package/dist/cli/modes/web.d.ts.map +1 -0
- package/dist/cli/modes/web.js +50 -0
- package/dist/cli/utils/setup-utils.js +1 -1
- package/dist/index-main.js +150 -991
- package/dist/utils/port-utils.d.ts +1 -1
- package/dist/utils/port-utils.d.ts.map +1 -1
- package/dist/utils/port-utils.js +7 -3
- package/dist/webui/assets/index-Bn9YuTdA.css +1 -0
- package/dist/webui/assets/index-CNiOYnOb.js +2059 -0
- package/dist/webui/index.html +2 -2
- package/package.json +12 -12
- package/dist/webui/assets/index-d6c-yJNn.js +0 -2059
- package/dist/webui/assets/index-yKdFLN1k.css +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// packages/cli/src/cli/auth/browser-launch.ts
|
|
2
|
+
// Environment checks for deciding whether automatic browser launch is likely to work.
|
|
3
|
+
const BROWSER_BLOCKLIST = new Set(['www-browser', 'none', 'false', '0']);
|
|
4
|
+
const DISPLAY_ENV_VARS = ['DISPLAY', 'WAYLAND_DISPLAY', 'MIR_SOCKET'];
|
|
5
|
+
export function shouldAttemptBrowserLaunch(context = { env: process.env, platform: process.platform }) {
|
|
6
|
+
const browserEnv = context.env.BROWSER;
|
|
7
|
+
if (browserEnv && BROWSER_BLOCKLIST.has(browserEnv.trim().toLowerCase())) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (context.env.CI || context.env.DEBIAN_FRONTEND === 'noninteractive') {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const isSshSession = Boolean(context.env.SSH_CONNECTION);
|
|
14
|
+
if (context.platform === 'linux') {
|
|
15
|
+
const hasDisplay = DISPLAY_ENV_VARS.some((name) => Boolean(context.env[name]));
|
|
16
|
+
if (!hasDisplay) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (isSshSession && context.platform !== 'linux') {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AuthLoginResult } from './types.js';
|
|
2
|
+
export interface DeviceLoginPrompt {
|
|
3
|
+
userCode: string;
|
|
4
|
+
verificationUrl: string;
|
|
5
|
+
verificationUrlComplete: string | null;
|
|
6
|
+
expiresIn: number;
|
|
7
|
+
}
|
|
8
|
+
export interface DeviceLoginOptionsInput {
|
|
9
|
+
apiUrl?: string;
|
|
10
|
+
signal?: AbortSignal | undefined;
|
|
11
|
+
onPrompt?: ((prompt: DeviceLoginPrompt) => void | Promise<void>) | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare function performDeviceCodeLogin(optionsInput?: DeviceLoginOptionsInput): Promise<AuthLoginResult>;
|
|
14
|
+
//# sourceMappingURL=device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/device.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CAChF;AAoDD,wBAAsB,sBAAsB,CACxC,YAAY,GAAE,uBAA4B,GAC3C,OAAO,CAAC,eAAe,CAAC,CAqE1B"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// packages/cli/src/cli/auth/device.ts
|
|
2
|
+
// Device code login flow for browserless environments.
|
|
3
|
+
import { DextoApiClient, getDextoApiClient } from './api-client.js';
|
|
4
|
+
const TRANSIENT_POLL_BACKOFF_MS = 2_000;
|
|
5
|
+
const MAX_POLL_INTERVAL_MS = 30_000;
|
|
6
|
+
function resolveDeviceLoginOptions(options) {
|
|
7
|
+
return {
|
|
8
|
+
apiUrl: options.apiUrl,
|
|
9
|
+
signal: options.signal ?? null,
|
|
10
|
+
onPrompt: options.onPrompt ?? (() => undefined),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function getAuthClient(apiUrl) {
|
|
14
|
+
return apiUrl ? new DextoApiClient(apiUrl) : getDextoApiClient();
|
|
15
|
+
}
|
|
16
|
+
async function sleepWithAbort(ms, signal) {
|
|
17
|
+
if (signal?.aborted) {
|
|
18
|
+
throw signal.reason instanceof Error
|
|
19
|
+
? signal.reason
|
|
20
|
+
: new Error('Authentication cancelled');
|
|
21
|
+
}
|
|
22
|
+
if (!signal) {
|
|
23
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await new Promise((resolve, reject) => {
|
|
27
|
+
const timer = setTimeout(() => {
|
|
28
|
+
signal.removeEventListener('abort', onAbort);
|
|
29
|
+
resolve();
|
|
30
|
+
}, ms);
|
|
31
|
+
const onAbort = () => {
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
signal.removeEventListener('abort', onAbort);
|
|
34
|
+
reject(signal.reason instanceof Error
|
|
35
|
+
? signal.reason
|
|
36
|
+
: new Error('Authentication cancelled'));
|
|
37
|
+
};
|
|
38
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export async function performDeviceCodeLogin(optionsInput = {}) {
|
|
42
|
+
const options = resolveDeviceLoginOptions(optionsInput);
|
|
43
|
+
const authClient = getAuthClient(options.apiUrl);
|
|
44
|
+
const start = await authClient.startDeviceCodeLogin('dexto-cli', {
|
|
45
|
+
signal: options.signal ?? undefined,
|
|
46
|
+
});
|
|
47
|
+
await options.onPrompt({
|
|
48
|
+
userCode: start.userCode,
|
|
49
|
+
verificationUrl: start.verificationUrl,
|
|
50
|
+
verificationUrlComplete: start.verificationUrlComplete,
|
|
51
|
+
expiresIn: start.expiresIn,
|
|
52
|
+
});
|
|
53
|
+
const deadline = Date.now() + start.expiresIn * 1000;
|
|
54
|
+
let pollIntervalMs = Math.max(1, Math.floor(start.interval)) * 1000;
|
|
55
|
+
while (Date.now() < deadline) {
|
|
56
|
+
await sleepWithAbort(pollIntervalMs, options.signal);
|
|
57
|
+
const pollResult = await authClient.pollDeviceCodeLogin(start.deviceCode, {
|
|
58
|
+
signal: options.signal ?? undefined,
|
|
59
|
+
});
|
|
60
|
+
if (pollResult.status === 'pending') {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (pollResult.status === 'slowDown') {
|
|
64
|
+
pollIntervalMs = Math.min(pollIntervalMs + 5_000, MAX_POLL_INTERVAL_MS);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (pollResult.status === 'transientError') {
|
|
68
|
+
pollIntervalMs = Math.min(pollIntervalMs + TRANSIENT_POLL_BACKOFF_MS, MAX_POLL_INTERVAL_MS);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (pollResult.status === 'expired') {
|
|
72
|
+
throw new Error('Device login expired. Please restart login.');
|
|
73
|
+
}
|
|
74
|
+
if (pollResult.status === 'denied') {
|
|
75
|
+
throw new Error('Device login was denied.');
|
|
76
|
+
}
|
|
77
|
+
const tokenResponse = pollResult.token;
|
|
78
|
+
const computedExpiresIn = tokenResponse.expiresIn ??
|
|
79
|
+
(tokenResponse.expiresAt
|
|
80
|
+
? Math.max(0, tokenResponse.expiresAt - Date.now() / 1000)
|
|
81
|
+
: undefined);
|
|
82
|
+
const user = await authClient.fetchSupabaseUser(tokenResponse.accessToken, {
|
|
83
|
+
signal: options.signal ?? undefined,
|
|
84
|
+
});
|
|
85
|
+
return {
|
|
86
|
+
accessToken: tokenResponse.accessToken,
|
|
87
|
+
refreshToken: tokenResponse.refreshToken ?? undefined,
|
|
88
|
+
expiresIn: computedExpiresIn,
|
|
89
|
+
user,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
throw new Error('Device login timed out. Please restart login.');
|
|
93
|
+
}
|
package/dist/cli/auth/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { type AuthConfig, storeAuth, loadAuth, removeAuth, isAuthenticated, getAuthToken, getDextoApiKey, getAuthFilePath, } from './service.js';
|
|
2
|
-
export { type OAuthResult
|
|
2
|
+
export { type OAuthResult } from './oauth.js';
|
|
3
|
+
export { type DeviceLoginPrompt, performDeviceCodeLogin } from './device.js';
|
|
4
|
+
export { type PersistOAuthLoginOptions, type PersistedLoginResult, persistOAuthLoginResult, } from './login-persistence.js';
|
|
3
5
|
export { type UsageSummaryResponse, DextoApiClient, getDextoApiClient } from './api-client.js';
|
|
4
6
|
export { SUPABASE_URL, SUPABASE_ANON_KEY, DEXTO_API_URL } from './constants.js';
|
|
5
7
|
export { type DextoApiKeyProvisionStatus, type DextoApiKeyProvisionStatusLevel, type EnsureDextoApiKeyOptions, ensureDextoApiKeyForAuthToken, saveDextoApiKeyToEnv, removeDextoApiKeyFromEnv, } from './dexto-api-key.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,KAAK,UAAU,EACf,SAAS,EACT,QAAQ,EACR,UAAU,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,GAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,KAAK,UAAU,EACf,SAAS,EACT,QAAQ,EACR,UAAU,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,GAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,KAAK,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EACH,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,uBAAuB,GAC1B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,KAAK,oBAAoB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE/F,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EACH,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,6BAA6B,EAC7B,oBAAoB,EACpB,wBAAwB,GAC3B,MAAM,oBAAoB,CAAC"}
|
package/dist/cli/auth/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// packages/cli/src/cli/auth/index.ts
|
|
2
2
|
// Public exports for auth module
|
|
3
3
|
export { storeAuth, loadAuth, removeAuth, isAuthenticated, getAuthToken, getDextoApiKey, getAuthFilePath, } from './service.js';
|
|
4
|
-
export {
|
|
4
|
+
export { performDeviceCodeLogin } from './device.js';
|
|
5
|
+
export { persistOAuthLoginResult, } from './login-persistence.js';
|
|
5
6
|
export { DextoApiClient, getDextoApiClient } from './api-client.js';
|
|
6
7
|
export { SUPABASE_URL, SUPABASE_ANON_KEY, DEXTO_API_URL } from './constants.js';
|
|
7
8
|
export { ensureDextoApiKeyForAuthToken, saveDextoApiKeyToEnv, removeDextoApiKeyFromEnv, } from './dexto-api-key.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DextoApiKeyProvisionStatus } from './dexto-api-key.js';
|
|
2
|
+
import type { OAuthResult } from './oauth.js';
|
|
3
|
+
export interface PersistOAuthLoginOptions {
|
|
4
|
+
onProvisionStatus?: ((status: DextoApiKeyProvisionStatus) => void) | undefined;
|
|
5
|
+
}
|
|
6
|
+
export interface PersistedLoginResult {
|
|
7
|
+
email?: string | undefined;
|
|
8
|
+
userId?: string | undefined;
|
|
9
|
+
keyId?: string | undefined;
|
|
10
|
+
hasDextoApiKey: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function persistOAuthLoginResult(result: OAuthResult, options?: PersistOAuthLoginOptions): Promise<PersistedLoginResult>;
|
|
13
|
+
//# sourceMappingURL=login-persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-persistence.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/login-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAiC,MAAM,oBAAoB,CAAC;AACpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,wBAAwB;IACrC,iBAAiB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAClF;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,uBAAuB,CACzC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,wBAA6B,GACvC,OAAO,CAAC,oBAAoB,CAAC,CAsB/B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ensureDextoApiKeyForAuthToken } from './dexto-api-key.js';
|
|
2
|
+
import { storeAuth } from './service.js';
|
|
3
|
+
export async function persistOAuthLoginResult(result, options = {}) {
|
|
4
|
+
const expiresAt = result.expiresIn ? Date.now() + result.expiresIn * 1000 : undefined;
|
|
5
|
+
await storeAuth({
|
|
6
|
+
token: result.accessToken,
|
|
7
|
+
refreshToken: result.refreshToken,
|
|
8
|
+
userId: result.user?.id,
|
|
9
|
+
email: result.user?.email,
|
|
10
|
+
createdAt: Date.now(),
|
|
11
|
+
expiresAt,
|
|
12
|
+
});
|
|
13
|
+
const ensured = await ensureDextoApiKeyForAuthToken(result.accessToken, {
|
|
14
|
+
onStatus: options.onProvisionStatus,
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
email: result.user?.email,
|
|
18
|
+
userId: result.user?.id,
|
|
19
|
+
keyId: ensured?.keyId ?? undefined,
|
|
20
|
+
hasDextoApiKey: Boolean(ensured?.dextoApiKey),
|
|
21
|
+
};
|
|
22
|
+
}
|
package/dist/cli/auth/oauth.d.ts
CHANGED
|
@@ -23,11 +23,14 @@ export interface OAuthLoginSession {
|
|
|
23
23
|
result: Promise<OAuthResult>;
|
|
24
24
|
cancel: () => void;
|
|
25
25
|
}
|
|
26
|
+
export interface PerformOAuthLoginOptions {
|
|
27
|
+
failOnBrowserOpenError?: boolean | undefined;
|
|
28
|
+
}
|
|
26
29
|
export declare function beginOAuthLogin(config: OAuthConfig, options?: CallbackServerOptionsInput): Promise<OAuthLoginSession>;
|
|
27
30
|
/**
|
|
28
31
|
* Perform OAuth login flow with Supabase
|
|
29
32
|
*/
|
|
30
|
-
export declare function performOAuthLogin(config: OAuthConfig): Promise<OAuthResult>;
|
|
33
|
+
export declare function performOAuthLogin(config: OAuthConfig, options?: PerformOAuthLoginOptions): Promise<OAuthResult>;
|
|
31
34
|
/**
|
|
32
35
|
* Default Supabase OAuth configuration for Dexto CLI
|
|
33
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/oauth.ts"],"names":[],"mappings":"AA8EA,UAAU,WAAW;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EACC;QACI,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACD,SAAS,CAAC;CACnB;AA4BD,UAAU,0BAA0B;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACpC;AAqSD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAsB,eAAe,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,0BAA+B,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAyC5B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/oauth.ts"],"names":[],"mappings":"AA8EA,UAAU,WAAW;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EACC;QACI,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACD,SAAS,CAAC;CACnB;AA4BD,UAAU,0BAA0B;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACpC;AAqSD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACrC,sBAAsB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChD;AAED,wBAAsB,eAAe,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,0BAA+B,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAyC5B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACnC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,wBAA6B,GACvC,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAKlC,CAAC"}
|
package/dist/cli/auth/oauth.js
CHANGED
|
@@ -391,7 +391,7 @@ export async function beginOAuthLogin(config, options = {}) {
|
|
|
391
391
|
/**
|
|
392
392
|
* Perform OAuth login flow with Supabase
|
|
393
393
|
*/
|
|
394
|
-
export async function performOAuthLogin(config) {
|
|
394
|
+
export async function performOAuthLogin(config, options = {}) {
|
|
395
395
|
try {
|
|
396
396
|
const session = await beginOAuthLogin(config);
|
|
397
397
|
console.log(chalk.cyan('🌐 Opening browser for authentication...'));
|
|
@@ -400,7 +400,11 @@ export async function performOAuthLogin(config) {
|
|
|
400
400
|
await open(session.authUrl);
|
|
401
401
|
console.log(chalk.green('✅ Browser opened'));
|
|
402
402
|
}
|
|
403
|
-
catch (
|
|
403
|
+
catch (error) {
|
|
404
|
+
if (options.failOnBrowserOpenError) {
|
|
405
|
+
session.cancel();
|
|
406
|
+
throw new Error(`Browser launch failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
407
|
+
}
|
|
404
408
|
console.log(chalk.yellow(`💡 Please open manually: ${session.authUrl}`));
|
|
405
409
|
}
|
|
406
410
|
const spinner = p.spinner();
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AuthenticatedUser {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
name?: string | undefined;
|
|
5
|
+
}
|
|
6
|
+
export interface AuthLoginResult {
|
|
7
|
+
accessToken: string;
|
|
8
|
+
refreshToken?: string | undefined;
|
|
9
|
+
expiresIn?: number | undefined;
|
|
10
|
+
user?: AuthenticatedUser | undefined;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/agents/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE,4BAA4B,GAAG,IAAI,CAmGrF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { withAnalytics, safeExit, ExitSignal } from '../../../analytics/wrapper.js';
|
|
2
|
+
export function registerAgentsCommand({ program }) {
|
|
3
|
+
const agentsCommand = program.command('agents').description('Manage agents');
|
|
4
|
+
agentsCommand
|
|
5
|
+
.command('install [agents...]')
|
|
6
|
+
.description('Install agents from registry or custom YAML files/directories')
|
|
7
|
+
.option('--all', 'Install all available agents from registry')
|
|
8
|
+
.option('--no-inject-preferences', 'Skip injecting global preferences into installed agents')
|
|
9
|
+
.option('--force', 'Force reinstall even if agent is already installed')
|
|
10
|
+
.addHelpText('after', `
|
|
11
|
+
Examples:
|
|
12
|
+
$ dexto agents install coding-agent Install agent from registry
|
|
13
|
+
$ dexto agents install agent1 agent2 Install multiple registry agents
|
|
14
|
+
$ dexto agents install --all Install all available registry agents
|
|
15
|
+
$ dexto agents install ./my-agent.yml Install custom agent from YAML file
|
|
16
|
+
$ dexto agents install ./my-agent-dir/ Install custom agent from directory (interactive)`)
|
|
17
|
+
.action(withAnalytics('agents install', async (agents = [], options) => {
|
|
18
|
+
try {
|
|
19
|
+
const { handleInstallCommand } = await import('../install.js');
|
|
20
|
+
await handleInstallCommand(agents, options);
|
|
21
|
+
safeExit('agents install', 0);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (err instanceof ExitSignal)
|
|
25
|
+
throw err;
|
|
26
|
+
console.error(`❌ dexto agents install command failed: ${err}`);
|
|
27
|
+
safeExit('agents install', 1, 'error');
|
|
28
|
+
}
|
|
29
|
+
}));
|
|
30
|
+
agentsCommand
|
|
31
|
+
.command('uninstall [agents...]')
|
|
32
|
+
.description('Uninstall agents from the local installation')
|
|
33
|
+
.option('--all', 'Uninstall all installed agents')
|
|
34
|
+
.option('--force', 'Force uninstall even if agent is protected (e.g., coding-agent)')
|
|
35
|
+
.action(withAnalytics('agents uninstall', async (agents, options) => {
|
|
36
|
+
try {
|
|
37
|
+
const { handleUninstallCommand } = await import('../uninstall.js');
|
|
38
|
+
await handleUninstallCommand(agents, options);
|
|
39
|
+
safeExit('agents uninstall', 0);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (err instanceof ExitSignal)
|
|
43
|
+
throw err;
|
|
44
|
+
console.error(`❌ dexto agents uninstall command failed: ${err}`);
|
|
45
|
+
safeExit('agents uninstall', 1, 'error');
|
|
46
|
+
}
|
|
47
|
+
}));
|
|
48
|
+
agentsCommand
|
|
49
|
+
.command('list')
|
|
50
|
+
.description('List available and installed agents')
|
|
51
|
+
.option('--verbose', 'Show detailed agent information')
|
|
52
|
+
.option('--installed', 'Show only installed agents')
|
|
53
|
+
.option('--available', 'Show only available agents')
|
|
54
|
+
.action(withAnalytics('agents list', async (options) => {
|
|
55
|
+
try {
|
|
56
|
+
const { handleListAgentsCommand } = await import('../list-agents.js');
|
|
57
|
+
await handleListAgentsCommand(options);
|
|
58
|
+
safeExit('agents list', 0);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (err instanceof ExitSignal)
|
|
62
|
+
throw err;
|
|
63
|
+
console.error(`❌ dexto agents list command failed: ${err}`);
|
|
64
|
+
safeExit('agents list', 1, 'error');
|
|
65
|
+
}
|
|
66
|
+
}));
|
|
67
|
+
agentsCommand
|
|
68
|
+
.command('sync')
|
|
69
|
+
.description('Sync installed agents with bundled versions')
|
|
70
|
+
.option('--list', 'List agent status without updating')
|
|
71
|
+
.option('--force', 'Update all agents without prompting')
|
|
72
|
+
.action(withAnalytics('agents sync', async (options) => {
|
|
73
|
+
try {
|
|
74
|
+
const { handleSyncAgentsCommand } = await import('../sync-agents.js');
|
|
75
|
+
await handleSyncAgentsCommand(options);
|
|
76
|
+
safeExit('agents sync', 0);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
if (err instanceof ExitSignal)
|
|
80
|
+
throw err;
|
|
81
|
+
console.error(`❌ dexto agents sync command failed: ${err}`);
|
|
82
|
+
safeExit('agents sync', 1, 'error');
|
|
83
|
+
}
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { handleLoginCommand,
|
|
1
|
+
export { handleLoginCommand, handleAutoLogin } from './login.js';
|
|
2
2
|
export { handleLogoutCommand } from './logout.js';
|
|
3
3
|
export { handleStatusCommand } from './status.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// packages/cli/src/cli/commands/auth/index.ts
|
|
2
|
-
export { handleLoginCommand,
|
|
2
|
+
export { handleLoginCommand, handleAutoLogin } from './login.js';
|
|
3
3
|
export { handleLogoutCommand } from './logout.js';
|
|
4
4
|
export { handleStatusCommand } from './status.js';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
* Handle login command - multiple methods supported
|
|
3
|
-
*/
|
|
4
|
-
export declare function handleLoginCommand(options?: {
|
|
1
|
+
export interface LoginCommandOptions {
|
|
5
2
|
apiKey?: string;
|
|
3
|
+
token?: string;
|
|
6
4
|
interactive?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export declare function
|
|
5
|
+
}
|
|
6
|
+
export declare function handleLoginCommand(options?: LoginCommandOptions): Promise<void>;
|
|
7
|
+
export declare function handleAutoLogin(): Promise<void>;
|
|
8
|
+
export declare function handleDeviceLogin(): Promise<void>;
|
|
9
9
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/auth/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/auth/login.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,mBAAmB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAgBD,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEzF;AAGD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BvD"}
|