@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,448 @@
1
+ "use strict";
2
+ /**
3
+ * WebSocketManager - Phase 1 Dashboard Foundation
4
+ *
5
+ * Manages WebSocket connections for real-time dashboard updates.
6
+ * Provides bidirectional communication between dashboard clients and server.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.WebSocketManager = void 0;
10
+ exports.getWebSocketManager = getWebSocketManager;
11
+ exports.setWebSocketManager = setWebSocketManager;
12
+ const ws_1 = require("ws");
13
+ const crypto_1 = require("crypto");
14
+ const MetricsCollector_js_1 = require("./MetricsCollector.js");
15
+ const SessionPersistenceManager_1 = require("./SessionPersistenceManager");
16
+ const runtimeConfig_js_1 = require("../../config/runtimeConfig.js");
17
+ const logger_js_1 = require("../../services/logger.js");
18
+ const adminAuth_js_1 = require("./routes/adminAuth.js");
19
+ class WebSocketManager {
20
+ wss = null;
21
+ clients = new Set();
22
+ options;
23
+ pingTimer;
24
+ persistenceManager;
25
+ constructor(options = {}) {
26
+ this.options = {
27
+ path: options.path ?? '/ws',
28
+ maxConnections: options.maxConnections ?? 100,
29
+ pingInterval: options.pingInterval ?? 30000, // 30 seconds
30
+ pongTimeout: options.pongTimeout ?? 5000, // 5 seconds
31
+ };
32
+ // Initialize session persistence manager
33
+ this.persistenceManager = new SessionPersistenceManager_1.SessionPersistenceManager();
34
+ }
35
+ /**
36
+ * Initialize WebSocket server
37
+ */
38
+ initialize(server) {
39
+ this.wss = new ws_1.WebSocketServer({
40
+ server,
41
+ path: this.options.path,
42
+ verifyClient: (info, callback) => {
43
+ const adminKey = (0, runtimeConfig_js_1.getRuntimeConfig)().dashboard.http.adminApiKey;
44
+ if (!adminKey) {
45
+ const addr = info.req.socket.remoteAddress || '';
46
+ callback((0, adminAuth_js_1.isLoopbackHost)(addr), 403, 'WebSocket access restricted to localhost');
47
+ return;
48
+ }
49
+ const url = new URL(info.req.url || '', 'http://localhost');
50
+ const token = url.searchParams.get('token') || '';
51
+ const authHeader = info.req.headers['authorization'] || '';
52
+ const bearerToken = authHeader.replace(/^Bearer\s+/i, '');
53
+ callback((0, adminAuth_js_1.constantTimeKeyMatch)(token, adminKey) || (0, adminAuth_js_1.constantTimeKeyMatch)(bearerToken, adminKey), 401, 'WebSocket authentication required');
54
+ },
55
+ });
56
+ this.wss.on('connection', (ws) => {
57
+ this.handleConnection(ws);
58
+ });
59
+ this.wss.on('error', (error) => {
60
+ (0, logger_js_1.logError)('[WebSocketManager] Server error', error);
61
+ });
62
+ // Start ping/pong heartbeat
63
+ this.startHeartbeat();
64
+ (0, logger_js_1.logInfo)(`[WebSocketManager] Server initialized on path ${this.options.path}`);
65
+ }
66
+ /**
67
+ * Broadcast message to all connected clients
68
+ */
69
+ broadcast(message) {
70
+ if (this.clients.size === 0)
71
+ return;
72
+ const payload = JSON.stringify(message);
73
+ const deadClients = [];
74
+ this.clients.forEach((ws) => {
75
+ if (ws.readyState === ws_1.WebSocket.OPEN) {
76
+ try {
77
+ ws.send(payload);
78
+ }
79
+ catch (error) {
80
+ (0, logger_js_1.logError)('[WebSocketManager] Send error', error);
81
+ deadClients.push(ws);
82
+ }
83
+ }
84
+ else {
85
+ deadClients.push(ws);
86
+ }
87
+ });
88
+ // Clean up dead connections
89
+ deadClients.forEach((ws) => {
90
+ this.clients.delete(ws);
91
+ });
92
+ }
93
+ /**
94
+ * Send message to specific client
95
+ */
96
+ sendToClient(client, message) {
97
+ if (client.readyState === ws_1.WebSocket.OPEN) {
98
+ try {
99
+ client.send(JSON.stringify(message));
100
+ }
101
+ catch (error) {
102
+ (0, logger_js_1.logError)('[WebSocketManager] Send to client error', error);
103
+ this.clients.delete(client);
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Get connected client count
109
+ */
110
+ getClientCount() {
111
+ return this.clients.size;
112
+ }
113
+ /**
114
+ * Get all connected clients
115
+ */
116
+ getClients() {
117
+ return Array.from(this.clients);
118
+ }
119
+ /**
120
+ * Close all connections and cleanup
121
+ */
122
+ close() {
123
+ if (this.pingTimer) {
124
+ clearInterval(this.pingTimer);
125
+ this.pingTimer = undefined;
126
+ }
127
+ this.clients.forEach((ws) => {
128
+ try {
129
+ ws.close(1000, 'Server shutting down');
130
+ }
131
+ catch (error) {
132
+ (0, logger_js_1.logError)('[WebSocketManager] Close error', error);
133
+ }
134
+ });
135
+ this.clients.clear();
136
+ if (this.wss) {
137
+ this.wss.close();
138
+ this.wss = null;
139
+ }
140
+ (0, logger_js_1.logInfo)('[WebSocketManager] Server closed');
141
+ }
142
+ handleConnection(ws) {
143
+ // Add to client set
144
+ this.clients.add(ws);
145
+ // Assign client identity & timestamps
146
+ try {
147
+ ws.clientId = this.safeGenerateClientId();
148
+ }
149
+ catch {
150
+ // Fallback simple id
151
+ ws.clientId = `client-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
152
+ }
153
+ ws.connectedAt = Date.now();
154
+ ws.lastActivity = Date.now();
155
+ // Extract client info from request if available
156
+ try {
157
+ const request = ws._socket?.remoteAddress;
158
+ if (request) {
159
+ ws.ipAddress = request;
160
+ }
161
+ // Note: User-Agent would come from upgrade request headers if needed
162
+ }
163
+ catch {
164
+ // Ignore if not available
165
+ }
166
+ // Record connection in metrics
167
+ try {
168
+ (0, MetricsCollector_js_1.getMetricsCollector)().recordConnection(ws.clientId);
169
+ }
170
+ catch (err) {
171
+ (0, logger_js_1.logError)('[WebSocketManager] metrics recordConnection failed', err);
172
+ }
173
+ // Persist connection state
174
+ this.persistConnectionState().catch((error) => {
175
+ (0, logger_js_1.logError)('[WebSocketManager] Failed to persist WebSocket connection state', error);
176
+ });
177
+ // Broadcast connection event
178
+ this.broadcast({
179
+ type: 'client_connect',
180
+ timestamp: Date.now(),
181
+ data: { clientId: ws.clientId, timestamp: ws.connectedAt }
182
+ });
183
+ // Setup client event handlers
184
+ ws.on('message', (data) => {
185
+ try {
186
+ // Update activity timestamp
187
+ ws.lastActivity = Date.now();
188
+ const message = JSON.parse(data.toString());
189
+ this.handleClientMessage(ws, message);
190
+ }
191
+ catch (error) {
192
+ (0, logger_js_1.logError)('[WebSocketManager] Invalid message format', error);
193
+ this.sendError(ws, 'Invalid message format');
194
+ }
195
+ });
196
+ ws.on('close', (code, reason) => {
197
+ this.clients.delete(ws);
198
+ const disconnectTs = Date.now();
199
+ const duration = ws.connectedAt ? disconnectTs - ws.connectedAt : 0;
200
+ (0, logger_js_1.logInfo)('[WebSocketManager] Client disconnected', { code, reason: reason.toString(), id: ws.clientId, durationMs: duration, totalClients: this.clients.size });
201
+ if (ws.clientId) {
202
+ try {
203
+ (0, MetricsCollector_js_1.getMetricsCollector)().recordDisconnection(ws.clientId);
204
+ }
205
+ catch (err) {
206
+ (0, logger_js_1.logError)('[WebSocketManager] metrics recordDisconnection failed', err);
207
+ }
208
+ this.broadcast({
209
+ type: 'client_disconnect',
210
+ timestamp: disconnectTs,
211
+ data: { clientId: ws.clientId, timestamp: disconnectTs, duration }
212
+ });
213
+ }
214
+ // Persist connection state after disconnect
215
+ this.persistConnectionState().catch((error) => {
216
+ (0, logger_js_1.logError)('[WebSocketManager] Failed to persist WebSocket state after disconnect', error);
217
+ });
218
+ // Push fresh metrics snapshot after disconnect
219
+ this.broadcastMetricsSnapshot();
220
+ });
221
+ ws.on('error', (error) => {
222
+ this.clients.delete(ws);
223
+ (0, logger_js_1.logError)(`[WebSocketManager] Client error (${ws.clientId})`, error);
224
+ });
225
+ ws.on('pong', () => {
226
+ // Mark as alive (handled by ping/pong mechanism)
227
+ ws.isAlive = true;
228
+ });
229
+ // Send welcome message
230
+ this.sendToClient(ws, {
231
+ type: 'welcome',
232
+ timestamp: Date.now(),
233
+ data: {
234
+ message: 'Connected to Index Server Dashboard',
235
+ version: '1.0.0',
236
+ features: ['real-time-metrics', 'tool-monitoring', 'admin-controls'],
237
+ },
238
+ });
239
+ (0, logger_js_1.logInfo)('[WebSocketManager] Client connected', { totalClients: this.clients.size });
240
+ // Send immediate metrics snapshot to the new client
241
+ this.sendCurrentMetrics(ws);
242
+ // And broadcast updated snapshot to all clients (active connection count changed)
243
+ this.broadcastMetricsSnapshot();
244
+ }
245
+ handleClientMessage(client, message) {
246
+ try {
247
+ switch (message.type) {
248
+ case 'ping':
249
+ this.sendToClient(client, {
250
+ type: 'pong',
251
+ timestamp: Date.now(),
252
+ data: message.data,
253
+ });
254
+ break;
255
+ case 'subscribe': {
256
+ // Future: Handle subscription to specific events
257
+ const events = message.data?.events || ['all'];
258
+ this.sendToClient(client, {
259
+ type: 'subscribed',
260
+ timestamp: Date.now(),
261
+ data: { events },
262
+ });
263
+ break;
264
+ }
265
+ case 'get_metrics':
266
+ this.sendCurrentMetrics(client);
267
+ break;
268
+ default:
269
+ (0, logger_js_1.logWarn)('[WebSocketManager] Unknown message type', message.type);
270
+ this.sendError(client, `Unknown message type: ${message.type}`);
271
+ }
272
+ }
273
+ catch (error) {
274
+ (0, logger_js_1.logError)('[WebSocketManager] Message handling error', error);
275
+ this.sendError(client, 'Message handling error');
276
+ }
277
+ }
278
+ sendError(client, message) {
279
+ this.sendToClient(client, {
280
+ type: 'error',
281
+ timestamp: Date.now(),
282
+ data: {
283
+ message,
284
+ severity: 'medium',
285
+ },
286
+ });
287
+ }
288
+ startHeartbeat() {
289
+ this.pingTimer = setInterval(() => {
290
+ this.clients.forEach((ws) => {
291
+ if (ws.isAlive === false) {
292
+ // Client didn't respond to ping, terminate
293
+ ws.terminate();
294
+ this.clients.delete(ws);
295
+ if (ws.clientId) {
296
+ try {
297
+ (0, MetricsCollector_js_1.getMetricsCollector)().recordDisconnection(ws.clientId);
298
+ }
299
+ catch (err) {
300
+ (0, logger_js_1.logError)('[WebSocketManager] heartbeat disconnect metrics error', err);
301
+ }
302
+ this.broadcast({
303
+ type: 'client_disconnect',
304
+ timestamp: Date.now(),
305
+ data: { clientId: ws.clientId, timestamp: Date.now(), duration: ws.connectedAt ? Date.now() - ws.connectedAt : 0 }
306
+ });
307
+ this.broadcastMetricsSnapshot();
308
+ }
309
+ return;
310
+ }
311
+ // Mark as potentially dead until pong received
312
+ ws.isAlive = false;
313
+ try {
314
+ ws.ping();
315
+ }
316
+ catch (error) {
317
+ (0, logger_js_1.logError)('[WebSocketManager] Ping error', error);
318
+ this.clients.delete(ws);
319
+ }
320
+ });
321
+ }, this.options.pingInterval);
322
+ }
323
+ /** Generate a UUID using crypto.randomUUID if available */
324
+ safeGenerateClientId() {
325
+ if (typeof crypto_1.randomUUID === 'function')
326
+ return (0, crypto_1.randomUUID)();
327
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
328
+ return crypto.randomUUID();
329
+ }
330
+ return 'client-' + Math.random().toString(36).slice(2);
331
+ }
332
+ /** Send current metrics snapshot to a specific client */
333
+ sendCurrentMetrics(client) {
334
+ try {
335
+ const snapshot = (0, MetricsCollector_js_1.getMetricsCollector)().getCurrentSnapshot();
336
+ this.sendToClient(client, {
337
+ type: 'metrics_update',
338
+ timestamp: Date.now(),
339
+ data: snapshot,
340
+ });
341
+ }
342
+ catch (err) {
343
+ (0, logger_js_1.logError)('[WebSocketManager] Failed to send metrics snapshot', err);
344
+ }
345
+ }
346
+ /** Broadcast fresh metrics snapshot to all clients */
347
+ broadcastMetricsSnapshot() {
348
+ try {
349
+ const snapshot = (0, MetricsCollector_js_1.getMetricsCollector)().getCurrentSnapshot();
350
+ this.broadcast({
351
+ type: 'metrics_update',
352
+ timestamp: Date.now(),
353
+ data: snapshot,
354
+ });
355
+ }
356
+ catch (err) {
357
+ (0, logger_js_1.logError)('[WebSocketManager] Failed to broadcast metrics snapshot', err);
358
+ }
359
+ }
360
+ /**
361
+ * Return lightweight summaries of active websocket connections with real IDs and durations.
362
+ * Exposed via /api/admin/connections for dashboard consumption.
363
+ */
364
+ getActiveConnectionSummaries() {
365
+ const now = Date.now();
366
+ return this.getClients().map(c => ({
367
+ id: c.clientId || 'unknown',
368
+ connectedAt: c.connectedAt || now,
369
+ durationMs: c.connectedAt ? now - c.connectedAt : 0
370
+ }));
371
+ }
372
+ /**
373
+ * Persist current WebSocket connection state to disk
374
+ */
375
+ async persistConnectionState() {
376
+ try {
377
+ // Convert current connections to persistable format
378
+ const webSocketConnections = this.getClients().map(client => ({
379
+ id: client.clientId || 'unknown',
380
+ clientId: client.clientId || 'unknown',
381
+ connectedAt: client.connectedAt ? new Date(client.connectedAt).toISOString() : new Date().toISOString(),
382
+ lastActivity: client.lastActivity ? new Date(client.lastActivity).toISOString() : new Date().toISOString(),
383
+ ipAddress: client.ipAddress,
384
+ userAgent: client.userAgent,
385
+ isActive: client.readyState === ws_1.WebSocket.OPEN,
386
+ persistedAt: new Date().toISOString(),
387
+ version: 1
388
+ }));
389
+ // Get existing data and update connections
390
+ const existingData = await this.persistenceManager.loadData();
391
+ const persistedData = {
392
+ adminSessions: existingData?.adminSessions || [],
393
+ webSocketConnections,
394
+ sessionHistory: existingData?.sessionHistory || [],
395
+ metadata: {
396
+ lastPersisted: new Date().toISOString(),
397
+ version: 1,
398
+ totalSessions: existingData?.adminSessions?.length || 0,
399
+ totalConnections: webSocketConnections.length,
400
+ totalHistoryEntries: existingData?.sessionHistory?.length || 0,
401
+ checksums: {
402
+ sessions: '',
403
+ connections: '',
404
+ history: ''
405
+ }
406
+ }
407
+ };
408
+ await this.persistenceManager.persistData(persistedData);
409
+ }
410
+ catch (error) {
411
+ (0, logger_js_1.logError)('[WebSocketManager] Failed to persist WebSocket connection state', error);
412
+ // Don't throw - continue operation
413
+ }
414
+ }
415
+ /**
416
+ * Update connection activity timestamp
417
+ */
418
+ updateConnectionActivity(clientId) {
419
+ const client = Array.from(this.clients).find(c => c.clientId === clientId);
420
+ if (client) {
421
+ client.lastActivity = Date.now();
422
+ // Persist activity update (but don't await to avoid blocking)
423
+ this.persistConnectionState().catch((error) => {
424
+ (0, logger_js_1.logError)('[WebSocketManager] Failed to persist connection activity update', error);
425
+ });
426
+ return true;
427
+ }
428
+ return false;
429
+ }
430
+ }
431
+ exports.WebSocketManager = WebSocketManager;
432
+ // Global singleton instance
433
+ let globalWebSocketManager = null;
434
+ /**
435
+ * Get or create the global WebSocket manager instance
436
+ */
437
+ function getWebSocketManager() {
438
+ if (!globalWebSocketManager) {
439
+ globalWebSocketManager = new WebSocketManager();
440
+ }
441
+ return globalWebSocketManager;
442
+ }
443
+ /**
444
+ * Set a custom WebSocket manager instance (useful for testing)
445
+ */
446
+ function setWebSocketManager(manager) {
447
+ globalWebSocketManager = manager;
448
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * httpLifecycle — HTTP/HTTPS server creation, port binding, and graceful shutdown.
3
+ * Extracted from DashboardServer.ts to keep the coordinator within line limits.
4
+ */
5
+ import { Express } from 'express';
6
+ import { Server as HttpServer } from 'http';
7
+ export interface TlsOptions {
8
+ cert: string;
9
+ key: string;
10
+ ca?: string;
11
+ }
12
+ /** Creates an HTTP or HTTPS server wrapping the given Express app. */
13
+ export declare function buildHttpServer(app: Express, tls?: TlsOptions): HttpServer;
14
+ /** Wraps `server.listen` in a promise; rejects on EADDRINUSE or any other error. */
15
+ export declare function bindToPort(server: HttpServer, port: number, host: string): Promise<void>;
16
+ /** Wraps `server.close` in a promise for graceful shutdown. */
17
+ export declare function closeHttpServer(server: HttpServer): Promise<void>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * httpLifecycle — HTTP/HTTPS server creation, port binding, and graceful shutdown.
4
+ * Extracted from DashboardServer.ts to keep the coordinator within line limits.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.buildHttpServer = buildHttpServer;
8
+ exports.bindToPort = bindToPort;
9
+ exports.closeHttpServer = closeHttpServer;
10
+ const http_1 = require("http");
11
+ const https_1 = require("https");
12
+ const logger_js_1 = require("../../services/logger.js");
13
+ /** Creates an HTTP or HTTPS server wrapping the given Express app. */
14
+ function buildHttpServer(app, tls) {
15
+ if (tls) {
16
+ return (0, https_1.createServer)({ cert: tls.cert, key: tls.key, ca: tls.ca }, app);
17
+ }
18
+ return (0, http_1.createServer)(app);
19
+ }
20
+ /** Wraps `server.listen` in a promise; rejects on EADDRINUSE or any other error. */
21
+ function bindToPort(server, port, host) {
22
+ return new Promise((resolve, reject) => {
23
+ server.listen(port, host, () => resolve());
24
+ server.on('error', reject);
25
+ });
26
+ }
27
+ /** Wraps `server.close` in a promise for graceful shutdown. */
28
+ function closeHttpServer(server) {
29
+ return new Promise((resolve) => {
30
+ server.close(() => {
31
+ (0, logger_js_1.logInfo)('[httpLifecycle] Server stopped');
32
+ resolve();
33
+ });
34
+ });
35
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * legacyDashboardHtml - generates the v1 legacy dashboard HTML page.
3
+ * Extracted from DashboardServer.ts to keep the coordinator within line limits.
4
+ * CSS lives in legacyDashboardStyles.ts to stay within per-file line limits.
5
+ */
6
+ import { MetricsSnapshot } from "./MetricsCollector.js";
7
+ export declare function stripGraphTab(html: string): string;
8
+ export declare function formatUptime(ms: number): string;
9
+ export declare function generateDashboardHtml(nonce: string, snapshot: MetricsSnapshot, webSocketUrl: string | null): string;