@jagilber-org/index-server 1.22.0

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 (372) hide show
  1. package/CHANGELOG.md +1354 -0
  2. package/CODE_OF_CONDUCT.md +49 -0
  3. package/CONTRIBUTING.md +99 -0
  4. package/LICENSE +21 -0
  5. package/README.md +228 -0
  6. package/SECURITY.md +50 -0
  7. package/dist/config/configUtils.d.ts +11 -0
  8. package/dist/config/configUtils.js +87 -0
  9. package/dist/config/dashboardConfig.d.ts +46 -0
  10. package/dist/config/dashboardConfig.js +67 -0
  11. package/dist/config/defaultValues.d.ts +63 -0
  12. package/dist/config/defaultValues.js +72 -0
  13. package/dist/config/dirConstants.d.ts +18 -0
  14. package/dist/config/dirConstants.js +29 -0
  15. package/dist/config/featureConfig.d.ts +61 -0
  16. package/dist/config/featureConfig.js +121 -0
  17. package/dist/config/runtimeConfig.d.ts +151 -0
  18. package/dist/config/runtimeConfig.js +380 -0
  19. package/dist/config/serverConfig.d.ts +90 -0
  20. package/dist/config/serverConfig.js +167 -0
  21. package/dist/dashboard/analytics/AnalyticsEngine.d.ts +142 -0
  22. package/dist/dashboard/analytics/AnalyticsEngine.js +373 -0
  23. package/dist/dashboard/analytics/BusinessIntelligence.d.ts +187 -0
  24. package/dist/dashboard/analytics/BusinessIntelligence.js +594 -0
  25. package/dist/dashboard/client/admin.html +2175 -0
  26. package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs +1 -0
  27. package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/render-T6MDALS3.mjs +27 -0
  28. package/dist/dashboard/client/css/admin.css +1587 -0
  29. package/dist/dashboard/client/js/admin.auth.js +179 -0
  30. package/dist/dashboard/client/js/admin.boot.js +359 -0
  31. package/dist/dashboard/client/js/admin.config.js +196 -0
  32. package/dist/dashboard/client/js/admin.embeddings.js +426 -0
  33. package/dist/dashboard/client/js/admin.graph.js +615 -0
  34. package/dist/dashboard/client/js/admin.instances.js +120 -0
  35. package/dist/dashboard/client/js/admin.instructions.js +579 -0
  36. package/dist/dashboard/client/js/admin.logs.js +113 -0
  37. package/dist/dashboard/client/js/admin.maintenance.js +393 -0
  38. package/dist/dashboard/client/js/admin.messaging.js +636 -0
  39. package/dist/dashboard/client/js/admin.monitor.js +184 -0
  40. package/dist/dashboard/client/js/admin.overview.js +221 -0
  41. package/dist/dashboard/client/js/admin.performance.js +61 -0
  42. package/dist/dashboard/client/js/admin.sessions.js +292 -0
  43. package/dist/dashboard/client/js/admin.sqlite.js +373 -0
  44. package/dist/dashboard/client/js/admin.utils.js +49 -0
  45. package/dist/dashboard/client/js/chart.umd.js +14 -0
  46. package/dist/dashboard/client/js/elk.bundled.js +6696 -0
  47. package/dist/dashboard/client/js/marked.umd.js +74 -0
  48. package/dist/dashboard/client/js/mermaid.min.js +3022 -0
  49. package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
  50. package/dist/dashboard/export/DataExporter.d.ts +169 -0
  51. package/dist/dashboard/export/DataExporter.js +737 -0
  52. package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
  53. package/dist/dashboard/export/exporters/csvExporter.js +47 -0
  54. package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
  55. package/dist/dashboard/export/exporters/exportTypes.js +5 -0
  56. package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
  57. package/dist/dashboard/export/exporters/jsonExporter.js +23 -0
  58. package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
  59. package/dist/dashboard/export/exporters/xmlExporter.js +176 -0
  60. package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
  61. package/dist/dashboard/integration/APIIntegration.js +95 -0
  62. package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
  63. package/dist/dashboard/security/SecurityMonitor.js +560 -0
  64. package/dist/dashboard/server/AdminPanel.d.ts +195 -0
  65. package/dist/dashboard/server/AdminPanel.js +861 -0
  66. package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
  67. package/dist/dashboard/server/AdminPanelConfig.js +80 -0
  68. package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
  69. package/dist/dashboard/server/AdminPanelState.js +215 -0
  70. package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
  71. package/dist/dashboard/server/ApiRoutes.js +184 -0
  72. package/dist/dashboard/server/DashboardServer.d.ts +49 -0
  73. package/dist/dashboard/server/DashboardServer.js +160 -0
  74. package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
  75. package/dist/dashboard/server/FileMetricsStorage.js +196 -0
  76. package/dist/dashboard/server/HttpTransport.d.ts +23 -0
  77. package/dist/dashboard/server/HttpTransport.js +116 -0
  78. package/dist/dashboard/server/InstanceManager.d.ts +53 -0
  79. package/dist/dashboard/server/InstanceManager.js +295 -0
  80. package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
  81. package/dist/dashboard/server/KnowledgeStore.js +105 -0
  82. package/dist/dashboard/server/LeaderElection.d.ts +81 -0
  83. package/dist/dashboard/server/LeaderElection.js +268 -0
  84. package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
  85. package/dist/dashboard/server/MetricsCollector.js +810 -0
  86. package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
  87. package/dist/dashboard/server/SessionPersistenceManager.js +458 -0
  88. package/dist/dashboard/server/ThinClient.d.ts +64 -0
  89. package/dist/dashboard/server/ThinClient.js +237 -0
  90. package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
  91. package/dist/dashboard/server/WebSocketManager.js +448 -0
  92. package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
  93. package/dist/dashboard/server/httpLifecycle.js +35 -0
  94. package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
  95. package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
  96. package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
  97. package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
  98. package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
  99. package/dist/dashboard/server/metricsAggregation.js +210 -0
  100. package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
  101. package/dist/dashboard/server/metricsSerializer.js +195 -0
  102. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +25 -0
  103. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +24 -0
  104. package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
  105. package/dist/dashboard/server/routes/admin.routes.js +574 -0
  106. package/dist/dashboard/server/routes/adminAuth.d.ts +4 -0
  107. package/dist/dashboard/server/routes/adminAuth.js +46 -0
  108. package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
  109. package/dist/dashboard/server/routes/alerts.routes.js +91 -0
  110. package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
  111. package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
  112. package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
  113. package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
  114. package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
  115. package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
  116. package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
  117. package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
  118. package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
  119. package/dist/dashboard/server/routes/graph.routes.js +279 -0
  120. package/dist/dashboard/server/routes/index.d.ts +39 -0
  121. package/dist/dashboard/server/routes/index.js +229 -0
  122. package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
  123. package/dist/dashboard/server/routes/instances.routes.js +35 -0
  124. package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
  125. package/dist/dashboard/server/routes/instructions.routes.js +268 -0
  126. package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
  127. package/dist/dashboard/server/routes/knowledge.routes.js +80 -0
  128. package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
  129. package/dist/dashboard/server/routes/logs.routes.js +166 -0
  130. package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
  131. package/dist/dashboard/server/routes/messaging.routes.js +307 -0
  132. package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
  133. package/dist/dashboard/server/routes/metrics.routes.js +335 -0
  134. package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
  135. package/dist/dashboard/server/routes/scripts.routes.js +84 -0
  136. package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
  137. package/dist/dashboard/server/routes/sqlite.routes.js +570 -0
  138. package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
  139. package/dist/dashboard/server/routes/status.routes.js +179 -0
  140. package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
  141. package/dist/dashboard/server/routes/synthetic.routes.js +197 -0
  142. package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
  143. package/dist/dashboard/server/routes/tools.routes.js +47 -0
  144. package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
  145. package/dist/dashboard/server/routes/usage.routes.js +26 -0
  146. package/dist/dashboard/server/wsInit.d.ts +16 -0
  147. package/dist/dashboard/server/wsInit.js +35 -0
  148. package/dist/externalClientLib.d.ts +1 -0
  149. package/dist/externalClientLib.js +2 -0
  150. package/dist/minimal/index.d.ts +1 -0
  151. package/dist/minimal/index.js +140 -0
  152. package/dist/models/SessionPersistence.d.ts +115 -0
  153. package/dist/models/SessionPersistence.js +66 -0
  154. package/dist/models/instruction.d.ts +46 -0
  155. package/dist/models/instruction.js +2 -0
  156. package/dist/perf/benchmark.d.ts +1 -0
  157. package/dist/perf/benchmark.js +50 -0
  158. package/dist/portableClientWrapper.d.ts +1 -0
  159. package/dist/portableClientWrapper.js +2 -0
  160. package/dist/schemas/index.d.ts +132 -0
  161. package/dist/schemas/index.js +372 -0
  162. package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
  163. package/dist/scripts/runPerformanceBaseline.js +17 -0
  164. package/dist/server/backgroundServicesStartup.d.ts +3 -0
  165. package/dist/server/backgroundServicesStartup.js +51 -0
  166. package/dist/server/handshakeManager.d.ts +25 -0
  167. package/dist/server/handshakeManager.js +470 -0
  168. package/dist/server/index-server.d.ts +38 -0
  169. package/dist/server/index-server.js +620 -0
  170. package/dist/server/multiInstanceStartup.d.ts +6 -0
  171. package/dist/server/multiInstanceStartup.js +132 -0
  172. package/dist/server/registry.d.ts +44 -0
  173. package/dist/server/registry.js +236 -0
  174. package/dist/server/sdkServer.d.ts +8 -0
  175. package/dist/server/sdkServer.js +299 -0
  176. package/dist/server/shutdownGuard.d.ts +41 -0
  177. package/dist/server/shutdownGuard.js +52 -0
  178. package/dist/server/startupDiagnostics.d.ts +2 -0
  179. package/dist/server/startupDiagnostics.js +33 -0
  180. package/dist/server/thin-client.d.ts +22 -0
  181. package/dist/server/thin-client.js +111 -0
  182. package/dist/server/transport.d.ts +41 -0
  183. package/dist/server/transport.js +312 -0
  184. package/dist/server/transportFactory.d.ts +21 -0
  185. package/dist/server/transportFactory.js +429 -0
  186. package/dist/services/atomicFs.d.ts +22 -0
  187. package/dist/services/atomicFs.js +103 -0
  188. package/dist/services/auditLog.d.ts +38 -0
  189. package/dist/services/auditLog.js +142 -0
  190. package/dist/services/autoBackup.d.ts +14 -0
  191. package/dist/services/autoBackup.js +171 -0
  192. package/dist/services/autoSplit.d.ts +32 -0
  193. package/dist/services/autoSplit.js +113 -0
  194. package/dist/services/backupZip.d.ts +25 -0
  195. package/dist/services/backupZip.js +112 -0
  196. package/dist/services/bootstrapGating.d.ts +123 -0
  197. package/dist/services/bootstrapGating.js +221 -0
  198. package/dist/services/canonical.d.ts +23 -0
  199. package/dist/services/canonical.js +65 -0
  200. package/dist/services/categoryRules.d.ts +7 -0
  201. package/dist/services/categoryRules.js +37 -0
  202. package/dist/services/classificationService.d.ts +42 -0
  203. package/dist/services/classificationService.js +168 -0
  204. package/dist/services/embeddingService.d.ts +62 -0
  205. package/dist/services/embeddingService.js +264 -0
  206. package/dist/services/errors.d.ts +22 -0
  207. package/dist/services/errors.js +31 -0
  208. package/dist/services/featureFlags.d.ts +25 -0
  209. package/dist/services/featureFlags.js +89 -0
  210. package/dist/services/features.d.ts +13 -0
  211. package/dist/services/features.js +35 -0
  212. package/dist/services/handlers/instructions.add.d.ts +1 -0
  213. package/dist/services/handlers/instructions.add.js +510 -0
  214. package/dist/services/handlers/instructions.groom.d.ts +1 -0
  215. package/dist/services/handlers/instructions.groom.js +575 -0
  216. package/dist/services/handlers/instructions.import.d.ts +1 -0
  217. package/dist/services/handlers/instructions.import.js +205 -0
  218. package/dist/services/handlers/instructions.patch.d.ts +1 -0
  219. package/dist/services/handlers/instructions.patch.js +121 -0
  220. package/dist/services/handlers/instructions.query.d.ts +159 -0
  221. package/dist/services/handlers/instructions.query.js +469 -0
  222. package/dist/services/handlers/instructions.reload.d.ts +1 -0
  223. package/dist/services/handlers/instructions.reload.js +13 -0
  224. package/dist/services/handlers/instructions.remove.d.ts +1 -0
  225. package/dist/services/handlers/instructions.remove.js +122 -0
  226. package/dist/services/handlers/instructions.shared.d.ts +32 -0
  227. package/dist/services/handlers/instructions.shared.js +91 -0
  228. package/dist/services/handlers.activation.d.ts +1 -0
  229. package/dist/services/handlers.activation.js +203 -0
  230. package/dist/services/handlers.bootstrap.d.ts +1 -0
  231. package/dist/services/handlers.bootstrap.js +38 -0
  232. package/dist/services/handlers.dashboardConfig.d.ts +34 -0
  233. package/dist/services/handlers.dashboardConfig.js +110 -0
  234. package/dist/services/handlers.diagnostics.d.ts +1 -0
  235. package/dist/services/handlers.diagnostics.js +64 -0
  236. package/dist/services/handlers.feedback.d.ts +15 -0
  237. package/dist/services/handlers.feedback.js +389 -0
  238. package/dist/services/handlers.gates.d.ts +1 -0
  239. package/dist/services/handlers.gates.js +47 -0
  240. package/dist/services/handlers.graph.d.ts +53 -0
  241. package/dist/services/handlers.graph.js +231 -0
  242. package/dist/services/handlers.help.d.ts +1 -0
  243. package/dist/services/handlers.help.js +119 -0
  244. package/dist/services/handlers.instructionSchema.d.ts +1 -0
  245. package/dist/services/handlers.instructionSchema.js +227 -0
  246. package/dist/services/handlers.instructions.d.ts +8 -0
  247. package/dist/services/handlers.instructions.js +14 -0
  248. package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
  249. package/dist/services/handlers.instructionsDiagnostics.js +14 -0
  250. package/dist/services/handlers.integrity.d.ts +1 -0
  251. package/dist/services/handlers.integrity.js +35 -0
  252. package/dist/services/handlers.manifest.d.ts +1 -0
  253. package/dist/services/handlers.manifest.js +24 -0
  254. package/dist/services/handlers.messaging.d.ts +12 -0
  255. package/dist/services/handlers.messaging.js +203 -0
  256. package/dist/services/handlers.metrics.d.ts +1 -0
  257. package/dist/services/handlers.metrics.js +43 -0
  258. package/dist/services/handlers.promote.d.ts +1 -0
  259. package/dist/services/handlers.promote.js +326 -0
  260. package/dist/services/handlers.prompt.d.ts +1 -0
  261. package/dist/services/handlers.prompt.js +7 -0
  262. package/dist/services/handlers.search.d.ts +69 -0
  263. package/dist/services/handlers.search.js +669 -0
  264. package/dist/services/handlers.testPrimitive.d.ts +1 -0
  265. package/dist/services/handlers.testPrimitive.js +5 -0
  266. package/dist/services/handlers.trace.d.ts +1 -0
  267. package/dist/services/handlers.trace.js +35 -0
  268. package/dist/services/handlers.usage.d.ts +1 -0
  269. package/dist/services/handlers.usage.js +11 -0
  270. package/dist/services/hotScore.d.ts +137 -0
  271. package/dist/services/hotScore.js +244 -0
  272. package/dist/services/indexContext.d.ts +117 -0
  273. package/dist/services/indexContext.js +989 -0
  274. package/dist/services/indexLoader.d.ts +44 -0
  275. package/dist/services/indexLoader.js +920 -0
  276. package/dist/services/indexRepository.d.ts +32 -0
  277. package/dist/services/indexRepository.js +71 -0
  278. package/dist/services/indexingService.d.ts +1 -0
  279. package/dist/services/indexingService.js +2 -0
  280. package/dist/services/instructions.dispatcher.d.ts +1 -0
  281. package/dist/services/instructions.dispatcher.js +231 -0
  282. package/dist/services/logPrefix.d.ts +1 -0
  283. package/dist/services/logPrefix.js +30 -0
  284. package/dist/services/logger.d.ts +52 -0
  285. package/dist/services/logger.js +268 -0
  286. package/dist/services/manifestManager.d.ts +82 -0
  287. package/dist/services/manifestManager.js +200 -0
  288. package/dist/services/messaging/agentMailbox.d.ts +60 -0
  289. package/dist/services/messaging/agentMailbox.js +353 -0
  290. package/dist/services/messaging/messagingPersistence.d.ts +20 -0
  291. package/dist/services/messaging/messagingPersistence.js +111 -0
  292. package/dist/services/messaging/messagingTypes.d.ts +150 -0
  293. package/dist/services/messaging/messagingTypes.js +66 -0
  294. package/dist/services/ownershipService.d.ts +1 -0
  295. package/dist/services/ownershipService.js +36 -0
  296. package/dist/services/performanceBaseline.d.ts +19 -0
  297. package/dist/services/performanceBaseline.js +210 -0
  298. package/dist/services/preflight.d.ts +12 -0
  299. package/dist/services/preflight.js +79 -0
  300. package/dist/services/promptReviewService.d.ts +44 -0
  301. package/dist/services/promptReviewService.js +101 -0
  302. package/dist/services/responseEnvelope.d.ts +6 -0
  303. package/dist/services/responseEnvelope.js +25 -0
  304. package/dist/services/seedBootstrap.d.ts +34 -0
  305. package/dist/services/seedBootstrap.js +259 -0
  306. package/dist/services/storage/factory.d.ts +17 -0
  307. package/dist/services/storage/factory.js +35 -0
  308. package/dist/services/storage/hashUtils.d.ts +11 -0
  309. package/dist/services/storage/hashUtils.js +35 -0
  310. package/dist/services/storage/index.d.ts +12 -0
  311. package/dist/services/storage/index.js +18 -0
  312. package/dist/services/storage/jsonFileStore.d.ts +32 -0
  313. package/dist/services/storage/jsonFileStore.js +241 -0
  314. package/dist/services/storage/migrationEngine.d.ts +35 -0
  315. package/dist/services/storage/migrationEngine.js +93 -0
  316. package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
  317. package/dist/services/storage/sqliteMessageStore.js +146 -0
  318. package/dist/services/storage/sqliteSchema.d.ts +12 -0
  319. package/dist/services/storage/sqliteSchema.js +123 -0
  320. package/dist/services/storage/sqliteStore.d.ts +42 -0
  321. package/dist/services/storage/sqliteStore.js +361 -0
  322. package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
  323. package/dist/services/storage/sqliteUsageStore.js +94 -0
  324. package/dist/services/storage/types.d.ts +171 -0
  325. package/dist/services/storage/types.js +12 -0
  326. package/dist/services/toolHandlers.d.ts +23 -0
  327. package/dist/services/toolHandlers.js +50 -0
  328. package/dist/services/toolRegistry.d.ts +20 -0
  329. package/dist/services/toolRegistry.js +490 -0
  330. package/dist/services/toolRegistry.zod.d.ts +10 -0
  331. package/dist/services/toolRegistry.zod.js +325 -0
  332. package/dist/services/tracing.d.ts +26 -0
  333. package/dist/services/tracing.js +260 -0
  334. package/dist/services/usageBuckets.d.ts +161 -0
  335. package/dist/services/usageBuckets.js +364 -0
  336. package/dist/services/validationService.d.ts +38 -0
  337. package/dist/services/validationService.js +125 -0
  338. package/dist/utils/BufferRing.d.ts +203 -0
  339. package/dist/utils/BufferRing.js +551 -0
  340. package/dist/utils/BufferRingExamples.d.ts +55 -0
  341. package/dist/utils/BufferRingExamples.js +188 -0
  342. package/dist/utils/envUtils.d.ts +42 -0
  343. package/dist/utils/envUtils.js +80 -0
  344. package/dist/utils/memoryMonitor.d.ts +83 -0
  345. package/dist/utils/memoryMonitor.js +275 -0
  346. package/dist/versioning/schemaVersion.d.ts +6 -0
  347. package/dist/versioning/schemaVersion.js +94 -0
  348. package/package.json +139 -0
  349. package/schemas/README.md +13 -0
  350. package/schemas/feedback-entry.schema.json +27 -0
  351. package/schemas/graph-export-v2.schema.json +60 -0
  352. package/schemas/index-server.code-schema.json +40670 -0
  353. package/schemas/instruction.schema.json +262 -0
  354. package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
  355. package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
  356. package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
  357. package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
  358. package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
  359. package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
  360. package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
  361. package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
  362. package/schemas/json-schema/instruction-content-type.schema.json +17 -0
  363. package/schemas/json-schema/instruction-instruction-entry.schema.json +210 -0
  364. package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
  365. package/schemas/manifest.json +78 -0
  366. package/schemas/manifest.schema.json +33 -0
  367. package/schemas/usage-batch.schema.json +16 -0
  368. package/schemas/usage-buckets.schema.json +30 -0
  369. package/schemas/usage-event.schema.json +17 -0
  370. package/scripts/copy-dashboard-assets.mjs +170 -0
  371. package/scripts/dist/README.md +15 -0
  372. package/scripts/setup-hooks.cjs +28 -0
@@ -0,0 +1,620 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.shutdownGuard = void 0;
8
+ exports.main = main;
9
+ exports._parseArgs = parseArgs;
10
+ exports._findPackageVersion = findPackageVersion;
11
+ exports._startDashboard = startDashboard;
12
+ exports.startDashboard = startDashboard;
13
+ /**
14
+ * Index Server - Dual Transport Architecture
15
+ *
16
+ * PRIMARY TRANSPORT - MCP Protocol (stdin/stdout):
17
+ * - JSON-RPC 2.0 over stdio for all MCP client communication
18
+ * - VS Code, Claude, and other MCP clients connect via stdin/stdout only
19
+ * - Process-isolated, no network exposure
20
+ *
21
+ * SECONDARY TRANSPORT - Admin Dashboard (optional HTTP):
22
+ * - HTTP server on localhost for administrator monitoring
23
+ * - Read-only interface for status, tools, and metrics
24
+ * - Not for MCP client communication - admin use only
25
+ */
26
+ // Early stdin buffering (handshake hardening):
27
+ // Some fast clients send the initialize frame immediately after spawn. If the
28
+ // SDK server's stdin listener isn't attached yet, those bytes can sit without
29
+ // a consumer until the listener is registered. In practice we observed cases
30
+ // where initialize never produced a response in ~30s test windows. To harden
31
+ // the handshake we capture ALL stdin data prior to startSdkServer() completing
32
+ // and then re-emit the buffered chunks once the SDK has attached its handlers.
33
+ // This ensures spec compliance: an initialize request always yields either a
34
+ // success or a version negotiation error – never silent drop.
35
+ // Install global stderr log prefix (timestamps, pid, ppid, seq, tid) before any diagnostic output.
36
+ require("../services/logPrefix");
37
+ // Ensure logger initializes early (file logging environment may auto-resolve)
38
+ require("../services/logger");
39
+ const runtimeConfig_1 = require("../config/runtimeConfig");
40
+ const __earlyInitChunks = [];
41
+ let __earlyInitFirstLogged = false;
42
+ let __sdkReady = false;
43
+ // Allow opt-out (e.g., diagnostic comparison) via INDEX_SERVER_DISABLE_EARLY_STDIN_BUFFER=1
44
+ const __bufferEnabled = !(0, runtimeConfig_1.getRuntimeConfig)().server.disableEarlyStdinBuffer;
45
+ // We attach the temporary listener immediately so even synchronous module load
46
+ // time is covered.
47
+ function __earlyCapture(chunk) {
48
+ if (!__sdkReady && __bufferEnabled) {
49
+ __earlyInitChunks.push(Buffer.from(chunk));
50
+ // Light diagnostic: log only on first capture & optionally every 10th if deep buffering occurs.
51
+ if ((0, envUtils_1.getBooleanEnv)('INDEX_SERVER_LOG_DIAG')) {
52
+ if (!__earlyInitFirstLogged) {
53
+ __earlyInitFirstLogged = true;
54
+ const preview = chunk.toString('utf8').replace(/\r/g, '\\r').replace(/\n/g, '\\n').slice(0, 120);
55
+ const hasContentLength = chunk.toString('utf8').includes('Content-Length');
56
+ try {
57
+ process.stderr.write(`[handshake-buffer] first early chunk captured size=${chunk.length} hasContentLength=${hasContentLength} preview="${preview}"\n`);
58
+ }
59
+ catch { /* ignore */ }
60
+ }
61
+ else if (__earlyInitChunks.length % 10 === 0) {
62
+ try {
63
+ process.stderr.write(`[handshake-buffer] bufferedChunks=${__earlyInitChunks.length}\n`);
64
+ }
65
+ catch { /* ignore */ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ try {
71
+ if (__bufferEnabled)
72
+ process.stdin.on('data', __earlyCapture);
73
+ }
74
+ catch { /* ignore */ }
75
+ const sdkServer_1 = require("./sdkServer");
76
+ const multiInstanceStartup_1 = require("./multiInstanceStartup");
77
+ const backgroundServicesStartup_1 = require("./backgroundServicesStartup");
78
+ const startupDiagnostics_1 = require("./startupDiagnostics");
79
+ require("../services/toolHandlers");
80
+ const seedBootstrap_1 = require("../services/seedBootstrap");
81
+ const DashboardServer_js_1 = require("../dashboard/server/DashboardServer.js");
82
+ const MetricsCollector_js_1 = require("../dashboard/server/MetricsCollector.js");
83
+ const InstanceManager_js_1 = require("../dashboard/server/InstanceManager.js");
84
+ const envUtils_1 = require("../utils/envUtils");
85
+ const defaultValues_1 = require("../config/defaultValues");
86
+ const fs_1 = __importDefault(require("fs"));
87
+ const path_1 = __importDefault(require("path"));
88
+ const logger_1 = require("../services/logger");
89
+ const bootstrapGating_1 = require("../services/bootstrapGating");
90
+ const preflight_1 = require("../services/preflight");
91
+ const shutdownGuard_1 = require("./shutdownGuard");
92
+ // Singleton shutdown guard — all exit paths funnel through this (Issue #36 fix)
93
+ exports.shutdownGuard = (0, shutdownGuard_1.createShutdownGuard)();
94
+ // Store in global symbol so services (indexContext) can register cleanup without circular imports
95
+ globalThis[Symbol.for('mcp-shutdown-guard')] = exports.shutdownGuard;
96
+ // ---------------------------------------------------------------------------
97
+ // Unified global diagnostics guard (installs once) for uncaught errors, promise
98
+ // rejections, runtime warnings, and termination signals. Emits NDJSON to stderr
99
+ // for compatibility with typescript-schema-viewer log analysis.
100
+ // Uses direct process.stderr.write (not the logger) for safety in crash paths.
101
+ // ---------------------------------------------------------------------------
102
+ if (!process.listeners('uncaughtException').some(l => l.name === 'mcpGlobalGuard')) {
103
+ const ndjson = (level, msg, detail) => {
104
+ try {
105
+ const rec = { ts: new Date().toISOString(), level, msg, pid: process.pid };
106
+ if (detail)
107
+ rec.detail = detail;
108
+ process.stderr.write(JSON.stringify(rec) + '\n');
109
+ }
110
+ catch { /* truly last resort */ }
111
+ };
112
+ const errDetail = (e) => {
113
+ if (e instanceof Error)
114
+ return e.stack ?? `${e.name || 'Error'}: ${e.message}`;
115
+ return typeof e === 'object' ? JSON.stringify(e) : String(e);
116
+ };
117
+ const getFatalExitDelayMs = () => Math.max(0, (0, runtimeConfig_1.getRuntimeConfig)().server.fatalExitDelayMs);
118
+ // Register port file cleanup with the shutdown guard
119
+ exports.shutdownGuard.registerCleanup('removePortFile', () => {
120
+ try {
121
+ (0, InstanceManager_js_1.removePortFile)();
122
+ }
123
+ catch { /* ignore */ }
124
+ });
125
+ const uncaughtHandler = function mcpGlobalGuard(err) {
126
+ ndjson('ERROR', '[indexServer] Uncaught exception', errDetail(err));
127
+ const code = exports.shutdownGuard.initiateShutdown('uncaughtException');
128
+ setTimeout(() => process.exit(code), getFatalExitDelayMs());
129
+ };
130
+ const rejectionHandler = function mcpGlobalGuard(reason) {
131
+ ndjson('ERROR', '[indexServer] Unhandled rejection', errDetail(reason));
132
+ };
133
+ process.on('uncaughtException', uncaughtHandler);
134
+ process.on('unhandledRejection', rejectionHandler);
135
+ // Surface Node.js process warnings (deprecations, experimental flags, etc.)
136
+ process.on('warning', (w) => {
137
+ ndjson('WARN', '[indexServer] Process warning', errDetail(w));
138
+ });
139
+ // Graceful shutdown on common termination signals: log intent then exit
140
+ const sigHandler = (sig) => {
141
+ ndjson('INFO', `[indexServer] Signal received: ${sig}`);
142
+ const code = exports.shutdownGuard.initiateShutdown(sig);
143
+ setTimeout(() => process.exit(code), 5);
144
+ };
145
+ ['SIGINT', 'SIGTERM'].forEach(s => { try {
146
+ process.once(s, sigHandler);
147
+ }
148
+ catch { /* ignore */ } });
149
+ // Detect parent disconnect (stdin EOF). On Windows, SIGTERM is not reliably
150
+ // delivered when the parent (VS Code) kills the child process. The stdin
151
+ // stream closing is the most reliable signal that the parent is gone. Without
152
+ // this, the Express dashboard HTTP server keeps the event loop alive and the
153
+ // process becomes an orphan that never exits (Issue: stale instances).
154
+ try {
155
+ if (process.stdin && !process.stdin.destroyed) {
156
+ const stdinCloseHandler = () => {
157
+ ndjson('INFO', '[indexServer] Parent disconnected (stdin closed) — initiating shutdown');
158
+ const code = exports.shutdownGuard.initiateShutdown('stdin-closed');
159
+ setTimeout(() => process.exit(code), 50);
160
+ };
161
+ process.stdin.once('end', stdinCloseHandler);
162
+ process.stdin.once('close', stdinCloseHandler);
163
+ }
164
+ }
165
+ catch { /* ignore */ }
166
+ // Belt-and-suspenders: PPID watchdog. On Windows, stdin EOF detection can be
167
+ // unreliable in edge cases (parent crash, pipe handle inheritance). Periodically
168
+ // check if the parent process (PPID) is still alive. If the parent is gone, we
169
+ // are orphaned and should exit. The check uses process.kill(pid, 0) which on
170
+ // Windows calls OpenProcess() -- it throws ESRCH if the process doesn't exist.
171
+ // Skip when ppid is 0 or 1 (init / no parent) or when running interactively.
172
+ try {
173
+ const ppid = process.ppid;
174
+ if (ppid && ppid > 1) {
175
+ const PPID_CHECK_INTERVAL_MS = 30_000; // 30 seconds
176
+ const ppidTimer = setInterval(() => {
177
+ try {
178
+ process.kill(ppid, 0); // signal 0 = existence check, no actual signal sent
179
+ }
180
+ catch {
181
+ // Parent is gone -- we are orphaned
182
+ ndjson('WARN', `[indexServer] Parent pid=${ppid} no longer exists — initiating shutdown`);
183
+ clearInterval(ppidTimer);
184
+ const code = exports.shutdownGuard.initiateShutdown('ppid-orphan');
185
+ setTimeout(() => process.exit(code), 50);
186
+ }
187
+ }, PPID_CHECK_INTERVAL_MS);
188
+ ppidTimer.unref(); // don't keep the event loop alive just for the watchdog
189
+ }
190
+ }
191
+ catch { /* ignore */ }
192
+ }
193
+ // Low-level ingress tracing: echo raw stdin frames when verbose enabled (diagnostic only)
194
+ try {
195
+ if ((0, envUtils_1.getBooleanEnv)('INDEX_SERVER_VERBOSE_LOGGING') && !process.stdin.listenerCount('data')) {
196
+ process.stdin.on('data', chunk => {
197
+ try {
198
+ process.stderr.write(`[in] ${chunk.toString().replace(/\n/g, '\\n')}\n`);
199
+ }
200
+ catch { /* ignore */ }
201
+ });
202
+ }
203
+ }
204
+ catch { /* ignore */ }
205
+ function parseArgs(argv) {
206
+ const runtimeCfg = (0, runtimeConfig_1.reloadRuntimeConfig)();
207
+ const http = runtimeCfg.dashboard.http;
208
+ const config = {
209
+ dashboard: http.enable,
210
+ dashboardPort: http.port,
211
+ dashboardHost: http.host,
212
+ maxPortTries: http.maxPortTries,
213
+ legacy: false,
214
+ dashboardTls: http.tls.enabled,
215
+ dashboardTlsCert: http.tls.certPath,
216
+ dashboardTlsKey: http.tls.keyPath,
217
+ dashboardTlsCa: http.tls.caPath,
218
+ };
219
+ const args = argv.slice(2);
220
+ for (let i = 0; i < args.length; i++) {
221
+ const raw = args[i];
222
+ if (raw === '--dashboard')
223
+ config.dashboard = true;
224
+ else if (raw === '--no-dashboard')
225
+ config.dashboard = false;
226
+ else if (raw.startsWith('--dashboard-port='))
227
+ config.dashboardPort = parseInt(raw.split('=')[1], 10) || config.dashboardPort;
228
+ else if (raw === '--dashboard-port') {
229
+ const v = args[++i];
230
+ if (v)
231
+ config.dashboardPort = parseInt(v, 10) || config.dashboardPort;
232
+ }
233
+ else if (raw.startsWith('--dashboard-host='))
234
+ config.dashboardHost = raw.split('=')[1] || config.dashboardHost;
235
+ else if (raw === '--dashboard-host') {
236
+ const v = args[++i];
237
+ if (v)
238
+ config.dashboardHost = v;
239
+ }
240
+ else if (raw.startsWith('--dashboard-tries='))
241
+ config.maxPortTries = Math.max(1, parseInt(raw.split('=')[1], 10) || config.maxPortTries);
242
+ else if (raw === '--dashboard-tries') {
243
+ const v = args[++i];
244
+ if (v)
245
+ config.maxPortTries = Math.max(1, parseInt(v, 10) || config.maxPortTries);
246
+ }
247
+ else if (raw === '--dashboard-tls')
248
+ config.dashboardTls = true;
249
+ else if (raw.startsWith('--dashboard-tls-cert='))
250
+ config.dashboardTlsCert = raw.split('=')[1];
251
+ else if (raw === '--dashboard-tls-cert') {
252
+ const v = args[++i];
253
+ if (v)
254
+ config.dashboardTlsCert = v;
255
+ }
256
+ else if (raw.startsWith('--dashboard-tls-key='))
257
+ config.dashboardTlsKey = raw.split('=')[1];
258
+ else if (raw === '--dashboard-tls-key') {
259
+ const v = args[++i];
260
+ if (v)
261
+ config.dashboardTlsKey = v;
262
+ }
263
+ else if (raw.startsWith('--dashboard-tls-ca='))
264
+ config.dashboardTlsCa = raw.split('=')[1];
265
+ else if (raw === '--dashboard-tls-ca') {
266
+ const v = args[++i];
267
+ if (v)
268
+ config.dashboardTlsCa = v;
269
+ }
270
+ else if (raw === '--legacy' || raw === '--legacy-transport')
271
+ config.legacy = true; // no-op
272
+ else if (raw === '--help' || raw === '-h') {
273
+ printHelpAndExit();
274
+ }
275
+ }
276
+ return config;
277
+ }
278
+ function printHelpAndExit() {
279
+ const help = `index-server - Model Context Protocol Server
280
+
281
+ MCP TRANSPORT (Client Communication):
282
+ Primary transport: JSON-RPC 2.0 over stdio (stdin/stdout)
283
+ Purpose: VS Code, Claude, and other MCP clients
284
+ Security: Process-isolated, no network exposure
285
+
286
+ ADMIN DASHBOARD (Optional):
287
+ --dashboard Enable read-only admin dashboard (default off)
288
+ --dashboard-port=PORT Dashboard port (default 8787)
289
+ --dashboard-host=HOST Dashboard host (default 127.0.0.1)
290
+ --dashboard-tries=N Port retry attempts (default 10)
291
+ --no-dashboard Disable dashboard
292
+ --dashboard-tls Enable HTTPS/WSS for dashboard
293
+ --dashboard-tls-cert=PATH TLS certificate file (PEM)
294
+ --dashboard-tls-key=PATH TLS private key file (PEM)
295
+ --dashboard-tls-ca=PATH Optional CA certificate file (PEM)
296
+ Purpose: Local administrator monitoring only
297
+
298
+ ENVIRONMENT VARIABLES:
299
+ INDEX_SERVER_DASHBOARD=1 Enable dashboard (0=disable, 1=enable)
300
+ INDEX_SERVER_DASHBOARD_PORT=PORT Dashboard port (default 8787)
301
+ INDEX_SERVER_DASHBOARD_HOST=HOST Dashboard host (default 127.0.0.1)
302
+ INDEX_SERVER_DASHBOARD_TRIES=N Port retry attempts (default 10)
303
+ INDEX_SERVER_DASHBOARD_TLS=1 Enable HTTPS/WSS for dashboard
304
+ INDEX_SERVER_DASHBOARD_TLS_CERT TLS certificate file path (PEM)
305
+ INDEX_SERVER_DASHBOARD_TLS_KEY TLS private key file path (PEM)
306
+ INDEX_SERVER_DASHBOARD_TLS_CA Optional CA certificate file path (PEM)
307
+
308
+ Other environment variables:
309
+ INDEX_SERVER_VERBOSE_LOGGING=1 Verbose RPC/transport logging
310
+ INDEX_SERVER_LOG_DIAG=1 Diagnostic logging
311
+ INDEX_SERVER_MUTATION=1 Enable write operations
312
+ INDEX_SERVER_IDLE_KEEPALIVE_MS Keepalive interval (default 30000ms)
313
+ NODE_ENV=development Use dev ports (dashboard=${defaultValues_1.DEFAULT_PORTS.DASHBOARD_DEV}, leader=${defaultValues_1.DEFAULT_PORTS.LEADER_DEV})
314
+
315
+ GENERAL:
316
+ -h, --help Show this help and exit
317
+ (legacy transport removed; SDK only)
318
+
319
+ IMPORTANT:
320
+ - MCP clients connect via stdio only, not HTTP dashboard
321
+ - Dashboard is for admin monitoring, not client communication
322
+ - All MCP protocol frames output to stdout; logs to stderr
323
+ - Command line arguments override environment variables`;
324
+ // write to stderr to avoid contaminating stdout protocol
325
+ process.stderr.write(help + '\n');
326
+ process.exit(0);
327
+ }
328
+ function findPackageVersion() {
329
+ const candidates = [
330
+ path_1.default.join(process.cwd(), 'package.json'),
331
+ path_1.default.join(__dirname, '..', '..', 'package.json')
332
+ ];
333
+ for (const p of candidates) {
334
+ try {
335
+ if (fs_1.default.existsSync(p)) {
336
+ const raw = JSON.parse(fs_1.default.readFileSync(p, 'utf8'));
337
+ if (raw?.version)
338
+ return raw.version;
339
+ }
340
+ }
341
+ catch { /* ignore */ }
342
+ }
343
+ return '0.0.0';
344
+ }
345
+ // Added close handle in return object for test coverage harness so unit tests can start and stop the dashboard
346
+ // without leaving open event loop handles. Production code ignores the extra property.
347
+ async function startDashboard(cfg) {
348
+ if (!cfg.dashboard)
349
+ return null;
350
+ // Build TLS options if enabled — read cert/key from disk
351
+ let tlsOpt;
352
+ if (cfg.dashboardTls) {
353
+ if (!cfg.dashboardTlsCert || !cfg.dashboardTlsKey) {
354
+ process.stderr.write(`[startup] Dashboard TLS enabled but cert/key paths missing. Set INDEX_SERVER_DASHBOARD_TLS_CERT and INDEX_SERVER_DASHBOARD_TLS_KEY.\n`);
355
+ return null;
356
+ }
357
+ try {
358
+ const cert = fs_1.default.readFileSync(cfg.dashboardTlsCert, 'utf8');
359
+ const key = fs_1.default.readFileSync(cfg.dashboardTlsKey, 'utf8');
360
+ const ca = cfg.dashboardTlsCa ? fs_1.default.readFileSync(cfg.dashboardTlsCa, 'utf8') : undefined;
361
+ tlsOpt = { cert, key, ca };
362
+ }
363
+ catch (err) {
364
+ process.stderr.write(`[startup] Failed to read TLS cert/key files: ${err}\n`);
365
+ return null;
366
+ }
367
+ }
368
+ try {
369
+ process.stderr.write(`[startup] Starting dashboard server on ${cfg.dashboardHost}:${cfg.dashboardPort}${tlsOpt ? ' (HTTPS)' : ''}\n`);
370
+ const dashboardServer = (0, DashboardServer_js_1.createDashboardServer)({
371
+ port: cfg.dashboardPort,
372
+ host: cfg.dashboardHost,
373
+ maxPortTries: cfg.maxPortTries,
374
+ enableWebSockets: true,
375
+ enableCors: false,
376
+ tls: tlsOpt,
377
+ graphEnabled: (0, runtimeConfig_1.getRuntimeConfig)().dashboard.graphEnabled,
378
+ });
379
+ const result = await dashboardServer.start();
380
+ // Record dashboard startup in metrics
381
+ (0, MetricsCollector_js_1.getMetricsCollector)().recordConnection('dashboard_server');
382
+ return {
383
+ url: result.url,
384
+ close: result.close
385
+ };
386
+ }
387
+ catch (error) {
388
+ process.stderr.write(`[startup] Dashboard startup failed: ${error}\n`);
389
+ return null;
390
+ }
391
+ }
392
+ async function main() {
393
+ // Run startup preflight (module/data presence). Non-fatal unless INDEX_SERVER_PREFLIGHT_STRICT=1
394
+ try {
395
+ (0, preflight_1.emitPreflightAndMaybeExit)();
396
+ }
397
+ catch { /* ignore preflight wrapper errors */ }
398
+ // -------------------------------------------------------------
399
+ // Automatic bootstrap seeding (executes before any index load)
400
+ // -------------------------------------------------------------
401
+ try {
402
+ (0, seedBootstrap_1.autoSeedBootstrap)();
403
+ }
404
+ catch { /* ignore seeding errors (non-fatal) */ }
405
+ // -------------------------------------------------------------
406
+ // Idle keepalive support (multi-client shared server test aid)
407
+ // -------------------------------------------------------------
408
+ // Some test scenarios spawn the index server with stdin set to 'ignore'
409
+ // (child_process stdio option) and then create separate test clients
410
+ // that each spawn *their own* server processes pointing at the same
411
+ // instructions directory. In that arrangement the originally spawned
412
+ // shared server would exit immediately because no stdin activity occurs
413
+ // (no MCP initialize frame arrives). That premature exit caused RED in
414
+ // multi-client shared server tests before any CRUD
415
+ // assertions executed.
416
+ //
417
+ // To accommodate this interim RED/ GREEN progression—while future work
418
+ // may add true multi-attach capabilities—we keep the process alive for
419
+ // a bounded idle window when (a) stdin is not readable OR (b) no stdin
420
+ // activity is observed shortly after startup. Environment variable
421
+ // INDEX_SERVER_IDLE_KEEPALIVE_MS (default 30000) bounds the maximum keepalive.
422
+ // This has negligible overhead and only applies when no initialize
423
+ // handshake occurs promptly.
424
+ let __stdinActivity = false;
425
+ try {
426
+ if (process.stdin && !process.stdin.destroyed) {
427
+ process.stdin.on('data', () => { __stdinActivity = true; });
428
+ }
429
+ }
430
+ catch { /* ignore */ }
431
+ function startIdleKeepalive() {
432
+ const serverConfig = (0, runtimeConfig_1.getRuntimeConfig)().server;
433
+ const maxMs = Math.max(1000, serverConfig.idleKeepaliveMs);
434
+ const started = Date.now();
435
+ // Only create ONE interval.
436
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
437
+ if (global.__mcpIdleKeepalive)
438
+ return;
439
+ // Emit a synthetic readiness marker for test environments that spawn the
440
+ // server with stdin=ignore and rely on a '[ready]' sentinel before
441
+ // proceeding (multi-client shared server tests). This does NOT
442
+ // emit a formal JSON-RPC server/ready (which would follow initialize in
443
+ // normal operation); it's a plain log line to stdout and is gated to the
444
+ // idle keepalive path only so production interactive flows are unaffected.
445
+ // Synthetic readiness sentinel (only when explicitly enabled) so tests that rely on a
446
+ // shared server with stdin ignored can proceed. Stricter gating to avoid contaminating
447
+ // other protocol tests: requires INDEX_SERVER_SHARED_SERVER_SENTINEL=1 AND delays emission slightly
448
+ // to allow an initialize frame to arrive first if stdin is active. Legacy env
449
+ // INDEX_SERVER_IDLE_READY_SENTINEL is ignored unless accompanied by INDEX_SERVER_SHARED_SERVER_SENTINEL.
450
+ try {
451
+ if (serverConfig.sharedSentinel === 'multi-client-shared' && !__stdinActivity) {
452
+ setTimeout(() => { if (!__stdinActivity) {
453
+ try {
454
+ process.stdout.write('[ready] idle-keepalive (no stdin activity)\n');
455
+ }
456
+ catch { /* ignore */ }
457
+ } }, 60);
458
+ }
459
+ }
460
+ catch { /* ignore */ }
461
+ const iv = setInterval(() => {
462
+ // Clear early if stdin becomes active (late attach) so we don't keep zombie processes.
463
+ if (__stdinActivity || Date.now() - started > maxMs) {
464
+ clearInterval(iv);
465
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
466
+ global.__mcpIdleKeepalive = undefined;
467
+ }
468
+ else if ((0, runtimeConfig_1.getRuntimeConfig)().server.multicoreTrace) {
469
+ try {
470
+ // Reflective access to private diagnostic API (Node internal) guarded defensively
471
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
472
+ const anyProc = process;
473
+ const handlesLen = typeof anyProc._getActiveHandles === 'function' ? (anyProc._getActiveHandles() || []).length : 'n/a';
474
+ process.stderr.write(`[keepalive] t=${Date.now() - started}ms handles=${handlesLen} stdinActivity=${__stdinActivity}\n`);
475
+ }
476
+ catch { /* ignore */ }
477
+ }
478
+ }, 500);
479
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
480
+ global.__mcpIdleKeepalive = iv;
481
+ }
482
+ // Always start keepalive immediately (unconditional) so a lack of stdin activity
483
+ // cannot allow the event loop to drain and exit before the shared-server test
484
+ // observes the synthetic readiness sentinel. The interval self-clears on first
485
+ // stdin activity or after the bounded max window.
486
+ startIdleKeepalive();
487
+ // Short-circuit handshake mode removed (INDEX_SERVER_SHORTCIRCUIT) now that full
488
+ // protocol framing is stable and locked by tests. (2025-08-31)
489
+ const cfg = parseArgs(process.argv);
490
+ const runtime = (0, runtimeConfig_1.getRuntimeConfig)();
491
+ // ── Dev/prod port-collision guard ─────────────────────────────────
492
+ // When NODE_ENV=development (or --watch), refuse to start on production
493
+ // default ports to prevent dev servers from receiving production traffic.
494
+ const isDev = process.env.NODE_ENV === 'development' || process.argv.some(a => a === '--watch' || a.includes('--watch'));
495
+ if (isDev) {
496
+ const prodPorts = [defaultValues_1.DEFAULT_PORTS.DASHBOARD, defaultValues_1.DEFAULT_PORTS.LEADER];
497
+ if (prodPorts.includes(cfg.dashboardPort)) {
498
+ process.stderr.write(`[startup] FATAL: Dev server refusing to start on production port ${cfg.dashboardPort}.\n` +
499
+ `[startup] Production dashboard default is ${defaultValues_1.DEFAULT_PORTS.DASHBOARD}, dev default is ${defaultValues_1.DEFAULT_PORTS.DASHBOARD_DEV}.\n` +
500
+ `[startup] Set INDEX_SERVER_DASHBOARD_PORT=${defaultValues_1.DEFAULT_PORTS.DASHBOARD_DEV} or remove NODE_ENV=development to use production ports.\n`);
501
+ process.exit(1);
502
+ }
503
+ process.stderr.write(`[startup] Dev mode: dashboard port ${cfg.dashboardPort} (prod=${defaultValues_1.DEFAULT_PORTS.DASHBOARD})\n`);
504
+ }
505
+ const dash = await startDashboard(cfg);
506
+ if (dash) {
507
+ process.stderr.write(`[startup] Dashboard server started successfully\n`);
508
+ process.stderr.write(`[startup] Dashboard URL: ${dash.url}\n`);
509
+ process.stderr.write(`[startup] Dashboard host: ${cfg.dashboardHost}\n`);
510
+ process.stderr.write(`[startup] Dashboard port: ${dash.url.split(':').pop()?.replace('/', '') || 'unknown'}\n`);
511
+ process.stderr.write(`[startup] Dashboard WebSockets: enabled\n`);
512
+ process.stderr.write(`[startup] Dashboard access: Local admin interface (not for MCP clients)\n`);
513
+ // Instance discovery: clean stale port files, register this instance
514
+ try {
515
+ (0, InstanceManager_js_1.cleanStalePortFiles)();
516
+ const dashPort = parseInt(dash.url.split(':').pop()?.replace('/', '') || '0', 10);
517
+ if (dashPort > 0) {
518
+ (0, InstanceManager_js_1.writePortFile)(dashPort, cfg.dashboardHost);
519
+ process.stderr.write(`[startup] Instance port file written (pid=${process.pid} port=${dashPort})\n`);
520
+ }
521
+ // Background instance health sweep: periodically HTTP-ping other instances
522
+ // and remove port files for ones that no longer respond. Defense-in-depth
523
+ // against orphaned processes where stdin-close detection didn't fire.
524
+ const validateIntervalMs = 30_000;
525
+ const validateTimer = setInterval(() => {
526
+ (0, InstanceManager_js_1.validateInstances)().catch(() => { });
527
+ }, validateIntervalMs);
528
+ validateTimer.unref(); // Don't keep process alive just for validation
529
+ }
530
+ catch (e) {
531
+ process.stderr.write(`[startup] Instance registration failed: ${e}\n`);
532
+ }
533
+ }
534
+ else if (cfg.dashboard) {
535
+ process.stderr.write(`[startup] Dashboard enabled but failed to start (check port ${cfg.dashboardPort})\n`);
536
+ }
537
+ else {
538
+ process.stderr.write(`[startup] Dashboard disabled (set INDEX_SERVER_DASHBOARD=1 to enable)\n`);
539
+ }
540
+ // ---------------------------------------------------------------
541
+ // Multi-instance: Leader election + HTTP MCP transport [EXPERIMENTAL]
542
+ // ---------------------------------------------------------------
543
+ await (0, multiInstanceStartup_1.startMultiInstanceMode)(cfg.dashboardHost, runtime);
544
+ (0, backgroundServicesStartup_1.startOptionalMemoryMonitoring)(runtime);
545
+ await (0, startupDiagnostics_1.emitStartupDiagnostics)(runtime, __bufferEnabled, __earlyInitChunks);
546
+ await (0, sdkServer_1.startSdkServer)();
547
+ // Auto-confirm bootstrap (test harness opt-in). Executed after SDK start so index state
548
+ // exists; harmless if already confirmed or non-bootstrap instructions present.
549
+ try {
550
+ if (runtime.server.bootstrap.autoconfirm) {
551
+ const ok = (0, bootstrapGating_1.forceBootstrapConfirmForTests)('auto-confirm env');
552
+ if (ok && runtime.logging.diagnostics) {
553
+ try {
554
+ process.stderr.write('[bootstrap] auto-confirm applied (test env)\n');
555
+ }
556
+ catch { /* ignore */ }
557
+ }
558
+ }
559
+ }
560
+ catch { /* ignore */ }
561
+ (0, backgroundServicesStartup_1.startDeferredBackgroundServices)(runtime);
562
+ // Mark SDK ready & replay any buffered stdin chunks exactly once.
563
+ __sdkReady = true;
564
+ if (__bufferEnabled) {
565
+ try {
566
+ process.stdin.off('data', __earlyCapture);
567
+ }
568
+ catch { /* ignore */ }
569
+ if (__earlyInitChunks.length) {
570
+ const totalBytes = __earlyInitChunks.reduce((sum, c) => sum + c.length, 0);
571
+ const hasContentLength = __earlyInitChunks.some(c => c.toString('utf8').includes('Content-Length'));
572
+ const hasInitialize = __earlyInitChunks.some(c => c.toString('utf8').includes('"method"') && c.toString('utf8').includes('initialize'));
573
+ if (runtime.logging.diagnostics) {
574
+ try {
575
+ process.stderr.write(`[handshake-buffer] replay starting chunks=${__earlyInitChunks.length} totalBytes=${totalBytes} hasContentLength=${hasContentLength} hasInitialize=${hasInitialize}\n`);
576
+ }
577
+ catch { /* ignore */ }
578
+ }
579
+ try {
580
+ for (let i = 0; i < __earlyInitChunks.length; i++) {
581
+ const c = __earlyInitChunks[i];
582
+ process.stdin.emit('data', c);
583
+ if (runtime.logging.diagnostics && i === 0) {
584
+ const preview = c.toString('utf8').replace(/\r/g, '\\r').replace(/\n/g, '\\n').slice(0, 200);
585
+ try {
586
+ process.stderr.write(`[handshake-buffer] replayed chunk[0] size=${c.length} preview="${preview}"\n`);
587
+ }
588
+ catch { /* ignore */ }
589
+ }
590
+ }
591
+ }
592
+ catch (e) {
593
+ if (runtime.logging.diagnostics) {
594
+ try {
595
+ process.stderr.write(`[handshake-buffer] replay error: ${(e instanceof Error) ? e.message : String(e)}\n`);
596
+ }
597
+ catch { /* ignore */ }
598
+ }
599
+ }
600
+ // eslint-disable-next-line no-console
601
+ if (runtime.logging.diagnostics)
602
+ console.error(`[handshake-buffer] replayed ${__earlyInitChunks.length} early chunk(s)`);
603
+ __earlyInitChunks.length = 0;
604
+ }
605
+ else if (runtime.logging.diagnostics) {
606
+ try {
607
+ process.stderr.write(`[handshake-buffer] replay skipped (no buffered chunks)\n`);
608
+ }
609
+ catch { /* ignore */ }
610
+ }
611
+ }
612
+ process.stderr.write('[startup] SDK server started (stdio only)\n');
613
+ try {
614
+ (0, logger_1.logInfo)('[indexServer] Server started', { pid: process.pid, logFile: runtime.logging.file });
615
+ }
616
+ catch { /* ignore */ }
617
+ }
618
+ if (require.main === module) {
619
+ main();
620
+ }
@@ -0,0 +1,6 @@
1
+ import type { RuntimeConfig } from '../config/runtimeConfig';
2
+ /**
3
+ * Start multi-instance leader or follower behavior when enabled by runtime config.
4
+ * Preserves the existing leader election and follower proxy flow from the server entrypoint.
5
+ */
6
+ export declare function startMultiInstanceMode(dashboardHost: string, runtime: RuntimeConfig): Promise<void>;