@databasin/mcp-client 0.1.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 +108 -0
- package/dist/api-client.d.ts +43 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +154 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth.d.ts +73 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +234 -0
- package/dist/auth.js.map +1 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +34 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +131 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +45 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/mappers.d.ts +56 -0
- package/dist/mappers.d.ts.map +1 -0
- package/dist/mappers.js +171 -0
- package/dist/mappers.js.map +1 -0
- package/dist/safety.d.ts +3 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +27 -0
- package/dist/safety.js.map +1 -0
- package/dist/schemas.d.ts +154 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +102 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +23 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +35 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +17 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +117 -0
- package/dist/tools.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAEA,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrE"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export async function openSystemBrowser(rawUrl) {
|
|
3
|
+
const url = new URL(rawUrl);
|
|
4
|
+
if (url.protocol !== 'https:' || url.hostname !== 'login.microsoftonline.com') {
|
|
5
|
+
throw new Error('Refusing to open an unexpected OAuth URL.');
|
|
6
|
+
}
|
|
7
|
+
const command = browserCommand(url.toString());
|
|
8
|
+
await new Promise((resolve) => {
|
|
9
|
+
const child = spawn(command.executable, command.args, {
|
|
10
|
+
detached: true,
|
|
11
|
+
stdio: 'ignore',
|
|
12
|
+
windowsHide: true
|
|
13
|
+
});
|
|
14
|
+
child.once('spawn', () => {
|
|
15
|
+
child.unref();
|
|
16
|
+
resolve();
|
|
17
|
+
});
|
|
18
|
+
child.once('error', () => {
|
|
19
|
+
process.stderr.write(`Open this URL to sign in to DataBasin:\n${url.toString()}\n`);
|
|
20
|
+
resolve();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function browserCommand(url) {
|
|
25
|
+
switch (process.platform) {
|
|
26
|
+
case 'darwin':
|
|
27
|
+
return { executable: 'open', args: [url] };
|
|
28
|
+
case 'win32':
|
|
29
|
+
return { executable: 'rundll32.exe', args: ['url.dll,FileProtocolHandler', url] };
|
|
30
|
+
default:
|
|
31
|
+
return { executable: 'xdg-open', args: [url] };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,2BAA2B,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE;YACpD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACpF,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,OAAO;YACV,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,EAAE,CAAC;QACpF;YACE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,CAAC;AACH,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { type DataBasinEnvironment } from './config.js';
|
|
3
|
+
type Command = 'serve' | 'login' | 'logout' | 'status' | 'help' | 'version';
|
|
4
|
+
export interface CliOptions {
|
|
5
|
+
command: Command;
|
|
6
|
+
environment: DataBasinEnvironment;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseCliArgs(args: string[]): CliOptions;
|
|
9
|
+
export declare function runCli(args: string[]): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAKA,OAAO,EAAkC,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAIxF,KAAK,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,oBAAoB,CAAC;CACnC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoCvD;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C1D"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from 'node:fs';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { getProfile, resolveEnvironment } from './config.js';
|
|
5
|
+
import { DataBasinError } from './errors.js';
|
|
6
|
+
import { VERSION } from './version.js';
|
|
7
|
+
export function parseCliArgs(args) {
|
|
8
|
+
let command = 'serve';
|
|
9
|
+
let commandSet = false;
|
|
10
|
+
let environmentValue;
|
|
11
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
12
|
+
const argument = args[index];
|
|
13
|
+
if (argument === '--environment' || argument === '-e') {
|
|
14
|
+
environmentValue = args[index + 1];
|
|
15
|
+
if (!environmentValue)
|
|
16
|
+
throw new Error(`${argument} requires prod or np.`);
|
|
17
|
+
index += 1;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (argument.startsWith('--environment=')) {
|
|
21
|
+
environmentValue = argument.slice('--environment='.length);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (argument === '--help' || argument === '-h') {
|
|
25
|
+
command = 'help';
|
|
26
|
+
commandSet = true;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (argument === '--version' || argument === '-v') {
|
|
30
|
+
command = 'version';
|
|
31
|
+
commandSet = true;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (!commandSet && isCommand(argument)) {
|
|
35
|
+
command = argument;
|
|
36
|
+
commandSet = true;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`Unknown argument "${argument}".`);
|
|
40
|
+
}
|
|
41
|
+
return { command, environment: resolveEnvironment(environmentValue) };
|
|
42
|
+
}
|
|
43
|
+
export async function runCli(args) {
|
|
44
|
+
const options = parseCliArgs(args);
|
|
45
|
+
if (options.command === 'help') {
|
|
46
|
+
process.stdout.write(helpText());
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (options.command === 'version') {
|
|
50
|
+
process.stdout.write(`${VERSION}\n`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const profile = getProfile(options.environment);
|
|
54
|
+
if (options.command === 'serve') {
|
|
55
|
+
const { serveDataBasinStdio } = await import('./server.js');
|
|
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());
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const { AuthManager } = await import('./auth.js');
|
|
69
|
+
const auth = new AuthManager(profile);
|
|
70
|
+
if (options.command === 'login') {
|
|
71
|
+
const status = await auth.login();
|
|
72
|
+
process.stdout.write(`Signed in to DataBasin ${profile.label}${status.username ? ` as ${status.username}` : ''}.\n`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (options.command === 'logout') {
|
|
76
|
+
const count = await auth.logout();
|
|
77
|
+
process.stdout.write(count > 0
|
|
78
|
+
? `Signed out of DataBasin ${profile.label}.\n`
|
|
79
|
+
: `No DataBasin ${profile.label} session was stored.\n`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const status = await auth.status();
|
|
83
|
+
process.stdout.write(status.authenticated
|
|
84
|
+
? `Signed in to DataBasin ${profile.label}${status.username ? ` as ${status.username}` : ''}.\n`
|
|
85
|
+
: `Not signed in to DataBasin ${profile.label}. Run: npx @databasin/mcp-client login${profile.environment === 'prod' ? '' : ` --environment ${profile.environment}`}\n`);
|
|
86
|
+
}
|
|
87
|
+
function isCommand(value) {
|
|
88
|
+
return value === 'serve' || value === 'login' || value === 'logout' || value === 'status' || value === 'help' || value === 'version';
|
|
89
|
+
}
|
|
90
|
+
function helpText() {
|
|
91
|
+
return `DataBasin local MCP client ${VERSION}
|
|
92
|
+
|
|
93
|
+
Usage:
|
|
94
|
+
databasin-mcp Start the production stdio MCP server
|
|
95
|
+
databasin-mcp login Sign in to production
|
|
96
|
+
databasin-mcp logout Remove the production session
|
|
97
|
+
databasin-mcp status Show production sign-in status
|
|
98
|
+
databasin-mcp <command> -e np Use the non-production environment
|
|
99
|
+
|
|
100
|
+
Commands:
|
|
101
|
+
serve Start the stdio MCP server (default)
|
|
102
|
+
login Open Microsoft sign-in in the system browser
|
|
103
|
+
logout Remove the locally cached DataBasin session
|
|
104
|
+
status Show whether a session is available
|
|
105
|
+
|
|
106
|
+
Options:
|
|
107
|
+
-e, --environment <prod|np> Select an environment (default: prod)
|
|
108
|
+
-h, --help Show this help
|
|
109
|
+
-v, --version Show the package version
|
|
110
|
+
`;
|
|
111
|
+
}
|
|
112
|
+
if (isEntrypoint()) {
|
|
113
|
+
runCli(process.argv.slice(2)).catch((error) => {
|
|
114
|
+
const message = error instanceof DataBasinError || error instanceof Error
|
|
115
|
+
? error.message
|
|
116
|
+
: 'DataBasin MCP failed.';
|
|
117
|
+
process.stderr.write(`${message}\n`);
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function isEntrypoint() {
|
|
122
|
+
if (!process.argv[1])
|
|
123
|
+
return false;
|
|
124
|
+
try {
|
|
125
|
+
return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type DataBasinEnvironment = 'prod' | 'np';
|
|
2
|
+
export interface DataBasinProfile {
|
|
3
|
+
environment: DataBasinEnvironment;
|
|
4
|
+
label: string;
|
|
5
|
+
apiBaseUrl: string;
|
|
6
|
+
tenantId: string;
|
|
7
|
+
clientId: string;
|
|
8
|
+
scopes: readonly string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveEnvironment(value: string | undefined): DataBasinEnvironment;
|
|
11
|
+
export declare function getProfile(environment?: DataBasinEnvironment): DataBasinProfile;
|
|
12
|
+
export declare function authorityFor(profile: DataBasinProfile): string;
|
|
13
|
+
export declare const SUPPORTED_ENVIRONMENTS: readonly ["prod", "np"];
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,oBAAoB,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAiCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAOlF;AAED,wBAAgB,UAAU,CAAC,WAAW,GAAE,oBAA6B,GAAG,gBAAgB,CAEvF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAE9D;AAED,eAAO,MAAM,sBAAsB,yBAAyC,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const TENANT_ID = '6990684d-a83d-4cf0-95bc-fda77ad2fc29';
|
|
2
|
+
const PROFILES = Object.freeze({
|
|
3
|
+
prod: Object.freeze({
|
|
4
|
+
environment: 'prod',
|
|
5
|
+
label: 'production',
|
|
6
|
+
apiBaseUrl: 'https://databasin-api.calmplant-7d6b6890.centralus.azurecontainerapps.io/api',
|
|
7
|
+
tenantId: TENANT_ID,
|
|
8
|
+
clientId: '74125794-c409-483c-97e9-13194e58abb3',
|
|
9
|
+
scopes: Object.freeze(['api://2170da8e-41ff-422f-a759-2718336f40d7/Databasin.API'])
|
|
10
|
+
}),
|
|
11
|
+
np: Object.freeze({
|
|
12
|
+
environment: 'np',
|
|
13
|
+
label: 'non-production',
|
|
14
|
+
apiBaseUrl: 'https://databasin-api-np.grayriver-813df174.centralus.azurecontainerapps.io/api',
|
|
15
|
+
tenantId: TENANT_ID,
|
|
16
|
+
clientId: '68f0487f-d03d-41dd-96df-3c3fbaf1f112',
|
|
17
|
+
scopes: Object.freeze(['api://16b4e522-d051-4838-a0d7-75d246b8090c/Databasin.API'])
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
const ENVIRONMENT_ALIASES = Object.freeze({
|
|
21
|
+
prod: 'prod',
|
|
22
|
+
production: 'prod',
|
|
23
|
+
np: 'np',
|
|
24
|
+
nonprod: 'np',
|
|
25
|
+
'non-production': 'np',
|
|
26
|
+
test: 'np',
|
|
27
|
+
staging: 'np'
|
|
28
|
+
});
|
|
29
|
+
export function resolveEnvironment(value) {
|
|
30
|
+
if (!value)
|
|
31
|
+
return 'prod';
|
|
32
|
+
const environment = ENVIRONMENT_ALIASES[value.trim().toLowerCase()];
|
|
33
|
+
if (!environment) {
|
|
34
|
+
throw new Error(`Unknown DataBasin environment "${value}". Use prod or np.`);
|
|
35
|
+
}
|
|
36
|
+
return environment;
|
|
37
|
+
}
|
|
38
|
+
export function getProfile(environment = 'prod') {
|
|
39
|
+
return PROFILES[environment];
|
|
40
|
+
}
|
|
41
|
+
export function authorityFor(profile) {
|
|
42
|
+
return `https://login.microsoftonline.com/${profile.tenantId}`;
|
|
43
|
+
}
|
|
44
|
+
export const SUPPORTED_ENVIRONMENTS = Object.freeze(['prod', 'np']);
|
|
45
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +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,8EAA8E;QAC1F,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,iFAAiF;QAC7F,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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type DataBasinErrorCode = 'INVALID_ARGUMENT' | 'UNAUTHENTICATED' | 'NOT_FOUND' | 'POLICY_DENIED' | 'DEPENDENCY_UNAVAILABLE' | 'OPERATION_FAILED' | 'INTERNAL_ERROR';
|
|
2
|
+
export declare class DataBasinError extends Error {
|
|
3
|
+
readonly code: DataBasinErrorCode;
|
|
4
|
+
constructor(code: DataBasinErrorCode, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare class LoginRequiredError extends DataBasinError {
|
|
7
|
+
constructor(environment: string);
|
|
8
|
+
}
|
|
9
|
+
export declare function publicError(error: unknown): {
|
|
10
|
+
code: DataBasinErrorCode;
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,iBAAiB,GACjB,WAAW,GACX,eAAe,GACf,wBAAwB,GACxB,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,IAAI,EAAE,kBAAkB;gBAAxB,IAAI,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM;CAKlB;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,WAAW,EAAE,MAAM;CAOhC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGzF"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export class DataBasinError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.code = code;
|
|
6
|
+
this.name = 'DataBasinError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
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}`);
|
|
12
|
+
this.name = 'LoginRequiredError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function publicError(error) {
|
|
16
|
+
if (error instanceof DataBasinError)
|
|
17
|
+
return { code: error.code, message: error.message };
|
|
18
|
+
return { code: 'INTERNAL_ERROR', message: 'The DataBasin operation could not be completed.' };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B;IADX,YACW,IAAwB,EACjC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAoB;QAIjC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,WAAmB;QAC7B,KAAK,CACH,iBAAiB,EACjB,mCAAmC,WAAW,iFAAiF,WAAW,EAAE,CAC7I,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,cAAc;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACzF,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAAC;AAChG,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +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,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +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,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type BrowseSchemaInput } from './schemas.js';
|
|
2
|
+
export declare function mapProjects(payload: unknown): Array<{
|
|
3
|
+
id: string;
|
|
4
|
+
name: string | null;
|
|
5
|
+
organizationId: string | null;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function mapConnections(payload: unknown): Array<{
|
|
8
|
+
id: string | number;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function mapSearch(payload: unknown, limit: number): {
|
|
11
|
+
items: {
|
|
12
|
+
id: string;
|
|
13
|
+
type: "unknown" | "pipeline" | "connector" | "automation";
|
|
14
|
+
name: string;
|
|
15
|
+
description: string | null;
|
|
16
|
+
projectId: string | null;
|
|
17
|
+
organizationId: string | null;
|
|
18
|
+
updatedAt: string | null;
|
|
19
|
+
}[];
|
|
20
|
+
truncated: boolean;
|
|
21
|
+
};
|
|
22
|
+
export declare function mapSchema(payload: unknown, input: BrowseSchemaInput): {
|
|
23
|
+
connectorId: number;
|
|
24
|
+
level: "catalogs" | "schemas" | "tables" | "columns";
|
|
25
|
+
items: {
|
|
26
|
+
name: string;
|
|
27
|
+
type: string | null;
|
|
28
|
+
comment: string | null;
|
|
29
|
+
}[];
|
|
30
|
+
truncated: boolean;
|
|
31
|
+
};
|
|
32
|
+
export declare function mapOperation(payload: unknown, requestedId: string, options: {
|
|
33
|
+
offset: number;
|
|
34
|
+
limit: number;
|
|
35
|
+
}): {
|
|
36
|
+
operationId: string;
|
|
37
|
+
status: "failed" | "unknown" | "queued" | "running" | "completed" | "cancelled";
|
|
38
|
+
engineType: string | null;
|
|
39
|
+
resultKind: string | null;
|
|
40
|
+
columns: {
|
|
41
|
+
name: string;
|
|
42
|
+
type: string | null;
|
|
43
|
+
}[];
|
|
44
|
+
rowCount: number | null;
|
|
45
|
+
rows: unknown[][];
|
|
46
|
+
offset: number;
|
|
47
|
+
limit: number;
|
|
48
|
+
hasMore: boolean | null;
|
|
49
|
+
truncated: boolean;
|
|
50
|
+
message: string | null;
|
|
51
|
+
};
|
|
52
|
+
export declare function mapCancel(payload: unknown, requestedId: string): {
|
|
53
|
+
operationId: string;
|
|
54
|
+
status: "failed" | "unknown" | "queued" | "running" | "completed" | "cancelled";
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=mappers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../src/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAKtB,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAUvH;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC,CAS/E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;EA+BxD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB;;;;;;;;;EAyBnE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;EAiC7G;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;;;EAU9D"}
|
package/dist/mappers.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { BrowseSchemaOutputSchema, CancelOperationOutputSchema, OperationOutputSchema, SearchOutputSchema } from './schemas.js';
|
|
2
|
+
import { DataBasinError } from './errors.js';
|
|
3
|
+
export function mapProjects(payload) {
|
|
4
|
+
return arrayValue(payload, ['projects', 'items', 'results']).flatMap((item) => {
|
|
5
|
+
const object = record(item);
|
|
6
|
+
const projectId = id(first(object, ['projectId', 'id', 'internalId']));
|
|
7
|
+
return projectId ? [{
|
|
8
|
+
id: projectId,
|
|
9
|
+
name: text(first(object, ['name', 'projectName', 'title']), 500),
|
|
10
|
+
organizationId: id(first(object, ['organizationId', 'orgId', 'institutionId']))
|
|
11
|
+
}] : [];
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function mapConnections(payload) {
|
|
15
|
+
return arrayValue(payload, ['connections', 'items', 'results']).flatMap((item) => {
|
|
16
|
+
const value = typeof item === 'string' || typeof item === 'number'
|
|
17
|
+
? item
|
|
18
|
+
: first(record(item), ['id', 'connectorId', 'connectionId']);
|
|
19
|
+
if (typeof value === 'string' && value.trim())
|
|
20
|
+
return [{ id: value.trim().slice(0, 256) }];
|
|
21
|
+
if (typeof value === 'number' && Number.isSafeInteger(value) && value > 0)
|
|
22
|
+
return [{ id: value }];
|
|
23
|
+
return [];
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function mapSearch(payload, limit) {
|
|
27
|
+
const root = record(unwrap(payload));
|
|
28
|
+
const grouped = record(root.results);
|
|
29
|
+
const rawItems = Object.keys(grouped).length > 0
|
|
30
|
+
? [
|
|
31
|
+
...arrayValue(grouped.pipelines, ['items', 'results', 'data']).map((item) => ({ item, impliedType: 'pipeline' })),
|
|
32
|
+
...arrayValue(grouped.connectors, ['items', 'results', 'data']).map((item) => ({ item, impliedType: 'connector' })),
|
|
33
|
+
...arrayValue(grouped.automations, ['items', 'results', 'data']).map((item) => ({ item, impliedType: 'automation' }))
|
|
34
|
+
]
|
|
35
|
+
: arrayValue(payload, ['items', 'results', 'matches', 'data']).map((item) => ({ item, impliedType: undefined }));
|
|
36
|
+
const items = rawItems.flatMap(({ item, impliedType }) => {
|
|
37
|
+
const object = record(item);
|
|
38
|
+
const itemId = id(first(object, ['id', 'resourceId', 'pipelineId', 'connectorId', 'automationId']));
|
|
39
|
+
if (!itemId)
|
|
40
|
+
return [];
|
|
41
|
+
const rawType = text(first(object, ['type', 'resourceType', 'kind']), 100)?.toLowerCase() ?? impliedType;
|
|
42
|
+
const type = rawType === 'pipeline' || rawType === 'connector' || rawType === 'automation' ? rawType : 'unknown';
|
|
43
|
+
return [{
|
|
44
|
+
id: itemId,
|
|
45
|
+
type,
|
|
46
|
+
name: text(first(object, ['name', 'title', 'label']), 500) ?? itemId,
|
|
47
|
+
description: text(first(object, ['description', 'summary']), 2_000),
|
|
48
|
+
projectId: id(first(object, ['projectId', 'projectInternalId'])),
|
|
49
|
+
organizationId: id(first(object, ['organizationId', 'orgId', 'institutionId'])),
|
|
50
|
+
updatedAt: text(first(object, ['updatedAt', 'updatedDate', 'updatedDatetime', 'lastUpdated']), 100)
|
|
51
|
+
}];
|
|
52
|
+
});
|
|
53
|
+
const backendTruncated = Object.values(record(root.truncated)).some((value) => value === true);
|
|
54
|
+
return SearchOutputSchema.parse({
|
|
55
|
+
items: items.slice(0, limit),
|
|
56
|
+
truncated: backendTruncated || items.length > limit
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function mapSchema(payload, input) {
|
|
60
|
+
const keys = {
|
|
61
|
+
catalogs: ['catalogs', 'items', 'results', 'data'],
|
|
62
|
+
schemas: ['schemas', 'items', 'results', 'data'],
|
|
63
|
+
tables: ['tables', 'items', 'results', 'data'],
|
|
64
|
+
columns: ['columns', 'items', 'results', 'data']
|
|
65
|
+
};
|
|
66
|
+
const items = arrayValue(payload, keys[input.level]).flatMap((item) => {
|
|
67
|
+
const object = record(item);
|
|
68
|
+
const rawName = typeof item === 'string'
|
|
69
|
+
? item
|
|
70
|
+
: first(object, ['name', 'catalogName', 'schemaName', 'tableName', 'columnName']);
|
|
71
|
+
const name = text(rawName, 256);
|
|
72
|
+
return name ? [{
|
|
73
|
+
name,
|
|
74
|
+
type: text(first(object, ['type', 'objectType', 'dataType', 'columnType']), 200),
|
|
75
|
+
comment: text(first(object, ['comment', 'description']), 2_000)
|
|
76
|
+
}] : [];
|
|
77
|
+
});
|
|
78
|
+
return BrowseSchemaOutputSchema.parse({
|
|
79
|
+
connectorId: input.connectorId,
|
|
80
|
+
level: input.level,
|
|
81
|
+
items: items.slice(0, 200),
|
|
82
|
+
truncated: items.length > 200
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export function mapOperation(payload, requestedId, options) {
|
|
86
|
+
const object = record(unwrap(payload));
|
|
87
|
+
const operationId = id(first(object, ['operationId', 'queryId'])) ?? requestedId;
|
|
88
|
+
if (!operationId)
|
|
89
|
+
throw new DataBasinError('OPERATION_FAILED', 'DataBasin did not return an operation identifier.');
|
|
90
|
+
const rawStatus = text(first(object, ['status', 'state']), 100)?.toLowerCase();
|
|
91
|
+
const status = rawStatus === 'queued' || rawStatus === 'running' || rawStatus === 'completed' || rawStatus === 'failed' || rawStatus === 'cancelled'
|
|
92
|
+
? rawStatus
|
|
93
|
+
: 'unknown';
|
|
94
|
+
const columns = arrayValue(object, ['columns']).flatMap((item) => {
|
|
95
|
+
const column = record(item);
|
|
96
|
+
const name = text(first(column, ['name', 'columnName']), 256);
|
|
97
|
+
return name ? [{ name, type: text(first(column, ['type', 'dataType']), 200) }] : [];
|
|
98
|
+
});
|
|
99
|
+
const requestedLimit = Math.min(Math.max(options.limit, 1), 100);
|
|
100
|
+
const rows = arrayValue(object, ['data', 'rows'])
|
|
101
|
+
.flatMap((row) => Array.isArray(row) ? [row.slice(0, 500)] : [])
|
|
102
|
+
.slice(0, requestedLimit);
|
|
103
|
+
const pagination = record(object.pagination);
|
|
104
|
+
const stats = record(object.stats);
|
|
105
|
+
return OperationOutputSchema.parse({
|
|
106
|
+
operationId,
|
|
107
|
+
status,
|
|
108
|
+
engineType: text(first(object, ['engineType', 'engine']), 100),
|
|
109
|
+
resultKind: text(object.resultKind, 100),
|
|
110
|
+
columns,
|
|
111
|
+
rowCount: count(first(object, ['rowCount', 'totalRows'])) ?? count(first(stats, ['rowCount', 'totalRows'])) ?? count(pagination.totalRows),
|
|
112
|
+
rows,
|
|
113
|
+
offset: count(pagination.offset) ?? options.offset,
|
|
114
|
+
limit: Math.min(count(pagination.limit) ?? requestedLimit, 100),
|
|
115
|
+
hasMore: Object.keys(pagination).length > 0 ? pagination.hasMore === true : null,
|
|
116
|
+
truncated: object.truncated === true || rows.length >= requestedLimit,
|
|
117
|
+
message: text(first(object, ['message', 'textOutput']), 1_000) ?? text(record(object.error).message, 1_000)
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
export function mapCancel(payload, requestedId) {
|
|
121
|
+
const object = record(unwrap(payload));
|
|
122
|
+
const rawStatus = text(first(object, ['status', 'state']), 100)?.toLowerCase();
|
|
123
|
+
const status = rawStatus === 'cancelled' || rawStatus === 'queued' || rawStatus === 'running' || rawStatus === 'completed' || rawStatus === 'failed'
|
|
124
|
+
? rawStatus
|
|
125
|
+
: 'unknown';
|
|
126
|
+
return CancelOperationOutputSchema.parse({
|
|
127
|
+
operationId: id(first(object, ['operationId', 'queryId'])) ?? requestedId,
|
|
128
|
+
status
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function unwrap(value) {
|
|
132
|
+
const object = record(value);
|
|
133
|
+
if (!('data' in object) || !(Array.isArray(object.data) || (object.data && typeof object.data === 'object')))
|
|
134
|
+
return value;
|
|
135
|
+
const envelopeKeys = new Set(['data', 'meta', 'pagination', 'error']);
|
|
136
|
+
return Object.keys(object).every((key) => envelopeKeys.has(key)) ? object.data : value;
|
|
137
|
+
}
|
|
138
|
+
function arrayValue(value, keys) {
|
|
139
|
+
if (Array.isArray(value))
|
|
140
|
+
return value;
|
|
141
|
+
const object = record(unwrap(value));
|
|
142
|
+
for (const key of keys)
|
|
143
|
+
if (Array.isArray(object[key]))
|
|
144
|
+
return object[key];
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
function record(value) {
|
|
148
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
149
|
+
}
|
|
150
|
+
function first(object, keys) {
|
|
151
|
+
for (const key of keys)
|
|
152
|
+
if (object[key] !== undefined && object[key] !== null)
|
|
153
|
+
return object[key];
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function text(value, max) {
|
|
157
|
+
if (typeof value === 'string')
|
|
158
|
+
return value.slice(0, max);
|
|
159
|
+
return value === null || value === undefined ? null : String(value).slice(0, max);
|
|
160
|
+
}
|
|
161
|
+
function id(value) {
|
|
162
|
+
if (typeof value === 'string' && value.trim())
|
|
163
|
+
return value.trim().slice(0, 256);
|
|
164
|
+
if (typeof value === 'number' && Number.isSafeInteger(value) && value > 0)
|
|
165
|
+
return String(value);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
function count(value) {
|
|
169
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=mappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mappers.js","sourceRoot":"","sources":["../src/mappers.ts"],"names":[],"mappings":"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"}
|
package/dist/safety.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../src/safety.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAY,GAAG,IAAI,CAK3E;AAgBD,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/safety.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { DataBasinError } from './errors.js';
|
|
3
|
+
const SENSITIVE_KEY = /(?:pass(word)?|secret|token|api[-_]?key|credential|authorization|cookie|webhook|signed[-_]?url|connection[-_]?string|private[-_]?key|client[-_]?secret|keyvault)/iu;
|
|
4
|
+
export function assertSafeOutput(value, maxBytes = 1_048_576) {
|
|
5
|
+
inspectKeys(value, '$');
|
|
6
|
+
if (Buffer.byteLength(JSON.stringify(value), 'utf8') > maxBytes) {
|
|
7
|
+
throw new DataBasinError('POLICY_DENIED', 'The tool output exceeded the response-size limit.');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function inspectKeys(value, path) {
|
|
11
|
+
if (Array.isArray(value)) {
|
|
12
|
+
value.forEach((child, index) => inspectKeys(child, `${path}[${index}]`));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (!value || typeof value !== 'object')
|
|
16
|
+
return;
|
|
17
|
+
for (const [key, child] of Object.entries(value)) {
|
|
18
|
+
if (SENSITIVE_KEY.test(key)) {
|
|
19
|
+
throw new DataBasinError('INTERNAL_ERROR', `A sensitive field was blocked at ${path}.`);
|
|
20
|
+
}
|
|
21
|
+
inspectKeys(child, `${path}.${key}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function correlationId() {
|
|
25
|
+
return randomUUID();
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../src/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,aAAa,GAAG,oKAAoK,CAAC;AAE3L,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,QAAQ,GAAG,SAAS;IACnE,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,mDAAmD,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAY;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO;IAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,cAAc,CAAC,gBAAgB,EAAE,oCAAoC,IAAI,GAAG,CAAC,CAAC;QAC1F,CAAC;QACD,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
|