@dataparade/cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +592 -0
  3. package/dist/bin/cli.d.ts +2 -0
  4. package/dist/bin/cli.js +7 -0
  5. package/dist/bin/load-env.d.ts +2 -0
  6. package/dist/bin/load-env.js +4 -0
  7. package/dist/src/ai-enrichment/agent-orchestrator.d.ts +28 -0
  8. package/dist/src/ai-enrichment/agent-orchestrator.js +476 -0
  9. package/dist/src/ai-enrichment/agents/index.d.ts +4 -0
  10. package/dist/src/ai-enrichment/agents/index.js +50 -0
  11. package/dist/src/ai-enrichment/candidate-selector.d.ts +10 -0
  12. package/dist/src/ai-enrichment/candidate-selector.js +158 -0
  13. package/dist/src/ai-enrichment/fallbacks.d.ts +6 -0
  14. package/dist/src/ai-enrichment/fallbacks.js +762 -0
  15. package/dist/src/ai-enrichment/index.d.ts +15 -0
  16. package/dist/src/ai-enrichment/index.js +31 -0
  17. package/dist/src/ai-enrichment/merge-rules.d.ts +12 -0
  18. package/dist/src/ai-enrichment/merge-rules.js +321 -0
  19. package/dist/src/ai-enrichment/non-pii-signal-rules.d.ts +10 -0
  20. package/dist/src/ai-enrichment/non-pii-signal-rules.js +72 -0
  21. package/dist/src/ai-enrichment/openai-proposals-response.schema.d.ts +94 -0
  22. package/dist/src/ai-enrichment/openai-proposals-response.schema.js +82 -0
  23. package/dist/src/ai-enrichment/pii-signal-rules.d.ts +8 -0
  24. package/dist/src/ai-enrichment/pii-signal-rules.js +68 -0
  25. package/dist/src/ai-enrichment/pipeline.d.ts +2 -0
  26. package/dist/src/ai-enrichment/pipeline.js +48 -0
  27. package/dist/src/ai-enrichment/planner.d.ts +2 -0
  28. package/dist/src/ai-enrichment/planner.js +60 -0
  29. package/dist/src/ai-enrichment/prompts/provider-enrichment-prompts.d.ts +12 -0
  30. package/dist/src/ai-enrichment/prompts/provider-enrichment-prompts.js +45 -0
  31. package/dist/src/ai-enrichment/provider-prompt.d.ts +32 -0
  32. package/dist/src/ai-enrichment/provider-prompt.js +222 -0
  33. package/dist/src/ai-enrichment/provider-topology-rules.d.ts +52 -0
  34. package/dist/src/ai-enrichment/provider-topology-rules.js +190 -0
  35. package/dist/src/ai-enrichment/provider-topology-shared.d.ts +48 -0
  36. package/dist/src/ai-enrichment/provider-topology-shared.js +329 -0
  37. package/dist/src/ai-enrichment/providers/endpoint-resolution.d.ts +13 -0
  38. package/dist/src/ai-enrichment/providers/endpoint-resolution.js +41 -0
  39. package/dist/src/ai-enrichment/providers/families/chat-completions-family.d.ts +13 -0
  40. package/dist/src/ai-enrichment/providers/families/chat-completions-family.js +181 -0
  41. package/dist/src/ai-enrichment/providers/families/generate-content-family.d.ts +10 -0
  42. package/dist/src/ai-enrichment/providers/families/generate-content-family.js +93 -0
  43. package/dist/src/ai-enrichment/providers/families/messages-family.d.ts +10 -0
  44. package/dist/src/ai-enrichment/providers/families/messages-family.js +86 -0
  45. package/dist/src/ai-enrichment/providers/families/ollama-generate-family.d.ts +10 -0
  46. package/dist/src/ai-enrichment/providers/families/ollama-generate-family.js +69 -0
  47. package/dist/src/ai-enrichment/providers/fetch-with-timeout.d.ts +2 -0
  48. package/dist/src/ai-enrichment/providers/fetch-with-timeout.js +22 -0
  49. package/dist/src/ai-enrichment/providers/index.d.ts +16 -0
  50. package/dist/src/ai-enrichment/providers/index.js +40 -0
  51. package/dist/src/ai-enrichment/providers/mock.d.ts +5 -0
  52. package/dist/src/ai-enrichment/providers/mock.js +12 -0
  53. package/dist/src/ai-enrichment/providers/platform-proxy-provider.d.ts +20 -0
  54. package/dist/src/ai-enrichment/providers/platform-proxy-provider.js +116 -0
  55. package/dist/src/ai-enrichment/providers/presets.d.ts +14 -0
  56. package/dist/src/ai-enrichment/providers/presets.js +50 -0
  57. package/dist/src/ai-enrichment/providers/provider-contract.d.ts +20 -0
  58. package/dist/src/ai-enrichment/providers/provider-contract.js +703 -0
  59. package/dist/src/ai-enrichment/providers/provider-json-parse.d.ts +23 -0
  60. package/dist/src/ai-enrichment/providers/provider-json-parse.js +96 -0
  61. package/dist/src/ai-enrichment/providers/provider-output-token-budget.d.ts +5 -0
  62. package/dist/src/ai-enrichment/providers/provider-output-token-budget.js +11 -0
  63. package/dist/src/ai-enrichment/providers/provider-pricing.d.ts +7 -0
  64. package/dist/src/ai-enrichment/providers/provider-pricing.js +32 -0
  65. package/dist/src/ai-enrichment/providers/provider-runtime.d.ts +9 -0
  66. package/dist/src/ai-enrichment/providers/provider-runtime.js +54 -0
  67. package/dist/src/ai-enrichment/providers/resolve-provider.d.ts +27 -0
  68. package/dist/src/ai-enrichment/providers/resolve-provider.js +41 -0
  69. package/dist/src/ai-enrichment/providers/types.d.ts +24 -0
  70. package/dist/src/ai-enrichment/providers/types.js +2 -0
  71. package/dist/src/ai-enrichment/scan-paths.d.ts +9 -0
  72. package/dist/src/ai-enrichment/scan-paths.js +28 -0
  73. package/dist/src/ai-enrichment/sensitive-paths.d.ts +5 -0
  74. package/dist/src/ai-enrichment/sensitive-paths.js +10 -0
  75. package/dist/src/ai-enrichment/third-party-data-flow.d.ts +27 -0
  76. package/dist/src/ai-enrichment/third-party-data-flow.js +518 -0
  77. package/dist/src/ai-enrichment/third-party-evidence.d.ts +14 -0
  78. package/dist/src/ai-enrichment/third-party-evidence.js +426 -0
  79. package/dist/src/ai-enrichment/third-party-property-matrix.d.ts +14 -0
  80. package/dist/src/ai-enrichment/third-party-property-matrix.js +52 -0
  81. package/dist/src/ai-enrichment/third-party-subtype.d.ts +14 -0
  82. package/dist/src/ai-enrichment/third-party-subtype.js +166 -0
  83. package/dist/src/ai-enrichment/tools/index.d.ts +39 -0
  84. package/dist/src/ai-enrichment/tools/index.js +121 -0
  85. package/dist/src/ai-enrichment/types.d.ts +170 -0
  86. package/dist/src/ai-enrichment/types.js +12 -0
  87. package/dist/src/analyzers/python/dependency-manifests.d.ts +8 -0
  88. package/dist/src/analyzers/python/dependency-manifests.js +131 -0
  89. package/dist/src/analyzers/python/detector.d.ts +3 -0
  90. package/dist/src/analyzers/python/detector.js +22 -0
  91. package/dist/src/analyzers/python/index.d.ts +2 -0
  92. package/dist/src/analyzers/python/index.js +11 -0
  93. package/dist/src/analyzers/python/manifest-parsers.d.ts +3 -0
  94. package/dist/src/analyzers/python/manifest-parsers.js +134 -0
  95. package/dist/src/analyzers/python/parser.d.ts +26 -0
  96. package/dist/src/analyzers/python/parser.js +187 -0
  97. package/dist/src/analyzers/python/patterns.d.ts +7 -0
  98. package/dist/src/analyzers/python/patterns.js +106 -0
  99. package/dist/src/analyzers/python/python-detection-config.d.ts +75 -0
  100. package/dist/src/analyzers/python/python-detection-config.js +148 -0
  101. package/dist/src/analyzers/registry.d.ts +13 -0
  102. package/dist/src/analyzers/registry.js +60 -0
  103. package/dist/src/analyzers/shared/manifest-budgets.d.ts +19 -0
  104. package/dist/src/analyzers/shared/manifest-budgets.js +21 -0
  105. package/dist/src/analyzers/shared/manifest-fs.d.ts +13 -0
  106. package/dist/src/analyzers/shared/manifest-fs.js +138 -0
  107. package/dist/src/analyzers/shared/property-inference.d.ts +8 -0
  108. package/dist/src/analyzers/shared/property-inference.js +165 -0
  109. package/dist/src/analyzers/terraform/detector.d.ts +10 -0
  110. package/dist/src/analyzers/terraform/detector.js +198 -0
  111. package/dist/src/analyzers/terraform/index.d.ts +2 -0
  112. package/dist/src/analyzers/terraform/index.js +13 -0
  113. package/dist/src/analyzers/terraform/parser.d.ts +29 -0
  114. package/dist/src/analyzers/terraform/parser.js +202 -0
  115. package/dist/src/analyzers/terraform/terraform-detection-config.d.ts +48 -0
  116. package/dist/src/analyzers/terraform/terraform-detection-config.js +218 -0
  117. package/dist/src/analyzers/terraform/terraform-exec.d.ts +11 -0
  118. package/dist/src/analyzers/terraform/terraform-exec.js +35 -0
  119. package/dist/src/analyzers/terraform/terraform-module-manifest.d.ts +19 -0
  120. package/dist/src/analyzers/terraform/terraform-module-manifest.js +75 -0
  121. package/dist/src/analyzers/terraform/terraform-show-json.d.ts +15 -0
  122. package/dist/src/analyzers/terraform/terraform-show-json.js +188 -0
  123. package/dist/src/analyzers/terraform/terraform-utility-resource.d.ts +12 -0
  124. package/dist/src/analyzers/terraform/terraform-utility-resource.js +30 -0
  125. package/dist/src/analyzers/types.d.ts +5 -0
  126. package/dist/src/analyzers/types.js +2 -0
  127. package/dist/src/analyzers/typescript/actor-detection.d.ts +4 -0
  128. package/dist/src/analyzers/typescript/actor-detection.js +15 -0
  129. package/dist/src/analyzers/typescript/dependency-manifests.d.ts +9 -0
  130. package/dist/src/analyzers/typescript/dependency-manifests.js +131 -0
  131. package/dist/src/analyzers/typescript/detector.d.ts +3 -0
  132. package/dist/src/analyzers/typescript/detector.js +23 -0
  133. package/dist/src/analyzers/typescript/index.d.ts +2 -0
  134. package/dist/src/analyzers/typescript/index.js +11 -0
  135. package/dist/src/analyzers/typescript/manifest-parsers.d.ts +1 -0
  136. package/dist/src/analyzers/typescript/manifest-parsers.js +30 -0
  137. package/dist/src/analyzers/typescript/parser.d.ts +44 -0
  138. package/dist/src/analyzers/typescript/parser.js +287 -0
  139. package/dist/src/analyzers/typescript/third-party-detection.d.ts +4 -0
  140. package/dist/src/analyzers/typescript/third-party-detection.js +16 -0
  141. package/dist/src/analyzers/typescript/typescript-detection-config.d.ts +68 -0
  142. package/dist/src/analyzers/typescript/typescript-detection-config.js +171 -0
  143. package/dist/src/analyzers/typescript/typescript-detection.d.ts +10 -0
  144. package/dist/src/analyzers/typescript/typescript-detection.js +57 -0
  145. package/dist/src/classifier/application-injection.d.ts +12 -0
  146. package/dist/src/classifier/application-injection.js +335 -0
  147. package/dist/src/classifier/classify.d.ts +3 -0
  148. package/dist/src/classifier/classify.js +15 -0
  149. package/dist/src/classifier/component-factory.d.ts +3 -0
  150. package/dist/src/classifier/component-factory.js +488 -0
  151. package/dist/src/classifier/config.d.ts +38 -0
  152. package/dist/src/classifier/config.js +260 -0
  153. package/dist/src/classifier/enhance-defaults.d.ts +28 -0
  154. package/dist/src/classifier/enhance-defaults.js +369 -0
  155. package/dist/src/classifier/enhance.d.ts +13 -0
  156. package/dist/src/classifier/enhance.js +295 -0
  157. package/dist/src/classifier/external-url-third-party.d.ts +26 -0
  158. package/dist/src/classifier/external-url-third-party.js +195 -0
  159. package/dist/src/classifier/grouping.d.ts +1 -0
  160. package/dist/src/classifier/grouping.js +2 -0
  161. package/dist/src/classifier/main-application-selection.d.ts +41 -0
  162. package/dist/src/classifier/main-application-selection.js +222 -0
  163. package/dist/src/classifier/naming.d.ts +4 -0
  164. package/dist/src/classifier/naming.js +78 -0
  165. package/dist/src/classifier/postprocessing.d.ts +12 -0
  166. package/dist/src/classifier/postprocessing.js +510 -0
  167. package/dist/src/classifier/sectioning.d.ts +5 -0
  168. package/dist/src/classifier/sectioning.js +60 -0
  169. package/dist/src/classifier/terraform-provider-hub.d.ts +6 -0
  170. package/dist/src/classifier/terraform-provider-hub.js +38 -0
  171. package/dist/src/cli.d.ts +2 -0
  172. package/dist/src/cli.js +498 -0
  173. package/dist/src/config/actor-detection-config.d.ts +21 -0
  174. package/dist/src/config/actor-detection-config.js +97 -0
  175. package/dist/src/config/env.d.ts +2 -0
  176. package/dist/src/config/env.js +75 -0
  177. package/dist/src/config/file.d.ts +6 -0
  178. package/dist/src/config/file.js +74 -0
  179. package/dist/src/config/inference-scope.d.ts +2 -0
  180. package/dist/src/config/inference-scope.js +15 -0
  181. package/dist/src/config/load-cli-env.d.ts +1 -0
  182. package/dist/src/config/load-cli-env.js +54 -0
  183. package/dist/src/config/normalize-ai-provider.d.ts +5 -0
  184. package/dist/src/config/normalize-ai-provider.js +18 -0
  185. package/dist/src/config/property-detection-config.d.ts +27 -0
  186. package/dist/src/config/property-detection-config.js +355 -0
  187. package/dist/src/config/redact.d.ts +3 -0
  188. package/dist/src/config/redact.js +14 -0
  189. package/dist/src/config/resolve.d.ts +15 -0
  190. package/dist/src/config/resolve.js +361 -0
  191. package/dist/src/config/scan-env.d.ts +7 -0
  192. package/dist/src/config/scan-env.js +38 -0
  193. package/dist/src/config/third-party-detection-config.d.ts +25 -0
  194. package/dist/src/config/third-party-detection-config.js +97 -0
  195. package/dist/src/config/types.d.ts +106 -0
  196. package/dist/src/config/types.js +2 -0
  197. package/dist/src/config/validate-scan-ai.d.ts +3 -0
  198. package/dist/src/config/validate-scan-ai.js +33 -0
  199. package/dist/src/core/pipeline/ai-orchestrator-options.d.ts +6 -0
  200. package/dist/src/core/pipeline/ai-orchestrator-options.js +46 -0
  201. package/dist/src/core/pipeline/classifier-phase.d.ts +7 -0
  202. package/dist/src/core/pipeline/classifier-phase.js +78 -0
  203. package/dist/src/core/pipeline/dataflow-phase.d.ts +7 -0
  204. package/dist/src/core/pipeline/dataflow-phase.js +10 -0
  205. package/dist/src/core/pipeline/diagram-layout/app-section-layout.d.ts +7 -0
  206. package/dist/src/core/pipeline/diagram-layout/app-section-layout.js +74 -0
  207. package/dist/src/core/pipeline/diagram-layout/constants.d.ts +11 -0
  208. package/dist/src/core/pipeline/diagram-layout/constants.js +14 -0
  209. package/dist/src/core/pipeline/diagram-layout/edge-handles.d.ts +3 -0
  210. package/dist/src/core/pipeline/diagram-layout/edge-handles.js +26 -0
  211. package/dist/src/core/pipeline/diagram-layout/managed-provider-layout.d.ts +3 -0
  212. package/dist/src/core/pipeline/diagram-layout/managed-provider-layout.js +40 -0
  213. package/dist/src/core/pipeline/diagram-layout/minimal-terraform-layout.d.ts +6 -0
  214. package/dist/src/core/pipeline/diagram-layout/minimal-terraform-layout.js +53 -0
  215. package/dist/src/core/pipeline/diagram-layout/section-helpers.d.ts +30 -0
  216. package/dist/src/core/pipeline/diagram-layout/section-helpers.js +62 -0
  217. package/dist/src/core/pipeline/diagram-layout/terraform-lane-layout.d.ts +3 -0
  218. package/dist/src/core/pipeline/diagram-layout/terraform-lane-layout.js +109 -0
  219. package/dist/src/core/pipeline/diagram-layout/types.d.ts +2 -0
  220. package/dist/src/core/pipeline/diagram-layout/types.js +2 -0
  221. package/dist/src/core/pipeline/graph-mapping.d.ts +6 -0
  222. package/dist/src/core/pipeline/graph-mapping.js +308 -0
  223. package/dist/src/core/pipeline/mixed-app-terraform-scan.d.ts +13 -0
  224. package/dist/src/core/pipeline/mixed-app-terraform-scan.js +81 -0
  225. package/dist/src/core/pipeline/orchestrator-result.d.ts +6 -0
  226. package/dist/src/core/pipeline/orchestrator-result.js +2 -0
  227. package/dist/src/core/pipeline/orchestrator.d.ts +26 -0
  228. package/dist/src/core/pipeline/orchestrator.js +79 -0
  229. package/dist/src/core/pipeline/resolve-path-under-scan-root.d.ts +7 -0
  230. package/dist/src/core/pipeline/resolve-path-under-scan-root.js +55 -0
  231. package/dist/src/core/pipeline/scan-pipeline.d.ts +6 -0
  232. package/dist/src/core/pipeline/scan-pipeline.js +364 -0
  233. package/dist/src/core/pipeline/sorting.d.ts +3 -0
  234. package/dist/src/core/pipeline/sorting.js +48 -0
  235. package/dist/src/core/pipeline/stable-component-ids.d.ts +15 -0
  236. package/dist/src/core/pipeline/stable-component-ids.js +68 -0
  237. package/dist/src/core/pipeline/structural-scan.d.ts +19 -0
  238. package/dist/src/core/pipeline/structural-scan.js +304 -0
  239. package/dist/src/core/pipeline/terraform-flow-utils.d.ts +6 -0
  240. package/dist/src/core/pipeline/terraform-flow-utils.js +32 -0
  241. package/dist/src/core/pipeline/terraform-minimal-services.d.ts +31 -0
  242. package/dist/src/core/pipeline/terraform-minimal-services.js +225 -0
  243. package/dist/src/core/schema/dataflow-wrapper.schema.d.ts +83 -0
  244. package/dist/src/core/schema/dataflow-wrapper.schema.js +40 -0
  245. package/dist/src/core/schema/diagram-graph.schema.d.ts +93 -0
  246. package/dist/src/core/schema/diagram-graph.schema.js +55 -0
  247. package/dist/src/core/schema/index.d.ts +4 -0
  248. package/dist/src/core/schema/index.js +20 -0
  249. package/dist/src/core/schema/scan-config.schema.d.ts +66 -0
  250. package/dist/src/core/schema/scan-config.schema.js +67 -0
  251. package/dist/src/core/schema/scan-result.schema.d.ts +450 -0
  252. package/dist/src/core/schema/scan-result.schema.js +236 -0
  253. package/dist/src/core/sectioning/discover-service-sections.d.ts +80 -0
  254. package/dist/src/core/sectioning/discover-service-sections.js +468 -0
  255. package/dist/src/core/sectioning/section-runtime.d.ts +21 -0
  256. package/dist/src/core/sectioning/section-runtime.js +148 -0
  257. package/dist/src/core/terraform/component-predicates.d.ts +13 -0
  258. package/dist/src/core/terraform/component-predicates.js +71 -0
  259. package/dist/src/core/types/component.d.ts +18 -0
  260. package/dist/src/core/types/component.js +2 -0
  261. package/dist/src/core/types/config.d.ts +57 -0
  262. package/dist/src/core/types/config.js +2 -0
  263. package/dist/src/core/types/data-flow.d.ts +24 -0
  264. package/dist/src/core/types/data-flow.js +2 -0
  265. package/dist/src/core/types/detection.d.ts +12 -0
  266. package/dist/src/core/types/detection.js +19 -0
  267. package/dist/src/core/types/file.d.ts +14 -0
  268. package/dist/src/core/types/file.js +2 -0
  269. package/dist/src/core/types/index.d.ts +7 -0
  270. package/dist/src/core/types/index.js +23 -0
  271. package/dist/src/core/types/progress.d.ts +9 -0
  272. package/dist/src/core/types/progress.js +2 -0
  273. package/dist/src/core/types/result.d.ts +140 -0
  274. package/dist/src/core/types/result.js +2 -0
  275. package/dist/src/data-flow/application-hub.d.ts +7 -0
  276. package/dist/src/data-flow/application-hub.js +88 -0
  277. package/dist/src/data-flow/dedupe.d.ts +7 -0
  278. package/dist/src/data-flow/dedupe.js +92 -0
  279. package/dist/src/data-flow/detect.d.ts +16 -0
  280. package/dist/src/data-flow/detect.js +203 -0
  281. package/dist/src/data-flow/detector.d.ts +15 -0
  282. package/dist/src/data-flow/detector.js +18 -0
  283. package/dist/src/data-flow/drop-cross-section-flows.d.ts +8 -0
  284. package/dist/src/data-flow/drop-cross-section-flows.js +32 -0
  285. package/dist/src/data-flow/ensure-actor-flow.d.ts +16 -0
  286. package/dist/src/data-flow/ensure-actor-flow.js +101 -0
  287. package/dist/src/data-flow/ensure-manifest-declared-flows.d.ts +14 -0
  288. package/dist/src/data-flow/ensure-manifest-declared-flows.js +76 -0
  289. package/dist/src/data-flow/ensure-section-api-flows.d.ts +6 -0
  290. package/dist/src/data-flow/ensure-section-api-flows.js +57 -0
  291. package/dist/src/data-flow/flow-builder.d.ts +5 -0
  292. package/dist/src/data-flow/flow-builder.js +80 -0
  293. package/dist/src/data-flow/import-graph.d.ts +10 -0
  294. package/dist/src/data-flow/import-graph.js +147 -0
  295. package/dist/src/data-flow/index.d.ts +8 -0
  296. package/dist/src/data-flow/index.js +20 -0
  297. package/dist/src/data-flow/internal-fetch.d.ts +8 -0
  298. package/dist/src/data-flow/internal-fetch.js +209 -0
  299. package/dist/src/data-flow/postprocess.d.ts +9 -0
  300. package/dist/src/data-flow/postprocess.js +63 -0
  301. package/dist/src/data-flow/rewire.d.ts +10 -0
  302. package/dist/src/data-flow/rewire.js +93 -0
  303. package/dist/src/data-flow/source-attribution.d.ts +8 -0
  304. package/dist/src/data-flow/source-attribution.js +131 -0
  305. package/dist/src/data-flow/source-resolution.d.ts +13 -0
  306. package/dist/src/data-flow/source-resolution.js +61 -0
  307. package/dist/src/data-flow/target-matching.d.ts +21 -0
  308. package/dist/src/data-flow/target-matching.js +253 -0
  309. package/dist/src/data-flow/terraform-flows.d.ts +32 -0
  310. package/dist/src/data-flow/terraform-flows.js +170 -0
  311. package/dist/src/evals/metrics.d.ts +18 -0
  312. package/dist/src/evals/metrics.js +58 -0
  313. package/dist/src/evals/run-model-matrix.d.ts +1 -0
  314. package/dist/src/evals/run-model-matrix.js +68 -0
  315. package/dist/src/index.d.ts +2 -0
  316. package/dist/src/index.js +20 -0
  317. package/dist/src/ingest/file-system.d.ts +17 -0
  318. package/dist/src/ingest/file-system.js +239 -0
  319. package/dist/src/ingest/gitignore.d.ts +12 -0
  320. package/dist/src/ingest/gitignore.js +127 -0
  321. package/dist/src/ingest/sensitive-paths.d.ts +2 -0
  322. package/dist/src/ingest/sensitive-paths.js +8 -0
  323. package/dist/src/observability/scan-sentry.d.ts +20 -0
  324. package/dist/src/observability/scan-sentry.js +133 -0
  325. package/dist/src/output/json.d.ts +51 -0
  326. package/dist/src/output/json.js +59 -0
  327. package/dist/src/patterns/config.d.ts +22 -0
  328. package/dist/src/patterns/config.js +119 -0
  329. package/dist/src/patterns/detectors/helpers.d.ts +19 -0
  330. package/dist/src/patterns/detectors/helpers.js +68 -0
  331. package/dist/src/patterns/detectors/python.d.ts +8 -0
  332. package/dist/src/patterns/detectors/python.js +412 -0
  333. package/dist/src/patterns/detectors/typescript.d.ts +8 -0
  334. package/dist/src/patterns/detectors/typescript.js +328 -0
  335. package/dist/src/patterns/engine.d.ts +40 -0
  336. package/dist/src/patterns/engine.js +111 -0
  337. package/dist/src/patterns/flow-source-patterns.d.ts +6 -0
  338. package/dist/src/patterns/flow-source-patterns.js +39 -0
  339. package/dist/src/patterns/frontend-frameworks.d.ts +4 -0
  340. package/dist/src/patterns/frontend-frameworks.js +25 -0
  341. package/dist/src/patterns/scan-exclusions.d.ts +14 -0
  342. package/dist/src/patterns/scan-exclusions.js +76 -0
  343. package/dist/src/platform-api/dataparade-api-base-url.d.ts +8 -0
  344. package/dist/src/platform-api/dataparade-api-base-url.js +17 -0
  345. package/dist/src/platform-api/estimate-scan-footprint.d.ts +8 -0
  346. package/dist/src/platform-api/estimate-scan-footprint.js +120 -0
  347. package/dist/src/platform-api/scan-quota-client.d.ts +28 -0
  348. package/dist/src/platform-api/scan-quota-client.js +79 -0
  349. package/dist/src/tracing/langsmith-tracing.d.ts +37 -0
  350. package/dist/src/tracing/langsmith-tracing.js +171 -0
  351. package/dist/tests/cli/cli.spec.d.ts +1 -0
  352. package/dist/tests/cli/cli.spec.js +87 -0
  353. package/dist/tests/fixtures/e2e-ts-sample/db-client-import.d.ts +2 -0
  354. package/dist/tests/fixtures/e2e-ts-sample/db-client-import.js +8 -0
  355. package/dist/tests/fixtures/e2e-ts-sample/db.d.ts +3 -0
  356. package/dist/tests/fixtures/e2e-ts-sample/db.js +7 -0
  357. package/dist/tests/fixtures/e2e-ts-sample/external-api.d.ts +1 -0
  358. package/dist/tests/fixtures/e2e-ts-sample/external-api.js +18 -0
  359. package/dist/tests/fixtures/e2e-ts-sample/pg-client.d.ts +3 -0
  360. package/dist/tests/fixtures/e2e-ts-sample/pg-client.js +7 -0
  361. package/dist/tests/fixtures/e2e-ts-sample/server.d.ts +14 -0
  362. package/dist/tests/fixtures/e2e-ts-sample/server.js +4 -0
  363. package/dist/tests/fixtures/e2e-ts-sentry-route-env/server.d.ts +1 -0
  364. package/dist/tests/fixtures/e2e-ts-sentry-route-env/server.js +24 -0
  365. package/dist/tests/fixtures/ingest-basic/src/index.d.ts +1 -0
  366. package/dist/tests/fixtures/ingest-basic/src/index.js +6 -0
  367. package/dist/tests/fixtures/mixed-language-basic/api.d.ts +2 -0
  368. package/dist/tests/fixtures/mixed-language-basic/api.js +12 -0
  369. package/dist/tests/fixtures/monorepo-app-plus-terraform/packages/app/app/route.d.ts +1 -0
  370. package/dist/tests/fixtures/monorepo-app-plus-terraform/packages/app/app/route.js +6 -0
  371. package/dist/tests/fixtures/monorepo-front-back-sections/backend/app/route.d.ts +1 -0
  372. package/dist/tests/fixtures/monorepo-front-back-sections/backend/app/route.js +6 -0
  373. package/dist/tests/fixtures/monorepo-front-back-sections/frontend/app/route.d.ts +1 -0
  374. package/dist/tests/fixtures/monorepo-front-back-sections/frontend/app/route.js +7 -0
  375. package/dist/tests/fixtures/typescript-basic/app/route.d.ts +1 -0
  376. package/dist/tests/fixtures/typescript-basic/app/route.js +7 -0
  377. package/dist/tests/fixtures/typescript-basic/db-client-import.d.ts +2 -0
  378. package/dist/tests/fixtures/typescript-basic/db-client-import.js +8 -0
  379. package/dist/tests/fixtures/typescript-basic/db.d.ts +3 -0
  380. package/dist/tests/fixtures/typescript-basic/db.js +7 -0
  381. package/dist/tests/fixtures/typescript-basic/external-api.d.ts +1 -0
  382. package/dist/tests/fixtures/typescript-basic/external-api.js +18 -0
  383. package/dist/tests/fixtures/typescript-basic/pg-client.d.ts +3 -0
  384. package/dist/tests/fixtures/typescript-basic/pg-client.js +7 -0
  385. package/dist/tests/fixtures/typescript-basic/server.d.ts +14 -0
  386. package/dist/tests/fixtures/typescript-basic/server.js +4 -0
  387. package/dist/tests/fixtures/typescript-dependency-manifests-basic/src/index.d.ts +0 -0
  388. package/dist/tests/fixtures/typescript-dependency-manifests-basic/src/index.js +2 -0
  389. package/dist/tests/helpers/scan-result-builders.d.ts +2 -0
  390. package/dist/tests/helpers/scan-result-builders.js +15 -0
  391. package/dist/tests/schema/dataflow-wrapper.schema.spec.d.ts +1 -0
  392. package/dist/tests/schema/dataflow-wrapper.schema.spec.js +89 -0
  393. package/dist/tests/schema/diagram-graph.schema.spec.d.ts +1 -0
  394. package/dist/tests/schema/diagram-graph.schema.spec.js +48 -0
  395. package/dist/tests/schema/scan-config.schema.spec.d.ts +1 -0
  396. package/dist/tests/schema/scan-config.schema.spec.js +135 -0
  397. package/dist/tests/schema/scan-result.schema.spec.d.ts +1 -0
  398. package/dist/tests/schema/scan-result.schema.spec.js +177 -0
  399. package/dist/tests/unit/ai-enrichment/agent-orchestrator.spec.d.ts +1 -0
  400. package/dist/tests/unit/ai-enrichment/agent-orchestrator.spec.js +483 -0
  401. package/dist/tests/unit/ai-enrichment/candidate-selector.spec.d.ts +1 -0
  402. package/dist/tests/unit/ai-enrichment/candidate-selector.spec.js +106 -0
  403. package/dist/tests/unit/ai-enrichment/create-ai-provider.spec.d.ts +1 -0
  404. package/dist/tests/unit/ai-enrichment/create-ai-provider.spec.js +32 -0
  405. package/dist/tests/unit/ai-enrichment/endpoint-resolution.spec.d.ts +1 -0
  406. package/dist/tests/unit/ai-enrichment/endpoint-resolution.spec.js +47 -0
  407. package/dist/tests/unit/ai-enrichment/fallbacks.spec.d.ts +1 -0
  408. package/dist/tests/unit/ai-enrichment/fallbacks.spec.js +1304 -0
  409. package/dist/tests/unit/ai-enrichment/families/chat-completions-family.spec.d.ts +1 -0
  410. package/dist/tests/unit/ai-enrichment/families/chat-completions-family.spec.js +219 -0
  411. package/dist/tests/unit/ai-enrichment/families/generate-content-family.spec.d.ts +1 -0
  412. package/dist/tests/unit/ai-enrichment/families/generate-content-family.spec.js +119 -0
  413. package/dist/tests/unit/ai-enrichment/families/messages-family.spec.d.ts +1 -0
  414. package/dist/tests/unit/ai-enrichment/families/messages-family.spec.js +129 -0
  415. package/dist/tests/unit/ai-enrichment/families/ollama-generate-family.spec.d.ts +1 -0
  416. package/dist/tests/unit/ai-enrichment/families/ollama-generate-family.spec.js +69 -0
  417. package/dist/tests/unit/ai-enrichment/merge-rules.spec.d.ts +1 -0
  418. package/dist/tests/unit/ai-enrichment/merge-rules.spec.js +422 -0
  419. package/dist/tests/unit/ai-enrichment/openai-proposals-response.schema.spec.d.ts +1 -0
  420. package/dist/tests/unit/ai-enrichment/openai-proposals-response.schema.spec.js +30 -0
  421. package/dist/tests/unit/ai-enrichment/pipeline.spec.d.ts +1 -0
  422. package/dist/tests/unit/ai-enrichment/pipeline.spec.js +120 -0
  423. package/dist/tests/unit/ai-enrichment/planner.spec.d.ts +1 -0
  424. package/dist/tests/unit/ai-enrichment/planner.spec.js +106 -0
  425. package/dist/tests/unit/ai-enrichment/platform-proxy-provider.spec.d.ts +1 -0
  426. package/dist/tests/unit/ai-enrichment/platform-proxy-provider.spec.js +51 -0
  427. package/dist/tests/unit/ai-enrichment/provider-contract.spec.d.ts +1 -0
  428. package/dist/tests/unit/ai-enrichment/provider-contract.spec.js +244 -0
  429. package/dist/tests/unit/ai-enrichment/provider-json-parse.spec.d.ts +1 -0
  430. package/dist/tests/unit/ai-enrichment/provider-json-parse.spec.js +24 -0
  431. package/dist/tests/unit/ai-enrichment/provider-output-token-budget.spec.d.ts +1 -0
  432. package/dist/tests/unit/ai-enrichment/provider-output-token-budget.spec.js +15 -0
  433. package/dist/tests/unit/ai-enrichment/provider-prompt-env.spec.d.ts +1 -0
  434. package/dist/tests/unit/ai-enrichment/provider-prompt-env.spec.js +54 -0
  435. package/dist/tests/unit/ai-enrichment/provider-prompt.spec.d.ts +1 -0
  436. package/dist/tests/unit/ai-enrichment/provider-prompt.spec.js +206 -0
  437. package/dist/tests/unit/ai-enrichment/provider-topology-terraform-aws.spec.d.ts +1 -0
  438. package/dist/tests/unit/ai-enrichment/provider-topology-terraform-aws.spec.js +43 -0
  439. package/dist/tests/unit/ai-enrichment/provider-topology-terraform-kubernetes.spec.d.ts +1 -0
  440. package/dist/tests/unit/ai-enrichment/provider-topology-terraform-kubernetes.spec.js +40 -0
  441. package/dist/tests/unit/ai-enrichment/providers/fetch-with-timeout.spec.d.ts +1 -0
  442. package/dist/tests/unit/ai-enrichment/providers/fetch-with-timeout.spec.js +22 -0
  443. package/dist/tests/unit/ai-enrichment/resolve-provider.spec.d.ts +1 -0
  444. package/dist/tests/unit/ai-enrichment/resolve-provider.spec.js +67 -0
  445. package/dist/tests/unit/ai-enrichment/scan-paths-exact.spec.d.ts +1 -0
  446. package/dist/tests/unit/ai-enrichment/scan-paths-exact.spec.js +35 -0
  447. package/dist/tests/unit/ai-enrichment/scan-paths.spec.d.ts +1 -0
  448. package/dist/tests/unit/ai-enrichment/scan-paths.spec.js +21 -0
  449. package/dist/tests/unit/ai-enrichment/sensitive-paths.spec.d.ts +1 -0
  450. package/dist/tests/unit/ai-enrichment/sensitive-paths.spec.js +20 -0
  451. package/dist/tests/unit/ai-enrichment/third-party-data-flow.spec.d.ts +1 -0
  452. package/dist/tests/unit/ai-enrichment/third-party-data-flow.spec.js +963 -0
  453. package/dist/tests/unit/ai-enrichment/third-party-evidence.spec.d.ts +1 -0
  454. package/dist/tests/unit/ai-enrichment/third-party-evidence.spec.js +117 -0
  455. package/dist/tests/unit/ai-enrichment/third-party-subtype.spec.d.ts +1 -0
  456. package/dist/tests/unit/ai-enrichment/third-party-subtype.spec.js +45 -0
  457. package/dist/tests/unit/ai-enrichment/tools-validation.spec.d.ts +1 -0
  458. package/dist/tests/unit/ai-enrichment/tools-validation.spec.js +66 -0
  459. package/dist/tests/unit/analyzers/python/parser.spec.d.ts +1 -0
  460. package/dist/tests/unit/analyzers/python/parser.spec.js +104 -0
  461. package/dist/tests/unit/analyzers/python/patterns.spec.d.ts +1 -0
  462. package/dist/tests/unit/analyzers/python/patterns.spec.js +289 -0
  463. package/dist/tests/unit/analyzers/registry.spec.d.ts +1 -0
  464. package/dist/tests/unit/analyzers/registry.spec.js +234 -0
  465. package/dist/tests/unit/analyzers/terraform/classifier-subtype-parity.spec.d.ts +1 -0
  466. package/dist/tests/unit/analyzers/terraform/classifier-subtype-parity.spec.js +87 -0
  467. package/dist/tests/unit/analyzers/terraform/detector.spec.d.ts +1 -0
  468. package/dist/tests/unit/analyzers/terraform/detector.spec.js +110 -0
  469. package/dist/tests/unit/analyzers/terraform/generated-provider-hints.spec.d.ts +1 -0
  470. package/dist/tests/unit/analyzers/terraform/generated-provider-hints.spec.js +53 -0
  471. package/dist/tests/unit/analyzers/terraform/parser.spec.d.ts +1 -0
  472. package/dist/tests/unit/analyzers/terraform/parser.spec.js +56 -0
  473. package/dist/tests/unit/analyzers/terraform/terraform-module-manifest.spec.d.ts +1 -0
  474. package/dist/tests/unit/analyzers/terraform/terraform-module-manifest.spec.js +63 -0
  475. package/dist/tests/unit/analyzers/terraform/terraform-utility-resource.spec.d.ts +1 -0
  476. package/dist/tests/unit/analyzers/terraform/terraform-utility-resource.spec.js +19 -0
  477. package/dist/tests/unit/analyzers/terraform-exec.spec.d.ts +1 -0
  478. package/dist/tests/unit/analyzers/terraform-exec.spec.js +27 -0
  479. package/dist/tests/unit/analyzers/terraform-show-json.spec.d.ts +1 -0
  480. package/dist/tests/unit/analyzers/terraform-show-json.spec.js +77 -0
  481. package/dist/tests/unit/analyzers/typescript/dependency-manifests.spec.d.ts +1 -0
  482. package/dist/tests/unit/analyzers/typescript/dependency-manifests.spec.js +61 -0
  483. package/dist/tests/unit/analyzers/typescript/detector.spec.d.ts +1 -0
  484. package/dist/tests/unit/analyzers/typescript/detector.spec.js +225 -0
  485. package/dist/tests/unit/analyzers/typescript/external-apis-auth0.spec.d.ts +1 -0
  486. package/dist/tests/unit/analyzers/typescript/external-apis-auth0.spec.js +49 -0
  487. package/dist/tests/unit/analyzers/typescript/external-apis-sentry.spec.d.ts +1 -0
  488. package/dist/tests/unit/analyzers/typescript/external-apis-sentry.spec.js +27 -0
  489. package/dist/tests/unit/analyzers/typescript/fixture-integration.spec.d.ts +1 -0
  490. package/dist/tests/unit/analyzers/typescript/fixture-integration.spec.js +64 -0
  491. package/dist/tests/unit/analyzers/typescript/parser.spec.d.ts +1 -0
  492. package/dist/tests/unit/analyzers/typescript/parser.spec.js +99 -0
  493. package/dist/tests/unit/analyzers/typescript/pattern-config.spec.d.ts +1 -0
  494. package/dist/tests/unit/analyzers/typescript/pattern-config.spec.js +24 -0
  495. package/dist/tests/unit/analyzers/typescript/property-detection.spec.d.ts +1 -0
  496. package/dist/tests/unit/analyzers/typescript/property-detection.spec.js +138 -0
  497. package/dist/tests/unit/classifier/classify.spec.d.ts +1 -0
  498. package/dist/tests/unit/classifier/classify.spec.js +1453 -0
  499. package/dist/tests/unit/classifier/enhance.spec.d.ts +1 -0
  500. package/dist/tests/unit/classifier/enhance.spec.js +400 -0
  501. package/dist/tests/unit/classifier/external-url-third-party.spec.d.ts +1 -0
  502. package/dist/tests/unit/classifier/external-url-third-party.spec.js +83 -0
  503. package/dist/tests/unit/classifier/frontend-framework-grouping.spec.d.ts +1 -0
  504. package/dist/tests/unit/classifier/frontend-framework-grouping.spec.js +44 -0
  505. package/dist/tests/unit/classifier/terraform-grouping.spec.d.ts +1 -0
  506. package/dist/tests/unit/classifier/terraform-grouping.spec.js +96 -0
  507. package/dist/tests/unit/cli/config-command.spec.d.ts +1 -0
  508. package/dist/tests/unit/cli/config-command.spec.js +51 -0
  509. package/dist/tests/unit/cli/scan-command-ai-flags.spec.d.ts +0 -0
  510. package/dist/tests/unit/cli/scan-command-ai-flags.spec.js +149 -0
  511. package/dist/tests/unit/cli/scan-command-diagram-graph.spec.d.ts +1 -0
  512. package/dist/tests/unit/cli/scan-command-diagram-graph.spec.js +26 -0
  513. package/dist/tests/unit/cli/scan-command-e2e-monorepo-app-plus-terraform.spec.d.ts +1 -0
  514. package/dist/tests/unit/cli/scan-command-e2e-monorepo-app-plus-terraform.spec.js +107 -0
  515. package/dist/tests/unit/cli/scan-command-e2e-monorepo-front-back-sections.spec.d.ts +1 -0
  516. package/dist/tests/unit/cli/scan-command-e2e-monorepo-front-back-sections.spec.js +74 -0
  517. package/dist/tests/unit/cli/scan-command-e2e-python-basic.spec.d.ts +1 -0
  518. package/dist/tests/unit/cli/scan-command-e2e-python-basic.spec.js +43 -0
  519. package/dist/tests/unit/cli/scan-command-e2e-terraform-basic.spec.d.ts +1 -0
  520. package/dist/tests/unit/cli/scan-command-e2e-terraform-basic.spec.js +62 -0
  521. package/dist/tests/unit/cli/scan-command-e2e-ts-sample.spec.d.ts +1 -0
  522. package/dist/tests/unit/cli/scan-command-e2e-ts-sample.spec.js +41 -0
  523. package/dist/tests/unit/cli/scan-command-e2e-ts-sentry-route-env.spec.d.ts +1 -0
  524. package/dist/tests/unit/cli/scan-command-e2e-ts-sentry-route-env.spec.js +85 -0
  525. package/dist/tests/unit/cli/scan-command-exit-code.spec.d.ts +1 -0
  526. package/dist/tests/unit/cli/scan-command-exit-code.spec.js +131 -0
  527. package/dist/tests/unit/cli/scan-quota-flow.spec.d.ts +1 -0
  528. package/dist/tests/unit/cli/scan-quota-flow.spec.js +76 -0
  529. package/dist/tests/unit/config/property-detection-config.spec.d.ts +1 -0
  530. package/dist/tests/unit/config/property-detection-config.spec.js +38 -0
  531. package/dist/tests/unit/config/redact.spec.d.ts +1 -0
  532. package/dist/tests/unit/config/redact.spec.js +19 -0
  533. package/dist/tests/unit/config/resolve-config.spec.d.ts +1 -0
  534. package/dist/tests/unit/config/resolve-config.spec.js +172 -0
  535. package/dist/tests/unit/config/scan-env-debug.spec.d.ts +1 -0
  536. package/dist/tests/unit/config/scan-env-debug.spec.js +17 -0
  537. package/dist/tests/unit/config/validate-scan-ai.spec.d.ts +1 -0
  538. package/dist/tests/unit/config/validate-scan-ai.spec.js +53 -0
  539. package/dist/tests/unit/core/classifier-phase-regressions.spec.d.ts +1 -0
  540. package/dist/tests/unit/core/classifier-phase-regressions.spec.js +68 -0
  541. package/dist/tests/unit/core/dependency-manifest-performance-budgets.spec.d.ts +1 -0
  542. package/dist/tests/unit/core/dependency-manifest-performance-budgets.spec.js +66 -0
  543. package/dist/tests/unit/core/dependency-manifest-toggles-confidence.spec.d.ts +1 -0
  544. package/dist/tests/unit/core/dependency-manifest-toggles-confidence.spec.js +132 -0
  545. package/dist/tests/unit/core/discover-service-sections.spec.d.ts +1 -0
  546. package/dist/tests/unit/core/discover-service-sections.spec.js +204 -0
  547. package/dist/tests/unit/core/graph-mapping.spec.d.ts +1 -0
  548. package/dist/tests/unit/core/graph-mapping.spec.js +779 -0
  549. package/dist/tests/unit/core/invariant-tests-dedupe-determinism.spec.d.ts +1 -0
  550. package/dist/tests/unit/core/invariant-tests-dedupe-determinism.spec.js +64 -0
  551. package/dist/tests/unit/core/manifest-package-hub.spec.d.ts +1 -0
  552. package/dist/tests/unit/core/manifest-package-hub.spec.js +53 -0
  553. package/dist/tests/unit/core/monorepo-package-sections.spec.d.ts +1 -0
  554. package/dist/tests/unit/core/monorepo-package-sections.spec.js +121 -0
  555. package/dist/tests/unit/core/no-source-code-leakage.spec.d.ts +1 -0
  556. package/dist/tests/unit/core/no-source-code-leakage.spec.js +48 -0
  557. package/dist/tests/unit/core/orchestrator.spec.d.ts +1 -0
  558. package/dist/tests/unit/core/orchestrator.spec.js +252 -0
  559. package/dist/tests/unit/core/output-json.spec.d.ts +1 -0
  560. package/dist/tests/unit/core/output-json.spec.js +65 -0
  561. package/dist/tests/unit/core/parsing-error-handling-nonfatal.spec.d.ts +1 -0
  562. package/dist/tests/unit/core/parsing-error-handling-nonfatal.spec.js +42 -0
  563. package/dist/tests/unit/core/resolve-path-under-scan-root.spec.d.ts +1 -0
  564. package/dist/tests/unit/core/resolve-path-under-scan-root.spec.js +54 -0
  565. package/dist/tests/unit/core/scan-result-language-stats.spec.d.ts +1 -0
  566. package/dist/tests/unit/core/scan-result-language-stats.spec.js +15 -0
  567. package/dist/tests/unit/core/section-discovery-excludes.spec.d.ts +1 -0
  568. package/dist/tests/unit/core/section-discovery-excludes.spec.js +49 -0
  569. package/dist/tests/unit/core/section-runtime.spec.d.ts +1 -0
  570. package/dist/tests/unit/core/section-runtime.spec.js +166 -0
  571. package/dist/tests/unit/core/stable-component-ids.spec.d.ts +1 -0
  572. package/dist/tests/unit/core/stable-component-ids.spec.js +112 -0
  573. package/dist/tests/unit/core/structural-scan.spec.d.ts +1 -0
  574. package/dist/tests/unit/core/structural-scan.spec.js +83 -0
  575. package/dist/tests/unit/core/terraform-json-overlay.spec.d.ts +1 -0
  576. package/dist/tests/unit/core/terraform-json-overlay.spec.js +36 -0
  577. package/dist/tests/unit/core/terraform-minimal-services.spec.d.ts +1 -0
  578. package/dist/tests/unit/core/terraform-minimal-services.spec.js +378 -0
  579. package/dist/tests/unit/data-flow/application-hub.spec.d.ts +1 -0
  580. package/dist/tests/unit/data-flow/application-hub.spec.js +48 -0
  581. package/dist/tests/unit/data-flow/cross-section-terraform-bridge.spec.d.ts +1 -0
  582. package/dist/tests/unit/data-flow/cross-section-terraform-bridge.spec.js +95 -0
  583. package/dist/tests/unit/data-flow/dedupe.spec.d.ts +1 -0
  584. package/dist/tests/unit/data-flow/dedupe.spec.js +134 -0
  585. package/dist/tests/unit/data-flow/detector.spec.d.ts +1 -0
  586. package/dist/tests/unit/data-flow/detector.spec.js +1254 -0
  587. package/dist/tests/unit/data-flow/drop-cross-section-flows.spec.d.ts +1 -0
  588. package/dist/tests/unit/data-flow/drop-cross-section-flows.spec.js +132 -0
  589. package/dist/tests/unit/data-flow/ensure-actor-flow.spec.d.ts +1 -0
  590. package/dist/tests/unit/data-flow/ensure-actor-flow.spec.js +233 -0
  591. package/dist/tests/unit/data-flow/ensure-manifest-declared-flows.spec.d.ts +1 -0
  592. package/dist/tests/unit/data-flow/ensure-manifest-declared-flows.spec.js +125 -0
  593. package/dist/tests/unit/data-flow/ensure-section-api-flows.spec.d.ts +1 -0
  594. package/dist/tests/unit/data-flow/ensure-section-api-flows.spec.js +40 -0
  595. package/dist/tests/unit/data-flow/postprocess.spec.d.ts +1 -0
  596. package/dist/tests/unit/data-flow/postprocess.spec.js +78 -0
  597. package/dist/tests/unit/data-flow/rewire.spec.d.ts +1 -0
  598. package/dist/tests/unit/data-flow/rewire.spec.js +194 -0
  599. package/dist/tests/unit/data-flow/terraform-flows.spec.d.ts +1 -0
  600. package/dist/tests/unit/data-flow/terraform-flows.spec.js +199 -0
  601. package/dist/tests/unit/evals/metrics.spec.d.ts +1 -0
  602. package/dist/tests/unit/evals/metrics.spec.js +54 -0
  603. package/dist/tests/unit/ingest/env-exclusion.spec.d.ts +1 -0
  604. package/dist/tests/unit/ingest/env-exclusion.spec.js +43 -0
  605. package/dist/tests/unit/ingest/file-system.spec.d.ts +1 -0
  606. package/dist/tests/unit/ingest/file-system.spec.js +180 -0
  607. package/dist/tests/unit/ingest/gitignore.spec.d.ts +1 -0
  608. package/dist/tests/unit/ingest/gitignore.spec.js +30 -0
  609. package/dist/tests/unit/observability/scan-sentry.spec.d.ts +1 -0
  610. package/dist/tests/unit/observability/scan-sentry.spec.js +60 -0
  611. package/dist/tests/unit/patterns/scan-exclusions.spec.d.ts +1 -0
  612. package/dist/tests/unit/patterns/scan-exclusions.spec.js +58 -0
  613. package/dist/tests/unit/pipeline/ai-orchestrator-options.spec.d.ts +1 -0
  614. package/dist/tests/unit/pipeline/ai-orchestrator-options.spec.js +19 -0
  615. package/dist/tests/unit/platform-api/dataparade-api-base-url.spec.d.ts +1 -0
  616. package/dist/tests/unit/platform-api/dataparade-api-base-url.spec.js +19 -0
  617. package/dist/tests/unit/platform-api/estimate-scan-footprint.spec.d.ts +1 -0
  618. package/dist/tests/unit/platform-api/estimate-scan-footprint.spec.js +50 -0
  619. package/dist/tests/unit/tracing/langsmith-tracing.spec.d.ts +1 -0
  620. package/dist/tests/unit/tracing/langsmith-tracing.spec.js +118 -0
  621. package/package.json +84 -0
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.postprocessDataFlows = postprocessDataFlows;
4
+ const dedupe_1 = require("./dedupe");
5
+ const rewire_1 = require("./rewire");
6
+ const drop_cross_section_flows_1 = require("./drop-cross-section-flows");
7
+ const ensure_actor_flow_1 = require("./ensure-actor-flow");
8
+ const ensure_manifest_declared_flows_1 = require("./ensure-manifest-declared-flows");
9
+ const ensure_section_api_flows_1 = require("./ensure-section-api-flows");
10
+ function getSectionId(component) {
11
+ const sid = component?.properties?.section_id;
12
+ return typeof sid === "string" ? sid : "";
13
+ }
14
+ function isMainApp(component) {
15
+ return (component?.type === "asset" &&
16
+ (component.properties?.isMainApplication === true ||
17
+ component.properties?.isMainApplication === "true"));
18
+ }
19
+ function isSectionApiNode(component) {
20
+ return (component?.type === "asset" &&
21
+ component?.subType === "api" &&
22
+ (component.properties?.isSectionApiNode === true ||
23
+ component.properties?.isSectionApiNode === "true"));
24
+ }
25
+ function collapseSectionApiDuplicateOutboundFlows(components, flows) {
26
+ const componentById = new Map(components.map((c) => [c.id, c]));
27
+ const hasMainOutbound = new Set();
28
+ for (const flow of flows) {
29
+ const source = componentById.get(flow.sourceComponentId);
30
+ if (!isMainApp(source))
31
+ continue;
32
+ const sid = getSectionId(source);
33
+ if (!sid)
34
+ continue;
35
+ hasMainOutbound.add(`${sid}::${flow.targetComponentId}::${flow.type}`);
36
+ }
37
+ return flows.filter((flow) => {
38
+ const source = componentById.get(flow.sourceComponentId);
39
+ if (!isSectionApiNode(source))
40
+ return true;
41
+ const sid = getSectionId(source);
42
+ if (!sid)
43
+ return true;
44
+ const key = `${sid}::${flow.targetComponentId}::${flow.type}`;
45
+ return !hasMainOutbound.has(key);
46
+ });
47
+ }
48
+ /**
49
+ * Applies structural post-processing to raw detected data flows:
50
+ * - structural deduplication
51
+ * - rewiring actor → infra flows through the main application
52
+ * - ensuring at least one actor → app flow per section
53
+ */
54
+ function postprocessDataFlows(components, flows) {
55
+ const deduped = (0, dedupe_1.dedupeDataFlows)(flows);
56
+ const rewired = (0, rewire_1.rewireFlowsThroughApplication)(components, deduped);
57
+ const withoutApiDuplicates = collapseSectionApiDuplicateOutboundFlows(components, rewired);
58
+ const withActor = (0, ensure_actor_flow_1.ensureActorToAppFlow)(components, withoutApiDuplicates);
59
+ const withTerraform = (0, ensure_actor_flow_1.ensureInjectedProjectMainToTerraformProviderHub)(components, withActor);
60
+ const withManifest = (0, ensure_manifest_declared_flows_1.ensureManifestDeclaredThirdPartyFlows)(components, withTerraform);
61
+ const withSectionApis = (0, ensure_section_api_flows_1.ensureMainToUnlinkedSectionApiFlows)(components, withManifest);
62
+ return (0, drop_cross_section_flows_1.dropCrossSectionServiceFlows)(components, withSectionApis);
63
+ }
@@ -0,0 +1,10 @@
1
+ import type { DetectedComponent } from "../core/types/component";
2
+ import type { DetectedDataFlow } from "../core/types/data-flow";
3
+ /**
4
+ * Rewires data flows so that actor → (asset | third_party) edges go through the
5
+ * main Application node: actor → Application and Application → target.
6
+ * Flows that already involve the Application or are not actor→infra are unchanged.
7
+ * Call this after flow detection and dedupe so the emitted dataflow.json reflects
8
+ * the desired topology (actors → Application → databases / third parties).
9
+ */
10
+ export declare function rewireFlowsThroughApplication(components: DetectedComponent[], flows: DetectedDataFlow[]): DetectedDataFlow[];
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rewireFlowsThroughApplication = rewireFlowsThroughApplication;
4
+ const terraform_flows_1 = require("./terraform-flows");
5
+ const application_hub_1 = require("./application-hub");
6
+ const application_injection_1 = require("../classifier/application-injection");
7
+ function resolveSyntheticMainTerraformEdgeTarget(componentById, components, appId, originalTargetId) {
8
+ const app = componentById.get(appId);
9
+ const target = componentById.get(originalTargetId);
10
+ if (!app || app.properties?.sourceContext !== application_injection_1.INJECTED_PROJECT_PLACEHOLDER_SOURCE_CONTEXT) {
11
+ return originalTargetId;
12
+ }
13
+ if (!target ||
14
+ target.type !== "asset" ||
15
+ typeof target.properties?.terraform_address !== "string" ||
16
+ !target.properties.terraform_address.trim()) {
17
+ return originalTargetId;
18
+ }
19
+ const prov = (0, terraform_flows_1.findTerraformProviderForResourceAsset)(components, target);
20
+ if (!prov || prov.id === originalTargetId)
21
+ return originalTargetId;
22
+ return prov.id;
23
+ }
24
+ /**
25
+ * Rewires data flows so that actor → (asset | third_party) edges go through the
26
+ * main Application node: actor → Application and Application → target.
27
+ * Flows that already involve the Application or are not actor→infra are unchanged.
28
+ * Call this after flow detection and dedupe so the emitted dataflow.json reflects
29
+ * the desired topology (actors → Application → databases / third parties).
30
+ */
31
+ function rewireFlowsThroughApplication(components, flows) {
32
+ const defaultApp = (0, application_hub_1.findApplicationHubForFlows)(components);
33
+ if (!defaultApp)
34
+ return flows;
35
+ const componentById = new Map(components.map((c) => [c.id, c]));
36
+ const result = [];
37
+ const infraTargetsNeedingAppEdgeByAppId = new Map();
38
+ let syntheticIndex = 0;
39
+ for (const flow of flows) {
40
+ const sourceComp = componentById.get(flow.sourceComponentId);
41
+ const targetComp = componentById.get(flow.targetComponentId);
42
+ if (!sourceComp || !targetComp) {
43
+ result.push(flow);
44
+ continue;
45
+ }
46
+ const isActorSource = sourceComp.type === "actor";
47
+ const isInfraTarget = targetComp.type === "asset" || targetComp.type === "third_party";
48
+ if (isActorSource && isInfraTarget) {
49
+ // This branch becomes reachable only when actor→infra edges exist.
50
+ // Choose the right app for the actor's section.
51
+ const actorSectionId = String(sourceComp.properties?.section_id ?? "");
52
+ const app = (0, application_hub_1.findApplicationHubForFlows)(components, actorSectionId) ?? defaultApp;
53
+ if (flow.targetComponentId !== app.id) {
54
+ result.push({
55
+ ...flow,
56
+ targetComponentId: app.id,
57
+ });
58
+ const set = infraTargetsNeedingAppEdgeByAppId.get(app.id) ?? new Set();
59
+ set.add(flow.targetComponentId);
60
+ infraTargetsNeedingAppEdgeByAppId.set(app.id, set);
61
+ }
62
+ else {
63
+ result.push(flow);
64
+ }
65
+ }
66
+ else {
67
+ result.push(flow);
68
+ }
69
+ }
70
+ const existingApiCallOutKeys = new Set(result
71
+ .filter((f) => f.type === "api_call")
72
+ .map((f) => `${f.sourceComponentId}\t${f.targetComponentId}\t${f.type}`));
73
+ const stableInfraTargetsEntries = Array.from(infraTargetsNeedingAppEdgeByAppId.entries()).sort(([a], [b]) => a.localeCompare(b));
74
+ for (const [appId, targetIds] of stableInfraTargetsEntries) {
75
+ const stableTargetIds = Array.from(targetIds).sort((a, b) => a.localeCompare(b));
76
+ for (const targetId of stableTargetIds) {
77
+ const resolvedTargetId = resolveSyntheticMainTerraformEdgeTarget(componentById, components, appId, targetId);
78
+ const key = `${appId}\t${resolvedTargetId}\tapi_call`;
79
+ if (existingApiCallOutKeys.has(key))
80
+ continue;
81
+ existingApiCallOutKeys.add(key);
82
+ syntheticIndex += 1;
83
+ result.push({
84
+ id: `flow_app_${syntheticIndex}`,
85
+ sourceComponentId: appId,
86
+ targetComponentId: resolvedTargetId,
87
+ type: "api_call",
88
+ confidence: 0.8,
89
+ });
90
+ }
91
+ }
92
+ return result;
93
+ }
@@ -0,0 +1,8 @@
1
+ import type { DetectedComponent } from "../core/types/component";
2
+ import type { RawFinding } from "../core/types/detection";
3
+ import type { FileInfo } from "../core/types/file";
4
+ /**
5
+ * Prefer the API route asset that owns an external call
6
+ * (same file, import chain, or handler binding).
7
+ */
8
+ export declare function findSourceComponentForExternalApiCall(finding: RawFinding, components: DetectedComponent[], defaultSource: DetectedComponent, files: FileInfo[], importGraph: Map<string, Set<string>>, knownPaths: Set<string>): DetectedComponent;
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findSourceComponentForExternalApiCall = findSourceComponentForExternalApiCall;
4
+ const main_application_selection_1 = require("../classifier/main-application-selection");
5
+ const import_graph_1 = require("./import-graph");
6
+ function escapeRegExp(s) {
7
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8
+ }
9
+ function getFileContent(files, filePath) {
10
+ const n = (0, import_graph_1.normalizeProjectPath)(filePath);
11
+ const hit = files.find((f) => (0, import_graph_1.normalizeProjectPath)(f.path) === n);
12
+ return hit?.content;
13
+ }
14
+ function getRouteRegistrationAnchor(route) {
15
+ if (route.sourceLocations.length === 0)
16
+ return undefined;
17
+ const byFile = new Map();
18
+ for (const sl of route.sourceLocations) {
19
+ const f = (0, import_graph_1.normalizeProjectPath)(sl.filePath);
20
+ const arr = byFile.get(f) ?? [];
21
+ arr.push(sl.startLine);
22
+ byFile.set(f, arr);
23
+ }
24
+ const sortedFiles = [...byFile.keys()].sort((a, b) => a.localeCompare(b));
25
+ const file = sortedFiles[0];
26
+ const lines = byFile.get(file);
27
+ if (!lines?.length)
28
+ return undefined;
29
+ return { file, line: Math.min(...lines) };
30
+ }
31
+ function routeRegistrationReferencesCallFile(route, callFile, files, knownPaths) {
32
+ const anchor = getRouteRegistrationAnchor(route);
33
+ if (!anchor)
34
+ return false;
35
+ const content = getFileContent(files, anchor.file);
36
+ if (!content)
37
+ return false;
38
+ const bindings = (0, import_graph_1.parseStaticImportBindings)(anchor.file, content, knownPaths);
39
+ const normCall = (0, import_graph_1.normalizeProjectPath)(callFile);
40
+ const lines = content.split(/\r?\n/);
41
+ const startIdx = Math.max(0, anchor.line - 1);
42
+ const block = lines.slice(startIdx, startIdx + 30).join("\n");
43
+ for (const [local, resolved] of bindings) {
44
+ if ((0, import_graph_1.normalizeProjectPath)(resolved) !== normCall)
45
+ continue;
46
+ const re = new RegExp(`\\b${escapeRegExp(local)}\\s*\\(`);
47
+ if (re.test(block))
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ function findRouteContainingCallLine(callFile, callLine, apiRouteAssets) {
53
+ const nCall = (0, import_graph_1.normalizeProjectPath)(callFile);
54
+ const candidates = [];
55
+ for (const route of apiRouteAssets) {
56
+ const inFileLocs = route.sourceLocations.filter((l) => (0, import_graph_1.normalizeProjectPath)(l.filePath) === nCall);
57
+ if (inFileLocs.length === 0)
58
+ continue;
59
+ const regLine = Math.min(...inFileLocs.map((l) => l.startLine));
60
+ candidates.push({ route, regLine });
61
+ }
62
+ candidates.sort((a, b) => b.regLine - a.regLine);
63
+ for (const c of candidates) {
64
+ if (c.regLine <= callLine)
65
+ return c.route;
66
+ }
67
+ return undefined;
68
+ }
69
+ function listApiRouteAssets(components, defaultSource) {
70
+ return components.filter((c) => {
71
+ if (c.type !== "asset" || c.subType !== "api")
72
+ return false;
73
+ if (c.id === defaultSource.id)
74
+ return false;
75
+ if (c.properties?.isMainApplication === true ||
76
+ c.properties?.isMainApplication === "true") {
77
+ return false;
78
+ }
79
+ // Outbound fetch/SDK calls to vendor URLs are not in-app route surfaces; if we
80
+ // treat them like Express routes, other calls in the same file get mis-attributed.
81
+ if ((0, main_application_selection_1.isOutboundExternalHttpApiAsset)(c)) {
82
+ return false;
83
+ }
84
+ return true;
85
+ });
86
+ }
87
+ /**
88
+ * Prefer the API route asset that owns an external call
89
+ * (same file, import chain, or handler binding).
90
+ */
91
+ function findSourceComponentForExternalApiCall(finding, components, defaultSource, files, importGraph, knownPaths) {
92
+ const loc = finding.location;
93
+ if (!loc?.filePath || files.length === 0)
94
+ return defaultSource;
95
+ const callFile = (0, import_graph_1.normalizeProjectPath)(loc.filePath);
96
+ const callLine = typeof loc.startLine === "number" ? loc.startLine : 1;
97
+ const apiRouteAssets = listApiRouteAssets(components, defaultSource);
98
+ if (apiRouteAssets.length === 0)
99
+ return defaultSource;
100
+ const containing = findRouteContainingCallLine(callFile, callLine, apiRouteAssets);
101
+ if (containing)
102
+ return containing;
103
+ const scored = [];
104
+ for (const route of apiRouteAssets) {
105
+ const regFiles = [
106
+ ...new Set(route.sourceLocations.map((sl) => (0, import_graph_1.normalizeProjectPath)(sl.filePath))),
107
+ ];
108
+ if (regFiles.length === 0)
109
+ continue;
110
+ let best;
111
+ for (const reg of regFiles) {
112
+ const d = (0, import_graph_1.shortestImportDistance)(importGraph, reg, callFile);
113
+ if (d === undefined)
114
+ continue;
115
+ best = best === undefined ? d : Math.min(best, d);
116
+ }
117
+ if (best !== undefined) {
118
+ scored.push({ route, distance: best });
119
+ }
120
+ }
121
+ if (scored.length === 0)
122
+ return defaultSource;
123
+ const minD = Math.min(...scored.map((s) => s.distance));
124
+ const atMin = scored.filter((s) => s.distance === minD);
125
+ if (atMin.length === 1)
126
+ return atMin[0].route;
127
+ const referenced = atMin.filter((s) => routeRegistrationReferencesCallFile(s.route, callFile, files, knownPaths));
128
+ if (referenced.length === 1)
129
+ return referenced[0].route;
130
+ return defaultSource;
131
+ }
@@ -0,0 +1,13 @@
1
+ import type { DetectedComponent } from "../core/types/component";
2
+ import type { RawFinding } from "../core/types/detection";
3
+ export declare function getSectionIdFromFinding(finding: RawFinding): string | undefined;
4
+ export declare function getSectionIdFromComponent(component: DetectedComponent): string | undefined;
5
+ export declare function isConcreteServiceSectionId(sectionId: string | undefined): boolean;
6
+ /**
7
+ * Resolves the default "caller" component (Application) for app→DB and app→TP flows.
8
+ * Uses asset with isMainApplication, or first asset with subType api/service.
9
+ * When multiple main applications exist (per section_id), selects the one
10
+ * matching the finding's section_id.
11
+ */
12
+ export declare function findSourceComponent(components: DetectedComponent[], sectionId?: string): DetectedComponent | undefined;
13
+ export declare function findSectionApiNode(components: DetectedComponent[], sectionId?: string): DetectedComponent | undefined;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSectionIdFromFinding = getSectionIdFromFinding;
4
+ exports.getSectionIdFromComponent = getSectionIdFromComponent;
5
+ exports.isConcreteServiceSectionId = isConcreteServiceSectionId;
6
+ exports.findSourceComponent = findSourceComponent;
7
+ exports.findSectionApiNode = findSectionApiNode;
8
+ function getSectionIdFromMaybeUnknown(raw) {
9
+ if (typeof raw !== "string")
10
+ return undefined;
11
+ const v = raw.trim();
12
+ return v ? v : undefined;
13
+ }
14
+ function getSectionIdFromFinding(finding) {
15
+ return getSectionIdFromMaybeUnknown(finding.properties?.section_id);
16
+ }
17
+ function getSectionIdFromComponent(component) {
18
+ return getSectionIdFromMaybeUnknown(component.properties?.section_id);
19
+ }
20
+ function isConcreteServiceSectionId(sectionId) {
21
+ if (!sectionId)
22
+ return false;
23
+ return (sectionId !== "root" &&
24
+ sectionId !== "<unsectioned>" &&
25
+ sectionId !== "global");
26
+ }
27
+ /**
28
+ * Resolves the default "caller" component (Application) for app→DB and app→TP flows.
29
+ * Uses asset with isMainApplication, or first asset with subType api/service.
30
+ * When multiple main applications exist (per section_id), selects the one
31
+ * matching the finding's section_id.
32
+ */
33
+ function findSourceComponent(components, sectionId) {
34
+ const scoped = sectionId && sectionId.trim().length > 0
35
+ ? components.filter((c) => getSectionIdFromComponent(c) === sectionId)
36
+ : components;
37
+ const main = scoped.find((c) => c.type === "asset" &&
38
+ (c.properties?.isMainApplication === true ||
39
+ c.properties?.isMainApplication === "true"));
40
+ if (main)
41
+ return main;
42
+ const apiOrService = scoped.find((c) => c.type === "asset" && (c.subType === "api" || c.subType === "service"));
43
+ if (apiOrService)
44
+ return apiOrService;
45
+ // Fallback to global selection when the section has no candidate.
46
+ const globalMain = components.find((c) => c.type === "asset" &&
47
+ (c.properties?.isMainApplication === true ||
48
+ c.properties?.isMainApplication === "true"));
49
+ if (globalMain)
50
+ return globalMain;
51
+ return (components.find((c) => c.type === "asset" && (c.subType === "api" || c.subType === "service")) ?? components.find((c) => c.type === "asset"));
52
+ }
53
+ function findSectionApiNode(components, sectionId) {
54
+ if (!sectionId || !sectionId.trim())
55
+ return undefined;
56
+ return components.find((c) => c.type === "asset" &&
57
+ c.subType === "api" &&
58
+ getSectionIdFromComponent(c) === sectionId &&
59
+ (c.properties?.isSectionApiNode === true ||
60
+ c.properties?.isSectionApiNode === "true"));
61
+ }
@@ -0,0 +1,21 @@
1
+ import type { DetectedComponent } from "../core/types/component";
2
+ import type { RawFinding } from "../core/types/detection";
3
+ /**
4
+ * Matches a database_connection finding to an asset component by databaseType or name.
5
+ */
6
+ export declare function findTargetDatabaseComponent(finding: RawFinding, components: DetectedComponent[]): DetectedComponent | undefined;
7
+ /**
8
+ * Matches an external_api_call finding to a third_party component by serviceName,
9
+ * URL hostname / registrable domain, client, or display name.
10
+ */
11
+ export declare function findTargetThirdPartyComponent(finding: RawFinding, components: DetectedComponent[]): DetectedComponent | undefined;
12
+ /**
13
+ * Matches an express_route finding to an asset component by route name (service-to-service).
14
+ * Excludes the main application so we don't create app→app flows.
15
+ */
16
+ export declare function findTargetAssetForRoute(finding: RawFinding, components: DetectedComponent[], sourceComponent: DetectedComponent): DetectedComponent | undefined;
17
+ export declare function findMergedHttpApiSurfaceComponent(components: DetectedComponent[], sourceComponent: DetectedComponent): DetectedComponent | undefined;
18
+ /**
19
+ * Matches web_actor / service_actor finding to an actor component by name.
20
+ */
21
+ export declare function findTargetActorComponent(finding: RawFinding, components: DetectedComponent[]): DetectedComponent | undefined;
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findTargetDatabaseComponent = findTargetDatabaseComponent;
4
+ exports.findTargetThirdPartyComponent = findTargetThirdPartyComponent;
5
+ exports.findTargetAssetForRoute = findTargetAssetForRoute;
6
+ exports.findMergedHttpApiSurfaceComponent = findMergedHttpApiSurfaceComponent;
7
+ exports.findTargetActorComponent = findTargetActorComponent;
8
+ const external_url_third_party_1 = require("../classifier/external-url-third-party");
9
+ const source_resolution_1 = require("./source-resolution");
10
+ function normalizeKey(s) {
11
+ return s.trim().toLowerCase().replace(/\s+/g, " ");
12
+ }
13
+ /**
14
+ * Matches a database_connection finding to an asset component by databaseType or name.
15
+ */
16
+ function findTargetDatabaseComponent(finding, components) {
17
+ const dbType = typeof finding.properties?.databaseType === "string"
18
+ ? normalizeKey(finding.properties.databaseType)
19
+ : "";
20
+ const findingName = normalizeKey(finding.name);
21
+ const client = typeof finding.properties?.client === "string"
22
+ ? normalizeKey(finding.properties.client)
23
+ : "";
24
+ const findingSectionId = (0, source_resolution_1.getSectionIdFromFinding)(finding);
25
+ // Prefer same-section matches when multiple logical DB nodes exist.
26
+ if (findingSectionId) {
27
+ for (const c of components) {
28
+ if (c.type !== "asset")
29
+ continue;
30
+ if ((0, source_resolution_1.getSectionIdFromComponent)(c) !== findingSectionId)
31
+ continue;
32
+ const compDbType = typeof c.properties?.databaseType === "string"
33
+ ? normalizeKey(c.properties.databaseType)
34
+ : "";
35
+ const compName = normalizeKey(c.name);
36
+ if (dbType && compDbType && dbType === compDbType)
37
+ return c;
38
+ if (findingName &&
39
+ compName &&
40
+ (findingName === compName ||
41
+ compName.includes(findingName) ||
42
+ findingName.includes(compName))) {
43
+ return c;
44
+ }
45
+ if (client &&
46
+ compName &&
47
+ (client === compName || compName.includes(client) || client.includes(compName))) {
48
+ return c;
49
+ }
50
+ }
51
+ }
52
+ // For concrete service sections, do not fall back across sections.
53
+ if ((0, source_resolution_1.isConcreteServiceSectionId)(findingSectionId)) {
54
+ return undefined;
55
+ }
56
+ for (const c of components) {
57
+ if (c.type !== "asset")
58
+ continue;
59
+ const compDbType = typeof c.properties?.databaseType === "string"
60
+ ? normalizeKey(c.properties.databaseType)
61
+ : "";
62
+ const compName = normalizeKey(c.name);
63
+ if (dbType && compDbType && dbType === compDbType)
64
+ return c;
65
+ if (findingName &&
66
+ compName &&
67
+ (findingName === compName ||
68
+ compName.includes(findingName) ||
69
+ findingName.includes(compName))) {
70
+ return c;
71
+ }
72
+ if (client &&
73
+ compName &&
74
+ (client === compName || compName.includes(client) || client.includes(compName))) {
75
+ return c;
76
+ }
77
+ }
78
+ return undefined;
79
+ }
80
+ function externalFindingUrlMatchKeys(finding) {
81
+ const keys = new Set();
82
+ const urlProp = finding.properties?.url;
83
+ if (typeof urlProp === "string") {
84
+ for (const k of (0, external_url_third_party_1.urlHostMatchKeys)(urlProp)) {
85
+ keys.add(normalizeKey(k));
86
+ }
87
+ }
88
+ if (typeof finding.name === "string" &&
89
+ /^https?:\/\//i.test(finding.name.trim())) {
90
+ for (const k of (0, external_url_third_party_1.urlHostMatchKeys)(finding.name.trim())) {
91
+ keys.add(normalizeKey(k));
92
+ }
93
+ }
94
+ return keys;
95
+ }
96
+ function thirdPartyComponentUrlMatchKeys(c) {
97
+ const keys = new Set();
98
+ const p = c.properties ?? {};
99
+ for (const field of ["url", "service_url_api_endpoint"]) {
100
+ const v = p[field];
101
+ if (typeof v !== "string")
102
+ continue;
103
+ for (const k of (0, external_url_third_party_1.urlHostMatchKeys)(v)) {
104
+ keys.add(normalizeKey(k));
105
+ }
106
+ }
107
+ return keys;
108
+ }
109
+ /**
110
+ * Matches an external_api_call finding to a third_party component by serviceName,
111
+ * URL hostname / registrable domain, client, or display name.
112
+ */
113
+ function findTargetThirdPartyComponent(finding, components) {
114
+ const serviceName = typeof finding.properties?.serviceName === "string"
115
+ ? normalizeKey(finding.properties.serviceName)
116
+ : "";
117
+ const client = typeof finding.properties?.client === "string"
118
+ ? normalizeKey(finding.properties.client)
119
+ : "";
120
+ const findingName = normalizeKey(finding.name);
121
+ const findingUrlKeys = externalFindingUrlMatchKeys(finding);
122
+ const findingSectionId = (0, source_resolution_1.getSectionIdFromFinding)(finding);
123
+ if (findingSectionId) {
124
+ for (const c of components) {
125
+ if (c.type !== "third_party")
126
+ continue;
127
+ if ((0, source_resolution_1.getSectionIdFromComponent)(c) !== findingSectionId)
128
+ continue;
129
+ const compServiceName = typeof c.properties?.serviceName === "string"
130
+ ? normalizeKey(c.properties.serviceName)
131
+ : "";
132
+ const compName = normalizeKey(c.name);
133
+ if (serviceName && (compServiceName === serviceName || compName === serviceName)) {
134
+ return c;
135
+ }
136
+ if (client && (compServiceName === client || compName === client))
137
+ return c;
138
+ if (findingName && (compName === findingName || compServiceName === findingName)) {
139
+ return c;
140
+ }
141
+ if (findingUrlKeys.size > 0) {
142
+ const compUrlKeys = thirdPartyComponentUrlMatchKeys(c);
143
+ for (const fk of findingUrlKeys) {
144
+ if (compUrlKeys.has(fk))
145
+ return c;
146
+ }
147
+ if (compServiceName.length >= 4) {
148
+ for (const fk of findingUrlKeys) {
149
+ if (fk.includes(compServiceName) || compServiceName.includes(fk)) {
150
+ return c;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ if ((0, source_resolution_1.isConcreteServiceSectionId)(findingSectionId)) {
158
+ return undefined;
159
+ }
160
+ for (const c of components) {
161
+ if (c.type !== "third_party")
162
+ continue;
163
+ const compServiceName = typeof c.properties?.serviceName === "string"
164
+ ? normalizeKey(c.properties.serviceName)
165
+ : "";
166
+ const compName = normalizeKey(c.name);
167
+ if (serviceName && (compServiceName === serviceName || compName === serviceName)) {
168
+ return c;
169
+ }
170
+ if (client && (compServiceName === client || compName === client))
171
+ return c;
172
+ if (findingName && (compName === findingName || compServiceName === findingName)) {
173
+ return c;
174
+ }
175
+ if (findingUrlKeys.size > 0) {
176
+ const compUrlKeys = thirdPartyComponentUrlMatchKeys(c);
177
+ for (const fk of findingUrlKeys) {
178
+ if (compUrlKeys.has(fk))
179
+ return c;
180
+ }
181
+ if (compServiceName.length >= 4) {
182
+ for (const fk of findingUrlKeys) {
183
+ if (fk.includes(compServiceName) || compServiceName.includes(fk)) {
184
+ return c;
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ return undefined;
191
+ }
192
+ /**
193
+ * Matches an express_route finding to an asset component by route name (service-to-service).
194
+ * Excludes the main application so we don't create app→app flows.
195
+ */
196
+ function findTargetAssetForRoute(finding, components, sourceComponent) {
197
+ const routeName = normalizeKey(finding.name);
198
+ if (!routeName || routeName === "route" || routeName === "api")
199
+ return undefined;
200
+ const findingSectionId = (0, source_resolution_1.getSectionIdFromFinding)(finding);
201
+ for (const c of components) {
202
+ if (c.type !== "asset" || c.id === sourceComponent.id)
203
+ continue;
204
+ if (c.properties?.isMainApplication === true ||
205
+ c.properties?.isMainApplication === "true") {
206
+ continue;
207
+ }
208
+ if (findingSectionId && (0, source_resolution_1.getSectionIdFromComponent)(c) !== findingSectionId)
209
+ continue;
210
+ const compName = normalizeKey(c.name);
211
+ if (compName &&
212
+ (compName === routeName ||
213
+ compName.includes(routeName) ||
214
+ routeName.includes(compName))) {
215
+ return c;
216
+ }
217
+ }
218
+ return undefined;
219
+ }
220
+ /** Classifier merges express_route findings into one asset named "HTTP API". */
221
+ const MERGED_HTTP_API_SURFACE_NAME = "http api";
222
+ function findMergedHttpApiSurfaceComponent(components, sourceComponent) {
223
+ for (const c of components) {
224
+ if (c.type !== "asset" || c.id === sourceComponent.id)
225
+ continue;
226
+ if (c.subType !== "api")
227
+ continue;
228
+ if (normalizeKey(c.name) === MERGED_HTTP_API_SURFACE_NAME)
229
+ return c;
230
+ }
231
+ return undefined;
232
+ }
233
+ /**
234
+ * Matches web_actor / service_actor finding to an actor component by name.
235
+ */
236
+ function findTargetActorComponent(finding, components) {
237
+ const findingName = normalizeKey(finding.name);
238
+ const findingSectionId = (0, source_resolution_1.getSectionIdFromFinding)(finding);
239
+ for (const c of components) {
240
+ if (c.type !== "actor")
241
+ continue;
242
+ if (findingSectionId && (0, source_resolution_1.getSectionIdFromComponent)(c) !== findingSectionId)
243
+ continue;
244
+ const compName = normalizeKey(c.name);
245
+ if (compName &&
246
+ (compName === findingName ||
247
+ compName.includes(findingName) ||
248
+ findingName.includes(compName))) {
249
+ return c;
250
+ }
251
+ }
252
+ return undefined;
253
+ }