@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,508 @@
1
+ "use strict";
2
+ /**
3
+ * Layer 3: Package Hallucination Check (Story C - Hallucination Firewall)
4
+ *
5
+ * Verifies if imported packages actually exist and assesses their risk
6
+ * Prevents typosquatting, dependency confusion, and AI-hallucinated packages
7
+ *
8
+ * Features:
9
+ * - Registry metadata fetching (npm, PyPI)
10
+ * - Risk score calculation based on multiple factors
11
+ * - Typosquatting detection via Levenshtein distance
12
+ * - Package age and popularity analysis
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.LEGITIMATE_PACKAGES = exports.POPULAR_PYTHON_PACKAGES = exports.POPULAR_NPM_PACKAGES = void 0;
16
+ exports.checkPackages = checkPackages;
17
+ exports.levenshteinDistance = levenshteinDistance;
18
+ exports.checkTyposquatting = checkTyposquatting;
19
+ exports.hasSuspiciousNamingPattern = hasSuspiciousNamingPattern;
20
+ exports.computeNPMRiskScore = computeNPMRiskScore;
21
+ exports.computePyPIRiskScore = computePyPIRiskScore;
22
+ const registry_clients_1 = require("../utils/registry-clients");
23
+ // ============================================================================
24
+ // Configuration
25
+ // ============================================================================
26
+ // Maximum packages to check per scan (cost/time control)
27
+ const MAX_PACKAGES_TO_CHECK = 50;
28
+ // ============================================================================
29
+ // Popular Packages for Typosquatting Detection
30
+ // ============================================================================
31
+ const POPULAR_NPM_PACKAGES = new Set([
32
+ // Core frameworks
33
+ 'react', 'vue', 'angular', 'svelte', 'next', 'nuxt', 'gatsby',
34
+ 'express', 'fastify', 'koa', 'hapi', 'nest', 'nestjs',
35
+ // Utilities
36
+ 'lodash', 'underscore', 'ramda', 'date-fns', 'dayjs', 'moment',
37
+ 'axios', 'node-fetch', 'got', 'request', 'superagent',
38
+ // Build tools
39
+ 'webpack', 'rollup', 'vite', 'parcel', 'esbuild', 'swc',
40
+ 'babel', 'typescript', 'eslint', 'prettier', 'jest', 'vitest', 'mocha',
41
+ // Database
42
+ 'mongoose', 'sequelize', 'prisma', 'typeorm', 'knex', 'pg', 'mysql', 'sqlite3',
43
+ // Other popular
44
+ 'socket.io', 'ws', 'graphql', 'apollo', 'redux', 'mobx', 'zustand',
45
+ 'tailwindcss', 'styled-components', 'emotion', 'sass', 'postcss',
46
+ 'dotenv', 'cors', 'helmet', 'morgan', 'winston', 'pino',
47
+ 'uuid', 'crypto-js', 'bcrypt', 'jsonwebtoken', 'passport',
48
+ 'commander', 'yargs', 'inquirer', 'chalk', 'ora',
49
+ ]);
50
+ exports.POPULAR_NPM_PACKAGES = POPULAR_NPM_PACKAGES;
51
+ const POPULAR_PYTHON_PACKAGES = new Set([
52
+ 'requests', 'flask', 'django', 'fastapi', 'numpy', 'pandas',
53
+ 'scipy', 'matplotlib', 'tensorflow', 'pytorch', 'torch', 'keras',
54
+ 'scikit-learn', 'sklearn', 'pillow', 'opencv-python', 'beautifulsoup4',
55
+ 'sqlalchemy', 'celery', 'redis', 'boto3', 'pytest', 'black', 'flake8',
56
+ 'pydantic', 'httpx', 'aiohttp', 'uvicorn', 'gunicorn',
57
+ ]);
58
+ exports.POPULAR_PYTHON_PACKAGES = POPULAR_PYTHON_PACKAGES;
59
+ // ============================================================================
60
+ // Legitimate Packages (Skip checking)
61
+ // ============================================================================
62
+ const LEGITIMATE_PACKAGES = new Set([
63
+ // Scoped packages from trusted orgs
64
+ '@supabase/ssr', '@supabase/supabase-js', '@supabase/auth-helpers-nextjs',
65
+ '@anthropic-ai/sdk', '@openai/openai', '@langchain/core', '@langchain/openai',
66
+ '@octokit/rest', '@octokit/core',
67
+ '@radix-ui/react-avatar', '@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu',
68
+ '@radix-ui/react-scroll-area', '@radix-ui/react-slot', '@radix-ui/react-tabs',
69
+ '@tailwindcss/postcss', '@tailwindcss/typography',
70
+ '@types/node', '@types/react', '@types/react-dom',
71
+ // Common packages with unusual names
72
+ 'class-variance-authority', 'clsx', 'tailwind-merge', 'cva',
73
+ 'lucide-react', 'next-themes', 'sonner', 'zod', 'zustand',
74
+ 'geist', 'sharp', 'turbo', 'tsup', 'tsx',
75
+ // Known short names
76
+ 'ms', 'qs', 'ws', 'pg', 'ip', 'os', 'fs', 'vm',
77
+ ]);
78
+ exports.LEGITIMATE_PACKAGES = LEGITIMATE_PACKAGES;
79
+ // ============================================================================
80
+ // Typosquatting Detection
81
+ // ============================================================================
82
+ /**
83
+ * Calculate Levenshtein distance between two strings
84
+ */
85
+ function levenshteinDistance(a, b) {
86
+ const matrix = [];
87
+ for (let i = 0; i <= b.length; i++) {
88
+ matrix[i] = [i];
89
+ }
90
+ for (let j = 0; j <= a.length; j++) {
91
+ matrix[0][j] = j;
92
+ }
93
+ for (let i = 1; i <= b.length; i++) {
94
+ for (let j = 1; j <= a.length; j++) {
95
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
96
+ matrix[i][j] = matrix[i - 1][j - 1];
97
+ }
98
+ else {
99
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
100
+ }
101
+ }
102
+ }
103
+ return matrix[b.length][a.length];
104
+ }
105
+ /**
106
+ * Check if package name is similar to a popular package (potential typosquat)
107
+ */
108
+ function checkTyposquatting(packageName, ecosystem) {
109
+ const name = packageName.toLowerCase();
110
+ const popularPackages = ecosystem === 'npm' ? POPULAR_NPM_PACKAGES : POPULAR_PYTHON_PACKAGES;
111
+ for (const popular of popularPackages) {
112
+ // Skip if it's the actual package
113
+ if (name === popular)
114
+ continue;
115
+ const distance = levenshteinDistance(name, popular);
116
+ // Flag if 1-2 character difference and similar length
117
+ if (distance === 1 && Math.abs(name.length - popular.length) <= 1) {
118
+ return { isSimilar: true, similarTo: popular, distance };
119
+ }
120
+ if (distance === 2 && name.length >= 5 && Math.abs(name.length - popular.length) <= 1) {
121
+ return { isSimilar: true, similarTo: popular, distance };
122
+ }
123
+ }
124
+ return { isSimilar: false };
125
+ }
126
+ /**
127
+ * Check for suspicious naming patterns
128
+ */
129
+ function hasSuspiciousNamingPattern(packageName) {
130
+ const suspiciousPatterns = [
131
+ { pattern: /^[a-z]+-js$/, desc: 'package-js suffix (common typosquat pattern)' },
132
+ { pattern: /^node-[a-z]{2,}$/, desc: 'node-package prefix' },
133
+ { pattern: /^[a-z]+-node$/, desc: 'package-node suffix' },
134
+ { pattern: /-\d{3,}$/, desc: 'ends with many numbers' },
135
+ { pattern: /^[a-z]{1,2}-[a-z]+$/, desc: 'very short prefix' },
136
+ { pattern: /[0o][0o]|[1l][1l]/i, desc: 'character substitution (0/o, 1/l)' },
137
+ ];
138
+ for (const { pattern, desc } of suspiciousPatterns) {
139
+ if (pattern.test(packageName)) {
140
+ return { suspicious: true, pattern: desc };
141
+ }
142
+ }
143
+ return { suspicious: false };
144
+ }
145
+ // ============================================================================
146
+ // Risk Score Calculation
147
+ // ============================================================================
148
+ /**
149
+ * Compute risk score for an npm package
150
+ */
151
+ async function computeNPMRiskScore(dep, metadata) {
152
+ const factors = [];
153
+ let totalScore = 0;
154
+ // Factor 1: Package not found (highest risk - likely hallucinated)
155
+ if (!metadata) {
156
+ factors.push({
157
+ name: 'package_not_found',
158
+ score: 100,
159
+ description: 'Package does not exist in npm registry. Likely a hallucinated package name.',
160
+ });
161
+ return {
162
+ package: dep.name,
163
+ ecosystem: 'npm',
164
+ totalScore: 100,
165
+ factors,
166
+ recommendation: 'block',
167
+ severity: 'critical',
168
+ };
169
+ }
170
+ // Factor 2: Package age
171
+ const ageInDays = (0, registry_clients_1.calculatePackageAgeDays)(metadata.time?.created);
172
+ if (ageInDays < 7) {
173
+ factors.push({
174
+ name: 'very_new_package',
175
+ score: 30,
176
+ description: `Package created ${ageInDays} days ago (< 7 days)`,
177
+ });
178
+ totalScore += 30;
179
+ }
180
+ else if (ageInDays < 30) {
181
+ factors.push({
182
+ name: 'new_package',
183
+ score: 15,
184
+ description: `Package created ${ageInDays} days ago (< 30 days)`,
185
+ });
186
+ totalScore += 15;
187
+ }
188
+ // Factor 3: Download count
189
+ const weeklyDownloads = metadata.downloads?.weekly || 0;
190
+ if (weeklyDownloads < 10) {
191
+ factors.push({
192
+ name: 'no_downloads',
193
+ score: 25,
194
+ description: `Only ${weeklyDownloads} weekly downloads`,
195
+ });
196
+ totalScore += 25;
197
+ }
198
+ else if (weeklyDownloads < 100) {
199
+ factors.push({
200
+ name: 'low_downloads',
201
+ score: 15,
202
+ description: `Only ${weeklyDownloads} weekly downloads (< 100)`,
203
+ });
204
+ totalScore += 15;
205
+ }
206
+ else if (weeklyDownloads < 1000) {
207
+ factors.push({
208
+ name: 'moderate_downloads',
209
+ score: 5,
210
+ description: `${weeklyDownloads} weekly downloads (< 1000)`,
211
+ });
212
+ totalScore += 5;
213
+ }
214
+ // Factor 4: Typosquatting similarity
215
+ const typoCheck = checkTyposquatting(dep.name, 'npm');
216
+ if (typoCheck.isSimilar && typoCheck.distance === 1) {
217
+ factors.push({
218
+ name: 'likely_typosquat',
219
+ score: 40,
220
+ description: `Name differs by 1 character from popular package "${typoCheck.similarTo}"`,
221
+ });
222
+ totalScore += 40;
223
+ }
224
+ else if (typoCheck.isSimilar && typoCheck.distance === 2) {
225
+ factors.push({
226
+ name: 'possible_typosquat',
227
+ score: 20,
228
+ description: `Name similar to popular package "${typoCheck.similarTo}" (${typoCheck.distance} char diff)`,
229
+ });
230
+ totalScore += 20;
231
+ }
232
+ // Factor 5: Suspicious naming pattern
233
+ const namingCheck = hasSuspiciousNamingPattern(dep.name);
234
+ if (namingCheck.suspicious) {
235
+ factors.push({
236
+ name: 'suspicious_name',
237
+ score: 15,
238
+ description: `Suspicious naming pattern: ${namingCheck.pattern}`,
239
+ });
240
+ totalScore += 15;
241
+ }
242
+ // Factor 6: No repository/homepage
243
+ const hasRepo = !!metadata.repository?.url;
244
+ const hasHomepage = !!metadata.homepage;
245
+ if (!hasRepo && !hasHomepage) {
246
+ factors.push({
247
+ name: 'no_source_links',
248
+ score: 15,
249
+ description: 'Package has no repository or homepage link',
250
+ });
251
+ totalScore += 15;
252
+ }
253
+ // Factor 7: No description
254
+ if (!metadata.description || metadata.description.length < 10) {
255
+ factors.push({
256
+ name: 'no_description',
257
+ score: 10,
258
+ description: 'Package has no meaningful description',
259
+ });
260
+ totalScore += 10;
261
+ }
262
+ // Factor 8: Single maintainer on new package
263
+ const maintainerCount = metadata.maintainers?.length || 0;
264
+ if (maintainerCount === 1 && ageInDays < 30) {
265
+ factors.push({
266
+ name: 'single_new_maintainer',
267
+ score: 10,
268
+ description: 'Single maintainer on a new package',
269
+ });
270
+ totalScore += 10;
271
+ }
272
+ // Determine recommendation and severity
273
+ let recommendation;
274
+ let severity;
275
+ if (totalScore >= 70) {
276
+ recommendation = 'block';
277
+ severity = 'high';
278
+ }
279
+ else if (totalScore >= 40) {
280
+ recommendation = 'review';
281
+ severity = 'medium';
282
+ }
283
+ else if (totalScore >= 20) {
284
+ recommendation = 'review';
285
+ severity = 'low';
286
+ }
287
+ else {
288
+ recommendation = 'allow';
289
+ severity = 'info';
290
+ }
291
+ return {
292
+ package: dep.name,
293
+ ecosystem: 'npm',
294
+ totalScore: Math.min(totalScore, 100),
295
+ factors,
296
+ recommendation,
297
+ severity,
298
+ };
299
+ }
300
+ /**
301
+ * Compute risk score for a Python package
302
+ */
303
+ async function computePyPIRiskScore(dep, metadata) {
304
+ const factors = [];
305
+ let totalScore = 0;
306
+ // Factor 1: Package not found
307
+ if (!metadata) {
308
+ factors.push({
309
+ name: 'package_not_found',
310
+ score: 100,
311
+ description: 'Package does not exist in PyPI registry. Likely a hallucinated package name.',
312
+ });
313
+ return {
314
+ package: dep.name,
315
+ ecosystem: 'python',
316
+ totalScore: 100,
317
+ factors,
318
+ recommendation: 'block',
319
+ severity: 'critical',
320
+ };
321
+ }
322
+ // Factor 2: Typosquatting
323
+ const typoCheck = checkTyposquatting(dep.name, 'python');
324
+ if (typoCheck.isSimilar && typoCheck.distance === 1) {
325
+ factors.push({
326
+ name: 'likely_typosquat',
327
+ score: 40,
328
+ description: `Name differs by 1 character from popular package "${typoCheck.similarTo}"`,
329
+ });
330
+ totalScore += 40;
331
+ }
332
+ else if (typoCheck.isSimilar && typoCheck.distance === 2) {
333
+ factors.push({
334
+ name: 'possible_typosquat',
335
+ score: 20,
336
+ description: `Name similar to popular package "${typoCheck.similarTo}"`,
337
+ });
338
+ totalScore += 20;
339
+ }
340
+ // Factor 3: Suspicious naming
341
+ const namingCheck = hasSuspiciousNamingPattern(dep.name);
342
+ if (namingCheck.suspicious) {
343
+ factors.push({
344
+ name: 'suspicious_name',
345
+ score: 15,
346
+ description: `Suspicious naming pattern: ${namingCheck.pattern}`,
347
+ });
348
+ totalScore += 15;
349
+ }
350
+ // Factor 4: No project URLs
351
+ const hasProjectUrls = metadata.projectUrls && Object.keys(metadata.projectUrls).length > 0;
352
+ if (!hasProjectUrls) {
353
+ factors.push({
354
+ name: 'no_project_urls',
355
+ score: 15,
356
+ description: 'Package has no project URLs (repository, homepage, etc.)',
357
+ });
358
+ totalScore += 15;
359
+ }
360
+ // Factor 5: No summary/description
361
+ if (!metadata.summary || metadata.summary.length < 10) {
362
+ factors.push({
363
+ name: 'no_description',
364
+ score: 10,
365
+ description: 'Package has no meaningful description',
366
+ });
367
+ totalScore += 10;
368
+ }
369
+ // Determine recommendation and severity
370
+ let recommendation;
371
+ let severity;
372
+ if (totalScore >= 70) {
373
+ recommendation = 'block';
374
+ severity = 'high';
375
+ }
376
+ else if (totalScore >= 40) {
377
+ recommendation = 'review';
378
+ severity = 'medium';
379
+ }
380
+ else if (totalScore >= 20) {
381
+ recommendation = 'review';
382
+ severity = 'low';
383
+ }
384
+ else {
385
+ recommendation = 'allow';
386
+ severity = 'info';
387
+ }
388
+ return {
389
+ package: dep.name,
390
+ ecosystem: 'python',
391
+ totalScore: Math.min(totalScore, 100),
392
+ factors,
393
+ recommendation,
394
+ severity,
395
+ };
396
+ }
397
+ // ============================================================================
398
+ // Vulnerability Generation
399
+ // ============================================================================
400
+ /**
401
+ * Build description from risk score
402
+ */
403
+ function buildRiskDescription(risk) {
404
+ const factorList = risk.factors.map(f => `- ${f.description}`).join('\n');
405
+ if (risk.totalScore >= 70) {
406
+ return `Package "${risk.package}" has high risk indicators (score: ${risk.totalScore}/100):\n${factorList}\n\nThis may be a hallucinated package name or a typosquatting attempt.`;
407
+ }
408
+ if (risk.totalScore >= 40) {
409
+ return `Package "${risk.package}" has moderate risk indicators (score: ${risk.totalScore}/100):\n${factorList}\n\nReview this dependency before using.`;
410
+ }
411
+ return `Package "${risk.package}" has some risk factors (score: ${risk.totalScore}/100):\n${factorList}`;
412
+ }
413
+ /**
414
+ * Build suggested fix from risk score
415
+ */
416
+ function buildRiskSuggestedFix(risk) {
417
+ if (risk.factors.some(f => f.name === 'package_not_found')) {
418
+ return 'Verify the package name is correct. This package does not exist in the registry - it may be a hallucinated name from an AI tool.';
419
+ }
420
+ if (risk.factors.some(f => f.name.includes('typosquat'))) {
421
+ const typoFactor = risk.factors.find(f => f.name.includes('typosquat'));
422
+ const match = typoFactor?.description.match(/"([^"]+)"/);
423
+ const intendedPackage = match?.[1];
424
+ return `Verify this is the intended package. Did you mean "${intendedPackage}"?`;
425
+ }
426
+ if (risk.totalScore >= 40) {
427
+ return 'Review this package before using. Check the repository, maintainers, and recent activity.';
428
+ }
429
+ return 'Consider reviewing this package\'s repository and maintainers.';
430
+ }
431
+ // ============================================================================
432
+ // Main Check Function
433
+ // ============================================================================
434
+ /**
435
+ * Check packages in a file for hallucination and risk indicators
436
+ */
437
+ async function checkPackages(content, filePath) {
438
+ const vulnerabilities = [];
439
+ // Determine file type
440
+ const fileType = (0, registry_clients_1.getPackageFileType)(filePath);
441
+ if (!fileType) {
442
+ return vulnerabilities;
443
+ }
444
+ // Extract dependencies based on file type
445
+ let dependencies = [];
446
+ if (fileType === 'npm' && filePath.endsWith('package.json')) {
447
+ dependencies = (0, registry_clients_1.extractNpmDependencies)(content);
448
+ }
449
+ else if (fileType === 'python') {
450
+ dependencies = (0, registry_clients_1.extractPythonRequirements)(content);
451
+ }
452
+ if (dependencies.length === 0) {
453
+ return vulnerabilities;
454
+ }
455
+ const lines = content.split('\n');
456
+ // Filter out legitimate/known packages and scoped packages
457
+ const packagesToCheck = dependencies.filter(dep => {
458
+ // Skip scoped packages (@org/package) - usually legitimate
459
+ if (dep.name.startsWith('@'))
460
+ return false;
461
+ // Skip known legitimate packages
462
+ if (LEGITIMATE_PACKAGES.has(dep.name))
463
+ return false;
464
+ // Skip exact matches to popular packages
465
+ if (POPULAR_NPM_PACKAGES.has(dep.name.toLowerCase()))
466
+ return false;
467
+ if (POPULAR_PYTHON_PACKAGES.has(dep.name.toLowerCase()))
468
+ return false;
469
+ return true;
470
+ });
471
+ // Limit packages to check (cost control)
472
+ const limitedPackages = packagesToCheck.slice(0, MAX_PACKAGES_TO_CHECK);
473
+ // Check each package
474
+ for (const dep of limitedPackages) {
475
+ let risk;
476
+ if (fileType === 'npm') {
477
+ const metadata = await (0, registry_clients_1.fetchNPMMetadata)(dep.name);
478
+ risk = await computeNPMRiskScore(dep, metadata);
479
+ }
480
+ else {
481
+ const metadata = await (0, registry_clients_1.fetchPyPIMetadata)(dep.name);
482
+ risk = await computePyPIRiskScore(dep, metadata);
483
+ }
484
+ // Only create vulnerabilities for packages that need attention
485
+ if (risk.recommendation !== 'allow') {
486
+ vulnerabilities.push({
487
+ id: `pkg-risk-${filePath}-${dep.name}`,
488
+ filePath,
489
+ lineNumber: dep.line,
490
+ lineContent: lines[dep.line - 1]?.trim() || dep.name,
491
+ severity: risk.severity,
492
+ category: 'suspicious_package',
493
+ title: risk.totalScore >= 70
494
+ ? 'Potentially hallucinated dependency'
495
+ : 'Suspicious dependency',
496
+ description: buildRiskDescription(risk),
497
+ suggestedFix: buildRiskSuggestedFix(risk),
498
+ confidence: risk.totalScore >= 70 ? 'high' : 'medium',
499
+ layer: 3,
500
+ requiresAIValidation: risk.totalScore < 70, // High-confidence issues don't need AI validation
501
+ });
502
+ }
503
+ // Rate limiting between requests
504
+ await (0, registry_clients_1.rateLimitDelay)();
505
+ }
506
+ return vulnerabilities;
507
+ }
508
+ //# sourceMappingURL=package-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-check.js","sourceRoot":"","sources":["../../src/layer3/package-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Incremental Scan Mode
3
+ * Optimized scanning for PR workflows - only scan changed files and surface relevant findings
4
+ */
5
+ import type { ScanFile, Vulnerability, ScanModeConfig } from '../types';
6
+ import { type FileDiff } from '../utils/diff-parser';
7
+ /**
8
+ * Options for incremental scanning
9
+ */
10
+ export interface IncrementalScanOptions {
11
+ /** Git diff output (if available) */
12
+ diffContent?: string;
13
+ /** List of changed file paths (alternative to diff) */
14
+ changedFiles?: string[];
15
+ /** Whether to only show findings on exactly changed lines (strict) or nearby (default) */
16
+ strictLineMatching?: boolean;
17
+ /** Context window for "near changed line" (default: 5) */
18
+ contextWindow?: number;
19
+ /** Whether to mark findings as "introduced in this PR" */
20
+ markAsIntroduced?: boolean;
21
+ /** Previous findings to compare against (for suppressing pre-existing issues) */
22
+ previousFindings?: Vulnerability[];
23
+ }
24
+ /**
25
+ * Result of incremental scan with additional PR-specific metadata
26
+ */
27
+ export interface IncrementalScanResult {
28
+ /** All findings (filtered to changed lines) */
29
+ findings: Vulnerability[];
30
+ /** Findings that are new in this PR */
31
+ introduced: Vulnerability[];
32
+ /** Findings that existed before (if previousFindings provided) */
33
+ preExisting: Vulnerability[];
34
+ /** Number of files scanned */
35
+ filesScanned: number;
36
+ /** Number of files that were changed */
37
+ filesChanged: number;
38
+ /** Parsed diff information */
39
+ diffs: Map<string, FileDiff>;
40
+ /** Scan duration in ms */
41
+ duration: number;
42
+ }
43
+ /**
44
+ * Run an incremental scan optimized for PR workflows
45
+ *
46
+ * This scans:
47
+ * 1. All changed files (added + modified)
48
+ * 2. Files that import changed files (for context)
49
+ * 3. Middleware files (for auth context)
50
+ *
51
+ * And only surfaces findings on/near changed lines.
52
+ */
53
+ export declare function runIncrementalScan(allFiles: ScanFile[], options: IncrementalScanOptions): Promise<IncrementalScanResult>;
54
+ /**
55
+ * Create a PR-optimized scan config
56
+ */
57
+ export declare function createPRScanConfig(changedFiles: string[], options?: Partial<ScanModeConfig>): ScanModeConfig;
58
+ /**
59
+ * Format incremental scan result for PR comment
60
+ */
61
+ export declare function formatIncrementalForPR(result: IncrementalScanResult): {
62
+ summary: string;
63
+ hasNewIssues: boolean;
64
+ blockingIssues: number;
65
+ };
66
+ //# sourceMappingURL=incremental.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../src/modes/incremental.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAc,cAAc,EAAE,MAAM,UAAU,CAAA;AAGnF,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,sBAAsB,CAAA;AAG7B;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,0FAA0F;IAC1F,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAC/C,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,uCAAuC;IACvC,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,kEAAkE;IAClE,WAAW,EAAE,aAAa,EAAE,CAAA;IAC5B,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,8BAA8B;IAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC5B,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAAE,EACpB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA+HhC;AA+CD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GACpC,cAAc,CAWhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG;IACrE,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,CAwBA"}