@skillsmith/core 0.4.0 → 0.4.2

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 (612) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
  3. package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
  4. package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -1
  5. package/dist/src/analysis/adapters/java-parsers.d.ts +64 -0
  6. package/dist/src/analysis/adapters/java-parsers.d.ts.map +1 -0
  7. package/dist/src/analysis/adapters/java-parsers.js +114 -0
  8. package/dist/src/analysis/adapters/java-parsers.js.map +1 -0
  9. package/dist/src/analysis/adapters/java.d.ts +1 -51
  10. package/dist/src/analysis/adapters/java.d.ts.map +1 -1
  11. package/dist/src/analysis/adapters/java.js +94 -205
  12. package/dist/src/analysis/adapters/java.js.map +1 -1
  13. package/dist/src/analysis/adapters/python-frameworks.d.ts +21 -0
  14. package/dist/src/analysis/adapters/python-frameworks.d.ts.map +1 -0
  15. package/dist/src/analysis/adapters/python-frameworks.js +86 -0
  16. package/dist/src/analysis/adapters/python-frameworks.js.map +1 -0
  17. package/dist/src/analysis/adapters/python.d.ts +0 -50
  18. package/dist/src/analysis/adapters/python.d.ts.map +1 -1
  19. package/dist/src/analysis/adapters/python.js +5 -120
  20. package/dist/src/analysis/adapters/python.js.map +1 -1
  21. package/dist/src/analysis/adapters/rust-parsers.d.ts +33 -0
  22. package/dist/src/analysis/adapters/rust-parsers.d.ts.map +1 -0
  23. package/dist/src/analysis/adapters/rust-parsers.js +94 -0
  24. package/dist/src/analysis/adapters/rust-parsers.js.map +1 -0
  25. package/dist/src/analysis/adapters/rust.d.ts +1 -43
  26. package/dist/src/analysis/adapters/rust.d.ts.map +1 -1
  27. package/dist/src/analysis/adapters/rust.js +74 -173
  28. package/dist/src/analysis/adapters/rust.js.map +1 -1
  29. package/dist/src/analysis/language-detector.d.ts +4 -20
  30. package/dist/src/analysis/language-detector.d.ts.map +1 -1
  31. package/dist/src/analysis/language-detector.js +2 -399
  32. package/dist/src/analysis/language-detector.js.map +1 -1
  33. package/dist/src/analysis/language-detector.patterns.d.ts +17 -0
  34. package/dist/src/analysis/language-detector.patterns.d.ts.map +1 -0
  35. package/dist/src/analysis/language-detector.patterns.js +413 -0
  36. package/dist/src/analysis/language-detector.patterns.js.map +1 -0
  37. package/dist/src/analysis/language-detector.types.d.ts +48 -0
  38. package/dist/src/analysis/language-detector.types.d.ts.map +1 -0
  39. package/dist/src/analysis/language-detector.types.js +6 -0
  40. package/dist/src/analysis/language-detector.types.js.map +1 -0
  41. package/dist/src/analysis/metrics.d.ts +22 -219
  42. package/dist/src/analysis/metrics.d.ts.map +1 -1
  43. package/dist/src/analysis/metrics.implementations.d.ts +39 -0
  44. package/dist/src/analysis/metrics.implementations.d.ts.map +1 -0
  45. package/dist/src/analysis/metrics.implementations.js +114 -0
  46. package/dist/src/analysis/metrics.implementations.js.map +1 -0
  47. package/dist/src/analysis/metrics.js +21 -224
  48. package/dist/src/analysis/metrics.js.map +1 -1
  49. package/dist/src/analysis/metrics.types.d.ts +79 -0
  50. package/dist/src/analysis/metrics.types.d.ts.map +1 -0
  51. package/dist/src/analysis/metrics.types.js +6 -0
  52. package/dist/src/analysis/metrics.types.js.map +1 -0
  53. package/dist/src/analysis/worker-pool.d.ts +25 -52
  54. package/dist/src/analysis/worker-pool.d.ts.map +1 -1
  55. package/dist/src/analysis/worker-pool.js +29 -181
  56. package/dist/src/analysis/worker-pool.js.map +1 -1
  57. package/dist/src/analysis/worker-types.d.ts +64 -0
  58. package/dist/src/analysis/worker-types.d.ts.map +1 -0
  59. package/dist/src/analysis/worker-types.js +11 -0
  60. package/dist/src/analysis/worker-types.js.map +1 -0
  61. package/dist/src/analysis/worker-utils.d.ts +49 -0
  62. package/dist/src/analysis/worker-utils.d.ts.map +1 -0
  63. package/dist/src/analysis/worker-utils.js +206 -0
  64. package/dist/src/analysis/worker-utils.js.map +1 -0
  65. package/dist/src/analytics/AnalyticsRepository.d.ts +1 -5
  66. package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
  67. package/dist/src/analytics/AnalyticsRepository.helpers.d.ts +28 -0
  68. package/dist/src/analytics/AnalyticsRepository.helpers.d.ts.map +1 -0
  69. package/dist/src/analytics/AnalyticsRepository.helpers.js +90 -0
  70. package/dist/src/analytics/AnalyticsRepository.helpers.js.map +1 -0
  71. package/dist/src/analytics/AnalyticsRepository.js +16 -129
  72. package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
  73. package/dist/src/analytics/AnalyticsRepository.types.d.ts +82 -0
  74. package/dist/src/analytics/AnalyticsRepository.types.d.ts.map +1 -0
  75. package/dist/src/analytics/AnalyticsRepository.types.js +8 -0
  76. package/dist/src/analytics/AnalyticsRepository.types.js.map +1 -0
  77. package/dist/src/analytics/ROIDashboardService.js +4 -2
  78. package/dist/src/analytics/ROIDashboardService.js.map +1 -1
  79. package/dist/src/api/cache.d.ts.map +1 -1
  80. package/dist/src/api/cache.js.map +1 -1
  81. package/dist/src/api/client.d.ts +6 -121
  82. package/dist/src/api/client.d.ts.map +1 -1
  83. package/dist/src/api/client.js +29 -129
  84. package/dist/src/api/client.js.map +1 -1
  85. package/dist/src/api/schemas.d.ts +122 -0
  86. package/dist/src/api/schemas.d.ts.map +1 -0
  87. package/dist/src/api/schemas.js +71 -0
  88. package/dist/src/api/schemas.js.map +1 -0
  89. package/dist/src/api/types.d.ts +1 -1
  90. package/dist/src/api/types.d.ts.map +1 -1
  91. package/dist/src/api/utils.d.ts +35 -0
  92. package/dist/src/api/utils.d.ts.map +1 -0
  93. package/dist/src/api/utils.js +86 -0
  94. package/dist/src/api/utils.js.map +1 -0
  95. package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
  96. package/dist/src/benchmarks/BenchmarkRunner.js +1 -1
  97. package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
  98. package/dist/src/billing/BillingService.d.ts +15 -53
  99. package/dist/src/billing/BillingService.d.ts.map +1 -1
  100. package/dist/src/billing/BillingService.helpers.d.ts +15 -0
  101. package/dist/src/billing/BillingService.helpers.d.ts.map +1 -0
  102. package/dist/src/billing/BillingService.helpers.js +45 -0
  103. package/dist/src/billing/BillingService.helpers.js.map +1 -0
  104. package/dist/src/billing/BillingService.js +49 -179
  105. package/dist/src/billing/BillingService.js.map +1 -1
  106. package/dist/src/billing/BillingService.types.d.ts +52 -0
  107. package/dist/src/billing/BillingService.types.d.ts.map +1 -0
  108. package/dist/src/billing/BillingService.types.js +6 -0
  109. package/dist/src/billing/BillingService.types.js.map +1 -0
  110. package/dist/src/billing/GDPRComplianceService.d.ts +2 -97
  111. package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -1
  112. package/dist/src/billing/GDPRComplianceService.js.map +1 -1
  113. package/dist/src/billing/StripeClient.d.ts +6 -64
  114. package/dist/src/billing/StripeClient.d.ts.map +1 -1
  115. package/dist/src/billing/StripeClient.js +14 -71
  116. package/dist/src/billing/StripeClient.js.map +1 -1
  117. package/dist/src/billing/StripeReconciliationJob.d.ts +2 -47
  118. package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -1
  119. package/dist/src/billing/StripeReconciliationJob.js +1 -41
  120. package/dist/src/billing/StripeReconciliationJob.js.map +1 -1
  121. package/dist/src/billing/StripeWebhookHandler.d.ts +3 -46
  122. package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -1
  123. package/dist/src/billing/StripeWebhookHandler.js +14 -261
  124. package/dist/src/billing/StripeWebhookHandler.js.map +1 -1
  125. package/dist/src/billing/gdpr-types.d.ts +103 -0
  126. package/dist/src/billing/gdpr-types.d.ts.map +1 -0
  127. package/dist/src/billing/gdpr-types.js +7 -0
  128. package/dist/src/billing/gdpr-types.js.map +1 -0
  129. package/dist/src/billing/reconciliation-helpers.d.ts +16 -0
  130. package/dist/src/billing/reconciliation-helpers.d.ts.map +1 -0
  131. package/dist/src/billing/reconciliation-helpers.js +53 -0
  132. package/dist/src/billing/reconciliation-helpers.js.map +1 -0
  133. package/dist/src/billing/reconciliation-types.d.ts +71 -0
  134. package/dist/src/billing/reconciliation-types.d.ts.map +1 -0
  135. package/dist/src/billing/reconciliation-types.js +7 -0
  136. package/dist/src/billing/reconciliation-types.js.map +1 -0
  137. package/dist/src/billing/stripe-client-types.d.ts +45 -0
  138. package/dist/src/billing/stripe-client-types.d.ts.map +1 -0
  139. package/dist/src/billing/stripe-client-types.js +7 -0
  140. package/dist/src/billing/stripe-client-types.js.map +1 -0
  141. package/dist/src/billing/stripe-helpers.d.ts +17 -0
  142. package/dist/src/billing/stripe-helpers.d.ts.map +1 -0
  143. package/dist/src/billing/stripe-helpers.js +50 -0
  144. package/dist/src/billing/stripe-helpers.js.map +1 -0
  145. package/dist/src/billing/webhook-handlers.d.ts +56 -0
  146. package/dist/src/billing/webhook-handlers.d.ts.map +1 -0
  147. package/dist/src/billing/webhook-handlers.js +303 -0
  148. package/dist/src/billing/webhook-handlers.js.map +1 -0
  149. package/dist/src/billing/webhook-types.d.ts +42 -0
  150. package/dist/src/billing/webhook-types.d.ts.map +1 -0
  151. package/dist/src/billing/webhook-types.js +7 -0
  152. package/dist/src/billing/webhook-types.js.map +1 -0
  153. package/dist/src/config/index.d.ts +118 -0
  154. package/dist/src/config/index.d.ts.map +1 -0
  155. package/dist/src/config/index.js +172 -0
  156. package/dist/src/config/index.js.map +1 -0
  157. package/dist/src/db/migration-types.d.ts +101 -0
  158. package/dist/src/db/migration-types.d.ts.map +1 -0
  159. package/dist/src/db/migration-types.js +6 -0
  160. package/dist/src/db/migration-types.js.map +1 -0
  161. package/dist/src/db/migration.d.ts +32 -0
  162. package/dist/src/db/migration.d.ts.map +1 -0
  163. package/dist/src/db/migration.js +239 -0
  164. package/dist/src/db/migration.js.map +1 -0
  165. package/dist/src/db/schema.d.ts +2 -2
  166. package/dist/src/db/schema.d.ts.map +1 -1
  167. package/dist/src/db/schema.js +23 -1
  168. package/dist/src/db/schema.js.map +1 -1
  169. package/dist/src/embeddings/embedding-types.d.ts +44 -0
  170. package/dist/src/embeddings/embedding-types.d.ts.map +1 -0
  171. package/dist/src/embeddings/embedding-types.js +6 -0
  172. package/dist/src/embeddings/embedding-types.js.map +1 -0
  173. package/dist/src/embeddings/embedding-utils.d.ts +42 -0
  174. package/dist/src/embeddings/embedding-utils.d.ts.map +1 -0
  175. package/dist/src/embeddings/embedding-utils.js +121 -0
  176. package/dist/src/embeddings/embedding-utils.js.map +1 -0
  177. package/dist/src/embeddings/hnsw-store.d.ts +8 -518
  178. package/dist/src/embeddings/hnsw-store.d.ts.map +1 -1
  179. package/dist/src/embeddings/hnsw-store.helpers.d.ts +83 -0
  180. package/dist/src/embeddings/hnsw-store.helpers.d.ts.map +1 -0
  181. package/dist/src/embeddings/hnsw-store.helpers.js +147 -0
  182. package/dist/src/embeddings/hnsw-store.helpers.js.map +1 -0
  183. package/dist/src/embeddings/hnsw-store.js +66 -517
  184. package/dist/src/embeddings/hnsw-store.js.map +1 -1
  185. package/dist/src/embeddings/hnsw-store.types.d.ts +154 -0
  186. package/dist/src/embeddings/hnsw-store.types.d.ts.map +1 -0
  187. package/dist/src/embeddings/hnsw-store.types.js +26 -0
  188. package/dist/src/embeddings/hnsw-store.types.js.map +1 -0
  189. package/dist/src/embeddings/index.d.ts +36 -112
  190. package/dist/src/embeddings/index.d.ts.map +1 -1
  191. package/dist/src/embeddings/index.js +37 -210
  192. package/dist/src/embeddings/index.js.map +1 -1
  193. package/dist/src/errors.d.ts.map +1 -1
  194. package/dist/src/errors.js +1 -1
  195. package/dist/src/errors.js.map +1 -1
  196. package/dist/src/exports/repositories.d.ts +18 -0
  197. package/dist/src/exports/repositories.d.ts.map +1 -0
  198. package/dist/src/exports/repositories.js +30 -0
  199. package/dist/src/exports/repositories.js.map +1 -0
  200. package/dist/src/exports/services.d.ts +30 -0
  201. package/dist/src/exports/services.d.ts.map +1 -0
  202. package/dist/src/exports/services.js +70 -0
  203. package/dist/src/exports/services.js.map +1 -0
  204. package/dist/src/exports/types.d.ts +21 -0
  205. package/dist/src/exports/types.d.ts.map +1 -0
  206. package/dist/src/exports/types.js +12 -0
  207. package/dist/src/exports/types.js.map +1 -0
  208. package/dist/src/index.d.ts +10 -47
  209. package/dist/src/index.d.ts.map +1 -1
  210. package/dist/src/index.js +31 -48
  211. package/dist/src/index.js.map +1 -1
  212. package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
  213. package/dist/src/indexer/GitHubIndexer.js +17 -4
  214. package/dist/src/indexer/GitHubIndexer.js.map +1 -1
  215. package/dist/src/indexer/SwarmIndexer.d.ts.map +1 -1
  216. package/dist/src/indexer/SwarmIndexer.js +1 -1
  217. package/dist/src/indexer/SwarmIndexer.js.map +1 -1
  218. package/dist/src/learning/PatternStore.d.ts +6 -426
  219. package/dist/src/learning/PatternStore.d.ts.map +1 -1
  220. package/dist/src/learning/PatternStore.helpers.d.ts +88 -0
  221. package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -0
  222. package/dist/src/learning/PatternStore.helpers.js +286 -0
  223. package/dist/src/learning/PatternStore.helpers.js.map +1 -0
  224. package/dist/src/learning/PatternStore.js +52 -598
  225. package/dist/src/learning/PatternStore.js.map +1 -1
  226. package/dist/src/learning/PatternStore.queries.d.ts +83 -0
  227. package/dist/src/learning/PatternStore.queries.d.ts.map +1 -0
  228. package/dist/src/learning/PatternStore.queries.js +189 -0
  229. package/dist/src/learning/PatternStore.queries.js.map +1 -0
  230. package/dist/src/learning/PatternStore.types.d.ts +308 -0
  231. package/dist/src/learning/PatternStore.types.d.ts.map +1 -0
  232. package/dist/src/learning/PatternStore.types.js +44 -0
  233. package/dist/src/learning/PatternStore.types.js.map +1 -0
  234. package/dist/src/learning/ReasoningBankIntegration.d.ts +5 -345
  235. package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -1
  236. package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts +49 -0
  237. package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts.map +1 -0
  238. package/dist/src/learning/ReasoningBankIntegration.helpers.js +180 -0
  239. package/dist/src/learning/ReasoningBankIntegration.helpers.js.map +1 -0
  240. package/dist/src/learning/ReasoningBankIntegration.js +21 -390
  241. package/dist/src/learning/ReasoningBankIntegration.js.map +1 -1
  242. package/dist/src/learning/ReasoningBankIntegration.types.d.ts +167 -0
  243. package/dist/src/learning/ReasoningBankIntegration.types.d.ts.map +1 -0
  244. package/dist/src/learning/ReasoningBankIntegration.types.js +51 -0
  245. package/dist/src/learning/ReasoningBankIntegration.types.js.map +1 -0
  246. package/dist/src/learning/interfaces.d.ts.map +1 -1
  247. package/dist/src/pipeline/DailyIndexPipeline.d.ts +4 -176
  248. package/dist/src/pipeline/DailyIndexPipeline.d.ts.map +1 -1
  249. package/dist/src/pipeline/DailyIndexPipeline.js +9 -83
  250. package/dist/src/pipeline/DailyIndexPipeline.js.map +1 -1
  251. package/dist/src/pipeline/pipeline-types.d.ts +132 -0
  252. package/dist/src/pipeline/pipeline-types.d.ts.map +1 -0
  253. package/dist/src/pipeline/pipeline-types.js +6 -0
  254. package/dist/src/pipeline/pipeline-types.js.map +1 -0
  255. package/dist/src/repositories/IndexerRepository.d.ts +1 -0
  256. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  257. package/dist/src/repositories/IndexerRepository.js +6 -0
  258. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  259. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  260. package/dist/src/repositories/SkillRepository.js +20 -5
  261. package/dist/src/repositories/SkillRepository.js.map +1 -1
  262. package/dist/src/routing/SONARouter.d.ts +3 -101
  263. package/dist/src/routing/SONARouter.d.ts.map +1 -1
  264. package/dist/src/routing/SONARouter.helpers.d.ts +112 -0
  265. package/dist/src/routing/SONARouter.helpers.d.ts.map +1 -0
  266. package/dist/src/routing/SONARouter.helpers.js +184 -0
  267. package/dist/src/routing/SONARouter.helpers.js.map +1 -0
  268. package/dist/src/routing/SONARouter.js +16 -318
  269. package/dist/src/routing/SONARouter.js.map +1 -1
  270. package/dist/src/routing/expert-types.d.ts +109 -0
  271. package/dist/src/routing/expert-types.d.ts.map +1 -0
  272. package/dist/src/routing/expert-types.js +162 -0
  273. package/dist/src/routing/expert-types.js.map +1 -0
  274. package/dist/src/routing/request-types.d.ts +113 -0
  275. package/dist/src/routing/request-types.d.ts.map +1 -0
  276. package/dist/src/routing/request-types.js +9 -0
  277. package/dist/src/routing/request-types.js.map +1 -0
  278. package/dist/src/routing/types.d.ts +5 -207
  279. package/dist/src/routing/types.d.ts.map +1 -1
  280. package/dist/src/routing/types.js +3 -153
  281. package/dist/src/routing/types.js.map +1 -1
  282. package/dist/src/scripts/github-import/github-auth.d.ts +17 -0
  283. package/dist/src/scripts/github-import/github-auth.d.ts.map +1 -0
  284. package/dist/src/scripts/github-import/github-auth.js +201 -0
  285. package/dist/src/scripts/github-import/github-auth.js.map +1 -0
  286. package/dist/src/scripts/github-import/github-client.d.ts +5 -5
  287. package/dist/src/scripts/github-import/github-client.d.ts.map +1 -1
  288. package/dist/src/scripts/github-import/github-client.js +5 -204
  289. package/dist/src/scripts/github-import/github-client.js.map +1 -1
  290. package/dist/src/scripts/ingest-lenny-skills.d.ts +40 -0
  291. package/dist/src/scripts/ingest-lenny-skills.d.ts.map +1 -0
  292. package/dist/src/scripts/ingest-lenny-skills.js +346 -0
  293. package/dist/src/scripts/ingest-lenny-skills.js.map +1 -0
  294. package/dist/src/scripts/merge-skills.d.ts +5 -27
  295. package/dist/src/scripts/merge-skills.d.ts.map +1 -1
  296. package/dist/src/scripts/merge-skills.js +4 -144
  297. package/dist/src/scripts/merge-skills.js.map +1 -1
  298. package/dist/src/scripts/merge-types.d.ts +72 -0
  299. package/dist/src/scripts/merge-types.d.ts.map +1 -0
  300. package/dist/src/scripts/merge-types.js +7 -0
  301. package/dist/src/scripts/merge-types.js.map +1 -0
  302. package/dist/src/scripts/merge-utils.d.ts +23 -0
  303. package/dist/src/scripts/merge-utils.d.ts.map +1 -0
  304. package/dist/src/scripts/merge-utils.js +150 -0
  305. package/dist/src/scripts/merge-utils.js.map +1 -0
  306. package/dist/src/scripts/review-categories.d.ts +41 -0
  307. package/dist/src/scripts/review-categories.d.ts.map +1 -0
  308. package/dist/src/scripts/review-categories.js +316 -0
  309. package/dist/src/scripts/review-categories.js.map +1 -0
  310. package/dist/src/scripts/review-lenny-skills.d.ts +26 -0
  311. package/dist/src/scripts/review-lenny-skills.d.ts.map +1 -0
  312. package/dist/src/scripts/review-lenny-skills.js +215 -0
  313. package/dist/src/scripts/review-lenny-skills.js.map +1 -0
  314. package/dist/src/scripts/sync-to-supabase.d.ts +10 -0
  315. package/dist/src/scripts/sync-to-supabase.d.ts.map +1 -0
  316. package/dist/src/scripts/sync-to-supabase.js +93 -0
  317. package/dist/src/scripts/sync-to-supabase.js.map +1 -0
  318. package/dist/src/security/AuditLogger.d.ts +4 -75
  319. package/dist/src/security/AuditLogger.d.ts.map +1 -1
  320. package/dist/src/security/AuditLogger.js +3 -12
  321. package/dist/src/security/AuditLogger.js.map +1 -1
  322. package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
  323. package/dist/src/security/audit-types.d.ts +96 -0
  324. package/dist/src/security/audit-types.d.ts.map +1 -0
  325. package/dist/src/security/audit-types.js +15 -0
  326. package/dist/src/security/audit-types.js.map +1 -0
  327. package/dist/src/security/sanitization.d.ts +1 -85
  328. package/dist/src/security/sanitization.d.ts.map +1 -1
  329. package/dist/src/security/sanitization.js +2 -133
  330. package/dist/src/security/sanitization.js.map +1 -1
  331. package/dist/src/security/scanner/SecurityScanner.d.ts +12 -88
  332. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  333. package/dist/src/security/scanner/SecurityScanner.formatters.d.ts +49 -0
  334. package/dist/src/security/scanner/SecurityScanner.formatters.d.ts.map +1 -0
  335. package/dist/src/security/scanner/SecurityScanner.formatters.js +139 -0
  336. package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -0
  337. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +40 -0
  338. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -0
  339. package/dist/src/security/scanner/SecurityScanner.helpers.js +142 -0
  340. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -0
  341. package/dist/src/security/scanner/SecurityScanner.js +26 -255
  342. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  343. package/dist/src/security/stripe-validators.d.ts +92 -0
  344. package/dist/src/security/stripe-validators.d.ts.map +1 -0
  345. package/dist/src/security/stripe-validators.js +139 -0
  346. package/dist/src/security/stripe-validators.js.map +1 -0
  347. package/dist/src/services/SearchService.d.ts +5 -29
  348. package/dist/src/services/SearchService.d.ts.map +1 -1
  349. package/dist/src/services/SearchService.helpers.d.ts +42 -0
  350. package/dist/src/services/SearchService.helpers.d.ts.map +1 -0
  351. package/dist/src/services/SearchService.helpers.js +128 -0
  352. package/dist/src/services/SearchService.helpers.js.map +1 -0
  353. package/dist/src/services/SearchService.js +142 -128
  354. package/dist/src/services/SearchService.js.map +1 -1
  355. package/dist/src/services/SearchService.types.d.ts +53 -0
  356. package/dist/src/services/SearchService.types.d.ts.map +1 -0
  357. package/dist/src/services/SearchService.types.js +7 -0
  358. package/dist/src/services/SearchService.types.js.map +1 -0
  359. package/dist/src/services/SkillAnalyzer.d.ts +37 -0
  360. package/dist/src/services/SkillAnalyzer.d.ts.map +1 -0
  361. package/dist/src/services/SkillAnalyzer.helpers.d.ts +103 -0
  362. package/dist/src/services/SkillAnalyzer.helpers.d.ts.map +1 -0
  363. package/dist/src/services/SkillAnalyzer.helpers.js +237 -0
  364. package/dist/src/services/SkillAnalyzer.helpers.js.map +1 -0
  365. package/dist/src/services/SkillAnalyzer.js +270 -0
  366. package/dist/src/services/SkillAnalyzer.js.map +1 -0
  367. package/dist/src/services/SkillAnalyzer.types.d.ts +110 -0
  368. package/dist/src/services/SkillAnalyzer.types.d.ts.map +1 -0
  369. package/dist/src/services/SkillAnalyzer.types.js +9 -0
  370. package/dist/src/services/SkillAnalyzer.types.js.map +1 -0
  371. package/dist/src/services/SkillDecomposer.d.ts +37 -0
  372. package/dist/src/services/SkillDecomposer.d.ts.map +1 -0
  373. package/dist/src/services/SkillDecomposer.helpers.d.ts +75 -0
  374. package/dist/src/services/SkillDecomposer.helpers.d.ts.map +1 -0
  375. package/dist/src/services/SkillDecomposer.helpers.js +277 -0
  376. package/dist/src/services/SkillDecomposer.helpers.js.map +1 -0
  377. package/dist/src/services/SkillDecomposer.js +116 -0
  378. package/dist/src/services/SkillDecomposer.js.map +1 -0
  379. package/dist/src/services/SkillDecomposer.types.d.ts +104 -0
  380. package/dist/src/services/SkillDecomposer.types.d.ts.map +1 -0
  381. package/dist/src/services/SkillDecomposer.types.js +9 -0
  382. package/dist/src/services/SkillDecomposer.types.js.map +1 -0
  383. package/dist/src/services/SubagentGenerator.d.ts +77 -0
  384. package/dist/src/services/SubagentGenerator.d.ts.map +1 -0
  385. package/dist/src/services/SubagentGenerator.js +352 -0
  386. package/dist/src/services/SubagentGenerator.js.map +1 -0
  387. package/dist/src/services/TaskRunner.d.ts +227 -0
  388. package/dist/src/services/TaskRunner.d.ts.map +1 -0
  389. package/dist/src/services/TaskRunner.js +423 -0
  390. package/dist/src/services/TaskRunner.js.map +1 -0
  391. package/dist/src/services/TransformationService.d.ts +167 -0
  392. package/dist/src/services/TransformationService.d.ts.map +1 -0
  393. package/dist/src/services/TransformationService.js +315 -0
  394. package/dist/src/services/TransformationService.js.map +1 -0
  395. package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts +6 -0
  396. package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts.map +1 -0
  397. package/dist/src/services/__tests__/SkillAnalyzer.test.js +177 -0
  398. package/dist/src/services/__tests__/SkillAnalyzer.test.js.map +1 -0
  399. package/dist/src/services/__tests__/SkillDecomposer.test.d.ts +6 -0
  400. package/dist/src/services/__tests__/SkillDecomposer.test.d.ts.map +1 -0
  401. package/dist/src/services/__tests__/SkillDecomposer.test.js +235 -0
  402. package/dist/src/services/__tests__/SkillDecomposer.test.js.map +1 -0
  403. package/dist/src/services/__tests__/SubagentGenerator.test.d.ts +6 -0
  404. package/dist/src/services/__tests__/SubagentGenerator.test.d.ts.map +1 -0
  405. package/dist/src/services/__tests__/SubagentGenerator.test.js +174 -0
  406. package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -0
  407. package/dist/src/services/__tests__/TaskRunner.test.d.ts +7 -0
  408. package/dist/src/services/__tests__/TaskRunner.test.d.ts.map +1 -0
  409. package/dist/src/services/__tests__/TaskRunner.test.js +316 -0
  410. package/dist/src/services/__tests__/TaskRunner.test.js.map +1 -0
  411. package/dist/src/services/__tests__/TransformationService.test.d.ts +6 -0
  412. package/dist/src/services/__tests__/TransformationService.test.d.ts.map +1 -0
  413. package/dist/src/services/__tests__/TransformationService.test.js +244 -0
  414. package/dist/src/services/__tests__/TransformationService.test.js.map +1 -0
  415. package/dist/src/session/SessionContext.js +1 -1
  416. package/dist/src/session/SessionContext.js.map +1 -1
  417. package/dist/src/session/SessionManager.d.ts +3 -67
  418. package/dist/src/session/SessionManager.d.ts.map +1 -1
  419. package/dist/src/session/SessionManager.helpers.d.ts +68 -0
  420. package/dist/src/session/SessionManager.helpers.d.ts.map +1 -0
  421. package/dist/src/session/SessionManager.helpers.js +152 -0
  422. package/dist/src/session/SessionManager.helpers.js.map +1 -0
  423. package/dist/src/session/SessionManager.js +58 -163
  424. package/dist/src/session/SessionManager.js.map +1 -1
  425. package/dist/src/session/SessionManager.types.d.ts +88 -0
  426. package/dist/src/session/SessionManager.types.d.ts.map +1 -0
  427. package/dist/src/session/SessionManager.types.js +27 -0
  428. package/dist/src/session/SessionManager.types.js.map +1 -0
  429. package/dist/src/session/SessionRecovery.d.ts.map +1 -1
  430. package/dist/src/session/SessionRecovery.js +3 -2
  431. package/dist/src/session/SessionRecovery.js.map +1 -1
  432. package/dist/src/sources/RawUrlSourceAdapter.js.map +1 -1
  433. package/dist/src/sources/SourceAdapterRegistry.js +1 -1
  434. package/dist/src/sources/SourceAdapterRegistry.js.map +1 -1
  435. package/dist/src/telemetry/metric-helpers.d.ts +47 -0
  436. package/dist/src/telemetry/metric-helpers.d.ts.map +1 -0
  437. package/dist/src/telemetry/metric-helpers.js +96 -0
  438. package/dist/src/telemetry/metric-helpers.js.map +1 -0
  439. package/dist/src/telemetry/metric-types.d.ts +73 -0
  440. package/dist/src/telemetry/metric-types.d.ts.map +1 -0
  441. package/dist/src/telemetry/metric-types.js +9 -0
  442. package/dist/src/telemetry/metric-types.js.map +1 -0
  443. package/dist/src/telemetry/metrics.d.ts +8 -119
  444. package/dist/src/telemetry/metrics.d.ts.map +1 -1
  445. package/dist/src/telemetry/metrics.js +20 -193
  446. package/dist/src/telemetry/metrics.js.map +1 -1
  447. package/dist/src/telemetry/span-utils.d.ts +30 -0
  448. package/dist/src/telemetry/span-utils.d.ts.map +1 -0
  449. package/dist/src/telemetry/span-utils.js +62 -0
  450. package/dist/src/telemetry/span-utils.js.map +1 -0
  451. package/dist/src/telemetry/tracer-types.d.ts +91 -0
  452. package/dist/src/telemetry/tracer-types.d.ts.map +1 -0
  453. package/dist/src/telemetry/tracer-types.js +6 -0
  454. package/dist/src/telemetry/tracer-types.js.map +1 -0
  455. package/dist/src/telemetry/tracer.d.ts +5 -122
  456. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  457. package/dist/src/telemetry/tracer.js +24 -170
  458. package/dist/src/telemetry/tracer.js.map +1 -1
  459. package/dist/src/testing/MultiLLMProvider.d.ts +17 -293
  460. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
  461. package/dist/src/testing/MultiLLMProvider.helpers.d.ts +54 -0
  462. package/dist/src/testing/MultiLLMProvider.helpers.d.ts.map +1 -0
  463. package/dist/src/testing/MultiLLMProvider.helpers.js +126 -0
  464. package/dist/src/testing/MultiLLMProvider.helpers.js.map +1 -0
  465. package/dist/src/testing/MultiLLMProvider.js +50 -323
  466. package/dist/src/testing/MultiLLMProvider.js.map +1 -1
  467. package/dist/src/testing/MultiLLMProvider.types.d.ts +253 -0
  468. package/dist/src/testing/MultiLLMProvider.types.d.ts.map +1 -0
  469. package/dist/src/testing/MultiLLMProvider.types.js +111 -0
  470. package/dist/src/testing/MultiLLMProvider.types.js.map +1 -0
  471. package/dist/src/triggers/TriggerDetector.d.ts +6 -142
  472. package/dist/src/triggers/TriggerDetector.d.ts.map +1 -1
  473. package/dist/src/triggers/TriggerDetector.js +15 -247
  474. package/dist/src/triggers/TriggerDetector.js.map +1 -1
  475. package/dist/src/triggers/__tests__/TriggerDetector.test.js +1 -1
  476. package/dist/src/triggers/__tests__/TriggerDetector.test.js.map +1 -1
  477. package/dist/src/triggers/trigger-constants.d.ts +22 -0
  478. package/dist/src/triggers/trigger-constants.d.ts.map +1 -0
  479. package/dist/src/triggers/trigger-constants.js +185 -0
  480. package/dist/src/triggers/trigger-constants.js.map +1 -0
  481. package/dist/src/triggers/trigger-types.d.ts +90 -0
  482. package/dist/src/triggers/trigger-types.d.ts.map +1 -0
  483. package/dist/src/triggers/trigger-types.js +6 -0
  484. package/dist/src/triggers/trigger-types.js.map +1 -0
  485. package/dist/src/types/skill.d.ts +33 -1
  486. package/dist/src/types/skill.d.ts.map +1 -1
  487. package/dist/src/types/skill.js +11 -1
  488. package/dist/src/types/skill.js.map +1 -1
  489. package/dist/src/types.d.ts +28 -2
  490. package/dist/src/types.d.ts.map +1 -1
  491. package/dist/src/types.js +1 -0
  492. package/dist/src/types.js.map +1 -1
  493. package/dist/src/utils/retry.js +2 -2
  494. package/dist/src/utils/retry.js.map +1 -1
  495. package/dist/src/validation/index.d.ts +5 -105
  496. package/dist/src/validation/index.d.ts.map +1 -1
  497. package/dist/src/validation/index.js +9 -421
  498. package/dist/src/validation/index.js.map +1 -1
  499. package/dist/src/validation/input-validators.d.ts +68 -0
  500. package/dist/src/validation/input-validators.d.ts.map +1 -0
  501. package/dist/src/validation/input-validators.js +126 -0
  502. package/dist/src/validation/input-validators.js.map +1 -0
  503. package/dist/src/validation/path-validators.d.ts +23 -0
  504. package/dist/src/validation/path-validators.d.ts.map +1 -0
  505. package/dist/src/validation/path-validators.js +47 -0
  506. package/dist/src/validation/path-validators.js.map +1 -0
  507. package/dist/src/validation/url-validators.d.ts +55 -0
  508. package/dist/src/validation/url-validators.d.ts.map +1 -0
  509. package/dist/src/validation/url-validators.js +267 -0
  510. package/dist/src/validation/url-validators.js.map +1 -0
  511. package/dist/src/validation/validation-error.d.ts +14 -0
  512. package/dist/src/validation/validation-error.d.ts.map +1 -0
  513. package/dist/src/validation/validation-error.js +19 -0
  514. package/dist/src/validation/validation-error.js.map +1 -0
  515. package/dist/src/webhooks/WebhookHandler.d.ts.map +1 -1
  516. package/dist/src/webhooks/WebhookHandler.js.map +1 -1
  517. package/dist/src/webhooks/WebhookPayload.d.ts +4 -215
  518. package/dist/src/webhooks/WebhookPayload.d.ts.map +1 -1
  519. package/dist/src/webhooks/WebhookPayload.js +1 -122
  520. package/dist/src/webhooks/WebhookPayload.js.map +1 -1
  521. package/dist/src/webhooks/WebhookQueue.d.ts +2 -140
  522. package/dist/src/webhooks/WebhookQueue.d.ts.map +1 -1
  523. package/dist/src/webhooks/WebhookQueue.js +4 -11
  524. package/dist/src/webhooks/WebhookQueue.js.map +1 -1
  525. package/dist/src/webhooks/WebhookQueue.types.d.ts +149 -0
  526. package/dist/src/webhooks/WebhookQueue.types.d.ts.map +1 -0
  527. package/dist/src/webhooks/WebhookQueue.types.js +10 -0
  528. package/dist/src/webhooks/WebhookQueue.types.js.map +1 -0
  529. package/dist/src/webhooks/WebhookQueue.utils.d.ts +44 -0
  530. package/dist/src/webhooks/WebhookQueue.utils.d.ts.map +1 -0
  531. package/dist/src/webhooks/WebhookQueue.utils.js +58 -0
  532. package/dist/src/webhooks/WebhookQueue.utils.js.map +1 -0
  533. package/dist/src/webhooks/webhook-schemas.d.ts +213 -0
  534. package/dist/src/webhooks/webhook-schemas.d.ts.map +1 -0
  535. package/dist/src/webhooks/webhook-schemas.js +132 -0
  536. package/dist/src/webhooks/webhook-schemas.js.map +1 -0
  537. package/dist/src/webhooks/webhook-types.d.ts +222 -0
  538. package/dist/src/webhooks/webhook-types.d.ts.map +1 -0
  539. package/dist/src/webhooks/webhook-types.js +10 -0
  540. package/dist/src/webhooks/webhook-types.js.map +1 -0
  541. package/dist/tests/Analytics.integration.test.js +2 -2
  542. package/dist/tests/Analytics.integration.test.js.map +1 -1
  543. package/dist/tests/AnalyticsRepository.test.js +3 -5
  544. package/dist/tests/AnalyticsRepository.test.js.map +1 -1
  545. package/dist/tests/AnalyticsStorage.test.js.map +1 -1
  546. package/dist/tests/ApiPartialResponses.test.d.ts +12 -0
  547. package/dist/tests/ApiPartialResponses.test.d.ts.map +1 -0
  548. package/dist/tests/ApiPartialResponses.test.js +202 -0
  549. package/dist/tests/ApiPartialResponses.test.js.map +1 -0
  550. package/dist/tests/AuditLogger.test.js.map +1 -1
  551. package/dist/tests/BenchmarkRunner.test.js +6 -6
  552. package/dist/tests/BenchmarkRunner.test.js.map +1 -1
  553. package/dist/tests/CacheSecurity.test.js.map +1 -1
  554. package/dist/tests/CodebaseAnalyzer.test.js.map +1 -1
  555. package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
  556. package/dist/tests/EmbeddingService.test.js.map +1 -1
  557. package/dist/tests/GitHubIndexer.test.js +4 -3
  558. package/dist/tests/GitHubIndexer.test.js.map +1 -1
  559. package/dist/tests/MemoryProfiler.test.js +3 -3
  560. package/dist/tests/MemoryProfiler.test.js.map +1 -1
  561. package/dist/tests/QualityScorer.test.js.map +1 -1
  562. package/dist/tests/RateLimiter.test.js.map +1 -1
  563. package/dist/tests/ScraperAdapters.test.js.map +1 -1
  564. package/dist/tests/SecurityScanner.test.js +4 -4
  565. package/dist/tests/SecurityScanner.test.js.map +1 -1
  566. package/dist/tests/SessionManager.security.test.js +1 -1
  567. package/dist/tests/SessionManager.security.test.js.map +1 -1
  568. package/dist/tests/SessionManager.test.js +4 -4
  569. package/dist/tests/SessionManager.test.js.map +1 -1
  570. package/dist/tests/SwarmIndexer.test.js +1 -1
  571. package/dist/tests/SwarmIndexer.test.js.map +1 -1
  572. package/dist/tests/TieredCache.test.js +2 -11
  573. package/dist/tests/TieredCache.test.js.map +1 -1
  574. package/dist/tests/WebhookHandler.test.js.map +1 -1
  575. package/dist/tests/fixtures/api-responses/index.d.ts +119 -0
  576. package/dist/tests/fixtures/api-responses/index.d.ts.map +1 -0
  577. package/dist/tests/fixtures/api-responses/index.js +419 -0
  578. package/dist/tests/fixtures/api-responses/index.js.map +1 -0
  579. package/dist/tests/integration/neural/neural-fixtures.d.ts +19 -0
  580. package/dist/tests/integration/neural/neural-fixtures.d.ts.map +1 -0
  581. package/dist/tests/integration/neural/neural-fixtures.js +49 -0
  582. package/dist/tests/integration/neural/neural-fixtures.js.map +1 -0
  583. package/dist/tests/integration/neural/neural-mocks-privacy.d.ts +78 -0
  584. package/dist/tests/integration/neural/neural-mocks-privacy.d.ts.map +1 -0
  585. package/dist/tests/integration/neural/neural-mocks-privacy.js +146 -0
  586. package/dist/tests/integration/neural/neural-mocks-privacy.js.map +1 -0
  587. package/dist/tests/integration/neural/neural-mocks.d.ts +90 -0
  588. package/dist/tests/integration/neural/neural-mocks.d.ts.map +1 -0
  589. package/dist/tests/integration/neural/neural-mocks.js +288 -0
  590. package/dist/tests/integration/neural/neural-mocks.js.map +1 -0
  591. package/dist/tests/integration/neural/neural-test-utils.d.ts +27 -0
  592. package/dist/tests/integration/neural/neural-test-utils.d.ts.map +1 -0
  593. package/dist/tests/integration/neural/neural-test-utils.js +35 -0
  594. package/dist/tests/integration/neural/neural-test-utils.js.map +1 -0
  595. package/dist/tests/integration/neural/setup.d.ts +6 -165
  596. package/dist/tests/integration/neural/setup.d.ts.map +1 -1
  597. package/dist/tests/integration/neural/setup.js +9 -477
  598. package/dist/tests/integration/neural/setup.js.map +1 -1
  599. package/dist/tests/logger.test.js +1 -1
  600. package/dist/tests/logger.test.js.map +1 -1
  601. package/dist/tests/performance/LargeScalePerformance.test.js +1 -1
  602. package/dist/tests/performance/LargeScalePerformance.test.js.map +1 -1
  603. package/dist/tests/sanitization.test.js.map +1 -1
  604. package/dist/tests/session/SessionManager.helpers.test.d.ts +8 -0
  605. package/dist/tests/session/SessionManager.helpers.test.d.ts.map +1 -0
  606. package/dist/tests/session/SessionManager.helpers.test.js +105 -0
  607. package/dist/tests/session/SessionManager.helpers.test.js.map +1 -0
  608. package/dist/tests/sources.test.js.map +1 -1
  609. package/dist/tests/webhooks/WebhookHandler.idempotency.test.js +1 -1
  610. package/dist/tests/webhooks/WebhookHandler.idempotency.test.js.map +1 -1
  611. package/dist/tests/webhooks/WebhookPayload.security.test.js.map +1 -1
  612. package/package.json +11 -11
@@ -1,231 +1,17 @@
1
1
  /**
2
- * @fileoverview PatternStore with EWC++ for catastrophic forgetting prevention
2
+ * PatternStore with EWC++ for catastrophic forgetting prevention
3
3
  * @module @skillsmith/core/learning/PatternStore
4
- * @see SMI-1522: Add EWC++ pattern storage for successful matches
5
- *
6
- * Implements Elastic Weight Consolidation++ (EWC++) to store successful
7
- * recommendation patterns without catastrophic forgetting. Unlike traditional
8
- * storage that overwrites old patterns, EWC++ preserves important learned
9
- * patterns while integrating new ones.
10
- *
11
- * Key capabilities:
12
- * - storePattern(): Encodes successful matches with Fisher Information tracking
13
- * - findSimilarPatterns(): Retrieves relevant patterns using importance-weighted similarity
14
- * - consolidate(): Updates Fisher Information matrix without forgetting important patterns
15
- * - 95%+ pattern preservation: New patterns do not overwrite important historical patterns
16
- *
17
4
  * @see https://arxiv.org/abs/1801.10112 (Progress & Compress)
18
5
  */
19
6
  import Database from 'better-sqlite3';
20
7
  import { randomUUID } from 'crypto';
21
8
  import { EmbeddingService } from '../embeddings/index.js';
22
- /**
23
- * Default EWC++ configuration
24
- */
25
- export const DEFAULT_EWC_CONFIG = {
26
- lambda: 5.0,
27
- fisherDecay: 0.95,
28
- importanceThreshold: 0.01,
29
- fisherSampleSize: 100,
30
- consolidationThreshold: 0.1,
31
- maxPatterns: 10000,
32
- };
33
- /**
34
- * Default PatternStore configuration
35
- */
36
- export const DEFAULT_PATTERN_STORE_CONFIG = {
37
- dbPath: undefined,
38
- ewc: DEFAULT_EWC_CONFIG,
39
- dimensions: 384,
40
- autoConsolidate: true,
41
- trackAccess: true,
42
- useV3Integration: true,
43
- };
44
- /**
45
- * Reward values for pattern outcomes
46
- * Matches ReasoningBankIntegration.TRAJECTORY_REWARDS
47
- */
48
- export const PATTERN_REWARDS = {
49
- accept: 1.0,
50
- usage: 0.3,
51
- frequent: 0.5,
52
- dismiss: -0.5,
53
- abandonment: -0.3,
54
- uninstall: -0.7,
55
- };
56
- /**
57
- * Fisher Information Matrix implementation for EWC++
58
- *
59
- * Stores diagonal approximation of Fisher Information,
60
- * indicating which "weights" (pattern dimensions) are important.
61
- *
62
- * In the context of pattern storage:
63
- * - Each dimension of the context embedding has an importance value
64
- * - High importance = changing this dimension would harm prediction
65
- * - Low importance = safe to overwrite with new patterns
66
- */
67
- export class FisherInformationMatrix {
68
- dimensions;
69
- /** Diagonal of Fisher Information (importance per dimension) */
70
- importance;
71
- /** Running sum for online updates */
72
- runningSum;
73
- /** Number of updates performed */
74
- updateCount = 0;
75
- constructor(dimensions) {
76
- this.dimensions = dimensions;
77
- this.importance = new Float32Array(dimensions);
78
- this.runningSum = new Float32Array(dimensions);
79
- }
80
- getImportance(dimensionIndex) {
81
- return this.importance[dimensionIndex] ?? 0;
82
- }
83
- update(gradient) {
84
- // EWC++: F = decay * F + gradient^2
85
- for (let i = 0; i < Math.min(gradient.length, this.dimensions); i++) {
86
- this.runningSum[i] += gradient[i] * gradient[i];
87
- }
88
- this.updateCount++;
89
- // Update importance as running mean
90
- for (let i = 0; i < this.importance.length; i++) {
91
- this.importance[i] = this.runningSum[i] / this.updateCount;
92
- }
93
- }
94
- decay(decayFactor) {
95
- for (let i = 0; i < this.runningSum.length; i++) {
96
- this.runningSum[i] *= decayFactor;
97
- }
98
- // Recalculate importance after decay
99
- for (let i = 0; i < this.importance.length; i++) {
100
- this.importance[i] = this.runningSum[i] / Math.max(1, this.updateCount);
101
- }
102
- }
103
- getImportanceVector() {
104
- return new Float32Array(this.importance);
105
- }
106
- getAverageImportance() {
107
- let sum = 0;
108
- for (let i = 0; i < this.importance.length; i++) {
109
- sum += this.importance[i];
110
- }
111
- return sum / this.importance.length;
112
- }
113
- serialize() {
114
- const buffer = Buffer.alloc(4 + // updateCount
115
- 4 * this.importance.length + // importance
116
- 4 * this.runningSum.length // runningSum
117
- );
118
- buffer.writeUInt32LE(this.updateCount, 0);
119
- Buffer.from(this.importance.buffer).copy(buffer, 4);
120
- Buffer.from(this.runningSum.buffer).copy(buffer, 4 + 4 * this.importance.length);
121
- return buffer;
122
- }
123
- deserialize(buffer) {
124
- const expectedSize = 4 + 4 * this.dimensions * 2;
125
- if (buffer.length < expectedSize) {
126
- throw new Error(`Invalid Fisher matrix buffer: expected ${expectedSize} bytes, got ${buffer.length}`);
127
- }
128
- this.updateCount = buffer.readUInt32LE(0);
129
- const importanceOffset = 4;
130
- const runningSumOffset = 4 + 4 * this.dimensions;
131
- // Copy importance values
132
- for (let i = 0; i < this.dimensions; i++) {
133
- this.importance[i] = buffer.readFloatLE(importanceOffset + i * 4);
134
- }
135
- // Copy runningSum values
136
- for (let i = 0; i < this.dimensions; i++) {
137
- this.runningSum[i] = buffer.readFloatLE(runningSumOffset + i * 4);
138
- }
139
- }
140
- reset() {
141
- this.importance.fill(0);
142
- this.runningSum.fill(0);
143
- this.updateCount = 0;
144
- }
145
- getUpdateCount() {
146
- return this.updateCount;
147
- }
148
- }
149
- // ============================================================================
150
- // PatternStore Implementation
151
- // ============================================================================
152
- /**
153
- * SQLite schema for pattern storage
154
- */
155
- const PATTERN_STORE_SCHEMA = `
156
- -- Patterns table: stores recommendation patterns with outcomes
157
- CREATE TABLE IF NOT EXISTS patterns (
158
- pattern_id TEXT PRIMARY KEY,
159
- context_embedding BLOB NOT NULL,
160
- skill_id TEXT NOT NULL,
161
- skill_features TEXT NOT NULL,
162
- context_data TEXT NOT NULL,
163
- outcome_type TEXT NOT NULL,
164
- outcome_reward REAL NOT NULL,
165
- importance REAL NOT NULL DEFAULT 0.1,
166
- original_score REAL NOT NULL,
167
- source TEXT NOT NULL,
168
- access_count INTEGER NOT NULL DEFAULT 0,
169
- created_at INTEGER NOT NULL DEFAULT (unixepoch()),
170
- last_accessed_at INTEGER NOT NULL DEFAULT (unixepoch())
171
- );
172
-
173
- -- Indexes for efficient queries
174
- CREATE INDEX IF NOT EXISTS idx_patterns_skill_id ON patterns(skill_id);
175
- CREATE INDEX IF NOT EXISTS idx_patterns_outcome_type ON patterns(outcome_type);
176
- CREATE INDEX IF NOT EXISTS idx_patterns_importance ON patterns(importance DESC);
177
- CREATE INDEX IF NOT EXISTS idx_patterns_created_at ON patterns(created_at DESC);
178
-
179
- -- Fisher Information matrix state
180
- CREATE TABLE IF NOT EXISTS fisher_info (
181
- id INTEGER PRIMARY KEY DEFAULT 1,
182
- matrix_data BLOB NOT NULL,
183
- update_count INTEGER NOT NULL DEFAULT 0,
184
- last_decay_at INTEGER NOT NULL DEFAULT (unixepoch()),
185
- updated_at INTEGER NOT NULL DEFAULT (unixepoch())
186
- );
187
-
188
- -- Consolidation history for monitoring
189
- CREATE TABLE IF NOT EXISTS consolidation_history (
190
- id INTEGER PRIMARY KEY AUTOINCREMENT,
191
- timestamp INTEGER NOT NULL DEFAULT (unixepoch()),
192
- patterns_processed INTEGER NOT NULL,
193
- patterns_preserved INTEGER NOT NULL,
194
- patterns_pruned INTEGER NOT NULL,
195
- preservation_rate REAL NOT NULL,
196
- duration_ms INTEGER NOT NULL,
197
- average_importance REAL NOT NULL
198
- );
199
- `;
200
- /**
201
- * PatternStore - EWC++ pattern storage for successful recommendation matches
202
- *
203
- * Prevents catastrophic forgetting by tracking which pattern dimensions
204
- * are important via Fisher Information Matrix and preserving high-importance
205
- * patterns during consolidation.
206
- *
207
- * @example
208
- * ```typescript
209
- * const store = new PatternStore({ dbPath: './patterns.db' })
210
- * await store.initialize()
211
- *
212
- * // Store a successful pattern
213
- * await store.storePattern(
214
- * {
215
- * context: { installedSkills: ['commit'], frameworks: ['react'] },
216
- * skill: { skillId: 'jest-helper', category: 'testing' },
217
- * originalScore: 0.85,
218
- * source: 'recommend'
219
- * },
220
- * { type: 'accept', reward: 1.0 }
221
- * )
222
- *
223
- * // Find similar patterns
224
- * const similar = await store.findSimilarPatterns({
225
- * context: { installedSkills: ['commit'], frameworks: ['react', 'typescript'] }
226
- * })
227
- * ```
228
- */
9
+ export { DEFAULT_EWC_CONFIG, DEFAULT_PATTERN_STORE_CONFIG, PATTERN_REWARDS, } from './PatternStore.types.js';
10
+ export { FisherInformationMatrix } from './PatternStore.helpers.js';
11
+ import { DEFAULT_EWC_CONFIG, DEFAULT_PATTERN_STORE_CONFIG } from './PatternStore.types.js';
12
+ import { PATTERN_STORE_SCHEMA, FisherInformationMatrix, contextToText, computeGradient, deserializeEmbedding, cosineSimilarity, importanceWeightedSimilarity, calculatePatternImportance, calculateDimensionImportance, rowToStoredPattern, } from './PatternStore.helpers.js';
13
+ import { getPatternCount, getDatabaseSize, getSamplePatterns, getAllPatterns, updatePatternInDB, updatePatternImportance, updateAccessCount, deletePattern, loadFisherMatrixData, saveFisherMatrixData, recordConsolidation, getPatternsByOutcome, getAverageImportance, getHighImportanceCount, getConsolidationStats, getContextEmbeddings, } from './PatternStore.queries.js';
14
+ /** PatternStore - EWC++ pattern storage for successful recommendation matches */
229
15
  export class PatternStore {
230
16
  db;
231
17
  fisherMatrix;
@@ -234,7 +20,6 @@ export class PatternStore {
234
20
  config;
235
21
  ewcConfig;
236
22
  initialized = false;
237
- // Query performance tracking
238
23
  queryLatencies = [];
239
24
  maxQuerySamples = 100;
240
25
  constructor(config = {}) {
@@ -250,41 +35,26 @@ export class PatternStore {
250
35
  totalPatterns: 0,
251
36
  };
252
37
  }
253
- /**
254
- * Initialize the PatternStore
255
- */
256
38
  async initialize() {
257
39
  if (this.initialized)
258
40
  return;
259
- // Initialize database
260
41
  this.db = new Database(this.config.dbPath || ':memory:');
261
42
  this.db.exec(PATTERN_STORE_SCHEMA);
262
- // Initialize Fisher Information Matrix
263
43
  this.fisherMatrix = new FisherInformationMatrix(this.config.dimensions);
264
- // Load persisted Fisher matrix if exists
265
44
  this.loadFisherMatrix();
266
- // Initialize embedding service (fallback mode for context encoding)
267
45
  this.embeddingService = new EmbeddingService({ useFallback: true });
268
- // Load consolidation state
269
- this.consolidationState.totalPatterns = this.getPatternCount();
270
- // Try V3 integration
46
+ this.consolidationState.totalPatterns = getPatternCount(this.db);
47
+ // IMPORTANT: Keep dynamic import here for lazy loading / graceful degradation
271
48
  if (this.config.useV3Integration) {
272
49
  await this.initializeV3Integration();
273
50
  }
274
51
  this.initialized = true;
275
52
  }
276
- /**
277
- * Check if PatternStore is initialized
278
- */
279
53
  isInitialized() {
280
54
  return this.initialized;
281
55
  }
282
- /**
283
- * Attempt to initialize V3 ReasoningBank integration
284
- */
285
56
  async initializeV3Integration() {
286
57
  try {
287
- // Attempt to import V3 ReasoningBank for future integration
288
58
  await import(
289
59
  // @ts-expect-error - V3 types not available at compile time
290
60
  'claude-flow/v3/@claude-flow/cli/dist/src/intelligence/index.js');
@@ -294,46 +64,28 @@ export class PatternStore {
294
64
  console.log('[PatternStore] V3 not available, using standalone mode');
295
65
  }
296
66
  }
297
- /**
298
- * Store a pattern with EWC++ protection
299
- *
300
- * @param pattern - Pattern to store
301
- * @param outcome - Outcome of the recommendation
302
- * @returns Pattern ID
303
- */
304
67
  async storePattern(pattern, outcome) {
305
68
  this.ensureInitialized();
306
- // Generate context embedding
307
- const contextText = this.contextToText(pattern.context);
69
+ const contextText = contextToText(pattern.context);
308
70
  const contextEmbedding = await this.embeddingService.embed(contextText);
309
- // Check for similar existing pattern
310
- const existingPatterns = await this.findSimilarPatterns({
311
- context: pattern.context,
312
- skillId: pattern.skill.skillId,
313
- positiveOnly: false,
314
- }, 5);
71
+ const existingPatterns = await this.findSimilarPatterns({ context: pattern.context, skillId: pattern.skill.skillId, positiveOnly: false }, 5);
315
72
  if (existingPatterns.length > 0 && existingPatterns[0].similarity > 0.95) {
316
- // Update existing pattern instead of creating new
317
73
  const existingPattern = existingPatterns[0].pattern;
318
- const gradient = this.computeGradient(contextEmbedding, existingPattern.contextEmbedding);
74
+ const gradient = computeGradient(contextEmbedding, existingPattern.contextEmbedding);
319
75
  this.fisherMatrix.update(gradient);
320
- const newImportance = this.calculatePatternImportance(existingPattern, outcome);
321
- this.updatePatternInDB(existingPattern.id, {
76
+ const newImportance = calculatePatternImportance(existingPattern, outcome);
77
+ updatePatternInDB(this.db, existingPattern.id, {
322
78
  importance: newImportance,
323
79
  accessCount: existingPattern.accessCount + 1,
324
80
  });
325
81
  return existingPattern.id;
326
82
  }
327
- // Calculate initial importance
328
83
  let baseImportance = Math.abs(outcome.reward);
329
- if (outcome.reward > 0) {
84
+ if (outcome.reward > 0)
330
85
  baseImportance *= 1.5;
331
- }
332
- if (outcome.confidence !== undefined) {
86
+ if (outcome.confidence !== undefined)
333
87
  baseImportance *= outcome.confidence;
334
- }
335
88
  const importance = baseImportance * this.ewcConfig.importanceThreshold * 10;
336
- // Store new pattern
337
89
  const patternId = pattern.id || randomUUID();
338
90
  const stmt = this.db.prepare(`
339
91
  INSERT INTO patterns (
@@ -343,35 +95,22 @@ export class PatternStore {
343
95
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, unixepoch(), unixepoch())
344
96
  `);
345
97
  stmt.run(patternId, Buffer.from(contextEmbedding.buffer), pattern.skill.skillId, JSON.stringify(pattern.skill), JSON.stringify(pattern.context), outcome.type, outcome.reward, importance, pattern.originalScore, pattern.source);
346
- // Update Fisher Information
347
98
  const avgEmbedding = await this.computeAverageEmbedding();
348
- const gradient = this.computeGradient(contextEmbedding, avgEmbedding);
99
+ const gradient = computeGradient(contextEmbedding, avgEmbedding);
349
100
  this.fisherMatrix.update(gradient);
350
- // Update consolidation state
351
101
  this.consolidationState.patternsSinceLastConsolidation++;
352
102
  this.consolidationState.totalPatterns++;
353
- // Trigger consolidation if needed
354
103
  if (this.config.autoConsolidate && this.shouldConsolidate()) {
355
104
  await this.consolidate();
356
105
  }
357
- // Persist Fisher matrix
358
106
  this.saveFisherMatrix();
359
107
  return patternId;
360
108
  }
361
- /**
362
- * Find similar patterns using importance-weighted similarity
363
- *
364
- * @param query - Pattern query
365
- * @param limit - Maximum results
366
- * @returns Similar patterns sorted by weighted similarity
367
- */
368
109
  async findSimilarPatterns(query, limit = 10) {
369
110
  this.ensureInitialized();
370
111
  const startTime = Date.now();
371
- // Generate query embedding
372
- const queryText = this.contextToText(query.context);
112
+ const queryText = contextToText(query.context);
373
113
  const queryEmbedding = await this.embeddingService.embed(queryText);
374
- // Build SQL query with filters
375
114
  let sql = 'SELECT * FROM patterns WHERE 1=1';
376
115
  const params = [];
377
116
  if (query.skillId) {
@@ -393,52 +132,30 @@ export class PatternStore {
393
132
  if (query.positiveOnly) {
394
133
  sql += ' AND outcome_reward > 0';
395
134
  }
396
- // Fetch candidate patterns
397
135
  const stmt = this.db.prepare(sql);
398
136
  const candidates = stmt.all(...params);
399
- // Calculate similarity scores
400
137
  const importanceVector = this.fisherMatrix.getImportanceVector();
401
138
  const results = [];
402
139
  for (const candidate of candidates) {
403
- const candidateEmbedding = this.deserializeEmbedding(candidate.context_embedding);
404
- const similarity = this.cosineSimilarity(queryEmbedding, candidateEmbedding);
405
- const weightedSimilarity = this.importanceWeightedSimilarity(queryEmbedding, candidateEmbedding, importanceVector);
406
- const storedPattern = {
407
- id: candidate.pattern_id,
408
- context: JSON.parse(candidate.context_data),
409
- skill: JSON.parse(candidate.skill_features),
410
- originalScore: candidate.original_score,
411
- source: candidate.source,
412
- contextEmbedding: candidateEmbedding,
413
- outcome: {
414
- type: candidate.outcome_type,
415
- reward: candidate.outcome_reward,
416
- },
417
- importance: candidate.importance,
418
- accessCount: candidate.access_count,
419
- createdAt: new Date(candidate.created_at * 1000),
420
- lastAccessedAt: new Date(candidate.last_accessed_at * 1000),
421
- };
140
+ const candidateEmbedding = deserializeEmbedding(candidate.context_embedding, this.config.dimensions);
141
+ const similarity = cosineSimilarity(queryEmbedding, candidateEmbedding);
142
+ const weightedSimilarity = importanceWeightedSimilarity(queryEmbedding, candidateEmbedding, importanceVector);
422
143
  results.push({
423
- pattern: storedPattern,
144
+ pattern: rowToStoredPattern(candidate, this.config.dimensions),
424
145
  similarity,
425
146
  weightedSimilarity,
426
147
  rank: 0,
427
148
  });
428
149
  }
429
- // Sort by weighted similarity
430
150
  results.sort((a, b) => b.weightedSimilarity - a.weightedSimilarity);
431
- // Assign ranks
432
151
  for (let i = 0; i < results.length; i++) {
433
152
  results[i].rank = i + 1;
434
153
  }
435
- // Update access tracking
436
154
  if (this.config.trackAccess) {
437
155
  for (const result of results.slice(0, limit)) {
438
- this.updateAccessCount(result.pattern.id);
156
+ updateAccessCount(this.db, result.pattern.id);
439
157
  }
440
158
  }
441
- // Track query latency
442
159
  const latency = Date.now() - startTime;
443
160
  this.queryLatencies.push(latency);
444
161
  if (this.queryLatencies.length > this.maxQuerySamples) {
@@ -446,20 +163,11 @@ export class PatternStore {
446
163
  }
447
164
  return results.slice(0, limit);
448
165
  }
449
- /**
450
- * Consolidate patterns using EWC++
451
- *
452
- * Applies Fisher decay, recalculates importance, and prunes low-importance patterns.
453
- * Guarantees 95%+ preservation of important patterns.
454
- *
455
- * @returns Consolidation result
456
- */
457
166
  async consolidate() {
458
167
  this.ensureInitialized();
459
168
  const startTime = Date.now();
460
- const totalPatterns = this.getPatternCount();
169
+ const totalPatterns = getPatternCount(this.db);
461
170
  const newPatternsRatio = totalPatterns > 0 ? this.consolidationState.patternsSinceLastConsolidation / totalPatterns : 0;
462
- // Check if consolidation is needed
463
171
  if (newPatternsRatio < this.ewcConfig.consolidationThreshold) {
464
172
  return {
465
173
  consolidated: false,
@@ -471,32 +179,27 @@ export class PatternStore {
471
179
  averageImportance: this.fisherMatrix.getAverageImportance(),
472
180
  };
473
181
  }
474
- // Apply Fisher decay
475
182
  this.fisherMatrix.decay(this.ewcConfig.fisherDecay);
476
- // Sample patterns for Fisher estimation
477
- const samplePatterns = this.getSamplePatterns(this.ewcConfig.fisherSampleSize);
183
+ const samplePatterns = getSamplePatterns(this.db, this.ewcConfig.fisherSampleSize, this.config.dimensions);
478
184
  const avgEmbedding = await this.computeAverageEmbedding();
479
185
  for (const pattern of samplePatterns) {
480
- const gradient = this.computeGradient(pattern.contextEmbedding, avgEmbedding);
186
+ const gradient = computeGradient(pattern.contextEmbedding, avgEmbedding);
481
187
  this.fisherMatrix.update(gradient);
482
188
  }
483
- // Update importance for all patterns
484
- const allPatterns = this.getAllPatterns();
189
+ const allPatterns = getAllPatterns(this.db, this.config.dimensions);
485
190
  const importanceVector = this.fisherMatrix.getImportanceVector();
486
191
  for (const pattern of allPatterns) {
487
- const newImportance = this.calculateDimensionImportance(pattern, importanceVector);
488
- this.updatePatternImportance(pattern.id, newImportance);
192
+ const newImportance = calculateDimensionImportance(pattern, importanceVector, this.config.dimensions, this.ewcConfig.lambda);
193
+ updatePatternImportance(this.db, pattern.id, newImportance);
489
194
  }
490
- // Prune low-importance patterns
491
195
  let prunedCount = 0;
492
196
  let preservedCount = 0;
493
- // Sort by importance (ascending) for pruning
494
197
  const sortedPatterns = [...allPatterns].sort((a, b) => a.importance - b.importance);
495
198
  if (sortedPatterns.length > this.ewcConfig.maxPatterns) {
496
199
  const pruneCandidates = sortedPatterns.slice(0, sortedPatterns.length - this.ewcConfig.maxPatterns);
497
200
  for (const candidate of pruneCandidates) {
498
201
  if (candidate.importance < this.ewcConfig.importanceThreshold) {
499
- this.deletePattern(candidate.id);
202
+ deletePattern(this.db, candidate.id);
500
203
  prunedCount++;
501
204
  }
502
205
  else {
@@ -506,10 +209,9 @@ export class PatternStore {
506
209
  preservedCount += this.ewcConfig.maxPatterns;
507
210
  }
508
211
  else {
509
- // Prune very low importance patterns even if under limit
510
212
  for (const pattern of sortedPatterns) {
511
213
  if (pattern.importance < this.ewcConfig.importanceThreshold * 0.1) {
512
- this.deletePattern(pattern.id);
214
+ deletePattern(this.db, pattern.id);
513
215
  prunedCount++;
514
216
  }
515
217
  else {
@@ -518,21 +220,12 @@ export class PatternStore {
518
220
  }
519
221
  }
520
222
  const preservationRate = preservedCount / (preservedCount + prunedCount) || 1.0;
521
- // Update consolidation state
522
223
  this.consolidationState.lastConsolidation = new Date();
523
224
  this.consolidationState.patternsSinceLastConsolidation = 0;
524
- this.consolidationState.totalPatterns = this.getPatternCount();
525
- // Record consolidation history
225
+ this.consolidationState.totalPatterns = getPatternCount(this.db);
526
226
  const durationMs = Date.now() - startTime;
527
227
  const avgImportance = this.fisherMatrix.getAverageImportance();
528
- const historyStmt = this.db.prepare(`
529
- INSERT INTO consolidation_history (
530
- patterns_processed, patterns_preserved, patterns_pruned,
531
- preservation_rate, duration_ms, average_importance
532
- ) VALUES (?, ?, ?, ?, ?, ?)
533
- `);
534
- historyStmt.run(preservedCount + prunedCount, preservedCount, prunedCount, preservationRate, durationMs, avgImportance);
535
- // Persist Fisher matrix
228
+ recordConsolidation(this.db, preservedCount + prunedCount, preservedCount, prunedCount, preservationRate, durationMs, avgImportance);
536
229
  this.saveFisherMatrix();
537
230
  return {
538
231
  consolidated: true,
@@ -544,64 +237,19 @@ export class PatternStore {
544
237
  averageImportance: avgImportance,
545
238
  };
546
239
  }
547
- /**
548
- * Get pattern importance value
549
- *
550
- * @param patternId - Pattern identifier
551
- * @returns Importance value or 0 if not found
552
- */
553
240
  getPatternImportance(patternId) {
554
241
  this.ensureInitialized();
555
242
  const stmt = this.db.prepare('SELECT importance FROM patterns WHERE pattern_id = ?');
556
243
  const result = stmt.get(patternId);
557
244
  return result?.importance ?? 0;
558
245
  }
559
- /**
560
- * Get PatternStore metrics
561
- */
562
246
  getMetrics() {
563
247
  this.ensureInitialized();
564
- // Total patterns
565
- const totalPatterns = this.getPatternCount();
566
- // Patterns by outcome type
567
- const outcomeStmt = this.db.prepare(`
568
- SELECT outcome_type, COUNT(*) as count FROM patterns GROUP BY outcome_type
569
- `);
570
- const outcomeCounts = outcomeStmt.all();
571
- const patternsByOutcome = {
572
- accept: 0,
573
- usage: 0,
574
- frequent: 0,
575
- dismiss: 0,
576
- abandonment: 0,
577
- uninstall: 0,
578
- };
579
- for (const row of outcomeCounts) {
580
- patternsByOutcome[row.outcome_type] = row.count;
581
- }
582
- // Average importance
583
- const avgStmt = this.db.prepare('SELECT AVG(importance) as avg FROM patterns');
584
- const avgResult = avgStmt.get();
585
- const averageImportance = avgResult?.avg ?? 0;
586
- // High importance patterns (above 90th percentile)
587
- const percentileStmt = this.db.prepare(`
588
- SELECT importance FROM patterns ORDER BY importance DESC
589
- LIMIT CAST((SELECT COUNT(*) FROM patterns) * 0.1 AS INTEGER)
590
- `);
591
- const highImportancePatterns = percentileStmt.all().length;
592
- // Consolidation stats
593
- const consolidationStmt = this.db.prepare(`
594
- SELECT
595
- COUNT(*) as total,
596
- MAX(timestamp) as last_timestamp,
597
- AVG(preservation_rate) as avg_rate,
598
- SUM(patterns_pruned) as total_pruned
599
- FROM consolidation_history
600
- `);
601
- const consolidationResult = consolidationStmt.get();
602
- // Storage size
603
- const fisherMatrixSize = 4 + this.config.dimensions * 4 * 2; // updateCount + importance + runningSum
604
- // Query performance
248
+ const totalPatterns = getPatternCount(this.db);
249
+ const patternsByOutcome = getPatternsByOutcome(this.db);
250
+ const averageImportance = getAverageImportance(this.db);
251
+ const highImportancePatterns = getHighImportanceCount(this.db);
252
+ const consolidationStats = getConsolidationStats(this.db);
605
253
  const avgLatency = this.queryLatencies.length > 0
606
254
  ? this.queryLatencies.reduce((a, b) => a + b, 0) / this.queryLatencies.length
607
255
  : 0;
@@ -611,16 +259,16 @@ export class PatternStore {
611
259
  averageImportance,
612
260
  highImportancePatterns,
613
261
  consolidation: {
614
- totalConsolidations: consolidationResult.total,
615
- lastConsolidation: consolidationResult.last_timestamp
616
- ? new Date(consolidationResult.last_timestamp * 1000)
262
+ totalConsolidations: consolidationStats.total,
263
+ lastConsolidation: consolidationStats.lastTimestamp
264
+ ? new Date(consolidationStats.lastTimestamp * 1000)
617
265
  : null,
618
- averagePreservationRate: consolidationResult.avg_rate ?? 1.0,
619
- patternsPruned: consolidationResult.total_pruned ?? 0,
266
+ averagePreservationRate: consolidationStats.avgRate ?? 1.0,
267
+ patternsPruned: consolidationStats.totalPruned ?? 0,
620
268
  },
621
269
  storage: {
622
- sizeBytes: this.getDatabaseSize(),
623
- fisherMatrixSizeBytes: fisherMatrixSize,
270
+ sizeBytes: getDatabaseSize(this.db),
271
+ fisherMatrixSizeBytes: 4 + this.config.dimensions * 4 * 2,
624
272
  },
625
273
  queryPerformance: {
626
274
  averageLatencyMs: avgLatency,
@@ -628,57 +276,25 @@ export class PatternStore {
628
276
  },
629
277
  };
630
278
  }
631
- /**
632
- * Close the PatternStore and release resources
633
- */
634
279
  close() {
635
280
  if (this.db) {
636
281
  this.db.close();
637
282
  }
638
283
  }
639
- // ============================================================================
640
- // Private Helper Methods
641
- // ============================================================================
284
+ // Private helpers
642
285
  ensureInitialized() {
643
286
  if (!this.initialized) {
644
287
  throw new Error('PatternStore not initialized. Call initialize() first.');
645
288
  }
646
289
  }
647
- contextToText(context) {
648
- const parts = [];
649
- if (context.installedSkills && context.installedSkills.length > 0) {
650
- parts.push(`installed: ${context.installedSkills.join(', ')}`);
651
- }
652
- if (context.frameworks && context.frameworks.length > 0) {
653
- parts.push(`frameworks: ${context.frameworks.join(', ')}`);
654
- }
655
- if (context.keywords && context.keywords.length > 0) {
656
- parts.push(`keywords: ${context.keywords.join(', ')}`);
657
- }
658
- if (context.timeOfDay) {
659
- parts.push(`time: ${context.timeOfDay}`);
660
- }
661
- if (context.dayType) {
662
- parts.push(`day: ${context.dayType}`);
663
- }
664
- return parts.join(' | ') || 'empty context';
665
- }
666
- computeGradient(a, b) {
667
- const gradient = new Float32Array(a.length);
668
- for (let i = 0; i < a.length; i++) {
669
- gradient[i] = a[i] - (b[i] ?? 0);
670
- }
671
- return gradient;
672
- }
673
290
  async computeAverageEmbedding() {
674
- const stmt = this.db.prepare('SELECT context_embedding FROM patterns LIMIT 100');
675
- const rows = stmt.all();
291
+ const rows = getContextEmbeddings(this.db, 100);
676
292
  if (rows.length === 0) {
677
293
  return new Float32Array(this.config.dimensions);
678
294
  }
679
295
  const sum = new Float32Array(this.config.dimensions);
680
296
  for (const row of rows) {
681
- const embedding = this.deserializeEmbedding(row.context_embedding);
297
+ const embedding = deserializeEmbedding(row.context_embedding, this.config.dimensions);
682
298
  for (let i = 0; i < embedding.length; i++) {
683
299
  sum[i] += embedding[i];
684
300
  }
@@ -688,73 +304,7 @@ export class PatternStore {
688
304
  }
689
305
  return sum;
690
306
  }
691
- deserializeEmbedding(buffer) {
692
- const floatArray = new Float32Array(this.config.dimensions);
693
- for (let i = 0; i < this.config.dimensions; i++) {
694
- floatArray[i] = buffer.readFloatLE(i * 4);
695
- }
696
- return floatArray;
697
- }
698
- cosineSimilarity(a, b) {
699
- let dotProduct = 0;
700
- let normA = 0;
701
- let normB = 0;
702
- for (let i = 0; i < a.length; i++) {
703
- dotProduct += a[i] * b[i];
704
- normA += a[i] * a[i];
705
- normB += b[i] * b[i];
706
- }
707
- if (normA === 0 || normB === 0)
708
- return 0;
709
- return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
710
- }
711
- importanceWeightedSimilarity(a, b, importance) {
712
- let weightedDotProduct = 0;
713
- let normA = 0;
714
- let normB = 0;
715
- for (let i = 0; i < a.length; i++) {
716
- const weight = 1 + (importance[i] ?? 0);
717
- weightedDotProduct += weight * a[i] * b[i];
718
- normA += weight * a[i] * a[i];
719
- normB += weight * b[i] * b[i];
720
- }
721
- if (normA === 0 || normB === 0)
722
- return 0;
723
- return weightedDotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
724
- }
725
- calculatePatternImportance(pattern, outcome) {
726
- let baseImportance = Math.abs(outcome.reward);
727
- if (outcome.reward > 0) {
728
- baseImportance *= 1.5;
729
- }
730
- // Recency factor
731
- const ageInDays = (Date.now() - pattern.createdAt.getTime()) / (24 * 60 * 60 * 1000);
732
- const recencyFactor = Math.exp(-ageInDays / 30);
733
- // Access frequency factor
734
- const accessFactor = 1 + Math.log(1 + pattern.accessCount);
735
- return baseImportance * recencyFactor * accessFactor * pattern.importance;
736
- }
737
- calculateDimensionImportance(pattern, importanceVector) {
738
- let baseImportance = Math.abs(pattern.outcome.reward);
739
- if (pattern.outcome.reward > 0) {
740
- baseImportance *= 1.5;
741
- }
742
- const ageInDays = (Date.now() - pattern.createdAt.getTime()) / (24 * 60 * 60 * 1000);
743
- const recencyFactor = Math.exp(-ageInDays / 30);
744
- const accessFactor = 1 + Math.log(1 + pattern.accessCount);
745
- // Fisher dimension importance (EWC++ core)
746
- // Lambda scales how much we weight Fisher importance in preservation
747
- let dimensionImportance = 0;
748
- for (let i = 0; i < this.config.dimensions; i++) {
749
- dimensionImportance += (importanceVector[i] ?? 0) * Math.abs(pattern.contextEmbedding[i] ?? 0);
750
- }
751
- dimensionImportance /= this.config.dimensions;
752
- // Apply lambda regularization: higher lambda = stronger importance preservation
753
- const lambdaScaled = 1 + (this.ewcConfig.lambda * dimensionImportance) / 10;
754
- return baseImportance * recencyFactor * accessFactor * lambdaScaled;
755
- }
756
307
  shouldConsolidate() {
757
- // Minimum 1 hour between consolidations
758
308
  if (this.consolidationState.lastConsolidation) {
759
309
  const hoursSinceLast = (Date.now() - this.consolidationState.lastConsolidation.getTime()) / (60 * 60 * 1000);
760
310
  if (hoursSinceLast < 1)
@@ -765,103 +315,17 @@ export class PatternStore {
765
315
  const newPatternsRatio = this.consolidationState.patternsSinceLastConsolidation / this.consolidationState.totalPatterns;
766
316
  if (newPatternsRatio >= this.ewcConfig.consolidationThreshold)
767
317
  return true;
768
- // Force consolidation if approaching max patterns
769
318
  if (this.consolidationState.totalPatterns > this.ewcConfig.maxPatterns * 0.9)
770
319
  return true;
771
320
  return false;
772
321
  }
773
- getPatternCount() {
774
- const stmt = this.db.prepare('SELECT COUNT(*) as count FROM patterns');
775
- const result = stmt.get();
776
- return result.count;
777
- }
778
- getSamplePatterns(limit) {
779
- const stmt = this.db.prepare(`
780
- SELECT * FROM patterns ORDER BY RANDOM() LIMIT ?
781
- `);
782
- const rows = stmt.all(limit);
783
- return rows.map((row) => ({
784
- id: row.pattern_id,
785
- context: JSON.parse(row.context_data),
786
- skill: JSON.parse(row.skill_features),
787
- originalScore: row.original_score,
788
- source: row.source,
789
- contextEmbedding: this.deserializeEmbedding(row.context_embedding),
790
- outcome: {
791
- type: row.outcome_type,
792
- reward: row.outcome_reward,
793
- },
794
- importance: row.importance,
795
- accessCount: row.access_count,
796
- createdAt: new Date(row.created_at * 1000),
797
- lastAccessedAt: new Date(row.last_accessed_at * 1000),
798
- }));
799
- }
800
- getAllPatterns() {
801
- const stmt = this.db.prepare('SELECT * FROM patterns');
802
- const rows = stmt.all();
803
- return rows.map((row) => ({
804
- id: row.pattern_id,
805
- context: JSON.parse(row.context_data),
806
- skill: JSON.parse(row.skill_features),
807
- originalScore: row.original_score,
808
- source: row.source,
809
- contextEmbedding: this.deserializeEmbedding(row.context_embedding),
810
- outcome: {
811
- type: row.outcome_type,
812
- reward: row.outcome_reward,
813
- },
814
- importance: row.importance,
815
- accessCount: row.access_count,
816
- createdAt: new Date(row.created_at * 1000),
817
- lastAccessedAt: new Date(row.last_accessed_at * 1000),
818
- }));
819
- }
820
- updatePatternInDB(patternId, updates) {
821
- const sets = [];
822
- const params = [];
823
- if (updates.importance !== undefined) {
824
- sets.push('importance = ?');
825
- params.push(updates.importance);
826
- }
827
- if (updates.accessCount !== undefined) {
828
- sets.push('access_count = ?');
829
- params.push(updates.accessCount);
830
- }
831
- sets.push('last_accessed_at = unixepoch()');
832
- params.push(patternId);
833
- const stmt = this.db.prepare(`UPDATE patterns SET ${sets.join(', ')} WHERE pattern_id = ?`);
834
- stmt.run(...params);
835
- }
836
- updatePatternImportance(patternId, importance) {
837
- const stmt = this.db.prepare('UPDATE patterns SET importance = ? WHERE pattern_id = ?');
838
- stmt.run(importance, patternId);
839
- }
840
- updateAccessCount(patternId) {
841
- const stmt = this.db.prepare(`
842
- UPDATE patterns SET access_count = access_count + 1, last_accessed_at = unixepoch()
843
- WHERE pattern_id = ?
844
- `);
845
- stmt.run(patternId);
846
- }
847
- deletePattern(patternId) {
848
- const stmt = this.db.prepare('DELETE FROM patterns WHERE pattern_id = ?');
849
- stmt.run(patternId);
850
- }
851
- getDatabaseSize() {
852
- const stmt = this.db.prepare('SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()');
853
- const result = stmt.get();
854
- return result?.size ?? 0;
855
- }
856
322
  loadFisherMatrix() {
857
- const stmt = this.db.prepare('SELECT matrix_data FROM fisher_info WHERE id = 1');
858
- const result = stmt.get();
859
- if (result?.matrix_data) {
323
+ const matrixData = loadFisherMatrixData(this.db);
324
+ if (matrixData) {
860
325
  try {
861
- this.fisherMatrix.deserialize(result.matrix_data);
326
+ this.fisherMatrix.deserialize(matrixData);
862
327
  }
863
328
  catch {
864
- // Corrupted matrix data - reset to fresh state
865
329
  console.warn('[PatternStore] Fisher matrix data corrupted, resetting');
866
330
  this.fisherMatrix.reset();
867
331
  }
@@ -869,21 +333,11 @@ export class PatternStore {
869
333
  }
870
334
  saveFisherMatrix() {
871
335
  const matrixData = this.fisherMatrix.serialize();
872
- const stmt = this.db.prepare(`
873
- INSERT OR REPLACE INTO fisher_info (id, matrix_data, update_count, last_decay_at, updated_at)
874
- VALUES (1, ?, ?, unixepoch(), unixepoch())
875
- `);
876
- stmt.run(matrixData, this.fisherMatrix.getUpdateCount());
336
+ saveFisherMatrixData(this.db, matrixData, this.fisherMatrix.getUpdateCount());
877
337
  }
878
338
  }
879
- // ============================================================================
880
- // Factory Function
881
- // ============================================================================
882
339
  /**
883
340
  * Create and initialize a PatternStore instance
884
- *
885
- * @param config - Configuration options
886
- * @returns Initialized PatternStore
887
341
  */
888
342
  export async function createPatternStore(config = {}) {
889
343
  const store = new PatternStore(config);