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.
- package/.env.example +30 -0
- package/PRD.md +682 -0
- package/dist/cli.js +41 -0
- package/dist/cli.js.map +1 -1
- package/dist/cloud/auth.d.ts +108 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +199 -0
- package/dist/cloud/auth.js.map +1 -0
- package/dist/cloud/db.d.ts +21 -0
- package/dist/cloud/db.d.ts.map +1 -0
- package/dist/cloud/db.js +158 -0
- package/dist/cloud/db.js.map +1 -0
- package/dist/cloud/routes/auth.d.ts +7 -0
- package/dist/cloud/routes/auth.d.ts.map +1 -0
- package/dist/cloud/routes/auth.js +291 -0
- package/dist/cloud/routes/auth.js.map +1 -0
- package/dist/cloud/routes/billing.d.ts +7 -0
- package/dist/cloud/routes/billing.d.ts.map +1 -0
- package/dist/cloud/routes/billing.js +368 -0
- package/dist/cloud/routes/billing.js.map +1 -0
- package/dist/cloud/routes/twins.d.ts +7 -0
- package/dist/cloud/routes/twins.d.ts.map +1 -0
- package/dist/cloud/routes/twins.js +740 -0
- package/dist/cloud/routes/twins.js.map +1 -0
- package/dist/cloud/routes/usage.d.ts +7 -0
- package/dist/cloud/routes/usage.d.ts.map +1 -0
- package/dist/cloud/routes/usage.js +145 -0
- package/dist/cloud/routes/usage.js.map +1 -0
- package/dist/cloud/server.d.ts +10 -0
- package/dist/cloud/server.d.ts.map +1 -0
- package/dist/cloud/server.js +161 -0
- package/dist/cloud/server.js.map +1 -0
- package/dist/cloud/stripe.d.ts +60 -0
- package/dist/cloud/stripe.d.ts.map +1 -0
- package/dist/cloud/stripe.js +157 -0
- package/dist/cloud/stripe.js.map +1 -0
- package/package.json +25 -4
- package/src/cli.ts +10 -0
- package/src/cloud/auth.ts +269 -0
- package/src/cloud/db.ts +167 -0
- package/src/cloud/routes/auth.ts +355 -0
- package/src/cloud/routes/billing.ts +460 -0
- package/src/cloud/routes/twins.ts +908 -0
- package/src/cloud/routes/usage.ts +186 -0
- package/src/cloud/server.ts +171 -0
- 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":";;AACA;;;;;;;;;;;;GAYG
|
|
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":"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"}
|
|
@@ -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"}
|
package/dist/cloud/db.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|