@stackmemoryai/stackmemory 0.2.7 → 0.2.8
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 +25 -8
- package/dist/scripts/cancel-duplicate-tasks.js +2 -1
- package/dist/scripts/cancel-duplicate-tasks.js.map +1 -1
- package/dist/scripts/list-linear-tasks.js +3 -4
- package/dist/scripts/list-linear-tasks.js.map +1 -1
- package/dist/scripts/merge-linear-duplicates-safe.js +4 -2
- package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -1
- package/dist/scripts/show-linear-summary.js +4 -1
- package/dist/scripts/show-linear-summary.js.map +1 -1
- package/dist/scripts/status.js +6 -2
- package/dist/scripts/status.js.map +1 -1
- package/dist/src/cli/auto-detect.js.map +1 -1
- package/dist/src/cli/claude-sm.js.map +1 -1
- package/dist/src/cli/commands/config.d.ts +6 -0
- package/dist/src/cli/commands/config.d.ts.map +1 -0
- package/dist/src/cli/commands/config.js +224 -0
- package/dist/src/cli/commands/config.js.map +1 -0
- package/dist/src/cli/commands/linear.d.ts.map +1 -1
- package/dist/src/cli/commands/linear.js +123 -47
- package/dist/src/cli/commands/linear.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +48 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config/config-manager.d.ts +95 -0
- package/dist/src/core/config/config-manager.d.ts.map +1 -0
- package/dist/src/core/config/config-manager.js +359 -0
- package/dist/src/core/config/config-manager.js.map +1 -0
- package/dist/src/core/config/types.d.ts +72 -0
- package/dist/src/core/config/types.d.ts.map +1 -0
- package/dist/src/core/config/types.js +127 -0
- package/dist/src/core/config/types.js.map +1 -0
- package/dist/src/core/context/compaction-handler.d.ts +119 -0
- package/dist/src/core/context/compaction-handler.d.ts.map +1 -0
- package/dist/src/core/context/compaction-handler.js +306 -0
- package/dist/src/core/context/compaction-handler.js.map +1 -0
- package/dist/src/core/context/model-aware-compaction.d.ts +101 -0
- package/dist/src/core/context/model-aware-compaction.d.ts.map +1 -0
- package/dist/src/core/context/model-aware-compaction.js +616 -0
- package/dist/src/core/context/model-aware-compaction.js.map +1 -0
- package/dist/src/core/query/query-parser.d.ts +104 -0
- package/dist/src/core/query/query-parser.d.ts.map +1 -0
- package/dist/src/core/query/query-parser.js +347 -0
- package/dist/src/core/query/query-parser.js.map +1 -0
- package/dist/src/core/retrieval/index.d.ts +8 -0
- package/dist/src/core/retrieval/index.d.ts.map +1 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +1 -0
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts +71 -0
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +545 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -0
- package/dist/src/core/retrieval/summary-generator.d.ts +63 -0
- package/dist/src/core/retrieval/summary-generator.d.ts.map +1 -0
- package/dist/src/core/retrieval/summary-generator.js +622 -0
- package/dist/src/core/retrieval/summary-generator.js.map +1 -0
- package/dist/src/core/retrieval/types.d.ts +257 -0
- package/dist/src/core/retrieval/types.d.ts.map +1 -0
- package/dist/src/core/retrieval/types.js +18 -0
- package/dist/src/core/retrieval/types.js.map +1 -0
- package/dist/src/core/trace/trace-detector.d.ts +108 -0
- package/dist/src/core/trace/trace-detector.d.ts.map +1 -0
- package/dist/src/core/trace/trace-detector.demo.d.ts +5 -0
- package/dist/src/core/trace/trace-detector.demo.d.ts.map +1 -0
- package/dist/src/core/trace/trace-detector.demo.js +145 -0
- package/dist/src/core/trace/trace-detector.demo.js.map +1 -0
- package/dist/src/core/trace/trace-detector.js +425 -0
- package/dist/src/core/trace/trace-detector.js.map +1 -0
- package/dist/src/core/trace/trace-store.d.ts +60 -0
- package/dist/src/core/trace/trace-store.d.ts.map +1 -0
- package/dist/src/core/trace/trace-store.js +323 -0
- package/dist/src/core/trace/trace-store.js.map +1 -0
- package/dist/src/core/trace/types.d.ts +81 -0
- package/dist/src/core/trace/types.d.ts.map +1 -0
- package/dist/src/core/trace/types.js +70 -0
- package/dist/src/core/trace/types.js.map +1 -0
- package/dist/src/integrations/linear/sync-manager.d.ts +76 -0
- package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -0
- package/dist/src/integrations/linear/sync-manager.js +223 -0
- package/dist/src/integrations/linear/sync-manager.js.map +1 -0
- package/dist/src/integrations/mcp/server.d.ts +8 -0
- package/dist/src/integrations/mcp/server.d.ts.map +1 -1
- package/dist/src/integrations/mcp/server.js +368 -16
- package/dist/src/integrations/mcp/server.js.map +1 -1
- package/dist/src/integrations/mcp/trace-test.d.ts +5 -0
- package/dist/src/integrations/mcp/trace-test.d.ts.map +1 -0
- package/dist/src/integrations/mcp/trace-test.js +54 -0
- package/dist/src/integrations/mcp/trace-test.js.map +1 -0
- package/dist/src/services/config-service.d.ts +1 -1
- package/dist/src/services/config-service.d.ts.map +1 -1
- package/dist/src/services/config-service.js.map +1 -1
- package/dist/src/types/task.d.ts +11 -1
- package/dist/src/types/task.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.d.ts.map +1 -1
- package/dist/src/utils/logger.js.map +1 -1
- package/package.json +9 -8
- package/dist/attention-scoring/src/attention-tracker.d.ts +0 -79
- package/dist/attention-scoring/src/attention-tracker.d.ts.map +0 -1
- package/dist/attention-scoring/src/attention-tracker.js +0 -488
- package/dist/attention-scoring/src/attention-tracker.js.map +0 -1
- package/dist/attention-scoring/src/mcp-integration.d.ts +0 -56
- package/dist/attention-scoring/src/mcp-integration.d.ts.map +0 -1
- package/dist/attention-scoring/src/mcp-integration.js +0 -369
- package/dist/attention-scoring/src/mcp-integration.js.map +0 -1
- package/dist/index.js +0 -382
- package/dist/p2p-sync/src/p2p-sync.d.ts +0 -81
- package/dist/p2p-sync/src/p2p-sync.d.ts.map +0 -1
- package/dist/p2p-sync/src/p2p-sync.js +0 -457
- package/dist/p2p-sync/src/p2p-sync.js.map +0 -1
- package/dist/p2p-sync/src/team-context-sync.d.ts +0 -99
- package/dist/p2p-sync/src/team-context-sync.d.ts.map +0 -1
- package/dist/p2p-sync/src/team-context-sync.js +0 -491
- package/dist/p2p-sync/src/team-context-sync.js.map +0 -1
- package/dist/scripts/merge-linear-duplicates.d.ts +0 -7
- package/dist/scripts/merge-linear-duplicates.d.ts.map +0 -1
- package/dist/scripts/merge-linear-duplicates.js +0 -126
- package/dist/scripts/merge-linear-duplicates.js.map +0 -1
- package/dist/src/analytics/api/analytics-api.d.ts +0 -24
- package/dist/src/analytics/api/analytics-api.d.ts.map +0 -1
- package/dist/src/analytics/api/analytics-api.js +0 -279
- package/dist/src/analytics/api/analytics-api.js.map +0 -1
- package/dist/src/analytics/core/analytics-service.d.ts +0 -23
- package/dist/src/analytics/core/analytics-service.d.ts.map +0 -1
- package/dist/src/analytics/core/analytics-service.js +0 -160
- package/dist/src/analytics/core/analytics-service.js.map +0 -1
- package/dist/src/analytics/index.d.ts +0 -12
- package/dist/src/analytics/index.d.ts.map +0 -1
- package/dist/src/analytics/index.js +0 -11
- package/dist/src/analytics/index.js.map +0 -1
- package/dist/src/analytics/queries/metrics-queries.d.ts +0 -11
- package/dist/src/analytics/queries/metrics-queries.d.ts.map +0 -1
- package/dist/src/analytics/queries/metrics-queries.js +0 -179
- package/dist/src/analytics/queries/metrics-queries.js.map +0 -1
- package/dist/src/analytics/types/metrics.d.ts +0 -60
- package/dist/src/analytics/types/metrics.d.ts.map +0 -1
- package/dist/src/analytics/types/metrics.js +0 -2
- package/dist/src/analytics/types/metrics.js.map +0 -1
- package/dist/src/beads/beads-task-store.d.ts +0 -117
- package/dist/src/beads/beads-task-store.d.ts.map +0 -1
- package/dist/src/beads/beads-task-store.js +0 -318
- package/dist/src/beads/beads-task-store.js.map +0 -1
- package/dist/src/beads/task-aware-context.d.ts +0 -103
- package/dist/src/beads/task-aware-context.d.ts.map +0 -1
- package/dist/src/beads/task-aware-context.js +0 -395
- package/dist/src/beads/task-aware-context.js.map +0 -1
- package/dist/src/beads-task-store.d.ts +0 -117
- package/dist/src/beads-task-store.d.ts.map +0 -1
- package/dist/src/beads-task-store.js +0 -318
- package/dist/src/beads-task-store.js.map +0 -1
- package/dist/src/cli/__tests__/index.test.d.ts +0 -5
- package/dist/src/cli/__tests__/index.test.d.ts.map +0 -1
- package/dist/src/cli/__tests__/index.test.js +0 -726
- package/dist/src/cli/__tests__/index.test.js.map +0 -1
- package/dist/src/cli/analytics-viewer.d.ts +0 -3
- package/dist/src/cli/analytics-viewer.d.ts.map +0 -1
- package/dist/src/cli/analytics-viewer.js +0 -89
- package/dist/src/cli/analytics-viewer.js.map +0 -1
- package/dist/src/cli/cli.d.ts +0 -7
- package/dist/src/cli/cli.d.ts.map +0 -1
- package/dist/src/cli/cli.js +0 -704
- package/dist/src/cli/cli.js.map +0 -1
- package/dist/src/cli/project-commands.d.ts +0 -8
- package/dist/src/cli/project-commands.d.ts.map +0 -1
- package/dist/src/cli/project-commands.js +0 -212
- package/dist/src/cli/project-commands.js.map +0 -1
- package/dist/src/cli.d.ts +0 -7
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -73
- package/dist/src/cli.js.map +0 -1
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts +0 -5
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +0 -1
- package/dist/src/core/context/__tests__/frame-manager.test.js +0 -892
- package/dist/src/core/context/__tests__/frame-manager.test.js.map +0 -1
- package/dist/src/core/error-handler.d.ts +0 -46
- package/dist/src/core/error-handler.d.ts.map +0 -1
- package/dist/src/core/error-handler.js +0 -212
- package/dist/src/core/error-handler.js.map +0 -1
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts +0 -5
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +0 -1
- package/dist/src/core/errors/__tests__/error-handling.test.js +0 -239
- package/dist/src/core/errors/__tests__/error-handling.test.js.map +0 -1
- package/dist/src/core/frame-manager.d.ts +0 -106
- package/dist/src/core/frame-manager.d.ts.map +0 -1
- package/dist/src/core/frame-manager.js +0 -387
- package/dist/src/core/frame-manager.js.map +0 -1
- package/dist/src/core/logger.d.ts +0 -24
- package/dist/src/core/logger.d.ts.map +0 -1
- package/dist/src/core/logger.js +0 -121
- package/dist/src/core/logger.js.map +0 -1
- package/dist/src/core/logger.test.d.ts +0 -2
- package/dist/src/core/logger.test.d.ts.map +0 -1
- package/dist/src/core/logger.test.js +0 -31
- package/dist/src/core/logger.test.js.map +0 -1
- package/dist/src/core/progress-tracker.d.ts +0 -95
- package/dist/src/core/progress-tracker.d.ts.map +0 -1
- package/dist/src/core/progress-tracker.js +0 -178
- package/dist/src/core/progress-tracker.js.map +0 -1
- package/dist/src/core/project-manager.d.ts +0 -130
- package/dist/src/core/project-manager.d.ts.map +0 -1
- package/dist/src/core/project-manager.js +0 -582
- package/dist/src/core/project-manager.js.map +0 -1
- package/dist/src/core/update-checker.d.ts +0 -38
- package/dist/src/core/update-checker.d.ts.map +0 -1
- package/dist/src/core/update-checker.js +0 -156
- package/dist/src/core/update-checker.js.map +0 -1
- package/dist/src/error-handler.d.ts +0 -42
- package/dist/src/error-handler.d.ts.map +0 -1
- package/dist/src/error-handler.js +0 -155
- package/dist/src/error-handler.js.map +0 -1
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +0 -5
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +0 -1
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +0 -712
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -1
- package/dist/src/frame-manager.d.ts +0 -106
- package/dist/src/frame-manager.d.ts.map +0 -1
- package/dist/src/frame-manager.js +0 -361
- package/dist/src/frame-manager.js.map +0 -1
- package/dist/src/integrations/browser-mcp.d.ts +0 -94
- package/dist/src/integrations/browser-mcp.d.ts.map +0 -1
- package/dist/src/integrations/browser-mcp.js +0 -431
- package/dist/src/integrations/browser-mcp.js.map +0 -1
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts +0 -5
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +0 -1
- package/dist/src/integrations/linear/__tests__/auth.test.js +0 -517
- package/dist/src/integrations/linear/__tests__/auth.test.js.map +0 -1
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +0 -5
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +0 -1
- package/dist/src/integrations/linear/__tests__/sync-service.test.js +0 -700
- package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +0 -1
- package/dist/src/integrations/linear-auth.d.ts +0 -99
- package/dist/src/integrations/linear-auth.d.ts.map +0 -1
- package/dist/src/integrations/linear-auth.js +0 -319
- package/dist/src/integrations/linear-auth.js.map +0 -1
- package/dist/src/integrations/linear-auto-sync.d.ts +0 -77
- package/dist/src/integrations/linear-auto-sync.d.ts.map +0 -1
- package/dist/src/integrations/linear-auto-sync.js +0 -268
- package/dist/src/integrations/linear-auto-sync.js.map +0 -1
- package/dist/src/integrations/linear-client.d.ts +0 -86
- package/dist/src/integrations/linear-client.d.ts.map +0 -1
- package/dist/src/integrations/linear-client.js +0 -277
- package/dist/src/integrations/linear-client.js.map +0 -1
- package/dist/src/integrations/linear-config.d.ts +0 -51
- package/dist/src/integrations/linear-config.d.ts.map +0 -1
- package/dist/src/integrations/linear-config.js +0 -103
- package/dist/src/integrations/linear-config.js.map +0 -1
- package/dist/src/integrations/linear-sync.d.ts +0 -97
- package/dist/src/integrations/linear-sync.d.ts.map +0 -1
- package/dist/src/integrations/linear-sync.js +0 -391
- package/dist/src/integrations/linear-sync.js.map +0 -1
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts +0 -5
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +0 -1
- package/dist/src/integrations/mcp/__tests__/server.test.js +0 -790
- package/dist/src/integrations/mcp/__tests__/server.test.js.map +0 -1
- package/dist/src/logger.d.ts +0 -24
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -120
- package/dist/src/logger.js.map +0 -1
- package/dist/src/mcp/mcp-server.d.ts +0 -40
- package/dist/src/mcp/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp/mcp-server.js +0 -828
- package/dist/src/mcp/mcp-server.js.map +0 -1
- package/dist/src/mcp-server.d.ts +0 -32
- package/dist/src/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp-server.js +0 -441
- package/dist/src/mcp-server.js.map +0 -1
- package/dist/src/pebbles/pebbles-task-store.d.ts +0 -117
- package/dist/src/pebbles/pebbles-task-store.d.ts.map +0 -1
- package/dist/src/pebbles/pebbles-task-store.js +0 -335
- package/dist/src/pebbles/pebbles-task-store.js.map +0 -1
- package/dist/src/pebbles/task-aware-context.d.ts +0 -103
- package/dist/src/pebbles/task-aware-context.d.ts.map +0 -1
- package/dist/src/pebbles/task-aware-context.js +0 -412
- package/dist/src/pebbles/task-aware-context.js.map +0 -1
- package/dist/src/railway/index.d.ts +0 -7
- package/dist/src/railway/index.d.ts.map +0 -1
- package/dist/src/railway/index.js +0 -401
- package/dist/src/railway/index.js.map +0 -1
- package/dist/src/runway/auth/auth-middleware.d.ts +0 -66
- package/dist/src/runway/auth/auth-middleware.d.ts.map +0 -1
- package/dist/src/runway/auth/auth-middleware.js +0 -337
- package/dist/src/runway/auth/auth-middleware.js.map +0 -1
- package/dist/src/runway/server/runway-mcp-server.d.ts +0 -46
- package/dist/src/runway/server/runway-mcp-server.d.ts.map +0 -1
- package/dist/src/runway/server/runway-mcp-server.js +0 -601
- package/dist/src/runway/server/runway-mcp-server.js.map +0 -1
- package/dist/src/runway.bak/auth/auth-middleware.d.ts +0 -66
- package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +0 -1
- package/dist/src/runway.bak/auth/auth-middleware.js +0 -337
- package/dist/src/runway.bak/auth/auth-middleware.js.map +0 -1
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts +0 -46
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +0 -1
- package/dist/src/runway.bak/server/runway-mcp-server.js +0 -601
- package/dist/src/runway.bak/server/runway-mcp-server.js.map +0 -1
- package/dist/src/task-aware-context.d.ts +0 -103
- package/dist/src/task-aware-context.d.ts.map +0 -1
- package/dist/src/task-aware-context.js +0 -395
- package/dist/src/task-aware-context.js.map +0 -1
package/dist/index.js
DELETED
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Railway MCP Server Entry Point
|
|
4
|
-
* Simplified production server for Railway deployment
|
|
5
|
-
*/
|
|
6
|
-
import express from 'express';
|
|
7
|
-
import { createServer } from 'http';
|
|
8
|
-
import { WebSocketServer } from 'ws';
|
|
9
|
-
import cors from 'cors';
|
|
10
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
11
|
-
import Database from 'better-sqlite3';
|
|
12
|
-
import { join, dirname } from 'path';
|
|
13
|
-
import { fileURLToPath } from 'url';
|
|
14
|
-
import { existsSync, mkdirSync } from 'fs';
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = dirname(__filename);
|
|
17
|
-
// Configuration
|
|
18
|
-
const config = {
|
|
19
|
-
port: parseInt(process.env.PORT || '8080'),
|
|
20
|
-
environment: process.env.NODE_ENV || 'development',
|
|
21
|
-
corsOrigins: process.env.CORS_ORIGINS?.split(',') || ['http://localhost:3000'],
|
|
22
|
-
authMode: process.env.AUTH_MODE || 'api_key',
|
|
23
|
-
apiKeySecret: process.env.API_KEY_SECRET || 'development-secret',
|
|
24
|
-
jwtSecret: process.env.JWT_SECRET || 'development-jwt-secret',
|
|
25
|
-
databaseUrl: process.env.DATABASE_URL || join(process.cwd(), '.stackmemory', 'railway.db'),
|
|
26
|
-
rateLimitEnabled: process.env.RATE_LIMIT_ENABLED === 'true',
|
|
27
|
-
rateLimitFree: parseInt(process.env.RATE_LIMIT_FREE || '100'),
|
|
28
|
-
enableWebSocket: process.env.ENABLE_WEBSOCKET !== 'false',
|
|
29
|
-
enableAnalytics: process.env.ENABLE_ANALYTICS === 'true'
|
|
30
|
-
};
|
|
31
|
-
// Simple in-memory rate limiter
|
|
32
|
-
const rateLimiter = new Map();
|
|
33
|
-
class RailwayMCPServer {
|
|
34
|
-
constructor() {
|
|
35
|
-
this.connections = new Map();
|
|
36
|
-
this.app = express();
|
|
37
|
-
this.httpServer = createServer(this.app);
|
|
38
|
-
this.initializeDatabase();
|
|
39
|
-
this.setupMiddleware();
|
|
40
|
-
this.setupRoutes();
|
|
41
|
-
this.setupMCPServer();
|
|
42
|
-
if (config.enableWebSocket) {
|
|
43
|
-
this.setupWebSocket();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
initializeDatabase() {
|
|
47
|
-
// Use PostgreSQL in production, SQLite for development
|
|
48
|
-
if (config.environment === 'production' && config.databaseUrl.startsWith('postgresql://')) {
|
|
49
|
-
console.log('Using PostgreSQL database');
|
|
50
|
-
// In production, we'd use pg client here
|
|
51
|
-
// For now, we'll use SQLite as fallback
|
|
52
|
-
const dbPath = '/tmp/stackmemory.db';
|
|
53
|
-
this.db = new Database(dbPath);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
// Create database directory if it doesn't exist
|
|
57
|
-
const dbDir = dirname(config.databaseUrl);
|
|
58
|
-
if (!existsSync(dbDir)) {
|
|
59
|
-
mkdirSync(dbDir, { recursive: true });
|
|
60
|
-
}
|
|
61
|
-
this.db = new Database(config.databaseUrl);
|
|
62
|
-
}
|
|
63
|
-
// Initialize tables
|
|
64
|
-
this.db.exec(`
|
|
65
|
-
CREATE TABLE IF NOT EXISTS contexts (
|
|
66
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
-
project_id TEXT NOT NULL,
|
|
68
|
-
content TEXT NOT NULL,
|
|
69
|
-
type TEXT DEFAULT 'general',
|
|
70
|
-
metadata TEXT DEFAULT '{}',
|
|
71
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
72
|
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
CREATE TABLE IF NOT EXISTS api_keys (
|
|
76
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
77
|
-
key_hash TEXT UNIQUE NOT NULL,
|
|
78
|
-
user_id TEXT NOT NULL,
|
|
79
|
-
name TEXT,
|
|
80
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
81
|
-
last_used DATETIME,
|
|
82
|
-
revoked BOOLEAN DEFAULT 0
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
CREATE INDEX IF NOT EXISTS idx_contexts_project ON contexts(project_id);
|
|
86
|
-
CREATE INDEX IF NOT EXISTS idx_api_keys_hash ON api_keys(key_hash);
|
|
87
|
-
`);
|
|
88
|
-
}
|
|
89
|
-
setupMiddleware() {
|
|
90
|
-
// CORS
|
|
91
|
-
this.app.use(cors({
|
|
92
|
-
origin: config.corsOrigins,
|
|
93
|
-
credentials: true
|
|
94
|
-
}));
|
|
95
|
-
// Body parsing
|
|
96
|
-
this.app.use(express.json({ limit: '10mb' }));
|
|
97
|
-
// Request logging
|
|
98
|
-
this.app.use((req, res, next) => {
|
|
99
|
-
console.log(`${new Date().toISOString()} ${req.method} ${req.path}`);
|
|
100
|
-
next();
|
|
101
|
-
});
|
|
102
|
-
// Simple authentication middleware
|
|
103
|
-
this.app.use('/api', this.authenticate.bind(this));
|
|
104
|
-
// Rate limiting
|
|
105
|
-
if (config.rateLimitEnabled) {
|
|
106
|
-
this.app.use('/api', this.rateLimit.bind(this));
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
authenticate(req, res, next) {
|
|
110
|
-
// Skip auth for health check
|
|
111
|
-
if (req.path === '/health') {
|
|
112
|
-
return next();
|
|
113
|
-
}
|
|
114
|
-
const authHeader = req.headers.authorization;
|
|
115
|
-
if (config.authMode === 'api_key') {
|
|
116
|
-
// Simple API key authentication
|
|
117
|
-
if (!authHeader?.startsWith('Bearer ')) {
|
|
118
|
-
return res.status(401).json({ error: 'Missing API key' });
|
|
119
|
-
}
|
|
120
|
-
const apiKey = authHeader.substring(7);
|
|
121
|
-
// In production, validate against database
|
|
122
|
-
// For now, simple check
|
|
123
|
-
if (apiKey.length < 32) {
|
|
124
|
-
return res.status(403).json({ error: 'Invalid API key' });
|
|
125
|
-
}
|
|
126
|
-
req.user = { id: 'api-user', tier: 'free' };
|
|
127
|
-
next();
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
// OAuth/JWT mode would go here
|
|
131
|
-
next();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
rateLimit(req, res, next) {
|
|
135
|
-
const userId = req.user?.id || req.ip;
|
|
136
|
-
const now = Date.now();
|
|
137
|
-
const windowMs = 15 * 60 * 1000; // 15 minutes
|
|
138
|
-
const userLimit = rateLimiter.get(userId);
|
|
139
|
-
if (!userLimit || userLimit.resetTime < now) {
|
|
140
|
-
rateLimiter.set(userId, {
|
|
141
|
-
count: 1,
|
|
142
|
-
resetTime: now + windowMs
|
|
143
|
-
});
|
|
144
|
-
return next();
|
|
145
|
-
}
|
|
146
|
-
if (userLimit.count >= config.rateLimitFree) {
|
|
147
|
-
const retryAfter = Math.ceil((userLimit.resetTime - now) / 1000);
|
|
148
|
-
res.setHeader('Retry-After', retryAfter.toString());
|
|
149
|
-
return res.status(429).json({
|
|
150
|
-
error: 'Rate limit exceeded',
|
|
151
|
-
retryAfter
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
userLimit.count++;
|
|
155
|
-
next();
|
|
156
|
-
}
|
|
157
|
-
setupRoutes() {
|
|
158
|
-
// Health check
|
|
159
|
-
this.app.get('/health', (req, res) => {
|
|
160
|
-
const health = {
|
|
161
|
-
status: 'healthy',
|
|
162
|
-
version: '1.0.0',
|
|
163
|
-
timestamp: new Date().toISOString(),
|
|
164
|
-
uptime: process.uptime(),
|
|
165
|
-
environment: config.environment
|
|
166
|
-
};
|
|
167
|
-
res.json(health);
|
|
168
|
-
});
|
|
169
|
-
// API Routes
|
|
170
|
-
this.app.post('/api/context/save', (req, res) => {
|
|
171
|
-
try {
|
|
172
|
-
const { projectId = 'default', content, type = 'general', metadata = {} } = req.body;
|
|
173
|
-
const stmt = this.db.prepare(`
|
|
174
|
-
INSERT INTO contexts (project_id, content, type, metadata)
|
|
175
|
-
VALUES (?, ?, ?, ?)
|
|
176
|
-
`);
|
|
177
|
-
const result = stmt.run(projectId, content, type, JSON.stringify(metadata));
|
|
178
|
-
res.json({
|
|
179
|
-
success: true,
|
|
180
|
-
id: result.lastInsertRowid
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
res.status(500).json({ error: error.message });
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
this.app.get('/api/context/load', (req, res) => {
|
|
188
|
-
try {
|
|
189
|
-
const { projectId = 'default', limit = 10, offset = 0 } = req.query;
|
|
190
|
-
const stmt = this.db.prepare(`
|
|
191
|
-
SELECT * FROM contexts
|
|
192
|
-
WHERE project_id = ?
|
|
193
|
-
ORDER BY created_at DESC
|
|
194
|
-
LIMIT ? OFFSET ?
|
|
195
|
-
`);
|
|
196
|
-
const contexts = stmt.all(projectId, limit, offset);
|
|
197
|
-
res.json({
|
|
198
|
-
success: true,
|
|
199
|
-
contexts: contexts.map(c => ({
|
|
200
|
-
...c,
|
|
201
|
-
metadata: JSON.parse(c.metadata)
|
|
202
|
-
}))
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
res.status(500).json({ error: error.message });
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
// MCP tool execution endpoint
|
|
210
|
-
this.app.post('/api/tools/execute', async (req, res) => {
|
|
211
|
-
try {
|
|
212
|
-
const { tool, params } = req.body;
|
|
213
|
-
// Execute MCP tool
|
|
214
|
-
const result = await this.executeMCPTool(tool, params);
|
|
215
|
-
res.json({
|
|
216
|
-
success: true,
|
|
217
|
-
result
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
catch (error) {
|
|
221
|
-
res.status(500).json({ error: error.message });
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
// Analytics endpoint
|
|
225
|
-
if (config.enableAnalytics) {
|
|
226
|
-
this.app.get('/api/analytics', (req, res) => {
|
|
227
|
-
try {
|
|
228
|
-
const { projectId = 'default' } = req.query;
|
|
229
|
-
const stats = this.db.prepare(`
|
|
230
|
-
SELECT
|
|
231
|
-
COUNT(*) as total_contexts,
|
|
232
|
-
COUNT(DISTINCT type) as unique_types,
|
|
233
|
-
MAX(created_at) as last_activity
|
|
234
|
-
FROM contexts
|
|
235
|
-
WHERE project_id = ?
|
|
236
|
-
`).get(projectId);
|
|
237
|
-
res.json({
|
|
238
|
-
success: true,
|
|
239
|
-
analytics: stats
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
catch (error) {
|
|
243
|
-
res.status(500).json({ error: error.message });
|
|
244
|
-
}
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
setupWebSocket() {
|
|
249
|
-
this.wss = new WebSocketServer({
|
|
250
|
-
server: this.httpServer,
|
|
251
|
-
path: '/ws'
|
|
252
|
-
});
|
|
253
|
-
this.wss.on('connection', (ws, req) => {
|
|
254
|
-
console.log('WebSocket connection established');
|
|
255
|
-
const connectionId = Math.random().toString(36).substring(7);
|
|
256
|
-
this.connections.set(connectionId, ws);
|
|
257
|
-
ws.on('message', async (data) => {
|
|
258
|
-
try {
|
|
259
|
-
const message = JSON.parse(data.toString());
|
|
260
|
-
const response = await this.handleWebSocketMessage(message);
|
|
261
|
-
ws.send(JSON.stringify(response));
|
|
262
|
-
}
|
|
263
|
-
catch (error) {
|
|
264
|
-
ws.send(JSON.stringify({
|
|
265
|
-
error: error.message
|
|
266
|
-
}));
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
ws.on('close', () => {
|
|
270
|
-
this.connections.delete(connectionId);
|
|
271
|
-
console.log('WebSocket connection closed');
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
async handleWebSocketMessage(message) {
|
|
276
|
-
const { type, tool, params } = message;
|
|
277
|
-
switch (type) {
|
|
278
|
-
case 'execute':
|
|
279
|
-
return await this.executeMCPTool(tool, params);
|
|
280
|
-
case 'ping':
|
|
281
|
-
return { type: 'pong' };
|
|
282
|
-
default:
|
|
283
|
-
throw new Error(`Unknown message type: ${type}`);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
setupMCPServer() {
|
|
287
|
-
this.mcpServer = new Server({
|
|
288
|
-
name: 'stackmemory-railway',
|
|
289
|
-
version: '1.0.0'
|
|
290
|
-
}, {
|
|
291
|
-
capabilities: {
|
|
292
|
-
tools: {},
|
|
293
|
-
resources: {}
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
// Register MCP tools
|
|
297
|
-
this.mcpServer.setRequestHandler('tools/list', async () => {
|
|
298
|
-
return {
|
|
299
|
-
tools: [
|
|
300
|
-
{
|
|
301
|
-
name: 'save_context',
|
|
302
|
-
description: 'Save context to StackMemory',
|
|
303
|
-
inputSchema: {
|
|
304
|
-
type: 'object',
|
|
305
|
-
properties: {
|
|
306
|
-
content: { type: 'string' },
|
|
307
|
-
type: { type: 'string' }
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
},
|
|
311
|
-
{
|
|
312
|
-
name: 'load_context',
|
|
313
|
-
description: 'Load context from StackMemory',
|
|
314
|
-
inputSchema: {
|
|
315
|
-
type: 'object',
|
|
316
|
-
properties: {
|
|
317
|
-
query: { type: 'string' },
|
|
318
|
-
limit: { type: 'number' }
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
]
|
|
323
|
-
};
|
|
324
|
-
});
|
|
325
|
-
this.mcpServer.setRequestHandler('tools/call', async (request) => {
|
|
326
|
-
const { name, arguments: args } = request.params;
|
|
327
|
-
return await this.executeMCPTool(name, args);
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
async executeMCPTool(tool, params) {
|
|
331
|
-
switch (tool) {
|
|
332
|
-
case 'save_context': {
|
|
333
|
-
const stmt = this.db.prepare(`
|
|
334
|
-
INSERT INTO contexts (project_id, content, type, metadata)
|
|
335
|
-
VALUES (?, ?, ?, ?)
|
|
336
|
-
`);
|
|
337
|
-
const result = stmt.run(params.projectId || 'default', params.content, params.type || 'general', JSON.stringify(params.metadata || {}));
|
|
338
|
-
return { id: result.lastInsertRowid, success: true };
|
|
339
|
-
}
|
|
340
|
-
case 'load_context': {
|
|
341
|
-
const stmt = this.db.prepare(`
|
|
342
|
-
SELECT * FROM contexts
|
|
343
|
-
WHERE project_id = ? AND content LIKE ?
|
|
344
|
-
ORDER BY created_at DESC
|
|
345
|
-
LIMIT ?
|
|
346
|
-
`);
|
|
347
|
-
const contexts = stmt.all(params.projectId || 'default', `%${params.query || ''}%`, params.limit || 10);
|
|
348
|
-
return { contexts, success: true };
|
|
349
|
-
}
|
|
350
|
-
default:
|
|
351
|
-
throw new Error(`Unknown tool: ${tool}`);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
start() {
|
|
355
|
-
this.httpServer.listen(config.port, '0.0.0.0', () => {
|
|
356
|
-
console.log(`
|
|
357
|
-
🚂 Railway MCP Server Started
|
|
358
|
-
================================
|
|
359
|
-
Environment: ${config.environment}
|
|
360
|
-
Port: ${config.port}
|
|
361
|
-
WebSocket: ${config.enableWebSocket ? 'Enabled' : 'Disabled'}
|
|
362
|
-
Analytics: ${config.enableAnalytics ? 'Enabled' : 'Disabled'}
|
|
363
|
-
Rate Limiting: ${config.rateLimitEnabled ? 'Enabled' : 'Disabled'}
|
|
364
|
-
Auth Mode: ${config.authMode}
|
|
365
|
-
================================
|
|
366
|
-
Health: http://localhost:${config.port}/health
|
|
367
|
-
`);
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
// Start server
|
|
372
|
-
const server = new RailwayMCPServer();
|
|
373
|
-
server.start();
|
|
374
|
-
// Graceful shutdown
|
|
375
|
-
process.on('SIGTERM', () => {
|
|
376
|
-
console.log('Shutting down gracefully...');
|
|
377
|
-
process.exit(0);
|
|
378
|
-
});
|
|
379
|
-
process.on('SIGINT', () => {
|
|
380
|
-
console.log('Shutting down...');
|
|
381
|
-
process.exit(0);
|
|
382
|
-
});
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebRTC P2P Sync Implementation for Beads/StackMemory
|
|
3
|
-
*
|
|
4
|
-
* Features:
|
|
5
|
-
* - Direct peer-to-peer sync (zero server bandwidth)
|
|
6
|
-
* - CRDT-based conflict resolution
|
|
7
|
-
* - End-to-end encryption
|
|
8
|
-
* - Automatic reconnection
|
|
9
|
-
* - Offline queue
|
|
10
|
-
*/
|
|
11
|
-
import nacl from 'tweetnacl';
|
|
12
|
-
export declare class P2PSync {
|
|
13
|
-
private peers;
|
|
14
|
-
private db;
|
|
15
|
-
private socket;
|
|
16
|
-
private userId;
|
|
17
|
-
private teamId;
|
|
18
|
-
private syncQueue;
|
|
19
|
-
private keypair;
|
|
20
|
-
constructor(config: P2PConfig);
|
|
21
|
-
private initDB;
|
|
22
|
-
private connectSignaling;
|
|
23
|
-
private connectToPeer;
|
|
24
|
-
private handleSignal;
|
|
25
|
-
private onPeerConnected;
|
|
26
|
-
private handlePeerData;
|
|
27
|
-
private getVectorClock;
|
|
28
|
-
incrementClock(): VectorClock;
|
|
29
|
-
private getOwnClock;
|
|
30
|
-
private mergeVectorClock;
|
|
31
|
-
createFrame(frame: Frame): void;
|
|
32
|
-
updateFrame(frameId: string, updates: Partial<Frame>): void;
|
|
33
|
-
deleteFrame(frameId: string): void;
|
|
34
|
-
getFrame(frameId: string): Frame | null;
|
|
35
|
-
private handleFrameUpdate;
|
|
36
|
-
private isNewer;
|
|
37
|
-
private logOperation;
|
|
38
|
-
private getUnsyncedChanges;
|
|
39
|
-
private batchChanges;
|
|
40
|
-
private applyChanges;
|
|
41
|
-
private sendRequestedFrames;
|
|
42
|
-
private sendToPeer;
|
|
43
|
-
private broadcast;
|
|
44
|
-
private reconnectToPeer;
|
|
45
|
-
private removePeer;
|
|
46
|
-
private encrypt;
|
|
47
|
-
private decrypt;
|
|
48
|
-
discoverPeers(): Promise<PeerInfo[]>;
|
|
49
|
-
private setupPeerHandlers;
|
|
50
|
-
sync(): Promise<SyncStats>;
|
|
51
|
-
disconnect(): void;
|
|
52
|
-
}
|
|
53
|
-
interface P2PConfig {
|
|
54
|
-
userId: string;
|
|
55
|
-
teamId: string;
|
|
56
|
-
signalingServer: string;
|
|
57
|
-
dbPath?: string;
|
|
58
|
-
keypair?: nacl.BoxKeyPair;
|
|
59
|
-
}
|
|
60
|
-
interface PeerInfo {
|
|
61
|
-
userId: string;
|
|
62
|
-
publicKey: string;
|
|
63
|
-
lastSeen: number;
|
|
64
|
-
}
|
|
65
|
-
interface Frame {
|
|
66
|
-
id?: string;
|
|
67
|
-
type: string;
|
|
68
|
-
content: any;
|
|
69
|
-
metadata?: any;
|
|
70
|
-
}
|
|
71
|
-
interface VectorClock {
|
|
72
|
-
[peerId: string]: number;
|
|
73
|
-
}
|
|
74
|
-
interface SyncStats {
|
|
75
|
-
connectedPeers: number;
|
|
76
|
-
totalPeers: number;
|
|
77
|
-
unsyncedChanges: number;
|
|
78
|
-
lastSync: number;
|
|
79
|
-
}
|
|
80
|
-
export {};
|
|
81
|
-
//# sourceMappingURL=p2p-sync.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"p2p-sync.d.ts","sourceRoot":"","sources":["../../../p2p-sync/src/p2p-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAkB;gBAErB,MAAM,EAAE,SAAS;IAc7B,OAAO,CAAC,MAAM;IAmCd,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,aAAa;IA0CrB,OAAO,CAAC,YAAY;YAoBN,eAAe;IAkB7B,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,cAAc;IASf,cAAc,IAAI,WAAW;IAQpC,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,gBAAgB;IAkBjB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAwB/B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAyB3D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsBlC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAY9C,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,OAAO;IAuBf,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAE,YAAY;IAMrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,OAAO;IASF,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IASjD,OAAO,CAAC,iBAAiB;IAcZ,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC;IAiBhC,UAAU;CAMlB;AAMD,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;CAC3B;AAED,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,UAAU,KAAK;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AASD,UAAU,WAAW;IACnB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAmBD,UAAU,SAAS;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|