@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,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReadMessagesOptionsSchema = exports.SendMessageOptionsSchema = exports.AgentMessageSchema = exports.MESSAGE_PRIORITIES = exports.MAX_READ_LIMIT = exports.MAX_BODY_LENGTH = exports.SWEEP_INTERVAL_MS = exports.DEFAULT_TTL_SECONDS = exports.MAX_TTL_SECONDS = void 0;
4
+ /**
5
+ * Messaging types, Zod schemas, and constants.
6
+ *
7
+ * Defines the data model for the inter-agent messaging system.
8
+ * Messages are short-term, ephemeral (not stored in the instruction index)
9
+ * but persist across instances/sessions via JSONL files.
10
+ */
11
+ const zod_1 = require("zod");
12
+ // ── Constants ────────────────────────────────────────────────────────────────
13
+ /** Maximum time-to-live in seconds (24 hours). */
14
+ exports.MAX_TTL_SECONDS = 86_400;
15
+ /** Default time-to-live in seconds (1 hour). */
16
+ exports.DEFAULT_TTL_SECONDS = 3_600;
17
+ /** Sweep interval in milliseconds (60 seconds). */
18
+ exports.SWEEP_INTERVAL_MS = 60_000;
19
+ /** Maximum body size in characters (100KB). */
20
+ exports.MAX_BODY_LENGTH = 100_000;
21
+ /** Maximum messages per read response. */
22
+ exports.MAX_READ_LIMIT = 500;
23
+ // ── Priority enum ────────────────────────────────────────────────────────────
24
+ exports.MESSAGE_PRIORITIES = ['low', 'normal', 'high', 'critical'];
25
+ // ── Zod schemas ──────────────────────────────────────────────────────────────
26
+ exports.AgentMessageSchema = zod_1.z.object({
27
+ id: zod_1.z.string().min(1),
28
+ channel: zod_1.z.string().min(1),
29
+ sender: zod_1.z.string().min(1),
30
+ recipients: zod_1.z.array(zod_1.z.string().min(1)).min(1),
31
+ body: zod_1.z.string().min(1).max(exports.MAX_BODY_LENGTH),
32
+ createdAt: zod_1.z.string().min(1),
33
+ ttlSeconds: zod_1.z.number().int().min(0).max(exports.MAX_TTL_SECONDS),
34
+ persistent: zod_1.z.boolean().optional(),
35
+ readBy: zod_1.z.array(zod_1.z.string()).optional(),
36
+ payload: zod_1.z.record(zod_1.z.unknown()).optional(),
37
+ priority: zod_1.z.enum(exports.MESSAGE_PRIORITIES).optional(),
38
+ parentId: zod_1.z.string().optional(),
39
+ requiresAck: zod_1.z.boolean().optional(),
40
+ ackBySeconds: zod_1.z.number().int().positive().optional(),
41
+ tags: zod_1.z.array(zod_1.z.string()).optional(),
42
+ origin: zod_1.z.string().optional(),
43
+ }).strict();
44
+ exports.SendMessageOptionsSchema = zod_1.z.object({
45
+ channel: zod_1.z.string().min(1),
46
+ sender: zod_1.z.string().min(1),
47
+ recipients: zod_1.z.array(zod_1.z.string().min(1)).min(1),
48
+ body: zod_1.z.string().min(1).max(exports.MAX_BODY_LENGTH),
49
+ ttlSeconds: zod_1.z.number().int().min(1).max(exports.MAX_TTL_SECONDS).optional(),
50
+ persistent: zod_1.z.boolean().optional(),
51
+ payload: zod_1.z.record(zod_1.z.unknown()).optional(),
52
+ priority: zod_1.z.enum(exports.MESSAGE_PRIORITIES).optional(),
53
+ parentId: zod_1.z.string().optional(),
54
+ requiresAck: zod_1.z.boolean().optional(),
55
+ ackBySeconds: zod_1.z.number().int().positive().optional(),
56
+ tags: zod_1.z.array(zod_1.z.string()).optional(),
57
+ }).strict();
58
+ exports.ReadMessagesOptionsSchema = zod_1.z.object({
59
+ channel: zod_1.z.string().min(1).optional(),
60
+ reader: zod_1.z.string().min(1).optional(),
61
+ unreadOnly: zod_1.z.boolean().optional(),
62
+ limit: zod_1.z.number().int().min(1).max(exports.MAX_READ_LIMIT).optional(),
63
+ markRead: zod_1.z.boolean().optional(),
64
+ tags: zod_1.z.array(zod_1.z.string()).optional(),
65
+ sender: zod_1.z.string().min(1).optional(),
66
+ }).strict();
@@ -0,0 +1 @@
1
+ export declare function resolveOwner(id: string): string | undefined;
@@ -0,0 +1,38 @@
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
+ exports.resolveOwner = resolveOwner;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ let cached = null;
10
+ function loadRules() {
11
+ const file = path_1.default.join(process.cwd(), 'owners.json');
12
+ try {
13
+ if (!fs_1.default.existsSync(file))
14
+ return [];
15
+ const stat = fs_1.default.statSync(file);
16
+ if (cached && cached.mtimeMs === stat.mtimeMs)
17
+ return cached.rules;
18
+ const raw = JSON.parse(fs_1.default.readFileSync(file, 'utf8'));
19
+ const rules = Array.isArray(raw.ownership) ? raw.ownership.filter(r => r && typeof r.pattern === 'string' && typeof r.owner === 'string') : [];
20
+ cached = { mtimeMs: stat.mtimeMs, rules };
21
+ return rules;
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ function resolveOwner(id) {
28
+ const rules = loadRules();
29
+ for (const r of rules) {
30
+ try {
31
+ const re = new RegExp(r.pattern);
32
+ if (re.test(id))
33
+ return r.owner;
34
+ }
35
+ catch { /* ignore */ }
36
+ }
37
+ return undefined;
38
+ }
@@ -0,0 +1,19 @@
1
+ interface PerformanceResults {
2
+ listOperations: {
3
+ withoutUsage: number[];
4
+ withUsage: number[];
5
+ overhead: number;
6
+ };
7
+ mutationOperations: {
8
+ withoutUsage: number[];
9
+ withUsage: number[];
10
+ overhead: number;
11
+ };
12
+ summary: {
13
+ listOverheadPercent: number;
14
+ mutationOverheadPercent: number;
15
+ meetsTarget: boolean;
16
+ };
17
+ }
18
+ export declare function runPerformanceBaseline(): Promise<PerformanceResults>;
19
+ export {};
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ // Performance baseline measurement script for Phase 1 usage tracking
3
+ // Measures mutation and list operation timing to establish <5% overhead target
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.runPerformanceBaseline = runPerformanceBaseline;
9
+ const child_process_1 = require("child_process");
10
+ const perf_hooks_1 = require("perf_hooks");
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ function startServer(enableUsage) {
14
+ return new Promise((resolve) => {
15
+ const env = {
16
+ ...process.env,
17
+ INDEX_SERVER_MUTATION: '1',
18
+ INDEX_SERVER_FEATURES: enableUsage ? 'usage' : '',
19
+ INDEX_SERVER_VERBOSE_LOGGING: ''
20
+ };
21
+ const server = (0, child_process_1.spawn)('node', ['dist/server/index-server.js'], {
22
+ stdio: ['pipe', 'pipe', 'pipe'],
23
+ env
24
+ });
25
+ const output = [];
26
+ server.stdout?.on('data', d => {
27
+ output.push(...d.toString().trim().split(/\n+/).filter((l) => l));
28
+ });
29
+ // Wait for server to be ready
30
+ setTimeout(() => resolve({ server, output }), 200);
31
+ });
32
+ }
33
+ function send(server, msg) {
34
+ server.stdin?.write(JSON.stringify(msg) + '\n');
35
+ }
36
+ function waitFor(output, predicate, timeout = 2000) {
37
+ return new Promise((resolve, reject) => {
38
+ const start = Date.now();
39
+ const check = () => {
40
+ const line = output.find(predicate);
41
+ if (line) {
42
+ resolve(line);
43
+ }
44
+ else if (Date.now() - start > timeout) {
45
+ reject(new Error('Timeout waiting for response'));
46
+ }
47
+ else {
48
+ setTimeout(check, 10);
49
+ }
50
+ };
51
+ check();
52
+ });
53
+ }
54
+ async function measureListOperations(enableUsage, iterations = 50) {
55
+ const { server, output } = await startServer(enableUsage);
56
+ const timings = [];
57
+ try {
58
+ // Initialize
59
+ send(server, {
60
+ jsonrpc: '2.0',
61
+ id: 1,
62
+ method: 'initialize',
63
+ params: {
64
+ protocolVersion: '2025-06-18',
65
+ clientInfo: { name: 'perf-baseline', version: '0' },
66
+ capabilities: { tools: {} }
67
+ }
68
+ });
69
+ await waitFor(output, line => line.includes('"id":1'));
70
+ // Measure list operations
71
+ for (let i = 0; i < iterations; i++) {
72
+ const start = perf_hooks_1.performance.now();
73
+ // Use unified dispatcher (legacy instructions/list removed)
74
+ send(server, { jsonrpc: '2.0', id: 100 + i, method: 'index_dispatch', params: { action: 'list' } });
75
+ await waitFor(output, line => line.includes(`"id":${100 + i}`));
76
+ const end = perf_hooks_1.performance.now();
77
+ timings.push(end - start);
78
+ }
79
+ server.kill();
80
+ return timings;
81
+ }
82
+ catch (error) {
83
+ server.kill();
84
+ throw error;
85
+ }
86
+ }
87
+ async function measureMutationOperations(enableUsage, iterations = 20) {
88
+ const { server, output } = await startServer(enableUsage);
89
+ const timings = [];
90
+ try {
91
+ // Initialize
92
+ send(server, {
93
+ jsonrpc: '2.0',
94
+ id: 1,
95
+ method: 'initialize',
96
+ params: {
97
+ protocolVersion: '2025-06-18',
98
+ clientInfo: { name: 'perf-baseline', version: '0' },
99
+ capabilities: { tools: {} }
100
+ }
101
+ });
102
+ await waitFor(output, line => line.includes('"id":1'));
103
+ // Measure add operations (mutations)
104
+ for (let i = 0; i < iterations; i++) {
105
+ const start = perf_hooks_1.performance.now();
106
+ const entry = {
107
+ id: `perf-test-${i}`,
108
+ title: `Performance Test ${i}`,
109
+ body: 'Performance test entry for baseline measurement',
110
+ priority: 10,
111
+ audience: 'all',
112
+ requirement: 'optional',
113
+ categories: ['performance']
114
+ };
115
+ send(server, {
116
+ jsonrpc: '2.0',
117
+ id: 200 + i,
118
+ method: 'index_add',
119
+ params: { entry, overwrite: true }
120
+ });
121
+ await waitFor(output, line => line.includes(`"id":${200 + i}`));
122
+ const end = perf_hooks_1.performance.now();
123
+ timings.push(end - start);
124
+ }
125
+ server.kill();
126
+ return timings;
127
+ }
128
+ catch (error) {
129
+ server.kill();
130
+ throw error;
131
+ }
132
+ }
133
+ function calculateStats(timings) {
134
+ const sorted = [...timings].sort((a, b) => a - b);
135
+ const mean = timings.reduce((sum, t) => sum + t, 0) / timings.length;
136
+ const p95 = sorted[Math.floor(sorted.length * 0.95)];
137
+ const p99 = sorted[Math.floor(sorted.length * 0.99)];
138
+ return { mean, p95, p99 };
139
+ }
140
+ function calculateOverhead(withoutUsage, withUsage) {
141
+ const baselineP95 = calculateStats(withoutUsage).p95;
142
+ const usageP95 = calculateStats(withUsage).p95;
143
+ return ((usageP95 - baselineP95) / baselineP95) * 100;
144
+ }
145
+ async function runPerformanceBaseline() {
146
+ console.log('🚀 Starting Phase 1 Performance Baseline Measurement...');
147
+ console.log('Target: <5% overhead for usage tracking');
148
+ console.log();
149
+ // List operations
150
+ console.log('📊 Measuring list operations...');
151
+ const listWithoutUsage = await measureListOperations(false);
152
+ const listWithUsage = await measureListOperations(true);
153
+ const listOverhead = calculateOverhead(listWithoutUsage, listWithUsage);
154
+ console.log('✅ List operations measured');
155
+ console.log(` Without usage: ${calculateStats(listWithoutUsage).p95.toFixed(2)}ms P95`);
156
+ console.log(` With usage: ${calculateStats(listWithUsage).p95.toFixed(2)}ms P95`);
157
+ console.log(` Overhead: ${listOverhead.toFixed(2)}%`);
158
+ console.log();
159
+ // Mutation operations
160
+ console.log('📊 Measuring mutation operations...');
161
+ const mutationWithoutUsage = await measureMutationOperations(false);
162
+ const mutationWithUsage = await measureMutationOperations(true);
163
+ const mutationOverhead = calculateOverhead(mutationWithoutUsage, mutationWithUsage);
164
+ console.log('✅ Mutation operations measured');
165
+ console.log(` Without usage: ${calculateStats(mutationWithoutUsage).p95.toFixed(2)}ms P95`);
166
+ console.log(` With usage: ${calculateStats(mutationWithUsage).p95.toFixed(2)}ms P95`);
167
+ console.log(` Overhead: ${mutationOverhead.toFixed(2)}%`);
168
+ console.log();
169
+ // Summary
170
+ const maxOverhead = Math.max(listOverhead, mutationOverhead);
171
+ const meetsTarget = maxOverhead <= 5.0;
172
+ console.log('📈 Performance Baseline Summary:');
173
+ console.log(` List operations overhead: ${listOverhead.toFixed(2)}%`);
174
+ console.log(` Mutation operations overhead: ${mutationOverhead.toFixed(2)}%`);
175
+ console.log(` Maximum overhead: ${maxOverhead.toFixed(2)}%`);
176
+ console.log(` Target met (<5%): ${meetsTarget ? '✅ YES' : '❌ NO'}`);
177
+ const results = {
178
+ listOperations: {
179
+ withoutUsage: listWithoutUsage,
180
+ withUsage: listWithUsage,
181
+ overhead: listOverhead
182
+ },
183
+ mutationOperations: {
184
+ withoutUsage: mutationWithoutUsage,
185
+ withUsage: mutationWithUsage,
186
+ overhead: mutationOverhead
187
+ },
188
+ summary: {
189
+ listOverheadPercent: listOverhead,
190
+ mutationOverheadPercent: mutationOverhead,
191
+ meetsTarget
192
+ }
193
+ };
194
+ // Save results
195
+ const timestamp = new Date().toISOString();
196
+ const baselineFile = `data/performance-baseline-${timestamp.slice(0, 10)}.json`;
197
+ const dataDir = path_1.default.dirname(baselineFile);
198
+ if (!fs_1.default.existsSync(dataDir)) {
199
+ fs_1.default.mkdirSync(dataDir, { recursive: true });
200
+ }
201
+ fs_1.default.writeFileSync(baselineFile, JSON.stringify({
202
+ timestamp,
203
+ phase: 'Phase 1 Usage Tracking',
204
+ target: '<5% overhead',
205
+ results
206
+ }, null, 2));
207
+ console.log();
208
+ console.log(`💾 Detailed results saved to: ${baselineFile}`);
209
+ return results;
210
+ }
@@ -0,0 +1,12 @@
1
+ export interface PreflightCheckResult {
2
+ name: string;
3
+ ok: boolean;
4
+ path?: string;
5
+ error?: string;
6
+ }
7
+ export interface PreflightSummary {
8
+ ok: boolean;
9
+ checks: PreflightCheckResult[];
10
+ }
11
+ export declare function runPreflight(): PreflightSummary;
12
+ export declare function emitPreflightAndMaybeExit(): void;
@@ -0,0 +1,79 @@
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
+ exports.runPreflight = runPreflight;
7
+ exports.emitPreflightAndMaybeExit = emitPreflightAndMaybeExit;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const runtimeConfig_1 = require("../config/runtimeConfig");
11
+ // List of module specifiers or file probes required at runtime. Adjustable via env overrides.
12
+ const DEFAULT_MODULES = ['mime-db', 'ajv', 'ajv-formats'];
13
+ function resolveModule(mod) {
14
+ try {
15
+ const p = require.resolve(mod);
16
+ return { name: mod, ok: true, path: p };
17
+ }
18
+ catch (e) {
19
+ return { name: mod, ok: false, error: e.message };
20
+ }
21
+ }
22
+ function checkMimeDbData() {
23
+ try {
24
+ // Some deployments strip nested data; ensure the db.json file exists beneath mime-db
25
+ const base = path_1.default.dirname(require.resolve('mime-db'));
26
+ const candidate = path_1.default.join(base, 'db.json');
27
+ if (fs_1.default.existsSync(candidate))
28
+ return { name: 'mime-db:db.json', ok: true, path: candidate };
29
+ return { name: 'mime-db:db.json', ok: false, error: 'db.json not found in resolved mime-db package directory' };
30
+ }
31
+ catch (e) {
32
+ return { name: 'mime-db:db.json', ok: false, error: e.message };
33
+ }
34
+ }
35
+ function runPreflight() {
36
+ const cfg = (0, runtimeConfig_1.getRuntimeConfig)().preflight;
37
+ const modules = cfg.modules.length ? cfg.modules : DEFAULT_MODULES;
38
+ const checks = [];
39
+ for (const m of modules)
40
+ checks.push(resolveModule(m));
41
+ // Specialized data file check for mime-db
42
+ if (modules.includes('mime-db'))
43
+ checks.push(checkMimeDbData());
44
+ const ok = checks.every(c => c.ok);
45
+ return { ok, checks };
46
+ }
47
+ function emitPreflightAndMaybeExit() {
48
+ try {
49
+ const summary = runPreflight();
50
+ const line = JSON.stringify({ level: summary.ok ? 'info' : 'error', event: 'startup-preflight', ok: summary.ok, checks: summary.checks });
51
+ // stderr to avoid contaminating stdout protocol
52
+ try {
53
+ process.stderr.write(line + '\n');
54
+ }
55
+ catch { /* ignore */ }
56
+ if (!summary.ok) {
57
+ const cfg = (0, runtimeConfig_1.getRuntimeConfig)().preflight;
58
+ if (cfg.strict) {
59
+ try {
60
+ process.stderr.write('[startup] Preflight failed (strict mode) – exiting early.\n');
61
+ }
62
+ catch { /* ignore */ }
63
+ process.exit(1);
64
+ }
65
+ else {
66
+ try {
67
+ process.stderr.write('[startup] Preflight reported missing optional dependencies (continuing).\n');
68
+ }
69
+ catch { /* ignore */ }
70
+ }
71
+ }
72
+ }
73
+ catch (e) {
74
+ try {
75
+ process.stderr.write(`[startup] preflight_unexpected ${e.message}\n`);
76
+ }
77
+ catch { /* ignore */ }
78
+ }
79
+ }
@@ -0,0 +1,44 @@
1
+ export interface PromptRule {
2
+ id: string;
3
+ pattern?: string;
4
+ mustContain?: string;
5
+ severity: string;
6
+ description: string;
7
+ }
8
+ export interface PromptCategory {
9
+ id: string;
10
+ rules: PromptRule[];
11
+ }
12
+ export interface PromptCriteria {
13
+ version: string;
14
+ categories: PromptCategory[];
15
+ }
16
+ export interface PromptIssue {
17
+ ruleId: string;
18
+ severity: string;
19
+ description: string;
20
+ match?: string;
21
+ }
22
+ export declare class PromptReviewService {
23
+ private criteria;
24
+ /**
25
+ * @param criteriaPath - Optional explicit path to a `PROMPT-CRITERIA.json` file.
26
+ * When omitted the service searches a set of standard candidate locations.
27
+ */
28
+ constructor(criteriaPath?: string);
29
+ /**
30
+ * Run all loaded criteria rules against a prompt string and return any detected issues.
31
+ * @param prompt - Prompt text to review
32
+ * @returns Array of {@link PromptIssue} objects describing detected rule violations; empty when clean
33
+ */
34
+ review(prompt: string): PromptIssue[];
35
+ }
36
+ /**
37
+ * Aggregate a list of prompt issues into per-severity counts and identify the highest severity present.
38
+ * @param issues - Array of issues returned by {@link PromptReviewService.review}
39
+ * @returns Object with `counts` map (severity → count) and `highestSeverity` string
40
+ */
41
+ export declare function summarizeIssues(issues: PromptIssue[]): {
42
+ counts: Record<string, number>;
43
+ highestSeverity: string;
44
+ };
@@ -0,0 +1,101 @@
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
+ exports.PromptReviewService = void 0;
7
+ exports.summarizeIssues = summarizeIssues;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ class PromptReviewService {
11
+ criteria;
12
+ /**
13
+ * @param criteriaPath - Optional explicit path to a `PROMPT-CRITERIA.json` file.
14
+ * When omitted the service searches a set of standard candidate locations.
15
+ */
16
+ constructor(criteriaPath) {
17
+ // Resolve criteria path with fallbacks so the server doesn't crash if cwd differs.
18
+ const candidates = [];
19
+ if (criteriaPath) {
20
+ candidates.push(criteriaPath);
21
+ }
22
+ else {
23
+ // Original expected (project root when launched correctly)
24
+ candidates.push(path_1.default.join(process.cwd(), 'docs', 'PROMPT-CRITERIA.json'));
25
+ // From compiled file location: dist/services -> ../../docs
26
+ candidates.push(path_1.default.resolve(__dirname, '..', '..', 'docs', 'PROMPT-CRITERIA.json'));
27
+ // Additional fallback: dist/server -> ../docs
28
+ candidates.push(path_1.default.resolve(__dirname, '..', 'docs', 'PROMPT-CRITERIA.json'));
29
+ }
30
+ let loaded;
31
+ let usedPath;
32
+ for (const p of candidates) {
33
+ try {
34
+ const data = fs_1.default.readFileSync(p, 'utf8');
35
+ loaded = JSON.parse(data);
36
+ usedPath = p;
37
+ break;
38
+ }
39
+ catch { /* continue */ }
40
+ }
41
+ if (!loaded) {
42
+ // Graceful fallback: empty criteria so server can still start.
43
+ const msg = `[promptReviewService] WARN: Could not locate PROMPT-CRITERIA.json in any candidate paths. Using empty criteria.`;
44
+ // Write to stderr explicitly (console.error already does)
45
+ console.error(msg);
46
+ loaded = { version: '0.0.0', categories: [] };
47
+ }
48
+ else {
49
+ console.error(`[promptReviewService] Loaded criteria from ${usedPath}`); // stderr so it won't pollute stdout
50
+ }
51
+ this.criteria = loaded;
52
+ }
53
+ /**
54
+ * Run all loaded criteria rules against a prompt string and return any detected issues.
55
+ * @param prompt - Prompt text to review
56
+ * @returns Array of {@link PromptIssue} objects describing detected rule violations; empty when clean
57
+ */
58
+ review(prompt) {
59
+ const issues = [];
60
+ for (const cat of this.criteria.categories) {
61
+ for (const rule of cat.rules) {
62
+ if (rule.pattern) {
63
+ // Apply global + case-insensitive flags for broader detection
64
+ const regex = new RegExp(rule.pattern, 'gi');
65
+ const m = prompt.match(regex);
66
+ if (m) {
67
+ issues.push({ ruleId: rule.id, severity: rule.severity, description: rule.description, match: m[0] });
68
+ }
69
+ }
70
+ if (rule.mustContain) {
71
+ const mc = new RegExp(rule.mustContain, 'i');
72
+ if (!mc.test(prompt)) {
73
+ issues.push({ ruleId: rule.id, severity: rule.severity, description: 'Missing required token(s): ' + rule.description });
74
+ }
75
+ }
76
+ }
77
+ }
78
+ return issues;
79
+ }
80
+ }
81
+ exports.PromptReviewService = PromptReviewService;
82
+ /**
83
+ * Aggregate a list of prompt issues into per-severity counts and identify the highest severity present.
84
+ * @param issues - Array of issues returned by {@link PromptReviewService.review}
85
+ * @returns Object with `counts` map (severity → count) and `highestSeverity` string
86
+ */
87
+ function summarizeIssues(issues) {
88
+ const counts = {};
89
+ const severityRank = { critical: 4, high: 3, medium: 2, low: 1, info: 0 };
90
+ let max = -1;
91
+ let highest = 'info';
92
+ for (const i of issues) {
93
+ counts[i.severity] = (counts[i.severity] || 0) + 1;
94
+ const r = severityRank[i.severity] ?? 0;
95
+ if (r > max) {
96
+ max = r;
97
+ highest = i.severity;
98
+ }
99
+ }
100
+ return { counts, highestSeverity: highest };
101
+ }
@@ -0,0 +1,6 @@
1
+ export interface EnvelopeV1<T = unknown> {
2
+ version: number;
3
+ serverVersion: string;
4
+ data: T;
5
+ }
6
+ export declare function wrapResponse<T>(data: T): T | EnvelopeV1<T>;
@@ -0,0 +1,25 @@
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
+ exports.wrapResponse = wrapResponse;
7
+ const featureFlags_1 = require("./featureFlags");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ // Resolve version once (lazy) for envelope
11
+ let version = '0.0.0';
12
+ try {
13
+ const pkg = path_1.default.join(process.cwd(), 'package.json');
14
+ if (fs_1.default.existsSync(pkg)) {
15
+ const raw = JSON.parse(fs_1.default.readFileSync(pkg, 'utf8'));
16
+ if (raw.version)
17
+ version = raw.version;
18
+ }
19
+ }
20
+ catch { /* ignore */ }
21
+ function wrapResponse(data) {
22
+ if (!(0, featureFlags_1.flagEnabled)('response_envelope_v1'))
23
+ return data;
24
+ return { version: 1, serverVersion: version, data };
25
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Automatic bootstrap seeding (Option B: create only if missing).
3
+ *
4
+ * Creates the two canonical baseline instruction files when BOTH of these are true:
5
+ * - INDEX_SERVER_AUTO_SEED !== '0' (default on)
6
+ * - Target instructions directory is empty OR any of the seed files are missing
7
+ *
8
+ * Never overwrites existing files. Idempotent and safe under concurrent multi-process
9
+ * startup (best‑effort). Creation uses write-to-temp + rename for atomicity to avoid
10
+ * partially written JSON on crashes.
11
+ */
12
+ export interface SeedSummary {
13
+ dir: string;
14
+ created: string[];
15
+ existing: string[];
16
+ skipped: string[];
17
+ disabled: boolean;
18
+ reason?: string;
19
+ hash: string;
20
+ }
21
+ /**
22
+ * Run automatic bootstrap seeding if enabled. Creates canonical seed files only when they are
23
+ * absent — never overwrites existing content. Safe under concurrent multi-process startup.
24
+ * @returns A {@link SeedSummary} describing what was created, skipped, or already present
25
+ */
26
+ export declare function autoSeedBootstrap(): SeedSummary;
27
+ /**
28
+ * Return the list of canonical seed file/id pairs (without JSON bodies) for test assertions.
29
+ * @returns Array of `{ file, id }` objects for each canonical seed
30
+ */
31
+ export declare function _getCanonicalSeeds(): {
32
+ file: string;
33
+ id: string;
34
+ }[];