kirograph 0.17.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +105 -1822
- package/dist/architecture/layers/dart.d.ts +10 -0
- package/dist/architecture/layers/dart.d.ts.map +1 -0
- package/dist/architecture/layers/dart.js +112 -0
- package/dist/architecture/layers/dart.js.map +7 -0
- package/dist/architecture/layers/elixir.d.ts +6 -0
- package/dist/architecture/layers/elixir.d.ts.map +1 -0
- package/dist/architecture/layers/index.d.ts.map +1 -1
- package/dist/architecture/layers/index.js +3 -1
- package/dist/architecture/layers/index.js.map +2 -2
- package/dist/architecture/layers/ocaml.d.ts +6 -0
- package/dist/architecture/layers/ocaml.d.ts.map +1 -0
- package/dist/architecture/layers/scala.d.ts +6 -0
- package/dist/architecture/layers/scala.d.ts.map +1 -0
- package/dist/architecture/layers/solidity.d.ts +6 -0
- package/dist/architecture/layers/solidity.d.ts.map +1 -0
- package/dist/architecture/layers/vue.d.ts +6 -0
- package/dist/architecture/layers/vue.d.ts.map +1 -0
- package/dist/architecture/manifest/elm.d.ts +3 -0
- package/dist/architecture/manifest/elm.d.ts.map +1 -0
- package/dist/architecture/manifest/index.d.ts.map +1 -1
- package/dist/architecture/manifest/ocaml.d.ts +3 -0
- package/dist/architecture/manifest/ocaml.d.ts.map +1 -0
- package/dist/architecture/manifest/scala.d.ts +3 -0
- package/dist/architecture/manifest/scala.d.ts.map +1 -0
- package/dist/bin/banner.d.ts.map +1 -1
- package/dist/bin/banner.js +74 -6
- package/dist/bin/banner.js.map +2 -2
- package/dist/bin/commands/affected.d.ts.map +1 -1
- package/dist/bin/commands/attack-surface.d.ts +3 -0
- package/dist/bin/commands/attack-surface.d.ts.map +1 -0
- package/dist/bin/commands/attack-surface.js +164 -0
- package/dist/bin/commands/attack-surface.js.map +7 -0
- package/dist/bin/commands/benchmark.d.ts +9 -0
- package/dist/bin/commands/benchmark.d.ts.map +1 -0
- package/dist/bin/commands/benchmark.js +206 -0
- package/dist/bin/commands/benchmark.js.map +7 -0
- package/dist/bin/commands/budget.d.ts +6 -0
- package/dist/bin/commands/budget.d.ts.map +1 -0
- package/dist/bin/commands/budget.js +70 -0
- package/dist/bin/commands/budget.js.map +7 -0
- package/dist/bin/commands/caveman.d.ts +7 -0
- package/dist/bin/commands/caveman.d.ts.map +1 -0
- package/dist/bin/commands/communities.d.ts +3 -0
- package/dist/bin/commands/communities.d.ts.map +1 -0
- package/dist/bin/commands/communities.js +77 -0
- package/dist/bin/commands/communities.js.map +7 -0
- package/dist/bin/commands/compression.d.ts +7 -0
- package/dist/bin/commands/compression.d.ts.map +1 -0
- package/dist/bin/commands/context.d.ts.map +1 -1
- package/dist/bin/commands/data.d.ts +3 -0
- package/dist/bin/commands/data.d.ts.map +1 -0
- package/dist/bin/commands/dead-code.d.ts +3 -0
- package/dist/bin/commands/dead-code.d.ts.map +1 -0
- package/dist/bin/commands/dep-confusion.d.ts +3 -0
- package/dist/bin/commands/dep-confusion.d.ts.map +1 -0
- package/dist/bin/commands/dep-confusion.js +119 -0
- package/dist/bin/commands/dep-confusion.js.map +7 -0
- package/dist/bin/commands/docs.d.ts +3 -0
- package/dist/bin/commands/docs.d.ts.map +1 -0
- package/dist/bin/commands/exec.d.ts +11 -0
- package/dist/bin/commands/exec.d.ts.map +1 -0
- package/dist/bin/commands/export.d.ts +3 -0
- package/dist/bin/commands/export.d.ts.map +1 -0
- package/dist/bin/commands/export.js +304 -10
- package/dist/bin/commands/export.js.map +2 -2
- package/dist/bin/commands/flows.d.ts +3 -0
- package/dist/bin/commands/flows.d.ts.map +1 -0
- package/dist/bin/commands/flows.js +97 -0
- package/dist/bin/commands/flows.js.map +7 -0
- package/dist/bin/commands/gain.d.ts +6 -0
- package/dist/bin/commands/gain.d.ts.map +1 -0
- package/dist/bin/commands/help.d.ts +7 -0
- package/dist/bin/commands/help.d.ts.map +1 -1
- package/dist/bin/commands/help.js +399 -101
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/hotspots.d.ts +3 -0
- package/dist/bin/commands/hotspots.d.ts.map +1 -0
- package/dist/bin/commands/hotspots.js +94 -1
- package/dist/bin/commands/hotspots.js.map +3 -3
- package/dist/bin/commands/install.d.ts.map +1 -1
- package/dist/bin/commands/install.js +90 -8
- package/dist/bin/commands/install.js.map +2 -2
- package/dist/bin/commands/licenses.d.ts +3 -0
- package/dist/bin/commands/licenses.d.ts.map +1 -0
- package/dist/bin/commands/licenses.js +201 -0
- package/dist/bin/commands/licenses.js.map +7 -0
- package/dist/bin/commands/memory.d.ts +16 -0
- package/dist/bin/commands/memory.d.ts.map +1 -0
- package/dist/bin/commands/memory.js +151 -4
- package/dist/bin/commands/memory.js.map +2 -2
- package/dist/bin/commands/path.d.ts +3 -0
- package/dist/bin/commands/path.d.ts.map +1 -0
- package/dist/bin/commands/pattern.d.ts +3 -0
- package/dist/bin/commands/pattern.d.ts.map +1 -0
- package/dist/bin/commands/pattern.js +592 -0
- package/dist/bin/commands/pattern.js.map +7 -0
- package/dist/bin/commands/query.d.ts.map +1 -1
- package/dist/bin/commands/reachability.d.ts +3 -0
- package/dist/bin/commands/reachability.d.ts.map +1 -0
- package/dist/bin/commands/reachability.js +160 -0
- package/dist/bin/commands/reachability.js.map +7 -0
- package/dist/bin/commands/read.d.ts +6 -0
- package/dist/bin/commands/read.d.ts.map +1 -0
- package/dist/bin/commands/read.js +100 -0
- package/dist/bin/commands/read.js.map +7 -0
- package/dist/bin/commands/refactor.d.ts +3 -0
- package/dist/bin/commands/refactor.d.ts.map +1 -0
- package/dist/bin/commands/refactor.js +116 -0
- package/dist/bin/commands/refactor.js.map +7 -0
- package/dist/bin/commands/remediation.d.ts +3 -0
- package/dist/bin/commands/remediation.d.ts.map +1 -0
- package/dist/bin/commands/remediation.js +133 -0
- package/dist/bin/commands/remediation.js.map +7 -0
- package/dist/bin/commands/sbom.d.ts +3 -0
- package/dist/bin/commands/sbom.d.ts.map +1 -0
- package/dist/bin/commands/sbom.js +76 -0
- package/dist/bin/commands/sbom.js.map +7 -0
- package/dist/bin/commands/security-ci-report.d.ts +9 -0
- package/dist/bin/commands/security-ci-report.d.ts.map +1 -0
- package/dist/bin/commands/security-ci-report.js +267 -0
- package/dist/bin/commands/security-ci-report.js.map +7 -0
- package/dist/bin/commands/security-export.d.ts +2 -0
- package/dist/bin/commands/security-export.d.ts.map +1 -0
- package/dist/bin/commands/security-export.js +1349 -0
- package/dist/bin/commands/security-export.js.map +7 -0
- package/dist/bin/commands/security-flows.d.ts +3 -0
- package/dist/bin/commands/security-flows.d.ts.map +1 -0
- package/dist/bin/commands/security-flows.js +126 -0
- package/dist/bin/commands/security-flows.js.map +7 -0
- package/dist/bin/commands/security-secrets.d.ts +3 -0
- package/dist/bin/commands/security-secrets.d.ts.map +1 -0
- package/dist/bin/commands/security-secrets.js +170 -0
- package/dist/bin/commands/security-secrets.js.map +7 -0
- package/dist/bin/commands/security.d.ts +3 -0
- package/dist/bin/commands/security.d.ts.map +1 -0
- package/dist/bin/commands/security.js +208 -0
- package/dist/bin/commands/security.js.map +7 -0
- package/dist/bin/commands/snapshot.d.ts +3 -0
- package/dist/bin/commands/snapshot.d.ts.map +1 -0
- package/dist/bin/commands/staleness.d.ts +3 -0
- package/dist/bin/commands/staleness.d.ts.map +1 -0
- package/dist/bin/commands/staleness.js +144 -0
- package/dist/bin/commands/staleness.js.map +7 -0
- package/dist/bin/commands/status.d.ts.map +1 -1
- package/dist/bin/commands/status.js +129 -2
- package/dist/bin/commands/status.js.map +2 -2
- package/dist/bin/commands/supply-chain.d.ts +3 -0
- package/dist/bin/commands/supply-chain.d.ts.map +1 -0
- package/dist/bin/commands/supply-chain.js +138 -0
- package/dist/bin/commands/supply-chain.js.map +7 -0
- package/dist/bin/commands/surprising.d.ts +3 -0
- package/dist/bin/commands/surprising.d.ts.map +1 -0
- package/dist/bin/commands/sync.d.ts.map +1 -1
- package/dist/bin/commands/uninit.d.ts.map +1 -1
- package/dist/bin/commands/uninit.js +109 -60
- package/dist/bin/commands/uninit.js.map +2 -2
- package/dist/bin/commands/utils.d.ts +5 -0
- package/dist/bin/commands/utils.d.ts.map +1 -1
- package/dist/bin/commands/vex.d.ts +3 -0
- package/dist/bin/commands/vex.d.ts.map +1 -0
- package/dist/bin/commands/vex.js +76 -0
- package/dist/bin/commands/vex.js.map +7 -0
- package/dist/bin/commands/vuln-suppress.d.ts +3 -0
- package/dist/bin/commands/vuln-suppress.d.ts.map +1 -0
- package/dist/bin/commands/vuln-suppress.js +95 -0
- package/dist/bin/commands/vuln-suppress.js.map +7 -0
- package/dist/bin/commands/vulns.d.ts +3 -0
- package/dist/bin/commands/vulns.d.ts.map +1 -0
- package/dist/bin/commands/vulns.js +382 -0
- package/dist/bin/commands/vulns.js.map +7 -0
- package/dist/bin/installer/archive.d.ts +47 -0
- package/dist/bin/installer/archive.d.ts.map +1 -0
- package/dist/bin/installer/auto-detect.d.ts +16 -0
- package/dist/bin/installer/auto-detect.d.ts.map +1 -0
- package/dist/bin/installer/auto-detect.js +125 -0
- package/dist/bin/installer/auto-detect.js.map +7 -0
- package/dist/bin/installer/caveman.d.ts +12 -0
- package/dist/bin/installer/caveman.d.ts.map +1 -0
- package/dist/bin/installer/cli-agent.d.ts +7 -2
- package/dist/bin/installer/cli-agent.d.ts.map +1 -1
- package/dist/bin/installer/cli-agent.js +32 -5
- package/dist/bin/installer/cli-agent.js.map +2 -2
- package/dist/bin/installer/common.d.ts +36 -0
- package/dist/bin/installer/common.d.ts.map +1 -0
- package/dist/bin/installer/common.js +48 -0
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.d.ts +1 -1
- package/dist/bin/installer/config-prompt.d.ts.map +1 -1
- package/dist/bin/installer/config-prompt.js +85 -2
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/dashboard.d.ts.map +1 -1
- package/dist/bin/installer/detect.d.ts +30 -0
- package/dist/bin/installer/detect.d.ts.map +1 -0
- package/dist/bin/installer/detect.js +309 -0
- package/dist/bin/installer/detect.js.map +7 -0
- package/dist/bin/installer/hooks.d.ts +4 -1
- package/dist/bin/installer/hooks.d.ts.map +1 -1
- package/dist/bin/installer/hooks.js +34 -0
- package/dist/bin/installer/hooks.js.map +2 -2
- package/dist/bin/installer/index.d.ts +5 -4
- package/dist/bin/installer/index.d.ts.map +1 -1
- package/dist/bin/installer/index.js +46 -8
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.d.ts +14 -0
- package/dist/bin/installer/instructions.d.ts.map +1 -0
- package/dist/bin/installer/instructions.js +209 -3
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/mcp.d.ts.map +1 -1
- package/dist/bin/installer/prompts.d.ts +17 -0
- package/dist/bin/installer/prompts.d.ts.map +1 -1
- package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -1
- package/dist/bin/installer/steering.d.ts +14 -2
- package/dist/bin/installer/steering.d.ts.map +1 -1
- package/dist/bin/installer/steering.js +488 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/aider.d.ts +6 -0
- package/dist/bin/installer/targets/aider.d.ts.map +1 -0
- package/dist/bin/installer/targets/aider.js +3 -3
- package/dist/bin/installer/targets/aider.js.map +2 -2
- package/dist/bin/installer/targets/amp.d.ts +6 -0
- package/dist/bin/installer/targets/amp.d.ts.map +1 -0
- package/dist/bin/installer/targets/amp.js +3 -3
- package/dist/bin/installer/targets/amp.js.map +2 -2
- package/dist/bin/installer/targets/antigravity.d.ts +13 -0
- package/dist/bin/installer/targets/antigravity.d.ts.map +1 -0
- package/dist/bin/installer/targets/antigravity.js +35 -6
- package/dist/bin/installer/targets/antigravity.js.map +2 -2
- package/dist/bin/installer/targets/augment.d.ts +6 -0
- package/dist/bin/installer/targets/augment.d.ts.map +1 -0
- package/dist/bin/installer/targets/augment.js +3 -3
- package/dist/bin/installer/targets/augment.js.map +2 -2
- package/dist/bin/installer/targets/claude.d.ts +6 -0
- package/dist/bin/installer/targets/claude.d.ts.map +1 -0
- package/dist/bin/installer/targets/claude.js +49 -5
- package/dist/bin/installer/targets/claude.js.map +2 -2
- package/dist/bin/installer/targets/cline.d.ts +13 -0
- package/dist/bin/installer/targets/cline.d.ts.map +1 -0
- package/dist/bin/installer/targets/cline.js +32 -6
- package/dist/bin/installer/targets/cline.js.map +2 -2
- package/dist/bin/installer/targets/codex.d.ts +6 -0
- package/dist/bin/installer/targets/codex.d.ts.map +1 -0
- package/dist/bin/installer/targets/codex.js +64 -12
- package/dist/bin/installer/targets/codex.js.map +2 -2
- package/dist/bin/installer/targets/continue.d.ts +12 -0
- package/dist/bin/installer/targets/continue.d.ts.map +1 -0
- package/dist/bin/installer/targets/continue.js +2 -2
- package/dist/bin/installer/targets/continue.js.map +2 -2
- package/dist/bin/installer/targets/copilot-cli.d.ts +12 -0
- package/dist/bin/installer/targets/copilot-cli.d.ts.map +1 -0
- package/dist/bin/installer/targets/copilot-cli.js +101 -0
- package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
- package/dist/bin/installer/targets/copilot.d.ts +6 -0
- package/dist/bin/installer/targets/copilot.d.ts.map +1 -0
- package/dist/bin/installer/targets/copilot.js +31 -5
- package/dist/bin/installer/targets/copilot.js.map +2 -2
- package/dist/bin/installer/targets/cursor.d.ts +6 -0
- package/dist/bin/installer/targets/cursor.d.ts.map +1 -0
- package/dist/bin/installer/targets/cursor.js +4 -4
- package/dist/bin/installer/targets/cursor.js.map +2 -2
- package/dist/bin/installer/targets/devin.d.ts +13 -0
- package/dist/bin/installer/targets/devin.d.ts.map +1 -0
- package/dist/bin/installer/targets/devin.js +2 -2
- package/dist/bin/installer/targets/devin.js.map +2 -2
- package/dist/bin/installer/targets/gemini-cli.d.ts +16 -0
- package/dist/bin/installer/targets/gemini-cli.d.ts.map +1 -0
- package/dist/bin/installer/targets/gemini-cli.js +2 -2
- package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
- package/dist/bin/installer/targets/generic.d.ts +59 -0
- package/dist/bin/installer/targets/generic.d.ts.map +1 -0
- package/dist/bin/installer/targets/generic.js +2 -14
- package/dist/bin/installer/targets/generic.js.map +2 -2
- package/dist/bin/installer/targets/goose.d.ts +6 -0
- package/dist/bin/installer/targets/goose.d.ts.map +1 -0
- package/dist/bin/installer/targets/goose.js +3 -3
- package/dist/bin/installer/targets/goose.js.map +2 -2
- package/dist/bin/installer/targets/index.d.ts +11 -0
- package/dist/bin/installer/targets/index.d.ts.map +1 -0
- package/dist/bin/installer/targets/index.js +250 -0
- package/dist/bin/installer/targets/index.js.map +2 -2
- package/dist/bin/installer/targets/junie.d.ts +13 -0
- package/dist/bin/installer/targets/junie.d.ts.map +1 -0
- package/dist/bin/installer/targets/junie.js +2 -2
- package/dist/bin/installer/targets/junie.js.map +2 -2
- package/dist/bin/installer/targets/kilo.d.ts +12 -0
- package/dist/bin/installer/targets/kilo.d.ts.map +1 -0
- package/dist/bin/installer/targets/kilo.js +2 -2
- package/dist/bin/installer/targets/kilo.js.map +2 -2
- package/dist/bin/installer/targets/kiro.d.ts +5 -0
- package/dist/bin/installer/targets/kiro.d.ts.map +1 -0
- package/dist/bin/installer/targets/kiro.js +4 -4
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/installer/targets/opencode.d.ts +13 -0
- package/dist/bin/installer/targets/opencode.d.ts.map +1 -0
- package/dist/bin/installer/targets/opencode.js +2 -2
- package/dist/bin/installer/targets/opencode.js.map +2 -2
- package/dist/bin/installer/targets/openhands.d.ts +6 -0
- package/dist/bin/installer/targets/openhands.d.ts.map +1 -0
- package/dist/bin/installer/targets/openhands.js +3 -3
- package/dist/bin/installer/targets/openhands.js.map +2 -2
- package/dist/bin/installer/targets/qoder.d.ts +12 -0
- package/dist/bin/installer/targets/qoder.d.ts.map +1 -0
- package/dist/bin/installer/targets/qoder.js +91 -0
- package/dist/bin/installer/targets/qoder.js.map +7 -0
- package/dist/bin/installer/targets/qwen.d.ts +12 -0
- package/dist/bin/installer/targets/qwen.d.ts.map +1 -0
- package/dist/bin/installer/targets/qwen.js +96 -0
- package/dist/bin/installer/targets/qwen.js.map +7 -0
- package/dist/bin/installer/targets/replit.d.ts +6 -0
- package/dist/bin/installer/targets/replit.d.ts.map +1 -0
- package/dist/bin/installer/targets/replit.js +3 -3
- package/dist/bin/installer/targets/replit.js.map +2 -2
- package/dist/bin/installer/targets/roo.d.ts +13 -0
- package/dist/bin/installer/targets/roo.d.ts.map +1 -0
- package/dist/bin/installer/targets/roo.js +2 -2
- package/dist/bin/installer/targets/roo.js.map +2 -2
- package/dist/bin/installer/targets/tabnine.d.ts +6 -0
- package/dist/bin/installer/targets/tabnine.d.ts.map +1 -0
- package/dist/bin/installer/targets/tabnine.js +3 -3
- package/dist/bin/installer/targets/tabnine.js.map +2 -2
- package/dist/bin/installer/targets/trae.d.ts +6 -0
- package/dist/bin/installer/targets/trae.d.ts.map +1 -0
- package/dist/bin/installer/targets/trae.js +5 -5
- package/dist/bin/installer/targets/trae.js.map +2 -2
- package/dist/bin/installer/targets/warp.d.ts +12 -0
- package/dist/bin/installer/targets/warp.d.ts.map +1 -0
- package/dist/bin/installer/targets/warp.js +2 -2
- package/dist/bin/installer/targets/warp.js.map +2 -2
- package/dist/bin/installer/targets/windsurf.d.ts +13 -0
- package/dist/bin/installer/targets/windsurf.d.ts.map +1 -0
- package/dist/bin/installer/targets/windsurf.js +35 -6
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +74 -6
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/bin/progress.d.ts +16 -1
- package/dist/bin/progress.d.ts.map +1 -1
- package/dist/compression/filters/aws.d.ts +9 -0
- package/dist/compression/filters/aws.d.ts.map +1 -0
- package/dist/compression/filters/docker.d.ts +6 -0
- package/dist/compression/filters/docker.d.ts.map +1 -0
- package/dist/compression/filters/files.d.ts +6 -0
- package/dist/compression/filters/files.d.ts.map +1 -0
- package/dist/compression/filters/generic.d.ts +7 -0
- package/dist/compression/filters/generic.d.ts.map +1 -0
- package/dist/compression/filters/git.d.ts +6 -0
- package/dist/compression/filters/git.d.ts.map +1 -0
- package/dist/compression/filters/github.d.ts +6 -0
- package/dist/compression/filters/github.d.ts.map +1 -0
- package/dist/compression/filters/lint.d.ts +6 -0
- package/dist/compression/filters/lint.d.ts.map +1 -0
- package/dist/compression/filters/misc.d.ts +6 -0
- package/dist/compression/filters/misc.d.ts.map +1 -0
- package/dist/compression/filters/package.d.ts +6 -0
- package/dist/compression/filters/package.d.ts.map +1 -0
- package/dist/compression/filters/test.d.ts +6 -0
- package/dist/compression/filters/test.d.ts.map +1 -0
- package/dist/compression/index.d.ts +29 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/naive-cost.d.ts +26 -0
- package/dist/compression/naive-cost.d.ts.map +1 -0
- package/dist/compression/tracker.d.ts +155 -0
- package/dist/compression/tracker.d.ts.map +1 -0
- package/dist/compression/tracker.js +80 -0
- package/dist/compression/tracker.js.map +2 -2
- package/dist/compression/types.d.ts +49 -0
- package/dist/compression/types.d.ts.map +1 -0
- package/dist/config.d.ts +90 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +144 -3
- package/dist/config.js.map +2 -2
- package/dist/core/lock-manager.d.ts +2 -0
- package/dist/core/lock-manager.d.ts.map +1 -1
- package/dist/core/pipeline.d.ts +4 -1
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +78 -2
- package/dist/core/pipeline.js.map +2 -2
- package/dist/core/snapshot.d.ts +58 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/data/filters.d.ts +23 -0
- package/dist/data/filters.d.ts.map +1 -0
- package/dist/data/indexer.d.ts +25 -0
- package/dist/data/indexer.d.ts.map +1 -0
- package/dist/data/linker.d.ts +37 -0
- package/dist/data/linker.d.ts.map +1 -0
- package/dist/data/lint.d.ts +27 -0
- package/dist/data/lint.d.ts.map +1 -0
- package/dist/data/parsers/csv.d.ts +11 -0
- package/dist/data/parsers/csv.d.ts.map +1 -0
- package/dist/data/parsers/excel.d.ts +10 -0
- package/dist/data/parsers/excel.d.ts.map +1 -0
- package/dist/data/parsers/index.d.ts +28 -0
- package/dist/data/parsers/index.d.ts.map +1 -0
- package/dist/data/parsers/json-array.d.ts +9 -0
- package/dist/data/parsers/json-array.d.ts.map +1 -0
- package/dist/data/parsers/jsonl.d.ts +9 -0
- package/dist/data/parsers/jsonl.d.ts.map +1 -0
- package/dist/data/parsers/parquet.d.ts +10 -0
- package/dist/data/parsers/parquet.d.ts.map +1 -0
- package/dist/data/profiler.d.ts +29 -0
- package/dist/data/profiler.d.ts.map +1 -0
- package/dist/data/queries.d.ts +95 -0
- package/dist/data/queries.d.ts.map +1 -0
- package/dist/data/types.d.ts +103 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/db/database.d.ts +57 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +75 -5
- package/dist/db/database.js.map +2 -2
- package/dist/db/memory-schema.sql +5 -1
- package/dist/db/patterns-schema.sql +23 -0
- package/dist/db/schema.sql +3 -1
- package/dist/db/security-schema.sql +72 -0
- package/dist/docs/formats/asciidoc.d.ts +9 -0
- package/dist/docs/formats/asciidoc.d.ts.map +1 -0
- package/dist/docs/formats/html.d.ts +10 -0
- package/dist/docs/formats/html.d.ts.map +1 -0
- package/dist/docs/formats/index.d.ts +31 -0
- package/dist/docs/formats/index.d.ts.map +1 -0
- package/dist/docs/formats/markdown.d.ts +11 -0
- package/dist/docs/formats/markdown.d.ts.map +1 -0
- package/dist/docs/formats/openapi.d.ts +17 -0
- package/dist/docs/formats/openapi.d.ts.map +1 -0
- package/dist/docs/formats/org.d.ts +9 -0
- package/dist/docs/formats/org.d.ts.map +1 -0
- package/dist/docs/formats/plaintext.d.ts +11 -0
- package/dist/docs/formats/plaintext.d.ts.map +1 -0
- package/dist/docs/formats/rdoc.d.ts +10 -0
- package/dist/docs/formats/rdoc.d.ts.map +1 -0
- package/dist/docs/formats/rst.d.ts +11 -0
- package/dist/docs/formats/rst.d.ts.map +1 -0
- package/dist/docs/indexer.d.ts +49 -0
- package/dist/docs/indexer.d.ts.map +1 -0
- package/dist/docs/linker.d.ts +30 -0
- package/dist/docs/linker.d.ts.map +1 -0
- package/dist/docs/lint.d.ts +27 -0
- package/dist/docs/lint.d.ts.map +1 -0
- package/dist/docs/queries.d.ts +78 -0
- package/dist/docs/queries.d.ts.map +1 -0
- package/dist/docs/section-id.d.ts +48 -0
- package/dist/docs/section-id.d.ts.map +1 -0
- package/dist/docs/summarizer.d.ts +13 -0
- package/dist/docs/summarizer.d.ts.map +1 -0
- package/dist/docs/types.d.ts +71 -0
- package/dist/docs/types.d.ts.map +1 -0
- package/dist/docs/vectors.d.ts +54 -0
- package/dist/docs/vectors.d.ts.map +1 -0
- package/dist/extraction/extractor.d.ts +1 -1
- package/dist/extraction/extractor.d.ts.map +1 -1
- package/dist/extraction/extractor.js +81 -0
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/extraction/grammars.d.ts +6 -0
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +32 -8
- package/dist/extraction/grammars.js.map +2 -2
- package/dist/extraction/languages.d.ts.map +1 -1
- package/dist/extraction/languages.js +43 -1
- package/dist/extraction/languages.js.map +2 -2
- package/dist/extraction/notebook.d.ts +14 -0
- package/dist/extraction/notebook.d.ts.map +1 -0
- package/dist/extraction/notebook.js +300 -0
- package/dist/extraction/notebook.js.map +7 -0
- package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
- package/dist/frameworks/amplify.d.ts +9 -0
- package/dist/frameworks/amplify.d.ts.map +1 -0
- package/dist/frameworks/angular.d.ts +9 -0
- package/dist/frameworks/angular.d.ts.map +1 -0
- package/dist/frameworks/ansible.d.ts +8 -0
- package/dist/frameworks/ansible.d.ts.map +1 -0
- package/dist/frameworks/cloudformation.d.ts +9 -0
- package/dist/frameworks/cloudformation.d.ts.map +1 -0
- package/dist/frameworks/docker.d.ts +9 -0
- package/dist/frameworks/docker.d.ts.map +1 -0
- package/dist/frameworks/elixir.d.ts +6 -0
- package/dist/frameworks/elixir.d.ts.map +1 -0
- package/dist/frameworks/flutter.d.ts +12 -0
- package/dist/frameworks/flutter.d.ts.map +1 -0
- package/dist/frameworks/flutter.js +130 -0
- package/dist/frameworks/flutter.js.map +7 -0
- package/dist/frameworks/iac.d.ts +10 -0
- package/dist/frameworks/iac.d.ts.map +1 -0
- package/dist/frameworks/index.d.ts +14 -0
- package/dist/frameworks/index.d.ts.map +1 -1
- package/dist/frameworks/index.js +7 -1
- package/dist/frameworks/index.js.map +3 -3
- package/dist/frameworks/kubernetes.d.ts +9 -0
- package/dist/frameworks/kubernetes.d.ts.map +1 -0
- package/dist/frameworks/pulumi.d.ts +9 -0
- package/dist/frameworks/pulumi.d.ts.map +1 -0
- package/dist/frameworks/scala.d.ts +6 -0
- package/dist/frameworks/scala.d.ts.map +1 -0
- package/dist/frameworks/solidity.d.ts +6 -0
- package/dist/frameworks/solidity.d.ts.map +1 -0
- package/dist/frameworks/terraform.d.ts +14 -0
- package/dist/frameworks/terraform.d.ts.map +1 -0
- package/dist/frameworks/vue.d.ts +7 -0
- package/dist/frameworks/vue.d.ts.map +1 -0
- package/dist/graph/communities.d.ts +43 -0
- package/dist/graph/communities.d.ts.map +1 -0
- package/dist/graph/communities.js +317 -0
- package/dist/graph/communities.js.map +7 -0
- package/dist/graph/flows.d.ts +55 -0
- package/dist/graph/flows.d.ts.map +1 -0
- package/dist/graph/flows.js +138 -0
- package/dist/graph/flows.js.map +7 -0
- package/dist/graph/refactor.d.ts +43 -0
- package/dist/graph/refactor.d.ts.map +1 -0
- package/dist/graph/refactor.js +155 -0
- package/dist/graph/refactor.js.map +7 -0
- package/dist/index.d.ts +36 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/mcp/cache.d.ts +69 -0
- package/dist/mcp/cache.d.ts.map +1 -0
- package/dist/mcp/cache.js +172 -0
- package/dist/mcp/cache.js.map +7 -0
- package/dist/mcp/read-modes.d.ts +31 -0
- package/dist/mcp/read-modes.d.ts.map +1 -0
- package/dist/mcp/read-modes.js +295 -0
- package/dist/mcp/read-modes.js.map +7 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +17 -3
- package/dist/mcp/server.js.map +2 -2
- package/dist/mcp/tool-names.d.ts +2 -0
- package/dist/mcp/tool-names.d.ts.map +1 -0
- package/dist/mcp/tool-names.js +24 -1
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1560 -4
- package/dist/mcp/tools.js.map +3 -3
- package/dist/memory/compress.d.ts +19 -0
- package/dist/memory/compress.d.ts.map +1 -0
- package/dist/memory/database.d.ts +92 -0
- package/dist/memory/database.d.ts.map +1 -0
- package/dist/memory/database.js +70 -2
- package/dist/memory/database.js.map +2 -2
- package/dist/memory/index.d.ts +71 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +12 -2
- package/dist/memory/index.js.map +2 -2
- package/dist/memory/symbols.d.ts +21 -0
- package/dist/memory/symbols.d.ts.map +1 -0
- package/dist/memory/types.d.ts +78 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/vectors.d.ts +43 -0
- package/dist/memory/vectors.d.ts.map +1 -0
- package/dist/patterns/graph.d.ts +16 -0
- package/dist/patterns/graph.d.ts.map +1 -0
- package/dist/patterns/graph.js +45 -0
- package/dist/patterns/graph.js.map +7 -0
- package/dist/patterns/index.d.ts +4 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +39 -0
- package/dist/patterns/index.js.map +7 -0
- package/dist/patterns/indexer.d.ts +15 -0
- package/dist/patterns/indexer.d.ts.map +1 -0
- package/dist/patterns/indexer.js +97 -0
- package/dist/patterns/indexer.js.map +7 -0
- package/dist/patterns/library/command-injection-go.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
- package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
- package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
- package/dist/patterns/library/path-traversal-go.yaml +11 -0
- package/dist/patterns/library/path-traversal-py.yaml +12 -0
- package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
- package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
- package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
- package/dist/patterns/library/sql-injection-java.yaml +13 -0
- package/dist/patterns/library/sql-injection-py.yaml +12 -0
- package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
- package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
- package/dist/patterns/library/weak-crypto-py.yaml +13 -0
- package/dist/patterns/loader.d.ts +18 -0
- package/dist/patterns/loader.d.ts.map +1 -0
- package/dist/patterns/loader.js +277 -0
- package/dist/patterns/loader.js.map +7 -0
- package/dist/patterns/runner.d.ts +42 -0
- package/dist/patterns/runner.d.ts.map +1 -0
- package/dist/patterns/runner.js +277 -0
- package/dist/patterns/runner.js.map +7 -0
- package/dist/patterns/types.d.ts +27 -0
- package/dist/patterns/types.d.ts.map +1 -0
- package/dist/patterns/types.js +34 -0
- package/dist/patterns/types.js.map +7 -0
- package/dist/resolution/bridges/android-rn.d.ts +13 -0
- package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
- package/dist/resolution/bridges/android-rn.js +298 -0
- package/dist/resolution/bridges/android-rn.js.map +7 -0
- package/dist/resolution/bridges/expo-modules.d.ts +10 -0
- package/dist/resolution/bridges/expo-modules.d.ts.map +1 -0
- package/dist/resolution/bridges/expo-modules.js +155 -0
- package/dist/resolution/bridges/expo-modules.js.map +7 -0
- package/dist/resolution/bridges/flutter-channel.d.ts +14 -0
- package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -0
- package/dist/resolution/bridges/flutter-channel.js +385 -0
- package/dist/resolution/bridges/flutter-channel.js.map +7 -0
- package/dist/resolution/bridges/index.d.ts +40 -0
- package/dist/resolution/bridges/index.d.ts.map +1 -0
- package/dist/resolution/bridges/index.js +80 -0
- package/dist/resolution/bridges/index.js.map +7 -0
- package/dist/resolution/bridges/native-events.d.ts +10 -0
- package/dist/resolution/bridges/native-events.d.ts.map +1 -0
- package/dist/resolution/bridges/native-events.js +188 -0
- package/dist/resolution/bridges/native-events.js.map +7 -0
- package/dist/resolution/bridges/native-views.d.ts +13 -0
- package/dist/resolution/bridges/native-views.d.ts.map +1 -0
- package/dist/resolution/bridges/native-views.js +244 -0
- package/dist/resolution/bridges/native-views.js.map +7 -0
- package/dist/resolution/bridges/react-native.d.ts +9 -0
- package/dist/resolution/bridges/react-native.d.ts.map +1 -0
- package/dist/resolution/bridges/react-native.js +161 -0
- package/dist/resolution/bridges/react-native.js.map +7 -0
- package/dist/resolution/bridges/swift-objc.d.ts +14 -0
- package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
- package/dist/resolution/bridges/swift-objc.js +227 -0
- package/dist/resolution/bridges/swift-objc.js.map +7 -0
- package/dist/resolution/bridges/turbomodules.d.ts +10 -0
- package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
- package/dist/resolution/bridges/turbomodules.js +216 -0
- package/dist/resolution/bridges/turbomodules.js.map +7 -0
- package/dist/resolution/index.d.ts +28 -3
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +61 -2
- package/dist/resolution/index.js.map +2 -2
- package/dist/security/attack-surface.d.ts +46 -0
- package/dist/security/attack-surface.d.ts.map +1 -0
- package/dist/security/attack-surface.js +206 -0
- package/dist/security/attack-surface.js.map +7 -0
- package/dist/security/context-warnings.d.ts +40 -0
- package/dist/security/context-warnings.d.ts.map +1 -0
- package/dist/security/context-warnings.js +123 -0
- package/dist/security/context-warnings.js.map +7 -0
- package/dist/security/data-flows.d.ts +33 -0
- package/dist/security/data-flows.d.ts.map +1 -0
- package/dist/security/data-flows.js +286 -0
- package/dist/security/data-flows.js.map +7 -0
- package/dist/security/dep-confusion.d.ts +23 -0
- package/dist/security/dep-confusion.d.ts.map +1 -0
- package/dist/security/dep-confusion.js +255 -0
- package/dist/security/dep-confusion.js.map +7 -0
- package/dist/security/errors.d.ts +16 -0
- package/dist/security/errors.d.ts.map +1 -0
- package/dist/security/errors.js +51 -0
- package/dist/security/errors.js.map +7 -0
- package/dist/security/export/fix-suggestions.d.ts +21 -0
- package/dist/security/export/fix-suggestions.d.ts.map +1 -0
- package/dist/security/export/fix-suggestions.js +58 -0
- package/dist/security/export/fix-suggestions.js.map +7 -0
- package/dist/security/export/sbom.d.ts +33 -0
- package/dist/security/export/sbom.d.ts.map +1 -0
- package/dist/security/export/sbom.js +230 -0
- package/dist/security/export/sbom.js.map +7 -0
- package/dist/security/export/serialization.d.ts +62 -0
- package/dist/security/export/serialization.d.ts.map +1 -0
- package/dist/security/export/serialization.js +142 -0
- package/dist/security/export/serialization.js.map +7 -0
- package/dist/security/export/vex.d.ts +58 -0
- package/dist/security/export/vex.d.ts.map +1 -0
- package/dist/security/export/vex.js +220 -0
- package/dist/security/export/vex.js.map +7 -0
- package/dist/security/index.d.ts +21 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +67 -0
- package/dist/security/index.js.map +7 -0
- package/dist/security/integrator.d.ts +63 -0
- package/dist/security/integrator.d.ts.map +1 -0
- package/dist/security/integrator.js +491 -0
- package/dist/security/integrator.js.map +7 -0
- package/dist/security/license.d.ts +33 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/license.js +70 -0
- package/dist/security/license.js.map +7 -0
- package/dist/security/manifest/adapter.d.ts +92 -0
- package/dist/security/manifest/adapter.d.ts.map +1 -0
- package/dist/security/manifest/adapter.js +243 -0
- package/dist/security/manifest/adapter.js.map +7 -0
- package/dist/security/manifest/parser.d.ts +73 -0
- package/dist/security/manifest/parser.d.ts.map +1 -0
- package/dist/security/manifest/parser.js +376 -0
- package/dist/security/manifest/parser.js.map +7 -0
- package/dist/security/manifest/plugins/cargo.d.ts +11 -0
- package/dist/security/manifest/plugins/cargo.d.ts.map +1 -0
- package/dist/security/manifest/plugins/cargo.js +233 -0
- package/dist/security/manifest/plugins/cargo.js.map +7 -0
- package/dist/security/manifest/plugins/composer.d.ts +11 -0
- package/dist/security/manifest/plugins/composer.d.ts.map +1 -0
- package/dist/security/manifest/plugins/composer.js +152 -0
- package/dist/security/manifest/plugins/composer.js.map +7 -0
- package/dist/security/manifest/plugins/go.d.ts +12 -0
- package/dist/security/manifest/plugins/go.d.ts.map +1 -0
- package/dist/security/manifest/plugins/go.js +146 -0
- package/dist/security/manifest/plugins/go.js.map +7 -0
- package/dist/security/manifest/plugins/gradle.d.ts +12 -0
- package/dist/security/manifest/plugins/gradle.d.ts.map +1 -0
- package/dist/security/manifest/plugins/gradle.js +159 -0
- package/dist/security/manifest/plugins/gradle.js.map +7 -0
- package/dist/security/manifest/plugins/hex.d.ts +11 -0
- package/dist/security/manifest/plugins/hex.d.ts.map +1 -0
- package/dist/security/manifest/plugins/hex.js +159 -0
- package/dist/security/manifest/plugins/hex.js.map +7 -0
- package/dist/security/manifest/plugins/maven.d.ts +11 -0
- package/dist/security/manifest/plugins/maven.d.ts.map +1 -0
- package/dist/security/manifest/plugins/maven.js +128 -0
- package/dist/security/manifest/plugins/maven.js.map +7 -0
- package/dist/security/manifest/plugins/npm.d.ts +11 -0
- package/dist/security/manifest/plugins/npm.d.ts.map +1 -0
- package/dist/security/manifest/plugins/npm.js +284 -0
- package/dist/security/manifest/plugins/npm.js.map +7 -0
- package/dist/security/manifest/plugins/nuget.d.ts +12 -0
- package/dist/security/manifest/plugins/nuget.d.ts.map +1 -0
- package/dist/security/manifest/plugins/nuget.js +186 -0
- package/dist/security/manifest/plugins/nuget.js.map +7 -0
- package/dist/security/manifest/plugins/pip.d.ts +11 -0
- package/dist/security/manifest/plugins/pip.d.ts.map +1 -0
- package/dist/security/manifest/plugins/pip.js +123 -0
- package/dist/security/manifest/plugins/pip.js.map +7 -0
- package/dist/security/manifest/plugins/pubspec.d.ts +11 -0
- package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -0
- package/dist/security/manifest/plugins/pubspec.js +212 -0
- package/dist/security/manifest/plugins/pubspec.js.map +7 -0
- package/dist/security/manifest/plugins/pyproject.d.ts +3 -0
- package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -0
- package/dist/security/manifest/plugins/pyproject.js +261 -0
- package/dist/security/manifest/plugins/pyproject.js.map +7 -0
- package/dist/security/manifest/plugins/rubygems.d.ts +11 -0
- package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -0
- package/dist/security/manifest/plugins/rubygems.js +185 -0
- package/dist/security/manifest/plugins/rubygems.js.map +7 -0
- package/dist/security/manifest/plugins/swift.d.ts +11 -0
- package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
- package/dist/security/manifest/plugins/swift.js +200 -0
- package/dist/security/manifest/plugins/swift.js.map +7 -0
- package/dist/security/owasp.d.ts +16 -0
- package/dist/security/owasp.d.ts.map +1 -0
- package/dist/security/owasp.js +104 -0
- package/dist/security/owasp.js.map +7 -0
- package/dist/security/pipeline.d.ts +37 -0
- package/dist/security/pipeline.d.ts.map +1 -0
- package/dist/security/pipeline.js +125 -0
- package/dist/security/pipeline.js.map +7 -0
- package/dist/security/reachability.d.ts +67 -0
- package/dist/security/reachability.d.ts.map +1 -0
- package/dist/security/reachability.js +276 -0
- package/dist/security/reachability.js.map +7 -0
- package/dist/security/remediation.d.ts +51 -0
- package/dist/security/remediation.d.ts.map +1 -0
- package/dist/security/remediation.js +126 -0
- package/dist/security/remediation.js.map +7 -0
- package/dist/security/secrets.d.ts +38 -0
- package/dist/security/secrets.d.ts.map +1 -0
- package/dist/security/secrets.js +176 -0
- package/dist/security/secrets.js.map +7 -0
- package/dist/security/staleness.d.ts +43 -0
- package/dist/security/staleness.d.ts.map +1 -0
- package/dist/security/staleness.js +231 -0
- package/dist/security/staleness.js.map +7 -0
- package/dist/security/supply-chain.d.ts +34 -0
- package/dist/security/supply-chain.d.ts.map +1 -0
- package/dist/security/supply-chain.js +301 -0
- package/dist/security/supply-chain.js.map +7 -0
- package/dist/security/suppressions.d.ts +18 -0
- package/dist/security/suppressions.d.ts.map +1 -0
- package/dist/security/suppressions.js +106 -0
- package/dist/security/suppressions.js.map +7 -0
- package/dist/security/types.d.ts +144 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +17 -0
- package/dist/security/types.js.map +7 -0
- package/dist/security/vuln/client.d.ts +90 -0
- package/dist/security/vuln/client.d.ts.map +1 -0
- package/dist/security/vuln/client.js +355 -0
- package/dist/security/vuln/client.js.map +7 -0
- package/dist/security/vuln/epss-client.d.ts +26 -0
- package/dist/security/vuln/epss-client.d.ts.map +1 -0
- package/dist/security/vuln/epss-client.js +95 -0
- package/dist/security/vuln/epss-client.js.map +7 -0
- package/dist/security/vuln/index.d.ts +6 -0
- package/dist/security/vuln/index.d.ts.map +1 -0
- package/dist/security/vuln/index.js +29 -0
- package/dist/security/vuln/index.js.map +7 -0
- package/dist/security/vuln/osv-adapter.d.ts +58 -0
- package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
- package/dist/security/vuln/osv-adapter.js +321 -0
- package/dist/security/vuln/osv-adapter.js.map +7 -0
- package/dist/security/vuln/types.d.ts +29 -0
- package/dist/security/vuln/types.d.ts.map +1 -0
- package/dist/security/vuln/types.js +17 -0
- package/dist/security/vuln/types.js.map +7 -0
- package/dist/sync/index.d.ts +4 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/types.d.ts +10 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +2 -2
- package/dist/vectors/index.d.ts +11 -3
- package/dist/vectors/index.d.ts.map +1 -1
- package/dist/vectors/qdrant-index.d.ts +10 -3
- package/dist/vectors/qdrant-index.d.ts.map +1 -1
- package/dist/vectors/typesense-index.d.ts.map +1 -1
- package/dist/watchmen/index.js +83 -0
- package/dist/watchmen/index.js.map +7 -0
- package/dist/watchmen/synthesize.js +475 -0
- package/dist/watchmen/synthesize.js.map +7 -0
- package/package.json +6 -2
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var reachability_exports = {};
|
|
20
|
+
__export(reachability_exports, {
|
|
21
|
+
ReachabilityAnalyzer: () => ReachabilityAnalyzer
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(reachability_exports);
|
|
24
|
+
const TRAVERSAL_EDGE_KINDS = ["calls", "imports", "references"];
|
|
25
|
+
const MAX_UNRESOLVED_SYMBOLS = 50;
|
|
26
|
+
const MAX_DISTINCT_PATHS = 100;
|
|
27
|
+
class ReachabilityAnalyzer {
|
|
28
|
+
constructor(db, config) {
|
|
29
|
+
this.db = db;
|
|
30
|
+
this.config = config;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Analyze reachability for a single Vulnerability_Node.
|
|
34
|
+
*
|
|
35
|
+
* 1. Find the Dependency_Node linked via `has_vulnerability` edge
|
|
36
|
+
* 2. Find all Entry_Points in the graph
|
|
37
|
+
* 3. BFS from each entry point toward the dependency node
|
|
38
|
+
* 4. Assign verdict based on path existence and unresolved imports
|
|
39
|
+
*
|
|
40
|
+
* Requirements: 4.1, 4.2, 4.3, 4.4, 4.6
|
|
41
|
+
*/
|
|
42
|
+
async analyze(vulnerabilityNodeId) {
|
|
43
|
+
const rawDb = this.db.getRawDb();
|
|
44
|
+
const depEdge = rawDb.get(
|
|
45
|
+
`SELECT source FROM edges WHERE target = ? AND kind = 'has_vulnerability'`,
|
|
46
|
+
[vulnerabilityNodeId]
|
|
47
|
+
);
|
|
48
|
+
if (!depEdge) {
|
|
49
|
+
return {
|
|
50
|
+
verdict: "under_investigation",
|
|
51
|
+
paths: [],
|
|
52
|
+
unresolvedSymbols: [],
|
|
53
|
+
reachingEntryPointCount: 0
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const dependencyNodeId = depEdge.source;
|
|
57
|
+
const entryPoints = rawDb.all(
|
|
58
|
+
`SELECT id FROM nodes WHERE kind = 'route'
|
|
59
|
+
UNION
|
|
60
|
+
SELECT id FROM nodes WHERE kind = 'function' AND is_exported = 1`
|
|
61
|
+
);
|
|
62
|
+
if (entryPoints.length === 0) {
|
|
63
|
+
return {
|
|
64
|
+
verdict: "not_affected",
|
|
65
|
+
paths: [],
|
|
66
|
+
unresolvedSymbols: [],
|
|
67
|
+
reachingEntryPointCount: 0
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const reachingPaths = [];
|
|
71
|
+
const allUnresolvedSymbols = /* @__PURE__ */ new Set();
|
|
72
|
+
for (const ep of entryPoints) {
|
|
73
|
+
const result2 = this.bfsFromEntryPoint(rawDb, ep.id, dependencyNodeId);
|
|
74
|
+
if (result2.path) {
|
|
75
|
+
reachingPaths.push({
|
|
76
|
+
entryPoint: ep.id,
|
|
77
|
+
path: result2.path
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
for (const sym of result2.unresolvedSymbols) {
|
|
81
|
+
allUnresolvedSymbols.add(sym);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const unresolvedSymbols = Array.from(allUnresolvedSymbols).slice(0, MAX_UNRESOLVED_SYMBOLS);
|
|
85
|
+
let verdict;
|
|
86
|
+
if (reachingPaths.length > 0) {
|
|
87
|
+
verdict = "affected";
|
|
88
|
+
} else if (allUnresolvedSymbols.size > 0) {
|
|
89
|
+
verdict = "under_investigation";
|
|
90
|
+
} else {
|
|
91
|
+
verdict = "not_affected";
|
|
92
|
+
}
|
|
93
|
+
const result = {
|
|
94
|
+
verdict,
|
|
95
|
+
paths: reachingPaths,
|
|
96
|
+
unresolvedSymbols: verdict === "under_investigation" ? unresolvedSymbols : [],
|
|
97
|
+
reachingEntryPointCount: reachingPaths.length
|
|
98
|
+
};
|
|
99
|
+
this.storeReachabilityResult(rawDb, vulnerabilityNodeId, result);
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Produce impact summary for an affected vulnerability.
|
|
104
|
+
*
|
|
105
|
+
* Returns null if the vulnerability is not affected.
|
|
106
|
+
* Reads layer assignments from `arch_file_layers` table.
|
|
107
|
+
*
|
|
108
|
+
* Requirements: 5.1, 5.2, 5.3, 5.4, 5.5
|
|
109
|
+
*/
|
|
110
|
+
async getImpactSummary(vulnerabilityNodeId) {
|
|
111
|
+
const rawDb = this.db.getRawDb();
|
|
112
|
+
const reachRow = rawDb.get(
|
|
113
|
+
`SELECT verdict, paths, reaching_entry_point_count FROM sec_reachability WHERE vulnerability_node_id = ?`,
|
|
114
|
+
[vulnerabilityNodeId]
|
|
115
|
+
);
|
|
116
|
+
if (!reachRow || reachRow.verdict !== "affected") {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const paths = reachRow.paths ? JSON.parse(reachRow.paths) : [];
|
|
120
|
+
if (paths.length === 0) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const allNodeIds = /* @__PURE__ */ new Set();
|
|
124
|
+
const affectedEntryPoints = [];
|
|
125
|
+
for (const p of paths) {
|
|
126
|
+
affectedEntryPoints.push(p.entryPoint);
|
|
127
|
+
for (const nodeId of p.path) {
|
|
128
|
+
allNodeIds.add(nodeId);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const affectedLayers = /* @__PURE__ */ new Set();
|
|
132
|
+
if (this.config.enableArchitecture) {
|
|
133
|
+
const nodeIds = Array.from(allNodeIds);
|
|
134
|
+
if (nodeIds.length > 0) {
|
|
135
|
+
const placeholders = nodeIds.map(() => "?").join(",");
|
|
136
|
+
const nodeFiles = rawDb.all(
|
|
137
|
+
`SELECT id, file_path FROM nodes WHERE id IN (${placeholders})`,
|
|
138
|
+
nodeIds
|
|
139
|
+
);
|
|
140
|
+
const filePaths = [...new Set(nodeFiles.map((n) => n.file_path).filter(Boolean))];
|
|
141
|
+
if (filePaths.length > 0) {
|
|
142
|
+
const filePlaceholders = filePaths.map(() => "?").join(",");
|
|
143
|
+
const layerRows = rawDb.all(
|
|
144
|
+
`SELECT file_path, layer_id FROM arch_file_layers WHERE file_path IN (${filePlaceholders})`,
|
|
145
|
+
filePaths
|
|
146
|
+
);
|
|
147
|
+
const fileToLayer = /* @__PURE__ */ new Map();
|
|
148
|
+
for (const row of layerRows) {
|
|
149
|
+
fileToLayer.set(row.file_path, row.layer_id);
|
|
150
|
+
}
|
|
151
|
+
for (const nf of nodeFiles) {
|
|
152
|
+
if (nf.file_path) {
|
|
153
|
+
const layer = fileToLayer.get(nf.file_path);
|
|
154
|
+
affectedLayers.add(layer ?? "unclassified");
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const distinctPathSet = /* @__PURE__ */ new Set();
|
|
161
|
+
for (const p of paths) {
|
|
162
|
+
const pathKey = p.path.join("\u2192");
|
|
163
|
+
distinctPathSet.add(pathKey);
|
|
164
|
+
if (distinctPathSet.size >= MAX_DISTINCT_PATHS) break;
|
|
165
|
+
}
|
|
166
|
+
const summary = {
|
|
167
|
+
affectedLayers: Array.from(affectedLayers),
|
|
168
|
+
affectedEntryPoints,
|
|
169
|
+
distinctPathCount: Math.min(distinctPathSet.size, MAX_DISTINCT_PATHS)
|
|
170
|
+
};
|
|
171
|
+
this.storeImpactSummary(rawDb, vulnerabilityNodeId, summary);
|
|
172
|
+
return summary;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Analyze all Vulnerability_Nodes in the graph.
|
|
176
|
+
*
|
|
177
|
+
* Iterates all vulnerability nodes and calls analyze() for each.
|
|
178
|
+
*/
|
|
179
|
+
async analyzeAll() {
|
|
180
|
+
const rawDb = this.db.getRawDb();
|
|
181
|
+
const results = /* @__PURE__ */ new Map();
|
|
182
|
+
const vulnRows = rawDb.all(
|
|
183
|
+
`SELECT node_id FROM sec_vulnerabilities`
|
|
184
|
+
);
|
|
185
|
+
for (const row of vulnRows) {
|
|
186
|
+
const result = await this.analyze(row.node_id);
|
|
187
|
+
results.set(row.node_id, result);
|
|
188
|
+
}
|
|
189
|
+
return results;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* BFS from a single entry point toward the dependency node.
|
|
193
|
+
*
|
|
194
|
+
* Uses outgoing edges of types: calls, imports, references.
|
|
195
|
+
* Visits each node at most once (handles cycles).
|
|
196
|
+
* Tracks unresolved imports encountered during traversal.
|
|
197
|
+
*
|
|
198
|
+
* Returns the shortest path if found, plus any unresolved symbols encountered.
|
|
199
|
+
*/
|
|
200
|
+
bfsFromEntryPoint(rawDb, entryPointId, dependencyNodeId) {
|
|
201
|
+
const visited = /* @__PURE__ */ new Set();
|
|
202
|
+
const unresolvedSymbols = [];
|
|
203
|
+
const queue = [[entryPointId, [entryPointId]]];
|
|
204
|
+
visited.add(entryPointId);
|
|
205
|
+
const edgeKinds = TRAVERSAL_EDGE_KINDS.map((k) => `'${k}'`).join(",");
|
|
206
|
+
while (queue.length > 0) {
|
|
207
|
+
const [currentId, currentPath] = queue.shift();
|
|
208
|
+
const outEdges = rawDb.all(
|
|
209
|
+
`SELECT target, kind FROM edges WHERE source = ? AND kind IN (${edgeKinds})`,
|
|
210
|
+
[currentId]
|
|
211
|
+
);
|
|
212
|
+
if (outEdges.length === 0) {
|
|
213
|
+
const nodeRow = rawDb.get(
|
|
214
|
+
`SELECT kind FROM nodes WHERE id = ?`,
|
|
215
|
+
[currentId]
|
|
216
|
+
);
|
|
217
|
+
if (nodeRow && nodeRow.kind === "import") {
|
|
218
|
+
unresolvedSymbols.push(currentId);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
for (const edge of outEdges) {
|
|
222
|
+
const targetId = edge.target;
|
|
223
|
+
if (targetId === dependencyNodeId) {
|
|
224
|
+
return {
|
|
225
|
+
path: [...currentPath, targetId],
|
|
226
|
+
unresolvedSymbols
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (visited.has(targetId)) continue;
|
|
230
|
+
visited.add(targetId);
|
|
231
|
+
queue.push([targetId, [...currentPath, targetId]]);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { path: null, unresolvedSymbols };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Store reachability result in sec_reachability table.
|
|
238
|
+
*/
|
|
239
|
+
storeReachabilityResult(rawDb, vulnerabilityNodeId, result) {
|
|
240
|
+
rawDb.run(
|
|
241
|
+
`INSERT OR REPLACE INTO sec_reachability
|
|
242
|
+
(vulnerability_node_id, verdict, paths, unresolved_symbols, reaching_entry_point_count, analyzed_at)
|
|
243
|
+
VALUES (?, ?, ?, ?, ?, ?)`,
|
|
244
|
+
[
|
|
245
|
+
vulnerabilityNodeId,
|
|
246
|
+
result.verdict,
|
|
247
|
+
result.paths.length > 0 ? JSON.stringify(result.paths) : null,
|
|
248
|
+
result.unresolvedSymbols.length > 0 ? JSON.stringify(result.unresolvedSymbols) : null,
|
|
249
|
+
result.reachingEntryPointCount,
|
|
250
|
+
Date.now()
|
|
251
|
+
]
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Store impact summary in sec_impact table.
|
|
256
|
+
*/
|
|
257
|
+
storeImpactSummary(rawDb, vulnerabilityNodeId, summary) {
|
|
258
|
+
rawDb.run(
|
|
259
|
+
`INSERT OR REPLACE INTO sec_impact
|
|
260
|
+
(vulnerability_node_id, affected_layers, affected_entry_points, distinct_path_count, analyzed_at)
|
|
261
|
+
VALUES (?, ?, ?, ?, ?)`,
|
|
262
|
+
[
|
|
263
|
+
vulnerabilityNodeId,
|
|
264
|
+
JSON.stringify(summary.affectedLayers),
|
|
265
|
+
JSON.stringify(summary.affectedEntryPoints),
|
|
266
|
+
summary.distinctPathCount,
|
|
267
|
+
Date.now()
|
|
268
|
+
]
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
273
|
+
0 && (module.exports = {
|
|
274
|
+
ReachabilityAnalyzer
|
|
275
|
+
});
|
|
276
|
+
//# sourceMappingURL=reachability.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/security/reachability.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph-Sec Reachability Analyzer\n *\n * Traverses the knowledge graph from application entry points to determine\n * whether vulnerable dependencies are reachable through actual code paths.\n * Produces reachability verdicts and impact summaries enriched with\n * architectural layer context.\n *\n * Requirements: 4.1, 4.2, 4.3, 4.4, 4.6, 5.1, 5.2, 5.3, 5.4, 5.5\n */\n\nimport type { GraphDatabase } from '../db/database';\nimport type { KiroGraphConfig } from '../config';\nimport type {\n ReachabilityVerdict,\n ReachabilityPath,\n ReachabilityResult,\n ImpactSummary,\n} from './types';\n\n/** Edge kinds used for reachability traversal */\nconst TRAVERSAL_EDGE_KINDS = ['calls', 'imports', 'references'] as const;\n\n/** Maximum unresolved symbols to report */\nconst MAX_UNRESOLVED_SYMBOLS = 50;\n\n/** Maximum distinct paths to report in impact summary */\nconst MAX_DISTINCT_PATHS = 100;\n\n/**\n * ReachabilityAnalyzer traverses the knowledge graph from entry points\n * toward affected dependency nodes to determine reachability verdicts.\n */\nexport class ReachabilityAnalyzer {\n private readonly db: GraphDatabase;\n private readonly config: KiroGraphConfig;\n\n constructor(db: GraphDatabase, config: KiroGraphConfig) {\n this.db = db;\n this.config = config;\n }\n\n /**\n * Analyze reachability for a single Vulnerability_Node.\n *\n * 1. Find the Dependency_Node linked via `has_vulnerability` edge\n * 2. Find all Entry_Points in the graph\n * 3. BFS from each entry point toward the dependency node\n * 4. Assign verdict based on path existence and unresolved imports\n *\n * Requirements: 4.1, 4.2, 4.3, 4.4, 4.6\n */\n async analyze(vulnerabilityNodeId: string): Promise<ReachabilityResult> {\n const rawDb = this.db.getRawDb();\n\n // Step 1: Find the Dependency_Node linked to this vulnerability\n const depEdge = rawDb.get(\n `SELECT source FROM edges WHERE target = ? AND kind = 'has_vulnerability'`,\n [vulnerabilityNodeId],\n );\n\n if (!depEdge) {\n // No dependency linked \u2014 cannot determine reachability\n return {\n verdict: 'under_investigation',\n paths: [],\n unresolvedSymbols: [],\n reachingEntryPointCount: 0,\n };\n }\n\n const dependencyNodeId: string = depEdge.source;\n\n // Step 2: Find all Entry_Points\n // Entry points are: nodes with kind='route' OR nodes with kind='function' that are exported\n const entryPoints: Array<{ id: string }> = rawDb.all(\n `SELECT id FROM nodes WHERE kind = 'route'\n UNION\n SELECT id FROM nodes WHERE kind = 'function' AND is_exported = 1`,\n );\n\n if (entryPoints.length === 0) {\n // No entry points \u2014 cannot determine reachability\n return {\n verdict: 'not_affected',\n paths: [],\n unresolvedSymbols: [],\n reachingEntryPointCount: 0,\n };\n }\n\n // Step 3: BFS from each entry point toward the dependency node\n const reachingPaths: ReachabilityPath[] = [];\n const allUnresolvedSymbols = new Set<string>();\n\n for (const ep of entryPoints) {\n const result = this.bfsFromEntryPoint(rawDb, ep.id, dependencyNodeId);\n\n if (result.path) {\n reachingPaths.push({\n entryPoint: ep.id,\n path: result.path,\n });\n }\n\n for (const sym of result.unresolvedSymbols) {\n allUnresolvedSymbols.add(sym);\n }\n }\n\n // Step 4: Assign verdict\n const unresolvedSymbols = Array.from(allUnresolvedSymbols).slice(0, MAX_UNRESOLVED_SYMBOLS);\n\n let verdict: ReachabilityVerdict;\n if (reachingPaths.length > 0) {\n verdict = 'affected';\n } else if (allUnresolvedSymbols.size > 0) {\n verdict = 'under_investigation';\n } else {\n verdict = 'not_affected';\n }\n\n const result: ReachabilityResult = {\n verdict,\n paths: reachingPaths,\n unresolvedSymbols: verdict === 'under_investigation' ? unresolvedSymbols : [],\n reachingEntryPointCount: reachingPaths.length,\n };\n\n // Store result in sec_reachability table\n this.storeReachabilityResult(rawDb, vulnerabilityNodeId, result);\n\n return result;\n }\n\n /**\n * Produce impact summary for an affected vulnerability.\n *\n * Returns null if the vulnerability is not affected.\n * Reads layer assignments from `arch_file_layers` table.\n *\n * Requirements: 5.1, 5.2, 5.3, 5.4, 5.5\n */\n async getImpactSummary(vulnerabilityNodeId: string): Promise<ImpactSummary | null> {\n const rawDb = this.db.getRawDb();\n\n // Check if the vulnerability has verdict 'affected'\n const reachRow = rawDb.get(\n `SELECT verdict, paths, reaching_entry_point_count FROM sec_reachability WHERE vulnerability_node_id = ?`,\n [vulnerabilityNodeId],\n );\n\n if (!reachRow || reachRow.verdict !== 'affected') {\n return null;\n }\n\n const paths: ReachabilityPath[] = reachRow.paths ? JSON.parse(reachRow.paths) : [];\n\n if (paths.length === 0) {\n return null;\n }\n\n // Collect all node IDs on reachable paths\n const allNodeIds = new Set<string>();\n const affectedEntryPoints: string[] = [];\n\n for (const p of paths) {\n affectedEntryPoints.push(p.entryPoint);\n for (const nodeId of p.path) {\n allNodeIds.add(nodeId);\n }\n }\n\n // Identify architectural layers on reachable paths\n const affectedLayers = new Set<string>();\n\n if (this.config.enableArchitecture) {\n // Get file paths for all nodes on reachable paths\n const nodeIds = Array.from(allNodeIds);\n if (nodeIds.length > 0) {\n const placeholders = nodeIds.map(() => '?').join(',');\n const nodeFiles: Array<{ id: string; file_path: string }> = rawDb.all(\n `SELECT id, file_path FROM nodes WHERE id IN (${placeholders})`,\n nodeIds,\n );\n\n // Get layer assignments for those files from arch_file_layers\n const filePaths = [...new Set(nodeFiles.map(n => n.file_path).filter(Boolean))];\n if (filePaths.length > 0) {\n const filePlaceholders = filePaths.map(() => '?').join(',');\n const layerRows: Array<{ file_path: string; layer_id: string }> = rawDb.all(\n `SELECT file_path, layer_id FROM arch_file_layers WHERE file_path IN (${filePlaceholders})`,\n filePaths,\n );\n\n const fileToLayer = new Map<string, string>();\n for (const row of layerRows) {\n fileToLayer.set(row.file_path, row.layer_id);\n }\n\n // Assign layers to nodes; classify as \"unclassified\" if no layer assigned\n for (const nf of nodeFiles) {\n if (nf.file_path) {\n const layer = fileToLayer.get(nf.file_path);\n affectedLayers.add(layer ?? 'unclassified');\n }\n }\n }\n }\n }\n // When enableArchitecture is false, omit layer classification (Requirement 5.4)\n\n // Count distinct paths (capped at MAX_DISTINCT_PATHS)\n // Two paths are distinct if they differ by at least one intermediate symbol\n const distinctPathSet = new Set<string>();\n for (const p of paths) {\n // Use the full path as a key for distinctness\n const pathKey = p.path.join('\u2192');\n distinctPathSet.add(pathKey);\n if (distinctPathSet.size >= MAX_DISTINCT_PATHS) break;\n }\n\n const summary: ImpactSummary = {\n affectedLayers: Array.from(affectedLayers),\n affectedEntryPoints,\n distinctPathCount: Math.min(distinctPathSet.size, MAX_DISTINCT_PATHS),\n };\n\n // Store impact summary in sec_impact table\n this.storeImpactSummary(rawDb, vulnerabilityNodeId, summary);\n\n return summary;\n }\n\n /**\n * Analyze all Vulnerability_Nodes in the graph.\n *\n * Iterates all vulnerability nodes and calls analyze() for each.\n */\n async analyzeAll(): Promise<Map<string, ReachabilityResult>> {\n const rawDb = this.db.getRawDb();\n const results = new Map<string, ReachabilityResult>();\n\n const vulnRows: Array<{ node_id: string }> = rawDb.all(\n `SELECT node_id FROM sec_vulnerabilities`,\n );\n\n for (const row of vulnRows) {\n const result = await this.analyze(row.node_id);\n results.set(row.node_id, result);\n }\n\n return results;\n }\n\n /**\n * BFS from a single entry point toward the dependency node.\n *\n * Uses outgoing edges of types: calls, imports, references.\n * Visits each node at most once (handles cycles).\n * Tracks unresolved imports encountered during traversal.\n *\n * Returns the shortest path if found, plus any unresolved symbols encountered.\n */\n private bfsFromEntryPoint(\n rawDb: any,\n entryPointId: string,\n dependencyNodeId: string,\n ): { path: string[] | null; unresolvedSymbols: string[] } {\n const visited = new Set<string>();\n const unresolvedSymbols: string[] = [];\n\n // BFS queue: each entry is [nodeId, path from entry point]\n const queue: Array<[string, string[]]> = [[entryPointId, [entryPointId]]];\n visited.add(entryPointId);\n\n // Prepare edge kind filter\n const edgeKinds = TRAVERSAL_EDGE_KINDS.map(k => `'${k}'`).join(',');\n\n while (queue.length > 0) {\n const [currentId, currentPath] = queue.shift()!;\n\n // Get outgoing edges from current node (calls, imports, references)\n const outEdges: Array<{ target: string; kind: string }> = rawDb.all(\n `SELECT target, kind FROM edges WHERE source = ? AND kind IN (${edgeKinds})`,\n [currentId],\n );\n\n // Check if current node is an unresolved import\n // An unresolved import is a node with kind='import' that has no outgoing edges\n if (outEdges.length === 0) {\n const nodeRow = rawDb.get(\n `SELECT kind FROM nodes WHERE id = ?`,\n [currentId],\n );\n if (nodeRow && nodeRow.kind === 'import') {\n unresolvedSymbols.push(currentId);\n }\n }\n\n for (const edge of outEdges) {\n const targetId = edge.target;\n\n // Check if we reached the dependency node\n if (targetId === dependencyNodeId) {\n return {\n path: [...currentPath, targetId],\n unresolvedSymbols,\n };\n }\n\n // Skip already visited nodes (cycle handling)\n if (visited.has(targetId)) continue;\n visited.add(targetId);\n\n queue.push([targetId, [...currentPath, targetId]]);\n }\n }\n\n // No path found from this entry point\n return { path: null, unresolvedSymbols };\n }\n\n /**\n * Store reachability result in sec_reachability table.\n */\n private storeReachabilityResult(\n rawDb: any,\n vulnerabilityNodeId: string,\n result: ReachabilityResult,\n ): void {\n rawDb.run(\n `INSERT OR REPLACE INTO sec_reachability\n (vulnerability_node_id, verdict, paths, unresolved_symbols, reaching_entry_point_count, analyzed_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [\n vulnerabilityNodeId,\n result.verdict,\n result.paths.length > 0 ? JSON.stringify(result.paths) : null,\n result.unresolvedSymbols.length > 0 ? JSON.stringify(result.unresolvedSymbols) : null,\n result.reachingEntryPointCount,\n Date.now(),\n ],\n );\n }\n\n /**\n * Store impact summary in sec_impact table.\n */\n private storeImpactSummary(\n rawDb: any,\n vulnerabilityNodeId: string,\n summary: ImpactSummary,\n ): void {\n rawDb.run(\n `INSERT OR REPLACE INTO sec_impact\n (vulnerability_node_id, affected_layers, affected_entry_points, distinct_path_count, analyzed_at)\n VALUES (?, ?, ?, ?, ?)`,\n [\n vulnerabilityNodeId,\n JSON.stringify(summary.affectedLayers),\n JSON.stringify(summary.affectedEntryPoints),\n summary.distinctPathCount,\n Date.now(),\n ],\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remediation SLA Tracker
|
|
3
|
+
*
|
|
4
|
+
* Tracks how long open vulnerabilities have been known, when a fix became
|
|
5
|
+
* available, and whether remediation is overdue based on severity-based SLA
|
|
6
|
+
* thresholds.
|
|
7
|
+
*
|
|
8
|
+
* SLA thresholds:
|
|
9
|
+
* critical (CVSS ≥ 9) → 7 days
|
|
10
|
+
* high (CVSS ≥ 7) → 30 days
|
|
11
|
+
* medium (CVSS ≥ 4) → 90 days
|
|
12
|
+
* low / unknown → 180 days
|
|
13
|
+
*/
|
|
14
|
+
import type { GraphDatabase } from '../db/database';
|
|
15
|
+
export interface RemediationStatus {
|
|
16
|
+
cveId: string;
|
|
17
|
+
packageName: string;
|
|
18
|
+
severity: number | null;
|
|
19
|
+
riskScore: number | null;
|
|
20
|
+
firstDetectedAt: number | null;
|
|
21
|
+
daysOpen: number | null;
|
|
22
|
+
fixAvailableSince: number | null;
|
|
23
|
+
daysWithFixAvailable: number | null;
|
|
24
|
+
isOverdue: boolean;
|
|
25
|
+
slaStatus: 'ok' | 'warning' | 'overdue' | 'no_fix';
|
|
26
|
+
slaDeadline: number | null;
|
|
27
|
+
}
|
|
28
|
+
export declare class RemediationTracker {
|
|
29
|
+
private readonly db;
|
|
30
|
+
constructor(db: GraphDatabase);
|
|
31
|
+
/**
|
|
32
|
+
* Called when a vulnerability is first inserted.
|
|
33
|
+
* Sets first_detected_at if not already set, and fix_available_since if a
|
|
34
|
+
* fixed_version is provided and fix_available_since is not yet recorded.
|
|
35
|
+
*/
|
|
36
|
+
markDetected(vulnNodeId: string, fixedVersion: string | null): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get remediation status for all open (non-remediated, non-suppressed)
|
|
39
|
+
* vulnerabilities that have been detected.
|
|
40
|
+
*/
|
|
41
|
+
getStatus(): RemediationStatus[];
|
|
42
|
+
/**
|
|
43
|
+
* SLA thresholds by CVSS severity:
|
|
44
|
+
* critical (≥ 9) → 7 days
|
|
45
|
+
* high (≥ 7) → 30 days
|
|
46
|
+
* medium (≥ 4) → 90 days
|
|
47
|
+
* low / unknown → 180 days
|
|
48
|
+
*/
|
|
49
|
+
getSlaThresholdDays(severity: number | null): number;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=remediation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediation.d.ts","sourceRoot":"","sources":["../../src/security/remediation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAE9C;;;;OAIG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAuBnE;;;OAGG;IACH,SAAS,IAAI,iBAAiB,EAAE;IAgFhC;;;;;;OAMG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;CAOrD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var remediation_exports = {};
|
|
20
|
+
__export(remediation_exports, {
|
|
21
|
+
RemediationTracker: () => RemediationTracker
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(remediation_exports);
|
|
24
|
+
class RemediationTracker {
|
|
25
|
+
constructor(db) {
|
|
26
|
+
this.db = db;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Called when a vulnerability is first inserted.
|
|
30
|
+
* Sets first_detected_at if not already set, and fix_available_since if a
|
|
31
|
+
* fixed_version is provided and fix_available_since is not yet recorded.
|
|
32
|
+
*/
|
|
33
|
+
markDetected(vulnNodeId, fixedVersion) {
|
|
34
|
+
const rawDb = this.db.getRawDb();
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
rawDb.run(
|
|
37
|
+
`UPDATE sec_vulnerabilities
|
|
38
|
+
SET first_detected_at = COALESCE(first_detected_at, ?)
|
|
39
|
+
WHERE node_id = ?`,
|
|
40
|
+
[now, vulnNodeId]
|
|
41
|
+
);
|
|
42
|
+
if (fixedVersion) {
|
|
43
|
+
rawDb.run(
|
|
44
|
+
`UPDATE sec_vulnerabilities
|
|
45
|
+
SET fix_available_since = COALESCE(fix_available_since, ?)
|
|
46
|
+
WHERE node_id = ? AND fixed_version IS NOT NULL`,
|
|
47
|
+
[now, vulnNodeId]
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get remediation status for all open (non-remediated, non-suppressed)
|
|
53
|
+
* vulnerabilities that have been detected.
|
|
54
|
+
*/
|
|
55
|
+
getStatus() {
|
|
56
|
+
const rawDb = this.db.getRawDb();
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
const rows = rawDb.all(
|
|
59
|
+
`SELECT v.node_id, v.cve_id, v.severity_score, v.risk_score,
|
|
60
|
+
v.fixed_version, v.first_detected_at, v.fix_available_since,
|
|
61
|
+
v.suppressed_at, v.remediated_at,
|
|
62
|
+
d.package_name
|
|
63
|
+
FROM sec_vulnerabilities v
|
|
64
|
+
LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'
|
|
65
|
+
LEFT JOIN sec_dependencies d ON d.node_id = e.source
|
|
66
|
+
WHERE v.remediated_at IS NULL
|
|
67
|
+
AND v.suppressed_at IS NULL
|
|
68
|
+
AND v.first_detected_at IS NOT NULL`
|
|
69
|
+
);
|
|
70
|
+
return rows.map((row) => {
|
|
71
|
+
const firstDetectedAt = row.first_detected_at;
|
|
72
|
+
const daysOpen = firstDetectedAt !== null ? Math.floor((now - firstDetectedAt) / (1e3 * 60 * 60 * 24)) : null;
|
|
73
|
+
const fixAvailableSince = row.fix_available_since;
|
|
74
|
+
const daysWithFixAvailable = fixAvailableSince !== null ? Math.floor((now - fixAvailableSince) / (1e3 * 60 * 60 * 24)) : null;
|
|
75
|
+
const slaThreshold = this.getSlaThresholdDays(row.severity_score);
|
|
76
|
+
const slaDeadline = fixAvailableSince !== null ? fixAvailableSince + slaThreshold * 24 * 60 * 60 * 1e3 : firstDetectedAt !== null ? firstDetectedAt + slaThreshold * 24 * 60 * 60 * 1e3 : null;
|
|
77
|
+
let slaStatus;
|
|
78
|
+
let isOverdue = false;
|
|
79
|
+
if (!row.fixed_version && !fixAvailableSince) {
|
|
80
|
+
slaStatus = "no_fix";
|
|
81
|
+
isOverdue = false;
|
|
82
|
+
} else if (slaDeadline !== null && now > slaDeadline) {
|
|
83
|
+
slaStatus = "overdue";
|
|
84
|
+
isOverdue = true;
|
|
85
|
+
} else if (slaDeadline !== null && now > slaDeadline - slaThreshold * 0.5 * 24 * 60 * 60 * 1e3) {
|
|
86
|
+
slaStatus = "warning";
|
|
87
|
+
isOverdue = false;
|
|
88
|
+
} else {
|
|
89
|
+
slaStatus = "ok";
|
|
90
|
+
isOverdue = false;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
cveId: row.cve_id,
|
|
94
|
+
packageName: row.package_name ?? "unknown",
|
|
95
|
+
severity: row.severity_score,
|
|
96
|
+
riskScore: row.risk_score,
|
|
97
|
+
firstDetectedAt,
|
|
98
|
+
daysOpen,
|
|
99
|
+
fixAvailableSince,
|
|
100
|
+
daysWithFixAvailable,
|
|
101
|
+
isOverdue,
|
|
102
|
+
slaStatus,
|
|
103
|
+
slaDeadline
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* SLA thresholds by CVSS severity:
|
|
109
|
+
* critical (≥ 9) → 7 days
|
|
110
|
+
* high (≥ 7) → 30 days
|
|
111
|
+
* medium (≥ 4) → 90 days
|
|
112
|
+
* low / unknown → 180 days
|
|
113
|
+
*/
|
|
114
|
+
getSlaThresholdDays(severity) {
|
|
115
|
+
if (severity === null) return 180;
|
|
116
|
+
if (severity >= 9) return 7;
|
|
117
|
+
if (severity >= 7) return 30;
|
|
118
|
+
if (severity >= 4) return 90;
|
|
119
|
+
return 180;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
123
|
+
0 && (module.exports = {
|
|
124
|
+
RemediationTracker
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=remediation.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/security/remediation.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Remediation SLA Tracker\n *\n * Tracks how long open vulnerabilities have been known, when a fix became\n * available, and whether remediation is overdue based on severity-based SLA\n * thresholds.\n *\n * SLA thresholds:\n * critical (CVSS \u2265 9) \u2192 7 days\n * high (CVSS \u2265 7) \u2192 30 days\n * medium (CVSS \u2265 4) \u2192 90 days\n * low / unknown \u2192 180 days\n */\n\nimport type { GraphDatabase } from '../db/database';\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface RemediationStatus {\n cveId: string;\n packageName: string;\n severity: number | null;\n riskScore: number | null;\n firstDetectedAt: number | null;\n daysOpen: number | null;\n fixAvailableSince: number | null;\n daysWithFixAvailable: number | null;\n isOverdue: boolean;\n slaStatus: 'ok' | 'warning' | 'overdue' | 'no_fix';\n slaDeadline: number | null; // epoch ms\n}\n\n// \u2500\u2500 RemediationTracker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class RemediationTracker {\n constructor(private readonly db: GraphDatabase) {}\n\n /**\n * Called when a vulnerability is first inserted.\n * Sets first_detected_at if not already set, and fix_available_since if a\n * fixed_version is provided and fix_available_since is not yet recorded.\n */\n markDetected(vulnNodeId: string, fixedVersion: string | null): void {\n const rawDb = this.db.getRawDb();\n const now = Date.now();\n\n // Set first_detected_at only if not already set\n rawDb.run(\n `UPDATE sec_vulnerabilities\n SET first_detected_at = COALESCE(first_detected_at, ?)\n WHERE node_id = ?`,\n [now, vulnNodeId],\n );\n\n // Set fix_available_since if a fix is known and not yet recorded\n if (fixedVersion) {\n rawDb.run(\n `UPDATE sec_vulnerabilities\n SET fix_available_since = COALESCE(fix_available_since, ?)\n WHERE node_id = ? AND fixed_version IS NOT NULL`,\n [now, vulnNodeId],\n );\n }\n }\n\n /**\n * Get remediation status for all open (non-remediated, non-suppressed)\n * vulnerabilities that have been detected.\n */\n getStatus(): RemediationStatus[] {\n const rawDb = this.db.getRawDb();\n const now = Date.now();\n\n const rows: Array<{\n node_id: string;\n cve_id: string;\n severity_score: number | null;\n risk_score: number | null;\n fixed_version: string | null;\n first_detected_at: number | null;\n fix_available_since: number | null;\n suppressed_at: number | null;\n remediated_at: number | null;\n package_name: string | null;\n }> = rawDb.all(\n `SELECT v.node_id, v.cve_id, v.severity_score, v.risk_score,\n v.fixed_version, v.first_detected_at, v.fix_available_since,\n v.suppressed_at, v.remediated_at,\n d.package_name\n FROM sec_vulnerabilities v\n LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'\n LEFT JOIN sec_dependencies d ON d.node_id = e.source\n WHERE v.remediated_at IS NULL\n AND v.suppressed_at IS NULL\n AND v.first_detected_at IS NOT NULL`,\n );\n\n return rows.map(row => {\n const firstDetectedAt = row.first_detected_at;\n const daysOpen = firstDetectedAt !== null\n ? Math.floor((now - firstDetectedAt) / (1000 * 60 * 60 * 24))\n : null;\n\n const fixAvailableSince = row.fix_available_since;\n const daysWithFixAvailable = fixAvailableSince !== null\n ? Math.floor((now - fixAvailableSince) / (1000 * 60 * 60 * 24))\n : null;\n\n const slaThreshold = this.getSlaThresholdDays(row.severity_score);\n const slaDeadline = fixAvailableSince !== null\n ? fixAvailableSince + slaThreshold * 24 * 60 * 60 * 1000\n : firstDetectedAt !== null\n ? firstDetectedAt + slaThreshold * 24 * 60 * 60 * 1000\n : null;\n\n let slaStatus: RemediationStatus['slaStatus'];\n let isOverdue = false;\n\n if (!row.fixed_version && !fixAvailableSince) {\n slaStatus = 'no_fix';\n isOverdue = false;\n } else if (slaDeadline !== null && now > slaDeadline) {\n slaStatus = 'overdue';\n isOverdue = true;\n } else if (slaDeadline !== null && now > slaDeadline - slaThreshold * 0.5 * 24 * 60 * 60 * 1000) {\n // Over 50% of SLA elapsed\n slaStatus = 'warning';\n isOverdue = false;\n } else {\n slaStatus = 'ok';\n isOverdue = false;\n }\n\n return {\n cveId: row.cve_id,\n packageName: row.package_name ?? 'unknown',\n severity: row.severity_score,\n riskScore: row.risk_score,\n firstDetectedAt,\n daysOpen,\n fixAvailableSince,\n daysWithFixAvailable,\n isOverdue,\n slaStatus,\n slaDeadline,\n };\n });\n }\n\n /**\n * SLA thresholds by CVSS severity:\n * critical (\u2265 9) \u2192 7 days\n * high (\u2265 7) \u2192 30 days\n * medium (\u2265 4) \u2192 90 days\n * low / unknown \u2192 180 days\n */\n getSlaThresholdDays(severity: number | null): number {\n if (severity === null) return 180;\n if (severity >= 9) return 7;\n if (severity >= 7) return 30;\n if (severity >= 4) return 90;\n return 180;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCO,MAAM,mBAAmB;AAAA,EAC9B,YAA6B,IAAmB;AAAnB;AAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjD,aAAa,YAAoB,cAAmC;AAClE,UAAM,QAAQ,KAAK,GAAG,SAAS;AAC/B,UAAM,MAAM,KAAK,IAAI;AAGrB,UAAM;AAAA,MACJ;AAAA;AAAA;AAAA,MAGA,CAAC,KAAK,UAAU;AAAA,IAClB;AAGA,QAAI,cAAc;AAChB,YAAM;AAAA,QACJ;AAAA;AAAA;AAAA,QAGA,CAAC,KAAK,UAAU;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAiC;AAC/B,UAAM,QAAQ,KAAK,GAAG,SAAS;AAC/B,UAAM,MAAM,KAAK,IAAI;AAErB,UAAM,OAWD,MAAM;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUF;AAEA,WAAO,KAAK,IAAI,SAAO;AACrB,YAAM,kBAAkB,IAAI;AAC5B,YAAM,WAAW,oBAAoB,OACjC,KAAK,OAAO,MAAM,oBAAoB,MAAO,KAAK,KAAK,GAAG,IAC1D;AAEJ,YAAM,oBAAoB,IAAI;AAC9B,YAAM,uBAAuB,sBAAsB,OAC/C,KAAK,OAAO,MAAM,sBAAsB,MAAO,KAAK,KAAK,GAAG,IAC5D;AAEJ,YAAM,eAAe,KAAK,oBAAoB,IAAI,cAAc;AAChE,YAAM,cAAc,sBAAsB,OACtC,oBAAoB,eAAe,KAAK,KAAK,KAAK,MAClD,oBAAoB,OAClB,kBAAkB,eAAe,KAAK,KAAK,KAAK,MAChD;AAEN,UAAI;AACJ,UAAI,YAAY;AAEhB,UAAI,CAAC,IAAI,iBAAiB,CAAC,mBAAmB;AAC5C,oBAAY;AACZ,oBAAY;AAAA,MACd,WAAW,gBAAgB,QAAQ,MAAM,aAAa;AACpD,oBAAY;AACZ,oBAAY;AAAA,MACd,WAAW,gBAAgB,QAAQ,MAAM,cAAc,eAAe,MAAM,KAAK,KAAK,KAAK,KAAM;AAE/F,oBAAY;AACZ,oBAAY;AAAA,MACd,OAAO;AACL,oBAAY;AACZ,oBAAY;AAAA,MACd;AAEA,aAAO;AAAA,QACL,OAAO,IAAI;AAAA,QACX,aAAa,IAAI,gBAAgB;AAAA,QACjC,UAAU,IAAI;AAAA,QACd,WAAW,IAAI;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,oBAAoB,UAAiC;AACnD,QAAI,aAAa,KAAM,QAAO;AAC9B,QAAI,YAAY,EAAG,QAAO;AAC1B,QAAI,YAAY,EAAG,QAAO;AAC1B,QAAI,YAAY,EAAG,QAAO;AAC1B,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KiroGraph-Sec Secrets Scanner
|
|
3
|
+
*
|
|
4
|
+
* Regex-based secret detection that scans source files and enriches findings
|
|
5
|
+
* with call graph context (containing function + reachability from entry points).
|
|
6
|
+
*/
|
|
7
|
+
import type { GraphDatabase } from '../db/database';
|
|
8
|
+
export interface SecretFinding {
|
|
9
|
+
filePath: string;
|
|
10
|
+
line: number;
|
|
11
|
+
column: number;
|
|
12
|
+
type: string;
|
|
13
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
14
|
+
/** Redacted: first 4 chars of the matched value + "****" */
|
|
15
|
+
snippet: string;
|
|
16
|
+
nodeId?: string;
|
|
17
|
+
nodeName?: string;
|
|
18
|
+
reachableFromEntryPoints: string[];
|
|
19
|
+
entryPointCount: number;
|
|
20
|
+
}
|
|
21
|
+
export interface SecretsResult {
|
|
22
|
+
findings: SecretFinding[];
|
|
23
|
+
filesScanned: number;
|
|
24
|
+
totalFindings: number;
|
|
25
|
+
criticalCount: number;
|
|
26
|
+
highCount: number;
|
|
27
|
+
}
|
|
28
|
+
export declare class SecretsScanner {
|
|
29
|
+
private readonly db;
|
|
30
|
+
private readonly projectRoot;
|
|
31
|
+
constructor(db: GraphDatabase, projectRoot: string);
|
|
32
|
+
scan(options?: {
|
|
33
|
+
includeTests?: boolean;
|
|
34
|
+
}): Promise<SecretsResult>;
|
|
35
|
+
private findContainingNode;
|
|
36
|
+
private findEntryPoints;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/security/secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AA0DD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,EAAE,EAAE,aAAa,EACjB,WAAW,EAAE,MAAM;IAGhC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAgGxE,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,eAAe;CAoBxB"}
|