homegraph 1.5.1 → 1.5.3
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/CHANGELOG.md +131 -0
- package/LICENSE +21 -21
- package/README.md +312 -305
- package/dist/arkui/index.d.ts +4 -0
- package/dist/arkui/index.d.ts.map +1 -0
- package/dist/arkui/index.js +23 -0
- package/dist/arkui/index.js.map +1 -0
- package/dist/arkui/migrate-passage.d.ts +28 -0
- package/dist/arkui/migrate-passage.d.ts.map +1 -0
- package/dist/arkui/migrate-passage.js +310 -0
- package/dist/arkui/migrate-passage.js.map +1 -0
- package/dist/arkui/migrate-semantics.d.ts +47 -0
- package/dist/arkui/migrate-semantics.d.ts.map +1 -0
- package/dist/arkui/migrate-semantics.js +229 -0
- package/dist/arkui/migrate-semantics.js.map +1 -0
- package/dist/arkui/migrate-snapshot.d.ts +79 -0
- package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
- package/dist/arkui/migrate-snapshot.js +340 -0
- package/dist/arkui/migrate-snapshot.js.map +1 -0
- package/dist/bin/fatal-handler.js +2 -2
- package/dist/bin/homegraph.js +111 -162
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/bin/node-version-check.d.ts +6 -15
- package/dist/bin/node-version-check.d.ts.map +1 -1
- package/dist/bin/node-version-check.js +8 -37
- package/dist/bin/node-version-check.js.map +1 -1
- package/dist/db/index.d.ts +36 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +124 -38
- 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 +52 -38
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +42 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +330 -163
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +208 -203
- package/dist/db/sqlite-adapter.d.ts +8 -3
- package/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/dist/db/sqlite-adapter.js +45 -3
- package/dist/db/sqlite-adapter.js.map +1 -1
- package/dist/directory.js +5 -5
- package/dist/extraction/extraction-version.d.ts +1 -1
- package/dist/extraction/extraction-version.js +1 -1
- package/dist/extraction/generated-detection.d.ts +42 -11
- package/dist/extraction/generated-detection.d.ts.map +1 -1
- package/dist/extraction/generated-detection.js +141 -20
- package/dist/extraction/generated-detection.js.map +1 -1
- package/dist/extraction/index.d.ts +43 -1
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +150 -43
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +70 -6
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +958 -108
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
- package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
- package/dist/extraction/wasm-runtime-flags.js +9 -6
- package/dist/extraction/wasm-runtime-flags.js.map +1 -1
- package/dist/graph-sources.d.ts +41 -0
- package/dist/graph-sources.d.ts.map +1 -0
- package/dist/graph-sources.js +82 -0
- package/dist/graph-sources.js.map +1 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +80 -9
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +0 -48
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/instructions-template.js +9 -9
- package/dist/installer/targets/antigravity.js +1 -1
- package/dist/installer/targets/antigravity.js.map +1 -1
- package/dist/installer/targets/deveco.js +1 -1
- package/dist/installer/targets/deveco.js.map +1 -1
- package/dist/installer/targets/hermes.d.ts +1 -1
- package/dist/installer/targets/hermes.js +2 -2
- package/dist/installer/targets/hermes.js.map +1 -1
- package/dist/installer/targets/opencode.js +1 -1
- package/dist/installer/targets/opencode.js.map +1 -1
- package/dist/installer/targets/shared.js +1 -1
- package/dist/installer/targets/shared.js.map +1 -1
- package/dist/mcp/daemon-paths.d.ts +5 -4
- package/dist/mcp/daemon-paths.d.ts.map +1 -1
- package/dist/mcp/daemon-paths.js +28 -13
- package/dist/mcp/daemon-paths.js.map +1 -1
- package/dist/mcp/daemon-registry.d.ts.map +1 -1
- package/dist/mcp/daemon-registry.js +4 -1
- package/dist/mcp/daemon-registry.js.map +1 -1
- package/dist/mcp/daemon.d.ts +1 -1
- package/dist/mcp/daemon.js +1 -1
- package/dist/mcp/diff-impact.d.ts +131 -0
- package/dist/mcp/diff-impact.d.ts.map +1 -0
- package/dist/mcp/diff-impact.js +385 -0
- package/dist/mcp/diff-impact.js.map +1 -0
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +12 -3
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/explore-dedup.d.ts +137 -0
- package/dist/mcp/explore-dedup.d.ts.map +1 -0
- package/dist/mcp/explore-dedup.js +236 -0
- package/dist/mcp/explore-dedup.js.map +1 -0
- package/dist/mcp/explore-session-state.d.ts +217 -0
- package/dist/mcp/explore-session-state.d.ts.map +1 -0
- package/dist/mcp/explore-session-state.js +322 -0
- package/dist/mcp/explore-session-state.js.map +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +4 -7
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/liveness-watchdog.js +51 -51
- package/dist/mcp/proxy.d.ts.map +1 -1
- package/dist/mcp/proxy.js +5 -14
- package/dist/mcp/proxy.js.map +1 -1
- package/dist/mcp/query-worker.d.ts +1 -1
- package/dist/mcp/query-worker.js +1 -1
- package/dist/mcp/server-instructions.d.ts +7 -2
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +125 -47
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/session.d.ts +14 -3
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +17 -14
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/startup-handshake.d.ts +1 -1
- package/dist/mcp/startup-handshake.js +1 -1
- package/dist/mcp/tools.d.ts +138 -12
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +3279 -476
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +2 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +153 -53
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.js +20 -9
- package/dist/resolution/frameworks/arkts-entry.js.map +1 -1
- package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
- package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
- package/dist/resolution/frameworks/arkts-napi.js +169 -49
- package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +1 -1
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/memory-budget.d.ts +33 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -1
- package/dist/resolution/memory-budget.js +58 -0
- package/dist/resolution/memory-budget.js.map +1 -1
- package/dist/resolution/resolver-pool.d.ts +2 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -1
- package/dist/resolution/resolver-pool.js +4 -0
- package/dist/resolution/resolver-pool.js.map +1 -1
- package/dist/search/query-utils.d.ts +116 -4
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +869 -60
- package/dist/search/query-utils.js.map +1 -1
- package/dist/spec/db/commit-node.js +4 -4
- package/dist/spec/db/fragment-node.js +10 -10
- package/dist/spec/db/fts.js +8 -8
- package/dist/spec/db/relations.js +88 -88
- package/dist/spec/db/schema.js +6 -6
- package/dist/spec/db/schema.sql +121 -121
- package/dist/spec/db/spec-node.js +4 -4
- package/dist/spec/llm/prompts.js +53 -53
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/shimmer-progress.d.ts.map +1 -1
- package/dist/ui/shimmer-progress.js +4 -1
- package/dist/ui/shimmer-progress.js.map +1 -1
- package/dist/upgrade/index.d.ts +14 -26
- package/dist/upgrade/index.d.ts.map +1 -1
- package/dist/upgrade/index.js +28 -123
- package/dist/upgrade/index.js.map +1 -1
- package/dist/upgrade/remove-binary.d.ts +19 -19
- package/dist/upgrade/remove-binary.d.ts.map +1 -1
- package/dist/upgrade/remove-binary.js +20 -21
- package/dist/upgrade/remove-binary.js.map +1 -1
- package/dist/upgrade/update-check.d.ts +4 -3
- package/dist/upgrade/update-check.d.ts.map +1 -1
- package/dist/upgrade/update-check.js +4 -3
- package/dist/upgrade/update-check.js.map +1 -1
- package/package.json +65 -62
- package/dist/extraction/languages/arkts-viewtree.d.ts +0 -22
- package/dist/extraction/languages/arkts-viewtree.d.ts.map +0 -1
- package/dist/extraction/languages/arkts-viewtree.js +0 -133
- package/dist/extraction/languages/arkts-viewtree.js.map +0 -1
- package/dist/reasoning/config.d.ts +0 -45
- package/dist/reasoning/config.d.ts.map +0 -1
- package/dist/reasoning/config.js +0 -171
- package/dist/reasoning/config.js.map +0 -1
- package/dist/reasoning/credentials.d.ts +0 -5
- package/dist/reasoning/credentials.d.ts.map +0 -1
- package/dist/reasoning/credentials.js +0 -83
- package/dist/reasoning/credentials.js.map +0 -1
- package/dist/reasoning/login.d.ts +0 -21
- package/dist/reasoning/login.d.ts.map +0 -1
- package/dist/reasoning/login.js +0 -85
- package/dist/reasoning/login.js.map +0 -1
- package/dist/reasoning/reasoner.d.ts +0 -43
- package/dist/reasoning/reasoner.d.ts.map +0 -1
- package/dist/reasoning/reasoner.js +0 -308
- package/dist/reasoning/reasoner.js.map +0 -1
- package/dist/spec/evolve/llm-client.d.ts +0 -50
- package/dist/spec/evolve/llm-client.d.ts.map +0 -1
- package/dist/spec/evolve/llm-client.js +0 -176
- package/dist/spec/evolve/llm-client.js.map +0 -1
- package/dist/spec/evolve/logic-checker.d.ts +0 -12
- package/dist/spec/evolve/logic-checker.d.ts.map +0 -1
- package/dist/spec/evolve/logic-checker.js +0 -24
- package/dist/spec/evolve/logic-checker.js.map +0 -1
- package/dist/spec/llm/index.d.ts +0 -3
- package/dist/spec/llm/index.d.ts.map +0 -1
- package/dist/spec/llm/index.js +0 -11
- package/dist/spec/llm/index.js.map +0 -1
- package/dist/spec/mining/diff-parser.d.ts +0 -33
- package/dist/spec/mining/diff-parser.d.ts.map +0 -1
- package/dist/spec/mining/diff-parser.js +0 -166
- package/dist/spec/mining/diff-parser.js.map +0 -1
- package/dist/spec/mining/git-scanner.d.ts +0 -103
- package/dist/spec/mining/git-scanner.d.ts.map +0 -1
- package/dist/spec/mining/git-scanner.js +0 -307
- package/dist/spec/mining/git-scanner.js.map +0 -1
- package/dist/spec/mining/pipeline.d.ts +0 -53
- package/dist/spec/mining/pipeline.d.ts.map +0 -1
- package/dist/spec/mining/pipeline.js +0 -178
- package/dist/spec/mining/pipeline.js.map +0 -1
- package/dist/spec/mining/scope-resolver.d.ts +0 -45
- package/dist/spec/mining/scope-resolver.d.ts.map +0 -1
- package/dist/spec/mining/scope-resolver.js +0 -103
- package/dist/spec/mining/scope-resolver.js.map +0 -1
- package/dist/spec/mining/spec-extractor.d.ts +0 -69
- package/dist/spec/mining/spec-extractor.d.ts.map +0 -1
- package/dist/spec/mining/spec-extractor.js +0 -369
- package/dist/spec/mining/spec-extractor.js.map +0 -1
- package/dist/spec/utils.d.ts +0 -167
- package/dist/spec/utils.d.ts.map +0 -1
- package/dist/spec/utils.js +0 -463
- package/dist/spec/utils.js.map +0 -1
- package/dist/telemetry/index.d.ts +0 -143
- package/dist/telemetry/index.d.ts.map +0 -1
- package/dist/telemetry/index.js +0 -541
- package/dist/telemetry/index.js.map +0 -1
- package/scripts/_tmp-cfwk-resolve.log +0 -0
- package/scripts/_tmp-cfwk-sig.log +0 -0
- package/scripts/_tmp-cfwk-vt.log +0 -0
- package/scripts/add-lang/bench.sh +0 -60
- package/scripts/add-lang/check-grammar.mjs +0 -75
- package/scripts/add-lang/dump-ast.mjs +0 -103
- package/scripts/add-lang/verify-extraction.mjs +0 -70
- package/scripts/agent-eval/ab-adoption.sh +0 -91
- package/scripts/agent-eval/ab-hook.sh +0 -86
- package/scripts/agent-eval/ab-impl.sh +0 -78
- package/scripts/agent-eval/ab-new-vs-baseline.sh +0 -102
- package/scripts/agent-eval/ab-sufficiency.sh +0 -78
- package/scripts/agent-eval/arms-F.sh +0 -21
- package/scripts/agent-eval/arms-matrix.sh +0 -37
- package/scripts/agent-eval/audit.sh +0 -68
- package/scripts/agent-eval/bench-readme.sh +0 -28
- package/scripts/agent-eval/bench-why-repo.sh +0 -22
- package/scripts/agent-eval/block-read-hook.sh +0 -19
- package/scripts/agent-eval/hook-settings.json +0 -15
- package/scripts/agent-eval/itrun.sh +0 -120
- package/scripts/agent-eval/offload-eval-3arm.sh +0 -72
- package/scripts/agent-eval/offload-eval-cost.mjs +0 -133
- package/scripts/agent-eval/offload-eval-effort.mjs +0 -108
- package/scripts/agent-eval/offload-eval-frontload-matrix.sh +0 -25
- package/scripts/agent-eval/offload-eval-frontload.sh +0 -47
- package/scripts/agent-eval/offload-eval-ground-truth.json +0 -18
- package/scripts/agent-eval/offload-eval-hook.mjs +0 -84
- package/scripts/agent-eval/offload-eval-judge.mjs +0 -103
- package/scripts/agent-eval/offload-eval-matrix.sh +0 -20
- package/scripts/agent-eval/offload-eval-metrics.mjs +0 -94
- package/scripts/agent-eval/offload-eval-refs1.sh +0 -50
- package/scripts/agent-eval/offload-eval-setup.sh +0 -24
- package/scripts/agent-eval/offload-eval-styles.sh +0 -72
- package/scripts/agent-eval/offload-eval-summarize.mjs +0 -68
- package/scripts/agent-eval/offload-eval.md +0 -76
- package/scripts/agent-eval/parse-arms.mjs +0 -116
- package/scripts/agent-eval/parse-bench-readme.mjs +0 -84
- package/scripts/agent-eval/parse-run.mjs +0 -45
- package/scripts/agent-eval/parse-session.mjs +0 -93
- package/scripts/agent-eval/probe-context.mjs +0 -21
- package/scripts/agent-eval/probe-explore.mjs +0 -40
- package/scripts/agent-eval/probe-node.mjs +0 -20
- package/scripts/agent-eval/probe-sweep.mjs +0 -119
- package/scripts/agent-eval/probe-trace.mjs +0 -20
- package/scripts/agent-eval/redirect-read-hook.sh +0 -38
- package/scripts/agent-eval/repro-concurrent-explore.mjs +0 -119
- package/scripts/agent-eval/repro-daemon-clients.mjs +0 -125
- package/scripts/agent-eval/run-agent.sh +0 -34
- package/scripts/agent-eval/run-all.sh +0 -75
- package/scripts/agent-eval/run-arms.sh +0 -56
- package/scripts/agent-eval/seq-matrix.mjs +0 -137
- package/scripts/bench-arkts-init-rss.log +0 -0
- package/scripts/build-bundle.sh +0 -123
- package/scripts/exp_boundary_eval/README.md +0 -247
- package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_all.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_all.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/setup.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/win_mcp_launcher.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/_test_mcp_chain.py +0 -78
- package/scripts/exp_boundary_eval/_test_stdin.py +0 -8
- package/scripts/exp_boundary_eval/_utils.py +0 -1116
- package/scripts/exp_boundary_eval/analyze.py +0 -1313
- package/scripts/exp_boundary_eval/deveco_arm.py +0 -519
- package/scripts/exp_boundary_eval/run_all.py +0 -378
- package/scripts/exp_boundary_eval/run_one.py +0 -165
- package/scripts/exp_boundary_eval/run_session.py +0 -158
- package/scripts/exp_boundary_eval/setup.py +0 -120
- package/scripts/exp_boundary_eval/win_mcp_launcher.py +0 -73
- package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +0 -36
- package/scripts/exp_boundary_eval/win_node_launcher.py +0 -24
- package/scripts/extract-release-notes.mjs +0 -130
- package/scripts/local-install.sh +0 -41
- package/scripts/npm-sdk.js +0 -75
- package/scripts/npm-shim.js +0 -275
- package/scripts/ohos-sdk-publish.mjs +0 -133
- package/scripts/pack-npm.sh +0 -119
- package/scripts/prepare-release.mjs +0 -270
- package/scripts/probe-arkts-mem-why-run.log +0 -0
- package/scripts/probe-banner-livecard-ir.log +0 -0
- package/scripts/probe-cfwk-ast.stderr.log +0 -0
- package/scripts/probe-cfwk-ast.stdout.log +0 -0
- package/scripts/probe-cfwk-attr-shape.log +0 -0
- package/scripts/probe-cfwk-cfgdump.stderr.log +0 -0
- package/scripts/probe-cfwk-cfgdump.stdout.log +0 -0
- package/scripts/probe-cfwk-cvc.stderr.log +0 -0
- package/scripts/probe-cfwk-cvc.stdout.log +0 -0
- package/scripts/probe-cfwk-diag2.log +0 -0
- package/scripts/probe-cfwk-diag3.log +0 -0
- package/scripts/probe-cfwk-fedbg.stderr.log +0 -0
- package/scripts/probe-cfwk-fedbg.stdout.log +0 -0
- package/scripts/probe-cfwk-fileresult.log +0 -0
- package/scripts/probe-cfwk-fix.stderr.log +0 -0
- package/scripts/probe-cfwk-fix.stdout.log +0 -0
- package/scripts/probe-cfwk-fix2.stderr.log +0 -0
- package/scripts/probe-cfwk-fix2.stdout.log +0 -0
- package/scripts/probe-cfwk-fix3.stderr.log +0 -0
- package/scripts/probe-cfwk-fix3.stdout.log +0 -0
- package/scripts/probe-cfwk-foreach.log +0 -0
- package/scripts/probe-cfwk-getmethod-throw.log +0 -0
- package/scripts/probe-cfwk-hg-extract.log +0 -0
- package/scripts/probe-cfwk-pr1003-noprior.stderr.log +0 -0
- package/scripts/probe-cfwk-pr1003-noprior.stdout.log +0 -0
- package/scripts/probe-cfwk-pr1003.stderr.log +0 -0
- package/scripts/probe-cfwk-pr1003.stdout.log +0 -0
- package/scripts/probe-cfwk-preroot-noprior.stderr.log +0 -0
- package/scripts/probe-cfwk-preroot-noprior.stdout.log +0 -0
- package/scripts/probe-cfwk-preroot-prior.stderr.log +0 -0
- package/scripts/probe-cfwk-preroot-prior.stdout.log +0 -0
- package/scripts/probe-cfwk-preroot-skipstate.stderr.log +0 -0
- package/scripts/probe-cfwk-preroot-skipstate.stdout.log +0 -0
- package/scripts/probe-cfwk-resolve-sim.log +0 -0
- package/scripts/probe-cfwk-tree-shape.log +0 -0
- package/scripts/probe-cfwk-walk-abort.log +0 -0
- package/scripts/probe-cfwk.log +0 -0
- package/scripts/probe-force-index.log +0 -0
- package/scripts/probe-no-force-index.log +0 -0
- package/scripts/probe-samefile-ir.stderr.log +0 -0
- package/scripts/probe-samefile-ir.stdout.log +0 -224
- package/scripts/probe-sdk-vs-project.log +0 -0
- package/scripts/probe-viewtree-downgrade.log +0 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Diff → changed-symbol impact helpers for `homegraph_diff_impact`.
|
|
4
|
+
*
|
|
5
|
+
* Parses unified diffs (new-side line ranges), intersects those ranges with
|
|
6
|
+
* indexed symbol spans, and builds a capped evidence pack (callers / impact
|
|
7
|
+
* summary / UI edges). Spec attachment is left to the MCP handler.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DIFF_IMPACT_LIMITS = exports.DIFF_IMPACT_UI_SYNTHESIZED_BY = exports.DIFF_IMPACT_MAX_DIFF_CHARS = void 0;
|
|
11
|
+
exports.normalizeDiffFilePath = normalizeDiffFilePath;
|
|
12
|
+
exports.parseUnifiedDiff = parseUnifiedDiff;
|
|
13
|
+
exports.mergeRanges = mergeRanges;
|
|
14
|
+
exports.rangesOverlap = rangesOverlap;
|
|
15
|
+
exports.nodeOverlapsRanges = nodeOverlapsRanges;
|
|
16
|
+
exports.selectChangedSymbols = selectChangedSymbols;
|
|
17
|
+
exports.isDiffImpactUiEdge = isDiffImpactUiEdge;
|
|
18
|
+
exports.buildDiffImpactPack = buildDiffImpactPack;
|
|
19
|
+
exports.resolveDiffImpactHunks = resolveDiffImpactHunks;
|
|
20
|
+
/** Max chars accepted for the `diff` argument (DoS bound; still success-shaped). */
|
|
21
|
+
exports.DIFF_IMPACT_MAX_DIFF_CHARS = 500_000;
|
|
22
|
+
exports.DIFF_IMPACT_UI_SYNTHESIZED_BY = new Set([
|
|
23
|
+
'viewtree',
|
|
24
|
+
'arkui-state',
|
|
25
|
+
'arkui-route',
|
|
26
|
+
'arkui-emitter',
|
|
27
|
+
]);
|
|
28
|
+
/** Kinds that are almost never useful as "what changed" anchors for review. */
|
|
29
|
+
const SKIP_NODE_KINDS = new Set([
|
|
30
|
+
'file',
|
|
31
|
+
'module',
|
|
32
|
+
'parameter',
|
|
33
|
+
'import',
|
|
34
|
+
'export',
|
|
35
|
+
]);
|
|
36
|
+
exports.DIFF_IMPACT_LIMITS = {
|
|
37
|
+
maxSymbols: 80,
|
|
38
|
+
maxCallersPerSymbol: 8,
|
|
39
|
+
maxImpactSamples: 8,
|
|
40
|
+
maxUiEdges: 40,
|
|
41
|
+
maxSpecSymbols: 15,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Strip unified-diff path prefixes (`a/`, `b/`, `./`) and normalize slashes.
|
|
45
|
+
*/
|
|
46
|
+
function normalizeDiffFilePath(raw) {
|
|
47
|
+
let p = raw.trim().replace(/\\/g, '/');
|
|
48
|
+
if (p === '/dev/null' || p === 'nul' || p === 'NUL')
|
|
49
|
+
return '';
|
|
50
|
+
// git often emits "b/src/foo.ts\t" or with timestamps after a tab
|
|
51
|
+
const tab = p.indexOf('\t');
|
|
52
|
+
if (tab >= 0)
|
|
53
|
+
p = p.slice(0, tab);
|
|
54
|
+
if (p.startsWith('a/') || p.startsWith('b/'))
|
|
55
|
+
p = p.slice(2);
|
|
56
|
+
p = p.replace(/^\.\//, '');
|
|
57
|
+
return p;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parse unified diff text into per-file **new-side** (post-change) line ranges.
|
|
61
|
+
* Pure deletions (new count 0) contribute no ranges but still list the file.
|
|
62
|
+
*/
|
|
63
|
+
function parseUnifiedDiff(diff) {
|
|
64
|
+
const notes = [];
|
|
65
|
+
const byFile = new Map();
|
|
66
|
+
let currentPath = '';
|
|
67
|
+
const lines = diff.split(/\r?\n/);
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
if (line.startsWith('+++ ')) {
|
|
70
|
+
const path = normalizeDiffFilePath(line.slice(4));
|
|
71
|
+
currentPath = path;
|
|
72
|
+
if (path && !byFile.has(path))
|
|
73
|
+
byFile.set(path, []);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (line.startsWith('--- ')) {
|
|
77
|
+
// Prefer +++ when present; --- alone (e.g. unusual diffs) seeds the path.
|
|
78
|
+
const path = normalizeDiffFilePath(line.slice(4));
|
|
79
|
+
if (path && !currentPath) {
|
|
80
|
+
currentPath = path;
|
|
81
|
+
if (!byFile.has(path))
|
|
82
|
+
byFile.set(path, []);
|
|
83
|
+
}
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (line.startsWith('diff --git ')) {
|
|
87
|
+
currentPath = '';
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const m = /^@@\s+-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/.exec(line);
|
|
91
|
+
if (!m)
|
|
92
|
+
continue;
|
|
93
|
+
if (!currentPath) {
|
|
94
|
+
notes.push('Skipped a hunk with no preceding +++ file path.');
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const newStart = parseInt(m[3], 10);
|
|
98
|
+
const newCount = m[4] !== undefined ? parseInt(m[4], 10) : 1;
|
|
99
|
+
if (newCount <= 0) {
|
|
100
|
+
// Pure deletion on the new side — keep file listed, no line ranges.
|
|
101
|
+
if (!byFile.has(currentPath))
|
|
102
|
+
byFile.set(currentPath, []);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const ranges = byFile.get(currentPath) ?? [];
|
|
106
|
+
ranges.push({
|
|
107
|
+
startLine: newStart,
|
|
108
|
+
endLine: newStart + newCount - 1,
|
|
109
|
+
});
|
|
110
|
+
byFile.set(currentPath, ranges);
|
|
111
|
+
}
|
|
112
|
+
const hunks = [];
|
|
113
|
+
for (const [path, ranges] of byFile) {
|
|
114
|
+
hunks.push({ path, ranges: mergeRanges(ranges) });
|
|
115
|
+
}
|
|
116
|
+
hunks.sort((a, b) => a.path.localeCompare(b.path));
|
|
117
|
+
return { hunks, notes };
|
|
118
|
+
}
|
|
119
|
+
/** Merge overlapping / adjacent line ranges. */
|
|
120
|
+
function mergeRanges(ranges) {
|
|
121
|
+
if (ranges.length === 0)
|
|
122
|
+
return [];
|
|
123
|
+
const sorted = [...ranges].sort((a, b) => a.startLine - b.startLine || a.endLine - b.endLine);
|
|
124
|
+
const out = [{ ...sorted[0] }];
|
|
125
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
126
|
+
const cur = sorted[i];
|
|
127
|
+
const last = out[out.length - 1];
|
|
128
|
+
if (cur.startLine <= last.endLine + 1) {
|
|
129
|
+
last.endLine = Math.max(last.endLine, cur.endLine);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
out.push({ ...cur });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
function rangesOverlap(a, b) {
|
|
138
|
+
return a.startLine <= b.endLine && b.startLine <= a.endLine;
|
|
139
|
+
}
|
|
140
|
+
function nodeOverlapsRanges(node, ranges) {
|
|
141
|
+
const span = { startLine: node.startLine, endLine: node.endLine };
|
|
142
|
+
return ranges.some((r) => rangesOverlap(span, r));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Select indexed nodes whose spans intersect any changed line range.
|
|
146
|
+
* Skips container/noise kinds. Prefers tighter (inner) symbols when sorting.
|
|
147
|
+
*/
|
|
148
|
+
function selectChangedSymbols(nodesByFile, hunks, limits = { maxSymbols: exports.DIFF_IMPACT_LIMITS.maxSymbols }) {
|
|
149
|
+
const picked = [];
|
|
150
|
+
for (const hunk of hunks) {
|
|
151
|
+
if (hunk.ranges.length === 0)
|
|
152
|
+
continue;
|
|
153
|
+
const nodes = nodesByFile.get(hunk.path) ?? [];
|
|
154
|
+
for (const n of nodes) {
|
|
155
|
+
if (SKIP_NODE_KINDS.has(n.kind))
|
|
156
|
+
continue;
|
|
157
|
+
if (!nodeOverlapsRanges(n, hunk.ranges))
|
|
158
|
+
continue;
|
|
159
|
+
picked.push({
|
|
160
|
+
id: n.id,
|
|
161
|
+
name: n.name,
|
|
162
|
+
kind: n.kind,
|
|
163
|
+
filePath: n.filePath,
|
|
164
|
+
startLine: n.startLine,
|
|
165
|
+
endLine: n.endLine,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Prefer smaller spans (inner defs) then earlier lines — review noise control.
|
|
170
|
+
picked.sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine) ||
|
|
171
|
+
a.startLine - b.startLine ||
|
|
172
|
+
a.name.localeCompare(b.name));
|
|
173
|
+
const truncated = picked.length > limits.maxSymbols;
|
|
174
|
+
return {
|
|
175
|
+
symbols: truncated ? picked.slice(0, limits.maxSymbols) : picked,
|
|
176
|
+
truncated,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function isDiffImpactUiEdge(edge) {
|
|
180
|
+
if (edge.provenance !== 'heuristic')
|
|
181
|
+
return false;
|
|
182
|
+
const m = edge.metadata;
|
|
183
|
+
const by = m?.synthesizedBy;
|
|
184
|
+
return typeof by === 'string' && exports.DIFF_IMPACT_UI_SYNTHESIZED_BY.has(by);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build the capped evidence pack from hunks + graph. Specs are not included.
|
|
188
|
+
*/
|
|
189
|
+
function buildDiffImpactPack(graph, hunks, options = {}) {
|
|
190
|
+
const limits = { ...exports.DIFF_IMPACT_LIMITS, ...options.limits };
|
|
191
|
+
const depth = Math.max(1, Math.min(options.depth ?? 2, 5));
|
|
192
|
+
const notes = [...(options.notes ?? [])];
|
|
193
|
+
const nodesByFile = new Map();
|
|
194
|
+
for (const h of hunks) {
|
|
195
|
+
try {
|
|
196
|
+
nodesByFile.set(h.path, graph.getNodesInFile(h.path));
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
nodesByFile.set(h.path, []);
|
|
200
|
+
notes.push(`Could not load nodes for ${h.path}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const { symbols, truncated: symbolsTruncated } = selectChangedSymbols(nodesByFile, hunks, {
|
|
204
|
+
maxSymbols: limits.maxSymbols,
|
|
205
|
+
});
|
|
206
|
+
if (symbols.length === 0) {
|
|
207
|
+
notes.push(hunks.some((h) => h.ranges.length > 0)
|
|
208
|
+
? 'No indexed symbols intersect the changed line ranges (index may be stale relative to the diff, or changes are non-symbol).'
|
|
209
|
+
: 'Diff had no new-side line ranges (pure deletions or empty).');
|
|
210
|
+
}
|
|
211
|
+
const symbolIds = new Set(symbols.map((s) => s.id));
|
|
212
|
+
const nameById = new Map(symbols.map((s) => [s.id, s.name]));
|
|
213
|
+
const callers = [];
|
|
214
|
+
let callersTruncated = false;
|
|
215
|
+
for (const sym of symbols) {
|
|
216
|
+
let list = [];
|
|
217
|
+
try {
|
|
218
|
+
list = graph.getCallers(sym.id, 1);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (list.length > limits.maxCallersPerSymbol) {
|
|
224
|
+
callersTruncated = true;
|
|
225
|
+
list = list.slice(0, limits.maxCallersPerSymbol);
|
|
226
|
+
}
|
|
227
|
+
for (const { node, edge } of list) {
|
|
228
|
+
callers.push({
|
|
229
|
+
symbol: sym.name,
|
|
230
|
+
callerName: node.name,
|
|
231
|
+
callerFile: node.filePath,
|
|
232
|
+
line: edge.line ?? null,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const impactSummary = [];
|
|
237
|
+
let impactTruncated = false;
|
|
238
|
+
for (const sym of symbols) {
|
|
239
|
+
try {
|
|
240
|
+
const impact = graph.getImpactRadius(sym.id, depth);
|
|
241
|
+
const nodes = normalizeImpactNodes(impact.nodes).filter((n) => n.id !== sym.id);
|
|
242
|
+
if (nodes.length > limits.maxImpactSamples)
|
|
243
|
+
impactTruncated = true;
|
|
244
|
+
impactSummary.push({
|
|
245
|
+
symbol: sym.name,
|
|
246
|
+
affectedCount: nodes.length,
|
|
247
|
+
sampleNames: nodes.slice(0, limits.maxImpactSamples).map((n) => n.name),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
impactSummary.push({ symbol: sym.name, affectedCount: 0, sampleNames: [] });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const uiEdges = [];
|
|
255
|
+
const seenUi = new Set();
|
|
256
|
+
let uiTruncated = false;
|
|
257
|
+
for (const sym of symbols) {
|
|
258
|
+
if (uiEdges.length >= limits.maxUiEdges) {
|
|
259
|
+
uiTruncated = true;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
let edges = [];
|
|
263
|
+
try {
|
|
264
|
+
edges = [
|
|
265
|
+
...graph.getOutgoingEdges(sym.id),
|
|
266
|
+
...graph.getIncomingEdges(sym.id),
|
|
267
|
+
];
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
for (const edge of edges) {
|
|
273
|
+
if (!isDiffImpactUiEdge(edge))
|
|
274
|
+
continue;
|
|
275
|
+
if (!symbolIds.has(edge.source) && !symbolIds.has(edge.target))
|
|
276
|
+
continue;
|
|
277
|
+
const key = `${edge.source}>${edge.target}>${edge.kind}>${String(edge.metadata?.via ?? '')}`;
|
|
278
|
+
if (seenUi.has(key))
|
|
279
|
+
continue;
|
|
280
|
+
seenUi.add(key);
|
|
281
|
+
const m = edge.metadata;
|
|
282
|
+
const sourceName = nameById.get(edge.source) ?? graph.getNode?.(edge.source)?.name ?? edge.source;
|
|
283
|
+
const targetName = nameById.get(edge.target) ?? graph.getNode?.(edge.target)?.name ?? edge.target;
|
|
284
|
+
uiEdges.push({
|
|
285
|
+
source: edge.source,
|
|
286
|
+
sourceName,
|
|
287
|
+
target: edge.target,
|
|
288
|
+
targetName,
|
|
289
|
+
kind: edge.kind,
|
|
290
|
+
synthesizedBy: String(m?.synthesizedBy ?? ''),
|
|
291
|
+
via: typeof m?.via === 'string' ? m.via : null,
|
|
292
|
+
line: edge.line ?? null,
|
|
293
|
+
});
|
|
294
|
+
if (uiEdges.length >= limits.maxUiEdges) {
|
|
295
|
+
uiTruncated = true;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
changedFiles: hunks.map((h) => h.path),
|
|
302
|
+
hunks,
|
|
303
|
+
changedSymbols: symbols,
|
|
304
|
+
callers,
|
|
305
|
+
impactSummary,
|
|
306
|
+
uiEdges,
|
|
307
|
+
truncated: {
|
|
308
|
+
symbols: symbolsTruncated,
|
|
309
|
+
callers: callersTruncated,
|
|
310
|
+
impact: impactTruncated,
|
|
311
|
+
uiEdges: uiTruncated,
|
|
312
|
+
},
|
|
313
|
+
notes,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function normalizeImpactNodes(nodes) {
|
|
317
|
+
if (Array.isArray(nodes))
|
|
318
|
+
return nodes;
|
|
319
|
+
if (nodes instanceof Map)
|
|
320
|
+
return Array.from(nodes.values());
|
|
321
|
+
return Array.from(nodes);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Accept either a unified `diff` string or explicit `hunks` from the agent.
|
|
325
|
+
*/
|
|
326
|
+
function resolveDiffImpactHunks(args) {
|
|
327
|
+
if (typeof args.diff === 'string' && args.diff.length > 0) {
|
|
328
|
+
if (args.diff.length > exports.DIFF_IMPACT_MAX_DIFF_CHARS) {
|
|
329
|
+
return {
|
|
330
|
+
hunks: [],
|
|
331
|
+
notes: [],
|
|
332
|
+
error: `\`diff\` exceeds maximum length of ${exports.DIFF_IMPACT_MAX_DIFF_CHARS} characters ` +
|
|
333
|
+
`(got ${args.diff.length}). Pass a smaller unified diff (e.g. one PR file at a time).`,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
return parseUnifiedDiff(args.diff);
|
|
337
|
+
}
|
|
338
|
+
if (Array.isArray(args.hunks)) {
|
|
339
|
+
const hunks = [];
|
|
340
|
+
const notes = [];
|
|
341
|
+
for (const raw of args.hunks) {
|
|
342
|
+
if (!raw || typeof raw !== 'object') {
|
|
343
|
+
notes.push('Ignored a non-object hunk entry.');
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const rec = raw;
|
|
347
|
+
const path = typeof rec.path === 'string'
|
|
348
|
+
? normalizeDiffFilePath(rec.path)
|
|
349
|
+
: typeof rec.file === 'string'
|
|
350
|
+
? normalizeDiffFilePath(rec.file)
|
|
351
|
+
: '';
|
|
352
|
+
if (!path) {
|
|
353
|
+
notes.push('Ignored a hunk with no path.');
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
const startLine = Number(rec.startLine ?? rec.start);
|
|
357
|
+
const endLine = Number(rec.endLine ?? rec.end ?? startLine);
|
|
358
|
+
if (!Number.isFinite(startLine) || startLine < 1) {
|
|
359
|
+
notes.push(`Ignored hunk for ${path}: invalid startLine.`);
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const end = Number.isFinite(endLine) && endLine >= startLine ? endLine : startLine;
|
|
363
|
+
hunks.push({ path, ranges: [{ startLine, endLine: end }] });
|
|
364
|
+
}
|
|
365
|
+
// Merge by path
|
|
366
|
+
const byPath = new Map();
|
|
367
|
+
for (const h of hunks) {
|
|
368
|
+
const list = byPath.get(h.path) ?? [];
|
|
369
|
+
list.push(...h.ranges);
|
|
370
|
+
byPath.set(h.path, list);
|
|
371
|
+
}
|
|
372
|
+
const merged = [...byPath.entries()].map(([p, ranges]) => ({
|
|
373
|
+
path: p,
|
|
374
|
+
ranges: mergeRanges(ranges),
|
|
375
|
+
}));
|
|
376
|
+
merged.sort((a, b) => a.path.localeCompare(b.path));
|
|
377
|
+
return { hunks: merged, notes };
|
|
378
|
+
}
|
|
379
|
+
return {
|
|
380
|
+
hunks: [],
|
|
381
|
+
notes: [],
|
|
382
|
+
error: 'Provide either `diff` (unified diff text) or `hunks` (array of { path, startLine, endLine }).',
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=diff-impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-impact.js","sourceRoot":"","sources":["../../src/mcp/diff-impact.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAetC,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAAc;IAIjC,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,SAAS,CAA0B;gBAE/B,IAAI,GAAE,gBAAqB;IAKvC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;;;OAKG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAK7C,0EAA0E;IAC1E,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B,yEAAyE;IACzE,cAAc,IAAI,WAAW;IAI7B,uDAAuD;IACvD,mBAAmB,IAAI,OAAO;IAI9B;;;;;;;;OAQG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1D;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAyB7C;;;OAGG;IACH,IAAI,IAAI,IAAI;YAiBE,YAAY;IA8B1B;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAuDrB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;CA4CpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM5E"}
|
package/dist/mcp/engine.js
CHANGED
|
@@ -53,9 +53,10 @@ const tools_1 = require("./tools");
|
|
|
53
53
|
const query_pool_1 = require("./query-pool");
|
|
54
54
|
const memory_budget_1 = require("./memory-budget");
|
|
55
55
|
const db_1 = require("../db");
|
|
56
|
+
const graph_sources_1 = require("../graph-sources");
|
|
56
57
|
// Lazy-load the heavy HomeGraph chain (sqlite + query/graph/context layers) OFF
|
|
57
58
|
// the MCP startup path. It's only needed once a tool actually opens a project —
|
|
58
|
-
// not to answer initialize/tools-list — so deferring it lets `serve
|
|
59
|
+
// not to answer initialize/tools-list — so deferring it lets `serve mcp` (and
|
|
59
60
|
// the daemon it spawns) bind + register tools in ~Node-startup time instead of
|
|
60
61
|
// ~800ms, closing the "No such tool available" cold-start race that made headless
|
|
61
62
|
// agents flounder. require() is sync + cached on the CommonJS build.
|
|
@@ -179,6 +180,9 @@ class MCPEngine {
|
|
|
179
180
|
if (!resolvedRoot)
|
|
180
181
|
return;
|
|
181
182
|
try {
|
|
183
|
+
const mode = (0, graph_sources_1.resolveGraphSources)();
|
|
184
|
+
if (!(0, graph_sources_1.graphSourceFlags)(mode).openProjectDb)
|
|
185
|
+
return;
|
|
182
186
|
// Close any previously failed instance to avoid leaking resources.
|
|
183
187
|
if (this.cg) {
|
|
184
188
|
try {
|
|
@@ -187,7 +191,7 @@ class MCPEngine {
|
|
|
187
191
|
catch { /* ignore */ }
|
|
188
192
|
this.cg = null;
|
|
189
193
|
}
|
|
190
|
-
this.cg = loadHomeGraph().openSync(resolvedRoot);
|
|
194
|
+
this.cg = loadHomeGraph().openSync(resolvedRoot, { sources: mode });
|
|
191
195
|
this.projectPath = resolvedRoot;
|
|
192
196
|
this.toolHandler.setDefaultHomeGraph(this.cg);
|
|
193
197
|
this.startWatching();
|
|
@@ -232,7 +236,12 @@ class MCPEngine {
|
|
|
232
236
|
}
|
|
233
237
|
this.projectPath = resolvedRoot;
|
|
234
238
|
try {
|
|
235
|
-
|
|
239
|
+
const mode = (0, graph_sources_1.resolveGraphSources)();
|
|
240
|
+
if (!(0, graph_sources_1.graphSourceFlags)(mode).openProjectDb) {
|
|
241
|
+
process.stderr.write(`[HomeGraph MCP] Graph sources=${mode} — skipping project/SDK open (tools return guidance).\n`);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
this.cg = await loadHomeGraph().open(resolvedRoot, { sources: mode });
|
|
236
245
|
this.toolHandler.setDefaultHomeGraph(this.cg);
|
|
237
246
|
this.startWatching();
|
|
238
247
|
this.catchUpSync();
|
package/dist/mcp/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-call source dedup for `homegraph_explore` (CG-18).
|
|
3
|
+
*
|
|
4
|
+
* The session record (CG-17) knows what earlier calls already sent. This module
|
|
5
|
+
* is the algebra that turns that record into a decision for the call being
|
|
6
|
+
* rendered: of the line ranges this call WOULD emit, which does the agent
|
|
7
|
+
* already hold, and what is genuinely new.
|
|
8
|
+
*
|
|
9
|
+
* Three rules shape everything here, and all three come from the same place —
|
|
10
|
+
* an insufficient-feeling response is what sends an agent to Read, and one or
|
|
11
|
+
* two of those early in a session teach it to abandon homegraph entirely
|
|
12
|
+
* (CLAUDE.md):
|
|
13
|
+
*
|
|
14
|
+
* 1. **A pointer, never a bare omission.** Removed source is replaced by a
|
|
15
|
+
* back-reference naming the file, the symbols, and the line span, worded so
|
|
16
|
+
* it is unmistakable that the source was already delivered IN THIS
|
|
17
|
+
* CONVERSATION and is still current. Silence reads as "homegraph didn't
|
|
18
|
+
* find it".
|
|
19
|
+
* 2. **Only prove-it dedup.** A span is withheld only when the file's bytes
|
|
20
|
+
* are byte-identical to what was served (a content fingerprint, not an
|
|
21
|
+
* mtime and not the index's drift flag). An edit between calls means the
|
|
22
|
+
* agent's copy is wrong, so the source is re-emitted in full.
|
|
23
|
+
* 3. **Cut chunks, not slivers.** Only a covered run of at least
|
|
24
|
+
* {@link EXPLORE_DEDUP.MIN_COVERED_LINES} lines is worth replacing. Below
|
|
25
|
+
* that the pointer costs more than the source, and shattering a block into
|
|
26
|
+
* one-line fragments produces exactly the ragged output that reads as a
|
|
27
|
+
* failure. Everything not withheld is emitted — where the algebra is
|
|
28
|
+
* unsure, it re-serves.
|
|
29
|
+
*
|
|
30
|
+
* Which way to be wrong, restated for this layer: re-serving something the agent
|
|
31
|
+
* has is a few hundred wasted chars; withholding something it never saw is a
|
|
32
|
+
* Read. Every threshold below leans to the first.
|
|
33
|
+
*/
|
|
34
|
+
import type { ExploreLineRange, ExploreProjectState } from './explore-session-state';
|
|
35
|
+
export declare const EXPLORE_DEDUP: {
|
|
36
|
+
/**
|
|
37
|
+
* Shortest already-served run that may be replaced by a back-reference.
|
|
38
|
+
*
|
|
39
|
+
* Sized against what dedup is actually FOR — a later call re-serving a whole
|
|
40
|
+
* method or file it already sent. A shorter covered run is either a signature
|
|
41
|
+
* line in a skeleton render or the ±3 lines of context padding around a
|
|
42
|
+
* cluster, and swapping either for a pointer trades bytes for noise: the
|
|
43
|
+
* pointer sentence is itself ~140 chars, so under this length dedup would
|
|
44
|
+
* make the response BIGGER while making it read as full of holes.
|
|
45
|
+
*/
|
|
46
|
+
readonly MIN_COVERED_LINES: 8;
|
|
47
|
+
/**
|
|
48
|
+
* Below this many chars of NEW source, a file's remainder is folded into its
|
|
49
|
+
* back-reference instead of being fenced on its own.
|
|
50
|
+
*
|
|
51
|
+
* The shape this exists for, seen on the CG-17 fixture: a third call whose
|
|
52
|
+
* only unheld line was the file's trailing blank one, rendered as a code fence
|
|
53
|
+
* containing `228\t`. A fence holding two lines of nothing reads as a broken
|
|
54
|
+
* response, and reading as broken is the expensive failure — it is the thing
|
|
55
|
+
* that sends an agent to Read and keeps it there. So a remainder this small is
|
|
56
|
+
* dropped rather than shown. It is the one place this module withholds
|
|
57
|
+
* something the agent has not seen, and it is bounded to ~two lines that sit
|
|
58
|
+
* directly against source the agent does hold; the file is still named, with
|
|
59
|
+
* its symbols, so one follow-up explore fetches it whole.
|
|
60
|
+
*/
|
|
61
|
+
readonly MIN_DELTA_CHARS: 160;
|
|
62
|
+
/** Line spans named in one pointer before it summarises the rest. */
|
|
63
|
+
readonly MAX_SPANS_IN_POINTER: 4;
|
|
64
|
+
/** Symbols named in one pointer before it summarises the rest. */
|
|
65
|
+
readonly MAX_SYMBOLS_IN_POINTER: 5;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Kill switch: `HOMEGRAPH_EXPLORE_DEDUP=0` renders every call as if the session
|
|
69
|
+
* had no history. Read per call (not memoized) so a test can toggle it.
|
|
70
|
+
*/
|
|
71
|
+
export declare function exploreDedupEnabled(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Identity of the bytes a call served for one file.
|
|
74
|
+
*
|
|
75
|
+
* This — not the index's drift flag — is what gates dedup. `isFileStaleOnDisk`
|
|
76
|
+
* answers "did the file change since the last INDEX SYNC", which is a different
|
|
77
|
+
* question with a different answer: two calls inside one drift window served the
|
|
78
|
+
* same current bytes (dedup is correct), while a file edited and re-synced
|
|
79
|
+
* between two calls is never "stale" and yet the agent's copy is now wrong
|
|
80
|
+
* (dedup would be actively harmful). Length is prefixed so a hash prefix
|
|
81
|
+
* collision cannot alias two files of different size.
|
|
82
|
+
*/
|
|
83
|
+
export declare function fileFingerprint(content: string): string;
|
|
84
|
+
/** Sort + merge overlapping/adjacent spans into the smallest equivalent set. */
|
|
85
|
+
export declare function mergeRanges(ranges: ReadonlyArray<ExploreLineRange>): ExploreLineRange[];
|
|
86
|
+
/** The parts of `range` that `served` covers. */
|
|
87
|
+
export declare function intersectRange(range: ExploreLineRange, served: ReadonlyArray<ExploreLineRange>): ExploreLineRange[];
|
|
88
|
+
/** The parts of `range` that `cut` does NOT cover. */
|
|
89
|
+
export declare function subtractRange(range: ExploreLineRange, cut: ReadonlyArray<ExploreLineRange>): ExploreLineRange[];
|
|
90
|
+
/** What one intended span becomes once the session's history is applied. */
|
|
91
|
+
export interface RangeDedup {
|
|
92
|
+
/** Spans to render now — everything not proven-already-held. */
|
|
93
|
+
emit: ExploreLineRange[];
|
|
94
|
+
/** Spans replaced by a back-reference. */
|
|
95
|
+
covered: ExploreLineRange[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Split one intended span into what to emit and what to point back at.
|
|
99
|
+
*
|
|
100
|
+
* Covered runs shorter than {@link EXPLORE_DEDUP.MIN_COVERED_LINES} are left in
|
|
101
|
+
* the emit set on purpose (rule 3 above) — so a span the agent holds "almost
|
|
102
|
+
* all of" still comes back whole rather than as a stutter of fragments around
|
|
103
|
+
* pointers.
|
|
104
|
+
*/
|
|
105
|
+
export declare function dedupeRange(range: ExploreLineRange, served: ReadonlyArray<ExploreLineRange>, minCovered?: number): RangeDedup;
|
|
106
|
+
/**
|
|
107
|
+
* Every line span this session has already served for one file, but ONLY from
|
|
108
|
+
* calls that served the SAME BYTES.
|
|
109
|
+
*
|
|
110
|
+
* A record with no fingerprint is ignored rather than trusted: it cannot prove
|
|
111
|
+
* the agent's copy matches the file on disk now, and an unprovable match is
|
|
112
|
+
* exactly the case where re-serving is right.
|
|
113
|
+
*/
|
|
114
|
+
export declare function servedRangesForFile(prior: ExploreProjectState | null, filePath: string, fingerprint: string): ExploreLineRange[];
|
|
115
|
+
/** `L12`, `L12-40`, capped with a `+N more` tail. */
|
|
116
|
+
export declare function formatSpans(spans: ReadonlyArray<ExploreLineRange>): string;
|
|
117
|
+
/**
|
|
118
|
+
* The line that replaces withheld source.
|
|
119
|
+
*
|
|
120
|
+
* It has one job: make the agent reach into its own context instead of into
|
|
121
|
+
* Read. So it carries the three things needed to find the source it already has
|
|
122
|
+
* — path, symbols, line spans — plus the two facts that make using it safe:
|
|
123
|
+
* that it came from THIS conversation, and that the file has not changed since
|
|
124
|
+
* (which is checked, not asserted — see {@link fileFingerprint}). It never says
|
|
125
|
+
* "omitted", and it never steers to Read.
|
|
126
|
+
*/
|
|
127
|
+
export declare function formatBackReference(filePath: string, covered: ReadonlyArray<ExploreLineRange>, symbols: ReadonlyArray<string>, opts: {
|
|
128
|
+
partial: boolean;
|
|
129
|
+
}): string;
|
|
130
|
+
/** Symbol names whose definitions fall inside the withheld spans. */
|
|
131
|
+
export declare function symbolsInSpans(nodes: ReadonlyArray<{
|
|
132
|
+
name: string;
|
|
133
|
+
kind: string;
|
|
134
|
+
startLine: number;
|
|
135
|
+
endLine: number;
|
|
136
|
+
}>, spans: ReadonlyArray<ExploreLineRange>): string[];
|
|
137
|
+
//# sourceMappingURL=explore-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explore-dedup.d.ts","sourceRoot":"","sources":["../../src/mcp/explore-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAErF,eAAO,MAAM,aAAa;IACxB;;;;;;;;;OASG;;IAEH;;;;;;;;;;;;;OAaG;;IAEH,qEAAqE;;IAErE,kEAAkE;;CAE1D,CAAC;AAIX;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,EAAE,CAYvF;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,GACtC,gBAAgB,EAAE,CAQpB;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,aAAa,CAAC,gBAAgB,CAAC,GACnC,gBAAgB,EAAE,CAYpB;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,0CAA0C;IAC1C,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACvC,UAAU,GAAE,MAAwC,GACnD,UAAU,CAKZ;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,GAAG,IAAI,EACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,gBAAgB,EAAE,CAWpB;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAM1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACxC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAC9B,IAAI,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACzB,MAAM,CAWR;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACxF,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,GACrC,MAAM,EAAE,CAWV"}
|