postgresai 0.12.0-beta.7 → 0.14.0-beta.10

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.
Files changed (74) hide show
  1. package/README.md +154 -53
  2. package/bin/postgres-ai.ts +1572 -350
  3. package/bun.lock +258 -0
  4. package/bunfig.toml +20 -0
  5. package/dist/bin/postgres-ai.js +28575 -1487
  6. package/dist/sql/01.role.sql +16 -0
  7. package/dist/sql/02.permissions.sql +37 -0
  8. package/dist/sql/03.optional_rds.sql +6 -0
  9. package/dist/sql/04.optional_self_managed.sql +8 -0
  10. package/dist/sql/05.helpers.sql +439 -0
  11. package/dist/sql/sql/01.role.sql +16 -0
  12. package/dist/sql/sql/02.permissions.sql +37 -0
  13. package/dist/sql/sql/03.optional_rds.sql +6 -0
  14. package/dist/sql/sql/04.optional_self_managed.sql +8 -0
  15. package/dist/sql/sql/05.helpers.sql +439 -0
  16. package/lib/auth-server.ts +124 -106
  17. package/lib/checkup-api.ts +386 -0
  18. package/lib/checkup.ts +1330 -0
  19. package/lib/config.ts +6 -3
  20. package/lib/init.ts +760 -0
  21. package/lib/issues.ts +400 -191
  22. package/lib/mcp-server.ts +213 -90
  23. package/lib/metrics-embedded.ts +79 -0
  24. package/lib/metrics-loader.ts +127 -0
  25. package/lib/util.ts +61 -0
  26. package/package.json +20 -9
  27. package/packages/postgres-ai/README.md +26 -0
  28. package/packages/postgres-ai/bin/postgres-ai.js +27 -0
  29. package/packages/postgres-ai/package.json +27 -0
  30. package/scripts/embed-metrics.ts +154 -0
  31. package/sql/01.role.sql +16 -0
  32. package/sql/02.permissions.sql +37 -0
  33. package/sql/03.optional_rds.sql +6 -0
  34. package/sql/04.optional_self_managed.sql +8 -0
  35. package/sql/05.helpers.sql +439 -0
  36. package/test/auth.test.ts +258 -0
  37. package/test/checkup.integration.test.ts +321 -0
  38. package/test/checkup.test.ts +891 -0
  39. package/test/init.integration.test.ts +499 -0
  40. package/test/init.test.ts +417 -0
  41. package/test/issues.cli.test.ts +314 -0
  42. package/test/issues.test.ts +456 -0
  43. package/test/mcp-server.test.ts +988 -0
  44. package/test/schema-validation.test.ts +81 -0
  45. package/test/test-utils.ts +122 -0
  46. package/tsconfig.json +12 -20
  47. package/dist/bin/postgres-ai.d.ts +0 -3
  48. package/dist/bin/postgres-ai.d.ts.map +0 -1
  49. package/dist/bin/postgres-ai.js.map +0 -1
  50. package/dist/lib/auth-server.d.ts +0 -31
  51. package/dist/lib/auth-server.d.ts.map +0 -1
  52. package/dist/lib/auth-server.js +0 -263
  53. package/dist/lib/auth-server.js.map +0 -1
  54. package/dist/lib/config.d.ts +0 -45
  55. package/dist/lib/config.d.ts.map +0 -1
  56. package/dist/lib/config.js +0 -181
  57. package/dist/lib/config.js.map +0 -1
  58. package/dist/lib/issues.d.ts +0 -75
  59. package/dist/lib/issues.d.ts.map +0 -1
  60. package/dist/lib/issues.js +0 -336
  61. package/dist/lib/issues.js.map +0 -1
  62. package/dist/lib/mcp-server.d.ts +0 -9
  63. package/dist/lib/mcp-server.d.ts.map +0 -1
  64. package/dist/lib/mcp-server.js +0 -168
  65. package/dist/lib/mcp-server.js.map +0 -1
  66. package/dist/lib/pkce.d.ts +0 -32
  67. package/dist/lib/pkce.d.ts.map +0 -1
  68. package/dist/lib/pkce.js +0 -101
  69. package/dist/lib/pkce.js.map +0 -1
  70. package/dist/lib/util.d.ts +0 -27
  71. package/dist/lib/util.d.ts.map +0 -1
  72. package/dist/lib/util.js +0 -46
  73. package/dist/lib/util.js.map +0 -1
  74. package/dist/package.json +0 -45
package/dist/lib/pkce.js DELETED
@@ -1,101 +0,0 @@
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.generateCodeVerifier = generateCodeVerifier;
37
- exports.generateCodeChallenge = generateCodeChallenge;
38
- exports.generateState = generateState;
39
- exports.generatePKCEParams = generatePKCEParams;
40
- const crypto = __importStar(require("crypto"));
41
- /**
42
- * Generate a cryptographically random string for PKCE
43
- * @param length - Length of the string (43-128 characters per RFC 7636)
44
- * @returns Base64URL-encoded random string
45
- */
46
- function generateRandomString(length = 64) {
47
- const bytes = crypto.randomBytes(length);
48
- return base64URLEncode(bytes);
49
- }
50
- /**
51
- * Base64URL encode (without padding)
52
- * @param buffer - Buffer to encode
53
- * @returns Base64URL-encoded string
54
- */
55
- function base64URLEncode(buffer) {
56
- return buffer
57
- .toString("base64")
58
- .replace(/\+/g, "-")
59
- .replace(/\//g, "_")
60
- .replace(/=/g, "");
61
- }
62
- /**
63
- * Generate PKCE code verifier
64
- * @returns Random code verifier (43-128 characters)
65
- */
66
- function generateCodeVerifier() {
67
- return generateRandomString(32); // 32 bytes = 43 chars after base64url encoding
68
- }
69
- /**
70
- * Generate PKCE code challenge from verifier
71
- * Uses S256 method (SHA256)
72
- * @param verifier - Code verifier string
73
- * @returns Base64URL-encoded SHA256 hash of verifier
74
- */
75
- function generateCodeChallenge(verifier) {
76
- const hash = crypto.createHash("sha256").update(verifier).digest();
77
- return base64URLEncode(hash);
78
- }
79
- /**
80
- * Generate random state for CSRF protection
81
- * @returns Random state string
82
- */
83
- function generateState() {
84
- return generateRandomString(16); // 16 bytes = 22 chars
85
- }
86
- /**
87
- * Generate complete PKCE parameters
88
- * @returns Object with verifier, challenge, challengeMethod, and state
89
- */
90
- function generatePKCEParams() {
91
- const verifier = generateCodeVerifier();
92
- const challenge = generateCodeChallenge(verifier);
93
- const state = generateState();
94
- return {
95
- codeVerifier: verifier,
96
- codeChallenge: challenge,
97
- codeChallengeMethod: "S256",
98
- state: state,
99
- };
100
- }
101
- //# sourceMappingURL=pkce.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../lib/pkce.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,oDAEC;AAQD,sDAGC;AAMD,sCAEC;AAMD,gDAWC;AA7ED,+CAAiC;AAYjC;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,SAAiB,EAAE;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,MAAM;SACV,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB;IAClC,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,+CAA+C;AAClF,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,QAAgB;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACnE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa;IAC3B,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB;AACzD,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB;IAChC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,OAAO;QACL,YAAY,EAAE,QAAQ;QACtB,aAAa,EAAE,SAAS;QACxB,mBAAmB,EAAE,MAAM;QAC3B,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC"}
@@ -1,27 +0,0 @@
1
- export declare function maskSecret(secret: string): string;
2
- export interface RootOptsLike {
3
- apiBaseUrl?: string;
4
- uiBaseUrl?: string;
5
- }
6
- export interface ConfigLike {
7
- baseUrl?: string | null;
8
- }
9
- export interface ResolvedBaseUrls {
10
- apiBaseUrl: string;
11
- uiBaseUrl: string;
12
- }
13
- /**
14
- * Normalize a base URL by trimming a single trailing slash and validating.
15
- * @throws Error if the URL is invalid
16
- */
17
- export declare function normalizeBaseUrl(value: string): string;
18
- /**
19
- * Resolve API and UI base URLs using precedence and normalize them.
20
- * Precedence (API): opts.apiBaseUrl → env.PGAI_API_BASE_URL → cfg.baseUrl → default
21
- * Precedence (UI): opts.uiBaseUrl → env.PGAI_UI_BASE_URL → default
22
- */
23
- export declare function resolveBaseUrls(opts?: RootOptsLike, cfg?: ConfigLike, defaults?: {
24
- apiBaseUrl?: string;
25
- uiBaseUrl?: string;
26
- }): ResolvedBaseUrls;
27
- //# sourceMappingURL=util.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../lib/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD;AAGD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUtD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,CAAC,EAAE,YAAY,EACnB,GAAG,CAAC,EAAE,UAAU,EAChB,QAAQ,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,gBAAgB,CAWlB"}
package/dist/lib/util.js DELETED
@@ -1,46 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.maskSecret = maskSecret;
4
- exports.normalizeBaseUrl = normalizeBaseUrl;
5
- exports.resolveBaseUrls = resolveBaseUrls;
6
- function maskSecret(secret) {
7
- if (!secret)
8
- return "";
9
- if (secret.length <= 8)
10
- return "****";
11
- if (secret.length <= 16)
12
- return `${secret.slice(0, 4)}${"*".repeat(secret.length - 8)}${secret.slice(-4)}`;
13
- return `${secret.slice(0, Math.min(12, secret.length - 8))}${"*".repeat(Math.max(4, secret.length - 16))}${secret.slice(-4)}`;
14
- }
15
- /**
16
- * Normalize a base URL by trimming a single trailing slash and validating.
17
- * @throws Error if the URL is invalid
18
- */
19
- function normalizeBaseUrl(value) {
20
- const trimmed = (value || "").replace(/\/$/, "");
21
- try {
22
- // Validate
23
- // eslint-disable-next-line no-new
24
- new URL(trimmed);
25
- }
26
- catch {
27
- throw new Error(`Invalid base URL: ${value}`);
28
- }
29
- return trimmed;
30
- }
31
- /**
32
- * Resolve API and UI base URLs using precedence and normalize them.
33
- * Precedence (API): opts.apiBaseUrl → env.PGAI_API_BASE_URL → cfg.baseUrl → default
34
- * Precedence (UI): opts.uiBaseUrl → env.PGAI_UI_BASE_URL → default
35
- */
36
- function resolveBaseUrls(opts, cfg, defaults = {}) {
37
- const defApi = defaults.apiBaseUrl || "https://postgres.ai/api/general/";
38
- const defUi = defaults.uiBaseUrl || "https://console.postgres.ai";
39
- const apiCandidate = (opts?.apiBaseUrl || process.env.PGAI_API_BASE_URL || cfg?.baseUrl || defApi);
40
- const uiCandidate = (opts?.uiBaseUrl || process.env.PGAI_UI_BASE_URL || defUi);
41
- return {
42
- apiBaseUrl: normalizeBaseUrl(apiCandidate),
43
- uiBaseUrl: normalizeBaseUrl(uiCandidate),
44
- };
45
- }
46
- //# sourceMappingURL=util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../lib/util.ts"],"names":[],"mappings":";;AAAA,gCAKC;AAqBD,4CAUC;AAOD,0CAeC;AA1DD,SAAgB,UAAU,CAAC,MAAc;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3G,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChI,CAAC;AAiBD;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,WAAW;QACX,kCAAkC;QAClC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAC7B,IAAmB,EACnB,GAAgB,EAChB,WAAwD,EAAE;IAE1D,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,IAAI,kCAAkC,CAAC;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,IAAI,6BAA6B,CAAC;IAElE,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,EAAE,OAAO,IAAI,MAAM,CAAW,CAAC;IAC7G,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAW,CAAC;IAEzF,OAAO;QACL,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC;QAC1C,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC;KACzC,CAAC;AACJ,CAAC"}
package/dist/package.json DELETED
@@ -1,45 +0,0 @@
1
- {
2
- "name": "postgresai",
3
- "version": "0.12.0-beta.7",
4
- "description": "postgres_ai CLI (Node.js)",
5
- "license": "Apache-2.0",
6
- "private": false,
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://gitlab.com/postgres-ai/postgres_ai.git"
10
- },
11
- "homepage": "https://gitlab.com/postgres-ai/postgres_ai",
12
- "bugs": {
13
- "url": "https://gitlab.com/postgres-ai/postgres_ai/-/issues"
14
- },
15
- "bin": {
16
- "postgres-ai": "./dist/bin/postgres-ai.js",
17
- "postgresai": "./dist/bin/postgres-ai.js",
18
- "pgai": "./dist/bin/postgres-ai.js"
19
- },
20
- "type": "commonjs",
21
- "engines": {
22
- "node": ">=18"
23
- },
24
- "scripts": {
25
- "build": "tsc",
26
- "prepare": "npm run build",
27
- "start": "node ./dist/bin/postgres-ai.js --help",
28
- "dev": "tsc --watch"
29
- },
30
- "dependencies": {
31
- "@modelcontextprotocol/sdk": "^1.20.2",
32
- "commander": "^12.1.0",
33
- "js-yaml": "^4.1.0",
34
- "pg": "^8.16.3"
35
- },
36
- "devDependencies": {
37
- "@types/js-yaml": "^4.0.9",
38
- "@types/node": "^18.19.0",
39
- "@types/pg": "^8.15.6",
40
- "typescript": "^5.3.3"
41
- },
42
- "publishConfig": {
43
- "access": "public"
44
- }
45
- }