@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
@@ -8,427 +8,15 @@
8
8
  * - SSRF prevention (SMI-721, SMI-729)
9
9
  * - Path traversal prevention (SMI-720)
10
10
  * - RegExp injection prevention (SMI-722)
11
- */
12
- import { resolve } from 'path';
13
- /**
14
- * Validation error thrown when input fails security checks
15
- */
16
- export class ValidationError extends Error {
17
- code;
18
- details;
19
- constructor(message, code, details) {
20
- super(message);
21
- this.code = code;
22
- this.details = details;
23
- this.name = 'ValidationError';
24
- }
25
- }
26
- /**
27
- * Validate URL to prevent SSRF attacks (SMI-721, SMI-729)
28
- *
29
- * Blocks:
30
- * - Non-http(s) protocols
31
- * - Private IPv4 ranges (10.x, 172.16-31.x, 192.168.x)
32
- * - Private IPv6 ranges (fe80::/10, fc00::/7, ff00::/8, ::ffff:0:0/96)
33
- * - Localhost variants (127.x, localhost, ::1, 0.0.0.0)
34
- * - Link-local addresses (169.254.x, fe80::/10)
35
- * - Current network (0.x)
36
- *
37
- * @param url - URL to validate
38
- * @throws {ValidationError} if URL is not allowed
39
- *
40
- * @example
41
- * ```typescript
42
- * validateUrl('https://example.com/api') // OK
43
- * validateUrl('http://localhost:3000') // Throws ValidationError
44
- * validateUrl('ftp://example.com') // Throws ValidationError
45
- * validateUrl('http://192.168.1.1') // Throws ValidationError
46
- * validateUrl('http://[fe80::1]') // Throws ValidationError (IPv6 link-local)
47
- * ```
48
- */
49
- export function validateUrl(url) {
50
- let parsed;
51
- try {
52
- parsed = new URL(url);
53
- }
54
- catch (error) {
55
- throw new ValidationError(`Invalid URL format: ${url}`, 'INVALID_URL_FORMAT', error);
56
- }
57
- // Only allow http/https protocols
58
- if (!['http:', 'https:'].includes(parsed.protocol)) {
59
- throw new ValidationError(`Invalid protocol: ${parsed.protocol}. Only http and https are allowed.`, 'INVALID_PROTOCOL', { protocol: parsed.protocol, url });
60
- }
61
- let hostname = parsed.hostname.toLowerCase();
62
- // Strip brackets from IPv6 addresses for easier comparison
63
- // Node.js URL keeps brackets in hostname for IPv6 (e.g., "[::1]")
64
- if (hostname.startsWith('[') && hostname.endsWith(']')) {
65
- hostname = hostname.slice(1, -1);
66
- }
67
- // Block localhost variants
68
- if (hostname === 'localhost' || hostname === '::1' || hostname === '0.0.0.0') {
69
- throw new ValidationError(`Access to localhost is blocked: ${hostname}`, 'LOCALHOST_BLOCKED', {
70
- hostname,
71
- url,
72
- });
73
- }
74
- // Check for IPv4 addresses
75
- const ipv4Match = hostname.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
76
- if (ipv4Match) {
77
- const [, a, b, c, d] = ipv4Match.map(Number);
78
- // Validate IPv4 octets are in valid range
79
- if (a > 255 || b > 255 || c > 255 || d > 255) {
80
- throw new ValidationError(`Invalid IPv4 address: ${hostname}`, 'INVALID_IPV4', {
81
- hostname,
82
- url,
83
- });
84
- }
85
- // Block private/internal IP ranges
86
- if (a === 10 || // 10.0.0.0/8 - Private network
87
- (a === 172 && b >= 16 && b <= 31) || // 172.16.0.0/12 - Private network
88
- (a === 192 && b === 168) || // 192.168.0.0/16 - Private network
89
- a === 127 || // 127.0.0.0/8 - Loopback
90
- (a === 169 && b === 254) || // 169.254.0.0/16 - Link-local
91
- a === 0 // 0.0.0.0/8 - Current network
92
- ) {
93
- throw new ValidationError(`Access to private/internal network blocked: ${hostname}`, 'PRIVATE_NETWORK_BLOCKED', { hostname, url, ipRange: getIpRangeName(a, b) });
94
- }
95
- }
96
- // Check for IPv6 addresses (SMI-729)
97
- // IPv6 addresses in URLs are enclosed in square brackets, but hostname strips them
98
- if (hostname.includes(':')) {
99
- validateIPv6(hostname, url);
100
- }
101
- }
102
- /**
103
- * Validate IPv6 address to prevent SSRF attacks (SMI-729)
104
- *
105
- * Blocks:
106
- * - Link-local: fe80::/10
107
- * - Unique local addresses (ULA): fc00::/7
108
- * - Multicast: ff00::/8
109
- * - IPv4-mapped IPv6: ::ffff:0:0/96
110
- * - Loopback ::1 (already blocked above)
111
- *
112
- * @param hostname - IPv6 hostname to validate
113
- * @param url - Full URL for error context
114
- * @throws {ValidationError} if IPv6 address is not allowed
115
- */
116
- function validateIPv6(hostname, url) {
117
- // Normalize IPv6 address
118
- const normalized = hostname.toLowerCase();
119
- // Block IPv6 loopback (::1 and its full form)
120
- // This is defense-in-depth since line 76 should also catch ::1
121
- if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1') {
122
- throw new ValidationError(`Access to localhost is blocked: ${hostname}`, 'LOCALHOST_BLOCKED', {
123
- hostname,
124
- url,
125
- });
126
- }
127
- // Block link-local addresses (fe80::/10)
128
- // fe80 to febf range
129
- if (normalized.startsWith('fe8') ||
130
- normalized.startsWith('fe9') ||
131
- normalized.startsWith('fea') ||
132
- normalized.startsWith('feb')) {
133
- throw new ValidationError(`Access to IPv6 link-local address blocked: ${hostname}`, 'IPV6_LINK_LOCAL_BLOCKED', { hostname, url });
134
- }
135
- // Block unique local addresses (fc00::/7)
136
- // fc00 to fdff range
137
- if (normalized.startsWith('fc') || normalized.startsWith('fd')) {
138
- throw new ValidationError(`Access to IPv6 unique local address blocked: ${hostname}`, 'IPV6_ULA_BLOCKED', { hostname, url });
139
- }
140
- // Block multicast addresses (ff00::/8)
141
- if (normalized.startsWith('ff')) {
142
- throw new ValidationError(`Access to IPv6 multicast address blocked: ${hostname}`, 'IPV6_MULTICAST_BLOCKED', { hostname, url });
143
- }
144
- // Block IPv4-mapped IPv6 addresses (::ffff:0:0/96)
145
- // These map IPv4 addresses into IPv6 space
146
- if (normalized.includes('::ffff:')) {
147
- // Extract the IPv4 part and validate it
148
- const ipv4Part = normalized.split('::ffff:')[1];
149
- if (ipv4Part) {
150
- // Check if it's in dotted decimal notation
151
- const ipv4Match = ipv4Part.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/);
152
- if (ipv4Match) {
153
- const [, a, b] = ipv4Match.map(Number);
154
- // Apply same private IP checks as IPv4
155
- if (a === 10 ||
156
- (a === 172 && b >= 16 && b <= 31) ||
157
- (a === 192 && b === 168) ||
158
- a === 127 ||
159
- (a === 169 && b === 254) ||
160
- a === 0) {
161
- throw new ValidationError(`Access to IPv4-mapped IPv6 private address blocked: ${hostname}`, 'IPV4_MAPPED_IPV6_BLOCKED', { hostname, url, ipRange: getIpRangeName(a, b) });
162
- }
163
- }
164
- else {
165
- // IPv4 in hex notation (e.g., ::ffff:7f00:1 for 127.0.0.1)
166
- // Parse hex format: high:low where high = (a<<8)|b, low = (c<<8)|d
167
- const hexMatch = ipv4Part.match(/^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
168
- if (hexMatch) {
169
- const high = parseInt(hexMatch[1], 16);
170
- const low = parseInt(hexMatch[2], 16);
171
- const a = (high >> 8) & 0xff;
172
- const b = high & 0xff;
173
- // Apply same private IP checks as IPv4
174
- if (a === 10 ||
175
- (a === 172 && b >= 16 && b <= 31) ||
176
- (a === 192 && b === 168) ||
177
- a === 127 ||
178
- (a === 169 && b === 254) ||
179
- a === 0) {
180
- throw new ValidationError(`Access to IPv4-mapped IPv6 private address blocked: ${hostname}`, 'IPV4_MAPPED_IPV6_BLOCKED', { hostname, url, ipRange: getIpRangeName(a, b) });
181
- }
182
- }
183
- // If we can't parse it, block it to be safe
184
- throw new ValidationError(`Access to IPv4-mapped IPv6 address blocked: ${hostname}`, 'IPV4_MAPPED_IPV6_BLOCKED', { hostname, url });
185
- }
186
- }
187
- }
188
- // Block 6to4 addresses with embedded private IPv4 (2002::/16) - SMI-1004
189
- // 6to4 embeds IPv4 in bits 16-48: 2002:AABB:CCDD::/48 where IPv4 is AA.BB.CC.DD
190
- if (normalized.startsWith('2002:')) {
191
- // Extract the two hex segments after 2002:
192
- const segments = normalized.split(':');
193
- if (segments.length >= 3 && segments[1] && segments[2]) {
194
- // Parse hex segments: 2002:AABB:CCDD -> IPv4 is 0xAA.0xBB.0xCC.0xDD
195
- const highHex = segments[1].padStart(4, '0');
196
- const lowHex = segments[2].padStart(4, '0');
197
- const a = parseInt(highHex.slice(0, 2), 16);
198
- const b = parseInt(highHex.slice(2, 4), 16);
199
- const c = parseInt(lowHex.slice(0, 2), 16);
200
- const d = parseInt(lowHex.slice(2, 4), 16);
201
- // Check if embedded IPv4 is private
202
- if (a === 10 ||
203
- (a === 172 && b >= 16 && b <= 31) ||
204
- (a === 192 && b === 168) ||
205
- a === 127 ||
206
- (a === 169 && b === 254) ||
207
- a === 0) {
208
- throw new ValidationError(`Access to 6to4 address with embedded private IPv4 blocked: ${hostname}`, 'IPV6_6TO4_PRIVATE', { hostname, url, embeddedIPv4: `${a}.${b}.${c}.${d}`, ipRange: getIpRangeName(a, b) });
209
- }
210
- }
211
- }
212
- // Block IPv4-compatible addresses (::IPv4) without ffff prefix - SMI-1005
213
- // Pattern: ::x.x.x.x (deprecated but still valid)
214
- // Note: URL parser normalizes ::192.168.1.1 to ::c0a8:101 (hex format)
215
- // So we need to match both dotted-decimal and the normalized hex format
216
- const ipv4CompatibleMatch = normalized.match(/^::(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
217
- if (ipv4CompatibleMatch) {
218
- const [, aStr, bStr, cStr, dStr] = ipv4CompatibleMatch;
219
- const a = parseInt(aStr, 10);
220
- const b = parseInt(bStr, 10);
221
- const c = parseInt(cStr, 10);
222
- const d = parseInt(dStr, 10);
223
- // Validate octets
224
- if (a <= 255 && b <= 255 && c <= 255 && d <= 255) {
225
- // Check if embedded IPv4 is private
226
- if (a === 10 ||
227
- (a === 172 && b >= 16 && b <= 31) ||
228
- (a === 192 && b === 168) ||
229
- a === 127 ||
230
- (a === 169 && b === 254) ||
231
- a === 0) {
232
- throw new ValidationError(`Access to IPv4-compatible IPv6 address with private IPv4 blocked: ${hostname}`, 'IPV6_COMPATIBLE_PRIVATE', { hostname, url, embeddedIPv4: `${a}.${b}.${c}.${d}`, ipRange: getIpRangeName(a, b) });
233
- }
234
- }
235
- }
236
- // Also check for normalized hex format: ::XXXX:XXXX (without ffff: prefix)
237
- // URL parser normalizes ::192.168.1.1 to ::c0a8:101
238
- const ipv4CompatibleHexMatch = normalized.match(/^::([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
239
- if (ipv4CompatibleHexMatch) {
240
- const high = parseInt(ipv4CompatibleHexMatch[1], 16);
241
- const low = parseInt(ipv4CompatibleHexMatch[2], 16);
242
- const a = (high >> 8) & 0xff;
243
- const b = high & 0xff;
244
- const c = (low >> 8) & 0xff;
245
- const d = low & 0xff;
246
- // Check if embedded IPv4 is private
247
- if (a === 10 ||
248
- (a === 172 && b >= 16 && b <= 31) ||
249
- (a === 192 && b === 168) ||
250
- a === 127 ||
251
- (a === 169 && b === 254) ||
252
- a === 0) {
253
- throw new ValidationError(`Access to IPv4-compatible IPv6 address with private IPv4 blocked: ${hostname}`, 'IPV6_COMPATIBLE_PRIVATE', { hostname, url, embeddedIPv4: `${a}.${b}.${c}.${d}`, ipRange: getIpRangeName(a, b) });
254
- }
255
- }
256
- // Block Teredo addresses (2001:0::/32) - SMI-1006
257
- // Teredo tunneling can bypass firewall rules
258
- if (normalized.startsWith('2001:0000:') || normalized.startsWith('2001:0:')) {
259
- throw new ValidationError(`Access to Teredo tunnel address blocked: ${hostname}`, 'IPV6_TEREDO_BLOCKED', { hostname, url });
260
- }
261
- }
262
- /**
263
- * Get human-readable IP range name for error messages
264
- */
265
- function getIpRangeName(a, b) {
266
- if (a === 10)
267
- return '10.0.0.0/8 (Private)';
268
- if (a === 172 && b >= 16 && b <= 31)
269
- return '172.16.0.0/12 (Private)';
270
- if (a === 192 && b === 168)
271
- return '192.168.0.0/16 (Private)';
272
- if (a === 127)
273
- return '127.0.0.0/8 (Loopback)';
274
- if (a === 169 && b === 254)
275
- return '169.254.0.0/16 (Link-local)';
276
- if (a === 0)
277
- return '0.0.0.0/8 (Current network)';
278
- return 'Unknown';
279
- }
280
- /**
281
- * Validate file path to prevent path traversal attacks (SMI-720)
282
- *
283
- * Ensures the resolved path remains within the allowed root directory.
284
- *
285
- * @param path - Path to validate (can be relative or absolute)
286
- * @param rootDir - Root directory that must contain the path
287
- * @throws {ValidationError} if path escapes root directory
288
- *
289
- * @example
290
- * ```typescript
291
- * validatePath('skills/my-skill', '/home/user/.claude') // OK
292
- * validatePath('../etc/passwd', '/home/user/.claude') // Throws ValidationError
293
- * validatePath('/etc/passwd', '/home/user/.claude') // Throws ValidationError
294
- * ```
295
- */
296
- export function validatePath(path, rootDir) {
297
- if (!path) {
298
- throw new ValidationError('Path cannot be empty', 'EMPTY_PATH');
299
- }
300
- if (!rootDir) {
301
- throw new ValidationError('Root directory cannot be empty', 'EMPTY_ROOT_DIR');
302
- }
303
- // Normalize both paths to resolve '..' and '.'
304
- // Resolve path relative to rootDir so relative paths work correctly
305
- const normalizedPath = resolve(rootDir, path);
306
- const normalizedRoot = resolve(rootDir);
307
- // Check that normalized path is within root directory
308
- // Handle edge case where path equals root exactly
309
- const isWithinRoot = normalizedPath.startsWith(normalizedRoot + '/') || normalizedPath === normalizedRoot;
310
- if (!isWithinRoot) {
311
- throw new ValidationError(`Path traversal detected: ${path}`, 'PATH_TRAVERSAL', {
312
- originalPath: path,
313
- normalizedPath,
314
- rootDir,
315
- normalizedRoot,
316
- });
317
- }
318
- }
319
- /**
320
- * Sanitize input string for safe use in various contexts
321
- *
322
- * Removes or escapes potentially dangerous characters.
323
- *
324
- * @param input - Input string to sanitize
325
- * @param options - Sanitization options
326
- * @returns Sanitized string
327
- *
328
- * @example
329
- * ```typescript
330
- * sanitizeInput('<script>alert(1)</script>') // Returns: '&lt;script&gt;alert(1)&lt;/script&gt;'
331
- * sanitizeInput('../../etc/passwd') // Returns: 'etc/passwd'
332
- * ```
333
- */
334
- export function sanitizeInput(input, options = {}) {
335
- const { removePathTraversal = true, escapeHtml = true, removeNullBytes = true } = options;
336
- let sanitized = input;
337
- // Remove null bytes (security risk)
338
- if (removeNullBytes) {
339
- sanitized = sanitized.replace(/\0/g, '');
340
- }
341
- // Remove path traversal sequences
342
- if (removePathTraversal) {
343
- // Remove '../' and '..\' patterns
344
- sanitized = sanitized.replace(/\.\.[\\/]/g, '');
345
- // Remove leading '../' or '..\'
346
- sanitized = sanitized.replace(/^\.\.[\\/]+/, '');
347
- }
348
- // HTML escape
349
- if (escapeHtml) {
350
- sanitized = sanitized
351
- .replace(/&/g, '&amp;')
352
- .replace(/</g, '&lt;')
353
- .replace(/>/g, '&gt;')
354
- .replace(/"/g, '&quot;')
355
- .replace(/'/g, '&#x27;');
356
- }
357
- return sanitized;
358
- }
359
- /**
360
- * Safely test a string against a pattern, preventing RegExp injection (SMI-722)
361
- *
362
- * Tries exact match, prefix match, and regex match (with error handling).
363
- * Falls back to includes check if regex is invalid.
364
- *
365
- * @param value - Value to test
366
- * @param pattern - Pattern to match (string or regex)
367
- * @returns True if value matches pattern
368
- *
369
- * @example
370
- * ```typescript
371
- * safePatternMatch('node_modules', 'node_modules') // true (exact)
372
- * safePatternMatch('node_modules/pkg', 'node_') // true (prefix)
373
- * safePatternMatch('test.js', '\\.js$') // true (regex)
374
- * safePatternMatch('test.js', '(evil') // false (invalid regex, falls back)
375
- * ```
376
- */
377
- export function safePatternMatch(value, pattern) {
378
- // Exact match
379
- if (value === pattern) {
380
- return true;
381
- }
382
- // Check if pattern looks like a regex (contains special chars)
383
- // If it's a simple alphanumeric pattern, only do prefix matching
384
- const isLikelyRegex = /[\\^$.*+?()[\]{}|]/.test(pattern);
385
- if (!isLikelyRegex) {
386
- // Simple pattern - only match as prefix
387
- return value.startsWith(pattern);
388
- }
389
- // Try regex match with error handling for patterns that look like regex
390
- try {
391
- const regex = new RegExp(pattern);
392
- return regex.test(value);
393
- }
394
- catch {
395
- // Invalid regex - fall back to safe includes check
396
- return value.includes(pattern);
397
- }
398
- }
399
- /**
400
- * Validate that patterns array is safe to use
401
- *
402
- * Checks for potentially dangerous regex patterns that could cause ReDoS.
403
- *
404
- * @param patterns - Array of patterns to validate
405
- * @returns Array of validation warnings (empty if all patterns are safe)
406
11
  *
407
- * @example
408
- * ```typescript
409
- * validatePatterns(['node_modules', '\\.js$']) // []
410
- * validatePatterns(['(a+)+b']) // ['Pattern may cause ReDoS: (a+)+b']
411
- * ```
12
+ * @module validation
412
13
  */
413
- export function validatePatterns(patterns) {
414
- const warnings = [];
415
- for (const pattern of patterns) {
416
- // Check for potentially dangerous nested quantifiers (ReDoS)
417
- if (/(\(.*\+.*\))\+/.test(pattern) || /(\(.*\*.*\))\*/.test(pattern)) {
418
- warnings.push(`Pattern may cause ReDoS (nested quantifiers): ${pattern}`);
419
- }
420
- // Check for extremely long patterns
421
- if (pattern.length > 1000) {
422
- warnings.push(`Pattern is suspiciously long (${pattern.length} chars): ${pattern.slice(0, 50)}...`);
423
- }
424
- // Try to compile as regex to check validity
425
- try {
426
- new RegExp(pattern);
427
- }
428
- catch (error) {
429
- warnings.push(`Invalid regex pattern: ${pattern}`);
430
- }
431
- }
432
- return warnings;
433
- }
14
+ // Validation Error
15
+ export { ValidationError } from './validation-error.js';
16
+ // URL Validators (SSRF prevention)
17
+ export { validateUrl, validateIPv6, getIpRangeName } from './url-validators.js';
18
+ // Path Validators (Path traversal prevention)
19
+ export { validatePath } from './path-validators.js';
20
+ // Input Validators (General sanitization)
21
+ export { sanitizeInput, safePatternMatch, validatePatterns } from './input-validators.js';
434
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,mCAAmC;AACnC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAE/E,8CAA8C;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,0CAA0C;AAC1C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Input Validation Utilities
3
+ *
4
+ * General input sanitization and pattern matching.
5
+ *
6
+ * Security Features:
7
+ * - RegExp injection prevention (SMI-722)
8
+ * - Input sanitization
9
+ * - Pattern validation
10
+ */
11
+ /**
12
+ * Sanitize input string for safe use in various contexts
13
+ *
14
+ * Removes or escapes potentially dangerous characters.
15
+ *
16
+ * @param input - Input string to sanitize
17
+ * @param options - Sanitization options
18
+ * @returns Sanitized string
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * sanitizeInput('<script>alert(1)</script>') // Returns: '&lt;script&gt;alert(1)&lt;/script&gt;'
23
+ * sanitizeInput('../../etc/passwd') // Returns: 'etc/passwd'
24
+ * ```
25
+ */
26
+ export declare function sanitizeInput(input: string, options?: {
27
+ /** Remove path traversal sequences like '../' (default: true) */
28
+ removePathTraversal?: boolean;
29
+ /** HTML-escape special characters (default: true) */
30
+ escapeHtml?: boolean;
31
+ /** Remove null bytes (default: true) */
32
+ removeNullBytes?: boolean;
33
+ }): string;
34
+ /**
35
+ * Safely test a string against a pattern, preventing RegExp injection (SMI-722)
36
+ *
37
+ * Tries exact match, prefix match, and regex match (with error handling).
38
+ * Falls back to includes check if regex is invalid.
39
+ *
40
+ * @param value - Value to test
41
+ * @param pattern - Pattern to match (string or regex)
42
+ * @returns True if value matches pattern
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * safePatternMatch('node_modules', 'node_modules') // true (exact)
47
+ * safePatternMatch('node_modules/pkg', 'node_') // true (prefix)
48
+ * safePatternMatch('test.js', '\\.js$') // true (regex)
49
+ * safePatternMatch('test.js', '(evil') // false (invalid regex, falls back)
50
+ * ```
51
+ */
52
+ export declare function safePatternMatch(value: string, pattern: string): boolean;
53
+ /**
54
+ * Validate that patterns array is safe to use
55
+ *
56
+ * Checks for potentially dangerous regex patterns that could cause ReDoS.
57
+ *
58
+ * @param patterns - Array of patterns to validate
59
+ * @returns Array of validation warnings (empty if all patterns are safe)
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * validatePatterns(['node_modules', '\\.js$']) // []
64
+ * validatePatterns(['(a+)+b']) // ['Pattern may cause ReDoS: (a+)+b']
65
+ * ```
66
+ */
67
+ export declare function validatePatterns(patterns: string[]): string[];
68
+ //# sourceMappingURL=input-validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-validators.d.ts","sourceRoot":"","sources":["../../../src/validation/input-validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAA;CACrB,GACL,MAAM,CA6BR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAuBxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAyB7D"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Input Validation Utilities
3
+ *
4
+ * General input sanitization and pattern matching.
5
+ *
6
+ * Security Features:
7
+ * - RegExp injection prevention (SMI-722)
8
+ * - Input sanitization
9
+ * - Pattern validation
10
+ */
11
+ /**
12
+ * Sanitize input string for safe use in various contexts
13
+ *
14
+ * Removes or escapes potentially dangerous characters.
15
+ *
16
+ * @param input - Input string to sanitize
17
+ * @param options - Sanitization options
18
+ * @returns Sanitized string
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * sanitizeInput('<script>alert(1)</script>') // Returns: '&lt;script&gt;alert(1)&lt;/script&gt;'
23
+ * sanitizeInput('../../etc/passwd') // Returns: 'etc/passwd'
24
+ * ```
25
+ */
26
+ export function sanitizeInput(input, options = {}) {
27
+ const { removePathTraversal = true, escapeHtml = true, removeNullBytes = true } = options;
28
+ let sanitized = input;
29
+ // Remove null bytes (security risk)
30
+ if (removeNullBytes) {
31
+ sanitized = sanitized.replace(/\0/g, '');
32
+ }
33
+ // Remove path traversal sequences
34
+ if (removePathTraversal) {
35
+ // Remove '../' and '..\' patterns
36
+ sanitized = sanitized.replace(/\.\.[\\/]/g, '');
37
+ // Remove leading '../' or '..\'
38
+ sanitized = sanitized.replace(/^\.\.[\\/]+/, '');
39
+ }
40
+ // HTML escape
41
+ if (escapeHtml) {
42
+ sanitized = sanitized
43
+ .replace(/&/g, '&amp;')
44
+ .replace(/</g, '&lt;')
45
+ .replace(/>/g, '&gt;')
46
+ .replace(/"/g, '&quot;')
47
+ .replace(/'/g, '&#x27;');
48
+ }
49
+ return sanitized;
50
+ }
51
+ /**
52
+ * Safely test a string against a pattern, preventing RegExp injection (SMI-722)
53
+ *
54
+ * Tries exact match, prefix match, and regex match (with error handling).
55
+ * Falls back to includes check if regex is invalid.
56
+ *
57
+ * @param value - Value to test
58
+ * @param pattern - Pattern to match (string or regex)
59
+ * @returns True if value matches pattern
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * safePatternMatch('node_modules', 'node_modules') // true (exact)
64
+ * safePatternMatch('node_modules/pkg', 'node_') // true (prefix)
65
+ * safePatternMatch('test.js', '\\.js$') // true (regex)
66
+ * safePatternMatch('test.js', '(evil') // false (invalid regex, falls back)
67
+ * ```
68
+ */
69
+ export function safePatternMatch(value, pattern) {
70
+ // Exact match
71
+ if (value === pattern) {
72
+ return true;
73
+ }
74
+ // Check if pattern looks like a regex (contains special chars)
75
+ // If it's a simple alphanumeric pattern, only do prefix matching
76
+ const isLikelyRegex = /[\\^$.*+?()[\]{}|]/.test(pattern);
77
+ if (!isLikelyRegex) {
78
+ // Simple pattern - only match as prefix
79
+ return value.startsWith(pattern);
80
+ }
81
+ // Try regex match with error handling for patterns that look like regex
82
+ try {
83
+ const regex = new RegExp(pattern);
84
+ return regex.test(value);
85
+ }
86
+ catch {
87
+ // Invalid regex - fall back to safe includes check
88
+ return value.includes(pattern);
89
+ }
90
+ }
91
+ /**
92
+ * Validate that patterns array is safe to use
93
+ *
94
+ * Checks for potentially dangerous regex patterns that could cause ReDoS.
95
+ *
96
+ * @param patterns - Array of patterns to validate
97
+ * @returns Array of validation warnings (empty if all patterns are safe)
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * validatePatterns(['node_modules', '\\.js$']) // []
102
+ * validatePatterns(['(a+)+b']) // ['Pattern may cause ReDoS: (a+)+b']
103
+ * ```
104
+ */
105
+ export function validatePatterns(patterns) {
106
+ const warnings = [];
107
+ for (const pattern of patterns) {
108
+ // Check for potentially dangerous nested quantifiers (ReDoS)
109
+ if (/(\(.*\+.*\))\+/.test(pattern) || /(\(.*\*.*\))\*/.test(pattern)) {
110
+ warnings.push(`Pattern may cause ReDoS (nested quantifiers): ${pattern}`);
111
+ }
112
+ // Check for extremely long patterns
113
+ if (pattern.length > 1000) {
114
+ warnings.push(`Pattern is suspiciously long (${pattern.length} chars): ${pattern.slice(0, 50)}...`);
115
+ }
116
+ // Try to compile as regex to check validity
117
+ try {
118
+ new RegExp(pattern);
119
+ }
120
+ catch {
121
+ warnings.push(`Invalid regex pattern: ${pattern}`);
122
+ }
123
+ }
124
+ return warnings;
125
+ }
126
+ //# sourceMappingURL=input-validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-validators.js","sourceRoot":"","sources":["../../../src/validation/input-validators.ts"],"names":[],"mappings":"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"}