@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,280 @@
1
+ "use strict";
2
+ /**
3
+ * Graph Routes
4
+ * Routes: GET /graph/mermaid, GET /graph/categories, GET /graph/instructions, GET /graph/relations
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createGraphRoutes = createGraphRoutes;
8
+ const express_1 = require("express");
9
+ const handlers_graph_js_1 = require("../../../services/handlers.graph.js");
10
+ const indexContext_js_1 = require("../../../services/indexContext.js");
11
+ const runtimeConfig_js_1 = require("../../../config/runtimeConfig.js");
12
+ function createGraphRoutes() {
13
+ const router = (0, express_1.Router)();
14
+ /**
15
+ * GET /api/graph/mermaid - Returns mermaid representation of the instruction graph.
16
+ * Query params:
17
+ * enrich=1 -> include enriched schema (v2) data generation path
18
+ * categories=1 -> include explicit category nodes
19
+ * usage=1 -> include usageCount when available
20
+ * edgeTypes=a,b -> restrict edge types (comma separated)
21
+ */
22
+ router.get('/graph/mermaid', (req, res) => {
23
+ try {
24
+ const { enrich, categories, usage, edgeTypes, selectedCategories, selectedIds } = req.query;
25
+ const includeEdgeTypes = edgeTypes ? edgeTypes.split(',').filter(Boolean) : undefined;
26
+ const t0 = Date.now();
27
+ try {
28
+ // eslint-disable-next-line no-console
29
+ console.debug('[graph/mermaid][start]', `enrich=${enrich}`, `categories=${categories}`, `usage=${usage}`, `edgeTypes=${edgeTypes || ''}`, `selCats=${selectedCategories || ''}`, `selIds=${selectedIds || ''}`);
30
+ }
31
+ catch { /* ignore diag logging errors */ }
32
+ const graph = (0, handlers_graph_js_1.buildGraph)({
33
+ enrich: enrich === '1' || enrich === 'true',
34
+ includeCategoryNodes: categories === '1' || categories === 'true',
35
+ includeUsage: usage === '1' || usage === 'true',
36
+ includeEdgeTypes,
37
+ format: 'mermaid'
38
+ });
39
+ if (!graph.mermaid) {
40
+ return res.status(500).json({ success: false, error: 'failed_to_generate_mermaid' });
41
+ }
42
+ let mermaidSource = graph.mermaid;
43
+ const catFilter = selectedCategories?.split(',').filter(Boolean) || [];
44
+ const idFilter = selectedIds?.split(',').filter(Boolean) || [];
45
+ let filteredNodeCount;
46
+ let filteredEdgeCount;
47
+ let scoped = false;
48
+ let keptIdsSize = 0;
49
+ if ((catFilter.length || idFilter.length) && mermaidSource) {
50
+ try {
51
+ const keepIds = new Set();
52
+ for (const id of idFilter)
53
+ keepIds.add(id);
54
+ const wantCategoryNodes = (categories === '1' || categories === 'true');
55
+ if (catFilter.length) {
56
+ const catSet = new Set(catFilter.map(c => c.toLowerCase()));
57
+ if (wantCategoryNodes) {
58
+ for (const c of catFilter) {
59
+ keepIds.add(`category:${c}`);
60
+ }
61
+ }
62
+ if (graph.meta.graphSchemaVersion === 2) {
63
+ for (const nodeRaw of graph.nodes) {
64
+ const nodeCats = nodeRaw.categories;
65
+ if (Array.isArray(nodeCats) && nodeCats.some(c => catSet.has(c.toLowerCase()))) {
66
+ keepIds.add(nodeRaw.id);
67
+ if (wantCategoryNodes) {
68
+ for (const c of nodeCats) {
69
+ if (catSet.has(c.toLowerCase()))
70
+ keepIds.add(`category:${c}`);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+ if (keepIds.size) {
78
+ let frontmatterBlock = '';
79
+ let remainder = mermaidSource;
80
+ if (remainder.startsWith('---\n')) {
81
+ const fmMatch = /^---\n[\s\S]*?\n---\n/.exec(remainder);
82
+ if (fmMatch) {
83
+ frontmatterBlock = fmMatch[0];
84
+ remainder = remainder.slice(fmMatch[0].length);
85
+ }
86
+ }
87
+ const lines = remainder.split(/\r?\n/);
88
+ const directiveIdx = lines.findIndex(l => /^\s*(flowchart|graph)\b/i.test(l));
89
+ let directiveLine = '';
90
+ if (directiveIdx >= 0) {
91
+ directiveLine = lines[directiveIdx];
92
+ }
93
+ const nodeIdPattern = Array.from(keepIds).map(id => id.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|');
94
+ const nodeRegex = new RegExp(`^(\\s*)(${nodeIdPattern})\\[`);
95
+ const edgeRegex = new RegExp(`^(.*)(${nodeIdPattern})(.*)(${nodeIdPattern})(.*)$`);
96
+ const filtered = [];
97
+ const styleRegexes = [
98
+ /^\s*classDef\s+/i,
99
+ /^\s*style\s+[A-Za-z0-9:_-]+\s+/i,
100
+ /^\s*class\s+[A-Za-z0-9:_-]+\s+/i,
101
+ /^\s*linkStyle\s+\d+/i
102
+ ];
103
+ for (const ln of lines) {
104
+ if (!ln)
105
+ continue;
106
+ if (directiveLine && ln === directiveLine) {
107
+ continue;
108
+ }
109
+ const trimmed = ln.trim();
110
+ if (trimmed.startsWith('%%')) {
111
+ filtered.push(ln);
112
+ continue;
113
+ }
114
+ if (styleRegexes.some(r => r.test(trimmed))) {
115
+ filtered.push(ln);
116
+ continue;
117
+ }
118
+ if (nodeRegex.test(ln) || edgeRegex.test(ln))
119
+ filtered.push(ln);
120
+ }
121
+ const parts = [];
122
+ if (frontmatterBlock)
123
+ parts.push(frontmatterBlock.trimEnd());
124
+ if (directiveLine)
125
+ parts.push(directiveLine);
126
+ parts.push(...filtered);
127
+ mermaidSource = parts.join('\n');
128
+ if ((0, runtimeConfig_js_1.getRuntimeConfig)().logging.verbose) {
129
+ // eslint-disable-next-line no-console
130
+ console.debug('[graph/mermaid][filter:new]', { selectedIds: idFilter.length, selectedCategories: catFilter.length, kept: keepIds.size, totalLines: lines.length, emittedLines: parts.length });
131
+ }
132
+ keptIdsSize = keepIds.size;
133
+ scoped = true;
134
+ try {
135
+ const nodeLineRegex = /^(\s*)([A-Za-z0-9:_-]+)\[[^\]]*\]/;
136
+ const edgeLineRegex = /-->|===|~~>|\|-/;
137
+ let n = 0, eCnt = 0;
138
+ for (const ln of filtered) {
139
+ if (nodeLineRegex.test(ln))
140
+ n++;
141
+ else if (edgeLineRegex.test(ln))
142
+ eCnt++;
143
+ }
144
+ filteredNodeCount = n;
145
+ filteredEdgeCount = eCnt;
146
+ }
147
+ catch { /* ignore count derivation errors */ }
148
+ }
149
+ }
150
+ catch (filterErr) {
151
+ console.warn('[graph/mermaid][filter-failed]', filterErr);
152
+ }
153
+ }
154
+ try {
155
+ // eslint-disable-next-line no-console
156
+ console.debug('[graph/mermaid][ok]', { ms: Date.now() - t0, nodes: graph.meta?.nodeCount, edges: graph.meta?.edgeCount, bytes: mermaidSource.length });
157
+ }
158
+ catch { /* ignore diag logging errors */ }
159
+ let metaOut = graph.meta;
160
+ if (scoped && graph.meta) {
161
+ try {
162
+ const base = { ...graph.meta };
163
+ const augmented = base;
164
+ if (typeof filteredNodeCount === 'number')
165
+ augmented.nodeCount = filteredNodeCount;
166
+ if (typeof filteredEdgeCount === 'number')
167
+ augmented.edgeCount = filteredEdgeCount;
168
+ augmented.scoped = true;
169
+ augmented.keptIds = keptIdsSize;
170
+ metaOut = augmented;
171
+ }
172
+ catch { /* ignore meta cloning issues */ }
173
+ }
174
+ res.json({ success: true, meta: metaOut, mermaid: mermaidSource });
175
+ }
176
+ catch (err) {
177
+ const e = err;
178
+ try {
179
+ // eslint-disable-next-line no-console
180
+ console.warn('[graph/mermaid][error]', e.message);
181
+ }
182
+ catch { /* ignore diag logging errors */ }
183
+ res.status(500).json({ success: false, error: String(e.message || e) });
184
+ }
185
+ });
186
+ /**
187
+ * GET /api/graph/categories
188
+ * Returns list of unique categories with instruction counts.
189
+ */
190
+ router.get('/graph/categories', (_req, res) => {
191
+ try {
192
+ const st = (0, indexContext_js_1.ensureLoaded)();
193
+ const map = new Map();
194
+ for (const inst of st.list) {
195
+ const cats = Array.isArray(inst.categories) ? inst.categories : [];
196
+ for (const c of cats) {
197
+ map.set(c, (map.get(c) || 0) + 1);
198
+ }
199
+ }
200
+ const categories = [...map.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([id, count]) => ({ id, count }));
201
+ res.json({ success: true, categories, total: categories.length, timestamp: Date.now() });
202
+ }
203
+ catch (err) {
204
+ const e = err;
205
+ res.status(500).json({ success: false, error: e.message || String(e) });
206
+ }
207
+ });
208
+ /**
209
+ * GET /api/graph/instructions?categories=a,b&limit=100
210
+ * Returns lightweight instruction list filtered by categories (OR semantics).
211
+ */
212
+ router.get('/graph/instructions', (req, res) => {
213
+ try {
214
+ const st = (0, indexContext_js_1.ensureLoaded)();
215
+ const catsParam = req.query.categories || '';
216
+ const filterCats = catsParam ? catsParam.split(',').filter(Boolean) : [];
217
+ const limitRaw = parseInt(req.query.limit || '0', 10);
218
+ const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? limitRaw : 500;
219
+ let instructions = st.list.slice().sort((a, b) => a.id.localeCompare(b.id));
220
+ if (filterCats.length) {
221
+ const set = new Set(filterCats.map(c => c.toLowerCase()));
222
+ instructions = instructions.filter(i => (i.categories || []).some(c => set.has(c.toLowerCase())));
223
+ }
224
+ instructions = instructions.slice(0, limit);
225
+ const flat = instructions.map(i => ({ id: i.id, primaryCategory: i.primaryCategory || i.categories?.[0], categories: i.categories || [] }));
226
+ res.json({ success: true, instructions: flat, count: flat.length, filtered: !!filterCats.length, timestamp: Date.now() });
227
+ }
228
+ catch (err) {
229
+ const e = err;
230
+ res.status(500).json({ success: false, error: e.message || String(e) });
231
+ }
232
+ });
233
+ /**
234
+ * GET /api/graph/relations?instructions=id1,id2
235
+ * Returns minimal edges among the provided instruction ids plus category linkage.
236
+ */
237
+ router.get('/graph/relations', (req, res) => {
238
+ try {
239
+ const idsParam = req.query.instructions || '';
240
+ const ids = idsParam.split(',').filter(Boolean);
241
+ if (!ids.length) {
242
+ return res.json({ success: true, nodes: [], edges: [], categories: [], timestamp: Date.now() });
243
+ }
244
+ const graph = (0, handlers_graph_js_1.buildGraph)({ enrich: true, includeCategoryNodes: true, includeUsage: false });
245
+ const expand = (req.query.expand === '1' || req.query.expand === 'true');
246
+ const selectedSet = new Set(ids);
247
+ const workingSet = new Set(ids);
248
+ const firstEdges = graph.edges.filter(e => selectedSet.has(e.from) || selectedSet.has(e.to));
249
+ if (expand) {
250
+ const instructionNodeIds = new Set(graph.nodes.filter(n => n.nodeType === 'instruction').map(n => n.id));
251
+ for (const e of firstEdges) {
252
+ if (instructionNodeIds.has(e.from) && !workingSet.has(e.from))
253
+ workingSet.add(e.from);
254
+ if (instructionNodeIds.has(e.to) && !workingSet.has(e.to))
255
+ workingSet.add(e.to);
256
+ }
257
+ }
258
+ const nodesAll = graph.nodes.filter(n => workingSet.has(n.id) || n.nodeType === 'category');
259
+ const edges = graph.edges.filter(e => workingSet.has(e.from) && workingSet.has(e.to) && (selectedSet.has(e.from) || selectedSet.has(e.to)));
260
+ const categoryRefs = new Set();
261
+ for (const e of edges) {
262
+ if (e.type === 'belongs' || e.type === 'primary') {
263
+ if (e.to.startsWith('category:'))
264
+ categoryRefs.add(e.to);
265
+ if (e.from.startsWith('category:'))
266
+ categoryRefs.add(e.from);
267
+ }
268
+ }
269
+ const finalNodes = nodesAll.filter(n => !('nodeType' in n && n.nodeType === 'category') || categoryRefs.has(n.id));
270
+ const categories = [...categoryRefs].map(id => ({ id: id.replace(/^category:/, '') }));
271
+ const expandedCount = workingSet.size - selectedSet.size;
272
+ res.json({ success: true, nodes: finalNodes, edges, categories, expanded: expand ? expandedCount : 0, timestamp: Date.now() });
273
+ }
274
+ catch (err) {
275
+ const e = err;
276
+ res.status(500).json({ success: false, error: e.message || String(e) });
277
+ }
278
+ });
279
+ return router;
280
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Route module index — re-exports all route factories and mounts dashboard routes.
3
+ */
4
+ import { Express } from 'express';
5
+ import { MetricsCollector } from '../MetricsCollector.js';
6
+ export { createStatusRoutes } from './status.routes.js';
7
+ export { createMetricsRoutes } from './metrics.routes.js';
8
+ export { createAdminRoutes } from './admin.routes.js';
9
+ export { createGraphRoutes } from './graph.routes.js';
10
+ export { createInstructionsRoutes } from './instructions.routes.js';
11
+ export { createKnowledgeRoutes } from './knowledge.routes.js';
12
+ export { createAlertsRoutes } from './alerts.routes.js';
13
+ export { createLogsRoutes } from './logs.routes.js';
14
+ export { createSyntheticRoutes } from './synthetic.routes.js';
15
+ export { createInstancesRoutes } from './instances.routes.js';
16
+ export { createToolsRoutes } from './tools.routes.js';
17
+ export { createEmbeddingsRoutes } from './embeddings.routes.js';
18
+ export { createUsageRoutes } from './usage.routes.js';
19
+ export { createScriptsRoutes } from './scripts.routes.js';
20
+ export { createMessagingRoutes } from './messaging.routes.js';
21
+ export { createSqliteRoutes } from './sqlite.routes.js';
22
+ export interface DashboardRoutesContext {
23
+ metricsCollector: MetricsCollector;
24
+ enableWebSockets: boolean;
25
+ enableCors: boolean;
26
+ graphEnabled: boolean;
27
+ wsProtocol: 'wss' | 'ws';
28
+ getServerInfo: () => {
29
+ port: number;
30
+ host: string;
31
+ url: string;
32
+ } | null;
33
+ }
34
+ /**
35
+ * Registers all top-level dashboard routes on the given Express app.
36
+ * Called once during DashboardServer construction after middleware is set up.
37
+ */
38
+ export declare function mountDashboardRoutes(app: Express, ctx: DashboardRoutesContext): void;
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * Route module index — re-exports all route factories and mounts dashboard routes.
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createSqliteRoutes = exports.createMessagingRoutes = exports.createScriptsRoutes = exports.createUsageRoutes = exports.createEmbeddingsRoutes = exports.createToolsRoutes = exports.createInstancesRoutes = exports.createSyntheticRoutes = exports.createLogsRoutes = exports.createAlertsRoutes = exports.createKnowledgeRoutes = exports.createInstructionsRoutes = exports.createGraphRoutes = exports.createAdminRoutes = exports.createMetricsRoutes = exports.createStatusRoutes = void 0;
10
+ exports.mountDashboardRoutes = mountDashboardRoutes;
11
+ const promises_1 = require("fs/promises");
12
+ const path_1 = __importDefault(require("path"));
13
+ const ApiRoutes_js_1 = require("../ApiRoutes.js");
14
+ const legacyDashboardHtml_js_1 = require("../legacyDashboardHtml.js");
15
+ const registry_js_1 = require("../../../server/registry.js");
16
+ var status_routes_js_1 = require("./status.routes.js");
17
+ Object.defineProperty(exports, "createStatusRoutes", { enumerable: true, get: function () { return status_routes_js_1.createStatusRoutes; } });
18
+ var metrics_routes_js_1 = require("./metrics.routes.js");
19
+ Object.defineProperty(exports, "createMetricsRoutes", { enumerable: true, get: function () { return metrics_routes_js_1.createMetricsRoutes; } });
20
+ var admin_routes_js_1 = require("./admin.routes.js");
21
+ Object.defineProperty(exports, "createAdminRoutes", { enumerable: true, get: function () { return admin_routes_js_1.createAdminRoutes; } });
22
+ var graph_routes_js_1 = require("./graph.routes.js");
23
+ Object.defineProperty(exports, "createGraphRoutes", { enumerable: true, get: function () { return graph_routes_js_1.createGraphRoutes; } });
24
+ var instructions_routes_js_1 = require("./instructions.routes.js");
25
+ Object.defineProperty(exports, "createInstructionsRoutes", { enumerable: true, get: function () { return instructions_routes_js_1.createInstructionsRoutes; } });
26
+ var knowledge_routes_js_1 = require("./knowledge.routes.js");
27
+ Object.defineProperty(exports, "createKnowledgeRoutes", { enumerable: true, get: function () { return knowledge_routes_js_1.createKnowledgeRoutes; } });
28
+ var alerts_routes_js_1 = require("./alerts.routes.js");
29
+ Object.defineProperty(exports, "createAlertsRoutes", { enumerable: true, get: function () { return alerts_routes_js_1.createAlertsRoutes; } });
30
+ var logs_routes_js_1 = require("./logs.routes.js");
31
+ Object.defineProperty(exports, "createLogsRoutes", { enumerable: true, get: function () { return logs_routes_js_1.createLogsRoutes; } });
32
+ var synthetic_routes_js_1 = require("./synthetic.routes.js");
33
+ Object.defineProperty(exports, "createSyntheticRoutes", { enumerable: true, get: function () { return synthetic_routes_js_1.createSyntheticRoutes; } });
34
+ var instances_routes_js_1 = require("./instances.routes.js");
35
+ Object.defineProperty(exports, "createInstancesRoutes", { enumerable: true, get: function () { return instances_routes_js_1.createInstancesRoutes; } });
36
+ var tools_routes_js_1 = require("./tools.routes.js");
37
+ Object.defineProperty(exports, "createToolsRoutes", { enumerable: true, get: function () { return tools_routes_js_1.createToolsRoutes; } });
38
+ var embeddings_routes_js_1 = require("./embeddings.routes.js");
39
+ Object.defineProperty(exports, "createEmbeddingsRoutes", { enumerable: true, get: function () { return embeddings_routes_js_1.createEmbeddingsRoutes; } });
40
+ var usage_routes_js_1 = require("./usage.routes.js");
41
+ Object.defineProperty(exports, "createUsageRoutes", { enumerable: true, get: function () { return usage_routes_js_1.createUsageRoutes; } });
42
+ var scripts_routes_js_1 = require("./scripts.routes.js");
43
+ Object.defineProperty(exports, "createScriptsRoutes", { enumerable: true, get: function () { return scripts_routes_js_1.createScriptsRoutes; } });
44
+ var messaging_routes_js_1 = require("./messaging.routes.js");
45
+ Object.defineProperty(exports, "createMessagingRoutes", { enumerable: true, get: function () { return messaging_routes_js_1.createMessagingRoutes; } });
46
+ var sqlite_routes_js_1 = require("./sqlite.routes.js");
47
+ Object.defineProperty(exports, "createSqliteRoutes", { enumerable: true, get: function () { return sqlite_routes_js_1.createSqliteRoutes; } });
48
+ /**
49
+ * Registers all top-level dashboard routes on the given Express app.
50
+ * Called once during DashboardServer construction after middleware is set up.
51
+ */
52
+ function mountDashboardRoutes(app, ctx) {
53
+ // Redirect root to admin panel (v2 dashboard)
54
+ app.get('/', (_req, res) => {
55
+ res.redirect('/admin');
56
+ });
57
+ // Legacy v1 dashboard (kept for backward compatibility)
58
+ app.get('/legacy', (_req, res) => {
59
+ const nonce = res.locals.cspNonce;
60
+ const snapshot = ctx.metricsCollector.getCurrentSnapshot();
61
+ const serverInfo = ctx.getServerInfo();
62
+ const webSocketUrl = ctx.enableWebSockets && serverInfo
63
+ ? `${ctx.wsProtocol}://${serverInfo.host}:${serverInfo.port}/ws`
64
+ : null;
65
+ res.send((0, legacyDashboardHtml_js_1.generateDashboardHtml)(nonce, snapshot, webSocketUrl));
66
+ });
67
+ // Admin Panel (v2 dashboard — primary UI)
68
+ app.get('/admin', async (_req, res) => {
69
+ try {
70
+ // __dirname here is src/dashboard/server/routes — step up two levels to reach client/
71
+ const adminHtmlPath = path_1.default.join(__dirname, '..', '..', 'client', 'admin.html');
72
+ let adminHtml = await (0, promises_1.readFile)(adminHtmlPath, 'utf-8');
73
+ if (!ctx.graphEnabled) {
74
+ adminHtml = (0, legacyDashboardHtml_js_1.stripGraphTab)(adminHtml);
75
+ }
76
+ const nonce = res.locals.cspNonce;
77
+ adminHtml = adminHtml.replace(/<script>/g, `<script nonce="${nonce}">`);
78
+ adminHtml = adminHtml.replace(/<script defer /g, `<script nonce="${nonce}" defer `);
79
+ res.type('html').send(adminHtml);
80
+ }
81
+ catch (error) {
82
+ // eslint-disable-next-line no-console
83
+ console.error('[Dashboard] Admin panel load error:', error);
84
+ res.status(500).send('<h1>500 - Admin Panel Error</h1><p>Failed to load admin panel</p>');
85
+ }
86
+ });
87
+ // Health check
88
+ app.get('/health', (_req, res) => {
89
+ const snapshot = ctx.metricsCollector.getCurrentSnapshot();
90
+ res.json({
91
+ status: 'healthy',
92
+ timestamp: Date.now(),
93
+ uptime: snapshot.server.uptime,
94
+ version: snapshot.server.version,
95
+ });
96
+ });
97
+ // Panel documentation — serves markdown rendered as styled HTML
98
+ app.get('/api/docs/:name', async (req, res) => {
99
+ const name = req.params.name.replace(/[^a-z0-9_-]/gi, '');
100
+ if (!name) {
101
+ res.status(400).send('Invalid doc name');
102
+ return;
103
+ }
104
+ const docPath = path_1.default.join(__dirname, '..', '..', '..', '..', 'docs', 'panels', `${name}.md`);
105
+ try {
106
+ const md = await (0, promises_1.readFile)(docPath, 'utf-8');
107
+ const bodyHtml = md
108
+ .replace(/^### (.+)$/gm, '<h3>$1</h3>')
109
+ .replace(/^## (.+)$/gm, '<h2>$1</h2>')
110
+ .replace(/^# (.+)$/gm, '<h1>$1</h1>')
111
+ .replace(/^---$/gm, '<hr>')
112
+ .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
113
+ .replace(/`([^`]+)`/g, '<code>$1</code>')
114
+ .replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '<img src="$2" alt="$1" style="max-width:100%;border-radius:8px;border:1px solid #1f2a3a;margin:12px 0;">')
115
+ .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener">$1</a>')
116
+ .replace(/^\| (.+) \|$/gm, (_m, row) => {
117
+ const cells = row.split('|').map((c) => c.trim());
118
+ return '<tr>' + cells.map((c) => `<td>${c}</td>`).join('') + '</tr>';
119
+ })
120
+ .replace(/^\|[-| ]+\|$/gm, '')
121
+ .replace(/((?:<tr>.*<\/tr>\n?)+)/g, '<table>$1</table>')
122
+ .replace(/^- (.+)$/gm, '<li>$1</li>')
123
+ .replace(/((?:<li>.*<\/li>\n?)+)/g, '<ul>$1</ul>')
124
+ .replace(/\n{2,}/g, '\n<br>\n');
125
+ const html = `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>${name} - Panel Docs</title><style>body{background:#0b0f19;color:#e3ebf5;font-family:'Segoe UI',system-ui,sans-serif;padding:24px 32px;max-width:800px;margin:0 auto;line-height:1.6;}h1{color:#667eea;border-bottom:1px solid #1f2a3a;padding-bottom:8px;}h2{color:#9fb5cc;margin-top:24px;}h3{color:#b0c4de;}table{width:100%;border-collapse:collapse;margin:12px 0;}td{padding:6px 10px;border:1px solid #1f2a3a;font-size:13px;}tr:first-child td{background:#101726;font-weight:600;}code{background:#182234;padding:2px 6px;border-radius:4px;font-size:12px;}a{color:#667eea;}hr{border:none;border-top:1px solid #1f2a3a;margin:20px 0;}ul{padding-left:20px;}li{margin:4px 0;}</style></head><body>${bodyHtml}</body></html>`;
126
+ res.type('html').send(html);
127
+ }
128
+ catch {
129
+ res.status(404).send('<h1>404</h1><p>Panel documentation not found.</p><p><a href="/admin">Back to Admin</a></p>');
130
+ }
131
+ });
132
+ // Panel screenshot — serves PNG images from docs/screenshots/
133
+ app.get('/api/screenshots/:name', async (req, res) => {
134
+ const fileName = req.params.name.replace(/[^a-z0-9._-]/gi, '');
135
+ if (!fileName || !fileName.endsWith('.png')) {
136
+ res.status(400).send('Invalid');
137
+ return;
138
+ }
139
+ const screenshotsDir = path_1.default.resolve(__dirname, '..', '..', '..', '..', 'docs', 'screenshots');
140
+ const filePath = path_1.default.join(screenshotsDir, fileName);
141
+ if (!filePath.startsWith(screenshotsDir)) {
142
+ res.status(400).send('Invalid path');
143
+ return;
144
+ }
145
+ try {
146
+ const data = await (0, promises_1.readFile)(filePath);
147
+ res.setHeader('Content-Type', 'image/png');
148
+ res.setHeader('Cache-Control', 'public, max-age=3600');
149
+ res.send(data);
150
+ }
151
+ catch {
152
+ res.status(404).send('Screenshot not found');
153
+ }
154
+ });
155
+ // API sub-routes (mounted at /api)
156
+ app.use('/api', (0, ApiRoutes_js_1.createApiRoutes)({ enableCors: ctx.enableCors }));
157
+ // Back-compat: legacy tests expect /tools.json at dashboard root
158
+ app.get('/tools.json', (_req, res) => {
159
+ try {
160
+ const tools = (0, registry_js_1.listRegisteredMethods)();
161
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
162
+ const toolMetrics = ctx.metricsCollector.getToolMetrics();
163
+ const enrichedTools = tools.map(toolName => ({
164
+ name: toolName,
165
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
+ metrics: toolMetrics[toolName] || {
167
+ callCount: 0,
168
+ successCount: 0,
169
+ errorCount: 0,
170
+ totalResponseTime: 0,
171
+ errorTypes: {},
172
+ },
173
+ }));
174
+ res.json({ tools: enrichedTools, totalTools: tools.length, timestamp: Date.now(), legacy: true });
175
+ }
176
+ catch (error) {
177
+ // eslint-disable-next-line no-console
178
+ console.error('[Dashboard] /tools.json route error:', error);
179
+ res.status(500).json({ error: 'Failed to get tools list' });
180
+ }
181
+ });
182
+ // WebSocket connection info
183
+ app.get('/ws-info', (_req, res) => {
184
+ const serverInfo = ctx.getServerInfo();
185
+ res.json({
186
+ enabled: ctx.enableWebSockets,
187
+ url: serverInfo ? `${ctx.wsProtocol}://${serverInfo.host}:${serverInfo.port}/ws` : null,
188
+ });
189
+ });
190
+ // 404 fallback
191
+ app.use((_req, res) => {
192
+ res.status(404).send('<h1>404 - Page Not Found</h1><p>Return to <a href="/">Dashboard</a></p>');
193
+ });
194
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Instances Routes
3
+ * Routes: GET /instances
4
+ */
5
+ import { Router } from 'express';
6
+ export declare function createInstancesRoutes(): Router;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Instances Routes
4
+ * Routes: GET /instances
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createInstancesRoutes = createInstancesRoutes;
8
+ const express_1 = require("express");
9
+ const InstanceManager_js_1 = require("../InstanceManager.js");
10
+ function createInstancesRoutes() {
11
+ const router = (0, express_1.Router)();
12
+ /**
13
+ * GET /api/instances - List all active dashboard instances
14
+ */
15
+ router.get('/instances', (_req, res) => {
16
+ try {
17
+ const instances = (0, InstanceManager_js_1.getActiveInstances)();
18
+ const current = instances.find(i => i.current);
19
+ res.json({
20
+ current: current ? { pid: current.pid, port: current.port, host: current.host } : null,
21
+ instances,
22
+ count: instances.length,
23
+ timestamp: Date.now(),
24
+ });
25
+ }
26
+ catch (error) {
27
+ res.status(500).json({
28
+ error: 'Failed to list instances',
29
+ message: error instanceof Error ? error.message : String(error),
30
+ timestamp: Date.now(),
31
+ });
32
+ }
33
+ });
34
+ return router;
35
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Instructions Management Routes
3
+ * Routes: GET /instructions, GET /instructions_search, GET /instructions_categories,
4
+ * GET /instructions/:name, POST /instructions, PUT /instructions/:name,
5
+ * DELETE /instructions/:name
6
+ */
7
+ import { Router } from 'express';
8
+ export declare function createInstructionsRoutes(): Router;