@databasin/mcp-client 0.2.0 → 0.2.1

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.
@@ -0,0 +1,78 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { DataProtectionScope, PersistenceCreator } from '@azure/msal-node-extensions';
6
+ import lockfile from 'proper-lockfile';
7
+ import { z } from 'zod';
8
+ export const Auth0SessionSchema = z.object({
9
+ accessToken: z.string().min(1).max(65536),
10
+ refreshToken: z.string().min(1).max(65536).optional(),
11
+ expiresAt: z.number().finite().positive()
12
+ }).strict();
13
+ /** Separate OS-protected records and cross-process locks for each provider/client/environment. */
14
+ export async function createAuth0Store(environment, issuer, clientId, audience) {
15
+ const identity = createHash('sha256').update(JSON.stringify([issuer, clientId, audience])).digest('hex');
16
+ const authDirectory = join(homedir(), '.databasin', 'mcp', 'auth');
17
+ const directory = join(authDirectory, environment, `auth0-${identity}`);
18
+ await mkdir(directory, { recursive: true, mode: 0o700 });
19
+ // The library probes a fixed validation key, shared across profiles and processes.
20
+ // Serialize initialization separately from session transactions to avoid one
21
+ // starting host deleting another host's probe before it can be read.
22
+ let initializationCompromised = false;
23
+ const releaseInitialization = await lockfile.lock(authDirectory, {
24
+ stale: 120000, update: 10000,
25
+ retries: { retries: 20, minTimeout: 100, maxTimeout: 1000 },
26
+ onCompromised: () => { initializationCompromised = true; }
27
+ });
28
+ let persistence;
29
+ try {
30
+ persistence = await PersistenceCreator.createPersistence({
31
+ cachePath: join(directory, 'cache'),
32
+ dataProtectionScope: DataProtectionScope.CurrentUser,
33
+ serviceName: 'com.databasin.mcp.auth0',
34
+ accountName: `${environment}:${identity}`,
35
+ usePlaintextFileOnLinux: false
36
+ });
37
+ if (initializationCompromised)
38
+ throw new Error('Credential initialization lock was lost.');
39
+ }
40
+ finally {
41
+ await releaseInitialization();
42
+ }
43
+ return {
44
+ async transact(operation) {
45
+ // Keep refresh-token rotation atomic across Claude, Codex, and CLI processes.
46
+ let compromised = false;
47
+ const release = await lockfile.lock(directory, {
48
+ stale: 120000,
49
+ update: 10000,
50
+ retries: { retries: 20, minTimeout: 100, maxTimeout: 1000 },
51
+ onCompromised: () => { compromised = true; }
52
+ });
53
+ try {
54
+ let raw;
55
+ try {
56
+ raw = await persistence.load();
57
+ }
58
+ catch (error) {
59
+ if (error.code !== 'ENOENT')
60
+ throw error;
61
+ raw = null;
62
+ }
63
+ const decoded = raw ? JSON.parse(raw) : null;
64
+ const session = decoded === null ? null : Auth0SessionSchema.parse(decoded);
65
+ return await operation(session, async (next) => {
66
+ if (compromised)
67
+ throw new Error('Credential storage lock was lost.');
68
+ // Keytar rejects empty passwords. Store an OS-protected JSON null tombstone.
69
+ await persistence.save(JSON.stringify(next === null ? null : Auth0SessionSchema.parse(next)));
70
+ });
71
+ }
72
+ finally {
73
+ await release();
74
+ }
75
+ }
76
+ };
77
+ }
78
+ //# sourceMappingURL=auth0-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth0-store.js","sourceRoot":"","sources":["../src/auth0-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type JWTVerifyGetKey } from 'jose';
2
+ export declare function createAuth0TokenVerifier(issuer: string, audience: string, clientId: string, now: () => number, keys?: JWTVerifyGetKey): (token: string) => Promise<number>;
3
+ //# sourceMappingURL=auth0-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth0-token.d.ts","sourceRoot":"","sources":["../src/auth0-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,eAAe,EAAE,MAAM,MAAM,CAAC;AAE3E,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM,EACrE,IAAI,GAAE,eAA0G,GAC/G,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CASpC"}
@@ -0,0 +1,13 @@
1
+ import { createRemoteJWKSet, jwtVerify } from 'jose';
2
+ export function createAuth0TokenVerifier(issuer, audience, clientId, now, keys = createRemoteJWKSet(new URL('.well-known/jwks.json', issuer), { timeoutDuration: 10000 })) {
3
+ return async (token) => {
4
+ const { payload } = await jwtVerify(token, keys, {
5
+ algorithms: ['RS256'], issuer, audience,
6
+ requiredClaims: ['sub', 'exp', 'iat'], currentDate: new Date(now())
7
+ });
8
+ if (!payload.sub || payload.azp !== clientId || !payload.exp)
9
+ throw new Error('Invalid DataBasin token.');
10
+ return payload.exp * 1000;
11
+ };
12
+ }
13
+ //# sourceMappingURL=auth0-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth0-token.js","sourceRoot":"","sources":["../src/auth0-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAwB,MAAM,MAAM,CAAC;AAE3E,MAAM,UAAU,wBAAwB,CACtC,MAAc,EAAE,QAAgB,EAAE,QAAgB,EAAE,GAAiB,EACrE,OAAwB,kBAAkB,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAEhH,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/C,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ;YACvC,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;SACpE,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1G,OAAO,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { AssistantAuthResult, AuthStatus } from './auth.js';
2
+ import { type Auth0Store } from './auth0-store.js';
3
+ import type { DataBasinProfile } from './config.js';
4
+ export interface Auth0Configuration {
5
+ domain: string;
6
+ clientId: string;
7
+ audience: string;
8
+ }
9
+ export interface Auth0Options {
10
+ fetch?: typeof fetch;
11
+ now?: () => number;
12
+ wait?: (ms: number, signal: AbortSignal) => Promise<void>;
13
+ openBrowser?: (url: string) => Promise<void>;
14
+ createStore?: () => Promise<Auth0Store>;
15
+ verify?: (token: string) => Promise<number>;
16
+ writePrompt?: (message: string) => void;
17
+ }
18
+ /** Public native-client device authorization; never requests a client secret or user password. */
19
+ export declare class Auth0Manager {
20
+ #private;
21
+ readonly profile: DataBasinProfile;
22
+ readonly configuration: Auth0Configuration;
23
+ private options;
24
+ readonly issuer: string;
25
+ constructor(profile: DataBasinProfile, configuration: Auth0Configuration, options?: Auth0Options);
26
+ getAccessToken(): Promise<string>;
27
+ status(): Promise<AuthStatus>;
28
+ getLoginStatus(): Promise<AssistantAuthResult>;
29
+ startLogin(): Promise<AssistantAuthResult>;
30
+ private begin;
31
+ login(): Promise<AuthStatus>;
32
+ cancelPendingLogin(): void;
33
+ logout(): Promise<number>;
34
+ private poll;
35
+ private session;
36
+ private verify;
37
+ private post;
38
+ private withStore;
39
+ private result;
40
+ }
41
+ //# sourceMappingURL=auth0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth0.d.ts","sourceRoot":"","sources":["../src/auth0.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAExF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,WAAW,kBAAkB;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC1F,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAeD,kGAAkG;AAClG,qBAAa,YAAY;;IAWX,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAAE,QAAQ,CAAC,aAAa,EAAE,kBAAkB;IAAE,OAAO,CAAC,OAAO;IAF3G,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,gBAAgB,EAAW,aAAa,EAAE,kBAAkB,EAAU,OAAO,GAAE,YAAiB;IAWxH,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAqBjC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAY7B,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAM9C,UAAU,IAAI,OAAO,CAAC,mBAAmB,CAAC;YAKlC,KAAK;IA8Bb,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAalC,kBAAkB,IAAI,IAAI;IAEpB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;YASjB,IAAI;YAsBJ,OAAO;YAUP,MAAM;YAIN,IAAI;YAiBJ,SAAS;IAYvB,OAAO,CAAC,MAAM;CAIf"}
package/dist/auth0.js ADDED
@@ -0,0 +1,236 @@
1
+ import { setTimeout as delay } from 'node:timers/promises';
2
+ import { z } from 'zod';
3
+ import { createAuth0Store } from './auth0-store.js';
4
+ import { openSystemBrowser } from './browser.js';
5
+ import { DataBasinError, LoginRequiredError } from './errors.js';
6
+ import { createAuth0TokenVerifier } from './auth0-token.js';
7
+ const deviceSchema = z.object({
8
+ device_code: z.string().min(1).max(8192),
9
+ user_code: z.string().regex(/^[A-Z0-9-]{4,32}$/iu),
10
+ verification_uri: z.string().max(4096),
11
+ expires_in: z.number().int().min(1).max(1800),
12
+ interval: z.number().int().min(1).max(60).default(5)
13
+ });
14
+ const tokenSchema = z.object({
15
+ access_token: z.string().min(1).max(65536),
16
+ refresh_token: z.string().min(1).max(65536).optional(),
17
+ token_type: z.literal('Bearer'),
18
+ expires_in: z.number().int().positive().max(2592000)
19
+ });
20
+ /** Public native-client device authorization; never requests a client secret or user password. */
21
+ export class Auth0Manager {
22
+ profile;
23
+ configuration;
24
+ options;
25
+ #store;
26
+ #active;
27
+ #starting;
28
+ #failed = false;
29
+ #generation = 0;
30
+ #fetch;
31
+ #now;
32
+ #verify;
33
+ issuer;
34
+ constructor(profile, configuration, options = {}) {
35
+ this.profile = profile;
36
+ this.configuration = configuration;
37
+ this.options = options;
38
+ // Keep authentication requests pinned to the tenant, not arbitrary discovery URLs.
39
+ if (configuration.domain !== 'databasin.us.auth0.com' ||
40
+ !/^[a-zA-Z0-9_-]{16,128}$/u.test(configuration.clientId) ||
41
+ configuration.audience !== (profile.environment === 'prod' ? 'https://api.databasin.ai' : 'https://api.databasin-nonprod.ai'))
42
+ throw failure();
43
+ this.issuer = `https://${configuration.domain}/`;
44
+ this.#fetch = options.fetch ?? fetch;
45
+ this.#now = options.now ?? Date.now;
46
+ this.#verify = options.verify ?? createAuth0TokenVerifier(this.issuer, configuration.audience, configuration.clientId, this.#now);
47
+ }
48
+ async getAccessToken() {
49
+ return this.withStore(async (session, save) => {
50
+ if (!session)
51
+ throw new LoginRequiredError(this.profile.environment);
52
+ if (session.expiresAt > this.#now() + 60000) {
53
+ await this.verify(session.accessToken);
54
+ return session.accessToken;
55
+ }
56
+ if (!session.refreshToken)
57
+ throw new LoginRequiredError(this.profile.environment);
58
+ const response = await this.post('oauth/token', {
59
+ grant_type: 'refresh_token', refresh_token: session.refreshToken
60
+ });
61
+ if (!response.ok) {
62
+ if (response.body.error === 'invalid_grant')
63
+ await save(null);
64
+ throw failure();
65
+ }
66
+ const next = await this.session(response.body, session.refreshToken);
67
+ await save(next);
68
+ return next.accessToken;
69
+ });
70
+ }
71
+ async status() {
72
+ try {
73
+ await this.getAccessToken();
74
+ return { authenticated: true, environment: this.profile.environment };
75
+ }
76
+ catch (error) {
77
+ if (error instanceof DataBasinError && error.code === 'UNAUTHENTICATED' && !error.message.includes('storage')) {
78
+ return { authenticated: false, environment: this.profile.environment };
79
+ }
80
+ throw error;
81
+ }
82
+ }
83
+ async getLoginStatus() {
84
+ if (this.#active)
85
+ return this.#active.result;
86
+ if ((await this.status()).authenticated)
87
+ return this.result('authenticated');
88
+ return this.result(this.#failed ? 'failed' : 'not_authenticated');
89
+ }
90
+ async startLogin() {
91
+ this.#starting ??= this.begin().finally(() => { this.#starting = undefined; });
92
+ return this.#starting;
93
+ }
94
+ async begin() {
95
+ const generation = this.#generation;
96
+ const existing = await this.getLoginStatus();
97
+ if (existing.status === 'pending' || existing.status === 'authenticated')
98
+ return existing;
99
+ this.#failed = false;
100
+ const response = await this.post('oauth/device/code', {
101
+ audience: this.configuration.audience, scope: 'openid profile email offline_access'
102
+ });
103
+ if (!response.ok || generation !== this.#generation)
104
+ throw failure();
105
+ const parsed = deviceSchema.safeParse(response.body);
106
+ if (!parsed.success)
107
+ throw failure();
108
+ const device = parsed.data;
109
+ const loginUrl = `${this.issuer}activate`;
110
+ if (device.verification_uri !== loginUrl)
111
+ throw failure();
112
+ const expiresAt = this.#now() + device.expires_in * 1000;
113
+ const result = {
114
+ status: 'pending', environment: this.profile.environment, loginUrl,
115
+ userCode: device.user_code, expiresAt: new Date(expiresAt).toISOString(),
116
+ message: 'Open the DataBasin sign-in page and enter the user code. Sign in there, never in chat.'
117
+ };
118
+ const abort = new AbortController();
119
+ const active = { result, abort, done: Promise.resolve({ authenticated: false, environment: this.profile.environment }) };
120
+ this.#active = active;
121
+ active.done = this.poll(device.device_code, device.interval, expiresAt, abort.signal)
122
+ .catch(() => { this.#failed = true; throw failure(); })
123
+ .finally(() => { if (this.#active === active)
124
+ this.#active = undefined; });
125
+ void active.done.catch(() => undefined);
126
+ return result;
127
+ }
128
+ async login() {
129
+ const result = await this.startLogin();
130
+ if (result.status === 'authenticated')
131
+ return this.status();
132
+ const active = this.#active;
133
+ if (result.status !== 'pending' || !result.loginUrl || !active)
134
+ throw failure();
135
+ (this.options.writePrompt ?? ((message) => process.stderr.write(message)))(`Open ${result.loginUrl} and enter code ${result.userCode}.\n`);
136
+ // A missing desktop opener does not invalidate the cross-device login instructions.
137
+ await (this.options.openBrowser ?? openSystemBrowser)(result.loginUrl).catch(() => undefined);
138
+ return active.done;
139
+ }
140
+ cancelPendingLogin() { this.#generation += 1; this.#active?.abort.abort(); }
141
+ async logout() {
142
+ const pending = this.#active;
143
+ this.cancelPendingLogin();
144
+ await this.#starting?.catch(() => undefined);
145
+ await pending?.done.catch(() => undefined);
146
+ this.#failed = false;
147
+ return this.withStore(async (session, save) => { await save(null); return session ? 1 : 0; });
148
+ }
149
+ async poll(deviceCode, interval, expiresAt, signal) {
150
+ while (!signal.aborted && this.#now() < expiresAt) {
151
+ await (this.options.wait ?? ((ms, abort) => delay(ms, undefined, { signal: abort })))(interval * 1000, signal);
152
+ if (signal.aborted || this.#now() >= expiresAt)
153
+ throw failure();
154
+ const response = await this.post('oauth/token', {
155
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code', device_code: deviceCode
156
+ }, signal);
157
+ if (response.ok) {
158
+ const session = await this.session(response.body);
159
+ if (signal.aborted || this.#now() >= expiresAt)
160
+ throw failure();
161
+ await this.withStore(async (_previous, save) => {
162
+ if (signal.aborted)
163
+ throw failure();
164
+ await save(session);
165
+ });
166
+ return { authenticated: true, environment: this.profile.environment };
167
+ }
168
+ if (response.body.error === 'slow_down') {
169
+ interval += 5;
170
+ continue;
171
+ }
172
+ if (response.body.error !== 'authorization_pending')
173
+ throw failure();
174
+ }
175
+ throw failure();
176
+ }
177
+ async session(body, previousRefreshToken) {
178
+ const parsed = tokenSchema.safeParse(body);
179
+ if (!parsed.success)
180
+ throw failure();
181
+ const token = parsed.data;
182
+ const expiresAt = Math.min(await this.verify(token.access_token), this.#now() + token.expires_in * 1000);
183
+ if (expiresAt <= this.#now())
184
+ throw failure();
185
+ const refreshToken = token.refresh_token ?? previousRefreshToken;
186
+ return { accessToken: token.access_token, expiresAt, ...(refreshToken ? { refreshToken } : {}) };
187
+ }
188
+ async verify(token) {
189
+ try {
190
+ return await this.#verify(token);
191
+ }
192
+ catch {
193
+ throw failure();
194
+ }
195
+ }
196
+ async post(path, fields, signal) {
197
+ try {
198
+ const timeout = AbortSignal.timeout(15000);
199
+ const response = await this.#fetch(new URL(path, this.issuer), {
200
+ method: 'POST', redirect: 'error',
201
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
202
+ body: new URLSearchParams({ client_id: this.configuration.clientId, ...fields }),
203
+ signal: signal ? AbortSignal.any([signal, timeout]) : timeout
204
+ });
205
+ const text = await response.text();
206
+ if (text.length > 196608)
207
+ throw failure();
208
+ const body = JSON.parse(text);
209
+ if (!body || typeof body !== 'object' || Array.isArray(body))
210
+ throw failure();
211
+ return { ok: response.ok, body: body };
212
+ }
213
+ catch {
214
+ throw failure();
215
+ }
216
+ }
217
+ async withStore(operation) {
218
+ try {
219
+ this.#store ??= (this.options.createStore?.() ?? createAuth0Store(this.profile.environment, this.issuer, this.configuration.clientId, this.configuration.audience)).catch((error) => { this.#store = undefined; throw error; });
220
+ return await (await this.#store).transact(operation);
221
+ }
222
+ catch (error) {
223
+ if (error instanceof DataBasinError)
224
+ throw error;
225
+ throw new DataBasinError('UNAUTHENTICATED', 'Secure DataBasin credential storage is unavailable. Unlock the system keyring and try again.');
226
+ }
227
+ }
228
+ result(status) {
229
+ return { status, environment: this.profile.environment, loginUrl: null,
230
+ message: status === 'authenticated' ? 'DataBasin sign-in is complete.' : 'Call databasin_login to sign in to DataBasin.' };
231
+ }
232
+ }
233
+ function failure() {
234
+ return new DataBasinError('UNAUTHENTICATED', 'DataBasin Auth0 sign-in did not complete. Sign in again.');
235
+ }
236
+ //# sourceMappingURL=auth0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth0.js","sourceRoot":"","sources":["../src/auth0.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,YAAY,CAAC;IACnE,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE;QACxD,QAAQ,EAAE,IAAI,CAAC;QACf,KAAK,EAAE,QAAQ,CAAC;QAChB,WAAW,EAAE,IAAI,CAAC;QAClB,KAAK,EAAE,KAAK,CAAC;KACd,GAAG,YAAY,CAAC;IACjB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,mBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAM7G"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,YAAY,CAAC;IACnE,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE;QACxD,QAAQ,EAAE,IAAI,CAAC;QACf,KAAK,EAAE,QAAQ,CAAC;QAChB,WAAW,EAAE,IAAI,CAAC;QAClB,KAAK,EAAE,KAAK,CAAC;KACd,GAAG,YAAY,CAAC;IACjB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,mBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAM7G"}
package/dist/browser.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { spawn } from 'node:child_process';
2
- import { validateInteractiveLoginUrl } from './login-url.js';
2
+ import { validateInteractiveLoginUrl, validateAuth0LoginUrl } from './login-url.js';
3
3
  export async function openSystemBrowser(rawUrl, dependencies = DEFAULT_DEPENDENCIES) {
4
- const safeUrl = validateInteractiveLoginUrl(rawUrl);
4
+ const safeUrl = rawUrl === 'https://databasin.us.auth0.com/activate'
5
+ ? validateAuth0LoginUrl(rawUrl) : validateInteractiveLoginUrl(rawUrl);
5
6
  const command = browserCommand(safeUrl, dependencies.platform);
6
7
  await new Promise((resolve) => {
7
8
  const child = dependencies.spawnProcess(command.executable, command.args, {
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAkB7D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,eAAoC,oBAAoB;IAExD,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE;YACxE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,YAAY,CAAC,UAAU,CAAC,2CAA2C,OAAO,IAAI,CAAC,CAAC;YAChF,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAyB;IACnE,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACtE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,oBAAoB,GAAwB,MAAM,CAAC,MAAM,CAAC;IAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,YAAY,EAAE,CACZ,UAAkB,EAClB,IAAc,EACd,OAA6E,EAC7E,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;IACrC,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;CAC/D,CAAC,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAkBpF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,eAAoC,oBAAoB;IAExD,MAAM,OAAO,GAAG,MAAM,KAAK,yCAAyC;QAClE,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE;YACxE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,YAAY,CAAC,UAAU,CAAC,2CAA2C,OAAO,IAAI,CAAC,CAAC;YAChF,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAyB;IACnE,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACtE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,oBAAoB,GAAwB,MAAM,CAAC,MAAM,CAAC;IAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,YAAY,EAAE,CACZ,UAAkB,EAClB,IAAc,EACd,OAA6E,EAC7E,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;IACrC,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;CAC/D,CAAC,CAAC"}
package/dist/cli.js CHANGED
@@ -161,7 +161,7 @@ Usage:
161
161
 
162
162
  Commands:
163
163
  serve Start the stdio MCP server (default)
164
- login Open Microsoft sign-in in the system browser
164
+ login Open DataBasin sign-in in the system browser
165
165
  logout Remove the locally cached DataBasin session
166
166
  status Show whether a session is available
167
167
  doctor Check this host without printing account identity or credentials
package/dist/config.d.ts CHANGED
@@ -6,6 +6,11 @@ export interface DataBasinProfile {
6
6
  tenantId: string;
7
7
  clientId: string;
8
8
  scopes: readonly string[];
9
+ auth0?: {
10
+ readonly domain: string;
11
+ readonly clientId: string;
12
+ readonly audience: string;
13
+ };
9
14
  }
10
15
  export declare function resolveEnvironment(value: string | undefined): DataBasinEnvironment;
11
16
  export declare function getProfile(environment?: DataBasinEnvironment): DataBasinProfile;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,oBAAoB,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAiCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAOlF;AAED,wBAAgB,UAAU,CAAC,WAAW,GAAE,oBAA6B,GAAG,gBAAgB,CAEvF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAE9D;AAED,eAAO,MAAM,sBAAsB,yBAAyC,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,oBAAoB,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3F;AA2CD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAOlF;AAED,wBAAgB,UAAU,CAAC,WAAW,GAAE,oBAA6B,GAAG,gBAAgB,CAEvF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAE9D;AAED,eAAO,MAAM,sBAAsB,yBAAyC,CAAC"}
package/dist/config.js CHANGED
@@ -6,7 +6,12 @@ const PROFILES = Object.freeze({
6
6
  apiBaseUrl: 'https://databasin.cloud',
7
7
  tenantId: TENANT_ID,
8
8
  clientId: '74125794-c409-483c-97e9-13194e58abb3',
9
- scopes: Object.freeze(['api://2170da8e-41ff-422f-a759-2718336f40d7/Databasin.API'])
9
+ scopes: Object.freeze(['api://2170da8e-41ff-422f-a759-2718336f40d7/Databasin.API']),
10
+ auth0: Object.freeze({
11
+ domain: 'databasin.us.auth0.com',
12
+ clientId: '3qLF66u5JlDlSmCjHEsqJqVewbhtCayT',
13
+ audience: 'https://api.databasin.ai'
14
+ })
10
15
  }),
11
16
  np: Object.freeze({
12
17
  environment: 'np',
@@ -14,7 +19,12 @@ const PROFILES = Object.freeze({
14
19
  apiBaseUrl: 'https://databasin-ui-np.grayriver-813df174.centralus.azurecontainerapps.io',
15
20
  tenantId: TENANT_ID,
16
21
  clientId: '68f0487f-d03d-41dd-96df-3c3fbaf1f112',
17
- scopes: Object.freeze(['api://16b4e522-d051-4838-a0d7-75d246b8090c/Databasin.API'])
22
+ scopes: Object.freeze(['api://16b4e522-d051-4838-a0d7-75d246b8090c/Databasin.API']),
23
+ auth0: Object.freeze({
24
+ domain: 'databasin.us.auth0.com',
25
+ clientId: '3qLF66u5JlDlSmCjHEsqJqVewbhtCayT',
26
+ audience: 'https://api.databasin-nonprod.ai'
27
+ })
18
28
  })
19
29
  });
20
30
  const ENVIRONMENT_ALIASES = Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAWA,MAAM,SAAS,GAAG,sCAAsC,CAAC;AAEzD,MAAM,QAAQ,GAA6D,MAAM,CAAC,MAAM,CAAC;IACvF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE,yBAAyB;QACrC,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,sCAAsC;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;KACpF,CAAC;IACF,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;QAChB,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,gBAAgB;QACvB,UAAU,EAAE,4EAA4E;QACxF,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,sCAAsC;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;KACpF,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAmD,MAAM,CAAC,MAAM,CAAC;IACxF,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,MAAM;IAClB,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,IAAI;IACtB,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,oBAAoB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,cAAoC,MAAM;IACnE,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,OAAO,qCAAqC,OAAO,CAAC,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAYA,MAAM,SAAS,GAAG,sCAAsC,CAAC;AAEzD,MAAM,QAAQ,GAA6D,MAAM,CAAC,MAAM,CAAC;IACvF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE,yBAAyB;QACrC,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,sCAAsC;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;QACnF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,wBAAwB;YAChC,QAAQ,EAAE,kCAAkC;YAC5C,QAAQ,EAAE,0BAA0B;SACrC,CAAC;KACH,CAAC;IACF,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;QAChB,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,gBAAgB;QACvB,UAAU,EAAE,4EAA4E;QACxF,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,sCAAsC;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;QACnF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,wBAAwB;YAChC,QAAQ,EAAE,kCAAkC;YAC5C,QAAQ,EAAE,kCAAkC;SAC7C,CAAC;KACH,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAmD,MAAM,CAAC,MAAM,CAAC;IACxF,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,MAAM;IAClB,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,IAAI;IACtB,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,oBAAoB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,cAAoC,MAAM;IACnE,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,OAAO,qCAAqC,OAAO,CAAC,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { type AccountInfo, type AuthenticationResult } from '@azure/msal-node';
2
+ import { type DataBasinEnvironment, type DataBasinProfile } from './config.js';
3
+ import { type RawDeviceCodeResponse } from './login-url.js';
4
+ export interface AuthStatus {
5
+ authenticated: boolean;
6
+ environment: DataBasinEnvironment;
7
+ username?: string;
8
+ }
9
+ export type AssistantAuthState = 'authenticated' | 'pending' | 'not_authenticated' | 'failed';
10
+ interface AssistantAuthResultBase {
11
+ environment: DataBasinEnvironment;
12
+ message: string;
13
+ }
14
+ interface PendingAssistantAuthResult extends AssistantAuthResultBase {
15
+ status: 'pending';
16
+ loginUrl: string | null;
17
+ userCode?: string;
18
+ expiresAt?: string;
19
+ }
20
+ interface SettledAssistantAuthResult extends AssistantAuthResultBase {
21
+ status: Exclude<AssistantAuthState, 'pending'>;
22
+ loginUrl: null;
23
+ userCode?: never;
24
+ expiresAt?: never;
25
+ }
26
+ export type AssistantAuthResult = PendingAssistantAuthResult | SettledAssistantAuthResult;
27
+ export interface PublicClientLike {
28
+ getAllAccounts(): Promise<AccountInfo[]>;
29
+ acquireTokenSilent(request: {
30
+ account: AccountInfo;
31
+ scopes: string[];
32
+ }): Promise<AuthenticationResult>;
33
+ acquireTokenInteractive(request: {
34
+ scopes: string[];
35
+ openBrowser: (url: string) => Promise<void>;
36
+ prompt?: string;
37
+ successTemplate?: string;
38
+ errorTemplate?: string;
39
+ }): Promise<AuthenticationResult>;
40
+ acquireTokenByDeviceCode(request: {
41
+ scopes: string[];
42
+ timeout?: number;
43
+ cancel?: boolean;
44
+ deviceCodeCallback: (response: RawDeviceCodeResponse) => void;
45
+ }): Promise<AuthenticationResult | null>;
46
+ signOut(request: {
47
+ account: AccountInfo;
48
+ }): Promise<void>;
49
+ }
50
+ export interface AuthManagerOptions {
51
+ createClient?: () => Promise<PublicClientLike>;
52
+ openBrowser?: (url: string) => Promise<void>;
53
+ now?: () => number;
54
+ }
55
+ export declare class EntraAuthManager {
56
+ readonly profile: DataBasinProfile;
57
+ private clientPromise;
58
+ private tokenPromise;
59
+ private activeLogin;
60
+ private lastLoginFailed;
61
+ private readonly createClient;
62
+ private readonly openBrowser;
63
+ private readonly now;
64
+ constructor(profile: DataBasinProfile, options?: AuthManagerOptions);
65
+ getAccessToken(): Promise<string>;
66
+ login(): Promise<AuthStatus>;
67
+ startLogin(): Promise<AssistantAuthResult>;
68
+ cancelPendingLogin(): void;
69
+ getLoginStatus(): Promise<AssistantAuthResult>;
70
+ private pendingAssistantResult;
71
+ private cachedAssistantResult;
72
+ private failedAssistantResult;
73
+ private beginDeviceLogin;
74
+ private performDeviceLogin;
75
+ private performInteractiveLogin;
76
+ private completeLogin;
77
+ private assistantResult;
78
+ logout(): Promise<number>;
79
+ status(): Promise<AuthStatus>;
80
+ private acquireSilent;
81
+ private client;
82
+ }
83
+ export { createSecurePublicClient } from './credential-store.js';
84
+ //# sourceMappingURL=entra-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entra-auth.d.ts","sourceRoot":"","sources":["../src/entra-auth.ts"],"names":[],"mappings":"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"}