@databasin/mcp-client 0.2.0-beta.1 → 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.
Files changed (100) hide show
  1. package/README.md +36 -30
  2. package/dist/auth-schema.d.ts +23 -0
  3. package/dist/auth-schema.d.ts.map +1 -0
  4. package/dist/auth-schema.js +42 -0
  5. package/dist/auth-schema.js.map +1 -0
  6. package/dist/auth-tools.d.ts +10 -0
  7. package/dist/auth-tools.d.ts.map +1 -0
  8. package/dist/auth-tools.js +60 -0
  9. package/dist/auth-tools.js.map +1 -0
  10. package/dist/auth.d.ts +13 -74
  11. package/dist/auth.d.ts.map +1 -1
  12. package/dist/auth.js +16 -228
  13. package/dist/auth.js.map +1 -1
  14. package/dist/auth0-store.d.ts +14 -0
  15. package/dist/auth0-store.d.ts.map +1 -0
  16. package/dist/auth0-store.js +78 -0
  17. package/dist/auth0-store.js.map +1 -0
  18. package/dist/auth0-token.d.ts +3 -0
  19. package/dist/auth0-token.d.ts.map +1 -0
  20. package/dist/auth0-token.js +13 -0
  21. package/dist/auth0-token.js.map +1 -0
  22. package/dist/auth0.d.ts +41 -0
  23. package/dist/auth0.d.ts.map +1 -0
  24. package/dist/auth0.js +236 -0
  25. package/dist/auth0.js.map +1 -0
  26. package/dist/browser.d.ts.map +1 -1
  27. package/dist/browser.js +3 -2
  28. package/dist/browser.js.map +1 -1
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +3 -2
  31. package/dist/cli.js.map +1 -1
  32. package/dist/config.d.ts +5 -0
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +12 -2
  35. package/dist/config.js.map +1 -1
  36. package/dist/entra-auth.d.ts +84 -0
  37. package/dist/entra-auth.d.ts.map +1 -0
  38. package/dist/entra-auth.js +234 -0
  39. package/dist/entra-auth.js.map +1 -0
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +1 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/login-url.d.ts +2 -0
  45. package/dist/login-url.d.ts.map +1 -1
  46. package/dist/login-url.js +14 -0
  47. package/dist/login-url.js.map +1 -1
  48. package/dist/mcp-endpoint.d.ts +5 -0
  49. package/dist/mcp-endpoint.d.ts.map +1 -0
  50. package/dist/mcp-endpoint.js +22 -0
  51. package/dist/mcp-endpoint.js.map +1 -0
  52. package/dist/proxy-tools.d.ts +5 -0
  53. package/dist/proxy-tools.d.ts.map +1 -0
  54. package/dist/proxy-tools.js +39 -0
  55. package/dist/proxy-tools.js.map +1 -0
  56. package/dist/remote-mcp.d.ts +27 -0
  57. package/dist/remote-mcp.d.ts.map +1 -0
  58. package/dist/remote-mcp.js +70 -0
  59. package/dist/remote-mcp.js.map +1 -0
  60. package/dist/server.d.ts +3 -3
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +17 -7
  63. package/dist/server.js.map +1 -1
  64. package/dist/version.d.ts +1 -1
  65. package/dist/version.d.ts.map +1 -1
  66. package/dist/version.js +1 -1
  67. package/dist/version.js.map +1 -1
  68. package/package.json +7 -3
  69. package/dist/abort.d.ts +0 -5
  70. package/dist/abort.d.ts.map +0 -1
  71. package/dist/abort.js +0 -25
  72. package/dist/abort.js.map +0 -1
  73. package/dist/api-client.d.ts +0 -58
  74. package/dist/api-client.d.ts.map +0 -1
  75. package/dist/api-client.js +0 -151
  76. package/dist/api-client.js.map +0 -1
  77. package/dist/api-contract.d.ts +0 -59
  78. package/dist/api-contract.d.ts.map +0 -1
  79. package/dist/api-contract.js +0 -47
  80. package/dist/api-contract.js.map +0 -1
  81. package/dist/api-profile.d.ts +0 -5
  82. package/dist/api-profile.d.ts.map +0 -1
  83. package/dist/api-profile.js +0 -38
  84. package/dist/api-profile.js.map +0 -1
  85. package/dist/api-request.d.ts +0 -27
  86. package/dist/api-request.d.ts.map +0 -1
  87. package/dist/api-request.js +0 -147
  88. package/dist/api-request.js.map +0 -1
  89. package/dist/api-response.d.ts +0 -9
  90. package/dist/api-response.d.ts.map +0 -1
  91. package/dist/api-response.js +0 -206
  92. package/dist/api-response.js.map +0 -1
  93. package/dist/schemas.d.ts +0 -431
  94. package/dist/schemas.d.ts.map +0 -1
  95. package/dist/schemas.js +0 -289
  96. package/dist/schemas.js.map +0 -1
  97. package/dist/tools.d.ts +0 -28
  98. package/dist/tools.d.ts.map +0 -1
  99. package/dist/tools.js +0 -328
  100. package/dist/tools.js.map +0 -1
package/dist/auth.js CHANGED
@@ -1,234 +1,22 @@
1
- import { InteractionRequiredAuthError } from '@azure/msal-node';
2
- import { openSystemBrowser } from './browser.js';
3
- import { createSecurePublicClient } from './credential-store.js';
4
- import { DataBasinError, LoginRequiredError } from './errors.js';
5
- import { projectDevicePrompt, validateInteractiveLoginUrl } from './login-url.js';
6
- import { accountMatchesProfile, validateAccessTokenResult } from './token-validation.js';
1
+ import { Auth0Manager } from './auth0.js';
2
+ import { EntraAuthManager } from './entra-auth.js';
3
+ export { createSecurePublicClient } from './credential-store.js';
4
+ /** Use the configured provider. Never treat a cached Entra login as an Auth0 session. */
7
5
  export class AuthManager {
8
6
  profile;
9
- clientPromise;
10
- tokenPromise;
11
- activeLogin;
12
- lastLoginFailed = false;
13
- createClient;
14
- openBrowser;
15
- now;
7
+ provider;
16
8
  constructor(profile, options = {}) {
17
9
  this.profile = profile;
18
- this.createClient = options.createClient ?? (() => createSecurePublicClient(profile));
19
- this.openBrowser = options.openBrowser ?? openSystemBrowser;
20
- this.now = options.now ?? Date.now;
21
- }
22
- async getAccessToken() {
23
- this.tokenPromise ??= this.acquireSilent().finally(() => {
24
- this.tokenPromise = undefined;
25
- });
26
- return this.tokenPromise;
27
- }
28
- async login() {
29
- return this.performInteractiveLogin(this.openBrowser);
30
- }
31
- async startLogin() {
32
- const status = await this.getLoginStatus();
33
- if (status.status === 'authenticated' || status.status === 'pending')
34
- return status;
35
- const login = this.beginDeviceLogin();
36
- const outcome = await Promise.race([
37
- login.prompted.then((prompt) => ({ state: 'prompted', prompt })),
38
- login.completion.then(() => ({ state: 'completed' }), () => ({ state: 'failed' }))
39
- ]);
40
- if (outcome.state === 'completed') {
41
- return this.assistantResult('authenticated', null, `DataBasin ${this.profile.label} sign-in is complete.`);
42
- }
43
- if (outcome.state === 'failed') {
44
- return this.assistantResult('failed', null, `DataBasin ${this.profile.label} sign-in did not complete. Call databasin_login to try again.`);
45
- }
46
- return this.assistantResult('pending', outcome.prompt.verificationUri, `Open the Microsoft sign-in URL on any device and enter code ${outcome.prompt.userCode}. Then call databasin_auth_status.`, outcome.prompt.userCode, login.expiresAt);
47
- }
48
- cancelPendingLogin() {
49
- this.activeLogin?.cancel();
50
- }
51
- async getLoginStatus() {
52
- if (this.activeLogin)
53
- return this.pendingAssistantResult(this.activeLogin);
54
- const authenticated = await this.cachedAssistantResult();
55
- if (authenticated)
56
- return authenticated;
57
- if (this.lastLoginFailed)
58
- return this.failedAssistantResult();
59
- return this.assistantResult('not_authenticated', null, `DataBasin ${this.profile.label} is not signed in. Call databasin_login to begin.`);
60
- }
61
- pendingAssistantResult(login) {
62
- const message = login.prompt
63
- ? `Open the Microsoft sign-in URL on any device and enter code ${login.prompt.userCode}.`
64
- : 'Microsoft is preparing the device sign-in instructions.';
65
- return this.assistantResult('pending', login.prompt?.verificationUri ?? null, message, login.prompt?.userCode, login.expiresAt);
66
- }
67
- async cachedAssistantResult() {
68
- const cachedStatus = await this.status();
69
- if (!cachedStatus.authenticated)
70
- return undefined;
71
- try {
72
- await this.getAccessToken();
73
- return this.assistantResult('authenticated', null, `DataBasin ${this.profile.label} is signed in.`);
74
- }
75
- catch (error) {
76
- if (error instanceof DataBasinError && error.code === 'UNAUTHENTICATED')
77
- return undefined;
78
- throw error;
79
- }
80
- }
81
- failedAssistantResult() {
82
- return this.assistantResult('failed', null, `DataBasin ${this.profile.label} sign-in did not complete. Call databasin_login to try again.`);
83
- }
84
- beginDeviceLogin() {
85
- if (this.activeLogin)
86
- return this.activeLogin;
87
- this.lastLoginFailed = false;
88
- let resolvePrompted = () => undefined;
89
- let cancelRequested = false;
90
- let deviceRequest;
91
- const login = {
92
- prompted: new Promise((resolve) => {
93
- resolvePrompted = resolve;
94
- }),
95
- completion: Promise.resolve({ authenticated: false, environment: this.profile.environment }),
96
- prompt: undefined,
97
- expiresAt: undefined,
98
- cancel: () => {
99
- cancelRequested = true;
100
- if (deviceRequest)
101
- deviceRequest.cancel = true;
102
- }
103
- };
104
- login.completion = this.performDeviceLogin((prompt) => {
105
- login.prompt = prompt;
106
- login.expiresAt = new Date(this.now() + prompt.expiresIn * 1_000).toISOString();
107
- resolvePrompted(prompt);
108
- }, (request) => {
109
- deviceRequest = request;
110
- if (cancelRequested)
111
- request.cancel = true;
112
- }).catch((error) => {
113
- this.lastLoginFailed = true;
114
- throw error;
115
- }).finally(() => {
116
- if (this.activeLogin === login)
117
- this.activeLogin = undefined;
118
- });
119
- this.activeLogin = login;
120
- void login.completion.catch(() => undefined);
121
- return login;
122
- }
123
- async performDeviceLogin(onPrompt, onRequest) {
124
- const client = await this.client();
125
- let result;
126
- try {
127
- const request = {
128
- scopes: [...this.profile.scopes],
129
- timeout: 900,
130
- cancel: false,
131
- deviceCodeCallback: (response) => onPrompt(projectDevicePrompt(response))
132
- };
133
- onRequest(request);
134
- result = await client.acquireTokenByDeviceCode(request);
135
- }
136
- catch {
137
- throw new DataBasinError('UNAUTHENTICATED', `DataBasin ${this.profile.label} sign-in did not complete.`);
138
- }
139
- return this.completeLogin(client, result);
140
- }
141
- async performInteractiveLogin(openBrowser) {
142
- const client = await this.client();
143
- let result;
144
- try {
145
- result = await client.acquireTokenInteractive({
146
- scopes: [...this.profile.scopes],
147
- openBrowser: async (url) => openBrowser(validateInteractiveLoginUrl(url, this.profile)),
148
- prompt: 'select_account',
149
- successTemplate: successPage(this.profile.label),
150
- errorTemplate: errorPage()
151
- });
152
- }
153
- catch {
154
- throw new DataBasinError('UNAUTHENTICATED', `DataBasin ${this.profile.label} sign-in did not complete.`);
155
- }
156
- return this.completeLogin(client, result);
157
- }
158
- async completeLogin(client, result) {
159
- validateAccessTokenResult(result, this.profile, this.now());
160
- const account = result.account;
161
- const accounts = await client.getAllAccounts();
162
- await Promise.all(accounts
163
- .filter((cachedAccount) => cachedAccount.homeAccountId !== account.homeAccountId)
164
- .map((account) => client.signOut({ account })));
165
- return {
166
- authenticated: true,
167
- environment: this.profile.environment,
168
- username: account.username
169
- };
170
- }
171
- assistantResult(status, loginUrl, message, userCode, expiresAt) {
172
- if (status !== 'pending') {
173
- return { status, environment: this.profile.environment, loginUrl: null, message };
174
- }
175
- return {
176
- status,
177
- environment: this.profile.environment,
178
- loginUrl,
179
- ...(userCode ? { userCode } : {}),
180
- ...(expiresAt ? { expiresAt } : {}),
181
- message
182
- };
183
- }
184
- async logout() {
185
- const client = await this.client();
186
- const accounts = await client.getAllAccounts();
187
- await Promise.all(accounts.map((account) => client.signOut({ account })));
188
- return accounts.length;
189
- }
190
- async status() {
191
- const accounts = await (await this.client()).getAllAccounts();
192
- const account = selectAccount(accounts, this.profile);
193
- return account
194
- ? { authenticated: true, environment: this.profile.environment, username: account.username }
195
- : { authenticated: false, environment: this.profile.environment };
196
- }
197
- async acquireSilent() {
198
- const client = await this.client();
199
- const account = selectAccount(await client.getAllAccounts(), this.profile);
200
- if (!account)
201
- throw new LoginRequiredError(this.profile.environment);
202
- try {
203
- const result = await client.acquireTokenSilent({ account, scopes: [...this.profile.scopes] });
204
- return validateAccessTokenResult(result, this.profile, this.now());
205
- }
206
- catch (error) {
207
- if (error instanceof InteractionRequiredAuthError) {
208
- throw new LoginRequiredError(this.profile.environment);
209
- }
210
- throw new DataBasinError('UNAUTHENTICATED', `The DataBasin ${this.profile.label} session could not be refreshed. Sign in again.`);
211
- }
212
- }
213
- client() {
214
- this.clientPromise ??= this.createClient().catch((error) => {
215
- this.clientPromise = undefined;
216
- const detail = error instanceof Error && error.message.includes('libsecret')
217
- ? ' Install or unlock the system keyring and try again.'
218
- : '';
219
- throw new DataBasinError('UNAUTHENTICATED', `Secure DataBasin credential storage is unavailable.${detail}`);
220
- });
221
- return this.clientPromise;
222
- }
223
- }
224
- function selectAccount(accounts, profile) {
225
- return accounts.find((account) => accountMatchesProfile(account, profile));
226
- }
227
- function successPage(label) {
228
- return `<!doctype html><html><body><h1>DataBasin sign-in complete</h1><p>You are signed in to ${label}. You can close this window.</p></body></html>`;
10
+ this.provider = profile.auth0
11
+ ? new Auth0Manager(profile, profile.auth0, options.auth0)
12
+ : new EntraAuthManager(profile, options.entra);
13
+ }
14
+ getAccessToken() { return this.provider.getAccessToken(); }
15
+ login() { return this.provider.login(); }
16
+ startLogin() { return this.provider.startLogin(); }
17
+ getLoginStatus() { return this.provider.getLoginStatus(); }
18
+ cancelPendingLogin() { this.provider.cancelPendingLogin(); }
19
+ logout() { return this.provider.logout(); }
20
+ status() { return this.provider.status(); }
229
21
  }
230
- function errorPage() {
231
- return '<!doctype html><html><body><h1>DataBasin sign-in failed</h1><p>Return to your assistant or terminal and try again.</p></body></html>';
232
- }
233
- export { createSecurePublicClient } from './credential-store.js';
234
22
  //# sourceMappingURL=auth.js.map
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAA2C,MAAM,iBAAiB,CAAC;AAI5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGjE,yFAAyF;AACzF,MAAM,OAAO,WAAW;IAED;IADJ,QAAQ,CAAkC;IAC3D,YAAqB,OAAyB,EAAE,UAA8B,EAAE;QAA3D,YAAO,GAAP,OAAO,CAAkB;QAC5C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK;YAC3B,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;YACzD,CAAC,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IACD,cAAc,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACzC,UAAU,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACnD,cAAc,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC3D,kBAAkB,KAAK,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;CAC5C"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ import type { DataBasinEnvironment } from './config.js';
3
+ export declare const Auth0SessionSchema: z.ZodObject<{
4
+ accessToken: z.ZodString;
5
+ refreshToken: z.ZodOptional<z.ZodString>;
6
+ expiresAt: z.ZodNumber;
7
+ }, z.core.$strict>;
8
+ export type Auth0Session = z.infer<typeof Auth0SessionSchema>;
9
+ export interface Auth0Store {
10
+ transact<T>(operation: (session: Auth0Session | null, save: (next: Auth0Session | null) => Promise<void>) => Promise<T>): Promise<T>;
11
+ }
12
+ /** Separate OS-protected records and cross-process locks for each provider/client/environment. */
13
+ export declare function createAuth0Store(environment: DataBasinEnvironment, issuer: string, clientId: string, audience: string): Promise<Auth0Store>;
14
+ //# sourceMappingURL=auth0-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth0-store.d.ts","sourceRoot":"","sources":["../src/auth0-store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,kBAAkB;;;;kBAIpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACtI;AAED,kGAAkG;AAClG,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,oBAAoB,EACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAwDrB"}
@@ -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"}