sdl-mcp 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/config/benchmark.ci.config.json +86 -0
- package/config/benchmark.ci.windows.config.json +86 -0
- package/config/benchmark.config.example.json +86 -0
- package/config/benchmark.config.json +86 -0
- package/config/sdlmcp.config.example.json +139 -0
- package/config/sdlmcp.config.json +48 -0
- package/config/sdlmcp.config.schema.json +381 -0
- package/dist/agent/evidence.d.ts +18 -0
- package/dist/agent/evidence.d.ts.map +1 -0
- package/dist/agent/evidence.js +107 -0
- package/dist/agent/evidence.js.map +1 -0
- package/dist/agent/executor.d.ts +28 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +261 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +14 -0
- package/dist/agent/orchestrator.d.ts.map +1 -0
- package/dist/agent/orchestrator.js +108 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/planner.d.ts +21 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +153 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/types.d.ts +86 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/benchmark/index.d.ts +4 -0
- package/dist/benchmark/index.d.ts.map +1 -0
- package/dist/benchmark/index.js +4 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/benchmark/regression.d.ts +40 -0
- package/dist/benchmark/regression.d.ts.map +1 -0
- package/dist/benchmark/regression.js +199 -0
- package/dist/benchmark/regression.js.map +1 -0
- package/dist/benchmark/smoothing.d.ts +40 -0
- package/dist/benchmark/smoothing.d.ts.map +1 -0
- package/dist/benchmark/smoothing.js +121 -0
- package/dist/benchmark/smoothing.js.map +1 -0
- package/dist/benchmark/threshold.d.ts +64 -0
- package/dist/benchmark/threshold.d.ts.map +1 -0
- package/dist/benchmark/threshold.js +173 -0
- package/dist/benchmark/threshold.js.map +1 -0
- package/dist/cli/argParsing.d.ts +34 -0
- package/dist/cli/argParsing.d.ts.map +1 -0
- package/dist/cli/argParsing.js +329 -0
- package/dist/cli/argParsing.js.map +1 -0
- package/dist/cli/commands/benchmark.d.ts +16 -0
- package/dist/cli/commands/benchmark.d.ts.map +1 -0
- package/dist/cli/commands/benchmark.js +412 -0
- package/dist/cli/commands/benchmark.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +218 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +12 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +70 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +10 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +40 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/index.d.ts +3 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +89 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +221 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +11 -0
- package/dist/cli/commands/pull.d.ts.map +1 -0
- package/dist/cli/commands/pull.js +47 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +72 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/version.d.ts +3 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +24 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +213 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/logging.d.ts +10 -0
- package/dist/cli/logging.d.ts.map +1 -0
- package/dist/cli/logging.js +48 -0
- package/dist/cli/logging.js.map +1 -0
- package/dist/cli/transport/http.d.ts +3 -0
- package/dist/cli/transport/http.d.ts.map +1 -0
- package/dist/cli/transport/http.js +106 -0
- package/dist/cli/transport/http.js.map +1 -0
- package/dist/cli/transport/stdio.d.ts +3 -0
- package/dist/cli/transport/stdio.d.ts.map +1 -0
- package/dist/cli/transport/stdio.js +6 -0
- package/dist/cli/transport/stdio.js.map +1 -0
- package/dist/cli/types.d.ts +41 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/code/gate.d.ts +11 -0
- package/dist/code/gate.d.ts.map +1 -0
- package/dist/code/gate.js +134 -0
- package/dist/code/gate.js.map +1 -0
- package/dist/code/hotpath.d.ts +17 -0
- package/dist/code/hotpath.d.ts.map +1 -0
- package/dist/code/hotpath.js +200 -0
- package/dist/code/hotpath.js.map +1 -0
- package/dist/code/redact.d.ts +19 -0
- package/dist/code/redact.d.ts.map +1 -0
- package/dist/code/redact.js +92 -0
- package/dist/code/redact.js.map +1 -0
- package/dist/code/skeleton.d.ts +32 -0
- package/dist/code/skeleton.d.ts.map +1 -0
- package/dist/code/skeleton.js +610 -0
- package/dist/code/skeleton.js.map +1 -0
- package/dist/code/windows.d.ts +18 -0
- package/dist/code/windows.d.ts.map +1 -0
- package/dist/code/windows.js +236 -0
- package/dist/code/windows.js.map +1 -0
- package/dist/config/constants.d.ts +340 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +379 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/loadConfig.d.ts +3 -0
- package/dist/config/loadConfig.d.ts.map +1 -0
- package/dist/config/loadConfig.js +71 -0
- package/dist/config/loadConfig.js.map +1 -0
- package/dist/config/types.d.ts +509 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +139 -0
- package/dist/config/types.js.map +1 -0
- package/dist/db/db.d.ts +4 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +47 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/migrations.d.ts +15 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +81 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +440 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +1054 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +132 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +2 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/delta/blastRadius.d.ts +24 -0
- package/dist/delta/blastRadius.d.ts.map +1 -0
- package/dist/delta/blastRadius.js +239 -0
- package/dist/delta/blastRadius.js.map +1 -0
- package/dist/delta/diff.d.ts +16 -0
- package/dist/delta/diff.d.ts.map +1 -0
- package/dist/delta/diff.js +236 -0
- package/dist/delta/diff.js.map +1 -0
- package/dist/delta/versioning.d.ts +11 -0
- package/dist/delta/versioning.d.ts.map +1 -0
- package/dist/delta/versioning.js +68 -0
- package/dist/delta/versioning.js.map +1 -0
- package/dist/graph/buildGraph.d.ts +12 -0
- package/dist/graph/buildGraph.d.ts.map +1 -0
- package/dist/graph/buildGraph.js +81 -0
- package/dist/graph/buildGraph.js.map +1 -0
- package/dist/graph/cache.d.ts +111 -0
- package/dist/graph/cache.d.ts.map +1 -0
- package/dist/graph/cache.js +237 -0
- package/dist/graph/cache.js.map +1 -0
- package/dist/graph/metrics.d.ts +12 -0
- package/dist/graph/metrics.d.ts.map +1 -0
- package/dist/graph/metrics.js +253 -0
- package/dist/graph/metrics.js.map +1 -0
- package/dist/graph/minHeap.d.ts +91 -0
- package/dist/graph/minHeap.d.ts.map +1 -0
- package/dist/graph/minHeap.js +159 -0
- package/dist/graph/minHeap.js.map +1 -0
- package/dist/graph/overview.d.ts +22 -0
- package/dist/graph/overview.d.ts.map +1 -0
- package/dist/graph/overview.js +379 -0
- package/dist/graph/overview.js.map +1 -0
- package/dist/graph/score.d.ts +27 -0
- package/dist/graph/score.d.ts.map +1 -0
- package/dist/graph/score.js +214 -0
- package/dist/graph/score.js.map +1 -0
- package/dist/graph/slice.d.ts +51 -0
- package/dist/graph/slice.d.ts.map +1 -0
- package/dist/graph/slice.js +1047 -0
- package/dist/graph/slice.js.map +1 -0
- package/dist/graph/sliceCache.d.ts +33 -0
- package/dist/graph/sliceCache.d.ts.map +1 -0
- package/dist/graph/sliceCache.js +140 -0
- package/dist/graph/sliceCache.js.map +1 -0
- package/dist/indexer/adapter/BaseAdapter.d.ts +29 -0
- package/dist/indexer/adapter/BaseAdapter.d.ts.map +1 -0
- package/dist/indexer/adapter/BaseAdapter.js +97 -0
- package/dist/indexer/adapter/BaseAdapter.js.map +1 -0
- package/dist/indexer/adapter/LanguageAdapter.d.ts +20 -0
- package/dist/indexer/adapter/LanguageAdapter.d.ts.map +1 -0
- package/dist/indexer/adapter/LanguageAdapter.js +2 -0
- package/dist/indexer/adapter/LanguageAdapter.js.map +1 -0
- package/dist/indexer/adapter/adapters.d.ts +57 -0
- package/dist/indexer/adapter/adapters.d.ts.map +1 -0
- package/dist/indexer/adapter/adapters.js +129 -0
- package/dist/indexer/adapter/adapters.js.map +1 -0
- package/dist/indexer/adapter/c.d.ts +18 -0
- package/dist/indexer/adapter/c.d.ts.map +1 -0
- package/dist/indexer/adapter/c.js +443 -0
- package/dist/indexer/adapter/c.js.map +1 -0
- package/dist/indexer/adapter/cpp.d.ts +18 -0
- package/dist/indexer/adapter/cpp.d.ts.map +1 -0
- package/dist/indexer/adapter/cpp.js +493 -0
- package/dist/indexer/adapter/cpp.js.map +1 -0
- package/dist/indexer/adapter/csharp.d.ts +48 -0
- package/dist/indexer/adapter/csharp.d.ts.map +1 -0
- package/dist/indexer/adapter/csharp.js +638 -0
- package/dist/indexer/adapter/csharp.js.map +1 -0
- package/dist/indexer/adapter/go.d.ts +14 -0
- package/dist/indexer/adapter/go.d.ts.map +1 -0
- package/dist/indexer/adapter/go.js +400 -0
- package/dist/indexer/adapter/go.js.map +1 -0
- package/dist/indexer/adapter/index.d.ts +14 -0
- package/dist/indexer/adapter/index.d.ts.map +1 -0
- package/dist/indexer/adapter/index.js +13 -0
- package/dist/indexer/adapter/index.js.map +1 -0
- package/dist/indexer/adapter/java.d.ts +14 -0
- package/dist/indexer/adapter/java.d.ts.map +1 -0
- package/dist/indexer/adapter/java.js +391 -0
- package/dist/indexer/adapter/java.js.map +1 -0
- package/dist/indexer/adapter/kotlin.d.ts +18 -0
- package/dist/indexer/adapter/kotlin.d.ts.map +1 -0
- package/dist/indexer/adapter/kotlin.js +599 -0
- package/dist/indexer/adapter/kotlin.js.map +1 -0
- package/dist/indexer/adapter/php.d.ts +18 -0
- package/dist/indexer/adapter/php.d.ts.map +1 -0
- package/dist/indexer/adapter/php.js +574 -0
- package/dist/indexer/adapter/php.js.map +1 -0
- package/dist/indexer/adapter/plugin/index.d.ts +3 -0
- package/dist/indexer/adapter/plugin/index.d.ts.map +1 -0
- package/dist/indexer/adapter/plugin/index.js +3 -0
- package/dist/indexer/adapter/plugin/index.js.map +1 -0
- package/dist/indexer/adapter/plugin/loader.d.ts +13 -0
- package/dist/indexer/adapter/plugin/loader.d.ts.map +1 -0
- package/dist/indexer/adapter/plugin/loader.js +154 -0
- package/dist/indexer/adapter/plugin/loader.js.map +1 -0
- package/dist/indexer/adapter/plugin/types.d.ts +76 -0
- package/dist/indexer/adapter/plugin/types.d.ts.map +1 -0
- package/dist/indexer/adapter/plugin/types.js +47 -0
- package/dist/indexer/adapter/plugin/types.js.map +1 -0
- package/dist/indexer/adapter/python.d.ts +14 -0
- package/dist/indexer/adapter/python.d.ts.map +1 -0
- package/dist/indexer/adapter/python.js +511 -0
- package/dist/indexer/adapter/python.js.map +1 -0
- package/dist/indexer/adapter/registry.d.ts +17 -0
- package/dist/indexer/adapter/registry.d.ts.map +1 -0
- package/dist/indexer/adapter/registry.js +134 -0
- package/dist/indexer/adapter/registry.js.map +1 -0
- package/dist/indexer/adapter/rust.d.ts +18 -0
- package/dist/indexer/adapter/rust.d.ts.map +1 -0
- package/dist/indexer/adapter/rust.js +709 -0
- package/dist/indexer/adapter/rust.js.map +1 -0
- package/dist/indexer/adapter/shell.d.ts +18 -0
- package/dist/indexer/adapter/shell.d.ts.map +1 -0
- package/dist/indexer/adapter/shell.js +345 -0
- package/dist/indexer/adapter/shell.js.map +1 -0
- package/dist/indexer/adapter/typescript.d.ts +14 -0
- package/dist/indexer/adapter/typescript.d.ts.map +1 -0
- package/dist/indexer/adapter/typescript.js +31 -0
- package/dist/indexer/adapter/typescript.js.map +1 -0
- package/dist/indexer/configEdges.d.ts +30 -0
- package/dist/indexer/configEdges.d.ts.map +1 -0
- package/dist/indexer/configEdges.js +260 -0
- package/dist/indexer/configEdges.js.map +1 -0
- package/dist/indexer/fileScanner.d.ts +16 -0
- package/dist/indexer/fileScanner.d.ts.map +1 -0
- package/dist/indexer/fileScanner.js +90 -0
- package/dist/indexer/fileScanner.js.map +1 -0
- package/dist/indexer/fingerprints.d.ts +23 -0
- package/dist/indexer/fingerprints.d.ts.map +1 -0
- package/dist/indexer/fingerprints.js +97 -0
- package/dist/indexer/fingerprints.js.map +1 -0
- package/dist/indexer/indexer.d.ts +58 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +1229 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/summaries.d.ts +5 -0
- package/dist/indexer/summaries.d.ts.map +1 -0
- package/dist/indexer/summaries.js +331 -0
- package/dist/indexer/summaries.js.map +1 -0
- package/dist/indexer/treesitter/extractCalls.d.ts +40 -0
- package/dist/indexer/treesitter/extractCalls.d.ts.map +1 -0
- package/dist/indexer/treesitter/extractCalls.js +561 -0
- package/dist/indexer/treesitter/extractCalls.js.map +1 -0
- package/dist/indexer/treesitter/extractImports.d.ts +12 -0
- package/dist/indexer/treesitter/extractImports.d.ts.map +1 -0
- package/dist/indexer/treesitter/extractImports.js +184 -0
- package/dist/indexer/treesitter/extractImports.js.map +1 -0
- package/dist/indexer/treesitter/extractSymbols.d.ts +24 -0
- package/dist/indexer/treesitter/extractSymbols.d.ts.map +1 -0
- package/dist/indexer/treesitter/extractSymbols.js +389 -0
- package/dist/indexer/treesitter/extractSymbols.js.map +1 -0
- package/dist/indexer/treesitter/grammarLoader.d.ts +6 -0
- package/dist/indexer/treesitter/grammarLoader.d.ts.map +1 -0
- package/dist/indexer/treesitter/grammarLoader.js +125 -0
- package/dist/indexer/treesitter/grammarLoader.js.map +1 -0
- package/dist/indexer/treesitter/symbolUtils.d.ts +4 -0
- package/dist/indexer/treesitter/symbolUtils.d.ts.map +1 -0
- package/dist/indexer/treesitter/symbolUtils.js +26 -0
- package/dist/indexer/treesitter/symbolUtils.js.map +1 -0
- package/dist/indexer/treesitter/tsTreesitter.d.ts +9 -0
- package/dist/indexer/treesitter/tsTreesitter.d.ts.map +1 -0
- package/dist/indexer/treesitter/tsTreesitter.js +54 -0
- package/dist/indexer/treesitter/tsTreesitter.js.map +1 -0
- package/dist/indexer/treesitter/types.d.ts +19 -0
- package/dist/indexer/treesitter/types.d.ts.map +1 -0
- package/dist/indexer/treesitter/types.js +7 -0
- package/dist/indexer/treesitter/types.js.map +1 -0
- package/dist/indexer/ts/tsParser.d.ts +20 -0
- package/dist/indexer/ts/tsParser.d.ts.map +1 -0
- package/dist/indexer/ts/tsParser.js +114 -0
- package/dist/indexer/ts/tsParser.js.map +1 -0
- package/dist/indexer/worker.d.ts +2 -0
- package/dist/indexer/worker.d.ts.map +1 -0
- package/dist/indexer/worker.js +59 -0
- package/dist/indexer/worker.js.map +1 -0
- package/dist/indexer/workerPool.d.ts +20 -0
- package/dist/indexer/workerPool.d.ts.map +1 -0
- package/dist/indexer/workerPool.js +93 -0
- package/dist/indexer/workerPool.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +111 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/errors.d.ts +40 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +66 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/resources.d.ts +24 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +140 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/telemetry.d.ts +67 -0
- package/dist/mcp/telemetry.d.ts.map +1 -0
- package/dist/mcp/telemetry.js +128 -0
- package/dist/mcp/telemetry.js.map +1 -0
- package/dist/mcp/tools/agent.d.ts +241 -0
- package/dist/mcp/tools/agent.d.ts.map +1 -0
- package/dist/mcp/tools/agent.js +113 -0
- package/dist/mcp/tools/agent.js.map +1 -0
- package/dist/mcp/tools/code.d.ts +32 -0
- package/dist/mcp/tools/code.d.ts.map +1 -0
- package/dist/mcp/tools/code.js +388 -0
- package/dist/mcp/tools/code.js.map +1 -0
- package/dist/mcp/tools/delta.d.ts +12 -0
- package/dist/mcp/tools/delta.d.ts.map +1 -0
- package/dist/mcp/tools/delta.js +82 -0
- package/dist/mcp/tools/delta.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +3 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +35 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/policy.d.ts +20 -0
- package/dist/mcp/tools/policy.d.ts.map +1 -0
- package/dist/mcp/tools/policy.js +67 -0
- package/dist/mcp/tools/policy.js.map +1 -0
- package/dist/mcp/tools/prRisk.d.ts +34 -0
- package/dist/mcp/tools/prRisk.d.ts.map +1 -0
- package/dist/mcp/tools/prRisk.js +304 -0
- package/dist/mcp/tools/prRisk.js.map +1 -0
- package/dist/mcp/tools/repo.d.ts +46 -0
- package/dist/mcp/tools/repo.d.ts.map +1 -0
- package/dist/mcp/tools/repo.js +224 -0
- package/dist/mcp/tools/repo.js.map +1 -0
- package/dist/mcp/tools/slice.d.ts +44 -0
- package/dist/mcp/tools/slice.d.ts.map +1 -0
- package/dist/mcp/tools/slice.js +688 -0
- package/dist/mcp/tools/slice.js.map +1 -0
- package/dist/mcp/tools/symbol.d.ts +21 -0
- package/dist/mcp/tools/symbol.d.ts.map +1 -0
- package/dist/mcp/tools/symbol.js +416 -0
- package/dist/mcp/tools/symbol.js.map +1 -0
- package/dist/mcp/tools.d.ts +6003 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +932 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +500 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/policy/engine.d.ts +21 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +477 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/types.d.ts +73 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +12 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +136 -0
- package/dist/server.js.map +1 -0
- package/dist/sync/pull.d.ts +4 -0
- package/dist/sync/pull.d.ts.map +1 -0
- package/dist/sync/pull.js +113 -0
- package/dist/sync/pull.js.map +1 -0
- package/dist/sync/sync.d.ts +6 -0
- package/dist/sync/sync.d.ts.map +1 -0
- package/dist/sync/sync.js +244 -0
- package/dist/sync/sync.js.map +1 -0
- package/dist/sync/types.d.ts +136 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/ts/diagnostics.d.ts +61 -0
- package/dist/ts/diagnostics.d.ts.map +1 -0
- package/dist/ts/diagnostics.js +259 -0
- package/dist/ts/diagnostics.js.map +1 -0
- package/dist/ts/mapping.d.ts +27 -0
- package/dist/ts/mapping.d.ts.map +1 -0
- package/dist/ts/mapping.js +68 -0
- package/dist/ts/mapping.js.map +1 -0
- package/dist/util/asyncFs.d.ts +103 -0
- package/dist/util/asyncFs.d.ts.map +1 -0
- package/dist/util/asyncFs.js +133 -0
- package/dist/util/asyncFs.js.map +1 -0
- package/dist/util/concurrency.d.ts +77 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +146 -0
- package/dist/util/concurrency.js.map +1 -0
- package/dist/util/depLabels.d.ts +3 -0
- package/dist/util/depLabels.d.ts.map +1 -0
- package/dist/util/depLabels.js +19 -0
- package/dist/util/depLabels.js.map +1 -0
- package/dist/util/findPackageRoot.d.ts +7 -0
- package/dist/util/findPackageRoot.d.ts.map +1 -0
- package/dist/util/findPackageRoot.js +21 -0
- package/dist/util/findPackageRoot.js.map +1 -0
- package/dist/util/hashing.d.ts +9 -0
- package/dist/util/hashing.d.ts.map +1 -0
- package/dist/util/hashing.js +37 -0
- package/dist/util/hashing.js.map +1 -0
- package/dist/util/logger.d.ts +14 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +51 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/paths.d.ts +6 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +79 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.d.ts.map +1 -0
- package/dist/util/time.js +20 -0
- package/dist/util/time.js.map +1 -0
- package/dist/util/tokenize.d.ts +5 -0
- package/dist/util/tokenize.d.ts.map +1 -0
- package/dist/util/tokenize.js +30 -0
- package/dist/util/tokenize.js.map +1 -0
- package/dist/util/truncation.d.ts +38 -0
- package/dist/util/truncation.d.ts.map +1 -0
- package/dist/util/truncation.js +259 -0
- package/dist/util/truncation.js.map +1 -0
- package/migrations/.gitkeep +1 -0
- package/migrations/0001_init.sql +61 -0
- package/migrations/0002_edges_indexes.sql +2 -0
- package/migrations/0003_versions.sql +22 -0
- package/migrations/0004_metrics_audit.sql +23 -0
- package/migrations/0005_slice_handles.sql +15 -0
- package/migrations/0006_content_addressed.sql +29 -0
- package/migrations/0007_add_language_to_symbols.sql +28 -0
- package/migrations/0008_performance_indexes.sql +21 -0
- package/migrations/0009_fix_edge_fks.sql +37 -0
- package/migrations/0010_standardize_fks.sql +35 -0
- package/migrations/0011_add_directory_column.sql +20 -0
- package/migrations/0012_symbol_references.sql +16 -0
- package/migrations/0013_sync_artifacts.sql +17 -0
- package/package.json +107 -0
- package/templates/CLAUDE.md.template +179 -0
- package/templates/README.md +228 -0
- package/templates/claude-code.json +54 -0
- package/templates/codex.json +55 -0
- package/templates/gemini.json +66 -0
- package/templates/opencode.json +90 -0
- package/templates/plugin-template/LICENSE +21 -0
- package/templates/plugin-template/README.md +309 -0
- package/templates/plugin-template/index.ts +160 -0
- package/templates/plugin-template/package.json +31 -0
- package/templates/plugin-template/test/plugin.test.ts +186 -0
- package/templates/plugin-template/tsconfig.json +21 -0
|
@@ -0,0 +1,688 @@
|
|
|
1
|
+
import { SliceBuildRequestSchema, SliceRefreshRequestSchema, SliceSpilloverGetRequestSchema, } from "../tools.js";
|
|
2
|
+
import { buildSlice } from "../../graph/slice.js";
|
|
3
|
+
import * as db from "../../db/queries.js";
|
|
4
|
+
import * as crypto from "crypto";
|
|
5
|
+
import { computeDelta } from "../../delta/diff.js";
|
|
6
|
+
import { PolicyEngine, } from "../../policy/engine.js";
|
|
7
|
+
import { logPolicyDecision } from "../telemetry.js";
|
|
8
|
+
import { logger } from "../../util/logger.js";
|
|
9
|
+
import { DEFAULT_MAX_CARDS, DEFAULT_MAX_TOKENS_SLICE, SLICE_LEASE_TTL_MS, SPILLOVER_DEFAULT_PAGE_SIZE, AST_FINGERPRINT_COMPACT_WIRE_LENGTH, SYMBOL_ID_COMPACT_WIRE_LENGTH, } from "../../config/constants.js";
|
|
10
|
+
import { loadConfig } from "../../config/loadConfig.js";
|
|
11
|
+
import { PolicyConfigSchema } from "../../config/types.js";
|
|
12
|
+
import { createPolicyDenial } from "../errors.js";
|
|
13
|
+
import { pickDepLabel } from "../../util/depLabels.js";
|
|
14
|
+
const policyEngine = new PolicyEngine();
|
|
15
|
+
function clampInt(value, min, max) {
|
|
16
|
+
const v = Math.trunc(value);
|
|
17
|
+
return Math.max(min, Math.min(max, v));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generates a unique slice handle identifier.
|
|
21
|
+
*
|
|
22
|
+
* @returns 32-character hex string representing the slice handle
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
function generateSliceHandle() {
|
|
26
|
+
return crypto.randomBytes(16).toString("hex");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generates a hash of the slice content for ETag validation.
|
|
30
|
+
* Hash includes repoId, versionId, sorted start symbols, budget, and card count.
|
|
31
|
+
*
|
|
32
|
+
* @param slice - Graph slice to hash
|
|
33
|
+
* @returns SHA-256 hash hex string
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
function generateSliceHash(slice) {
|
|
37
|
+
const canonical = JSON.stringify({
|
|
38
|
+
repoId: slice.repoId,
|
|
39
|
+
versionId: slice.versionId,
|
|
40
|
+
startSymbols: slice.startSymbols.sort(),
|
|
41
|
+
budget: slice.budget,
|
|
42
|
+
cardCount: slice.cards.length,
|
|
43
|
+
});
|
|
44
|
+
return crypto.createHash("sha256").update(canonical).digest("hex");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates a lease for a slice handle with 1-hour TTL.
|
|
48
|
+
*
|
|
49
|
+
* @param ledgerVersion - Current ledger version string
|
|
50
|
+
* @returns Slice lease with expiration and version bounds
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
function createLease(ledgerVersion) {
|
|
54
|
+
const now = new Date();
|
|
55
|
+
const expiresAt = new Date(now.getTime() + SLICE_LEASE_TTL_MS);
|
|
56
|
+
return {
|
|
57
|
+
expiresAt: expiresAt.toISOString(),
|
|
58
|
+
minVersion: null,
|
|
59
|
+
maxVersion: ledgerVersion,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates an ETag object for slice cache validation.
|
|
64
|
+
*
|
|
65
|
+
* @param handle - Slice handle identifier
|
|
66
|
+
* @param version - Ledger version string
|
|
67
|
+
* @param sliceHash - Hash of slice content
|
|
68
|
+
* @returns Slice ETag object
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
function createSliceEtag(handle, version, sliceHash) {
|
|
72
|
+
return {
|
|
73
|
+
handle,
|
|
74
|
+
version,
|
|
75
|
+
sliceHash,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function serializeSliceForWireFormat(slice, wireFormat, wireFormatVersion) {
|
|
79
|
+
if (wireFormat === "compact") {
|
|
80
|
+
return wireFormatVersion === 1
|
|
81
|
+
? toCompactGraphSliceV1(slice)
|
|
82
|
+
: toCompactGraphSliceV2(slice);
|
|
83
|
+
}
|
|
84
|
+
return slice;
|
|
85
|
+
}
|
|
86
|
+
export function toCompactGraphSliceV1(slice) {
|
|
87
|
+
const compact = {
|
|
88
|
+
wf: "compact",
|
|
89
|
+
wv: 1,
|
|
90
|
+
rid: slice.repoId,
|
|
91
|
+
vid: slice.versionId,
|
|
92
|
+
b: {
|
|
93
|
+
mc: slice.budget.maxCards,
|
|
94
|
+
mt: slice.budget.maxEstimatedTokens,
|
|
95
|
+
},
|
|
96
|
+
ss: slice.startSymbols,
|
|
97
|
+
si: slice.symbolIndex,
|
|
98
|
+
c: slice.cards.map((card) => {
|
|
99
|
+
const compactCard = {
|
|
100
|
+
sid: card.symbolId,
|
|
101
|
+
f: card.file,
|
|
102
|
+
r: [
|
|
103
|
+
card.range.startLine,
|
|
104
|
+
card.range.startCol,
|
|
105
|
+
card.range.endLine,
|
|
106
|
+
card.range.endCol,
|
|
107
|
+
],
|
|
108
|
+
k: card.kind,
|
|
109
|
+
n: card.name,
|
|
110
|
+
x: card.exported,
|
|
111
|
+
d: {
|
|
112
|
+
i: card.deps.imports,
|
|
113
|
+
c: card.deps.calls,
|
|
114
|
+
},
|
|
115
|
+
af: card.version.astFingerprint,
|
|
116
|
+
};
|
|
117
|
+
if (card.visibility)
|
|
118
|
+
compactCard.v = card.visibility;
|
|
119
|
+
if (card.signature)
|
|
120
|
+
compactCard.sig = card.signature;
|
|
121
|
+
if (card.summary)
|
|
122
|
+
compactCard.sum = card.summary;
|
|
123
|
+
if (card.invariants && card.invariants.length > 0) {
|
|
124
|
+
compactCard.inv = card.invariants;
|
|
125
|
+
}
|
|
126
|
+
if (card.sideEffects && card.sideEffects.length > 0) {
|
|
127
|
+
compactCard.se = card.sideEffects;
|
|
128
|
+
}
|
|
129
|
+
if (card.metrics) {
|
|
130
|
+
const metrics = {};
|
|
131
|
+
if (card.metrics.fanIn !== undefined)
|
|
132
|
+
metrics.fi = card.metrics.fanIn;
|
|
133
|
+
if (card.metrics.fanOut !== undefined)
|
|
134
|
+
metrics.fo = card.metrics.fanOut;
|
|
135
|
+
if (card.metrics.churn30d !== undefined)
|
|
136
|
+
metrics.ch = card.metrics.churn30d;
|
|
137
|
+
if (card.metrics.testRefs && card.metrics.testRefs.length > 0) {
|
|
138
|
+
metrics.t = card.metrics.testRefs;
|
|
139
|
+
}
|
|
140
|
+
if (Object.keys(metrics).length > 0) {
|
|
141
|
+
compactCard.m = metrics;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (card.detailLevel && card.detailLevel !== "compact") {
|
|
145
|
+
compactCard.dl = card.detailLevel;
|
|
146
|
+
}
|
|
147
|
+
return compactCard;
|
|
148
|
+
}),
|
|
149
|
+
e: slice.edges,
|
|
150
|
+
};
|
|
151
|
+
if (slice.cardRefs && slice.cardRefs.length > 0) {
|
|
152
|
+
compact.cr = slice.cardRefs.map((ref) => {
|
|
153
|
+
const compactRef = {
|
|
154
|
+
sid: ref.symbolId,
|
|
155
|
+
e: ref.etag,
|
|
156
|
+
};
|
|
157
|
+
if (ref.detailLevel !== "compact") {
|
|
158
|
+
compactRef.dl = ref.detailLevel;
|
|
159
|
+
}
|
|
160
|
+
return compactRef;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (slice.frontier && slice.frontier.length > 0) {
|
|
164
|
+
compact.f = slice.frontier.map((item) => ({
|
|
165
|
+
sid: item.symbolId,
|
|
166
|
+
s: item.score,
|
|
167
|
+
w: item.why,
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
if (slice.truncation) {
|
|
171
|
+
const truncation = {
|
|
172
|
+
tr: slice.truncation.truncated,
|
|
173
|
+
dc: slice.truncation.droppedCards,
|
|
174
|
+
de: slice.truncation.droppedEdges,
|
|
175
|
+
};
|
|
176
|
+
if (slice.truncation.howToResume) {
|
|
177
|
+
truncation.res = {
|
|
178
|
+
t: slice.truncation.howToResume.type,
|
|
179
|
+
v: slice.truncation.howToResume.value,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
compact.t = truncation;
|
|
183
|
+
}
|
|
184
|
+
return compact;
|
|
185
|
+
}
|
|
186
|
+
/** Backward-compatible alias for v1 compact serializer. */
|
|
187
|
+
export const toCompactGraphSlice = toCompactGraphSliceV1;
|
|
188
|
+
const FRONTIER_WHY_CODES = {
|
|
189
|
+
"calls": "c",
|
|
190
|
+
"imports": "i",
|
|
191
|
+
"configures": "cf",
|
|
192
|
+
"entry symbol": "e",
|
|
193
|
+
"entry sibling": "es",
|
|
194
|
+
"entry dependency": "ed",
|
|
195
|
+
"stack trace": "st",
|
|
196
|
+
"failing test": "ft",
|
|
197
|
+
"edited file": "ef",
|
|
198
|
+
"task text": "tt",
|
|
199
|
+
};
|
|
200
|
+
export function toCompactGraphSliceV2(slice) {
|
|
201
|
+
// Build file path lookup table (#2: deduplicate file paths)
|
|
202
|
+
const filePaths = [];
|
|
203
|
+
const filePathIndex = new Map();
|
|
204
|
+
for (const card of slice.cards) {
|
|
205
|
+
if (!filePathIndex.has(card.file)) {
|
|
206
|
+
filePathIndex.set(card.file, filePaths.length);
|
|
207
|
+
filePaths.push(card.file);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Edge type lookup table (#5: integer edge types)
|
|
211
|
+
const edgeTypes = ["import", "call", "config"];
|
|
212
|
+
const edgeTypeIndex = new Map(edgeTypes.map((t, i) => [t, i]));
|
|
213
|
+
// SymbolId to index mapping (#6: cards are positional)
|
|
214
|
+
const symbolIdToIndex = new Map(slice.symbolIndex.map((id, i) => [id, i]));
|
|
215
|
+
const compact = {
|
|
216
|
+
wf: "compact",
|
|
217
|
+
vid: slice.versionId,
|
|
218
|
+
b: {
|
|
219
|
+
mc: slice.budget.maxCards,
|
|
220
|
+
mt: slice.budget.maxEstimatedTokens,
|
|
221
|
+
},
|
|
222
|
+
ss: slice.startSymbols.map(id => id.slice(0, SYMBOL_ID_COMPACT_WIRE_LENGTH)),
|
|
223
|
+
si: slice.symbolIndex.map(id => id.slice(0, SYMBOL_ID_COMPACT_WIRE_LENGTH)),
|
|
224
|
+
fp: filePaths,
|
|
225
|
+
et: slice.edges.length > 0 ? edgeTypes : undefined,
|
|
226
|
+
c: slice.cards.map((card) => {
|
|
227
|
+
const compactCard = {
|
|
228
|
+
fi: filePathIndex.get(card.file) ?? 0,
|
|
229
|
+
r: [
|
|
230
|
+
card.range.startLine,
|
|
231
|
+
card.range.startCol,
|
|
232
|
+
card.range.endLine,
|
|
233
|
+
card.range.endCol,
|
|
234
|
+
],
|
|
235
|
+
k: card.kind,
|
|
236
|
+
n: card.name,
|
|
237
|
+
x: card.exported,
|
|
238
|
+
d: {
|
|
239
|
+
i: card.deps.imports,
|
|
240
|
+
c: card.deps.calls,
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
if (card.detailLevel === "full") {
|
|
244
|
+
compactCard.af = card.version.astFingerprint.slice(0, AST_FINGERPRINT_COMPACT_WIRE_LENGTH);
|
|
245
|
+
}
|
|
246
|
+
if (card.visibility)
|
|
247
|
+
compactCard.v = card.visibility;
|
|
248
|
+
if (card.signature)
|
|
249
|
+
compactCard.sig = card.signature;
|
|
250
|
+
if (card.summary)
|
|
251
|
+
compactCard.sum = card.summary;
|
|
252
|
+
if (card.invariants && card.invariants.length > 0) {
|
|
253
|
+
compactCard.inv = card.invariants;
|
|
254
|
+
}
|
|
255
|
+
if (card.sideEffects && card.sideEffects.length > 0) {
|
|
256
|
+
compactCard.se = card.sideEffects;
|
|
257
|
+
}
|
|
258
|
+
if (card.metrics) {
|
|
259
|
+
const metrics = {};
|
|
260
|
+
if (card.metrics.fanIn !== undefined)
|
|
261
|
+
metrics.fi = card.metrics.fanIn;
|
|
262
|
+
if (card.metrics.fanOut !== undefined)
|
|
263
|
+
metrics.fo = card.metrics.fanOut;
|
|
264
|
+
if (card.metrics.churn30d !== undefined)
|
|
265
|
+
metrics.ch = card.metrics.churn30d;
|
|
266
|
+
if (card.metrics.testRefs && card.metrics.testRefs.length > 0) {
|
|
267
|
+
metrics.t = card.metrics.testRefs;
|
|
268
|
+
}
|
|
269
|
+
if (Object.keys(metrics).length > 0) {
|
|
270
|
+
compactCard.m = metrics;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (card.detailLevel && card.detailLevel !== "compact") {
|
|
274
|
+
compactCard.dl = card.detailLevel;
|
|
275
|
+
}
|
|
276
|
+
return compactCard;
|
|
277
|
+
}),
|
|
278
|
+
e: slice.edges.map(([from, to, type, weight]) => [
|
|
279
|
+
from,
|
|
280
|
+
to,
|
|
281
|
+
edgeTypeIndex.get(type) ?? 0,
|
|
282
|
+
weight,
|
|
283
|
+
]),
|
|
284
|
+
};
|
|
285
|
+
// Card refs with index refs (#6)
|
|
286
|
+
if (slice.cardRefs && slice.cardRefs.length > 0) {
|
|
287
|
+
compact.cr = slice.cardRefs.map((ref) => {
|
|
288
|
+
const compactRef = {
|
|
289
|
+
ci: symbolIdToIndex.get(ref.symbolId) ?? -1,
|
|
290
|
+
e: ref.etag,
|
|
291
|
+
};
|
|
292
|
+
if (ref.detailLevel !== "compact") {
|
|
293
|
+
compactRef.dl = ref.detailLevel;
|
|
294
|
+
}
|
|
295
|
+
return compactRef;
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
// Frontier with index refs and why codes (#6, #7)
|
|
299
|
+
if (slice.frontier && slice.frontier.length > 0) {
|
|
300
|
+
compact.f = slice.frontier.map((item) => ({
|
|
301
|
+
ci: symbolIdToIndex.get(item.symbolId) ?? -1,
|
|
302
|
+
s: item.score,
|
|
303
|
+
w: FRONTIER_WHY_CODES[item.why] ?? item.why,
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
306
|
+
// Only attach truncation when actually truncated (#12)
|
|
307
|
+
if (slice.truncation?.truncated) {
|
|
308
|
+
const truncation = {
|
|
309
|
+
tr: true,
|
|
310
|
+
dc: slice.truncation.droppedCards,
|
|
311
|
+
de: slice.truncation.droppedEdges,
|
|
312
|
+
};
|
|
313
|
+
if (slice.truncation.howToResume) {
|
|
314
|
+
truncation.res = {
|
|
315
|
+
t: slice.truncation.howToResume.type,
|
|
316
|
+
v: slice.truncation.howToResume.value,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
compact.t = truncation;
|
|
320
|
+
}
|
|
321
|
+
return compact;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Handles graph slice build requests.
|
|
325
|
+
* Creates a new slice handle with configurable entry points and budget.
|
|
326
|
+
* Supports policy evaluation and lease-based caching.
|
|
327
|
+
*
|
|
328
|
+
* @param args - Raw arguments containing repoId, task context, and slice parameters
|
|
329
|
+
* @returns Slice build response with handle, lease, ETag, and slice data
|
|
330
|
+
* @throws {Error} If repository not indexed or policy denies request
|
|
331
|
+
*/
|
|
332
|
+
export async function handleSliceBuild(args) {
|
|
333
|
+
const request = SliceBuildRequestSchema.parse(args);
|
|
334
|
+
const { repoId, taskText, stackTrace, failingTestPath, editedFiles, entrySymbols, knownCardEtags, cardDetail, wireFormat, wireFormatVersion, budget, } = request;
|
|
335
|
+
const requestedWireFormat = wireFormat ?? "compact";
|
|
336
|
+
const effectiveWireFormatVersion = requestedWireFormat === "compact"
|
|
337
|
+
? (wireFormatVersion ?? 2)
|
|
338
|
+
: undefined;
|
|
339
|
+
const config = loadConfig();
|
|
340
|
+
const repo = db.getRepo(repoId);
|
|
341
|
+
if (!repo) {
|
|
342
|
+
throw new Error(`Repository not found: ${repoId}`);
|
|
343
|
+
}
|
|
344
|
+
const repoConfig = JSON.parse(repo.config_json);
|
|
345
|
+
const mergedPolicy = PolicyConfigSchema.parse({
|
|
346
|
+
...config.policy,
|
|
347
|
+
...(repoConfig.policy ?? {}),
|
|
348
|
+
});
|
|
349
|
+
// Keep policy limits in sync with the configured server behavior.
|
|
350
|
+
// This matters for cross-client consistency (Claude Code / Codex / Gemini CLI / OpenCode CLI).
|
|
351
|
+
const sliceBudgetDefaults = {
|
|
352
|
+
maxCards: config.slice?.defaultMaxCards ?? DEFAULT_MAX_CARDS,
|
|
353
|
+
maxEstimatedTokens: config.slice?.defaultMaxTokens ?? DEFAULT_MAX_TOKENS_SLICE,
|
|
354
|
+
};
|
|
355
|
+
policyEngine.updateConfig({
|
|
356
|
+
maxWindowLines: mergedPolicy.maxWindowLines,
|
|
357
|
+
maxWindowTokens: mergedPolicy.maxWindowTokens,
|
|
358
|
+
requireIdentifiers: mergedPolicy.requireIdentifiers,
|
|
359
|
+
allowBreakGlass: mergedPolicy.allowBreakGlass,
|
|
360
|
+
budgetCaps: sliceBudgetDefaults,
|
|
361
|
+
});
|
|
362
|
+
const policyCaps = policyEngine.getConfig().budgetCaps;
|
|
363
|
+
const requestedBudget = budget ?? {};
|
|
364
|
+
const effectiveBudget = {
|
|
365
|
+
maxCards: clampInt(requestedBudget.maxCards ?? sliceBudgetDefaults.maxCards, 1, policyCaps.maxCards),
|
|
366
|
+
maxEstimatedTokens: clampInt(requestedBudget.maxEstimatedTokens ?? sliceBudgetDefaults.maxEstimatedTokens, 1, policyCaps.maxEstimatedTokens),
|
|
367
|
+
};
|
|
368
|
+
if ((requestedBudget.maxCards && requestedBudget.maxCards > policyCaps.maxCards) ||
|
|
369
|
+
(requestedBudget.maxEstimatedTokens &&
|
|
370
|
+
requestedBudget.maxEstimatedTokens > policyCaps.maxEstimatedTokens)) {
|
|
371
|
+
logger.warn("Clamped slice budget to policy caps", {
|
|
372
|
+
repoId,
|
|
373
|
+
requestedBudget,
|
|
374
|
+
effectiveBudget,
|
|
375
|
+
policyCaps,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
const latestVersion = db.getLatestVersion(repoId);
|
|
379
|
+
if (!latestVersion) {
|
|
380
|
+
throw new Error(`No version found for repo ${repoId}. Please run indexing first.`);
|
|
381
|
+
}
|
|
382
|
+
const sliceRequest = {
|
|
383
|
+
repoId,
|
|
384
|
+
versionId: latestVersion.version_id,
|
|
385
|
+
taskText,
|
|
386
|
+
stackTrace,
|
|
387
|
+
failingTestPath,
|
|
388
|
+
editedFiles,
|
|
389
|
+
entrySymbols,
|
|
390
|
+
knownCardEtags,
|
|
391
|
+
cardDetail,
|
|
392
|
+
budget: effectiveBudget,
|
|
393
|
+
};
|
|
394
|
+
const policyContext = {
|
|
395
|
+
requestType: "graphSlice",
|
|
396
|
+
repoId: request.repoId,
|
|
397
|
+
versionId: latestVersion.version_id,
|
|
398
|
+
budget: effectiveBudget,
|
|
399
|
+
};
|
|
400
|
+
const policyDecision = policyEngine.evaluate(policyContext);
|
|
401
|
+
const { nextBestAction, requiredFieldsForNext } = policyEngine.generateNextBestAction(policyDecision, policyContext);
|
|
402
|
+
logPolicyDecision({
|
|
403
|
+
requestType: policyContext.requestType,
|
|
404
|
+
repoId: policyContext.repoId,
|
|
405
|
+
decision: policyDecision.decision,
|
|
406
|
+
auditHash: policyDecision.auditHash,
|
|
407
|
+
evidenceUsed: policyDecision.evidenceUsed,
|
|
408
|
+
deniedReasons: policyDecision.deniedReasons,
|
|
409
|
+
nextBestAction,
|
|
410
|
+
requiredFieldsForNext,
|
|
411
|
+
context: policyContext,
|
|
412
|
+
});
|
|
413
|
+
if (policyDecision.decision === "deny") {
|
|
414
|
+
const error = createPolicyDenial(`Policy denied slice request: ${policyDecision.deniedReasons?.join(", ")}`, nextBestAction, requiredFieldsForNext);
|
|
415
|
+
throw error;
|
|
416
|
+
}
|
|
417
|
+
const slice = await buildSlice(sliceRequest);
|
|
418
|
+
const handle = generateSliceHandle();
|
|
419
|
+
const sliceHash = generateSliceHash(slice);
|
|
420
|
+
const lease = createLease(latestVersion.version_id);
|
|
421
|
+
const sliceEtag = createSliceEtag(handle, latestVersion.version_id, sliceHash);
|
|
422
|
+
const handleRow = {
|
|
423
|
+
handle,
|
|
424
|
+
repo_id: repoId,
|
|
425
|
+
created_at: new Date().toISOString(),
|
|
426
|
+
expires_at: lease.expiresAt,
|
|
427
|
+
min_version: lease.minVersion,
|
|
428
|
+
max_version: lease.maxVersion,
|
|
429
|
+
slice_hash: sliceHash,
|
|
430
|
+
spillover_ref: null,
|
|
431
|
+
};
|
|
432
|
+
db.createSliceHandle(handleRow);
|
|
433
|
+
return {
|
|
434
|
+
sliceHandle: handle,
|
|
435
|
+
ledgerVersion: latestVersion.version_id,
|
|
436
|
+
lease,
|
|
437
|
+
sliceEtag,
|
|
438
|
+
slice: serializeSliceForWireFormat(slice, requestedWireFormat, effectiveWireFormatVersion),
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Handles slice refresh requests.
|
|
443
|
+
* Refreshes an existing slice handle and returns delta if version changed.
|
|
444
|
+
* Updates lease expiration and tracks version bounds.
|
|
445
|
+
*
|
|
446
|
+
* @param args - Raw arguments containing sliceHandle and knownVersion
|
|
447
|
+
* @returns Slice refresh response with updated lease and delta if applicable
|
|
448
|
+
* @throws {Error} If handle not found or expired
|
|
449
|
+
*/
|
|
450
|
+
export async function handleSliceRefresh(args) {
|
|
451
|
+
const request = SliceRefreshRequestSchema.parse(args);
|
|
452
|
+
const { sliceHandle, knownVersion } = request;
|
|
453
|
+
const handleRow = db.getSliceHandle(sliceHandle);
|
|
454
|
+
if (!handleRow) {
|
|
455
|
+
throw new Error(`Slice handle not found: ${sliceHandle}`);
|
|
456
|
+
}
|
|
457
|
+
const now = new Date();
|
|
458
|
+
if (new Date(handleRow.expires_at) < now) {
|
|
459
|
+
const error = createPolicyDenial(`Slice handle expired at ${handleRow.expires_at}. NextBestAction: 'refreshSlice' or build new slice`, "refreshSlice", {
|
|
460
|
+
refreshSlice: {
|
|
461
|
+
sliceHandle,
|
|
462
|
+
knownVersion,
|
|
463
|
+
},
|
|
464
|
+
});
|
|
465
|
+
throw error;
|
|
466
|
+
}
|
|
467
|
+
const latestVersion = db.getLatestVersion(handleRow.repo_id);
|
|
468
|
+
if (!latestVersion) {
|
|
469
|
+
throw new Error(`No version found for repo ${handleRow.repo_id}`);
|
|
470
|
+
}
|
|
471
|
+
if (knownVersion === latestVersion.version_id) {
|
|
472
|
+
const lease = createLease(latestVersion.version_id);
|
|
473
|
+
db.deleteSliceHandle(sliceHandle);
|
|
474
|
+
const newHandleRow = {
|
|
475
|
+
...handleRow,
|
|
476
|
+
handle: sliceHandle,
|
|
477
|
+
created_at: new Date().toISOString(),
|
|
478
|
+
expires_at: lease.expiresAt,
|
|
479
|
+
min_version: handleRow.max_version,
|
|
480
|
+
max_version: latestVersion.version_id,
|
|
481
|
+
};
|
|
482
|
+
db.createSliceHandle(newHandleRow);
|
|
483
|
+
return {
|
|
484
|
+
sliceHandle,
|
|
485
|
+
knownVersion,
|
|
486
|
+
currentVersion: latestVersion.version_id,
|
|
487
|
+
notModified: true,
|
|
488
|
+
delta: null,
|
|
489
|
+
lease,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
const delta = computeDelta(handleRow.repo_id, knownVersion, latestVersion.version_id);
|
|
493
|
+
const lease = createLease(latestVersion.version_id);
|
|
494
|
+
db.deleteSliceHandle(sliceHandle);
|
|
495
|
+
const newHandleRow = {
|
|
496
|
+
...handleRow,
|
|
497
|
+
handle: sliceHandle,
|
|
498
|
+
created_at: new Date().toISOString(),
|
|
499
|
+
expires_at: lease.expiresAt,
|
|
500
|
+
min_version: knownVersion,
|
|
501
|
+
max_version: latestVersion.version_id,
|
|
502
|
+
};
|
|
503
|
+
db.createSliceHandle(newHandleRow);
|
|
504
|
+
return {
|
|
505
|
+
sliceHandle,
|
|
506
|
+
knownVersion,
|
|
507
|
+
currentVersion: latestVersion.version_id,
|
|
508
|
+
notModified: false,
|
|
509
|
+
delta: delta,
|
|
510
|
+
lease,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Cleans up expired slice handles from the database.
|
|
515
|
+
* Called periodically to remove stale handles.
|
|
516
|
+
*
|
|
517
|
+
* @returns Number of deleted handles
|
|
518
|
+
*/
|
|
519
|
+
export function cleanupExpiredSliceHandles() {
|
|
520
|
+
const now = new Date().toISOString();
|
|
521
|
+
return db.deleteExpiredSliceHandles(now);
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Handles spillover symbol retrieval requests.
|
|
525
|
+
* Fetches symbols that were dropped from a slice in pages.
|
|
526
|
+
* Supports pagination via cursor and optional page size.
|
|
527
|
+
*
|
|
528
|
+
* @param args - Raw arguments containing spilloverHandle, cursor, and pageSize
|
|
529
|
+
* @returns Paged response with symbols and pagination metadata
|
|
530
|
+
* @throws {Error} If spillover handle not found
|
|
531
|
+
*/
|
|
532
|
+
export async function handleSliceSpilloverGet(args) {
|
|
533
|
+
const request = SliceSpilloverGetRequestSchema.parse(args);
|
|
534
|
+
const { spilloverHandle, cursor, pageSize } = request;
|
|
535
|
+
const handleRow = db.getSliceHandle(spilloverHandle);
|
|
536
|
+
if (!handleRow) {
|
|
537
|
+
throw new Error(`Spillover handle not found: ${spilloverHandle}`);
|
|
538
|
+
}
|
|
539
|
+
if (!handleRow.spillover_ref) {
|
|
540
|
+
return {
|
|
541
|
+
spilloverHandle,
|
|
542
|
+
cursor: undefined,
|
|
543
|
+
hasMore: false,
|
|
544
|
+
symbols: [],
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
let droppedSymbols;
|
|
548
|
+
try {
|
|
549
|
+
droppedSymbols = JSON.parse(handleRow.spillover_ref);
|
|
550
|
+
}
|
|
551
|
+
catch (error) {
|
|
552
|
+
throw new Error(`Failed to parse spillover_ref JSON for handle ${spilloverHandle}: ${String(error)}`);
|
|
553
|
+
}
|
|
554
|
+
const startIndex = cursor ? parseInt(cursor, 10) : 0;
|
|
555
|
+
if (Number.isNaN(startIndex)) {
|
|
556
|
+
throw new Error(`Invalid cursor value: ${cursor} is not a valid number`);
|
|
557
|
+
}
|
|
558
|
+
const size = pageSize ?? SPILLOVER_DEFAULT_PAGE_SIZE;
|
|
559
|
+
const endIndex = startIndex + size;
|
|
560
|
+
const pageSymbols = droppedSymbols.slice(startIndex, endIndex);
|
|
561
|
+
const symbols = pageSymbols
|
|
562
|
+
.map((item) => {
|
|
563
|
+
const symbolRow = db.getSymbol(item.symbolId);
|
|
564
|
+
if (!symbolRow)
|
|
565
|
+
return null;
|
|
566
|
+
const file = db.getFile(symbolRow.file_id);
|
|
567
|
+
const metrics = db.getMetrics(item.symbolId);
|
|
568
|
+
const deps = {
|
|
569
|
+
imports: [],
|
|
570
|
+
calls: [],
|
|
571
|
+
};
|
|
572
|
+
const outgoingEdges = db.getEdgesFrom(item.symbolId);
|
|
573
|
+
const targetSymbolIds = Array.from(new Set(outgoingEdges.map((edge) => edge.to_symbol_id)));
|
|
574
|
+
const targetSymbolsById = targetSymbolIds.length > 0
|
|
575
|
+
? db.getSymbolsByIdsLite(targetSymbolIds)
|
|
576
|
+
: new Map();
|
|
577
|
+
for (const edge of outgoingEdges) {
|
|
578
|
+
if (edge.type === "import") {
|
|
579
|
+
const depLabel = pickDepLabel(edge.to_symbol_id, targetSymbolsById.get(edge.to_symbol_id)?.name);
|
|
580
|
+
if (depLabel) {
|
|
581
|
+
deps.imports.push(depLabel);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
else if (edge.type === "call") {
|
|
585
|
+
const depLabel = pickDepLabel(edge.to_symbol_id, targetSymbolsById.get(edge.to_symbol_id)?.name);
|
|
586
|
+
if (depLabel) {
|
|
587
|
+
deps.calls.push(depLabel);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
let signature;
|
|
592
|
+
if (symbolRow.signature_json) {
|
|
593
|
+
try {
|
|
594
|
+
signature = JSON.parse(symbolRow.signature_json);
|
|
595
|
+
}
|
|
596
|
+
catch (error) {
|
|
597
|
+
logger.warn("Failed to parse signature_json JSON", {
|
|
598
|
+
symbolId: item.symbolId,
|
|
599
|
+
error: String(error),
|
|
600
|
+
});
|
|
601
|
+
signature = { name: symbolRow.name };
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
else {
|
|
605
|
+
signature = { name: symbolRow.name };
|
|
606
|
+
}
|
|
607
|
+
let invariants;
|
|
608
|
+
if (symbolRow.invariants_json) {
|
|
609
|
+
try {
|
|
610
|
+
invariants = JSON.parse(symbolRow.invariants_json);
|
|
611
|
+
}
|
|
612
|
+
catch (error) {
|
|
613
|
+
logger.warn("Failed to parse invariants_json JSON", {
|
|
614
|
+
symbolId: item.symbolId,
|
|
615
|
+
error: String(error),
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
let sideEffects;
|
|
620
|
+
if (symbolRow.side_effects_json) {
|
|
621
|
+
try {
|
|
622
|
+
sideEffects = JSON.parse(symbolRow.side_effects_json);
|
|
623
|
+
}
|
|
624
|
+
catch (error) {
|
|
625
|
+
logger.warn("Failed to parse side_effects_json JSON", {
|
|
626
|
+
symbolId: item.symbolId,
|
|
627
|
+
error: String(error),
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
let metricsData;
|
|
632
|
+
if (metrics) {
|
|
633
|
+
let testRefs;
|
|
634
|
+
if (metrics.test_refs_json) {
|
|
635
|
+
try {
|
|
636
|
+
testRefs = JSON.parse(metrics.test_refs_json);
|
|
637
|
+
}
|
|
638
|
+
catch (error) {
|
|
639
|
+
logger.warn("Failed to parse test_refs_json JSON", {
|
|
640
|
+
symbolId: item.symbolId,
|
|
641
|
+
error: String(error),
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
metricsData = {
|
|
646
|
+
fanIn: metrics.fan_in,
|
|
647
|
+
fanOut: metrics.fan_out,
|
|
648
|
+
churn30d: metrics.churn_30d,
|
|
649
|
+
testRefs,
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
return {
|
|
653
|
+
symbolId: symbolRow.symbol_id,
|
|
654
|
+
repoId: symbolRow.repo_id,
|
|
655
|
+
file: file?.rel_path ?? "",
|
|
656
|
+
range: {
|
|
657
|
+
startLine: symbolRow.range_start_line,
|
|
658
|
+
startCol: symbolRow.range_start_col,
|
|
659
|
+
endLine: symbolRow.range_end_line,
|
|
660
|
+
endCol: symbolRow.range_end_col,
|
|
661
|
+
},
|
|
662
|
+
kind: symbolRow.kind,
|
|
663
|
+
name: symbolRow.name,
|
|
664
|
+
exported: symbolRow.exported === 1,
|
|
665
|
+
visibility: symbolRow.visibility ?? undefined,
|
|
666
|
+
signature,
|
|
667
|
+
summary: symbolRow.summary ?? undefined,
|
|
668
|
+
invariants,
|
|
669
|
+
sideEffects,
|
|
670
|
+
deps,
|
|
671
|
+
metrics: metricsData,
|
|
672
|
+
version: {
|
|
673
|
+
ledgerVersion: handleRow.max_version ?? "",
|
|
674
|
+
astFingerprint: symbolRow.ast_fingerprint,
|
|
675
|
+
},
|
|
676
|
+
};
|
|
677
|
+
})
|
|
678
|
+
.filter((s) => s !== null);
|
|
679
|
+
const hasMore = endIndex < droppedSymbols.length;
|
|
680
|
+
const nextCursor = hasMore ? endIndex.toString() : undefined;
|
|
681
|
+
return {
|
|
682
|
+
spilloverHandle,
|
|
683
|
+
cursor: nextCursor,
|
|
684
|
+
hasMore,
|
|
685
|
+
symbols,
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
//# sourceMappingURL=slice.js.map
|