@skillsmith/core 0.2.0 → 0.4.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 (690) hide show
  1. package/README.md +235 -4
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
  4. package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
  5. package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
  6. package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
  7. package/dist/src/analysis/__tests__/incremental.test.js +515 -0
  8. package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
  9. package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
  10. package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
  11. package/dist/src/analysis/__tests__/integration.test.js +1059 -0
  12. package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
  13. package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
  14. package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
  15. package/dist/src/analysis/__tests__/metrics.test.js +369 -0
  16. package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
  17. package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
  18. package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
  19. package/dist/src/analysis/__tests__/performance.test.js +402 -0
  20. package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
  21. package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
  22. package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
  23. package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
  24. package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
  25. package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
  26. package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
  27. package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
  28. package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
  29. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
  30. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
  31. package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
  32. package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
  33. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
  34. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
  35. package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
  36. package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
  37. package/dist/src/analysis/adapters/base.d.ts +83 -0
  38. package/dist/src/analysis/adapters/base.d.ts.map +1 -0
  39. package/dist/src/analysis/adapters/base.js +40 -0
  40. package/dist/src/analysis/adapters/base.js.map +1 -0
  41. package/dist/src/analysis/adapters/factory.d.ts +150 -0
  42. package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
  43. package/dist/src/analysis/adapters/factory.js +244 -0
  44. package/dist/src/analysis/adapters/factory.js.map +1 -0
  45. package/dist/src/analysis/adapters/go.d.ts +131 -0
  46. package/dist/src/analysis/adapters/go.d.ts.map +1 -0
  47. package/dist/src/analysis/adapters/go.js +414 -0
  48. package/dist/src/analysis/adapters/go.js.map +1 -0
  49. package/dist/src/analysis/adapters/index.d.ts +20 -0
  50. package/dist/src/analysis/adapters/index.d.ts.map +1 -0
  51. package/dist/src/analysis/adapters/index.js +23 -0
  52. package/dist/src/analysis/adapters/index.js.map +1 -0
  53. package/dist/src/analysis/adapters/java.d.ts +154 -0
  54. package/dist/src/analysis/adapters/java.d.ts.map +1 -0
  55. package/dist/src/analysis/adapters/java.js +407 -0
  56. package/dist/src/analysis/adapters/java.js.map +1 -0
  57. package/dist/src/analysis/adapters/python.d.ts +165 -0
  58. package/dist/src/analysis/adapters/python.d.ts.map +1 -0
  59. package/dist/src/analysis/adapters/python.js +475 -0
  60. package/dist/src/analysis/adapters/python.js.map +1 -0
  61. package/dist/src/analysis/adapters/rust.d.ts +116 -0
  62. package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
  63. package/dist/src/analysis/adapters/rust.js +476 -0
  64. package/dist/src/analysis/adapters/rust.js.map +1 -0
  65. package/dist/src/analysis/adapters/typescript.d.ts +68 -0
  66. package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
  67. package/dist/src/analysis/adapters/typescript.js +79 -0
  68. package/dist/src/analysis/adapters/typescript.js.map +1 -0
  69. package/dist/src/analysis/aggregator.d.ts +193 -0
  70. package/dist/src/analysis/aggregator.d.ts.map +1 -0
  71. package/dist/src/analysis/aggregator.js +283 -0
  72. package/dist/src/analysis/aggregator.js.map +1 -0
  73. package/dist/src/analysis/cache.d.ts +180 -0
  74. package/dist/src/analysis/cache.d.ts.map +1 -0
  75. package/dist/src/analysis/cache.js +279 -0
  76. package/dist/src/analysis/cache.js.map +1 -0
  77. package/dist/src/analysis/file-streamer.d.ts +136 -0
  78. package/dist/src/analysis/file-streamer.d.ts.map +1 -0
  79. package/dist/src/analysis/file-streamer.js +291 -0
  80. package/dist/src/analysis/file-streamer.js.map +1 -0
  81. package/dist/src/analysis/incremental-parser.d.ts +186 -0
  82. package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
  83. package/dist/src/analysis/incremental-parser.js +291 -0
  84. package/dist/src/analysis/incremental-parser.js.map +1 -0
  85. package/dist/src/analysis/incremental.d.ts +186 -0
  86. package/dist/src/analysis/incremental.d.ts.map +1 -0
  87. package/dist/src/analysis/incremental.js +247 -0
  88. package/dist/src/analysis/incremental.js.map +1 -0
  89. package/dist/src/analysis/index.d.ts +25 -3
  90. package/dist/src/analysis/index.d.ts.map +1 -1
  91. package/dist/src/analysis/index.js +45 -3
  92. package/dist/src/analysis/index.js.map +1 -1
  93. package/dist/src/analysis/language-detector.d.ts +76 -0
  94. package/dist/src/analysis/language-detector.d.ts.map +1 -0
  95. package/dist/src/analysis/language-detector.js +205 -0
  96. package/dist/src/analysis/language-detector.js.map +1 -0
  97. package/dist/src/analysis/language-detector.patterns.d.ts +17 -0
  98. package/dist/src/analysis/language-detector.patterns.d.ts.map +1 -0
  99. package/dist/src/analysis/language-detector.patterns.js +413 -0
  100. package/dist/src/analysis/language-detector.patterns.js.map +1 -0
  101. package/dist/src/analysis/language-detector.types.d.ts +48 -0
  102. package/dist/src/analysis/language-detector.types.d.ts.map +1 -0
  103. package/dist/src/analysis/language-detector.types.js +6 -0
  104. package/dist/src/analysis/language-detector.types.js.map +1 -0
  105. package/dist/src/analysis/memory-monitor.d.ts +199 -0
  106. package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
  107. package/dist/src/analysis/memory-monitor.js +271 -0
  108. package/dist/src/analysis/memory-monitor.js.map +1 -0
  109. package/dist/src/analysis/metrics.d.ts +103 -0
  110. package/dist/src/analysis/metrics.d.ts.map +1 -0
  111. package/dist/src/analysis/metrics.implementations.d.ts +39 -0
  112. package/dist/src/analysis/metrics.implementations.d.ts.map +1 -0
  113. package/dist/src/analysis/metrics.implementations.js +114 -0
  114. package/dist/src/analysis/metrics.implementations.js.map +1 -0
  115. package/dist/src/analysis/metrics.js +334 -0
  116. package/dist/src/analysis/metrics.js.map +1 -0
  117. package/dist/src/analysis/metrics.types.d.ts +79 -0
  118. package/dist/src/analysis/metrics.types.d.ts.map +1 -0
  119. package/dist/src/analysis/metrics.types.js +6 -0
  120. package/dist/src/analysis/metrics.types.js.map +1 -0
  121. package/dist/src/analysis/router.d.ts +264 -0
  122. package/dist/src/analysis/router.d.ts.map +1 -0
  123. package/dist/src/analysis/router.js +398 -0
  124. package/dist/src/analysis/router.js.map +1 -0
  125. package/dist/src/analysis/tree-cache.d.ts +208 -0
  126. package/dist/src/analysis/tree-cache.d.ts.map +1 -0
  127. package/dist/src/analysis/tree-cache.js +288 -0
  128. package/dist/src/analysis/tree-cache.js.map +1 -0
  129. package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
  130. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
  131. package/dist/src/analysis/tree-sitter/manager.js +239 -0
  132. package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
  133. package/dist/src/analysis/types.d.ts +71 -6
  134. package/dist/src/analysis/types.d.ts.map +1 -1
  135. package/dist/src/analysis/types.js +36 -3
  136. package/dist/src/analysis/types.js.map +1 -1
  137. package/dist/src/analysis/worker-pool.d.ts +141 -0
  138. package/dist/src/analysis/worker-pool.d.ts.map +1 -0
  139. package/dist/src/analysis/worker-pool.js +418 -0
  140. package/dist/src/analysis/worker-pool.js.map +1 -0
  141. package/dist/src/analytics/AnalyticsRepository.d.ts +4 -0
  142. package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
  143. package/dist/src/analytics/AnalyticsRepository.js +26 -44
  144. package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
  145. package/dist/src/analytics/ROIDashboardService.js +4 -2
  146. package/dist/src/analytics/ROIDashboardService.js.map +1 -1
  147. package/dist/src/analytics/schema.d.ts +1 -1
  148. package/dist/src/analytics/schema.d.ts.map +1 -1
  149. package/dist/src/analytics/schema.js +140 -0
  150. package/dist/src/analytics/schema.js.map +1 -1
  151. package/dist/src/api/cache.d.ts +24 -1
  152. package/dist/src/api/cache.d.ts.map +1 -1
  153. package/dist/src/api/cache.js +50 -2
  154. package/dist/src/api/cache.js.map +1 -1
  155. package/dist/src/api/client.d.ts +141 -6
  156. package/dist/src/api/client.d.ts.map +1 -1
  157. package/dist/src/api/client.js +238 -23
  158. package/dist/src/api/client.js.map +1 -1
  159. package/dist/src/api/index.d.ts +2 -0
  160. package/dist/src/api/index.d.ts.map +1 -1
  161. package/dist/src/api/index.js +7 -0
  162. package/dist/src/api/index.js.map +1 -1
  163. package/dist/src/api/types.d.ts +251 -0
  164. package/dist/src/api/types.d.ts.map +1 -0
  165. package/dist/src/api/types.js +9 -0
  166. package/dist/src/api/types.js.map +1 -0
  167. package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
  168. package/dist/src/benchmarks/BenchmarkRunner.js +1 -1
  169. package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
  170. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
  171. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
  172. package/dist/src/billing/BillingService.d.ts +101 -0
  173. package/dist/src/billing/BillingService.d.ts.map +1 -0
  174. package/dist/src/billing/BillingService.helpers.d.ts +15 -0
  175. package/dist/src/billing/BillingService.helpers.d.ts.map +1 -0
  176. package/dist/src/billing/BillingService.helpers.js +45 -0
  177. package/dist/src/billing/BillingService.helpers.js.map +1 -0
  178. package/dist/src/billing/BillingService.js +263 -0
  179. package/dist/src/billing/BillingService.js.map +1 -0
  180. package/dist/src/billing/BillingService.types.d.ts +52 -0
  181. package/dist/src/billing/BillingService.types.d.ts.map +1 -0
  182. package/dist/src/billing/BillingService.types.js +6 -0
  183. package/dist/src/billing/BillingService.types.js.map +1 -0
  184. package/dist/src/billing/GDPRComplianceService.d.ts +176 -0
  185. package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -0
  186. package/dist/src/billing/GDPRComplianceService.js +361 -0
  187. package/dist/src/billing/GDPRComplianceService.js.map +1 -0
  188. package/dist/src/billing/StripeClient.d.ts +178 -0
  189. package/dist/src/billing/StripeClient.d.ts.map +1 -0
  190. package/dist/src/billing/StripeClient.js +463 -0
  191. package/dist/src/billing/StripeClient.js.map +1 -0
  192. package/dist/src/billing/StripeReconciliationJob.d.ts +95 -0
  193. package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -0
  194. package/dist/src/billing/StripeReconciliationJob.js +405 -0
  195. package/dist/src/billing/StripeReconciliationJob.js.map +1 -0
  196. package/dist/src/billing/StripeWebhookHandler.d.ts +105 -0
  197. package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -0
  198. package/dist/src/billing/StripeWebhookHandler.js +452 -0
  199. package/dist/src/billing/StripeWebhookHandler.js.map +1 -0
  200. package/dist/src/billing/index.d.ts +18 -0
  201. package/dist/src/billing/index.d.ts.map +1 -0
  202. package/dist/src/billing/index.js +19 -0
  203. package/dist/src/billing/index.js.map +1 -0
  204. package/dist/src/billing/types.d.ts +266 -0
  205. package/dist/src/billing/types.d.ts.map +1 -0
  206. package/dist/src/billing/types.js +23 -0
  207. package/dist/src/billing/types.js.map +1 -0
  208. package/dist/src/db/migration.d.ts +129 -0
  209. package/dist/src/db/migration.d.ts.map +1 -0
  210. package/dist/src/db/migration.js +289 -0
  211. package/dist/src/db/migration.js.map +1 -0
  212. package/dist/src/db/schema.d.ts +2 -2
  213. package/dist/src/db/schema.d.ts.map +1 -1
  214. package/dist/src/db/schema.js +63 -1
  215. package/dist/src/db/schema.js.map +1 -1
  216. package/dist/src/embeddings/hnsw-store.d.ts +58 -0
  217. package/dist/src/embeddings/hnsw-store.d.ts.map +1 -0
  218. package/dist/src/embeddings/hnsw-store.helpers.d.ts +83 -0
  219. package/dist/src/embeddings/hnsw-store.helpers.d.ts.map +1 -0
  220. package/dist/src/embeddings/hnsw-store.helpers.js +147 -0
  221. package/dist/src/embeddings/hnsw-store.helpers.js.map +1 -0
  222. package/dist/src/embeddings/hnsw-store.js +354 -0
  223. package/dist/src/embeddings/hnsw-store.js.map +1 -0
  224. package/dist/src/embeddings/hnsw-store.types.d.ts +154 -0
  225. package/dist/src/embeddings/hnsw-store.types.d.ts.map +1 -0
  226. package/dist/src/embeddings/hnsw-store.types.js +26 -0
  227. package/dist/src/embeddings/hnsw-store.types.js.map +1 -0
  228. package/dist/src/embeddings/index.d.ts +2 -0
  229. package/dist/src/embeddings/index.d.ts.map +1 -1
  230. package/dist/src/embeddings/index.js +2 -0
  231. package/dist/src/embeddings/index.js.map +1 -1
  232. package/dist/src/errors.d.ts +1 -0
  233. package/dist/src/errors.d.ts.map +1 -1
  234. package/dist/src/errors.js +2 -1
  235. package/dist/src/errors.js.map +1 -1
  236. package/dist/src/index.d.ts +13 -4
  237. package/dist/src/index.d.ts.map +1 -1
  238. package/dist/src/index.js +26 -4
  239. package/dist/src/index.js.map +1 -1
  240. package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
  241. package/dist/src/indexer/GitHubIndexer.js +17 -4
  242. package/dist/src/indexer/GitHubIndexer.js.map +1 -1
  243. package/dist/src/indexer/SwarmIndexer.d.ts.map +1 -1
  244. package/dist/src/indexer/SwarmIndexer.js +1 -1
  245. package/dist/src/indexer/SwarmIndexer.js.map +1 -1
  246. package/dist/src/learning/PatternStore.d.ts +37 -0
  247. package/dist/src/learning/PatternStore.d.ts.map +1 -0
  248. package/dist/src/learning/PatternStore.helpers.d.ts +88 -0
  249. package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -0
  250. package/dist/src/learning/PatternStore.helpers.js +286 -0
  251. package/dist/src/learning/PatternStore.helpers.js.map +1 -0
  252. package/dist/src/learning/PatternStore.js +347 -0
  253. package/dist/src/learning/PatternStore.js.map +1 -0
  254. package/dist/src/learning/PatternStore.queries.d.ts +83 -0
  255. package/dist/src/learning/PatternStore.queries.d.ts.map +1 -0
  256. package/dist/src/learning/PatternStore.queries.js +189 -0
  257. package/dist/src/learning/PatternStore.queries.js.map +1 -0
  258. package/dist/src/learning/PatternStore.types.d.ts +308 -0
  259. package/dist/src/learning/PatternStore.types.d.ts.map +1 -0
  260. package/dist/src/learning/PatternStore.types.js +44 -0
  261. package/dist/src/learning/PatternStore.types.js.map +1 -0
  262. package/dist/src/learning/ReasoningBankIntegration.d.ts +63 -0
  263. package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -0
  264. package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts +49 -0
  265. package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts.map +1 -0
  266. package/dist/src/learning/ReasoningBankIntegration.helpers.js +180 -0
  267. package/dist/src/learning/ReasoningBankIntegration.helpers.js.map +1 -0
  268. package/dist/src/learning/ReasoningBankIntegration.js +258 -0
  269. package/dist/src/learning/ReasoningBankIntegration.js.map +1 -0
  270. package/dist/src/learning/ReasoningBankIntegration.types.d.ts +167 -0
  271. package/dist/src/learning/ReasoningBankIntegration.types.d.ts.map +1 -0
  272. package/dist/src/learning/ReasoningBankIntegration.types.js +51 -0
  273. package/dist/src/learning/ReasoningBankIntegration.types.js.map +1 -0
  274. package/dist/src/learning/index.d.ts +15 -0
  275. package/dist/src/learning/index.d.ts.map +1 -0
  276. package/dist/src/learning/index.js +15 -0
  277. package/dist/src/learning/index.js.map +1 -0
  278. package/dist/src/learning/interfaces.d.ts.map +1 -1
  279. package/dist/src/pipeline/DailyIndexPipeline.js +1 -1
  280. package/dist/src/pipeline/DailyIndexPipeline.js.map +1 -1
  281. package/dist/src/repositories/IndexerRepository.d.ts +1 -0
  282. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  283. package/dist/src/repositories/IndexerRepository.js +7 -0
  284. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  285. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  286. package/dist/src/repositories/SkillRepository.js +21 -5
  287. package/dist/src/repositories/SkillRepository.js.map +1 -1
  288. package/dist/src/repositories/SyncConfigRepository.d.ts +91 -0
  289. package/dist/src/repositories/SyncConfigRepository.d.ts.map +1 -0
  290. package/dist/src/repositories/SyncConfigRepository.js +202 -0
  291. package/dist/src/repositories/SyncConfigRepository.js.map +1 -0
  292. package/dist/src/repositories/SyncHistoryRepository.d.ts +104 -0
  293. package/dist/src/repositories/SyncHistoryRepository.d.ts.map +1 -0
  294. package/dist/src/repositories/SyncHistoryRepository.js +235 -0
  295. package/dist/src/repositories/SyncHistoryRepository.js.map +1 -0
  296. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  297. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  298. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
  299. package/dist/src/repositories/quarantine/query-builder.js +1 -1
  300. package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
  301. package/dist/src/routing/SONARouter.d.ts +56 -0
  302. package/dist/src/routing/SONARouter.d.ts.map +1 -0
  303. package/dist/src/routing/SONARouter.helpers.d.ts +112 -0
  304. package/dist/src/routing/SONARouter.helpers.d.ts.map +1 -0
  305. package/dist/src/routing/SONARouter.helpers.js +184 -0
  306. package/dist/src/routing/SONARouter.helpers.js.map +1 -0
  307. package/dist/src/routing/SONARouter.js +377 -0
  308. package/dist/src/routing/SONARouter.js.map +1 -0
  309. package/dist/src/routing/index.d.ts +9 -0
  310. package/dist/src/routing/index.d.ts.map +1 -0
  311. package/dist/src/routing/index.js +10 -0
  312. package/dist/src/routing/index.js.map +1 -0
  313. package/dist/src/routing/types.d.ts +331 -0
  314. package/dist/src/routing/types.d.ts.map +1 -0
  315. package/dist/src/routing/types.js +203 -0
  316. package/dist/src/routing/types.js.map +1 -0
  317. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +8 -3
  318. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  319. package/dist/src/scripts/github-import/github-client.d.ts +30 -2
  320. package/dist/src/scripts/github-import/github-client.d.ts.map +1 -1
  321. package/dist/src/scripts/github-import/github-client.js +292 -4
  322. package/dist/src/scripts/github-import/github-client.js.map +1 -1
  323. package/dist/src/scripts/github-import/index.js +3 -10
  324. package/dist/src/scripts/github-import/index.js.map +1 -1
  325. package/dist/src/scripts/github-import/types.d.ts +6 -0
  326. package/dist/src/scripts/github-import/types.d.ts.map +1 -1
  327. package/dist/src/scripts/github-import/types.js +3 -0
  328. package/dist/src/scripts/github-import/types.js.map +1 -1
  329. package/dist/src/scripts/import-github-skills.js +10 -5
  330. package/dist/src/scripts/import-github-skills.js.map +1 -1
  331. package/dist/src/scripts/ingest-lenny-skills.d.ts +40 -0
  332. package/dist/src/scripts/ingest-lenny-skills.d.ts.map +1 -0
  333. package/dist/src/scripts/ingest-lenny-skills.js +346 -0
  334. package/dist/src/scripts/ingest-lenny-skills.js.map +1 -0
  335. package/dist/src/scripts/merge-skills.d.ts +56 -0
  336. package/dist/src/scripts/merge-skills.d.ts.map +1 -0
  337. package/dist/src/scripts/merge-skills.js +411 -0
  338. package/dist/src/scripts/merge-skills.js.map +1 -0
  339. package/dist/src/scripts/review-lenny-skills.d.ts +25 -0
  340. package/dist/src/scripts/review-lenny-skills.d.ts.map +1 -0
  341. package/dist/src/scripts/review-lenny-skills.js +520 -0
  342. package/dist/src/scripts/review-lenny-skills.js.map +1 -0
  343. package/dist/src/scripts/skill-scanner/index.d.ts +9 -2
  344. package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -1
  345. package/dist/src/scripts/skill-scanner/index.js +98 -7
  346. package/dist/src/scripts/skill-scanner/index.js.map +1 -1
  347. package/dist/src/scripts/skill-scanner/logger.d.ts +51 -0
  348. package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -1
  349. package/dist/src/scripts/skill-scanner/logger.js +255 -1
  350. package/dist/src/scripts/skill-scanner/logger.js.map +1 -1
  351. package/dist/src/scripts/skill-scanner/reporter.d.ts +1 -1
  352. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
  353. package/dist/src/scripts/skill-scanner/reporter.js +67 -15
  354. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
  355. package/dist/src/scripts/skill-scanner/scanner.d.ts +5 -2
  356. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
  357. package/dist/src/scripts/skill-scanner/scanner.js +156 -39
  358. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
  359. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
  360. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  361. package/dist/src/scripts/skill-scanner/types.d.ts +44 -0
  362. package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -1
  363. package/dist/src/scripts/sync-to-supabase.d.ts +10 -0
  364. package/dist/src/scripts/sync-to-supabase.d.ts.map +1 -0
  365. package/dist/src/scripts/sync-to-supabase.js +93 -0
  366. package/dist/src/scripts/sync-to-supabase.js.map +1 -0
  367. package/dist/src/scripts/validation/index.js +1 -2
  368. package/dist/src/scripts/validation/index.js.map +1 -1
  369. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
  370. package/dist/src/scripts/validation/pipeline.js.map +1 -1
  371. package/dist/src/scripts/validation/types.d.ts +2 -2
  372. package/dist/src/security/AuditLogger.js +1 -1
  373. package/dist/src/security/AuditLogger.js.map +1 -1
  374. package/dist/src/security/SkillSandbox.d.ts +156 -0
  375. package/dist/src/security/SkillSandbox.d.ts.map +1 -0
  376. package/dist/src/security/SkillSandbox.js +303 -0
  377. package/dist/src/security/SkillSandbox.js.map +1 -0
  378. package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
  379. package/dist/src/security/index.d.ts +3 -1
  380. package/dist/src/security/index.d.ts.map +1 -1
  381. package/dist/src/security/index.js +5 -1
  382. package/dist/src/security/index.js.map +1 -1
  383. package/dist/src/security/rate-limiter/presets.d.ts +12 -0
  384. package/dist/src/security/rate-limiter/presets.d.ts.map +1 -1
  385. package/dist/src/security/rate-limiter/presets.js +12 -0
  386. package/dist/src/security/rate-limiter/presets.js.map +1 -1
  387. package/dist/src/security/sanitization.d.ts +85 -0
  388. package/dist/src/security/sanitization.d.ts.map +1 -1
  389. package/dist/src/security/sanitization.js +133 -0
  390. package/dist/src/security/sanitization.js.map +1 -1
  391. package/dist/src/security/scanner/SecurityScanner.d.ts +13 -66
  392. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  393. package/dist/src/security/scanner/SecurityScanner.formatters.d.ts +49 -0
  394. package/dist/src/security/scanner/SecurityScanner.formatters.d.ts.map +1 -0
  395. package/dist/src/security/scanner/SecurityScanner.formatters.js +139 -0
  396. package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -0
  397. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +40 -0
  398. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -0
  399. package/dist/src/security/scanner/SecurityScanner.helpers.js +142 -0
  400. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -0
  401. package/dist/src/security/scanner/SecurityScanner.js +141 -166
  402. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  403. package/dist/src/security/scanner/patterns.d.ts +13 -0
  404. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  405. package/dist/src/security/scanner/patterns.js +51 -0
  406. package/dist/src/security/scanner/patterns.js.map +1 -1
  407. package/dist/src/security/scanner/types.d.ts +13 -1
  408. package/dist/src/security/scanner/types.d.ts.map +1 -1
  409. package/dist/src/security/scanner/weights.d.ts.map +1 -1
  410. package/dist/src/security/scanner/weights.js +1 -0
  411. package/dist/src/security/scanner/weights.js.map +1 -1
  412. package/dist/src/services/SearchService.d.ts +5 -0
  413. package/dist/src/services/SearchService.d.ts.map +1 -1
  414. package/dist/src/services/SearchService.js +144 -11
  415. package/dist/src/services/SearchService.js.map +1 -1
  416. package/dist/src/services/SkillAnalyzer.d.ts +117 -0
  417. package/dist/src/services/SkillAnalyzer.d.ts.map +1 -0
  418. package/dist/src/services/SkillAnalyzer.js +421 -0
  419. package/dist/src/services/SkillAnalyzer.js.map +1 -0
  420. package/dist/src/services/SkillDecomposer.d.ts +103 -0
  421. package/dist/src/services/SkillDecomposer.d.ts.map +1 -0
  422. package/dist/src/services/SkillDecomposer.js +359 -0
  423. package/dist/src/services/SkillDecomposer.js.map +1 -0
  424. package/dist/src/services/SubagentGenerator.d.ts +68 -0
  425. package/dist/src/services/SubagentGenerator.d.ts.map +1 -0
  426. package/dist/src/services/SubagentGenerator.js +319 -0
  427. package/dist/src/services/SubagentGenerator.js.map +1 -0
  428. package/dist/src/services/TransformationService.d.ts +163 -0
  429. package/dist/src/services/TransformationService.d.ts.map +1 -0
  430. package/dist/src/services/TransformationService.js +291 -0
  431. package/dist/src/services/TransformationService.js.map +1 -0
  432. package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts +6 -0
  433. package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts.map +1 -0
  434. package/dist/src/services/__tests__/SkillAnalyzer.test.js +177 -0
  435. package/dist/src/services/__tests__/SkillAnalyzer.test.js.map +1 -0
  436. package/dist/src/services/__tests__/SkillDecomposer.test.d.ts +6 -0
  437. package/dist/src/services/__tests__/SkillDecomposer.test.d.ts.map +1 -0
  438. package/dist/src/services/__tests__/SkillDecomposer.test.js +235 -0
  439. package/dist/src/services/__tests__/SkillDecomposer.test.js.map +1 -0
  440. package/dist/src/services/__tests__/SubagentGenerator.test.d.ts +6 -0
  441. package/dist/src/services/__tests__/SubagentGenerator.test.d.ts.map +1 -0
  442. package/dist/src/services/__tests__/SubagentGenerator.test.js +174 -0
  443. package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -0
  444. package/dist/src/services/__tests__/TransformationService.test.d.ts +6 -0
  445. package/dist/src/services/__tests__/TransformationService.test.d.ts.map +1 -0
  446. package/dist/src/services/__tests__/TransformationService.test.js +242 -0
  447. package/dist/src/services/__tests__/TransformationService.test.js.map +1 -0
  448. package/dist/src/session/SessionContext.js +1 -1
  449. package/dist/src/session/SessionContext.js.map +1 -1
  450. package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
  451. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  452. package/dist/src/session/SessionHealthMonitor.js +1 -1
  453. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  454. package/dist/src/session/SessionManager.d.ts +9 -66
  455. package/dist/src/session/SessionManager.d.ts.map +1 -1
  456. package/dist/src/session/SessionManager.helpers.d.ts +68 -0
  457. package/dist/src/session/SessionManager.helpers.d.ts.map +1 -0
  458. package/dist/src/session/SessionManager.helpers.js +152 -0
  459. package/dist/src/session/SessionManager.helpers.js.map +1 -0
  460. package/dist/src/session/SessionManager.js +113 -111
  461. package/dist/src/session/SessionManager.js.map +1 -1
  462. package/dist/src/session/SessionManager.types.d.ts +88 -0
  463. package/dist/src/session/SessionManager.types.d.ts.map +1 -0
  464. package/dist/src/session/SessionManager.types.js +27 -0
  465. package/dist/src/session/SessionManager.types.js.map +1 -0
  466. package/dist/src/session/SessionRecovery.d.ts.map +1 -1
  467. package/dist/src/session/SessionRecovery.js +3 -2
  468. package/dist/src/session/SessionRecovery.js.map +1 -1
  469. package/dist/src/sources/RawUrlSourceAdapter.js.map +1 -1
  470. package/dist/src/sources/SourceAdapterRegistry.js +1 -1
  471. package/dist/src/sources/SourceAdapterRegistry.js.map +1 -1
  472. package/dist/src/sync/BackgroundSyncService.d.ts +90 -0
  473. package/dist/src/sync/BackgroundSyncService.d.ts.map +1 -0
  474. package/dist/src/sync/BackgroundSyncService.js +214 -0
  475. package/dist/src/sync/BackgroundSyncService.js.map +1 -0
  476. package/dist/src/sync/SyncEngine.d.ts +76 -0
  477. package/dist/src/sync/SyncEngine.d.ts.map +1 -0
  478. package/dist/src/sync/SyncEngine.js +292 -0
  479. package/dist/src/sync/SyncEngine.js.map +1 -0
  480. package/dist/src/sync/index.d.ts +11 -0
  481. package/dist/src/sync/index.d.ts.map +1 -0
  482. package/dist/src/sync/index.js +14 -0
  483. package/dist/src/sync/index.js.map +1 -0
  484. package/dist/src/telemetry/index.d.ts +1 -1
  485. package/dist/src/telemetry/index.d.ts.map +1 -1
  486. package/dist/src/telemetry/index.js +2 -2
  487. package/dist/src/telemetry/index.js.map +1 -1
  488. package/dist/src/telemetry/posthog.d.ts +27 -5
  489. package/dist/src/telemetry/posthog.d.ts.map +1 -1
  490. package/dist/src/telemetry/posthog.js +20 -5
  491. package/dist/src/telemetry/posthog.js.map +1 -1
  492. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  493. package/dist/src/telemetry/tracer.js +2 -3
  494. package/dist/src/telemetry/tracer.js.map +1 -1
  495. package/dist/src/testing/MultiLLMProvider.d.ts +98 -0
  496. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -0
  497. package/dist/src/testing/MultiLLMProvider.helpers.d.ts +54 -0
  498. package/dist/src/testing/MultiLLMProvider.helpers.d.ts.map +1 -0
  499. package/dist/src/testing/MultiLLMProvider.helpers.js +126 -0
  500. package/dist/src/testing/MultiLLMProvider.helpers.js.map +1 -0
  501. package/dist/src/testing/MultiLLMProvider.js +447 -0
  502. package/dist/src/testing/MultiLLMProvider.js.map +1 -0
  503. package/dist/src/testing/MultiLLMProvider.types.d.ts +253 -0
  504. package/dist/src/testing/MultiLLMProvider.types.d.ts.map +1 -0
  505. package/dist/src/testing/MultiLLMProvider.types.js +111 -0
  506. package/dist/src/testing/MultiLLMProvider.types.js.map +1 -0
  507. package/dist/src/testing/index.d.ts +8 -0
  508. package/dist/src/testing/index.d.ts.map +1 -0
  509. package/dist/src/testing/index.js +9 -0
  510. package/dist/src/testing/index.js.map +1 -0
  511. package/dist/src/triggers/__tests__/TriggerDetector.test.js +1 -1
  512. package/dist/src/triggers/__tests__/TriggerDetector.test.js.map +1 -1
  513. package/dist/src/types/skill.d.ts +32 -0
  514. package/dist/src/types/skill.d.ts.map +1 -1
  515. package/dist/src/types/skill.js +11 -1
  516. package/dist/src/types/skill.js.map +1 -1
  517. package/dist/src/types.d.ts +27 -1
  518. package/dist/src/types.d.ts.map +1 -1
  519. package/dist/src/types.js +2 -2
  520. package/dist/src/types.js.map +1 -1
  521. package/dist/src/utils/retry.js +2 -2
  522. package/dist/src/utils/retry.js.map +1 -1
  523. package/dist/src/validation/index.js +2 -2
  524. package/dist/src/validation/index.js.map +1 -1
  525. package/dist/src/webhooks/WebhookHandler.d.ts.map +1 -1
  526. package/dist/src/webhooks/WebhookHandler.js.map +1 -1
  527. package/dist/src/webhooks/WebhookPayload.js +1 -1
  528. package/dist/src/webhooks/WebhookPayload.js.map +1 -1
  529. package/dist/tests/Analytics.integration.test.js +2 -2
  530. package/dist/tests/Analytics.integration.test.js.map +1 -1
  531. package/dist/tests/AnalyticsRepository.test.js +3 -5
  532. package/dist/tests/AnalyticsRepository.test.js.map +1 -1
  533. package/dist/tests/AnalyticsStorage.test.js.map +1 -1
  534. package/dist/tests/ApiPartialResponses.test.d.ts +12 -0
  535. package/dist/tests/ApiPartialResponses.test.d.ts.map +1 -0
  536. package/dist/tests/ApiPartialResponses.test.js +202 -0
  537. package/dist/tests/ApiPartialResponses.test.js.map +1 -0
  538. package/dist/tests/AuditLogger.test.js.map +1 -1
  539. package/dist/tests/BenchmarkRunner.test.js +6 -6
  540. package/dist/tests/BenchmarkRunner.test.js.map +1 -1
  541. package/dist/tests/CacheSecurity.test.js.map +1 -1
  542. package/dist/tests/CodebaseAnalyzer.test.js.map +1 -1
  543. package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
  544. package/dist/tests/EmbeddingService.test.js.map +1 -1
  545. package/dist/tests/GitHubIndexer.test.js +4 -3
  546. package/dist/tests/GitHubIndexer.test.js.map +1 -1
  547. package/dist/tests/MemoryProfiler.test.js +3 -3
  548. package/dist/tests/MemoryProfiler.test.js.map +1 -1
  549. package/dist/tests/QualityScorer.test.js.map +1 -1
  550. package/dist/tests/RateLimiter.test.js.map +1 -1
  551. package/dist/tests/ScraperAdapters.test.js.map +1 -1
  552. package/dist/tests/SecurityScanner.test.js +337 -1
  553. package/dist/tests/SecurityScanner.test.js.map +1 -1
  554. package/dist/tests/SessionManager.security.test.js +1 -1
  555. package/dist/tests/SessionManager.security.test.js.map +1 -1
  556. package/dist/tests/SessionManager.test.js +4 -4
  557. package/dist/tests/SessionManager.test.js.map +1 -1
  558. package/dist/tests/SwarmIndexer.test.js +1 -1
  559. package/dist/tests/SwarmIndexer.test.js.map +1 -1
  560. package/dist/tests/TieredCache.test.js +2 -11
  561. package/dist/tests/TieredCache.test.js.map +1 -1
  562. package/dist/tests/WebhookHandler.test.js.map +1 -1
  563. package/dist/tests/adapters-factory.test.d.ts +13 -0
  564. package/dist/tests/adapters-factory.test.d.ts.map +1 -0
  565. package/dist/tests/adapters-factory.test.js +308 -0
  566. package/dist/tests/adapters-factory.test.js.map +1 -0
  567. package/dist/tests/adapters-java.test.d.ts +13 -0
  568. package/dist/tests/adapters-java.test.d.ts.map +1 -0
  569. package/dist/tests/adapters-java.test.js +925 -0
  570. package/dist/tests/adapters-java.test.js.map +1 -0
  571. package/dist/tests/api/client.validation.test.d.ts +7 -0
  572. package/dist/tests/api/client.validation.test.d.ts.map +1 -0
  573. package/dist/tests/api/client.validation.test.js +183 -0
  574. package/dist/tests/api/client.validation.test.js.map +1 -0
  575. package/dist/tests/billing/BillingService.test.d.ts +7 -0
  576. package/dist/tests/billing/BillingService.test.d.ts.map +1 -0
  577. package/dist/tests/billing/BillingService.test.js +168 -0
  578. package/dist/tests/billing/BillingService.test.js.map +1 -0
  579. package/dist/tests/billing/GDPRCompliance.test.d.ts +7 -0
  580. package/dist/tests/billing/GDPRCompliance.test.d.ts.map +1 -0
  581. package/dist/tests/billing/GDPRCompliance.test.js +195 -0
  582. package/dist/tests/billing/GDPRCompliance.test.js.map +1 -0
  583. package/dist/tests/billing/StripeReconciliation.test.d.ts +7 -0
  584. package/dist/tests/billing/StripeReconciliation.test.d.ts.map +1 -0
  585. package/dist/tests/billing/StripeReconciliation.test.js +266 -0
  586. package/dist/tests/billing/StripeReconciliation.test.js.map +1 -0
  587. package/dist/tests/billing/stripe-validators.test.d.ts +7 -0
  588. package/dist/tests/billing/stripe-validators.test.d.ts.map +1 -0
  589. package/dist/tests/billing/stripe-validators.test.js +107 -0
  590. package/dist/tests/billing/stripe-validators.test.js.map +1 -0
  591. package/dist/tests/embeddings/hnsw-store.test.d.ts +7 -0
  592. package/dist/tests/embeddings/hnsw-store.test.d.ts.map +1 -0
  593. package/dist/tests/embeddings/hnsw-store.test.js +295 -0
  594. package/dist/tests/embeddings/hnsw-store.test.js.map +1 -0
  595. package/dist/tests/fixtures/api-responses/index.d.ts +119 -0
  596. package/dist/tests/fixtures/api-responses/index.d.ts.map +1 -0
  597. package/dist/tests/fixtures/api-responses/index.js +419 -0
  598. package/dist/tests/fixtures/api-responses/index.js.map +1 -0
  599. package/dist/tests/integration/neural/e2e-learning.test.d.ts +17 -0
  600. package/dist/tests/integration/neural/e2e-learning.test.d.ts.map +1 -0
  601. package/dist/tests/integration/neural/e2e-learning.test.js +238 -0
  602. package/dist/tests/integration/neural/e2e-learning.test.js.map +1 -0
  603. package/dist/tests/integration/neural/helpers.d.ts +132 -0
  604. package/dist/tests/integration/neural/helpers.d.ts.map +1 -0
  605. package/dist/tests/integration/neural/helpers.js +287 -0
  606. package/dist/tests/integration/neural/helpers.js.map +1 -0
  607. package/dist/tests/integration/neural/personalization.test.d.ts +21 -0
  608. package/dist/tests/integration/neural/personalization.test.d.ts.map +1 -0
  609. package/dist/tests/integration/neural/personalization.test.js +304 -0
  610. package/dist/tests/integration/neural/personalization.test.js.map +1 -0
  611. package/dist/tests/integration/neural/preference-learner.test.d.ts +23 -0
  612. package/dist/tests/integration/neural/preference-learner.test.d.ts.map +1 -0
  613. package/dist/tests/integration/neural/preference-learner.test.js +289 -0
  614. package/dist/tests/integration/neural/preference-learner.test.js.map +1 -0
  615. package/dist/tests/integration/neural/privacy.test.d.ts +19 -0
  616. package/dist/tests/integration/neural/privacy.test.d.ts.map +1 -0
  617. package/dist/tests/integration/neural/privacy.test.js +249 -0
  618. package/dist/tests/integration/neural/privacy.test.js.map +1 -0
  619. package/dist/tests/integration/neural/setup.d.ts +175 -0
  620. package/dist/tests/integration/neural/setup.d.ts.map +1 -0
  621. package/dist/tests/integration/neural/setup.js +487 -0
  622. package/dist/tests/integration/neural/setup.js.map +1 -0
  623. package/dist/tests/integration/neural/signal-collection.test.d.ts +21 -0
  624. package/dist/tests/integration/neural/signal-collection.test.d.ts.map +1 -0
  625. package/dist/tests/integration/neural/signal-collection.test.js +232 -0
  626. package/dist/tests/integration/neural/signal-collection.test.js.map +1 -0
  627. package/dist/tests/language-detector.test.d.ts +13 -0
  628. package/dist/tests/language-detector.test.d.ts.map +1 -0
  629. package/dist/tests/language-detector.test.js +674 -0
  630. package/dist/tests/language-detector.test.js.map +1 -0
  631. package/dist/tests/learning/PatternStore.test.d.ts +8 -0
  632. package/dist/tests/learning/PatternStore.test.d.ts.map +1 -0
  633. package/dist/tests/learning/PatternStore.test.js +589 -0
  634. package/dist/tests/learning/PatternStore.test.js.map +1 -0
  635. package/dist/tests/learning/ReasoningBankIntegration.test.d.ts +8 -0
  636. package/dist/tests/learning/ReasoningBankIntegration.test.d.ts.map +1 -0
  637. package/dist/tests/learning/ReasoningBankIntegration.test.js +269 -0
  638. package/dist/tests/learning/ReasoningBankIntegration.test.js.map +1 -0
  639. package/dist/tests/logger.test.js +1 -1
  640. package/dist/tests/logger.test.js.map +1 -1
  641. package/dist/tests/performance/LargeScalePerformance.test.js +1 -1
  642. package/dist/tests/performance/LargeScalePerformance.test.js.map +1 -1
  643. package/dist/tests/routing/SONARouter.test.d.ts +8 -0
  644. package/dist/tests/routing/SONARouter.test.d.ts.map +1 -0
  645. package/dist/tests/routing/SONARouter.test.js +400 -0
  646. package/dist/tests/routing/SONARouter.test.js.map +1 -0
  647. package/dist/tests/sanitization.test.js.map +1 -1
  648. package/dist/tests/security/ContinuousSecurity.test.js +10 -12
  649. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  650. package/dist/tests/security/SkillSandbox.test.d.ts +8 -0
  651. package/dist/tests/security/SkillSandbox.test.d.ts.map +1 -0
  652. package/dist/tests/security/SkillSandbox.test.js +321 -0
  653. package/dist/tests/security/SkillSandbox.test.js.map +1 -0
  654. package/dist/tests/session/SessionManager.helpers.test.d.ts +8 -0
  655. package/dist/tests/session/SessionManager.helpers.test.d.ts.map +1 -0
  656. package/dist/tests/session/SessionManager.helpers.test.js +105 -0
  657. package/dist/tests/session/SessionManager.helpers.test.js.map +1 -0
  658. package/dist/tests/sources.test.js.map +1 -1
  659. package/dist/tests/sync/SyncConfigRepository.test.d.ts +7 -0
  660. package/dist/tests/sync/SyncConfigRepository.test.d.ts.map +1 -0
  661. package/dist/tests/sync/SyncConfigRepository.test.js +154 -0
  662. package/dist/tests/sync/SyncConfigRepository.test.js.map +1 -0
  663. package/dist/tests/sync/SyncEngine.test.d.ts +7 -0
  664. package/dist/tests/sync/SyncEngine.test.d.ts.map +1 -0
  665. package/dist/tests/sync/SyncEngine.test.js +300 -0
  666. package/dist/tests/sync/SyncEngine.test.js.map +1 -0
  667. package/dist/tests/sync/SyncHistoryRepository.test.d.ts +7 -0
  668. package/dist/tests/sync/SyncHistoryRepository.test.d.ts.map +1 -0
  669. package/dist/tests/sync/SyncHistoryRepository.test.js +220 -0
  670. package/dist/tests/sync/SyncHistoryRepository.test.js.map +1 -0
  671. package/dist/tests/telemetry/posthog.test.d.ts +13 -0
  672. package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
  673. package/dist/tests/telemetry/posthog.test.js +600 -0
  674. package/dist/tests/telemetry/posthog.test.js.map +1 -0
  675. package/dist/tests/testing/MultiLLMProvider.test.d.ts +14 -0
  676. package/dist/tests/testing/MultiLLMProvider.test.d.ts.map +1 -0
  677. package/dist/tests/testing/MultiLLMProvider.test.js +438 -0
  678. package/dist/tests/testing/MultiLLMProvider.test.js.map +1 -0
  679. package/dist/tests/webhooks/WebhookHandler.idempotency.test.js +1 -1
  680. package/dist/tests/webhooks/WebhookHandler.idempotency.test.js.map +1 -1
  681. package/dist/tests/webhooks/WebhookPayload.security.test.js.map +1 -1
  682. package/package.json +27 -13
  683. package/dist/src/security/RateLimiter.d.ts +0 -337
  684. package/dist/src/security/RateLimiter.d.ts.map +0 -1
  685. package/dist/src/security/RateLimiter.js +0 -782
  686. package/dist/src/security/RateLimiter.js.map +0 -1
  687. package/dist/src/security/scanner.d.ts +0 -151
  688. package/dist/src/security/scanner.d.ts.map +0 -1
  689. package/dist/src/security/scanner.js +0 -599
  690. package/dist/src/security/scanner.js.map +0 -1
@@ -3,6 +3,7 @@
3
3
  * @module api/client
4
4
  *
5
5
  * SMI-1244: API client for fetching skills from live Supabase endpoints
6
+ * SMI-1258: Runtime validation for API responses using zod
6
7
  *
7
8
  * Provides methods to interact with the Skillsmith API:
8
9
  * - search: Search skills with filters
@@ -10,7 +11,93 @@
10
11
  * - getRecommendations: Get skill recommendations based on tech stack
11
12
  * - recordEvent: Record telemetry event
12
13
  */
14
+ import { z } from 'zod';
13
15
  import type { Skill, TrustTier, SearchOptions } from '../types/skill.js';
16
+ /**
17
+ * Trust tier enum values
18
+ */
19
+ declare const TrustTierSchema: z.ZodEnum<{
20
+ verified: "verified";
21
+ community: "community";
22
+ experimental: "experimental";
23
+ unknown: "unknown";
24
+ }>;
25
+ /**
26
+ * Schema for individual search result from API
27
+ * SMI-1577: Added .optional() and .default() to handle partial API responses
28
+ */
29
+ declare const ApiSearchResultSchema: z.ZodObject<{
30
+ id: z.ZodString;
31
+ name: z.ZodString;
32
+ description: z.ZodNullable<z.ZodString>;
33
+ author: z.ZodNullable<z.ZodString>;
34
+ repo_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
35
+ quality_score: z.ZodNullable<z.ZodNumber>;
36
+ trust_tier: z.ZodDefault<z.ZodEnum<{
37
+ verified: "verified";
38
+ community: "community";
39
+ experimental: "experimental";
40
+ unknown: "unknown";
41
+ }>>;
42
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
43
+ stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
44
+ installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
45
+ created_at: z.ZodOptional<z.ZodString>;
46
+ updated_at: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strip>;
48
+ /**
49
+ * Schema for telemetry response
50
+ */
51
+ declare const TelemetryResponseSchema: z.ZodObject<{
52
+ data: z.ZodObject<{
53
+ ok: z.ZodBoolean;
54
+ }, z.core.$strip>;
55
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
56
+ }, z.core.$strip>;
57
+ declare const SearchResponseSchema: z.ZodObject<{
58
+ data: z.ZodArray<z.ZodObject<{
59
+ id: z.ZodString;
60
+ name: z.ZodString;
61
+ description: z.ZodNullable<z.ZodString>;
62
+ author: z.ZodNullable<z.ZodString>;
63
+ repo_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
64
+ quality_score: z.ZodNullable<z.ZodNumber>;
65
+ trust_tier: z.ZodDefault<z.ZodEnum<{
66
+ verified: "verified";
67
+ community: "community";
68
+ experimental: "experimental";
69
+ unknown: "unknown";
70
+ }>>;
71
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
72
+ stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
73
+ installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
74
+ created_at: z.ZodOptional<z.ZodString>;
75
+ updated_at: z.ZodOptional<z.ZodString>;
76
+ }, z.core.$strip>>;
77
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
78
+ }, z.core.$strip>;
79
+ declare const SingleSkillResponseSchema: z.ZodObject<{
80
+ data: z.ZodObject<{
81
+ id: z.ZodString;
82
+ name: z.ZodString;
83
+ description: z.ZodNullable<z.ZodString>;
84
+ author: z.ZodNullable<z.ZodString>;
85
+ repo_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
86
+ quality_score: z.ZodNullable<z.ZodNumber>;
87
+ trust_tier: z.ZodDefault<z.ZodEnum<{
88
+ verified: "verified";
89
+ community: "community";
90
+ experimental: "experimental";
91
+ unknown: "unknown";
92
+ }>>;
93
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
94
+ stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
95
+ installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
96
+ created_at: z.ZodOptional<z.ZodString>;
97
+ updated_at: z.ZodOptional<z.ZodString>;
98
+ }, z.core.$strip>;
99
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
100
+ }, z.core.$strip>;
14
101
  /**
15
102
  * API response wrapper
16
103
  */
@@ -25,21 +112,32 @@ export interface ApiErrorResponse {
25
112
  error: string;
26
113
  details?: Record<string, unknown>;
27
114
  }
115
+ /**
116
+ * Custom error class for API client errors with retry control
117
+ * SMI-1257: Replace string-based retry skip with custom error class
118
+ */
119
+ export declare class ApiClientError extends Error {
120
+ readonly retryable: boolean;
121
+ readonly statusCode?: number | undefined;
122
+ constructor(message: string, retryable?: boolean, statusCode?: number | undefined);
123
+ }
28
124
  /**
29
125
  * Search result from API
126
+ * SMI-1577: Made repo_url, created_at, updated_at optional to match schema
30
127
  */
31
128
  export interface ApiSearchResult {
32
129
  id: string;
33
130
  name: string;
34
131
  description: string | null;
35
132
  author: string | null;
36
- repo_url: string | null;
133
+ repo_url?: string | null;
37
134
  quality_score: number | null;
38
135
  trust_tier: TrustTier;
39
136
  tags: string[];
40
- stars: number | null;
41
- created_at: string;
42
- updated_at: string;
137
+ stars?: number | null;
138
+ installable?: boolean | null;
139
+ created_at?: string;
140
+ updated_at?: string;
43
141
  }
44
142
  /**
45
143
  * Recommendation request
@@ -72,9 +170,15 @@ export interface ApiClientConfig {
72
170
  maxRetries?: number;
73
171
  /** Enable debug logging */
74
172
  debug?: boolean;
173
+ /** Enable offline mode (disables API calls) */
174
+ offlineMode?: boolean;
75
175
  }
76
176
  /**
77
- * Generate anonymous ID for telemetry
177
+ * Generate anonymous ID for telemetry using cryptographic randomness.
178
+ * Returns a UUID v4 format string (e.g., "550e8400-e29b-41d4-a716-446655440000").
179
+ *
180
+ * Note: This generates a fresh ID per session - it is NOT stored persistently.
181
+ * For persistent anonymous IDs, the caller must handle storage.
78
182
  */
79
183
  export declare function generateAnonymousId(): string;
80
184
  /**
@@ -96,7 +200,12 @@ export declare class SkillsmithApiClient {
96
200
  private timeout;
97
201
  private maxRetries;
98
202
  private debug;
203
+ private offlineMode;
99
204
  constructor(config?: ApiClientConfig);
205
+ /**
206
+ * Check if client is running in offline mode
207
+ */
208
+ isOffline(): boolean;
100
209
  /**
101
210
  * Log debug message
102
211
  */
@@ -106,11 +215,17 @@ export declare class SkillsmithApiClient {
106
215
  */
107
216
  private buildHeaders;
108
217
  /**
109
- * Make API request with retry logic
218
+ * Make API request with retry logic and optional schema validation
219
+ * SMI-1258: Added runtime validation for API responses
220
+ *
221
+ * @param endpoint - API endpoint path
222
+ * @param options - Fetch options
223
+ * @param schema - Optional zod schema for response validation
110
224
  */
111
225
  private request;
112
226
  /**
113
227
  * Search for skills
228
+ * SMI-1258: Validates response against SearchResponseSchema
114
229
  *
115
230
  * @param options - Search options
116
231
  * @returns Search results
@@ -118,6 +233,7 @@ export declare class SkillsmithApiClient {
118
233
  search(options: SearchOptions): Promise<ApiResponse<ApiSearchResult[]>>;
119
234
  /**
120
235
  * Get skill by ID
236
+ * SMI-1258: Validates response against SingleSkillResponseSchema
121
237
  *
122
238
  * @param id - Skill ID (UUID or author/name format)
123
239
  * @returns Skill details
@@ -125,6 +241,7 @@ export declare class SkillsmithApiClient {
125
241
  getSkill(id: string): Promise<ApiResponse<ApiSearchResult>>;
126
242
  /**
127
243
  * Get skill recommendations based on tech stack
244
+ * SMI-1258: Validates response against SearchResponseSchema
128
245
  *
129
246
  * @param request - Recommendation request
130
247
  * @returns Recommended skills
@@ -132,6 +249,7 @@ export declare class SkillsmithApiClient {
132
249
  getRecommendations(request: RecommendationRequest): Promise<ApiResponse<ApiSearchResult[]>>;
133
250
  /**
134
251
  * Record telemetry event
252
+ * SMI-1258: Validates response against TelemetryResponseSchema
135
253
  *
136
254
  * @param event - Telemetry event
137
255
  * @returns Success response
@@ -139,8 +257,24 @@ export declare class SkillsmithApiClient {
139
257
  recordEvent(event: TelemetryEvent): Promise<{
140
258
  ok: boolean;
141
259
  }>;
260
+ /**
261
+ * Check API health status
262
+ *
263
+ * Returns service health information including status, timestamp, and version.
264
+ * In offline mode, returns a synthetic healthy response.
265
+ *
266
+ * @returns Health status object
267
+ */
268
+ checkHealth(): Promise<{
269
+ status: 'healthy' | 'degraded' | 'unhealthy';
270
+ timestamp: string;
271
+ version: string;
272
+ }>;
142
273
  /**
143
274
  * Convert API result to Skill type
275
+ * SMI-1577: Handle optional fields with sensible defaults
276
+ * Uses epoch timestamp as sentinel for missing dates to avoid data integrity issues
277
+ * SMI-825: Added security scan fields
144
278
  */
145
279
  static toSkill(result: ApiSearchResult): Skill;
146
280
  }
@@ -148,5 +282,6 @@ export declare class SkillsmithApiClient {
148
282
  * Create a default API client instance
149
283
  */
150
284
  export declare function createApiClient(config?: ApiClientConfig): SkillsmithApiClient;
285
+ export { ApiSearchResultSchema, SearchResponseSchema, SingleSkillResponseSchema, TelemetryResponseSchema, TrustTierSchema, };
151
286
  export default SkillsmithApiClient;
152
287
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  * @module api/client
4
4
  *
5
5
  * SMI-1244: API client for fetching skills from live Supabase endpoints
6
+ * SMI-1258: Runtime validation for API responses using zod
6
7
  *
7
8
  * Provides methods to interact with the Skillsmith API:
8
9
  * - search: Search skills with filters
@@ -10,7 +11,73 @@
10
11
  * - getRecommendations: Get skill recommendations based on tech stack
11
12
  * - recordEvent: Record telemetry event
12
13
  */
13
- const DEFAULT_BASE_URL = 'https://vrcnzpmndtroqxxoqkzy.supabase.co/functions/v1';
14
+ import { z } from 'zod';
15
+ import { SkillsmithError, ErrorCodes } from '../errors.js';
16
+ // ============================================================================
17
+ // Zod Schemas for API Response Validation (SMI-1258)
18
+ // ============================================================================
19
+ /**
20
+ * Trust tier enum values
21
+ */
22
+ const TrustTierSchema = z.enum(['verified', 'community', 'experimental', 'unknown']);
23
+ /**
24
+ * Schema for individual search result from API
25
+ * SMI-1577: Added .optional() and .default() to handle partial API responses
26
+ */
27
+ const ApiSearchResultSchema = z.object({
28
+ id: z.string(),
29
+ name: z.string(),
30
+ description: z.string().nullable(),
31
+ author: z.string().nullable(),
32
+ repo_url: z.string().nullable().optional(),
33
+ quality_score: z.number().nullable(),
34
+ trust_tier: TrustTierSchema.default('unknown'),
35
+ tags: z.array(z.string()).default([]),
36
+ stars: z.number().nullable().optional(),
37
+ installable: z.boolean().nullable().optional(),
38
+ created_at: z.string().optional(),
39
+ updated_at: z.string().optional(),
40
+ });
41
+ /**
42
+ * Schema for generic API response wrapper
43
+ */
44
+ function createApiResponseSchema(dataSchema) {
45
+ return z.object({
46
+ data: dataSchema,
47
+ meta: z.record(z.string(), z.unknown()).optional(),
48
+ });
49
+ }
50
+ /**
51
+ * Schema for telemetry response
52
+ */
53
+ const TelemetryResponseSchema = z.object({
54
+ data: z.object({
55
+ ok: z.boolean(),
56
+ }),
57
+ meta: z.record(z.string(), z.unknown()).optional(),
58
+ });
59
+ // Pre-built schemas for common responses
60
+ const SearchResponseSchema = createApiResponseSchema(z.array(ApiSearchResultSchema));
61
+ const SingleSkillResponseSchema = createApiResponseSchema(ApiSearchResultSchema);
62
+ /**
63
+ * Custom error class for API client errors with retry control
64
+ * SMI-1257: Replace string-based retry skip with custom error class
65
+ */
66
+ export class ApiClientError extends Error {
67
+ retryable;
68
+ statusCode;
69
+ constructor(message, retryable = false, statusCode) {
70
+ super(message);
71
+ this.retryable = retryable;
72
+ this.statusCode = statusCode;
73
+ this.name = 'ApiClientError';
74
+ }
75
+ }
76
+ // Default base URL is constructed from SUPABASE_URL environment variable
77
+ // Falls back to undefined to fail explicitly if not configured
78
+ const DEFAULT_BASE_URL = process.env.SUPABASE_URL
79
+ ? `${process.env.SUPABASE_URL}/functions/v1`
80
+ : undefined;
14
81
  /**
15
82
  * Calculate delay with exponential backoff and jitter
16
83
  */
@@ -20,15 +87,35 @@ function calculateBackoff(attempt, baseDelay = 1000) {
20
87
  return Math.min(exponentialDelay + jitter, 30000); // Max 30s
21
88
  }
22
89
  /**
23
- * Generate anonymous ID for telemetry
90
+ * Generate anonymous ID for telemetry using cryptographic randomness.
91
+ * Returns a UUID v4 format string (e.g., "550e8400-e29b-41d4-a716-446655440000").
92
+ *
93
+ * Note: This generates a fresh ID per session - it is NOT stored persistently.
94
+ * For persistent anonymous IDs, the caller must handle storage.
24
95
  */
25
96
  export function generateAnonymousId() {
97
+ // Use Node.js crypto.randomUUID() for cryptographically secure random IDs
98
+ // This is available in Node.js 14.17.0+ and all modern browsers
99
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
100
+ return crypto.randomUUID();
101
+ }
102
+ // Fallback for older environments: use crypto.getRandomValues if available
103
+ if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
104
+ const bytes = new Uint8Array(16);
105
+ crypto.getRandomValues(bytes);
106
+ // Set version (4) and variant (RFC4122) bits
107
+ bytes[6] = (bytes[6] & 0x0f) | 0x40;
108
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
109
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
110
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
111
+ }
112
+ // Last resort fallback (not cryptographically secure, but functional)
26
113
  const chars = 'abcdef0123456789';
27
114
  let id = '';
28
115
  for (let i = 0; i < 32; i++) {
29
116
  id += chars[Math.floor(Math.random() * chars.length)];
30
117
  }
31
- return id;
118
+ return `${id.slice(0, 8)}-${id.slice(8, 12)}-${id.slice(12, 16)}-${id.slice(16, 20)}-${id.slice(20)}`;
32
119
  }
33
120
  /**
34
121
  * Skillsmith API Client
@@ -49,13 +136,25 @@ export class SkillsmithApiClient {
49
136
  timeout;
50
137
  maxRetries;
51
138
  debug;
139
+ offlineMode;
52
140
  constructor(config = {}) {
53
- this.baseUrl = config.baseUrl || process.env.SKILLSMITH_API_URL || DEFAULT_BASE_URL;
141
+ const baseUrl = config.baseUrl || process.env.SKILLSMITH_API_URL || DEFAULT_BASE_URL;
142
+ // Auto-enable offline mode if no URL is configured (graceful degradation)
143
+ // This allows the client to work in test/dev environments without explicit configuration
144
+ const explicitOfflineMode = config.offlineMode ?? process.env.SKILLSMITH_OFFLINE_MODE === 'true';
145
+ this.offlineMode = explicitOfflineMode || !baseUrl;
146
+ this.baseUrl = baseUrl || 'offline://not-configured';
54
147
  this.anonKey = config.anonKey || process.env.SUPABASE_ANON_KEY;
55
148
  this.timeout = config.timeout ?? 30000;
56
149
  this.maxRetries = config.maxRetries ?? 3;
57
150
  this.debug = config.debug ?? false;
58
151
  }
152
+ /**
153
+ * Check if client is running in offline mode
154
+ */
155
+ isOffline() {
156
+ return this.offlineMode;
157
+ }
59
158
  /**
60
159
  * Log debug message
61
160
  */
@@ -79,9 +178,14 @@ export class SkillsmithApiClient {
79
178
  return headers;
80
179
  }
81
180
  /**
82
- * Make API request with retry logic
181
+ * Make API request with retry logic and optional schema validation
182
+ * SMI-1258: Added runtime validation for API responses
183
+ *
184
+ * @param endpoint - API endpoint path
185
+ * @param options - Fetch options
186
+ * @param schema - Optional zod schema for response validation
83
187
  */
84
- async request(endpoint, options = {}) {
188
+ async request(endpoint, options = {}, schema) {
85
189
  const url = `${this.baseUrl}${endpoint}`;
86
190
  let lastError;
87
191
  for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
@@ -99,26 +203,59 @@ export class SkillsmithApiClient {
99
203
  });
100
204
  clearTimeout(timeoutId);
101
205
  if (!response.ok) {
102
- const errorBody = await response.json().catch(() => ({ error: 'Unknown error' }));
103
- // Don't retry on client errors (4xx)
206
+ const errorBody = (await response
207
+ .json()
208
+ .catch(() => ({ error: 'Unknown error' })));
209
+ // Don't retry on client errors (4xx) - not retryable
104
210
  if (response.status >= 400 && response.status < 500) {
105
- throw new Error(errorBody.error || `API error: ${response.status}`);
211
+ throw new ApiClientError(errorBody.error || `API error: ${response.status}`, false, // not retryable
212
+ response.status);
106
213
  }
107
- // Retry on server errors (5xx) and rate limits (429)
214
+ // Retry on server errors (5xx) and rate limits (429) - retryable
108
215
  if (response.status === 429 || response.status >= 500) {
109
- throw new Error(`Server error: ${response.status}`);
216
+ throw new ApiClientError(`Server error: ${response.status}`, true, response.status);
110
217
  }
111
- throw new Error(errorBody.error || `API error: ${response.status}`);
218
+ // Default: not retryable
219
+ throw new ApiClientError(errorBody.error || `API error: ${response.status}`, false, response.status);
112
220
  }
113
- const data = await response.json();
221
+ const rawData = await response.json();
222
+ // SMI-1258: Validate response against schema if provided
223
+ if (schema) {
224
+ const validated = schema.safeParse(rawData);
225
+ if (!validated.success) {
226
+ const errorMessage = validated.error.issues
227
+ .map((issue) => `${issue.path.join('.')}: ${issue.message}`)
228
+ .join(', ');
229
+ this.log('Response validation failed:', validated.error.issues);
230
+ throw new SkillsmithError(ErrorCodes.NETWORK_INVALID_RESPONSE, `Invalid API response: ${errorMessage}`, {
231
+ details: {
232
+ endpoint,
233
+ validationErrors: validated.error.issues,
234
+ },
235
+ });
236
+ }
237
+ this.log('Response received and validated:', { status: response.status });
238
+ return validated.data;
239
+ }
240
+ // Fallback: return unvalidated data (for backwards compatibility)
114
241
  this.log('Response received:', { status: response.status });
115
- return data;
242
+ return rawData;
116
243
  }
117
244
  catch (error) {
118
245
  lastError = error instanceof Error ? error : new Error(String(error));
119
246
  this.log(`Attempt ${attempt + 1} failed:`, lastError.message);
120
- // Don't retry on abort or client errors
121
- if (lastError.name === 'AbortError' || lastError.message.includes('API error')) {
247
+ // Don't retry on abort errors
248
+ if (lastError.name === 'AbortError') {
249
+ throw lastError;
250
+ }
251
+ // Don't retry on validation errors - malformed responses won't fix themselves
252
+ if (lastError instanceof SkillsmithError &&
253
+ lastError.code === ErrorCodes.NETWORK_INVALID_RESPONSE) {
254
+ throw lastError;
255
+ }
256
+ // SMI-1257: Use custom error class instead of string matching
257
+ // Don't retry on non-retryable API errors
258
+ if (lastError instanceof ApiClientError && !lastError.retryable) {
122
259
  throw lastError;
123
260
  }
124
261
  if (attempt < this.maxRetries) {
@@ -132,6 +269,7 @@ export class SkillsmithApiClient {
132
269
  }
133
270
  /**
134
271
  * Search for skills
272
+ * SMI-1258: Validates response against SearchResponseSchema
135
273
  *
136
274
  * @param options - Search options
137
275
  * @returns Search results
@@ -149,20 +287,22 @@ export class SkillsmithApiClient {
149
287
  params.set('min_score', String(options.minQualityScore));
150
288
  if (options.category)
151
289
  params.set('category', options.category);
152
- return this.request(`/skills-search?${params.toString()}`);
290
+ return this.request(`/skills-search?${params.toString()}`, {}, SearchResponseSchema);
153
291
  }
154
292
  /**
155
293
  * Get skill by ID
294
+ * SMI-1258: Validates response against SingleSkillResponseSchema
156
295
  *
157
296
  * @param id - Skill ID (UUID or author/name format)
158
297
  * @returns Skill details
159
298
  */
160
299
  async getSkill(id) {
161
300
  const encodedId = encodeURIComponent(id);
162
- return this.request(`/skills-get?id=${encodedId}`);
301
+ return this.request(`/skills-get?id=${encodedId}`, {}, SingleSkillResponseSchema);
163
302
  }
164
303
  /**
165
304
  * Get skill recommendations based on tech stack
305
+ * SMI-1258: Validates response against SearchResponseSchema
166
306
  *
167
307
  * @param request - Recommendation request
168
308
  * @returns Recommended skills
@@ -171,10 +311,11 @@ export class SkillsmithApiClient {
171
311
  return this.request('/skills-recommend', {
172
312
  method: 'POST',
173
313
  body: JSON.stringify(request),
174
- });
314
+ }, SearchResponseSchema);
175
315
  }
176
316
  /**
177
317
  * Record telemetry event
318
+ * SMI-1258: Validates response against TelemetryResponseSchema
178
319
  *
179
320
  * @param event - Telemetry event
180
321
  * @returns Success response
@@ -184,7 +325,7 @@ export class SkillsmithApiClient {
184
325
  const response = await this.request('/events', {
185
326
  method: 'POST',
186
327
  body: JSON.stringify(event),
187
- });
328
+ }, TelemetryResponseSchema);
188
329
  return response.data;
189
330
  }
190
331
  catch {
@@ -193,21 +334,93 @@ export class SkillsmithApiClient {
193
334
  return { ok: false };
194
335
  }
195
336
  }
337
+ /**
338
+ * Check API health status
339
+ *
340
+ * Returns service health information including status, timestamp, and version.
341
+ * In offline mode, returns a synthetic healthy response.
342
+ *
343
+ * @returns Health status object
344
+ */
345
+ async checkHealth() {
346
+ // In offline mode, return synthetic healthy status
347
+ if (this.offlineMode) {
348
+ return {
349
+ status: 'healthy',
350
+ timestamp: new Date().toISOString(),
351
+ version: 'offline',
352
+ };
353
+ }
354
+ try {
355
+ // Simple health check - try to reach the API
356
+ const controller = new AbortController();
357
+ const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout for health
358
+ const response = await fetch(`${this.baseUrl}/health`, {
359
+ headers: this.buildHeaders(),
360
+ signal: controller.signal,
361
+ });
362
+ clearTimeout(timeoutId);
363
+ if (response.ok) {
364
+ // Try to parse JSON response, fall back to basic healthy status
365
+ try {
366
+ const data = (await response.json());
367
+ return {
368
+ status: 'healthy',
369
+ timestamp: new Date().toISOString(),
370
+ version: data.version || '1.0.0',
371
+ };
372
+ }
373
+ catch {
374
+ return {
375
+ status: 'healthy',
376
+ timestamp: new Date().toISOString(),
377
+ version: '1.0.0',
378
+ };
379
+ }
380
+ }
381
+ // Non-OK response indicates degraded service
382
+ return {
383
+ status: response.status >= 500 ? 'unhealthy' : 'degraded',
384
+ timestamp: new Date().toISOString(),
385
+ version: 'unknown',
386
+ };
387
+ }
388
+ catch (error) {
389
+ this.log('Health check failed:', error);
390
+ // Network errors indicate unhealthy service
391
+ return {
392
+ status: 'unhealthy',
393
+ timestamp: new Date().toISOString(),
394
+ version: 'unknown',
395
+ };
396
+ }
397
+ }
196
398
  /**
197
399
  * Convert API result to Skill type
400
+ * SMI-1577: Handle optional fields with sensible defaults
401
+ * Uses epoch timestamp as sentinel for missing dates to avoid data integrity issues
402
+ * SMI-825: Added security scan fields
198
403
  */
199
404
  static toSkill(result) {
405
+ // Sentinel value for missing timestamps - clearly indicates unknown date
406
+ const UNKNOWN_DATE = '1970-01-01T00:00:00.000Z';
200
407
  return {
201
408
  id: result.id,
202
409
  name: result.name,
203
410
  description: result.description,
204
411
  author: result.author,
205
- repoUrl: result.repo_url,
412
+ repoUrl: result.repo_url ?? null,
206
413
  qualityScore: result.quality_score,
207
414
  trustTier: result.trust_tier,
208
415
  tags: result.tags || [],
209
- createdAt: result.created_at,
210
- updatedAt: result.updated_at,
416
+ installable: result.installable ?? false,
417
+ // SMI-825: Security scan fields (default to not scanned for API results)
418
+ riskScore: null,
419
+ securityFindingsCount: 0,
420
+ securityScannedAt: null,
421
+ securityPassed: null,
422
+ createdAt: result.created_at ?? UNKNOWN_DATE,
423
+ updatedAt: result.updated_at ?? UNKNOWN_DATE,
211
424
  };
212
425
  }
213
426
  }
@@ -217,5 +430,7 @@ export class SkillsmithApiClient {
217
430
  export function createApiClient(config) {
218
431
  return new SkillsmithApiClient(config);
219
432
  }
433
+ // SMI-1258: Export schemas for testing and external validation
434
+ export { ApiSearchResultSchema, SearchResponseSchema, SingleSkillResponseSchema, TelemetryResponseSchema, TrustTierSchema, };
220
435
  export default SkillsmithApiClient;
221
436
  //# sourceMappingURL=client.js.map