@shin1ohno/sage 0.2.4 → 0.5.3

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 (96) hide show
  1. package/dist/cli/http-server-with-config.d.ts +38 -0
  2. package/dist/cli/http-server-with-config.d.ts.map +1 -0
  3. package/dist/cli/http-server-with-config.js +458 -0
  4. package/dist/cli/http-server-with-config.js.map +1 -0
  5. package/dist/cli/http-server.d.ts +74 -0
  6. package/dist/cli/http-server.d.ts.map +1 -0
  7. package/dist/cli/http-server.js +407 -0
  8. package/dist/cli/http-server.js.map +1 -0
  9. package/dist/cli/jwt-middleware.d.ts +36 -0
  10. package/dist/cli/jwt-middleware.d.ts.map +1 -0
  11. package/dist/cli/jwt-middleware.js +99 -0
  12. package/dist/cli/jwt-middleware.js.map +1 -0
  13. package/dist/cli/main-entry.d.ts +41 -0
  14. package/dist/cli/main-entry.d.ts.map +1 -0
  15. package/dist/cli/main-entry.js +80 -0
  16. package/dist/cli/main-entry.js.map +1 -0
  17. package/dist/cli/mcp-handler.d.ts +56 -0
  18. package/dist/cli/mcp-handler.d.ts.map +1 -0
  19. package/dist/cli/mcp-handler.js +2189 -0
  20. package/dist/cli/mcp-handler.js.map +1 -0
  21. package/dist/cli/parser.d.ts +43 -0
  22. package/dist/cli/parser.d.ts.map +1 -0
  23. package/dist/cli/parser.js +162 -0
  24. package/dist/cli/parser.js.map +1 -0
  25. package/dist/cli/remote-config-loader.d.ts +85 -0
  26. package/dist/cli/remote-config-loader.d.ts.map +1 -0
  27. package/dist/cli/remote-config-loader.js +129 -0
  28. package/dist/cli/remote-config-loader.js.map +1 -0
  29. package/dist/cli/secret-auth.d.ts +47 -0
  30. package/dist/cli/secret-auth.d.ts.map +1 -0
  31. package/dist/cli/secret-auth.js +165 -0
  32. package/dist/cli/secret-auth.js.map +1 -0
  33. package/dist/cli/sse-stream-handler.d.ts +45 -0
  34. package/dist/cli/sse-stream-handler.d.ts.map +1 -0
  35. package/dist/cli/sse-stream-handler.js +125 -0
  36. package/dist/cli/sse-stream-handler.js.map +1 -0
  37. package/dist/index.js +885 -209
  38. package/dist/index.js.map +1 -1
  39. package/dist/integrations/calendar-event-creator.d.ts +152 -0
  40. package/dist/integrations/calendar-event-creator.d.ts.map +1 -0
  41. package/dist/integrations/calendar-event-creator.js +507 -0
  42. package/dist/integrations/calendar-event-creator.js.map +1 -0
  43. package/dist/integrations/calendar-event-deleter.d.ts +137 -0
  44. package/dist/integrations/calendar-event-deleter.d.ts.map +1 -0
  45. package/dist/integrations/calendar-event-deleter.js +378 -0
  46. package/dist/integrations/calendar-event-deleter.js.map +1 -0
  47. package/dist/integrations/calendar-event-response.d.ts +213 -0
  48. package/dist/integrations/calendar-event-response.d.ts.map +1 -0
  49. package/dist/integrations/calendar-event-response.js +560 -0
  50. package/dist/integrations/calendar-event-response.js.map +1 -0
  51. package/dist/integrations/calendar-service.d.ts +85 -10
  52. package/dist/integrations/calendar-service.d.ts.map +1 -1
  53. package/dist/integrations/calendar-service.js +317 -35
  54. package/dist/integrations/calendar-service.js.map +1 -1
  55. package/dist/oauth/client-store.d.ts +36 -0
  56. package/dist/oauth/client-store.d.ts.map +1 -0
  57. package/dist/oauth/client-store.js +104 -0
  58. package/dist/oauth/client-store.js.map +1 -0
  59. package/dist/oauth/code-store.d.ts +48 -0
  60. package/dist/oauth/code-store.d.ts.map +1 -0
  61. package/dist/oauth/code-store.js +89 -0
  62. package/dist/oauth/code-store.js.map +1 -0
  63. package/dist/oauth/index.d.ts +13 -0
  64. package/dist/oauth/index.d.ts.map +1 -0
  65. package/dist/oauth/index.js +21 -0
  66. package/dist/oauth/index.js.map +1 -0
  67. package/dist/oauth/oauth-handler.d.ts +101 -0
  68. package/dist/oauth/oauth-handler.d.ts.map +1 -0
  69. package/dist/oauth/oauth-handler.js +577 -0
  70. package/dist/oauth/oauth-handler.js.map +1 -0
  71. package/dist/oauth/oauth-server.d.ts +165 -0
  72. package/dist/oauth/oauth-server.d.ts.map +1 -0
  73. package/dist/oauth/oauth-server.js +489 -0
  74. package/dist/oauth/oauth-server.js.map +1 -0
  75. package/dist/oauth/pkce.d.ts +48 -0
  76. package/dist/oauth/pkce.d.ts.map +1 -0
  77. package/dist/oauth/pkce.js +106 -0
  78. package/dist/oauth/pkce.js.map +1 -0
  79. package/dist/oauth/refresh-token-store.d.ts +45 -0
  80. package/dist/oauth/refresh-token-store.d.ts.map +1 -0
  81. package/dist/oauth/refresh-token-store.js +98 -0
  82. package/dist/oauth/refresh-token-store.js.map +1 -0
  83. package/dist/oauth/token-service.d.ts +46 -0
  84. package/dist/oauth/token-service.d.ts.map +1 -0
  85. package/dist/oauth/token-service.js +199 -0
  86. package/dist/oauth/token-service.js.map +1 -0
  87. package/dist/oauth/types.d.ts +264 -0
  88. package/dist/oauth/types.d.ts.map +1 -0
  89. package/dist/oauth/types.js +37 -0
  90. package/dist/oauth/types.js.map +1 -0
  91. package/dist/version.d.ts +9 -0
  92. package/dist/version.d.ts.map +1 -0
  93. package/dist/version.js +11 -0
  94. package/dist/version.js.map +1 -0
  95. package/manifest.json +12 -20
  96. package/package.json +1 -1
@@ -0,0 +1,407 @@
1
+ /**
2
+ * HTTP Server Mode for sage
3
+ * Requirements: 14.1, 14.9, 14.10, 13.1
4
+ *
5
+ * Provides HTTP server functionality for Remote MCP access.
6
+ */
7
+ import { createServer } from 'http';
8
+ import { VERSION } from '../version.js';
9
+ import { createServer as createHttpsServer } from 'https';
10
+ import { randomUUID } from 'crypto';
11
+ /**
12
+ * HTTP Server implementation
13
+ */
14
+ class HTTPServer {
15
+ config;
16
+ server = null;
17
+ running = false;
18
+ startTime = null;
19
+ tokens = new Map();
20
+ constructor(config) {
21
+ this.config = config;
22
+ }
23
+ /**
24
+ * Start the server
25
+ */
26
+ async start() {
27
+ if (this.running) {
28
+ return;
29
+ }
30
+ return new Promise((resolve, reject) => {
31
+ try {
32
+ const requestHandler = this.handleRequest.bind(this);
33
+ if (this.config.ssl) {
34
+ this.server = createHttpsServer({
35
+ cert: this.config.ssl.cert,
36
+ key: this.config.ssl.key,
37
+ ca: this.config.ssl.ca,
38
+ }, requestHandler);
39
+ }
40
+ else {
41
+ this.server = createServer(requestHandler);
42
+ }
43
+ this.server.listen(this.config.port, this.config.host, () => {
44
+ this.running = true;
45
+ this.startTime = new Date();
46
+ resolve();
47
+ });
48
+ this.server.on('error', (error) => {
49
+ reject(error);
50
+ });
51
+ }
52
+ catch (error) {
53
+ reject(error);
54
+ }
55
+ });
56
+ }
57
+ /**
58
+ * Stop the server
59
+ */
60
+ async stop() {
61
+ if (!this.running || !this.server) {
62
+ return;
63
+ }
64
+ return new Promise((resolve) => {
65
+ this.server.close(() => {
66
+ this.running = false;
67
+ this.startTime = null;
68
+ resolve();
69
+ });
70
+ });
71
+ }
72
+ /**
73
+ * Check if server is running
74
+ */
75
+ isRunning() {
76
+ return this.running;
77
+ }
78
+ /**
79
+ * Get configured port
80
+ */
81
+ getPort() {
82
+ return this.config.port;
83
+ }
84
+ /**
85
+ * Get configured host
86
+ */
87
+ getHost() {
88
+ return this.config.host;
89
+ }
90
+ /**
91
+ * Get server info
92
+ */
93
+ getServerInfo() {
94
+ return {
95
+ port: this.config.port,
96
+ host: this.config.host,
97
+ ssl: !!this.config.ssl,
98
+ authEnabled: this.config.auth?.enabled ?? false,
99
+ startTime: this.startTime ?? undefined,
100
+ };
101
+ }
102
+ /**
103
+ * Handle incoming HTTP request
104
+ */
105
+ handleRequest(req, res) {
106
+ const url = req.url || '/';
107
+ const method = req.method || 'GET';
108
+ const origin = req.headers.origin;
109
+ // Add CORS headers
110
+ const corsHeaders = this.getCORSHeaders(origin);
111
+ for (const [key, value] of Object.entries(corsHeaders)) {
112
+ res.setHeader(key, value);
113
+ }
114
+ // Handle preflight
115
+ if (method === 'OPTIONS') {
116
+ res.writeHead(204);
117
+ res.end();
118
+ return;
119
+ }
120
+ // Health check endpoint
121
+ if (url === '/health' && method === 'GET') {
122
+ this.handleHealthCheck(res);
123
+ return;
124
+ }
125
+ // Auth token endpoint
126
+ if (url === '/auth/token' && method === 'POST') {
127
+ this.handleAuthToken(req, res);
128
+ return;
129
+ }
130
+ // MCP endpoint
131
+ if (url === '/mcp' && method === 'POST') {
132
+ this.handleMCPRequest(req, res);
133
+ return;
134
+ }
135
+ // 404 for unknown routes
136
+ res.writeHead(404, { 'Content-Type': 'application/json' });
137
+ res.end(JSON.stringify({ error: 'Not found' }));
138
+ }
139
+ /**
140
+ * Get CORS headers
141
+ */
142
+ getCORSHeaders(origin) {
143
+ const allowedOrigins = this.config.cors?.allowedOrigins || ['*'];
144
+ let allowOrigin = '*';
145
+ if (origin && allowedOrigins.includes(origin)) {
146
+ allowOrigin = origin;
147
+ }
148
+ else if (allowedOrigins.length === 1 && allowedOrigins[0] !== '*') {
149
+ allowOrigin = allowedOrigins[0];
150
+ }
151
+ return {
152
+ 'Access-Control-Allow-Origin': allowOrigin,
153
+ 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
154
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-API-Key',
155
+ 'Access-Control-Max-Age': '86400',
156
+ };
157
+ }
158
+ /**
159
+ * Handle health check request
160
+ */
161
+ handleHealthCheck(res) {
162
+ const uptime = this.startTime ? Date.now() - this.startTime.getTime() : 0;
163
+ const health = {
164
+ status: this.running ? 'ok' : 'error',
165
+ uptime,
166
+ version: VERSION,
167
+ timestamp: new Date().toISOString(),
168
+ };
169
+ res.writeHead(200, { 'Content-Type': 'application/json' });
170
+ res.end(JSON.stringify(health));
171
+ }
172
+ /**
173
+ * Handle auth token request
174
+ */
175
+ handleAuthToken(req, res) {
176
+ // Check if auth is enabled and API key is valid
177
+ if (this.config.auth?.enabled) {
178
+ const apiKey = req.headers['x-api-key'];
179
+ if (!apiKey || !this.config.auth.apiKeys?.includes(apiKey)) {
180
+ res.writeHead(401, { 'Content-Type': 'application/json' });
181
+ res.end(JSON.stringify({ error: 'Invalid API key' }));
182
+ return;
183
+ }
184
+ }
185
+ // Read request body
186
+ let body = '';
187
+ req.on('data', (chunk) => {
188
+ body += chunk.toString();
189
+ });
190
+ req.on('end', () => {
191
+ try {
192
+ const parsed = JSON.parse(body);
193
+ const userId = parsed.userId || 'anonymous';
194
+ // Generate token
195
+ const token = randomUUID();
196
+ const expiry = this.config.auth?.tokenExpiry || 3600000; // 1 hour default
197
+ const expiresAt = Date.now() + expiry;
198
+ this.tokens.set(token, { userId, expiresAt });
199
+ res.writeHead(200, { 'Content-Type': 'application/json' });
200
+ res.end(JSON.stringify({ token, expiresIn: expiry }));
201
+ }
202
+ catch {
203
+ res.writeHead(400, { 'Content-Type': 'application/json' });
204
+ res.end(JSON.stringify({ error: 'Invalid request body' }));
205
+ }
206
+ });
207
+ }
208
+ /**
209
+ * Handle MCP request
210
+ */
211
+ handleMCPRequest(req, res) {
212
+ // Check authentication if enabled
213
+ if (this.config.auth?.enabled) {
214
+ const authResult = this.checkAuth(req);
215
+ if (!authResult.success) {
216
+ res.writeHead(authResult.statusCode, { 'Content-Type': 'application/json' });
217
+ res.end(JSON.stringify({
218
+ jsonrpc: '2.0',
219
+ id: null,
220
+ error: {
221
+ code: authResult.errorCode,
222
+ message: authResult.errorMessage,
223
+ },
224
+ }));
225
+ return;
226
+ }
227
+ }
228
+ // Read request body
229
+ let body = '';
230
+ req.on('data', (chunk) => {
231
+ body += chunk.toString();
232
+ });
233
+ req.on('end', () => {
234
+ try {
235
+ const request = this.parseJSONRPCRequest(body);
236
+ // TODO: Route to appropriate MCP tool handler
237
+ // For now, return a placeholder response
238
+ const response = {
239
+ jsonrpc: '2.0',
240
+ id: request.id,
241
+ result: {
242
+ message: 'MCP request received',
243
+ method: request.method,
244
+ params: request.params,
245
+ },
246
+ };
247
+ res.writeHead(200, { 'Content-Type': 'application/json' });
248
+ res.end(JSON.stringify(response));
249
+ }
250
+ catch (error) {
251
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
252
+ res.writeHead(400, { 'Content-Type': 'application/json' });
253
+ res.end(JSON.stringify({
254
+ jsonrpc: '2.0',
255
+ id: null,
256
+ error: {
257
+ code: -32700,
258
+ message: errorMessage,
259
+ },
260
+ }));
261
+ }
262
+ });
263
+ req.on('error', (error) => {
264
+ res.writeHead(500, { 'Content-Type': 'application/json' });
265
+ res.end(JSON.stringify({
266
+ jsonrpc: '2.0',
267
+ id: null,
268
+ error: {
269
+ code: -32603,
270
+ message: error.message,
271
+ },
272
+ }));
273
+ });
274
+ }
275
+ /**
276
+ * Check authentication
277
+ */
278
+ checkAuth(req) {
279
+ const authHeader = req.headers.authorization;
280
+ const apiKey = req.headers['x-api-key'];
281
+ const clientIP = req.headers['x-forwarded-for']?.split(',')[0] ||
282
+ req.socket.remoteAddress ||
283
+ '';
284
+ // Check IP whitelist
285
+ if (this.config.auth?.ipWhitelist &&
286
+ this.config.auth.ipWhitelist.length > 0 &&
287
+ !this.isIPAllowed(clientIP)) {
288
+ return {
289
+ success: false,
290
+ statusCode: 403,
291
+ errorCode: -32001,
292
+ errorMessage: 'IP not allowed',
293
+ };
294
+ }
295
+ // Check API key or token
296
+ const token = this.extractToken(authHeader);
297
+ if (!token && !apiKey) {
298
+ return {
299
+ success: false,
300
+ statusCode: 401,
301
+ errorCode: -32002,
302
+ errorMessage: 'Authentication required',
303
+ };
304
+ }
305
+ // Validate token
306
+ if (token) {
307
+ const tokenData = this.tokens.get(token);
308
+ if (tokenData && Date.now() <= tokenData.expiresAt) {
309
+ return { success: true };
310
+ }
311
+ }
312
+ // Validate API key
313
+ if (apiKey && this.config.auth?.apiKeys?.includes(apiKey)) {
314
+ return { success: true };
315
+ }
316
+ return {
317
+ success: false,
318
+ statusCode: 401,
319
+ errorCode: -32003,
320
+ errorMessage: 'Invalid credentials',
321
+ };
322
+ }
323
+ /**
324
+ * Check if IP is allowed
325
+ */
326
+ isIPAllowed(ip) {
327
+ if (!this.config.auth?.ipWhitelist || this.config.auth.ipWhitelist.length === 0) {
328
+ return true;
329
+ }
330
+ for (const allowed of this.config.auth.ipWhitelist) {
331
+ if (ip === allowed) {
332
+ return true;
333
+ }
334
+ // Simple CIDR matching
335
+ if (allowed.includes('/')) {
336
+ const [network, bits] = allowed.split('/');
337
+ const mask = parseInt(bits, 10);
338
+ if (this.matchCIDR(ip, network, mask)) {
339
+ return true;
340
+ }
341
+ }
342
+ }
343
+ return false;
344
+ }
345
+ /**
346
+ * Match IP against CIDR
347
+ */
348
+ matchCIDR(ip, network, mask) {
349
+ const ipParts = ip.split('.').map(Number);
350
+ const networkParts = network.split('.').map(Number);
351
+ if (ipParts.length !== 4 || networkParts.length !== 4) {
352
+ return false;
353
+ }
354
+ const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
355
+ const networkNum = (networkParts[0] << 24) | (networkParts[1] << 16) | (networkParts[2] << 8) | networkParts[3];
356
+ const maskNum = ~((1 << (32 - mask)) - 1);
357
+ return (ipNum & maskNum) === (networkNum & maskNum);
358
+ }
359
+ /**
360
+ * Extract token from Authorization header
361
+ */
362
+ extractToken(authHeader) {
363
+ if (!authHeader) {
364
+ return null;
365
+ }
366
+ if (authHeader.startsWith('Bearer ')) {
367
+ return authHeader.slice(7);
368
+ }
369
+ return null;
370
+ }
371
+ /**
372
+ * Parse JSON-RPC request
373
+ */
374
+ parseJSONRPCRequest(body) {
375
+ let parsed;
376
+ try {
377
+ parsed = JSON.parse(body);
378
+ }
379
+ catch {
380
+ throw new Error('Invalid JSON');
381
+ }
382
+ const request = parsed;
383
+ if (!request.jsonrpc || request.jsonrpc !== '2.0') {
384
+ throw new Error('Invalid JSON-RPC request');
385
+ }
386
+ if (request.method === undefined) {
387
+ throw new Error('Invalid JSON-RPC request: missing method');
388
+ }
389
+ return {
390
+ jsonrpc: '2.0',
391
+ id: request.id ?? null,
392
+ method: request.method,
393
+ params: request.params,
394
+ };
395
+ }
396
+ }
397
+ /**
398
+ * Create and start an HTTP server
399
+ * @param config - Server configuration
400
+ * @returns Running HTTP server instance
401
+ */
402
+ export async function createHTTPServer(config) {
403
+ const server = new HTTPServer(config);
404
+ await server.start();
405
+ return server;
406
+ }
407
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/cli/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * JWT Authentication Middleware for Remote MCP Server
3
+ * Requirements: 15.7, 15.8
4
+ *
5
+ * Provides middleware for authenticating requests with JWT tokens.
6
+ */
7
+ import { IncomingMessage, ServerResponse } from 'http';
8
+ import { TokenResponse } from './secret-auth.js';
9
+ /**
10
+ * JWT middleware configuration
11
+ */
12
+ export interface JWTMiddlewareConfig {
13
+ secret: string;
14
+ expiresIn: string;
15
+ skipPaths?: string[];
16
+ }
17
+ /**
18
+ * Authentication result
19
+ */
20
+ export interface AuthResult {
21
+ authenticated: boolean;
22
+ skipped?: boolean;
23
+ error?: string;
24
+ }
25
+ /**
26
+ * JWT middleware interface
27
+ */
28
+ export interface JWTMiddleware {
29
+ authenticate(req: IncomingMessage, res: ServerResponse): Promise<AuthResult>;
30
+ generateToken(secret: string): Promise<TokenResponse>;
31
+ }
32
+ /**
33
+ * Create JWT authentication middleware
34
+ */
35
+ export declare function createJWTMiddleware(config: JWTMiddlewareConfig): JWTMiddleware;
36
+ //# sourceMappingURL=jwt-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-middleware.d.ts","sourceRoot":"","sources":["../../src/cli/jwt-middleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAkD,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACvD;AA8BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CA0E9E"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * JWT Authentication Middleware for Remote MCP Server
3
+ * Requirements: 15.7, 15.8
4
+ *
5
+ * Provides middleware for authenticating requests with JWT tokens.
6
+ */
7
+ import { createSecretAuthenticator } from './secret-auth.js';
8
+ /**
9
+ * Parse Authorization header
10
+ */
11
+ function parseAuthorizationHeader(header) {
12
+ if (!header) {
13
+ return null;
14
+ }
15
+ const parts = header.split(' ');
16
+ if (parts.length !== 2) {
17
+ return null;
18
+ }
19
+ return {
20
+ scheme: parts[0].toLowerCase(),
21
+ token: parts[1],
22
+ };
23
+ }
24
+ /**
25
+ * Send JSON error response
26
+ */
27
+ function sendErrorResponse(res, statusCode, error) {
28
+ res.setHeader('Content-Type', 'application/json');
29
+ res.writeHead(statusCode);
30
+ res.end(JSON.stringify({ error }));
31
+ }
32
+ /**
33
+ * Create JWT authentication middleware
34
+ */
35
+ export function createJWTMiddleware(config) {
36
+ const authenticator = createSecretAuthenticator({
37
+ secret: config.secret,
38
+ expiresIn: config.expiresIn,
39
+ });
40
+ const skipPaths = new Set(config.skipPaths || []);
41
+ return {
42
+ async authenticate(req, res) {
43
+ // Check if path should skip authentication
44
+ const url = req.url || '';
45
+ const path = url.split('?')[0];
46
+ if (skipPaths.has(path)) {
47
+ return {
48
+ authenticated: true,
49
+ skipped: true,
50
+ };
51
+ }
52
+ // Get Authorization header
53
+ const authHeader = req.headers.authorization;
54
+ const parsed = parseAuthorizationHeader(authHeader);
55
+ if (!parsed) {
56
+ sendErrorResponse(res, 401, 'Missing or invalid Authorization header');
57
+ return {
58
+ authenticated: false,
59
+ error: 'Missing or invalid Authorization header',
60
+ };
61
+ }
62
+ // Check scheme
63
+ if (parsed.scheme !== 'bearer') {
64
+ sendErrorResponse(res, 401, 'Authorization scheme must be Bearer');
65
+ return {
66
+ authenticated: false,
67
+ error: 'Authorization scheme must be Bearer',
68
+ };
69
+ }
70
+ // Check token
71
+ if (!parsed.token || parsed.token.trim() === '') {
72
+ sendErrorResponse(res, 401, 'Token is required');
73
+ return {
74
+ authenticated: false,
75
+ error: 'Token is required',
76
+ };
77
+ }
78
+ // Verify token
79
+ const verifyResult = await authenticator.verifyToken(parsed.token);
80
+ if (!verifyResult.valid) {
81
+ const errorMessage = verifyResult.error?.includes('expired')
82
+ ? 'Token expired'
83
+ : 'Invalid token';
84
+ sendErrorResponse(res, 401, errorMessage);
85
+ return {
86
+ authenticated: false,
87
+ error: errorMessage,
88
+ };
89
+ }
90
+ return {
91
+ authenticated: true,
92
+ };
93
+ },
94
+ async generateToken(secret) {
95
+ return authenticator.authenticate(secret);
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=jwt-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-middleware.js","sourceRoot":"","sources":["../../src/cli/jwt-middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Main Entry Point for sage
3
+ * Requirements: 14.1, 14.2, 14.3
4
+ *
5
+ * Handles server startup based on CLI options.
6
+ */
7
+ import { CLIOptions } from './parser.js';
8
+ /**
9
+ * Server mode type
10
+ */
11
+ export type ServerMode = 'stdio' | 'http' | 'help' | 'version';
12
+ /**
13
+ * Server start result
14
+ */
15
+ export interface ServerStartResult {
16
+ /** Server mode */
17
+ mode: ServerMode;
18
+ /** Whether startup was successful */
19
+ success: boolean;
20
+ /** Error message if failed */
21
+ error?: string;
22
+ /** Message for help/version modes */
23
+ message?: string;
24
+ /** Config path used */
25
+ configPath?: string;
26
+ /** HTTP server port (for http mode) */
27
+ port?: number;
28
+ /** HTTP server host (for http mode) */
29
+ host?: string;
30
+ /** Whether authentication is enabled */
31
+ authEnabled?: boolean;
32
+ /** Stop function for HTTP server */
33
+ stop?: () => Promise<void>;
34
+ }
35
+ /**
36
+ * Start the server based on CLI options
37
+ * @param options - Parsed CLI options
38
+ * @returns Server start result
39
+ */
40
+ export declare function startServer(options: CLIOptions): Promise<ServerStartResult>;
41
+ //# sourceMappingURL=main-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-entry.d.ts","sourceRoot":"","sources":["../../src/cli/main-entry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAA8B,MAAM,aAAa,CAAC;AAGrE;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmEjF"}