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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reverse Spec Generator — LLM-driven spec document generation from clusters.
|
|
3
|
+
*
|
|
4
|
+
* For each commit cluster, builds a prompt with AST-level change data and
|
|
5
|
+
* calls the LLM (via the existing `OpenAiLlmClient`) to produce a structured
|
|
6
|
+
* markdown specification. Supports custom templates via `{{placeholder}}`
|
|
7
|
+
* syntax.
|
|
8
|
+
*
|
|
9
|
+
* @module spec/mine/generator
|
|
10
|
+
*/
|
|
11
|
+
import { CommitCluster } from './clustering';
|
|
12
|
+
import { LlmClient } from '../llm/client';
|
|
13
|
+
import type { ProgressCallback } from '../ui';
|
|
14
|
+
/** A single generated spec document. */
|
|
15
|
+
export interface GeneratedSpec {
|
|
16
|
+
specId: string;
|
|
17
|
+
title: string;
|
|
18
|
+
content: string;
|
|
19
|
+
clusterId: number;
|
|
20
|
+
commitHashes: string[];
|
|
21
|
+
}
|
|
22
|
+
/** Result of the LLM generation phase. */
|
|
23
|
+
export interface GenerationResult {
|
|
24
|
+
specs: GeneratedSpec[];
|
|
25
|
+
skipped: number;
|
|
26
|
+
errors: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extract the markdown spec document from a chat() response.
|
|
30
|
+
*
|
|
31
|
+
* Headless coding agents (and occasionally chat models) wrap the document
|
|
32
|
+
* in prose ("Here is the spec:") or a ```markdown fence — writing that
|
|
33
|
+
* verbatim would pollute the spec file. Since the spec template always
|
|
34
|
+
* starts with a heading, the extraction is:
|
|
35
|
+
* 1. If a fenced block contains a markdown heading, use its content.
|
|
36
|
+
* 2. Else strip any prose before the first heading line.
|
|
37
|
+
* 3. Otherwise return the response trimmed.
|
|
38
|
+
*
|
|
39
|
+
* Provider-agnostic: applies identically to coding-agent and OpenAI paths.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractMarkdown(raw: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Generate spec documents for a list of commit clusters.
|
|
44
|
+
*
|
|
45
|
+
* @param clusters - Clusters to generate specs for.
|
|
46
|
+
* @param client - Resolved LLM client (coding agent, configured LLM, or
|
|
47
|
+
* a fallback composite — resolution happens in `llm/factory`).
|
|
48
|
+
* @param outputDir - Directory to write generated spec files.
|
|
49
|
+
* @param templateContent - Optional custom template string.
|
|
50
|
+
* @param onProgress - Optional progress callback (called per cluster).
|
|
51
|
+
* @returns Generation result with generated specs and stats.
|
|
52
|
+
*/
|
|
53
|
+
export declare function generateSpecs(clusters: CommitCluster[], client: LlmClient, outputDir: string, templateContent?: string, onProgress?: ProgressCallback): Promise<GenerationResult>;
|
|
54
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/spec/mine/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAM9C,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AA6GD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBnD;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,EACxB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAiF3B"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reverse Spec Generator — LLM-driven spec document generation from clusters.
|
|
4
|
+
*
|
|
5
|
+
* For each commit cluster, builds a prompt with AST-level change data and
|
|
6
|
+
* calls the LLM (via the existing `OpenAiLlmClient`) to produce a structured
|
|
7
|
+
* markdown specification. Supports custom templates via `{{placeholder}}`
|
|
8
|
+
* syntax.
|
|
9
|
+
*
|
|
10
|
+
* @module spec/mine/generator
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.extractMarkdown = extractMarkdown;
|
|
47
|
+
exports.generateSpecs = generateSpecs;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const prompts_1 = require("../llm/prompts");
|
|
51
|
+
const spec_extractor_1 = require("../build/spec-extractor");
|
|
52
|
+
const utils_1 = require("../utils");
|
|
53
|
+
const errors_1 = require("../../errors");
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Prompt Building
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
/** Maximum characters for the cluster context summary (~12K tokens @ ~0.25 token/char). */
|
|
58
|
+
const MAX_CONTEXT_CHARS = 48000;
|
|
59
|
+
/** Maximum characters per commit symbol list (~1.5K tokens @ ~0.25 token/char). */
|
|
60
|
+
const MAX_SYMBOL_CHARS = 6000;
|
|
61
|
+
/**
|
|
62
|
+
* Build the user prompt with commit-level context from a cluster.
|
|
63
|
+
*/
|
|
64
|
+
function buildClusterPrompt(cluster, template) {
|
|
65
|
+
const parts = [];
|
|
66
|
+
parts.push('## Cluster Context');
|
|
67
|
+
parts.push('');
|
|
68
|
+
parts.push(`- ${cluster.commits.length} commits`);
|
|
69
|
+
parts.push(`- Primary files: ${cluster.primaryFiles.join(', ') || '(none)'}`);
|
|
70
|
+
parts.push(`- Primary symbols: ${cluster.primarySymbols.join(', ') || '(none)'}`);
|
|
71
|
+
parts.push('');
|
|
72
|
+
let totalChars = parts.join('\n').length;
|
|
73
|
+
for (const change of cluster.commits) {
|
|
74
|
+
const header = `### ${change.commitHash.slice(0, 7)} — ${change.commitMessage}`;
|
|
75
|
+
if (totalChars + header.length > MAX_CONTEXT_CHARS)
|
|
76
|
+
break;
|
|
77
|
+
const lines = [header, ''];
|
|
78
|
+
for (const fc of change.fileChanges) {
|
|
79
|
+
const fileHeader = `**${fc.filePath}** (${fc.language})${fc.isNewFile ? ' [new file]' : ''}`;
|
|
80
|
+
const symbolLines = [];
|
|
81
|
+
// Format one symbol with kind tag, signature, and visibility.
|
|
82
|
+
// `extra` is an optional suffix appended after the visibility.
|
|
83
|
+
const fmtSym = (marker, sym, extra) => {
|
|
84
|
+
const tag = `[${sym.kind}]`;
|
|
85
|
+
const sig = sym.signature ? ` ${sym.signature}` : '';
|
|
86
|
+
const vis = sym.visibility && sym.visibility !== 'public'
|
|
87
|
+
? ` (${sym.visibility})` : '';
|
|
88
|
+
const ext = extra ? ` ${extra}` : '';
|
|
89
|
+
return `${marker} ${tag} ${sym.name}${sig}${vis}${ext}`;
|
|
90
|
+
};
|
|
91
|
+
for (const s of fc.addedSymbols) {
|
|
92
|
+
symbolLines.push(fmtSym('+', s));
|
|
93
|
+
}
|
|
94
|
+
for (const s of fc.removedSymbols) {
|
|
95
|
+
symbolLines.push(fmtSym('-', s));
|
|
96
|
+
}
|
|
97
|
+
for (const m of fc.modifiedSymbols) {
|
|
98
|
+
const changes = [];
|
|
99
|
+
if (m.old.signature !== m.new.signature)
|
|
100
|
+
changes.push('sig');
|
|
101
|
+
if (m.old.name !== m.new.name)
|
|
102
|
+
changes.push('name');
|
|
103
|
+
if (m.old.visibility !== m.new.visibility)
|
|
104
|
+
changes.push('vis');
|
|
105
|
+
const extra = changes.length > 0
|
|
106
|
+
? `(changed: ${changes.join(', ')})`
|
|
107
|
+
: '(changed)';
|
|
108
|
+
symbolLines.push(fmtSym('~', m.new, extra));
|
|
109
|
+
}
|
|
110
|
+
if (symbolLines.length === 0)
|
|
111
|
+
continue;
|
|
112
|
+
const symbolStr = symbolLines.join('\n');
|
|
113
|
+
const truncated = symbolStr.length > MAX_SYMBOL_CHARS
|
|
114
|
+
? symbolStr.slice(0, MAX_SYMBOL_CHARS) + '\n…'
|
|
115
|
+
: symbolStr;
|
|
116
|
+
const block = `${fileHeader}\n${truncated}`;
|
|
117
|
+
if (totalChars + block.length > MAX_CONTEXT_CHARS)
|
|
118
|
+
break;
|
|
119
|
+
lines.push(block);
|
|
120
|
+
}
|
|
121
|
+
const commitBlock = lines.join('\n');
|
|
122
|
+
if (totalChars + commitBlock.length > MAX_CONTEXT_CHARS)
|
|
123
|
+
break;
|
|
124
|
+
parts.push(commitBlock);
|
|
125
|
+
parts.push('');
|
|
126
|
+
totalChars += commitBlock.length + 1;
|
|
127
|
+
}
|
|
128
|
+
const context = parts.join('\n');
|
|
129
|
+
// Build the full prompt: cluster context + template
|
|
130
|
+
const prompt = [
|
|
131
|
+
'Use the following commit cluster context to fill in the template below.',
|
|
132
|
+
'',
|
|
133
|
+
context,
|
|
134
|
+
'',
|
|
135
|
+
'---',
|
|
136
|
+
'',
|
|
137
|
+
'Fill in this template:',
|
|
138
|
+
'',
|
|
139
|
+
template,
|
|
140
|
+
].join('\n');
|
|
141
|
+
return prompt;
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// Markdown Extraction
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
/**
|
|
147
|
+
* Extract the markdown spec document from a chat() response.
|
|
148
|
+
*
|
|
149
|
+
* Headless coding agents (and occasionally chat models) wrap the document
|
|
150
|
+
* in prose ("Here is the spec:") or a ```markdown fence — writing that
|
|
151
|
+
* verbatim would pollute the spec file. Since the spec template always
|
|
152
|
+
* starts with a heading, the extraction is:
|
|
153
|
+
* 1. If a fenced block contains a markdown heading, use its content.
|
|
154
|
+
* 2. Else strip any prose before the first heading line.
|
|
155
|
+
* 3. Otherwise return the response trimmed.
|
|
156
|
+
*
|
|
157
|
+
* Provider-agnostic: applies identically to coding-agent and OpenAI paths.
|
|
158
|
+
*/
|
|
159
|
+
function extractMarkdown(raw) {
|
|
160
|
+
const text = raw.trim();
|
|
161
|
+
if (!text)
|
|
162
|
+
return '';
|
|
163
|
+
// Fast path: already a clean markdown document. Also guards against
|
|
164
|
+
// misfiring on code fences INSIDE a document (e.g. a bash comment like
|
|
165
|
+
// "# do something" would otherwise look like a wrapped document).
|
|
166
|
+
if (/^#\s/.test(text))
|
|
167
|
+
return text;
|
|
168
|
+
// 1. Whole-document fence wrapper containing a heading
|
|
169
|
+
const fenceMatch = /```(?:markdown|md)?\s*\n([\s\S]*?)```/.exec(text);
|
|
170
|
+
if (fenceMatch && /^#\s/m.test(fenceMatch[1])) {
|
|
171
|
+
return fenceMatch[1].trim();
|
|
172
|
+
}
|
|
173
|
+
// 2. Prose preamble before the first heading
|
|
174
|
+
const headingMatch = /^#\s.*$/m.exec(text);
|
|
175
|
+
if (headingMatch) {
|
|
176
|
+
return text.slice(headingMatch.index).trim();
|
|
177
|
+
}
|
|
178
|
+
return text;
|
|
179
|
+
}
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Spec Generation
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
/**
|
|
184
|
+
* Generate spec documents for a list of commit clusters.
|
|
185
|
+
*
|
|
186
|
+
* @param clusters - Clusters to generate specs for.
|
|
187
|
+
* @param client - Resolved LLM client (coding agent, configured LLM, or
|
|
188
|
+
* a fallback composite — resolution happens in `llm/factory`).
|
|
189
|
+
* @param outputDir - Directory to write generated spec files.
|
|
190
|
+
* @param templateContent - Optional custom template string.
|
|
191
|
+
* @param onProgress - Optional progress callback (called per cluster).
|
|
192
|
+
* @returns Generation result with generated specs and stats.
|
|
193
|
+
*/
|
|
194
|
+
async function generateSpecs(clusters, client, outputDir, templateContent, onProgress) {
|
|
195
|
+
// Use custom template if provided, otherwise use default
|
|
196
|
+
const effectiveTemplate = templateContent || prompts_1.DEFAULT_SPEC_TEMPLATE;
|
|
197
|
+
// Ensure output directory exists
|
|
198
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
199
|
+
const specs = [];
|
|
200
|
+
let skipped = 0;
|
|
201
|
+
let errors = 0;
|
|
202
|
+
const total = clusters.length;
|
|
203
|
+
for (let ci = 0; ci < clusters.length; ci++) {
|
|
204
|
+
const cluster = clusters[ci];
|
|
205
|
+
const specId = `spec_${cluster.timeRange.end}`;
|
|
206
|
+
const msg = `${specId} (${cluster.commits.length} commits)`;
|
|
207
|
+
onProgress?.({
|
|
208
|
+
phase: 'generating',
|
|
209
|
+
current: ci + 1,
|
|
210
|
+
total,
|
|
211
|
+
message: msg,
|
|
212
|
+
});
|
|
213
|
+
(0, errors_1.logDebug)('Generating spec for cluster', {
|
|
214
|
+
specId,
|
|
215
|
+
commitCount: cluster.commits.length,
|
|
216
|
+
});
|
|
217
|
+
const userPrompt = buildClusterPrompt(cluster, effectiveTemplate);
|
|
218
|
+
let raw;
|
|
219
|
+
try {
|
|
220
|
+
raw = await client.chat(prompts_1.SPEC_GENERATION_SYSTEM_PROMPT, userPrompt);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
(0, errors_1.logWarn)(`LLM call failed for ${specId}`, {
|
|
224
|
+
error: err instanceof Error ? err.message : String(err),
|
|
225
|
+
});
|
|
226
|
+
errors++;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (!raw || raw.trim().length === 0) {
|
|
230
|
+
(0, errors_1.logWarn)(`LLM returned empty response for ${specId}`);
|
|
231
|
+
skipped++;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
// Unwrap fences / strip prose preamble before persisting
|
|
235
|
+
const content = extractMarkdown(raw);
|
|
236
|
+
if (!content) {
|
|
237
|
+
(0, errors_1.logWarn)(`LLM response had no extractable markdown for ${specId}`);
|
|
238
|
+
skipped++;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const title = (0, spec_extractor_1.extractTitleFromMarkdown)(content, 'Untitled Spec');
|
|
242
|
+
const commitHashes = cluster.commits.map((c) => c.commitHash);
|
|
243
|
+
const spec = {
|
|
244
|
+
specId,
|
|
245
|
+
title,
|
|
246
|
+
content,
|
|
247
|
+
clusterId: cluster.id,
|
|
248
|
+
commitHashes,
|
|
249
|
+
};
|
|
250
|
+
// Write to output directory
|
|
251
|
+
const fileName = `${specId}.md`;
|
|
252
|
+
const outputPath = path.join(outputDir, fileName);
|
|
253
|
+
try {
|
|
254
|
+
(0, utils_1.writeFileContent)(outputPath, content);
|
|
255
|
+
(0, errors_1.logDebug)('Wrote spec file', { path: outputPath });
|
|
256
|
+
specs.push(spec);
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
(0, errors_1.logWarn)(`Failed to write spec file ${outputPath}`, {
|
|
260
|
+
error: err instanceof Error ? err.message : String(err),
|
|
261
|
+
});
|
|
262
|
+
errors++;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return { specs, skipped, errors };
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/spec/mine/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mine Persist — writes `spec mine` results into commit4spec.db.
|
|
3
|
+
*
|
|
4
|
+
* For each generated spec, persists a SpecNode, all linked CommitNodes,
|
|
5
|
+
* per-file DiffFragments as CodeFragmentNodes, and the corresponding
|
|
6
|
+
* spec_commit / commit_fragment relations.
|
|
7
|
+
*
|
|
8
|
+
* Reuses the existing DB persistence infrastructure from `src/spec/db/`.
|
|
9
|
+
*
|
|
10
|
+
* @module spec/mine/persist
|
|
11
|
+
*/
|
|
12
|
+
import { SqliteDatabase } from '../../db/sqlite-adapter';
|
|
13
|
+
import { GeneratedSpec } from './generator';
|
|
14
|
+
import { CommitCluster } from './clustering';
|
|
15
|
+
import type { ProgressCallback } from '../ui';
|
|
16
|
+
export interface PersistResult {
|
|
17
|
+
specsWritten: number;
|
|
18
|
+
commitsWritten: number;
|
|
19
|
+
fragmentsWritten: number;
|
|
20
|
+
relationsWritten: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Persist `spec mine` results to the commit4spec.db knowledge graph.
|
|
24
|
+
*
|
|
25
|
+
* Idempotent — INSERT OR REPLACE / INSERT OR IGNORE semantics ensure
|
|
26
|
+
* re-running the pipeline against the same commits is safe.
|
|
27
|
+
*
|
|
28
|
+
* @param db - Open SQLite database handle.
|
|
29
|
+
* @param repoPath - Path to the git repository.
|
|
30
|
+
* @param specs - Generated specs from the LLM phase.
|
|
31
|
+
* @param clusters - Commit clusters (must align with specs by clusterId).
|
|
32
|
+
* @param outputDir - Directory where generated spec markdown files were written.
|
|
33
|
+
* @param onProgress - Optional progress callback (called per spec).
|
|
34
|
+
* @returns Counts of written nodes and relations.
|
|
35
|
+
*/
|
|
36
|
+
export declare function persistToGraph(db: SqliteDatabase, repoPath: string, specs: GeneratedSpec[], clusters: CommitCluster[], outputDir: string, onProgress?: ProgressCallback): PersistResult;
|
|
37
|
+
//# sourceMappingURL=persist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../../src/spec/mine/persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAYzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAM9C,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,EACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,aAAa,CAuGf"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Mine Persist — writes `spec mine` results into commit4spec.db.
|
|
4
|
+
*
|
|
5
|
+
* For each generated spec, persists a SpecNode, all linked CommitNodes,
|
|
6
|
+
* per-file DiffFragments as CodeFragmentNodes, and the corresponding
|
|
7
|
+
* spec_commit / commit_fragment relations.
|
|
8
|
+
*
|
|
9
|
+
* Reuses the existing DB persistence infrastructure from `src/spec/db/`.
|
|
10
|
+
*
|
|
11
|
+
* @module spec/mine/persist
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.persistToGraph = persistToGraph;
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const commit_node_1 = require("../db/commit-node");
|
|
50
|
+
const fragment_node_1 = require("../db/fragment-node");
|
|
51
|
+
const relations_1 = require("../db/relations");
|
|
52
|
+
const persist_1 = require("../db/persist");
|
|
53
|
+
const schema_1 = require("../db/schema");
|
|
54
|
+
const diff_parser_1 = require("../build/diff-parser");
|
|
55
|
+
const spec_extractor_1 = require("../build/spec-extractor");
|
|
56
|
+
const errors_1 = require("../../errors");
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// persistToGraph
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
/**
|
|
61
|
+
* Persist `spec mine` results to the commit4spec.db knowledge graph.
|
|
62
|
+
*
|
|
63
|
+
* Idempotent — INSERT OR REPLACE / INSERT OR IGNORE semantics ensure
|
|
64
|
+
* re-running the pipeline against the same commits is safe.
|
|
65
|
+
*
|
|
66
|
+
* @param db - Open SQLite database handle.
|
|
67
|
+
* @param repoPath - Path to the git repository.
|
|
68
|
+
* @param specs - Generated specs from the LLM phase.
|
|
69
|
+
* @param clusters - Commit clusters (must align with specs by clusterId).
|
|
70
|
+
* @param outputDir - Directory where generated spec markdown files were written.
|
|
71
|
+
* @param onProgress - Optional progress callback (called per spec).
|
|
72
|
+
* @returns Counts of written nodes and relations.
|
|
73
|
+
*/
|
|
74
|
+
function persistToGraph(db, repoPath, specs, clusters, outputDir, onProgress) {
|
|
75
|
+
// Ensure schema exists (idempotent)
|
|
76
|
+
(0, schema_1.initSpecSchema)(db);
|
|
77
|
+
// Build a lookup map: clusterId → CommitCluster
|
|
78
|
+
const clusterMap = new Map();
|
|
79
|
+
for (const c of clusters) {
|
|
80
|
+
clusterMap.set(c.id, c);
|
|
81
|
+
}
|
|
82
|
+
// Deduplication — commits can appear in multiple clusters (low threshold)
|
|
83
|
+
const seenCommitHashes = new Set();
|
|
84
|
+
let specsWritten = 0;
|
|
85
|
+
let commitsWritten = 0;
|
|
86
|
+
let fragmentsWritten = 0;
|
|
87
|
+
let relationsWritten = 0;
|
|
88
|
+
const totalSpecs = specs.length;
|
|
89
|
+
for (let si = 0; si < specs.length; si++) {
|
|
90
|
+
const spec = specs[si];
|
|
91
|
+
onProgress?.({
|
|
92
|
+
phase: 'persisting',
|
|
93
|
+
current: si + 1,
|
|
94
|
+
total: totalSpecs,
|
|
95
|
+
message: spec.specId,
|
|
96
|
+
});
|
|
97
|
+
const cluster = clusterMap.get(spec.clusterId);
|
|
98
|
+
if (!cluster) {
|
|
99
|
+
(0, errors_1.logDebug)('persistToGraph: spec has no matching cluster', {
|
|
100
|
+
specId: spec.specId,
|
|
101
|
+
clusterId: spec.clusterId,
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// ---- SpecNode ----
|
|
106
|
+
(0, persist_1.upsertSpecFromMetadata)(db, {
|
|
107
|
+
specId: spec.specId,
|
|
108
|
+
title: (0, spec_extractor_1.extractTitleFromMarkdown)(spec.content, spec.specId),
|
|
109
|
+
subtitles: (0, spec_extractor_1.extractMarkdownHeadings)(spec.content),
|
|
110
|
+
filePath: path.join(outputDir, `${spec.specId}.md`),
|
|
111
|
+
}, cluster.timeRange.end);
|
|
112
|
+
specsWritten++;
|
|
113
|
+
// ---- Commits & Fragments ----
|
|
114
|
+
// Collect all file paths referenced in this commit's FileChanges for filtering
|
|
115
|
+
// fragments to only relevant files (avoids inserting irrelevant diff hunks).
|
|
116
|
+
const relevantFiles = new Set();
|
|
117
|
+
for (const cc of cluster.commits) {
|
|
118
|
+
for (const fc of cc.fileChanges) {
|
|
119
|
+
relevantFiles.add(fc.filePath);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const cc of cluster.commits) {
|
|
123
|
+
// CommitNode — must be inserted before the relation because
|
|
124
|
+
// SQLite enforces FOREIGN KEY constraints eagerly and
|
|
125
|
+
// INSERT OR IGNORE throws on FK violations in Node's SQLite.
|
|
126
|
+
if (!seenCommitHashes.has(cc.commitHash)) {
|
|
127
|
+
seenCommitHashes.add(cc.commitHash);
|
|
128
|
+
const commitNode = {
|
|
129
|
+
hash: cc.commitHash,
|
|
130
|
+
message: cc.commitMessage,
|
|
131
|
+
author: cc.author,
|
|
132
|
+
timestamp: cc.timestamp,
|
|
133
|
+
};
|
|
134
|
+
(0, commit_node_1.insertCommitNode)(db, commitNode);
|
|
135
|
+
commitsWritten++;
|
|
136
|
+
}
|
|
137
|
+
// Spec → Commit relation
|
|
138
|
+
(0, relations_1.insertSpecCommitRelation)(db, spec.specId, cc.commitHash, 'SUMMARIZED_FROM');
|
|
139
|
+
relationsWritten++;
|
|
140
|
+
// Diff fragments — only files that appear in this commit's AST changes.
|
|
141
|
+
// Skip git diff if fragments were already persisted in a previous run.
|
|
142
|
+
const existingFragments = (0, fragment_node_1.findFragmentsByCommit)(db, cc.commitHash);
|
|
143
|
+
if (existingFragments.length > 0) {
|
|
144
|
+
for (const frag of existingFragments) {
|
|
145
|
+
if (!relevantFiles.has(frag.filePath))
|
|
146
|
+
continue;
|
|
147
|
+
(0, relations_1.insertCommitFragmentRelation)(db, cc.commitHash, frag.id, 'CONTAINS');
|
|
148
|
+
relationsWritten++;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
let fragments;
|
|
153
|
+
try {
|
|
154
|
+
fragments = (0, diff_parser_1.analyzeCommitDiff)(repoPath, cc.commitHash);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
(0, errors_1.logWarn)(`persistToGraph: analyzeCommitDiff failed for ${cc.commitHash.slice(0, 7)}`, {
|
|
158
|
+
error: err instanceof Error ? err.message : String(err),
|
|
159
|
+
});
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const persisted = (0, persist_1.persistCommitFragments)(db, cc.commitHash, fragments, relevantFiles);
|
|
163
|
+
fragmentsWritten += persisted.fragmentsInserted;
|
|
164
|
+
relationsWritten += persisted.relationsCreated;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return { specsWritten, commitsWritten, fragmentsWritten, relationsWritten };
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=persist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../src/spec/mine/persist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mine Pipeline — orchestrates the `spec mine` flow.
|
|
3
|
+
*
|
|
4
|
+
* Three-stage pipeline:
|
|
5
|
+
* 1. Scan commits (AST-level diff extraction)
|
|
6
|
+
* 2. Cluster commits (multi-signal graph clustering)
|
|
7
|
+
* 3. Generate specs (LLM-driven spec documents)
|
|
8
|
+
*
|
|
9
|
+
* Integrates with the existing meta.json anchor for incremental runs.
|
|
10
|
+
*
|
|
11
|
+
* @module spec/mine/pipeline
|
|
12
|
+
*/
|
|
13
|
+
import { LLMConfig, MineConfig } from '../config';
|
|
14
|
+
import { SqliteDatabase } from '../../db/sqlite-adapter';
|
|
15
|
+
import type { ProgressCallback } from '../ui';
|
|
16
|
+
/** Result returned by the mine pipeline. */
|
|
17
|
+
export interface MinePipelineResult {
|
|
18
|
+
commitsScanned: number;
|
|
19
|
+
changesFound: number;
|
|
20
|
+
clusters: number;
|
|
21
|
+
specsGenerated: number;
|
|
22
|
+
skippedClusters: number;
|
|
23
|
+
specsWritten: number;
|
|
24
|
+
commitsWritten: number;
|
|
25
|
+
fragmentsWritten: number;
|
|
26
|
+
relationsWritten: number;
|
|
27
|
+
errors: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run the full reverse-spec pipeline.
|
|
31
|
+
*
|
|
32
|
+
* @param repoPath - Path to the git repository.
|
|
33
|
+
* @param config - Reverse pipeline configuration.
|
|
34
|
+
* @param llmConfig - LLM configuration (may be null when a coding agent
|
|
35
|
+
* — Claude Code / Codex — is available, or when skipLlm is true).
|
|
36
|
+
* @param db - Optional SQLite database handle for persistence.
|
|
37
|
+
* @param onProgress - Optional progress callback for real-time feedback.
|
|
38
|
+
* @returns Pipeline result with stats.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runMinePipeline(repoPath: string, config: MineConfig, llmConfig: LLMConfig | null, db?: SqliteDatabase | null, onProgress?: ProgressCallback): Promise<MinePipelineResult>;
|
|
41
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/spec/mine/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQlD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAM9C,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,EAAE,GAAE,cAAc,GAAG,IAAW,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA+M7B"}
|