@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,378 @@
1
+ "use strict";
2
+ /**
3
+ * Feedback/Emit System for Index Server
4
+ *
5
+ * Provides MCP protocol-compliant tools for clients to submit structured feedback,
6
+ * status reports, security issues, feature requests, and other communications
7
+ * to server administrators or monitoring systems.
8
+ *
9
+ * This system follows MCP best practices:
10
+ * - Tools are discoverable via tools/list
11
+ * - Input validation via JSON schemas
12
+ * - Structured responses for programmatic consumption
13
+ * - Proper error handling and logging
14
+ * - Audit trail for security and compliance
15
+ */
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ const registry_1 = require("../server/registry");
21
+ const logger_1 = require("./logger");
22
+ const runtimeConfig_1 = require("../config/runtimeConfig");
23
+ const fs_1 = __importDefault(require("fs"));
24
+ const path_1 = __importDefault(require("path"));
25
+ const crypto_1 = require("crypto");
26
+ // Directory is resolved dynamically so tests can override via env per test case.
27
+ // Fall back to config for max entries; tests may still override INDEX_SERVER_FEEDBACK_DIR.
28
+ function getMaxEntries() {
29
+ return (0, runtimeConfig_1.getRuntimeConfig)().feedback.maxEntries;
30
+ }
31
+ function getFeedbackDir() {
32
+ return (0, runtimeConfig_1.getRuntimeConfig)().feedback.dir;
33
+ }
34
+ function getFeedbackFile() {
35
+ return path_1.default.join(getFeedbackDir(), 'feedback-entries.json');
36
+ }
37
+ function ensureFeedbackDir() {
38
+ const dir = getFeedbackDir();
39
+ if (!fs_1.default.existsSync(dir)) {
40
+ try {
41
+ fs_1.default.mkdirSync(dir, { recursive: true });
42
+ }
43
+ catch (error) {
44
+ (0, logger_1.logError)('[feedback] Failed to create feedback directory', { error: String(error), dir });
45
+ }
46
+ }
47
+ return dir;
48
+ }
49
+ /**
50
+ * Load feedback entries from storage
51
+ */
52
+ function loadFeedbackStorage() {
53
+ const file = getFeedbackFile();
54
+ ensureFeedbackDir();
55
+ try {
56
+ if (fs_1.default.existsSync(file)) {
57
+ const content = fs_1.default.readFileSync(file, 'utf8');
58
+ const parsed = JSON.parse(content);
59
+ // Validate structure
60
+ if (!parsed.entries || !Array.isArray(parsed.entries)) {
61
+ throw new Error('Invalid feedback storage format');
62
+ }
63
+ return parsed;
64
+ }
65
+ }
66
+ catch (error) {
67
+ (0, logger_1.logWarn)('[feedback] Failed to load feedback storage, initializing empty', { error: String(error) });
68
+ }
69
+ return {
70
+ entries: [],
71
+ lastUpdated: new Date().toISOString(),
72
+ version: '1.0.0'
73
+ };
74
+ }
75
+ /**
76
+ * Save feedback entries to storage
77
+ */
78
+ function saveFeedbackStorage(storage) {
79
+ const file = getFeedbackFile();
80
+ ensureFeedbackDir();
81
+ try {
82
+ // Limit storage size
83
+ const maxEntries = getMaxEntries();
84
+ if (storage.entries.length > maxEntries) {
85
+ // Keep most recent entries
86
+ storage.entries = storage.entries
87
+ .sort((a, b) => b.timestamp.localeCompare(a.timestamp))
88
+ .slice(0, maxEntries);
89
+ }
90
+ storage.lastUpdated = new Date().toISOString();
91
+ const content = JSON.stringify(storage, null, 2);
92
+ fs_1.default.writeFileSync(file, content, 'utf8');
93
+ }
94
+ catch (error) {
95
+ (0, logger_1.logError)('[feedback] Failed to save feedback storage', error instanceof Error ? error : { error: String(error) });
96
+ throw error;
97
+ }
98
+ }
99
+ /**
100
+ * Generate unique ID for feedback entry
101
+ */
102
+ function generateFeedbackId(type, timestamp) {
103
+ const hash = (0, crypto_1.createHash)('sha256');
104
+ hash.update(`${type}-${timestamp}-${Math.random()}`);
105
+ return hash.digest('hex').substring(0, 16);
106
+ }
107
+ /**
108
+ * feedback_submit - Submit new feedback entry
109
+ */
110
+ (0, registry_1.registerHandler)('feedback_submit', (params) => {
111
+ // Validate required parameters
112
+ if (!params.type || !params.severity || !params.title || !params.description) {
113
+ throw new Error('Missing required parameters: type, severity, title, description');
114
+ }
115
+ // Validate enum values
116
+ const validTypes = ['issue', 'status', 'security', 'feature-request', 'bug-report', 'performance', 'usability', 'other'];
117
+ const validSeverities = ['low', 'medium', 'high', 'critical'];
118
+ if (!validTypes.includes(params.type)) {
119
+ throw new Error(`Invalid type. Must be one of: ${validTypes.join(', ')}`);
120
+ }
121
+ if (!validSeverities.includes(params.severity)) {
122
+ throw new Error(`Invalid severity. Must be one of: ${validSeverities.join(', ')}`);
123
+ }
124
+ const timestamp = new Date().toISOString();
125
+ const entry = {
126
+ id: generateFeedbackId(params.type, timestamp),
127
+ timestamp,
128
+ type: params.type,
129
+ severity: params.severity,
130
+ title: params.title.substring(0, 200), // Limit title length
131
+ description: params.description.substring(0, 10000), // Limit description length
132
+ context: params.context,
133
+ metadata: params.metadata,
134
+ tags: params.tags?.slice(0, 10), // Limit number of tags
135
+ status: 'new'
136
+ };
137
+ const storage = loadFeedbackStorage();
138
+ storage.entries.push(entry);
139
+ saveFeedbackStorage(storage);
140
+ // Log feedback submission for audit trail
141
+ (0, logger_1.logInfo)('[feedback] Feedback submitted', {
142
+ id: entry.id,
143
+ type: entry.type,
144
+ severity: entry.severity,
145
+ title: entry.title
146
+ });
147
+ // For security issues, also log to stderr for immediate visibility
148
+ if (entry.type === 'security' || entry.severity === 'critical') {
149
+ try {
150
+ process.stderr.write(`[SECURITY/CRITICAL] Feedback ID: ${entry.id}, Type: ${entry.type}, Title: ${entry.title}\n`);
151
+ }
152
+ catch {
153
+ // Ignore stderr write failures
154
+ }
155
+ }
156
+ return {
157
+ success: true,
158
+ feedbackId: entry.id,
159
+ timestamp: entry.timestamp,
160
+ message: 'Feedback submitted successfully'
161
+ };
162
+ });
163
+ /**
164
+ * feedback_list - List feedback entries with filtering
165
+ */
166
+ (0, registry_1.registerHandler)('feedback_list', (params) => {
167
+ const storage = loadFeedbackStorage();
168
+ let entries = [...storage.entries];
169
+ // Apply filters
170
+ if (params.type) {
171
+ entries = entries.filter(e => e.type === params.type);
172
+ }
173
+ if (params.severity) {
174
+ entries = entries.filter(e => e.severity === params.severity);
175
+ }
176
+ if (params.status) {
177
+ entries = entries.filter(e => e.status === params.status);
178
+ }
179
+ if (typeof params.since === 'string' && params.since) {
180
+ const sinceVal = params.since;
181
+ entries = entries.filter(e => e.timestamp >= sinceVal);
182
+ }
183
+ if (params.tags && params.tags.length > 0) {
184
+ entries = entries.filter(e => e.tags && params.tags.some(tag => e.tags.includes(tag)));
185
+ }
186
+ // Sort by timestamp (newest first)
187
+ entries.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
188
+ // Apply pagination
189
+ const limit = Math.min(params.limit || 50, 200); // Max 200 entries per request
190
+ const offset = params.offset || 0;
191
+ const paginatedEntries = entries.slice(offset, offset + limit);
192
+ return {
193
+ entries: paginatedEntries,
194
+ total: entries.length,
195
+ limit,
196
+ offset,
197
+ hasMore: offset + limit < entries.length
198
+ };
199
+ });
200
+ /**
201
+ * feedback_get - Get specific feedback entry by ID
202
+ */
203
+ (0, registry_1.registerHandler)('feedback_get', (params) => {
204
+ if (!params.id) {
205
+ throw new Error('Missing required parameter: id');
206
+ }
207
+ const storage = loadFeedbackStorage();
208
+ const entry = storage.entries.find(e => e.id === params.id);
209
+ if (!entry) {
210
+ return { notFound: true, id: params.id, hint: `No feedback entry found with id "${params.id}". Use feedback_list to see all entries.` };
211
+ }
212
+ return { entry };
213
+ });
214
+ /**
215
+ * feedback_update - Update feedback entry status (admin function)
216
+ */
217
+ (0, registry_1.registerHandler)('feedback_update', (params) => {
218
+ if (!params.id) {
219
+ throw new Error('Missing required parameter: id');
220
+ }
221
+ const validStatuses = ['new', 'acknowledged', 'in-progress', 'resolved', 'closed'];
222
+ if (params.status && !validStatuses.includes(params.status)) {
223
+ throw new Error(`Invalid status. Must be one of: ${validStatuses.join(', ')}`);
224
+ }
225
+ const storage = loadFeedbackStorage();
226
+ const entryIndex = storage.entries.findIndex(e => e.id === params.id);
227
+ if (entryIndex === -1) {
228
+ return { notFound: true, id: params.id, hint: `No feedback entry found with id "${params.id}". Use feedback_list to see all entries.` };
229
+ }
230
+ const entry = storage.entries[entryIndex];
231
+ const oldStatus = entry.status;
232
+ // Update fields
233
+ if (params.status) {
234
+ entry.status = params.status;
235
+ }
236
+ if (params.metadata) {
237
+ entry.metadata = { ...entry.metadata, ...params.metadata };
238
+ }
239
+ // Add update timestamp to metadata
240
+ entry.metadata = {
241
+ ...entry.metadata,
242
+ lastUpdated: new Date().toISOString(),
243
+ updatedBy: 'system' // Could be enhanced to track admin user
244
+ };
245
+ storage.entries[entryIndex] = entry;
246
+ saveFeedbackStorage(storage);
247
+ (0, logger_1.logInfo)('[feedback] Feedback entry updated', {
248
+ id: entry.id,
249
+ oldStatus,
250
+ newStatus: entry.status,
251
+ type: entry.type
252
+ });
253
+ return {
254
+ success: true,
255
+ entry,
256
+ message: 'Feedback entry updated successfully'
257
+ };
258
+ });
259
+ /**
260
+ * feedback_stats - Get feedback statistics and metrics
261
+ */
262
+ (0, registry_1.registerHandler)('feedback_stats', (params) => {
263
+ const storage = loadFeedbackStorage();
264
+ let entries = storage.entries;
265
+ // Filter by date if specified
266
+ if (params.since) {
267
+ const sinceDate = params.since;
268
+ entries = entries.filter(e => e.timestamp >= sinceDate);
269
+ }
270
+ // Calculate statistics
271
+ const stats = {
272
+ total: entries.length,
273
+ byType: {},
274
+ bySeverity: {},
275
+ byStatus: {},
276
+ recentActivity: {
277
+ last24h: 0,
278
+ last7d: 0,
279
+ last30d: 0
280
+ }
281
+ };
282
+ const now = Date.now();
283
+ const day = 24 * 60 * 60 * 1000;
284
+ entries.forEach(entry => {
285
+ // Count by type
286
+ stats.byType[entry.type] = (stats.byType[entry.type] || 0) + 1;
287
+ // Count by severity
288
+ stats.bySeverity[entry.severity] = (stats.bySeverity[entry.severity] || 0) + 1;
289
+ // Count by status
290
+ stats.byStatus[entry.status] = (stats.byStatus[entry.status] || 0) + 1;
291
+ // Count recent activity
292
+ const entryTime = new Date(entry.timestamp).getTime();
293
+ const age = now - entryTime;
294
+ if (age <= day)
295
+ stats.recentActivity.last24h++;
296
+ if (age <= 7 * day)
297
+ stats.recentActivity.last7d++;
298
+ if (age <= 30 * day)
299
+ stats.recentActivity.last30d++;
300
+ });
301
+ return {
302
+ stats,
303
+ storageInfo: {
304
+ lastUpdated: storage.lastUpdated,
305
+ version: storage.version,
306
+ maxEntries: getMaxEntries()
307
+ }
308
+ };
309
+ });
310
+ /**
311
+ * feedback_health - Health check for feedback system
312
+ */
313
+ (0, registry_1.registerHandler)('feedback_health', () => {
314
+ const dir = getFeedbackDir();
315
+ const file = getFeedbackFile();
316
+ const health = {
317
+ status: 'ok',
318
+ timestamp: new Date().toISOString(),
319
+ storage: {
320
+ accessible: false,
321
+ writable: false,
322
+ directory: dir,
323
+ file
324
+ },
325
+ config: {
326
+ maxEntries: getMaxEntries(),
327
+ feedbackDir: dir
328
+ }
329
+ };
330
+ try {
331
+ // Check if storage is accessible
332
+ if (fs_1.default.existsSync(file)) {
333
+ fs_1.default.accessSync(file, fs_1.default.constants.R_OK);
334
+ health.storage.accessible = true;
335
+ }
336
+ else {
337
+ // File doesn't exist but directory should be writable
338
+ health.storage.accessible = fs_1.default.existsSync(dir);
339
+ }
340
+ // Check if writable
341
+ ensureFeedbackDir();
342
+ fs_1.default.accessSync(dir, fs_1.default.constants.W_OK);
343
+ health.storage.writable = true;
344
+ }
345
+ catch (error) {
346
+ health.status = 'degraded';
347
+ (0, logger_1.logWarn)('[feedback] Health check failed', error instanceof Error ? error : { error: String(error) });
348
+ }
349
+ return health;
350
+ });
351
+ // Unified feedback dispatch handler (002 Phase 2a)
352
+ (0, registry_1.registerHandler)('feedback_dispatch', async (params) => {
353
+ const { action, ...rest } = params;
354
+ if (!action)
355
+ throw new Error('Missing required parameter: action');
356
+ const validActions = ['submit', 'list', 'get', 'update', 'stats', 'health'];
357
+ if (!validActions.includes(action)) {
358
+ throw new Error(`Unknown feedback action: ${action}. Valid: ${validActions.join(', ')}`);
359
+ }
360
+ // Flat-param alias: agents may send 'body' instead of 'description' (v1.8.2+)
361
+ if (action === 'submit' && rest.body != null && rest.description == null) {
362
+ rest.description = rest.body;
363
+ delete rest.body;
364
+ }
365
+ const handler = (0, registry_1.getHandler)(`feedback_${action}`);
366
+ if (!handler)
367
+ throw new Error(`Handler not found for feedback_${action}`);
368
+ const result = await Promise.resolve(handler(rest));
369
+ // Reshape results for consistent dispatch API
370
+ if (action === 'submit') {
371
+ return { id: result.feedbackId, status: 'new', ...result };
372
+ }
373
+ if (action === 'stats') {
374
+ const stats = result.stats;
375
+ return { total: stats?.total, ...result };
376
+ }
377
+ return result;
378
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const registry_1 = require("../server/registry");
9
+ const indexContext_1 = require("./indexContext");
10
+ (0, registry_1.registerHandler)('gates_evaluate', () => { const st = (0, indexContext_1.ensureLoaded)(); const gatesPath = path_1.default.join((0, indexContext_1.getInstructionsDir)(), 'gates.json'); if (!fs_1.default.existsSync(gatesPath))
11
+ return { notConfigured: true }; let data; try {
12
+ data = JSON.parse(fs_1.default.readFileSync(gatesPath, 'utf8'));
13
+ }
14
+ catch {
15
+ return { error: 'invalid gates file' };
16
+ } const results = []; for (const g of data.gates || []) {
17
+ if (g.type !== 'count')
18
+ continue;
19
+ const matches = st.list.filter(e => { const w = g.where || {}; let ok = true; if (w.requirement !== undefined)
20
+ ok = ok && e.requirement === w.requirement; if (w.priorityGt !== undefined)
21
+ ok = ok && e.priority > w.priorityGt; return ok; });
22
+ const count = matches.length;
23
+ const v = g.value;
24
+ let passed = true;
25
+ switch (g.op) {
26
+ case '>=':
27
+ passed = count >= v;
28
+ break;
29
+ case '>':
30
+ passed = count > v;
31
+ break;
32
+ case '<=':
33
+ passed = count <= v;
34
+ break;
35
+ case '<':
36
+ passed = count < v;
37
+ break;
38
+ case '==':
39
+ passed = count === v;
40
+ break;
41
+ case '!=':
42
+ passed = count !== v;
43
+ break;
44
+ }
45
+ results.push({ id: g.id, passed, count, op: g.op, value: v, severity: g.severity, description: g.description });
46
+ } const summary = { errors: results.filter(r => !r.passed && r.severity === 'error').length, warnings: results.filter(r => !r.passed && r.severity === 'warn').length, total: results.length }; return { generatedAt: new Date().toISOString(), results, summary }; });
@@ -0,0 +1,53 @@
1
+ import { getRuntimeConfig } from '../config/runtimeConfig';
2
+ type GraphConfigSnapshot = ReturnType<typeof getRuntimeConfig>['graph'];
3
+ export interface GraphExportParams {
4
+ includeEdgeTypes?: Array<'primary' | 'category' | 'belongs'>;
5
+ maxEdges?: number;
6
+ format?: 'json' | 'dot' | 'mermaid';
7
+ enrich?: boolean;
8
+ includeCategoryNodes?: boolean;
9
+ includeUsage?: boolean;
10
+ }
11
+ interface GraphNodeV1 {
12
+ id: string;
13
+ }
14
+ interface GraphNodeV2 extends GraphNodeV1 {
15
+ categories?: string[];
16
+ primaryCategory?: string;
17
+ priority?: number;
18
+ priorityTier?: string;
19
+ requirement?: string;
20
+ owner?: string;
21
+ status?: string;
22
+ createdAt?: string;
23
+ updatedAt?: string;
24
+ usageCount?: number;
25
+ nodeType?: 'instruction' | 'category';
26
+ }
27
+ type GraphNode = GraphNodeV1 | GraphNodeV2;
28
+ interface GraphEdgeBase {
29
+ from: string;
30
+ to: string;
31
+ type: 'primary' | 'category' | 'belongs';
32
+ }
33
+ interface GraphEdgeEnriched extends GraphEdgeBase {
34
+ weight?: number;
35
+ }
36
+ type GraphEdge = GraphEdgeBase | GraphEdgeEnriched;
37
+ interface GraphMeta {
38
+ graphSchemaVersion: 1 | 2;
39
+ nodeCount: number;
40
+ edgeCount: number;
41
+ truncated?: boolean;
42
+ notes?: string[];
43
+ }
44
+ interface GraphResult {
45
+ meta: GraphMeta;
46
+ nodes: GraphNode[];
47
+ edges: GraphEdge[];
48
+ dot?: string;
49
+ mermaid?: string;
50
+ }
51
+ export declare function buildGraph(params: GraphExportParams, graphCfg?: GraphConfigSnapshot): GraphResult;
52
+ export declare function __resetGraphCache(): void;
53
+ export {};