@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,241 @@
1
+ "use strict";
2
+ /**
3
+ * JsonFileStore — JSON-file-per-instruction storage backend.
4
+ *
5
+ * Wraps the existing file-based storage pattern: each instruction is a
6
+ * separate .json file in a directory. This is the default backend.
7
+ *
8
+ * Implements IInstructionStore for the storage abstraction layer.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.JsonFileStore = void 0;
15
+ const fs_1 = __importDefault(require("fs"));
16
+ const path_1 = __importDefault(require("path"));
17
+ const crypto_1 = __importDefault(require("crypto"));
18
+ const hashUtils_js_1 = require("./hashUtils.js");
19
+ class JsonFileStore {
20
+ dir;
21
+ cache = new Map();
22
+ loaded = false;
23
+ /**
24
+ * @param dir - Directory containing instruction .json files.
25
+ */
26
+ constructor(dir) {
27
+ this.dir = dir;
28
+ if (!fs_1.default.existsSync(dir)) {
29
+ fs_1.default.mkdirSync(dir, { recursive: true });
30
+ }
31
+ }
32
+ // ── Lifecycle ──────────────────────────────────────────────────────
33
+ load() {
34
+ const errors = [];
35
+ const entries = [];
36
+ let scanned = 0;
37
+ let skipped = 0;
38
+ const files = fs_1.default.readdirSync(this.dir).filter(f => f.endsWith('.json') && !f.startsWith('_') && !f.startsWith('.'));
39
+ scanned = files.length;
40
+ for (const file of files) {
41
+ try {
42
+ const raw = fs_1.default.readFileSync(path_1.default.join(this.dir, file), 'utf-8');
43
+ const parsed = JSON.parse(raw.replace(/^\uFEFF/, ''));
44
+ // Handle arrays (some files contain instruction arrays)
45
+ const items = Array.isArray(parsed) ? parsed : [parsed];
46
+ for (const item of items) {
47
+ const entry = item;
48
+ if (!entry.id || !entry.title || !entry.body) {
49
+ skipped++;
50
+ continue;
51
+ }
52
+ entries.push(entry);
53
+ }
54
+ }
55
+ catch (err) {
56
+ skipped++;
57
+ errors.push({ file, error: err instanceof Error ? err.message : 'Unknown parse error' });
58
+ }
59
+ }
60
+ // Deduplicate by ID (last-write-wins)
61
+ const byId = new Map();
62
+ for (const e of entries) {
63
+ byId.set(e.id, e);
64
+ }
65
+ const deduped = Array.from(byId.values());
66
+ this.cache = byId;
67
+ this.loaded = true;
68
+ return {
69
+ entries: deduped,
70
+ hash: (0, hashUtils_js_1.computeGovernanceHashFromEntries)(deduped),
71
+ errors,
72
+ debug: { scanned, accepted: deduped.length, skipped },
73
+ summary: {
74
+ scanned,
75
+ accepted: deduped.length,
76
+ skipped,
77
+ reasons: errors.length > 0 ? { 'parse-error': errors.length } : {},
78
+ },
79
+ };
80
+ }
81
+ close() {
82
+ this.cache.clear();
83
+ this.loaded = false;
84
+ }
85
+ // ── CRUD ───────────────────────────────────────────────────────────
86
+ get(id) {
87
+ this.ensureLoaded();
88
+ return this.cache.get(id) ?? null;
89
+ }
90
+ write(entry) {
91
+ // Write to disk
92
+ const filePath = path_1.default.join(this.dir, `${entry.id}.json`);
93
+ const tmpPath = `${filePath}.${crypto_1.default.randomBytes(4).toString('hex')}.tmp`;
94
+ fs_1.default.writeFileSync(tmpPath, JSON.stringify(entry, null, 2), 'utf-8');
95
+ fs_1.default.renameSync(tmpPath, filePath);
96
+ // Update in-memory cache
97
+ this.cache.set(entry.id, entry);
98
+ this.loaded = true;
99
+ }
100
+ remove(id) {
101
+ const filePath = path_1.default.join(this.dir, `${id}.json`);
102
+ try {
103
+ if (fs_1.default.existsSync(filePath)) {
104
+ fs_1.default.unlinkSync(filePath);
105
+ }
106
+ }
107
+ catch {
108
+ // No-op on failure (file may already be gone)
109
+ }
110
+ this.cache.delete(id);
111
+ }
112
+ // ── Queries ────────────────────────────────────────────────────────
113
+ list(opts) {
114
+ this.ensureLoaded();
115
+ let result = Array.from(this.cache.values());
116
+ if (opts?.category) {
117
+ result = result.filter(e => e.categories?.includes(opts.category));
118
+ }
119
+ if (opts?.contentType) {
120
+ result = result.filter(e => e.contentType === opts.contentType);
121
+ }
122
+ return result;
123
+ }
124
+ query(opts) {
125
+ this.ensureLoaded();
126
+ let result = Array.from(this.cache.values());
127
+ if (opts.text) {
128
+ const lower = opts.text.toLowerCase();
129
+ result = result.filter(e => e.title.toLowerCase().includes(lower) ||
130
+ e.body.toLowerCase().includes(lower) ||
131
+ (e.semanticSummary && e.semanticSummary.toLowerCase().includes(lower)));
132
+ }
133
+ if (opts.categoriesAny?.length) {
134
+ const set = new Set(opts.categoriesAny);
135
+ result = result.filter(e => e.categories?.some(c => set.has(c)));
136
+ }
137
+ if (opts.categoriesAll?.length) {
138
+ result = result.filter(e => opts.categoriesAll.every(c => e.categories?.includes(c)));
139
+ }
140
+ if (opts.excludeCategories?.length) {
141
+ const excl = new Set(opts.excludeCategories);
142
+ result = result.filter(e => !e.categories?.some(c => excl.has(c)));
143
+ }
144
+ if (opts.contentType) {
145
+ result = result.filter(e => e.contentType === opts.contentType);
146
+ }
147
+ if (opts.priorityMin !== undefined) {
148
+ result = result.filter(e => e.priority >= opts.priorityMin);
149
+ }
150
+ if (opts.priorityMax !== undefined) {
151
+ result = result.filter(e => e.priority <= opts.priorityMax);
152
+ }
153
+ if (opts.priorityTiers?.length) {
154
+ const tiers = new Set(opts.priorityTiers);
155
+ result = result.filter(e => e.priorityTier && tiers.has(e.priorityTier));
156
+ }
157
+ if (opts.requirements?.length) {
158
+ const reqs = new Set(opts.requirements);
159
+ result = result.filter(e => reqs.has(e.requirement));
160
+ }
161
+ // Pagination
162
+ if (opts.offset) {
163
+ result = result.slice(opts.offset);
164
+ }
165
+ if (opts.limit) {
166
+ result = result.slice(0, opts.limit);
167
+ }
168
+ return result;
169
+ }
170
+ listScoped(opts) {
171
+ this.ensureLoaded();
172
+ let result = Array.from(this.cache.values());
173
+ if (opts.userId) {
174
+ result = result.filter(e => e.userId === opts.userId || e.audience === 'all');
175
+ }
176
+ if (opts.workspaceId) {
177
+ result = result.filter(e => e.workspaceId === opts.workspaceId || e.audience === 'all');
178
+ }
179
+ if (opts.teamIds?.length) {
180
+ const teams = new Set(opts.teamIds);
181
+ result = result.filter(e => e.audience === 'all' ||
182
+ e.teamIds?.some(t => teams.has(t)));
183
+ }
184
+ return result;
185
+ }
186
+ search(opts) {
187
+ this.ensureLoaded();
188
+ const results = [];
189
+ for (const entry of this.cache.values()) {
190
+ let score = 0;
191
+ const titleLower = entry.title.toLowerCase();
192
+ const bodyLower = entry.body.toLowerCase();
193
+ const catStr = (entry.categories ?? []).join(' ').toLowerCase();
194
+ for (const kw of opts.keywords) {
195
+ const kwLower = opts.caseSensitive ? kw : kw.toLowerCase();
196
+ const title = opts.caseSensitive ? entry.title : titleLower;
197
+ const body = opts.caseSensitive ? entry.body : bodyLower;
198
+ if (title.includes(kwLower))
199
+ score += 3;
200
+ if (body.includes(kwLower))
201
+ score += 1;
202
+ if (opts.includeCategories && catStr.includes(kwLower))
203
+ score += 2;
204
+ }
205
+ if (score > 0) {
206
+ results.push({ id: entry.id, score });
207
+ }
208
+ }
209
+ results.sort((a, b) => b.score - a.score);
210
+ if (opts.limit) {
211
+ return results.slice(0, opts.limit);
212
+ }
213
+ return results;
214
+ }
215
+ categories() {
216
+ this.ensureLoaded();
217
+ const counts = new Map();
218
+ for (const entry of this.cache.values()) {
219
+ for (const cat of entry.categories ?? []) {
220
+ counts.set(cat, (counts.get(cat) ?? 0) + 1);
221
+ }
222
+ }
223
+ return counts;
224
+ }
225
+ // ── Integrity ──────────────────────────────────────────────────────
226
+ computeHash() {
227
+ this.ensureLoaded();
228
+ return (0, hashUtils_js_1.computeGovernanceHashFromEntries)(Array.from(this.cache.values()));
229
+ }
230
+ count() {
231
+ this.ensureLoaded();
232
+ return this.cache.size;
233
+ }
234
+ // ── Internal ───────────────────────────────────────────────────────
235
+ ensureLoaded() {
236
+ if (!this.loaded) {
237
+ this.load();
238
+ }
239
+ }
240
+ }
241
+ exports.JsonFileStore = JsonFileStore;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Migration engine — bidirectional JSON ↔ SQLite migration.
3
+ *
4
+ * Uses Node.js built-in node:sqlite. Zero third-party dependencies.
5
+ */
6
+ export interface MigrationOptions {
7
+ onProgress?: (current: number, total: number) => void;
8
+ }
9
+ export interface MigrationResult {
10
+ migrated: number;
11
+ errors: {
12
+ file: string;
13
+ error: string;
14
+ }[];
15
+ }
16
+ export interface ExportResult {
17
+ exported: number;
18
+ errors: {
19
+ id: string;
20
+ error: string;
21
+ }[];
22
+ }
23
+ /**
24
+ * Migrate all instructions from JSON files to a SQLite database.
25
+ *
26
+ * Idempotent: uses INSERT OR REPLACE so re-running is safe.
27
+ * Atomic: all writes happen via SqliteStore (individual INSERT OR REPLACE).
28
+ */
29
+ export declare function migrateJsonToSqlite(jsonDir: string, dbPath: string, opts?: MigrationOptions): MigrationResult;
30
+ /**
31
+ * Export all instructions from a SQLite database to JSON files.
32
+ *
33
+ * Each entry becomes a separate .json file named by ID.
34
+ */
35
+ export declare function migrateSqliteToJson(dbPath: string, jsonDir: string, opts?: MigrationOptions): ExportResult;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Migration engine — bidirectional JSON ↔ SQLite migration.
4
+ *
5
+ * Uses Node.js built-in node:sqlite. Zero third-party dependencies.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.migrateJsonToSqlite = migrateJsonToSqlite;
12
+ exports.migrateSqliteToJson = migrateSqliteToJson;
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const jsonFileStore_js_1 = require("./jsonFileStore.js");
16
+ const sqliteStore_js_1 = require("./sqliteStore.js");
17
+ /**
18
+ * Migrate all instructions from JSON files to a SQLite database.
19
+ *
20
+ * Idempotent: uses INSERT OR REPLACE so re-running is safe.
21
+ * Atomic: all writes happen via SqliteStore (individual INSERT OR REPLACE).
22
+ */
23
+ function migrateJsonToSqlite(jsonDir, dbPath, opts) {
24
+ const jsonStore = new jsonFileStore_js_1.JsonFileStore(jsonDir);
25
+ const loadResult = jsonStore.load();
26
+ const entries = loadResult.entries;
27
+ const total = entries.length;
28
+ const errors = [...loadResult.errors];
29
+ // Ensure DB directory exists
30
+ const dbDir = path_1.default.dirname(dbPath);
31
+ if (!fs_1.default.existsSync(dbDir)) {
32
+ fs_1.default.mkdirSync(dbDir, { recursive: true });
33
+ }
34
+ const sqliteStore = new sqliteStore_js_1.SqliteStore(dbPath);
35
+ let migrated = 0;
36
+ try {
37
+ for (let i = 0; i < entries.length; i++) {
38
+ try {
39
+ sqliteStore.write(entries[i]);
40
+ migrated++;
41
+ }
42
+ catch (err) {
43
+ errors.push({
44
+ file: entries[i].id,
45
+ error: err instanceof Error ? err.message : 'Write failed',
46
+ });
47
+ }
48
+ opts?.onProgress?.(i + 1, total);
49
+ }
50
+ }
51
+ finally {
52
+ sqliteStore.close();
53
+ jsonStore.close();
54
+ }
55
+ return { migrated, errors };
56
+ }
57
+ /**
58
+ * Export all instructions from a SQLite database to JSON files.
59
+ *
60
+ * Each entry becomes a separate .json file named by ID.
61
+ */
62
+ function migrateSqliteToJson(dbPath, jsonDir, opts) {
63
+ if (!fs_1.default.existsSync(jsonDir)) {
64
+ fs_1.default.mkdirSync(jsonDir, { recursive: true });
65
+ }
66
+ const sqliteStore = new sqliteStore_js_1.SqliteStore(dbPath);
67
+ const loadResult = sqliteStore.load();
68
+ const entries = loadResult.entries;
69
+ const total = entries.length;
70
+ const errors = [];
71
+ const jsonStore = new jsonFileStore_js_1.JsonFileStore(jsonDir);
72
+ let exported = 0;
73
+ try {
74
+ for (let i = 0; i < entries.length; i++) {
75
+ try {
76
+ jsonStore.write(entries[i]);
77
+ exported++;
78
+ }
79
+ catch (err) {
80
+ errors.push({
81
+ id: entries[i].id,
82
+ error: err instanceof Error ? err.message : 'Write failed',
83
+ });
84
+ }
85
+ opts?.onProgress?.(i + 1, total);
86
+ }
87
+ }
88
+ finally {
89
+ sqliteStore.close();
90
+ jsonStore.close();
91
+ }
92
+ return { exported, errors };
93
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * SqliteMessageStore — Message persistence backed by node:sqlite.
3
+ *
4
+ * Stores agent messages in the messages table with indexing on
5
+ * channel, sender, parent_id, and created_at for efficient queries.
6
+ */
7
+ export interface StoredMessage {
8
+ id: string;
9
+ channel: string;
10
+ sender: string;
11
+ recipients: string[];
12
+ body: string;
13
+ priority: string;
14
+ tags: string[];
15
+ parentId: string | null;
16
+ persistent: boolean;
17
+ ttlSeconds: number | null;
18
+ requiresAck: boolean;
19
+ ackBySeconds: number | null;
20
+ readBy: string[];
21
+ payload: unknown;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ }
25
+ export interface MessageQuery {
26
+ channel?: string;
27
+ sender?: string;
28
+ tags?: string[];
29
+ parentId?: string;
30
+ limit?: number;
31
+ offset?: number;
32
+ }
33
+ export declare class SqliteMessageStore {
34
+ private db;
35
+ constructor(dbPath: string);
36
+ /** Store a message. */
37
+ write(msg: StoredMessage): void;
38
+ /** Get a message by ID. */
39
+ get(id: string): StoredMessage | null;
40
+ /** Query messages with filters. */
41
+ query(opts: MessageQuery): StoredMessage[];
42
+ /** Get thread (parent + all descendants). */
43
+ getThread(parentId: string): StoredMessage[];
44
+ /** List distinct channels. */
45
+ channels(): string[];
46
+ /** Delete a message by ID. */
47
+ remove(id: string): void;
48
+ /** Purge all messages in a channel. */
49
+ purgeChannel(channel: string): number;
50
+ /** Count messages. */
51
+ count(channel?: string): number;
52
+ close(): void;
53
+ }
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * SqliteMessageStore — Message persistence backed by node:sqlite.
4
+ *
5
+ * Stores agent messages in the messages table with indexing on
6
+ * channel, sender, parent_id, and created_at for efficient queries.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SqliteMessageStore = void 0;
10
+ const node_sqlite_1 = require("node:sqlite");
11
+ const sqliteSchema_js_1 = require("./sqliteSchema.js");
12
+ function safeJsonParse(raw, fallback) {
13
+ if (raw == null)
14
+ return fallback;
15
+ try {
16
+ return JSON.parse(raw);
17
+ }
18
+ catch {
19
+ return fallback;
20
+ }
21
+ }
22
+ function rowToMessage(row) {
23
+ return {
24
+ id: row.id,
25
+ channel: row.channel,
26
+ sender: row.sender,
27
+ recipients: safeJsonParse(row.recipients, []),
28
+ body: row.body,
29
+ priority: row.priority ?? 'normal',
30
+ tags: safeJsonParse(row.tags, []),
31
+ parentId: row.parent_id,
32
+ persistent: !!row.persistent,
33
+ ttlSeconds: row.ttl_seconds,
34
+ requiresAck: !!row.requires_ack,
35
+ ackBySeconds: row.ack_by_seconds,
36
+ readBy: safeJsonParse(row.read_by, []),
37
+ payload: safeJsonParse(row.payload, null),
38
+ createdAt: row.created_at,
39
+ updatedAt: row.updated_at,
40
+ };
41
+ }
42
+ class SqliteMessageStore {
43
+ db;
44
+ constructor(dbPath) {
45
+ this.db = new node_sqlite_1.DatabaseSync(dbPath);
46
+ this.db.exec(sqliteSchema_js_1.PRAGMAS);
47
+ this.db.exec(sqliteSchema_js_1.INSTRUCTIONS_DDL);
48
+ }
49
+ /** Store a message. */
50
+ write(msg) {
51
+ this.db.prepare(`
52
+ INSERT OR REPLACE INTO messages (
53
+ id, channel, sender, recipients, body, priority, tags,
54
+ parent_id, persistent, ttl_seconds, requires_ack, ack_by_seconds,
55
+ read_by, payload, created_at, updated_at
56
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
57
+ `).run(msg.id, msg.channel, msg.sender, JSON.stringify(msg.recipients), msg.body, msg.priority, JSON.stringify(msg.tags), msg.parentId, msg.persistent ? 1 : 0, msg.ttlSeconds, msg.requiresAck ? 1 : 0, msg.ackBySeconds, JSON.stringify(msg.readBy), JSON.stringify(msg.payload), msg.createdAt, msg.updatedAt);
58
+ }
59
+ /** Get a message by ID. */
60
+ get(id) {
61
+ const row = this.db.prepare('SELECT * FROM messages WHERE id = ?').get(id);
62
+ return row ? rowToMessage(row) : null;
63
+ }
64
+ /** Query messages with filters. */
65
+ query(opts) {
66
+ const conditions = [];
67
+ const params = [];
68
+ if (opts.channel) {
69
+ conditions.push('channel = ?');
70
+ params.push(opts.channel);
71
+ }
72
+ if (opts.sender) {
73
+ conditions.push('sender = ?');
74
+ params.push(opts.sender);
75
+ }
76
+ if (opts.parentId) {
77
+ conditions.push('parent_id = ?');
78
+ params.push(opts.parentId);
79
+ }
80
+ let sql = 'SELECT * FROM messages';
81
+ if (conditions.length > 0)
82
+ sql += ' WHERE ' + conditions.join(' AND ');
83
+ sql += ' ORDER BY created_at DESC';
84
+ if (opts.limit) {
85
+ sql += ' LIMIT ?';
86
+ params.push(opts.limit);
87
+ }
88
+ if (opts.offset) {
89
+ sql += ' OFFSET ?';
90
+ params.push(opts.offset);
91
+ }
92
+ const rows = this.db.prepare(sql).all(...params);
93
+ let results = rows.map(r => rowToMessage(r));
94
+ // Tag filtering (post-query since tags are JSON arrays)
95
+ if (opts.tags?.length) {
96
+ const tagSet = new Set(opts.tags);
97
+ results = results.filter(m => m.tags.some(t => tagSet.has(t)));
98
+ }
99
+ return results;
100
+ }
101
+ /** Get thread (parent + all descendants). */
102
+ getThread(parentId) {
103
+ const results = [];
104
+ const parent = this.get(parentId);
105
+ if (parent)
106
+ results.push(parent);
107
+ // Recursive CTE would be ideal but simple BFS for now
108
+ const children = this.db.prepare('SELECT * FROM messages WHERE parent_id = ? ORDER BY created_at ASC').all(parentId);
109
+ for (const row of children) {
110
+ const msg = rowToMessage(row);
111
+ results.push(msg);
112
+ // Recursively get children of children
113
+ const descendants = this.getThread(msg.id);
114
+ // Skip the first element (which is msg itself from the recursive call's parent lookup)
115
+ results.push(...descendants.slice(1));
116
+ }
117
+ return results;
118
+ }
119
+ /** List distinct channels. */
120
+ channels() {
121
+ const rows = this.db.prepare('SELECT DISTINCT channel FROM messages ORDER BY channel').all();
122
+ return rows.map(r => r.channel);
123
+ }
124
+ /** Delete a message by ID. */
125
+ remove(id) {
126
+ this.db.prepare('DELETE FROM messages WHERE id = ?').run(id);
127
+ }
128
+ /** Purge all messages in a channel. */
129
+ purgeChannel(channel) {
130
+ const result = this.db.prepare('DELETE FROM messages WHERE channel = ?').run(channel);
131
+ return result.changes;
132
+ }
133
+ /** Count messages. */
134
+ count(channel) {
135
+ if (channel) {
136
+ const row = this.db.prepare('SELECT COUNT(*) as cnt FROM messages WHERE channel = ?').get(channel);
137
+ return row?.cnt ?? 0;
138
+ }
139
+ const row = this.db.prepare('SELECT COUNT(*) as cnt FROM messages').get();
140
+ return row?.cnt ?? 0;
141
+ }
142
+ close() {
143
+ this.db.close();
144
+ }
145
+ }
146
+ exports.SqliteMessageStore = SqliteMessageStore;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * SQLite schema DDL for instruction storage.
3
+ *
4
+ * Uses Node.js built-in node:sqlite (DatabaseSync). No third-party packages.
5
+ * WAL mode enabled for concurrent read performance.
6
+ */
7
+ export declare const SCHEMA_VERSION = "1";
8
+ export declare const INSTRUCTIONS_DDL = "\nCREATE TABLE IF NOT EXISTS instructions (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n body TEXT NOT NULL,\n rationale TEXT,\n priority INTEGER NOT NULL DEFAULT 50,\n audience TEXT NOT NULL DEFAULT 'all',\n requirement TEXT NOT NULL DEFAULT 'recommended',\n categories TEXT NOT NULL DEFAULT '[]',\n content_type TEXT NOT NULL DEFAULT 'instruction',\n primary_category TEXT,\n source_hash TEXT NOT NULL DEFAULT '',\n schema_version TEXT NOT NULL DEFAULT '4',\n deprecated_by TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n version TEXT DEFAULT '1.0.0',\n status TEXT DEFAULT 'approved',\n owner TEXT,\n priority_tier TEXT,\n classification TEXT DEFAULT 'public',\n last_reviewed_at TEXT,\n next_review_due TEXT,\n review_interval_days INTEGER,\n change_log TEXT DEFAULT '[]',\n supersedes TEXT,\n archived_at TEXT,\n workspace_id TEXT,\n user_id TEXT,\n team_ids TEXT DEFAULT '[]',\n semantic_summary TEXT,\n created_by_agent TEXT,\n source_workspace TEXT,\n risk_score REAL,\n usage_count INTEGER DEFAULT 0,\n first_seen_ts TEXT,\n last_used_at TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_instructions_content_type ON instructions(content_type);\nCREATE INDEX IF NOT EXISTS idx_instructions_status ON instructions(status);\nCREATE INDEX IF NOT EXISTS idx_instructions_priority ON instructions(priority);\nCREATE INDEX IF NOT EXISTS idx_instructions_priority_tier ON instructions(priority_tier);\nCREATE INDEX IF NOT EXISTS idx_instructions_audience ON instructions(audience);\n\nCREATE TABLE IF NOT EXISTS usage (\n instruction_id TEXT PRIMARY KEY,\n usage_count INTEGER DEFAULT 0,\n first_seen_ts TEXT,\n last_used_at TEXT,\n last_action TEXT,\n last_signal TEXT,\n last_comment TEXT\n);\n\nCREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n channel TEXT NOT NULL,\n sender TEXT NOT NULL,\n recipients TEXT NOT NULL DEFAULT '[]',\n body TEXT NOT NULL,\n priority TEXT DEFAULT 'normal',\n tags TEXT DEFAULT '[]',\n parent_id TEXT,\n persistent INTEGER DEFAULT 0,\n ttl_seconds INTEGER,\n requires_ack INTEGER DEFAULT 0,\n ack_by_seconds INTEGER,\n read_by TEXT DEFAULT '[]',\n payload TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_messages_channel ON messages(channel);\nCREATE INDEX IF NOT EXISTS idx_messages_sender ON messages(sender);\nCREATE INDEX IF NOT EXISTS idx_messages_parent_id ON messages(parent_id);\nCREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);\n\nCREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT\n);\n";
9
+ /** FTS5 virtual table for full-text search. Created separately since it needs content sync. */
10
+ export declare const FTS5_DDL = "\nCREATE VIRTUAL TABLE IF NOT EXISTS instructions_fts USING fts5(\n id, title, body, categories,\n content='instructions',\n content_rowid='rowid'\n);\n\n-- Triggers to keep FTS5 in sync with instructions table\nCREATE TRIGGER IF NOT EXISTS instructions_ai AFTER INSERT ON instructions BEGIN\n INSERT INTO instructions_fts(rowid, id, title, body, categories) VALUES (new.rowid, new.id, new.title, new.body, new.categories);\nEND;\nCREATE TRIGGER IF NOT EXISTS instructions_ad AFTER DELETE ON instructions BEGIN\n INSERT INTO instructions_fts(instructions_fts, rowid, id, title, body, categories) VALUES('delete', old.rowid, old.id, old.title, old.body, old.categories);\nEND;\nCREATE TRIGGER IF NOT EXISTS instructions_au AFTER UPDATE ON instructions BEGIN\n INSERT INTO instructions_fts(instructions_fts, rowid, id, title, body, categories) VALUES('delete', old.rowid, old.id, old.title, old.body, old.categories);\n INSERT INTO instructions_fts(rowid, id, title, body, categories) VALUES (new.rowid, new.id, new.title, new.body, new.categories);\nEND;\n";
11
+ /** Enable WAL mode and recommended pragmas. */
12
+ export declare const PRAGMAS = "\nPRAGMA journal_mode=WAL;\nPRAGMA busy_timeout=5000;\nPRAGMA synchronous=NORMAL;\nPRAGMA foreign_keys=ON;\n";