@tejasanik/postgres-mcp-server 1.0.0 → 1.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 +90 -13
- package/dist/__tests__/analysis-tools.test.d.ts +2 -0
- package/dist/__tests__/analysis-tools.test.d.ts.map +1 -0
- package/dist/__tests__/analysis-tools.test.js +294 -0
- package/dist/__tests__/analysis-tools.test.js.map +1 -0
- package/dist/__tests__/db-manager.test.d.ts +2 -0
- package/dist/__tests__/db-manager.test.d.ts.map +1 -0
- package/dist/__tests__/db-manager.test.js +243 -0
- package/dist/__tests__/db-manager.test.js.map +1 -0
- package/dist/__tests__/mcp-server.test.d.ts +13 -0
- package/dist/__tests__/mcp-server.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-server.test.js +131 -0
- package/dist/__tests__/mcp-server.test.js.map +1 -0
- package/dist/__tests__/schema-tools.test.d.ts +2 -0
- package/dist/__tests__/schema-tools.test.d.ts.map +1 -0
- package/dist/__tests__/schema-tools.test.js +171 -0
- package/dist/__tests__/schema-tools.test.js.map +1 -0
- package/dist/__tests__/server-tools.test.d.ts +2 -0
- package/dist/__tests__/server-tools.test.d.ts.map +1 -0
- package/dist/__tests__/server-tools.test.js +94 -0
- package/dist/__tests__/server-tools.test.js.map +1 -0
- package/dist/__tests__/sql-tools.test.d.ts +2 -0
- package/dist/__tests__/sql-tools.test.d.ts.map +1 -0
- package/dist/__tests__/sql-tools.test.js +235 -0
- package/dist/__tests__/sql-tools.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +2 -0
- package/dist/__tests__/validation.test.d.ts.map +1 -0
- package/dist/__tests__/validation.test.js +203 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/db-manager.d.ts +17 -4
- package/dist/db-manager.d.ts.map +1 -1
- package/dist/db-manager.js +164 -26
- package/dist/db-manager.js.map +1 -1
- package/dist/index.js +62 -26
- package/dist/index.js.map +1 -1
- package/dist/tools/analysis-tools.d.ts +1 -0
- package/dist/tools/analysis-tools.d.ts.map +1 -1
- package/dist/tools/analysis-tools.js +158 -81
- package/dist/tools/analysis-tools.js.map +1 -1
- package/dist/tools/index.js +4 -20
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/schema-tools.d.ts.map +1 -1
- package/dist/tools/schema-tools.js +71 -40
- package/dist/tools/schema-tools.js.map +1 -1
- package/dist/tools/server-tools.d.ts +11 -1
- package/dist/tools/server-tools.d.ts.map +1 -1
- package/dist/tools/server-tools.js +23 -14
- package/dist/tools/server-tools.js.map +1 -1
- package/dist/tools/sql-tools.d.ts.map +1 -1
- package/dist/tools/sql-tools.js +88 -61
- package/dist/tools/sql-tools.js.map +1 -1
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/validation.d.ts +27 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +133 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +8 -2
package/dist/db-manager.d.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { PoolClient, QueryResult, QueryResultRow } from 'pg';
|
|
2
|
-
import { ServerConfig, ServersConfig, ConnectionState, DatabaseInfo } from './types.js';
|
|
2
|
+
import { ServerConfig, ServersConfig, ConnectionState, ConnectionInfo, DatabaseInfo } from './types.js';
|
|
3
3
|
export declare class DatabaseManager {
|
|
4
4
|
private serversConfig;
|
|
5
5
|
private connectionState;
|
|
6
6
|
private currentPool;
|
|
7
7
|
private readOnlyMode;
|
|
8
|
-
|
|
8
|
+
private queryTimeoutMs;
|
|
9
|
+
constructor(readOnlyMode?: boolean, queryTimeoutMs?: number);
|
|
9
10
|
private loadServersConfig;
|
|
10
11
|
getServersConfig(): ServersConfig;
|
|
11
12
|
getServerNames(): string[];
|
|
12
13
|
getServerConfig(serverName: string): ServerConfig | null;
|
|
13
14
|
getCurrentState(): ConnectionState;
|
|
14
15
|
isConnected(): boolean;
|
|
15
|
-
|
|
16
|
+
getDefaultServerName(): string | null;
|
|
17
|
+
switchServer(serverName: string, database?: string, schema?: string): Promise<void>;
|
|
18
|
+
setCurrentSchema(schema: string): void;
|
|
19
|
+
getConnectionInfo(): ConnectionInfo;
|
|
20
|
+
connectToDefault(): Promise<boolean>;
|
|
16
21
|
switchDatabase(database: string): Promise<void>;
|
|
17
22
|
listDatabases(): Promise<DatabaseInfo[]>;
|
|
18
23
|
query<T extends QueryResultRow = any>(sql: string, params?: any[]): Promise<QueryResult<T>>;
|
|
@@ -20,6 +25,14 @@ export declare class DatabaseManager {
|
|
|
20
25
|
close(): Promise<void>;
|
|
21
26
|
isReadOnly(): boolean;
|
|
22
27
|
setReadOnlyMode(readOnly: boolean): void;
|
|
28
|
+
setQueryTimeout(timeoutMs: number): void;
|
|
23
29
|
}
|
|
24
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Gets the singleton DatabaseManager instance.
|
|
32
|
+
* The access mode is determined by the POSTGRES_ACCESS_MODE environment variable:
|
|
33
|
+
* - 'readonly', 'read-only', 'ro': Read-only mode (prevents write operations)
|
|
34
|
+
* - 'full' (default): Full access mode (allows all operations)
|
|
35
|
+
*/
|
|
36
|
+
export declare function getDbManager(): DatabaseManager;
|
|
37
|
+
export declare function resetDbManager(): void;
|
|
25
38
|
//# sourceMappingURL=db-manager.d.ts.map
|
package/dist/db-manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-manager.d.ts","sourceRoot":"","sources":["../src/db-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"db-manager.d.ts","sourceRoot":"","sources":["../src/db-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACb,MAAM,YAAY,CAAC;AA8CpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,cAAc,CAAS;gBAEnB,YAAY,GAAE,OAAc,EAAE,cAAc,GAAE,MAAiC;IAW3F,OAAO,CAAC,iBAAiB;IAgClB,gBAAgB,IAAI,aAAa;IAKjC,cAAc,IAAI,MAAM,EAAE;IAI1B,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAOxD,eAAe,IAAI,eAAe;IAIlC,WAAW,IAAI,OAAO;IAItB,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAW/B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuDzF,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOtC,iBAAiB,IAAI,cAAc;IAgB7B,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAepC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAcxC,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA4B3F,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAOhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,UAAU,IAAI,OAAO;IAIrB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIxC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAGhD;AAKD;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,eAAe,CAO9C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
|
package/dist/db-manager.js
CHANGED
|
@@ -1,22 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.DatabaseManager = void 0;
|
|
4
|
-
exports.getDbManager = getDbManager;
|
|
5
|
-
const pg_1 = require("pg");
|
|
1
|
+
import { Pool } from 'pg';
|
|
2
|
+
import { isReadOnlySql } from './utils/validation.js';
|
|
6
3
|
const DEFAULT_PORT = '5432';
|
|
7
4
|
const DEFAULT_DATABASE = 'postgres';
|
|
8
|
-
|
|
5
|
+
const DEFAULT_SCHEMA = 'public';
|
|
6
|
+
const DEFAULT_QUERY_TIMEOUT_MS = 30000; // 30 seconds
|
|
7
|
+
const MAX_QUERY_TIMEOUT_MS = 300000; // 5 minutes
|
|
8
|
+
/**
|
|
9
|
+
* Converts the ServerConfig ssl option to pg Pool ssl config format.
|
|
10
|
+
*/
|
|
11
|
+
function getSslConfig(ssl) {
|
|
12
|
+
if (ssl === undefined || ssl === false || ssl === 'disable') {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
if (ssl === true || ssl === 'require') {
|
|
16
|
+
// Most cloud providers need rejectUnauthorized: false for self-signed certs
|
|
17
|
+
return { rejectUnauthorized: false };
|
|
18
|
+
}
|
|
19
|
+
if (ssl === 'prefer' || ssl === 'allow') {
|
|
20
|
+
return { rejectUnauthorized: false };
|
|
21
|
+
}
|
|
22
|
+
if (typeof ssl === 'object') {
|
|
23
|
+
return ssl;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Determines the access mode from environment variable.
|
|
29
|
+
* POSTGRES_ACCESS_MODE can be 'readonly' or 'full' (default).
|
|
30
|
+
*/
|
|
31
|
+
function getAccessModeFromEnv() {
|
|
32
|
+
const mode = process.env.POSTGRES_ACCESS_MODE?.toLowerCase().trim();
|
|
33
|
+
if (mode === 'readonly' || mode === 'read-only' || mode === 'ro') {
|
|
34
|
+
return true; // read-only mode
|
|
35
|
+
}
|
|
36
|
+
// Default is 'full' access (read-only = false)
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
export class DatabaseManager {
|
|
9
40
|
serversConfig;
|
|
10
41
|
connectionState;
|
|
11
42
|
currentPool = null;
|
|
12
43
|
readOnlyMode;
|
|
13
|
-
|
|
44
|
+
queryTimeoutMs;
|
|
45
|
+
constructor(readOnlyMode = true, queryTimeoutMs = DEFAULT_QUERY_TIMEOUT_MS) {
|
|
14
46
|
this.serversConfig = this.loadServersConfig();
|
|
15
47
|
this.connectionState = {
|
|
16
48
|
currentServer: null,
|
|
17
|
-
currentDatabase: null
|
|
49
|
+
currentDatabase: null,
|
|
50
|
+
currentSchema: null
|
|
18
51
|
};
|
|
19
52
|
this.readOnlyMode = readOnlyMode;
|
|
53
|
+
this.queryTimeoutMs = Math.min(queryTimeoutMs, MAX_QUERY_TIMEOUT_MS);
|
|
20
54
|
}
|
|
21
55
|
loadServersConfig() {
|
|
22
56
|
const configEnv = process.env.POSTGRES_SERVERS;
|
|
@@ -25,7 +59,21 @@ class DatabaseManager {
|
|
|
25
59
|
return {};
|
|
26
60
|
}
|
|
27
61
|
try {
|
|
28
|
-
|
|
62
|
+
const parsed = JSON.parse(configEnv);
|
|
63
|
+
// Validate the structure
|
|
64
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
65
|
+
throw new Error('POSTGRES_SERVERS must be a JSON object');
|
|
66
|
+
}
|
|
67
|
+
for (const [name, config] of Object.entries(parsed)) {
|
|
68
|
+
if (!config || typeof config !== 'object') {
|
|
69
|
+
throw new Error(`Server '${name}' configuration is invalid`);
|
|
70
|
+
}
|
|
71
|
+
const serverConfig = config;
|
|
72
|
+
if (!serverConfig.host || typeof serverConfig.host !== 'string') {
|
|
73
|
+
throw new Error(`Server '${name}' must have a valid 'host' string`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return parsed;
|
|
29
77
|
}
|
|
30
78
|
catch (error) {
|
|
31
79
|
console.error('Error parsing POSTGRES_SERVERS:', error);
|
|
@@ -33,13 +81,18 @@ class DatabaseManager {
|
|
|
33
81
|
}
|
|
34
82
|
}
|
|
35
83
|
getServersConfig() {
|
|
36
|
-
|
|
84
|
+
// Return a copy to prevent mutation
|
|
85
|
+
return JSON.parse(JSON.stringify(this.serversConfig));
|
|
37
86
|
}
|
|
38
87
|
getServerNames() {
|
|
39
88
|
return Object.keys(this.serversConfig);
|
|
40
89
|
}
|
|
41
90
|
getServerConfig(serverName) {
|
|
42
|
-
|
|
91
|
+
const config = this.serversConfig[serverName];
|
|
92
|
+
if (!config)
|
|
93
|
+
return null;
|
|
94
|
+
// Return a copy to prevent mutation
|
|
95
|
+
return { ...config };
|
|
43
96
|
}
|
|
44
97
|
getCurrentState() {
|
|
45
98
|
return { ...this.connectionState };
|
|
@@ -47,7 +100,17 @@ class DatabaseManager {
|
|
|
47
100
|
isConnected() {
|
|
48
101
|
return this.currentPool !== null;
|
|
49
102
|
}
|
|
50
|
-
|
|
103
|
+
getDefaultServerName() {
|
|
104
|
+
for (const [name, config] of Object.entries(this.serversConfig)) {
|
|
105
|
+
if (config.isDefault) {
|
|
106
|
+
return name;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// If no default is set, return the first server
|
|
110
|
+
const names = this.getServerNames();
|
|
111
|
+
return names.length > 0 ? names[0] : null;
|
|
112
|
+
}
|
|
113
|
+
async switchServer(serverName, database, schema) {
|
|
51
114
|
const serverConfig = this.getServerConfig(serverName);
|
|
52
115
|
if (!serverConfig) {
|
|
53
116
|
throw new Error(`Server '${serverName}' not found in configuration`);
|
|
@@ -55,9 +118,16 @@ class DatabaseManager {
|
|
|
55
118
|
// Close existing pool if any
|
|
56
119
|
if (this.currentPool) {
|
|
57
120
|
await this.currentPool.end();
|
|
121
|
+
this.currentPool = null;
|
|
58
122
|
}
|
|
59
|
-
|
|
60
|
-
|
|
123
|
+
// Use provided database, server's default, or system default
|
|
124
|
+
const dbName = database || serverConfig.defaultDatabase || DEFAULT_DATABASE;
|
|
125
|
+
// Validate database name
|
|
126
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(dbName)) {
|
|
127
|
+
throw new Error('Invalid database name. Only alphanumeric characters and underscores are allowed.');
|
|
128
|
+
}
|
|
129
|
+
const sslConfig = getSslConfig(serverConfig.ssl);
|
|
130
|
+
this.currentPool = new Pool({
|
|
61
131
|
host: serverConfig.host,
|
|
62
132
|
port: parseInt(serverConfig.port || DEFAULT_PORT, 10),
|
|
63
133
|
user: serverConfig.username,
|
|
@@ -65,7 +135,13 @@ class DatabaseManager {
|
|
|
65
135
|
database: dbName,
|
|
66
136
|
max: 10,
|
|
67
137
|
idleTimeoutMillis: 30000,
|
|
68
|
-
connectionTimeoutMillis: 10000
|
|
138
|
+
connectionTimeoutMillis: 10000,
|
|
139
|
+
statement_timeout: this.queryTimeoutMs,
|
|
140
|
+
...(sslConfig && { ssl: sslConfig })
|
|
141
|
+
});
|
|
142
|
+
// Handle pool errors
|
|
143
|
+
this.currentPool.on('error', (err) => {
|
|
144
|
+
console.error('Unexpected pool error:', err);
|
|
69
145
|
});
|
|
70
146
|
// Test connection
|
|
71
147
|
try {
|
|
@@ -73,11 +149,47 @@ class DatabaseManager {
|
|
|
73
149
|
client.release();
|
|
74
150
|
this.connectionState.currentServer = serverName;
|
|
75
151
|
this.connectionState.currentDatabase = dbName;
|
|
152
|
+
// Use provided schema, server's default, or system default
|
|
153
|
+
this.connectionState.currentSchema = schema || serverConfig.defaultSchema || DEFAULT_SCHEMA;
|
|
76
154
|
}
|
|
77
155
|
catch (error) {
|
|
78
156
|
await this.currentPool.end();
|
|
79
157
|
this.currentPool = null;
|
|
80
|
-
throw new Error(`Failed to connect to server '${serverName}': ${error}`);
|
|
158
|
+
throw new Error(`Failed to connect to server '${serverName}': ${error instanceof Error ? error.message : String(error)}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
setCurrentSchema(schema) {
|
|
162
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(schema)) {
|
|
163
|
+
throw new Error('Invalid schema name. Only alphanumeric characters and underscores are allowed.');
|
|
164
|
+
}
|
|
165
|
+
this.connectionState.currentSchema = schema;
|
|
166
|
+
}
|
|
167
|
+
getConnectionInfo() {
|
|
168
|
+
const serverConfig = this.connectionState.currentServer
|
|
169
|
+
? this.getServerConfig(this.connectionState.currentServer)
|
|
170
|
+
: null;
|
|
171
|
+
return {
|
|
172
|
+
isConnected: this.isConnected(),
|
|
173
|
+
server: this.connectionState.currentServer,
|
|
174
|
+
database: this.connectionState.currentDatabase,
|
|
175
|
+
schema: this.connectionState.currentSchema,
|
|
176
|
+
host: serverConfig?.host || null,
|
|
177
|
+
port: serverConfig?.port || null,
|
|
178
|
+
accessMode: this.readOnlyMode ? 'readonly' : 'full'
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
async connectToDefault() {
|
|
182
|
+
const defaultServer = this.getDefaultServerName();
|
|
183
|
+
if (!defaultServer) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
await this.switchServer(defaultServer);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
console.error(`Failed to connect to default server: ${error}`);
|
|
192
|
+
return false;
|
|
81
193
|
}
|
|
82
194
|
}
|
|
83
195
|
async switchDatabase(database) {
|
|
@@ -103,17 +215,26 @@ class DatabaseManager {
|
|
|
103
215
|
if (!this.currentPool) {
|
|
104
216
|
throw new Error('No database connection. Please switch to a server and database first.');
|
|
105
217
|
}
|
|
106
|
-
|
|
218
|
+
if (!sql || typeof sql !== 'string') {
|
|
219
|
+
throw new Error('SQL query is required and must be a string');
|
|
220
|
+
}
|
|
221
|
+
// Check for read-only mode violations using improved validation
|
|
107
222
|
if (this.readOnlyMode) {
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
if (upperSql.startsWith(op)) {
|
|
112
|
-
throw new Error(`Write operation '${op}' is not allowed in read-only mode`);
|
|
113
|
-
}
|
|
223
|
+
const { isReadOnly, reason } = isReadOnlySql(sql);
|
|
224
|
+
if (!isReadOnly) {
|
|
225
|
+
throw new Error(`Read-only mode violation: ${reason}`);
|
|
114
226
|
}
|
|
115
227
|
}
|
|
116
|
-
|
|
228
|
+
try {
|
|
229
|
+
return await this.currentPool.query(sql, params);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
// Provide more context in error messages
|
|
233
|
+
if (error instanceof Error) {
|
|
234
|
+
throw new Error(`Query failed: ${error.message}`);
|
|
235
|
+
}
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
117
238
|
}
|
|
118
239
|
async getClient() {
|
|
119
240
|
if (!this.currentPool) {
|
|
@@ -127,6 +248,7 @@ class DatabaseManager {
|
|
|
127
248
|
this.currentPool = null;
|
|
128
249
|
this.connectionState.currentServer = null;
|
|
129
250
|
this.connectionState.currentDatabase = null;
|
|
251
|
+
this.connectionState.currentSchema = null;
|
|
130
252
|
}
|
|
131
253
|
}
|
|
132
254
|
isReadOnly() {
|
|
@@ -135,14 +257,30 @@ class DatabaseManager {
|
|
|
135
257
|
setReadOnlyMode(readOnly) {
|
|
136
258
|
this.readOnlyMode = readOnly;
|
|
137
259
|
}
|
|
260
|
+
setQueryTimeout(timeoutMs) {
|
|
261
|
+
this.queryTimeoutMs = Math.min(Math.max(1000, timeoutMs), MAX_QUERY_TIMEOUT_MS);
|
|
262
|
+
}
|
|
138
263
|
}
|
|
139
|
-
exports.DatabaseManager = DatabaseManager;
|
|
140
264
|
// Singleton instance
|
|
141
265
|
let dbManager = null;
|
|
142
|
-
|
|
266
|
+
/**
|
|
267
|
+
* Gets the singleton DatabaseManager instance.
|
|
268
|
+
* The access mode is determined by the POSTGRES_ACCESS_MODE environment variable:
|
|
269
|
+
* - 'readonly', 'read-only', 'ro': Read-only mode (prevents write operations)
|
|
270
|
+
* - 'full' (default): Full access mode (allows all operations)
|
|
271
|
+
*/
|
|
272
|
+
export function getDbManager() {
|
|
143
273
|
if (!dbManager) {
|
|
274
|
+
const readOnlyMode = getAccessModeFromEnv();
|
|
144
275
|
dbManager = new DatabaseManager(readOnlyMode);
|
|
276
|
+
console.error(`PostgreSQL MCP: Access mode = ${readOnlyMode ? 'readonly' : 'full'}`);
|
|
145
277
|
}
|
|
146
278
|
return dbManager;
|
|
147
279
|
}
|
|
280
|
+
export function resetDbManager() {
|
|
281
|
+
if (dbManager) {
|
|
282
|
+
dbManager.close().catch(console.error);
|
|
283
|
+
dbManager = null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
148
286
|
//# sourceMappingURL=db-manager.js.map
|
package/dist/db-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-manager.js","sourceRoot":"","sources":["../src/db-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db-manager.js","sourceRoot":"","sources":["../src/db-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const index_js_2 = require("./tools/index.js");
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { resetDbManager } from './db-manager.js';
|
|
6
|
+
import { listServersAndDbs, switchServerDb, getCurrentConnection, listSchemas, listObjects, getObjectDetails, executeSql, explainQuery, getTopQueries, analyzeWorkloadIndexes, analyzeQueryIndexes, analyzeDbHealth } from './tools/index.js';
|
|
8
7
|
// Tool definitions
|
|
9
8
|
const tools = [
|
|
10
9
|
{
|
|
@@ -32,7 +31,7 @@ const tools = [
|
|
|
32
31
|
},
|
|
33
32
|
{
|
|
34
33
|
name: 'switch_server_db',
|
|
35
|
-
description: 'Switch to a different PostgreSQL server and optionally a specific database. Must be called before using other database tools.',
|
|
34
|
+
description: 'Switch to a different PostgreSQL server and optionally a specific database and schema. Must be called before using other database tools. Uses server defaults if not specified.',
|
|
36
35
|
inputSchema: {
|
|
37
36
|
type: 'object',
|
|
38
37
|
properties: {
|
|
@@ -42,12 +41,24 @@ const tools = [
|
|
|
42
41
|
},
|
|
43
42
|
database: {
|
|
44
43
|
type: 'string',
|
|
45
|
-
description: 'Name of the database to connect to (
|
|
44
|
+
description: 'Name of the database to connect to (uses server default or "postgres")'
|
|
45
|
+
},
|
|
46
|
+
schema: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Name of the default schema (uses server default or "public")'
|
|
46
49
|
}
|
|
47
50
|
},
|
|
48
51
|
required: ['server']
|
|
49
52
|
}
|
|
50
53
|
},
|
|
54
|
+
{
|
|
55
|
+
name: 'get_current_connection',
|
|
56
|
+
description: 'Returns details about the current database connection including server, database, schema, host, port, and access mode (readonly/full).',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
51
62
|
{
|
|
52
63
|
name: 'list_schemas',
|
|
53
64
|
description: 'Lists all database schemas available in the current PostgreSQL database.',
|
|
@@ -140,7 +151,7 @@ const tools = [
|
|
|
140
151
|
},
|
|
141
152
|
analyze: {
|
|
142
153
|
type: 'boolean',
|
|
143
|
-
description: 'Actually execute the query to get real timing (default: false)',
|
|
154
|
+
description: 'Actually execute the query to get real timing (default: false). Only allowed for SELECT queries.',
|
|
144
155
|
default: false
|
|
145
156
|
},
|
|
146
157
|
buffers: {
|
|
@@ -190,7 +201,7 @@ const tools = [
|
|
|
190
201
|
properties: {
|
|
191
202
|
limit: {
|
|
192
203
|
type: 'number',
|
|
193
|
-
description: 'Number of queries to return',
|
|
204
|
+
description: 'Number of queries to return (1-100)',
|
|
194
205
|
default: 10
|
|
195
206
|
},
|
|
196
207
|
orderBy: {
|
|
@@ -215,7 +226,7 @@ const tools = [
|
|
|
215
226
|
properties: {
|
|
216
227
|
topQueriesCount: {
|
|
217
228
|
type: 'number',
|
|
218
|
-
description: 'Number of top queries to analyze',
|
|
229
|
+
description: 'Number of top queries to analyze (1-50)',
|
|
219
230
|
default: 20
|
|
220
231
|
},
|
|
221
232
|
includeHypothetical: {
|
|
@@ -252,7 +263,7 @@ const tools = [
|
|
|
252
263
|
}
|
|
253
264
|
];
|
|
254
265
|
// Create MCP server
|
|
255
|
-
const server = new
|
|
266
|
+
const server = new Server({
|
|
256
267
|
name: 'postgres-mcp-server',
|
|
257
268
|
version: '1.0.0',
|
|
258
269
|
}, {
|
|
@@ -261,32 +272,35 @@ const server = new index_js_1.Server({
|
|
|
261
272
|
},
|
|
262
273
|
});
|
|
263
274
|
// Handle list_tools request
|
|
264
|
-
server.setRequestHandler(
|
|
275
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
265
276
|
return { tools };
|
|
266
277
|
});
|
|
267
278
|
// Handle tool calls
|
|
268
|
-
server.setRequestHandler(
|
|
279
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
269
280
|
const { name, arguments: args } = request.params;
|
|
270
281
|
try {
|
|
271
282
|
let result;
|
|
272
283
|
switch (name) {
|
|
273
284
|
case 'list_servers_and_dbs':
|
|
274
|
-
result = await
|
|
285
|
+
result = await listServersAndDbs(args);
|
|
275
286
|
break;
|
|
276
287
|
case 'switch_server_db':
|
|
277
|
-
result = await
|
|
288
|
+
result = await switchServerDb(args);
|
|
289
|
+
break;
|
|
290
|
+
case 'get_current_connection':
|
|
291
|
+
result = await getCurrentConnection();
|
|
278
292
|
break;
|
|
279
293
|
case 'list_schemas':
|
|
280
|
-
result = await
|
|
294
|
+
result = await listSchemas(args);
|
|
281
295
|
break;
|
|
282
296
|
case 'list_objects':
|
|
283
|
-
result = await
|
|
297
|
+
result = await listObjects(args);
|
|
284
298
|
break;
|
|
285
299
|
case 'get_object_details':
|
|
286
|
-
result = await
|
|
300
|
+
result = await getObjectDetails(args);
|
|
287
301
|
break;
|
|
288
302
|
case 'execute_sql':
|
|
289
|
-
result = await
|
|
303
|
+
result = await executeSql(args);
|
|
290
304
|
// Special handling for large output
|
|
291
305
|
if (result.outputFile) {
|
|
292
306
|
return {
|
|
@@ -306,19 +320,19 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
|
306
320
|
}
|
|
307
321
|
break;
|
|
308
322
|
case 'explain_query':
|
|
309
|
-
result = await
|
|
323
|
+
result = await explainQuery(args);
|
|
310
324
|
break;
|
|
311
325
|
case 'get_top_queries':
|
|
312
|
-
result = await
|
|
326
|
+
result = await getTopQueries(args);
|
|
313
327
|
break;
|
|
314
328
|
case 'analyze_workload_indexes':
|
|
315
|
-
result = await
|
|
329
|
+
result = await analyzeWorkloadIndexes(args);
|
|
316
330
|
break;
|
|
317
331
|
case 'analyze_query_indexes':
|
|
318
|
-
result = await
|
|
332
|
+
result = await analyzeQueryIndexes(args);
|
|
319
333
|
break;
|
|
320
334
|
case 'analyze_db_health':
|
|
321
|
-
result = await
|
|
335
|
+
result = await analyzeDbHealth();
|
|
322
336
|
break;
|
|
323
337
|
default:
|
|
324
338
|
throw new Error(`Unknown tool: ${name}`);
|
|
@@ -345,9 +359,31 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
|
345
359
|
};
|
|
346
360
|
}
|
|
347
361
|
});
|
|
362
|
+
// Graceful shutdown handling
|
|
363
|
+
async function shutdown() {
|
|
364
|
+
console.error('Shutting down PostgreSQL MCP Server...');
|
|
365
|
+
try {
|
|
366
|
+
resetDbManager();
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
console.error('Error during shutdown:', error);
|
|
370
|
+
}
|
|
371
|
+
process.exit(0);
|
|
372
|
+
}
|
|
373
|
+
process.on('SIGINT', shutdown);
|
|
374
|
+
process.on('SIGTERM', shutdown);
|
|
375
|
+
process.on('SIGHUP', shutdown);
|
|
376
|
+
// Handle uncaught errors
|
|
377
|
+
process.on('uncaughtException', (error) => {
|
|
378
|
+
console.error('Uncaught exception:', error);
|
|
379
|
+
shutdown();
|
|
380
|
+
});
|
|
381
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
382
|
+
console.error('Unhandled rejection at:', promise, 'reason:', reason);
|
|
383
|
+
});
|
|
348
384
|
// Start server
|
|
349
385
|
async function main() {
|
|
350
|
-
const transport = new
|
|
386
|
+
const transport = new StdioServerTransport();
|
|
351
387
|
await server.connect(transport);
|
|
352
388
|
console.error('PostgreSQL MCP Server started');
|
|
353
389
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAgB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B,mBAAmB;AACnB,MAAM,KAAK,GAAW;IACpB;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,6LAA6L;QAC1M,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uEAAuE;iBACrF;gBACD,gBAAgB,EAAE;oBAChB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,iDAAiD;oBAC9D,OAAO,EAAE,KAAK;iBACf;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,+CAA+C;oBAC5D,OAAO,EAAE,KAAK;iBACf;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,iLAAiL;QAC9L,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iEAAiE;iBAC/E;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wEAAwE;iBACtF;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8DAA8D;iBAC5E;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,wIAAwI;QACrJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,0EAA0E;QACvF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,oBAAoB,EAAE;oBACpB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,+DAA+D;oBAC5E,OAAO,EAAE,KAAK;iBACf;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,0FAA0F;QACvG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC;oBACvD,WAAW,EAAE,yBAAyB;oBACtC,OAAO,EAAE,KAAK;iBACf;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yDAAyD;iBACvE;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,8HAA8H;QAC3I,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mCAAmC;iBACjD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uCAAuC;iBACrD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC;oBACnC,WAAW,EAAE,oBAAoB;iBAClC;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;SACnC;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,2LAA2L;QACxM,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0BAA0B;iBACxC;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sFAAsF;oBACnG,OAAO,EAAE,IAAI;iBACd;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,sJAAsJ;QACnK,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sBAAsB;iBACpC;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,kGAAkG;oBAC/G,OAAO,EAAE,KAAK;iBACf;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,iCAAiC;oBAC9C,OAAO,EAAE,KAAK;iBACf;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;oBACrC,WAAW,EAAE,4BAA4B;oBACzC,OAAO,EAAE,MAAM;iBAChB;gBACD,mBAAmB,EAAE;oBACnB,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,8DAA8D;oBAC3E,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,uCAAuC;6BACrD;4BACD,OAAO,EAAE;gCACP,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACzB,WAAW,EAAE,iCAAiC;6BAC/C;4BACD,SAAS,EAAE;gCACT,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,sCAAsC;gCACnD,OAAO,EAAE,OAAO;6BACjB;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;qBAC/B;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,qIAAqI;QAClJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;oBAClD,OAAO,EAAE,EAAE;iBACZ;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC;oBAC1C,WAAW,EAAE,0BAA0B;oBACvC,OAAO,EAAE,YAAY;iBACtB;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4CAA4C;oBACzD,OAAO,EAAE,CAAC;iBACX;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,2IAA2I;QACxJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,eAAe,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yCAAyC;oBACtD,OAAO,EAAE,EAAE;iBACZ;gBACD,mBAAmB,EAAE;oBACnB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,uDAAuD;oBACpE,OAAO,EAAE,KAAK;iBACf;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,mFAAmF;QAChG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,yCAAyC;oBACtD,QAAQ,EAAE,EAAE;iBACb;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,yMAAyM;QACtN,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;CACF,CAAC;AAEF,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,qBAAqB;IAC3B,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,IAAI,MAAW,CAAC;QAEhB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,sBAAsB;gBACzB,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAW,CAAC,CAAC;gBAC9C,MAAM;YAER,KAAK,kBAAkB;gBACrB,MAAM,GAAG,MAAM,cAAc,CAAC,IAAW,CAAC,CAAC;gBAC3C,MAAM;YAER,KAAK,wBAAwB;gBAC3B,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;gBACtC,MAAM;YAER,KAAK,cAAc;gBACjB,MAAM,GAAG,MAAM,WAAW,CAAC,IAAW,CAAC,CAAC;gBACxC,MAAM;YAER,KAAK,cAAc;gBACjB,MAAM,GAAG,MAAM,WAAW,CAAC,IAAW,CAAC,CAAC;gBACxC,MAAM;YAER,KAAK,oBAAoB;gBACvB,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAW,CAAC,CAAC;gBAC7C,MAAM;YAER,KAAK,aAAa;gBAChB,MAAM,GAAG,MAAM,UAAU,CAAC,IAAW,CAAC,CAAC;gBACvC,oCAAoC;gBACpC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACtB,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,OAAO,EAAE,qBAAqB,MAAM,CAAC,QAAQ,kCAAkC;oCAC/E,UAAU,EAAE,MAAM,CAAC,UAAU;oCAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oCACzB,MAAM,EAAE,MAAM,CAAC,MAAM;oCACrB,IAAI,EAAE,4FAA4F;iCACnG,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,eAAe;gBAClB,MAAM,GAAG,MAAM,YAAY,CAAC,IAAW,CAAC,CAAC;gBACzC,MAAM;YAER,KAAK,iBAAiB;gBACpB,MAAM,GAAG,MAAM,aAAa,CAAC,IAAW,CAAC,CAAC;gBAC1C,MAAM;YAER,KAAK,0BAA0B;gBAC7B,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAW,CAAC,CAAC;gBACnD,MAAM;YAER,KAAK,uBAAuB;gBAC1B,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAW,CAAC,CAAC;gBAChD,MAAM;YAER,KAAK,mBAAmB;gBACtB,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;gBACjC,MAAM;YAER;gBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,6BAA6B;AAC7B,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,cAAc,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE/B,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC5C,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-tools.d.ts","sourceRoot":"","sources":["../../src/tools/analysis-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"analysis-tools.d.ts","sourceRoot":"","sources":["../../src/tools/analysis-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKhF,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAoEvB;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,eAAe,EAAE,mBAAmB,EAAE,CAAC;CACxC,CAAC,CA6BD;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,OAAO,CAAC;IACV,aAAa,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,EAAE,mBAAmB,EAAE,CAAC;QACvC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC,CAAC,CA8CD;AAyID,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4RpE"}
|