postgresai 0.12.0-beta.7 → 0.14.0-dev.8
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 +33 -0
- package/bin/postgres-ai.ts +124 -0
- package/dist/bin/postgres-ai.js +109 -0
- package/dist/bin/postgres-ai.js.map +1 -1
- package/dist/lib/init.d.ts +64 -0
- package/dist/lib/init.d.ts.map +1 -0
- package/dist/lib/init.js +399 -0
- package/dist/lib/init.js.map +1 -0
- package/dist/package.json +3 -2
- package/lib/init.ts +452 -0
- package/package.json +3 -2
- package/test/init.integration.test.cjs +269 -0
- package/test/init.test.cjs +76 -0
package/dist/lib/init.js
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.maskConnectionString = maskConnectionString;
|
|
37
|
+
exports.parseLibpqConninfo = parseLibpqConninfo;
|
|
38
|
+
exports.describePgConfig = describePgConfig;
|
|
39
|
+
exports.resolveAdminConnection = resolveAdminConnection;
|
|
40
|
+
exports.promptHidden = promptHidden;
|
|
41
|
+
exports.resolveMonitoringPassword = resolveMonitoringPassword;
|
|
42
|
+
exports.buildInitPlan = buildInitPlan;
|
|
43
|
+
exports.applyInitPlan = applyInitPlan;
|
|
44
|
+
const readline = __importStar(require("readline"));
|
|
45
|
+
const crypto_1 = require("crypto");
|
|
46
|
+
const url_1 = require("url");
|
|
47
|
+
function quoteIdent(ident) {
|
|
48
|
+
// Always quote. Escape embedded quotes by doubling.
|
|
49
|
+
return `"${ident.replace(/"/g, "\"\"")}"`;
|
|
50
|
+
}
|
|
51
|
+
function maskConnectionString(dbUrl) {
|
|
52
|
+
// Hide password if present (postgresql://user:pass@host/db).
|
|
53
|
+
try {
|
|
54
|
+
const u = new url_1.URL(dbUrl);
|
|
55
|
+
if (u.password)
|
|
56
|
+
u.password = "*****";
|
|
57
|
+
return u.toString();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return dbUrl.replace(/\/\/([^:/?#]+):([^@/?#]+)@/g, "//$1:*****@");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function isLikelyUri(value) {
|
|
64
|
+
return /^postgres(ql)?:\/\//i.test(value.trim());
|
|
65
|
+
}
|
|
66
|
+
function tokenizeConninfo(input) {
|
|
67
|
+
const s = input.trim();
|
|
68
|
+
const tokens = [];
|
|
69
|
+
let i = 0;
|
|
70
|
+
const isSpace = (ch) => ch === " " || ch === "\t" || ch === "\n" || ch === "\r";
|
|
71
|
+
while (i < s.length) {
|
|
72
|
+
while (i < s.length && isSpace(s[i]))
|
|
73
|
+
i++;
|
|
74
|
+
if (i >= s.length)
|
|
75
|
+
break;
|
|
76
|
+
let tok = "";
|
|
77
|
+
let inSingle = false;
|
|
78
|
+
while (i < s.length) {
|
|
79
|
+
const ch = s[i];
|
|
80
|
+
if (!inSingle && isSpace(ch))
|
|
81
|
+
break;
|
|
82
|
+
if (ch === "'" && !inSingle) {
|
|
83
|
+
inSingle = true;
|
|
84
|
+
i++;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (ch === "'" && inSingle) {
|
|
88
|
+
inSingle = false;
|
|
89
|
+
i++;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (ch === "\\" && i + 1 < s.length) {
|
|
93
|
+
tok += s[i + 1];
|
|
94
|
+
i += 2;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
tok += ch;
|
|
98
|
+
i++;
|
|
99
|
+
}
|
|
100
|
+
tokens.push(tok);
|
|
101
|
+
while (i < s.length && isSpace(s[i]))
|
|
102
|
+
i++;
|
|
103
|
+
}
|
|
104
|
+
return tokens;
|
|
105
|
+
}
|
|
106
|
+
function parseLibpqConninfo(input) {
|
|
107
|
+
const tokens = tokenizeConninfo(input);
|
|
108
|
+
const cfg = {};
|
|
109
|
+
for (const t of tokens) {
|
|
110
|
+
const eq = t.indexOf("=");
|
|
111
|
+
if (eq <= 0)
|
|
112
|
+
continue;
|
|
113
|
+
const key = t.slice(0, eq).trim();
|
|
114
|
+
const rawVal = t.slice(eq + 1);
|
|
115
|
+
const val = rawVal.trim();
|
|
116
|
+
if (!key)
|
|
117
|
+
continue;
|
|
118
|
+
switch (key) {
|
|
119
|
+
case "host":
|
|
120
|
+
cfg.host = val;
|
|
121
|
+
break;
|
|
122
|
+
case "port": {
|
|
123
|
+
const p = Number(val);
|
|
124
|
+
if (Number.isFinite(p))
|
|
125
|
+
cfg.port = p;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case "user":
|
|
129
|
+
cfg.user = val;
|
|
130
|
+
break;
|
|
131
|
+
case "password":
|
|
132
|
+
cfg.password = val;
|
|
133
|
+
break;
|
|
134
|
+
case "dbname":
|
|
135
|
+
case "database":
|
|
136
|
+
cfg.database = val;
|
|
137
|
+
break;
|
|
138
|
+
// ignore everything else (sslmode, options, application_name, etc.)
|
|
139
|
+
default:
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return cfg;
|
|
144
|
+
}
|
|
145
|
+
function describePgConfig(cfg) {
|
|
146
|
+
if (cfg.connectionString)
|
|
147
|
+
return maskConnectionString(cfg.connectionString);
|
|
148
|
+
const user = cfg.user ? cfg.user : "<user>";
|
|
149
|
+
const host = cfg.host ? cfg.host : "<host>";
|
|
150
|
+
const port = cfg.port ? String(cfg.port) : "<port>";
|
|
151
|
+
const db = cfg.database ? cfg.database : "<db>";
|
|
152
|
+
// Don't include password
|
|
153
|
+
return `postgresql://${user}:*****@${host}:${port}/${db}`;
|
|
154
|
+
}
|
|
155
|
+
function resolveAdminConnection(opts) {
|
|
156
|
+
const conn = (opts.conn || "").trim();
|
|
157
|
+
const dbUrlFlag = (opts.dbUrlFlag || "").trim();
|
|
158
|
+
const hasPsqlParts = !!(opts.host || opts.port || opts.username || opts.dbname || opts.adminPassword || opts.envPassword);
|
|
159
|
+
if (conn && dbUrlFlag) {
|
|
160
|
+
throw new Error("Provide either positional connection string or --db-url, not both");
|
|
161
|
+
}
|
|
162
|
+
if (conn || dbUrlFlag) {
|
|
163
|
+
const v = conn || dbUrlFlag;
|
|
164
|
+
if (isLikelyUri(v)) {
|
|
165
|
+
return { clientConfig: { connectionString: v }, display: maskConnectionString(v) };
|
|
166
|
+
}
|
|
167
|
+
// libpq conninfo (dbname=... host=...)
|
|
168
|
+
const cfg = parseLibpqConninfo(v);
|
|
169
|
+
if (opts.envPassword && !cfg.password)
|
|
170
|
+
cfg.password = opts.envPassword;
|
|
171
|
+
return { clientConfig: cfg, display: describePgConfig(cfg) };
|
|
172
|
+
}
|
|
173
|
+
if (!hasPsqlParts) {
|
|
174
|
+
throw new Error([
|
|
175
|
+
"Connection is required.",
|
|
176
|
+
"",
|
|
177
|
+
"Examples:",
|
|
178
|
+
" postgresai init postgresql://admin@host:5432/dbname",
|
|
179
|
+
" postgresai init \"dbname=dbname host=host user=admin\"",
|
|
180
|
+
" postgresai init -h host -p 5432 -U admin -d dbname",
|
|
181
|
+
"",
|
|
182
|
+
"Admin password:",
|
|
183
|
+
" --admin-password <password> (or set PGPASSWORD)",
|
|
184
|
+
].join("\n"));
|
|
185
|
+
}
|
|
186
|
+
const cfg = {};
|
|
187
|
+
if (opts.host)
|
|
188
|
+
cfg.host = opts.host;
|
|
189
|
+
if (opts.port !== undefined && opts.port !== "") {
|
|
190
|
+
const p = Number(opts.port);
|
|
191
|
+
if (!Number.isFinite(p) || !Number.isInteger(p) || p <= 0 || p > 65535) {
|
|
192
|
+
throw new Error(`Invalid port value: ${String(opts.port)}`);
|
|
193
|
+
}
|
|
194
|
+
cfg.port = p;
|
|
195
|
+
}
|
|
196
|
+
if (opts.username)
|
|
197
|
+
cfg.user = opts.username;
|
|
198
|
+
if (opts.dbname)
|
|
199
|
+
cfg.database = opts.dbname;
|
|
200
|
+
if (opts.adminPassword)
|
|
201
|
+
cfg.password = opts.adminPassword;
|
|
202
|
+
if (opts.envPassword && !cfg.password)
|
|
203
|
+
cfg.password = opts.envPassword;
|
|
204
|
+
return { clientConfig: cfg, display: describePgConfig(cfg) };
|
|
205
|
+
}
|
|
206
|
+
async function promptHidden(prompt) {
|
|
207
|
+
// Implement our own hidden input reader so:
|
|
208
|
+
// - prompt text is visible
|
|
209
|
+
// - only user input is masked
|
|
210
|
+
// - we don't rely on non-public readline internals
|
|
211
|
+
if (!process.stdin.isTTY) {
|
|
212
|
+
throw new Error("Cannot prompt for password in non-interactive mode");
|
|
213
|
+
}
|
|
214
|
+
const stdin = process.stdin;
|
|
215
|
+
const stdout = process.stdout;
|
|
216
|
+
stdout.write(prompt);
|
|
217
|
+
return await new Promise((resolve, reject) => {
|
|
218
|
+
let value = "";
|
|
219
|
+
const cleanup = () => {
|
|
220
|
+
try {
|
|
221
|
+
stdin.setRawMode(false);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// ignore
|
|
225
|
+
}
|
|
226
|
+
stdin.removeListener("keypress", onKeypress);
|
|
227
|
+
};
|
|
228
|
+
const onKeypress = (str, key) => {
|
|
229
|
+
if (key?.ctrl && key?.name === "c") {
|
|
230
|
+
stdout.write("\n");
|
|
231
|
+
cleanup();
|
|
232
|
+
reject(new Error("Cancelled"));
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (key?.name === "return" || key?.name === "enter") {
|
|
236
|
+
stdout.write("\n");
|
|
237
|
+
cleanup();
|
|
238
|
+
resolve(value);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (key?.name === "backspace") {
|
|
242
|
+
if (value.length > 0) {
|
|
243
|
+
value = value.slice(0, -1);
|
|
244
|
+
// Erase one mask char.
|
|
245
|
+
stdout.write("\b \b");
|
|
246
|
+
}
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// Ignore other control keys.
|
|
250
|
+
if (key?.ctrl || key?.meta)
|
|
251
|
+
return;
|
|
252
|
+
if (typeof str === "string" && str.length > 0) {
|
|
253
|
+
value += str;
|
|
254
|
+
stdout.write("*");
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
readline.emitKeypressEvents(stdin);
|
|
258
|
+
stdin.setRawMode(true);
|
|
259
|
+
stdin.on("keypress", onKeypress);
|
|
260
|
+
stdin.resume();
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function generateMonitoringPassword() {
|
|
264
|
+
// URL-safe and easy to copy/paste; length ~32 chars.
|
|
265
|
+
return (0, crypto_1.randomBytes)(24).toString("base64url");
|
|
266
|
+
}
|
|
267
|
+
async function resolveMonitoringPassword(opts) {
|
|
268
|
+
const fromFlag = (opts.passwordFlag || "").trim();
|
|
269
|
+
if (fromFlag)
|
|
270
|
+
return { password: fromFlag, generated: false };
|
|
271
|
+
const fromEnv = (opts.passwordEnv || "").trim();
|
|
272
|
+
if (fromEnv)
|
|
273
|
+
return { password: fromEnv, generated: false };
|
|
274
|
+
// Default: auto-generate (safer than prompting; works in non-interactive mode).
|
|
275
|
+
return { password: generateMonitoringPassword(), generated: true };
|
|
276
|
+
}
|
|
277
|
+
async function buildInitPlan(params) {
|
|
278
|
+
const monitoringUser = params.monitoringUser || "postgres_ai_mon";
|
|
279
|
+
const database = params.database;
|
|
280
|
+
const qRole = quoteIdent(monitoringUser);
|
|
281
|
+
const qDb = quoteIdent(database);
|
|
282
|
+
const steps = [];
|
|
283
|
+
// Role creation/update is done in two alternative steps. Caller decides by checking role existence.
|
|
284
|
+
if (params.roleExists === false) {
|
|
285
|
+
steps.push({
|
|
286
|
+
name: "create monitoring user",
|
|
287
|
+
sql: `create user ${qRole} with password $1;`,
|
|
288
|
+
params: [params.monitoringPassword],
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
else if (params.roleExists === true) {
|
|
292
|
+
steps.push({
|
|
293
|
+
name: "update monitoring user password",
|
|
294
|
+
sql: `alter user ${qRole} with password $1;`,
|
|
295
|
+
params: [params.monitoringPassword],
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
// Unknown: caller will rebuild after probing role existence.
|
|
300
|
+
}
|
|
301
|
+
steps.push({
|
|
302
|
+
name: "grant connect on database",
|
|
303
|
+
sql: `grant connect on database ${qDb} to ${qRole};`,
|
|
304
|
+
}, {
|
|
305
|
+
name: "grant pg_monitor",
|
|
306
|
+
sql: `grant pg_monitor to ${qRole};`,
|
|
307
|
+
}, {
|
|
308
|
+
name: "grant select on pg_index",
|
|
309
|
+
sql: `grant select on pg_catalog.pg_index to ${qRole};`,
|
|
310
|
+
}, {
|
|
311
|
+
name: "create or replace public.pg_statistic view",
|
|
312
|
+
sql: `create or replace view public.pg_statistic as
|
|
313
|
+
select
|
|
314
|
+
n.nspname as schemaname,
|
|
315
|
+
c.relname as tablename,
|
|
316
|
+
a.attname,
|
|
317
|
+
s.stanullfrac as null_frac,
|
|
318
|
+
s.stawidth as avg_width,
|
|
319
|
+
false as inherited
|
|
320
|
+
from pg_catalog.pg_statistic s
|
|
321
|
+
join pg_catalog.pg_class c on c.oid = s.starelid
|
|
322
|
+
join pg_catalog.pg_namespace n on n.oid = c.relnamespace
|
|
323
|
+
join pg_catalog.pg_attribute a on a.attrelid = s.starelid and a.attnum = s.staattnum
|
|
324
|
+
where a.attnum > 0 and not a.attisdropped;`,
|
|
325
|
+
}, {
|
|
326
|
+
name: "grant select on public.pg_statistic",
|
|
327
|
+
sql: `grant select on public.pg_statistic to ${qRole};`,
|
|
328
|
+
}, {
|
|
329
|
+
name: "ensure access to public schema (for hardened clusters)",
|
|
330
|
+
sql: `grant usage on schema public to ${qRole};`,
|
|
331
|
+
}, {
|
|
332
|
+
name: "set monitoring user search_path",
|
|
333
|
+
sql: `alter user ${qRole} set search_path = "$user", public, pg_catalog;`,
|
|
334
|
+
});
|
|
335
|
+
if (params.includeOptionalPermissions) {
|
|
336
|
+
steps.push({
|
|
337
|
+
name: "create rds_tools extension (optional)",
|
|
338
|
+
sql: "create extension if not exists rds_tools;",
|
|
339
|
+
optional: true,
|
|
340
|
+
}, {
|
|
341
|
+
name: "grant rds_tools.pg_ls_multixactdir() (optional)",
|
|
342
|
+
sql: `grant execute on function rds_tools.pg_ls_multixactdir() to ${qRole};`,
|
|
343
|
+
optional: true,
|
|
344
|
+
}, {
|
|
345
|
+
name: "grant pg_stat_file(text) (optional)",
|
|
346
|
+
sql: `grant execute on function pg_catalog.pg_stat_file(text) to ${qRole};`,
|
|
347
|
+
optional: true,
|
|
348
|
+
}, {
|
|
349
|
+
name: "grant pg_stat_file(text, boolean) (optional)",
|
|
350
|
+
sql: `grant execute on function pg_catalog.pg_stat_file(text, boolean) to ${qRole};`,
|
|
351
|
+
optional: true,
|
|
352
|
+
}, {
|
|
353
|
+
name: "grant pg_ls_dir(text) (optional)",
|
|
354
|
+
sql: `grant execute on function pg_catalog.pg_ls_dir(text) to ${qRole};`,
|
|
355
|
+
optional: true,
|
|
356
|
+
}, {
|
|
357
|
+
name: "grant pg_ls_dir(text, boolean, boolean) (optional)",
|
|
358
|
+
sql: `grant execute on function pg_catalog.pg_ls_dir(text, boolean, boolean) to ${qRole};`,
|
|
359
|
+
optional: true,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
return { monitoringUser, database, steps };
|
|
363
|
+
}
|
|
364
|
+
async function applyInitPlan(params) {
|
|
365
|
+
const applied = [];
|
|
366
|
+
const skippedOptional = [];
|
|
367
|
+
// Apply non-optional steps in a single transaction.
|
|
368
|
+
await params.client.query("begin;");
|
|
369
|
+
try {
|
|
370
|
+
for (const step of params.plan.steps.filter((s) => !s.optional)) {
|
|
371
|
+
try {
|
|
372
|
+
await params.client.query(step.sql, step.params);
|
|
373
|
+
applied.push(step.name);
|
|
374
|
+
}
|
|
375
|
+
catch (e) {
|
|
376
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
377
|
+
throw new Error(`Failed at step "${step.name}": ${msg}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
await params.client.query("commit;");
|
|
381
|
+
}
|
|
382
|
+
catch (e) {
|
|
383
|
+
await params.client.query("rollback;");
|
|
384
|
+
throw e;
|
|
385
|
+
}
|
|
386
|
+
// Apply optional steps outside of the transaction so a failure doesn't abort everything.
|
|
387
|
+
for (const step of params.plan.steps.filter((s) => s.optional)) {
|
|
388
|
+
try {
|
|
389
|
+
await params.client.query(step.sql, step.params);
|
|
390
|
+
applied.push(step.name);
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
skippedOptional.push(step.name);
|
|
394
|
+
// best-effort: ignore
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return { applied, skippedOptional };
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../lib/init.ts"],"names":[],"mappings":"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"}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "postgresai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0-dev.8",
|
|
4
4
|
"description": "postgres_ai CLI (Node.js)",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"private": false,
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
"build": "tsc",
|
|
26
26
|
"prepare": "npm run build",
|
|
27
27
|
"start": "node ./dist/bin/postgres-ai.js --help",
|
|
28
|
-
"dev": "tsc --watch"
|
|
28
|
+
"dev": "tsc --watch",
|
|
29
|
+
"test": "npm run build && node --test test/*.test.cjs"
|
|
29
30
|
},
|
|
30
31
|
"dependencies": {
|
|
31
32
|
"@modelcontextprotocol/sdk": "^1.20.2",
|