@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 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const registry_1 = require("../server/registry");
4
+ const manifestManager_1 = require("./manifestManager");
5
+ const indexContext_1 = require("./indexContext");
6
+ // manifest_status: returns current drift (without repairing) and manifest presence.
7
+ (0, registry_1.registerHandler)('manifest_status', () => {
8
+ const st = (0, indexContext_1.ensureLoaded)();
9
+ const manifest = (0, manifestManager_1.loadManifest)();
10
+ const drift = (0, manifestManager_1.computeManifestDrift)();
11
+ return { hash: st.hash, manifestPresent: !!manifest, count: st.list.length, drift: drift.drift, details: drift.details.slice(0, 25) };
12
+ });
13
+ // manifest_refresh: force rewrite from current index (non-mutating to index itself)
14
+ (0, registry_1.registerHandler)('manifest_refresh', () => {
15
+ const st = (0, indexContext_1.ensureLoaded)();
16
+ const manifest = (0, manifestManager_1.writeManifestFromIndex)();
17
+ return { refreshed: !!manifest, count: manifest?.count ?? 0, hash: st.hash };
18
+ });
19
+ // manifest_repair: recompute manifest if drift present.
20
+ (0, registry_1.registerHandler)('manifest_repair', () => {
21
+ const st = (0, indexContext_1.ensureLoaded)();
22
+ const result = (0, manifestManager_1.repairManifest)();
23
+ return { hash: st.hash, ...result };
24
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MCP tool handlers for inter-agent messaging.
3
+ *
4
+ * Registers 8 tools via registerHandler() following constitution patterns:
5
+ * - A-1: Side-effect import triggers registration
6
+ * - A-5: Audit logging on mutations
7
+ * - Q-5: registerHandler() pattern
8
+ *
9
+ * Messages are NOT stored in the instruction index (A-3).
10
+ */
11
+ /** Reset mailbox (for testing). */
12
+ export declare function _resetMailbox(): void;
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * MCP tool handlers for inter-agent messaging.
4
+ *
5
+ * Registers 8 tools via registerHandler() following constitution patterns:
6
+ * - A-1: Side-effect import triggers registration
7
+ * - A-5: Audit logging on mutations
8
+ * - Q-5: registerHandler() pattern
9
+ *
10
+ * Messages are NOT stored in the instruction index (A-3).
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports._resetMailbox = _resetMailbox;
14
+ const registry_1 = require("../server/registry");
15
+ const auditLog_1 = require("./auditLog");
16
+ const logger_1 = require("./logger");
17
+ const agentMailbox_1 = require("./messaging/agentMailbox");
18
+ const runtimeConfig_1 = require("../config/runtimeConfig");
19
+ const messagingTypes_1 = require("./messaging/messagingTypes");
20
+ // Singleton mailbox instance (lazy init)
21
+ let _mailbox = null;
22
+ function getMailbox() {
23
+ if (!_mailbox) {
24
+ const config = (0, runtimeConfig_1.getRuntimeConfig)().messaging;
25
+ _mailbox = new agentMailbox_1.AgentMailbox(config);
26
+ }
27
+ return _mailbox;
28
+ }
29
+ /** Reset mailbox (for testing). */
30
+ function _resetMailbox() {
31
+ if (_mailbox) {
32
+ _mailbox.destroy();
33
+ _mailbox = null;
34
+ }
35
+ }
36
+ // ── messaging_send (MUTATION) ────────────────────────────────────────────────
37
+ (0, registry_1.registerHandler)('messaging_send', async (params) => {
38
+ const parsed = messagingTypes_1.SendMessageOptionsSchema.safeParse(params);
39
+ if (!parsed.success) {
40
+ throw new Error(`Invalid send options: ${parsed.error.issues.map(i => i.message).join(', ')}`);
41
+ }
42
+ const mailbox = getMailbox();
43
+ const messageId = await mailbox.send(parsed.data);
44
+ (0, auditLog_1.logAudit)('messaging_send', [messageId], {
45
+ channel: params.channel,
46
+ sender: params.sender,
47
+ priority: params.priority,
48
+ });
49
+ (0, logger_1.logInfo)('[messaging] Message sent', { messageId, channel: params.channel, sender: params.sender });
50
+ return {
51
+ messageId,
52
+ channel: params.channel,
53
+ status: 'sent',
54
+ ttlCapped: params.ttlSeconds ? params.ttlSeconds > messagingTypes_1.MAX_TTL_SECONDS : false,
55
+ };
56
+ });
57
+ // ── messaging_read (STABLE) ─────────────────────────────────────────────────
58
+ (0, registry_1.registerHandler)('messaging_read', (params = {}) => {
59
+ const parsed = messagingTypes_1.ReadMessagesOptionsSchema.safeParse(params);
60
+ if (!parsed.success) {
61
+ throw new Error(`Invalid read options: ${parsed.error.issues.map(i => i.message).join(', ')}`);
62
+ }
63
+ const mailbox = getMailbox();
64
+ const messages = mailbox.read(parsed.data);
65
+ return {
66
+ channel: params.channel || 'all',
67
+ reader: params.reader || 'anonymous',
68
+ count: messages.length,
69
+ messages,
70
+ };
71
+ });
72
+ // ── messaging_list_channels (STABLE) ─────────────────────────────────────────
73
+ (0, registry_1.registerHandler)('messaging_list_channels', () => {
74
+ const mailbox = getMailbox();
75
+ const channels = mailbox.listChannels();
76
+ return {
77
+ count: channels.length,
78
+ channels,
79
+ };
80
+ });
81
+ // ── messaging_ack (MUTATION) ─────────────────────────────────────────────────
82
+ (0, registry_1.registerHandler)('messaging_ack', (params) => {
83
+ if (!params.messageIds?.length || !params.reader) {
84
+ throw new Error('Missing required parameters: messageIds, reader');
85
+ }
86
+ const mailbox = getMailbox();
87
+ const acknowledged = mailbox.ack(params.messageIds, params.reader);
88
+ (0, auditLog_1.logAudit)('messaging_ack', params.messageIds, { reader: params.reader });
89
+ return {
90
+ acknowledged,
91
+ reader: params.reader,
92
+ };
93
+ });
94
+ // ── messaging_stats (STABLE) ─────────────────────────────────────────────────
95
+ (0, registry_1.registerHandler)('messaging_stats', (params = {}) => {
96
+ const reader = params.reader || '*';
97
+ const mailbox = getMailbox();
98
+ const stats = mailbox.getStats(reader);
99
+ return {
100
+ reader,
101
+ channel: params.channel || 'all',
102
+ ...stats,
103
+ };
104
+ });
105
+ // ── messaging_get (STABLE) ───────────────────────────────────────────────────
106
+ (0, registry_1.registerHandler)('messaging_get', (params) => {
107
+ if (!params.messageId) {
108
+ throw new Error('Missing required parameter: messageId');
109
+ }
110
+ const mailbox = getMailbox();
111
+ const message = mailbox.getMessage(params.messageId);
112
+ if (!message) {
113
+ return { found: false, messageId: params.messageId };
114
+ }
115
+ return { found: true, message };
116
+ });
117
+ // ── messaging_update (MUTATION) ──────────────────────────────────────────────
118
+ (0, registry_1.registerHandler)('messaging_update', (params) => {
119
+ if (!params.messageId) {
120
+ throw new Error('Missing required parameter: messageId');
121
+ }
122
+ const mailbox = getMailbox();
123
+ const updated = mailbox.updateMessage(params.messageId, {
124
+ body: params.body,
125
+ recipients: params.recipients,
126
+ payload: params.payload,
127
+ persistent: params.persistent,
128
+ });
129
+ if (!updated) {
130
+ return { found: false, messageId: params.messageId };
131
+ }
132
+ (0, auditLog_1.logAudit)('messaging_update', [params.messageId], {
133
+ fields: Object.keys(params).filter(k => k !== 'messageId'),
134
+ });
135
+ return { found: true, message: updated };
136
+ });
137
+ // ── messaging_purge (MUTATION) ───────────────────────────────────────────────
138
+ (0, registry_1.registerHandler)('messaging_purge', (params = {}) => {
139
+ const mailbox = getMailbox();
140
+ let removed = 0;
141
+ let action = 'none';
142
+ if (params.all) {
143
+ removed = mailbox.purgeAll();
144
+ action = 'purge_all';
145
+ }
146
+ else if (params.messageIds?.length) {
147
+ removed = mailbox.deleteMessages(params.messageIds);
148
+ action = 'delete_by_ids';
149
+ }
150
+ else if (params.channel) {
151
+ removed = mailbox.purgeChannel(params.channel);
152
+ action = 'purge_channel';
153
+ }
154
+ else {
155
+ removed = mailbox.purgeAll();
156
+ action = 'purge_all';
157
+ }
158
+ (0, auditLog_1.logAudit)('messaging_purge', [], { action, removed });
159
+ (0, logger_1.logInfo)('[messaging] Messages purged', { action, removed });
160
+ return { action, removed };
161
+ });
162
+ // ── messaging_reply (MUTATION) ───────────────────────────────────────────────
163
+ (0, registry_1.registerHandler)('messaging_reply', async (params) => {
164
+ if (!params.parentId || !params.sender || !params.body) {
165
+ throw new Error('Missing required parameters: parentId, sender, body');
166
+ }
167
+ const mailbox = getMailbox();
168
+ const result = await mailbox.reply(params.parentId, params.sender, params.body, {
169
+ replyAll: params.replyAll,
170
+ recipients: params.recipients,
171
+ priority: params.priority,
172
+ tags: params.tags,
173
+ persistent: params.persistent,
174
+ payload: params.payload,
175
+ });
176
+ (0, auditLog_1.logAudit)('messaging_reply', [result.messageId], {
177
+ parentId: params.parentId,
178
+ sender: params.sender,
179
+ replyAll: params.replyAll,
180
+ });
181
+ (0, logger_1.logInfo)('[messaging] Reply sent', { messageId: result.messageId, parentId: params.parentId, channel: result.channel });
182
+ return {
183
+ messageId: result.messageId,
184
+ channel: result.channel,
185
+ recipients: result.recipients,
186
+ parentId: params.parentId,
187
+ replyAll: !!params.replyAll,
188
+ status: 'sent',
189
+ };
190
+ });
191
+ // ── messaging_thread (STABLE) ────────────────────────────────────────────────
192
+ (0, registry_1.registerHandler)('messaging_thread', (params) => {
193
+ if (!params.parentId) {
194
+ throw new Error('Missing required parameter: parentId');
195
+ }
196
+ const mailbox = getMailbox();
197
+ const messages = mailbox.getThread(params.parentId);
198
+ return {
199
+ parentId: params.parentId,
200
+ count: messages.length,
201
+ messages,
202
+ };
203
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
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 registry_1 = require("../server/registry");
7
+ const indexContext_1 = require("../services/indexContext");
8
+ const features_1 = require("../services/features");
9
+ const InstanceManager_1 = require("../dashboard/server/InstanceManager");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const validationService_1 = require("./validationService");
13
+ (0, registry_1.registerHandler)('metrics_snapshot', () => { const raw = (0, registry_1.getMetricsRaw)(); const methods = Object.entries(raw).map(([method, rec]) => ({ method, count: rec.count, avgMs: rec.count ? +(rec.totalMs / rec.count).toFixed(2) : 0, maxMs: +rec.maxMs.toFixed(2) })).sort((a, b) => a.method.localeCompare(b.method)); const features = (0, features_1.featureStatus)(); const validation = (0, validationService_1.getValidationMetrics)(); return { generatedAt: new Date().toISOString(), methods, features, validation }; });
14
+ // health_check retained here (meta_tools provided by shim for rich output)
15
+ // Resolve version locally (mirrors transport logic) to avoid import cycles
16
+ let VERSION = '0.0.0';
17
+ try {
18
+ const pkgPath = path_1.default.join(process.cwd(), 'package.json');
19
+ if (fs_1.default.existsSync(pkgPath)) {
20
+ const raw = JSON.parse(fs_1.default.readFileSync(pkgPath, 'utf8'));
21
+ if (raw.version)
22
+ VERSION = raw.version;
23
+ }
24
+ }
25
+ catch { /* ignore */ }
26
+ (0, registry_1.registerHandler)('health_check', () => {
27
+ let summary;
28
+ try {
29
+ const st = (0, indexContext_1.getIndexState)();
30
+ if (st.loadSummary) {
31
+ const s = st.loadSummary;
32
+ summary = { scanned: s.scanned, accepted: s.accepted, skipped: s.skipped, reasons: s.reasons, salvage: s.salvage, softWarnings: s.softWarnings };
33
+ }
34
+ }
35
+ catch { /* swallow to keep health resilient */ }
36
+ // Instance discovery — resilient: never fail health due to port-file read errors
37
+ let instances = [];
38
+ try {
39
+ instances = (0, InstanceManager_1.getActiveInstances)().map(i => ({ pid: i.pid, port: i.port, host: i.host, startedAt: i.startedAt, current: i.current }));
40
+ }
41
+ catch { /* swallow */ }
42
+ return { status: 'ok', timestamp: new Date().toISOString(), version: VERSION, pid: process.pid, uptime: Math.round(process.uptime()), index: summary, instances };
43
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,306 @@
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
+ /**
7
+ * handlers.promote.ts — promote_from_repo tool handler.
8
+ *
9
+ * Scans a local Git repository for promotable knowledge content (constitutions,
10
+ * docs, instructions, specs) and upserts them into the instruction index.
11
+ *
12
+ * Content discovery order:
13
+ * 1. .specify/config/promotion-map.json (explicit source→instruction mappings)
14
+ * 2. instructions/*.json (valid instruction JSON files)
15
+ *
16
+ * Dedup via SHA-256 content hashing against existing sourceHash in index.
17
+ */
18
+ const node_crypto_1 = require("node:crypto");
19
+ const node_fs_1 = __importDefault(require("node:fs"));
20
+ const node_path_1 = __importDefault(require("node:path"));
21
+ const registry_1 = require("../server/registry");
22
+ const indexContext_1 = require("./indexContext");
23
+ const classificationService_1 = require("./classificationService");
24
+ const auditLog_1 = require("./auditLog");
25
+ const schemaVersion_1 = require("../versioning/schemaVersion");
26
+ // ---------------------------------------------------------------------------
27
+ // Scope → category mapping
28
+ // ---------------------------------------------------------------------------
29
+ const SCOPE_CATEGORIES = {
30
+ governance: new Set(['governance', 'constitution', 'coding-standards']),
31
+ docs: new Set(['architecture', 'onboarding']),
32
+ specs: new Set(['spec']),
33
+ instructions: new Set(['bootstrap', 'speckit', 'runbook', 'instruction']),
34
+ };
35
+ // ---------------------------------------------------------------------------
36
+ // Helpers
37
+ // ---------------------------------------------------------------------------
38
+ function sha256(content) {
39
+ return (0, node_crypto_1.createHash)('sha256').update(content, 'utf8').digest('hex');
40
+ }
41
+ const INSTRUCTION_ID_RE = /^[a-z0-9][a-z0-9\-_]{0,118}[a-z0-9]$/;
42
+ function isValidInstructionId(id) {
43
+ return INSTRUCTION_ID_RE.test(id);
44
+ }
45
+ function matchesScope(category, scope) {
46
+ if (scope === 'all')
47
+ return true;
48
+ const allowed = SCOPE_CATEGORIES[scope];
49
+ return allowed ? allowed.has(category.toLowerCase()) : false;
50
+ }
51
+ function loadPromotionMap(repoPath) {
52
+ const mapPath = node_path_1.default.join(repoPath, '.specify', 'config', 'promotion-map.json');
53
+ if (!node_fs_1.default.existsSync(mapPath))
54
+ return null;
55
+ try {
56
+ const raw = node_fs_1.default.readFileSync(mapPath, 'utf8');
57
+ const parsed = JSON.parse(raw);
58
+ if (!parsed.sources || !Array.isArray(parsed.sources)) {
59
+ return null;
60
+ }
61
+ return parsed;
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ function buildEntryFromSource(source, content, repoId) {
68
+ const now = new Date().toISOString();
69
+ const sourceId = source.instructionId || source.id || 'unknown';
70
+ const sourceCategory = source.category || source.scope || (Array.isArray(source.categories) ? source.categories[0] : undefined) || 'instruction';
71
+ const extraCategories = Array.isArray(source.categories) ? source.categories : [];
72
+ const allCategories = Array.from(new Set([sourceCategory, ...extraCategories, repoId]));
73
+ return {
74
+ id: sourceId,
75
+ title: source.title,
76
+ body: content,
77
+ priority: source.priority ?? 50,
78
+ audience: 'all',
79
+ requirement: (source.requirement || 'recommended'),
80
+ categories: allCategories,
81
+ primaryCategory: sourceCategory,
82
+ contentType: (source.contentType || 'instruction'),
83
+ sourceHash: sha256(content),
84
+ schemaVersion: schemaVersion_1.SCHEMA_VERSION,
85
+ version: '1.0.0',
86
+ status: 'approved',
87
+ owner: 'promote_from_repo',
88
+ classification: (source.classification || 'internal'),
89
+ semanticSummary: `${source.title} — promoted from ${repoId} repository`,
90
+ sourceWorkspace: repoId,
91
+ createdByAgent: 'promote_from_repo',
92
+ createdAt: now,
93
+ updatedAt: now,
94
+ };
95
+ }
96
+ // Scans .specify/config/promotion-map.json sources
97
+ function scanMappedSources(repoPath, map, scope) {
98
+ const results = [];
99
+ const repoId = node_path_1.default.basename(repoPath);
100
+ for (const source of map.sources) {
101
+ // Support both field naming conventions: path/file, instructionId/id, category/scope/categories
102
+ const sourcePath = source.path || source.file;
103
+ const sourceId = source.instructionId || source.id;
104
+ const sourceCategory = source.category || source.scope || (Array.isArray(source.categories) ? source.categories[0] : undefined) || 'instruction';
105
+ if (!sourcePath || !sourceId)
106
+ continue; // skip entries missing required fields
107
+ if (!matchesScope(sourceCategory, scope))
108
+ continue;
109
+ const filePath = node_path_1.default.join(repoPath, sourcePath);
110
+ const resolvedFile = node_path_1.default.resolve(filePath);
111
+ const resolvedRepo = node_path_1.default.resolve(repoPath);
112
+ if (!resolvedFile.startsWith(resolvedRepo + node_path_1.default.sep) && resolvedFile !== resolvedRepo)
113
+ continue;
114
+ if (!node_fs_1.default.existsSync(filePath))
115
+ continue;
116
+ try {
117
+ const content = node_fs_1.default.readFileSync(filePath, 'utf8');
118
+ const hash = sha256(content);
119
+ const entry = buildEntryFromSource(source, content, repoId);
120
+ results.push({ entry, hash, source: 'map' });
121
+ }
122
+ catch {
123
+ // skip unreadable files
124
+ }
125
+ }
126
+ return results;
127
+ }
128
+ // Scans instructions/*.json in the repo
129
+ function scanInstructionFiles(repoPath) {
130
+ const results = [];
131
+ const instrDir = node_path_1.default.join(repoPath, 'instructions');
132
+ if (!node_fs_1.default.existsSync(instrDir) || !node_fs_1.default.statSync(instrDir).isDirectory())
133
+ return results;
134
+ const files = node_fs_1.default.readdirSync(instrDir).filter((f) => f.endsWith('.json') && !f.startsWith('_'));
135
+ for (const file of files) {
136
+ const filePath = node_path_1.default.join(instrDir, file);
137
+ try {
138
+ const raw = node_fs_1.default.readFileSync(filePath, 'utf8');
139
+ const parsed = JSON.parse(raw);
140
+ // Must have id, title, body to be a valid instruction
141
+ if (!parsed.id || !parsed.title || !parsed.body)
142
+ continue;
143
+ if (typeof parsed.id !== 'string' || typeof parsed.title !== 'string' || typeof parsed.body !== 'string')
144
+ continue;
145
+ const hash = sha256(raw);
146
+ const repoId = node_path_1.default.basename(repoPath);
147
+ const now = new Date().toISOString();
148
+ // Build entry from the file's own fields, filling gaps
149
+ const entry = {
150
+ id: parsed.id,
151
+ title: parsed.title,
152
+ body: parsed.body,
153
+ rationale: parsed.rationale || undefined,
154
+ priority: typeof parsed.priority === 'number' ? parsed.priority : 50,
155
+ audience: parsed.audience || 'all',
156
+ requirement: parsed.requirement || 'recommended',
157
+ categories: Array.isArray(parsed.categories) ? parsed.categories : ['instruction'],
158
+ primaryCategory: parsed.primaryCategory || (Array.isArray(parsed.categories) && parsed.categories.length ? parsed.categories[0] : 'instruction'),
159
+ contentType: parsed.contentType || 'instruction',
160
+ sourceHash: hash,
161
+ schemaVersion: schemaVersion_1.SCHEMA_VERSION,
162
+ version: parsed.version || '1.0.0',
163
+ status: parsed.status || 'approved',
164
+ owner: parsed.owner || 'promote_from_repo',
165
+ classification: parsed.classification || 'internal',
166
+ semanticSummary: parsed.semanticSummary || `${parsed.title} — promoted from ${repoId}`,
167
+ sourceWorkspace: repoId,
168
+ createdByAgent: parsed.createdByAgent || 'promote_from_repo',
169
+ createdAt: parsed.createdAt || now,
170
+ updatedAt: now,
171
+ };
172
+ results.push({ entry, hash, source: 'file' });
173
+ }
174
+ catch {
175
+ // skip malformed JSON
176
+ }
177
+ }
178
+ return results;
179
+ }
180
+ // ---------------------------------------------------------------------------
181
+ // Handler Registration
182
+ // ---------------------------------------------------------------------------
183
+ (0, registry_1.registerHandler)('promote_from_repo', (params) => {
184
+ const { repoPath, scope = 'all', force = false, dryRun = false } = params;
185
+ const repoId = params.repoId || node_path_1.default.basename(repoPath);
186
+ // Validate repoPath
187
+ if (!repoPath || typeof repoPath !== 'string') {
188
+ return { error: 'repoPath is required and must be a string' };
189
+ }
190
+ if (!node_fs_1.default.existsSync(repoPath) || !node_fs_1.default.statSync(repoPath).isDirectory()) {
191
+ return { error: `repoPath does not exist or is not a directory: ${repoPath}` };
192
+ }
193
+ const promoted = [];
194
+ const skipped = [];
195
+ const failed = [];
196
+ const dryRunEntries = [];
197
+ // Collect candidates from promotion map + instruction files
198
+ const candidates = [];
199
+ // 1. Promotion map
200
+ const map = loadPromotionMap(repoPath);
201
+ if (map) {
202
+ candidates.push(...scanMappedSources(repoPath, map, scope));
203
+ }
204
+ // 2. Instruction files (when scope is 'all' or 'instructions')
205
+ if (scope === 'all' || scope === 'instructions') {
206
+ candidates.push(...scanInstructionFiles(repoPath));
207
+ }
208
+ // Dedup: if same ID appears from both map and file, prefer map
209
+ const seen = new Set();
210
+ const deduped = [];
211
+ for (const c of candidates) {
212
+ if (!seen.has(c.entry.id)) {
213
+ seen.add(c.entry.id);
214
+ deduped.push(c);
215
+ }
216
+ }
217
+ // Load current index state
218
+ let IndexState;
219
+ try {
220
+ IndexState = (0, indexContext_1.ensureLoaded)();
221
+ }
222
+ catch (e) {
223
+ return {
224
+ repoPath,
225
+ repoId,
226
+ promoted: [],
227
+ skipped: [],
228
+ failed: [{ id: '*', error: `Failed to load index state: ${e instanceof Error ? e.message : String(e)}` }],
229
+ total: deduped.length,
230
+ promotedAt: new Date().toISOString(),
231
+ };
232
+ }
233
+ const classifier = new classificationService_1.ClassificationService();
234
+ // Process each candidate
235
+ for (const candidate of deduped) {
236
+ const { entry, hash } = candidate;
237
+ // Validate instruction ID format
238
+ if (!isValidInstructionId(entry.id)) {
239
+ failed.push({ id: entry.id, error: `Invalid instruction ID format: ${entry.id}` });
240
+ continue;
241
+ }
242
+ // Validate entry has minimum required fields
243
+ try {
244
+ classifier.normalize(entry); // will throw if fundamentally invalid
245
+ }
246
+ catch (e) {
247
+ failed.push({
248
+ id: entry.id,
249
+ error: `Schema validation failed: ${e instanceof Error ? e.message : String(e)}`,
250
+ });
251
+ continue;
252
+ }
253
+ // Ensure repoId is in categories
254
+ if (!entry.categories.includes(repoId)) {
255
+ entry.categories.push(repoId);
256
+ }
257
+ entry.sourceWorkspace = repoId;
258
+ // Check existing entry for dedup
259
+ const existing = IndexState.byId.get(entry.id);
260
+ if (existing && existing.sourceHash === hash && !force) {
261
+ // Hash unchanged — skip
262
+ if (dryRun) {
263
+ dryRunEntries.push({ id: entry.id, title: entry.title, action: 'skip' });
264
+ }
265
+ skipped.push(entry.id);
266
+ continue;
267
+ }
268
+ const action = existing ? 'update' : 'add';
269
+ if (dryRun) {
270
+ dryRunEntries.push({ id: entry.id, title: entry.title, action });
271
+ continue;
272
+ }
273
+ // Write entry to index
274
+ try {
275
+ (0, indexContext_1.writeEntry)(entry);
276
+ promoted.push(entry.id);
277
+ (0, auditLog_1.logAudit)('promote_from_repo', entry.id, {
278
+ repoPath,
279
+ repoId,
280
+ action,
281
+ sourceHash: hash,
282
+ });
283
+ }
284
+ catch (e) {
285
+ failed.push({
286
+ id: entry.id,
287
+ error: `Write failed: ${e instanceof Error ? e.message : String(e)}`,
288
+ });
289
+ }
290
+ }
291
+ // writeEntry() already calls touchIndexVersion() for each entry,
292
+ // so no explicit touch needed here.
293
+ const result = {
294
+ repoPath,
295
+ repoId,
296
+ promoted,
297
+ skipped,
298
+ failed,
299
+ total: deduped.length,
300
+ promotedAt: new Date().toISOString(),
301
+ };
302
+ if (dryRun) {
303
+ result.dryRunEntries = dryRunEntries;
304
+ }
305
+ return result;
306
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const registry_1 = require("../server/registry");
4
+ const promptReviewService_1 = require("./promptReviewService");
5
+ const promptService = new promptReviewService_1.PromptReviewService();
6
+ (0, registry_1.registerHandler)('prompt_review', (p) => { const raw = p.prompt || ''; const MAX = 10_000; if (raw.length > MAX)
7
+ return { truncated: true, message: 'prompt too large', max: MAX }; const sanitized = raw.replace(/\0/g, ''); const issues = promptService.review(sanitized); const summary = (0, promptReviewService_1.summarizeIssues)(issues); return { issues, summary, length: sanitized.length }; });