@databasin/mcp-client 0.1.0 → 0.2.0
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 +132 -61
- package/dist/auth-schema.d.ts +23 -0
- package/dist/auth-schema.d.ts.map +1 -0
- package/dist/auth-schema.js +42 -0
- package/dist/auth-schema.js.map +1 -0
- package/dist/auth-tools.d.ts +10 -0
- package/dist/auth-tools.d.ts.map +1 -0
- package/dist/auth-tools.js +60 -0
- package/dist/auth-tools.js.map +1 -0
- package/dist/auth.d.ts +22 -11
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +71 -71
- package/dist/auth.js.map +1 -1
- package/dist/browser.d.ts +20 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +19 -17
- package/dist/browser.js.map +1 -1
- package/dist/cli.d.ts +31 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +148 -67
- package/dist/cli.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/correlation.d.ts +6 -0
- package/dist/correlation.d.ts.map +1 -0
- package/dist/correlation.js +15 -0
- package/dist/correlation.js.map +1 -0
- package/dist/credential-store.d.ts +21 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +46 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/errors.d.ts +17 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +24 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/login-url.d.ts +18 -0
- package/dist/login-url.d.ts.map +1 -0
- package/dist/login-url.js +82 -0
- package/dist/login-url.js.map +1 -0
- package/dist/mcp-endpoint.d.ts +5 -0
- package/dist/mcp-endpoint.d.ts.map +1 -0
- package/dist/mcp-endpoint.js +22 -0
- package/dist/mcp-endpoint.js.map +1 -0
- package/dist/proxy-tools.d.ts +5 -0
- package/dist/proxy-tools.d.ts.map +1 -0
- package/dist/proxy-tools.js +39 -0
- package/dist/proxy-tools.js.map +1 -0
- package/dist/remote-mcp.d.ts +27 -0
- package/dist/remote-mcp.d.ts.map +1 -0
- package/dist/remote-mcp.js +70 -0
- package/dist/remote-mcp.js.map +1 -0
- package/dist/safety.d.ts +4 -0
- package/dist/safety.d.ts.map +1 -1
- package/dist/safety.js +94 -10
- package/dist/safety.js.map +1 -1
- package/dist/server.d.ts +4 -6
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +32 -15
- package/dist/server.js.map +1 -1
- package/dist/token-validation.d.ts +5 -0
- package/dist/token-validation.d.ts.map +1 -0
- package/dist/token-validation.js +183 -0
- package/dist/token-validation.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -7
- package/dist/api-client.d.ts +0 -43
- package/dist/api-client.d.ts.map +0 -1
- package/dist/api-client.js +0 -154
- package/dist/api-client.js.map +0 -1
- package/dist/mappers.d.ts +0 -56
- package/dist/mappers.d.ts.map +0 -1
- package/dist/mappers.js +0 -171
- package/dist/mappers.js.map +0 -1
- package/dist/schemas.d.ts +0 -154
- package/dist/schemas.d.ts.map +0 -1
- package/dist/schemas.js +0 -102
- package/dist/schemas.js.map +0 -1
- package/dist/tools.d.ts +0 -17
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -117
- package/dist/tools.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,91 +1,152 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { realpathSync } from 'node:fs';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { AuthManager } from './auth.js';
|
|
4
5
|
import { getProfile, resolveEnvironment } from './config.js';
|
|
5
|
-
import {
|
|
6
|
+
import { mcpEndpointForProfile } from './mcp-endpoint.js';
|
|
7
|
+
import { serveDataBasinStdio } from './server.js';
|
|
6
8
|
import { VERSION } from './version.js';
|
|
9
|
+
const COMMAND_FLAGS = Object.freeze({
|
|
10
|
+
'--help': 'help',
|
|
11
|
+
'-h': 'help',
|
|
12
|
+
'--version': 'version',
|
|
13
|
+
'-v': 'version'
|
|
14
|
+
});
|
|
7
15
|
export function parseCliArgs(args) {
|
|
8
|
-
|
|
9
|
-
let commandSet = false;
|
|
10
|
-
let environmentValue;
|
|
16
|
+
const state = { command: 'serve', commandSet: false };
|
|
11
17
|
for (let index = 0; index < args.length; index += 1) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
18
|
+
index = consumeArgument(args, index, state);
|
|
19
|
+
}
|
|
20
|
+
return { command: state.command, environment: resolveEnvironment(state.environmentValue) };
|
|
21
|
+
}
|
|
22
|
+
function consumeArgument(args, index, state) {
|
|
23
|
+
const argument = args[index];
|
|
24
|
+
const environment = parseEnvironmentArgument(args, index);
|
|
25
|
+
if (environment) {
|
|
26
|
+
state.environmentValue = environment.value;
|
|
27
|
+
return environment.lastIndex;
|
|
28
|
+
}
|
|
29
|
+
const flagCommand = COMMAND_FLAGS[argument];
|
|
30
|
+
if (flagCommand) {
|
|
31
|
+
state.command = flagCommand;
|
|
32
|
+
state.commandSet = true;
|
|
33
|
+
return index;
|
|
34
|
+
}
|
|
35
|
+
if (!state.commandSet && isCommand(argument)) {
|
|
36
|
+
state.command = argument;
|
|
37
|
+
state.commandSet = true;
|
|
38
|
+
return index;
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Unknown argument "${argument}".`);
|
|
41
|
+
}
|
|
42
|
+
function parseEnvironmentArgument(args, index) {
|
|
43
|
+
const argument = args[index];
|
|
44
|
+
if (argument === '--environment' || argument === '-e') {
|
|
45
|
+
const value = args[index + 1];
|
|
46
|
+
if (!value)
|
|
47
|
+
throw new Error(`${argument} requires prod or np.`);
|
|
48
|
+
return { value, lastIndex: index + 1 };
|
|
49
|
+
}
|
|
50
|
+
if (!argument.startsWith('--environment='))
|
|
51
|
+
return undefined;
|
|
52
|
+
const value = argument.slice('--environment='.length);
|
|
53
|
+
if (!value)
|
|
54
|
+
throw new Error('--environment requires prod or np.');
|
|
55
|
+
return { value, lastIndex: index };
|
|
42
56
|
}
|
|
43
|
-
export async function runCli(args) {
|
|
57
|
+
export async function runCli(args, dependencies = DEFAULT_DEPENDENCIES) {
|
|
44
58
|
const options = parseCliArgs(args);
|
|
45
59
|
if (options.command === 'help') {
|
|
46
|
-
|
|
60
|
+
dependencies.writeOutput(helpText());
|
|
47
61
|
return;
|
|
48
62
|
}
|
|
49
63
|
if (options.command === 'version') {
|
|
50
|
-
|
|
64
|
+
dependencies.writeOutput(`${VERSION}\n`);
|
|
51
65
|
return;
|
|
52
66
|
}
|
|
53
|
-
const profile = getProfile(options.environment);
|
|
54
67
|
if (options.command === 'serve') {
|
|
55
|
-
|
|
56
|
-
const handle = serveDataBasinStdio({ profile });
|
|
57
|
-
let closing = false;
|
|
58
|
-
const close = async () => {
|
|
59
|
-
if (closing)
|
|
60
|
-
return;
|
|
61
|
-
closing = true;
|
|
62
|
-
await handle.close();
|
|
63
|
-
};
|
|
64
|
-
process.once('SIGINT', () => void close());
|
|
65
|
-
process.once('SIGTERM', () => void close());
|
|
68
|
+
await runServer(options.environment, dependencies);
|
|
66
69
|
return;
|
|
67
70
|
}
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
await runAuthCommand(options, dependencies);
|
|
72
|
+
}
|
|
73
|
+
async function runServer(environment, dependencies) {
|
|
74
|
+
const handle = await dependencies.serve(environment);
|
|
75
|
+
let closing = false;
|
|
76
|
+
const close = async () => {
|
|
77
|
+
if (closing)
|
|
78
|
+
return;
|
|
79
|
+
closing = true;
|
|
80
|
+
await handle.close();
|
|
81
|
+
};
|
|
82
|
+
dependencies.onceSignal('SIGINT', () => void close());
|
|
83
|
+
dependencies.onceSignal('SIGTERM', () => void close());
|
|
84
|
+
}
|
|
85
|
+
async function runAuthCommand(options, dependencies) {
|
|
86
|
+
const profile = getProfile(options.environment);
|
|
87
|
+
const auth = await dependencies.createAuth(profile.environment);
|
|
70
88
|
if (options.command === 'login') {
|
|
71
89
|
const status = await auth.login();
|
|
72
|
-
|
|
90
|
+
dependencies.writeOutput(`Signed in to DataBasin ${profile.label}${usernameSuffix(status.username)}.\n`);
|
|
73
91
|
return;
|
|
74
92
|
}
|
|
75
93
|
if (options.command === 'logout') {
|
|
76
94
|
const count = await auth.logout();
|
|
77
|
-
|
|
95
|
+
dependencies.writeOutput(count > 0
|
|
78
96
|
? `Signed out of DataBasin ${profile.label}.\n`
|
|
79
97
|
: `No DataBasin ${profile.label} session was stored.\n`);
|
|
80
98
|
return;
|
|
81
99
|
}
|
|
100
|
+
if (options.command === 'doctor') {
|
|
101
|
+
await runDoctor(profile, auth, dependencies);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
82
104
|
const status = await auth.status();
|
|
83
|
-
|
|
84
|
-
? `Signed in to DataBasin ${profile.label}${status.username
|
|
105
|
+
dependencies.writeOutput(status.authenticated
|
|
106
|
+
? `Signed in to DataBasin ${profile.label}${usernameSuffix(status.username)}.\n`
|
|
85
107
|
: `Not signed in to DataBasin ${profile.label}. Run: npx @databasin/mcp-client login${profile.environment === 'prod' ? '' : ` --environment ${profile.environment}`}\n`);
|
|
86
108
|
}
|
|
109
|
+
async function runDoctor(profile, auth, dependencies) {
|
|
110
|
+
const runtimeVersion = dependencies.runtimeVersion ?? process.versions.node;
|
|
111
|
+
const runtimePlatform = dependencies.runtimePlatform ?? process.platform;
|
|
112
|
+
const supported = isSupportedNodeVersion(runtimeVersion);
|
|
113
|
+
const lines = [
|
|
114
|
+
`DataBasin MCP doctor ${VERSION}`,
|
|
115
|
+
`Environment: ${profile.label} (${profile.environment})`,
|
|
116
|
+
`Node.js: ${runtimeVersion} (${supported ? 'supported' : 'unsupported'})`,
|
|
117
|
+
`Platform: ${runtimePlatform}`,
|
|
118
|
+
`MCP endpoint: ${mcpEndpointForProfile(profile)}`
|
|
119
|
+
];
|
|
120
|
+
try {
|
|
121
|
+
const status = await auth.status();
|
|
122
|
+
lines.push('Secure credential storage: available');
|
|
123
|
+
lines.push(`Authentication: ${status.authenticated ? 'signed in' : 'sign-in required'}`);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
lines.push('Secure credential storage: unavailable');
|
|
127
|
+
lines.push('Result: blocked');
|
|
128
|
+
dependencies.writeOutput(`${lines.join('\n')}\n`);
|
|
129
|
+
throw new Error('DataBasin MCP requires an available OS-protected credential store.');
|
|
130
|
+
}
|
|
131
|
+
lines.push(`Result: ${supported ? 'ready' : 'blocked'}`);
|
|
132
|
+
dependencies.writeOutput(`${lines.join('\n')}\n`);
|
|
133
|
+
if (!supported) {
|
|
134
|
+
throw new Error('DataBasin MCP requires Node.js 22.20+ or Node.js 24.');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export function isSupportedNodeVersion(version) {
|
|
138
|
+
const match = /^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/u.exec(version);
|
|
139
|
+
if (!match)
|
|
140
|
+
return false;
|
|
141
|
+
const major = Number(match[1]);
|
|
142
|
+
const minor = Number(match[2]);
|
|
143
|
+
return major === 24 || major === 22 && minor >= 20;
|
|
144
|
+
}
|
|
145
|
+
function usernameSuffix(username) {
|
|
146
|
+
return username ? ` as ${username}` : '';
|
|
147
|
+
}
|
|
87
148
|
function isCommand(value) {
|
|
88
|
-
return value === 'serve' || value === 'login' || value === 'logout' || value === 'status' || value === 'help' || value === 'version';
|
|
149
|
+
return value === 'serve' || value === 'login' || value === 'logout' || value === 'status' || value === 'doctor' || value === 'help' || value === 'version';
|
|
89
150
|
}
|
|
90
151
|
function helpText() {
|
|
91
152
|
return `DataBasin local MCP client ${VERSION}
|
|
@@ -95,6 +156,7 @@ Usage:
|
|
|
95
156
|
databasin-mcp login Sign in to production
|
|
96
157
|
databasin-mcp logout Remove the production session
|
|
97
158
|
databasin-mcp status Show production sign-in status
|
|
159
|
+
databasin-mcp doctor Check runtime, profile, and credential storage
|
|
98
160
|
databasin-mcp <command> -e np Use the non-production environment
|
|
99
161
|
|
|
100
162
|
Commands:
|
|
@@ -102,6 +164,7 @@ Commands:
|
|
|
102
164
|
login Open Microsoft sign-in in the system browser
|
|
103
165
|
logout Remove the locally cached DataBasin session
|
|
104
166
|
status Show whether a session is available
|
|
167
|
+
doctor Check this host without printing account identity or credentials
|
|
105
168
|
|
|
106
169
|
Options:
|
|
107
170
|
-e, --environment <prod|np> Select an environment (default: prod)
|
|
@@ -109,23 +172,41 @@ Options:
|
|
|
109
172
|
-v, --version Show the package version
|
|
110
173
|
`;
|
|
111
174
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
process.
|
|
118
|
-
|
|
119
|
-
|
|
175
|
+
const DEFAULT_DEPENDENCIES = Object.freeze({
|
|
176
|
+
writeOutput: (message) => process.stdout.write(message),
|
|
177
|
+
createAuth: async (environment) => new AuthManager(getProfile(environment)),
|
|
178
|
+
serve: async (environment) => serveDataBasinStdio({ environment }),
|
|
179
|
+
onceSignal: (signal, listener) => {
|
|
180
|
+
process.once(signal, listener);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
export async function runEntrypoint(args, dependencies = DEFAULT_ENTRYPOINT_DEPENDENCIES) {
|
|
184
|
+
try {
|
|
185
|
+
await dependencies.run(args);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
const message = error instanceof Error ? error.message : 'DataBasin MCP failed.';
|
|
189
|
+
dependencies.writeError(`${message}\n`);
|
|
190
|
+
dependencies.fail();
|
|
191
|
+
}
|
|
120
192
|
}
|
|
121
|
-
function isEntrypoint() {
|
|
122
|
-
if (!
|
|
193
|
+
export function isEntrypoint(executablePath = process.argv[1], modulePath = fileURLToPath(import.meta.url)) {
|
|
194
|
+
if (!executablePath)
|
|
123
195
|
return false;
|
|
124
196
|
try {
|
|
125
|
-
return realpathSync(
|
|
197
|
+
return realpathSync(executablePath) === realpathSync(modulePath);
|
|
126
198
|
}
|
|
127
199
|
catch {
|
|
128
200
|
return false;
|
|
129
201
|
}
|
|
130
202
|
}
|
|
203
|
+
const DEFAULT_ENTRYPOINT_DEPENDENCIES = Object.freeze({
|
|
204
|
+
run: runCli,
|
|
205
|
+
writeError: (message) => process.stderr.write(message),
|
|
206
|
+
fail: () => {
|
|
207
|
+
process.exitCode = 1;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
if (isEntrypoint())
|
|
211
|
+
void runEntrypoint(process.argv.slice(2));
|
|
131
212
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAA6B,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -3,7 +3,7 @@ const PROFILES = Object.freeze({
|
|
|
3
3
|
prod: Object.freeze({
|
|
4
4
|
environment: 'prod',
|
|
5
5
|
label: 'production',
|
|
6
|
-
apiBaseUrl: 'https://databasin
|
|
6
|
+
apiBaseUrl: 'https://databasin.cloud',
|
|
7
7
|
tenantId: TENANT_ID,
|
|
8
8
|
clientId: '74125794-c409-483c-97e9-13194e58abb3',
|
|
9
9
|
scopes: Object.freeze(['api://2170da8e-41ff-422f-a759-2718336f40d7/Databasin.API'])
|
|
@@ -11,7 +11,7 @@ const PROFILES = Object.freeze({
|
|
|
11
11
|
np: Object.freeze({
|
|
12
12
|
environment: 'np',
|
|
13
13
|
label: 'non-production',
|
|
14
|
-
apiBaseUrl: 'https://databasin-
|
|
14
|
+
apiBaseUrl: 'https://databasin-ui-np.grayriver-813df174.centralus.azurecontainerapps.io',
|
|
15
15
|
tenantId: TENANT_ID,
|
|
16
16
|
clientId: '68f0487f-d03d-41dd-96df-3c3fbaf1f112',
|
|
17
17
|
scopes: Object.freeze(['api://16b4e522-d051-4838-a0d7-75d246b8090c/Databasin.API'])
|
package/dist/config.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const CorrelationIdSchema: z.ZodString;
|
|
3
|
+
export declare function freshCorrelationId(): string;
|
|
4
|
+
export declare function validCorrelationId(value: unknown): string | undefined;
|
|
5
|
+
export declare function safeCorrelationId(value: unknown): string;
|
|
6
|
+
//# sourceMappingURL=correlation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB,aAG/B,CAAC;AAEF,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const CANONICAL_UUID_V4_OR_V7 = /^[0-9a-f]{8}-[0-9a-f]{4}-[47][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
|
|
4
|
+
export const CorrelationIdSchema = z.string().regex(CANONICAL_UUID_V4_OR_V7, 'must be a canonical lowercase UUIDv4 or UUIDv7');
|
|
5
|
+
export function freshCorrelationId() {
|
|
6
|
+
return randomUUID();
|
|
7
|
+
}
|
|
8
|
+
export function validCorrelationId(value) {
|
|
9
|
+
const parsed = CorrelationIdSchema.safeParse(value);
|
|
10
|
+
return parsed.success ? parsed.data : undefined;
|
|
11
|
+
}
|
|
12
|
+
export function safeCorrelationId(value) {
|
|
13
|
+
return validCorrelationId(value) ?? freshCorrelationId();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.js","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,uBAAuB,GAAG,2EAA2E,CAAC;AAE5G,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CACjD,uBAAuB,EACvB,gDAAgD,CACjD,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Configuration, type ICachePlugin, type IPublicClientApplication } from '@azure/msal-node';
|
|
2
|
+
import { DataProtectionScope } from '@azure/msal-node-extensions';
|
|
3
|
+
import { type DataBasinProfile } from './config.js';
|
|
4
|
+
export interface PersistenceOptions {
|
|
5
|
+
cachePath: string;
|
|
6
|
+
dataProtectionScope: DataProtectionScope;
|
|
7
|
+
serviceName: string;
|
|
8
|
+
accountName: string;
|
|
9
|
+
usePlaintextFileOnLinux: false;
|
|
10
|
+
}
|
|
11
|
+
export interface CredentialStoreDependencies {
|
|
12
|
+
homeDirectory(): string;
|
|
13
|
+
createDirectory(path: string, options: {
|
|
14
|
+
recursive: true;
|
|
15
|
+
mode: number;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
createCachePlugin(options: PersistenceOptions): Promise<ICachePlugin>;
|
|
18
|
+
createApplication(configuration: Configuration): IPublicClientApplication;
|
|
19
|
+
}
|
|
20
|
+
export declare function createSecurePublicClient(profile: DataBasinProfile, dependencies?: CredentialStoreDependencies): Promise<IPublicClientApplication>;
|
|
21
|
+
//# sourceMappingURL=credential-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EAGpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,EAAE,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,IAAI,MAAM,CAAC;IACxB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,iBAAiB,CAAC,aAAa,EAAE,aAAa,GAAG,wBAAwB,CAAC;CAC3E;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,gBAAgB,EACzB,YAAY,GAAE,2BAAkD,GAC/D,OAAO,CAAC,wBAAwB,CAAC,CAWnC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { PublicClientApplication } from '@azure/msal-node';
|
|
5
|
+
import { DataProtectionScope, PersistenceCachePlugin, PersistenceCreator } from '@azure/msal-node-extensions';
|
|
6
|
+
import { authorityFor } from './config.js';
|
|
7
|
+
export async function createSecurePublicClient(profile, dependencies = DEFAULT_DEPENDENCIES) {
|
|
8
|
+
const cacheDirectory = join(dependencies.homeDirectory(), '.databasin', 'mcp', 'auth', profile.environment);
|
|
9
|
+
await dependencies.createDirectory(cacheDirectory, { recursive: true, mode: 0o700 });
|
|
10
|
+
const cachePlugin = await dependencies.createCachePlugin({
|
|
11
|
+
cachePath: join(cacheDirectory, 'msal-cache.lock'),
|
|
12
|
+
dataProtectionScope: DataProtectionScope.CurrentUser,
|
|
13
|
+
serviceName: 'com.databasin.mcp',
|
|
14
|
+
accountName: profile.environment,
|
|
15
|
+
usePlaintextFileOnLinux: false
|
|
16
|
+
});
|
|
17
|
+
return dependencies.createApplication(configuration(profile, cachePlugin));
|
|
18
|
+
}
|
|
19
|
+
function configuration(profile, cachePlugin) {
|
|
20
|
+
return {
|
|
21
|
+
auth: {
|
|
22
|
+
clientId: profile.clientId,
|
|
23
|
+
authority: authorityFor(profile)
|
|
24
|
+
},
|
|
25
|
+
cache: { cachePlugin },
|
|
26
|
+
system: {
|
|
27
|
+
loggerOptions: {
|
|
28
|
+
piiLoggingEnabled: false,
|
|
29
|
+
logLevel: 0,
|
|
30
|
+
loggerCallback: () => undefined
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const DEFAULT_DEPENDENCIES = Object.freeze({
|
|
36
|
+
homeDirectory: homedir,
|
|
37
|
+
createDirectory: async (path, options) => {
|
|
38
|
+
await mkdir(path, options);
|
|
39
|
+
},
|
|
40
|
+
createCachePlugin: async (options) => {
|
|
41
|
+
const persistence = await PersistenceCreator.createPersistence(options);
|
|
42
|
+
return new PersistenceCachePlugin(persistence);
|
|
43
|
+
},
|
|
44
|
+
createApplication: (config) => new PublicClientApplication(config)
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=credential-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,uBAAuB,EAIxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAiBlE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAyB,EACzB,eAA4C,oBAAoB;IAEhE,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5G,MAAM,YAAY,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC;QACvD,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC;QAClD,mBAAmB,EAAE,mBAAmB,CAAC,WAAW;QACpD,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,uBAAuB,EAAE,KAAK;KAC/B,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,OAAyB,EAAE,WAAyB;IACzE,OAAO;QACL,IAAI,EAAE;YACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC;SACjC;QACD,KAAK,EAAE,EAAE,WAAW,EAAE;QACtB,MAAM,EAAE;YACN,aAAa,EAAE;gBACb,iBAAiB,EAAE,KAAK;gBACxB,QAAQ,EAAE,CAAC;gBACX,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;aAChC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,oBAAoB,GAAgC,MAAM,CAAC,MAAM,CAAC;IACtE,aAAa,EAAE,OAAO;IACtB,eAAe,EAAE,KAAK,EAAE,IAAY,EAAE,OAA0C,EAAE,EAAE;QAClF,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,iBAAiB,EAAE,KAAK,EAAE,OAA2B,EAAE,EAAE;QACvD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxE,OAAO,IAAI,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IACD,iBAAiB,EAAE,CAAC,MAAqB,EAAE,EAAE,CAAC,IAAI,uBAAuB,CAAC,MAAM,CAAC;CAClF,CAAC,CAAC"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,13 +1,27 @@
|
|
|
1
|
-
export type DataBasinErrorCode = 'INVALID_ARGUMENT' | 'UNAUTHENTICATED' | 'NOT_FOUND' | 'POLICY_DENIED' | 'DEPENDENCY_UNAVAILABLE' | 'OPERATION_FAILED' | 'INTERNAL_ERROR';
|
|
1
|
+
export type DataBasinErrorCode = 'INVALID_ARGUMENT' | 'UNAUTHENTICATED' | 'NOT_FOUND' | 'POLICY_DENIED' | 'RATE_LIMITED' | 'REQUEST_ABORTED' | 'REQUEST_TIMEOUT' | 'DEPENDENCY_UNAVAILABLE' | 'OPERATION_FAILED' | 'INTERNAL_ERROR';
|
|
2
2
|
export declare class DataBasinError extends Error {
|
|
3
3
|
readonly code: DataBasinErrorCode;
|
|
4
|
-
|
|
4
|
+
readonly details: {
|
|
5
|
+
correlationId: string;
|
|
6
|
+
retryAfterMs?: number;
|
|
7
|
+
reason?: string;
|
|
8
|
+
};
|
|
9
|
+
constructor(code: DataBasinErrorCode, message: string, details?: {
|
|
10
|
+
correlationId?: string;
|
|
11
|
+
retryAfterMs?: number;
|
|
12
|
+
reason?: string;
|
|
13
|
+
});
|
|
5
14
|
}
|
|
6
15
|
export declare class LoginRequiredError extends DataBasinError {
|
|
7
|
-
constructor(environment: string
|
|
16
|
+
constructor(environment: string, details?: {
|
|
17
|
+
correlationId?: string;
|
|
18
|
+
});
|
|
8
19
|
}
|
|
9
20
|
export declare function publicError(error: unknown): {
|
|
10
21
|
code: DataBasinErrorCode;
|
|
11
22
|
message: string;
|
|
23
|
+
correlationId?: string;
|
|
24
|
+
retryAfterMs?: number;
|
|
25
|
+
reason?: string;
|
|
12
26
|
};
|
|
13
27
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,iBAAiB,GACjB,WAAW,GACX,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,wBAAwB,GACxB,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,qBAAa,cAAe,SAAQ,KAAK;IAIrC,QAAQ,CAAC,IAAI,EAAE,kBAAkB;IAHnC,QAAQ,CAAC,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;gBAGzE,IAAI,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;CAUnF;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO;CAQ1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAezJ"}
|
package/dist/errors.js
CHANGED
|
@@ -1,20 +1,38 @@
|
|
|
1
|
+
import { safeCorrelationId } from './correlation.js';
|
|
1
2
|
export class DataBasinError extends Error {
|
|
2
3
|
code;
|
|
3
|
-
|
|
4
|
+
details;
|
|
5
|
+
constructor(code, message, details = {}) {
|
|
4
6
|
super(message);
|
|
5
7
|
this.code = code;
|
|
6
8
|
this.name = 'DataBasinError';
|
|
9
|
+
this.details = {
|
|
10
|
+
correlationId: safeCorrelationId(details.correlationId),
|
|
11
|
+
...(details.retryAfterMs === undefined ? {} : { retryAfterMs: details.retryAfterMs }),
|
|
12
|
+
...(details.reason === undefined ? {} : { reason: details.reason })
|
|
13
|
+
};
|
|
7
14
|
}
|
|
8
15
|
}
|
|
9
16
|
export class LoginRequiredError extends DataBasinError {
|
|
10
|
-
constructor(environment) {
|
|
11
|
-
super('UNAUTHENTICATED', `DataBasin login is required for ${environment}. Call databasin_login, or run: npx @databasin/mcp-client login --environment ${environment}
|
|
17
|
+
constructor(environment, details = {}) {
|
|
18
|
+
super('UNAUTHENTICATED', `DataBasin login is required for ${environment}. Call databasin_login, or run: npx @databasin/mcp-client login --environment ${environment}`, details);
|
|
12
19
|
this.name = 'LoginRequiredError';
|
|
13
20
|
}
|
|
14
21
|
}
|
|
15
22
|
export function publicError(error) {
|
|
16
|
-
if (error instanceof DataBasinError)
|
|
17
|
-
return {
|
|
18
|
-
|
|
23
|
+
if (error instanceof DataBasinError) {
|
|
24
|
+
return {
|
|
25
|
+
code: error.code,
|
|
26
|
+
message: error.message,
|
|
27
|
+
correlationId: safeCorrelationId(error.details.correlationId),
|
|
28
|
+
...(error.details.retryAfterMs !== undefined ? { retryAfterMs: error.details.retryAfterMs } : {}),
|
|
29
|
+
...(error.details.reason !== undefined ? { reason: error.details.reason } : {})
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
code: 'INTERNAL_ERROR',
|
|
34
|
+
message: 'The DataBasin operation could not be completed.',
|
|
35
|
+
correlationId: safeCorrelationId(undefined)
|
|
36
|
+
};
|
|
19
37
|
}
|
|
20
38
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAcrD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAI5B;IAHF,OAAO,CAAoE;IAEpF,YACW,IAAwB,EACjC,OAAe,EACf,UAA8E,EAAE;QAEhF,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAAoB;QAKjC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC;YACvD,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;YACrF,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACpE,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,WAAmB,EAAE,UAAsC,EAAE;QACvE,KAAK,CACH,iBAAiB,EACjB,mCAAmC,WAAW,iFAAiF,WAAW,EAAE,EAC5I,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC7D,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,iDAAiD;QAC1D,aAAa,EAAE,iBAAiB,CAAC,SAAS,CAAC;KAC5C,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAA6B,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAA6B,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DataBasinProfile } from './config.js';
|
|
2
|
+
export interface SafeDevicePrompt {
|
|
3
|
+
readonly userCode: string;
|
|
4
|
+
readonly verificationUri: string;
|
|
5
|
+
readonly expiresIn: number;
|
|
6
|
+
}
|
|
7
|
+
export interface RawDeviceCodeResponse {
|
|
8
|
+
readonly userCode: unknown;
|
|
9
|
+
readonly deviceCode?: unknown;
|
|
10
|
+
readonly verificationUri: unknown;
|
|
11
|
+
readonly expiresIn: unknown;
|
|
12
|
+
readonly interval?: unknown;
|
|
13
|
+
readonly message?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export declare function projectDevicePrompt(response: RawDeviceCodeResponse): SafeDevicePrompt;
|
|
16
|
+
export declare function validateDeviceLoginUrl(value: unknown): string;
|
|
17
|
+
export declare function validateInteractiveLoginUrl(rawUrl: string, profile?: DataBasinProfile): string;
|
|
18
|
+
//# sourceMappingURL=login-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-url.d.ts","sourceRoot":"","sources":["../src/login-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAkBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,gBAAgB,CAKrF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAS7D;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAgB9F"}
|