@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.
package/README.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # DataBasin MCP Client
2
2
 
3
- Local stdio MCP proxy for DataBasin. It keeps Microsoft Entra credentials in the OS-protected MSAL cache and connects to DataBasin's true Streamable HTTP MCP endpoint with the official MCP SDK.
3
+ Local stdio MCP proxy for DataBasin. It uses Auth0 device sign-in, keeps tokens in OS-protected credential storage, and connects to DataBasin's Streamable HTTP MCP endpoint with the official MCP SDK.
4
4
 
5
5
  Production is the default. The non-production profile is selected with `--environment np`.
6
6
 
7
- ## Version 0.2.0 production release
7
+ ## Version 0.2.1 authentication fix
8
8
 
9
- Version `0.2.0` replaces the legacy REST adapter with a true MCP proxy for the deployed production server, including support tickets and notifications. Upgrade clients pinned to `0.1.0` or `0.2.0-beta.1`; those versions do not implement this transport. Production is the default:
9
+ Version `0.2.1` adds Auth0 login using the providers enabled for the DataBasin MCP native application. Version `0.2.0` supported only direct Microsoft Entra login; its cached sessions do not establish an Auth0 login. After upgrading, sign in again. Existing Entra credentials are neither reused nor deleted. The true MCP transport, support tickets, and notifications remain unchanged. Production is the default:
10
10
 
11
11
  ```bash
12
- npx -y @databasin/mcp-client@0.2.0 doctor
13
- npx -y @databasin/mcp-client@0.2.0 login
12
+ npx -y @databasin/mcp-client@0.2.1 doctor
13
+ npx -y @databasin/mcp-client@0.2.1 login
14
14
  ```
15
15
 
16
16
  The client requires Node.js 22.20+ or Node.js 24 and an available OS-protected credential store. `doctor` reports the selected fixed profile, runtime support, credential-store availability, and sign-in state; it never prints account identity, tokens, or credentials.
@@ -19,8 +19,8 @@ For non-production, use the same stable package with the NP profile:
19
19
 
20
20
  | Host | NP setup |
21
21
  | --- | --- |
22
- | Codex | `codex mcp add databasin-np -- npx -y @databasin/mcp-client@0.2.0 --environment np` |
23
- | Claude Code | `claude mcp add --transport stdio --scope user databasin-np -- npx -y @databasin/mcp-client@0.2.0 --environment np` |
22
+ | Codex | `codex mcp add databasin-np -- npx -y @databasin/mcp-client@0.2.1 --environment np` |
23
+ | Claude Code | `claude mcp add --transport stdio --scope user databasin-np -- npx -y @databasin/mcp-client@0.2.1 --environment np` |
24
24
  | Claude Desktop / Cursor-compatible config | Use the `mcpServers` JSON below |
25
25
  | VS Code | Use the `servers` JSON below in user or workspace `mcp.json` |
26
26
  | OpenCode v2 | Use the `mcp.servers` JSON below in `opencode.jsonc` |
@@ -33,7 +33,7 @@ Claude Desktop and other hosts that accept the common `mcpServers` shape:
33
33
  "databasin-np": {
34
34
  "type": "stdio",
35
35
  "command": "npx",
36
- "args": ["-y", "@databasin/mcp-client@0.2.0", "--environment", "np"]
36
+ "args": ["-y", "@databasin/mcp-client@0.2.1", "--environment", "np"]
37
37
  }
38
38
  }
39
39
  }
@@ -47,7 +47,7 @@ VS Code `mcp.json`:
47
47
  "databasinNp": {
48
48
  "type": "stdio",
49
49
  "command": "npx",
50
- "args": ["-y", "@databasin/mcp-client@0.2.0", "--environment", "np"]
50
+ "args": ["-y", "@databasin/mcp-client@0.2.1", "--environment", "np"]
51
51
  }
52
52
  }
53
53
  }
@@ -62,7 +62,7 @@ OpenCode v2 `opencode.jsonc`:
62
62
  "servers": {
63
63
  "databasin-np": {
64
64
  "type": "local",
65
- "command": ["npx", "-y", "@databasin/mcp-client@0.2.0", "--environment", "np"]
65
+ "command": ["npx", "-y", "@databasin/mcp-client@0.2.1", "--environment", "np"]
66
66
  }
67
67
  }
68
68
  }
@@ -107,11 +107,13 @@ To use non-production:
107
107
  npx -y @databasin/mcp-client --environment np
108
108
  ```
109
109
 
110
- The assistant can call `databasin_login` and give you the short-lived Microsoft device URL and code. Enter credentials only on Microsoft’s page. The client never sends credentials or tokens through MCP tool output.
110
+ The assistant can call `databasin_login` and give you the DataBasin Auth0 activation URL and a short-lived user code. Enter credentials only on the sign-in page or the identity provider it redirects you to. The client never sends credentials or tokens through MCP tool output.
111
111
 
112
- Device login output is restricted to the HTTPS `microsoft.com/devicelogin` endpoint (with an optional trailing slash, canonicalized away). Interactive CLI login is restricted to the configured tenant’s exact `login.microsoftonline.com/<tenant>/oauth2/v2.0/authorize` path and client ID. Credential-bearing URLs, redirects to other hosts, other schemes, ports, fragments, and unexpected paths fail closed before a URL is opened or returned. Raw MSAL device codes, polling intervals/handles, and provider messages are discarded immediately; only the validated verification URL, human-entered user code, and expiry are retained.
112
+ Auth0 login output is restricted to `https://databasin.us.auth0.com/activate`; both CLI and assistant login use device authorization. Raw device codes and tokens remain private to the client. Authentication requests reject redirects; unexpected login hosts, schemes, paths, queries, ports, and fragments are rejected. No callback URL, client secret, or password is configured in the plugin.
113
113
 
114
- Before using an MSAL access token, the client fail-closes on its tenant, issuer, audience, delegated scope, timing, authority, account, and expiry metadata. JWT payload decoding here is local defense-in-depth, not signature verification; the DataBasin API remains the cryptographic validation and authorization boundary.
114
+ Auth0 access tokens undergo RS256 signature verification against the pinned tenant JWKS, plus issuer, environment-specific API audience, authorized client, subject, and expiry checks. Refresh tokens are stored only in the OS-protected store, separately by provider, environment, client, and audience. Refresh-token rotation is serialized across processes. Logout clears this client's local Auth0 session and cancels pending login; it does not sign out the website or erase legacy Entra sessions. The server independently validates tokens and authorizes every product operation. Entra support remains available in the code for explicitly configured non-Auth0 profiles; built-in hosted profiles do not silently fall back to it.
115
+
116
+ Automatic renewal requires both the native application's Refresh Token grant and the API's Allow Offline Access setting. The client requests `offline_access`; if Auth0 does not issue a refresh token, it requires sign-in again when the access token expires. It does not silently substitute another provider or keep expired credentials working.
115
117
 
116
118
  ## Tools
117
119
 
@@ -131,7 +133,7 @@ The production server currently exposes twenty product tools, plus this client's
131
133
 
132
134
  Support tools are also discovered: `databasin_get_support_context`, `databasin_list_support_tickets`, `databasin_get_support_ticket`, `databasin_create_support_ticket`, `databasin_add_support_ticket_message`, `databasin_update_support_ticket`, `databasin_list_support_notifications`, `databasin_mark_support_notification_read`, and `databasin_mark_all_support_notifications_read`. Support operations include writes; follow their server-owned schemas and annotations. Ticket/message data includes authorized email fields, and optional values may be null.
133
135
 
134
- The other two tools, `databasin_auth_status` and `databasin_login`, are client-local authentication helpers. They interact only with the local MSAL credential manager and Microsoft sign-in; they are not part of the remote product catalog.
136
+ The other two tools, `databasin_auth_status` and `databasin_login`, are client-local authentication helpers. They interact with Auth0 and the OS credential store; they are not part of the remote product catalog.
135
137
 
136
138
  No organization configuration is required. Unscoped `databasin_get_context` and `databasin_search` discover metadata only across organizations the signed-in user is authorized to access. A project-scoped search must include its `institutionId`; account discovery is not a wildcard and never broadens server-side authorization.
137
139
 
@@ -171,9 +173,9 @@ npm run verify:package
171
173
  Release qualification uses an exact local tarball, never a mutable dist-tag. After `npm pack`, an authorized tester with an existing production session can run the read-only qualification:
172
174
 
173
175
  ```bash
174
- DATABASIN_MCP_TARBALL=./databasin-mcp-client-0.2.0.tgz npm run qualify:package
176
+ DATABASIN_MCP_TARBALL=./databasin-mcp-client-0.2.1.tgz npm run qualify:package
175
177
  ```
176
178
 
177
179
  Set `DATABASIN_MCP_QUALIFY_ENVIRONMENT=np` to qualify against NP instead. This check installs the exact artifact in a temporary directory, starts its stdio executable, checks local sign-in and the twenty-two-tool inventory, and calls only context/search/support read operations. It never creates agent jobs, executes SQL, or changes support data, and does not print credentials or business content. The old `qualify:np` script remains only for historical beta lifecycle qualification.
178
180
 
179
- Release approval still requires proof of the Entra registration, tenant, issuer, audience, delegated scope, and wrong-claim rejection behavior for each environment.
181
+ An authentication release requires a fresh Auth0 device login, signed-token validation, secure persistence across client restarts, refresh-token renewal, and authorized MCP calls against the target environment. Cached Microsoft sessions and mocked login tests are not substitutes for this release gate. Qualifying production does not claim that non-production login or every enabled identity provider was tested.
@@ -1,11 +1,11 @@
1
1
  import { z } from 'zod';
2
- import { validateDeviceLoginUrl } from './login-url.js';
2
+ import { validateAssistantLoginUrl } from './login-url.js';
3
3
  const authEnvironment = z.enum(['prod', 'np']);
4
4
  const URL_LIKE_AUTH_MESSAGE = /(?:\b(?:https?|hxxps?|ftp|file|data|javascript)\s*:\s*(?:[/\\]\s*){0,2}|\bwww\s*(?:\.|\[\.\]|\(\.\))|(?:\b|@)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.|\[\.\]|\(\.\)))+[a-z]{2,63}(?=\b|[/:?#])|\b(?:localhost|(?:\d{1,3}\.){3}\d{1,3})(?=[:/\s]|$))/iu;
5
5
  const authMessage = z.string().max(1_000).refine((value) => !URL_LIKE_AUTH_MESSAGE.test(normalizeAuthMessage(value)), 'The authentication message was rejected.');
6
6
  const safeDeviceLoginUrl = z.string().max(4_096).superRefine((value, context) => {
7
7
  try {
8
- validateDeviceLoginUrl(value);
8
+ validateAssistantLoginUrl(value);
9
9
  }
10
10
  catch {
11
11
  context.addIssue({ code: 'custom', message: 'The authentication result was rejected.' });
@@ -1 +1 @@
1
- {"version":3,"file":"auth-schema.js","sourceRoot":"","sources":["../src/auth-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/C,MAAM,qBAAqB,GACzB,2PAA2P,CAAC;AAE9P,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EACnE,0CAA0C,CAC3C,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9E,IAAI,CAAC;QACH,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACtE,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAC5B,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE;QACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;QACnE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QACtC,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC,MAAM,EAAE;IACX,GAAI,CAAC,eAAe,EAAE,mBAAmB,EAAE,QAAQ,CAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACtF,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;QAC9B,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;QAC/B,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC,MAAM,EAAE,CAAC;CACb,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC1C,IAAI,SAAS,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,IAAI,SAAS,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;QAClG,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yDAAyD,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpG,CAAC"}
1
+ {"version":3,"file":"auth-schema.js","sourceRoot":"","sources":["../src/auth-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/C,MAAM,qBAAqB,GACzB,2PAA2P,CAAC;AAE9P,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EACnE,0CAA0C,CAC3C,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9E,IAAI,CAAC;QACH,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACtE,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAC5B,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE;QACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;QACnE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QACtC,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC,MAAM,EAAE;IACX,GAAI,CAAC,eAAe,EAAE,mBAAmB,EAAE,QAAQ,CAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACtF,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;QAC9B,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;QAC/B,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC,MAAM,EAAE,CAAC;CACb,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC1C,IAAI,SAAS,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,IAAI,SAAS,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;QAClG,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yDAAyD,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpG,CAAC"}
@@ -19,7 +19,7 @@ export function registerAuthTools(server, auth) {
19
19
  }, async (_input, context) => authToolResult(() => auth.getLoginStatus(), context));
20
20
  server.registerTool(LOCAL_AUTH_TOOL_NAMES[1], {
21
21
  title: 'Sign in to DataBasin',
22
- description: 'Start Microsoft device sign-in. Enter credentials only on Microsoft\'s page; never provide credentials in chat.',
22
+ description: 'Start DataBasin device sign-in. Enter credentials only on the approved sign-in page; never provide credentials in chat.',
23
23
  inputSchema: emptyInput,
24
24
  outputSchema: AssistantAuthOutputSchema,
25
25
  annotations: { ...annotations, readOnlyHint: false, openWorldHint: true }
@@ -48,8 +48,8 @@ async function authToolResult(operation, _context) {
48
48
  function authOutputMessage(output) {
49
49
  if (output.status === 'pending') {
50
50
  return output.loginUrl === null
51
- ? 'Microsoft is preparing the device sign-in instructions.'
52
- : 'Microsoft device sign-in is ready. Use the approved login URL and user code, then call databasin_auth_status.';
51
+ ? 'DataBasin is preparing the device sign-in instructions.'
52
+ : 'DataBasin device sign-in is ready. Use the approved login URL and user code, then call databasin_auth_status.';
53
53
  }
54
54
  if (output.status === 'authenticated')
55
55
  return 'DataBasin sign-in is complete.';
@@ -1 +1 @@
1
- {"version":3,"file":"auth-tools.js","sourceRoot":"","sources":["../src/auth-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-tools.js","sourceRoot":"","sources":["../src/auth-tools.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts CHANGED
@@ -1,84 +1,23 @@
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
- }
1
+ import { type Auth0Options } from './auth0.js';
2
+ import { type AuthManagerOptions as EntraOptions } from './entra-auth.js';
3
+ import type { DataBasinProfile } from './config.js';
4
+ export type { AuthStatus, AssistantAuthState, AssistantAuthResult, PublicClientLike } from './entra-auth.js';
5
+ export { createSecurePublicClient } from './credential-store.js';
50
6
  export interface AuthManagerOptions {
51
- createClient?: () => Promise<PublicClientLike>;
52
- openBrowser?: (url: string) => Promise<void>;
53
- now?: () => number;
7
+ auth0?: Auth0Options;
8
+ entra?: EntraOptions;
54
9
  }
10
+ /** Use the configured provider. Never treat a cached Entra login as an Auth0 session. */
55
11
  export declare class AuthManager {
56
12
  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;
13
+ private readonly provider;
64
14
  constructor(profile: DataBasinProfile, options?: AuthManagerOptions);
65
15
  getAccessToken(): Promise<string>;
66
- login(): Promise<AuthStatus>;
67
- startLogin(): Promise<AssistantAuthResult>;
16
+ login(): Promise<import("./entra-auth.js").AuthStatus>;
17
+ startLogin(): Promise<import("./entra-auth.js").AssistantAuthResult>;
18
+ getLoginStatus(): Promise<import("./entra-auth.js").AssistantAuthResult>;
68
19
  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
20
  logout(): Promise<number>;
79
- status(): Promise<AuthStatus>;
80
- private acquireSilent;
81
- private client;
21
+ status(): Promise<import("./entra-auth.js").AuthStatus>;
82
22
  }
83
- export { createSecurePublicClient } from './credential-store.js';
84
23
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAoB,KAAK,kBAAkB,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7G,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,MAAM,WAAW,kBAAkB;IAAG,KAAK,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE;AAElF,yFAAyF;AACzF,qBAAa,WAAW;IAEV,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAD9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;gBACtC,OAAO,EAAE,gBAAgB,EAAE,OAAO,GAAE,kBAAuB;IAKhF,cAAc;IACd,KAAK;IACL,UAAU;IACV,cAAc;IACd,kBAAkB;IAClB,MAAM;IACN,MAAM;CACP"}
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"}