@stackmemoryai/stackmemory 0.2.4 → 0.2.6
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 +108 -0
- package/dist/index.js +382 -0
- package/dist/src/analytics/api/analytics-api.d.ts +24 -0
- package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
- package/dist/src/analytics/api/analytics-api.js +279 -0
- package/dist/src/analytics/api/analytics-api.js.map +1 -0
- package/dist/src/analytics/core/analytics-service.d.ts +23 -0
- package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
- package/dist/src/analytics/core/analytics-service.js +160 -0
- package/dist/src/analytics/core/analytics-service.js.map +1 -0
- package/dist/src/analytics/index.d.ts +12 -0
- package/dist/src/analytics/index.d.ts.map +1 -0
- package/dist/src/analytics/index.js +11 -0
- package/dist/src/analytics/index.js.map +1 -0
- package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
- package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
- package/dist/src/analytics/queries/metrics-queries.js +179 -0
- package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
- package/dist/src/analytics/types/metrics.d.ts +60 -0
- package/dist/src/analytics/types/metrics.d.ts.map +1 -0
- package/dist/src/analytics/types/metrics.js +2 -0
- package/dist/src/analytics/types/metrics.js.map +1 -0
- package/dist/src/cli/analytics-viewer.d.ts +3 -0
- package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
- package/dist/src/cli/analytics-viewer.js +89 -0
- package/dist/src/cli/analytics-viewer.js.map +1 -0
- package/dist/src/cli/browser-test.d.ts +6 -0
- package/dist/src/cli/browser-test.d.ts.map +1 -0
- package/dist/src/cli/browser-test.js +32 -0
- package/dist/src/cli/browser-test.js.map +1 -0
- package/dist/src/cli/cli.js +157 -0
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/commands/projects.d.ts +8 -0
- package/dist/src/cli/commands/projects.d.ts.map +1 -0
- package/dist/src/cli/commands/projects.js +220 -0
- package/dist/src/cli/commands/projects.js.map +1 -0
- package/dist/src/cli/index.d.ts +7 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +704 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/project-commands.d.ts +8 -0
- package/dist/src/cli/project-commands.d.ts.map +1 -0
- package/dist/src/cli/project-commands.js +212 -0
- package/dist/src/cli/project-commands.js.map +1 -0
- package/dist/src/cli/utils/viewer.d.ts +3 -0
- package/dist/src/cli/utils/viewer.d.ts.map +1 -0
- package/dist/src/cli/utils/viewer.js +89 -0
- package/dist/src/cli/utils/viewer.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +106 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -0
- package/dist/src/core/context/frame-manager.js +387 -0
- package/dist/src/core/context/frame-manager.js.map +1 -0
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/monitoring/error-handler.d.ts +46 -0
- package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
- package/dist/src/core/monitoring/error-handler.js +212 -0
- package/dist/src/core/monitoring/error-handler.js.map +1 -0
- package/dist/src/core/monitoring/logger.d.ts +24 -0
- package/dist/src/core/monitoring/logger.d.ts.map +1 -0
- package/dist/src/core/monitoring/logger.js +121 -0
- package/dist/src/core/monitoring/logger.js.map +1 -0
- package/dist/src/core/monitoring/metrics.d.ts +7 -0
- package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
- package/dist/src/core/monitoring/metrics.js +13 -0
- package/dist/src/core/monitoring/metrics.js.map +1 -0
- package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
- package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
- package/dist/src/core/monitoring/progress-tracker.js +178 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
- package/dist/src/core/project-manager.d.ts +130 -0
- package/dist/src/core/project-manager.d.ts.map +1 -0
- package/dist/src/core/project-manager.js +582 -0
- package/dist/src/core/project-manager.js.map +1 -0
- package/dist/src/core/projects/project-manager.d.ts +130 -0
- package/dist/src/core/projects/project-manager.d.ts.map +1 -0
- package/dist/src/core/projects/project-manager.js +591 -0
- package/dist/src/core/projects/project-manager.js.map +1 -0
- package/dist/src/core/utils/update-checker.d.ts +38 -0
- package/dist/src/core/utils/update-checker.d.ts.map +1 -0
- package/dist/src/core/utils/update-checker.js +156 -0
- package/dist/src/core/utils/update-checker.js.map +1 -0
- package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
- package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
- package/dist/src/features/analytics/api/analytics-api.js +289 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts +23 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.js +160 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
- package/dist/src/features/analytics/index.d.ts +12 -0
- package/dist/src/features/analytics/index.d.ts.map +1 -0
- package/dist/src/features/analytics/index.js +11 -0
- package/dist/src/features/analytics/index.js.map +1 -0
- package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
- package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +183 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
- package/dist/src/features/analytics/types/metrics.d.ts +60 -0
- package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
- package/dist/src/features/analytics/types/metrics.js +2 -0
- package/dist/src/features/analytics/types/metrics.js.map +1 -0
- package/dist/src/features/browser/browser-mcp.d.ts +94 -0
- package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
- package/dist/src/features/browser/browser-mcp.js +456 -0
- package/dist/src/features/browser/browser-mcp.js.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts +117 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.js +335 -0
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
- package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
- package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
- package/dist/src/features/tasks/task-aware-context.js +412 -0
- package/dist/src/features/tasks/task-aware-context.js.map +1 -0
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/browser-mcp.d.ts +94 -0
- package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
- package/dist/src/integrations/browser-mcp.js +431 -0
- package/dist/src/integrations/browser-mcp.js.map +1 -0
- package/dist/src/integrations/linear/auth.d.ts +99 -0
- package/dist/src/integrations/linear/auth.d.ts.map +1 -0
- package/dist/src/integrations/linear/auth.js +319 -0
- package/dist/src/integrations/linear/auth.js.map +1 -0
- package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
- package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear/auto-sync.js +268 -0
- package/dist/src/integrations/linear/auto-sync.js.map +1 -0
- package/dist/src/integrations/linear/client.d.ts +86 -0
- package/dist/src/integrations/linear/client.d.ts.map +1 -0
- package/dist/src/integrations/linear/client.js +277 -0
- package/dist/src/integrations/linear/client.js.map +1 -0
- package/dist/src/integrations/linear/config.d.ts +51 -0
- package/dist/src/integrations/linear/config.d.ts.map +1 -0
- package/dist/src/integrations/linear/config.js +103 -0
- package/dist/src/integrations/linear/config.js.map +1 -0
- package/dist/src/integrations/linear/sync.d.ts +97 -0
- package/dist/src/integrations/linear/sync.d.ts.map +1 -0
- package/dist/src/integrations/linear/sync.js +391 -0
- package/dist/src/integrations/linear/sync.js.map +1 -0
- package/dist/src/integrations/mcp/server.d.ts +40 -0
- package/dist/src/integrations/mcp/server.d.ts.map +1 -0
- package/dist/src/integrations/mcp/server.js +828 -0
- package/dist/src/integrations/mcp/server.js.map +1 -0
- package/dist/src/mcp/mcp-server.d.ts +1 -0
- package/dist/src/mcp/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp/mcp-server.js +11 -0
- package/dist/src/mcp/mcp-server.js.map +1 -1
- package/dist/src/railway/index.d.ts +7 -0
- package/dist/src/railway/index.d.ts.map +1 -0
- package/dist/src/railway/index.js +401 -0
- package/dist/src/railway/index.js.map +1 -0
- package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
- package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
- package/dist/src/runway/auth/auth-middleware.js +337 -0
- package/dist/src/runway/auth/auth-middleware.js.map +1 -0
- package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
- package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
- package/dist/src/runway/server/runway-mcp-server.js +601 -0
- package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
- package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
- package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
- package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
- package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
- package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
- package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
- package/dist/src/servers/production/auth-middleware.d.ts +66 -0
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
- package/dist/src/servers/production/auth-middleware.js +346 -0
- package/dist/src/servers/production/auth-middleware.js.map +1 -0
- package/dist/src/servers/railway/index.d.ts +7 -0
- package/dist/src/servers/railway/index.d.ts.map +1 -0
- package/dist/src/servers/railway/index.js +401 -0
- package/dist/src/servers/railway/index.js.map +1 -0
- package/package.json +27 -5
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production Authentication Middleware for Runway MCP Server
|
|
3
|
+
* Implements JWT validation with Auth0, refresh tokens, and rate limiting
|
|
4
|
+
*/
|
|
5
|
+
import { Request, Response, NextFunction } from 'express';
|
|
6
|
+
import { RateLimiterRes } from 'rate-limiter-flexible';
|
|
7
|
+
export interface AuthUser {
|
|
8
|
+
id: string;
|
|
9
|
+
email: string;
|
|
10
|
+
sub: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
picture?: string;
|
|
13
|
+
tier: 'free' | 'pro' | 'enterprise';
|
|
14
|
+
organizations?: string[];
|
|
15
|
+
permissions: string[];
|
|
16
|
+
metadata?: Record<string, any>;
|
|
17
|
+
}
|
|
18
|
+
export interface AuthRequest extends Request {
|
|
19
|
+
user?: AuthUser;
|
|
20
|
+
rateLimitInfo?: RateLimiterRes;
|
|
21
|
+
}
|
|
22
|
+
export declare class AuthMiddleware {
|
|
23
|
+
private config;
|
|
24
|
+
private jwksClient;
|
|
25
|
+
private redis;
|
|
26
|
+
private rateLimiters;
|
|
27
|
+
private blacklistedTokens;
|
|
28
|
+
constructor(config: {
|
|
29
|
+
auth0Domain: string;
|
|
30
|
+
auth0Audience: string;
|
|
31
|
+
redisUrl: string;
|
|
32
|
+
jwtSecret?: string;
|
|
33
|
+
bypassAuth?: boolean;
|
|
34
|
+
});
|
|
35
|
+
private initializeRateLimiters;
|
|
36
|
+
private setupTokenBlacklistSync;
|
|
37
|
+
private getSigningKey;
|
|
38
|
+
/**
|
|
39
|
+
* Main authentication middleware
|
|
40
|
+
*/
|
|
41
|
+
authenticate: (req: AuthRequest, res: Response, next: NextFunction) => Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* WebSocket authentication handler
|
|
44
|
+
*/
|
|
45
|
+
authenticateWebSocket: (token: string) => Promise<AuthUser | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Permission checking middleware
|
|
48
|
+
*/
|
|
49
|
+
requirePermission: (permission: string) => (req: AuthRequest, res: Response, next: NextFunction) => Response<any, Record<string, any>>;
|
|
50
|
+
/**
|
|
51
|
+
* Organization access middleware
|
|
52
|
+
*/
|
|
53
|
+
requireOrganization: (req: AuthRequest, res: Response, next: NextFunction) => Response<any, Record<string, any>>;
|
|
54
|
+
private extractToken;
|
|
55
|
+
private loadUser;
|
|
56
|
+
private getMockUser;
|
|
57
|
+
/**
|
|
58
|
+
* Revoke a token (add to blacklist)
|
|
59
|
+
*/
|
|
60
|
+
revokeToken(token: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Cleanup resources
|
|
63
|
+
*/
|
|
64
|
+
close(): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=auth-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../../../src/runway/auth/auth-middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAoB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKzE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,qBAAa,cAAc;IAOvB,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,iBAAiB,CAA0B;gBAGzC,MAAM,EAAE;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB;IAeH,OAAO,CAAC,sBAAsB;IAoC9B,OAAO,CAAC,uBAAuB;YAgBjB,aAAa;IAiB3B;;OAEG;IACI,YAAY,GACjB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAgId;IAEF;;OAEG;IACI,qBAAqB,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAmB5E;IAEF;;OAEG;IACI,iBAAiB,GAAI,YAAY,MAAM,MACpC,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wCAmB3D;IAEF;;OAEG;IACI,mBAAmB,GAAI,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wCAkB/E;IAEF,OAAO,CAAC,YAAY;YAUN,QAAQ;IAwBtB,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACU,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IActD;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production Authentication Middleware for Runway MCP Server
|
|
3
|
+
* Implements JWT validation with Auth0, refresh tokens, and rate limiting
|
|
4
|
+
*/
|
|
5
|
+
import jwt from 'jsonwebtoken';
|
|
6
|
+
import jwksRsa from 'jwks-rsa';
|
|
7
|
+
import { RateLimiterRedis } from 'rate-limiter-flexible';
|
|
8
|
+
import Redis from 'ioredis';
|
|
9
|
+
import { logger } from '../monitoring/logger.js';
|
|
10
|
+
import { metrics } from '../monitoring/metrics.js';
|
|
11
|
+
export class AuthMiddleware {
|
|
12
|
+
config;
|
|
13
|
+
jwksClient;
|
|
14
|
+
redis;
|
|
15
|
+
rateLimiters;
|
|
16
|
+
blacklistedTokens = new Set();
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
this.redis = new Redis(config.redisUrl);
|
|
20
|
+
this.jwksClient = jwksRsa({
|
|
21
|
+
jwksUri: `https://${config.auth0Domain}/.well-known/jwks.json`,
|
|
22
|
+
cache: true,
|
|
23
|
+
cacheMaxAge: 600000, // 10 minutes
|
|
24
|
+
rateLimit: true,
|
|
25
|
+
jwksRequestsPerMinute: 5
|
|
26
|
+
});
|
|
27
|
+
this.initializeRateLimiters();
|
|
28
|
+
this.setupTokenBlacklistSync();
|
|
29
|
+
}
|
|
30
|
+
initializeRateLimiters() {
|
|
31
|
+
// Different rate limits for different tiers
|
|
32
|
+
this.rateLimiters = new Map([
|
|
33
|
+
['free', new RateLimiterRedis({
|
|
34
|
+
storeClient: this.redis,
|
|
35
|
+
keyPrefix: 'rl:free',
|
|
36
|
+
points: 100, // requests
|
|
37
|
+
duration: 900, // per 15 minutes
|
|
38
|
+
blockDuration: 900 // block for 15 minutes
|
|
39
|
+
})],
|
|
40
|
+
['pro', new RateLimiterRedis({
|
|
41
|
+
storeClient: this.redis,
|
|
42
|
+
keyPrefix: 'rl:pro',
|
|
43
|
+
points: 1000,
|
|
44
|
+
duration: 900,
|
|
45
|
+
blockDuration: 300
|
|
46
|
+
})],
|
|
47
|
+
['enterprise', new RateLimiterRedis({
|
|
48
|
+
storeClient: this.redis,
|
|
49
|
+
keyPrefix: 'rl:enterprise',
|
|
50
|
+
points: 10000,
|
|
51
|
+
duration: 900,
|
|
52
|
+
blockDuration: 60
|
|
53
|
+
})]
|
|
54
|
+
]);
|
|
55
|
+
// Special rate limiter for auth endpoints
|
|
56
|
+
this.rateLimiters.set('auth', new RateLimiterRedis({
|
|
57
|
+
storeClient: this.redis,
|
|
58
|
+
keyPrefix: 'rl:auth',
|
|
59
|
+
points: 10, // Only 10 auth attempts
|
|
60
|
+
duration: 900,
|
|
61
|
+
blockDuration: 3600 // Block for 1 hour on excessive auth attempts
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
setupTokenBlacklistSync() {
|
|
65
|
+
// Subscribe to token revocation events
|
|
66
|
+
const subscriber = new Redis(this.config.redisUrl);
|
|
67
|
+
subscriber.subscribe('token:revoked');
|
|
68
|
+
subscriber.on('message', (channel, token) => {
|
|
69
|
+
if (channel === 'token:revoked') {
|
|
70
|
+
this.blacklistedTokens.add(token);
|
|
71
|
+
// Clean up old tokens periodically
|
|
72
|
+
if (this.blacklistedTokens.size > 10000) {
|
|
73
|
+
this.blacklistedTokens.clear();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async getSigningKey(kid) {
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
this.jwksClient.getSigningKey(kid, (err, key) => {
|
|
81
|
+
if (err) {
|
|
82
|
+
reject(err);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const signingKey = key?.getPublicKey();
|
|
86
|
+
if (!signingKey) {
|
|
87
|
+
reject(new Error('No signing key found'));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
resolve(signingKey);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Main authentication middleware
|
|
98
|
+
*/
|
|
99
|
+
authenticate = async (req, res, next) => {
|
|
100
|
+
const startTime = Date.now();
|
|
101
|
+
try {
|
|
102
|
+
// Bypass auth for health checks
|
|
103
|
+
if (req.path === '/health' || req.path === '/metrics') {
|
|
104
|
+
return next();
|
|
105
|
+
}
|
|
106
|
+
// Development bypass
|
|
107
|
+
if (this.config.bypassAuth && process.env.NODE_ENV === 'development') {
|
|
108
|
+
req.user = this.getMockUser();
|
|
109
|
+
return next();
|
|
110
|
+
}
|
|
111
|
+
// Extract token
|
|
112
|
+
const token = this.extractToken(req);
|
|
113
|
+
if (!token) {
|
|
114
|
+
metrics.increment('auth.missing_token');
|
|
115
|
+
return res.status(401).json({
|
|
116
|
+
error: 'Authentication required',
|
|
117
|
+
code: 'MISSING_TOKEN'
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Check blacklist
|
|
121
|
+
if (this.blacklistedTokens.has(token)) {
|
|
122
|
+
metrics.increment('auth.blacklisted_token');
|
|
123
|
+
return res.status(401).json({
|
|
124
|
+
error: 'Token has been revoked',
|
|
125
|
+
code: 'TOKEN_REVOKED'
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Decode and verify token
|
|
129
|
+
const decoded = jwt.decode(token, { complete: true });
|
|
130
|
+
if (!decoded) {
|
|
131
|
+
metrics.increment('auth.invalid_token');
|
|
132
|
+
return res.status(401).json({
|
|
133
|
+
error: 'Invalid token format',
|
|
134
|
+
code: 'INVALID_TOKEN'
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Get signing key and verify
|
|
138
|
+
const signingKey = await this.getSigningKey(decoded.header.kid);
|
|
139
|
+
const verified = jwt.verify(token, signingKey, {
|
|
140
|
+
algorithms: ['RS256'],
|
|
141
|
+
audience: this.config.auth0Audience,
|
|
142
|
+
issuer: `https://${this.config.auth0Domain}/`
|
|
143
|
+
});
|
|
144
|
+
// Load user from database or cache
|
|
145
|
+
const user = await this.loadUser(verified.sub);
|
|
146
|
+
if (!user) {
|
|
147
|
+
metrics.increment('auth.user_not_found');
|
|
148
|
+
return res.status(403).json({
|
|
149
|
+
error: 'User not found',
|
|
150
|
+
code: 'USER_NOT_FOUND'
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// Check user suspension
|
|
154
|
+
if (user.metadata?.suspended) {
|
|
155
|
+
metrics.increment('auth.user_suspended');
|
|
156
|
+
return res.status(403).json({
|
|
157
|
+
error: 'Account suspended',
|
|
158
|
+
code: 'ACCOUNT_SUSPENDED'
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// Apply rate limiting
|
|
162
|
+
const rateLimiter = this.rateLimiters.get(user.tier) || this.rateLimiters.get('free');
|
|
163
|
+
try {
|
|
164
|
+
const rateLimitRes = await rateLimiter.consume(user.id);
|
|
165
|
+
req.rateLimitInfo = rateLimitRes;
|
|
166
|
+
// Add rate limit headers
|
|
167
|
+
res.setHeader('X-RateLimit-Limit', rateLimiter.points.toString());
|
|
168
|
+
res.setHeader('X-RateLimit-Remaining', rateLimitRes.remainingPoints.toString());
|
|
169
|
+
res.setHeader('X-RateLimit-Reset', new Date(Date.now() + rateLimitRes.msBeforeNext).toISOString());
|
|
170
|
+
}
|
|
171
|
+
catch (rateLimitError) {
|
|
172
|
+
metrics.increment('auth.rate_limited');
|
|
173
|
+
res.setHeader('Retry-After', Math.round(rateLimitError.msBeforeNext / 1000).toString());
|
|
174
|
+
return res.status(429).json({
|
|
175
|
+
error: 'Too many requests',
|
|
176
|
+
code: 'RATE_LIMITED',
|
|
177
|
+
retryAfter: rateLimitError.msBeforeNext
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// Attach user to request
|
|
181
|
+
req.user = user;
|
|
182
|
+
// Track metrics
|
|
183
|
+
metrics.increment('auth.success', { tier: user.tier });
|
|
184
|
+
metrics.timing('auth.duration', Date.now() - startTime);
|
|
185
|
+
logger.info('Authentication successful', {
|
|
186
|
+
userId: user.id,
|
|
187
|
+
tier: user.tier,
|
|
188
|
+
path: req.path
|
|
189
|
+
});
|
|
190
|
+
next();
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
metrics.increment('auth.error');
|
|
194
|
+
logger.error('Authentication error', error);
|
|
195
|
+
if (error.name === 'TokenExpiredError') {
|
|
196
|
+
return res.status(401).json({
|
|
197
|
+
error: 'Token expired',
|
|
198
|
+
code: 'TOKEN_EXPIRED'
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (error.name === 'JsonWebTokenError') {
|
|
202
|
+
return res.status(401).json({
|
|
203
|
+
error: 'Invalid token',
|
|
204
|
+
code: 'INVALID_TOKEN'
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
res.status(500).json({
|
|
208
|
+
error: 'Authentication failed',
|
|
209
|
+
code: 'AUTH_ERROR'
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* WebSocket authentication handler
|
|
215
|
+
*/
|
|
216
|
+
authenticateWebSocket = async (token) => {
|
|
217
|
+
try {
|
|
218
|
+
const decoded = jwt.decode(token, { complete: true });
|
|
219
|
+
if (!decoded || this.blacklistedTokens.has(token)) {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
const signingKey = await this.getSigningKey(decoded.header.kid);
|
|
223
|
+
const verified = jwt.verify(token, signingKey, {
|
|
224
|
+
algorithms: ['RS256'],
|
|
225
|
+
audience: this.config.auth0Audience,
|
|
226
|
+
issuer: `https://${this.config.auth0Domain}/`
|
|
227
|
+
});
|
|
228
|
+
return await this.loadUser(verified.sub);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
logger.error('WebSocket authentication failed', error);
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* Permission checking middleware
|
|
237
|
+
*/
|
|
238
|
+
requirePermission = (permission) => {
|
|
239
|
+
return (req, res, next) => {
|
|
240
|
+
if (!req.user) {
|
|
241
|
+
return res.status(401).json({
|
|
242
|
+
error: 'Authentication required',
|
|
243
|
+
code: 'NOT_AUTHENTICATED'
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
if (!req.user.permissions.includes(permission)) {
|
|
247
|
+
metrics.increment('auth.permission_denied', { permission });
|
|
248
|
+
return res.status(403).json({
|
|
249
|
+
error: 'Insufficient permissions',
|
|
250
|
+
code: 'PERMISSION_DENIED',
|
|
251
|
+
required: permission
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
next();
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
/**
|
|
258
|
+
* Organization access middleware
|
|
259
|
+
*/
|
|
260
|
+
requireOrganization = (req, res, next) => {
|
|
261
|
+
const orgId = req.params.orgId || req.query.orgId;
|
|
262
|
+
if (!req.user || !orgId) {
|
|
263
|
+
return res.status(401).json({
|
|
264
|
+
error: 'Authentication required',
|
|
265
|
+
code: 'NOT_AUTHENTICATED'
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (!req.user.organizations?.includes(orgId)) {
|
|
269
|
+
return res.status(403).json({
|
|
270
|
+
error: 'Organization access denied',
|
|
271
|
+
code: 'ORG_ACCESS_DENIED'
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
next();
|
|
275
|
+
};
|
|
276
|
+
extractToken(req) {
|
|
277
|
+
const authHeader = req.headers.authorization;
|
|
278
|
+
if (authHeader?.startsWith('Bearer ')) {
|
|
279
|
+
return authHeader.substring(7);
|
|
280
|
+
}
|
|
281
|
+
// Also check cookie for web clients
|
|
282
|
+
return req.cookies?.access_token || null;
|
|
283
|
+
}
|
|
284
|
+
async loadUser(sub) {
|
|
285
|
+
// Try cache first
|
|
286
|
+
const cached = await this.redis.get(`user:${sub}`);
|
|
287
|
+
if (cached) {
|
|
288
|
+
return JSON.parse(cached);
|
|
289
|
+
}
|
|
290
|
+
// Load from database (implement your database logic)
|
|
291
|
+
// This is a placeholder - implement actual database loading
|
|
292
|
+
const user = {
|
|
293
|
+
id: sub,
|
|
294
|
+
sub,
|
|
295
|
+
email: `${sub}@example.com`,
|
|
296
|
+
tier: 'free',
|
|
297
|
+
permissions: ['read', 'write'],
|
|
298
|
+
organizations: []
|
|
299
|
+
};
|
|
300
|
+
// Cache for 5 minutes
|
|
301
|
+
await this.redis.setex(`user:${sub}`, 300, JSON.stringify(user));
|
|
302
|
+
return user;
|
|
303
|
+
}
|
|
304
|
+
getMockUser() {
|
|
305
|
+
return {
|
|
306
|
+
id: 'mock-user-id',
|
|
307
|
+
sub: 'mock-sub',
|
|
308
|
+
email: 'test@example.com',
|
|
309
|
+
name: 'Test User',
|
|
310
|
+
tier: 'pro',
|
|
311
|
+
permissions: ['read', 'write', 'admin'],
|
|
312
|
+
organizations: ['test-org']
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Revoke a token (add to blacklist)
|
|
317
|
+
*/
|
|
318
|
+
async revokeToken(token) {
|
|
319
|
+
this.blacklistedTokens.add(token);
|
|
320
|
+
await this.redis.publish('token:revoked', token);
|
|
321
|
+
// Also store in Redis with TTL matching token expiry
|
|
322
|
+
const decoded = jwt.decode(token);
|
|
323
|
+
if (decoded?.exp) {
|
|
324
|
+
const ttl = decoded.exp - Math.floor(Date.now() / 1000);
|
|
325
|
+
if (ttl > 0) {
|
|
326
|
+
await this.redis.setex(`blacklist:${token}`, ttl, '1');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Cleanup resources
|
|
332
|
+
*/
|
|
333
|
+
async close() {
|
|
334
|
+
await this.redis.quit();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=auth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../../../../src/runway/auth/auth-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runway MCP Server Implementation
|
|
3
|
+
* Production-ready MCP server with authentication, WebSocket support, and monitoring
|
|
4
|
+
*/
|
|
5
|
+
export declare class RunwayMCPServer {
|
|
6
|
+
private config;
|
|
7
|
+
private app;
|
|
8
|
+
private httpServer;
|
|
9
|
+
private wss;
|
|
10
|
+
private mcpServer;
|
|
11
|
+
private connections;
|
|
12
|
+
private auth;
|
|
13
|
+
private db;
|
|
14
|
+
private cache;
|
|
15
|
+
private queue;
|
|
16
|
+
private monitoring;
|
|
17
|
+
private circuitBreaker;
|
|
18
|
+
constructor(config: {
|
|
19
|
+
port: number;
|
|
20
|
+
auth0Domain: string;
|
|
21
|
+
auth0Audience: string;
|
|
22
|
+
databaseUrl: string;
|
|
23
|
+
redisUrl: string;
|
|
24
|
+
environment: 'development' | 'staging' | 'production';
|
|
25
|
+
});
|
|
26
|
+
private initializeServices;
|
|
27
|
+
private setupExpress;
|
|
28
|
+
private setupRoutes;
|
|
29
|
+
private createAPIRouter;
|
|
30
|
+
private setupWebSocket;
|
|
31
|
+
private handleWebSocketMessage;
|
|
32
|
+
private setupMCPServer;
|
|
33
|
+
private registerMCPTools;
|
|
34
|
+
private setupMCPHandlers;
|
|
35
|
+
private executeTool;
|
|
36
|
+
private startHealthChecks;
|
|
37
|
+
private getHealthStatus;
|
|
38
|
+
private getAllowedOrigins;
|
|
39
|
+
private getProjectLimit;
|
|
40
|
+
private generateRequestId;
|
|
41
|
+
private generateConnectionId;
|
|
42
|
+
private findConnectionId;
|
|
43
|
+
start(): Promise<void>;
|
|
44
|
+
stop(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=runway-mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runway-mcp-server.d.ts","sourceRoot":"","sources":["../../../../src/runway/server/runway-mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH,qBAAa,eAAe;IAcd,OAAO,CAAC,MAAM;IAb1B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAyC;IAE5D,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,cAAc,CAAiB;gBAEnB,MAAM,EAAE;QAC1B,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;KACvD;IAQD,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,YAAY;IAkFpB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,eAAe;IAgJvB,OAAO,CAAC,cAAc;YAoFR,sBAAsB;IAsDpC,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,gBAAgB;YAmCV,WAAW;IAkBzB,OAAO,CAAC,iBAAiB;YAaX,eAAe;IA0C7B,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,gBAAgB;IASX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBnC"}
|