mcp-twin 1.2.0 → 1.4.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.
Files changed (46) hide show
  1. package/.env.example +30 -0
  2. package/PRD.md +682 -0
  3. package/dist/cli.js +41 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cloud/auth.d.ts +108 -0
  6. package/dist/cloud/auth.d.ts.map +1 -0
  7. package/dist/cloud/auth.js +199 -0
  8. package/dist/cloud/auth.js.map +1 -0
  9. package/dist/cloud/db.d.ts +21 -0
  10. package/dist/cloud/db.d.ts.map +1 -0
  11. package/dist/cloud/db.js +158 -0
  12. package/dist/cloud/db.js.map +1 -0
  13. package/dist/cloud/routes/auth.d.ts +7 -0
  14. package/dist/cloud/routes/auth.d.ts.map +1 -0
  15. package/dist/cloud/routes/auth.js +291 -0
  16. package/dist/cloud/routes/auth.js.map +1 -0
  17. package/dist/cloud/routes/billing.d.ts +7 -0
  18. package/dist/cloud/routes/billing.d.ts.map +1 -0
  19. package/dist/cloud/routes/billing.js +368 -0
  20. package/dist/cloud/routes/billing.js.map +1 -0
  21. package/dist/cloud/routes/twins.d.ts +7 -0
  22. package/dist/cloud/routes/twins.d.ts.map +1 -0
  23. package/dist/cloud/routes/twins.js +740 -0
  24. package/dist/cloud/routes/twins.js.map +1 -0
  25. package/dist/cloud/routes/usage.d.ts +7 -0
  26. package/dist/cloud/routes/usage.d.ts.map +1 -0
  27. package/dist/cloud/routes/usage.js +145 -0
  28. package/dist/cloud/routes/usage.js.map +1 -0
  29. package/dist/cloud/server.d.ts +10 -0
  30. package/dist/cloud/server.d.ts.map +1 -0
  31. package/dist/cloud/server.js +161 -0
  32. package/dist/cloud/server.js.map +1 -0
  33. package/dist/cloud/stripe.d.ts +60 -0
  34. package/dist/cloud/stripe.d.ts.map +1 -0
  35. package/dist/cloud/stripe.js +157 -0
  36. package/dist/cloud/stripe.js.map +1 -0
  37. package/package.json +25 -4
  38. package/src/cli.ts +10 -0
  39. package/src/cloud/auth.ts +269 -0
  40. package/src/cloud/db.ts +167 -0
  41. package/src/cloud/routes/auth.ts +355 -0
  42. package/src/cloud/routes/billing.ts +460 -0
  43. package/src/cloud/routes/twins.ts +908 -0
  44. package/src/cloud/routes/usage.ts +186 -0
  45. package/src/cloud/server.ts +171 -0
  46. package/src/cloud/stripe.ts +192 -0
package/dist/cli.js CHANGED
@@ -13,6 +13,39 @@
13
13
  *
14
14
  * Powered by Prax Chat - https://prax.chat
15
15
  */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
16
49
  Object.defineProperty(exports, "__esModule", { value: true });
17
50
  const twin_manager_1 = require("./twin-manager");
18
51
  const config_detector_1 = require("./config-detector");
@@ -20,6 +53,13 @@ const PRAX_FOOTER = '\n───────────────────
20
53
  const VERSION = '1.2.0';
21
54
  async function main() {
22
55
  const args = process.argv.slice(2);
56
+ // Check for --cloud flag
57
+ if (args.includes('--cloud') || args.includes('cloud')) {
58
+ // Start cloud server
59
+ const { startServer } = await Promise.resolve().then(() => __importStar(require('./cloud/server')));
60
+ await startServer();
61
+ return;
62
+ }
23
63
  const command = args[0]?.toLowerCase();
24
64
  const serverName = args[1];
25
65
  const manager = (0, twin_manager_1.getTwinManager)();
@@ -190,6 +230,7 @@ Commands:
190
230
  mcp-twin swap <server> Switch traffic to standby
191
231
  mcp-twin status [server] Show twin status
192
232
  mcp-twin detect Auto-detect MCP servers
233
+ mcp-twin --cloud Start cloud server (API mode)
193
234
  mcp-twin help Show this help
194
235
 
195
236
  Workflow:
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Authentication Helpers
3
+ * MCP Twin Cloud
4
+ */
5
+ import { Request, Response, NextFunction } from 'express';
6
+ declare global {
7
+ namespace Express {
8
+ interface Request {
9
+ user?: {
10
+ id: string;
11
+ email: string;
12
+ tier: string;
13
+ };
14
+ apiKey?: {
15
+ id: string;
16
+ userId: string;
17
+ };
18
+ }
19
+ }
20
+ }
21
+ export interface User {
22
+ id: string;
23
+ email: string;
24
+ password_hash: string;
25
+ tier: string;
26
+ stripe_customer_id?: string;
27
+ stripe_subscription_id?: string;
28
+ created_at: Date;
29
+ }
30
+ export interface ApiKey {
31
+ id: string;
32
+ user_id: string;
33
+ key_hash: string;
34
+ key_prefix: string;
35
+ name?: string;
36
+ last_used_at?: Date;
37
+ created_at: Date;
38
+ revoked_at?: Date;
39
+ }
40
+ /**
41
+ * Hash a password
42
+ */
43
+ export declare function hashPassword(password: string): Promise<string>;
44
+ /**
45
+ * Verify a password against a hash
46
+ */
47
+ export declare function verifyPassword(password: string, hash: string): Promise<boolean>;
48
+ /**
49
+ * Generate a JWT session token
50
+ */
51
+ export declare function generateSessionToken(user: {
52
+ id: string;
53
+ email: string;
54
+ tier: string;
55
+ }): string;
56
+ /**
57
+ * Verify a JWT session token
58
+ */
59
+ export declare function verifySessionToken(token: string): {
60
+ userId: string;
61
+ email: string;
62
+ tier: string;
63
+ } | null;
64
+ /**
65
+ * Generate an API key
66
+ * Returns: { key: 'mtc_live_xxxxx', hash: 'hashed_value', prefix: 'mtc_live_abc' }
67
+ */
68
+ export declare function generateApiKey(): Promise<{
69
+ key: string;
70
+ hash: string;
71
+ prefix: string;
72
+ }>;
73
+ /**
74
+ * Verify an API key and return the associated user
75
+ */
76
+ export declare function verifyApiKey(key: string): Promise<{
77
+ apiKeyId: string;
78
+ user: User;
79
+ } | null>;
80
+ /**
81
+ * Middleware: Authenticate via API key
82
+ */
83
+ export declare function authenticateApiKey(req: Request, res: Response, next: NextFunction): Promise<void>;
84
+ /**
85
+ * Middleware: Optional authentication (doesn't fail if not authenticated)
86
+ */
87
+ export declare function optionalAuth(req: Request, res: Response, next: NextFunction): Promise<void>;
88
+ /**
89
+ * Get tier limits
90
+ */
91
+ export declare function getTierLimits(tier: string): {
92
+ twins: number;
93
+ requestsPerMonth: number;
94
+ logRetentionDays: number;
95
+ };
96
+ declare const _default: {
97
+ hashPassword: typeof hashPassword;
98
+ verifyPassword: typeof verifyPassword;
99
+ generateSessionToken: typeof generateSessionToken;
100
+ verifySessionToken: typeof verifySessionToken;
101
+ generateApiKey: typeof generateApiKey;
102
+ verifyApiKey: typeof verifyApiKey;
103
+ authenticateApiKey: typeof authenticateApiKey;
104
+ optionalAuth: typeof optionalAuth;
105
+ getTierLimits: typeof getTierLimits;
106
+ };
107
+ export default _default;
108
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAW1D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE;gBACL,EAAE,EAAE,MAAM,CAAC;gBACX,KAAK,EAAE,MAAM,CAAC;gBACd,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,MAAM,CAAC,EAAE;gBACP,EAAE,EAAE,MAAM,CAAC;gBACX,MAAM,EAAE,MAAM,CAAC;aAChB,CAAC;SACH;KACF;CACF;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAErF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAM9F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOxG;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAO7F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CA4BhG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA2Df;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CASjH;;;;;;;;;;;;AAED,wBAUE"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ /**
3
+ * Authentication Helpers
4
+ * MCP Twin Cloud
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.hashPassword = hashPassword;
11
+ exports.verifyPassword = verifyPassword;
12
+ exports.generateSessionToken = generateSessionToken;
13
+ exports.verifySessionToken = verifySessionToken;
14
+ exports.generateApiKey = generateApiKey;
15
+ exports.verifyApiKey = verifyApiKey;
16
+ exports.authenticateApiKey = authenticateApiKey;
17
+ exports.optionalAuth = optionalAuth;
18
+ exports.getTierLimits = getTierLimits;
19
+ const bcryptjs_1 = __importDefault(require("bcryptjs"));
20
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
21
+ const uuid_1 = require("uuid");
22
+ const db_1 = require("./db");
23
+ const JWT_SECRET = process.env.JWT_SECRET || 'mcp-twin-dev-secret-change-in-prod';
24
+ const JWT_EXPIRES_IN = '7d';
25
+ const SALT_ROUNDS = 10;
26
+ /**
27
+ * Hash a password
28
+ */
29
+ async function hashPassword(password) {
30
+ return bcryptjs_1.default.hash(password, SALT_ROUNDS);
31
+ }
32
+ /**
33
+ * Verify a password against a hash
34
+ */
35
+ async function verifyPassword(password, hash) {
36
+ return bcryptjs_1.default.compare(password, hash);
37
+ }
38
+ /**
39
+ * Generate a JWT session token
40
+ */
41
+ function generateSessionToken(user) {
42
+ return jsonwebtoken_1.default.sign({ userId: user.id, email: user.email, tier: user.tier }, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN });
43
+ }
44
+ /**
45
+ * Verify a JWT session token
46
+ */
47
+ function verifySessionToken(token) {
48
+ try {
49
+ const decoded = jsonwebtoken_1.default.verify(token, JWT_SECRET);
50
+ return { userId: decoded.userId, email: decoded.email, tier: decoded.tier };
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ /**
57
+ * Generate an API key
58
+ * Returns: { key: 'mtc_live_xxxxx', hash: 'hashed_value', prefix: 'mtc_live_abc' }
59
+ */
60
+ async function generateApiKey() {
61
+ const keyId = (0, uuid_1.v4)().replace(/-/g, '');
62
+ const key = `mtc_live_${keyId}`;
63
+ const hash = await bcryptjs_1.default.hash(key, SALT_ROUNDS);
64
+ const prefix = `mtc_live_${keyId.substring(0, 8)}`;
65
+ return { key, hash, prefix };
66
+ }
67
+ /**
68
+ * Verify an API key and return the associated user
69
+ */
70
+ async function verifyApiKey(key) {
71
+ // Get all non-revoked API keys (in production, use a better lookup strategy)
72
+ const apiKeys = await (0, db_1.query)('SELECT * FROM api_keys WHERE revoked_at IS NULL');
73
+ for (const apiKey of apiKeys) {
74
+ const valid = await bcryptjs_1.default.compare(key, apiKey.key_hash);
75
+ if (valid) {
76
+ // Update last_used_at
77
+ await (0, db_1.query)('UPDATE api_keys SET last_used_at = NOW() WHERE id = $1', [apiKey.id]);
78
+ // Get user
79
+ const user = await (0, db_1.queryOne)('SELECT * FROM users WHERE id = $1', [apiKey.user_id]);
80
+ if (user) {
81
+ return { apiKeyId: apiKey.id, user };
82
+ }
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ /**
88
+ * Middleware: Authenticate via API key
89
+ */
90
+ async function authenticateApiKey(req, res, next) {
91
+ const authHeader = req.headers.authorization;
92
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
93
+ res.status(401).json({
94
+ error: {
95
+ code: 'UNAUTHORIZED',
96
+ message: 'Missing or invalid Authorization header. Use: Bearer <api_key>',
97
+ },
98
+ });
99
+ return;
100
+ }
101
+ const token = authHeader.substring(7);
102
+ // Check if it's an API key (starts with mtc_)
103
+ if (token.startsWith('mtc_')) {
104
+ const result = await verifyApiKey(token);
105
+ if (!result) {
106
+ res.status(401).json({
107
+ error: {
108
+ code: 'UNAUTHORIZED',
109
+ message: 'Invalid API key',
110
+ },
111
+ });
112
+ return;
113
+ }
114
+ req.user = {
115
+ id: result.user.id,
116
+ email: result.user.email,
117
+ tier: result.user.tier,
118
+ };
119
+ req.apiKey = {
120
+ id: result.apiKeyId,
121
+ userId: result.user.id,
122
+ };
123
+ next();
124
+ return;
125
+ }
126
+ // Otherwise, treat as JWT session token
127
+ const decoded = verifySessionToken(token);
128
+ if (!decoded) {
129
+ res.status(401).json({
130
+ error: {
131
+ code: 'UNAUTHORIZED',
132
+ message: 'Invalid or expired session token',
133
+ },
134
+ });
135
+ return;
136
+ }
137
+ req.user = {
138
+ id: decoded.userId,
139
+ email: decoded.email,
140
+ tier: decoded.tier,
141
+ };
142
+ next();
143
+ }
144
+ /**
145
+ * Middleware: Optional authentication (doesn't fail if not authenticated)
146
+ */
147
+ async function optionalAuth(req, res, next) {
148
+ const authHeader = req.headers.authorization;
149
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
150
+ next();
151
+ return;
152
+ }
153
+ const token = authHeader.substring(7);
154
+ if (token.startsWith('mtc_')) {
155
+ const result = await verifyApiKey(token);
156
+ if (result) {
157
+ req.user = {
158
+ id: result.user.id,
159
+ email: result.user.email,
160
+ tier: result.user.tier,
161
+ };
162
+ }
163
+ }
164
+ else {
165
+ const decoded = verifySessionToken(token);
166
+ if (decoded) {
167
+ req.user = {
168
+ id: decoded.userId,
169
+ email: decoded.email,
170
+ tier: decoded.tier,
171
+ };
172
+ }
173
+ }
174
+ next();
175
+ }
176
+ /**
177
+ * Get tier limits
178
+ */
179
+ function getTierLimits(tier) {
180
+ const limits = {
181
+ free: { twins: 1, requestsPerMonth: 10000, logRetentionDays: 1 },
182
+ starter: { twins: 5, requestsPerMonth: 100000, logRetentionDays: 7 },
183
+ pro: { twins: -1, requestsPerMonth: 1000000, logRetentionDays: 30 }, // -1 = unlimited
184
+ enterprise: { twins: -1, requestsPerMonth: -1, logRetentionDays: 90 },
185
+ };
186
+ return limits[tier] || limits.free;
187
+ }
188
+ exports.default = {
189
+ hashPassword,
190
+ verifyPassword,
191
+ generateSessionToken,
192
+ verifySessionToken,
193
+ generateApiKey,
194
+ verifyApiKey,
195
+ authenticateApiKey,
196
+ optionalAuth,
197
+ getTierLimits,
198
+ };
199
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAqDH,oCAEC;AAKD,wCAEC;AAKD,oDAMC;AAKD,gDAOC;AAMD,wCAOC;AAKD,oCA4BC;AAKD,gDA+DC;AAKD,oCAmCC;AAKD,sCASC;AA1PD,wDAA8B;AAC9B,gEAA+B;AAC/B,+BAAoC;AACpC,6BAAuC;AAEvC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,oCAAoC,CAAC;AAClF,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,WAAW,GAAG,EAAE,CAAC;AAwCvB;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,OAAO,kBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAY;IACjE,OAAO,kBAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,IAAiD;IACpF,OAAO,sBAAG,CAAC,IAAI,CACb,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EACvD,UAAU,EACV,EAAE,SAAS,EAAE,cAAc,EAAE,CAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAQ,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc;IAClC,MAAM,KAAK,GAAG,IAAA,SAAM,GAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,YAAY,KAAK,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,kBAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,YAAY,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAEnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,6EAA6E;IAC7E,MAAM,OAAO,GAAG,MAAM,IAAA,UAAK,EACzB,iDAAiD,CAClD,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,kBAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,KAAK,EAAE,CAAC;YACV,sBAAsB;YACtB,MAAM,IAAA,UAAK,EACT,wDAAwD,EACxD,CAAC,MAAM,CAAC,EAAE,CAAC,CACZ,CAAC;YAEF,WAAW;YACX,MAAM,IAAI,GAAG,MAAM,IAAA,aAAQ,EACzB,mCAAmC,EACnC,CAAC,MAAM,CAAC,OAAO,CAAC,CACjB,CAAC;YAEF,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CACtC,GAAY,EACZ,GAAa,EACb,IAAkB;IAElB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAE7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,gEAAgE;aAC1E;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEtC,8CAA8C;IAC9C,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,iBAAiB;iBAC3B;aACF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,GAAG;YACT,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;SACvB,CAAC;QACF,GAAG,CAAC,MAAM,GAAG;YACX,EAAE,EAAE,MAAM,CAAC,QAAQ;YACnB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;SACvB,CAAC;QACF,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,wCAAwC;IACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,kCAAkC;aAC5C;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,GAAG;QACT,EAAE,EAAE,OAAO,CAAC,MAAM;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;IACF,IAAI,EAAE,CAAC;AACT,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAChC,GAAY,EACZ,GAAa,EACb,IAAkB;IAElB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAE7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEtC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,GAAG;gBACT,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;gBAClB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;gBACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;aACvB,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,GAAG;gBACT,EAAE,EAAE,OAAO,CAAC,MAAM;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAA0F;QACpG,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,KAAM,EAAE,gBAAgB,EAAE,CAAC,EAAE;QACjE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,MAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE;QACrE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAS,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,iBAAiB;QACxF,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE;KACtE,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,kBAAe;IACb,YAAY;IACZ,cAAc;IACd,oBAAoB;IACpB,kBAAkB;IAClB,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,aAAa;CACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Database Connection - PostgreSQL
3
+ * MCP Twin Cloud
4
+ */
5
+ import { Pool, PoolClient } from 'pg';
6
+ export declare function getPool(): Pool;
7
+ export declare function query<T = any>(text: string, params?: any[]): Promise<T[]>;
8
+ export declare function queryOne<T = any>(text: string, params?: any[]): Promise<T | null>;
9
+ export declare function transaction<T>(callback: (client: PoolClient) => Promise<T>): Promise<T>;
10
+ export declare function initializeDatabase(): Promise<void>;
11
+ export declare function closePool(): Promise<void>;
12
+ declare const _default: {
13
+ query: typeof query;
14
+ queryOne: typeof queryOne;
15
+ transaction: typeof transaction;
16
+ getPool: typeof getPool;
17
+ initializeDatabase: typeof initializeDatabase;
18
+ closePool: typeof closePool;
19
+ };
20
+ export default _default;
21
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/cloud/db.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAItC,wBAAgB,OAAO,IAAI,IAAI,CAsB9B;AAED,wBAAsB,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAW/E;AAED,wBAAsB,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAGvF;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgFxD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK/C;;;;;;;;;AAED,wBAOE"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * Database Connection - PostgreSQL
4
+ * MCP Twin Cloud
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getPool = getPool;
8
+ exports.query = query;
9
+ exports.queryOne = queryOne;
10
+ exports.transaction = transaction;
11
+ exports.initializeDatabase = initializeDatabase;
12
+ exports.closePool = closePool;
13
+ const pg_1 = require("pg");
14
+ let pool = null;
15
+ function getPool() {
16
+ if (!pool) {
17
+ const connectionString = process.env.DATABASE_URL;
18
+ if (!connectionString) {
19
+ throw new Error('DATABASE_URL environment variable is required');
20
+ }
21
+ pool = new pg_1.Pool({
22
+ connectionString,
23
+ ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false,
24
+ max: 20,
25
+ idleTimeoutMillis: 30000,
26
+ connectionTimeoutMillis: 2000,
27
+ });
28
+ pool.on('error', (err) => {
29
+ console.error('[DB] Unexpected error on idle client', err);
30
+ });
31
+ }
32
+ return pool;
33
+ }
34
+ async function query(text, params) {
35
+ const pool = getPool();
36
+ const start = Date.now();
37
+ const result = await pool.query(text, params);
38
+ const duration = Date.now() - start;
39
+ if (process.env.DEBUG_SQL) {
40
+ console.log('[DB] Query executed', { text, duration, rows: result.rowCount });
41
+ }
42
+ return result.rows;
43
+ }
44
+ async function queryOne(text, params) {
45
+ const rows = await query(text, params);
46
+ return rows[0] || null;
47
+ }
48
+ async function transaction(callback) {
49
+ const pool = getPool();
50
+ const client = await pool.connect();
51
+ try {
52
+ await client.query('BEGIN');
53
+ const result = await callback(client);
54
+ await client.query('COMMIT');
55
+ return result;
56
+ }
57
+ catch (error) {
58
+ await client.query('ROLLBACK');
59
+ throw error;
60
+ }
61
+ finally {
62
+ client.release();
63
+ }
64
+ }
65
+ async function initializeDatabase() {
66
+ console.log('[DB] Initializing database schema...');
67
+ const schema = `
68
+ -- Users table
69
+ CREATE TABLE IF NOT EXISTS users (
70
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
71
+ email VARCHAR(255) UNIQUE NOT NULL,
72
+ password_hash VARCHAR(255) NOT NULL,
73
+ tier VARCHAR(20) DEFAULT 'free' CHECK (tier IN ('free', 'starter', 'pro', 'enterprise')),
74
+ stripe_customer_id VARCHAR(255),
75
+ stripe_subscription_id VARCHAR(255),
76
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
77
+ updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
78
+ );
79
+
80
+ -- API Keys table
81
+ CREATE TABLE IF NOT EXISTS api_keys (
82
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
83
+ user_id UUID REFERENCES users(id) ON DELETE CASCADE,
84
+ key_hash VARCHAR(255) NOT NULL,
85
+ key_prefix VARCHAR(20) NOT NULL,
86
+ name VARCHAR(100),
87
+ last_used_at TIMESTAMP WITH TIME ZONE,
88
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
89
+ revoked_at TIMESTAMP WITH TIME ZONE
90
+ );
91
+
92
+ -- Twins table
93
+ CREATE TABLE IF NOT EXISTS twins (
94
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
95
+ user_id UUID REFERENCES users(id) ON DELETE CASCADE,
96
+ name VARCHAR(100) NOT NULL,
97
+ config_json JSONB NOT NULL,
98
+ status VARCHAR(20) DEFAULT 'stopped' CHECK (status IN ('stopped', 'starting', 'running', 'error')),
99
+ active_server VARCHAR(1) DEFAULT 'a' CHECK (active_server IN ('a', 'b')),
100
+ port_a INTEGER,
101
+ port_b INTEGER,
102
+ pid_a INTEGER,
103
+ pid_b INTEGER,
104
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
105
+ updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
106
+ );
107
+
108
+ -- Logs table
109
+ CREATE TABLE IF NOT EXISTS logs (
110
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
111
+ user_id UUID REFERENCES users(id) ON DELETE CASCADE,
112
+ twin_id UUID REFERENCES twins(id) ON DELETE CASCADE,
113
+ tool_name VARCHAR(100) NOT NULL,
114
+ args JSONB,
115
+ result JSONB,
116
+ error TEXT,
117
+ status VARCHAR(20) NOT NULL CHECK (status IN ('success', 'error', 'timeout')),
118
+ duration_ms INTEGER NOT NULL,
119
+ server VARCHAR(1) NOT NULL CHECK (server IN ('a', 'b')),
120
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
121
+ );
122
+
123
+ -- Usage tracking (aggregated daily)
124
+ CREATE TABLE IF NOT EXISTS usage_daily (
125
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
126
+ user_id UUID REFERENCES users(id) ON DELETE CASCADE,
127
+ date DATE NOT NULL,
128
+ request_count INTEGER DEFAULT 0,
129
+ error_count INTEGER DEFAULT 0,
130
+ total_duration_ms BIGINT DEFAULT 0,
131
+ UNIQUE(user_id, date)
132
+ );
133
+
134
+ -- Indexes
135
+ CREATE INDEX IF NOT EXISTS idx_api_keys_hash ON api_keys(key_hash) WHERE revoked_at IS NULL;
136
+ CREATE INDEX IF NOT EXISTS idx_twins_user ON twins(user_id);
137
+ CREATE INDEX IF NOT EXISTS idx_logs_twin_created ON logs(twin_id, created_at DESC);
138
+ CREATE INDEX IF NOT EXISTS idx_logs_user_created ON logs(user_id, created_at DESC);
139
+ CREATE INDEX IF NOT EXISTS idx_usage_user_date ON usage_daily(user_id, date DESC);
140
+ `;
141
+ await query(schema);
142
+ console.log('[DB] Database schema initialized');
143
+ }
144
+ async function closePool() {
145
+ if (pool) {
146
+ await pool.end();
147
+ pool = null;
148
+ }
149
+ }
150
+ exports.default = {
151
+ query,
152
+ queryOne,
153
+ transaction,
154
+ getPool,
155
+ initializeDatabase,
156
+ closePool,
157
+ };
158
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/cloud/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Auth Routes
3
+ * MCP Twin Cloud
4
+ */
5
+ declare const router: import("express-serve-static-core").Router;
6
+ export default router;
7
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cloud/routes/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAiVxB,eAAe,MAAM,CAAC"}