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,216 @@
|
|
|
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 turbomodules_exports = {};
|
|
20
|
+
__export(turbomodules_exports, {
|
|
21
|
+
turboModulesBridge: () => turboModulesBridge
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(turbomodules_exports);
|
|
24
|
+
function findTurboModuleSpecs(context) {
|
|
25
|
+
const specs = [];
|
|
26
|
+
const files = context.getAllFiles();
|
|
27
|
+
for (const f of files) {
|
|
28
|
+
const fileName = f.split("/").pop() ?? "";
|
|
29
|
+
if (!fileName.match(/^Native\w+\.(ts|tsx|js)$/)) continue;
|
|
30
|
+
const content = context.readFile(f);
|
|
31
|
+
if (!content) continue;
|
|
32
|
+
const specMatch = content.match(
|
|
33
|
+
/export\s+interface\s+Spec\s+extends\s+TurboModule\s*\{([^}]*)\}/s
|
|
34
|
+
);
|
|
35
|
+
if (!specMatch) continue;
|
|
36
|
+
const moduleName = fileName.replace(/^Native/, "").replace(/\.(ts|tsx|js)$/, "");
|
|
37
|
+
const methods = [];
|
|
38
|
+
const methodRegex = /(\w+)\s*\(/g;
|
|
39
|
+
let match;
|
|
40
|
+
while ((match = methodRegex.exec(specMatch[1])) !== null) {
|
|
41
|
+
methods.push(match[1]);
|
|
42
|
+
}
|
|
43
|
+
const nodes = context.getNodesInFile(f);
|
|
44
|
+
const specNode = nodes.find(
|
|
45
|
+
(n) => n.kind === "interface" && n.name === "Spec"
|
|
46
|
+
);
|
|
47
|
+
specs.push({
|
|
48
|
+
moduleName,
|
|
49
|
+
methods,
|
|
50
|
+
specFilePath: f,
|
|
51
|
+
specNodeId: specNode?.id
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return specs;
|
|
55
|
+
}
|
|
56
|
+
function findNativeImpls(context, moduleNames) {
|
|
57
|
+
const impls = [];
|
|
58
|
+
const files = context.getAllFiles();
|
|
59
|
+
for (const f of files) {
|
|
60
|
+
if (!f.endsWith(".m") && !f.endsWith(".mm") && !f.endsWith(".swift") && !f.endsWith(".java") && !f.endsWith(".kt")) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const content = context.readFile(f);
|
|
64
|
+
if (!content) continue;
|
|
65
|
+
let moduleName = null;
|
|
66
|
+
if (f.endsWith(".m") || f.endsWith(".mm")) {
|
|
67
|
+
const implMatch = content.match(/@implementation\s+(\w+)/);
|
|
68
|
+
if (implMatch) {
|
|
69
|
+
const className = implMatch[1];
|
|
70
|
+
for (const name of moduleNames) {
|
|
71
|
+
if (className === name || className === `RCT${name}` || className === `${name}Module` || className === `RCT${name}Module`) {
|
|
72
|
+
moduleName = name;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (f.endsWith(".swift")) {
|
|
79
|
+
const classMatch = content.match(/class\s+(\w+)\s*:/);
|
|
80
|
+
if (classMatch) {
|
|
81
|
+
const className = classMatch[1];
|
|
82
|
+
for (const name of moduleNames) {
|
|
83
|
+
if (className === name || className === `${name}Module`) {
|
|
84
|
+
moduleName = name;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (f.endsWith(".java") || f.endsWith(".kt")) {
|
|
91
|
+
const classMatch = content.match(/class\s+(\w+)\s+(?:extends|:)\s+\w*(?:TurboModule|ReactContextBaseJavaModule)/);
|
|
92
|
+
if (classMatch) {
|
|
93
|
+
const className = classMatch[1];
|
|
94
|
+
for (const name of moduleNames) {
|
|
95
|
+
if (className === name || className === `${name}Module`) {
|
|
96
|
+
moduleName = name;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const getNameMatch = content.match(/getName\s*\(\s*\)\s*(?::\s*String\s*)?\{[^}]*return\s*"(\w+)"/);
|
|
102
|
+
if (getNameMatch) {
|
|
103
|
+
const returnedName = getNameMatch[1];
|
|
104
|
+
if (moduleNames.has(returnedName)) {
|
|
105
|
+
moduleName = returnedName;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!moduleName) continue;
|
|
110
|
+
const nodes = context.getNodesInFile(f);
|
|
111
|
+
const methods = /* @__PURE__ */ new Map();
|
|
112
|
+
for (const node of nodes) {
|
|
113
|
+
if (node.kind === "method" || node.kind === "function") {
|
|
114
|
+
methods.set(node.name, node.id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
impls.push({ moduleName, methods, filePath: f });
|
|
118
|
+
}
|
|
119
|
+
return impls;
|
|
120
|
+
}
|
|
121
|
+
const turboModulesBridge = {
|
|
122
|
+
name: "turbomodules-bridge",
|
|
123
|
+
detect(context) {
|
|
124
|
+
const files = context.getAllFiles();
|
|
125
|
+
for (const f of files) {
|
|
126
|
+
const fileName = f.split("/").pop() ?? "";
|
|
127
|
+
if (fileName.match(/^Native\w+\.(ts|tsx|js)$/)) {
|
|
128
|
+
const content = context.readFile(f);
|
|
129
|
+
if (content && content.includes("TurboModule")) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
},
|
|
136
|
+
resolve(context) {
|
|
137
|
+
const edges = [];
|
|
138
|
+
const specs = findTurboModuleSpecs(context);
|
|
139
|
+
if (specs.length === 0) return edges;
|
|
140
|
+
const moduleNames = new Set(specs.map((s) => s.moduleName));
|
|
141
|
+
const impls = findNativeImpls(context, moduleNames);
|
|
142
|
+
for (const spec of specs) {
|
|
143
|
+
const matchingImpls = impls.filter((i) => i.moduleName === spec.moduleName);
|
|
144
|
+
for (const impl of matchingImpls) {
|
|
145
|
+
for (const method of spec.methods) {
|
|
146
|
+
const nativeNodeId = impl.methods.get(method);
|
|
147
|
+
if (!nativeNodeId) continue;
|
|
148
|
+
const callSites = findCallSitesForModule(context, spec.moduleName, method);
|
|
149
|
+
for (const callSiteId of callSites) {
|
|
150
|
+
edges.push({
|
|
151
|
+
source: callSiteId,
|
|
152
|
+
target: nativeNodeId,
|
|
153
|
+
kind: "calls",
|
|
154
|
+
confidence: "inferred",
|
|
155
|
+
confidenceScore: 0.9,
|
|
156
|
+
metadata: {
|
|
157
|
+
synthesizedBy: "turbomodules-bridge",
|
|
158
|
+
provenance: "heuristic",
|
|
159
|
+
moduleName: spec.moduleName,
|
|
160
|
+
methodName: method,
|
|
161
|
+
specFile: spec.specFilePath
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
if (spec.specNodeId) {
|
|
166
|
+
edges.push({
|
|
167
|
+
source: spec.specNodeId,
|
|
168
|
+
target: nativeNodeId,
|
|
169
|
+
kind: "references",
|
|
170
|
+
confidence: "inferred",
|
|
171
|
+
confidenceScore: 0.9,
|
|
172
|
+
metadata: {
|
|
173
|
+
synthesizedBy: "turbomodules-bridge",
|
|
174
|
+
provenance: "heuristic",
|
|
175
|
+
moduleName: spec.moduleName,
|
|
176
|
+
methodName: method
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return edges;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
function findCallSitesForModule(context, moduleName, methodName) {
|
|
187
|
+
const callSiteIds = [];
|
|
188
|
+
const files = context.getAllFiles();
|
|
189
|
+
for (const f of files) {
|
|
190
|
+
if (!f.endsWith(".ts") && !f.endsWith(".tsx") && !f.endsWith(".js") && !f.endsWith(".jsx")) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const content = context.readFile(f);
|
|
194
|
+
if (!content) continue;
|
|
195
|
+
const importPattern = new RegExp(`import\\s+\\w+\\s+from\\s+['"]\\.*/Native${moduleName}['"]`);
|
|
196
|
+
if (!importPattern.test(content)) continue;
|
|
197
|
+
const callRegex = new RegExp(`\\w+\\.${methodName}\\s*\\(`, "g");
|
|
198
|
+
let match;
|
|
199
|
+
const nodes = context.getNodesInFile(f);
|
|
200
|
+
while ((match = callRegex.exec(content)) !== null) {
|
|
201
|
+
const lineNum = content.slice(0, match.index).split("\n").length;
|
|
202
|
+
const enclosing = nodes.find(
|
|
203
|
+
(n) => (n.kind === "function" || n.kind === "method") && n.startLine <= lineNum && n.endLine >= lineNum
|
|
204
|
+
);
|
|
205
|
+
if (enclosing && !callSiteIds.includes(enclosing.id)) {
|
|
206
|
+
callSiteIds.push(enclosing.id);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return callSiteIds;
|
|
211
|
+
}
|
|
212
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
213
|
+
0 && (module.exports = {
|
|
214
|
+
turboModulesBridge
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=turbomodules.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/resolution/bridges/turbomodules.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * React Native TurboModules Bridge\n *\n * Synthesizes edges between TypeScript TurboModule spec interfaces and their\n * native implementations. TurboModules use codegen specs (Native*.ts files)\n * as the source of truth for the JS \u2194 Native contract.\n */\n\nimport type { Node } from '../../types';\nimport type { ResolutionContext } from '../../frameworks/types';\nimport type { BridgeResolver, SynthesizedEdge } from './index';\n\n// \u2500\u2500 Helpers \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\ninterface TurboModuleSpec {\n moduleName: string;\n methods: string[];\n specFilePath: string;\n specNodeId?: string;\n}\n\ninterface NativeImpl {\n moduleName: string;\n methods: Map<string, string>; // methodName \u2192 nodeId\n filePath: string;\n}\n\n/**\n * Find TurboModule spec files (Native*.ts) and extract their interfaces.\n */\nfunction findTurboModuleSpecs(context: ResolutionContext): TurboModuleSpec[] {\n const specs: TurboModuleSpec[] = [];\n const files = context.getAllFiles();\n\n for (const f of files) {\n // TurboModule specs follow the naming convention Native*.ts\n const fileName = f.split('/').pop() ?? '';\n if (!fileName.match(/^Native\\w+\\.(ts|tsx|js)$/)) continue;\n\n const content = context.readFile(f);\n if (!content) continue;\n\n // Check for TurboModule interface pattern\n const specMatch = content.match(\n /export\\s+interface\\s+Spec\\s+extends\\s+TurboModule\\s*\\{([^}]*)\\}/s\n );\n if (!specMatch) continue;\n\n // Extract module name from filename: NativeFoo.ts \u2192 Foo\n const moduleName = fileName.replace(/^Native/, '').replace(/\\.(ts|tsx|js)$/, '');\n\n // Extract method names from the interface body\n const methods: string[] = [];\n const methodRegex = /(\\w+)\\s*\\(/g;\n let match: RegExpExecArray | null;\n while ((match = methodRegex.exec(specMatch[1])) !== null) {\n methods.push(match[1]);\n }\n\n // Find the interface node\n const nodes = context.getNodesInFile(f);\n const specNode = nodes.find(\n n => n.kind === 'interface' && n.name === 'Spec'\n );\n\n specs.push({\n moduleName,\n methods,\n specFilePath: f,\n specNodeId: specNode?.id,\n });\n }\n\n return specs;\n}\n\n/**\n * Find native implementations that match TurboModule specs.\n */\nfunction findNativeImpls(context: ResolutionContext, moduleNames: Set<string>): NativeImpl[] {\n const impls: NativeImpl[] = [];\n const files = context.getAllFiles();\n\n for (const f of files) {\n if (!f.endsWith('.m') && !f.endsWith('.mm') && !f.endsWith('.swift') &&\n !f.endsWith('.java') && !f.endsWith('.kt')) {\n continue;\n }\n\n const content = context.readFile(f);\n if (!content) continue;\n\n // Try to identify which module this file implements\n let moduleName: string | null = null;\n\n // ObjC: @implementation RCT<ModuleName> or class name matching\n if (f.endsWith('.m') || f.endsWith('.mm')) {\n const implMatch = content.match(/@implementation\\s+(\\w+)/);\n if (implMatch) {\n const className = implMatch[1];\n // Try stripping common prefixes\n for (const name of moduleNames) {\n if (className === name || className === `RCT${name}` ||\n className === `${name}Module` || className === `RCT${name}Module`) {\n moduleName = name;\n break;\n }\n }\n }\n }\n\n // Swift: class that conforms to module name\n if (f.endsWith('.swift')) {\n const classMatch = content.match(/class\\s+(\\w+)\\s*:/);\n if (classMatch) {\n const className = classMatch[1];\n for (const name of moduleNames) {\n if (className === name || className === `${name}Module`) {\n moduleName = name;\n break;\n }\n }\n }\n }\n\n // Java/Kotlin: class extending ReactContextBaseJavaModule or TurboModule\n if (f.endsWith('.java') || f.endsWith('.kt')) {\n const classMatch = content.match(/class\\s+(\\w+)\\s+(?:extends|:)\\s+\\w*(?:TurboModule|ReactContextBaseJavaModule)/);\n if (classMatch) {\n const className = classMatch[1];\n for (const name of moduleNames) {\n if (className === name || className === `${name}Module`) {\n moduleName = name;\n break;\n }\n }\n }\n\n // Also check getName() return value\n const getNameMatch = content.match(/getName\\s*\\(\\s*\\)\\s*(?::\\s*String\\s*)?\\{[^}]*return\\s*\"(\\w+)\"/);\n if (getNameMatch) {\n const returnedName = getNameMatch[1];\n if (moduleNames.has(returnedName)) {\n moduleName = returnedName;\n }\n }\n }\n\n if (!moduleName) continue;\n\n // Collect method nodes\n const nodes = context.getNodesInFile(f);\n const methods = new Map<string, string>();\n for (const node of nodes) {\n if (node.kind === 'method' || node.kind === 'function') {\n methods.set(node.name, node.id);\n }\n }\n\n impls.push({ moduleName, methods, filePath: f });\n }\n\n return impls;\n}\n\n// \u2500\u2500 Bridge Implementation \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 const turboModulesBridge: BridgeResolver = {\n name: 'turbomodules-bridge',\n\n detect(context: ResolutionContext): boolean {\n const files = context.getAllFiles();\n // Check for Native*.ts spec files\n for (const f of files) {\n const fileName = f.split('/').pop() ?? '';\n if (fileName.match(/^Native\\w+\\.(ts|tsx|js)$/)) {\n const content = context.readFile(f);\n if (content && content.includes('TurboModule')) {\n return true;\n }\n }\n }\n return false;\n },\n\n resolve(context: ResolutionContext): SynthesizedEdge[] {\n const edges: SynthesizedEdge[] = [];\n\n const specs = findTurboModuleSpecs(context);\n if (specs.length === 0) return edges;\n\n const moduleNames = new Set(specs.map(s => s.moduleName));\n const impls = findNativeImpls(context, moduleNames);\n\n // Match spec methods to native implementations\n for (const spec of specs) {\n const matchingImpls = impls.filter(i => i.moduleName === spec.moduleName);\n\n for (const impl of matchingImpls) {\n for (const method of spec.methods) {\n const nativeNodeId = impl.methods.get(method);\n if (!nativeNodeId) continue;\n\n // Find JS call sites that import and use this module\n const callSites = findCallSitesForModule(context, spec.moduleName, method);\n\n for (const callSiteId of callSites) {\n edges.push({\n source: callSiteId,\n target: nativeNodeId,\n kind: 'calls',\n confidence: 'inferred',\n confidenceScore: 0.9,\n metadata: {\n synthesizedBy: 'turbomodules-bridge',\n provenance: 'heuristic',\n moduleName: spec.moduleName,\n methodName: method,\n specFile: spec.specFilePath,\n },\n });\n }\n\n // Also link spec interface to native impl\n if (spec.specNodeId) {\n edges.push({\n source: spec.specNodeId,\n target: nativeNodeId,\n kind: 'references',\n confidence: 'inferred',\n confidenceScore: 0.9,\n metadata: {\n synthesizedBy: 'turbomodules-bridge',\n provenance: 'heuristic',\n moduleName: spec.moduleName,\n methodName: method,\n },\n });\n }\n }\n }\n }\n\n return edges;\n },\n};\n\n/**\n * Find JS/TS call sites that use a specific TurboModule method.\n */\nfunction findCallSitesForModule(\n context: ResolutionContext,\n moduleName: string,\n methodName: string\n): string[] {\n const callSiteIds: string[] = [];\n const files = context.getAllFiles();\n\n for (const f of files) {\n if (!f.endsWith('.ts') && !f.endsWith('.tsx') && !f.endsWith('.js') && !f.endsWith('.jsx')) {\n continue;\n }\n\n const content = context.readFile(f);\n if (!content) continue;\n\n // Check if file imports the Native module\n const importPattern = new RegExp(`import\\\\s+\\\\w+\\\\s+from\\\\s+['\"]\\\\.*/Native${moduleName}['\"]`);\n if (!importPattern.test(content)) continue;\n\n // Find calls to the method\n const callRegex = new RegExp(`\\\\w+\\\\.${methodName}\\\\s*\\\\(`, 'g');\n let match: RegExpExecArray | null;\n const nodes = context.getNodesInFile(f);\n\n while ((match = callRegex.exec(content)) !== null) {\n const lineNum = content.slice(0, match.index).split('\\n').length;\n const enclosing = nodes.find(\n n => (n.kind === 'function' || n.kind === 'method') &&\n n.startLine <= lineNum && n.endLine >= lineNum\n );\n if (enclosing && !callSiteIds.includes(enclosing.id)) {\n callSiteIds.push(enclosing.id);\n }\n }\n }\n\n return callSiteIds;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -6,22 +6,26 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { GraphDatabase } from '../db/database';
|
|
8
8
|
import type { KiroGraphConfig } from '../config';
|
|
9
|
+
import { type BridgeResolutionResult } from './bridges';
|
|
9
10
|
export interface ResolutionResult {
|
|
10
11
|
resolved: number;
|
|
11
12
|
unresolved: number;
|
|
12
13
|
total: number;
|
|
13
14
|
durationMs: number;
|
|
15
|
+
bridgeResult?: BridgeResolutionResult;
|
|
14
16
|
}
|
|
15
17
|
export declare class ReferenceResolver {
|
|
16
18
|
private db;
|
|
17
19
|
private config;
|
|
20
|
+
private projectRoot;
|
|
18
21
|
private nameCache;
|
|
19
22
|
private qualifiedNameCache;
|
|
20
23
|
private kindCache;
|
|
21
24
|
private lowerNameCache;
|
|
22
25
|
private nodeByIdCache;
|
|
26
|
+
private namespacePrefixCache;
|
|
23
27
|
private cacheWarmed;
|
|
24
|
-
constructor(db: GraphDatabase, config: KiroGraphConfig);
|
|
28
|
+
constructor(db: GraphDatabase, config: KiroGraphConfig, projectRoot?: string);
|
|
25
29
|
/**
|
|
26
30
|
* Pre-load all nodes into Maps for O(1) lookup.
|
|
27
31
|
* Must be called before resolveUnresolvedRefs() for best performance.
|
|
@@ -44,13 +48,34 @@ export declare class ReferenceResolver {
|
|
|
44
48
|
*/
|
|
45
49
|
invalidateFile(filePath: string): void;
|
|
46
50
|
/**
|
|
47
|
-
* Resolve
|
|
48
|
-
*
|
|
51
|
+
* Resolve an import path to a node ID.
|
|
52
|
+
*
|
|
53
|
+
* Handles three cases:
|
|
54
|
+
* 1. Relative paths (JS/TS/Go/…) — resolved via the file tree.
|
|
55
|
+
* 2. Fully-qualified type imports (Java `import com.example.Foo`) — exact qualifiedName lookup,
|
|
56
|
+
* then name+namespace-prefix match.
|
|
57
|
+
* 3. Namespace-level imports (C# `using MyApp.Services`) — namespace node lookup, then
|
|
58
|
+
* namespace prefix cache (O(1)) to find any class in that namespace.
|
|
49
59
|
*/
|
|
50
60
|
private _resolveImportPath;
|
|
61
|
+
/**
|
|
62
|
+
* Resolve a bare type name to a node ID.
|
|
63
|
+
* Used for extends/implements refs where we have only the unqualified type name.
|
|
64
|
+
* Prefers class/interface/trait/protocol nodes over other kinds.
|
|
65
|
+
*/
|
|
66
|
+
private _resolveTypeName;
|
|
51
67
|
/**
|
|
52
68
|
* Convert a raw DB row to a Node object.
|
|
53
69
|
*/
|
|
54
70
|
private _rowToNode;
|
|
71
|
+
/**
|
|
72
|
+
* Run cross-language bridge resolvers to synthesize edges between
|
|
73
|
+
* symbols in different languages (Swift ↔ ObjC, JS ↔ Native, etc.).
|
|
74
|
+
*/
|
|
75
|
+
private _runBridgeResolvers;
|
|
76
|
+
/**
|
|
77
|
+
* Build a ResolutionContext for bridge resolvers using the warm caches.
|
|
78
|
+
*/
|
|
79
|
+
private _buildBridgeContext;
|
|
55
80
|
}
|
|
56
81
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolution/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolution/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGjD,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAI5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAID,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAgC;IAErD,OAAO,CAAC,oBAAoB,CAAkC;IAE9D,OAAO,CAAC,WAAW,CAAS;gBAEhB,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,MAAM;IAM5E;;;OAGG;IACH,UAAU,IAAI,IAAI;IA2DlB;;;;OAIG;IACG,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6BlG;;;OAGG;IACG,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IA+InG;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IA6DtC;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IA0D1B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,UAAU;IA2BlB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAyC5B"}
|
package/dist/resolution/index.js
CHANGED
|
@@ -23,8 +23,9 @@ __export(resolution_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(resolution_exports);
|
|
24
24
|
var import_name_matcher = require("./name-matcher");
|
|
25
25
|
var import_errors = require("../errors");
|
|
26
|
+
var import_bridges = require("./bridges");
|
|
26
27
|
class ReferenceResolver {
|
|
27
|
-
constructor(db, config) {
|
|
28
|
+
constructor(db, config, projectRoot) {
|
|
28
29
|
// Warm caches for O(1) lookup
|
|
29
30
|
this.nameCache = /* @__PURE__ */ new Map();
|
|
30
31
|
this.qualifiedNameCache = /* @__PURE__ */ new Map();
|
|
@@ -36,6 +37,7 @@ class ReferenceResolver {
|
|
|
36
37
|
this.cacheWarmed = false;
|
|
37
38
|
this.db = db;
|
|
38
39
|
this.config = config;
|
|
40
|
+
this.projectRoot = projectRoot ?? "";
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Pre-load all nodes into Maps for O(1) lookup.
|
|
@@ -93,13 +95,18 @@ class ReferenceResolver {
|
|
|
93
95
|
const rawDb = this.db.db;
|
|
94
96
|
const remaining = rawDb.get("SELECT COUNT(*) as c FROM unresolved_refs")?.c ?? 0;
|
|
95
97
|
const total = resolvedCount + remaining;
|
|
98
|
+
let bridgeResult;
|
|
99
|
+
if (this.projectRoot) {
|
|
100
|
+
bridgeResult = this._runBridgeResolvers();
|
|
101
|
+
}
|
|
96
102
|
const durationMs = Date.now() - start;
|
|
97
103
|
(0, import_errors.logDebug)(`ReferenceResolver: resolved ${resolvedCount}/${total} refs in ${durationMs}ms`);
|
|
98
104
|
return {
|
|
99
105
|
resolved: resolvedCount,
|
|
100
106
|
unresolved: remaining,
|
|
101
107
|
total,
|
|
102
|
-
durationMs
|
|
108
|
+
durationMs,
|
|
109
|
+
bridgeResult
|
|
103
110
|
};
|
|
104
111
|
}
|
|
105
112
|
/**
|
|
@@ -376,6 +383,58 @@ class ReferenceResolver {
|
|
|
376
383
|
updatedAt: row.updated_at
|
|
377
384
|
};
|
|
378
385
|
}
|
|
386
|
+
// ── Bridge Resolution ──────────────────────────────────────────────────────
|
|
387
|
+
/**
|
|
388
|
+
* Run cross-language bridge resolvers to synthesize edges between
|
|
389
|
+
* symbols in different languages (Swift ↔ ObjC, JS ↔ Native, etc.).
|
|
390
|
+
*/
|
|
391
|
+
_runBridgeResolvers() {
|
|
392
|
+
const context = this._buildBridgeContext();
|
|
393
|
+
return (0, import_bridges.runBridgeResolvers)(context, this.db);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Build a ResolutionContext for bridge resolvers using the warm caches.
|
|
397
|
+
*/
|
|
398
|
+
_buildBridgeContext() {
|
|
399
|
+
const fs = require("fs");
|
|
400
|
+
const path = require("path");
|
|
401
|
+
const projectRoot = this.projectRoot;
|
|
402
|
+
const db = this.db;
|
|
403
|
+
const nameCache = this.nameCache;
|
|
404
|
+
const kindCache = this.kindCache;
|
|
405
|
+
const fileCache = /* @__PURE__ */ new Map();
|
|
406
|
+
return {
|
|
407
|
+
getNodesInFile(filePath) {
|
|
408
|
+
return db.getNodesByFile(filePath);
|
|
409
|
+
},
|
|
410
|
+
getNodesByName(name) {
|
|
411
|
+
return nameCache.get(name) ?? [];
|
|
412
|
+
},
|
|
413
|
+
getNodesByKind(kind) {
|
|
414
|
+
return kindCache.get(kind) ?? [];
|
|
415
|
+
},
|
|
416
|
+
fileExists(filePath) {
|
|
417
|
+
return fs.existsSync(path.join(projectRoot, filePath));
|
|
418
|
+
},
|
|
419
|
+
readFile(filePath) {
|
|
420
|
+
if (fileCache.has(filePath)) return fileCache.get(filePath);
|
|
421
|
+
try {
|
|
422
|
+
const content = fs.readFileSync(path.join(projectRoot, filePath), "utf8");
|
|
423
|
+
fileCache.set(filePath, content);
|
|
424
|
+
return content;
|
|
425
|
+
} catch {
|
|
426
|
+
fileCache.set(filePath, null);
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
getProjectRoot() {
|
|
431
|
+
return projectRoot;
|
|
432
|
+
},
|
|
433
|
+
getAllFiles() {
|
|
434
|
+
return db.getAllFiles().map((f) => f.path);
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
}
|
|
379
438
|
}
|
|
380
439
|
// Annotate the CommonJS export names for ESM import in node:
|
|
381
440
|
0 && (module.exports = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/resolution/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph Reference Resolver\n *\n * Implements the warm-cache resolution engine with multiple strategies.\n * Mirrors CodeGraph src/resolution/index.ts\n */\n\nimport type { Node, NodeKind, Edge } from '../types';\nimport type { GraphDatabase } from '../db/database';\nimport type { KiroGraphConfig } from '../config';\nimport { matchReference } from './name-matcher';\nimport { logDebug, logWarn } from '../errors';\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 ResolutionResult {\n resolved: number;\n unresolved: number;\n total: number;\n durationMs: number;\n}\n\n// \u2500\u2500 ReferenceResolver \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 class ReferenceResolver {\n private db: GraphDatabase;\n private config: KiroGraphConfig;\n\n // Warm caches for O(1) lookup\n private nameCache: Map<string, Node[]> = new Map();\n private qualifiedNameCache: Map<string, Node> = new Map();\n private kindCache: Map<NodeKind, Node[]> = new Map();\n private lowerNameCache: Map<string, Node[]> = new Map();\n private nodeByIdCache: Map<string, Node> = new Map();\n // namespace prefix \u2192 first non-import node ID (for C#/Java namespace-level imports)\n private namespacePrefixCache: Map<string, string> = new Map();\n\n private cacheWarmed = false;\n\n constructor(db: GraphDatabase, config: KiroGraphConfig) {\n this.db = db;\n this.config = config;\n }\n\n /**\n * Pre-load all nodes into Maps for O(1) lookup.\n * Must be called before resolveUnresolvedRefs() for best performance.\n */\n warmCaches(): void {\n this.nameCache.clear();\n this.qualifiedNameCache.clear();\n this.kindCache.clear();\n this.lowerNameCache.clear();\n this.nodeByIdCache.clear();\n this.namespacePrefixCache.clear();\n\n // Access the underlying db instance to query all nodes\n const rawDb = (this.db as any).db;\n const rows: any[] = rawDb.all('SELECT * FROM nodes');\n\n for (const row of rows) {\n const node: Node = this._rowToNode(row);\n\n // nameCache\n const nameList = this.nameCache.get(node.name) ?? [];\n nameList.push(node);\n this.nameCache.set(node.name, nameList);\n\n // qualifiedNameCache\n if (node.qualifiedName) {\n this.qualifiedNameCache.set(node.qualifiedName, node);\n }\n\n // kindCache\n const kindList = this.kindCache.get(node.kind) ?? [];\n kindList.push(node);\n this.kindCache.set(node.kind, kindList);\n\n // lowerNameCache\n const lower = node.name.toLowerCase();\n const lowerList = this.lowerNameCache.get(lower) ?? [];\n lowerList.push(node);\n this.lowerNameCache.set(lower, lowerList);\n\n // nodeByIdCache\n this.nodeByIdCache.set(node.id, node);\n }\n\n // Build namespace prefix cache for C#/Java namespace-level import resolution.\n // For each class/interface with a dotted qualifiedName, record every ancestor\n // namespace prefix \u2192 the node ID, so \"using MyApp.Services\" resolves O(1).\n for (const [qualName, node] of this.qualifiedNameCache) {\n if (node.kind === 'class' || node.kind === 'interface' || node.kind === 'namespace' || node.kind === 'module') {\n const parts = qualName.split('.');\n for (let k = 1; k < parts.length; k++) {\n const prefix = parts.slice(0, k).join('.');\n if (!this.namespacePrefixCache.has(prefix)) {\n this.namespacePrefixCache.set(prefix, node.id);\n }\n }\n }\n }\n\n this.cacheWarmed = true;\n logDebug(`ReferenceResolver: warmed caches with ${rows.length} nodes`);\n }\n\n /**\n * Resolve all pending unresolved references.\n * Warms caches first, then processes all pending refs.\n * Returns a ResolutionResult with counts and duration.\n */\n async resolveAll(onProgress?: (current: number, total: number) => void): Promise<ResolutionResult> {\n const start = Date.now();\n\n this.warmCaches();\n const resolvedCount = await this.resolveUnresolvedRefs(onProgress);\n\n // Count remaining unresolved\n const rawDb = (this.db as any).db;\n const remaining = rawDb.get('SELECT COUNT(*) as c FROM unresolved_refs')?.c ?? 0;\n const total = resolvedCount + remaining;\n\n const durationMs = Date.now() - start;\n logDebug(`ReferenceResolver: resolved ${resolvedCount}/${total} refs in ${durationMs}ms`);\n\n return {\n resolved: resolvedCount,\n unresolved: remaining,\n total,\n durationMs,\n };\n }\n\n /**\n * Process all pending unresolved references using warm caches.\n * Returns the count of newly resolved edges.\n */\n async resolveUnresolvedRefs(onProgress?: (current: number, total: number) => void): Promise<number> {\n if (!this.cacheWarmed) {\n this.warmCaches();\n }\n\n const rawDb = (this.db as any).db;\n const refs: any[] = rawDb.all('SELECT * FROM unresolved_refs');\n let resolved = 0;\n const total = refs.length;\n\n // Process in batched transactions to avoid WASM heap exhaustion.\n // Without batching, each individual write allocates journal pages in the\n // WASM linear memory, which can exceed the 2GB limit on large codebases.\n const BATCH_SIZE = 1000;\n\n // Skip the expensive \"scan all nodes\" fuzzy fallback for very large graphs.\n // The O(N*M) cost is prohibitive and the WASM heap cannot sustain it.\n const FUZZY_ALL_NODES_LIMIT = 200_000;\n const skipFullFuzzy = this.nodeByIdCache.size > FUZZY_ALL_NODES_LIMIT;\n if (skipFullFuzzy) {\n logDebug(`ReferenceResolver: skipping full-scan fuzzy (${this.nodeByIdCache.size} nodes exceeds ${FUZZY_ALL_NODES_LIMIT} limit)`);\n }\n\n for (let batchStart = 0; batchStart < refs.length; batchStart += BATCH_SIZE) {\n const batchEnd = Math.min(batchStart + BATCH_SIZE, refs.length);\n\n // Wrap each batch in a transaction \u2014 dramatically reduces write amplification\n rawDb.run('BEGIN');\n try {\n for (let i = batchStart; i < batchEnd; i++) {\n const ref = refs[i];\n onProgress?.(i + 1, total);\n const {\n id: refId,\n source_id: sourceId,\n ref_name: refName,\n ref_kind: refKind,\n file_path: filePath,\n line,\n column,\n } = ref;\n\n const attemptedStrategies: string[] = [];\n let targetId: string | null = null;\n\n if (refKind === 'import') {\n attemptedStrategies.push('import-path');\n targetId = this._resolveImportPath(refName, filePath);\n } else if (refKind === 'extends' || refKind === 'implements') {\n attemptedStrategies.push('type-name');\n targetId = this._resolveTypeName(refName);\n } else {\n attemptedStrategies.push('framework');\n\n // Strategy 2: Qualified name match (confidence 0.95)\n attemptedStrategies.push('qualified');\n const qualifiedNode = this.qualifiedNameCache.get(refName);\n if (qualifiedNode) {\n targetId = qualifiedNode.id;\n }\n\n // Strategy 3: Method call pattern (confidence 0.85)\n if (!targetId && refName.includes('.')) {\n attemptedStrategies.push('method');\n const methodPart = refName.slice(refName.lastIndexOf('.') + 1);\n const methodCandidates = this.nameCache.get(methodPart) ?? [];\n if (methodCandidates.length > 0) {\n targetId = methodCandidates[0].id;\n }\n }\n\n // Strategy 4: Exact name match (confidence 0.9)\n if (!targetId) {\n attemptedStrategies.push('exact');\n const exactCandidates = this.nameCache.get(refName) ?? [];\n if (exactCandidates.length > 0) {\n targetId = exactCandidates[0].id;\n }\n }\n\n // Strategy 5: Fuzzy / lowercase match (confidence 0.5)\n if (!targetId) {\n attemptedStrategies.push('fuzzy');\n const threshold = this.config.fuzzyResolutionThreshold ?? 0.5;\n const lowerRef = refName.toLowerCase();\n const fuzzyCandidates = this.lowerNameCache.get(lowerRef) ?? [];\n\n if (fuzzyCandidates.length > 0) {\n const match = matchReference(refName, fuzzyCandidates, threshold);\n if (match) {\n targetId = match.nodeId;\n }\n }\n\n // Full-scan fuzzy: only for smaller graphs (O(N*M) is too expensive otherwise)\n if (!targetId && !skipFullFuzzy) {\n const allCandidates = [...this.nodeByIdCache.values()];\n const match = matchReference(refName, allCandidates, threshold);\n if (match) {\n targetId = match.nodeId;\n }\n }\n }\n }\n\n if (targetId) {\n const edgeKind = refKind === 'import' ? 'imports'\n : refKind === 'extends' ? 'extends'\n : refKind === 'implements' ? 'implements'\n : 'calls';\n const edge: Edge = {\n source: sourceId,\n target: targetId,\n kind: edgeKind,\n line: line ?? undefined,\n column: column ?? undefined,\n };\n this.db.insertEdge(edge);\n rawDb.run('DELETE FROM unresolved_refs WHERE id = ?', [refId]);\n resolved++;\n } else {\n const strategiesJson = JSON.stringify(attemptedStrategies);\n try {\n rawDb.run(\n 'UPDATE unresolved_refs SET attempted_strategies = ? WHERE id = ?',\n [strategiesJson, refId]\n );\n } catch {\n logWarn(`ReferenceResolver: failed to record attempted strategies for ref ${refId}`);\n }\n }\n }\n rawDb.run('COMMIT');\n } catch (err) {\n // Roll back the failed batch but continue with remaining batches\n try { rawDb.run('ROLLBACK'); } catch { /* already rolled back */ }\n logWarn(`ReferenceResolver: batch ${batchStart}-${batchEnd} failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return resolved;\n }\n\n /**\n * Invalidate cache entries for all nodes belonging to the given file.\n * Call this when a file is re-indexed to prevent stale cache hits.\n */\n invalidateFile(filePath: string): void {\n const nodesToRemove: Node[] = [];\n\n for (const node of this.nodeByIdCache.values()) {\n if (node.filePath === filePath) {\n nodesToRemove.push(node);\n }\n }\n\n for (const node of nodesToRemove) {\n // Remove from nodeByIdCache\n this.nodeByIdCache.delete(node.id);\n\n // Remove from nameCache\n const nameList = this.nameCache.get(node.name);\n if (nameList) {\n const filtered = nameList.filter(n => n.id !== node.id);\n if (filtered.length === 0) {\n this.nameCache.delete(node.name);\n } else {\n this.nameCache.set(node.name, filtered);\n }\n }\n\n // Remove from qualifiedNameCache\n if (node.qualifiedName) {\n const cached = this.qualifiedNameCache.get(node.qualifiedName);\n if (cached?.id === node.id) {\n this.qualifiedNameCache.delete(node.qualifiedName);\n }\n }\n\n // Remove from kindCache\n const kindList = this.kindCache.get(node.kind);\n if (kindList) {\n const filtered = kindList.filter(n => n.id !== node.id);\n if (filtered.length === 0) {\n this.kindCache.delete(node.kind);\n } else {\n this.kindCache.set(node.kind, filtered);\n }\n }\n\n // Remove from lowerNameCache\n const lower = node.name.toLowerCase();\n const lowerList = this.lowerNameCache.get(lower);\n if (lowerList) {\n const filtered = lowerList.filter(n => n.id !== node.id);\n if (filtered.length === 0) {\n this.lowerNameCache.delete(lower);\n } else {\n this.lowerNameCache.set(lower, filtered);\n }\n }\n }\n\n logDebug(`ReferenceResolver: invalidated ${nodesToRemove.length} cache entries for ${filePath}`);\n }\n\n // \u2500\u2500 Private helpers \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\n /**\n * Resolve an import path to a node ID.\n *\n * Handles three cases:\n * 1. Relative paths (JS/TS/Go/\u2026) \u2014 resolved via the file tree.\n * 2. Fully-qualified type imports (Java `import com.example.Foo`) \u2014 exact qualifiedName lookup,\n * then name+namespace-prefix match.\n * 3. Namespace-level imports (C# `using MyApp.Services`) \u2014 namespace node lookup, then\n * namespace prefix cache (O(1)) to find any class in that namespace.\n */\n private _resolveImportPath(importPath: string, sourceFilePath: string): string | null {\n // \u2500\u2500 1. Relative path (JS/TS etc.) \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 if (importPath.startsWith('.')) {\n const sourceDir = sourceFilePath.replace(/[^/]+$/, '');\n const segments = (sourceDir + importPath).split('/');\n const normalized: string[] = [];\n for (const seg of segments) {\n if (seg === '..') normalized.pop();\n else if (seg !== '.') normalized.push(seg);\n }\n const basePath = normalized.join('/');\n const candidates = [\n basePath,\n basePath + '.ts', basePath + '.tsx',\n basePath + '.js', basePath + '.jsx',\n basePath + '/index.ts', basePath + '/index.tsx', basePath + '/index.js',\n ];\n const rawDb = (this.db as any).db;\n for (const candidate of candidates) {\n const row = rawDb.get('SELECT id FROM nodes WHERE file_path = ? LIMIT 1', [candidate]);\n if (row) return row.id;\n }\n return null;\n }\n\n // \u2500\u2500 2. Wildcard namespace import (`import com.example.*`, `using static \u2026`) \u2500\n if (importPath.endsWith('.*') || importPath.endsWith('*')) {\n const ns = importPath.replace(/\\.\\*$/, '').replace(/\\*$/, '');\n return this.namespacePrefixCache.get(ns) ?? null;\n }\n\n // \u2500\u2500 3. Exact qualifiedName match (Java `import com.example.Foo`) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const exact = this.qualifiedNameCache.get(importPath);\n if (exact) return exact.id;\n\n // \u2500\u2500 4. Name + namespace prefix (Java: last segment is the type name) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const lastDot = importPath.lastIndexOf('.');\n if (lastDot > 0) {\n const typeName = importPath.slice(lastDot + 1);\n const namespace = importPath.slice(0, lastDot);\n const candidates = this.nameCache.get(typeName) ?? [];\n for (const candidate of candidates) {\n if (candidate.qualifiedName && candidate.qualifiedName.startsWith(namespace)) {\n return candidate.id;\n }\n }\n }\n\n // \u2500\u2500 5. Namespace-level import (C# `using MyApp.Services`) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // First check for an explicit namespace node with this name\n const nsCandidates = this.nameCache.get(importPath.split('.').pop() ?? '') ?? [];\n for (const candidate of nsCandidates) {\n if (candidate.kind === 'namespace' && candidate.name === importPath) return candidate.id;\n }\n // Then fall back to the prefix cache: return any class/interface in this namespace\n return this.namespacePrefixCache.get(importPath) ?? null;\n }\n\n /**\n * Resolve a bare type name to a node ID.\n * Used for extends/implements refs where we have only the unqualified type name.\n * Prefers class/interface/trait/protocol nodes over other kinds.\n */\n private _resolveTypeName(name: string): string | null {\n const candidates = this.nameCache.get(name) ?? [];\n if (candidates.length > 0) {\n const preferred = candidates.find(n =>\n n.kind === 'class' || n.kind === 'interface' || n.kind === 'trait' || n.kind === 'protocol'\n );\n return (preferred ?? candidates[0]).id;\n }\n // Try as a fully-qualified name\n const qualified = this.qualifiedNameCache.get(name);\n if (qualified) return qualified.id;\n return null;\n }\n\n /**\n * Convert a raw DB row to a Node object.\n */\n private _rowToNode(row: any): Node {\n return {\n id: row.id,\n kind: row.kind,\n name: row.name,\n qualifiedName: row.qualified_name,\n filePath: row.file_path,\n language: row.language,\n startLine: row.start_line,\n endLine: row.end_line,\n startColumn: row.start_column,\n endColumn: row.end_column,\n docstring: row.docstring ?? undefined,\n signature: row.signature ?? undefined,\n visibility: row.visibility ?? undefined,\n isExported: row.is_exported === 1,\n isAsync: row.is_async === 1,\n isStatic: row.is_static === 1,\n isAbstract: row.is_abstract === 1,\n decorators: row.decorators ? JSON.parse(row.decorators) : undefined,\n typeParameters: row.type_parameters ? JSON.parse(row.type_parameters) : undefined,\n updatedAt: row.updated_at,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,0BAA+B;AAC/B,oBAAkC;
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph Reference Resolver\n *\n * Implements the warm-cache resolution engine with multiple strategies.\n * Mirrors CodeGraph src/resolution/index.ts\n */\n\nimport type { Node, NodeKind, Edge } from '../types';\nimport type { GraphDatabase } from '../db/database';\nimport type { KiroGraphConfig } from '../config';\nimport { matchReference } from './name-matcher';\nimport { logDebug, logWarn } from '../errors';\nimport { runBridgeResolvers, type BridgeResolutionResult } from './bridges';\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 ResolutionResult {\n resolved: number;\n unresolved: number;\n total: number;\n durationMs: number;\n bridgeResult?: BridgeResolutionResult;\n}\n\n// \u2500\u2500 ReferenceResolver \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 class ReferenceResolver {\n private db: GraphDatabase;\n private config: KiroGraphConfig;\n private projectRoot: string;\n\n // Warm caches for O(1) lookup\n private nameCache: Map<string, Node[]> = new Map();\n private qualifiedNameCache: Map<string, Node> = new Map();\n private kindCache: Map<NodeKind, Node[]> = new Map();\n private lowerNameCache: Map<string, Node[]> = new Map();\n private nodeByIdCache: Map<string, Node> = new Map();\n // namespace prefix \u2192 first non-import node ID (for C#/Java namespace-level imports)\n private namespacePrefixCache: Map<string, string> = new Map();\n\n private cacheWarmed = false;\n\n constructor(db: GraphDatabase, config: KiroGraphConfig, projectRoot?: string) {\n this.db = db;\n this.config = config;\n this.projectRoot = projectRoot ?? '';\n }\n\n /**\n * Pre-load all nodes into Maps for O(1) lookup.\n * Must be called before resolveUnresolvedRefs() for best performance.\n */\n warmCaches(): void {\n this.nameCache.clear();\n this.qualifiedNameCache.clear();\n this.kindCache.clear();\n this.lowerNameCache.clear();\n this.nodeByIdCache.clear();\n this.namespacePrefixCache.clear();\n\n // Access the underlying db instance to query all nodes\n const rawDb = (this.db as any).db;\n const rows: any[] = rawDb.all('SELECT * FROM nodes');\n\n for (const row of rows) {\n const node: Node = this._rowToNode(row);\n\n // nameCache\n const nameList = this.nameCache.get(node.name) ?? [];\n nameList.push(node);\n this.nameCache.set(node.name, nameList);\n\n // qualifiedNameCache\n if (node.qualifiedName) {\n this.qualifiedNameCache.set(node.qualifiedName, node);\n }\n\n // kindCache\n const kindList = this.kindCache.get(node.kind) ?? [];\n kindList.push(node);\n this.kindCache.set(node.kind, kindList);\n\n // lowerNameCache\n const lower = node.name.toLowerCase();\n const lowerList = this.lowerNameCache.get(lower) ?? [];\n lowerList.push(node);\n this.lowerNameCache.set(lower, lowerList);\n\n // nodeByIdCache\n this.nodeByIdCache.set(node.id, node);\n }\n\n // Build namespace prefix cache for C#/Java namespace-level import resolution.\n // For each class/interface with a dotted qualifiedName, record every ancestor\n // namespace prefix \u2192 the node ID, so \"using MyApp.Services\" resolves O(1).\n for (const [qualName, node] of this.qualifiedNameCache) {\n if (node.kind === 'class' || node.kind === 'interface' || node.kind === 'namespace' || node.kind === 'module') {\n const parts = qualName.split('.');\n for (let k = 1; k < parts.length; k++) {\n const prefix = parts.slice(0, k).join('.');\n if (!this.namespacePrefixCache.has(prefix)) {\n this.namespacePrefixCache.set(prefix, node.id);\n }\n }\n }\n }\n\n this.cacheWarmed = true;\n logDebug(`ReferenceResolver: warmed caches with ${rows.length} nodes`);\n }\n\n /**\n * Resolve all pending unresolved references.\n * Warms caches first, then processes all pending refs.\n * Returns a ResolutionResult with counts and duration.\n */\n async resolveAll(onProgress?: (current: number, total: number) => void): Promise<ResolutionResult> {\n const start = Date.now();\n\n this.warmCaches();\n const resolvedCount = await this.resolveUnresolvedRefs(onProgress);\n\n // Count remaining unresolved\n const rawDb = (this.db as any).db;\n const remaining = rawDb.get('SELECT COUNT(*) as c FROM unresolved_refs')?.c ?? 0;\n const total = resolvedCount + remaining;\n\n // Run cross-language bridge resolvers after standard resolution\n let bridgeResult: BridgeResolutionResult | undefined;\n if (this.projectRoot) {\n bridgeResult = this._runBridgeResolvers();\n }\n\n const durationMs = Date.now() - start;\n logDebug(`ReferenceResolver: resolved ${resolvedCount}/${total} refs in ${durationMs}ms`);\n\n return {\n resolved: resolvedCount,\n unresolved: remaining,\n total,\n durationMs,\n bridgeResult,\n };\n }\n\n /**\n * Process all pending unresolved references using warm caches.\n * Returns the count of newly resolved edges.\n */\n async resolveUnresolvedRefs(onProgress?: (current: number, total: number) => void): Promise<number> {\n if (!this.cacheWarmed) {\n this.warmCaches();\n }\n\n const rawDb = (this.db as any).db;\n const refs: any[] = rawDb.all('SELECT * FROM unresolved_refs');\n let resolved = 0;\n const total = refs.length;\n\n // Process in batched transactions to avoid WASM heap exhaustion.\n // Without batching, each individual write allocates journal pages in the\n // WASM linear memory, which can exceed the 2GB limit on large codebases.\n const BATCH_SIZE = 1000;\n\n // Skip the expensive \"scan all nodes\" fuzzy fallback for very large graphs.\n // The O(N*M) cost is prohibitive and the WASM heap cannot sustain it.\n const FUZZY_ALL_NODES_LIMIT = 200_000;\n const skipFullFuzzy = this.nodeByIdCache.size > FUZZY_ALL_NODES_LIMIT;\n if (skipFullFuzzy) {\n logDebug(`ReferenceResolver: skipping full-scan fuzzy (${this.nodeByIdCache.size} nodes exceeds ${FUZZY_ALL_NODES_LIMIT} limit)`);\n }\n\n for (let batchStart = 0; batchStart < refs.length; batchStart += BATCH_SIZE) {\n const batchEnd = Math.min(batchStart + BATCH_SIZE, refs.length);\n\n // Wrap each batch in a transaction \u2014 dramatically reduces write amplification\n rawDb.run('BEGIN');\n try {\n for (let i = batchStart; i < batchEnd; i++) {\n const ref = refs[i];\n onProgress?.(i + 1, total);\n const {\n id: refId,\n source_id: sourceId,\n ref_name: refName,\n ref_kind: refKind,\n file_path: filePath,\n line,\n column,\n } = ref;\n\n const attemptedStrategies: string[] = [];\n let targetId: string | null = null;\n\n if (refKind === 'import') {\n attemptedStrategies.push('import-path');\n targetId = this._resolveImportPath(refName, filePath);\n } else if (refKind === 'extends' || refKind === 'implements') {\n attemptedStrategies.push('type-name');\n targetId = this._resolveTypeName(refName);\n } else {\n attemptedStrategies.push('framework');\n\n // Strategy 2: Qualified name match (confidence 0.95)\n attemptedStrategies.push('qualified');\n const qualifiedNode = this.qualifiedNameCache.get(refName);\n if (qualifiedNode) {\n targetId = qualifiedNode.id;\n }\n\n // Strategy 3: Method call pattern (confidence 0.85)\n if (!targetId && refName.includes('.')) {\n attemptedStrategies.push('method');\n const methodPart = refName.slice(refName.lastIndexOf('.') + 1);\n const methodCandidates = this.nameCache.get(methodPart) ?? [];\n if (methodCandidates.length > 0) {\n targetId = methodCandidates[0].id;\n }\n }\n\n // Strategy 4: Exact name match (confidence 0.9)\n if (!targetId) {\n attemptedStrategies.push('exact');\n const exactCandidates = this.nameCache.get(refName) ?? [];\n if (exactCandidates.length > 0) {\n targetId = exactCandidates[0].id;\n }\n }\n\n // Strategy 5: Fuzzy / lowercase match (confidence 0.5)\n if (!targetId) {\n attemptedStrategies.push('fuzzy');\n const threshold = this.config.fuzzyResolutionThreshold ?? 0.5;\n const lowerRef = refName.toLowerCase();\n const fuzzyCandidates = this.lowerNameCache.get(lowerRef) ?? [];\n\n if (fuzzyCandidates.length > 0) {\n const match = matchReference(refName, fuzzyCandidates, threshold);\n if (match) {\n targetId = match.nodeId;\n }\n }\n\n // Full-scan fuzzy: only for smaller graphs (O(N*M) is too expensive otherwise)\n if (!targetId && !skipFullFuzzy) {\n const allCandidates = [...this.nodeByIdCache.values()];\n const match = matchReference(refName, allCandidates, threshold);\n if (match) {\n targetId = match.nodeId;\n }\n }\n }\n }\n\n if (targetId) {\n const edgeKind = refKind === 'import' ? 'imports'\n : refKind === 'extends' ? 'extends'\n : refKind === 'implements' ? 'implements'\n : 'calls';\n const edge: Edge = {\n source: sourceId,\n target: targetId,\n kind: edgeKind,\n line: line ?? undefined,\n column: column ?? undefined,\n };\n this.db.insertEdge(edge);\n rawDb.run('DELETE FROM unresolved_refs WHERE id = ?', [refId]);\n resolved++;\n } else {\n const strategiesJson = JSON.stringify(attemptedStrategies);\n try {\n rawDb.run(\n 'UPDATE unresolved_refs SET attempted_strategies = ? WHERE id = ?',\n [strategiesJson, refId]\n );\n } catch {\n logWarn(`ReferenceResolver: failed to record attempted strategies for ref ${refId}`);\n }\n }\n }\n rawDb.run('COMMIT');\n } catch (err) {\n // Roll back the failed batch but continue with remaining batches\n try { rawDb.run('ROLLBACK'); } catch { /* already rolled back */ }\n logWarn(`ReferenceResolver: batch ${batchStart}-${batchEnd} failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return resolved;\n }\n\n /**\n * Invalidate cache entries for all nodes belonging to the given file.\n * Call this when a file is re-indexed to prevent stale cache hits.\n */\n invalidateFile(filePath: string): void {\n const nodesToRemove: Node[] = [];\n\n for (const node of this.nodeByIdCache.values()) {\n if (node.filePath === filePath) {\n nodesToRemove.push(node);\n }\n }\n\n for (const node of nodesToRemove) {\n // Remove from nodeByIdCache\n this.nodeByIdCache.delete(node.id);\n\n // Remove from nameCache\n const nameList = this.nameCache.get(node.name);\n if (nameList) {\n const filtered = nameList.filter(n => n.id !== node.id);\n if (filtered.length === 0) {\n this.nameCache.delete(node.name);\n } else {\n this.nameCache.set(node.name, filtered);\n }\n }\n\n // Remove from qualifiedNameCache\n if (node.qualifiedName) {\n const cached = this.qualifiedNameCache.get(node.qualifiedName);\n if (cached?.id === node.id) {\n this.qualifiedNameCache.delete(node.qualifiedName);\n }\n }\n\n // Remove from kindCache\n const kindList = this.kindCache.get(node.kind);\n if (kindList) {\n const filtered = kindList.filter(n => n.id !== node.id);\n if (filtered.length === 0) {\n this.kindCache.delete(node.kind);\n } else {\n this.kindCache.set(node.kind, filtered);\n }\n }\n\n // Remove from lowerNameCache\n const lower = node.name.toLowerCase();\n const lowerList = this.lowerNameCache.get(lower);\n if (lowerList) {\n const filtered = lowerList.filter(n => n.id !== node.id);\n if (filtered.length === 0) {\n this.lowerNameCache.delete(lower);\n } else {\n this.lowerNameCache.set(lower, filtered);\n }\n }\n }\n\n logDebug(`ReferenceResolver: invalidated ${nodesToRemove.length} cache entries for ${filePath}`);\n }\n\n // \u2500\u2500 Private helpers \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\n /**\n * Resolve an import path to a node ID.\n *\n * Handles three cases:\n * 1. Relative paths (JS/TS/Go/\u2026) \u2014 resolved via the file tree.\n * 2. Fully-qualified type imports (Java `import com.example.Foo`) \u2014 exact qualifiedName lookup,\n * then name+namespace-prefix match.\n * 3. Namespace-level imports (C# `using MyApp.Services`) \u2014 namespace node lookup, then\n * namespace prefix cache (O(1)) to find any class in that namespace.\n */\n private _resolveImportPath(importPath: string, sourceFilePath: string): string | null {\n // \u2500\u2500 1. Relative path (JS/TS etc.) \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 if (importPath.startsWith('.')) {\n const sourceDir = sourceFilePath.replace(/[^/]+$/, '');\n const segments = (sourceDir + importPath).split('/');\n const normalized: string[] = [];\n for (const seg of segments) {\n if (seg === '..') normalized.pop();\n else if (seg !== '.') normalized.push(seg);\n }\n const basePath = normalized.join('/');\n const candidates = [\n basePath,\n basePath + '.ts', basePath + '.tsx',\n basePath + '.js', basePath + '.jsx',\n basePath + '/index.ts', basePath + '/index.tsx', basePath + '/index.js',\n ];\n const rawDb = (this.db as any).db;\n for (const candidate of candidates) {\n const row = rawDb.get('SELECT id FROM nodes WHERE file_path = ? LIMIT 1', [candidate]);\n if (row) return row.id;\n }\n return null;\n }\n\n // \u2500\u2500 2. Wildcard namespace import (`import com.example.*`, `using static \u2026`) \u2500\n if (importPath.endsWith('.*') || importPath.endsWith('*')) {\n const ns = importPath.replace(/\\.\\*$/, '').replace(/\\*$/, '');\n return this.namespacePrefixCache.get(ns) ?? null;\n }\n\n // \u2500\u2500 3. Exact qualifiedName match (Java `import com.example.Foo`) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const exact = this.qualifiedNameCache.get(importPath);\n if (exact) return exact.id;\n\n // \u2500\u2500 4. Name + namespace prefix (Java: last segment is the type name) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const lastDot = importPath.lastIndexOf('.');\n if (lastDot > 0) {\n const typeName = importPath.slice(lastDot + 1);\n const namespace = importPath.slice(0, lastDot);\n const candidates = this.nameCache.get(typeName) ?? [];\n for (const candidate of candidates) {\n if (candidate.qualifiedName && candidate.qualifiedName.startsWith(namespace)) {\n return candidate.id;\n }\n }\n }\n\n // \u2500\u2500 5. Namespace-level import (C# `using MyApp.Services`) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // First check for an explicit namespace node with this name\n const nsCandidates = this.nameCache.get(importPath.split('.').pop() ?? '') ?? [];\n for (const candidate of nsCandidates) {\n if (candidate.kind === 'namespace' && candidate.name === importPath) return candidate.id;\n }\n // Then fall back to the prefix cache: return any class/interface in this namespace\n return this.namespacePrefixCache.get(importPath) ?? null;\n }\n\n /**\n * Resolve a bare type name to a node ID.\n * Used for extends/implements refs where we have only the unqualified type name.\n * Prefers class/interface/trait/protocol nodes over other kinds.\n */\n private _resolveTypeName(name: string): string | null {\n const candidates = this.nameCache.get(name) ?? [];\n if (candidates.length > 0) {\n const preferred = candidates.find(n =>\n n.kind === 'class' || n.kind === 'interface' || n.kind === 'trait' || n.kind === 'protocol'\n );\n return (preferred ?? candidates[0]).id;\n }\n // Try as a fully-qualified name\n const qualified = this.qualifiedNameCache.get(name);\n if (qualified) return qualified.id;\n return null;\n }\n\n /**\n * Convert a raw DB row to a Node object.\n */\n private _rowToNode(row: any): Node {\n return {\n id: row.id,\n kind: row.kind,\n name: row.name,\n qualifiedName: row.qualified_name,\n filePath: row.file_path,\n language: row.language,\n startLine: row.start_line,\n endLine: row.end_line,\n startColumn: row.start_column,\n endColumn: row.end_column,\n docstring: row.docstring ?? undefined,\n signature: row.signature ?? undefined,\n visibility: row.visibility ?? undefined,\n isExported: row.is_exported === 1,\n isAsync: row.is_async === 1,\n isStatic: row.is_static === 1,\n isAbstract: row.is_abstract === 1,\n decorators: row.decorators ? JSON.parse(row.decorators) : undefined,\n typeParameters: row.type_parameters ? JSON.parse(row.type_parameters) : undefined,\n updatedAt: row.updated_at,\n };\n }\n\n // \u2500\u2500 Bridge Resolution \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\n /**\n * Run cross-language bridge resolvers to synthesize edges between\n * symbols in different languages (Swift \u2194 ObjC, JS \u2194 Native, etc.).\n */\n private _runBridgeResolvers(): BridgeResolutionResult {\n const context = this._buildBridgeContext();\n return runBridgeResolvers(context, this.db);\n }\n\n /**\n * Build a ResolutionContext for bridge resolvers using the warm caches.\n */\n private _buildBridgeContext(): import('../frameworks/types').ResolutionContext {\n const fs = require('fs') as typeof import('fs');\n const path = require('path') as typeof import('path');\n const projectRoot = this.projectRoot;\n const db = this.db;\n const nameCache = this.nameCache;\n const kindCache = this.kindCache;\n const fileCache = new Map<string, string | null>();\n\n return {\n getNodesInFile(filePath: string): Node[] {\n return db.getNodesByFile(filePath);\n },\n getNodesByName(name: string): Node[] {\n return nameCache.get(name) ?? [];\n },\n getNodesByKind(kind: Node['kind']): Node[] {\n return kindCache.get(kind) ?? [];\n },\n fileExists(filePath: string): boolean {\n return fs.existsSync(path.join(projectRoot, filePath));\n },\n readFile(filePath: string): string | null {\n if (fileCache.has(filePath)) return fileCache.get(filePath)!;\n try {\n const content = fs.readFileSync(path.join(projectRoot, filePath), 'utf8');\n fileCache.set(filePath, content);\n return content;\n } catch {\n fileCache.set(filePath, null);\n return null;\n }\n },\n getProjectRoot(): string {\n return projectRoot;\n },\n getAllFiles(): string[] {\n return db.getAllFiles().map((f: any) => f.path);\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KiroGraph-Sec Attack Surface Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Maps all route nodes in the knowledge graph to their reachable vulnerable
|
|
5
|
+
* dependencies, computing exposure levels and risk scores per route.
|
|
6
|
+
*/
|
|
7
|
+
import type { GraphDatabase } from '../db/database';
|
|
8
|
+
export interface AttackSurfaceEntry {
|
|
9
|
+
route: string;
|
|
10
|
+
nodeId: string;
|
|
11
|
+
filePath: string;
|
|
12
|
+
isAuthenticated: boolean;
|
|
13
|
+
exposureLevel: 'public' | 'authenticated' | 'internal' | 'unknown';
|
|
14
|
+
vulnerableDeps: Array<{
|
|
15
|
+
cveId: string;
|
|
16
|
+
packageName: string;
|
|
17
|
+
severity: number | null;
|
|
18
|
+
epssScore: number | null;
|
|
19
|
+
riskScore: number | null;
|
|
20
|
+
verdict: string | null;
|
|
21
|
+
hopCount: number;
|
|
22
|
+
}>;
|
|
23
|
+
patternMatches: Array<{
|
|
24
|
+
patternId: string;
|
|
25
|
+
severity: string;
|
|
26
|
+
line: number;
|
|
27
|
+
symbolNodeId: string;
|
|
28
|
+
symbolName: string;
|
|
29
|
+
}>;
|
|
30
|
+
patternRiskLevel: 'none' | 'low' | 'medium' | 'high' | 'critical';
|
|
31
|
+
riskScore: number;
|
|
32
|
+
}
|
|
33
|
+
export interface AttackSurfaceResult {
|
|
34
|
+
totalRoutes: number;
|
|
35
|
+
publicRoutes: number;
|
|
36
|
+
authenticatedRoutes: number;
|
|
37
|
+
routesWithVulns: number;
|
|
38
|
+
criticalPaths: AttackSurfaceEntry[];
|
|
39
|
+
allRoutes: AttackSurfaceEntry[];
|
|
40
|
+
}
|
|
41
|
+
export declare class AttackSurfaceAnalyzer {
|
|
42
|
+
private readonly db;
|
|
43
|
+
constructor(db: GraphDatabase);
|
|
44
|
+
analyze(): Promise<AttackSurfaceResult>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=attack-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attack-surface.d.ts","sourceRoot":"","sources":["../../src/security/attack-surface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAsBpD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,QAAQ,GAAG,eAAe,GAAG,UAAU,GAAG,SAAS,CAAC;IACnE,cAAc,EAAE,KAAK,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,gBAAgB,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAExC,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAgN9C"}
|