@jagilber-org/index-server 1.22.0 → 1.26.1

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 (189) hide show
  1. package/CHANGELOG.md +87 -2
  2. package/CODE_OF_CONDUCT.md +2 -0
  3. package/CONTRIBUTING.md +32 -2
  4. package/README.md +83 -20
  5. package/SECURITY.md +17 -5
  6. package/dist/config/dashboardConfig.d.ts +3 -0
  7. package/dist/config/dashboardConfig.js +3 -0
  8. package/dist/config/defaultValues.d.ts +1 -1
  9. package/dist/config/defaultValues.js +1 -1
  10. package/dist/config/featureConfig.d.ts +2 -0
  11. package/dist/config/featureConfig.js +6 -1
  12. package/dist/config/runtimeConfig.d.ts +1 -1
  13. package/dist/config/runtimeConfig.js +8 -9
  14. package/dist/dashboard/client/admin.html +173 -54
  15. package/dist/dashboard/client/css/admin.css +151 -0
  16. package/dist/dashboard/client/js/admin.auth.js +25 -11
  17. package/dist/dashboard/client/js/admin.config.js +1 -1
  18. package/dist/dashboard/client/js/admin.feedback.js +328 -0
  19. package/dist/dashboard/client/js/admin.graph.js +120 -18
  20. package/dist/dashboard/client/js/admin.instructions.js +27 -13
  21. package/dist/dashboard/client/js/admin.logs.js +1 -5
  22. package/dist/dashboard/client/js/admin.maintenance.js +53 -8
  23. package/dist/dashboard/client/js/admin.messaging.js +1 -4
  24. package/dist/dashboard/client/js/admin.overview.js +5 -1
  25. package/dist/dashboard/client/js/admin.sessions.js +1 -1
  26. package/dist/dashboard/client/js/admin.utils.js +43 -1
  27. package/dist/dashboard/client/js/mermaid.min.js +813 -537
  28. package/dist/dashboard/export/DataExporter.js +2 -1
  29. package/dist/dashboard/server/AdminPanel.d.ts +3 -0
  30. package/dist/dashboard/server/AdminPanel.js +132 -35
  31. package/dist/dashboard/server/ApiRoutes.js +40 -9
  32. package/dist/dashboard/server/DashboardServer.js +1 -1
  33. package/dist/dashboard/server/FileMetricsStorage.d.ts +19 -0
  34. package/dist/dashboard/server/FileMetricsStorage.js +52 -5
  35. package/dist/dashboard/server/HttpTransport.js +6 -0
  36. package/dist/dashboard/server/InstanceManager.js +7 -2
  37. package/dist/dashboard/server/KnowledgeStore.js +7 -2
  38. package/dist/dashboard/server/MetricsCollector.d.ts +16 -0
  39. package/dist/dashboard/server/MetricsCollector.js +113 -17
  40. package/dist/dashboard/server/legacyDashboardHtml.js +7 -2
  41. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +1 -1
  42. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +8 -3
  43. package/dist/dashboard/server/routes/admin.feedback.routes.d.ts +15 -0
  44. package/dist/dashboard/server/routes/admin.feedback.routes.js +188 -0
  45. package/dist/dashboard/server/routes/admin.routes.js +35 -27
  46. package/dist/dashboard/server/routes/alerts.routes.js +4 -3
  47. package/dist/dashboard/server/routes/api.feedback.routes.js +2 -1
  48. package/dist/dashboard/server/routes/api.usage.routes.js +8 -7
  49. package/dist/dashboard/server/routes/embeddings.routes.d.ts +2 -1
  50. package/dist/dashboard/server/routes/embeddings.routes.js +18 -9
  51. package/dist/dashboard/server/routes/graph.routes.js +10 -13
  52. package/dist/dashboard/server/routes/index.d.ts +1 -0
  53. package/dist/dashboard/server/routes/index.js +74 -39
  54. package/dist/dashboard/server/routes/instances.routes.js +2 -1
  55. package/dist/dashboard/server/routes/instructions.routes.js +46 -27
  56. package/dist/dashboard/server/routes/knowledge.routes.js +4 -3
  57. package/dist/dashboard/server/routes/logs.routes.js +5 -4
  58. package/dist/dashboard/server/routes/messaging.routes.js +15 -14
  59. package/dist/dashboard/server/routes/metrics.routes.js +14 -13
  60. package/dist/dashboard/server/routes/scripts.routes.js +6 -3
  61. package/dist/dashboard/server/routes/status.routes.js +25 -6
  62. package/dist/dashboard/server/routes/synthetic.routes.js +3 -2
  63. package/dist/dashboard/server/routes/usage.routes.js +2 -1
  64. package/dist/dashboard/server/utils/escapeHtml.d.ts +1 -0
  65. package/dist/dashboard/server/utils/escapeHtml.js +11 -0
  66. package/dist/dashboard/server/utils/pathContainment.d.ts +1 -0
  67. package/dist/dashboard/server/utils/pathContainment.js +15 -0
  68. package/dist/dashboard/server/wsInit.js +2 -2
  69. package/dist/lib/mcpStdioLogging.d.ts +165 -0
  70. package/dist/lib/mcpStdioLogging.js +287 -0
  71. package/dist/schemas/index.d.ts +37 -2
  72. package/dist/schemas/index.js +27 -3
  73. package/dist/server/backgroundServicesStartup.d.ts +7 -1
  74. package/dist/server/backgroundServicesStartup.js +25 -8
  75. package/dist/server/certInit.d.ts +97 -0
  76. package/dist/server/certInit.js +359 -0
  77. package/dist/server/certInit.types.d.ts +92 -0
  78. package/dist/server/certInit.types.js +34 -0
  79. package/dist/server/handshake/fallbackFrames.d.ts +31 -0
  80. package/dist/server/handshake/fallbackFrames.js +38 -0
  81. package/dist/server/handshake/initializeDetector.d.ts +31 -0
  82. package/dist/server/handshake/initializeDetector.js +88 -0
  83. package/dist/server/handshake/protocol.d.ts +15 -0
  84. package/dist/server/handshake/protocol.js +37 -0
  85. package/dist/server/handshake/readyEmitter.d.ts +6 -0
  86. package/dist/server/handshake/readyEmitter.js +88 -0
  87. package/dist/server/handshake/safetyFallbacks.d.ts +1 -0
  88. package/dist/server/handshake/safetyFallbacks.js +134 -0
  89. package/dist/server/handshake/stdinSniffer.d.ts +1 -0
  90. package/dist/server/handshake/stdinSniffer.js +260 -0
  91. package/dist/server/handshake/tracing.d.ts +16 -0
  92. package/dist/server/handshake/tracing.js +95 -0
  93. package/dist/server/handshakeManager.d.ts +23 -23
  94. package/dist/server/handshakeManager.js +36 -466
  95. package/dist/server/index-server.d.ts +23 -0
  96. package/dist/server/index-server.js +194 -9
  97. package/dist/server/mcpReadOnlySurfaces.d.ts +44 -0
  98. package/dist/server/mcpReadOnlySurfaces.js +297 -0
  99. package/dist/server/sdkServer.js +69 -7
  100. package/dist/server/transport.d.ts +5 -6
  101. package/dist/server/transport.js +46 -64
  102. package/dist/server/transportFactory.d.ts +3 -9
  103. package/dist/server/transportFactory.js +18 -380
  104. package/dist/services/atomicFs.d.ts +3 -0
  105. package/dist/services/atomicFs.js +171 -13
  106. package/dist/services/auditLog.d.ts +17 -2
  107. package/dist/services/auditLog.js +75 -14
  108. package/dist/services/bootstrapGating.js +1 -1
  109. package/dist/services/categoryRules.d.ts +10 -0
  110. package/dist/services/categoryRules.js +17 -0
  111. package/dist/services/classificationService.js +7 -5
  112. package/dist/services/embeddingService.d.ts +27 -11
  113. package/dist/services/embeddingService.js +51 -14
  114. package/dist/services/feedbackStorage.d.ts +39 -0
  115. package/dist/services/feedbackStorage.js +88 -0
  116. package/dist/services/handlers/instructions.add.js +429 -317
  117. package/dist/services/handlers/instructions.groom.js +128 -31
  118. package/dist/services/handlers/instructions.import.js +56 -23
  119. package/dist/services/handlers/instructions.patch.js +43 -32
  120. package/dist/services/handlers/instructions.query.js +20 -29
  121. package/dist/services/handlers/instructions.shared.d.ts +54 -0
  122. package/dist/services/handlers/instructions.shared.js +126 -1
  123. package/dist/services/handlers.activation.js +83 -81
  124. package/dist/services/handlers.dashboardConfig.d.ts +2 -2
  125. package/dist/services/handlers.dashboardConfig.js +1 -2
  126. package/dist/services/handlers.diagnostics.js +75 -54
  127. package/dist/services/handlers.feedback.d.ts +4 -11
  128. package/dist/services/handlers.feedback.js +11 -333
  129. package/dist/services/handlers.gates.js +69 -37
  130. package/dist/services/handlers.graph.js +2 -2
  131. package/dist/services/handlers.help.js +2 -2
  132. package/dist/services/handlers.instructionSchema.js +4 -2
  133. package/dist/services/handlers.integrity.js +42 -22
  134. package/dist/services/handlers.messaging.js +1 -1
  135. package/dist/services/handlers.metrics.js +51 -6
  136. package/dist/services/handlers.prompt.js +10 -2
  137. package/dist/services/handlers.search.js +94 -44
  138. package/dist/services/handlers.trace.js +1 -1
  139. package/dist/services/handlers.usage.js +38 -7
  140. package/dist/services/indexContext.d.ts +21 -1
  141. package/dist/services/indexContext.js +267 -82
  142. package/dist/services/indexLoader.d.ts +1 -0
  143. package/dist/services/indexLoader.js +28 -8
  144. package/dist/services/instructionRecordValidation.d.ts +39 -0
  145. package/dist/services/instructionRecordValidation.js +388 -0
  146. package/dist/services/instructions.dispatcher.js +4 -4
  147. package/dist/services/loaderSchemaValidator.d.ts +15 -0
  148. package/dist/services/loaderSchemaValidator.js +69 -0
  149. package/dist/services/logger.js +11 -2
  150. package/dist/services/mcpLogBridge.d.ts +49 -0
  151. package/dist/services/mcpLogBridge.js +83 -0
  152. package/dist/services/ownershipService.js +18 -8
  153. package/dist/services/performanceBaseline.js +23 -22
  154. package/dist/services/promptReviewService.d.ts +3 -1
  155. package/dist/services/promptReviewService.js +41 -13
  156. package/dist/services/regexSafety.d.ts +6 -0
  157. package/dist/services/regexSafety.js +46 -0
  158. package/dist/services/seedBootstrap.js +4 -4
  159. package/dist/services/storage/factory.d.ts +14 -1
  160. package/dist/services/storage/factory.js +61 -1
  161. package/dist/services/storage/jsonEmbeddingStore.d.ts +15 -0
  162. package/dist/services/storage/jsonEmbeddingStore.js +83 -0
  163. package/dist/services/storage/jsonFileStore.d.ts +3 -1
  164. package/dist/services/storage/jsonFileStore.js +8 -6
  165. package/dist/services/storage/migrationEngine.d.ts +13 -0
  166. package/dist/services/storage/migrationEngine.js +31 -0
  167. package/dist/services/storage/sqliteEmbeddingStore.d.ts +30 -0
  168. package/dist/services/storage/sqliteEmbeddingStore.js +222 -0
  169. package/dist/services/storage/sqliteStore.d.ts +3 -1
  170. package/dist/services/storage/sqliteStore.js +2 -2
  171. package/dist/services/storage/types.d.ts +48 -1
  172. package/dist/services/toolRegistry.js +77 -67
  173. package/dist/services/toolRegistry.zod.js +89 -86
  174. package/dist/services/tracing.js +5 -4
  175. package/dist/utils/envUtils.d.ts +4 -0
  176. package/dist/utils/envUtils.js +7 -0
  177. package/dist/utils/memoryMonitor.js +11 -10
  178. package/package.json +11 -4
  179. package/schemas/instruction.schema.json +38 -1
  180. package/scripts/copy-dashboard-assets.mjs +1 -1
  181. package/scripts/dist/README.md +1 -1
  182. package/scripts/setup-wizard.mjs +781 -0
  183. package/server.json +1 -0
  184. package/dist/externalClientLib.d.ts +0 -1
  185. package/dist/externalClientLib.js +0 -2
  186. package/dist/portableClientWrapper.d.ts +0 -1
  187. package/dist/portableClientWrapper.js +0 -2
  188. package/dist/services/indexingService.d.ts +0 -1
  189. 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
- console.error('[API] Tools error:', error);
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
- console.error('[API] Metrics error:', error);
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
- console.error('[API] Metrics history error:', error);
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
- console.error('[API] Tool metrics error:', error);
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
- console.error('[API] Performance error:', error);
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
- console.error('[API] Realtime metrics error:', error);
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
- console.error('[API] Streaming data error:', error);
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
- console.error('[API] Tool usage chart error:', error);
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
- console.error('[API] Performance chart error:', error);
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
- console.error('[API] Time range chart error:', error);
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
- console.error('[API] Chart export error:', error);
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
- console.error('[API] Performance detailed error:', err);
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
- console.error('[API] Advanced analytics error:', error);
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
- // Verify resolved path is within scripts directory (defense in depth)
62
- const resolved = path_1.default.resolve(filePath); // nosemgrep: javascript.express.security.audit.express-path-join-resolve-traversal.express-path-join-resolve-traversal -- resolved path checked against scriptsDir on next line
63
- if (!resolved.startsWith(path_1.default.resolve(scriptsDir))) {
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,12 +13,15 @@ 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 {
19
20
  const head = path_1.default.join(process.cwd(), '.git', 'HEAD');
20
- if (!fs_1.default.existsSync(head))
21
- return null;
21
+ if (!fs_1.default.existsSync(head)) {
22
+ // Fallback: read from deployment-manifest.json (local deploy without .git)
23
+ return getDeployManifestField('gitCommit');
24
+ }
22
25
  let ref = fs_1.default.readFileSync(head, 'utf8').trim();
23
26
  if (ref.startsWith('ref:')) {
24
27
  const refPath = path_1.default.join(process.cwd(), '.git', ref.split(' ')[1]);
@@ -40,6 +43,22 @@ function getBuildTime() {
40
43
  const stat = fs_1.default.statSync(candidate);
41
44
  return new Date(stat.mtimeMs).toISOString();
42
45
  }
46
+ // Fallback: read from deployment-manifest.json (local deploy)
47
+ return getDeployManifestField('deployedAt');
48
+ }
49
+ catch { /* ignore */ }
50
+ return null;
51
+ }
52
+ /** Read a top-level field from deployment-manifest.json (written by deploy-local.ps1) */
53
+ function getDeployManifestField(field) {
54
+ try {
55
+ const manifestPath = path_1.default.join(process.cwd(), 'deployment-manifest.json');
56
+ if (fs_1.default.existsSync(manifestPath)) {
57
+ const manifest = JSON.parse(fs_1.default.readFileSync(manifestPath, 'utf8'));
58
+ const value = manifest?.[field];
59
+ if (typeof value === 'string' && value && !value.startsWith('<'))
60
+ return value.substring(0, 64);
61
+ }
43
62
  }
44
63
  catch { /* ignore */ }
45
64
  return null;
@@ -69,7 +88,7 @@ function createStatusRoutes(metricsCollector) {
69
88
  });
70
89
  }
71
90
  catch (error) {
72
- console.error('[API] Status error:', error);
91
+ (0, logger_js_1.logError)('[API] Status error:', error);
73
92
  res.status(500).json({
74
93
  error: 'Failed to get server status',
75
94
  });
@@ -124,7 +143,7 @@ function createStatusRoutes(metricsCollector) {
124
143
  });
125
144
  }
126
145
  catch (error) {
127
- console.error('[API] Health check error:', error);
146
+ (0, logger_js_1.logError)('[API] Health check error:', error);
128
147
  res.status(500).json({
129
148
  status: 'error',
130
149
  error: 'Health check failed',
@@ -145,7 +164,7 @@ function createStatusRoutes(metricsCollector) {
145
164
  });
146
165
  }
147
166
  catch (error) {
148
- console.error('[API] System health error:', error);
167
+ (0, logger_js_1.logError)('[API] System health error:', error);
149
168
  res.status(500).json({
150
169
  error: 'Failed to get system health',
151
170
  });
@@ -168,7 +187,7 @@ function createStatusRoutes(metricsCollector) {
168
187
  });
169
188
  }
170
189
  catch (error) {
171
- console.error('[API] System resources error:', error);
190
+ (0, logger_js_1.logError)('[API] System resources error:', error);
172
191
  res.status(500).json({
173
192
  success: false,
174
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.getLocalHandler)(method);
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
- console.error('[API] Synthetic activity error:', error);
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
- console.error('[API] Failed to load usage snapshot:', error);
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, '&amp;')
7
+ .replace(/</g, '&lt;')
8
+ .replace(/>/g, '&gt;')
9
+ .replace(/"/g, '&quot;')
10
+ .replace(/'/g, '&#39;');
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
- // eslint-disable-next-line no-console
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
+ }