codesift-mcp 0.14.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/cli/commands-admin.d.ts +18 -0
- package/dist/cli/commands-admin.d.ts.map +1 -0
- package/dist/cli/commands-admin.js +187 -0
- package/dist/cli/commands-admin.js.map +1 -0
- package/dist/cli/commands-daemon.d.ts +42 -0
- package/dist/cli/commands-daemon.d.ts.map +1 -0
- package/dist/cli/commands-daemon.js +163 -0
- package/dist/cli/commands-daemon.js.map +1 -0
- package/dist/cli/commands-index.d.ts +12 -0
- package/dist/cli/commands-index.d.ts.map +1 -0
- package/dist/cli/commands-index.js +133 -0
- package/dist/cli/commands-index.js.map +1 -0
- package/dist/cli/commands-maintenance.d.ts +12 -0
- package/dist/cli/commands-maintenance.d.ts.map +1 -0
- package/dist/cli/commands-maintenance.js +409 -0
- package/dist/cli/commands-maintenance.js.map +1 -0
- package/dist/cli/commands-query.d.ts +21 -0
- package/dist/cli/commands-query.d.ts.map +1 -0
- package/dist/cli/commands-query.js +270 -0
- package/dist/cli/commands-query.js.map +1 -0
- package/dist/cli/commands.d.ts +2 -36
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +8 -867
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/embed-child.js +13 -2
- package/dist/cli/embed-child.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +5 -2
- package/dist/instructions.js.map +1 -1
- package/dist/parser/extractors/php-class-metadata.d.ts +10 -0
- package/dist/parser/extractors/php-class-metadata.d.ts.map +1 -0
- package/dist/parser/extractors/php-class-metadata.js +65 -0
- package/dist/parser/extractors/php-class-metadata.js.map +1 -0
- package/dist/parser/extractors/php-doc.d.ts +13 -0
- package/dist/parser/extractors/php-doc.d.ts.map +1 -0
- package/dist/parser/extractors/php-doc.js +39 -0
- package/dist/parser/extractors/php-doc.js.map +1 -0
- package/dist/parser/extractors/php-node-metadata.d.ts +26 -0
- package/dist/parser/extractors/php-node-metadata.d.ts.map +1 -0
- package/dist/parser/extractors/php-node-metadata.js +132 -0
- package/dist/parser/extractors/php-node-metadata.js.map +1 -0
- package/dist/parser/extractors/php-symbol-builders.d.ts +13 -0
- package/dist/parser/extractors/php-symbol-builders.d.ts.map +1 -0
- package/dist/parser/extractors/php-symbol-builders.js +58 -0
- package/dist/parser/extractors/php-symbol-builders.js.map +1 -0
- package/dist/parser/extractors/php-walker.d.ts +4 -0
- package/dist/parser/extractors/php-walker.d.ts.map +1 -0
- package/dist/parser/extractors/php-walker.js +238 -0
- package/dist/parser/extractors/php-walker.js.map +1 -0
- package/dist/parser/extractors/php.d.ts +2 -33
- package/dist/parser/extractors/php.d.ts.map +1 -1
- package/dist/parser/extractors/php.js +2 -747
- package/dist/parser/extractors/php.js.map +1 -1
- package/dist/register-tool-loaders.d.ts +11 -11
- package/dist/register-tool-loaders.d.ts.map +1 -1
- package/dist/register-tools/runtime.d.ts +11 -0
- package/dist/register-tools/runtime.d.ts.map +1 -1
- package/dist/register-tools/runtime.js +40 -0
- package/dist/register-tools/runtime.js.map +1 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +5 -1
- package/dist/register-tools.js.map +1 -1
- package/dist/retrieval/semantic-handlers.d.ts.map +1 -1
- package/dist/retrieval/semantic-handlers.js +10 -3
- package/dist/retrieval/semantic-handlers.js.map +1 -1
- package/dist/search/semantic.d.ts +2 -0
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +41 -9
- package/dist/search/semantic.js.map +1 -1
- package/dist/storage/chunk-store.d.ts +14 -2
- package/dist/storage/chunk-store.d.ts.map +1 -1
- package/dist/storage/chunk-store.js +214 -34
- package/dist/storage/chunk-store.js.map +1 -1
- package/dist/storage/embedding-store.d.ts +0 -12
- package/dist/storage/embedding-store.d.ts.map +1 -1
- package/dist/storage/embedding-store.js +69 -9
- package/dist/storage/embedding-store.js.map +1 -1
- package/dist/storage/index-cache.d.ts +12 -0
- package/dist/storage/index-cache.d.ts.map +1 -0
- package/dist/storage/index-cache.js +89 -0
- package/dist/storage/index-cache.js.map +1 -0
- package/dist/storage/index-json-mutations.d.ts +11 -0
- package/dist/storage/index-json-mutations.d.ts.map +1 -0
- package/dist/storage/index-json-mutations.js +93 -0
- package/dist/storage/index-json-mutations.js.map +1 -0
- package/dist/storage/index-migration.d.ts +22 -0
- package/dist/storage/index-migration.d.ts.map +1 -0
- package/dist/storage/index-migration.js +80 -0
- package/dist/storage/index-migration.js.map +1 -0
- package/dist/storage/index-store.d.ts +5 -61
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +33 -414
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/index-version.d.ts +39 -0
- package/dist/storage/index-version.d.ts.map +1 -0
- package/dist/storage/index-version.js +87 -0
- package/dist/storage/index-version.js.map +1 -0
- package/dist/storage/registry.d.ts +9 -1
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +169 -8
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/shared-embedding-cache.d.ts +23 -3
- package/dist/storage/shared-embedding-cache.d.ts.map +1 -1
- package/dist/storage/shared-embedding-cache.js +300 -45
- package/dist/storage/shared-embedding-cache.js.map +1 -1
- package/dist/storage/telemetry/config.d.ts.map +1 -1
- package/dist/storage/telemetry/config.js +3 -2
- package/dist/storage/telemetry/config.js.map +1 -1
- package/dist/storage/telemetry/retro-aggregator.d.ts +21 -0
- package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -1
- package/dist/storage/telemetry/retro-aggregator.js +58 -16
- package/dist/storage/telemetry/retro-aggregator.js.map +1 -1
- package/dist/storage/telemetry/sanitizer.d.ts +16 -0
- package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
- package/dist/storage/telemetry/sanitizer.js +2 -0
- package/dist/storage/telemetry/sanitizer.js.map +1 -1
- package/dist/storage/telemetry/uploader.d.ts +3 -1
- package/dist/storage/telemetry/uploader.d.ts.map +1 -1
- package/dist/storage/telemetry/uploader.js +158 -21
- package/dist/storage/telemetry/uploader.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts +8 -12
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +74 -1
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/tools/cross-repo-contract-adapters.d.ts +39 -0
- package/dist/tools/cross-repo-contract-adapters.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-adapters.js +70 -0
- package/dist/tools/cross-repo-contract-adapters.js.map +1 -0
- package/dist/tools/cross-repo-contract-group.d.ts +17 -0
- package/dist/tools/cross-repo-contract-group.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-group.js +89 -0
- package/dist/tools/cross-repo-contract-group.js.map +1 -0
- package/dist/tools/cross-repo-contract-matcher.d.ts +24 -0
- package/dist/tools/cross-repo-contract-matcher.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-matcher.js +134 -0
- package/dist/tools/cross-repo-contract-matcher.js.map +1 -0
- package/dist/tools/cross-repo-contract-resolver.d.ts +9 -0
- package/dist/tools/cross-repo-contract-resolver.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-resolver.js +86 -0
- package/dist/tools/cross-repo-contract-resolver.js.map +1 -0
- package/dist/tools/cross-repo-contract-tools.d.ts +12 -135
- package/dist/tools/cross-repo-contract-tools.d.ts.map +1 -1
- package/dist/tools/cross-repo-contract-tools.js +8 -589
- package/dist/tools/cross-repo-contract-tools.js.map +1 -1
- package/dist/tools/cross-repo-contract-types.d.ts +30 -0
- package/dist/tools/cross-repo-contract-types.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-types.js +3 -0
- package/dist/tools/cross-repo-contract-types.js.map +1 -0
- package/dist/tools/cross-repo-outbound-calls.d.ts +28 -0
- package/dist/tools/cross-repo-outbound-calls.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-calls.js +347 -0
- package/dist/tools/cross-repo-outbound-calls.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +2 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts +2 -0
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -1
- package/dist/tools/index-tools/file-indexer.js +3 -3
- package/dist/tools/index-tools/file-indexer.js.map +1 -1
- package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
- package/dist/tools/index-tools/folder-indexer.js +47 -2
- package/dist/tools/index-tools/folder-indexer.js.map +1 -1
- package/dist/tools/index-tools/parse.d.ts +12 -3
- package/dist/tools/index-tools/parse.d.ts.map +1 -1
- package/dist/tools/index-tools/parse.js +33 -8
- package/dist/tools/index-tools/parse.js.map +1 -1
- package/dist/tools/index-tools/registry.d.ts +19 -0
- package/dist/tools/index-tools/registry.d.ts.map +1 -1
- package/dist/tools/index-tools/registry.js +88 -2
- package/dist/tools/index-tools/registry.js.map +1 -1
- package/dist/tools/index-tools/state.d.ts +31 -0
- package/dist/tools/index-tools/state.d.ts.map +1 -1
- package/dist/tools/index-tools/state.js +53 -0
- package/dist/tools/index-tools/state.js.map +1 -1
- package/dist/tools/index-tools/types.d.ts +9 -0
- package/dist/tools/index-tools/types.d.ts.map +1 -1
- package/dist/tools/index-tools/watcher.js +3 -3
- package/dist/tools/index-tools/watcher.js.map +1 -1
- package/dist/tools/index-tools/worktree-seed.d.ts +44 -0
- package/dist/tools/index-tools/worktree-seed.d.ts.map +1 -0
- package/dist/tools/index-tools/worktree-seed.js +302 -0
- package/dist/tools/index-tools/worktree-seed.js.map +1 -0
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +3 -1
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/nest-ext-tools/graphql.d.ts +17 -0
- package/dist/tools/nest-ext-tools/graphql.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/graphql.js +54 -0
- package/dist/tools/nest-ext-tools/graphql.js.map +1 -0
- package/dist/tools/nest-ext-tools/microservice.d.ts +17 -0
- package/dist/tools/nest-ext-tools/microservice.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/microservice.js +51 -0
- package/dist/tools/nest-ext-tools/microservice.js.map +1 -0
- package/dist/tools/nest-ext-tools/openapi.d.ts +81 -0
- package/dist/tools/nest-ext-tools/openapi.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/openapi.js +254 -0
- package/dist/tools/nest-ext-tools/openapi.js.map +1 -0
- package/dist/tools/nest-ext-tools/queue.d.ts +27 -0
- package/dist/tools/nest-ext-tools/queue.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/queue.js +95 -0
- package/dist/tools/nest-ext-tools/queue.js.map +1 -0
- package/dist/tools/nest-ext-tools/schedule.d.ts +19 -0
- package/dist/tools/nest-ext-tools/schedule.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/schedule.js +89 -0
- package/dist/tools/nest-ext-tools/schedule.js.map +1 -0
- package/dist/tools/nest-ext-tools/scope.d.ts +19 -0
- package/dist/tools/nest-ext-tools/scope.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/scope.js +151 -0
- package/dist/tools/nest-ext-tools/scope.js.map +1 -0
- package/dist/tools/nest-ext-tools/shared.d.ts +33 -0
- package/dist/tools/nest-ext-tools/shared.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/shared.js +279 -0
- package/dist/tools/nest-ext-tools/shared.js.map +1 -0
- package/dist/tools/nest-ext-tools/typeorm.d.ts +22 -0
- package/dist/tools/nest-ext-tools/typeorm.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/typeorm.js +59 -0
- package/dist/tools/nest-ext-tools/typeorm.js.map +1 -0
- package/dist/tools/nest-ext-tools/websocket.d.ts +21 -0
- package/dist/tools/nest-ext-tools/websocket.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/websocket.js +70 -0
- package/dist/tools/nest-ext-tools/websocket.js.map +1 -0
- package/dist/tools/nest-ext-tools.d.ts +10 -204
- package/dist/tools/nest-ext-tools.d.ts.map +1 -1
- package/dist/tools/nest-ext-tools.js +10 -749
- package/dist/tools/nest-ext-tools.js.map +1 -1
- package/dist/tools/perf-tools.js +2 -2
- package/dist/tools/python-audit/checks/dead-code.d.ts +1 -1
- package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -1
- package/dist/tools/python-constants/constant-match.d.ts +5 -0
- package/dist/tools/python-constants/constant-match.d.ts.map +1 -0
- package/dist/tools/python-constants/constant-match.js +24 -0
- package/dist/tools/python-constants/constant-match.js.map +1 -0
- package/dist/tools/python-constants/file-context.d.ts +5 -0
- package/dist/tools/python-constants/file-context.d.ts.map +1 -0
- package/dist/tools/python-constants/file-context.js +91 -0
- package/dist/tools/python-constants/file-context.js.map +1 -0
- package/dist/tools/python-constants/function-defaults.d.ts +5 -0
- package/dist/tools/python-constants/function-defaults.d.ts.map +1 -0
- package/dist/tools/python-constants/function-defaults.js +98 -0
- package/dist/tools/python-constants/function-defaults.js.map +1 -0
- package/dist/tools/python-constants/model.d.ts +78 -0
- package/dist/tools/python-constants/model.d.ts.map +1 -0
- package/dist/tools/python-constants/model.js +2 -0
- package/dist/tools/python-constants/model.js.map +1 -0
- package/dist/tools/python-constants/syntax.d.ts +22 -0
- package/dist/tools/python-constants/syntax.d.ts.map +1 -0
- package/dist/tools/python-constants/syntax.js +93 -0
- package/dist/tools/python-constants/syntax.js.map +1 -0
- package/dist/tools/python-constants/value-resolver.d.ts +6 -0
- package/dist/tools/python-constants/value-resolver.d.ts.map +1 -0
- package/dist/tools/python-constants/value-resolver.js +320 -0
- package/dist/tools/python-constants/value-resolver.js.map +1 -0
- package/dist/tools/python-constants-tools.d.ts +3 -45
- package/dist/tools/python-constants-tools.d.ts.map +1 -1
- package/dist/tools/python-constants-tools.js +2 -505
- package/dist/tools/python-constants-tools.js.map +1 -1
- package/dist/tools/route-tools/django.d.ts +8 -0
- package/dist/tools/route-tools/django.d.ts.map +1 -0
- package/dist/tools/route-tools/django.js +52 -0
- package/dist/tools/route-tools/django.js.map +1 -0
- package/dist/tools/route-tools/express.d.ts +5 -0
- package/dist/tools/route-tools/express.d.ts.map +1 -0
- package/dist/tools/route-tools/express.js +33 -0
- package/dist/tools/route-tools/express.js.map +1 -0
- package/dist/tools/route-tools/file-sources.d.ts +7 -0
- package/dist/tools/route-tools/file-sources.d.ts.map +1 -0
- package/dist/tools/route-tools/file-sources.js +15 -0
- package/dist/tools/route-tools/file-sources.js.map +1 -0
- package/dist/tools/route-tools/handler-discovery.d.ts +4 -0
- package/dist/tools/route-tools/handler-discovery.d.ts.map +1 -0
- package/dist/tools/route-tools/handler-discovery.js +38 -0
- package/dist/tools/route-tools/handler-discovery.js.map +1 -0
- package/dist/tools/route-tools/hono.d.ts +5 -0
- package/dist/tools/route-tools/hono.d.ts.map +1 -0
- package/dist/tools/route-tools/hono.js +61 -0
- package/dist/tools/route-tools/hono.js.map +1 -0
- package/dist/tools/route-tools/ktor.d.ts +5 -0
- package/dist/tools/route-tools/ktor.d.ts.map +1 -0
- package/dist/tools/route-tools/ktor.js +76 -0
- package/dist/tools/route-tools/ktor.js.map +1 -0
- package/dist/tools/route-tools/laravel.d.ts +5 -0
- package/dist/tools/route-tools/laravel.d.ts.map +1 -0
- package/dist/tools/route-tools/laravel.js +45 -0
- package/dist/tools/route-tools/laravel.js.map +1 -0
- package/dist/tools/route-tools/mermaid-call-chain.d.ts +3 -0
- package/dist/tools/route-tools/mermaid-call-chain.d.ts.map +1 -0
- package/dist/tools/route-tools/mermaid-call-chain.js +50 -0
- package/dist/tools/route-tools/mermaid-call-chain.js.map +1 -0
- package/dist/tools/route-tools/nest.d.ts +5 -0
- package/dist/tools/route-tools/nest.d.ts.map +1 -0
- package/dist/tools/route-tools/nest.js +75 -0
- package/dist/tools/route-tools/nest.js.map +1 -0
- package/dist/tools/route-tools/next-trace.d.ts +4 -0
- package/dist/tools/route-tools/next-trace.d.ts.map +1 -0
- package/dist/tools/route-tools/next-trace.js +48 -0
- package/dist/tools/route-tools/next-trace.js.map +1 -0
- package/dist/tools/route-tools/next.d.ts +7 -0
- package/dist/tools/route-tools/next.d.ts.map +1 -0
- package/dist/tools/route-tools/next.js +77 -0
- package/dist/tools/route-tools/next.js.map +1 -0
- package/dist/tools/route-tools/python-decorators.d.ts +7 -0
- package/dist/tools/route-tools/python-decorators.d.ts.map +1 -0
- package/dist/tools/route-tools/python-decorators.js +53 -0
- package/dist/tools/route-tools/python-decorators.js.map +1 -0
- package/dist/tools/route-tools/route-mermaid.d.ts +4 -0
- package/dist/tools/route-tools/route-mermaid.d.ts.map +1 -0
- package/dist/tools/route-tools/route-mermaid.js +53 -0
- package/dist/tools/route-tools/route-mermaid.js.map +1 -0
- package/dist/tools/route-tools/spring-kotlin.d.ts +5 -0
- package/dist/tools/route-tools/spring-kotlin.d.ts.map +1 -0
- package/dist/tools/route-tools/spring-kotlin.js +52 -0
- package/dist/tools/route-tools/spring-kotlin.js.map +1 -0
- package/dist/tools/route-tools/trace-analysis.d.ts +4 -0
- package/dist/tools/route-tools/trace-analysis.d.ts.map +1 -0
- package/dist/tools/route-tools/trace-analysis.js +37 -0
- package/dist/tools/route-tools/trace-analysis.js.map +1 -0
- package/dist/tools/route-tools/trace-route.d.ts +6 -0
- package/dist/tools/route-tools/trace-route.d.ts.map +1 -0
- package/dist/tools/route-tools/trace-route.js +53 -0
- package/dist/tools/route-tools/trace-route.js.map +1 -0
- package/dist/tools/route-tools/types.d.ts +35 -0
- package/dist/tools/route-tools/types.d.ts.map +1 -0
- package/dist/tools/route-tools/types.js +2 -0
- package/dist/tools/route-tools/types.js.map +1 -0
- package/dist/tools/route-tools/yii2.d.ts +5 -0
- package/dist/tools/route-tools/yii2.d.ts.map +1 -0
- package/dist/tools/route-tools/yii2.js +73 -0
- package/dist/tools/route-tools/yii2.js.map +1 -0
- package/dist/tools/route-tools.d.ts +7 -49
- package/dist/tools/route-tools.d.ts.map +1 -1
- package/dist/tools/route-tools.js +5 -978
- package/dist/tools/route-tools.js.map +1 -1
- package/dist/tools/symbol-analysis-tools.d.ts +81 -0
- package/dist/tools/symbol-analysis-tools.d.ts.map +1 -0
- package/dist/tools/symbol-analysis-tools.js +327 -0
- package/dist/tools/symbol-analysis-tools.js.map +1 -0
- package/dist/tools/symbol-context-tools.d.ts +68 -0
- package/dist/tools/symbol-context-tools.d.ts.map +1 -0
- package/dist/tools/symbol-context-tools.js +232 -0
- package/dist/tools/symbol-context-tools.js.map +1 -0
- package/dist/tools/symbol-lookup-tools.d.ts +77 -0
- package/dist/tools/symbol-lookup-tools.d.ts.map +1 -0
- package/dist/tools/symbol-lookup-tools.js +305 -0
- package/dist/tools/symbol-lookup-tools.js.map +1 -0
- package/dist/tools/symbol-reference-tools.d.ts +38 -0
- package/dist/tools/symbol-reference-tools.d.ts.map +1 -0
- package/dist/tools/symbol-reference-tools.js +253 -0
- package/dist/tools/symbol-reference-tools.js.map +1 -0
- package/dist/tools/symbol-tool-internals.d.ts +9 -0
- package/dist/tools/symbol-tool-internals.d.ts.map +1 -0
- package/dist/tools/symbol-tool-internals.js +47 -0
- package/dist/tools/symbol-tool-internals.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +11 -270
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +7 -1131
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/taint/python-context.d.ts +10 -0
- package/dist/tools/taint/python-context.d.ts.map +1 -0
- package/dist/tools/taint/python-context.js +150 -0
- package/dist/tools/taint/python-context.js.map +1 -0
- package/dist/tools/taint/taint-analyzer.d.ts +2 -0
- package/dist/tools/taint/taint-analyzer.d.ts.map +1 -0
- package/dist/tools/taint/taint-analyzer.js +2 -0
- package/dist/tools/taint/taint-analyzer.js.map +1 -0
- package/dist/tools/taint/taint-expression.d.ts +18 -0
- package/dist/tools/taint/taint-expression.d.ts.map +1 -0
- package/dist/tools/taint/taint-expression.js +265 -0
- package/dist/tools/taint/taint-expression.js.map +1 -0
- package/dist/tools/taint/taint-flow.d.ts +10 -0
- package/dist/tools/taint/taint-flow.d.ts.map +1 -0
- package/dist/tools/taint/taint-flow.js +178 -0
- package/dist/tools/taint/taint-flow.js.map +1 -0
- package/dist/tools/taint/taint-model.d.ts +113 -0
- package/dist/tools/taint/taint-model.d.ts.map +1 -0
- package/dist/tools/taint/taint-model.js +277 -0
- package/dist/tools/taint/taint-model.js.map +1 -0
- package/dist/tools/taint-tools.d.ts +2 -34
- package/dist/tools/taint-tools.d.ts.map +1 -1
- package/dist/tools/taint-tools.js +2 -852
- package/dist/tools/taint-tools.js.map +1 -1
- package/dist/tools/typescript-constants/file-context.d.ts +7 -0
- package/dist/tools/typescript-constants/file-context.d.ts.map +1 -0
- package/dist/tools/typescript-constants/file-context.js +219 -0
- package/dist/tools/typescript-constants/file-context.js.map +1 -0
- package/dist/tools/typescript-constants/symbol-resolver.d.ts +7 -0
- package/dist/tools/typescript-constants/symbol-resolver.d.ts.map +1 -0
- package/dist/tools/typescript-constants/symbol-resolver.js +165 -0
- package/dist/tools/typescript-constants/symbol-resolver.js.map +1 -0
- package/dist/tools/typescript-constants/types.d.ts +44 -0
- package/dist/tools/typescript-constants/types.d.ts.map +1 -0
- package/dist/tools/typescript-constants/types.js +2 -0
- package/dist/tools/typescript-constants/types.js.map +1 -0
- package/dist/tools/typescript-constants/value-evaluator.d.ts +8 -0
- package/dist/tools/typescript-constants/value-evaluator.d.ts.map +1 -0
- package/dist/tools/typescript-constants/value-evaluator.js +404 -0
- package/dist/tools/typescript-constants/value-evaluator.js.map +1 -0
- package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
- package/dist/tools/typescript-constants-tools.js +19 -709
- package/dist/tools/typescript-constants-tools.js.map +1 -1
- package/dist/utils/import-graph/collect.d.ts +5 -0
- package/dist/utils/import-graph/collect.d.ts.map +1 -0
- package/dist/utils/import-graph/collect.js +47 -0
- package/dist/utils/import-graph/collect.js.map +1 -0
- package/dist/utils/import-graph/edge-accumulator.d.ts +7 -0
- package/dist/utils/import-graph/edge-accumulator.d.ts.map +1 -0
- package/dist/utils/import-graph/edge-accumulator.js +47 -0
- package/dist/utils/import-graph/edge-accumulator.js.map +1 -0
- package/dist/utils/import-graph/language-imports.d.ts +6 -0
- package/dist/utils/import-graph/language-imports.d.ts.map +1 -0
- package/dist/utils/import-graph/language-imports.js +84 -0
- package/dist/utils/import-graph/language-imports.js.map +1 -0
- package/dist/utils/import-graph/metrics.d.ts +6 -0
- package/dist/utils/import-graph/metrics.d.ts.map +1 -0
- package/dist/utils/import-graph/metrics.js +51 -0
- package/dist/utils/import-graph/metrics.js.map +1 -0
- package/dist/utils/import-graph/path-map.d.ts +7 -0
- package/dist/utils/import-graph/path-map.d.ts.map +1 -0
- package/dist/utils/import-graph/path-map.js +56 -0
- package/dist/utils/import-graph/path-map.js.map +1 -0
- package/dist/utils/import-graph/python-php-edge-collectors.d.ts +5 -0
- package/dist/utils/import-graph/python-php-edge-collectors.d.ts.map +1 -0
- package/dist/utils/import-graph/python-php-edge-collectors.js +56 -0
- package/dist/utils/import-graph/python-php-edge-collectors.js.map +1 -0
- package/dist/utils/import-graph/source-edge-collector.d.ts +13 -0
- package/dist/utils/import-graph/source-edge-collector.d.ts.map +1 -0
- package/dist/utils/import-graph/source-edge-collector.js +42 -0
- package/dist/utils/import-graph/source-edge-collector.js.map +1 -0
- package/dist/utils/import-graph/source-imports.d.ts +5 -0
- package/dist/utils/import-graph/source-imports.d.ts.map +1 -0
- package/dist/utils/import-graph/source-imports.js +33 -0
- package/dist/utils/import-graph/source-imports.js.map +1 -0
- package/dist/utils/import-graph/types.d.ts +15 -0
- package/dist/utils/import-graph/types.d.ts.map +1 -0
- package/dist/utils/import-graph/types.js +2 -0
- package/dist/utils/import-graph/types.js.map +1 -0
- package/dist/utils/import-graph/typescript-edge-collector.d.ts +7 -0
- package/dist/utils/import-graph/typescript-edge-collector.d.ts.map +1 -0
- package/dist/utils/import-graph/typescript-edge-collector.js +58 -0
- package/dist/utils/import-graph/typescript-edge-collector.js.map +1 -0
- package/dist/utils/import-graph/workspace-alias.d.ts +7 -0
- package/dist/utils/import-graph/workspace-alias.d.ts.map +1 -0
- package/dist/utils/import-graph/workspace-alias.js +95 -0
- package/dist/utils/import-graph/workspace-alias.js.map +1 -0
- package/dist/utils/import-graph/workspace-entry.d.ts +3 -0
- package/dist/utils/import-graph/workspace-entry.d.ts.map +1 -0
- package/dist/utils/import-graph/workspace-entry.js +81 -0
- package/dist/utils/import-graph/workspace-entry.js.map +1 -0
- package/dist/utils/import-graph.d.ts +10 -94
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +6 -702
- package/dist/utils/import-graph.js.map +1 -1
- package/package.json +1 -1
- package/rules/codesift.md +11 -2
- package/rules/codesift.mdc +11 -2
- package/rules/codex.md +11 -2
- package/rules/gemini.md +11 -2
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { loadConfig } from "../config.js";
|
|
4
|
+
import { searchBM25 } from "../search/bm25.js";
|
|
5
|
+
import { extractHookNames, REACT_STDLIB_HOOKS } from "./react-tools.js";
|
|
6
|
+
import { resolveSearchHit, } from "./symbol-lookup-tools.js";
|
|
7
|
+
import { findReferences } from "./symbol-reference-tools.js";
|
|
8
|
+
import { requireBM25Index, requireCodeIndex, } from "./symbol-tool-internals.js";
|
|
9
|
+
/** Format references as compact string for MCP output. Groups by file to avoid repeating paths. */
|
|
10
|
+
export function formatRefsCompact(refs) {
|
|
11
|
+
if (refs.length === 0)
|
|
12
|
+
return "";
|
|
13
|
+
// Group by file
|
|
14
|
+
const groups = new Map();
|
|
15
|
+
for (const r of refs) {
|
|
16
|
+
let g = groups.get(r.file);
|
|
17
|
+
if (!g) {
|
|
18
|
+
g = [];
|
|
19
|
+
groups.set(r.file, g);
|
|
20
|
+
}
|
|
21
|
+
g.push(` ${r.line}: ${r.context}`);
|
|
22
|
+
}
|
|
23
|
+
if (groups.size === refs.length) {
|
|
24
|
+
// Each file has 1 ref — flat is fine
|
|
25
|
+
return refs.map((r) => `${r.file}:${r.line}: ${r.context}`).join("\n");
|
|
26
|
+
}
|
|
27
|
+
const parts = [];
|
|
28
|
+
for (const [file, lines] of groups) {
|
|
29
|
+
parts.push(`${file}\n${lines.join("\n")}`);
|
|
30
|
+
}
|
|
31
|
+
return parts.join("\n");
|
|
32
|
+
}
|
|
33
|
+
/** Format a CodeSymbol as compact text: header line + source. ~70% less tokens than JSON. */
|
|
34
|
+
export function formatSymbolCompact(sym) {
|
|
35
|
+
const loc = `${sym.file}:${sym.start_line}-${sym.end_line}`;
|
|
36
|
+
const sig = sym.signature ? ` ${sym.signature}` : "";
|
|
37
|
+
const header = `${loc} ${sym.kind} ${sym.name}${sig}`;
|
|
38
|
+
if (!sym.source)
|
|
39
|
+
return header;
|
|
40
|
+
return `${header}\n${sym.source}`;
|
|
41
|
+
}
|
|
42
|
+
/** Format multiple CodeSymbols as compact text, separated by blank lines. */
|
|
43
|
+
export function formatSymbolsCompact(syms) {
|
|
44
|
+
return syms.map(formatSymbolCompact).join("\n\n");
|
|
45
|
+
}
|
|
46
|
+
/** Format ContextBundle as compact text. */
|
|
47
|
+
export function formatBundleCompact(bundle) {
|
|
48
|
+
const parts = [];
|
|
49
|
+
parts.push(formatSymbolCompact(bundle.symbol));
|
|
50
|
+
if (bundle.imports.length > 0) {
|
|
51
|
+
parts.push(`\n--- imports ---\n${bundle.imports.join("\n")}`);
|
|
52
|
+
}
|
|
53
|
+
if (bundle.siblings.length > 0) {
|
|
54
|
+
const sibLines = bundle.siblings.map((s) => ` ${s.kind} ${s.name} :${s.start_line}-${s.end_line}`);
|
|
55
|
+
parts.push(`\n--- siblings ---\n${sibLines.join("\n")}`);
|
|
56
|
+
}
|
|
57
|
+
if (bundle.types_used.length > 0) {
|
|
58
|
+
parts.push(`\n--- types used ---\n${bundle.types_used.join(", ")}`);
|
|
59
|
+
}
|
|
60
|
+
return parts.join("");
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Search for a symbol by query and return it with full source.
|
|
64
|
+
* Optionally includes references across the codebase.
|
|
65
|
+
*/
|
|
66
|
+
export async function findAndShow(repo, query, includeRefs) {
|
|
67
|
+
const bm25Index = await requireBM25Index(repo);
|
|
68
|
+
const config = loadConfig();
|
|
69
|
+
const results = searchBM25(bm25Index, query, 1, config.bm25FieldWeights);
|
|
70
|
+
const topResult = results[0];
|
|
71
|
+
if (!topResult)
|
|
72
|
+
return null;
|
|
73
|
+
const resolved = await resolveSearchHit(repo, topResult.symbol);
|
|
74
|
+
if (!resolved)
|
|
75
|
+
return null;
|
|
76
|
+
const { symbol: fullSymbol, ambiguity } = resolved;
|
|
77
|
+
if (includeRefs) {
|
|
78
|
+
const references = await findReferences(repo, fullSymbol.name);
|
|
79
|
+
return { symbol: fullSymbol, references, id_ambiguity: ambiguity };
|
|
80
|
+
}
|
|
81
|
+
return { symbol: fullSymbol, id_ambiguity: ambiguity };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Extract full import lines from file source.
|
|
85
|
+
*/
|
|
86
|
+
function extractImportLines(source) {
|
|
87
|
+
const lines = source.split("\n");
|
|
88
|
+
return lines.filter((line) => {
|
|
89
|
+
const trimmed = line.trim();
|
|
90
|
+
return trimmed.startsWith("import ") || (trimmed.startsWith("const ") && trimmed.includes("require("));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get a symbol with its file's imports and sibling symbols in one call.
|
|
95
|
+
* Saves 2-3 round-trips vs get_symbol + search_text(imports) + get_file_outline.
|
|
96
|
+
*/
|
|
97
|
+
export async function getContextBundle(repo, symbolName) {
|
|
98
|
+
const bm25Index = await requireBM25Index(repo);
|
|
99
|
+
const config = loadConfig();
|
|
100
|
+
const results = searchBM25(bm25Index, symbolName, 1, config.bm25FieldWeights);
|
|
101
|
+
const topResult = results[0];
|
|
102
|
+
if (!topResult)
|
|
103
|
+
return null;
|
|
104
|
+
const index = await requireCodeIndex(repo);
|
|
105
|
+
// Get full symbol with source
|
|
106
|
+
const resolved = await resolveSearchHit(repo, topResult.symbol);
|
|
107
|
+
if (!resolved)
|
|
108
|
+
return null;
|
|
109
|
+
const { symbol: fullSymbol, ambiguity } = resolved;
|
|
110
|
+
// Read the file to extract imports
|
|
111
|
+
let fileSource;
|
|
112
|
+
try {
|
|
113
|
+
fileSource = await readFile(join(index.root, fullSymbol.file), "utf-8");
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return {
|
|
117
|
+
symbol: fullSymbol,
|
|
118
|
+
imports: [],
|
|
119
|
+
siblings: [],
|
|
120
|
+
types_used: [],
|
|
121
|
+
id_ambiguity: ambiguity,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const imports = extractImportLines(fileSource);
|
|
125
|
+
// Get sibling symbols (other symbols in the same file)
|
|
126
|
+
const siblings = index.symbols
|
|
127
|
+
.filter((s) => s.file === fullSymbol.file && s.id !== fullSymbol.id)
|
|
128
|
+
.map((s) => ({
|
|
129
|
+
name: s.name,
|
|
130
|
+
kind: s.kind,
|
|
131
|
+
start_line: s.start_line,
|
|
132
|
+
end_line: s.end_line,
|
|
133
|
+
}));
|
|
134
|
+
// Extract type names used in the symbol's source
|
|
135
|
+
const typesUsed = extractTypesUsed(fullSymbol.source ?? "", index.symbols);
|
|
136
|
+
// React-specific enrichment for components
|
|
137
|
+
const bundle = {
|
|
138
|
+
symbol: fullSymbol,
|
|
139
|
+
imports,
|
|
140
|
+
siblings,
|
|
141
|
+
types_used: typesUsed,
|
|
142
|
+
id_ambiguity: ambiguity,
|
|
143
|
+
};
|
|
144
|
+
if (fullSymbol.kind === "component") {
|
|
145
|
+
bundle.react_context = buildReactContext(fullSymbol, index.symbols);
|
|
146
|
+
}
|
|
147
|
+
return bundle;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Build React-specific context for a component symbol:
|
|
151
|
+
* hooks used, child/parent components via JSX, wrapper pattern.
|
|
152
|
+
*
|
|
153
|
+
* Uses REACT_STDLIB_HOOKS imported from react-tools.js as the single source
|
|
154
|
+
* of truth for stdlib hook detection (CQ14 — no duplication).
|
|
155
|
+
*/
|
|
156
|
+
function buildReactContext(component, allSymbols) {
|
|
157
|
+
const source = component.source ?? "";
|
|
158
|
+
// Extract hooks used (uses shared extractHookNames from react-tools.ts — CQ14)
|
|
159
|
+
const hooks_used = [...extractHookNames(source)].map((name) => ({
|
|
160
|
+
name,
|
|
161
|
+
is_stdlib: REACT_STDLIB_HOOKS.has(name),
|
|
162
|
+
}));
|
|
163
|
+
// Extract child components from JSX (<PascalCase>)
|
|
164
|
+
const childSet = new Set();
|
|
165
|
+
const jsxPattern = /<([A-Z][a-zA-Z0-9_$]*)\b/g;
|
|
166
|
+
let m;
|
|
167
|
+
while ((m = jsxPattern.exec(source)) !== null) {
|
|
168
|
+
const name = m[1];
|
|
169
|
+
if (name !== component.name)
|
|
170
|
+
childSet.add(name);
|
|
171
|
+
}
|
|
172
|
+
const child_components = [...childSet].sort();
|
|
173
|
+
// Extract parent components: find other components whose source uses <ThisComponent>
|
|
174
|
+
const escapedComponentName = component.name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
175
|
+
const ownPattern = new RegExp(`<${escapedComponentName}\\b`);
|
|
176
|
+
const parent_components = allSymbols
|
|
177
|
+
.filter((s) => s.kind === "component" &&
|
|
178
|
+
s.id !== component.id &&
|
|
179
|
+
s.name !== component.name &&
|
|
180
|
+
s.source &&
|
|
181
|
+
ownPattern.test(s.source))
|
|
182
|
+
.map((s) => s.name);
|
|
183
|
+
// Detect wrapper pattern from source — supports TypeScript generics:
|
|
184
|
+
// forwardRef<HTMLDivElement, Props>(...), memo<Props>(...) (Item 9)
|
|
185
|
+
let wrapper = null;
|
|
186
|
+
if (/\b(?:React\.)?memo\s*(?:<[^>]+>)?\s*\(/.test(source))
|
|
187
|
+
wrapper = "memo";
|
|
188
|
+
else if (/\b(?:React\.)?forwardRef\s*(?:<[^>]+>)?\s*\(/.test(source))
|
|
189
|
+
wrapper = "forwardRef";
|
|
190
|
+
else if (/\b(?:React\.)?lazy\s*(?:<[^>]+>)?\s*\(/.test(source))
|
|
191
|
+
wrapper = "lazy";
|
|
192
|
+
// Extract props type from signature: (props: MyProps) or ({ a, b }: Props)
|
|
193
|
+
let props_type = null;
|
|
194
|
+
const sig = component.signature ?? "";
|
|
195
|
+
// Pattern: (props: TypeName) or (arg: TypeName) or ({ ... }: TypeName)
|
|
196
|
+
const propsMatch = sig.match(/\(\s*(?:\{[^}]*\}|\w+)\s*:\s*([A-Z]\w*)/);
|
|
197
|
+
if (propsMatch) {
|
|
198
|
+
props_type = propsMatch[1];
|
|
199
|
+
}
|
|
200
|
+
// Resolve props interface body when type name found in the index (Tier 4 — Item 16).
|
|
201
|
+
// Look for an interface or type alias with the same name as props_type.
|
|
202
|
+
let props_interface_source = null;
|
|
203
|
+
if (props_type) {
|
|
204
|
+
const declarations = allSymbols.filter((s) => (s.kind === "interface" || s.kind === "type") && s.name === props_type);
|
|
205
|
+
const decl = declarations.find((s) => s.file === component.file) ?? declarations[0];
|
|
206
|
+
if (decl?.source) {
|
|
207
|
+
// Cap to 800 chars to keep bundle compact
|
|
208
|
+
props_interface_source = decl.source.length > 800
|
|
209
|
+
? decl.source.slice(0, 800) + "..."
|
|
210
|
+
: decl.source;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return { props_type, props_interface_source, hooks_used, child_components, parent_components, wrapper };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract type/interface names referenced in source by matching against known symbols.
|
|
217
|
+
*/
|
|
218
|
+
function extractTypesUsed(source, allSymbols) {
|
|
219
|
+
const typeNames = new Set(allSymbols
|
|
220
|
+
.filter((s) => (s.kind === "interface" || s.kind === "type" || s.kind === "enum") && s.name.length >= 3)
|
|
221
|
+
.map((s) => s.name));
|
|
222
|
+
if (typeNames.size === 0)
|
|
223
|
+
return [];
|
|
224
|
+
const used = new Set();
|
|
225
|
+
for (const match of source.matchAll(/[$_\p{ID_Start}][$_\u200C\u200D\p{ID_Continue}]*/gu)) {
|
|
226
|
+
const name = match[0];
|
|
227
|
+
if (typeNames.has(name))
|
|
228
|
+
used.add(name);
|
|
229
|
+
}
|
|
230
|
+
return [...used].sort();
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=symbol-context-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-context-tools.js","sourceRoot":"","sources":["../../src/tools/symbol-context-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { CodeSymbol, SymbolKind } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Best-effort symbol NAME out of whatever the caller passed.
|
|
4
|
+
*
|
|
5
|
+
* Symbol IDs end in the declaration line (`repo:file:name:LINE`), so naively
|
|
6
|
+
* taking the last segment yields "42" and matches nothing — every suggestion for
|
|
7
|
+
* a well-formed-but-stale id was silently useless. Skip trailing numeric
|
|
8
|
+
* segments, then fall back to the last non-empty one.
|
|
9
|
+
*/
|
|
10
|
+
export declare function extractSymbolNameGuess(requestedId: string): string;
|
|
11
|
+
export declare function resolveSymbolIdExact(repo: string, requestedId: string): Promise<string | null>;
|
|
12
|
+
export declare function findSimilarSymbols(repo: string, requestedId: string, limit?: number): Promise<Array<{
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
kind: string;
|
|
16
|
+
file: string;
|
|
17
|
+
start_line: number;
|
|
18
|
+
}>>;
|
|
19
|
+
/**
|
|
20
|
+
* Retrieve a single symbol by ID with fresh source from disk.
|
|
21
|
+
* When include_related is true (default), auto-prefetches:
|
|
22
|
+
* - children (for classes/interfaces) — saves follow-up get_symbols call
|
|
23
|
+
* - symbols in the same file that reference this symbol — saves find_references call
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Raised when one id maps to several distinct symbols.
|
|
27
|
+
*
|
|
28
|
+
* A named type rather than a bare `Error` because two callers must tell this apart from a real
|
|
29
|
+
* failure, and matching on message text would break the moment the wording changes. Structural
|
|
30
|
+
* check, not `instanceof`: a duplicated module instance across a worker or bundler boundary makes
|
|
31
|
+
* `instanceof` false for an object that is in every observable way the right error — the same
|
|
32
|
+
* trap `isIndexStorageError` documents in the storage layer.
|
|
33
|
+
*/
|
|
34
|
+
export declare class AmbiguousSymbolIdError extends Error {
|
|
35
|
+
constructor(message: string);
|
|
36
|
+
}
|
|
37
|
+
export declare function isAmbiguousSymbolIdError(err: unknown): err is AmbiguousSymbolIdError;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a search hit to its full symbol, tolerating an ambiguous id.
|
|
40
|
+
*
|
|
41
|
+
* `getSymbol` throwing on a colliding id is right when a caller supplies one: it named a specific
|
|
42
|
+
* symbol and must not silently receive a different one. Here nobody supplied it — the id was read
|
|
43
|
+
* back off a BM25 hit whose symbol this function already holds. Failing an entire search because
|
|
44
|
+
* its top hit happens to sit in a minified bundle would make the collision a worse answer than the
|
|
45
|
+
* silent substitution it replaced, and it would hit `find_and_show` and `get_context_bundle`, the
|
|
46
|
+
* two tools the H7/H8 hints steer agents toward. Falling back to the hit is not a guess: it is the
|
|
47
|
+
* result the search actually returned.
|
|
48
|
+
*/
|
|
49
|
+
export interface SymbolIdAmbiguity {
|
|
50
|
+
/** Always present. `ambiguous` means the answer is the search's top hit, not a unique resolution. */
|
|
51
|
+
status: "unique" | "ambiguous";
|
|
52
|
+
/** Set only when ambiguous: how many distinct symbols share the id. */
|
|
53
|
+
shared_by?: number;
|
|
54
|
+
/** Set only when ambiguous: the other candidates, so the caller can pick deliberately. */
|
|
55
|
+
candidates?: Array<{
|
|
56
|
+
name: string;
|
|
57
|
+
kind: SymbolKind;
|
|
58
|
+
file: string;
|
|
59
|
+
start_line: number;
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
export declare function resolveSearchHit(repo: string, hit: CodeSymbol): Promise<{
|
|
63
|
+
symbol: CodeSymbol;
|
|
64
|
+
ambiguity: SymbolIdAmbiguity;
|
|
65
|
+
} | null>;
|
|
66
|
+
export declare function getSymbol(repo: string, symbolId: string, options?: {
|
|
67
|
+
include_related?: boolean;
|
|
68
|
+
}): Promise<{
|
|
69
|
+
symbol: CodeSymbol;
|
|
70
|
+
related?: CodeSymbol[];
|
|
71
|
+
} | null>;
|
|
72
|
+
/**
|
|
73
|
+
* Retrieve multiple symbols by ID with fresh source from disk.
|
|
74
|
+
* Groups reads by file to minimize disk I/O.
|
|
75
|
+
*/
|
|
76
|
+
export declare function getSymbols(repo: string, symbolIds: string[]): Promise<CodeSymbol[]>;
|
|
77
|
+
//# sourceMappingURL=symbol-lookup-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-lookup-tools.d.ts","sourceRoot":"","sources":["../../src/tools/symbol-lookup-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI1D;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,SAAI,GACR,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA4B9F;AAkED;;;;;GAKG;AACH;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,sBAAsB,CAMpF;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,iBAAiB;IAChC,qGAAqG;IACrG,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1F;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,UAAU,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,GAAG,IAAI,CAAC,CAkBtE;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACtC,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA0DhE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CA4FvB"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { open, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
4
|
+
import { requireCodeIndex } from "./symbol-tool-internals.js";
|
|
5
|
+
/**
|
|
6
|
+
* Best-effort symbol NAME out of whatever the caller passed.
|
|
7
|
+
*
|
|
8
|
+
* Symbol IDs end in the declaration line (`repo:file:name:LINE`), so naively
|
|
9
|
+
* taking the last segment yields "42" and matches nothing — every suggestion for
|
|
10
|
+
* a well-formed-but-stale id was silently useless. Skip trailing numeric
|
|
11
|
+
* segments, then fall back to the last non-empty one.
|
|
12
|
+
*/
|
|
13
|
+
export function extractSymbolNameGuess(requestedId) {
|
|
14
|
+
const parts = requestedId.split(/[:#/.]/).map((p) => p.trim()).filter(Boolean);
|
|
15
|
+
for (let i = parts.length - 1; i >= 0; i--) {
|
|
16
|
+
const p = parts[i];
|
|
17
|
+
if (!/^\d+$/.test(p))
|
|
18
|
+
return p;
|
|
19
|
+
}
|
|
20
|
+
return requestedId.trim();
|
|
21
|
+
}
|
|
22
|
+
export async function resolveSymbolIdExact(repo, requestedId) {
|
|
23
|
+
const nameGuess = extractSymbolNameGuess(requestedId);
|
|
24
|
+
if (!nameGuess)
|
|
25
|
+
return null;
|
|
26
|
+
const index = await getCodeIndex(repo, { skipFreshness: true });
|
|
27
|
+
if (!index)
|
|
28
|
+
return null;
|
|
29
|
+
let match = null;
|
|
30
|
+
for (const s of index.symbols) {
|
|
31
|
+
if (s.name !== nameGuess)
|
|
32
|
+
continue;
|
|
33
|
+
if (match)
|
|
34
|
+
return null; // ambiguous — let the caller show suggestions
|
|
35
|
+
match = s.id;
|
|
36
|
+
}
|
|
37
|
+
return match;
|
|
38
|
+
}
|
|
39
|
+
export async function findSimilarSymbols(repo, requestedId, limit = 3) {
|
|
40
|
+
const index = await getCodeIndex(repo, { skipFreshness: true });
|
|
41
|
+
if (!index)
|
|
42
|
+
return [];
|
|
43
|
+
const nameGuess = extractSymbolNameGuess(requestedId);
|
|
44
|
+
if (!nameGuess)
|
|
45
|
+
return [];
|
|
46
|
+
const lower = nameGuess.toLowerCase();
|
|
47
|
+
const exact = [];
|
|
48
|
+
const prefix = [];
|
|
49
|
+
const substr = [];
|
|
50
|
+
for (const s of index.symbols) {
|
|
51
|
+
const sn = s.name.toLowerCase();
|
|
52
|
+
if (sn === lower)
|
|
53
|
+
exact.push(s);
|
|
54
|
+
else if (sn.startsWith(lower) || lower.startsWith(sn))
|
|
55
|
+
prefix.push(s);
|
|
56
|
+
else if (sn.includes(lower) || lower.includes(sn))
|
|
57
|
+
substr.push(s);
|
|
58
|
+
if (exact.length >= limit)
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
const ranked = [...exact, ...prefix, ...substr].slice(0, limit);
|
|
62
|
+
return ranked.map((s) => ({
|
|
63
|
+
id: s.id,
|
|
64
|
+
name: s.name,
|
|
65
|
+
kind: s.kind,
|
|
66
|
+
file: s.file,
|
|
67
|
+
start_line: s.start_line,
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Strip internal/BM25 fields from CodeSymbol for leaner output.
|
|
72
|
+
* Removes: repo, tokens, start_col, end_col. Shortens id (strips repo prefix).
|
|
73
|
+
*/
|
|
74
|
+
function stripSymbol(sym) {
|
|
75
|
+
const { repo: _repo, tokens: _tokens, start_col: _sc, end_col: _ec, start_byte: _sb, end_byte: _eb, id, ...rest } = sym;
|
|
76
|
+
// Strip "local/reponame:" prefix from id
|
|
77
|
+
const shortId = id.includes(":") ? id.slice(id.indexOf(":") + 1) : id;
|
|
78
|
+
return { ...rest, id: shortId };
|
|
79
|
+
}
|
|
80
|
+
function matchesSymbolId(symbol, requestedId) {
|
|
81
|
+
if (symbol.id === requestedId)
|
|
82
|
+
return true;
|
|
83
|
+
const separator = symbol.id.indexOf(":");
|
|
84
|
+
return separator >= 0 && symbol.id.slice(separator + 1) === requestedId;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Read a source file and extract lines for a symbol (1-based, inclusive).
|
|
88
|
+
* Uses byte offsets when available for precise reads without loading full file.
|
|
89
|
+
* Returns undefined if the file cannot be read.
|
|
90
|
+
*/
|
|
91
|
+
async function extractSource(repoRoot, file, startLine, endLine, startByte, endByte) {
|
|
92
|
+
const filePath = join(repoRoot, file);
|
|
93
|
+
// Fast path: use byte offsets to read exact range
|
|
94
|
+
if (startByte != null && endByte != null && endByte > startByte) {
|
|
95
|
+
try {
|
|
96
|
+
const fh = await open(filePath, "r");
|
|
97
|
+
try {
|
|
98
|
+
const length = endByte - startByte;
|
|
99
|
+
const buf = Buffer.alloc(length);
|
|
100
|
+
let total = 0;
|
|
101
|
+
while (total < length) {
|
|
102
|
+
const { bytesRead } = await fh.read(buf, total, length - total, startByte + total);
|
|
103
|
+
if (bytesRead === 0)
|
|
104
|
+
break;
|
|
105
|
+
total += bytesRead;
|
|
106
|
+
}
|
|
107
|
+
if (total === length)
|
|
108
|
+
return buf.toString("utf-8");
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
await fh.close();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Fall through to line-based extraction
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Fallback: line-based extraction
|
|
119
|
+
try {
|
|
120
|
+
const content = await readFile(filePath, "utf-8");
|
|
121
|
+
const lines = content.split("\n");
|
|
122
|
+
return lines.slice(startLine - 1, endLine).join("\n");
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Retrieve a single symbol by ID with fresh source from disk.
|
|
130
|
+
* When include_related is true (default), auto-prefetches:
|
|
131
|
+
* - children (for classes/interfaces) — saves follow-up get_symbols call
|
|
132
|
+
* - symbols in the same file that reference this symbol — saves find_references call
|
|
133
|
+
*/
|
|
134
|
+
/**
|
|
135
|
+
* Raised when one id maps to several distinct symbols.
|
|
136
|
+
*
|
|
137
|
+
* A named type rather than a bare `Error` because two callers must tell this apart from a real
|
|
138
|
+
* failure, and matching on message text would break the moment the wording changes. Structural
|
|
139
|
+
* check, not `instanceof`: a duplicated module instance across a worker or bundler boundary makes
|
|
140
|
+
* `instanceof` false for an object that is in every observable way the right error — the same
|
|
141
|
+
* trap `isIndexStorageError` documents in the storage layer.
|
|
142
|
+
*/
|
|
143
|
+
export class AmbiguousSymbolIdError extends Error {
|
|
144
|
+
constructor(message) {
|
|
145
|
+
super(message);
|
|
146
|
+
this.name = "AmbiguousSymbolIdError";
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export function isAmbiguousSymbolIdError(err) {
|
|
150
|
+
return (typeof err === "object" &&
|
|
151
|
+
err !== null &&
|
|
152
|
+
err.name === "AmbiguousSymbolIdError");
|
|
153
|
+
}
|
|
154
|
+
export async function resolveSearchHit(repo, hit) {
|
|
155
|
+
try {
|
|
156
|
+
const full = await getSymbol(repo, hit.id, { include_related: false });
|
|
157
|
+
return full ? { symbol: full.symbol, ambiguity: { status: "unique" } } : null;
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
if (!isAmbiguousSymbolIdError(err))
|
|
161
|
+
throw err;
|
|
162
|
+
// Falling back is defensible; falling back SILENTLY is not. The caller is being handed one of
|
|
163
|
+
// several symbols and has no way to tell from the result — which is the same silence the
|
|
164
|
+
// `lossy_migration` marker was added to remove one layer down.
|
|
165
|
+
const index = await requireCodeIndex(repo);
|
|
166
|
+
const candidates = index.symbols
|
|
167
|
+
.filter((s) => s.id === hit.id)
|
|
168
|
+
.map((s) => ({ name: s.name, kind: s.kind, file: s.file, start_line: s.start_line }));
|
|
169
|
+
return {
|
|
170
|
+
symbol: hit,
|
|
171
|
+
ambiguity: { status: "ambiguous", shared_by: candidates.length, candidates: candidates.slice(0, 5) },
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export async function getSymbol(repo, symbolId, options) {
|
|
176
|
+
const index = await requireCodeIndex(repo);
|
|
177
|
+
const includeRelated = options?.include_related ?? true;
|
|
178
|
+
// `repo:file:name:line` is NOT unique — a minified bundle puts many symbols on line 1, and
|
|
179
|
+
// PHPDoc synthesis emits a field and a method at the same line (73,165 collisions measured
|
|
180
|
+
// across 16 indexes). `.find` would hand back whichever happened to load first, with no
|
|
181
|
+
// signal: the caller then reads source for a symbol it did not ask for. This file already
|
|
182
|
+
// states the rule for names ("two symbols named `handler` must stay ambiguous — silently
|
|
183
|
+
// picking one is worse than the miss it replaces"); it was never applied to ids because they
|
|
184
|
+
// were assumed unique.
|
|
185
|
+
const matches = index.symbols.filter((s) => matchesSymbolId(s, symbolId));
|
|
186
|
+
if (matches.length === 0)
|
|
187
|
+
return null;
|
|
188
|
+
if (matches.length > 1) {
|
|
189
|
+
const where = matches
|
|
190
|
+
.map((s) => `${s.kind} ${s.name} @ ${s.file}:${s.start_line}`)
|
|
191
|
+
.slice(0, 5)
|
|
192
|
+
.join("; ");
|
|
193
|
+
throw new AmbiguousSymbolIdError(`Symbol id "${symbolId}" is ambiguous — ${matches.length} distinct symbols share it: ${where}. ` +
|
|
194
|
+
`Ids embed only file, name and line, which collide in generated or synthesised code. ` +
|
|
195
|
+
`Use search_symbols to pick the one you mean.`);
|
|
196
|
+
}
|
|
197
|
+
const symbol = matches[0];
|
|
198
|
+
const source = await extractSource(index.root, symbol.file, symbol.start_line, symbol.end_line, symbol.start_byte, symbol.end_byte);
|
|
199
|
+
const result = { ...symbol };
|
|
200
|
+
if (source !== undefined) {
|
|
201
|
+
result.source = source;
|
|
202
|
+
}
|
|
203
|
+
const stripped = stripSymbol(result);
|
|
204
|
+
if (!includeRelated) {
|
|
205
|
+
return { symbol: stripped };
|
|
206
|
+
}
|
|
207
|
+
// Prefetch children for classes/interfaces
|
|
208
|
+
const related = [];
|
|
209
|
+
if (symbol.kind === "class" || symbol.kind === "interface") {
|
|
210
|
+
const children = index.symbols.filter((s) => s.parent === symbol.id);
|
|
211
|
+
for (const child of children.slice(0, 20)) {
|
|
212
|
+
related.push(stripSymbol(child));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const out = { symbol: stripped };
|
|
216
|
+
if (related.length > 0)
|
|
217
|
+
out.related = related;
|
|
218
|
+
return out;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Retrieve multiple symbols by ID with fresh source from disk.
|
|
222
|
+
* Groups reads by file to minimize disk I/O.
|
|
223
|
+
*/
|
|
224
|
+
export async function getSymbols(repo, symbolIds) {
|
|
225
|
+
const index = await requireCodeIndex(repo);
|
|
226
|
+
// Build lookup map for requested symbols.
|
|
227
|
+
//
|
|
228
|
+
// A colliding id must be refused here for the same reason `getSymbol` refuses it: ids are
|
|
229
|
+
// `repo:file:name:line` and that is not unique, so `.set()` on a repeated id was last-write-wins
|
|
230
|
+
// — the caller asked for one symbol and silently received whichever happened to come later in
|
|
231
|
+
// the array. Leaving the batch path permissive would have meant two entry points in this file
|
|
232
|
+
// disagreeing about the same input, one throwing and one substituting, which is worse than
|
|
233
|
+
// either rule applied consistently.
|
|
234
|
+
const requestedIds = new Set(symbolIds);
|
|
235
|
+
const symbolMap = new Map();
|
|
236
|
+
const collisions = new Map();
|
|
237
|
+
for (const sym of index.symbols) {
|
|
238
|
+
const separator = sym.id.indexOf(":");
|
|
239
|
+
const candidates = separator >= 0 ? [sym.id, sym.id.slice(separator + 1)] : [sym.id];
|
|
240
|
+
for (const requestedId of new Set(candidates)) {
|
|
241
|
+
if (!requestedIds.has(requestedId))
|
|
242
|
+
continue;
|
|
243
|
+
const seen = symbolMap.get(requestedId);
|
|
244
|
+
if (seen === undefined) {
|
|
245
|
+
symbolMap.set(requestedId, sym);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
const group = collisions.get(requestedId) ?? [seen];
|
|
249
|
+
group.push(sym);
|
|
250
|
+
collisions.set(requestedId, group);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (collisions.size > 0) {
|
|
254
|
+
const detail = [...collisions.entries()]
|
|
255
|
+
.slice(0, 3)
|
|
256
|
+
.map(([id, group]) => {
|
|
257
|
+
const where = group
|
|
258
|
+
.slice(0, 5)
|
|
259
|
+
.map((s) => `${s.kind} ${s.name} @ ${s.file}:${s.start_line}`)
|
|
260
|
+
.join("; ");
|
|
261
|
+
return `"${id}" -> ${group.length} symbols: ${where}`;
|
|
262
|
+
})
|
|
263
|
+
.join(" | ");
|
|
264
|
+
throw new AmbiguousSymbolIdError(`${collisions.size} of the requested ids are ambiguous — ${detail}. ` +
|
|
265
|
+
`Ids embed only file, name and line, which collide in generated or synthesised code. ` +
|
|
266
|
+
`Use search_symbols to pick the ones you mean.`);
|
|
267
|
+
}
|
|
268
|
+
// Group symbols by file to read each file only once
|
|
269
|
+
const byFile = new Map();
|
|
270
|
+
for (const id of symbolIds) {
|
|
271
|
+
const sym = symbolMap.get(id);
|
|
272
|
+
if (!sym)
|
|
273
|
+
continue;
|
|
274
|
+
let group = byFile.get(sym.file);
|
|
275
|
+
if (!group) {
|
|
276
|
+
group = [];
|
|
277
|
+
byFile.set(sym.file, group);
|
|
278
|
+
}
|
|
279
|
+
group.push({ requestedId: id, symbol: sym });
|
|
280
|
+
}
|
|
281
|
+
// Read all files in parallel, extract source for all symbols in each file
|
|
282
|
+
const results = new Map();
|
|
283
|
+
const fileEntries = [...byFile.entries()];
|
|
284
|
+
const fileContents = await Promise.all(fileEntries.map(([file]) => readFile(join(index.root, file), "utf-8").catch(() => undefined)));
|
|
285
|
+
for (let i = 0; i < fileEntries.length; i++) {
|
|
286
|
+
const [, symbols] = fileEntries[i];
|
|
287
|
+
const lines = fileContents[i]?.split("\n");
|
|
288
|
+
for (const { requestedId, symbol: sym } of symbols) {
|
|
289
|
+
const result = { ...sym };
|
|
290
|
+
if (lines) {
|
|
291
|
+
result.source = lines.slice(sym.start_line - 1, sym.end_line).join("\n");
|
|
292
|
+
}
|
|
293
|
+
results.set(requestedId, result);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Return in the same order as requested, skipping missing IDs
|
|
297
|
+
const ordered = [];
|
|
298
|
+
for (const id of symbolIds) {
|
|
299
|
+
const sym = results.get(id);
|
|
300
|
+
if (sym)
|
|
301
|
+
ordered.push(stripSymbol(sym));
|
|
302
|
+
}
|
|
303
|
+
return ordered;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=symbol-lookup-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-lookup-tools.js","sourceRoot":"","sources":["../../src/tools/symbol-lookup-tools.ts"],"names":[],"mappings":"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"}
|