@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.
- package/LICENSE +674 -0
- package/README.md +592 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +7 -0
- package/dist/bin/load-env.d.ts +2 -0
- package/dist/bin/load-env.js +4 -0
- package/dist/src/ai-enrichment/agent-orchestrator.d.ts +28 -0
- package/dist/src/ai-enrichment/agent-orchestrator.js +476 -0
- package/dist/src/ai-enrichment/agents/index.d.ts +4 -0
- package/dist/src/ai-enrichment/agents/index.js +50 -0
- package/dist/src/ai-enrichment/candidate-selector.d.ts +10 -0
- package/dist/src/ai-enrichment/candidate-selector.js +158 -0
- package/dist/src/ai-enrichment/fallbacks.d.ts +6 -0
- package/dist/src/ai-enrichment/fallbacks.js +762 -0
- package/dist/src/ai-enrichment/index.d.ts +15 -0
- package/dist/src/ai-enrichment/index.js +31 -0
- package/dist/src/ai-enrichment/merge-rules.d.ts +12 -0
- package/dist/src/ai-enrichment/merge-rules.js +321 -0
- package/dist/src/ai-enrichment/non-pii-signal-rules.d.ts +10 -0
- package/dist/src/ai-enrichment/non-pii-signal-rules.js +72 -0
- package/dist/src/ai-enrichment/openai-proposals-response.schema.d.ts +94 -0
- package/dist/src/ai-enrichment/openai-proposals-response.schema.js +82 -0
- package/dist/src/ai-enrichment/pii-signal-rules.d.ts +8 -0
- package/dist/src/ai-enrichment/pii-signal-rules.js +68 -0
- package/dist/src/ai-enrichment/pipeline.d.ts +2 -0
- package/dist/src/ai-enrichment/pipeline.js +48 -0
- package/dist/src/ai-enrichment/planner.d.ts +2 -0
- package/dist/src/ai-enrichment/planner.js +60 -0
- package/dist/src/ai-enrichment/prompts/provider-enrichment-prompts.d.ts +12 -0
- package/dist/src/ai-enrichment/prompts/provider-enrichment-prompts.js +45 -0
- package/dist/src/ai-enrichment/provider-prompt.d.ts +32 -0
- package/dist/src/ai-enrichment/provider-prompt.js +222 -0
- package/dist/src/ai-enrichment/provider-topology-rules.d.ts +52 -0
- package/dist/src/ai-enrichment/provider-topology-rules.js +190 -0
- package/dist/src/ai-enrichment/provider-topology-shared.d.ts +48 -0
- package/dist/src/ai-enrichment/provider-topology-shared.js +329 -0
- package/dist/src/ai-enrichment/providers/endpoint-resolution.d.ts +13 -0
- package/dist/src/ai-enrichment/providers/endpoint-resolution.js +41 -0
- package/dist/src/ai-enrichment/providers/families/chat-completions-family.d.ts +13 -0
- package/dist/src/ai-enrichment/providers/families/chat-completions-family.js +181 -0
- package/dist/src/ai-enrichment/providers/families/generate-content-family.d.ts +10 -0
- package/dist/src/ai-enrichment/providers/families/generate-content-family.js +93 -0
- package/dist/src/ai-enrichment/providers/families/messages-family.d.ts +10 -0
- package/dist/src/ai-enrichment/providers/families/messages-family.js +86 -0
- package/dist/src/ai-enrichment/providers/families/ollama-generate-family.d.ts +10 -0
- package/dist/src/ai-enrichment/providers/families/ollama-generate-family.js +69 -0
- package/dist/src/ai-enrichment/providers/fetch-with-timeout.d.ts +2 -0
- package/dist/src/ai-enrichment/providers/fetch-with-timeout.js +22 -0
- package/dist/src/ai-enrichment/providers/index.d.ts +16 -0
- package/dist/src/ai-enrichment/providers/index.js +40 -0
- package/dist/src/ai-enrichment/providers/mock.d.ts +5 -0
- package/dist/src/ai-enrichment/providers/mock.js +12 -0
- package/dist/src/ai-enrichment/providers/platform-proxy-provider.d.ts +20 -0
- package/dist/src/ai-enrichment/providers/platform-proxy-provider.js +116 -0
- package/dist/src/ai-enrichment/providers/presets.d.ts +14 -0
- package/dist/src/ai-enrichment/providers/presets.js +50 -0
- package/dist/src/ai-enrichment/providers/provider-contract.d.ts +20 -0
- package/dist/src/ai-enrichment/providers/provider-contract.js +703 -0
- package/dist/src/ai-enrichment/providers/provider-json-parse.d.ts +23 -0
- package/dist/src/ai-enrichment/providers/provider-json-parse.js +96 -0
- package/dist/src/ai-enrichment/providers/provider-output-token-budget.d.ts +5 -0
- package/dist/src/ai-enrichment/providers/provider-output-token-budget.js +11 -0
- package/dist/src/ai-enrichment/providers/provider-pricing.d.ts +7 -0
- package/dist/src/ai-enrichment/providers/provider-pricing.js +32 -0
- package/dist/src/ai-enrichment/providers/provider-runtime.d.ts +9 -0
- package/dist/src/ai-enrichment/providers/provider-runtime.js +54 -0
- package/dist/src/ai-enrichment/providers/resolve-provider.d.ts +27 -0
- package/dist/src/ai-enrichment/providers/resolve-provider.js +41 -0
- package/dist/src/ai-enrichment/providers/types.d.ts +24 -0
- package/dist/src/ai-enrichment/providers/types.js +2 -0
- package/dist/src/ai-enrichment/scan-paths.d.ts +9 -0
- package/dist/src/ai-enrichment/scan-paths.js +28 -0
- package/dist/src/ai-enrichment/sensitive-paths.d.ts +5 -0
- package/dist/src/ai-enrichment/sensitive-paths.js +10 -0
- package/dist/src/ai-enrichment/third-party-data-flow.d.ts +27 -0
- package/dist/src/ai-enrichment/third-party-data-flow.js +518 -0
- package/dist/src/ai-enrichment/third-party-evidence.d.ts +14 -0
- package/dist/src/ai-enrichment/third-party-evidence.js +426 -0
- package/dist/src/ai-enrichment/third-party-property-matrix.d.ts +14 -0
- package/dist/src/ai-enrichment/third-party-property-matrix.js +52 -0
- package/dist/src/ai-enrichment/third-party-subtype.d.ts +14 -0
- package/dist/src/ai-enrichment/third-party-subtype.js +166 -0
- package/dist/src/ai-enrichment/tools/index.d.ts +39 -0
- package/dist/src/ai-enrichment/tools/index.js +121 -0
- package/dist/src/ai-enrichment/types.d.ts +170 -0
- package/dist/src/ai-enrichment/types.js +12 -0
- package/dist/src/analyzers/python/dependency-manifests.d.ts +8 -0
- package/dist/src/analyzers/python/dependency-manifests.js +131 -0
- package/dist/src/analyzers/python/detector.d.ts +3 -0
- package/dist/src/analyzers/python/detector.js +22 -0
- package/dist/src/analyzers/python/index.d.ts +2 -0
- package/dist/src/analyzers/python/index.js +11 -0
- package/dist/src/analyzers/python/manifest-parsers.d.ts +3 -0
- package/dist/src/analyzers/python/manifest-parsers.js +134 -0
- package/dist/src/analyzers/python/parser.d.ts +26 -0
- package/dist/src/analyzers/python/parser.js +187 -0
- package/dist/src/analyzers/python/patterns.d.ts +7 -0
- package/dist/src/analyzers/python/patterns.js +106 -0
- package/dist/src/analyzers/python/python-detection-config.d.ts +75 -0
- package/dist/src/analyzers/python/python-detection-config.js +148 -0
- package/dist/src/analyzers/registry.d.ts +13 -0
- package/dist/src/analyzers/registry.js +60 -0
- package/dist/src/analyzers/shared/manifest-budgets.d.ts +19 -0
- package/dist/src/analyzers/shared/manifest-budgets.js +21 -0
- package/dist/src/analyzers/shared/manifest-fs.d.ts +13 -0
- package/dist/src/analyzers/shared/manifest-fs.js +138 -0
- package/dist/src/analyzers/shared/property-inference.d.ts +8 -0
- package/dist/src/analyzers/shared/property-inference.js +165 -0
- package/dist/src/analyzers/terraform/detector.d.ts +10 -0
- package/dist/src/analyzers/terraform/detector.js +198 -0
- package/dist/src/analyzers/terraform/index.d.ts +2 -0
- package/dist/src/analyzers/terraform/index.js +13 -0
- package/dist/src/analyzers/terraform/parser.d.ts +29 -0
- package/dist/src/analyzers/terraform/parser.js +202 -0
- package/dist/src/analyzers/terraform/terraform-detection-config.d.ts +48 -0
- package/dist/src/analyzers/terraform/terraform-detection-config.js +218 -0
- package/dist/src/analyzers/terraform/terraform-exec.d.ts +11 -0
- package/dist/src/analyzers/terraform/terraform-exec.js +35 -0
- package/dist/src/analyzers/terraform/terraform-module-manifest.d.ts +19 -0
- package/dist/src/analyzers/terraform/terraform-module-manifest.js +75 -0
- package/dist/src/analyzers/terraform/terraform-show-json.d.ts +15 -0
- package/dist/src/analyzers/terraform/terraform-show-json.js +188 -0
- package/dist/src/analyzers/terraform/terraform-utility-resource.d.ts +12 -0
- package/dist/src/analyzers/terraform/terraform-utility-resource.js +30 -0
- package/dist/src/analyzers/types.d.ts +5 -0
- package/dist/src/analyzers/types.js +2 -0
- package/dist/src/analyzers/typescript/actor-detection.d.ts +4 -0
- package/dist/src/analyzers/typescript/actor-detection.js +15 -0
- package/dist/src/analyzers/typescript/dependency-manifests.d.ts +9 -0
- package/dist/src/analyzers/typescript/dependency-manifests.js +131 -0
- package/dist/src/analyzers/typescript/detector.d.ts +3 -0
- package/dist/src/analyzers/typescript/detector.js +23 -0
- package/dist/src/analyzers/typescript/index.d.ts +2 -0
- package/dist/src/analyzers/typescript/index.js +11 -0
- package/dist/src/analyzers/typescript/manifest-parsers.d.ts +1 -0
- package/dist/src/analyzers/typescript/manifest-parsers.js +30 -0
- package/dist/src/analyzers/typescript/parser.d.ts +44 -0
- package/dist/src/analyzers/typescript/parser.js +287 -0
- package/dist/src/analyzers/typescript/third-party-detection.d.ts +4 -0
- package/dist/src/analyzers/typescript/third-party-detection.js +16 -0
- package/dist/src/analyzers/typescript/typescript-detection-config.d.ts +68 -0
- package/dist/src/analyzers/typescript/typescript-detection-config.js +171 -0
- package/dist/src/analyzers/typescript/typescript-detection.d.ts +10 -0
- package/dist/src/analyzers/typescript/typescript-detection.js +57 -0
- package/dist/src/classifier/application-injection.d.ts +12 -0
- package/dist/src/classifier/application-injection.js +335 -0
- package/dist/src/classifier/classify.d.ts +3 -0
- package/dist/src/classifier/classify.js +15 -0
- package/dist/src/classifier/component-factory.d.ts +3 -0
- package/dist/src/classifier/component-factory.js +488 -0
- package/dist/src/classifier/config.d.ts +38 -0
- package/dist/src/classifier/config.js +260 -0
- package/dist/src/classifier/enhance-defaults.d.ts +28 -0
- package/dist/src/classifier/enhance-defaults.js +369 -0
- package/dist/src/classifier/enhance.d.ts +13 -0
- package/dist/src/classifier/enhance.js +295 -0
- package/dist/src/classifier/external-url-third-party.d.ts +26 -0
- package/dist/src/classifier/external-url-third-party.js +195 -0
- package/dist/src/classifier/grouping.d.ts +1 -0
- package/dist/src/classifier/grouping.js +2 -0
- package/dist/src/classifier/main-application-selection.d.ts +41 -0
- package/dist/src/classifier/main-application-selection.js +222 -0
- package/dist/src/classifier/naming.d.ts +4 -0
- package/dist/src/classifier/naming.js +78 -0
- package/dist/src/classifier/postprocessing.d.ts +12 -0
- package/dist/src/classifier/postprocessing.js +510 -0
- package/dist/src/classifier/sectioning.d.ts +5 -0
- package/dist/src/classifier/sectioning.js +60 -0
- package/dist/src/classifier/terraform-provider-hub.d.ts +6 -0
- package/dist/src/classifier/terraform-provider-hub.js +38 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +498 -0
- package/dist/src/config/actor-detection-config.d.ts +21 -0
- package/dist/src/config/actor-detection-config.js +97 -0
- package/dist/src/config/env.d.ts +2 -0
- package/dist/src/config/env.js +75 -0
- package/dist/src/config/file.d.ts +6 -0
- package/dist/src/config/file.js +74 -0
- package/dist/src/config/inference-scope.d.ts +2 -0
- package/dist/src/config/inference-scope.js +15 -0
- package/dist/src/config/load-cli-env.d.ts +1 -0
- package/dist/src/config/load-cli-env.js +54 -0
- package/dist/src/config/normalize-ai-provider.d.ts +5 -0
- package/dist/src/config/normalize-ai-provider.js +18 -0
- package/dist/src/config/property-detection-config.d.ts +27 -0
- package/dist/src/config/property-detection-config.js +355 -0
- package/dist/src/config/redact.d.ts +3 -0
- package/dist/src/config/redact.js +14 -0
- package/dist/src/config/resolve.d.ts +15 -0
- package/dist/src/config/resolve.js +361 -0
- package/dist/src/config/scan-env.d.ts +7 -0
- package/dist/src/config/scan-env.js +38 -0
- package/dist/src/config/third-party-detection-config.d.ts +25 -0
- package/dist/src/config/third-party-detection-config.js +97 -0
- package/dist/src/config/types.d.ts +106 -0
- package/dist/src/config/types.js +2 -0
- package/dist/src/config/validate-scan-ai.d.ts +3 -0
- package/dist/src/config/validate-scan-ai.js +33 -0
- package/dist/src/core/pipeline/ai-orchestrator-options.d.ts +6 -0
- package/dist/src/core/pipeline/ai-orchestrator-options.js +46 -0
- package/dist/src/core/pipeline/classifier-phase.d.ts +7 -0
- package/dist/src/core/pipeline/classifier-phase.js +78 -0
- package/dist/src/core/pipeline/dataflow-phase.d.ts +7 -0
- package/dist/src/core/pipeline/dataflow-phase.js +10 -0
- package/dist/src/core/pipeline/diagram-layout/app-section-layout.d.ts +7 -0
- package/dist/src/core/pipeline/diagram-layout/app-section-layout.js +74 -0
- package/dist/src/core/pipeline/diagram-layout/constants.d.ts +11 -0
- package/dist/src/core/pipeline/diagram-layout/constants.js +14 -0
- package/dist/src/core/pipeline/diagram-layout/edge-handles.d.ts +3 -0
- package/dist/src/core/pipeline/diagram-layout/edge-handles.js +26 -0
- package/dist/src/core/pipeline/diagram-layout/managed-provider-layout.d.ts +3 -0
- package/dist/src/core/pipeline/diagram-layout/managed-provider-layout.js +40 -0
- package/dist/src/core/pipeline/diagram-layout/minimal-terraform-layout.d.ts +6 -0
- package/dist/src/core/pipeline/diagram-layout/minimal-terraform-layout.js +53 -0
- package/dist/src/core/pipeline/diagram-layout/section-helpers.d.ts +30 -0
- package/dist/src/core/pipeline/diagram-layout/section-helpers.js +62 -0
- package/dist/src/core/pipeline/diagram-layout/terraform-lane-layout.d.ts +3 -0
- package/dist/src/core/pipeline/diagram-layout/terraform-lane-layout.js +109 -0
- package/dist/src/core/pipeline/diagram-layout/types.d.ts +2 -0
- package/dist/src/core/pipeline/diagram-layout/types.js +2 -0
- package/dist/src/core/pipeline/graph-mapping.d.ts +6 -0
- package/dist/src/core/pipeline/graph-mapping.js +308 -0
- package/dist/src/core/pipeline/mixed-app-terraform-scan.d.ts +13 -0
- package/dist/src/core/pipeline/mixed-app-terraform-scan.js +81 -0
- package/dist/src/core/pipeline/orchestrator-result.d.ts +6 -0
- package/dist/src/core/pipeline/orchestrator-result.js +2 -0
- package/dist/src/core/pipeline/orchestrator.d.ts +26 -0
- package/dist/src/core/pipeline/orchestrator.js +79 -0
- package/dist/src/core/pipeline/resolve-path-under-scan-root.d.ts +7 -0
- package/dist/src/core/pipeline/resolve-path-under-scan-root.js +55 -0
- package/dist/src/core/pipeline/scan-pipeline.d.ts +6 -0
- package/dist/src/core/pipeline/scan-pipeline.js +364 -0
- package/dist/src/core/pipeline/sorting.d.ts +3 -0
- package/dist/src/core/pipeline/sorting.js +48 -0
- package/dist/src/core/pipeline/stable-component-ids.d.ts +15 -0
- package/dist/src/core/pipeline/stable-component-ids.js +68 -0
- package/dist/src/core/pipeline/structural-scan.d.ts +19 -0
- package/dist/src/core/pipeline/structural-scan.js +304 -0
- package/dist/src/core/pipeline/terraform-flow-utils.d.ts +6 -0
- package/dist/src/core/pipeline/terraform-flow-utils.js +32 -0
- package/dist/src/core/pipeline/terraform-minimal-services.d.ts +31 -0
- package/dist/src/core/pipeline/terraform-minimal-services.js +225 -0
- package/dist/src/core/schema/dataflow-wrapper.schema.d.ts +83 -0
- package/dist/src/core/schema/dataflow-wrapper.schema.js +40 -0
- package/dist/src/core/schema/diagram-graph.schema.d.ts +93 -0
- package/dist/src/core/schema/diagram-graph.schema.js +55 -0
- package/dist/src/core/schema/index.d.ts +4 -0
- package/dist/src/core/schema/index.js +20 -0
- package/dist/src/core/schema/scan-config.schema.d.ts +66 -0
- package/dist/src/core/schema/scan-config.schema.js +67 -0
- package/dist/src/core/schema/scan-result.schema.d.ts +450 -0
- package/dist/src/core/schema/scan-result.schema.js +236 -0
- package/dist/src/core/sectioning/discover-service-sections.d.ts +80 -0
- package/dist/src/core/sectioning/discover-service-sections.js +468 -0
- package/dist/src/core/sectioning/section-runtime.d.ts +21 -0
- package/dist/src/core/sectioning/section-runtime.js +148 -0
- package/dist/src/core/terraform/component-predicates.d.ts +13 -0
- package/dist/src/core/terraform/component-predicates.js +71 -0
- package/dist/src/core/types/component.d.ts +18 -0
- package/dist/src/core/types/component.js +2 -0
- package/dist/src/core/types/config.d.ts +57 -0
- package/dist/src/core/types/config.js +2 -0
- package/dist/src/core/types/data-flow.d.ts +24 -0
- package/dist/src/core/types/data-flow.js +2 -0
- package/dist/src/core/types/detection.d.ts +12 -0
- package/dist/src/core/types/detection.js +19 -0
- package/dist/src/core/types/file.d.ts +14 -0
- package/dist/src/core/types/file.js +2 -0
- package/dist/src/core/types/index.d.ts +7 -0
- package/dist/src/core/types/index.js +23 -0
- package/dist/src/core/types/progress.d.ts +9 -0
- package/dist/src/core/types/progress.js +2 -0
- package/dist/src/core/types/result.d.ts +140 -0
- package/dist/src/core/types/result.js +2 -0
- package/dist/src/data-flow/application-hub.d.ts +7 -0
- package/dist/src/data-flow/application-hub.js +88 -0
- package/dist/src/data-flow/dedupe.d.ts +7 -0
- package/dist/src/data-flow/dedupe.js +92 -0
- package/dist/src/data-flow/detect.d.ts +16 -0
- package/dist/src/data-flow/detect.js +203 -0
- package/dist/src/data-flow/detector.d.ts +15 -0
- package/dist/src/data-flow/detector.js +18 -0
- package/dist/src/data-flow/drop-cross-section-flows.d.ts +8 -0
- package/dist/src/data-flow/drop-cross-section-flows.js +32 -0
- package/dist/src/data-flow/ensure-actor-flow.d.ts +16 -0
- package/dist/src/data-flow/ensure-actor-flow.js +101 -0
- package/dist/src/data-flow/ensure-manifest-declared-flows.d.ts +14 -0
- package/dist/src/data-flow/ensure-manifest-declared-flows.js +76 -0
- package/dist/src/data-flow/ensure-section-api-flows.d.ts +6 -0
- package/dist/src/data-flow/ensure-section-api-flows.js +57 -0
- package/dist/src/data-flow/flow-builder.d.ts +5 -0
- package/dist/src/data-flow/flow-builder.js +80 -0
- package/dist/src/data-flow/import-graph.d.ts +10 -0
- package/dist/src/data-flow/import-graph.js +147 -0
- package/dist/src/data-flow/index.d.ts +8 -0
- package/dist/src/data-flow/index.js +20 -0
- package/dist/src/data-flow/internal-fetch.d.ts +8 -0
- package/dist/src/data-flow/internal-fetch.js +209 -0
- package/dist/src/data-flow/postprocess.d.ts +9 -0
- package/dist/src/data-flow/postprocess.js +63 -0
- package/dist/src/data-flow/rewire.d.ts +10 -0
- package/dist/src/data-flow/rewire.js +93 -0
- package/dist/src/data-flow/source-attribution.d.ts +8 -0
- package/dist/src/data-flow/source-attribution.js +131 -0
- package/dist/src/data-flow/source-resolution.d.ts +13 -0
- package/dist/src/data-flow/source-resolution.js +61 -0
- package/dist/src/data-flow/target-matching.d.ts +21 -0
- package/dist/src/data-flow/target-matching.js +253 -0
- package/dist/src/data-flow/terraform-flows.d.ts +32 -0
- package/dist/src/data-flow/terraform-flows.js +170 -0
- package/dist/src/evals/metrics.d.ts +18 -0
- package/dist/src/evals/metrics.js +58 -0
- package/dist/src/evals/run-model-matrix.d.ts +1 -0
- package/dist/src/evals/run-model-matrix.js +68 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +20 -0
- package/dist/src/ingest/file-system.d.ts +17 -0
- package/dist/src/ingest/file-system.js +239 -0
- package/dist/src/ingest/gitignore.d.ts +12 -0
- package/dist/src/ingest/gitignore.js +127 -0
- package/dist/src/ingest/sensitive-paths.d.ts +2 -0
- package/dist/src/ingest/sensitive-paths.js +8 -0
- package/dist/src/observability/scan-sentry.d.ts +20 -0
- package/dist/src/observability/scan-sentry.js +133 -0
- package/dist/src/output/json.d.ts +51 -0
- package/dist/src/output/json.js +59 -0
- package/dist/src/patterns/config.d.ts +22 -0
- package/dist/src/patterns/config.js +119 -0
- package/dist/src/patterns/detectors/helpers.d.ts +19 -0
- package/dist/src/patterns/detectors/helpers.js +68 -0
- package/dist/src/patterns/detectors/python.d.ts +8 -0
- package/dist/src/patterns/detectors/python.js +412 -0
- package/dist/src/patterns/detectors/typescript.d.ts +8 -0
- package/dist/src/patterns/detectors/typescript.js +328 -0
- package/dist/src/patterns/engine.d.ts +40 -0
- package/dist/src/patterns/engine.js +111 -0
- package/dist/src/patterns/flow-source-patterns.d.ts +6 -0
- package/dist/src/patterns/flow-source-patterns.js +39 -0
- package/dist/src/patterns/frontend-frameworks.d.ts +4 -0
- package/dist/src/patterns/frontend-frameworks.js +25 -0
- package/dist/src/patterns/scan-exclusions.d.ts +14 -0
- package/dist/src/patterns/scan-exclusions.js +76 -0
- package/dist/src/platform-api/dataparade-api-base-url.d.ts +8 -0
- package/dist/src/platform-api/dataparade-api-base-url.js +17 -0
- package/dist/src/platform-api/estimate-scan-footprint.d.ts +8 -0
- package/dist/src/platform-api/estimate-scan-footprint.js +120 -0
- package/dist/src/platform-api/scan-quota-client.d.ts +28 -0
- package/dist/src/platform-api/scan-quota-client.js +79 -0
- package/dist/src/tracing/langsmith-tracing.d.ts +37 -0
- package/dist/src/tracing/langsmith-tracing.js +171 -0
- package/dist/tests/cli/cli.spec.d.ts +1 -0
- package/dist/tests/cli/cli.spec.js +87 -0
- package/dist/tests/fixtures/e2e-ts-sample/db-client-import.d.ts +2 -0
- package/dist/tests/fixtures/e2e-ts-sample/db-client-import.js +8 -0
- package/dist/tests/fixtures/e2e-ts-sample/db.d.ts +3 -0
- package/dist/tests/fixtures/e2e-ts-sample/db.js +7 -0
- package/dist/tests/fixtures/e2e-ts-sample/external-api.d.ts +1 -0
- package/dist/tests/fixtures/e2e-ts-sample/external-api.js +18 -0
- package/dist/tests/fixtures/e2e-ts-sample/pg-client.d.ts +3 -0
- package/dist/tests/fixtures/e2e-ts-sample/pg-client.js +7 -0
- package/dist/tests/fixtures/e2e-ts-sample/server.d.ts +14 -0
- package/dist/tests/fixtures/e2e-ts-sample/server.js +4 -0
- package/dist/tests/fixtures/e2e-ts-sentry-route-env/server.d.ts +1 -0
- package/dist/tests/fixtures/e2e-ts-sentry-route-env/server.js +24 -0
- package/dist/tests/fixtures/ingest-basic/src/index.d.ts +1 -0
- package/dist/tests/fixtures/ingest-basic/src/index.js +6 -0
- package/dist/tests/fixtures/mixed-language-basic/api.d.ts +2 -0
- package/dist/tests/fixtures/mixed-language-basic/api.js +12 -0
- package/dist/tests/fixtures/monorepo-app-plus-terraform/packages/app/app/route.d.ts +1 -0
- package/dist/tests/fixtures/monorepo-app-plus-terraform/packages/app/app/route.js +6 -0
- package/dist/tests/fixtures/monorepo-front-back-sections/backend/app/route.d.ts +1 -0
- package/dist/tests/fixtures/monorepo-front-back-sections/backend/app/route.js +6 -0
- package/dist/tests/fixtures/monorepo-front-back-sections/frontend/app/route.d.ts +1 -0
- package/dist/tests/fixtures/monorepo-front-back-sections/frontend/app/route.js +7 -0
- package/dist/tests/fixtures/typescript-basic/app/route.d.ts +1 -0
- package/dist/tests/fixtures/typescript-basic/app/route.js +7 -0
- package/dist/tests/fixtures/typescript-basic/db-client-import.d.ts +2 -0
- package/dist/tests/fixtures/typescript-basic/db-client-import.js +8 -0
- package/dist/tests/fixtures/typescript-basic/db.d.ts +3 -0
- package/dist/tests/fixtures/typescript-basic/db.js +7 -0
- package/dist/tests/fixtures/typescript-basic/external-api.d.ts +1 -0
- package/dist/tests/fixtures/typescript-basic/external-api.js +18 -0
- package/dist/tests/fixtures/typescript-basic/pg-client.d.ts +3 -0
- package/dist/tests/fixtures/typescript-basic/pg-client.js +7 -0
- package/dist/tests/fixtures/typescript-basic/server.d.ts +14 -0
- package/dist/tests/fixtures/typescript-basic/server.js +4 -0
- package/dist/tests/fixtures/typescript-dependency-manifests-basic/src/index.d.ts +0 -0
- package/dist/tests/fixtures/typescript-dependency-manifests-basic/src/index.js +2 -0
- package/dist/tests/helpers/scan-result-builders.d.ts +2 -0
- package/dist/tests/helpers/scan-result-builders.js +15 -0
- package/dist/tests/schema/dataflow-wrapper.schema.spec.d.ts +1 -0
- package/dist/tests/schema/dataflow-wrapper.schema.spec.js +89 -0
- package/dist/tests/schema/diagram-graph.schema.spec.d.ts +1 -0
- package/dist/tests/schema/diagram-graph.schema.spec.js +48 -0
- package/dist/tests/schema/scan-config.schema.spec.d.ts +1 -0
- package/dist/tests/schema/scan-config.schema.spec.js +135 -0
- package/dist/tests/schema/scan-result.schema.spec.d.ts +1 -0
- package/dist/tests/schema/scan-result.schema.spec.js +177 -0
- package/dist/tests/unit/ai-enrichment/agent-orchestrator.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/agent-orchestrator.spec.js +483 -0
- package/dist/tests/unit/ai-enrichment/candidate-selector.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/candidate-selector.spec.js +106 -0
- package/dist/tests/unit/ai-enrichment/create-ai-provider.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/create-ai-provider.spec.js +32 -0
- package/dist/tests/unit/ai-enrichment/endpoint-resolution.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/endpoint-resolution.spec.js +47 -0
- package/dist/tests/unit/ai-enrichment/fallbacks.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/fallbacks.spec.js +1304 -0
- package/dist/tests/unit/ai-enrichment/families/chat-completions-family.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/families/chat-completions-family.spec.js +219 -0
- package/dist/tests/unit/ai-enrichment/families/generate-content-family.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/families/generate-content-family.spec.js +119 -0
- package/dist/tests/unit/ai-enrichment/families/messages-family.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/families/messages-family.spec.js +129 -0
- package/dist/tests/unit/ai-enrichment/families/ollama-generate-family.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/families/ollama-generate-family.spec.js +69 -0
- package/dist/tests/unit/ai-enrichment/merge-rules.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/merge-rules.spec.js +422 -0
- package/dist/tests/unit/ai-enrichment/openai-proposals-response.schema.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/openai-proposals-response.schema.spec.js +30 -0
- package/dist/tests/unit/ai-enrichment/pipeline.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/pipeline.spec.js +120 -0
- package/dist/tests/unit/ai-enrichment/planner.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/planner.spec.js +106 -0
- package/dist/tests/unit/ai-enrichment/platform-proxy-provider.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/platform-proxy-provider.spec.js +51 -0
- package/dist/tests/unit/ai-enrichment/provider-contract.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/provider-contract.spec.js +244 -0
- package/dist/tests/unit/ai-enrichment/provider-json-parse.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/provider-json-parse.spec.js +24 -0
- package/dist/tests/unit/ai-enrichment/provider-output-token-budget.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/provider-output-token-budget.spec.js +15 -0
- package/dist/tests/unit/ai-enrichment/provider-prompt-env.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/provider-prompt-env.spec.js +54 -0
- package/dist/tests/unit/ai-enrichment/provider-prompt.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/provider-prompt.spec.js +206 -0
- package/dist/tests/unit/ai-enrichment/provider-topology-terraform-aws.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/provider-topology-terraform-aws.spec.js +43 -0
- package/dist/tests/unit/ai-enrichment/provider-topology-terraform-kubernetes.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/provider-topology-terraform-kubernetes.spec.js +40 -0
- package/dist/tests/unit/ai-enrichment/providers/fetch-with-timeout.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/providers/fetch-with-timeout.spec.js +22 -0
- package/dist/tests/unit/ai-enrichment/resolve-provider.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/resolve-provider.spec.js +67 -0
- package/dist/tests/unit/ai-enrichment/scan-paths-exact.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/scan-paths-exact.spec.js +35 -0
- package/dist/tests/unit/ai-enrichment/scan-paths.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/scan-paths.spec.js +21 -0
- package/dist/tests/unit/ai-enrichment/sensitive-paths.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/sensitive-paths.spec.js +20 -0
- package/dist/tests/unit/ai-enrichment/third-party-data-flow.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/third-party-data-flow.spec.js +963 -0
- package/dist/tests/unit/ai-enrichment/third-party-evidence.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/third-party-evidence.spec.js +117 -0
- package/dist/tests/unit/ai-enrichment/third-party-subtype.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/third-party-subtype.spec.js +45 -0
- package/dist/tests/unit/ai-enrichment/tools-validation.spec.d.ts +1 -0
- package/dist/tests/unit/ai-enrichment/tools-validation.spec.js +66 -0
- package/dist/tests/unit/analyzers/python/parser.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/python/parser.spec.js +104 -0
- package/dist/tests/unit/analyzers/python/patterns.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/python/patterns.spec.js +289 -0
- package/dist/tests/unit/analyzers/registry.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/registry.spec.js +234 -0
- package/dist/tests/unit/analyzers/terraform/classifier-subtype-parity.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform/classifier-subtype-parity.spec.js +87 -0
- package/dist/tests/unit/analyzers/terraform/detector.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform/detector.spec.js +110 -0
- package/dist/tests/unit/analyzers/terraform/generated-provider-hints.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform/generated-provider-hints.spec.js +53 -0
- package/dist/tests/unit/analyzers/terraform/parser.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform/parser.spec.js +56 -0
- package/dist/tests/unit/analyzers/terraform/terraform-module-manifest.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform/terraform-module-manifest.spec.js +63 -0
- package/dist/tests/unit/analyzers/terraform/terraform-utility-resource.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform/terraform-utility-resource.spec.js +19 -0
- package/dist/tests/unit/analyzers/terraform-exec.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform-exec.spec.js +27 -0
- package/dist/tests/unit/analyzers/terraform-show-json.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/terraform-show-json.spec.js +77 -0
- package/dist/tests/unit/analyzers/typescript/dependency-manifests.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/dependency-manifests.spec.js +61 -0
- package/dist/tests/unit/analyzers/typescript/detector.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/detector.spec.js +225 -0
- package/dist/tests/unit/analyzers/typescript/external-apis-auth0.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/external-apis-auth0.spec.js +49 -0
- package/dist/tests/unit/analyzers/typescript/external-apis-sentry.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/external-apis-sentry.spec.js +27 -0
- package/dist/tests/unit/analyzers/typescript/fixture-integration.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/fixture-integration.spec.js +64 -0
- package/dist/tests/unit/analyzers/typescript/parser.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/parser.spec.js +99 -0
- package/dist/tests/unit/analyzers/typescript/pattern-config.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/pattern-config.spec.js +24 -0
- package/dist/tests/unit/analyzers/typescript/property-detection.spec.d.ts +1 -0
- package/dist/tests/unit/analyzers/typescript/property-detection.spec.js +138 -0
- package/dist/tests/unit/classifier/classify.spec.d.ts +1 -0
- package/dist/tests/unit/classifier/classify.spec.js +1453 -0
- package/dist/tests/unit/classifier/enhance.spec.d.ts +1 -0
- package/dist/tests/unit/classifier/enhance.spec.js +400 -0
- package/dist/tests/unit/classifier/external-url-third-party.spec.d.ts +1 -0
- package/dist/tests/unit/classifier/external-url-third-party.spec.js +83 -0
- package/dist/tests/unit/classifier/frontend-framework-grouping.spec.d.ts +1 -0
- package/dist/tests/unit/classifier/frontend-framework-grouping.spec.js +44 -0
- package/dist/tests/unit/classifier/terraform-grouping.spec.d.ts +1 -0
- package/dist/tests/unit/classifier/terraform-grouping.spec.js +96 -0
- package/dist/tests/unit/cli/config-command.spec.d.ts +1 -0
- package/dist/tests/unit/cli/config-command.spec.js +51 -0
- package/dist/tests/unit/cli/scan-command-ai-flags.spec.d.ts +0 -0
- package/dist/tests/unit/cli/scan-command-ai-flags.spec.js +149 -0
- package/dist/tests/unit/cli/scan-command-diagram-graph.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-diagram-graph.spec.js +26 -0
- package/dist/tests/unit/cli/scan-command-e2e-monorepo-app-plus-terraform.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-e2e-monorepo-app-plus-terraform.spec.js +107 -0
- package/dist/tests/unit/cli/scan-command-e2e-monorepo-front-back-sections.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-e2e-monorepo-front-back-sections.spec.js +74 -0
- package/dist/tests/unit/cli/scan-command-e2e-python-basic.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-e2e-python-basic.spec.js +43 -0
- package/dist/tests/unit/cli/scan-command-e2e-terraform-basic.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-e2e-terraform-basic.spec.js +62 -0
- package/dist/tests/unit/cli/scan-command-e2e-ts-sample.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-e2e-ts-sample.spec.js +41 -0
- package/dist/tests/unit/cli/scan-command-e2e-ts-sentry-route-env.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-e2e-ts-sentry-route-env.spec.js +85 -0
- package/dist/tests/unit/cli/scan-command-exit-code.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-command-exit-code.spec.js +131 -0
- package/dist/tests/unit/cli/scan-quota-flow.spec.d.ts +1 -0
- package/dist/tests/unit/cli/scan-quota-flow.spec.js +76 -0
- package/dist/tests/unit/config/property-detection-config.spec.d.ts +1 -0
- package/dist/tests/unit/config/property-detection-config.spec.js +38 -0
- package/dist/tests/unit/config/redact.spec.d.ts +1 -0
- package/dist/tests/unit/config/redact.spec.js +19 -0
- package/dist/tests/unit/config/resolve-config.spec.d.ts +1 -0
- package/dist/tests/unit/config/resolve-config.spec.js +172 -0
- package/dist/tests/unit/config/scan-env-debug.spec.d.ts +1 -0
- package/dist/tests/unit/config/scan-env-debug.spec.js +17 -0
- package/dist/tests/unit/config/validate-scan-ai.spec.d.ts +1 -0
- package/dist/tests/unit/config/validate-scan-ai.spec.js +53 -0
- package/dist/tests/unit/core/classifier-phase-regressions.spec.d.ts +1 -0
- package/dist/tests/unit/core/classifier-phase-regressions.spec.js +68 -0
- package/dist/tests/unit/core/dependency-manifest-performance-budgets.spec.d.ts +1 -0
- package/dist/tests/unit/core/dependency-manifest-performance-budgets.spec.js +66 -0
- package/dist/tests/unit/core/dependency-manifest-toggles-confidence.spec.d.ts +1 -0
- package/dist/tests/unit/core/dependency-manifest-toggles-confidence.spec.js +132 -0
- package/dist/tests/unit/core/discover-service-sections.spec.d.ts +1 -0
- package/dist/tests/unit/core/discover-service-sections.spec.js +204 -0
- package/dist/tests/unit/core/graph-mapping.spec.d.ts +1 -0
- package/dist/tests/unit/core/graph-mapping.spec.js +779 -0
- package/dist/tests/unit/core/invariant-tests-dedupe-determinism.spec.d.ts +1 -0
- package/dist/tests/unit/core/invariant-tests-dedupe-determinism.spec.js +64 -0
- package/dist/tests/unit/core/manifest-package-hub.spec.d.ts +1 -0
- package/dist/tests/unit/core/manifest-package-hub.spec.js +53 -0
- package/dist/tests/unit/core/monorepo-package-sections.spec.d.ts +1 -0
- package/dist/tests/unit/core/monorepo-package-sections.spec.js +121 -0
- package/dist/tests/unit/core/no-source-code-leakage.spec.d.ts +1 -0
- package/dist/tests/unit/core/no-source-code-leakage.spec.js +48 -0
- package/dist/tests/unit/core/orchestrator.spec.d.ts +1 -0
- package/dist/tests/unit/core/orchestrator.spec.js +252 -0
- package/dist/tests/unit/core/output-json.spec.d.ts +1 -0
- package/dist/tests/unit/core/output-json.spec.js +65 -0
- package/dist/tests/unit/core/parsing-error-handling-nonfatal.spec.d.ts +1 -0
- package/dist/tests/unit/core/parsing-error-handling-nonfatal.spec.js +42 -0
- package/dist/tests/unit/core/resolve-path-under-scan-root.spec.d.ts +1 -0
- package/dist/tests/unit/core/resolve-path-under-scan-root.spec.js +54 -0
- package/dist/tests/unit/core/scan-result-language-stats.spec.d.ts +1 -0
- package/dist/tests/unit/core/scan-result-language-stats.spec.js +15 -0
- package/dist/tests/unit/core/section-discovery-excludes.spec.d.ts +1 -0
- package/dist/tests/unit/core/section-discovery-excludes.spec.js +49 -0
- package/dist/tests/unit/core/section-runtime.spec.d.ts +1 -0
- package/dist/tests/unit/core/section-runtime.spec.js +166 -0
- package/dist/tests/unit/core/stable-component-ids.spec.d.ts +1 -0
- package/dist/tests/unit/core/stable-component-ids.spec.js +112 -0
- package/dist/tests/unit/core/structural-scan.spec.d.ts +1 -0
- package/dist/tests/unit/core/structural-scan.spec.js +83 -0
- package/dist/tests/unit/core/terraform-json-overlay.spec.d.ts +1 -0
- package/dist/tests/unit/core/terraform-json-overlay.spec.js +36 -0
- package/dist/tests/unit/core/terraform-minimal-services.spec.d.ts +1 -0
- package/dist/tests/unit/core/terraform-minimal-services.spec.js +378 -0
- package/dist/tests/unit/data-flow/application-hub.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/application-hub.spec.js +48 -0
- package/dist/tests/unit/data-flow/cross-section-terraform-bridge.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/cross-section-terraform-bridge.spec.js +95 -0
- package/dist/tests/unit/data-flow/dedupe.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/dedupe.spec.js +134 -0
- package/dist/tests/unit/data-flow/detector.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/detector.spec.js +1254 -0
- package/dist/tests/unit/data-flow/drop-cross-section-flows.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/drop-cross-section-flows.spec.js +132 -0
- package/dist/tests/unit/data-flow/ensure-actor-flow.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/ensure-actor-flow.spec.js +233 -0
- package/dist/tests/unit/data-flow/ensure-manifest-declared-flows.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/ensure-manifest-declared-flows.spec.js +125 -0
- package/dist/tests/unit/data-flow/ensure-section-api-flows.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/ensure-section-api-flows.spec.js +40 -0
- package/dist/tests/unit/data-flow/postprocess.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/postprocess.spec.js +78 -0
- package/dist/tests/unit/data-flow/rewire.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/rewire.spec.js +194 -0
- package/dist/tests/unit/data-flow/terraform-flows.spec.d.ts +1 -0
- package/dist/tests/unit/data-flow/terraform-flows.spec.js +199 -0
- package/dist/tests/unit/evals/metrics.spec.d.ts +1 -0
- package/dist/tests/unit/evals/metrics.spec.js +54 -0
- package/dist/tests/unit/ingest/env-exclusion.spec.d.ts +1 -0
- package/dist/tests/unit/ingest/env-exclusion.spec.js +43 -0
- package/dist/tests/unit/ingest/file-system.spec.d.ts +1 -0
- package/dist/tests/unit/ingest/file-system.spec.js +180 -0
- package/dist/tests/unit/ingest/gitignore.spec.d.ts +1 -0
- package/dist/tests/unit/ingest/gitignore.spec.js +30 -0
- package/dist/tests/unit/observability/scan-sentry.spec.d.ts +1 -0
- package/dist/tests/unit/observability/scan-sentry.spec.js +60 -0
- package/dist/tests/unit/patterns/scan-exclusions.spec.d.ts +1 -0
- package/dist/tests/unit/patterns/scan-exclusions.spec.js +58 -0
- package/dist/tests/unit/pipeline/ai-orchestrator-options.spec.d.ts +1 -0
- package/dist/tests/unit/pipeline/ai-orchestrator-options.spec.js +19 -0
- package/dist/tests/unit/platform-api/dataparade-api-base-url.spec.d.ts +1 -0
- package/dist/tests/unit/platform-api/dataparade-api-base-url.spec.js +19 -0
- package/dist/tests/unit/platform-api/estimate-scan-footprint.spec.d.ts +1 -0
- package/dist/tests/unit/platform-api/estimate-scan-footprint.spec.js +50 -0
- package/dist/tests/unit/tracing/langsmith-tracing.spec.d.ts +1 -0
- package/dist/tests/unit/tracing/langsmith-tracing.spec.js +118 -0
- package/package.json +84 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findApplicationHubForFlows = findApplicationHubForFlows;
|
|
4
|
+
const application_injection_1 = require("../classifier/application-injection");
|
|
5
|
+
const terraform_provider_hub_1 = require("../classifier/terraform-provider-hub");
|
|
6
|
+
const section_runtime_1 = require("../core/sectioning/section-runtime");
|
|
7
|
+
/**
|
|
8
|
+
* PaaS "application" resources (e.g. `heroku_app`) are Terraform hosting shells,
|
|
9
|
+
* not the user-facing codebase. Prefer a real app/API main when one exists so
|
|
10
|
+
* actor rewiring does not land on infra nodes.
|
|
11
|
+
*/
|
|
12
|
+
function isTerraformPaaSApplicationResource(component) {
|
|
13
|
+
if (component.type !== "asset")
|
|
14
|
+
return false;
|
|
15
|
+
const rt = component.properties?.resource_type;
|
|
16
|
+
if (typeof rt !== "string" || !rt.trim())
|
|
17
|
+
return false;
|
|
18
|
+
return rt === "heroku_app";
|
|
19
|
+
}
|
|
20
|
+
function isPreferredMainApplicationAsset(component) {
|
|
21
|
+
if (component.type !== "asset")
|
|
22
|
+
return false;
|
|
23
|
+
const main = component.properties?.isMainApplication === true ||
|
|
24
|
+
component.properties?.isMainApplication === "true";
|
|
25
|
+
if (!main)
|
|
26
|
+
return false;
|
|
27
|
+
return !isTerraformPaaSApplicationResource(component);
|
|
28
|
+
}
|
|
29
|
+
function isAnyMainApplicationAsset(component) {
|
|
30
|
+
if (component.type !== "asset")
|
|
31
|
+
return false;
|
|
32
|
+
return (component.properties?.isMainApplication === true ||
|
|
33
|
+
component.properties?.isMainApplication === "true");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolves the "application hub" used for actor→hub flows and actor→infra
|
|
37
|
+
* rewiring. Prefers explicit main apps, then api/service assets, then a
|
|
38
|
+
* Terraform cloud provider node when the scan is infrastructure-only.
|
|
39
|
+
*/
|
|
40
|
+
function findApplicationHubForFlows(components, sectionId) {
|
|
41
|
+
const concreteSection = (0, section_runtime_1.isConcreteServiceSectionId)(sectionId);
|
|
42
|
+
const scoped = sectionId && sectionId.trim().length > 0
|
|
43
|
+
? components.filter((c) => String(c.properties?.section_id ?? "") === sectionId)
|
|
44
|
+
: components;
|
|
45
|
+
const injectedMainInScoped = scoped.find((c) => c.type === "asset" &&
|
|
46
|
+
(c.properties?.isMainApplication === true ||
|
|
47
|
+
c.properties?.isMainApplication === "true") &&
|
|
48
|
+
c.properties?.sourceContext === application_injection_1.INJECTED_PROJECT_PLACEHOLDER_SOURCE_CONTEXT);
|
|
49
|
+
if (injectedMainInScoped)
|
|
50
|
+
return injectedMainInScoped;
|
|
51
|
+
const mainPreferredScoped = scoped.find(isPreferredMainApplicationAsset);
|
|
52
|
+
if (mainPreferredScoped)
|
|
53
|
+
return mainPreferredScoped;
|
|
54
|
+
const apiOrServiceInScoped = scoped.find((c) => c.type === "asset" &&
|
|
55
|
+
(c.subType === "api" || c.subType === "service"));
|
|
56
|
+
if (apiOrServiceInScoped)
|
|
57
|
+
return apiOrServiceInScoped;
|
|
58
|
+
if (!concreteSection) {
|
|
59
|
+
const globalMainPreferred = components.find(isPreferredMainApplicationAsset);
|
|
60
|
+
if (globalMainPreferred)
|
|
61
|
+
return globalMainPreferred;
|
|
62
|
+
}
|
|
63
|
+
const mainScopedAny = scoped.find(isAnyMainApplicationAsset);
|
|
64
|
+
if (mainScopedAny)
|
|
65
|
+
return mainScopedAny;
|
|
66
|
+
const tfScoped = (0, terraform_provider_hub_1.findTerraformPrimaryProviderHub)(components, sectionId);
|
|
67
|
+
if (tfScoped)
|
|
68
|
+
return tfScoped;
|
|
69
|
+
if (!concreteSection) {
|
|
70
|
+
const globalInjectedMain = components.find((c) => c.type === "asset" &&
|
|
71
|
+
(c.properties?.isMainApplication === true ||
|
|
72
|
+
c.properties?.isMainApplication === "true") &&
|
|
73
|
+
c.properties?.sourceContext === application_injection_1.INJECTED_PROJECT_PLACEHOLDER_SOURCE_CONTEXT);
|
|
74
|
+
if (globalInjectedMain)
|
|
75
|
+
return globalInjectedMain;
|
|
76
|
+
const globalMainAny = components.find(isAnyMainApplicationAsset);
|
|
77
|
+
if (globalMainAny)
|
|
78
|
+
return globalMainAny;
|
|
79
|
+
const globalApiOrService = components.find((c) => c.type === "asset" && (c.subType === "api" || c.subType === "service"));
|
|
80
|
+
if (globalApiOrService)
|
|
81
|
+
return globalApiOrService;
|
|
82
|
+
const tfGlobal = (0, terraform_provider_hub_1.findTerraformPrimaryProviderHub)(components);
|
|
83
|
+
if (tfGlobal)
|
|
84
|
+
return tfGlobal;
|
|
85
|
+
return components.find((c) => c.type === "asset") ?? undefined;
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DetectedDataFlow } from "../core/types/data-flow";
|
|
2
|
+
/**
|
|
3
|
+
* Deduplicate DetectedDataFlow[] by (sourceComponentId, targetComponentId, type).
|
|
4
|
+
* Preserves the base flow's id and metadata, uses the highest confidence,
|
|
5
|
+
* and unions all contributing source locations.
|
|
6
|
+
*/
|
|
7
|
+
export declare function dedupeDataFlows(flows: DetectedDataFlow[]): DetectedDataFlow[];
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dedupeDataFlows = dedupeDataFlows;
|
|
4
|
+
function makeKey(flow) {
|
|
5
|
+
return `${flow.sourceComponentId}\t${flow.targetComponentId}\t${flow.type}`;
|
|
6
|
+
}
|
|
7
|
+
function locationsEqual(a, b) {
|
|
8
|
+
return (a.filePath === b.filePath &&
|
|
9
|
+
a.startLine === b.startLine &&
|
|
10
|
+
a.endLine === b.endLine);
|
|
11
|
+
}
|
|
12
|
+
function compareSourceLocations(a, b) {
|
|
13
|
+
const fileCmp = a.filePath.localeCompare(b.filePath);
|
|
14
|
+
if (fileCmp !== 0)
|
|
15
|
+
return fileCmp;
|
|
16
|
+
if (a.startLine !== b.startLine)
|
|
17
|
+
return a.startLine - b.startLine;
|
|
18
|
+
if (a.endLine !== b.endLine)
|
|
19
|
+
return a.endLine - b.endLine;
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
function collectUniqueSourceLocations(flows) {
|
|
23
|
+
const all = [];
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const locKey = (loc) => `${loc.filePath}:${loc.startLine}:${loc.endLine}`;
|
|
26
|
+
for (const flow of flows) {
|
|
27
|
+
if (flow.sourceLocation) {
|
|
28
|
+
const key = locKey(flow.sourceLocation);
|
|
29
|
+
if (!seen.has(key)) {
|
|
30
|
+
seen.add(key);
|
|
31
|
+
all.push(flow.sourceLocation);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (flow.sourceLocations) {
|
|
35
|
+
for (const loc of flow.sourceLocations) {
|
|
36
|
+
const key = locKey(loc);
|
|
37
|
+
if (!seen.has(key)) {
|
|
38
|
+
seen.add(key);
|
|
39
|
+
all.push(loc);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return all;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Deduplicate DetectedDataFlow[] by (sourceComponentId, targetComponentId, type).
|
|
48
|
+
* Preserves the base flow's id and metadata, uses the highest confidence,
|
|
49
|
+
* and unions all contributing source locations.
|
|
50
|
+
*/
|
|
51
|
+
function dedupeDataFlows(flows) {
|
|
52
|
+
const groups = new Map();
|
|
53
|
+
for (const flow of flows) {
|
|
54
|
+
const key = makeKey(flow);
|
|
55
|
+
const existing = groups.get(key);
|
|
56
|
+
if (existing) {
|
|
57
|
+
existing.push(flow);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
groups.set(key, [flow]);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const result = [];
|
|
64
|
+
const groupEntries = Array.from(groups.entries()).sort(([aKey], [bKey]) => aKey.localeCompare(bKey));
|
|
65
|
+
for (const [, group] of groupEntries) {
|
|
66
|
+
const maxConfidence = group.reduce((max, flow) => (flow.confidence > max ? flow.confidence : max), group[0]?.confidence ?? 0);
|
|
67
|
+
const base = [...group].sort((a, b) => {
|
|
68
|
+
// Deterministic base selection:
|
|
69
|
+
// - highest confidence
|
|
70
|
+
// - tie-break by stable id
|
|
71
|
+
if (a.confidence !== b.confidence)
|
|
72
|
+
return b.confidence - a.confidence;
|
|
73
|
+
return a.id.localeCompare(b.id);
|
|
74
|
+
})[0];
|
|
75
|
+
const allLocations = collectUniqueSourceLocations(group).sort(compareSourceLocations);
|
|
76
|
+
const primary = allLocations[0];
|
|
77
|
+
result.push({
|
|
78
|
+
...base,
|
|
79
|
+
confidence: maxConfidence,
|
|
80
|
+
sourceLocation: primary ?? base.sourceLocation,
|
|
81
|
+
sourceLocations: allLocations.length > 0 ? allLocations : base.sourceLocations,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return result.sort((a, b) => {
|
|
85
|
+
const keyA = makeKey(a);
|
|
86
|
+
const keyB = makeKey(b);
|
|
87
|
+
const cmp = keyA.localeCompare(keyB);
|
|
88
|
+
if (cmp !== 0)
|
|
89
|
+
return cmp;
|
|
90
|
+
return a.id.localeCompare(b.id);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DetectedComponent } from "../core/types/component";
|
|
2
|
+
import type { DetectedDataFlow } from "../core/types/data-flow";
|
|
3
|
+
import type { RawFinding } from "../core/types/detection";
|
|
4
|
+
import type { FileInfo } from "../core/types/file";
|
|
5
|
+
import type { ServiceSection } from "../core/sectioning/discover-service-sections";
|
|
6
|
+
/**
|
|
7
|
+
* Build raw data flows from findings/components/files.
|
|
8
|
+
*
|
|
9
|
+
* This module is intentionally orchestration-focused: heavy matching/parsing logic
|
|
10
|
+
* lives in focused helpers (`source-*`, `target-matching`, `import-graph`,
|
|
11
|
+
* `internal-fetch`, `flow-builder`).
|
|
12
|
+
*
|
|
13
|
+
* Note: structural post-processing (dedupe/rewire/ensure actor flow) is handled
|
|
14
|
+
* outside this function.
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectDataFlows(files: FileInfo[], components: DetectedComponent[], findings: RawFinding[], sections?: ServiceSection[]): DetectedDataFlow[];
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.detectDataFlows = detectDataFlows;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const flow_source_patterns_1 = require("../patterns/flow-source-patterns");
|
|
9
|
+
const flow_builder_1 = require("./flow-builder");
|
|
10
|
+
const source_resolution_1 = require("./source-resolution");
|
|
11
|
+
const import_graph_1 = require("./import-graph");
|
|
12
|
+
const source_attribution_1 = require("./source-attribution");
|
|
13
|
+
const target_matching_1 = require("./target-matching");
|
|
14
|
+
const internal_fetch_1 = require("./internal-fetch");
|
|
15
|
+
const terraform_flows_1 = require("./terraform-flows");
|
|
16
|
+
function isManifestOrNonRuntimeMetadataFile(normalizedPath) {
|
|
17
|
+
const fileName = node_path_1.default.posix.basename(normalizedPath).toLowerCase();
|
|
18
|
+
if (flow_source_patterns_1.NON_RUNTIME_METADATA_FILE_NAMES.has(fileName))
|
|
19
|
+
return true;
|
|
20
|
+
return flow_source_patterns_1.NON_RUNTIME_METADATA_EXTENSIONS.some((ext) => fileName.endsWith(ext));
|
|
21
|
+
}
|
|
22
|
+
function isClearlyFrontendRuntimeFile(normalizedPath) {
|
|
23
|
+
const p = normalizedPath.toLowerCase();
|
|
24
|
+
if (p.includes("/app/api/"))
|
|
25
|
+
return false;
|
|
26
|
+
if (flow_source_patterns_1.FRONTEND_RUNTIME_PATH_MARKERS.some((marker) => p.includes(marker)))
|
|
27
|
+
return true;
|
|
28
|
+
return flow_source_patterns_1.FRONTEND_RUNTIME_FILE_EXTENSIONS.some((ext) => p.endsWith(ext));
|
|
29
|
+
}
|
|
30
|
+
function isLikelyRouteHandlerFile(normalizedPath) {
|
|
31
|
+
const p = normalizedPath.toLowerCase();
|
|
32
|
+
if (flow_source_patterns_1.ROUTE_HANDLER_PATH_MARKERS.some((marker) => p.includes(marker)))
|
|
33
|
+
return true;
|
|
34
|
+
return flow_source_patterns_1.ROUTE_HANDLER_FILE_SUFFIXES.some((suffix) => p.endsWith(suffix));
|
|
35
|
+
}
|
|
36
|
+
function isAuthProviderThirdParty(component) {
|
|
37
|
+
if (component.type !== "third_party")
|
|
38
|
+
return false;
|
|
39
|
+
const serviceName = component.properties?.serviceName;
|
|
40
|
+
const normalizedService = typeof serviceName === "string" ? serviceName.trim().toLowerCase() : "";
|
|
41
|
+
const normalizedName = (component.name || "").trim().toLowerCase();
|
|
42
|
+
return normalizedService.includes("auth0") || normalizedName.includes("auth0");
|
|
43
|
+
}
|
|
44
|
+
function findAuthMiddlewareTarget(finding, components) {
|
|
45
|
+
const sectionId = (0, source_resolution_1.getSectionIdFromFinding)(finding);
|
|
46
|
+
const authServiceInSection = components.find((c) => c.type === "asset" &&
|
|
47
|
+
c.subType === "auth_service" &&
|
|
48
|
+
(!sectionId || (0, source_resolution_1.getSectionIdFromComponent)(c) === sectionId));
|
|
49
|
+
if (authServiceInSection)
|
|
50
|
+
return authServiceInSection;
|
|
51
|
+
const authThirdPartyInSection = components.find((c) => isAuthProviderThirdParty(c) &&
|
|
52
|
+
(!sectionId || (0, source_resolution_1.getSectionIdFromComponent)(c) === sectionId));
|
|
53
|
+
if (authThirdPartyInSection)
|
|
54
|
+
return authThirdPartyInSection;
|
|
55
|
+
// For concrete section-scoped findings, avoid cross-section fallback.
|
|
56
|
+
if ((0, source_resolution_1.isConcreteServiceSectionId)(sectionId)) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return (components.find((c) => c.type === "asset" && c.subType === "auth_service") ??
|
|
60
|
+
components.find((c) => isAuthProviderThirdParty(c)));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Build raw data flows from findings/components/files.
|
|
64
|
+
*
|
|
65
|
+
* This module is intentionally orchestration-focused: heavy matching/parsing logic
|
|
66
|
+
* lives in focused helpers (`source-*`, `target-matching`, `import-graph`,
|
|
67
|
+
* `internal-fetch`, `flow-builder`).
|
|
68
|
+
*
|
|
69
|
+
* Note: structural post-processing (dedupe/rewire/ensure actor flow) is handled
|
|
70
|
+
* outside this function.
|
|
71
|
+
*/
|
|
72
|
+
function detectDataFlows(files, components, findings, sections) {
|
|
73
|
+
const defaultSource = (0, source_resolution_1.findSourceComponent)(components);
|
|
74
|
+
if (!defaultSource)
|
|
75
|
+
return [];
|
|
76
|
+
const sourceBySectionId = new Map();
|
|
77
|
+
const getSourceForFinding = (finding) => {
|
|
78
|
+
const findingSectionId = (0, source_resolution_1.getSectionIdFromFinding)(finding);
|
|
79
|
+
const key = findingSectionId ?? "__global__";
|
|
80
|
+
if (sourceBySectionId.has(key)) {
|
|
81
|
+
return sourceBySectionId.get(key) ?? defaultSource;
|
|
82
|
+
}
|
|
83
|
+
const resolved = (0, source_resolution_1.findSourceComponent)(components, findingSectionId);
|
|
84
|
+
sourceBySectionId.set(key, resolved);
|
|
85
|
+
return resolved ?? defaultSource;
|
|
86
|
+
};
|
|
87
|
+
const hasFiles = files.length > 0;
|
|
88
|
+
const knownPaths = hasFiles ? (0, import_graph_1.buildKnownPathsSet)(files) : new Set();
|
|
89
|
+
const importGraph = hasFiles
|
|
90
|
+
? (0, import_graph_1.buildImportAdjacency)(files, knownPaths)
|
|
91
|
+
: new Map();
|
|
92
|
+
const flows = [];
|
|
93
|
+
let flowIndex = 0;
|
|
94
|
+
for (const finding of findings) {
|
|
95
|
+
const sourceComponent = getSourceForFinding(finding);
|
|
96
|
+
const findingSectionId = (0, source_resolution_1.getSectionIdFromFinding)(finding);
|
|
97
|
+
const sectionApiSource = (0, source_resolution_1.findSectionApiNode)(components, findingSectionId) ?? sourceComponent;
|
|
98
|
+
if (finding.pattern === "database_connection") {
|
|
99
|
+
const target = (0, target_matching_1.findTargetDatabaseComponent)(finding, components);
|
|
100
|
+
if (target) {
|
|
101
|
+
const flow = (0, flow_builder_1.buildFlow)(sourceComponent.id, target.id, "database_query", finding, ++flowIndex, sourceComponent, target);
|
|
102
|
+
flows.push(flow);
|
|
103
|
+
}
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (finding.pattern === "external_api_call") {
|
|
107
|
+
const target = (0, target_matching_1.findTargetThirdPartyComponent)(finding, components);
|
|
108
|
+
if (target) {
|
|
109
|
+
const normalizedFindingPath = (0, import_graph_1.normalizeProjectPath)(finding.location?.filePath ?? "");
|
|
110
|
+
if (normalizedFindingPath &&
|
|
111
|
+
isManifestOrNonRuntimeMetadataFile(normalizedFindingPath)) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
let flowSource = (0, source_attribution_1.findSourceComponentForExternalApiCall)(finding, components, sourceComponent, files, importGraph, knownPaths);
|
|
115
|
+
if (sectionApiSource && sectionApiSource.id !== sourceComponent.id) {
|
|
116
|
+
if (isClearlyFrontendRuntimeFile(normalizedFindingPath)) {
|
|
117
|
+
flowSource = sourceComponent;
|
|
118
|
+
}
|
|
119
|
+
else if (isLikelyRouteHandlerFile(normalizedFindingPath) ||
|
|
120
|
+
flowSource.id === sourceComponent.id) {
|
|
121
|
+
// Prefer API source for backend/route evidence or ambiguous
|
|
122
|
+
// non-frontend sources.
|
|
123
|
+
flowSource = sectionApiSource;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const flowType = (0, flow_builder_1.flowTypeForExternalApi)(finding);
|
|
127
|
+
const flow = (0, flow_builder_1.buildFlow)(flowSource.id, target.id, flowType, finding, ++flowIndex, flowSource, target);
|
|
128
|
+
flows.push(flow);
|
|
129
|
+
}
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (finding.pattern === "auth_middleware") {
|
|
133
|
+
const target = findAuthMiddlewareTarget(finding, components);
|
|
134
|
+
if (target &&
|
|
135
|
+
sourceComponent &&
|
|
136
|
+
target.id !== sourceComponent.id) {
|
|
137
|
+
flows.push((0, flow_builder_1.buildFlow)(sourceComponent.id, target.id, "api_call", finding, ++flowIndex, sourceComponent, target));
|
|
138
|
+
}
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (finding.pattern === "express_route") {
|
|
142
|
+
let target = (0, target_matching_1.findTargetAssetForRoute)(finding, components, sectionApiSource);
|
|
143
|
+
if (!target) {
|
|
144
|
+
target = (0, target_matching_1.findMergedHttpApiSurfaceComponent)(components, sectionApiSource);
|
|
145
|
+
}
|
|
146
|
+
if (target) {
|
|
147
|
+
const flow = (0, flow_builder_1.buildFlow)(sectionApiSource.id, target.id, "api_call", finding, ++flowIndex, sectionApiSource, target);
|
|
148
|
+
flows.push(flow);
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (finding.pattern === "web_actor" || finding.pattern === "service_actor") {
|
|
153
|
+
const target = (0, target_matching_1.findTargetActorComponent)(finding, components);
|
|
154
|
+
if (target) {
|
|
155
|
+
const flow = (0, flow_builder_1.buildFlow)(target.id, sourceComponent.id, "api_call", finding, ++flowIndex, target, sourceComponent);
|
|
156
|
+
flows.push(flow);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const internal = (0, internal_fetch_1.detectInternalFetchCalls)(files, components, defaultSource, flowIndex, sections);
|
|
161
|
+
flows.push(...internal.flows);
|
|
162
|
+
flowIndex = internal.nextIndex;
|
|
163
|
+
const terraformAppend = (0, terraform_flows_1.appendTerraformDataFlows)(components, flowIndex);
|
|
164
|
+
flows.push(...terraformAppend.flows);
|
|
165
|
+
flowIndex = terraformAppend.nextIndex;
|
|
166
|
+
// Provider → Terraform resource edges (and managed-service topology) are
|
|
167
|
+
// applied in applyDeterministicInferenceFallbacks (same pass as TS SDK).
|
|
168
|
+
// Ensure section API nodes are visibly connected from the section main app.
|
|
169
|
+
const existingFlowKeys = new Set(flows.map((f) => `${f.sourceComponentId}::${f.targetComponentId}::${f.type}`));
|
|
170
|
+
for (const component of components) {
|
|
171
|
+
if (component.type !== "asset" ||
|
|
172
|
+
component.subType !== "api" ||
|
|
173
|
+
(component.properties?.isSectionApiNode !== true &&
|
|
174
|
+
component.properties?.isSectionApiNode !== "true")) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const sectionId = (0, source_resolution_1.getSectionIdFromComponent)(component);
|
|
178
|
+
const mainApp = components.find((c) => c.type === "asset" &&
|
|
179
|
+
(0, source_resolution_1.getSectionIdFromComponent)(c) === sectionId &&
|
|
180
|
+
(c.properties?.isMainApplication === true ||
|
|
181
|
+
c.properties?.isMainApplication === "true"));
|
|
182
|
+
if (!mainApp)
|
|
183
|
+
continue;
|
|
184
|
+
if (mainApp.id === component.id)
|
|
185
|
+
continue;
|
|
186
|
+
const key = `${mainApp.id}::${component.id}::api_call`;
|
|
187
|
+
if (existingFlowKeys.has(key))
|
|
188
|
+
continue;
|
|
189
|
+
existingFlowKeys.add(key);
|
|
190
|
+
flowIndex += 1;
|
|
191
|
+
flows.push({
|
|
192
|
+
id: `flow_${flowIndex}`,
|
|
193
|
+
sourceComponentId: mainApp.id,
|
|
194
|
+
targetComponentId: component.id,
|
|
195
|
+
type: "api_call",
|
|
196
|
+
confidence: 1,
|
|
197
|
+
targetScope: "local",
|
|
198
|
+
targetScopeConfidence: "high",
|
|
199
|
+
targetScopeReason: "main-to-section-api",
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return flows;
|
|
203
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DetectedComponent } from "../core/types/component";
|
|
2
|
+
import type { DetectedDataFlow } from "../core/types/data-flow";
|
|
3
|
+
import type { RawFinding } from "../core/types/detection";
|
|
4
|
+
import type { FileInfo } from "../core/types/file";
|
|
5
|
+
import type { ServiceSection } from "../core/sectioning/discover-service-sections";
|
|
6
|
+
/**
|
|
7
|
+
* Thin coordinator that runs raw data-flow detection followed by structural
|
|
8
|
+
* post-processing (dedupe, rewiring through the application, actor→app safety
|
|
9
|
+
* flows, etc.).
|
|
10
|
+
*
|
|
11
|
+
* Callers that need fine-grained control over raw flows vs. post-processing
|
|
12
|
+
* should import from `data-flow/detect` and `data-flow/postprocess`
|
|
13
|
+
* directly instead.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectDataFlows(files: FileInfo[], components: DetectedComponent[], findings: RawFinding[], sections?: ServiceSection[]): DetectedDataFlow[];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectDataFlows = detectDataFlows;
|
|
4
|
+
const detect_1 = require("./detect");
|
|
5
|
+
const postprocess_1 = require("./postprocess");
|
|
6
|
+
/**
|
|
7
|
+
* Thin coordinator that runs raw data-flow detection followed by structural
|
|
8
|
+
* post-processing (dedupe, rewiring through the application, actor→app safety
|
|
9
|
+
* flows, etc.).
|
|
10
|
+
*
|
|
11
|
+
* Callers that need fine-grained control over raw flows vs. post-processing
|
|
12
|
+
* should import from `data-flow/detect` and `data-flow/postprocess`
|
|
13
|
+
* directly instead.
|
|
14
|
+
*/
|
|
15
|
+
function detectDataFlows(files, components, findings, sections) {
|
|
16
|
+
const raw = (0, detect_1.detectDataFlows)(files, components, findings, sections);
|
|
17
|
+
return (0, postprocess_1.postprocessDataFlows)(components, raw);
|
|
18
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DetectedComponent } from "../core/types/component";
|
|
2
|
+
import type { DetectedDataFlow } from "../core/types/data-flow";
|
|
3
|
+
/**
|
|
4
|
+
* Drops edges between two different concrete service sections. Monorepo scans
|
|
5
|
+
* should show per-package subgraphs; synthetic bridges (e.g. app → remote TF hub)
|
|
6
|
+
* are not valid cross-section runtime flows.
|
|
7
|
+
*/
|
|
8
|
+
export declare function dropCrossSectionServiceFlows(components: DetectedComponent[], flows: DetectedDataFlow[]): DetectedDataFlow[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dropCrossSectionServiceFlows = dropCrossSectionServiceFlows;
|
|
4
|
+
const section_runtime_1 = require("../core/sectioning/section-runtime");
|
|
5
|
+
function sectionIdOf(component) {
|
|
6
|
+
const sid = component?.properties?.section_id;
|
|
7
|
+
return typeof sid === "string" ? sid.trim() : "";
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Drops edges between two different concrete service sections. Monorepo scans
|
|
11
|
+
* should show per-package subgraphs; synthetic bridges (e.g. app → remote TF hub)
|
|
12
|
+
* are not valid cross-section runtime flows.
|
|
13
|
+
*/
|
|
14
|
+
function dropCrossSectionServiceFlows(components, flows) {
|
|
15
|
+
const byId = new Map(components.map((c) => [c.id, c]));
|
|
16
|
+
return flows.filter((flow) => {
|
|
17
|
+
const source = byId.get(flow.sourceComponentId);
|
|
18
|
+
const target = byId.get(flow.targetComponentId);
|
|
19
|
+
if (!source || !target)
|
|
20
|
+
return true;
|
|
21
|
+
const sourceSection = sectionIdOf(source);
|
|
22
|
+
const targetSection = sectionIdOf(target);
|
|
23
|
+
if (!sourceSection || !targetSection || sourceSection === targetSection) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (!(0, section_runtime_1.isConcreteServiceSectionId)(sourceSection) ||
|
|
27
|
+
!(0, section_runtime_1.isConcreteServiceSectionId)(targetSection)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DetectedComponent } from "../core/types/component";
|
|
2
|
+
import type { DetectedDataFlow } from "../core/types/data-flow";
|
|
3
|
+
/**
|
|
4
|
+
* Ensures at least one flow connects an actor to the main application hub.
|
|
5
|
+
* When we have both a hub and actor(s) but no actor↔hub flow (e.g. because
|
|
6
|
+
* the actor was injected and no pattern matched), adds actor→hub from the
|
|
7
|
+
* first actor.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureActorToAppFlow(components: DetectedComponent[], flows: DetectedDataFlow[]): DetectedDataFlow[];
|
|
10
|
+
/**
|
|
11
|
+
* After {@link ensureActorToAppFlow}, the graph can have User → injected project
|
|
12
|
+
* main with no main → cloud provider edge (rewire only adds main→provider when
|
|
13
|
+
* it rewires an earlier actor→infra flow). Adds main → `provider.*` for each
|
|
14
|
+
* injected placeholder main that has a matching Terraform provider in scope.
|
|
15
|
+
*/
|
|
16
|
+
export declare function ensureInjectedProjectMainToTerraformProviderHub(components: DetectedComponent[], flows: DetectedDataFlow[]): DetectedDataFlow[];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureActorToAppFlow = ensureActorToAppFlow;
|
|
4
|
+
exports.ensureInjectedProjectMainToTerraformProviderHub = ensureInjectedProjectMainToTerraformProviderHub;
|
|
5
|
+
const application_injection_1 = require("../classifier/application-injection");
|
|
6
|
+
const terraform_provider_hub_1 = require("../classifier/terraform-provider-hub");
|
|
7
|
+
const section_runtime_1 = require("../core/sectioning/section-runtime");
|
|
8
|
+
const application_hub_1 = require("./application-hub");
|
|
9
|
+
/**
|
|
10
|
+
* Ensures at least one flow connects an actor to the main application hub.
|
|
11
|
+
* When we have both a hub and actor(s) but no actor↔hub flow (e.g. because
|
|
12
|
+
* the actor was injected and no pattern matched), adds actor→hub from the
|
|
13
|
+
* first actor.
|
|
14
|
+
*/
|
|
15
|
+
function ensureActorToAppFlow(components, flows) {
|
|
16
|
+
const actors = components.filter((c) => c.type === "actor");
|
|
17
|
+
if (actors.length === 0)
|
|
18
|
+
return flows;
|
|
19
|
+
const maxFlowNum = flows.reduce((max, f) => {
|
|
20
|
+
const m = /^flow_(\d+)$/.exec(f.id);
|
|
21
|
+
return m ? Math.max(max, Number.parseInt(m[1], 10)) : max;
|
|
22
|
+
}, 0);
|
|
23
|
+
const actorsBySection = new Map();
|
|
24
|
+
for (const actor of actors) {
|
|
25
|
+
const sectionId = String(actor.properties?.section_id ?? "");
|
|
26
|
+
const list = actorsBySection.get(sectionId);
|
|
27
|
+
if (list)
|
|
28
|
+
list.push(actor);
|
|
29
|
+
else
|
|
30
|
+
actorsBySection.set(sectionId, [actor]);
|
|
31
|
+
}
|
|
32
|
+
const synthetic = [];
|
|
33
|
+
let nextFlowNum = maxFlowNum;
|
|
34
|
+
const stableActorSectionEntries = Array.from(actorsBySection.entries()).sort(([a], [b]) => a.localeCompare(b));
|
|
35
|
+
for (const [sectionId, sectionActors] of stableActorSectionEntries) {
|
|
36
|
+
const app = (0, application_hub_1.findApplicationHubForFlows)(components, sectionId);
|
|
37
|
+
if (!app)
|
|
38
|
+
continue;
|
|
39
|
+
if (!(0, section_runtime_1.shouldInjectUserActorForMainApp)(app, components))
|
|
40
|
+
continue;
|
|
41
|
+
const appId = app.id;
|
|
42
|
+
const stableActors = [...sectionActors].sort((a, b) => a.id.localeCompare(b.id));
|
|
43
|
+
const actorIds = new Set(stableActors.map((a) => a.id));
|
|
44
|
+
const hasActorAppFlow = flows.some((f) => (actorIds.has(f.sourceComponentId) && f.targetComponentId === appId) ||
|
|
45
|
+
(actorIds.has(f.targetComponentId) && f.sourceComponentId === appId));
|
|
46
|
+
if (hasActorAppFlow)
|
|
47
|
+
continue;
|
|
48
|
+
nextFlowNum += 1;
|
|
49
|
+
synthetic.push({
|
|
50
|
+
id: `flow_${nextFlowNum}`,
|
|
51
|
+
sourceComponentId: stableActors[0].id,
|
|
52
|
+
targetComponentId: appId,
|
|
53
|
+
type: "api_call",
|
|
54
|
+
confidence: 0.5,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return synthetic.length > 0 ? [...flows, ...synthetic] : flows;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* After {@link ensureActorToAppFlow}, the graph can have User → injected project
|
|
61
|
+
* main with no main → cloud provider edge (rewire only adds main→provider when
|
|
62
|
+
* it rewires an earlier actor→infra flow). Adds main → `provider.*` for each
|
|
63
|
+
* injected placeholder main that has a matching Terraform provider in scope.
|
|
64
|
+
*/
|
|
65
|
+
function ensureInjectedProjectMainToTerraformProviderHub(components, flows) {
|
|
66
|
+
const mains = components.filter((c) => c.type === "asset" &&
|
|
67
|
+
(c.properties?.isMainApplication === true ||
|
|
68
|
+
c.properties?.isMainApplication === "true") &&
|
|
69
|
+
c.properties?.sourceContext === application_injection_1.INJECTED_PROJECT_PLACEHOLDER_SOURCE_CONTEXT);
|
|
70
|
+
if (mains.length === 0)
|
|
71
|
+
return flows;
|
|
72
|
+
const maxFlowNum = flows.reduce((max, f) => {
|
|
73
|
+
const m = /^flow_(\d+)$/.exec(f.id);
|
|
74
|
+
return m ? Math.max(max, Number.parseInt(m[1], 10)) : max;
|
|
75
|
+
}, 0);
|
|
76
|
+
let nextFlowNum = maxFlowNum;
|
|
77
|
+
const pairKeys = new Set(flows
|
|
78
|
+
.filter((f) => f.type === "api_call")
|
|
79
|
+
.map((f) => `${f.sourceComponentId}\t${f.targetComponentId}`));
|
|
80
|
+
const synthetic = [];
|
|
81
|
+
const stableMains = [...mains].sort((a, b) => a.id.localeCompare(b.id));
|
|
82
|
+
for (const main of stableMains) {
|
|
83
|
+
const sid = String(main.properties?.section_id ?? "");
|
|
84
|
+
const hub = (0, terraform_provider_hub_1.findTerraformPrimaryProviderHub)(components, sid);
|
|
85
|
+
if (!hub)
|
|
86
|
+
continue;
|
|
87
|
+
const key = `${main.id}\t${hub.id}`;
|
|
88
|
+
if (pairKeys.has(key))
|
|
89
|
+
continue;
|
|
90
|
+
pairKeys.add(key);
|
|
91
|
+
nextFlowNum += 1;
|
|
92
|
+
synthetic.push({
|
|
93
|
+
id: `flow_${nextFlowNum}`,
|
|
94
|
+
sourceComponentId: main.id,
|
|
95
|
+
targetComponentId: hub.id,
|
|
96
|
+
type: "api_call",
|
|
97
|
+
confidence: 0.72,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return synthetic.length > 0 ? [...flows, ...synthetic] : flows;
|
|
101
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DetectedComponent } from "../core/types/component";
|
|
2
|
+
import type { DetectedDataFlow } from "../core/types/data-flow";
|
|
3
|
+
/**
|
|
4
|
+
* Third parties inferred only from dependency manifests (e.g. `package.json`
|
|
5
|
+
* imports), not from runtime call sites.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isManifestOnlyThirdPartyComponent(component: DetectedComponent): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Connects each workspace package hub to third parties declared in its manifest.
|
|
10
|
+
* Runtime call sites still produce their own flows; this only fills gaps for
|
|
11
|
+
* manifest-only vendors (e.g. Anthropic listed in `package.json` but called via
|
|
12
|
+
* OpenRouter at runtime).
|
|
13
|
+
*/
|
|
14
|
+
export declare function ensureManifestDeclaredThirdPartyFlows(components: DetectedComponent[], flows: DetectedDataFlow[]): DetectedDataFlow[];
|