@shin1ohno/sage 0.8.4 → 0.8.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.
Files changed (110) hide show
  1. package/dist/cli/mcp-handler.d.ts.map +1 -1
  2. package/dist/cli/mcp-handler.js +141 -987
  3. package/dist/cli/mcp-handler.js.map +1 -1
  4. package/dist/config/update-validation.d.ts +52 -0
  5. package/dist/config/update-validation.d.ts.map +1 -0
  6. package/dist/config/update-validation.js +133 -0
  7. package/dist/config/update-validation.js.map +1 -0
  8. package/dist/index.js +163 -1815
  9. package/dist/index.js.map +1 -1
  10. package/dist/integrations/calendar-event-creator.d.ts +2 -3
  11. package/dist/integrations/calendar-event-creator.d.ts.map +1 -1
  12. package/dist/integrations/calendar-event-creator.js +3 -4
  13. package/dist/integrations/calendar-event-creator.js.map +1 -1
  14. package/dist/integrations/calendar-event-deleter.d.ts +2 -3
  15. package/dist/integrations/calendar-event-deleter.d.ts.map +1 -1
  16. package/dist/integrations/calendar-event-deleter.js +3 -4
  17. package/dist/integrations/calendar-event-deleter.js.map +1 -1
  18. package/dist/integrations/calendar-event-response.d.ts +4 -17
  19. package/dist/integrations/calendar-event-response.d.ts.map +1 -1
  20. package/dist/integrations/calendar-event-response.js +3 -4
  21. package/dist/integrations/calendar-event-response.js.map +1 -1
  22. package/dist/integrations/notion-mcp.d.ts +28 -3
  23. package/dist/integrations/notion-mcp.d.ts.map +1 -1
  24. package/dist/integrations/notion-mcp.js +21 -5
  25. package/dist/integrations/notion-mcp.js.map +1 -1
  26. package/dist/integrations/reminder-manager.d.ts.map +1 -1
  27. package/dist/integrations/reminder-manager.js +2 -0
  28. package/dist/integrations/reminder-manager.js.map +1 -1
  29. package/dist/services/container.d.ts +56 -0
  30. package/dist/services/container.d.ts.map +1 -0
  31. package/dist/services/container.js +76 -0
  32. package/dist/services/container.js.map +1 -0
  33. package/dist/tools/calendar/handlers.d.ts +186 -0
  34. package/dist/tools/calendar/handlers.d.ts.map +1 -0
  35. package/dist/tools/calendar/handlers.js +525 -0
  36. package/dist/tools/calendar/handlers.js.map +1 -0
  37. package/dist/tools/calendar/index.d.ts +11 -0
  38. package/dist/tools/calendar/index.d.ts.map +1 -0
  39. package/dist/tools/calendar/index.js +10 -0
  40. package/dist/tools/calendar/index.js.map +1 -0
  41. package/dist/tools/index.d.ts +23 -0
  42. package/dist/tools/index.d.ts.map +1 -0
  43. package/dist/tools/index.js +24 -0
  44. package/dist/tools/index.js.map +1 -0
  45. package/dist/tools/integrations/handlers.d.ts +57 -0
  46. package/dist/tools/integrations/handlers.d.ts.map +1 -0
  47. package/dist/tools/integrations/handlers.js +159 -0
  48. package/dist/tools/integrations/handlers.js.map +1 -0
  49. package/dist/tools/integrations/index.d.ts +11 -0
  50. package/dist/tools/integrations/index.d.ts.map +1 -0
  51. package/dist/tools/integrations/index.js +10 -0
  52. package/dist/tools/integrations/index.js.map +1 -0
  53. package/dist/tools/registry.d.ts +8 -0
  54. package/dist/tools/registry.d.ts.map +1 -0
  55. package/dist/tools/registry.js +10 -0
  56. package/dist/tools/registry.js.map +1 -0
  57. package/dist/tools/reminders/handlers.d.ts +61 -0
  58. package/dist/tools/reminders/handlers.d.ts.map +1 -0
  59. package/dist/tools/reminders/handlers.js +148 -0
  60. package/dist/tools/reminders/handlers.js.map +1 -0
  61. package/dist/tools/reminders/index.d.ts +11 -0
  62. package/dist/tools/reminders/index.d.ts.map +1 -0
  63. package/dist/tools/reminders/index.js +10 -0
  64. package/dist/tools/reminders/index.js.map +1 -0
  65. package/dist/tools/setup/handlers.d.ts +81 -0
  66. package/dist/tools/setup/handlers.d.ts.map +1 -0
  67. package/dist/tools/setup/handlers.js +172 -0
  68. package/dist/tools/setup/handlers.js.map +1 -0
  69. package/dist/tools/setup/index.d.ts +11 -0
  70. package/dist/tools/setup/index.d.ts.map +1 -0
  71. package/dist/tools/setup/index.js +10 -0
  72. package/dist/tools/setup/index.js.map +1 -0
  73. package/dist/tools/tasks/handlers.d.ts +95 -0
  74. package/dist/tools/tasks/handlers.d.ts.map +1 -0
  75. package/dist/tools/tasks/handlers.js +197 -0
  76. package/dist/tools/tasks/handlers.js.map +1 -0
  77. package/dist/tools/tasks/index.d.ts +11 -0
  78. package/dist/tools/tasks/index.d.ts.map +1 -0
  79. package/dist/tools/tasks/index.js +10 -0
  80. package/dist/tools/tasks/index.js.map +1 -0
  81. package/dist/tools/types.d.ts +54 -0
  82. package/dist/tools/types.d.ts.map +1 -0
  83. package/dist/tools/types.js +9 -0
  84. package/dist/tools/types.js.map +1 -0
  85. package/dist/types/calendar.d.ts +41 -0
  86. package/dist/types/calendar.d.ts.map +1 -0
  87. package/dist/types/calendar.js +18 -0
  88. package/dist/types/calendar.js.map +1 -0
  89. package/dist/utils/estimation.d.ts +34 -0
  90. package/dist/utils/estimation.d.ts.map +1 -1
  91. package/dist/utils/estimation.js +38 -1
  92. package/dist/utils/estimation.js.map +1 -1
  93. package/dist/utils/mcp-response.d.ts +89 -0
  94. package/dist/utils/mcp-response.d.ts.map +1 -0
  95. package/dist/utils/mcp-response.js +103 -0
  96. package/dist/utils/mcp-response.js.map +1 -0
  97. package/dist/utils/task-splitter.d.ts +65 -4
  98. package/dist/utils/task-splitter.d.ts.map +1 -1
  99. package/dist/utils/task-splitter.js +69 -5
  100. package/dist/utils/task-splitter.js.map +1 -1
  101. package/dist/version.js +1 -1
  102. package/package.json +1 -1
  103. package/dist/cli/http-server.d.ts +0 -74
  104. package/dist/cli/http-server.d.ts.map +0 -1
  105. package/dist/cli/http-server.js +0 -407
  106. package/dist/cli/http-server.js.map +0 -1
  107. package/dist/remote/remote-mcp-server.d.ts +0 -244
  108. package/dist/remote/remote-mcp-server.d.ts.map +0 -1
  109. package/dist/remote/remote-mcp-server.js +0 -507
  110. package/dist/remote/remote-mcp-server.js.map +0 -1
@@ -1,507 +0,0 @@
1
- /**
2
- * Remote MCP Server
3
- * HTTP/WebSocket based MCP server for remote access
4
- * Requirements: 13.1-13.5
5
- */
6
- import { createServer } from 'http';
7
- import { createServer as createHttpsServer } from 'https';
8
- import { randomUUID } from 'crypto';
9
- /**
10
- * Session Manager
11
- * Handles session creation, validation, and cleanup
12
- */
13
- export class SessionManager {
14
- sessions = new Map();
15
- config;
16
- constructor(config) {
17
- this.config = config;
18
- }
19
- /**
20
- * Create a new session
21
- */
22
- createSession(userId) {
23
- // Check if we're at max sessions and remove oldest if needed
24
- while (this.sessions.size >= this.config.maxSessions) {
25
- // Remove oldest session
26
- this.removeOldestSession();
27
- }
28
- const session = {
29
- id: randomUUID(),
30
- userId,
31
- createdAt: new Date(),
32
- lastAccessedAt: new Date(),
33
- data: {},
34
- };
35
- this.sessions.set(session.id, session);
36
- return session;
37
- }
38
- /**
39
- * Check if a session is valid
40
- */
41
- isValidSession(sessionId) {
42
- const session = this.sessions.get(sessionId);
43
- if (!session) {
44
- return false;
45
- }
46
- const now = Date.now();
47
- const lastAccess = session.lastAccessedAt.getTime();
48
- if (now - lastAccess > this.config.sessionTimeout) {
49
- this.sessions.delete(sessionId);
50
- return false;
51
- }
52
- // Update last accessed time
53
- session.lastAccessedAt = new Date();
54
- return true;
55
- }
56
- /**
57
- * Terminate a session
58
- */
59
- terminateSession(sessionId) {
60
- this.sessions.delete(sessionId);
61
- }
62
- /**
63
- * Get a session by ID
64
- */
65
- getSession(sessionId) {
66
- if (this.isValidSession(sessionId)) {
67
- return this.sessions.get(sessionId);
68
- }
69
- return undefined;
70
- }
71
- /**
72
- * Clean up expired sessions
73
- */
74
- cleanExpiredSessions() {
75
- const now = Date.now();
76
- for (const [id, session] of this.sessions.entries()) {
77
- if (now - session.lastAccessedAt.getTime() > this.config.sessionTimeout) {
78
- this.sessions.delete(id);
79
- }
80
- }
81
- }
82
- /**
83
- * Get active session count
84
- */
85
- getActiveSessionCount() {
86
- return this.sessions.size;
87
- }
88
- /**
89
- * Remove oldest session
90
- */
91
- removeOldestSession() {
92
- let oldestId = null;
93
- let oldestTime = Date.now();
94
- for (const [id, session] of this.sessions.entries()) {
95
- if (session.createdAt.getTime() < oldestTime) {
96
- oldestTime = session.createdAt.getTime();
97
- oldestId = id;
98
- }
99
- }
100
- if (oldestId) {
101
- this.sessions.delete(oldestId);
102
- }
103
- }
104
- }
105
- /**
106
- * Authentication Configuration
107
- * Handles JWT, API keys, and IP whitelist authentication
108
- */
109
- export class AuthConfig {
110
- config;
111
- tokens = new Map();
112
- constructor(config) {
113
- this.config = config;
114
- }
115
- /**
116
- * Generate a token for a user
117
- */
118
- generateToken(userId) {
119
- const token = randomUUID();
120
- const expiry = this.config.tokenExpiry || 3600000; // 1 hour default
121
- const expiresAt = Date.now() + expiry;
122
- this.tokens.set(token, { userId, expiresAt });
123
- return token;
124
- }
125
- /**
126
- * Validate a token
127
- */
128
- validateToken(token) {
129
- const tokenData = this.tokens.get(token);
130
- if (!tokenData) {
131
- return false;
132
- }
133
- if (Date.now() > tokenData.expiresAt) {
134
- this.tokens.delete(token);
135
- return false;
136
- }
137
- return true;
138
- }
139
- /**
140
- * Validate an API key
141
- */
142
- validateApiKey(apiKey) {
143
- if (!this.config.apiKeys || this.config.apiKeys.length === 0) {
144
- return false;
145
- }
146
- return this.config.apiKeys.includes(apiKey);
147
- }
148
- /**
149
- * Check if an IP is allowed
150
- */
151
- isIPAllowed(ip) {
152
- if (!this.config.ipWhitelist || this.config.ipWhitelist.length === 0) {
153
- return true; // No whitelist means all IPs allowed
154
- }
155
- // Simple IP matching (supports exact match and CIDR notation)
156
- for (const allowed of this.config.ipWhitelist) {
157
- if (this.matchIP(ip, allowed)) {
158
- return true;
159
- }
160
- }
161
- return false;
162
- }
163
- /**
164
- * Match IP against pattern (exact or CIDR)
165
- */
166
- matchIP(ip, pattern) {
167
- if (ip === pattern) {
168
- return true;
169
- }
170
- // Simple CIDR matching for IPv4
171
- if (pattern.includes('/')) {
172
- const [network, bits] = pattern.split('/');
173
- const mask = parseInt(bits, 10);
174
- if (mask >= 0 && mask <= 32) {
175
- const ipParts = ip.split('.').map(Number);
176
- const networkParts = network.split('.').map(Number);
177
- if (ipParts.length === 4 && networkParts.length === 4) {
178
- const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
179
- const networkNum = (networkParts[0] << 24) |
180
- (networkParts[1] << 16) |
181
- (networkParts[2] << 8) |
182
- networkParts[3];
183
- const maskNum = ~((1 << (32 - mask)) - 1);
184
- return (ipNum & maskNum) === (networkNum & maskNum);
185
- }
186
- }
187
- }
188
- return false;
189
- }
190
- /**
191
- * Extract token from Authorization header
192
- */
193
- extractToken(authHeader) {
194
- if (!authHeader) {
195
- return null;
196
- }
197
- if (authHeader.startsWith('Bearer ')) {
198
- return authHeader.slice(7);
199
- }
200
- return null;
201
- }
202
- /**
203
- * Check if authentication is enabled
204
- */
205
- isEnabled() {
206
- return this.config.enabled;
207
- }
208
- }
209
- /**
210
- * MCP Over HTTP Handler
211
- * Handles JSON-RPC over HTTP protocol
212
- */
213
- export class MCPOverHTTPHandler {
214
- config;
215
- constructor(config) {
216
- this.config = config || {};
217
- }
218
- /**
219
- * Parse a JSON-RPC request
220
- */
221
- parseRequest(body) {
222
- let parsed;
223
- try {
224
- parsed = JSON.parse(body);
225
- }
226
- catch {
227
- throw new Error('Invalid JSON');
228
- }
229
- const request = parsed;
230
- if (!request.jsonrpc || request.jsonrpc !== '2.0') {
231
- throw new Error('Invalid JSON-RPC request');
232
- }
233
- if (request.method === undefined) {
234
- throw new Error('Invalid JSON-RPC request: missing method');
235
- }
236
- return {
237
- jsonrpc: '2.0',
238
- id: request.id ?? null,
239
- method: request.method,
240
- params: request.params,
241
- };
242
- }
243
- /**
244
- * Build a success response
245
- */
246
- buildResponse(id, result) {
247
- return {
248
- jsonrpc: '2.0',
249
- id,
250
- result,
251
- };
252
- }
253
- /**
254
- * Build an error response
255
- */
256
- buildErrorResponse(id, code, message, data) {
257
- return {
258
- jsonrpc: '2.0',
259
- id,
260
- error: {
261
- code,
262
- message,
263
- data,
264
- },
265
- };
266
- }
267
- /**
268
- * Get CORS headers for a request
269
- */
270
- getCORSHeaders(origin) {
271
- const allowedOrigins = this.config.allowedOrigins || ['*'];
272
- let allowOrigin = '*';
273
- if (origin && allowedOrigins.includes(origin)) {
274
- allowOrigin = origin;
275
- }
276
- else if (allowedOrigins.length === 1 && allowedOrigins[0] !== '*') {
277
- allowOrigin = allowedOrigins[0];
278
- }
279
- return {
280
- 'Access-Control-Allow-Origin': allowOrigin,
281
- 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
282
- 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-API-Key',
283
- 'Access-Control-Max-Age': '86400',
284
- };
285
- }
286
- }
287
- /**
288
- * Remote MCP Server
289
- * HTTP/HTTPS server that exposes MCP protocol over HTTP
290
- */
291
- export class RemoteMCPServer {
292
- config;
293
- server = null;
294
- running = false;
295
- startTime = null;
296
- _sessionManager;
297
- auth;
298
- httpHandler;
299
- constructor(config) {
300
- this.config = {
301
- port: 3000,
302
- host: 'localhost',
303
- ...config,
304
- };
305
- this._sessionManager = new SessionManager({
306
- sessionTimeout: 3600000, // 1 hour
307
- maxSessions: 1000,
308
- });
309
- this.auth = config.auth ? new AuthConfig(config.auth) : null;
310
- this.httpHandler = new MCPOverHTTPHandler({
311
- allowedOrigins: config.cors?.allowedOrigins,
312
- });
313
- }
314
- /**
315
- * Start the server
316
- */
317
- async start() {
318
- if (this.running) {
319
- return;
320
- }
321
- return new Promise((resolve, reject) => {
322
- try {
323
- const requestHandler = this.handleRequest.bind(this);
324
- if (this.config.ssl) {
325
- this.server = createHttpsServer({
326
- cert: this.config.ssl.cert,
327
- key: this.config.ssl.key,
328
- ca: this.config.ssl.ca,
329
- }, requestHandler);
330
- }
331
- else {
332
- this.server = createServer(requestHandler);
333
- }
334
- this.server.listen(this.config.port, this.config.host, () => {
335
- this.running = true;
336
- this.startTime = new Date();
337
- resolve();
338
- });
339
- this.server.on('error', (error) => {
340
- reject(error);
341
- });
342
- }
343
- catch (error) {
344
- reject(error);
345
- }
346
- });
347
- }
348
- /**
349
- * Stop the server
350
- */
351
- async stop() {
352
- if (!this.running || !this.server) {
353
- return;
354
- }
355
- return new Promise((resolve) => {
356
- this.server.close(() => {
357
- this.running = false;
358
- this.startTime = null;
359
- resolve();
360
- });
361
- });
362
- }
363
- /**
364
- * Check if server is running
365
- */
366
- isRunning() {
367
- return this.running;
368
- }
369
- /**
370
- * Get configured port
371
- */
372
- getPort() {
373
- return this.config.port;
374
- }
375
- /**
376
- * Check if HTTPS is enabled
377
- */
378
- isHTTPS() {
379
- return !!this.config.ssl;
380
- }
381
- /**
382
- * Health check
383
- */
384
- async healthCheck() {
385
- const uptime = this.startTime ? Date.now() - this.startTime.getTime() : 0;
386
- return {
387
- status: this.running ? 'ok' : 'error',
388
- uptime,
389
- version: '1.0.0',
390
- timestamp: new Date().toISOString(),
391
- };
392
- }
393
- /**
394
- * Get session manager for external access
395
- */
396
- getSessionManager() {
397
- return this._sessionManager;
398
- }
399
- /**
400
- * Get active session count
401
- */
402
- getActiveSessionCount() {
403
- return this._sessionManager.getActiveSessionCount();
404
- }
405
- /**
406
- * Handle incoming HTTP request
407
- */
408
- handleRequest(req, res) {
409
- const url = req.url || '/';
410
- const method = req.method || 'GET';
411
- const origin = req.headers.origin;
412
- // Add CORS headers
413
- const corsHeaders = this.httpHandler.getCORSHeaders(origin);
414
- for (const [key, value] of Object.entries(corsHeaders)) {
415
- res.setHeader(key, value);
416
- }
417
- // Handle preflight
418
- if (method === 'OPTIONS') {
419
- res.writeHead(204);
420
- res.end();
421
- return;
422
- }
423
- // Health check endpoint
424
- if (url === '/health' && method === 'GET') {
425
- this.handleHealthCheck(res);
426
- return;
427
- }
428
- // MCP endpoint
429
- if (url === '/mcp' && method === 'POST') {
430
- this.handleMCPRequest(req, res);
431
- return;
432
- }
433
- // 404 for unknown routes
434
- res.writeHead(404, { 'Content-Type': 'application/json' });
435
- res.end(JSON.stringify({ error: 'Not found' }));
436
- }
437
- /**
438
- * Handle health check request
439
- */
440
- async handleHealthCheck(res) {
441
- const health = await this.healthCheck();
442
- res.writeHead(200, { 'Content-Type': 'application/json' });
443
- res.end(JSON.stringify(health));
444
- }
445
- /**
446
- * Handle MCP request
447
- */
448
- handleMCPRequest(req, res) {
449
- // Check authentication if enabled
450
- if (this.auth?.isEnabled()) {
451
- const authHeader = req.headers.authorization;
452
- const apiKey = req.headers['x-api-key'];
453
- const clientIP = req.headers['x-forwarded-for']?.split(',')[0] ||
454
- req.socket.remoteAddress ||
455
- '';
456
- // Check IP whitelist
457
- if (!this.auth.isIPAllowed(clientIP)) {
458
- res.writeHead(403, { 'Content-Type': 'application/json' });
459
- res.end(JSON.stringify(this.httpHandler.buildErrorResponse(null, -32001, 'IP not allowed')));
460
- return;
461
- }
462
- // Check API key or token
463
- const token = this.auth.extractToken(authHeader);
464
- if (!token && !apiKey) {
465
- res.writeHead(401, { 'Content-Type': 'application/json' });
466
- res.end(JSON.stringify(this.httpHandler.buildErrorResponse(null, -32002, 'Authentication required')));
467
- return;
468
- }
469
- if (token && !this.auth.validateToken(token)) {
470
- if (!apiKey || !this.auth.validateApiKey(apiKey)) {
471
- res.writeHead(401, { 'Content-Type': 'application/json' });
472
- res.end(JSON.stringify(this.httpHandler.buildErrorResponse(null, -32003, 'Invalid credentials')));
473
- return;
474
- }
475
- }
476
- }
477
- // Read request body
478
- let body = '';
479
- req.on('data', (chunk) => {
480
- body += chunk.toString();
481
- });
482
- req.on('end', () => {
483
- try {
484
- const request = this.httpHandler.parseRequest(body);
485
- // TODO: Route to appropriate MCP tool handler
486
- // For now, return a placeholder response
487
- const response = this.httpHandler.buildResponse(request.id, {
488
- message: 'MCP request received',
489
- method: request.method,
490
- params: request.params,
491
- });
492
- res.writeHead(200, { 'Content-Type': 'application/json' });
493
- res.end(JSON.stringify(response));
494
- }
495
- catch (error) {
496
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
497
- res.writeHead(400, { 'Content-Type': 'application/json' });
498
- res.end(JSON.stringify(this.httpHandler.buildErrorResponse(null, -32700, errorMessage)));
499
- }
500
- });
501
- req.on('error', (error) => {
502
- res.writeHead(500, { 'Content-Type': 'application/json' });
503
- res.end(JSON.stringify(this.httpHandler.buildErrorResponse(null, -32603, error.message)));
504
- });
505
- }
506
- }
507
- //# sourceMappingURL=remote-mcp-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remote-mcp-server.js","sourceRoot":"","sources":["../../src/remote/remote-mcp-server.ts"],"names":[],"mappings":"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"}