postgresai 0.12.0-beta.6 → 0.14.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -4
- package/bin/postgres-ai.ts +768 -37
- package/dist/bin/postgres-ai.js +706 -26
- package/dist/bin/postgres-ai.js.map +1 -1
- package/dist/lib/init.d.ts +75 -0
- package/dist/lib/init.d.ts.map +1 -0
- package/dist/lib/init.js +483 -0
- package/dist/lib/init.js.map +1 -0
- package/dist/lib/issues.d.ts +69 -1
- package/dist/lib/issues.d.ts.map +1 -1
- package/dist/lib/issues.js +232 -1
- package/dist/lib/issues.js.map +1 -1
- package/dist/lib/mcp-server.d.ts.map +1 -1
- package/dist/lib/mcp-server.js +69 -15
- package/dist/lib/mcp-server.js.map +1 -1
- package/dist/package.json +3 -2
- package/lib/init.ts +565 -0
- package/lib/issues.ts +325 -3
- package/lib/mcp-server.ts +75 -17
- package/package.json +3 -2
- package/sql/01.role.sql +15 -0
- package/sql/02.permissions.sql +33 -0
- package/sql/03.optional_rds.sql +6 -0
- package/sql/04.optional_self_managed.sql +8 -0
- package/test/init.integration.test.cjs +368 -0
- package/test/init.test.cjs +154 -0
package/dist/lib/init.js
ADDED
|
@@ -0,0 +1,483 @@
|
|
|
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
|
+
exports.verifyInitSetup = verifyInitSetup;
|
|
45
|
+
const readline = __importStar(require("readline"));
|
|
46
|
+
const crypto_1 = require("crypto");
|
|
47
|
+
const url_1 = require("url");
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
function packageRootDirFromCompiled() {
|
|
51
|
+
// dist/lib/init.js -> <pkg>/dist/lib ; package root is ../..
|
|
52
|
+
return path.resolve(__dirname, "..", "..");
|
|
53
|
+
}
|
|
54
|
+
function sqlDir() {
|
|
55
|
+
return path.join(packageRootDirFromCompiled(), "sql");
|
|
56
|
+
}
|
|
57
|
+
function loadSqlTemplate(filename) {
|
|
58
|
+
const p = path.join(sqlDir(), filename);
|
|
59
|
+
return fs.readFileSync(p, "utf8");
|
|
60
|
+
}
|
|
61
|
+
function applyTemplate(sql, vars) {
|
|
62
|
+
return sql.replace(/\{\{([A-Z0-9_]+)\}\}/g, (_, key) => {
|
|
63
|
+
const v = vars[key];
|
|
64
|
+
if (v === undefined)
|
|
65
|
+
throw new Error(`Missing SQL template var: ${key}`);
|
|
66
|
+
return v;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function quoteIdent(ident) {
|
|
70
|
+
// Always quote. Escape embedded quotes by doubling.
|
|
71
|
+
return `"${ident.replace(/"/g, "\"\"")}"`;
|
|
72
|
+
}
|
|
73
|
+
function quoteLiteral(value) {
|
|
74
|
+
// Single-quote and escape embedded quotes by doubling.
|
|
75
|
+
// This is used where Postgres grammar requires a literal (e.g., CREATE/ALTER ROLE PASSWORD).
|
|
76
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
77
|
+
}
|
|
78
|
+
function maskConnectionString(dbUrl) {
|
|
79
|
+
// Hide password if present (postgresql://user:pass@host/db).
|
|
80
|
+
try {
|
|
81
|
+
const u = new url_1.URL(dbUrl);
|
|
82
|
+
if (u.password)
|
|
83
|
+
u.password = "*****";
|
|
84
|
+
return u.toString();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return dbUrl.replace(/\/\/([^:/?#]+):([^@/?#]+)@/g, "//$1:*****@");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function isLikelyUri(value) {
|
|
91
|
+
return /^postgres(ql)?:\/\//i.test(value.trim());
|
|
92
|
+
}
|
|
93
|
+
function tokenizeConninfo(input) {
|
|
94
|
+
const s = input.trim();
|
|
95
|
+
const tokens = [];
|
|
96
|
+
let i = 0;
|
|
97
|
+
const isSpace = (ch) => ch === " " || ch === "\t" || ch === "\n" || ch === "\r";
|
|
98
|
+
while (i < s.length) {
|
|
99
|
+
while (i < s.length && isSpace(s[i]))
|
|
100
|
+
i++;
|
|
101
|
+
if (i >= s.length)
|
|
102
|
+
break;
|
|
103
|
+
let tok = "";
|
|
104
|
+
let inSingle = false;
|
|
105
|
+
while (i < s.length) {
|
|
106
|
+
const ch = s[i];
|
|
107
|
+
if (!inSingle && isSpace(ch))
|
|
108
|
+
break;
|
|
109
|
+
if (ch === "'" && !inSingle) {
|
|
110
|
+
inSingle = true;
|
|
111
|
+
i++;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (ch === "'" && inSingle) {
|
|
115
|
+
inSingle = false;
|
|
116
|
+
i++;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (ch === "\\" && i + 1 < s.length) {
|
|
120
|
+
tok += s[i + 1];
|
|
121
|
+
i += 2;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
tok += ch;
|
|
125
|
+
i++;
|
|
126
|
+
}
|
|
127
|
+
tokens.push(tok);
|
|
128
|
+
while (i < s.length && isSpace(s[i]))
|
|
129
|
+
i++;
|
|
130
|
+
}
|
|
131
|
+
return tokens;
|
|
132
|
+
}
|
|
133
|
+
function parseLibpqConninfo(input) {
|
|
134
|
+
const tokens = tokenizeConninfo(input);
|
|
135
|
+
const cfg = {};
|
|
136
|
+
for (const t of tokens) {
|
|
137
|
+
const eq = t.indexOf("=");
|
|
138
|
+
if (eq <= 0)
|
|
139
|
+
continue;
|
|
140
|
+
const key = t.slice(0, eq).trim();
|
|
141
|
+
const rawVal = t.slice(eq + 1);
|
|
142
|
+
const val = rawVal.trim();
|
|
143
|
+
if (!key)
|
|
144
|
+
continue;
|
|
145
|
+
switch (key) {
|
|
146
|
+
case "host":
|
|
147
|
+
cfg.host = val;
|
|
148
|
+
break;
|
|
149
|
+
case "port": {
|
|
150
|
+
const p = Number(val);
|
|
151
|
+
if (Number.isFinite(p))
|
|
152
|
+
cfg.port = p;
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case "user":
|
|
156
|
+
cfg.user = val;
|
|
157
|
+
break;
|
|
158
|
+
case "password":
|
|
159
|
+
cfg.password = val;
|
|
160
|
+
break;
|
|
161
|
+
case "dbname":
|
|
162
|
+
case "database":
|
|
163
|
+
cfg.database = val;
|
|
164
|
+
break;
|
|
165
|
+
// ignore everything else (sslmode, options, application_name, etc.)
|
|
166
|
+
default:
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return cfg;
|
|
171
|
+
}
|
|
172
|
+
function describePgConfig(cfg) {
|
|
173
|
+
if (cfg.connectionString)
|
|
174
|
+
return maskConnectionString(cfg.connectionString);
|
|
175
|
+
const user = cfg.user ? cfg.user : "<user>";
|
|
176
|
+
const host = cfg.host ? cfg.host : "<host>";
|
|
177
|
+
const port = cfg.port ? String(cfg.port) : "<port>";
|
|
178
|
+
const db = cfg.database ? cfg.database : "<db>";
|
|
179
|
+
// Don't include password
|
|
180
|
+
return `postgresql://${user}:*****@${host}:${port}/${db}`;
|
|
181
|
+
}
|
|
182
|
+
function resolveAdminConnection(opts) {
|
|
183
|
+
const conn = (opts.conn || "").trim();
|
|
184
|
+
const dbUrlFlag = (opts.dbUrlFlag || "").trim();
|
|
185
|
+
// NOTE: passwords alone (PGPASSWORD / --admin-password) do NOT constitute a connection.
|
|
186
|
+
// We require at least some connection addressing (host/port/user/db) if no positional arg / --db-url is provided.
|
|
187
|
+
const hasConnDetails = !!(opts.host || opts.port || opts.username || opts.dbname);
|
|
188
|
+
if (conn && dbUrlFlag) {
|
|
189
|
+
throw new Error("Provide either positional connection string or --db-url, not both");
|
|
190
|
+
}
|
|
191
|
+
if (conn || dbUrlFlag) {
|
|
192
|
+
const v = conn || dbUrlFlag;
|
|
193
|
+
if (isLikelyUri(v)) {
|
|
194
|
+
return { clientConfig: { connectionString: v }, display: maskConnectionString(v) };
|
|
195
|
+
}
|
|
196
|
+
// libpq conninfo (dbname=... host=...)
|
|
197
|
+
const cfg = parseLibpqConninfo(v);
|
|
198
|
+
if (opts.envPassword && !cfg.password)
|
|
199
|
+
cfg.password = opts.envPassword;
|
|
200
|
+
return { clientConfig: cfg, display: describePgConfig(cfg) };
|
|
201
|
+
}
|
|
202
|
+
if (!hasConnDetails) {
|
|
203
|
+
throw new Error([
|
|
204
|
+
"Connection is required.",
|
|
205
|
+
"",
|
|
206
|
+
"Examples:",
|
|
207
|
+
" postgresai init postgresql://admin@host:5432/dbname",
|
|
208
|
+
" postgresai init \"dbname=dbname host=host user=admin\"",
|
|
209
|
+
" postgresai init -h host -p 5432 -U admin -d dbname",
|
|
210
|
+
"",
|
|
211
|
+
"Admin password:",
|
|
212
|
+
" --admin-password <password> (or set PGPASSWORD)",
|
|
213
|
+
].join("\n"));
|
|
214
|
+
}
|
|
215
|
+
const cfg = {};
|
|
216
|
+
if (opts.host)
|
|
217
|
+
cfg.host = opts.host;
|
|
218
|
+
if (opts.port !== undefined && opts.port !== "") {
|
|
219
|
+
const p = Number(opts.port);
|
|
220
|
+
if (!Number.isFinite(p) || !Number.isInteger(p) || p <= 0 || p > 65535) {
|
|
221
|
+
throw new Error(`Invalid port value: ${String(opts.port)}`);
|
|
222
|
+
}
|
|
223
|
+
cfg.port = p;
|
|
224
|
+
}
|
|
225
|
+
if (opts.username)
|
|
226
|
+
cfg.user = opts.username;
|
|
227
|
+
if (opts.dbname)
|
|
228
|
+
cfg.database = opts.dbname;
|
|
229
|
+
if (opts.adminPassword)
|
|
230
|
+
cfg.password = opts.adminPassword;
|
|
231
|
+
if (opts.envPassword && !cfg.password)
|
|
232
|
+
cfg.password = opts.envPassword;
|
|
233
|
+
return { clientConfig: cfg, display: describePgConfig(cfg) };
|
|
234
|
+
}
|
|
235
|
+
async function promptHidden(prompt) {
|
|
236
|
+
// Implement our own hidden input reader so:
|
|
237
|
+
// - prompt text is visible
|
|
238
|
+
// - only user input is masked
|
|
239
|
+
// - we don't rely on non-public readline internals
|
|
240
|
+
if (!process.stdin.isTTY) {
|
|
241
|
+
throw new Error("Cannot prompt for password in non-interactive mode");
|
|
242
|
+
}
|
|
243
|
+
const stdin = process.stdin;
|
|
244
|
+
const stdout = process.stdout;
|
|
245
|
+
stdout.write(prompt);
|
|
246
|
+
return await new Promise((resolve, reject) => {
|
|
247
|
+
let value = "";
|
|
248
|
+
const cleanup = () => {
|
|
249
|
+
try {
|
|
250
|
+
stdin.setRawMode(false);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// ignore
|
|
254
|
+
}
|
|
255
|
+
stdin.removeListener("keypress", onKeypress);
|
|
256
|
+
};
|
|
257
|
+
const onKeypress = (str, key) => {
|
|
258
|
+
if (key?.ctrl && key?.name === "c") {
|
|
259
|
+
stdout.write("\n");
|
|
260
|
+
cleanup();
|
|
261
|
+
reject(new Error("Cancelled"));
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (key?.name === "return" || key?.name === "enter") {
|
|
265
|
+
stdout.write("\n");
|
|
266
|
+
cleanup();
|
|
267
|
+
resolve(value);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (key?.name === "backspace") {
|
|
271
|
+
if (value.length > 0) {
|
|
272
|
+
value = value.slice(0, -1);
|
|
273
|
+
// Erase one mask char.
|
|
274
|
+
stdout.write("\b \b");
|
|
275
|
+
}
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
// Ignore other control keys.
|
|
279
|
+
if (key?.ctrl || key?.meta)
|
|
280
|
+
return;
|
|
281
|
+
if (typeof str === "string" && str.length > 0) {
|
|
282
|
+
value += str;
|
|
283
|
+
stdout.write("*");
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
readline.emitKeypressEvents(stdin);
|
|
287
|
+
stdin.setRawMode(true);
|
|
288
|
+
stdin.on("keypress", onKeypress);
|
|
289
|
+
stdin.resume();
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
function generateMonitoringPassword() {
|
|
293
|
+
// URL-safe and easy to copy/paste; length ~32 chars.
|
|
294
|
+
return (0, crypto_1.randomBytes)(24).toString("base64url");
|
|
295
|
+
}
|
|
296
|
+
async function resolveMonitoringPassword(opts) {
|
|
297
|
+
const fromFlag = (opts.passwordFlag || "").trim();
|
|
298
|
+
if (fromFlag)
|
|
299
|
+
return { password: fromFlag, generated: false };
|
|
300
|
+
const fromEnv = (opts.passwordEnv || "").trim();
|
|
301
|
+
if (fromEnv)
|
|
302
|
+
return { password: fromEnv, generated: false };
|
|
303
|
+
// Default: auto-generate (safer than prompting; works in non-interactive mode).
|
|
304
|
+
return { password: generateMonitoringPassword(), generated: true };
|
|
305
|
+
}
|
|
306
|
+
async function buildInitPlan(params) {
|
|
307
|
+
const monitoringUser = params.monitoringUser || "postgres_ai_mon";
|
|
308
|
+
const database = params.database;
|
|
309
|
+
const qRole = quoteIdent(monitoringUser);
|
|
310
|
+
const qDb = quoteIdent(database);
|
|
311
|
+
const qPw = quoteLiteral(params.monitoringPassword);
|
|
312
|
+
const qRoleNameLit = quoteLiteral(monitoringUser);
|
|
313
|
+
const steps = [];
|
|
314
|
+
const vars = {
|
|
315
|
+
ROLE_IDENT: qRole,
|
|
316
|
+
DB_IDENT: qDb,
|
|
317
|
+
};
|
|
318
|
+
// Role creation/update is done in one template file.
|
|
319
|
+
// If roleExists is unknown, use a single DO block to create-or-alter safely.
|
|
320
|
+
let roleStmt = null;
|
|
321
|
+
if (params.roleExists === false) {
|
|
322
|
+
roleStmt = `create user ${qRole} with password ${qPw};`;
|
|
323
|
+
}
|
|
324
|
+
else if (params.roleExists === true) {
|
|
325
|
+
roleStmt = `alter user ${qRole} with password ${qPw};`;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
roleStmt = `do $$ begin
|
|
329
|
+
if not exists (select 1 from pg_catalog.pg_roles where rolname = ${qRoleNameLit}) then
|
|
330
|
+
create user ${qRole} with password ${qPw};
|
|
331
|
+
else
|
|
332
|
+
alter user ${qRole} with password ${qPw};
|
|
333
|
+
end if;
|
|
334
|
+
end $$;`;
|
|
335
|
+
}
|
|
336
|
+
const roleSql = applyTemplate(loadSqlTemplate("01.role.sql"), { ...vars, ROLE_STMT: roleStmt });
|
|
337
|
+
steps.push({ name: "01.role", sql: roleSql });
|
|
338
|
+
steps.push({
|
|
339
|
+
name: "02.permissions",
|
|
340
|
+
sql: applyTemplate(loadSqlTemplate("02.permissions.sql"), vars),
|
|
341
|
+
});
|
|
342
|
+
if (params.includeOptionalPermissions) {
|
|
343
|
+
steps.push({
|
|
344
|
+
name: "03.optional_rds",
|
|
345
|
+
sql: applyTemplate(loadSqlTemplate("03.optional_rds.sql"), vars),
|
|
346
|
+
optional: true,
|
|
347
|
+
}, {
|
|
348
|
+
name: "04.optional_self_managed",
|
|
349
|
+
sql: applyTemplate(loadSqlTemplate("04.optional_self_managed.sql"), vars),
|
|
350
|
+
optional: true,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
return { monitoringUser, database, steps };
|
|
354
|
+
}
|
|
355
|
+
async function applyInitPlan(params) {
|
|
356
|
+
const applied = [];
|
|
357
|
+
const skippedOptional = [];
|
|
358
|
+
// Apply non-optional steps in a single transaction.
|
|
359
|
+
await params.client.query("begin;");
|
|
360
|
+
try {
|
|
361
|
+
for (const step of params.plan.steps.filter((s) => !s.optional)) {
|
|
362
|
+
try {
|
|
363
|
+
await params.client.query(step.sql, step.params);
|
|
364
|
+
applied.push(step.name);
|
|
365
|
+
}
|
|
366
|
+
catch (e) {
|
|
367
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
368
|
+
const errAny = e;
|
|
369
|
+
const wrapped = new Error(`Failed at step "${step.name}": ${msg}`);
|
|
370
|
+
// Preserve Postgres error code so callers can provide better hints (e.g., 42501 insufficient_privilege).
|
|
371
|
+
if (errAny && typeof errAny === "object" && typeof errAny.code === "string") {
|
|
372
|
+
wrapped.code = errAny.code;
|
|
373
|
+
}
|
|
374
|
+
throw wrapped;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
await params.client.query("commit;");
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
// Rollback errors should never mask the original failure.
|
|
381
|
+
try {
|
|
382
|
+
await params.client.query("rollback;");
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
// ignore
|
|
386
|
+
}
|
|
387
|
+
throw e;
|
|
388
|
+
}
|
|
389
|
+
// Apply optional steps outside of the transaction so a failure doesn't abort everything.
|
|
390
|
+
for (const step of params.plan.steps.filter((s) => s.optional)) {
|
|
391
|
+
try {
|
|
392
|
+
await params.client.query(step.sql, step.params);
|
|
393
|
+
applied.push(step.name);
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
skippedOptional.push(step.name);
|
|
397
|
+
// best-effort: ignore
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return { applied, skippedOptional };
|
|
401
|
+
}
|
|
402
|
+
async function verifyInitSetup(params) {
|
|
403
|
+
const missingRequired = [];
|
|
404
|
+
const missingOptional = [];
|
|
405
|
+
const role = params.monitoringUser;
|
|
406
|
+
const db = params.database;
|
|
407
|
+
const roleRes = await params.client.query("select 1 from pg_catalog.pg_roles where rolname = $1", [role]);
|
|
408
|
+
const roleExists = (roleRes.rowCount ?? 0) > 0;
|
|
409
|
+
if (!roleExists) {
|
|
410
|
+
missingRequired.push(`role "${role}" does not exist`);
|
|
411
|
+
// If role is missing, other checks will error or be meaningless.
|
|
412
|
+
return { ok: false, missingRequired, missingOptional };
|
|
413
|
+
}
|
|
414
|
+
const connectRes = await params.client.query("select has_database_privilege($1, $2, 'CONNECT') as ok", [role, db]);
|
|
415
|
+
if (!connectRes.rows?.[0]?.ok) {
|
|
416
|
+
missingRequired.push(`CONNECT on database "${db}"`);
|
|
417
|
+
}
|
|
418
|
+
const pgMonitorRes = await params.client.query("select pg_has_role($1, 'pg_monitor', 'member') as ok", [role]);
|
|
419
|
+
if (!pgMonitorRes.rows?.[0]?.ok) {
|
|
420
|
+
missingRequired.push("membership in role pg_monitor");
|
|
421
|
+
}
|
|
422
|
+
const pgIndexRes = await params.client.query("select has_table_privilege($1, 'pg_catalog.pg_index', 'SELECT') as ok", [role]);
|
|
423
|
+
if (!pgIndexRes.rows?.[0]?.ok) {
|
|
424
|
+
missingRequired.push("SELECT on pg_catalog.pg_index");
|
|
425
|
+
}
|
|
426
|
+
const viewExistsRes = await params.client.query("select to_regclass('public.pg_statistic') is not null as ok");
|
|
427
|
+
if (!viewExistsRes.rows?.[0]?.ok) {
|
|
428
|
+
missingRequired.push("view public.pg_statistic exists");
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
const viewPrivRes = await params.client.query("select has_table_privilege($1, 'public.pg_statistic', 'SELECT') as ok", [role]);
|
|
432
|
+
if (!viewPrivRes.rows?.[0]?.ok) {
|
|
433
|
+
missingRequired.push("SELECT on view public.pg_statistic");
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
const schemaUsageRes = await params.client.query("select has_schema_privilege($1, 'public', 'USAGE') as ok", [role]);
|
|
437
|
+
if (!schemaUsageRes.rows?.[0]?.ok) {
|
|
438
|
+
missingRequired.push("USAGE on schema public");
|
|
439
|
+
}
|
|
440
|
+
const rolcfgRes = await params.client.query("select rolconfig from pg_catalog.pg_roles where rolname = $1", [role]);
|
|
441
|
+
const rolconfig = rolcfgRes.rows?.[0]?.rolconfig;
|
|
442
|
+
const spLine = Array.isArray(rolconfig) ? rolconfig.find((v) => String(v).startsWith("search_path=")) : undefined;
|
|
443
|
+
if (typeof spLine !== "string" || !spLine) {
|
|
444
|
+
missingRequired.push("role search_path is set");
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
// We accept any ordering as long as public and pg_catalog are included.
|
|
448
|
+
const sp = spLine.toLowerCase();
|
|
449
|
+
if (!sp.includes("public") || !sp.includes("pg_catalog")) {
|
|
450
|
+
missingRequired.push("role search_path includes public and pg_catalog");
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (params.includeOptionalPermissions) {
|
|
454
|
+
// Optional RDS/Aurora extras
|
|
455
|
+
{
|
|
456
|
+
const extRes = await params.client.query("select 1 from pg_extension where extname = 'rds_tools'");
|
|
457
|
+
if ((extRes.rowCount ?? 0) === 0) {
|
|
458
|
+
missingOptional.push("extension rds_tools");
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
const fnRes = await params.client.query("select has_function_privilege($1, 'rds_tools.pg_ls_multixactdir()', 'EXECUTE') as ok", [role]);
|
|
462
|
+
if (!fnRes.rows?.[0]?.ok) {
|
|
463
|
+
missingOptional.push("EXECUTE on rds_tools.pg_ls_multixactdir()");
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
// Optional self-managed extras
|
|
468
|
+
const optionalFns = [
|
|
469
|
+
"pg_catalog.pg_stat_file(text)",
|
|
470
|
+
"pg_catalog.pg_stat_file(text, boolean)",
|
|
471
|
+
"pg_catalog.pg_ls_dir(text)",
|
|
472
|
+
"pg_catalog.pg_ls_dir(text, boolean, boolean)",
|
|
473
|
+
];
|
|
474
|
+
for (const fn of optionalFns) {
|
|
475
|
+
const fnRes = await params.client.query("select has_function_privilege($1, $2, 'EXECUTE') as ok", [role, fn]);
|
|
476
|
+
if (!fnRes.rows?.[0]?.ok) {
|
|
477
|
+
missingOptional.push(`EXECUTE on ${fn}`);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
return { ok: missingRequired.length === 0, missingRequired, missingOptional };
|
|
482
|
+
}
|
|
483
|
+
//# 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/lib/issues.d.ts
CHANGED
|
@@ -1,7 +1,75 @@
|
|
|
1
|
+
export interface IssueActionItem {
|
|
2
|
+
id: string;
|
|
3
|
+
issue_id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
description: string | null;
|
|
6
|
+
severity: number;
|
|
7
|
+
is_done: boolean;
|
|
8
|
+
done_by: number | null;
|
|
9
|
+
done_at: string | null;
|
|
10
|
+
created_at: string;
|
|
11
|
+
updated_at: string;
|
|
12
|
+
}
|
|
13
|
+
export interface Issue {
|
|
14
|
+
id: string;
|
|
15
|
+
title: string;
|
|
16
|
+
description: string | null;
|
|
17
|
+
created_at: string;
|
|
18
|
+
updated_at: string;
|
|
19
|
+
status: number;
|
|
20
|
+
url_main: string | null;
|
|
21
|
+
urls_extra: string[] | null;
|
|
22
|
+
data: unknown | null;
|
|
23
|
+
author_id: number;
|
|
24
|
+
org_id: number;
|
|
25
|
+
project_id: number | null;
|
|
26
|
+
is_ai_generated: boolean;
|
|
27
|
+
assigned_to: number[] | null;
|
|
28
|
+
labels: string[] | null;
|
|
29
|
+
is_edited: boolean;
|
|
30
|
+
author_display_name: string;
|
|
31
|
+
comment_count: number;
|
|
32
|
+
action_items: IssueActionItem[];
|
|
33
|
+
}
|
|
34
|
+
export interface IssueComment {
|
|
35
|
+
id: string;
|
|
36
|
+
issue_id: string;
|
|
37
|
+
author_id: number;
|
|
38
|
+
parent_comment_id: string | null;
|
|
39
|
+
content: string;
|
|
40
|
+
created_at: string;
|
|
41
|
+
updated_at: string;
|
|
42
|
+
data: unknown | null;
|
|
43
|
+
}
|
|
44
|
+
export type IssueListItem = Pick<Issue, "id" | "title" | "status" | "created_at">;
|
|
45
|
+
export type IssueDetail = Pick<Issue, "id" | "title" | "description" | "status" | "created_at" | "author_display_name">;
|
|
1
46
|
export interface FetchIssuesParams {
|
|
2
47
|
apiKey: string;
|
|
3
48
|
apiBaseUrl: string;
|
|
4
49
|
debug?: boolean;
|
|
5
50
|
}
|
|
6
|
-
export declare function fetchIssues(params: FetchIssuesParams): Promise<
|
|
51
|
+
export declare function fetchIssues(params: FetchIssuesParams): Promise<IssueListItem[]>;
|
|
52
|
+
export interface FetchIssueCommentsParams {
|
|
53
|
+
apiKey: string;
|
|
54
|
+
apiBaseUrl: string;
|
|
55
|
+
issueId: string;
|
|
56
|
+
debug?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare function fetchIssueComments(params: FetchIssueCommentsParams): Promise<IssueComment[]>;
|
|
59
|
+
export interface FetchIssueParams {
|
|
60
|
+
apiKey: string;
|
|
61
|
+
apiBaseUrl: string;
|
|
62
|
+
issueId: string;
|
|
63
|
+
debug?: boolean;
|
|
64
|
+
}
|
|
65
|
+
export declare function fetchIssue(params: FetchIssueParams): Promise<IssueDetail | null>;
|
|
66
|
+
export interface CreateIssueCommentParams {
|
|
67
|
+
apiKey: string;
|
|
68
|
+
apiBaseUrl: string;
|
|
69
|
+
issueId: string;
|
|
70
|
+
content: string;
|
|
71
|
+
parentCommentId?: string;
|
|
72
|
+
debug?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export declare function createIssueComment(params: CreateIssueCommentParams): Promise<IssueComment>;
|
|
7
75
|
//# sourceMappingURL=issues.d.ts.map
|
package/dist/lib/issues.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../lib/issues.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../lib/issues.ts"],"names":[],"mappings":"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"}
|