@oculum/scanner 1.0.0

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 (281) hide show
  1. package/dist/formatters/cli-terminal.d.ts +27 -0
  2. package/dist/formatters/cli-terminal.d.ts.map +1 -0
  3. package/dist/formatters/cli-terminal.js +412 -0
  4. package/dist/formatters/cli-terminal.js.map +1 -0
  5. package/dist/formatters/github-comment.d.ts +41 -0
  6. package/dist/formatters/github-comment.d.ts.map +1 -0
  7. package/dist/formatters/github-comment.js +306 -0
  8. package/dist/formatters/github-comment.js.map +1 -0
  9. package/dist/formatters/grouping.d.ts +52 -0
  10. package/dist/formatters/grouping.d.ts.map +1 -0
  11. package/dist/formatters/grouping.js +152 -0
  12. package/dist/formatters/grouping.js.map +1 -0
  13. package/dist/formatters/index.d.ts +9 -0
  14. package/dist/formatters/index.d.ts.map +1 -0
  15. package/dist/formatters/index.js +35 -0
  16. package/dist/formatters/index.js.map +1 -0
  17. package/dist/formatters/vscode-diagnostic.d.ts +103 -0
  18. package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
  19. package/dist/formatters/vscode-diagnostic.js +151 -0
  20. package/dist/formatters/vscode-diagnostic.js.map +1 -0
  21. package/dist/index.d.ts +52 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +648 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/layer1/comments.d.ts +8 -0
  26. package/dist/layer1/comments.d.ts.map +1 -0
  27. package/dist/layer1/comments.js +203 -0
  28. package/dist/layer1/comments.js.map +1 -0
  29. package/dist/layer1/config-audit.d.ts +8 -0
  30. package/dist/layer1/config-audit.d.ts.map +1 -0
  31. package/dist/layer1/config-audit.js +252 -0
  32. package/dist/layer1/config-audit.js.map +1 -0
  33. package/dist/layer1/entropy.d.ts +8 -0
  34. package/dist/layer1/entropy.d.ts.map +1 -0
  35. package/dist/layer1/entropy.js +500 -0
  36. package/dist/layer1/entropy.js.map +1 -0
  37. package/dist/layer1/file-flags.d.ts +7 -0
  38. package/dist/layer1/file-flags.d.ts.map +1 -0
  39. package/dist/layer1/file-flags.js +112 -0
  40. package/dist/layer1/file-flags.js.map +1 -0
  41. package/dist/layer1/index.d.ts +36 -0
  42. package/dist/layer1/index.d.ts.map +1 -0
  43. package/dist/layer1/index.js +132 -0
  44. package/dist/layer1/index.js.map +1 -0
  45. package/dist/layer1/patterns.d.ts +8 -0
  46. package/dist/layer1/patterns.d.ts.map +1 -0
  47. package/dist/layer1/patterns.js +482 -0
  48. package/dist/layer1/patterns.js.map +1 -0
  49. package/dist/layer1/urls.d.ts +8 -0
  50. package/dist/layer1/urls.d.ts.map +1 -0
  51. package/dist/layer1/urls.js +296 -0
  52. package/dist/layer1/urls.js.map +1 -0
  53. package/dist/layer1/weak-crypto.d.ts +7 -0
  54. package/dist/layer1/weak-crypto.d.ts.map +1 -0
  55. package/dist/layer1/weak-crypto.js +291 -0
  56. package/dist/layer1/weak-crypto.js.map +1 -0
  57. package/dist/layer2/ai-agent-tools.d.ts +19 -0
  58. package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
  59. package/dist/layer2/ai-agent-tools.js +528 -0
  60. package/dist/layer2/ai-agent-tools.js.map +1 -0
  61. package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
  62. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
  63. package/dist/layer2/ai-endpoint-protection.js +332 -0
  64. package/dist/layer2/ai-endpoint-protection.js.map +1 -0
  65. package/dist/layer2/ai-execution-sinks.d.ts +18 -0
  66. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
  67. package/dist/layer2/ai-execution-sinks.js +496 -0
  68. package/dist/layer2/ai-execution-sinks.js.map +1 -0
  69. package/dist/layer2/ai-fingerprinting.d.ts +7 -0
  70. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
  71. package/dist/layer2/ai-fingerprinting.js +654 -0
  72. package/dist/layer2/ai-fingerprinting.js.map +1 -0
  73. package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
  74. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
  75. package/dist/layer2/ai-prompt-hygiene.js +356 -0
  76. package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
  77. package/dist/layer2/ai-rag-safety.d.ts +21 -0
  78. package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
  79. package/dist/layer2/ai-rag-safety.js +459 -0
  80. package/dist/layer2/ai-rag-safety.js.map +1 -0
  81. package/dist/layer2/ai-schema-validation.d.ts +25 -0
  82. package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
  83. package/dist/layer2/ai-schema-validation.js +375 -0
  84. package/dist/layer2/ai-schema-validation.js.map +1 -0
  85. package/dist/layer2/auth-antipatterns.d.ts +20 -0
  86. package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
  87. package/dist/layer2/auth-antipatterns.js +333 -0
  88. package/dist/layer2/auth-antipatterns.js.map +1 -0
  89. package/dist/layer2/byok-patterns.d.ts +12 -0
  90. package/dist/layer2/byok-patterns.d.ts.map +1 -0
  91. package/dist/layer2/byok-patterns.js +299 -0
  92. package/dist/layer2/byok-patterns.js.map +1 -0
  93. package/dist/layer2/dangerous-functions.d.ts +7 -0
  94. package/dist/layer2/dangerous-functions.d.ts.map +1 -0
  95. package/dist/layer2/dangerous-functions.js +1375 -0
  96. package/dist/layer2/dangerous-functions.js.map +1 -0
  97. package/dist/layer2/data-exposure.d.ts +16 -0
  98. package/dist/layer2/data-exposure.d.ts.map +1 -0
  99. package/dist/layer2/data-exposure.js +279 -0
  100. package/dist/layer2/data-exposure.js.map +1 -0
  101. package/dist/layer2/framework-checks.d.ts +7 -0
  102. package/dist/layer2/framework-checks.d.ts.map +1 -0
  103. package/dist/layer2/framework-checks.js +388 -0
  104. package/dist/layer2/framework-checks.js.map +1 -0
  105. package/dist/layer2/index.d.ts +58 -0
  106. package/dist/layer2/index.d.ts.map +1 -0
  107. package/dist/layer2/index.js +380 -0
  108. package/dist/layer2/index.js.map +1 -0
  109. package/dist/layer2/logic-gates.d.ts +7 -0
  110. package/dist/layer2/logic-gates.d.ts.map +1 -0
  111. package/dist/layer2/logic-gates.js +182 -0
  112. package/dist/layer2/logic-gates.js.map +1 -0
  113. package/dist/layer2/risky-imports.d.ts +7 -0
  114. package/dist/layer2/risky-imports.d.ts.map +1 -0
  115. package/dist/layer2/risky-imports.js +161 -0
  116. package/dist/layer2/risky-imports.js.map +1 -0
  117. package/dist/layer2/variables.d.ts +8 -0
  118. package/dist/layer2/variables.d.ts.map +1 -0
  119. package/dist/layer2/variables.js +152 -0
  120. package/dist/layer2/variables.js.map +1 -0
  121. package/dist/layer3/anthropic.d.ts +83 -0
  122. package/dist/layer3/anthropic.d.ts.map +1 -0
  123. package/dist/layer3/anthropic.js +1745 -0
  124. package/dist/layer3/anthropic.js.map +1 -0
  125. package/dist/layer3/index.d.ts +24 -0
  126. package/dist/layer3/index.d.ts.map +1 -0
  127. package/dist/layer3/index.js +119 -0
  128. package/dist/layer3/index.js.map +1 -0
  129. package/dist/layer3/openai.d.ts +25 -0
  130. package/dist/layer3/openai.d.ts.map +1 -0
  131. package/dist/layer3/openai.js +238 -0
  132. package/dist/layer3/openai.js.map +1 -0
  133. package/dist/layer3/package-check.d.ts +63 -0
  134. package/dist/layer3/package-check.d.ts.map +1 -0
  135. package/dist/layer3/package-check.js +508 -0
  136. package/dist/layer3/package-check.js.map +1 -0
  137. package/dist/modes/incremental.d.ts +66 -0
  138. package/dist/modes/incremental.d.ts.map +1 -0
  139. package/dist/modes/incremental.js +200 -0
  140. package/dist/modes/incremental.js.map +1 -0
  141. package/dist/tiers.d.ts +125 -0
  142. package/dist/tiers.d.ts.map +1 -0
  143. package/dist/tiers.js +234 -0
  144. package/dist/tiers.js.map +1 -0
  145. package/dist/types.d.ts +175 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +50 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/utils/auth-helper-detector.d.ts +56 -0
  150. package/dist/utils/auth-helper-detector.d.ts.map +1 -0
  151. package/dist/utils/auth-helper-detector.js +360 -0
  152. package/dist/utils/auth-helper-detector.js.map +1 -0
  153. package/dist/utils/context-helpers.d.ts +96 -0
  154. package/dist/utils/context-helpers.d.ts.map +1 -0
  155. package/dist/utils/context-helpers.js +493 -0
  156. package/dist/utils/context-helpers.js.map +1 -0
  157. package/dist/utils/diff-detector.d.ts +53 -0
  158. package/dist/utils/diff-detector.d.ts.map +1 -0
  159. package/dist/utils/diff-detector.js +104 -0
  160. package/dist/utils/diff-detector.js.map +1 -0
  161. package/dist/utils/diff-parser.d.ts +80 -0
  162. package/dist/utils/diff-parser.d.ts.map +1 -0
  163. package/dist/utils/diff-parser.js +202 -0
  164. package/dist/utils/diff-parser.js.map +1 -0
  165. package/dist/utils/imported-auth-detector.d.ts +37 -0
  166. package/dist/utils/imported-auth-detector.d.ts.map +1 -0
  167. package/dist/utils/imported-auth-detector.js +251 -0
  168. package/dist/utils/imported-auth-detector.js.map +1 -0
  169. package/dist/utils/middleware-detector.d.ts +55 -0
  170. package/dist/utils/middleware-detector.d.ts.map +1 -0
  171. package/dist/utils/middleware-detector.js +260 -0
  172. package/dist/utils/middleware-detector.js.map +1 -0
  173. package/dist/utils/oauth-flow-detector.d.ts +41 -0
  174. package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
  175. package/dist/utils/oauth-flow-detector.js +202 -0
  176. package/dist/utils/oauth-flow-detector.js.map +1 -0
  177. package/dist/utils/path-exclusions.d.ts +55 -0
  178. package/dist/utils/path-exclusions.d.ts.map +1 -0
  179. package/dist/utils/path-exclusions.js +222 -0
  180. package/dist/utils/path-exclusions.js.map +1 -0
  181. package/dist/utils/project-context-builder.d.ts +119 -0
  182. package/dist/utils/project-context-builder.d.ts.map +1 -0
  183. package/dist/utils/project-context-builder.js +534 -0
  184. package/dist/utils/project-context-builder.js.map +1 -0
  185. package/dist/utils/registry-clients.d.ts +93 -0
  186. package/dist/utils/registry-clients.d.ts.map +1 -0
  187. package/dist/utils/registry-clients.js +273 -0
  188. package/dist/utils/registry-clients.js.map +1 -0
  189. package/dist/utils/trpc-analyzer.d.ts +78 -0
  190. package/dist/utils/trpc-analyzer.d.ts.map +1 -0
  191. package/dist/utils/trpc-analyzer.js +297 -0
  192. package/dist/utils/trpc-analyzer.js.map +1 -0
  193. package/package.json +45 -0
  194. package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
  195. package/src/__tests__/benchmark/fixtures/index.ts +68 -0
  196. package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
  197. package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
  198. package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
  199. package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
  200. package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
  201. package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
  202. package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
  203. package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
  204. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
  205. package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
  206. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
  207. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
  208. package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
  209. package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
  210. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
  211. package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
  212. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
  213. package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
  214. package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
  215. package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
  216. package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
  217. package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
  218. package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
  219. package/src/__tests__/benchmark/index.ts +29 -0
  220. package/src/__tests__/benchmark/run-benchmark.ts +144 -0
  221. package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
  222. package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
  223. package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
  224. package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
  225. package/src/__tests__/benchmark/types.ts +144 -0
  226. package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
  227. package/src/__tests__/regression/known-false-positives.test.ts +467 -0
  228. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
  229. package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
  230. package/src/__tests__/validation/analyze-results.ts +542 -0
  231. package/src/__tests__/validation/extract-for-triage.ts +146 -0
  232. package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
  233. package/src/__tests__/validation/run-validation.ts +364 -0
  234. package/src/__tests__/validation/triage-template.md +132 -0
  235. package/src/formatters/cli-terminal.ts +446 -0
  236. package/src/formatters/github-comment.ts +382 -0
  237. package/src/formatters/grouping.ts +190 -0
  238. package/src/formatters/index.ts +47 -0
  239. package/src/formatters/vscode-diagnostic.ts +243 -0
  240. package/src/index.ts +823 -0
  241. package/src/layer1/comments.ts +218 -0
  242. package/src/layer1/config-audit.ts +289 -0
  243. package/src/layer1/entropy.ts +583 -0
  244. package/src/layer1/file-flags.ts +127 -0
  245. package/src/layer1/index.ts +181 -0
  246. package/src/layer1/patterns.ts +516 -0
  247. package/src/layer1/urls.ts +334 -0
  248. package/src/layer1/weak-crypto.ts +328 -0
  249. package/src/layer2/ai-agent-tools.ts +601 -0
  250. package/src/layer2/ai-endpoint-protection.ts +387 -0
  251. package/src/layer2/ai-execution-sinks.ts +580 -0
  252. package/src/layer2/ai-fingerprinting.ts +758 -0
  253. package/src/layer2/ai-prompt-hygiene.ts +411 -0
  254. package/src/layer2/ai-rag-safety.ts +511 -0
  255. package/src/layer2/ai-schema-validation.ts +421 -0
  256. package/src/layer2/auth-antipatterns.ts +394 -0
  257. package/src/layer2/byok-patterns.ts +336 -0
  258. package/src/layer2/dangerous-functions.ts +1563 -0
  259. package/src/layer2/data-exposure.ts +315 -0
  260. package/src/layer2/framework-checks.ts +433 -0
  261. package/src/layer2/index.ts +473 -0
  262. package/src/layer2/logic-gates.ts +206 -0
  263. package/src/layer2/risky-imports.ts +186 -0
  264. package/src/layer2/variables.ts +166 -0
  265. package/src/layer3/anthropic.ts +2030 -0
  266. package/src/layer3/index.ts +130 -0
  267. package/src/layer3/package-check.ts +604 -0
  268. package/src/modes/incremental.ts +293 -0
  269. package/src/tiers.ts +318 -0
  270. package/src/types.ts +284 -0
  271. package/src/utils/auth-helper-detector.ts +443 -0
  272. package/src/utils/context-helpers.ts +535 -0
  273. package/src/utils/diff-detector.ts +135 -0
  274. package/src/utils/diff-parser.ts +272 -0
  275. package/src/utils/imported-auth-detector.ts +320 -0
  276. package/src/utils/middleware-detector.ts +333 -0
  277. package/src/utils/oauth-flow-detector.ts +246 -0
  278. package/src/utils/path-exclusions.ts +266 -0
  279. package/src/utils/project-context-builder.ts +707 -0
  280. package/src/utils/registry-clients.ts +351 -0
  281. package/src/utils/trpc-analyzer.ts +382 -0
@@ -0,0 +1,534 @@
1
+ "use strict";
2
+ /**
3
+ * Project Context Builder
4
+ *
5
+ * Builds a generic project context summary for AI validation by analyzing
6
+ * common patterns across the codebase. This context helps the AI validator
7
+ * understand the project's security architecture without hardcoding any
8
+ * specific framework or vendor.
9
+ *
10
+ * Key areas analyzed:
11
+ * - Authentication & access control patterns
12
+ * - Data access patterns (ORMs, query builders, raw queries)
13
+ * - Secrets & configuration handling
14
+ * - Framework detection
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.buildProjectContext = buildProjectContext;
18
+ exports.getFileValidationContext = getFileValidationContext;
19
+ const middleware_detector_1 = require("./middleware-detector");
20
+ const auth_helper_detector_1 = require("./auth-helper-detector");
21
+ const oauth_flow_detector_1 = require("./oauth-flow-detector");
22
+ const trpc_analyzer_1 = require("./trpc-analyzer");
23
+ // ============================================================================
24
+ // Pattern Definitions
25
+ // ============================================================================
26
+ const AUTH_HELPER_PATTERNS = [
27
+ { pattern: /getCurrentUser|getUser|fetchUser/i, name: 'getCurrentUser' },
28
+ { pattern: /getCurrentUserId|getUserId/i, name: 'getCurrentUserId' },
29
+ { pattern: /getSession|getServerSession/i, name: 'getSession' },
30
+ { pattern: /requireAuth|ensureAuth|checkAuth/i, name: 'requireAuth' },
31
+ { pattern: /verifyToken|validateToken/i, name: 'verifyToken' },
32
+ { pattern: /isAuthenticated|isLoggedIn/i, name: 'isAuthenticated' },
33
+ { pattern: /withAuth|authGuard/i, name: 'withAuth' },
34
+ { pattern: /useAuth|useSession/i, name: 'useAuth (hook)' },
35
+ { pattern: /auth\(\)|getAuth\(\)/i, name: 'auth()' },
36
+ ];
37
+ const ORM_PATTERNS = [
38
+ { pattern: /from\s+['"]@prisma\/client['"]|PrismaClient/i, orm: 'prisma' },
39
+ { pattern: /from\s+['"]drizzle-orm['"]|drizzle\(/i, orm: 'drizzle' },
40
+ { pattern: /from\s+['"]@supabase\/supabase-js['"]|createClient.*supabase/i, orm: 'supabase' },
41
+ { pattern: /from\s+['"]mongoose['"]|mongoose\.connect/i, orm: 'mongoose' },
42
+ { pattern: /from\s+['"]sequelize['"]|Sequelize/i, orm: 'sequelize' },
43
+ { pattern: /from\s+['"]typeorm['"]|DataSource/i, orm: 'typeorm' },
44
+ { pattern: /from\s+['"]knex['"]|knex\(/i, orm: 'knex' },
45
+ ];
46
+ const VALIDATION_LIBRARY_PATTERNS = [
47
+ { pattern: /from\s+['"]zod['"]|z\.object/i, lib: 'zod' },
48
+ { pattern: /from\s+['"]yup['"]|yup\.object/i, lib: 'yup' },
49
+ { pattern: /from\s+['"]joi['"]|Joi\.object/i, lib: 'joi' },
50
+ { pattern: /from\s+['"]valibot['"]|v\.object/i, lib: 'valibot' },
51
+ { pattern: /from\s+['"]class-validator['"]|@IsString|@IsEmail/i, lib: 'class-validator' },
52
+ ];
53
+ const SECRET_MANAGER_PATTERNS = [
54
+ { pattern: /aws-sdk.*secretsmanager|SecretsManager/i, type: 'AWS Secrets Manager' },
55
+ { pattern: /google-cloud.*secret-manager|SecretManagerServiceClient/i, type: 'Google Secret Manager' },
56
+ { pattern: /@azure\/keyvault|KeyVaultSecret/i, type: 'Azure Key Vault' },
57
+ { pattern: /hashicorp.*vault|vault\.read/i, type: 'HashiCorp Vault' },
58
+ { pattern: /doppler|infisical/i, type: 'Doppler/Infisical' },
59
+ ];
60
+ // ============================================================================
61
+ // Main Builder Function
62
+ // ============================================================================
63
+ /**
64
+ * Build a comprehensive project context from scanned files
65
+ * This context is used to inform AI validation decisions
66
+ */
67
+ function buildProjectContext(files) {
68
+ // Detect middleware configuration
69
+ const middlewareConfig = (0, middleware_detector_1.detectGlobalAuthMiddleware)(files);
70
+ // Build individual context sections
71
+ const auth = buildAuthContext(files, middlewareConfig);
72
+ const dataAccess = buildDataAccessContext(files);
73
+ const secrets = buildSecretsContext(files);
74
+ const frameworks = buildFrameworkContext(files);
75
+ const structure = buildStructureContext(files);
76
+ const oauth = (0, oauth_flow_detector_1.detectOAuthFlow)(files);
77
+ const trpc = (0, trpc_analyzer_1.analyzeTRPCRouters)(files);
78
+ // Generate summary string for AI prompt
79
+ const summary = generateContextSummary({
80
+ auth,
81
+ dataAccess,
82
+ secrets,
83
+ frameworks,
84
+ structure,
85
+ oauth,
86
+ trpc,
87
+ });
88
+ return {
89
+ summary,
90
+ auth,
91
+ dataAccess,
92
+ secrets,
93
+ frameworks,
94
+ structure,
95
+ oauth,
96
+ trpc,
97
+ };
98
+ }
99
+ // ============================================================================
100
+ // Context Builders
101
+ // ============================================================================
102
+ function buildAuthContext(files, middlewareConfig) {
103
+ const authHelperNames = [];
104
+ let hasUserScoping = false;
105
+ const userScopingPatterns = [];
106
+ // Detect auth helpers using the dedicated detector (includes throwing detection)
107
+ const authHelperContext = (0, auth_helper_detector_1.detectAuthHelpers)(files);
108
+ const throwingAuthHelpers = authHelperContext.helpers.filter(h => h.throwsOnMissing);
109
+ // Scan all files for additional auth patterns and user scoping
110
+ for (const file of files) {
111
+ // Skip non-code files
112
+ if (!isCodeFile(file.path))
113
+ continue;
114
+ // Detect auth helper functions by name patterns
115
+ for (const { pattern, name } of AUTH_HELPER_PATTERNS) {
116
+ if (pattern.test(file.content) && !authHelperNames.includes(name)) {
117
+ authHelperNames.push(name);
118
+ }
119
+ }
120
+ // Detect user scoping patterns
121
+ const scoping = (0, middleware_detector_1.detectUserScopingPatterns)(file.content);
122
+ if (scoping.hasUserScoping) {
123
+ hasUserScoping = true;
124
+ for (const p of scoping.patterns) {
125
+ if (!userScopingPatterns.includes(p)) {
126
+ userScopingPatterns.push(p);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ // Merge detected helper names from both sources
132
+ for (const helper of authHelperContext.helpers) {
133
+ if (!authHelperNames.includes(helper.name)) {
134
+ authHelperNames.push(helper.name);
135
+ }
136
+ }
137
+ return {
138
+ hasGlobalMiddleware: middlewareConfig.hasAuthMiddleware,
139
+ authProvider: middlewareConfig.authType,
140
+ middlewareFile: middlewareConfig.middlewareFile,
141
+ protectedPaths: middlewareConfig.protectedPaths,
142
+ publicPaths: middlewareConfig.publicPaths,
143
+ authHelpers: authHelperNames,
144
+ authHelperContext,
145
+ throwingAuthHelpers,
146
+ hasUserScoping,
147
+ userScopingPatterns,
148
+ };
149
+ }
150
+ function buildDataAccessContext(files) {
151
+ let orm = undefined;
152
+ let usesParameterizedQueries = false;
153
+ let databaseType = undefined;
154
+ let hasRLS = false;
155
+ let validationLibrary = undefined;
156
+ for (const file of files) {
157
+ if (!isCodeFile(file.path))
158
+ continue;
159
+ const content = file.content;
160
+ // Detect ORM
161
+ if (!orm) {
162
+ for (const { pattern, orm: ormType } of ORM_PATTERNS) {
163
+ if (pattern.test(content)) {
164
+ orm = ormType;
165
+ break;
166
+ }
167
+ }
168
+ }
169
+ // Detect parameterized queries
170
+ if (!usesParameterizedQueries) {
171
+ // Prisma, Drizzle, Supabase all use parameterized by default
172
+ if (orm === 'prisma' || orm === 'drizzle' || orm === 'supabase') {
173
+ usesParameterizedQueries = true;
174
+ }
175
+ // Check for explicit parameterized patterns
176
+ if (/\$\d+|\?\s*,|\?(?=\s*\))|:[\w]+/i.test(content) && /query|execute|sql/i.test(content)) {
177
+ usesParameterizedQueries = true;
178
+ }
179
+ }
180
+ // Detect database type
181
+ if (!databaseType) {
182
+ if (/postgres|pg\.|@vercel\/postgres/i.test(content)) {
183
+ databaseType = 'postgres';
184
+ }
185
+ else if (/mysql|mysql2/i.test(content)) {
186
+ databaseType = 'mysql';
187
+ }
188
+ else if (/mongodb|mongoose/i.test(content)) {
189
+ databaseType = 'mongodb';
190
+ }
191
+ else if (/sqlite|better-sqlite/i.test(content)) {
192
+ databaseType = 'sqlite';
193
+ }
194
+ }
195
+ // Detect RLS
196
+ if (!hasRLS && /row.?level.?security|RLS|\.rls\(|enable_rls/i.test(content)) {
197
+ hasRLS = true;
198
+ }
199
+ // Detect validation library
200
+ if (!validationLibrary) {
201
+ for (const { pattern, lib } of VALIDATION_LIBRARY_PATTERNS) {
202
+ if (pattern.test(content)) {
203
+ validationLibrary = lib;
204
+ break;
205
+ }
206
+ }
207
+ }
208
+ }
209
+ // If no ORM detected but SQL patterns found, mark as raw_sql
210
+ if (!orm) {
211
+ const hasRawSql = files.some(f => /SELECT\s+.*FROM|INSERT\s+INTO|UPDATE\s+.*SET|DELETE\s+FROM/i.test(f.content));
212
+ if (hasRawSql) {
213
+ orm = 'raw_sql';
214
+ }
215
+ }
216
+ return {
217
+ orm,
218
+ usesParameterizedQueries,
219
+ databaseType,
220
+ hasRLS,
221
+ validationLibrary,
222
+ };
223
+ }
224
+ function buildSecretsContext(files) {
225
+ let usesEnvVars = false;
226
+ let usesSecretManager = false;
227
+ let secretManagerType = undefined;
228
+ let hasEnvFiles = false;
229
+ let hasClientExposedEnvVars = false;
230
+ for (const file of files) {
231
+ // Check for .env files
232
+ if (file.path.includes('.env')) {
233
+ hasEnvFiles = true;
234
+ }
235
+ // Check for env var usage
236
+ if (/process\.env\.|import\.meta\.env\.|Deno\.env/i.test(file.content)) {
237
+ usesEnvVars = true;
238
+ }
239
+ // Check for NEXT_PUBLIC_ pattern
240
+ if (/NEXT_PUBLIC_/i.test(file.content)) {
241
+ hasClientExposedEnvVars = true;
242
+ }
243
+ // Check for secret managers
244
+ if (!usesSecretManager) {
245
+ for (const { pattern, type } of SECRET_MANAGER_PATTERNS) {
246
+ if (pattern.test(file.content)) {
247
+ usesSecretManager = true;
248
+ secretManagerType = type;
249
+ break;
250
+ }
251
+ }
252
+ }
253
+ }
254
+ return {
255
+ usesEnvVars,
256
+ usesSecretManager,
257
+ secretManagerType,
258
+ hasEnvFiles,
259
+ hasClientExposedEnvVars,
260
+ };
261
+ }
262
+ function buildFrameworkContext(files) {
263
+ let primary = undefined;
264
+ let frontend = undefined;
265
+ let isMonorepo = false;
266
+ let usesTypeScript = false;
267
+ let usesServerComponents = false;
268
+ let usesServerActions = false;
269
+ // Check for package.json to detect frameworks
270
+ const packageJson = files.find(f => f.path === 'package.json' || f.path.endsWith('/package.json'));
271
+ if (packageJson) {
272
+ const content = packageJson.content;
273
+ // Primary framework detection
274
+ if (/["']next["']/i.test(content)) {
275
+ primary = 'nextjs';
276
+ }
277
+ else if (/["']express["']/i.test(content)) {
278
+ primary = 'express';
279
+ }
280
+ else if (/["']fastify["']/i.test(content)) {
281
+ primary = 'fastify';
282
+ }
283
+ else if (/["']@nestjs\/core["']/i.test(content)) {
284
+ primary = 'nestjs';
285
+ }
286
+ // Frontend framework detection
287
+ if (/["']react["']/i.test(content)) {
288
+ frontend = 'react';
289
+ }
290
+ else if (/["']vue["']/i.test(content)) {
291
+ frontend = 'vue';
292
+ }
293
+ else if (/["']svelte["']/i.test(content)) {
294
+ frontend = 'svelte';
295
+ }
296
+ else if (/["']@angular\/core["']/i.test(content)) {
297
+ frontend = 'angular';
298
+ }
299
+ // Monorepo detection
300
+ if (/["']workspaces["']|turbo\.json|lerna\.json|pnpm-workspace/i.test(content)) {
301
+ isMonorepo = true;
302
+ }
303
+ }
304
+ // Check for TypeScript
305
+ usesTypeScript = files.some(f => f.path.endsWith('.ts') || f.path.endsWith('.tsx'));
306
+ // Check for Next.js 13+ patterns
307
+ for (const file of files) {
308
+ if (/['"]use server['"]/.test(file.content)) {
309
+ usesServerActions = true;
310
+ }
311
+ if (/['"]use client['"]/.test(file.content) || file.path.includes('/app/')) {
312
+ usesServerComponents = true; // App Router implies server components
313
+ }
314
+ }
315
+ return {
316
+ primary,
317
+ frontend,
318
+ isMonorepo,
319
+ usesTypeScript,
320
+ usesServerComponents,
321
+ usesServerActions,
322
+ };
323
+ }
324
+ function buildStructureContext(files) {
325
+ const fileTypes = {};
326
+ let hasApiRoutes = false;
327
+ let hasMiddleware = false;
328
+ let hasServerActions = false;
329
+ for (const file of files) {
330
+ // Count file types
331
+ const ext = getFileExtension(file.path);
332
+ fileTypes[ext] = (fileTypes[ext] || 0) + 1;
333
+ // Check for API routes
334
+ if (/\/api\/|route\.(ts|js)$|\/routes\//i.test(file.path)) {
335
+ hasApiRoutes = true;
336
+ }
337
+ // Check for middleware
338
+ if (/middleware\.(ts|js)$/i.test(file.path)) {
339
+ hasMiddleware = true;
340
+ }
341
+ // Check for server actions
342
+ if (/\/actions\/|\.action\.(ts|js)$/i.test(file.path) || /['"]use server['"]/.test(file.content)) {
343
+ hasServerActions = true;
344
+ }
345
+ }
346
+ return {
347
+ hasApiRoutes,
348
+ hasMiddleware,
349
+ hasServerActions,
350
+ totalFiles: files.length,
351
+ fileTypes,
352
+ };
353
+ }
354
+ // ============================================================================
355
+ // Summary Generator
356
+ // ============================================================================
357
+ function generateContextSummary(ctx) {
358
+ const lines = [];
359
+ lines.push('## Project Security Context');
360
+ lines.push('');
361
+ // Framework info
362
+ if (ctx.frameworks.primary) {
363
+ lines.push(`**Framework:** ${ctx.frameworks.primary}${ctx.frameworks.frontend ? ` + ${ctx.frameworks.frontend}` : ''}`);
364
+ }
365
+ if (ctx.frameworks.usesTypeScript) {
366
+ lines.push('**Language:** TypeScript');
367
+ }
368
+ if (ctx.frameworks.usesServerComponents || ctx.frameworks.usesServerActions) {
369
+ lines.push(`**Patterns:** ${[
370
+ ctx.frameworks.usesServerComponents && 'Server Components',
371
+ ctx.frameworks.usesServerActions && 'Server Actions',
372
+ ].filter(Boolean).join(', ')}`);
373
+ }
374
+ lines.push('');
375
+ // Auth info
376
+ lines.push('### Authentication & Access Control');
377
+ if (ctx.auth.hasGlobalMiddleware) {
378
+ lines.push(`- **Global auth middleware detected** (${ctx.auth.authProvider || 'custom'})`);
379
+ if (ctx.auth.middlewareFile) {
380
+ lines.push(` - Middleware file: \`${ctx.auth.middlewareFile}\``);
381
+ }
382
+ if (ctx.auth.protectedPaths.length > 0) {
383
+ lines.push(` - Protected paths: ${ctx.auth.protectedPaths.join(', ')}`);
384
+ }
385
+ if (ctx.auth.publicPaths.length > 0) {
386
+ lines.push(` - Public paths: ${ctx.auth.publicPaths.join(', ')}`);
387
+ }
388
+ }
389
+ else {
390
+ lines.push('- No global auth middleware detected');
391
+ }
392
+ if (ctx.auth.authHelpers.length > 0) {
393
+ lines.push(`- **Auth helpers found:** ${ctx.auth.authHelpers.join(', ')}`);
394
+ }
395
+ // Throwing auth helpers - CRITICAL for AI validation
396
+ if (ctx.auth.throwingAuthHelpers && ctx.auth.throwingAuthHelpers.length > 0) {
397
+ lines.push('- **Throwing auth helpers detected** (these GUARANTEE authenticated context):');
398
+ for (const helper of ctx.auth.throwingAuthHelpers) {
399
+ const location = helper.definedIn ? ` (in ${helper.definedIn})` : '';
400
+ lines.push(` - \`${helper.name}()\`${location} - throws/redirects on missing auth`);
401
+ }
402
+ lines.push(' - Code AFTER these calls is guaranteed to have an authenticated user');
403
+ lines.push(' - Do NOT flag "missing auth" or suggest `if (!userId)` checks after these calls');
404
+ }
405
+ if (ctx.auth.hasUserScoping) {
406
+ lines.push('- **User scoping detected** in database queries (data is filtered by user/tenant ID)');
407
+ }
408
+ lines.push('');
409
+ // Data access info
410
+ lines.push('### Data Access');
411
+ if (ctx.dataAccess.orm) {
412
+ lines.push(`- **ORM/Query Builder:** ${ctx.dataAccess.orm}`);
413
+ if (ctx.dataAccess.usesParameterizedQueries) {
414
+ lines.push(' - Uses parameterized queries by default (SQL injection protection)');
415
+ }
416
+ }
417
+ if (ctx.dataAccess.databaseType) {
418
+ lines.push(`- **Database:** ${ctx.dataAccess.databaseType}`);
419
+ }
420
+ if (ctx.dataAccess.hasRLS) {
421
+ lines.push('- **Row Level Security (RLS)** is enabled');
422
+ }
423
+ if (ctx.dataAccess.validationLibrary) {
424
+ lines.push(`- **Input validation:** ${ctx.dataAccess.validationLibrary}`);
425
+ }
426
+ lines.push('');
427
+ // Secrets info
428
+ lines.push('### Secrets & Configuration');
429
+ if (ctx.secrets.usesEnvVars) {
430
+ lines.push('- Uses environment variables for configuration');
431
+ }
432
+ if (ctx.secrets.usesSecretManager) {
433
+ lines.push(`- Uses secret manager: ${ctx.secrets.secretManagerType}`);
434
+ }
435
+ if (ctx.secrets.hasClientExposedEnvVars) {
436
+ lines.push('- Has NEXT_PUBLIC_ env vars (intentionally client-exposed)');
437
+ }
438
+ lines.push('');
439
+ // Validation guidance
440
+ lines.push('### Validation Guidance');
441
+ lines.push('Based on this context:');
442
+ if (ctx.auth.hasGlobalMiddleware) {
443
+ lines.push(`- Routes under protected paths are guarded by ${ctx.auth.authProvider || 'auth'} middleware`);
444
+ lines.push('- Downgrade "missing auth" findings for routes covered by middleware');
445
+ }
446
+ if (ctx.auth.throwingAuthHelpers && ctx.auth.throwingAuthHelpers.length > 0) {
447
+ lines.push('- Throwing auth helpers provide guaranteed auth context - do NOT suggest redundant null checks');
448
+ }
449
+ if (ctx.auth.hasUserScoping) {
450
+ lines.push('- Database queries are scoped by user ID - cross-tenant access is mitigated');
451
+ }
452
+ if (ctx.dataAccess.usesParameterizedQueries) {
453
+ lines.push('- SQL injection risk is low due to parameterized queries');
454
+ }
455
+ if (ctx.dataAccess.hasRLS) {
456
+ lines.push('- RLS provides database-level access control');
457
+ }
458
+ // OAuth flow context
459
+ if (ctx.oauth && (ctx.oauth.hasStateGeneration || ctx.oauth.hasStateValidation || ctx.oauth.hasCodeVerifier)) {
460
+ lines.push('');
461
+ lines.push('### OAuth Flow');
462
+ if ((0, oauth_flow_detector_1.isOAuthStateImplemented)(ctx.oauth)) {
463
+ lines.push('- **OAuth state is properly implemented** across files');
464
+ if (ctx.oauth.stateGenerationFile) {
465
+ lines.push(` - State generated in: \`${ctx.oauth.stateGenerationFile}\``);
466
+ }
467
+ if (ctx.oauth.stateValidationFile) {
468
+ lines.push(` - State validated in: \`${ctx.oauth.stateValidationFile}\``);
469
+ }
470
+ lines.push('- Do NOT flag "OAuth state missing" - it is implemented correctly');
471
+ }
472
+ else if (ctx.oauth.flowType === 'client_credentials') {
473
+ lines.push('- **Client credentials flow detected** - no state parameter needed');
474
+ }
475
+ else if (ctx.oauth.hasCodeVerifier) {
476
+ lines.push('- **PKCE flow detected** - code_verifier provides CSRF protection');
477
+ }
478
+ if (ctx.oauth.providers.length > 0) {
479
+ lines.push(`- OAuth providers: ${ctx.oauth.providers.join(', ')}`);
480
+ }
481
+ }
482
+ // tRPC context
483
+ if (ctx.trpc && ctx.trpc.hasTRPC) {
484
+ lines.push('');
485
+ lines.push('### tRPC');
486
+ lines.push(`- ${(0, trpc_analyzer_1.getTRPCSummary)(ctx.trpc)}`);
487
+ const protectedRouters = Array.from(ctx.trpc.routers.values()).filter(r => r.isProtected);
488
+ if (protectedRouters.length > 0) {
489
+ lines.push('- **Protected tRPC routers detected:**');
490
+ for (const router of protectedRouters) {
491
+ lines.push(` - \`${router.name}\` router is protected by auth middleware`);
492
+ }
493
+ lines.push('- Frontend calls to protected tRPC procedures are SAFE - backend handles auth');
494
+ lines.push('- Do NOT flag "missing role check" on frontend components calling protected tRPC procedures');
495
+ }
496
+ }
497
+ return lines.join('\n');
498
+ }
499
+ // ============================================================================
500
+ // Helpers
501
+ // ============================================================================
502
+ function isCodeFile(path) {
503
+ return /\.(ts|tsx|js|jsx|mjs|cjs|py|rb|php|go|java|cs)$/i.test(path);
504
+ }
505
+ function getFileExtension(path) {
506
+ const match = path.match(/\.([^.]+)$/);
507
+ return match ? `.${match[1]}` : 'unknown';
508
+ }
509
+ /**
510
+ * Generate a compact context string for a single file validation
511
+ * Used when validating findings in a specific file
512
+ */
513
+ function getFileValidationContext(file, projectContext) {
514
+ const lines = [];
515
+ // Include relevant project context
516
+ lines.push(projectContext.summary);
517
+ lines.push('');
518
+ // Add file-specific context
519
+ lines.push(`### Current File: \`${file.path}\``);
520
+ // Determine if this file is server-only
521
+ const isServerFile = /\/api\/|\/server\/|\.server\.|\/actions\/|route\.(ts|js)$|middleware\.(ts|js)$/i.test(file.path);
522
+ if (isServerFile) {
523
+ lines.push('- This is a **server-only** file (not bundled to client)');
524
+ }
525
+ // Check if file is under protected routes
526
+ if (projectContext.auth.hasGlobalMiddleware) {
527
+ const isProtected = projectContext.auth.protectedPaths.some(p => file.path.includes(p.replace(/\*\*/g, '').replace(/\*/g, '')));
528
+ if (isProtected) {
529
+ lines.push(`- This route is **protected by ${projectContext.auth.authProvider || 'auth'} middleware**`);
530
+ }
531
+ }
532
+ return lines.join('\n');
533
+ }
534
+ //# sourceMappingURL=project-context-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context-builder.js","sourceRoot":"","sources":["../../src/utils/project-context-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Registry Clients for Package Metadata
3
+ * Fetches package information from npm and PyPI registries
4
+ * Used by the Hallucination Firewall (Story C) to assess dependency risk
5
+ */
6
+ /**
7
+ * NPM Package Metadata Interface
8
+ */
9
+ export interface NPMPackageMetadata {
10
+ name: string;
11
+ version: string;
12
+ description?: string;
13
+ maintainers: Array<{
14
+ name: string;
15
+ email?: string;
16
+ }>;
17
+ time: {
18
+ created: string;
19
+ modified: string;
20
+ [version: string]: string;
21
+ };
22
+ repository?: {
23
+ type: string;
24
+ url: string;
25
+ };
26
+ homepage?: string;
27
+ license?: string;
28
+ downloads?: {
29
+ weekly: number;
30
+ };
31
+ }
32
+ /**
33
+ * PyPI Package Metadata Interface
34
+ */
35
+ export interface PyPIPackageMetadata {
36
+ name: string;
37
+ version: string;
38
+ summary?: string;
39
+ author?: string;
40
+ authorEmail?: string;
41
+ license?: string;
42
+ projectUrls?: Record<string, string>;
43
+ releaseDate?: string;
44
+ requiresPython?: string;
45
+ }
46
+ /**
47
+ * Extracted dependency information
48
+ */
49
+ export interface ExtractedDependency {
50
+ name: string;
51
+ version?: string;
52
+ source: 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies' | 'requirements';
53
+ line: number;
54
+ }
55
+ /**
56
+ * Fetch package metadata from npm registry
57
+ * Returns null if package doesn't exist
58
+ */
59
+ export declare function fetchNPMMetadata(packageName: string): Promise<NPMPackageMetadata | null>;
60
+ /**
61
+ * Fetch package metadata from PyPI registry
62
+ * Returns null if package doesn't exist
63
+ */
64
+ export declare function fetchPyPIMetadata(packageName: string): Promise<PyPIPackageMetadata | null>;
65
+ /**
66
+ * Extract dependencies from package.json content
67
+ */
68
+ export declare function extractNpmDependencies(content: string): ExtractedDependency[];
69
+ /**
70
+ * Extract dependencies from requirements.txt content
71
+ */
72
+ export declare function extractPythonRequirements(content: string): ExtractedDependency[];
73
+ /**
74
+ * Extract dependencies from pyproject.toml content
75
+ */
76
+ export declare function extractPyprojectDependencies(content: string): ExtractedDependency[];
77
+ /**
78
+ * Determine the package file type from path
79
+ */
80
+ export declare function getPackageFileType(filePath: string): 'npm' | 'python' | null;
81
+ /**
82
+ * Calculate package age in days from creation date
83
+ */
84
+ export declare function calculatePackageAgeDays(createdDate: string | undefined): number;
85
+ /**
86
+ * Rate limiter helper - adds delay between registry requests
87
+ */
88
+ export declare function rateLimitDelay(): Promise<void>;
89
+ /**
90
+ * Clear all caches (useful for testing)
91
+ */
92
+ export declare function clearRegistryCaches(): void;
93
+ //# sourceMappingURL=registry-clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-clients.d.ts","sourceRoot":"","sources":["../../src/utils/registry-clients.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpD,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAC1B,CAAA;IACD,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,cAAc,CAAA;IACzG,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA8D9F;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAqDhG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAiC7E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAyBhF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAoCnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAkB5E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAW/E;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C"}