@jagilber-org/index-server 1.19.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 (360) hide show
  1. package/CHANGELOG.md +1218 -0
  2. package/CODE_OF_CONDUCT.md +49 -0
  3. package/CONTRIBUTING.md +75 -0
  4. package/LICENSE +21 -0
  5. package/README.md +523 -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 +45 -0
  10. package/dist/config/dashboardConfig.js +63 -0
  11. package/dist/config/defaultValues.d.ts +61 -0
  12. package/dist/config/defaultValues.js +70 -0
  13. package/dist/config/dirConstants.d.ts +17 -0
  14. package/dist/config/dirConstants.js +28 -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 +145 -0
  18. package/dist/config/runtimeConfig.js +334 -0
  19. package/dist/config/serverConfig.d.ts +90 -0
  20. package/dist/config/serverConfig.js +164 -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 +2150 -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 +1466 -0
  29. package/dist/dashboard/client/js/admin.boot.js +359 -0
  30. package/dist/dashboard/client/js/admin.config.js +196 -0
  31. package/dist/dashboard/client/js/admin.embeddings.js +425 -0
  32. package/dist/dashboard/client/js/admin.graph.js +583 -0
  33. package/dist/dashboard/client/js/admin.instances.js +120 -0
  34. package/dist/dashboard/client/js/admin.instructions.js +552 -0
  35. package/dist/dashboard/client/js/admin.logs.js +113 -0
  36. package/dist/dashboard/client/js/admin.maintenance.js +354 -0
  37. package/dist/dashboard/client/js/admin.messaging.js +635 -0
  38. package/dist/dashboard/client/js/admin.monitor.js +181 -0
  39. package/dist/dashboard/client/js/admin.overview.js +221 -0
  40. package/dist/dashboard/client/js/admin.performance.js +61 -0
  41. package/dist/dashboard/client/js/admin.sessions.js +293 -0
  42. package/dist/dashboard/client/js/admin.sqlite.js +366 -0
  43. package/dist/dashboard/client/js/admin.utils.js +49 -0
  44. package/dist/dashboard/client/js/chart.umd.js +14 -0
  45. package/dist/dashboard/client/js/elk.bundled.js +6696 -0
  46. package/dist/dashboard/client/js/marked.umd.js +74 -0
  47. package/dist/dashboard/client/js/mermaid.min.js +3022 -0
  48. package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
  49. package/dist/dashboard/export/DataExporter.d.ts +169 -0
  50. package/dist/dashboard/export/DataExporter.js +737 -0
  51. package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
  52. package/dist/dashboard/export/exporters/csvExporter.js +46 -0
  53. package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
  54. package/dist/dashboard/export/exporters/exportTypes.js +5 -0
  55. package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
  56. package/dist/dashboard/export/exporters/jsonExporter.js +22 -0
  57. package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
  58. package/dist/dashboard/export/exporters/xmlExporter.js +175 -0
  59. package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
  60. package/dist/dashboard/integration/APIIntegration.js +95 -0
  61. package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
  62. package/dist/dashboard/security/SecurityMonitor.js +559 -0
  63. package/dist/dashboard/server/AdminPanel.d.ts +183 -0
  64. package/dist/dashboard/server/AdminPanel.js +792 -0
  65. package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
  66. package/dist/dashboard/server/AdminPanelConfig.js +80 -0
  67. package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
  68. package/dist/dashboard/server/AdminPanelState.js +214 -0
  69. package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
  70. package/dist/dashboard/server/ApiRoutes.js +149 -0
  71. package/dist/dashboard/server/DashboardServer.d.ts +49 -0
  72. package/dist/dashboard/server/DashboardServer.js +159 -0
  73. package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
  74. package/dist/dashboard/server/FileMetricsStorage.js +195 -0
  75. package/dist/dashboard/server/HttpTransport.d.ts +23 -0
  76. package/dist/dashboard/server/HttpTransport.js +116 -0
  77. package/dist/dashboard/server/InstanceManager.d.ts +53 -0
  78. package/dist/dashboard/server/InstanceManager.js +284 -0
  79. package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
  80. package/dist/dashboard/server/KnowledgeStore.js +105 -0
  81. package/dist/dashboard/server/LeaderElection.d.ts +81 -0
  82. package/dist/dashboard/server/LeaderElection.js +268 -0
  83. package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
  84. package/dist/dashboard/server/MetricsCollector.js +803 -0
  85. package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
  86. package/dist/dashboard/server/SessionPersistenceManager.js +457 -0
  87. package/dist/dashboard/server/ThinClient.d.ts +64 -0
  88. package/dist/dashboard/server/ThinClient.js +237 -0
  89. package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
  90. package/dist/dashboard/server/WebSocketManager.js +463 -0
  91. package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
  92. package/dist/dashboard/server/httpLifecycle.js +35 -0
  93. package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
  94. package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
  95. package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
  96. package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
  97. package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
  98. package/dist/dashboard/server/metricsAggregation.js +206 -0
  99. package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
  100. package/dist/dashboard/server/metricsSerializer.js +195 -0
  101. package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
  102. package/dist/dashboard/server/routes/admin.routes.js +596 -0
  103. package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
  104. package/dist/dashboard/server/routes/alerts.routes.js +93 -0
  105. package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
  106. package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
  107. package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
  108. package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
  109. package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
  110. package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
  111. package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
  112. package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
  113. package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
  114. package/dist/dashboard/server/routes/graph.routes.js +280 -0
  115. package/dist/dashboard/server/routes/index.d.ts +38 -0
  116. package/dist/dashboard/server/routes/index.js +194 -0
  117. package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
  118. package/dist/dashboard/server/routes/instances.routes.js +35 -0
  119. package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
  120. package/dist/dashboard/server/routes/instructions.routes.js +336 -0
  121. package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
  122. package/dist/dashboard/server/routes/knowledge.routes.js +82 -0
  123. package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
  124. package/dist/dashboard/server/routes/logs.routes.js +164 -0
  125. package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
  126. package/dist/dashboard/server/routes/messaging.routes.js +293 -0
  127. package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
  128. package/dist/dashboard/server/routes/metrics.routes.js +346 -0
  129. package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
  130. package/dist/dashboard/server/routes/scripts.routes.js +84 -0
  131. package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
  132. package/dist/dashboard/server/routes/sqlite.routes.js +569 -0
  133. package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
  134. package/dist/dashboard/server/routes/status.routes.js +183 -0
  135. package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
  136. package/dist/dashboard/server/routes/synthetic.routes.js +195 -0
  137. package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
  138. package/dist/dashboard/server/routes/tools.routes.js +46 -0
  139. package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
  140. package/dist/dashboard/server/routes/usage.routes.js +25 -0
  141. package/dist/dashboard/server/wsInit.d.ts +16 -0
  142. package/dist/dashboard/server/wsInit.js +35 -0
  143. package/dist/externalClientLib.d.ts +1 -0
  144. package/dist/externalClientLib.js +2 -0
  145. package/dist/minimal/index.d.ts +1 -0
  146. package/dist/minimal/index.js +140 -0
  147. package/dist/models/SessionPersistence.d.ts +115 -0
  148. package/dist/models/SessionPersistence.js +66 -0
  149. package/dist/models/instruction.d.ts +45 -0
  150. package/dist/models/instruction.js +2 -0
  151. package/dist/perf/benchmark.d.ts +1 -0
  152. package/dist/perf/benchmark.js +50 -0
  153. package/dist/portableClientWrapper.d.ts +1 -0
  154. package/dist/portableClientWrapper.js +2 -0
  155. package/dist/schemas/index.d.ts +128 -0
  156. package/dist/schemas/index.js +371 -0
  157. package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
  158. package/dist/scripts/runPerformanceBaseline.js +17 -0
  159. package/dist/server/handshakeManager.d.ts +25 -0
  160. package/dist/server/handshakeManager.js +472 -0
  161. package/dist/server/index-server.d.ts +56 -0
  162. package/dist/server/index-server.js +822 -0
  163. package/dist/server/registry.d.ts +44 -0
  164. package/dist/server/registry.js +236 -0
  165. package/dist/server/sdkServer.d.ts +8 -0
  166. package/dist/server/sdkServer.js +299 -0
  167. package/dist/server/shutdownGuard.d.ts +41 -0
  168. package/dist/server/shutdownGuard.js +52 -0
  169. package/dist/server/thin-client.d.ts +22 -0
  170. package/dist/server/thin-client.js +111 -0
  171. package/dist/server/transport.d.ts +41 -0
  172. package/dist/server/transport.js +312 -0
  173. package/dist/server/transportFactory.d.ts +21 -0
  174. package/dist/server/transportFactory.js +429 -0
  175. package/dist/services/atomicFs.d.ts +22 -0
  176. package/dist/services/atomicFs.js +103 -0
  177. package/dist/services/auditLog.d.ts +38 -0
  178. package/dist/services/auditLog.js +142 -0
  179. package/dist/services/autoBackup.d.ts +14 -0
  180. package/dist/services/autoBackup.js +171 -0
  181. package/dist/services/autoSplit.d.ts +32 -0
  182. package/dist/services/autoSplit.js +113 -0
  183. package/dist/services/backupZip.d.ts +25 -0
  184. package/dist/services/backupZip.js +110 -0
  185. package/dist/services/bootstrapGating.d.ts +123 -0
  186. package/dist/services/bootstrapGating.js +221 -0
  187. package/dist/services/canonical.d.ts +23 -0
  188. package/dist/services/canonical.js +65 -0
  189. package/dist/services/categoryRules.d.ts +7 -0
  190. package/dist/services/categoryRules.js +37 -0
  191. package/dist/services/classificationService.d.ts +42 -0
  192. package/dist/services/classificationService.js +168 -0
  193. package/dist/services/embeddingService.d.ts +62 -0
  194. package/dist/services/embeddingService.js +259 -0
  195. package/dist/services/errors.d.ts +22 -0
  196. package/dist/services/errors.js +31 -0
  197. package/dist/services/featureFlags.d.ts +25 -0
  198. package/dist/services/featureFlags.js +89 -0
  199. package/dist/services/features.d.ts +13 -0
  200. package/dist/services/features.js +35 -0
  201. package/dist/services/handlers/instructions.add.d.ts +1 -0
  202. package/dist/services/handlers/instructions.add.js +496 -0
  203. package/dist/services/handlers/instructions.groom.d.ts +1 -0
  204. package/dist/services/handlers/instructions.groom.js +523 -0
  205. package/dist/services/handlers/instructions.import.d.ts +1 -0
  206. package/dist/services/handlers/instructions.import.js +173 -0
  207. package/dist/services/handlers/instructions.patch.d.ts +1 -0
  208. package/dist/services/handlers/instructions.patch.js +167 -0
  209. package/dist/services/handlers/instructions.query.d.ts +163 -0
  210. package/dist/services/handlers/instructions.query.js +522 -0
  211. package/dist/services/handlers/instructions.reload.d.ts +1 -0
  212. package/dist/services/handlers/instructions.reload.js +13 -0
  213. package/dist/services/handlers/instructions.remove.d.ts +1 -0
  214. package/dist/services/handlers/instructions.remove.js +118 -0
  215. package/dist/services/handlers/instructions.shared.d.ts +31 -0
  216. package/dist/services/handlers/instructions.shared.js +124 -0
  217. package/dist/services/handlers.activation.d.ts +1 -0
  218. package/dist/services/handlers.activation.js +203 -0
  219. package/dist/services/handlers.bootstrap.d.ts +1 -0
  220. package/dist/services/handlers.bootstrap.js +38 -0
  221. package/dist/services/handlers.dashboardConfig.d.ts +34 -0
  222. package/dist/services/handlers.dashboardConfig.js +108 -0
  223. package/dist/services/handlers.diagnostics.d.ts +1 -0
  224. package/dist/services/handlers.diagnostics.js +64 -0
  225. package/dist/services/handlers.feedback.d.ts +15 -0
  226. package/dist/services/handlers.feedback.js +378 -0
  227. package/dist/services/handlers.gates.d.ts +1 -0
  228. package/dist/services/handlers.gates.js +46 -0
  229. package/dist/services/handlers.graph.d.ts +53 -0
  230. package/dist/services/handlers.graph.js +231 -0
  231. package/dist/services/handlers.help.d.ts +1 -0
  232. package/dist/services/handlers.help.js +119 -0
  233. package/dist/services/handlers.instructionSchema.d.ts +1 -0
  234. package/dist/services/handlers.instructionSchema.js +227 -0
  235. package/dist/services/handlers.instructions.d.ts +8 -0
  236. package/dist/services/handlers.instructions.js +14 -0
  237. package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
  238. package/dist/services/handlers.instructionsDiagnostics.js +14 -0
  239. package/dist/services/handlers.integrity.d.ts +1 -0
  240. package/dist/services/handlers.integrity.js +35 -0
  241. package/dist/services/handlers.manifest.d.ts +1 -0
  242. package/dist/services/handlers.manifest.js +24 -0
  243. package/dist/services/handlers.messaging.d.ts +12 -0
  244. package/dist/services/handlers.messaging.js +203 -0
  245. package/dist/services/handlers.metrics.d.ts +1 -0
  246. package/dist/services/handlers.metrics.js +43 -0
  247. package/dist/services/handlers.promote.d.ts +1 -0
  248. package/dist/services/handlers.promote.js +306 -0
  249. package/dist/services/handlers.prompt.d.ts +1 -0
  250. package/dist/services/handlers.prompt.js +7 -0
  251. package/dist/services/handlers.search.d.ts +69 -0
  252. package/dist/services/handlers.search.js +645 -0
  253. package/dist/services/handlers.testPrimitive.d.ts +1 -0
  254. package/dist/services/handlers.testPrimitive.js +5 -0
  255. package/dist/services/handlers.trace.d.ts +1 -0
  256. package/dist/services/handlers.trace.js +31 -0
  257. package/dist/services/handlers.usage.d.ts +1 -0
  258. package/dist/services/handlers.usage.js +11 -0
  259. package/dist/services/hotScore.d.ts +137 -0
  260. package/dist/services/hotScore.js +244 -0
  261. package/dist/services/indexContext.d.ts +117 -0
  262. package/dist/services/indexContext.js +968 -0
  263. package/dist/services/indexLoader.d.ts +44 -0
  264. package/dist/services/indexLoader.js +921 -0
  265. package/dist/services/indexRepository.d.ts +32 -0
  266. package/dist/services/indexRepository.js +71 -0
  267. package/dist/services/indexingService.d.ts +1 -0
  268. package/dist/services/indexingService.js +2 -0
  269. package/dist/services/instructions.dispatcher.d.ts +1 -0
  270. package/dist/services/instructions.dispatcher.js +231 -0
  271. package/dist/services/logPrefix.d.ts +1 -0
  272. package/dist/services/logPrefix.js +30 -0
  273. package/dist/services/logger.d.ts +52 -0
  274. package/dist/services/logger.js +268 -0
  275. package/dist/services/manifestManager.d.ts +82 -0
  276. package/dist/services/manifestManager.js +200 -0
  277. package/dist/services/messaging/agentMailbox.d.ts +60 -0
  278. package/dist/services/messaging/agentMailbox.js +353 -0
  279. package/dist/services/messaging/messagingPersistence.d.ts +20 -0
  280. package/dist/services/messaging/messagingPersistence.js +111 -0
  281. package/dist/services/messaging/messagingTypes.d.ts +150 -0
  282. package/dist/services/messaging/messagingTypes.js +66 -0
  283. package/dist/services/ownershipService.d.ts +1 -0
  284. package/dist/services/ownershipService.js +38 -0
  285. package/dist/services/performanceBaseline.d.ts +19 -0
  286. package/dist/services/performanceBaseline.js +210 -0
  287. package/dist/services/preflight.d.ts +12 -0
  288. package/dist/services/preflight.js +79 -0
  289. package/dist/services/promptReviewService.d.ts +44 -0
  290. package/dist/services/promptReviewService.js +101 -0
  291. package/dist/services/responseEnvelope.d.ts +6 -0
  292. package/dist/services/responseEnvelope.js +25 -0
  293. package/dist/services/seedBootstrap.d.ts +34 -0
  294. package/dist/services/seedBootstrap.js +427 -0
  295. package/dist/services/storage/factory.d.ts +17 -0
  296. package/dist/services/storage/factory.js +35 -0
  297. package/dist/services/storage/hashUtils.d.ts +11 -0
  298. package/dist/services/storage/hashUtils.js +35 -0
  299. package/dist/services/storage/index.d.ts +12 -0
  300. package/dist/services/storage/index.js +18 -0
  301. package/dist/services/storage/jsonFileStore.d.ts +32 -0
  302. package/dist/services/storage/jsonFileStore.js +241 -0
  303. package/dist/services/storage/migrationEngine.d.ts +35 -0
  304. package/dist/services/storage/migrationEngine.js +93 -0
  305. package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
  306. package/dist/services/storage/sqliteMessageStore.js +146 -0
  307. package/dist/services/storage/sqliteSchema.d.ts +12 -0
  308. package/dist/services/storage/sqliteSchema.js +122 -0
  309. package/dist/services/storage/sqliteStore.d.ts +41 -0
  310. package/dist/services/storage/sqliteStore.js +339 -0
  311. package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
  312. package/dist/services/storage/sqliteUsageStore.js +94 -0
  313. package/dist/services/storage/types.d.ts +171 -0
  314. package/dist/services/storage/types.js +12 -0
  315. package/dist/services/toolHandlers.d.ts +23 -0
  316. package/dist/services/toolHandlers.js +50 -0
  317. package/dist/services/toolRegistry.d.ts +20 -0
  318. package/dist/services/toolRegistry.js +490 -0
  319. package/dist/services/toolRegistry.zod.d.ts +10 -0
  320. package/dist/services/toolRegistry.zod.js +323 -0
  321. package/dist/services/tracing.d.ts +26 -0
  322. package/dist/services/tracing.js +260 -0
  323. package/dist/services/usageBuckets.d.ts +161 -0
  324. package/dist/services/usageBuckets.js +364 -0
  325. package/dist/services/validationService.d.ts +38 -0
  326. package/dist/services/validationService.js +125 -0
  327. package/dist/utils/BufferRing.d.ts +203 -0
  328. package/dist/utils/BufferRing.js +551 -0
  329. package/dist/utils/BufferRingExamples.d.ts +55 -0
  330. package/dist/utils/BufferRingExamples.js +188 -0
  331. package/dist/utils/envUtils.d.ts +42 -0
  332. package/dist/utils/envUtils.js +80 -0
  333. package/dist/utils/memoryMonitor.d.ts +83 -0
  334. package/dist/utils/memoryMonitor.js +275 -0
  335. package/dist/versioning/schemaVersion.d.ts +6 -0
  336. package/dist/versioning/schemaVersion.js +93 -0
  337. package/package.json +134 -0
  338. package/schemas/README.md +13 -0
  339. package/schemas/feedback-entry.schema.json +27 -0
  340. package/schemas/graph-export-v2.schema.json +60 -0
  341. package/schemas/index-server.code-schema.json +38477 -0
  342. package/schemas/instruction.schema.json +262 -0
  343. package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
  344. package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
  345. package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
  346. package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
  347. package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
  348. package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
  349. package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
  350. package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
  351. package/schemas/json-schema/instruction-content-type.schema.json +17 -0
  352. package/schemas/json-schema/instruction-instruction-entry.schema.json +206 -0
  353. package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
  354. package/schemas/manifest.json +78 -0
  355. package/schemas/manifest.schema.json +33 -0
  356. package/schemas/usage-batch.schema.json +16 -0
  357. package/schemas/usage-buckets.schema.json +30 -0
  358. package/schemas/usage-event.schema.json +17 -0
  359. package/scripts/copy-dashboard-assets.mjs +170 -0
  360. package/scripts/setup-hooks.cjs +28 -0
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ /**
3
+ * InstanceManager - Discovers running Index Server dashboard instances.
4
+ *
5
+ * Each dashboard writes a small JSON port file on startup and removes it on
6
+ * shutdown. Other instances (and the `/api/instances` endpoint) read these
7
+ * files to present a list of all active servers the user can switch between.
8
+ *
9
+ * Port file location: `<stateDir>/dashboard-<pid>.json`
10
+ * Default stateDir: `<cwd>/data/state` (override via INDEX_SERVER_STATE_DIR)
11
+ */
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.writePortFile = writePortFile;
17
+ exports.removePortFile = removePortFile;
18
+ exports.cleanStalePortFiles = cleanStalePortFiles;
19
+ exports.getActiveInstances = getActiveInstances;
20
+ exports.validateInstances = validateInstances;
21
+ exports._resetStateDir = _resetStateDir;
22
+ const fs_1 = __importDefault(require("fs"));
23
+ const path_1 = __importDefault(require("path"));
24
+ const http_1 = __importDefault(require("http"));
25
+ const https_1 = __importDefault(require("https"));
26
+ const runtimeConfig_1 = require("../../config/runtimeConfig");
27
+ const PORT_FILE_PREFIX = 'dashboard-';
28
+ const PORT_FILE_SUFFIX = '.json';
29
+ let _stateDir;
30
+ /** Track the port/host/protocol this process registered so self-healing can recreate the file. */
31
+ let _registeredPort = 0;
32
+ let _registeredHost = '';
33
+ /** Resolve the state directory (cached after first call). */
34
+ function getStateDir() {
35
+ if (!_stateDir) {
36
+ _stateDir = (0, runtimeConfig_1.getRuntimeConfig)().dashboard.admin.stateDir;
37
+ }
38
+ return _stateDir;
39
+ }
40
+ /** Build the port file path for a given PID. */
41
+ function portFilePath(pid) {
42
+ return path_1.default.join(getStateDir(), `${PORT_FILE_PREFIX}${pid}${PORT_FILE_SUFFIX}`);
43
+ }
44
+ /** Ensure the state directory exists. */
45
+ function ensureStateDir() {
46
+ const dir = getStateDir();
47
+ if (!fs_1.default.existsSync(dir)) {
48
+ fs_1.default.mkdirSync(dir, { recursive: true });
49
+ }
50
+ }
51
+ /**
52
+ * Write a port file for the current process.
53
+ * Called once when the dashboard HTTP server starts listening.
54
+ */
55
+ function writePortFile(port, host) {
56
+ ensureStateDir();
57
+ const tlsEnabled = (0, runtimeConfig_1.getRuntimeConfig)().dashboard.http.tls.enabled;
58
+ const entry = {
59
+ pid: process.pid,
60
+ port,
61
+ host,
62
+ startedAt: new Date().toISOString(),
63
+ protocol: tlsEnabled ? 'https' : 'http',
64
+ };
65
+ const filePath = portFilePath(process.pid);
66
+ fs_1.default.writeFileSync(filePath, JSON.stringify(entry, null, 2), 'utf8');
67
+ _registeredPort = port;
68
+ _registeredHost = host;
69
+ }
70
+ /**
71
+ * Remove the port file for the current process.
72
+ * Called during graceful shutdown.
73
+ */
74
+ function removePortFile() {
75
+ try {
76
+ const filePath = portFilePath(process.pid);
77
+ if (fs_1.default.existsSync(filePath)) {
78
+ fs_1.default.unlinkSync(filePath);
79
+ }
80
+ }
81
+ catch {
82
+ // Best-effort removal; ignore errors during shutdown.
83
+ }
84
+ }
85
+ /**
86
+ * Check whether a process with the given PID is still alive.
87
+ * Uses signal-0 which doesn't actually send a signal but checks existence.
88
+ */
89
+ function isProcessAlive(pid) {
90
+ try {
91
+ process.kill(pid, 0);
92
+ return true;
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ }
98
+ /**
99
+ * Remove stale port files for processes that no longer exist.
100
+ * Called on startup to clean up after crashes.
101
+ */
102
+ function cleanStalePortFiles() {
103
+ const dir = getStateDir();
104
+ if (!fs_1.default.existsSync(dir))
105
+ return;
106
+ let files;
107
+ try {
108
+ files = fs_1.default.readdirSync(dir);
109
+ }
110
+ catch {
111
+ return;
112
+ }
113
+ for (const file of files) {
114
+ if (!file.startsWith(PORT_FILE_PREFIX) || !file.endsWith(PORT_FILE_SUFFIX))
115
+ continue;
116
+ const pidStr = file.slice(PORT_FILE_PREFIX.length, -PORT_FILE_SUFFIX.length);
117
+ const pid = parseInt(pidStr, 10);
118
+ if (!Number.isFinite(pid) || pid <= 0)
119
+ continue;
120
+ if (!isProcessAlive(pid)) {
121
+ try {
122
+ fs_1.default.unlinkSync(path_1.default.join(dir, file));
123
+ }
124
+ catch {
125
+ // Ignore removal errors.
126
+ }
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Get a list of all active dashboard instances by reading port files.
132
+ * Stale files (dead PIDs) are cleaned up automatically.
133
+ */
134
+ function getActiveInstances() {
135
+ const dir = getStateDir();
136
+ if (!fs_1.default.existsSync(dir))
137
+ return [];
138
+ let files;
139
+ try {
140
+ files = fs_1.default.readdirSync(dir);
141
+ }
142
+ catch {
143
+ return [];
144
+ }
145
+ const instances = [];
146
+ for (const file of files) {
147
+ if (!file.startsWith(PORT_FILE_PREFIX) || !file.endsWith(PORT_FILE_SUFFIX))
148
+ continue;
149
+ const fullPath = path_1.default.join(dir, file);
150
+ try {
151
+ const raw = fs_1.default.readFileSync(fullPath, 'utf8');
152
+ const entry = JSON.parse(raw);
153
+ // Validate expected shape
154
+ if (typeof entry.pid !== 'number' || typeof entry.port !== 'number')
155
+ continue;
156
+ const alive = isProcessAlive(entry.pid);
157
+ if (!alive) {
158
+ // Clean up stale file
159
+ try {
160
+ fs_1.default.unlinkSync(fullPath);
161
+ }
162
+ catch { /* ignore */ }
163
+ continue;
164
+ }
165
+ instances.push({
166
+ ...entry,
167
+ current: entry.pid === process.pid,
168
+ alive,
169
+ });
170
+ }
171
+ catch {
172
+ // Skip malformed files.
173
+ }
174
+ }
175
+ // Sort: current instance first, then by port ascending
176
+ instances.sort((a, b) => {
177
+ if (a.current && !b.current)
178
+ return -1;
179
+ if (!a.current && b.current)
180
+ return 1;
181
+ return a.port - b.port;
182
+ });
183
+ // Self-healing: if this process registered a port but has no port file, recreate it.
184
+ if (_registeredPort > 0 && !instances.some(i => i.current)) {
185
+ try {
186
+ writePortFile(_registeredPort, _registeredHost);
187
+ instances.unshift({
188
+ pid: process.pid,
189
+ port: _registeredPort,
190
+ host: _registeredHost,
191
+ startedAt: new Date().toISOString(),
192
+ current: true,
193
+ alive: true,
194
+ });
195
+ }
196
+ catch { /* ignore self-heal failures */ }
197
+ }
198
+ return instances;
199
+ }
200
+ /**
201
+ * Ping an instance to verify it is a live MCP dashboard server.
202
+ * Uses HTTPS when the port file indicates the instance runs with TLS.
203
+ * Returns true if the instance responds within the timeout, false otherwise.
204
+ */
205
+ function pingInstance(host, port, protocol = 'http', timeoutMs = 3000) {
206
+ return new Promise((resolve) => {
207
+ const transport = protocol === 'https' ? https_1.default : http_1.default;
208
+ const opts = {
209
+ hostname: host || '127.0.0.1',
210
+ port,
211
+ path: '/api/instances',
212
+ timeout: timeoutMs,
213
+ ...(protocol === 'https' ? { rejectUnauthorized: false } : {}),
214
+ };
215
+ const req = transport.get(opts, (res) => {
216
+ // Any HTTP response means the server is alive (even 4xx/5xx)
217
+ res.resume(); // drain the response
218
+ resolve(true);
219
+ });
220
+ req.on('error', () => resolve(false));
221
+ req.on('timeout', () => { req.destroy(); resolve(false); });
222
+ });
223
+ }
224
+ /**
225
+ * Validate all registered instances by HTTP health check.
226
+ * Removes port files for instances that are alive (PID exists) but no longer
227
+ * respond on their registered port -- i.e., orphaned processes whose dashboard
228
+ * HTTP server has shut down or whose PID was recycled.
229
+ *
230
+ * Called periodically from a background timer (every ~30s). Skips the current
231
+ * process (always considered valid).
232
+ */
233
+ async function validateInstances() {
234
+ const dir = getStateDir();
235
+ if (!fs_1.default.existsSync(dir))
236
+ return;
237
+ let files;
238
+ try {
239
+ files = fs_1.default.readdirSync(dir);
240
+ }
241
+ catch {
242
+ return;
243
+ }
244
+ for (const file of files) {
245
+ if (!file.startsWith(PORT_FILE_PREFIX) || !file.endsWith(PORT_FILE_SUFFIX))
246
+ continue;
247
+ const fullPath = path_1.default.join(dir, file);
248
+ try {
249
+ const raw = fs_1.default.readFileSync(fullPath, 'utf8');
250
+ const entry = JSON.parse(raw);
251
+ if (typeof entry.pid !== 'number' || typeof entry.port !== 'number')
252
+ continue;
253
+ // Skip current process -- we know we're alive
254
+ if (entry.pid === process.pid)
255
+ continue;
256
+ // First: fast PID check. If process is dead, clean up immediately.
257
+ if (!isProcessAlive(entry.pid)) {
258
+ try {
259
+ fs_1.default.unlinkSync(fullPath);
260
+ }
261
+ catch { /* ignore */ }
262
+ continue;
263
+ }
264
+ // PID is alive, but verify it's actually serving HTTP on the expected port.
265
+ // This catches orphaned processes (alive but not functional) and recycled PIDs.
266
+ const proto = entry.protocol || 'http';
267
+ const responds = await pingInstance(entry.host, entry.port, proto);
268
+ if (!responds) {
269
+ try {
270
+ process.stderr.write(`[instance-validate] removing stale port file: pid=${entry.pid} port=${entry.port} (HTTP unreachable)\n`);
271
+ fs_1.default.unlinkSync(fullPath);
272
+ }
273
+ catch { /* ignore */ }
274
+ }
275
+ }
276
+ catch {
277
+ // Skip malformed files.
278
+ }
279
+ }
280
+ }
281
+ /** Reset the cached state dir (useful for testing). */
282
+ function _resetStateDir() {
283
+ _stateDir = undefined;
284
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * KnowledgeStore - In-memory + file-backed key-value store
3
+ * for cross-repo agent performance insights.
4
+ *
5
+ * Persists to {dataDir}/knowledge-store.json.
6
+ * Requested by mcp-agent-manager (feedback d664a9239632f287).
7
+ */
8
+ export interface KnowledgeEntry {
9
+ key: string;
10
+ content: string;
11
+ metadata: Record<string, unknown>;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ }
15
+ declare class KnowledgeStore {
16
+ private entries;
17
+ private filePath;
18
+ constructor(dataDir?: string);
19
+ private loadFromDisk;
20
+ private saveToDisk;
21
+ upsert(key: string, content: string, metadata?: Record<string, unknown>): KnowledgeEntry;
22
+ get(key: string): KnowledgeEntry | undefined;
23
+ search(query: string, options?: {
24
+ category?: string;
25
+ limit?: number;
26
+ }): KnowledgeEntry[];
27
+ delete(key: string): boolean;
28
+ count(): number;
29
+ }
30
+ export declare function getKnowledgeStore(): KnowledgeStore;
31
+ /** Reset singleton — for tests only */
32
+ export declare function resetKnowledgeStore(): void;
33
+ /** Create a standalone store with custom data dir — for tests */
34
+ export declare function createKnowledgeStore(dataDir: string): KnowledgeStore;
35
+ export {};
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * KnowledgeStore - In-memory + file-backed key-value store
4
+ * for cross-repo agent performance insights.
5
+ *
6
+ * Persists to {dataDir}/knowledge-store.json.
7
+ * Requested by mcp-agent-manager (feedback d664a9239632f287).
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.getKnowledgeStore = getKnowledgeStore;
14
+ exports.resetKnowledgeStore = resetKnowledgeStore;
15
+ exports.createKnowledgeStore = createKnowledgeStore;
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const runtimeConfig_1 = require("../../config/runtimeConfig");
19
+ class KnowledgeStore {
20
+ entries = new Map();
21
+ filePath;
22
+ constructor(dataDir) {
23
+ const dir = dataDir || (0, runtimeConfig_1.getRuntimeConfig)().index?.baseDir || path_1.default.join(process.cwd(), 'data');
24
+ this.filePath = path_1.default.join(dir, 'knowledge-store.json');
25
+ this.loadFromDisk();
26
+ }
27
+ loadFromDisk() {
28
+ try {
29
+ if (fs_1.default.existsSync(this.filePath)) {
30
+ const raw = JSON.parse(fs_1.default.readFileSync(this.filePath, 'utf-8'));
31
+ if (Array.isArray(raw)) {
32
+ for (const entry of raw) {
33
+ if (entry.key)
34
+ this.entries.set(entry.key, entry);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ catch { /* ignore corrupt/missing file */ }
40
+ }
41
+ saveToDisk() {
42
+ try {
43
+ const dir = path_1.default.dirname(this.filePath);
44
+ if (!fs_1.default.existsSync(dir))
45
+ fs_1.default.mkdirSync(dir, { recursive: true });
46
+ fs_1.default.writeFileSync(this.filePath, JSON.stringify(Array.from(this.entries.values()), null, 2));
47
+ }
48
+ catch { /* ignore write errors */ }
49
+ }
50
+ upsert(key, content, metadata = {}) {
51
+ const now = new Date().toISOString();
52
+ const existing = this.entries.get(key);
53
+ const entry = {
54
+ key,
55
+ content,
56
+ metadata: { ...metadata },
57
+ createdAt: existing?.createdAt || now,
58
+ updatedAt: now,
59
+ };
60
+ this.entries.set(key, entry);
61
+ this.saveToDisk();
62
+ return entry;
63
+ }
64
+ get(key) {
65
+ return this.entries.get(key);
66
+ }
67
+ search(query, options) {
68
+ const q = query.toLowerCase();
69
+ const limit = options?.limit || 20;
70
+ const results = [];
71
+ for (const entry of this.entries.values()) {
72
+ if (results.length >= limit)
73
+ break;
74
+ if (options?.category && entry.metadata?.category !== options.category)
75
+ continue;
76
+ const searchable = [entry.key, entry.content, ...Object.values(entry.metadata).map(v => String(v))].join(' ').toLowerCase();
77
+ if (searchable.includes(q))
78
+ results.push(entry);
79
+ }
80
+ return results;
81
+ }
82
+ delete(key) {
83
+ const existed = this.entries.delete(key);
84
+ if (existed)
85
+ this.saveToDisk();
86
+ return existed;
87
+ }
88
+ count() {
89
+ return this.entries.size;
90
+ }
91
+ }
92
+ let instance = null;
93
+ function getKnowledgeStore() {
94
+ if (!instance)
95
+ instance = new KnowledgeStore();
96
+ return instance;
97
+ }
98
+ /** Reset singleton — for tests only */
99
+ function resetKnowledgeStore() {
100
+ instance = null;
101
+ }
102
+ /** Create a standalone store with custom data dir — for tests */
103
+ function createKnowledgeStore(dataDir) {
104
+ return new KnowledgeStore(dataDir);
105
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * LeaderElection - Manages leader/follower roles for multi-instance MCP servers.
3
+ *
4
+ * **EXPERIMENTAL** — APIs, configuration, and behavior may change.
5
+ *
6
+ * Uses a lock file + PID-based election strategy:
7
+ * - Leader is the instance that successfully acquires the lock file
8
+ * - On leader death, the surviving instance with the lowest PID promotes
9
+ * - Heartbeat mechanism keeps leader.lock fresh (stale = dead leader)
10
+ *
11
+ * Lock file location: `<stateDir>/leader.lock`
12
+ */
13
+ import { EventEmitter } from 'events';
14
+ export type InstanceRole = 'leader' | 'follower' | 'standalone' | 'candidate';
15
+ export interface LeaderLockEntry {
16
+ pid: number;
17
+ port: number;
18
+ host: string;
19
+ startedAt: string;
20
+ heartbeat: string;
21
+ }
22
+ export interface LeaderElectionOptions {
23
+ stateDir: string;
24
+ port: number;
25
+ host: string;
26
+ heartbeatIntervalMs?: number;
27
+ staleThresholdMs?: number;
28
+ }
29
+ export declare class LeaderElection extends EventEmitter {
30
+ private readonly stateDir;
31
+ private readonly port;
32
+ private readonly host;
33
+ private readonly heartbeatIntervalMs;
34
+ private readonly staleThresholdMs;
35
+ private _role;
36
+ private heartbeatTimer;
37
+ private watchTimer;
38
+ private _leaderInfo;
39
+ private _stopped;
40
+ constructor(options: LeaderElectionOptions);
41
+ get role(): InstanceRole;
42
+ get leaderInfo(): LeaderLockEntry | null;
43
+ get lockFilePath(): string;
44
+ /**
45
+ * Attempt to become leader via atomic lock file creation.
46
+ * Returns true if this instance is now the leader.
47
+ */
48
+ tryAcquireLock(): boolean;
49
+ /**
50
+ * Check existing lock file. If holder is dead or stale, try to take over.
51
+ */
52
+ private handleExistingLock;
53
+ /**
54
+ * Start the election process and heartbeat/watch timers.
55
+ */
56
+ start(): InstanceRole;
57
+ /**
58
+ * Stop all timers and release the lock if leader.
59
+ */
60
+ stop(): void;
61
+ /**
62
+ * Update the heartbeat timestamp in the lock file (leader only).
63
+ * Uses atomic write-to-temp-then-rename to prevent corruption if
64
+ * the process dies mid-write.
65
+ */
66
+ updateHeartbeat(): void;
67
+ /**
68
+ * Remove the lock file (leader relinquishing).
69
+ */
70
+ releaseLock(): void;
71
+ /**
72
+ * Check if the current leader is still alive.
73
+ */
74
+ isLeaderAlive(): boolean;
75
+ private startHeartbeat;
76
+ private startWatcher;
77
+ private isLeaderStale;
78
+ private buildLockEntry;
79
+ private ensureStateDir;
80
+ isProcessAlive(pid: number): boolean;
81
+ }