homegraph 0.9.10 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +243 -193
- package/dist/bin/fatal-handler.d.ts +20 -0
- package/dist/bin/fatal-handler.d.ts.map +1 -0
- package/dist/bin/fatal-handler.js +118 -0
- package/dist/bin/fatal-handler.js.map +1 -0
- package/dist/bin/homegraph.d.ts +6 -6
- package/dist/bin/homegraph.js +532 -109
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/bin/node-version-check.d.ts +4 -4
- package/dist/bin/node-version-check.js +12 -12
- package/dist/bin/uninstall.d.ts +1 -1
- package/dist/bin/uninstall.js +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +8 -1
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts +22 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +48 -2
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +26 -17
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +21 -1
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +180 -137
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +152 -151
- package/dist/db/sqlite-adapter.d.ts +1 -1
- package/dist/db/sqlite-adapter.js +3 -3
- package/dist/directory.d.ts +87 -6
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +319 -57
- package/dist/directory.js.map +1 -1
- package/dist/errors.d.ts +15 -15
- package/dist/errors.js +20 -20
- package/dist/extraction/astro-extractor.d.ts +79 -0
- package/dist/extraction/astro-extractor.d.ts.map +1 -0
- package/dist/extraction/astro-extractor.js +320 -0
- package/dist/extraction/astro-extractor.js.map +1 -0
- package/dist/extraction/context.d.ts +1 -1
- package/dist/extraction/context.js +1 -1
- package/dist/extraction/extraction-version.d.ts +2 -2
- package/dist/extraction/extraction-version.d.ts.map +1 -1
- package/dist/extraction/extraction-version.js +2 -2
- package/dist/extraction/extraction-version.js.map +1 -1
- package/dist/extraction/function-ref.d.ts +118 -0
- package/dist/extraction/function-ref.d.ts.map +1 -0
- package/dist/extraction/function-ref.js +727 -0
- package/dist/extraction/function-ref.js.map +1 -0
- package/dist/extraction/generated-detection.d.ts.map +1 -1
- package/dist/extraction/generated-detection.js +3 -0
- package/dist/extraction/generated-detection.js.map +1 -1
- package/dist/extraction/grammars.d.ts +15 -5
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +44 -10
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts +37 -0
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +562 -70
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts-viewtree.d.ts +22 -0
- package/dist/extraction/languages/arkts-viewtree.d.ts.map +1 -0
- package/dist/extraction/languages/arkts-viewtree.js +133 -0
- package/dist/extraction/languages/arkts-viewtree.js.map +1 -0
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +211 -20
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/languages/c-cpp.d.ts +8 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
- package/dist/extraction/languages/c-cpp.js +104 -2
- package/dist/extraction/languages/c-cpp.js.map +1 -1
- package/dist/extraction/languages/csharp.d.ts.map +1 -1
- package/dist/extraction/languages/csharp.js +58 -3
- package/dist/extraction/languages/csharp.js.map +1 -1
- package/dist/extraction/languages/dart.d.ts.map +1 -1
- package/dist/extraction/languages/dart.js +183 -1
- package/dist/extraction/languages/dart.js.map +1 -1
- package/dist/extraction/languages/go.d.ts.map +1 -1
- package/dist/extraction/languages/go.js +37 -0
- package/dist/extraction/languages/go.js.map +1 -1
- package/dist/extraction/languages/index.d.ts.map +1 -1
- package/dist/extraction/languages/index.js +2 -0
- package/dist/extraction/languages/index.js.map +1 -1
- package/dist/extraction/languages/java.d.ts.map +1 -1
- package/dist/extraction/languages/java.js +241 -0
- package/dist/extraction/languages/java.js.map +1 -1
- package/dist/extraction/languages/javascript.d.ts.map +1 -1
- package/dist/extraction/languages/javascript.js +16 -0
- package/dist/extraction/languages/javascript.js.map +1 -1
- package/dist/extraction/languages/kotlin.d.ts.map +1 -1
- package/dist/extraction/languages/kotlin.js +94 -0
- package/dist/extraction/languages/kotlin.js.map +1 -1
- package/dist/extraction/languages/objc.d.ts.map +1 -1
- package/dist/extraction/languages/objc.js +42 -0
- package/dist/extraction/languages/objc.js.map +1 -1
- package/dist/extraction/languages/pascal.d.ts.map +1 -1
- package/dist/extraction/languages/pascal.js +11 -0
- package/dist/extraction/languages/pascal.js.map +1 -1
- package/dist/extraction/languages/php.d.ts.map +1 -1
- package/dist/extraction/languages/php.js +77 -1
- package/dist/extraction/languages/php.js.map +1 -1
- package/dist/extraction/languages/r.d.ts +3 -0
- package/dist/extraction/languages/r.d.ts.map +1 -0
- package/dist/extraction/languages/r.js +314 -0
- package/dist/extraction/languages/r.js.map +1 -0
- package/dist/extraction/languages/rust.d.ts.map +1 -1
- package/dist/extraction/languages/rust.js +29 -0
- package/dist/extraction/languages/rust.js.map +1 -1
- package/dist/extraction/languages/scala.d.ts.map +1 -1
- package/dist/extraction/languages/scala.js +44 -9
- package/dist/extraction/languages/scala.js.map +1 -1
- package/dist/extraction/languages/swift.d.ts.map +1 -1
- package/dist/extraction/languages/swift.js +61 -0
- package/dist/extraction/languages/swift.js.map +1 -1
- package/dist/extraction/languages/typescript.d.ts +13 -0
- package/dist/extraction/languages/typescript.d.ts.map +1 -1
- package/dist/extraction/languages/typescript.js +38 -0
- package/dist/extraction/languages/typescript.js.map +1 -1
- package/dist/extraction/liquid-extractor.d.ts.map +1 -1
- package/dist/extraction/liquid-extractor.js +4 -1
- package/dist/extraction/liquid-extractor.js.map +1 -1
- package/dist/extraction/parse-worker.js +4 -1
- package/dist/extraction/parse-worker.js.map +1 -1
- package/dist/extraction/svelte-extractor.d.ts.map +1 -1
- package/dist/extraction/svelte-extractor.js +6 -3
- package/dist/extraction/svelte-extractor.js.map +1 -1
- package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
- package/dist/extraction/tree-sitter-helpers.js +59 -10
- package/dist/extraction/tree-sitter-helpers.js.map +1 -1
- package/dist/extraction/tree-sitter-types.d.ts +29 -0
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.d.ts +192 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +1553 -45
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/extraction/vue-extractor.d.ts.map +1 -1
- package/dist/extraction/vue-extractor.js +6 -3
- package/dist/extraction/vue-extractor.js.map +1 -1
- package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
- package/dist/graph/traversal.d.ts.map +1 -1
- package/dist/graph/traversal.js +11 -2
- package/dist/graph/traversal.js.map +1 -1
- package/dist/index.d.ts +64 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +137 -41
- package/dist/index.js.map +1 -1
- package/dist/installer/config-writer.d.ts +1 -1
- package/dist/installer/config-writer.js +1 -1
- package/dist/installer/index.d.ts +4 -4
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +100 -73
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/instructions-template.d.ts +34 -11
- package/dist/installer/instructions-template.d.ts.map +1 -1
- package/dist/installer/instructions-template.js +44 -12
- package/dist/installer/instructions-template.js.map +1 -1
- package/dist/installer/targets/antigravity.d.ts +6 -6
- package/dist/installer/targets/antigravity.js +14 -14
- package/dist/installer/targets/claude.d.ts +19 -13
- package/dist/installer/targets/claude.d.ts.map +1 -1
- package/dist/installer/targets/claude.js +97 -29
- package/dist/installer/targets/claude.js.map +1 -1
- package/dist/installer/targets/codebuddy.d.ts +17 -0
- package/dist/installer/targets/codebuddy.d.ts.map +1 -0
- package/dist/installer/targets/codebuddy.js +150 -0
- package/dist/installer/targets/codebuddy.js.map +1 -0
- package/dist/installer/targets/codex.js +5 -7
- package/dist/installer/targets/codex.js.map +1 -1
- package/dist/installer/targets/cursor.d.ts +1 -1
- package/dist/installer/targets/cursor.js +7 -7
- package/dist/installer/targets/deveco.d.ts +23 -0
- package/dist/installer/targets/deveco.d.ts.map +1 -0
- package/dist/installer/targets/deveco.js +217 -0
- package/dist/installer/targets/deveco.js.map +1 -0
- package/dist/installer/targets/gemini.js +5 -7
- package/dist/installer/targets/gemini.js.map +1 -1
- package/dist/installer/targets/hermes.js +15 -15
- package/dist/installer/targets/kiro.d.ts +1 -1
- package/dist/installer/targets/kiro.js +4 -4
- package/dist/installer/targets/opencode.d.ts +9 -1
- package/dist/installer/targets/opencode.d.ts.map +1 -1
- package/dist/installer/targets/opencode.js +92 -41
- package/dist/installer/targets/opencode.js.map +1 -1
- package/dist/installer/targets/registry.d.ts.map +1 -1
- package/dist/installer/targets/registry.js +4 -0
- package/dist/installer/targets/registry.js.map +1 -1
- package/dist/installer/targets/shared.d.ts +28 -4
- package/dist/installer/targets/shared.d.ts.map +1 -1
- package/dist/installer/targets/shared.js +32 -15
- package/dist/installer/targets/shared.js.map +1 -1
- package/dist/installer/targets/types.d.ts +9 -2
- package/dist/installer/targets/types.d.ts.map +1 -1
- package/dist/mcp/daemon-manager.d.ts +42 -0
- package/dist/mcp/daemon-manager.d.ts.map +1 -0
- package/dist/mcp/daemon-manager.js +129 -0
- package/dist/mcp/daemon-manager.js.map +1 -0
- package/dist/mcp/daemon-paths.d.ts +1 -1
- package/dist/mcp/daemon-paths.js +3 -3
- package/dist/mcp/daemon-registry.d.ts +47 -0
- package/dist/mcp/daemon-registry.d.ts.map +1 -0
- package/dist/mcp/daemon-registry.js +229 -0
- package/dist/mcp/daemon-registry.js.map +1 -0
- package/dist/mcp/daemon.d.ts.map +1 -1
- package/dist/mcp/daemon.js +27 -6
- package/dist/mcp/daemon.js.map +1 -1
- package/dist/mcp/dynamic-boundaries.d.ts +41 -0
- package/dist/mcp/dynamic-boundaries.d.ts.map +1 -0
- package/dist/mcp/dynamic-boundaries.js +359 -0
- package/dist/mcp/dynamic-boundaries.js.map +1 -0
- package/dist/mcp/engine.d.ts +4 -4
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +32 -24
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/index.d.ts +8 -7
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +39 -18
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/liveness-watchdog.d.ts +18 -0
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -0
- package/dist/mcp/liveness-watchdog.js +207 -0
- package/dist/mcp/liveness-watchdog.js.map +1 -0
- package/dist/mcp/proxy.d.ts +6 -0
- package/dist/mcp/proxy.d.ts.map +1 -1
- package/dist/mcp/proxy.js +75 -18
- package/dist/mcp/proxy.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +22 -7
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +91 -59
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/session.d.ts +3 -1
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +43 -7
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/stdin-teardown.d.ts +27 -0
- package/dist/mcp/stdin-teardown.d.ts.map +1 -0
- package/dist/mcp/stdin-teardown.js +49 -0
- package/dist/mcp/stdin-teardown.js.map +1 -0
- package/dist/mcp/tools.d.ts +137 -16
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1271 -219
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/transport.d.ts +1 -1
- package/dist/mcp/transport.d.ts.map +1 -1
- package/dist/mcp/transport.js +20 -4
- package/dist/mcp/transport.js.map +1 -1
- package/dist/mcp/version.d.ts +1 -1
- package/dist/mcp/version.js +2 -2
- package/dist/project-config.d.ts +36 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +235 -0
- package/dist/project-config.js.map +1 -0
- package/dist/reasoning/config.d.ts +45 -0
- package/dist/reasoning/config.d.ts.map +1 -0
- package/dist/reasoning/config.js +171 -0
- package/dist/reasoning/config.js.map +1 -0
- package/dist/reasoning/credentials.d.ts +5 -0
- package/dist/reasoning/credentials.d.ts.map +1 -0
- package/dist/reasoning/credentials.js +83 -0
- package/dist/reasoning/credentials.js.map +1 -0
- package/dist/reasoning/login.d.ts +21 -0
- package/dist/reasoning/login.d.ts.map +1 -0
- package/dist/reasoning/login.js +85 -0
- package/dist/reasoning/login.js.map +1 -0
- package/dist/reasoning/reasoner.d.ts +43 -0
- package/dist/reasoning/reasoner.d.ts.map +1 -0
- package/dist/reasoning/reasoner.js +308 -0
- package/dist/reasoning/reasoner.js.map +1 -0
- package/dist/resolution/c-fnptr-synthesizer.d.ts +33 -0
- package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -0
- package/dist/resolution/c-fnptr-synthesizer.js +352 -0
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -0
- package/dist/resolution/callback-synthesizer.d.ts +6 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +1197 -1
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.d.ts +12 -0
- package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -0
- package/dist/resolution/frameworks/arkts-entry.js +214 -0
- package/dist/resolution/frameworks/arkts-entry.js.map +1 -0
- package/dist/resolution/frameworks/arkts-napi.d.ts +3 -0
- package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -0
- package/dist/resolution/frameworks/arkts-napi.js +166 -0
- package/dist/resolution/frameworks/arkts-napi.js.map +1 -0
- package/dist/resolution/frameworks/astro.d.ts +9 -0
- package/dist/resolution/frameworks/astro.d.ts.map +1 -0
- package/dist/resolution/frameworks/astro.js +169 -0
- package/dist/resolution/frameworks/astro.js.map +1 -0
- package/dist/resolution/frameworks/goframe.d.ts +41 -0
- package/dist/resolution/frameworks/goframe.d.ts.map +1 -0
- package/dist/resolution/frameworks/goframe.js +112 -0
- package/dist/resolution/frameworks/goframe.js.map +1 -0
- package/dist/resolution/frameworks/index.d.ts +3 -0
- package/dist/resolution/frameworks/index.d.ts.map +1 -1
- package/dist/resolution/frameworks/index.js +17 -1
- package/dist/resolution/frameworks/index.js.map +1 -1
- package/dist/resolution/frameworks/java.js +6 -1
- package/dist/resolution/frameworks/java.js.map +1 -1
- package/dist/resolution/frameworks/react.d.ts.map +1 -1
- package/dist/resolution/frameworks/react.js +32 -63
- package/dist/resolution/frameworks/react.js.map +1 -1
- package/dist/resolution/frameworks/svelte.js +6 -2
- package/dist/resolution/frameworks/svelte.js.map +1 -1
- package/dist/resolution/frameworks/vue.js +24 -27
- package/dist/resolution/frameworks/vue.js.map +1 -1
- package/dist/resolution/goframe-synthesizer.d.ts +28 -0
- package/dist/resolution/goframe-synthesizer.d.ts.map +1 -0
- package/dist/resolution/goframe-synthesizer.js +158 -0
- package/dist/resolution/goframe-synthesizer.js.map +1 -0
- package/dist/resolution/import-resolver.d.ts +10 -0
- package/dist/resolution/import-resolver.d.ts.map +1 -1
- package/dist/resolution/import-resolver.js +125 -2
- package/dist/resolution/import-resolver.js.map +1 -1
- package/dist/resolution/index.d.ts +37 -0
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +306 -3
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/name-matcher.d.ts +41 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +519 -14
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/resolution/strip-comments.d.ts +1 -1
- package/dist/resolution/strip-comments.d.ts.map +1 -1
- package/dist/resolution/strip-comments.js +2 -0
- package/dist/resolution/strip-comments.js.map +1 -1
- package/dist/resolution/types.d.ts +20 -3
- package/dist/resolution/types.d.ts.map +1 -1
- package/dist/search/query-utils.d.ts +17 -1
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +79 -10
- package/dist/search/query-utils.js.map +1 -1
- package/dist/sync/git-hooks.d.ts +4 -4
- package/dist/sync/git-hooks.js +5 -5
- package/dist/sync/watcher.d.ts +69 -2
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +226 -21
- package/dist/sync/watcher.js.map +1 -1
- package/dist/sync/worktree.d.ts +3 -3
- package/dist/sync/worktree.js +5 -5
- package/dist/telemetry/index.d.ts +143 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +541 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/types.d.ts +18 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -1
- package/dist/types.js.map +1 -1
- package/dist/upgrade/index.d.ts.map +1 -1
- package/dist/upgrade/index.js +46 -10
- package/dist/upgrade/index.js.map +1 -1
- package/dist/utils.d.ts +46 -27
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +87 -53
- package/dist/utils.js.map +1 -1
- package/package.json +57 -57
- package/scripts/add-lang/bench.sh +60 -60
- package/scripts/add-lang/check-grammar.mjs +75 -75
- package/scripts/add-lang/dump-ast.mjs +103 -103
- package/scripts/add-lang/verify-extraction.mjs +70 -70
- package/scripts/agent-eval/ab-adoption.sh +91 -0
- package/scripts/agent-eval/ab-hook.sh +86 -0
- package/scripts/agent-eval/ab-impl.sh +78 -0
- package/scripts/agent-eval/ab-new-vs-baseline.sh +102 -0
- package/scripts/agent-eval/ab-sufficiency.sh +78 -0
- package/scripts/agent-eval/arms-F.sh +21 -21
- package/scripts/agent-eval/arms-matrix.sh +37 -37
- package/scripts/agent-eval/audit.sh +68 -68
- package/scripts/agent-eval/bench-readme.sh +28 -28
- package/scripts/agent-eval/bench-why-repo.sh +22 -22
- package/scripts/agent-eval/block-read-hook.sh +19 -19
- package/scripts/agent-eval/hook-settings.json +15 -15
- package/scripts/agent-eval/itrun.sh +120 -120
- package/scripts/agent-eval/offload-eval-3arm.sh +72 -0
- package/scripts/agent-eval/offload-eval-cost.mjs +133 -0
- package/scripts/agent-eval/offload-eval-effort.mjs +108 -0
- package/scripts/agent-eval/offload-eval-frontload-matrix.sh +25 -0
- package/scripts/agent-eval/offload-eval-frontload.sh +47 -0
- package/scripts/agent-eval/offload-eval-ground-truth.json +18 -0
- package/scripts/agent-eval/offload-eval-hook.mjs +84 -0
- package/scripts/agent-eval/offload-eval-judge.mjs +103 -0
- package/scripts/agent-eval/offload-eval-matrix.sh +20 -0
- package/scripts/agent-eval/offload-eval-metrics.mjs +94 -0
- package/scripts/agent-eval/offload-eval-refs1.sh +50 -0
- package/scripts/agent-eval/offload-eval-setup.sh +24 -0
- package/scripts/agent-eval/offload-eval-styles.sh +72 -0
- package/scripts/agent-eval/offload-eval-summarize.mjs +68 -0
- package/scripts/agent-eval/offload-eval.md +76 -0
- package/scripts/agent-eval/parse-arms.mjs +116 -116
- package/scripts/agent-eval/parse-bench-readme.mjs +84 -84
- package/scripts/agent-eval/parse-run.mjs +45 -45
- package/scripts/agent-eval/parse-session.mjs +93 -93
- package/scripts/agent-eval/probe-context.mjs +21 -21
- package/scripts/agent-eval/probe-explore.mjs +40 -40
- package/scripts/agent-eval/probe-node.mjs +20 -20
- package/scripts/agent-eval/probe-sweep.mjs +119 -119
- package/scripts/agent-eval/probe-trace.mjs +20 -20
- package/scripts/agent-eval/redirect-read-hook.sh +38 -0
- package/scripts/agent-eval/run-agent.sh +34 -34
- package/scripts/agent-eval/run-all.sh +69 -67
- package/scripts/agent-eval/run-arms.sh +56 -56
- package/scripts/agent-eval/seq-matrix.mjs +137 -137
- package/scripts/build-bundle.sh +118 -118
- package/scripts/extract-release-notes.mjs +130 -130
- package/scripts/local-install.sh +41 -41
- package/scripts/npm-sdk.js +75 -75
- package/scripts/npm-shim.js +246 -246
- package/scripts/pack-npm.sh +119 -119
- package/scripts/prepare-release.mjs +270 -270
- package/scripts/qa_eval/README.md +400 -0
- package/scripts/qa_eval/agent_runner.py +526 -0
- package/scripts/qa_eval/data/.gitignore +4 -0
- package/scripts/qa_eval/data/test-set.jsonl +22 -0
- package/scripts/qa_eval/eval_metrics.py +233 -0
- package/scripts/qa_eval/external_agent.py +577 -0
- package/scripts/qa_eval/llm_config.py +92 -0
- package/scripts/qa_eval/memory_monitor.py +132 -0
- package/scripts/qa_eval/my_answer_accuracy.py +187 -0
- package/scripts/qa_eval/requirements.txt +2 -0
- package/scripts/qa_eval/run_pipeline.py +702 -0
- package/scripts/qa_eval/stats_efficiency.py +279 -0
- package/scripts/qa_eval/stats_scores.py +207 -0
- package/dist/bin/codegraph.d.ts +0 -26
- package/dist/bin/codegraph.d.ts.map +0 -1
- package/dist/bin/codegraph.js +0 -1572
- package/dist/bin/codegraph.js.map +0 -1
- package/dist/extraction/arkanalyzer-extractor.d.ts +0 -6
- package/dist/extraction/arkanalyzer-extractor.d.ts.map +0 -1
- package/dist/extraction/arkanalyzer-extractor.js +0 -11
- package/dist/extraction/arkanalyzer-extractor.js.map +0 -1
- package/dist/extraction/arkanalyzer-project.d.ts +0 -20
- package/dist/extraction/arkanalyzer-project.d.ts.map +0 -1
- package/dist/extraction/arkanalyzer-project.js +0 -596
- package/dist/extraction/arkanalyzer-project.js.map +0 -1
package/dist/db/queries.js
CHANGED
|
@@ -57,6 +57,7 @@ function rowToNode(row) {
|
|
|
57
57
|
isAbstract: row.is_abstract === 1,
|
|
58
58
|
decorators: row.decorators ? (0, utils_1.safeJsonParse)(row.decorators, undefined) : undefined,
|
|
59
59
|
typeParameters: row.type_parameters ? (0, utils_1.safeJsonParse)(row.type_parameters, undefined) : undefined,
|
|
60
|
+
returnType: row.return_type ?? undefined,
|
|
60
61
|
updatedAt: row.updated_at,
|
|
61
62
|
};
|
|
62
63
|
}
|
|
@@ -94,6 +95,11 @@ function rowToFileRecord(row) {
|
|
|
94
95
|
*/
|
|
95
96
|
class QueryBuilder {
|
|
96
97
|
db;
|
|
98
|
+
// Project-name tokens (go.mod / package.json / repo dir), normalized. A query
|
|
99
|
+
// word matching one is dropped from path-relevance scoring — it names the
|
|
100
|
+
// whole project, not a symbol, so it carries no discriminative signal (#720).
|
|
101
|
+
// Set once by the HomeGraph instance; empty by default (no down-weighting).
|
|
102
|
+
projectNameTokens = new Set();
|
|
97
103
|
// Node cache for frequently accessed nodes (LRU-style, max 1000 entries)
|
|
98
104
|
nodeCache = new Map();
|
|
99
105
|
maxCacheSize = 1000;
|
|
@@ -102,6 +108,15 @@ class QueryBuilder {
|
|
|
102
108
|
constructor(db) {
|
|
103
109
|
this.db = db;
|
|
104
110
|
}
|
|
111
|
+
/** Set the normalized project-name tokens used to down-weight non-discriminative
|
|
112
|
+
* query words in path scoring (#720). Called once when the project opens. */
|
|
113
|
+
setProjectNameTokens(tokens) {
|
|
114
|
+
this.projectNameTokens = tokens;
|
|
115
|
+
}
|
|
116
|
+
/** The normalized project-name tokens (#720); empty if none were derived. */
|
|
117
|
+
getProjectNameTokens() {
|
|
118
|
+
return this.projectNameTokens;
|
|
119
|
+
}
|
|
105
120
|
// ===========================================================================
|
|
106
121
|
// Node Operations
|
|
107
122
|
// ===========================================================================
|
|
@@ -110,25 +125,25 @@ class QueryBuilder {
|
|
|
110
125
|
*/
|
|
111
126
|
insertNode(node) {
|
|
112
127
|
if (!this.stmts.insertNode) {
|
|
113
|
-
this.stmts.insertNode = this.db.prepare(`
|
|
114
|
-
INSERT OR REPLACE INTO nodes (
|
|
115
|
-
id, kind, name, qualified_name, file_path, language,
|
|
116
|
-
start_line, end_line, start_column, end_column,
|
|
117
|
-
docstring, signature, visibility,
|
|
118
|
-
is_exported, is_async, is_static, is_abstract,
|
|
119
|
-
decorators, type_parameters, updated_at
|
|
120
|
-
) VALUES (
|
|
121
|
-
@id, @kind, @name, @qualifiedName, @filePath, @language,
|
|
122
|
-
@startLine, @endLine, @startColumn, @endColumn,
|
|
123
|
-
@docstring, @signature, @visibility,
|
|
124
|
-
@isExported, @isAsync, @isStatic, @isAbstract,
|
|
125
|
-
@decorators, @typeParameters, @updatedAt
|
|
126
|
-
)
|
|
128
|
+
this.stmts.insertNode = this.db.prepare(`
|
|
129
|
+
INSERT OR REPLACE INTO nodes (
|
|
130
|
+
id, kind, name, qualified_name, file_path, language,
|
|
131
|
+
start_line, end_line, start_column, end_column,
|
|
132
|
+
docstring, signature, visibility,
|
|
133
|
+
is_exported, is_async, is_static, is_abstract,
|
|
134
|
+
decorators, type_parameters, return_type, updated_at
|
|
135
|
+
) VALUES (
|
|
136
|
+
@id, @kind, @name, @qualifiedName, @filePath, @language,
|
|
137
|
+
@startLine, @endLine, @startColumn, @endColumn,
|
|
138
|
+
@docstring, @signature, @visibility,
|
|
139
|
+
@isExported, @isAsync, @isStatic, @isAbstract,
|
|
140
|
+
@decorators, @typeParameters, @returnType, @updatedAt
|
|
141
|
+
)
|
|
127
142
|
`);
|
|
128
143
|
}
|
|
129
144
|
// Validate required fields to prevent SQLite bind errors
|
|
130
145
|
if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
|
|
131
|
-
console.error('[
|
|
146
|
+
console.error('[HomeGraph] Skipping node with missing required fields:', {
|
|
132
147
|
id: node.id,
|
|
133
148
|
kind: node.kind,
|
|
134
149
|
name: node.name,
|
|
@@ -162,6 +177,7 @@ class QueryBuilder {
|
|
|
162
177
|
isAbstract: node.isAbstract ? 1 : 0,
|
|
163
178
|
decorators: node.decorators ? JSON.stringify(node.decorators) : null,
|
|
164
179
|
typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
|
|
180
|
+
returnType: node.returnType ?? null,
|
|
165
181
|
updatedAt: node.updatedAt ?? Date.now(),
|
|
166
182
|
});
|
|
167
183
|
}
|
|
@@ -180,35 +196,36 @@ class QueryBuilder {
|
|
|
180
196
|
*/
|
|
181
197
|
updateNode(node) {
|
|
182
198
|
if (!this.stmts.updateNode) {
|
|
183
|
-
this.stmts.updateNode = this.db.prepare(`
|
|
184
|
-
UPDATE nodes SET
|
|
185
|
-
kind = @kind,
|
|
186
|
-
name = @name,
|
|
187
|
-
qualified_name = @qualifiedName,
|
|
188
|
-
file_path = @filePath,
|
|
189
|
-
language = @language,
|
|
190
|
-
start_line = @startLine,
|
|
191
|
-
end_line = @endLine,
|
|
192
|
-
start_column = @startColumn,
|
|
193
|
-
end_column = @endColumn,
|
|
194
|
-
docstring = @docstring,
|
|
195
|
-
signature = @signature,
|
|
196
|
-
visibility = @visibility,
|
|
197
|
-
is_exported = @isExported,
|
|
198
|
-
is_async = @isAsync,
|
|
199
|
-
is_static = @isStatic,
|
|
200
|
-
is_abstract = @isAbstract,
|
|
201
|
-
decorators = @decorators,
|
|
202
|
-
type_parameters = @typeParameters,
|
|
203
|
-
|
|
204
|
-
|
|
199
|
+
this.stmts.updateNode = this.db.prepare(`
|
|
200
|
+
UPDATE nodes SET
|
|
201
|
+
kind = @kind,
|
|
202
|
+
name = @name,
|
|
203
|
+
qualified_name = @qualifiedName,
|
|
204
|
+
file_path = @filePath,
|
|
205
|
+
language = @language,
|
|
206
|
+
start_line = @startLine,
|
|
207
|
+
end_line = @endLine,
|
|
208
|
+
start_column = @startColumn,
|
|
209
|
+
end_column = @endColumn,
|
|
210
|
+
docstring = @docstring,
|
|
211
|
+
signature = @signature,
|
|
212
|
+
visibility = @visibility,
|
|
213
|
+
is_exported = @isExported,
|
|
214
|
+
is_async = @isAsync,
|
|
215
|
+
is_static = @isStatic,
|
|
216
|
+
is_abstract = @isAbstract,
|
|
217
|
+
decorators = @decorators,
|
|
218
|
+
type_parameters = @typeParameters,
|
|
219
|
+
return_type = @returnType,
|
|
220
|
+
updated_at = @updatedAt
|
|
221
|
+
WHERE id = @id
|
|
205
222
|
`);
|
|
206
223
|
}
|
|
207
224
|
// Invalidate cache before update
|
|
208
225
|
this.nodeCache.delete(node.id);
|
|
209
226
|
// Validate required fields
|
|
210
227
|
if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
|
|
211
|
-
console.error('[
|
|
228
|
+
console.error('[HomeGraph] Skipping node update with missing required fields:', node.id);
|
|
212
229
|
return;
|
|
213
230
|
}
|
|
214
231
|
this.stmts.updateNode.run({
|
|
@@ -231,6 +248,7 @@ class QueryBuilder {
|
|
|
231
248
|
isAbstract: node.isAbstract ? 1 : 0,
|
|
232
249
|
decorators: node.decorators ? JSON.stringify(node.decorators) : null,
|
|
233
250
|
typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
|
|
251
|
+
returnType: node.returnType ?? null,
|
|
234
252
|
updatedAt: node.updatedAt ?? Date.now(),
|
|
235
253
|
});
|
|
236
254
|
}
|
|
@@ -408,15 +426,15 @@ class QueryBuilder {
|
|
|
408
426
|
// protobuf stub) outranks the real `server/etcdserver/server.go`
|
|
409
427
|
// (470 edges) by 4×, and the boost would push the agent toward
|
|
410
428
|
// generated code.
|
|
411
|
-
this.stmts.getDominantFile = this.db.prepare(`
|
|
412
|
-
SELECT n.file_path AS file_path, COUNT(*) AS edge_count
|
|
413
|
-
FROM edges e
|
|
414
|
-
JOIN nodes n ON e.source = n.id
|
|
415
|
-
JOIN nodes m ON e.target = m.id
|
|
416
|
-
WHERE n.file_path = m.file_path
|
|
417
|
-
GROUP BY n.file_path
|
|
418
|
-
ORDER BY edge_count DESC
|
|
419
|
-
LIMIT 20
|
|
429
|
+
this.stmts.getDominantFile = this.db.prepare(`
|
|
430
|
+
SELECT n.file_path AS file_path, COUNT(*) AS edge_count
|
|
431
|
+
FROM edges e
|
|
432
|
+
JOIN nodes n ON e.source = n.id
|
|
433
|
+
JOIN nodes m ON e.target = m.id
|
|
434
|
+
WHERE n.file_path = m.file_path
|
|
435
|
+
GROUP BY n.file_path
|
|
436
|
+
ORDER BY edge_count DESC
|
|
437
|
+
LIMIT 20
|
|
420
438
|
`);
|
|
421
439
|
}
|
|
422
440
|
const rows = this.stmts.getDominantFile.all();
|
|
@@ -434,7 +452,7 @@ class QueryBuilder {
|
|
|
434
452
|
* `route` nodes (framework-emitted: Express/Gin/Flask/Rails/Drupal/etc.).
|
|
435
453
|
* Used by handleContext on small repos to inline the project's routing
|
|
436
454
|
* config when the agent's query is about request flow — eliminating the
|
|
437
|
-
* "Glob + Read routes.rb" pattern that beats
|
|
455
|
+
* "Glob + Read routes.rb" pattern that beats homegraph on tiny realworld
|
|
438
456
|
* template repos.
|
|
439
457
|
*
|
|
440
458
|
* Excludes test/generated files from candidacy. Returns null if there
|
|
@@ -443,13 +461,13 @@ class QueryBuilder {
|
|
|
443
461
|
*/
|
|
444
462
|
getTopRouteFile() {
|
|
445
463
|
if (!this.stmts.getTopRouteFile) {
|
|
446
|
-
this.stmts.getTopRouteFile = this.db.prepare(`
|
|
447
|
-
SELECT file_path, COUNT(*) AS cnt
|
|
448
|
-
FROM nodes
|
|
449
|
-
WHERE kind = 'route'
|
|
450
|
-
GROUP BY file_path
|
|
451
|
-
ORDER BY cnt DESC
|
|
452
|
-
LIMIT 20
|
|
464
|
+
this.stmts.getTopRouteFile = this.db.prepare(`
|
|
465
|
+
SELECT file_path, COUNT(*) AS cnt
|
|
466
|
+
FROM nodes
|
|
467
|
+
WHERE kind = 'route'
|
|
468
|
+
GROUP BY file_path
|
|
469
|
+
ORDER BY cnt DESC
|
|
470
|
+
LIMIT 20
|
|
453
471
|
`);
|
|
454
472
|
}
|
|
455
473
|
const rows = this.stmts.getTopRouteFile.all();
|
|
@@ -480,21 +498,21 @@ class QueryBuilder {
|
|
|
480
498
|
// Edge kind varies across framework resolvers: Spring/Rails/
|
|
481
499
|
// Laravel/Drupal emit `references`, Express emits `calls`. Accept
|
|
482
500
|
// both — the semantic is the same (route → its handler).
|
|
483
|
-
this.stmts.getRoutingManifest = this.db.prepare(`
|
|
484
|
-
SELECT
|
|
485
|
-
r.name AS url,
|
|
486
|
-
h.name AS handler,
|
|
487
|
-
h.file_path AS handler_file,
|
|
488
|
-
h.start_line AS handler_line,
|
|
489
|
-
h.kind AS handler_kind
|
|
490
|
-
FROM nodes r
|
|
491
|
-
JOIN edges e ON e.source = r.id
|
|
492
|
-
JOIN nodes h ON e.target = h.id
|
|
493
|
-
WHERE r.kind = 'route'
|
|
494
|
-
AND e.kind IN ('references', 'calls')
|
|
495
|
-
AND h.kind IN ('function', 'method', 'class')
|
|
496
|
-
ORDER BY r.file_path, r.start_line
|
|
497
|
-
LIMIT ?
|
|
501
|
+
this.stmts.getRoutingManifest = this.db.prepare(`
|
|
502
|
+
SELECT
|
|
503
|
+
r.name AS url,
|
|
504
|
+
h.name AS handler,
|
|
505
|
+
h.file_path AS handler_file,
|
|
506
|
+
h.start_line AS handler_line,
|
|
507
|
+
h.kind AS handler_kind
|
|
508
|
+
FROM nodes r
|
|
509
|
+
JOIN edges e ON e.source = r.id
|
|
510
|
+
JOIN nodes h ON e.target = h.id
|
|
511
|
+
WHERE r.kind = 'route'
|
|
512
|
+
AND e.kind IN ('references', 'calls')
|
|
513
|
+
AND h.kind IN ('function', 'method', 'class')
|
|
514
|
+
ORDER BY r.file_path, r.start_line
|
|
515
|
+
LIMIT ?
|
|
498
516
|
`);
|
|
499
517
|
}
|
|
500
518
|
const rows = this.stmts.getRoutingManifest.all(limit);
|
|
@@ -677,7 +695,7 @@ class QueryBuilder {
|
|
|
677
695
|
...r,
|
|
678
696
|
score: r.score
|
|
679
697
|
+ (0, query_utils_1.kindBonus)(r.node.kind)
|
|
680
|
-
+ (0, query_utils_1.scorePathRelevance)(r.node.filePath, scoringQuery)
|
|
698
|
+
+ (0, query_utils_1.scorePathRelevance)(r.node.filePath, scoringQuery, this.projectNameTokens)
|
|
681
699
|
+ (0, query_utils_1.nameMatchBonus)(r.node.name, scoringQuery),
|
|
682
700
|
}));
|
|
683
701
|
results.sort((a, b) => b.score - a.score);
|
|
@@ -820,11 +838,11 @@ class QueryBuilder {
|
|
|
820
838
|
// Fetch 5x requested limit so post-hoc rescoring (kindBonus, pathRelevance,
|
|
821
839
|
// nameMatchBonus) can promote results that BM25 alone undervalues.
|
|
822
840
|
const ftsLimit = Math.max(limit * 5, 100);
|
|
823
|
-
let sql = `
|
|
824
|
-
SELECT nodes.*, bm25(nodes_fts, 0, 20, 5, 1, 2) as score
|
|
825
|
-
FROM nodes_fts
|
|
826
|
-
JOIN nodes ON nodes_fts.id = nodes.id
|
|
827
|
-
WHERE nodes_fts MATCH ?
|
|
841
|
+
let sql = `
|
|
842
|
+
SELECT nodes.*, bm25(nodes_fts, 0, 20, 5, 1, 2) as score
|
|
843
|
+
FROM nodes_fts
|
|
844
|
+
JOIN nodes ON nodes_fts.id = nodes.id
|
|
845
|
+
WHERE nodes_fts MATCH ?
|
|
828
846
|
`;
|
|
829
847
|
const params = [ftsQuery];
|
|
830
848
|
if (kinds && kinds.length > 0) {
|
|
@@ -855,21 +873,21 @@ class QueryBuilder {
|
|
|
855
873
|
*/
|
|
856
874
|
searchNodesLike(query, options) {
|
|
857
875
|
const { kinds, languages, limit = 100, offset = 0 } = options;
|
|
858
|
-
let sql = `
|
|
859
|
-
SELECT nodes.*,
|
|
860
|
-
CASE
|
|
861
|
-
WHEN name = ? THEN 1.0
|
|
862
|
-
WHEN name LIKE ? THEN 0.9
|
|
863
|
-
WHEN name LIKE ? THEN 0.8
|
|
864
|
-
WHEN qualified_name LIKE ? THEN 0.7
|
|
865
|
-
ELSE 0.5
|
|
866
|
-
END as score
|
|
867
|
-
FROM nodes
|
|
868
|
-
WHERE (
|
|
869
|
-
name LIKE ? OR
|
|
870
|
-
qualified_name LIKE ? OR
|
|
871
|
-
name LIKE ?
|
|
872
|
-
)
|
|
876
|
+
let sql = `
|
|
877
|
+
SELECT nodes.*,
|
|
878
|
+
CASE
|
|
879
|
+
WHEN name = ? THEN 1.0
|
|
880
|
+
WHEN name LIKE ? THEN 0.9
|
|
881
|
+
WHEN name LIKE ? THEN 0.8
|
|
882
|
+
WHEN qualified_name LIKE ? THEN 0.7
|
|
883
|
+
ELSE 0.5
|
|
884
|
+
END as score
|
|
885
|
+
FROM nodes
|
|
886
|
+
WHERE (
|
|
887
|
+
name LIKE ? OR
|
|
888
|
+
qualified_name LIKE ? OR
|
|
889
|
+
name LIKE ?
|
|
890
|
+
)
|
|
873
891
|
`;
|
|
874
892
|
// Pattern variants for better matching
|
|
875
893
|
const exactMatch = query;
|
|
@@ -943,10 +961,10 @@ class QueryBuilder {
|
|
|
943
961
|
const allResults = [];
|
|
944
962
|
const seenIds = new Set();
|
|
945
963
|
for (const name of names) {
|
|
946
|
-
let sql = `
|
|
947
|
-
SELECT nodes.*, 1.0 as score
|
|
948
|
-
FROM nodes
|
|
949
|
-
WHERE name COLLATE NOCASE = ?
|
|
964
|
+
let sql = `
|
|
965
|
+
SELECT nodes.*, 1.0 as score
|
|
966
|
+
FROM nodes
|
|
967
|
+
WHERE name COLLATE NOCASE = ?
|
|
950
968
|
`;
|
|
951
969
|
const params = [name];
|
|
952
970
|
if (kinds && kinds.length > 0) {
|
|
@@ -990,10 +1008,10 @@ class QueryBuilder {
|
|
|
990
1008
|
*/
|
|
991
1009
|
findNodesByNameSubstring(substring, options = {}) {
|
|
992
1010
|
const { kinds, languages, limit = 30, excludePrefix } = options;
|
|
993
|
-
let sql = `
|
|
994
|
-
SELECT nodes.*, 1.0 as score
|
|
995
|
-
FROM nodes
|
|
996
|
-
WHERE name LIKE ?
|
|
1011
|
+
let sql = `
|
|
1012
|
+
SELECT nodes.*, 1.0 as score
|
|
1013
|
+
FROM nodes
|
|
1014
|
+
WHERE name LIKE ?
|
|
997
1015
|
`;
|
|
998
1016
|
const params = [`%${substring}%`];
|
|
999
1017
|
// Exclude prefix matches (handled by FTS-based prefix search in Step 2b)
|
|
@@ -1025,9 +1043,9 @@ class QueryBuilder {
|
|
|
1025
1043
|
*/
|
|
1026
1044
|
insertEdge(edge) {
|
|
1027
1045
|
if (!this.stmts.insertEdge) {
|
|
1028
|
-
this.stmts.insertEdge = this.db.prepare(`
|
|
1029
|
-
INSERT OR IGNORE INTO edges (source, target, kind, metadata, line, col, provenance)
|
|
1030
|
-
VALUES (@source, @target, @kind, @metadata, @line, @col, @provenance)
|
|
1046
|
+
this.stmts.insertEdge = this.db.prepare(`
|
|
1047
|
+
INSERT OR IGNORE INTO edges (source, target, kind, metadata, line, col, provenance)
|
|
1048
|
+
VALUES (@source, @target, @kind, @metadata, @line, @col, @provenance)
|
|
1031
1049
|
`);
|
|
1032
1050
|
}
|
|
1033
1051
|
this.stmts.insertEdge.run({
|
|
@@ -1143,12 +1161,12 @@ class QueryBuilder {
|
|
|
1143
1161
|
* it. One indexed query (idx_nodes_file_path + idx_edges_target_kind).
|
|
1144
1162
|
*/
|
|
1145
1163
|
getDependentFilePaths(filePath) {
|
|
1146
|
-
const sql = `SELECT DISTINCT src.file_path AS fp
|
|
1147
|
-
FROM edges e
|
|
1148
|
-
JOIN nodes tgt ON tgt.id = e.target
|
|
1149
|
-
JOIN nodes src ON src.id = e.source
|
|
1150
|
-
WHERE tgt.file_path = ?
|
|
1151
|
-
AND e.kind != 'contains'
|
|
1164
|
+
const sql = `SELECT DISTINCT src.file_path AS fp
|
|
1165
|
+
FROM edges e
|
|
1166
|
+
JOIN nodes tgt ON tgt.id = e.target
|
|
1167
|
+
JOIN nodes src ON src.id = e.source
|
|
1168
|
+
WHERE tgt.file_path = ?
|
|
1169
|
+
AND e.kind != 'contains'
|
|
1152
1170
|
AND src.file_path != ?`;
|
|
1153
1171
|
const rows = this.db.prepare(sql).all(filePath, filePath);
|
|
1154
1172
|
return rows.map((r) => r.fp);
|
|
@@ -1160,26 +1178,51 @@ class QueryBuilder {
|
|
|
1160
1178
|
* (all kinds except `contains`); same reason imports-only is insufficient.
|
|
1161
1179
|
*/
|
|
1162
1180
|
getDependencyFilePaths(filePath) {
|
|
1163
|
-
const sql = `SELECT DISTINCT tgt.file_path AS fp
|
|
1164
|
-
FROM edges e
|
|
1165
|
-
JOIN nodes src ON src.id = e.source
|
|
1166
|
-
JOIN nodes tgt ON tgt.id = e.target
|
|
1167
|
-
WHERE src.file_path = ?
|
|
1168
|
-
AND e.kind != 'contains'
|
|
1181
|
+
const sql = `SELECT DISTINCT tgt.file_path AS fp
|
|
1182
|
+
FROM edges e
|
|
1183
|
+
JOIN nodes src ON src.id = e.source
|
|
1184
|
+
JOIN nodes tgt ON tgt.id = e.target
|
|
1185
|
+
WHERE src.file_path = ?
|
|
1186
|
+
AND e.kind != 'contains'
|
|
1169
1187
|
AND tgt.file_path != ?`;
|
|
1170
1188
|
const rows = this.db.prepare(sql).all(filePath, filePath);
|
|
1171
1189
|
return rows.map((r) => r.fp);
|
|
1172
1190
|
}
|
|
1191
|
+
/**
|
|
1192
|
+
* Cross-file edges whose TARGET is a node in `filePath` and whose SOURCE is a
|
|
1193
|
+
* node in a *different* file, paired with the target node's (name, kind) so a
|
|
1194
|
+
* caller can re-resolve the edge to the re-indexed target's new ID (node IDs
|
|
1195
|
+
* are `sha256(filePath:kind:name:line)`, so any line shift in the callee file
|
|
1196
|
+
* changes target IDs and a naive re-insert by old ID silently drops them).
|
|
1197
|
+
* Used by `storeExtractionResult` to preserve incoming edges across a file
|
|
1198
|
+
* re-index (issue #899). Same edge-kind rules as
|
|
1199
|
+
* {@link getDependentFilePaths}: all kinds except `contains`.
|
|
1200
|
+
*/
|
|
1201
|
+
getCrossFileIncomingEdgesWithTarget(filePath) {
|
|
1202
|
+
const sql = `SELECT e.*, tgt.name AS target_name, tgt.kind AS target_kind
|
|
1203
|
+
FROM edges e
|
|
1204
|
+
JOIN nodes tgt ON tgt.id = e.target
|
|
1205
|
+
JOIN nodes src ON src.id = e.source
|
|
1206
|
+
WHERE tgt.file_path = ?
|
|
1207
|
+
AND e.kind != 'contains'
|
|
1208
|
+
AND src.file_path != ?`;
|
|
1209
|
+
const rows = this.db.prepare(sql).all(filePath, filePath);
|
|
1210
|
+
return rows.map(row => ({
|
|
1211
|
+
...rowToEdge(row),
|
|
1212
|
+
targetName: row.target_name,
|
|
1213
|
+
targetKind: row.target_kind,
|
|
1214
|
+
}));
|
|
1215
|
+
}
|
|
1173
1216
|
/**
|
|
1174
1217
|
* Remove ArkTS RTA call edges persisted at batch scope (cross-file).
|
|
1175
1218
|
* Per-file edges are removed by {@link deleteFile} during re-index.
|
|
1176
1219
|
*/
|
|
1177
1220
|
deleteArkTSCrossFileCallEdges() {
|
|
1178
1221
|
const result = this.db
|
|
1179
|
-
.prepare(`DELETE FROM edges
|
|
1180
|
-
WHERE kind = 'calls'
|
|
1181
|
-
AND provenance = 'heuristic'
|
|
1182
|
-
AND metadata LIKE '%"synthesizedBy":"arkanalyzer"%'
|
|
1222
|
+
.prepare(`DELETE FROM edges
|
|
1223
|
+
WHERE kind = 'calls'
|
|
1224
|
+
AND provenance = 'heuristic'
|
|
1225
|
+
AND metadata LIKE '%"synthesizedBy":"arkanalyzer"%'
|
|
1183
1226
|
AND metadata LIKE '%"sourceFile"%'`)
|
|
1184
1227
|
.run();
|
|
1185
1228
|
return result.changes;
|
|
@@ -1192,17 +1235,17 @@ class QueryBuilder {
|
|
|
1192
1235
|
*/
|
|
1193
1236
|
upsertFile(file) {
|
|
1194
1237
|
if (!this.stmts.upsertFile) {
|
|
1195
|
-
this.stmts.upsertFile = this.db.prepare(`
|
|
1196
|
-
INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
|
|
1197
|
-
VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
|
|
1198
|
-
ON CONFLICT(path) DO UPDATE SET
|
|
1199
|
-
content_hash = @contentHash,
|
|
1200
|
-
language = @language,
|
|
1201
|
-
size = @size,
|
|
1202
|
-
modified_at = @modifiedAt,
|
|
1203
|
-
indexed_at = @indexedAt,
|
|
1204
|
-
node_count = @nodeCount,
|
|
1205
|
-
errors = @errors
|
|
1238
|
+
this.stmts.upsertFile = this.db.prepare(`
|
|
1239
|
+
INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
|
|
1240
|
+
VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
|
|
1241
|
+
ON CONFLICT(path) DO UPDATE SET
|
|
1242
|
+
content_hash = @contentHash,
|
|
1243
|
+
language = @language,
|
|
1244
|
+
size = @size,
|
|
1245
|
+
modified_at = @modifiedAt,
|
|
1246
|
+
indexed_at = @indexedAt,
|
|
1247
|
+
node_count = @nodeCount,
|
|
1248
|
+
errors = @errors
|
|
1206
1249
|
`);
|
|
1207
1250
|
}
|
|
1208
1251
|
this.stmts.upsertFile.run({
|
|
@@ -1276,9 +1319,9 @@ class QueryBuilder {
|
|
|
1276
1319
|
*/
|
|
1277
1320
|
insertUnresolvedRef(ref) {
|
|
1278
1321
|
if (!this.stmts.insertUnresolved) {
|
|
1279
|
-
this.stmts.insertUnresolved = this.db.prepare(`
|
|
1280
|
-
INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, candidates, file_path, language)
|
|
1281
|
-
VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @candidates, @filePath, @language)
|
|
1322
|
+
this.stmts.insertUnresolved = this.db.prepare(`
|
|
1323
|
+
INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, candidates, file_path, language)
|
|
1324
|
+
VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @candidates, @filePath, @language)
|
|
1282
1325
|
`);
|
|
1283
1326
|
}
|
|
1284
1327
|
this.stmts.insertUnresolved.run({
|
|
@@ -1480,11 +1523,11 @@ class QueryBuilder {
|
|
|
1480
1523
|
*/
|
|
1481
1524
|
getStats() {
|
|
1482
1525
|
// Single query for all three aggregate counts
|
|
1483
|
-
const counts = this.db.prepare(`
|
|
1484
|
-
SELECT
|
|
1485
|
-
(SELECT COUNT(*) FROM nodes) AS node_count,
|
|
1486
|
-
(SELECT COUNT(*) FROM edges) AS edge_count,
|
|
1487
|
-
(SELECT COUNT(*) FROM files) AS file_count
|
|
1526
|
+
const counts = this.db.prepare(`
|
|
1527
|
+
SELECT
|
|
1528
|
+
(SELECT COUNT(*) FROM nodes) AS node_count,
|
|
1529
|
+
(SELECT COUNT(*) FROM edges) AS edge_count,
|
|
1530
|
+
(SELECT COUNT(*) FROM files) AS file_count
|
|
1488
1531
|
`).get();
|
|
1489
1532
|
const nodesByKind = {};
|
|
1490
1533
|
const nodeKindRows = this.db
|