dexto 1.6.8 → 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.
Files changed (104) hide show
  1. package/README.md +4 -4
  2. package/dist/analytics/wrapper.d.ts.map +1 -1
  3. package/dist/analytics/wrapper.js +43 -9
  4. package/dist/cli/auth/api-client.d.ts +50 -0
  5. package/dist/cli/auth/api-client.d.ts.map +1 -1
  6. package/dist/cli/auth/api-client.js +379 -15
  7. package/dist/cli/auth/browser-launch.d.ts +6 -0
  8. package/dist/cli/auth/browser-launch.d.ts.map +1 -0
  9. package/dist/cli/auth/browser-launch.js +24 -0
  10. package/dist/cli/auth/device.d.ts +14 -0
  11. package/dist/cli/auth/device.d.ts.map +1 -0
  12. package/dist/cli/auth/device.js +93 -0
  13. package/dist/cli/auth/index.d.ts +3 -1
  14. package/dist/cli/auth/index.d.ts.map +1 -1
  15. package/dist/cli/auth/index.js +2 -1
  16. package/dist/cli/auth/login-persistence.d.ts +13 -0
  17. package/dist/cli/auth/login-persistence.d.ts.map +1 -0
  18. package/dist/cli/auth/login-persistence.js +22 -0
  19. package/dist/cli/auth/oauth.d.ts +4 -1
  20. package/dist/cli/auth/oauth.d.ts.map +1 -1
  21. package/dist/cli/auth/oauth.js +6 -2
  22. package/dist/cli/auth/types.d.ts +12 -0
  23. package/dist/cli/auth/types.d.ts.map +1 -0
  24. package/dist/cli/auth/types.js +1 -0
  25. package/dist/cli/commands/agents/register.d.ts +6 -0
  26. package/dist/cli/commands/agents/register.d.ts.map +1 -0
  27. package/dist/cli/commands/agents/register.js +85 -0
  28. package/dist/cli/commands/auth/index.d.ts +1 -1
  29. package/dist/cli/commands/auth/index.d.ts.map +1 -1
  30. package/dist/cli/commands/auth/index.js +1 -1
  31. package/dist/cli/commands/auth/login.d.ts +6 -6
  32. package/dist/cli/commands/auth/login.d.ts.map +1 -1
  33. package/dist/cli/commands/auth/login.js +85 -115
  34. package/dist/cli/commands/auth/logout.d.ts.map +1 -1
  35. package/dist/cli/commands/auth/logout.js +32 -2
  36. package/dist/cli/commands/auth/register.d.ts +3 -0
  37. package/dist/cli/commands/auth/register.d.ts.map +1 -0
  38. package/dist/cli/commands/auth/register.js +94 -0
  39. package/dist/cli/commands/billing/register.d.ts +3 -0
  40. package/dist/cli/commands/billing/register.d.ts.map +1 -0
  41. package/dist/cli/commands/billing/register.js +20 -0
  42. package/dist/cli/commands/helpers/formatters.d.ts.map +1 -1
  43. package/dist/cli/commands/helpers/formatters.js +9 -0
  44. package/dist/cli/commands/image/register.d.ts +6 -0
  45. package/dist/cli/commands/image/register.d.ts.map +1 -0
  46. package/dist/cli/commands/image/register.js +144 -0
  47. package/dist/cli/commands/install.d.ts +2 -2
  48. package/dist/cli/commands/list-agents.d.ts.map +1 -1
  49. package/dist/cli/commands/list-agents.js +3 -3
  50. package/dist/cli/commands/mcp/register.d.ts +6 -0
  51. package/dist/cli/commands/mcp/register.d.ts.map +1 -0
  52. package/dist/cli/commands/mcp/register.js +64 -0
  53. package/dist/cli/commands/plugin/register.d.ts +6 -0
  54. package/dist/cli/commands/plugin/register.d.ts.map +1 -0
  55. package/dist/cli/commands/plugin/register.js +183 -0
  56. package/dist/cli/commands/plugin.d.ts +4 -4
  57. package/dist/cli/commands/register-context.d.ts +12 -0
  58. package/dist/cli/commands/register-context.d.ts.map +1 -0
  59. package/dist/cli/commands/register-context.js +1 -0
  60. package/dist/cli/commands/run/headless.d.ts +20 -0
  61. package/dist/cli/commands/run/headless.d.ts.map +1 -0
  62. package/dist/cli/commands/run/headless.js +275 -0
  63. package/dist/cli/commands/run/register.d.ts +3 -0
  64. package/dist/cli/commands/run/register.d.ts.map +1 -0
  65. package/dist/cli/commands/run/register.js +78 -0
  66. package/dist/cli/commands/search/register.d.ts +3 -0
  67. package/dist/cli/commands/search/register.d.ts.map +1 -0
  68. package/dist/cli/commands/search/register.js +55 -0
  69. package/dist/cli/commands/session/register.d.ts +3 -0
  70. package/dist/cli/commands/session/register.d.ts.map +1 -0
  71. package/dist/cli/commands/session/register.js +75 -0
  72. package/dist/cli/commands/setup.js +4 -4
  73. package/dist/cli/commands/sync-agents.d.ts +3 -3
  74. package/dist/cli/commands/sync-agents.js +4 -4
  75. package/dist/cli/commands/uninstall.d.ts +2 -2
  76. package/dist/cli/modes/cli.d.ts +3 -0
  77. package/dist/cli/modes/cli.d.ts.map +1 -0
  78. package/dist/cli/modes/cli.js +170 -0
  79. package/dist/cli/modes/context.d.ts +20 -0
  80. package/dist/cli/modes/context.d.ts.map +1 -0
  81. package/dist/cli/modes/context.js +1 -0
  82. package/dist/cli/modes/dispatch.d.ts +3 -0
  83. package/dist/cli/modes/dispatch.d.ts.map +1 -0
  84. package/dist/cli/modes/dispatch.js +52 -0
  85. package/dist/cli/modes/mcp.d.ts +3 -0
  86. package/dist/cli/modes/mcp.d.ts.map +1 -0
  87. package/dist/cli/modes/mcp.js +23 -0
  88. package/dist/cli/modes/server.d.ts +3 -0
  89. package/dist/cli/modes/server.d.ts.map +1 -0
  90. package/dist/cli/modes/server.js +36 -0
  91. package/dist/cli/modes/web.d.ts +3 -0
  92. package/dist/cli/modes/web.d.ts.map +1 -0
  93. package/dist/cli/modes/web.js +50 -0
  94. package/dist/cli/utils/setup-utils.js +1 -1
  95. package/dist/index-main.js +150 -991
  96. package/dist/utils/port-utils.d.ts +1 -1
  97. package/dist/utils/port-utils.d.ts.map +1 -1
  98. package/dist/utils/port-utils.js +7 -3
  99. package/dist/webui/assets/index-Bn9YuTdA.css +1 -0
  100. package/dist/webui/assets/index-CNiOYnOb.js +2059 -0
  101. package/dist/webui/index.html +2 -2
  102. package/package.json +12 -12
  103. package/dist/webui/assets/index-d6c-yJNn.js +0 -2059
  104. 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
+ }
@@ -1,5 +1,7 @@
1
1
  export { type AuthConfig, storeAuth, loadAuth, removeAuth, isAuthenticated, getAuthToken, getDextoApiKey, getAuthFilePath, } from './service.js';
2
- export { type OAuthResult, type OAuthLoginSession, beginOAuthLogin, performOAuthLogin, DEFAULT_OAUTH_CONFIG, } from './oauth.js';
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,EACH,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACvB,MAAM,YAAY,CAAC;AAEpB,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"}
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"}
@@ -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 { beginOAuthLogin, performOAuthLogin, DEFAULT_OAUTH_CONFIG, } from './oauth.js';
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
+ }
@@ -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,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BjF;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAKlC,CAAC"}
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"}
@@ -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 (_error) {
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,6 @@
1
+ import type { Command } from 'commander';
2
+ export interface AgentsCommandRegisterContext {
3
+ program: Command;
4
+ }
5
+ export declare function registerAgentsCommand({ program }: AgentsCommandRegisterContext): void;
6
+ //# sourceMappingURL=register.d.ts.map
@@ -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, handleBrowserLogin } from './login.js';
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,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
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, handleBrowserLogin } from './login.js';
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
- }): Promise<void>;
8
- export declare function handleBrowserLogin(): Promise<void>;
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":"AAiCA;;GAEG;AACH,wBAAsB,kBAAkB,CACpC,OAAO,GAAE;IACL,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACpB,GACP,OAAO,CAAC,IAAI,CAAC,CAqEf;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwCxD"}
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"}