homegraph 1.2.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -11
- package/dist/bin/homegraph.js +298 -72
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +117 -11
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts +207 -6
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +461 -20
- 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 +19 -1
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +157 -3
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +426 -9
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +32 -1
- package/dist/db/sqlite-adapter.d.ts +24 -17
- package/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/dist/db/sqlite-adapter.js +292 -36
- package/dist/db/sqlite-adapter.js.map +1 -1
- package/dist/db/wal-valve.d.ts +119 -0
- package/dist/db/wal-valve.d.ts.map +1 -0
- package/dist/db/wal-valve.js +290 -0
- package/dist/db/wal-valve.js.map +1 -0
- package/dist/directory.d.ts +9 -5
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +210 -19
- package/dist/directory.js.map +1 -1
- package/dist/extraction/arkts-batch-worker.js +3 -2
- package/dist/extraction/arkts-batch-worker.js.map +1 -1
- package/dist/extraction/cfml-extractor.d.ts +107 -0
- package/dist/extraction/cfml-extractor.d.ts.map +1 -0
- package/dist/extraction/cfml-extractor.js +494 -0
- package/dist/extraction/cfml-extractor.js.map +1 -0
- package/dist/extraction/default-ignore.d.ts +39 -0
- package/dist/extraction/default-ignore.d.ts.map +1 -0
- package/dist/extraction/default-ignore.js +221 -0
- package/dist/extraction/default-ignore.js.map +1 -0
- package/dist/extraction/grammars.d.ts +25 -1
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +177 -24
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts +52 -14
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +521 -314
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +90 -6
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +1579 -128
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/languages/c-cpp.d.ts +42 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
- package/dist/extraction/languages/c-cpp.js +369 -4
- package/dist/extraction/languages/c-cpp.js.map +1 -1
- package/dist/extraction/languages/cfquery.d.ts +12 -0
- package/dist/extraction/languages/cfquery.d.ts.map +1 -0
- package/dist/extraction/languages/cfquery.js +28 -0
- package/dist/extraction/languages/cfquery.js.map +1 -0
- package/dist/extraction/languages/cfscript.d.ts +3 -0
- package/dist/extraction/languages/cfscript.d.ts.map +1 -0
- package/dist/extraction/languages/cfscript.js +73 -0
- package/dist/extraction/languages/cfscript.js.map +1 -0
- package/dist/extraction/languages/cobol.d.ts +33 -0
- package/dist/extraction/languages/cobol.d.ts.map +1 -0
- package/dist/extraction/languages/cobol.js +499 -0
- package/dist/extraction/languages/cobol.js.map +1 -0
- package/dist/extraction/languages/erlang.d.ts +3 -0
- package/dist/extraction/languages/erlang.d.ts.map +1 -0
- package/dist/extraction/languages/erlang.js +350 -0
- package/dist/extraction/languages/erlang.js.map +1 -0
- package/dist/extraction/languages/index.d.ts.map +1 -1
- package/dist/extraction/languages/index.js +16 -0
- package/dist/extraction/languages/index.js.map +1 -1
- package/dist/extraction/languages/nix.d.ts +3 -0
- package/dist/extraction/languages/nix.d.ts.map +1 -0
- package/dist/extraction/languages/nix.js +294 -0
- package/dist/extraction/languages/nix.js.map +1 -0
- package/dist/extraction/languages/solidity.d.ts +3 -0
- package/dist/extraction/languages/solidity.d.ts.map +1 -0
- package/dist/extraction/languages/solidity.js +293 -0
- package/dist/extraction/languages/solidity.js.map +1 -0
- package/dist/extraction/languages/terraform.d.ts +3 -0
- package/dist/extraction/languages/terraform.d.ts.map +1 -0
- package/dist/extraction/languages/terraform.js +641 -0
- package/dist/extraction/languages/terraform.js.map +1 -0
- package/dist/extraction/languages/vbnet.d.ts +11 -0
- package/dist/extraction/languages/vbnet.d.ts.map +1 -0
- package/dist/extraction/languages/vbnet.js +141 -0
- package/dist/extraction/languages/vbnet.js.map +1 -0
- package/dist/extraction/mybatis-extractor.d.ts +30 -10
- package/dist/extraction/mybatis-extractor.d.ts.map +1 -1
- package/dist/extraction/mybatis-extractor.js +140 -38
- package/dist/extraction/mybatis-extractor.js.map +1 -1
- package/dist/extraction/parse-pool.d.ts +27 -1
- package/dist/extraction/parse-pool.d.ts.map +1 -1
- package/dist/extraction/parse-pool.js +75 -7
- package/dist/extraction/parse-pool.js.map +1 -1
- package/dist/extraction/parse-worker.js +9 -2
- package/dist/extraction/parse-worker.js.map +1 -1
- package/dist/extraction/store-worker.d.ts +20 -0
- package/dist/extraction/store-worker.d.ts.map +1 -0
- package/dist/extraction/store-worker.js +102 -0
- package/dist/extraction/store-worker.js.map +1 -0
- package/dist/extraction/store-writer.d.ts +48 -0
- package/dist/extraction/store-writer.d.ts.map +1 -0
- package/dist/extraction/store-writer.js +167 -0
- package/dist/extraction/store-writer.js.map +1 -0
- package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
- package/dist/extraction/tree-sitter-helpers.js +1 -0
- package/dist/extraction/tree-sitter-helpers.js.map +1 -1
- package/dist/extraction/tree-sitter-types.d.ts +3 -1
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.d.ts +38 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +801 -10
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/extraction/wasm/tree-sitter-arkts.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-terraform.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
- package/dist/extraction/wasm-runtime-flags.d.ts +14 -4
- package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
- package/dist/extraction/wasm-runtime-flags.js +55 -7
- package/dist/extraction/wasm-runtime-flags.js.map +1 -1
- package/dist/graph/traversal.d.ts.map +1 -1
- package/dist/graph/traversal.js +1 -1
- package/dist/graph/traversal.js.map +1 -1
- package/dist/index.d.ts +74 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +436 -55
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts +42 -0
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +97 -2
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/daemon.d.ts +25 -3
- package/dist/mcp/daemon.d.ts.map +1 -1
- package/dist/mcp/daemon.js +62 -8
- package/dist/mcp/daemon.js.map +1 -1
- package/dist/mcp/dynamic-boundaries.d.ts.map +1 -1
- package/dist/mcp/dynamic-boundaries.js +2 -1
- package/dist/mcp/dynamic-boundaries.js.map +1 -1
- package/dist/mcp/early-ppid.d.ts +26 -0
- package/dist/mcp/early-ppid.d.ts.map +1 -0
- package/dist/mcp/early-ppid.js +29 -0
- package/dist/mcp/early-ppid.js.map +1 -0
- package/dist/mcp/engine.d.ts +4 -5
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +27 -1
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +41 -6
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/liveness-watchdog.d.ts +18 -1
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
- package/dist/mcp/liveness-watchdog.js +73 -13
- package/dist/mcp/liveness-watchdog.js.map +1 -1
- package/dist/mcp/memory-budget.d.ts +30 -0
- package/dist/mcp/memory-budget.d.ts.map +1 -0
- package/dist/mcp/memory-budget.js +123 -0
- package/dist/mcp/memory-budget.js.map +1 -0
- package/dist/mcp/proxy.d.ts.map +1 -1
- package/dist/mcp/proxy.js +88 -4
- package/dist/mcp/proxy.js.map +1 -1
- package/dist/mcp/query-cache.d.ts +35 -4
- package/dist/mcp/query-cache.d.ts.map +1 -1
- package/dist/mcp/query-cache.js +89 -19
- package/dist/mcp/query-cache.js.map +1 -1
- package/dist/mcp/query-pool.d.ts +46 -12
- package/dist/mcp/query-pool.d.ts.map +1 -1
- package/dist/mcp/query-pool.js +100 -23
- package/dist/mcp/query-pool.js.map +1 -1
- package/dist/mcp/query-worker.d.ts +2 -2
- package/dist/mcp/query-worker.js +2 -2
- package/dist/mcp/server-instructions.d.ts +4 -27
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +39 -84
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/session.d.ts +14 -0
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +28 -1
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/startup-handshake.d.ts +44 -0
- package/dist/mcp/startup-handshake.d.ts.map +1 -0
- package/dist/mcp/startup-handshake.js +73 -0
- package/dist/mcp/startup-handshake.js.map +1 -0
- package/dist/mcp/tools.d.ts +104 -4
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +2432 -217
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/transport.d.ts.map +1 -1
- package/dist/mcp/transport.js +18 -0
- package/dist/mcp/transport.js.map +1 -1
- package/dist/project-config.d.ts +38 -0
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +101 -2
- package/dist/project-config.js.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.d.ts +2 -1
- package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.js +178 -146
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +54 -10
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +1299 -257
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/cooperative-yield.d.ts +10 -2
- package/dist/resolution/cooperative-yield.d.ts.map +1 -1
- package/dist/resolution/cooperative-yield.js +6 -4
- package/dist/resolution/cooperative-yield.js.map +1 -1
- package/dist/resolution/frameworks/cics.d.ts +20 -0
- package/dist/resolution/frameworks/cics.d.ts.map +1 -0
- package/dist/resolution/frameworks/cics.js +90 -0
- package/dist/resolution/frameworks/cics.js.map +1 -0
- package/dist/resolution/frameworks/go.d.ts.map +1 -1
- package/dist/resolution/frameworks/go.js +29 -6
- package/dist/resolution/frameworks/go.js.map +1 -1
- package/dist/resolution/frameworks/index.d.ts.map +1 -1
- package/dist/resolution/frameworks/index.js +3 -0
- package/dist/resolution/frameworks/index.js.map +1 -1
- package/dist/resolution/frameworks/java.d.ts.map +1 -1
- package/dist/resolution/frameworks/java.js +14 -6
- package/dist/resolution/frameworks/java.js.map +1 -1
- package/dist/resolution/frameworks/terraform.d.ts +38 -0
- package/dist/resolution/frameworks/terraform.d.ts.map +1 -0
- package/dist/resolution/frameworks/terraform.js +277 -0
- package/dist/resolution/frameworks/terraform.js.map +1 -0
- package/dist/resolution/goframe-synthesizer.d.ts +2 -1
- package/dist/resolution/goframe-synthesizer.d.ts.map +1 -1
- package/dist/resolution/goframe-synthesizer.js +8 -3
- package/dist/resolution/goframe-synthesizer.js.map +1 -1
- package/dist/resolution/import-resolver.d.ts +9 -3
- package/dist/resolution/import-resolver.d.ts.map +1 -1
- package/dist/resolution/import-resolver.js +295 -11
- package/dist/resolution/import-resolver.js.map +1 -1
- package/dist/resolution/index.d.ts +146 -8
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +1089 -131
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/memory-budget.d.ts +48 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -0
- package/dist/resolution/memory-budget.js +162 -0
- package/dist/resolution/memory-budget.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +12 -4
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +793 -130
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/resolution/resolver-pool.d.ts +106 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -0
- package/dist/resolution/resolver-pool.js +344 -0
- package/dist/resolution/resolver-pool.js.map +1 -0
- package/dist/resolution/resolver-worker.d.ts +17 -0
- package/dist/resolution/resolver-worker.d.ts.map +1 -0
- package/dist/resolution/resolver-worker.js +141 -0
- package/dist/resolution/resolver-worker.js.map +1 -0
- 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 +49 -0
- package/dist/resolution/strip-comments.js.map +1 -1
- package/dist/resolution/types.d.ts +32 -0
- package/dist/resolution/types.d.ts.map +1 -1
- package/dist/resolution/workspace-packages.d.ts +10 -0
- package/dist/resolution/workspace-packages.d.ts.map +1 -1
- package/dist/resolution/workspace-packages.js +142 -4
- package/dist/resolution/workspace-packages.js.map +1 -1
- package/dist/search/identifier-segments.d.ts +60 -0
- package/dist/search/identifier-segments.d.ts.map +1 -0
- package/dist/search/identifier-segments.js +176 -0
- package/dist/search/identifier-segments.js.map +1 -0
- package/dist/search/query-utils.d.ts +201 -0
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +919 -2
- package/dist/search/query-utils.js.map +1 -1
- package/dist/spec/build/diff-parser.d.ts +55 -0
- package/dist/spec/build/diff-parser.d.ts.map +1 -0
- package/dist/spec/build/diff-parser.js +205 -0
- package/dist/spec/build/diff-parser.js.map +1 -0
- package/dist/spec/build/git-scanner.d.ts +93 -0
- package/dist/spec/build/git-scanner.d.ts.map +1 -0
- package/dist/spec/build/git-scanner.js +254 -0
- package/dist/spec/build/git-scanner.js.map +1 -0
- package/dist/spec/build/pipeline.d.ts +54 -0
- package/dist/spec/build/pipeline.d.ts.map +1 -0
- package/dist/spec/build/pipeline.js +170 -0
- package/dist/spec/build/pipeline.js.map +1 -0
- package/dist/spec/build/scan.d.ts +48 -0
- package/dist/spec/build/scan.d.ts.map +1 -0
- package/dist/spec/build/scan.js +89 -0
- package/dist/spec/build/scan.js.map +1 -0
- package/dist/spec/build/scope-resolver.d.ts +50 -0
- package/dist/spec/build/scope-resolver.d.ts.map +1 -0
- package/dist/spec/build/scope-resolver.js +105 -0
- package/dist/spec/build/scope-resolver.js.map +1 -0
- package/dist/spec/build/spec-extractor.d.ts +74 -0
- package/dist/spec/build/spec-extractor.d.ts.map +1 -0
- package/dist/spec/build/spec-extractor.js +344 -0
- package/dist/spec/build/spec-extractor.js.map +1 -0
- package/dist/spec/config.d.ts +35 -1
- package/dist/spec/config.d.ts.map +1 -1
- package/dist/spec/config.js +30 -5
- package/dist/spec/config.js.map +1 -1
- package/dist/spec/db/fts.d.ts.map +1 -1
- package/dist/spec/db/fts.js +19 -50
- package/dist/spec/db/fts.js.map +1 -1
- package/dist/spec/db/index.d.ts +5 -3
- package/dist/spec/db/index.d.ts.map +1 -1
- package/dist/spec/db/index.js +16 -1
- package/dist/spec/db/index.js.map +1 -1
- package/dist/spec/db/persist.d.ts +45 -0
- package/dist/spec/db/persist.d.ts.map +1 -0
- package/dist/spec/db/persist.js +66 -0
- package/dist/spec/db/persist.js.map +1 -0
- package/dist/spec/db/relations.d.ts +80 -1
- package/dist/spec/db/relations.d.ts.map +1 -1
- package/dist/spec/db/relations.js +175 -4
- package/dist/spec/db/relations.js.map +1 -1
- package/dist/spec/db/schema.d.ts +4 -0
- package/dist/spec/db/schema.d.ts.map +1 -1
- package/dist/spec/db/schema.js +4 -0
- package/dist/spec/db/schema.js.map +1 -1
- package/dist/spec/db/schema.sql +5 -1
- package/dist/spec/db/spec-node.d.ts +5 -0
- package/dist/spec/db/spec-node.d.ts.map +1 -1
- package/dist/spec/db/spec-node.js +11 -5
- package/dist/spec/db/spec-node.js.map +1 -1
- package/dist/spec/db/sql-utils.d.ts +11 -0
- package/dist/spec/db/sql-utils.d.ts.map +1 -0
- package/dist/spec/db/sql-utils.js +19 -0
- package/dist/spec/db/sql-utils.js.map +1 -0
- package/dist/spec/evolve/cluster-context.d.ts +30 -0
- package/dist/spec/evolve/cluster-context.d.ts.map +1 -0
- package/dist/spec/evolve/cluster-context.js +78 -0
- package/dist/spec/evolve/cluster-context.js.map +1 -0
- package/dist/spec/evolve/commit-spec-analyzer.d.ts +51 -0
- package/dist/spec/evolve/commit-spec-analyzer.d.ts.map +1 -0
- package/dist/spec/evolve/commit-spec-analyzer.js +88 -0
- package/dist/spec/evolve/commit-spec-analyzer.js.map +1 -0
- package/dist/spec/evolve/commit-spec-persister.d.ts +53 -0
- package/dist/spec/evolve/commit-spec-persister.d.ts.map +1 -0
- package/dist/spec/evolve/commit-spec-persister.js +93 -0
- package/dist/spec/evolve/commit-spec-persister.js.map +1 -0
- package/dist/spec/evolve/impact-locator.d.ts +23 -7
- package/dist/spec/evolve/impact-locator.d.ts.map +1 -1
- package/dist/spec/evolve/impact-locator.js +58 -14
- package/dist/spec/evolve/impact-locator.js.map +1 -1
- package/dist/spec/evolve/pipeline.d.ts +62 -25
- package/dist/spec/evolve/pipeline.d.ts.map +1 -1
- package/dist/spec/evolve/pipeline.js +436 -457
- package/dist/spec/evolve/pipeline.js.map +1 -1
- package/dist/spec/evolve/spec-rewriter.d.ts +13 -13
- package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -1
- package/dist/spec/evolve/spec-rewriter.js +45 -45
- package/dist/spec/evolve/spec-rewriter.js.map +1 -1
- package/dist/spec/git/commits.d.ts +85 -0
- package/dist/spec/git/commits.d.ts.map +1 -0
- package/dist/spec/git/commits.js +218 -0
- package/dist/spec/git/commits.js.map +1 -0
- package/dist/spec/git/exec.d.ts +13 -0
- package/dist/spec/git/exec.d.ts.map +1 -0
- package/dist/spec/git/exec.js +19 -0
- package/dist/spec/git/exec.js.map +1 -0
- package/dist/spec/git/index.d.ts +9 -0
- package/dist/spec/git/index.d.ts.map +1 -0
- package/dist/spec/git/index.js +22 -0
- package/dist/spec/git/index.js.map +1 -0
- package/dist/spec/git-utils.d.ts +8 -0
- package/dist/spec/git-utils.d.ts.map +1 -0
- package/dist/spec/git-utils.js +14 -0
- package/dist/spec/git-utils.js.map +1 -0
- package/dist/spec/graph/index.d.ts +8 -0
- package/dist/spec/graph/index.d.ts.map +1 -0
- package/dist/spec/graph/index.js +17 -0
- package/dist/spec/graph/index.js.map +1 -0
- package/dist/spec/graph/queries.d.ts +6 -35
- package/dist/spec/graph/queries.d.ts.map +1 -1
- package/dist/spec/graph/queries.js +71 -248
- package/dist/spec/graph/queries.js.map +1 -1
- package/dist/spec/llm/agent-client.d.ts +59 -0
- package/dist/spec/llm/agent-client.d.ts.map +1 -0
- package/dist/spec/llm/agent-client.js +213 -0
- package/dist/spec/llm/agent-client.js.map +1 -0
- package/dist/spec/llm/agents/claude-code.d.ts +32 -0
- package/dist/spec/llm/agents/claude-code.d.ts.map +1 -0
- package/dist/spec/llm/agents/claude-code.js +125 -0
- package/dist/spec/llm/agents/claude-code.js.map +1 -0
- package/dist/spec/llm/agents/codex.d.ts +32 -0
- package/dist/spec/llm/agents/codex.d.ts.map +1 -0
- package/dist/spec/llm/agents/codex.js +145 -0
- package/dist/spec/llm/agents/codex.js.map +1 -0
- package/dist/spec/llm/agents/detect-utils.d.ts +28 -0
- package/dist/spec/llm/agents/detect-utils.d.ts.map +1 -0
- package/dist/spec/llm/agents/detect-utils.js +91 -0
- package/dist/spec/llm/agents/detect-utils.js.map +1 -0
- package/dist/spec/llm/agents/deveco-code.d.ts +33 -0
- package/dist/spec/llm/agents/deveco-code.d.ts.map +1 -0
- package/dist/spec/llm/agents/deveco-code.js +165 -0
- package/dist/spec/llm/agents/deveco-code.js.map +1 -0
- package/dist/spec/llm/agents/index.d.ts +31 -0
- package/dist/spec/llm/agents/index.d.ts.map +1 -0
- package/dist/spec/llm/agents/index.js +65 -0
- package/dist/spec/llm/agents/index.js.map +1 -0
- package/dist/spec/llm/agents/types.d.ts +76 -0
- package/dist/spec/llm/agents/types.d.ts.map +1 -0
- package/dist/spec/llm/agents/types.js +15 -0
- package/dist/spec/llm/agents/types.js.map +1 -0
- package/dist/spec/llm/client.d.ts +31 -11
- package/dist/spec/llm/client.d.ts.map +1 -1
- package/dist/spec/llm/client.js +143 -81
- package/dist/spec/llm/client.js.map +1 -1
- package/dist/spec/llm/factory.d.ts +41 -0
- package/dist/spec/llm/factory.d.ts.map +1 -0
- package/dist/spec/llm/factory.js +80 -0
- package/dist/spec/llm/factory.js.map +1 -0
- package/dist/spec/llm/prompts.d.ts +24 -8
- package/dist/spec/llm/prompts.d.ts.map +1 -1
- package/dist/spec/llm/prompts.js +100 -50
- package/dist/spec/llm/prompts.js.map +1 -1
- package/dist/spec/llm/retry.d.ts +53 -0
- package/dist/spec/llm/retry.d.ts.map +1 -0
- package/dist/spec/llm/retry.js +153 -0
- package/dist/spec/llm/retry.js.map +1 -0
- package/dist/spec/mine/clusterer.d.ts +63 -0
- package/dist/spec/mine/clusterer.d.ts.map +1 -0
- package/dist/spec/mine/clusterer.js +904 -0
- package/dist/spec/mine/clusterer.js.map +1 -0
- package/dist/spec/mine/clustering/features.d.ts +38 -0
- package/dist/spec/mine/clustering/features.d.ts.map +1 -0
- package/dist/spec/mine/clustering/features.js +108 -0
- package/dist/spec/mine/clustering/features.js.map +1 -0
- package/dist/spec/mine/clustering/index.d.ts +62 -0
- package/dist/spec/mine/clustering/index.d.ts.map +1 -0
- package/dist/spec/mine/clustering/index.js +259 -0
- package/dist/spec/mine/clustering/index.js.map +1 -0
- package/dist/spec/mine/clustering/leiden.d.ts +61 -0
- package/dist/spec/mine/clustering/leiden.d.ts.map +1 -0
- package/dist/spec/mine/clustering/leiden.js +489 -0
- package/dist/spec/mine/clustering/leiden.js.map +1 -0
- package/dist/spec/mine/clustering/text-similarity.d.ts +22 -0
- package/dist/spec/mine/clustering/text-similarity.d.ts.map +1 -0
- package/dist/spec/mine/clustering/text-similarity.js +98 -0
- package/dist/spec/mine/clustering/text-similarity.js.map +1 -0
- package/dist/spec/mine/generator.d.ts +54 -0
- package/dist/spec/mine/generator.d.ts.map +1 -0
- package/dist/spec/mine/generator.js +267 -0
- package/dist/spec/mine/generator.js.map +1 -0
- package/dist/spec/mine/persist.d.ts +37 -0
- package/dist/spec/mine/persist.d.ts.map +1 -0
- package/dist/spec/mine/persist.js +170 -0
- package/dist/spec/mine/persist.js.map +1 -0
- package/dist/spec/mine/pipeline.d.ts +41 -0
- package/dist/spec/mine/pipeline.d.ts.map +1 -0
- package/dist/spec/mine/pipeline.js +236 -0
- package/dist/spec/mine/pipeline.js.map +1 -0
- package/dist/spec/mine/progress-handler.d.ts +22 -0
- package/dist/spec/mine/progress-handler.d.ts.map +1 -0
- package/dist/spec/mine/progress-handler.js +108 -0
- package/dist/spec/mine/progress-handler.js.map +1 -0
- package/dist/spec/mine/progress.d.ts +23 -0
- package/dist/spec/mine/progress.d.ts.map +1 -0
- package/dist/spec/mine/progress.js +12 -0
- package/dist/spec/mine/progress.js.map +1 -0
- package/dist/spec/mine/scanner.d.ts +59 -0
- package/dist/spec/mine/scanner.d.ts.map +1 -0
- package/dist/spec/mine/scanner.js +383 -0
- package/dist/spec/mine/scanner.js.map +1 -0
- package/dist/spec/types.d.ts +32 -0
- package/dist/spec/types.d.ts.map +1 -1
- package/dist/spec/ui/index.d.ts +9 -0
- package/dist/spec/ui/index.d.ts.map +1 -0
- package/dist/spec/ui/index.js +16 -0
- package/dist/spec/ui/index.js.map +1 -0
- package/dist/spec/ui/progress-handler.d.ts +33 -0
- package/dist/spec/ui/progress-handler.d.ts.map +1 -0
- package/dist/spec/ui/progress-handler.js +132 -0
- package/dist/spec/ui/progress-handler.js.map +1 -0
- package/dist/spec/ui/progress.d.ts +24 -0
- package/dist/spec/ui/progress.d.ts.map +1 -0
- package/dist/spec/ui/progress.js +13 -0
- package/dist/spec/ui/progress.js.map +1 -0
- package/dist/spec/utils/fs.d.ts +45 -0
- package/dist/spec/utils/fs.d.ts.map +1 -0
- package/dist/spec/utils/fs.js +163 -0
- package/dist/spec/utils/fs.js.map +1 -0
- package/dist/spec/utils/index.d.ts +12 -0
- package/dist/spec/utils/index.d.ts.map +1 -0
- package/dist/spec/utils/index.js +26 -0
- package/dist/spec/utils/index.js.map +1 -0
- package/dist/spec/utils/meta.d.ts +32 -0
- package/dist/spec/utils/meta.d.ts.map +1 -0
- package/dist/spec/utils/meta.js +122 -0
- package/dist/spec/utils/meta.js.map +1 -0
- package/dist/spec/utils/truncate.d.ts +86 -0
- package/dist/spec/utils/truncate.d.ts.map +1 -0
- package/dist/spec/utils/truncate.js +172 -0
- package/dist/spec/utils/truncate.js.map +1 -0
- package/dist/spec/utils.d.ts +4 -16
- package/dist/spec/utils.d.ts.map +1 -1
- package/dist/spec/utils.js +6 -58
- package/dist/spec/utils.js.map +1 -1
- package/dist/sync/git-hooks.d.ts.map +1 -1
- package/dist/sync/git-hooks.js +2 -0
- package/dist/sync/git-hooks.js.map +1 -1
- package/dist/sync/watcher.d.ts +35 -6
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +127 -17
- package/dist/sync/watcher.js.map +1 -1
- package/dist/sync/worktree.d.ts.map +1 -1
- package/dist/sync/worktree.js +5 -0
- package/dist/sync/worktree.js.map +1 -1
- package/dist/telemetry/index.js +3 -3
- package/dist/telemetry/index.js.map +1 -1
- package/dist/types.d.ts +22 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/dist/upgrade/index.d.ts +32 -0
- package/dist/upgrade/index.d.ts.map +1 -1
- package/dist/upgrade/index.js +162 -14
- package/dist/upgrade/index.js.map +1 -1
- package/dist/upgrade/remove-binary.d.ts +87 -0
- package/dist/upgrade/remove-binary.d.ts.map +1 -0
- package/dist/upgrade/remove-binary.js +289 -0
- package/dist/upgrade/remove-binary.js.map +1 -0
- package/dist/upgrade/update-check.d.ts +92 -0
- package/dist/upgrade/update-check.d.ts.map +1 -0
- package/dist/upgrade/update-check.js +258 -0
- package/dist/upgrade/update-check.js.map +1 -0
- package/package.json +6 -2
- package/scripts/agent-eval/run-all.sh +6 -0
- package/scripts/build-bundle.sh +5 -0
- package/scripts/npm-shim.js +8 -1
- package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/data/agents.json +0 -109
- package/scripts/exp_boundary_eval/data/experiments.json +0 -140
- package/scripts/qa_eval/README.md +0 -407
- package/scripts/qa_eval/_test_deveco_probe.py +0 -41
- package/scripts/qa_eval/agent_runner.py +0 -526
- package/scripts/qa_eval/data/.gitignore +0 -4
- package/scripts/qa_eval/data/test-set.jsonl +0 -2
- package/scripts/qa_eval/eval_metrics.py +0 -274
- package/scripts/qa_eval/external_agent.py +0 -976
- package/scripts/qa_eval/llm_config.py +0 -92
- package/scripts/qa_eval/memory_monitor.py +0 -132
- package/scripts/qa_eval/my_answer_accuracy.py +0 -187
- package/scripts/qa_eval/requirements.txt +0 -2
- package/scripts/qa_eval/run_pipeline.py +0 -804
- package/scripts/qa_eval/stats_efficiency.py +0 -279
- package/scripts/qa_eval/stats_scores.py +0 -207
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Leiden community detection on a weighted similarity graph — a generic
|
|
4
|
+
* graph-clustering implementation with no dependency on the commit domain.
|
|
5
|
+
*
|
|
6
|
+
* Replaces Louvain and connected-components (single-linkage) to avoid chaining
|
|
7
|
+
* all nodes into one giant cluster and to guarantee well-connected communities
|
|
8
|
+
* via the refinement phase. A resolution parameter γ is auto-tuned via
|
|
9
|
+
* multiplicative search so the output community count stays close to a target.
|
|
10
|
+
*
|
|
11
|
+
* @module spec/mine/clustering/leiden
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.leiden = leiden;
|
|
15
|
+
exports.recursiveSubSplit = recursiveSubSplit;
|
|
16
|
+
exports.autoTuneResolution = autoTuneResolution;
|
|
17
|
+
exports.greedyMerge = greedyMerge;
|
|
18
|
+
const errors_1 = require("../../../errors");
|
|
19
|
+
/** Compute weighted degree for every node. */
|
|
20
|
+
function computeDegrees(graph) {
|
|
21
|
+
const n = graph.length;
|
|
22
|
+
const degrees = new Array(n).fill(0);
|
|
23
|
+
for (let i = 0; i < n; i++) {
|
|
24
|
+
for (let j = 0; j < n; j++) {
|
|
25
|
+
degrees[i] += graph[i][j];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return degrees;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Shuffle an array in place (Fisher-Yates). Returns the same array.
|
|
32
|
+
*/
|
|
33
|
+
function shuffle(arr) {
|
|
34
|
+
for (let i = arr.length - 1; i > 0; i--) {
|
|
35
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
36
|
+
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
37
|
+
}
|
|
38
|
+
return arr;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create an array [0, 1, ..., n-1].
|
|
42
|
+
*/
|
|
43
|
+
function range(n) {
|
|
44
|
+
return Array.from({ length: n }, (_, i) => i);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Modularity gain from moving node i into community C.
|
|
48
|
+
*
|
|
49
|
+
* Assumes node i has already been *removed* from its current community.
|
|
50
|
+
*
|
|
51
|
+
* @param k_i_in - Sum of edge weights from node i to community C.
|
|
52
|
+
* @param k_i - Weighted degree of node i.
|
|
53
|
+
* @param sigmaTotC - Total weighted degree of community C BEFORE adding i.
|
|
54
|
+
* @param m2 - Twice the total edge weight of the graph (2m).
|
|
55
|
+
* @param gamma - Resolution parameter (higher = more communities).
|
|
56
|
+
*/
|
|
57
|
+
function modularityGain(k_i_in, k_i, sigmaTotC, m2, gamma) {
|
|
58
|
+
if (m2 === 0)
|
|
59
|
+
return 0;
|
|
60
|
+
return k_i_in - gamma * sigmaTotC * k_i / m2;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Refinement phase of the Leiden algorithm.
|
|
64
|
+
*
|
|
65
|
+
* For each Phase-1 community, runs a restricted local-moving pass that starts
|
|
66
|
+
* from singleton sub-communities and only allows moves within the same community.
|
|
67
|
+
* This guarantees that sub-communities are internally well-connected before they
|
|
68
|
+
* are aggregated — the key advantage of Leiden over Louvain.
|
|
69
|
+
*
|
|
70
|
+
* @param graph - Full weighted graph.
|
|
71
|
+
* @param communities - Phase-1 partition (list of node-index arrays).
|
|
72
|
+
* @param degrees - Pre-computed weighted degrees for every node.
|
|
73
|
+
* @param m2 - Twice the total edge weight of the full graph.
|
|
74
|
+
* @param gamma - Resolution parameter.
|
|
75
|
+
* @returns Refined partition — flat list of sub-community node-index arrays.
|
|
76
|
+
*/
|
|
77
|
+
function refine(graph, communities, degrees, m2, gamma) {
|
|
78
|
+
const refined = [];
|
|
79
|
+
for (const community of communities) {
|
|
80
|
+
if (community.length <= 1) {
|
|
81
|
+
refined.push([...community]);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const nodes = community;
|
|
85
|
+
const nodeCount = nodes.length;
|
|
86
|
+
// Each node starts in its own singleton sub-community.
|
|
87
|
+
const nodeToSub = range(nodeCount);
|
|
88
|
+
const subSigmaTot = nodes.map((n) => degrees[n]);
|
|
89
|
+
// Local moving restricted to within this community only.
|
|
90
|
+
const MAX_PASSES = 20;
|
|
91
|
+
for (let pass = 0; pass < MAX_PASSES; pass++) {
|
|
92
|
+
let moved = false;
|
|
93
|
+
const order = shuffle(range(nodeCount));
|
|
94
|
+
for (const localIdx of order) {
|
|
95
|
+
const globalNode = nodes[localIdx];
|
|
96
|
+
const currentSub = nodeToSub[localIdx];
|
|
97
|
+
const k_i = degrees[globalNode];
|
|
98
|
+
// Collect edge weights to neighbor sub-communities (within this community only).
|
|
99
|
+
const neighborSubs = new Map();
|
|
100
|
+
for (let j = 0; j < nodeCount; j++) {
|
|
101
|
+
if (j === localIdx)
|
|
102
|
+
continue;
|
|
103
|
+
const w = graph[globalNode][nodes[j]];
|
|
104
|
+
if (w > 0) {
|
|
105
|
+
const subJ = nodeToSub[j];
|
|
106
|
+
neighborSubs.set(subJ, (neighborSubs.get(subJ) || 0) + w);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// ΔQ for removing from current sub-community.
|
|
110
|
+
const k_i_in_current = neighborSubs.get(currentSub) || 0;
|
|
111
|
+
const sigmaTotCurrent = subSigmaTot[currentSub];
|
|
112
|
+
const sigmaTotCurrentWithout = sigmaTotCurrent - k_i;
|
|
113
|
+
const deltaQRemove = k_i_in_current > 0 || sigmaTotCurrentWithout > 0
|
|
114
|
+
? -(k_i_in_current - gamma * sigmaTotCurrentWithout * k_i / m2)
|
|
115
|
+
: 0;
|
|
116
|
+
let bestSub = currentSub;
|
|
117
|
+
let bestDeltaQ = 0;
|
|
118
|
+
for (const [subId, k_i_in] of neighborSubs) {
|
|
119
|
+
if (subId === currentSub)
|
|
120
|
+
continue;
|
|
121
|
+
const sigmaTotTarget = subSigmaTot[subId];
|
|
122
|
+
if (sigmaTotTarget === 0)
|
|
123
|
+
continue;
|
|
124
|
+
const deltaQAdd = modularityGain(k_i_in, k_i, sigmaTotTarget, m2, gamma);
|
|
125
|
+
const totalDelta = deltaQRemove + deltaQAdd;
|
|
126
|
+
if (totalDelta > bestDeltaQ) {
|
|
127
|
+
bestDeltaQ = totalDelta;
|
|
128
|
+
bestSub = subId;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (bestSub !== currentSub) {
|
|
132
|
+
nodeToSub[localIdx] = bestSub;
|
|
133
|
+
subSigmaTot[currentSub] -= k_i;
|
|
134
|
+
subSigmaTot[bestSub] += k_i;
|
|
135
|
+
moved = true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (!moved)
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
// Collect non-empty sub-communities from this community.
|
|
142
|
+
const subCommToNodes = new Map();
|
|
143
|
+
for (let i = 0; i < nodeCount; i++) {
|
|
144
|
+
const subId = nodeToSub[i];
|
|
145
|
+
if (!subCommToNodes.has(subId)) {
|
|
146
|
+
subCommToNodes.set(subId, []);
|
|
147
|
+
}
|
|
148
|
+
subCommToNodes.get(subId).push(nodes[i]);
|
|
149
|
+
}
|
|
150
|
+
for (const [, members] of subCommToNodes) {
|
|
151
|
+
refined.push(members);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return refined;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Core Leiden algorithm: iterative local-moving + refinement + aggregation.
|
|
158
|
+
*
|
|
159
|
+
* Unlike Louvain (which feeds the Phase-1 partition directly into aggregation),
|
|
160
|
+
* Leiden inserts a refinement step that splits each Phase-1 community into
|
|
161
|
+
* well-connected sub-communities. Only the refined partition is aggregated.
|
|
162
|
+
* This guarantees internally-connected communities and avoids the
|
|
163
|
+
* "disconnected community" defect of Louvain.
|
|
164
|
+
*
|
|
165
|
+
* @param graph - Weighted undirected similarity graph.
|
|
166
|
+
* @param gamma - Resolution parameter (default 1.0).
|
|
167
|
+
* @param depth - Aggregation depth guard (internal use).
|
|
168
|
+
*/
|
|
169
|
+
function leiden(graph, gamma, depth = 0) {
|
|
170
|
+
const n = graph.length;
|
|
171
|
+
if (n <= 1) {
|
|
172
|
+
return n === 0 ? [] : [[0]];
|
|
173
|
+
}
|
|
174
|
+
const degrees = computeDegrees(graph);
|
|
175
|
+
const totalWeight = degrees.reduce((a, b) => a + b, 0);
|
|
176
|
+
const m2 = totalWeight; // 2m (sum of all degrees = 2 × sum of edge weights)
|
|
177
|
+
// Each node starts in its own community
|
|
178
|
+
const nodeToComm = range(n);
|
|
179
|
+
// Per-community stats
|
|
180
|
+
// sigmaTot[c] = sum of degrees of all nodes in community c
|
|
181
|
+
const sigmaTot = [...degrees];
|
|
182
|
+
// Phase 1: local moving
|
|
183
|
+
const MAX_PASSES = 20;
|
|
184
|
+
for (let pass = 0; pass < MAX_PASSES; pass++) {
|
|
185
|
+
let moved = false;
|
|
186
|
+
const order = shuffle(range(n));
|
|
187
|
+
for (const node of order) {
|
|
188
|
+
const currentComm = nodeToComm[node];
|
|
189
|
+
const k_i = degrees[node];
|
|
190
|
+
// Collect edge weights to each neighbor community
|
|
191
|
+
const neighborComms = new Map(); // commId → k_i_in
|
|
192
|
+
for (let j = 0; j < n; j++) {
|
|
193
|
+
const w = graph[node][j];
|
|
194
|
+
if (w > 0) {
|
|
195
|
+
const cj = nodeToComm[j];
|
|
196
|
+
neighborComms.set(cj, (neighborComms.get(cj) || 0) + w);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Compute ΔQ for removing node from its current community.
|
|
200
|
+
// k_i_in_current = edges from node to nodes in current community.
|
|
201
|
+
const k_i_in_current = neighborComms.get(currentComm) || 0;
|
|
202
|
+
const sigmaTotCurrent = sigmaTot[currentComm];
|
|
203
|
+
// ΔQ of removal (negative of the gain formula applied to current community
|
|
204
|
+
// with sigmaTot excluding self)
|
|
205
|
+
const sigmaTotCurrentWithout = sigmaTotCurrent - k_i;
|
|
206
|
+
const deltaQRemove = k_i_in_current > 0 || sigmaTotCurrentWithout > 0
|
|
207
|
+
? -(k_i_in_current - gamma * sigmaTotCurrentWithout * k_i / m2)
|
|
208
|
+
: 0;
|
|
209
|
+
// Find best community to move to
|
|
210
|
+
let bestComm = currentComm;
|
|
211
|
+
let bestDeltaQ = 0;
|
|
212
|
+
for (const [commId, k_i_in] of neighborComms) {
|
|
213
|
+
if (commId === currentComm)
|
|
214
|
+
continue;
|
|
215
|
+
const sigmaTotTarget = sigmaTot[commId];
|
|
216
|
+
if (sigmaTotTarget === 0)
|
|
217
|
+
continue;
|
|
218
|
+
const deltaQAdd = modularityGain(k_i_in, k_i, sigmaTotTarget, m2, gamma);
|
|
219
|
+
const totalDelta = deltaQRemove + deltaQAdd;
|
|
220
|
+
if (totalDelta > bestDeltaQ) {
|
|
221
|
+
bestDeltaQ = totalDelta;
|
|
222
|
+
bestComm = commId;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (bestComm !== currentComm) {
|
|
226
|
+
// Move node from currentComm to bestComm
|
|
227
|
+
nodeToComm[node] = bestComm;
|
|
228
|
+
sigmaTot[currentComm] -= k_i;
|
|
229
|
+
sigmaTot[bestComm] += k_i;
|
|
230
|
+
moved = true;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (!moved)
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
// Collect non-empty communities from Phase 1
|
|
237
|
+
const commIdToMembers = new Map();
|
|
238
|
+
for (let i = 0; i < n; i++) {
|
|
239
|
+
const cid = nodeToComm[i];
|
|
240
|
+
if (!commIdToMembers.has(cid)) {
|
|
241
|
+
commIdToMembers.set(cid, []);
|
|
242
|
+
}
|
|
243
|
+
commIdToMembers.get(cid).push(i);
|
|
244
|
+
}
|
|
245
|
+
const communities = Array.from(commIdToMembers.values());
|
|
246
|
+
// Refinement: split each Phase-1 community into well-connected sub-communities.
|
|
247
|
+
const refinedCommunities = refine(graph, communities, degrees, m2, gamma);
|
|
248
|
+
// Phase 2: Aggregation using refined partition (Leiden key difference from Louvain).
|
|
249
|
+
const k = refinedCommunities.length;
|
|
250
|
+
if (k < n && k > 1 && depth < 5) {
|
|
251
|
+
const aggGraph = aggregateGraph(graph, refinedCommunities);
|
|
252
|
+
const subCommunities = leiden(aggGraph, gamma, depth + 1);
|
|
253
|
+
return mapBackCommunities(subCommunities, refinedCommunities);
|
|
254
|
+
}
|
|
255
|
+
return refinedCommunities;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Build an aggregated graph where each node represents a community from the
|
|
259
|
+
* previous level. Edge weights are summed across community boundaries.
|
|
260
|
+
*/
|
|
261
|
+
function aggregateGraph(graph, communities) {
|
|
262
|
+
const k = communities.length;
|
|
263
|
+
const agg = Array.from({ length: k }, () => new Array(k).fill(0));
|
|
264
|
+
// Build reverse map: original node → community index
|
|
265
|
+
const nodeToCommIdx = new Map();
|
|
266
|
+
for (let ci = 0; ci < k; ci++) {
|
|
267
|
+
for (const node of communities[ci]) {
|
|
268
|
+
nodeToCommIdx.set(node, ci);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Aggregate edge weights
|
|
272
|
+
for (let i = 0; i < graph.length; i++) {
|
|
273
|
+
const ci = nodeToCommIdx.get(i);
|
|
274
|
+
for (let j = i + 1; j < graph.length; j++) {
|
|
275
|
+
const w = graph[i][j];
|
|
276
|
+
if (w > 0) {
|
|
277
|
+
const cj = nodeToCommIdx.get(j);
|
|
278
|
+
if (ci === cj) {
|
|
279
|
+
// Self-loop: double weight to preserve total degree
|
|
280
|
+
// (each internal edge contributes to degrees of both endpoints).
|
|
281
|
+
agg[ci][ci] += 2 * w;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
agg[ci][cj] += w;
|
|
285
|
+
agg[cj][ci] += w;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return agg;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Map aggregated-level community indices back to original node indices.
|
|
294
|
+
*/
|
|
295
|
+
function mapBackCommunities(subCommunities, originalCommunities) {
|
|
296
|
+
return subCommunities.map((aggComm) => {
|
|
297
|
+
const members = [];
|
|
298
|
+
for (const aggIdx of aggComm) {
|
|
299
|
+
for (const node of originalCommunities[aggIdx]) {
|
|
300
|
+
members.push(node);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return members;
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Extract a sub-graph containing only the specified nodes and edges between them.
|
|
308
|
+
*
|
|
309
|
+
* @param graph - Full weighted graph.
|
|
310
|
+
* @param indices - Node indices to include in the sub-graph.
|
|
311
|
+
* @returns New WeightedGraph with local indexing; subGraph[i][j] == graph[indices[i]][indices[j]].
|
|
312
|
+
*/
|
|
313
|
+
function extractSubGraph(graph, indices) {
|
|
314
|
+
const m = indices.length;
|
|
315
|
+
const subGraph = Array.from({ length: m }, () => new Array(m).fill(0));
|
|
316
|
+
for (let i = 0; i < m; i++) {
|
|
317
|
+
for (let j = i + 1; j < m; j++) {
|
|
318
|
+
const w = graph[indices[i]][indices[j]];
|
|
319
|
+
subGraph[i][j] = w;
|
|
320
|
+
subGraph[j][i] = w;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return subGraph;
|
|
324
|
+
}
|
|
325
|
+
// ---------------------------------------------------------------------------
|
|
326
|
+
// Resolution Auto-Tuning
|
|
327
|
+
// ---------------------------------------------------------------------------
|
|
328
|
+
/** Maximum iterations for resolution parameter search. */
|
|
329
|
+
const MAX_TUNING_ITER = 15;
|
|
330
|
+
/** Minimum cluster size to consider for recursive sub-splitting. */
|
|
331
|
+
const MIN_SUBSPLIT_SIZE = 4;
|
|
332
|
+
/** Maximum recursion depth for sub-splitting. */
|
|
333
|
+
const MAX_SUBSPLIT_DEPTH = 3;
|
|
334
|
+
/**
|
|
335
|
+
* Recursively split large clusters by running Leiden on their sub-graphs.
|
|
336
|
+
*
|
|
337
|
+
* For each cluster with size > MIN_SUBSPLIT_SIZE, extracts its sub-graph,
|
|
338
|
+
* runs Leiden with auto-tuned γ (targeting up to min(5, floor(size/2))),
|
|
339
|
+
* and recursively splits further if sub-communities still have structure.
|
|
340
|
+
*
|
|
341
|
+
* Stop conditions:
|
|
342
|
+
* - Cluster size ≤ MIN_SUBSPLIT_SIZE
|
|
343
|
+
* - Sub-graph Leiden returns 1 community (no further structure)
|
|
344
|
+
* - Max recursion depth reached (MAX_SUBSPLIT_DEPTH)
|
|
345
|
+
*
|
|
346
|
+
* @param graph - Full original weighted graph.
|
|
347
|
+
* @param communities - Current partition (list of node-index arrays).
|
|
348
|
+
* @param depth - Current recursion depth (internal).
|
|
349
|
+
* @returns Flat list of leaf-community node-index arrays.
|
|
350
|
+
*/
|
|
351
|
+
function recursiveSubSplit(graph, communities, depth = 0) {
|
|
352
|
+
if (depth >= MAX_SUBSPLIT_DEPTH)
|
|
353
|
+
return communities;
|
|
354
|
+
const result = [];
|
|
355
|
+
for (const community of communities) {
|
|
356
|
+
if (community.length <= MIN_SUBSPLIT_SIZE) {
|
|
357
|
+
result.push(community);
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
// Extract sub-graph and run Leiden with independent γ tuning.
|
|
361
|
+
const subGraph = extractSubGraph(graph, community);
|
|
362
|
+
const targetClusters = Math.min(5, Math.floor(community.length / 2));
|
|
363
|
+
const subComms = autoTuneResolution(subGraph, targetClusters);
|
|
364
|
+
if (subComms.length <= 1) {
|
|
365
|
+
// No further structure found — keep as-is.
|
|
366
|
+
result.push(community);
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
// Map sub-community local indices back to original graph indices.
|
|
370
|
+
const mappedSubComms = subComms.map((subComm) => subComm.map((localIdx) => community[localIdx]));
|
|
371
|
+
// Recurse into sub-communities.
|
|
372
|
+
const splitResult = recursiveSubSplit(graph, mappedSubComms, depth + 1);
|
|
373
|
+
result.push(...splitResult);
|
|
374
|
+
}
|
|
375
|
+
return result;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Adjust the resolution parameter γ so that Leiden produces approximately
|
|
379
|
+
* `targetClusters` communities.
|
|
380
|
+
*
|
|
381
|
+
* Uses multiplicative search: higher γ → more communities, lower γ → fewer.
|
|
382
|
+
*/
|
|
383
|
+
function autoTuneResolution(graph, maxClusters) {
|
|
384
|
+
const n = graph.length;
|
|
385
|
+
if (n <= maxClusters) {
|
|
386
|
+
// Can't have more communities than nodes. Run once with default gamma
|
|
387
|
+
// and let post-processing handle it.
|
|
388
|
+
return leiden(graph, 1.0);
|
|
389
|
+
}
|
|
390
|
+
let gamma = 1.0;
|
|
391
|
+
let communities = leiden(graph, gamma);
|
|
392
|
+
let count = communities.length;
|
|
393
|
+
// If already in range (±30% tolerance with upper cap at maxClusters), accept.
|
|
394
|
+
if (count >= Math.ceil(maxClusters * 0.5) && count <= maxClusters) {
|
|
395
|
+
return communities;
|
|
396
|
+
}
|
|
397
|
+
// Multiplicative search: keep adjusting gamma until we bracket the target.
|
|
398
|
+
let lowGamma = 0.05;
|
|
399
|
+
let highGamma = 50.0;
|
|
400
|
+
let lowCommunities = null;
|
|
401
|
+
let highCommunities = null;
|
|
402
|
+
for (let iter = 0; iter < MAX_TUNING_ITER; iter++) {
|
|
403
|
+
// Run Leiden at current gamma
|
|
404
|
+
communities = leiden(graph, gamma);
|
|
405
|
+
count = communities.length;
|
|
406
|
+
(0, errors_1.logDebug)('Clusterer: resolution tuning', {
|
|
407
|
+
iteration: iter,
|
|
408
|
+
gamma: Math.round(gamma * 1000) / 1000,
|
|
409
|
+
communities: count,
|
|
410
|
+
target: maxClusters,
|
|
411
|
+
});
|
|
412
|
+
if (count >= Math.ceil(maxClusters * 0.5) && count <= maxClusters) {
|
|
413
|
+
// In range — accept.
|
|
414
|
+
return communities;
|
|
415
|
+
}
|
|
416
|
+
if (count > maxClusters) {
|
|
417
|
+
// Too many communities → need lower gamma
|
|
418
|
+
highGamma = gamma;
|
|
419
|
+
highCommunities = communities;
|
|
420
|
+
gamma = Math.max(lowGamma, gamma * 0.65);
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
// Too few communities → need higher gamma
|
|
424
|
+
lowGamma = gamma;
|
|
425
|
+
lowCommunities = communities;
|
|
426
|
+
gamma = Math.min(highGamma, gamma * 1.55);
|
|
427
|
+
}
|
|
428
|
+
// If search range collapsed, exit
|
|
429
|
+
if (highGamma - lowGamma < 0.01)
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
// Prefer the result with count closest to (but not exceeding) maxClusters.
|
|
433
|
+
// If both exceed, use the one with fewer communities.
|
|
434
|
+
if (lowCommunities && highCommunities) {
|
|
435
|
+
const lowCount = lowCommunities.length;
|
|
436
|
+
const highCount = highCommunities.length;
|
|
437
|
+
if (lowCount <= maxClusters && highCount > maxClusters) {
|
|
438
|
+
return lowCommunities;
|
|
439
|
+
}
|
|
440
|
+
if (lowCount > maxClusters && highCount > maxClusters) {
|
|
441
|
+
return lowCount <= highCount ? lowCommunities : highCommunities;
|
|
442
|
+
}
|
|
443
|
+
// Both <= maxClusters: prefer the one closer to target
|
|
444
|
+
const lowDist = maxClusters - lowCount;
|
|
445
|
+
const highDist = maxClusters - highCount;
|
|
446
|
+
return lowDist <= highDist ? lowCommunities : highCommunities;
|
|
447
|
+
}
|
|
448
|
+
return communities;
|
|
449
|
+
}
|
|
450
|
+
// ---------------------------------------------------------------------------
|
|
451
|
+
// Greedy Merge (fallback when too many communities)
|
|
452
|
+
// ---------------------------------------------------------------------------
|
|
453
|
+
/**
|
|
454
|
+
* Greedily merge communities until count ≤ maxClusters, by repeatedly
|
|
455
|
+
* merging the pair with the highest average inter-community similarity.
|
|
456
|
+
*/
|
|
457
|
+
function greedyMerge(graph, communities, maxClusters) {
|
|
458
|
+
if (communities.length <= maxClusters)
|
|
459
|
+
return communities;
|
|
460
|
+
let current = communities.map((c) => [...c]);
|
|
461
|
+
while (current.length > maxClusters) {
|
|
462
|
+
let bestPair = null;
|
|
463
|
+
let bestSim = -Infinity;
|
|
464
|
+
for (let i = 0; i < current.length; i++) {
|
|
465
|
+
for (let j = i + 1; j < current.length; j++) {
|
|
466
|
+
let sum = 0;
|
|
467
|
+
let count = 0;
|
|
468
|
+
for (const a of current[i]) {
|
|
469
|
+
for (const b of current[j]) {
|
|
470
|
+
sum += graph[a][b];
|
|
471
|
+
count++;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
const avgSim = count > 0 ? sum / count : 0;
|
|
475
|
+
if (avgSim > bestSim) {
|
|
476
|
+
bestSim = avgSim;
|
|
477
|
+
bestPair = [i, j];
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
if (!bestPair)
|
|
482
|
+
break;
|
|
483
|
+
const [a, b] = bestPair;
|
|
484
|
+
current[a] = [...current[a], ...current[b]];
|
|
485
|
+
current.splice(b, 1);
|
|
486
|
+
}
|
|
487
|
+
return current;
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=leiden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leiden.js","sourceRoot":"","sources":["../../../../src/spec/mine/clustering/leiden.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text-similarity utilities for commit clustering — tokenisation, Jaccard /
|
|
3
|
+
* cosine similarity, and a minimal TF-IDF vectorizer. Pure functions with no
|
|
4
|
+
* dependency on the commit/cluster domain.
|
|
5
|
+
*
|
|
6
|
+
* @module spec/mine/clustering/text-similarity
|
|
7
|
+
*/
|
|
8
|
+
/** Tokenize a string into lowercase words (3+ chars). */
|
|
9
|
+
export declare function tokenize(text: string): string[];
|
|
10
|
+
/** Jaccard similarity between two sets of strings. */
|
|
11
|
+
export declare function jaccard(a: string[], b: string[]): number;
|
|
12
|
+
/** Cosine similarity between two equal-length numeric vectors. */
|
|
13
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
14
|
+
export declare class TfidfVectorizer {
|
|
15
|
+
private vocabulary;
|
|
16
|
+
private idf;
|
|
17
|
+
/** Build vocabulary and compute IDF from document corpus. */
|
|
18
|
+
fit(documents: string[][]): void;
|
|
19
|
+
/** Transform a document into a TF-IDF vector. */
|
|
20
|
+
transform(document: string[]): number[];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=text-similarity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-similarity.d.ts","sourceRoot":"","sources":["../../../../src/spec/mine/clustering/text-similarity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/C;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAUxD;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,GAAG,CAAgB;IAE3B,6DAA6D;IAC7D,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;IA4BhC,iDAAiD;IACjD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAcxC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Text-similarity utilities for commit clustering — tokenisation, Jaccard /
|
|
4
|
+
* cosine similarity, and a minimal TF-IDF vectorizer. Pure functions with no
|
|
5
|
+
* dependency on the commit/cluster domain.
|
|
6
|
+
*
|
|
7
|
+
* @module spec/mine/clustering/text-similarity
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.TfidfVectorizer = void 0;
|
|
11
|
+
exports.tokenize = tokenize;
|
|
12
|
+
exports.jaccard = jaccard;
|
|
13
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
14
|
+
/** Tokenize a string into lowercase words (3+ chars). */
|
|
15
|
+
function tokenize(text) {
|
|
16
|
+
return text
|
|
17
|
+
.toLowerCase()
|
|
18
|
+
.split(/[^a-z0-9]+/)
|
|
19
|
+
.filter((t) => t.length >= 3);
|
|
20
|
+
}
|
|
21
|
+
/** Jaccard similarity between two sets of strings. */
|
|
22
|
+
function jaccard(a, b) {
|
|
23
|
+
if (a.length === 0 && b.length === 0)
|
|
24
|
+
return 0;
|
|
25
|
+
const setA = new Set(a);
|
|
26
|
+
const setB = new Set(b);
|
|
27
|
+
let intersection = 0;
|
|
28
|
+
for (const x of setA) {
|
|
29
|
+
if (setB.has(x))
|
|
30
|
+
intersection++;
|
|
31
|
+
}
|
|
32
|
+
const union = setA.size + setB.size - intersection;
|
|
33
|
+
return union === 0 ? 0 : intersection / union;
|
|
34
|
+
}
|
|
35
|
+
/** Cosine similarity between two equal-length numeric vectors. */
|
|
36
|
+
function cosineSimilarity(a, b) {
|
|
37
|
+
if (a.length !== b.length || a.length === 0)
|
|
38
|
+
return 0;
|
|
39
|
+
let dot = 0;
|
|
40
|
+
let magA = 0;
|
|
41
|
+
let magB = 0;
|
|
42
|
+
for (let i = 0; i < a.length; i++) {
|
|
43
|
+
dot += a[i] * b[i];
|
|
44
|
+
magA += a[i] * a[i];
|
|
45
|
+
magB += b[i] * b[i];
|
|
46
|
+
}
|
|
47
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
48
|
+
return denom === 0 ? 0 : dot / denom;
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// TF-IDF Vectorizer (message-level)
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
class TfidfVectorizer {
|
|
54
|
+
vocabulary = new Map();
|
|
55
|
+
idf = [];
|
|
56
|
+
/** Build vocabulary and compute IDF from document corpus. */
|
|
57
|
+
fit(documents) {
|
|
58
|
+
const docFreq = new Map();
|
|
59
|
+
const N = documents.length;
|
|
60
|
+
for (const doc of documents) {
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
for (const term of doc) {
|
|
63
|
+
if (!seen.has(term)) {
|
|
64
|
+
seen.add(term);
|
|
65
|
+
docFreq.set(term, (docFreq.get(term) || 0) + 1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Build vocabulary sorted for deterministic output
|
|
70
|
+
const sorted = Array.from(docFreq.keys()).sort();
|
|
71
|
+
this.vocabulary.clear();
|
|
72
|
+
this.idf = [];
|
|
73
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
74
|
+
const term = sorted[i];
|
|
75
|
+
this.vocabulary.set(term, i);
|
|
76
|
+
// IDF = log((N + 1) / (df + 1)) + 1 (smooth)
|
|
77
|
+
const df = docFreq.get(term);
|
|
78
|
+
this.idf.push(Math.log((N + 1) / (df + 1)) + 1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Transform a document into a TF-IDF vector. */
|
|
82
|
+
transform(document) {
|
|
83
|
+
const vec = new Array(this.vocabulary.size).fill(0);
|
|
84
|
+
const tf = new Map();
|
|
85
|
+
for (const term of document) {
|
|
86
|
+
tf.set(term, (tf.get(term) || 0) + 1);
|
|
87
|
+
}
|
|
88
|
+
for (const [term, count] of tf) {
|
|
89
|
+
const idx = this.vocabulary.get(term);
|
|
90
|
+
if (idx !== undefined) {
|
|
91
|
+
vec[idx] = (count / document.length) * this.idf[idx];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return vec;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.TfidfVectorizer = TfidfVectorizer;
|
|
98
|
+
//# sourceMappingURL=text-similarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-similarity.js","sourceRoot":"","sources":["../../../../src/spec/mine/clustering/text-similarity.ts"],"names":[],"mappings":"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"}
|