@jagilber-org/index-server 1.22.1 → 1.26.4
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/CHANGELOG.md +91 -2
- package/CODE_OF_CONDUCT.md +2 -0
- package/CONTRIBUTING.md +32 -2
- package/README.md +82 -19
- package/SECURITY.md +17 -5
- package/dist/config/dashboardConfig.d.ts +3 -0
- package/dist/config/dashboardConfig.js +3 -0
- package/dist/config/defaultValues.d.ts +1 -1
- package/dist/config/defaultValues.js +1 -1
- package/dist/config/featureConfig.d.ts +2 -0
- package/dist/config/featureConfig.js +6 -1
- package/dist/config/runtimeConfig.d.ts +1 -1
- package/dist/config/runtimeConfig.js +8 -9
- package/dist/dashboard/client/admin.html +170 -53
- package/dist/dashboard/client/css/admin.css +132 -0
- package/dist/dashboard/client/js/admin.auth.js +25 -11
- package/dist/dashboard/client/js/admin.config.js +1 -1
- package/dist/dashboard/client/js/admin.feedback.js +328 -0
- package/dist/dashboard/client/js/admin.graph.js +120 -18
- package/dist/dashboard/client/js/admin.instructions.js +27 -13
- package/dist/dashboard/client/js/admin.logs.js +1 -5
- package/dist/dashboard/client/js/admin.maintenance.js +53 -8
- package/dist/dashboard/client/js/admin.messaging.js +1 -4
- package/dist/dashboard/client/js/admin.overview.js +5 -1
- package/dist/dashboard/client/js/admin.sessions.js +1 -1
- package/dist/dashboard/client/js/admin.utils.js +43 -1
- package/dist/dashboard/client/js/mermaid.min.js +813 -537
- package/dist/dashboard/export/DataExporter.js +2 -1
- package/dist/dashboard/server/AdminPanel.d.ts +3 -0
- package/dist/dashboard/server/AdminPanel.js +132 -35
- package/dist/dashboard/server/ApiRoutes.js +40 -9
- package/dist/dashboard/server/DashboardServer.js +1 -1
- package/dist/dashboard/server/FileMetricsStorage.d.ts +19 -0
- package/dist/dashboard/server/FileMetricsStorage.js +52 -5
- package/dist/dashboard/server/HttpTransport.js +6 -0
- package/dist/dashboard/server/InstanceManager.js +7 -2
- package/dist/dashboard/server/KnowledgeStore.js +7 -2
- package/dist/dashboard/server/MetricsCollector.d.ts +16 -0
- package/dist/dashboard/server/MetricsCollector.js +113 -17
- package/dist/dashboard/server/legacyDashboardHtml.js +7 -2
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +1 -1
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +8 -3
- package/dist/dashboard/server/routes/admin.feedback.routes.d.ts +15 -0
- package/dist/dashboard/server/routes/admin.feedback.routes.js +188 -0
- package/dist/dashboard/server/routes/admin.routes.js +35 -27
- package/dist/dashboard/server/routes/alerts.routes.js +4 -3
- package/dist/dashboard/server/routes/api.feedback.routes.js +2 -1
- package/dist/dashboard/server/routes/api.usage.routes.js +8 -7
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +2 -1
- package/dist/dashboard/server/routes/embeddings.routes.js +18 -9
- package/dist/dashboard/server/routes/graph.routes.js +10 -13
- package/dist/dashboard/server/routes/index.d.ts +1 -0
- package/dist/dashboard/server/routes/index.js +74 -39
- package/dist/dashboard/server/routes/instances.routes.js +2 -1
- package/dist/dashboard/server/routes/instructions.routes.js +46 -27
- package/dist/dashboard/server/routes/knowledge.routes.js +4 -3
- package/dist/dashboard/server/routes/logs.routes.js +5 -4
- package/dist/dashboard/server/routes/messaging.routes.js +15 -14
- package/dist/dashboard/server/routes/metrics.routes.js +14 -13
- package/dist/dashboard/server/routes/scripts.routes.js +6 -3
- package/dist/dashboard/server/routes/status.routes.js +5 -4
- package/dist/dashboard/server/routes/synthetic.routes.js +3 -2
- package/dist/dashboard/server/routes/usage.routes.js +2 -1
- package/dist/dashboard/server/utils/escapeHtml.d.ts +1 -0
- package/dist/dashboard/server/utils/escapeHtml.js +11 -0
- package/dist/dashboard/server/utils/pathContainment.d.ts +1 -0
- package/dist/dashboard/server/utils/pathContainment.js +15 -0
- package/dist/dashboard/server/wsInit.js +2 -2
- package/dist/lib/mcpStdioLogging.d.ts +165 -0
- package/dist/lib/mcpStdioLogging.js +287 -0
- package/dist/schemas/index.d.ts +37 -2
- package/dist/schemas/index.js +27 -3
- package/dist/server/backgroundServicesStartup.d.ts +7 -1
- package/dist/server/backgroundServicesStartup.js +25 -8
- package/dist/server/certInit.d.ts +97 -0
- package/dist/server/certInit.js +359 -0
- package/dist/server/certInit.types.d.ts +92 -0
- package/dist/server/certInit.types.js +34 -0
- package/dist/server/handshake/fallbackFrames.d.ts +31 -0
- package/dist/server/handshake/fallbackFrames.js +38 -0
- package/dist/server/handshake/initializeDetector.d.ts +31 -0
- package/dist/server/handshake/initializeDetector.js +88 -0
- package/dist/server/handshake/protocol.d.ts +15 -0
- package/dist/server/handshake/protocol.js +37 -0
- package/dist/server/handshake/readyEmitter.d.ts +6 -0
- package/dist/server/handshake/readyEmitter.js +88 -0
- package/dist/server/handshake/safetyFallbacks.d.ts +1 -0
- package/dist/server/handshake/safetyFallbacks.js +134 -0
- package/dist/server/handshake/stdinSniffer.d.ts +1 -0
- package/dist/server/handshake/stdinSniffer.js +260 -0
- package/dist/server/handshake/tracing.d.ts +16 -0
- package/dist/server/handshake/tracing.js +95 -0
- package/dist/server/handshakeManager.d.ts +23 -23
- package/dist/server/handshakeManager.js +36 -466
- package/dist/server/index-server.d.ts +23 -0
- package/dist/server/index-server.js +194 -9
- package/dist/server/mcpReadOnlySurfaces.d.ts +44 -0
- package/dist/server/mcpReadOnlySurfaces.js +297 -0
- package/dist/server/sdkServer.js +69 -7
- package/dist/server/transport.d.ts +5 -6
- package/dist/server/transport.js +46 -64
- package/dist/server/transportFactory.d.ts +3 -9
- package/dist/server/transportFactory.js +18 -380
- package/dist/services/atomicFs.d.ts +3 -0
- package/dist/services/atomicFs.js +171 -13
- package/dist/services/auditLog.d.ts +17 -2
- package/dist/services/auditLog.js +75 -14
- package/dist/services/bootstrapGating.js +1 -1
- package/dist/services/categoryRules.d.ts +10 -0
- package/dist/services/categoryRules.js +17 -0
- package/dist/services/classificationService.js +7 -5
- package/dist/services/embeddingService.d.ts +27 -11
- package/dist/services/embeddingService.js +51 -14
- package/dist/services/feedbackStorage.d.ts +39 -0
- package/dist/services/feedbackStorage.js +88 -0
- package/dist/services/handlers/instructions.add.js +429 -317
- package/dist/services/handlers/instructions.groom.js +128 -31
- package/dist/services/handlers/instructions.import.js +56 -23
- package/dist/services/handlers/instructions.patch.js +43 -32
- package/dist/services/handlers/instructions.query.js +20 -29
- package/dist/services/handlers/instructions.shared.d.ts +54 -0
- package/dist/services/handlers/instructions.shared.js +126 -1
- package/dist/services/handlers.activation.js +83 -81
- package/dist/services/handlers.dashboardConfig.d.ts +2 -2
- package/dist/services/handlers.dashboardConfig.js +1 -2
- package/dist/services/handlers.diagnostics.js +75 -54
- package/dist/services/handlers.feedback.d.ts +4 -11
- package/dist/services/handlers.feedback.js +11 -333
- package/dist/services/handlers.gates.js +69 -37
- package/dist/services/handlers.graph.js +2 -2
- package/dist/services/handlers.help.js +2 -2
- package/dist/services/handlers.instructionSchema.js +4 -2
- package/dist/services/handlers.integrity.js +42 -22
- package/dist/services/handlers.messaging.js +1 -1
- package/dist/services/handlers.metrics.js +51 -6
- package/dist/services/handlers.prompt.js +10 -2
- package/dist/services/handlers.search.js +94 -44
- package/dist/services/handlers.trace.js +1 -1
- package/dist/services/handlers.usage.js +38 -7
- package/dist/services/indexContext.d.ts +21 -1
- package/dist/services/indexContext.js +263 -78
- package/dist/services/indexLoader.d.ts +1 -0
- package/dist/services/indexLoader.js +28 -8
- package/dist/services/instructionRecordValidation.d.ts +39 -0
- package/dist/services/instructionRecordValidation.js +388 -0
- package/dist/services/instructions.dispatcher.js +4 -4
- package/dist/services/loaderSchemaValidator.d.ts +15 -0
- package/dist/services/loaderSchemaValidator.js +69 -0
- package/dist/services/logger.js +11 -2
- package/dist/services/mcpLogBridge.d.ts +49 -0
- package/dist/services/mcpLogBridge.js +83 -0
- package/dist/services/ownershipService.js +18 -8
- package/dist/services/performanceBaseline.js +23 -22
- package/dist/services/promptReviewService.d.ts +3 -1
- package/dist/services/promptReviewService.js +41 -13
- package/dist/services/regexSafety.d.ts +6 -0
- package/dist/services/regexSafety.js +46 -0
- package/dist/services/seedBootstrap.js +1 -1
- package/dist/services/storage/factory.d.ts +14 -1
- package/dist/services/storage/factory.js +61 -1
- package/dist/services/storage/jsonEmbeddingStore.d.ts +15 -0
- package/dist/services/storage/jsonEmbeddingStore.js +83 -0
- package/dist/services/storage/jsonFileStore.d.ts +3 -1
- package/dist/services/storage/jsonFileStore.js +8 -6
- package/dist/services/storage/migrationEngine.d.ts +13 -0
- package/dist/services/storage/migrationEngine.js +31 -0
- package/dist/services/storage/sqliteEmbeddingStore.d.ts +30 -0
- package/dist/services/storage/sqliteEmbeddingStore.js +222 -0
- package/dist/services/storage/sqliteStore.d.ts +3 -1
- package/dist/services/storage/sqliteStore.js +2 -2
- package/dist/services/storage/types.d.ts +48 -1
- package/dist/services/toolRegistry.js +77 -67
- package/dist/services/toolRegistry.zod.js +89 -86
- package/dist/services/tracing.js +5 -4
- package/dist/utils/envUtils.d.ts +4 -0
- package/dist/utils/envUtils.js +7 -0
- package/dist/utils/memoryMonitor.js +11 -10
- package/package.json +12 -4
- package/schemas/instruction.schema.json +38 -1
- package/scripts/copy-dashboard-assets.mjs +1 -1
- package/scripts/dist/README.md +1 -1
- package/scripts/generate-certs.mjs +201 -0
- package/scripts/setup-wizard.mjs +781 -0
- package/server.json +20 -0
- package/dist/externalClientLib.d.ts +0 -1
- package/dist/externalClientLib.js +0 -2
- package/dist/portableClientWrapper.d.ts +0 -1
- package/dist/portableClientWrapper.js +0 -2
- package/dist/services/indexingService.d.ts +0 -1
- package/dist/services/indexingService.js +0 -2
|
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.createMetricsRoutes = createMetricsRoutes;
|
|
11
11
|
const express_1 = require("express");
|
|
12
12
|
const registry_js_1 = require("../../../server/registry.js");
|
|
13
|
+
const logger_js_1 = require("../../../services/logger.js");
|
|
13
14
|
function createMetricsRoutes(metricsCollector) {
|
|
14
15
|
const router = (0, express_1.Router)();
|
|
15
16
|
/**
|
|
@@ -36,7 +37,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
36
37
|
});
|
|
37
38
|
}
|
|
38
39
|
catch (error) {
|
|
39
|
-
|
|
40
|
+
(0, logger_js_1.logError)('[API] Tools error:', error);
|
|
40
41
|
res.status(500).json({
|
|
41
42
|
error: 'Failed to get tools list',
|
|
42
43
|
});
|
|
@@ -51,7 +52,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
51
52
|
res.json(snapshot);
|
|
52
53
|
}
|
|
53
54
|
catch (error) {
|
|
54
|
-
|
|
55
|
+
(0, logger_js_1.logError)('[API] Metrics error:', error);
|
|
55
56
|
res.status(500).json({
|
|
56
57
|
error: 'Failed to get metrics',
|
|
57
58
|
});
|
|
@@ -71,7 +72,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
catch (error) {
|
|
74
|
-
|
|
75
|
+
(0, logger_js_1.logError)('[API] Metrics history error:', error);
|
|
75
76
|
res.status(500).json({
|
|
76
77
|
error: 'Failed to get metrics history',
|
|
77
78
|
});
|
|
@@ -97,7 +98,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
97
98
|
});
|
|
98
99
|
}
|
|
99
100
|
catch (error) {
|
|
100
|
-
|
|
101
|
+
(0, logger_js_1.logError)('[API] Tool metrics error:', error);
|
|
101
102
|
res.status(500).json({
|
|
102
103
|
error: 'Failed to get tool metrics',
|
|
103
104
|
});
|
|
@@ -121,7 +122,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
121
122
|
});
|
|
122
123
|
}
|
|
123
124
|
catch (error) {
|
|
124
|
-
|
|
125
|
+
(0, logger_js_1.logError)('[API] Performance error:', error);
|
|
125
126
|
res.status(500).json({
|
|
126
127
|
error: 'Failed to get performance metrics',
|
|
127
128
|
});
|
|
@@ -140,7 +141,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
140
141
|
});
|
|
141
142
|
}
|
|
142
143
|
catch (error) {
|
|
143
|
-
|
|
144
|
+
(0, logger_js_1.logError)('[API] Realtime metrics error:', error);
|
|
144
145
|
res.status(500).json({
|
|
145
146
|
error: 'Failed to get realtime metrics',
|
|
146
147
|
});
|
|
@@ -159,7 +160,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
159
160
|
});
|
|
160
161
|
}
|
|
161
162
|
catch (error) {
|
|
162
|
-
|
|
163
|
+
(0, logger_js_1.logError)('[API] Streaming data error:', error);
|
|
163
164
|
res.status(500).json({
|
|
164
165
|
error: 'Failed to get streaming data',
|
|
165
166
|
});
|
|
@@ -181,7 +182,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
181
182
|
});
|
|
182
183
|
}
|
|
183
184
|
catch (error) {
|
|
184
|
-
|
|
185
|
+
(0, logger_js_1.logError)('[API] Tool usage chart error:', error);
|
|
185
186
|
res.status(500).json({
|
|
186
187
|
error: 'Failed to get tool usage chart data',
|
|
187
188
|
});
|
|
@@ -203,7 +204,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
203
204
|
});
|
|
204
205
|
}
|
|
205
206
|
catch (error) {
|
|
206
|
-
|
|
207
|
+
(0, logger_js_1.logError)('[API] Performance chart error:', error);
|
|
207
208
|
res.status(500).json({
|
|
208
209
|
error: 'Failed to get performance chart data',
|
|
209
210
|
});
|
|
@@ -234,7 +235,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
234
235
|
});
|
|
235
236
|
}
|
|
236
237
|
catch (error) {
|
|
237
|
-
|
|
238
|
+
(0, logger_js_1.logError)('[API] Time range chart error:', error);
|
|
238
239
|
res.status(500).json({
|
|
239
240
|
error: 'Failed to get time range data',
|
|
240
241
|
});
|
|
@@ -274,7 +275,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
274
275
|
}
|
|
275
276
|
}
|
|
276
277
|
catch (error) {
|
|
277
|
-
|
|
278
|
+
(0, logger_js_1.logError)('[API] Chart export error:', error);
|
|
278
279
|
res.status(500).json({
|
|
279
280
|
error: 'Failed to export chart data',
|
|
280
281
|
});
|
|
@@ -307,7 +308,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
307
308
|
});
|
|
308
309
|
}
|
|
309
310
|
catch (err) {
|
|
310
|
-
|
|
311
|
+
(0, logger_js_1.logError)('[API] Performance detailed error:', err);
|
|
311
312
|
res.status(500).json({ success: false, error: 'Failed to compute performance metrics' });
|
|
312
313
|
}
|
|
313
314
|
});
|
|
@@ -325,7 +326,7 @@ function createMetricsRoutes(metricsCollector) {
|
|
|
325
326
|
});
|
|
326
327
|
}
|
|
327
328
|
catch (error) {
|
|
328
|
-
|
|
329
|
+
(0, logger_js_1.logError)('[API] Advanced analytics error:', error);
|
|
329
330
|
res.status(500).json({
|
|
330
331
|
error: 'Failed to get advanced analytics',
|
|
331
332
|
});
|
|
@@ -14,6 +14,7 @@ exports.createScriptsRoutes = createScriptsRoutes;
|
|
|
14
14
|
const express_1 = require("express");
|
|
15
15
|
const promises_1 = require("fs/promises");
|
|
16
16
|
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const pathContainment_js_1 = require("../utils/pathContainment.js");
|
|
17
18
|
/** Allowed script files with metadata */
|
|
18
19
|
const AVAILABLE_SCRIPTS = {
|
|
19
20
|
'index-server-client.ps1': {
|
|
@@ -58,9 +59,11 @@ function createScriptsRoutes() {
|
|
|
58
59
|
try {
|
|
59
60
|
const scriptsDir = path_1.default.join(process.cwd(), 'scripts');
|
|
60
61
|
const filePath = path_1.default.join(scriptsDir, meta.file); // nosemgrep: javascript.express.security.audit.express-path-join-resolve-traversal.express-path-join-resolve-traversal -- path validated below via startsWith check
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
let resolved;
|
|
63
|
+
try {
|
|
64
|
+
resolved = (0, pathContainment_js_1.validatePathContainment)(path_1.default.resolve(filePath), scriptsDir); // nosemgrep: javascript.express.security.audit.express-path-join-resolve-traversal.express-path-join-resolve-traversal -- containment validated by shared helper
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
64
67
|
res.status(400).json({ error: 'Invalid script path' });
|
|
65
68
|
return;
|
|
66
69
|
}
|
|
@@ -13,6 +13,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
13
13
|
const path_1 = __importDefault(require("path"));
|
|
14
14
|
const v8_1 = __importDefault(require("v8"));
|
|
15
15
|
const runtimeConfig_js_1 = require("../../../config/runtimeConfig.js");
|
|
16
|
+
const logger_js_1 = require("../../../services/logger.js");
|
|
16
17
|
/** Derive short git commit (best-effort; never throws) */
|
|
17
18
|
function getGitCommit() {
|
|
18
19
|
try {
|
|
@@ -87,7 +88,7 @@ function createStatusRoutes(metricsCollector) {
|
|
|
87
88
|
});
|
|
88
89
|
}
|
|
89
90
|
catch (error) {
|
|
90
|
-
|
|
91
|
+
(0, logger_js_1.logError)('[API] Status error:', error);
|
|
91
92
|
res.status(500).json({
|
|
92
93
|
error: 'Failed to get server status',
|
|
93
94
|
});
|
|
@@ -142,7 +143,7 @@ function createStatusRoutes(metricsCollector) {
|
|
|
142
143
|
});
|
|
143
144
|
}
|
|
144
145
|
catch (error) {
|
|
145
|
-
|
|
146
|
+
(0, logger_js_1.logError)('[API] Health check error:', error);
|
|
146
147
|
res.status(500).json({
|
|
147
148
|
status: 'error',
|
|
148
149
|
error: 'Health check failed',
|
|
@@ -163,7 +164,7 @@ function createStatusRoutes(metricsCollector) {
|
|
|
163
164
|
});
|
|
164
165
|
}
|
|
165
166
|
catch (error) {
|
|
166
|
-
|
|
167
|
+
(0, logger_js_1.logError)('[API] System health error:', error);
|
|
167
168
|
res.status(500).json({
|
|
168
169
|
error: 'Failed to get system health',
|
|
169
170
|
});
|
|
@@ -186,7 +187,7 @@ function createStatusRoutes(metricsCollector) {
|
|
|
186
187
|
});
|
|
187
188
|
}
|
|
188
189
|
catch (error) {
|
|
189
|
-
|
|
190
|
+
(0, logger_js_1.logError)('[API] System resources error:', error);
|
|
190
191
|
res.status(500).json({
|
|
191
192
|
success: false,
|
|
192
193
|
error: 'Failed to get system resource history',
|
|
@@ -9,6 +9,7 @@ const express_1 = require("express");
|
|
|
9
9
|
const registry_js_1 = require("../../../server/registry.js");
|
|
10
10
|
const WebSocketManager_js_1 = require("../WebSocketManager.js");
|
|
11
11
|
const adminAuth_js_1 = require("./adminAuth.js");
|
|
12
|
+
const logger_js_1 = require("../../../services/logger.js");
|
|
12
13
|
function createSyntheticRoutes(_metricsCollector) {
|
|
13
14
|
const router = (0, express_1.Router)();
|
|
14
15
|
router.use(adminAuth_js_1.dashboardAdminAuth);
|
|
@@ -72,7 +73,7 @@ function createSyntheticRoutes(_metricsCollector) {
|
|
|
72
73
|
if (!available.includes(method))
|
|
73
74
|
return;
|
|
74
75
|
const payload = picked[1];
|
|
75
|
-
const handler = (0, registry_js_1.
|
|
76
|
+
const handler = (0, registry_js_1.getHandler)(method);
|
|
76
77
|
const started = Date.now();
|
|
77
78
|
try {
|
|
78
79
|
syntheticActiveRequests++;
|
|
@@ -171,7 +172,7 @@ function createSyntheticRoutes(_metricsCollector) {
|
|
|
171
172
|
});
|
|
172
173
|
}
|
|
173
174
|
catch (error) {
|
|
174
|
-
|
|
175
|
+
(0, logger_js_1.logError)('[API] Synthetic activity error:', error);
|
|
175
176
|
res.status(500).json({
|
|
176
177
|
success: false,
|
|
177
178
|
error: 'Failed to run synthetic activity',
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.createUsageRoutes = createUsageRoutes;
|
|
8
8
|
const express_1 = require("express");
|
|
9
9
|
const indexContext_js_1 = require("../../../services/indexContext.js");
|
|
10
|
+
const logger_js_1 = require("../../../services/logger.js");
|
|
10
11
|
function createUsageRoutes() {
|
|
11
12
|
const router = (0, express_1.Router)();
|
|
12
13
|
/**
|
|
@@ -18,7 +19,7 @@ function createUsageRoutes() {
|
|
|
18
19
|
res.json({ success: true, snapshot: snap, count: Object.keys(snap).length, timestamp: Date.now() });
|
|
19
20
|
}
|
|
20
21
|
catch (error) {
|
|
21
|
-
|
|
22
|
+
(0, logger_js_1.logError)('[API] Failed to load usage snapshot:', error);
|
|
22
23
|
res.status(500).json({ success: false, error: 'Failed to load usage snapshot' });
|
|
23
24
|
}
|
|
24
25
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function escapeHtml(value: string): string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapeHtml = escapeHtml;
|
|
4
|
+
function escapeHtml(value) {
|
|
5
|
+
return value
|
|
6
|
+
.replace(/&/g, '&')
|
|
7
|
+
.replace(/</g, '<')
|
|
8
|
+
.replace(/>/g, '>')
|
|
9
|
+
.replace(/"/g, '"')
|
|
10
|
+
.replace(/'/g, ''');
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function validatePathContainment(filePath: string, allowedBase: string): string;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validatePathContainment = validatePathContainment;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
function validatePathContainment(filePath, allowedBase) {
|
|
9
|
+
const resolvedBase = node_path_1.default.resolve(allowedBase);
|
|
10
|
+
const resolvedFile = node_path_1.default.resolve(filePath);
|
|
11
|
+
if (resolvedFile === resolvedBase || resolvedFile.startsWith(resolvedBase + node_path_1.default.sep)) {
|
|
12
|
+
return resolvedFile;
|
|
13
|
+
}
|
|
14
|
+
throw new Error(`Path escapes allowed base: ${resolvedFile}`);
|
|
15
|
+
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.initWebSocket = initWebSocket;
|
|
8
8
|
exports.startMetricsBroadcast = startMetricsBroadcast;
|
|
9
|
+
const logger_js_1 = require("../../services/logger.js");
|
|
9
10
|
/** Attaches the WebSocket server to an existing HTTP/HTTPS server instance. */
|
|
10
11
|
function initWebSocket(server, wsManager) {
|
|
11
12
|
wsManager.initialize(server);
|
|
@@ -28,8 +29,7 @@ function startMetricsBroadcast(wsManager, metricsCollector, intervalMs) {
|
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
31
|
catch (e) {
|
|
31
|
-
|
|
32
|
-
console.error('[Dashboard] metrics broadcast failed', e);
|
|
32
|
+
(0, logger_js_1.logError)('[Dashboard] metrics broadcast failed', e);
|
|
33
33
|
}
|
|
34
34
|
}, safeInterval);
|
|
35
35
|
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mcpStdioLogging — Generic MCP stdio transport logging solution.
|
|
3
|
+
*
|
|
4
|
+
* Drop-in module for ANY MCP server using stdio transport that wants proper
|
|
5
|
+
* log-level display in VS Code (or any MCP client that reads stderr).
|
|
6
|
+
*
|
|
7
|
+
* ## Problem
|
|
8
|
+
*
|
|
9
|
+
* VS Code's MCP host (`extHostMcpNode.ts`) hardcodes ALL stderr output as
|
|
10
|
+
* `LogLevel.Warning` with prefix `[server stderr]`. There is no configuration,
|
|
11
|
+
* no level detection, no opt-out. Every byte on stderr becomes a warning.
|
|
12
|
+
*
|
|
13
|
+
* The MCP protocol provides `notifications/message` with a `level` field.
|
|
14
|
+
* VS Code's `translateMcpLogMessage()` correctly maps those levels to proper
|
|
15
|
+
* log output (debug, info, warning, error). Other clients (Claude Desktop,
|
|
16
|
+
* Cursor, etc.) also respect `notifications/message` levels.
|
|
17
|
+
*
|
|
18
|
+
* ## Solution
|
|
19
|
+
*
|
|
20
|
+
* 1. Intercept `process.stderr.write` at module import time (before any other
|
|
21
|
+
* module can write to stderr).
|
|
22
|
+
* 2. Buffer all pre-handshake stderr lines in memory.
|
|
23
|
+
* 3. After the MCP handshake completes, replay the buffer through
|
|
24
|
+
* `server.sendLoggingMessage()` and route all future stderr the same way.
|
|
25
|
+
* 4. Infer severity from content (NDJSON level field, keyword patterns).
|
|
26
|
+
* 5. On transport failure, deactivate and restore original stderr.
|
|
27
|
+
*
|
|
28
|
+
* ## Usage (3 steps)
|
|
29
|
+
*
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // 1. Import FIRST — before any module that writes to stderr
|
|
32
|
+
* import { McpStdioLogger } from './lib/mcpStdioLogging';
|
|
33
|
+
* const logger = new McpStdioLogger({ serverName: 'my-server' });
|
|
34
|
+
*
|
|
35
|
+
* // 2. After creating the MCP SDK server, register it
|
|
36
|
+
* const server = new Server({ name: 'my-server', version }, { capabilities: { logging: {} } });
|
|
37
|
+
* logger.registerServer(server);
|
|
38
|
+
*
|
|
39
|
+
* // 3. After the handshake completes (initialize response sent), activate
|
|
40
|
+
* logger.activate();
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* ## Requirements
|
|
44
|
+
*
|
|
45
|
+
* - Server must declare `logging: {}` in capabilities so clients know to
|
|
46
|
+
* accept `notifications/message`.
|
|
47
|
+
* - Server object must have `sendLoggingMessage({ level, logger?, data })`.
|
|
48
|
+
* - Module must be imported before `logPrefix` or any other stderr-producing module.
|
|
49
|
+
*
|
|
50
|
+
* @module mcpStdioLogging
|
|
51
|
+
*/
|
|
52
|
+
/** MCP LoggingLevel values (RFC 5424 syslog mapping used by the MCP spec). */
|
|
53
|
+
export type McpLoggingLevel = 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical' | 'alert' | 'emergency';
|
|
54
|
+
/** Minimal interface for the MCP SDK server's logging method. */
|
|
55
|
+
export interface McpLoggable {
|
|
56
|
+
sendLoggingMessage(params: {
|
|
57
|
+
level: McpLoggingLevel;
|
|
58
|
+
logger?: string;
|
|
59
|
+
data: unknown;
|
|
60
|
+
}): void;
|
|
61
|
+
}
|
|
62
|
+
/** Configuration options for McpStdioLogger. */
|
|
63
|
+
export interface McpStdioLoggerOptions {
|
|
64
|
+
/**
|
|
65
|
+
* Name shown in the `logger` field of MCP notifications/message.
|
|
66
|
+
* Typically matches the server name (e.g., 'index-server', 'my-tool').
|
|
67
|
+
* @default 'mcp-server'
|
|
68
|
+
*/
|
|
69
|
+
serverName?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Maximum number of lines to buffer before the handshake completes.
|
|
72
|
+
* Prevents unbounded memory growth if activation never happens.
|
|
73
|
+
* Oldest lines are discarded when the limit is reached.
|
|
74
|
+
* @default 500
|
|
75
|
+
*/
|
|
76
|
+
maxBufferSize?: number;
|
|
77
|
+
/**
|
|
78
|
+
* Custom level inference function. Given a raw stderr line, return the
|
|
79
|
+
* MCP logging level. If not provided, the built-in heuristic is used
|
|
80
|
+
* (checks NDJSON `"level"` field, then keyword patterns).
|
|
81
|
+
*/
|
|
82
|
+
inferLevel?: (line: string) => McpLoggingLevel;
|
|
83
|
+
/**
|
|
84
|
+
* If true, start intercepting stderr immediately on construction.
|
|
85
|
+
* If false, you must call `interceptStderr()` manually.
|
|
86
|
+
* @default true
|
|
87
|
+
*/
|
|
88
|
+
interceptImmediately?: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Infer MCP logging level from a raw stderr line.
|
|
92
|
+
*
|
|
93
|
+
* Priority:
|
|
94
|
+
* 1. NDJSON with `"level"` field → map to MCP level
|
|
95
|
+
* 2. Keyword patterns (ERROR, WARN, DEBUG, trace) → corresponding level
|
|
96
|
+
* 3. Default → 'info'
|
|
97
|
+
*/
|
|
98
|
+
export declare function defaultInferLevel(line: string): McpLoggingLevel;
|
|
99
|
+
/**
|
|
100
|
+
* Manages stderr interception, buffering, and MCP protocol log routing
|
|
101
|
+
* for any MCP server using stdio transport.
|
|
102
|
+
*
|
|
103
|
+
* Designed to be instantiated once, as early as possible in the server's
|
|
104
|
+
* entry point, before any module writes to stderr.
|
|
105
|
+
*/
|
|
106
|
+
export declare class McpStdioLogger {
|
|
107
|
+
private _server;
|
|
108
|
+
private _active;
|
|
109
|
+
private _intercepting;
|
|
110
|
+
private readonly _buffer;
|
|
111
|
+
private readonly _originalStderrWrite;
|
|
112
|
+
private readonly _serverName;
|
|
113
|
+
private readonly _maxBufferSize;
|
|
114
|
+
private readonly _inferLevel;
|
|
115
|
+
constructor(options?: McpStdioLoggerOptions);
|
|
116
|
+
/**
|
|
117
|
+
* Start intercepting process.stderr.write.
|
|
118
|
+
* Called automatically on construction unless `interceptImmediately: false`.
|
|
119
|
+
* Safe to call multiple times (idempotent).
|
|
120
|
+
*/
|
|
121
|
+
interceptStderr(): void;
|
|
122
|
+
/**
|
|
123
|
+
* Register the MCP SDK server instance.
|
|
124
|
+
* Must be called after server creation but before activation.
|
|
125
|
+
* The server must have a `sendLoggingMessage()` method.
|
|
126
|
+
*/
|
|
127
|
+
registerServer(server: McpLoggable): void;
|
|
128
|
+
/**
|
|
129
|
+
* Activate the bridge: replay buffered stderr and route all future
|
|
130
|
+
* output through `server.sendLoggingMessage()`.
|
|
131
|
+
*
|
|
132
|
+
* Call this after the MCP handshake completes (initialize response sent).
|
|
133
|
+
* No-op if server is not registered or lacks sendLoggingMessage.
|
|
134
|
+
*/
|
|
135
|
+
activate(): void;
|
|
136
|
+
/**
|
|
137
|
+
* Returns true when the bridge is active and logs route through MCP protocol.
|
|
138
|
+
*/
|
|
139
|
+
get isActive(): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Send a structured log message through the MCP protocol.
|
|
142
|
+
* Use this from your application logger instead of console.error/stderr.
|
|
143
|
+
* No-op if the bridge is not active.
|
|
144
|
+
*
|
|
145
|
+
* @param level - MCP logging level
|
|
146
|
+
* @param data - Log payload (string or object)
|
|
147
|
+
*/
|
|
148
|
+
log(level: McpLoggingLevel, data: unknown): void;
|
|
149
|
+
/**
|
|
150
|
+
* Write directly to the ORIGINAL process.stderr, bypassing the interceptor.
|
|
151
|
+
* Use this when you need stderr output visible to VS Code's Output panel
|
|
152
|
+
* without triggering the MCP routing/buffering pipeline.
|
|
153
|
+
*/
|
|
154
|
+
writeOriginalStderr(data: string): void;
|
|
155
|
+
/**
|
|
156
|
+
* Restore original stderr and deactivate the bridge.
|
|
157
|
+
* Useful for testing cleanup or graceful shutdown.
|
|
158
|
+
*/
|
|
159
|
+
restore(): void;
|
|
160
|
+
/**
|
|
161
|
+
* Get the number of currently buffered lines (pre-handshake).
|
|
162
|
+
*/
|
|
163
|
+
get bufferSize(): number;
|
|
164
|
+
private _replayBuffer;
|
|
165
|
+
}
|