purecontext-mcp 1.0.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/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/adapters/actix-web.d.ts +28 -0
- package/dist/adapters/actix-web.d.ts.map +1 -0
- package/dist/adapters/actix-web.js +362 -0
- package/dist/adapters/actix-web.js.map +1 -0
- package/dist/adapters/adapter-registry.d.ts +34 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +92 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/angular.d.ts +13 -0
- package/dist/adapters/angular.d.ts.map +1 -0
- package/dist/adapters/angular.js +348 -0
- package/dist/adapters/angular.js.map +1 -0
- package/dist/adapters/axum.d.ts +16 -0
- package/dist/adapters/axum.d.ts.map +1 -0
- package/dist/adapters/axum.js +299 -0
- package/dist/adapters/axum.js.map +1 -0
- package/dist/adapters/django-orm.d.ts +28 -0
- package/dist/adapters/django-orm.d.ts.map +1 -0
- package/dist/adapters/django-orm.js +464 -0
- package/dist/adapters/django-orm.js.map +1 -0
- package/dist/adapters/django.d.ts +16 -0
- package/dist/adapters/django.d.ts.map +1 -0
- package/dist/adapters/django.js +257 -0
- package/dist/adapters/django.js.map +1 -0
- package/dist/adapters/echo.d.ts +15 -0
- package/dist/adapters/echo.d.ts.map +1 -0
- package/dist/adapters/echo.js +142 -0
- package/dist/adapters/echo.js.map +1 -0
- package/dist/adapters/express.d.ts +15 -0
- package/dist/adapters/express.d.ts.map +1 -0
- package/dist/adapters/express.js +126 -0
- package/dist/adapters/express.js.map +1 -0
- package/dist/adapters/fastapi.d.ts +16 -0
- package/dist/adapters/fastapi.d.ts.map +1 -0
- package/dist/adapters/fastapi.js +113 -0
- package/dist/adapters/fastapi.js.map +1 -0
- package/dist/adapters/fastify.d.ts +14 -0
- package/dist/adapters/fastify.d.ts.map +1 -0
- package/dist/adapters/fastify.js +124 -0
- package/dist/adapters/fastify.js.map +1 -0
- package/dist/adapters/fiber.d.ts +15 -0
- package/dist/adapters/fiber.d.ts.map +1 -0
- package/dist/adapters/fiber.js +147 -0
- package/dist/adapters/fiber.js.map +1 -0
- package/dist/adapters/flask.d.ts +18 -0
- package/dist/adapters/flask.d.ts.map +1 -0
- package/dist/adapters/flask.js +175 -0
- package/dist/adapters/flask.js.map +1 -0
- package/dist/adapters/flutter.d.ts +19 -0
- package/dist/adapters/flutter.d.ts.map +1 -0
- package/dist/adapters/flutter.js +251 -0
- package/dist/adapters/flutter.js.map +1 -0
- package/dist/adapters/gin.d.ts +16 -0
- package/dist/adapters/gin.d.ts.map +1 -0
- package/dist/adapters/gin.js +159 -0
- package/dist/adapters/gin.js.map +1 -0
- package/dist/adapters/hibernate.d.ts +24 -0
- package/dist/adapters/hibernate.d.ts.map +1 -0
- package/dist/adapters/hibernate.js +448 -0
- package/dist/adapters/hibernate.js.map +1 -0
- package/dist/adapters/ktor.d.ts +18 -0
- package/dist/adapters/ktor.d.ts.map +1 -0
- package/dist/adapters/ktor.js +219 -0
- package/dist/adapters/ktor.js.map +1 -0
- package/dist/adapters/laravel.d.ts +19 -0
- package/dist/adapters/laravel.d.ts.map +1 -0
- package/dist/adapters/laravel.js +370 -0
- package/dist/adapters/laravel.js.map +1 -0
- package/dist/adapters/micronaut.d.ts +21 -0
- package/dist/adapters/micronaut.d.ts.map +1 -0
- package/dist/adapters/micronaut.js +435 -0
- package/dist/adapters/micronaut.js.map +1 -0
- package/dist/adapters/nestjs.d.ts +12 -0
- package/dist/adapters/nestjs.d.ts.map +1 -0
- package/dist/adapters/nestjs.js +401 -0
- package/dist/adapters/nestjs.js.map +1 -0
- package/dist/adapters/nextjs.d.ts +49 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.js +412 -0
- package/dist/adapters/nextjs.js.map +1 -0
- package/dist/adapters/nuxt.d.ts +44 -0
- package/dist/adapters/nuxt.d.ts.map +1 -0
- package/dist/adapters/nuxt.js +243 -0
- package/dist/adapters/nuxt.js.map +1 -0
- package/dist/adapters/quarkus.d.ts +21 -0
- package/dist/adapters/quarkus.d.ts.map +1 -0
- package/dist/adapters/quarkus.js +395 -0
- package/dist/adapters/quarkus.js.map +1 -0
- package/dist/adapters/rails.d.ts +18 -0
- package/dist/adapters/rails.d.ts.map +1 -0
- package/dist/adapters/rails.js +363 -0
- package/dist/adapters/rails.js.map +1 -0
- package/dist/adapters/react.d.ts +18 -0
- package/dist/adapters/react.d.ts.map +1 -0
- package/dist/adapters/react.js +95 -0
- package/dist/adapters/react.js.map +1 -0
- package/dist/adapters/rocket.d.ts +19 -0
- package/dist/adapters/rocket.d.ts.map +1 -0
- package/dist/adapters/rocket.js +271 -0
- package/dist/adapters/rocket.js.map +1 -0
- package/dist/adapters/sinatra.d.ts +16 -0
- package/dist/adapters/sinatra.d.ts.map +1 -0
- package/dist/adapters/sinatra.js +114 -0
- package/dist/adapters/sinatra.js.map +1 -0
- package/dist/adapters/spring-boot.d.ts +24 -0
- package/dist/adapters/spring-boot.d.ts.map +1 -0
- package/dist/adapters/spring-boot.js +399 -0
- package/dist/adapters/spring-boot.js.map +1 -0
- package/dist/adapters/spring-kotlin.d.ts +19 -0
- package/dist/adapters/spring-kotlin.d.ts.map +1 -0
- package/dist/adapters/spring-kotlin.js +297 -0
- package/dist/adapters/spring-kotlin.js.map +1 -0
- package/dist/adapters/sqlalchemy.d.ts +28 -0
- package/dist/adapters/sqlalchemy.d.ts.map +1 -0
- package/dist/adapters/sqlalchemy.js +435 -0
- package/dist/adapters/sqlalchemy.js.map +1 -0
- package/dist/adapters/symfony.d.ts +16 -0
- package/dist/adapters/symfony.d.ts.map +1 -0
- package/dist/adapters/symfony.js +242 -0
- package/dist/adapters/symfony.js.map +1 -0
- package/dist/adapters/vapor.d.ts +21 -0
- package/dist/adapters/vapor.d.ts.map +1 -0
- package/dist/adapters/vapor.js +269 -0
- package/dist/adapters/vapor.js.map +1 -0
- package/dist/adapters/vue-preprocessor.d.ts +26 -0
- package/dist/adapters/vue-preprocessor.d.ts.map +1 -0
- package/dist/adapters/vue-preprocessor.js +82 -0
- package/dist/adapters/vue-preprocessor.js.map +1 -0
- package/dist/adapters/vue.d.ts +13 -0
- package/dist/adapters/vue.d.ts.map +1 -0
- package/dist/adapters/vue.js +134 -0
- package/dist/adapters/vue.js.map +1 -0
- package/dist/config/cli.d.ts +26 -0
- package/dist/config/cli.d.ts.map +1 -0
- package/dist/config/cli.js +291 -0
- package/dist/config/cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +26 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +168 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-schema.d.ts +228 -0
- package/dist/config/config-schema.d.ts.map +1 -0
- package/dist/config/config-schema.js +400 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/config/keys-cli.d.ts +37 -0
- package/dist/config/keys-cli.d.ts.map +1 -0
- package/dist/config/keys-cli.js +179 -0
- package/dist/config/keys-cli.js.map +1 -0
- package/dist/config/workspaces-cli.d.ts +2 -0
- package/dist/config/workspaces-cli.d.ts.map +1 -0
- package/dist/config/workspaces-cli.js +84 -0
- package/dist/config/workspaces-cli.js.map +1 -0
- package/dist/core/db/api-keys.d.ts +95 -0
- package/dist/core/db/api-keys.d.ts.map +1 -0
- package/dist/core/db/api-keys.js +293 -0
- package/dist/core/db/api-keys.js.map +1 -0
- package/dist/core/db/dep-store.d.ts +18 -0
- package/dist/core/db/dep-store.d.ts.map +1 -0
- package/dist/core/db/dep-store.js +155 -0
- package/dist/core/db/dep-store.js.map +1 -0
- package/dist/core/db/embedding-store.d.ts +40 -0
- package/dist/core/db/embedding-store.d.ts.map +1 -0
- package/dist/core/db/embedding-store.js +120 -0
- package/dist/core/db/embedding-store.js.map +1 -0
- package/dist/core/db/file-store.d.ts +27 -0
- package/dist/core/db/file-store.d.ts.map +1 -0
- package/dist/core/db/file-store.js +101 -0
- package/dist/core/db/file-store.js.map +1 -0
- package/dist/core/db/request-log.d.ts +40 -0
- package/dist/core/db/request-log.d.ts.map +1 -0
- package/dist/core/db/request-log.js +90 -0
- package/dist/core/db/request-log.js.map +1 -0
- package/dist/core/db/savings-store.d.ts +9 -0
- package/dist/core/db/savings-store.d.ts.map +1 -0
- package/dist/core/db/savings-store.js +64 -0
- package/dist/core/db/savings-store.js.map +1 -0
- package/dist/core/db/schema.d.ts +14 -0
- package/dist/core/db/schema.d.ts.map +1 -0
- package/dist/core/db/schema.js +235 -0
- package/dist/core/db/schema.js.map +1 -0
- package/dist/core/db/symbol-store.d.ts +64 -0
- package/dist/core/db/symbol-store.d.ts.map +1 -0
- package/dist/core/db/symbol-store.js +243 -0
- package/dist/core/db/symbol-store.js.map +1 -0
- package/dist/core/db/tenants.d.ts +91 -0
- package/dist/core/db/tenants.d.ts.map +1 -0
- package/dist/core/db/tenants.js +219 -0
- package/dist/core/db/tenants.js.map +1 -0
- package/dist/core/errors.d.ts +72 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +140 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/file-discovery.d.ts +17 -0
- package/dist/core/file-discovery.d.ts.map +1 -0
- package/dist/core/file-discovery.js +136 -0
- package/dist/core/file-discovery.js.map +1 -0
- package/dist/core/file-processor.d.ts +21 -0
- package/dist/core/file-processor.d.ts.map +1 -0
- package/dist/core/file-processor.js +110 -0
- package/dist/core/file-processor.js.map +1 -0
- package/dist/core/hash-cache.d.ts +18 -0
- package/dist/core/hash-cache.d.ts.map +1 -0
- package/dist/core/hash-cache.js +35 -0
- package/dist/core/hash-cache.js.map +1 -0
- package/dist/core/index-manager.d.ts +18 -0
- package/dist/core/index-manager.d.ts.map +1 -0
- package/dist/core/index-manager.js +461 -0
- package/dist/core/index-manager.js.map +1 -0
- package/dist/core/indexing-worker.d.ts +60 -0
- package/dist/core/indexing-worker.d.ts.map +1 -0
- package/dist/core/indexing-worker.js +128 -0
- package/dist/core/indexing-worker.js.map +1 -0
- package/dist/core/logger.d.ts +10 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +40 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/parse-dispatcher.d.ts +18 -0
- package/dist/core/parse-dispatcher.d.ts.map +1 -0
- package/dist/core/parse-dispatcher.js +74 -0
- package/dist/core/parse-dispatcher.js.map +1 -0
- package/dist/core/search/query-preprocessor.d.ts +22 -0
- package/dist/core/search/query-preprocessor.d.ts.map +1 -0
- package/dist/core/search/query-preprocessor.js +77 -0
- package/dist/core/search/query-preprocessor.js.map +1 -0
- package/dist/core/search/relevance-ranker.d.ts +34 -0
- package/dist/core/search/relevance-ranker.d.ts.map +1 -0
- package/dist/core/search/relevance-ranker.js +132 -0
- package/dist/core/search/relevance-ranker.js.map +1 -0
- package/dist/core/security.d.ts +40 -0
- package/dist/core/security.d.ts.map +1 -0
- package/dist/core/security.js +133 -0
- package/dist/core/security.js.map +1 -0
- package/dist/core/telemetry.d.ts +19 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +101 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/tenant-context.d.ts +22 -0
- package/dist/core/tenant-context.d.ts.map +1 -0
- package/dist/core/tenant-context.js +16 -0
- package/dist/core/tenant-context.js.map +1 -0
- package/dist/core/token-tracker.d.ts +39 -0
- package/dist/core/token-tracker.d.ts.map +1 -0
- package/dist/core/token-tracker.js +153 -0
- package/dist/core/token-tracker.js.map +1 -0
- package/dist/core/types.d.ts +145 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/watcher/file-watcher.d.ts +18 -0
- package/dist/core/watcher/file-watcher.d.ts.map +1 -0
- package/dist/core/watcher/file-watcher.js +123 -0
- package/dist/core/watcher/file-watcher.js.map +1 -0
- package/dist/core/worker-pool.d.ts +24 -0
- package/dist/core/worker-pool.d.ts.map +1 -0
- package/dist/core/worker-pool.js +92 -0
- package/dist/core/worker-pool.js.map +1 -0
- package/dist/graph/graph-builder.d.ts +16 -0
- package/dist/graph/graph-builder.d.ts.map +1 -0
- package/dist/graph/graph-builder.js +51 -0
- package/dist/graph/graph-builder.js.map +1 -0
- package/dist/graph/graph-traversal.d.ts +57 -0
- package/dist/graph/graph-traversal.d.ts.map +1 -0
- package/dist/graph/graph-traversal.js +144 -0
- package/dist/graph/graph-traversal.js.map +1 -0
- package/dist/graph/path-resolver.d.ts +13 -0
- package/dist/graph/path-resolver.d.ts.map +1 -0
- package/dist/graph/path-resolver.js +161 -0
- package/dist/graph/path-resolver.js.map +1 -0
- package/dist/handlers/c.d.ts +3 -0
- package/dist/handlers/c.d.ts.map +1 -0
- package/dist/handlers/c.js +473 -0
- package/dist/handlers/c.js.map +1 -0
- package/dist/handlers/cpp.d.ts +3 -0
- package/dist/handlers/cpp.d.ts.map +1 -0
- package/dist/handlers/cpp.js +682 -0
- package/dist/handlers/cpp.js.map +1 -0
- package/dist/handlers/csharp.d.ts +3 -0
- package/dist/handlers/csharp.d.ts.map +1 -0
- package/dist/handlers/csharp.js +369 -0
- package/dist/handlers/csharp.js.map +1 -0
- package/dist/handlers/dart.d.ts +3 -0
- package/dist/handlers/dart.d.ts.map +1 -0
- package/dist/handlers/dart.js +596 -0
- package/dist/handlers/dart.js.map +1 -0
- package/dist/handlers/elixir.d.ts +8 -0
- package/dist/handlers/elixir.d.ts.map +1 -0
- package/dist/handlers/elixir.js +412 -0
- package/dist/handlers/elixir.js.map +1 -0
- package/dist/handlers/go.d.ts +3 -0
- package/dist/handlers/go.d.ts.map +1 -0
- package/dist/handlers/go.js +262 -0
- package/dist/handlers/go.js.map +1 -0
- package/dist/handlers/handler-registry.d.ts +20 -0
- package/dist/handlers/handler-registry.d.ts.map +1 -0
- package/dist/handlers/handler-registry.js +69 -0
- package/dist/handlers/handler-registry.js.map +1 -0
- package/dist/handlers/haskell.d.ts +17 -0
- package/dist/handlers/haskell.d.ts.map +1 -0
- package/dist/handlers/haskell.js +356 -0
- package/dist/handlers/haskell.js.map +1 -0
- package/dist/handlers/java.d.ts +3 -0
- package/dist/handlers/java.d.ts.map +1 -0
- package/dist/handlers/java.js +350 -0
- package/dist/handlers/java.js.map +1 -0
- package/dist/handlers/javascript.d.ts +3 -0
- package/dist/handlers/javascript.d.ts.map +1 -0
- package/dist/handlers/javascript.js +232 -0
- package/dist/handlers/javascript.js.map +1 -0
- package/dist/handlers/kotlin.d.ts +3 -0
- package/dist/handlers/kotlin.d.ts.map +1 -0
- package/dist/handlers/kotlin.js +317 -0
- package/dist/handlers/kotlin.js.map +1 -0
- package/dist/handlers/lua.d.ts +3 -0
- package/dist/handlers/lua.d.ts.map +1 -0
- package/dist/handlers/lua.js +328 -0
- package/dist/handlers/lua.js.map +1 -0
- package/dist/handlers/php.d.ts +3 -0
- package/dist/handlers/php.d.ts.map +1 -0
- package/dist/handlers/php.js +343 -0
- package/dist/handlers/php.js.map +1 -0
- package/dist/handlers/python.d.ts +3 -0
- package/dist/handlers/python.d.ts.map +1 -0
- package/dist/handlers/python.js +343 -0
- package/dist/handlers/python.js.map +1 -0
- package/dist/handlers/r.d.ts +9 -0
- package/dist/handlers/r.d.ts.map +1 -0
- package/dist/handlers/r.js +452 -0
- package/dist/handlers/r.js.map +1 -0
- package/dist/handlers/ruby.d.ts +8 -0
- package/dist/handlers/ruby.d.ts.map +1 -0
- package/dist/handlers/ruby.js +271 -0
- package/dist/handlers/ruby.js.map +1 -0
- package/dist/handlers/rust.d.ts +3 -0
- package/dist/handlers/rust.d.ts.map +1 -0
- package/dist/handlers/rust.js +420 -0
- package/dist/handlers/rust.js.map +1 -0
- package/dist/handlers/scala.d.ts +9 -0
- package/dist/handlers/scala.d.ts.map +1 -0
- package/dist/handlers/scala.js +480 -0
- package/dist/handlers/scala.js.map +1 -0
- package/dist/handlers/swift.d.ts +3 -0
- package/dist/handlers/swift.d.ts.map +1 -0
- package/dist/handlers/swift.js +553 -0
- package/dist/handlers/swift.js.map +1 -0
- package/dist/handlers/typescript.d.ts +4 -0
- package/dist/handlers/typescript.d.ts.map +1 -0
- package/dist/handlers/typescript.js +325 -0
- package/dist/handlers/typescript.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +266 -0
- package/dist/index.js.map +1 -0
- package/dist/semantic/embedding-provider.d.ts +66 -0
- package/dist/semantic/embedding-provider.d.ts.map +1 -0
- package/dist/semantic/embedding-provider.js +176 -0
- package/dist/semantic/embedding-provider.js.map +1 -0
- package/dist/semantic/hnsw-index.d.ts +96 -0
- package/dist/semantic/hnsw-index.d.ts.map +1 -0
- package/dist/semantic/hnsw-index.js +364 -0
- package/dist/semantic/hnsw-index.js.map +1 -0
- package/dist/semantic/hybrid-search.d.ts +46 -0
- package/dist/semantic/hybrid-search.d.ts.map +1 -0
- package/dist/semantic/hybrid-search.js +164 -0
- package/dist/semantic/hybrid-search.js.map +1 -0
- package/dist/semantic/query-expansion.d.ts +25 -0
- package/dist/semantic/query-expansion.d.ts.map +1 -0
- package/dist/semantic/query-expansion.js +150 -0
- package/dist/semantic/query-expansion.js.map +1 -0
- package/dist/semantic/semantic-indexer.d.ts +64 -0
- package/dist/semantic/semantic-indexer.d.ts.map +1 -0
- package/dist/semantic/semantic-indexer.js +162 -0
- package/dist/semantic/semantic-indexer.js.map +1 -0
- package/dist/semantic/text-preparation.d.ts +23 -0
- package/dist/semantic/text-preparation.d.ts.map +1 -0
- package/dist/semantic/text-preparation.js +56 -0
- package/dist/semantic/text-preparation.js.map +1 -0
- package/dist/semantic/vector-store.d.ts +81 -0
- package/dist/semantic/vector-store.d.ts.map +1 -0
- package/dist/semantic/vector-store.js +157 -0
- package/dist/semantic/vector-store.js.map +1 -0
- package/dist/server/admin-api.d.ts +88 -0
- package/dist/server/admin-api.d.ts.map +1 -0
- package/dist/server/admin-api.js +661 -0
- package/dist/server/admin-api.js.map +1 -0
- package/dist/server/auth/api-key.d.ts +105 -0
- package/dist/server/auth/api-key.d.ts.map +1 -0
- package/dist/server/auth/api-key.js +276 -0
- package/dist/server/auth/api-key.js.map +1 -0
- package/dist/server/http-server.d.ts +100 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +823 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/mcp-server.d.ts +23 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +214 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/rate-limit-store.d.ts +25 -0
- package/dist/server/rate-limit-store.d.ts.map +1 -0
- package/dist/server/rate-limit-store.js +46 -0
- package/dist/server/rate-limit-store.js.map +1 -0
- package/dist/server/rate-limiter.d.ts +59 -0
- package/dist/server/rate-limiter.d.ts.map +1 -0
- package/dist/server/rate-limiter.js +85 -0
- package/dist/server/rate-limiter.js.map +1 -0
- package/dist/server/tools/_meta.d.ts +24 -0
- package/dist/server/tools/_meta.d.ts.map +1 -0
- package/dist/server/tools/_meta.js +35 -0
- package/dist/server/tools/_meta.js.map +1 -0
- package/dist/server/tools/find-dead-code.d.ts +11 -0
- package/dist/server/tools/find-dead-code.d.ts.map +1 -0
- package/dist/server/tools/find-dead-code.js +45 -0
- package/dist/server/tools/find-dead-code.js.map +1 -0
- package/dist/server/tools/find-importers.d.ts +13 -0
- package/dist/server/tools/find-importers.d.ts.map +1 -0
- package/dist/server/tools/find-importers.js +46 -0
- package/dist/server/tools/find-importers.js.map +1 -0
- package/dist/server/tools/get-blast-radius.d.ts +15 -0
- package/dist/server/tools/get-blast-radius.d.ts.map +1 -0
- package/dist/server/tools/get-blast-radius.js +51 -0
- package/dist/server/tools/get-blast-radius.js.map +1 -0
- package/dist/server/tools/get-context-bundle.d.ts +15 -0
- package/dist/server/tools/get-context-bundle.d.ts.map +1 -0
- package/dist/server/tools/get-context-bundle.js +53 -0
- package/dist/server/tools/get-context-bundle.js.map +1 -0
- package/dist/server/tools/get-file-outline.d.ts +13 -0
- package/dist/server/tools/get-file-outline.d.ts.map +1 -0
- package/dist/server/tools/get-file-outline.js +42 -0
- package/dist/server/tools/get-file-outline.js.map +1 -0
- package/dist/server/tools/get-file-tree.d.ts +11 -0
- package/dist/server/tools/get-file-tree.d.ts.map +1 -0
- package/dist/server/tools/get-file-tree.js +63 -0
- package/dist/server/tools/get-file-tree.js.map +1 -0
- package/dist/server/tools/get-graph.d.ts +46 -0
- package/dist/server/tools/get-graph.d.ts.map +1 -0
- package/dist/server/tools/get-graph.js +168 -0
- package/dist/server/tools/get-graph.js.map +1 -0
- package/dist/server/tools/get-layer-violations.d.ts +37 -0
- package/dist/server/tools/get-layer-violations.d.ts.map +1 -0
- package/dist/server/tools/get-layer-violations.js +138 -0
- package/dist/server/tools/get-layer-violations.js.map +1 -0
- package/dist/server/tools/get-repo-outline.d.ts +13 -0
- package/dist/server/tools/get-repo-outline.d.ts.map +1 -0
- package/dist/server/tools/get-repo-outline.js +72 -0
- package/dist/server/tools/get-repo-outline.js.map +1 -0
- package/dist/server/tools/get-savings-stats.d.ts +11 -0
- package/dist/server/tools/get-savings-stats.d.ts.map +1 -0
- package/dist/server/tools/get-savings-stats.js +56 -0
- package/dist/server/tools/get-savings-stats.js.map +1 -0
- package/dist/server/tools/get-symbol-source.d.ts +13 -0
- package/dist/server/tools/get-symbol-source.d.ts.map +1 -0
- package/dist/server/tools/get-symbol-source.js +93 -0
- package/dist/server/tools/get-symbol-source.js.map +1 -0
- package/dist/server/tools/index-folder.d.ts +15 -0
- package/dist/server/tools/index-folder.d.ts.map +1 -0
- package/dist/server/tools/index-folder.js +45 -0
- package/dist/server/tools/index-folder.js.map +1 -0
- package/dist/server/tools/index-repo.d.ts +26 -0
- package/dist/server/tools/index-repo.d.ts.map +1 -0
- package/dist/server/tools/index-repo.js +164 -0
- package/dist/server/tools/index-repo.js.map +1 -0
- package/dist/server/tools/list-repos.d.ts +11 -0
- package/dist/server/tools/list-repos.d.ts.map +1 -0
- package/dist/server/tools/list-repos.js +60 -0
- package/dist/server/tools/list-repos.js.map +1 -0
- package/dist/server/tools/resolve-repo.d.ts +11 -0
- package/dist/server/tools/resolve-repo.d.ts.map +1 -0
- package/dist/server/tools/resolve-repo.js +44 -0
- package/dist/server/tools/resolve-repo.js.map +1 -0
- package/dist/server/tools/search-semantic.d.ts +56 -0
- package/dist/server/tools/search-semantic.d.ts.map +1 -0
- package/dist/server/tools/search-semantic.js +187 -0
- package/dist/server/tools/search-semantic.js.map +1 -0
- package/dist/server/tools/search-symbols.d.ts +43 -0
- package/dist/server/tools/search-symbols.d.ts.map +1 -0
- package/dist/server/tools/search-symbols.js +197 -0
- package/dist/server/tools/search-symbols.js.map +1 -0
- package/dist/server/tools/search-text.d.ts +21 -0
- package/dist/server/tools/search-text.d.ts.map +1 -0
- package/dist/server/tools/search-text.js +131 -0
- package/dist/server/tools/search-text.js.map +1 -0
- package/dist/server/transport.d.ts +59 -0
- package/dist/server/transport.d.ts.map +1 -0
- package/dist/server/transport.js +92 -0
- package/dist/server/transport.js.map +1 -0
- package/dist/summarizer/ai-summarizer.d.ts +71 -0
- package/dist/summarizer/ai-summarizer.d.ts.map +1 -0
- package/dist/summarizer/ai-summarizer.js +228 -0
- package/dist/summarizer/ai-summarizer.js.map +1 -0
- package/dist/summarizer/docstring-extractor.d.ts +9 -0
- package/dist/summarizer/docstring-extractor.d.ts.map +1 -0
- package/dist/summarizer/docstring-extractor.js +89 -0
- package/dist/summarizer/docstring-extractor.js.map +1 -0
- package/dist/summarizer/embeddings.d.ts +29 -0
- package/dist/summarizer/embeddings.d.ts.map +1 -0
- package/dist/summarizer/embeddings.js +133 -0
- package/dist/summarizer/embeddings.js.map +1 -0
- package/dist/summarizer/summarizer.d.ts +22 -0
- package/dist/summarizer/summarizer.d.ts.map +1 -0
- package/dist/summarizer/summarizer.js +86 -0
- package/dist/summarizer/summarizer.js.map +1 -0
- package/dist/ui/assets/BlastRadius-ccQ3ktbv.js +1 -0
- package/dist/ui/assets/DependencyGraph-BZV40eAE.css +1 -0
- package/dist/ui/assets/DependencyGraph-Ca84q89b.js +27 -0
- package/dist/ui/assets/NotFound-C1wVKP-6.js +1 -0
- package/dist/ui/assets/RepoDetail-B_8qid2Y.js +1 -0
- package/dist/ui/assets/RepoList-BuPu-ODM.js +1 -0
- package/dist/ui/assets/Search-BzZ9Og8E.js +1 -0
- package/dist/ui/assets/SymbolView-FdpKlzql.js +14 -0
- package/dist/ui/assets/client-BANW_tIp.js +1 -0
- package/dist/ui/assets/index-CnwwQi_S.js +61 -0
- package/dist/ui/assets/index-SS2IXr8I.css +1 -0
- package/dist/ui/assets/repoStore-SbGR6YI6.js +1 -0
- package/dist/ui/assets/useSearch-DHyve22h.js +1 -0
- package/dist/ui/index.html +13 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/grammars/tree-sitter-c.wasm +0 -0
- package/grammars/tree-sitter-cpp.wasm +0 -0
- package/grammars/tree-sitter-csharp.wasm +0 -0
- package/grammars/tree-sitter-dart.wasm +0 -0
- package/grammars/tree-sitter-elixir.wasm +0 -0
- package/grammars/tree-sitter-go.wasm +0 -0
- package/grammars/tree-sitter-haskell.wasm +0 -0
- package/grammars/tree-sitter-java.wasm +0 -0
- package/grammars/tree-sitter-javascript.wasm +0 -0
- package/grammars/tree-sitter-kotlin.wasm +0 -0
- package/grammars/tree-sitter-lua.wasm +0 -0
- package/grammars/tree-sitter-php.wasm +0 -0
- package/grammars/tree-sitter-python.wasm +0 -0
- package/grammars/tree-sitter-r.wasm +0 -0
- package/grammars/tree-sitter-ruby.wasm +0 -0
- package/grammars/tree-sitter-rust.wasm +0 -0
- package/grammars/tree-sitter-scala.wasm +0 -0
- package/grammars/tree-sitter-swift.wasm +0 -0
- package/grammars/tree-sitter-tsx.wasm +0 -0
- package/grammars/tree-sitter-typescript.wasm +0 -0
- package/package.json +104 -0
- package/scripts/check-sqlite.js +41 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker thread entry point for parallel file parsing.
|
|
3
|
+
*
|
|
4
|
+
* Each worker maintains its own web-tree-sitter Parser instance — no shared
|
|
5
|
+
* state, no mutex needed. Adapters are imported here so they self-register into
|
|
6
|
+
* this worker's own adapter-registry instance.
|
|
7
|
+
*
|
|
8
|
+
* Protocol (main thread → worker):
|
|
9
|
+
* ParseJob — process one file, respond with ParseResult
|
|
10
|
+
* ShutdownMsg — graceful exit (worker calls process.exit)
|
|
11
|
+
*/
|
|
12
|
+
import { parentPort, isMainThread } from 'worker_threads';
|
|
13
|
+
import { initParser, isInitialized } from './parse-dispatcher.js';
|
|
14
|
+
import { processFile } from './file-processor.js';
|
|
15
|
+
import { getRegisteredAdapters } from '../adapters/adapter-registry.js';
|
|
16
|
+
import { registerHandler } from '../handlers/handler-registry.js';
|
|
17
|
+
// ─── Language handler registration ────────────────────────────────────────────
|
|
18
|
+
// Workers have their own module instance — handlers must be registered here.
|
|
19
|
+
// (Unlike adapters, handlers don't self-register at module load time.)
|
|
20
|
+
import { typescriptHandler, tsxHandler } from '../handlers/typescript.js';
|
|
21
|
+
import { javascriptHandler } from '../handlers/javascript.js';
|
|
22
|
+
import { pythonHandler } from '../handlers/python.js';
|
|
23
|
+
import { goHandler } from '../handlers/go.js';
|
|
24
|
+
import { rustHandler } from '../handlers/rust.js';
|
|
25
|
+
import { javaHandler } from '../handlers/java.js';
|
|
26
|
+
import { csharpHandler } from '../handlers/csharp.js';
|
|
27
|
+
import { phpHandler } from '../handlers/php.js';
|
|
28
|
+
import { rubyHandler } from '../handlers/ruby.js';
|
|
29
|
+
import { kotlinHandler } from '../handlers/kotlin.js';
|
|
30
|
+
import { cHandler } from '../handlers/c.js';
|
|
31
|
+
import { cppHandler } from '../handlers/cpp.js';
|
|
32
|
+
import { luaHandler } from '../handlers/lua.js';
|
|
33
|
+
import { dartHandler } from '../handlers/dart.js';
|
|
34
|
+
import { swiftHandler } from '../handlers/swift.js';
|
|
35
|
+
import { elixirHandler } from '../handlers/elixir.js';
|
|
36
|
+
import { haskellHandler } from '../handlers/haskell.js';
|
|
37
|
+
import { scalaHandler } from '../handlers/scala.js';
|
|
38
|
+
import { rHandler } from '../handlers/r.js';
|
|
39
|
+
registerHandler(typescriptHandler);
|
|
40
|
+
registerHandler(tsxHandler);
|
|
41
|
+
registerHandler(javascriptHandler);
|
|
42
|
+
registerHandler(pythonHandler);
|
|
43
|
+
registerHandler(goHandler);
|
|
44
|
+
registerHandler(rustHandler);
|
|
45
|
+
registerHandler(javaHandler);
|
|
46
|
+
registerHandler(csharpHandler);
|
|
47
|
+
registerHandler(phpHandler);
|
|
48
|
+
registerHandler(rubyHandler);
|
|
49
|
+
registerHandler(kotlinHandler);
|
|
50
|
+
registerHandler(cHandler);
|
|
51
|
+
registerHandler(cppHandler);
|
|
52
|
+
registerHandler(luaHandler);
|
|
53
|
+
registerHandler(dartHandler);
|
|
54
|
+
registerHandler(swiftHandler);
|
|
55
|
+
registerHandler(elixirHandler);
|
|
56
|
+
registerHandler(haskellHandler);
|
|
57
|
+
registerHandler(scalaHandler);
|
|
58
|
+
registerHandler(rHandler);
|
|
59
|
+
// ─── Adapter self-registration ────────────────────────────────────────────────
|
|
60
|
+
// Workers have their own module instance — adapters must be imported here so
|
|
61
|
+
// they call registerAdapter() in *this* worker's registry.
|
|
62
|
+
import '../adapters/vue.js';
|
|
63
|
+
import '../adapters/nuxt.js';
|
|
64
|
+
import '../adapters/react.js';
|
|
65
|
+
import '../adapters/nextjs.js';
|
|
66
|
+
import '../adapters/angular.js';
|
|
67
|
+
import '../adapters/nestjs.js';
|
|
68
|
+
import '../adapters/express.js';
|
|
69
|
+
import '../adapters/fastify.js';
|
|
70
|
+
import '../adapters/flask.js';
|
|
71
|
+
import '../adapters/fastapi.js';
|
|
72
|
+
import '../adapters/django.js';
|
|
73
|
+
import '../adapters/django-orm.js';
|
|
74
|
+
import '../adapters/gin.js';
|
|
75
|
+
import '../adapters/echo.js';
|
|
76
|
+
import '../adapters/fiber.js';
|
|
77
|
+
import '../adapters/laravel.js';
|
|
78
|
+
import '../adapters/symfony.js';
|
|
79
|
+
import '../adapters/rails.js';
|
|
80
|
+
import '../adapters/sinatra.js';
|
|
81
|
+
import '../adapters/spring-boot.js';
|
|
82
|
+
import '../adapters/spring-kotlin.js';
|
|
83
|
+
import '../adapters/micronaut.js';
|
|
84
|
+
import '../adapters/quarkus.js';
|
|
85
|
+
import '../adapters/hibernate.js';
|
|
86
|
+
import '../adapters/sqlalchemy.js';
|
|
87
|
+
import '../adapters/axum.js';
|
|
88
|
+
import '../adapters/actix-web.js';
|
|
89
|
+
import '../adapters/rocket.js';
|
|
90
|
+
import '../adapters/ktor.js';
|
|
91
|
+
import '../adapters/flutter.js';
|
|
92
|
+
import '../adapters/vapor.js';
|
|
93
|
+
// ─── Worker entry point ───────────────────────────────────────────────────────
|
|
94
|
+
if (!isMainThread) {
|
|
95
|
+
parentPort.on('message', async (msg) => {
|
|
96
|
+
if ('type' in msg && msg.type === 'shutdown') {
|
|
97
|
+
process.exit(0);
|
|
98
|
+
}
|
|
99
|
+
const job = msg;
|
|
100
|
+
// Lazy-initialize parser on first message — one init per worker lifetime.
|
|
101
|
+
if (!isInitialized()) {
|
|
102
|
+
await initParser();
|
|
103
|
+
}
|
|
104
|
+
// Resolve adapters by name from this worker's self-registered registry.
|
|
105
|
+
const allAdapters = getRegisteredAdapters();
|
|
106
|
+
const adapters = job.adapterNames
|
|
107
|
+
.map((name) => allAdapters.find((a) => a.name === name))
|
|
108
|
+
.filter((a) => a !== undefined);
|
|
109
|
+
try {
|
|
110
|
+
// Reconstruct a Buffer from the Uint8Array received via structured clone.
|
|
111
|
+
const content = Buffer.from(job.content.buffer, job.content.byteOffset, job.content.byteLength);
|
|
112
|
+
const { symbols, imports } = await processFile(job.relPath, content, adapters);
|
|
113
|
+
const result = { relPath: job.relPath, symbols, imports };
|
|
114
|
+
parentPort.postMessage(result);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
// Catch all errors so the worker stays alive for subsequent jobs.
|
|
118
|
+
const result = {
|
|
119
|
+
relPath: job.relPath,
|
|
120
|
+
symbols: [],
|
|
121
|
+
imports: [],
|
|
122
|
+
error: err instanceof Error ? err.message : String(err),
|
|
123
|
+
};
|
|
124
|
+
parentPort.postMessage(result);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=indexing-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexing-worker.js","sourceRoot":"","sources":["../../src/core/indexing-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
3
|
+
export declare function getLogLevel(): LogLevel;
|
|
4
|
+
export declare const logger: {
|
|
5
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
6
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
7
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
8
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAeD,eAAO,MAAM,MAAM;mBACF,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;kBAGjD,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;kBAGhD,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;mBAG/C,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAGhE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const LEVELS = {
|
|
2
|
+
debug: 0,
|
|
3
|
+
info: 1,
|
|
4
|
+
warn: 2,
|
|
5
|
+
error: 3,
|
|
6
|
+
};
|
|
7
|
+
let currentLevel = 'info';
|
|
8
|
+
export function setLogLevel(level) {
|
|
9
|
+
currentLevel = level;
|
|
10
|
+
}
|
|
11
|
+
export function getLogLevel() {
|
|
12
|
+
return currentLevel;
|
|
13
|
+
}
|
|
14
|
+
function formatMessage(level, message, context) {
|
|
15
|
+
const ts = new Date().toISOString();
|
|
16
|
+
const upper = level.toUpperCase().padEnd(5);
|
|
17
|
+
const base = `[${ts}] ${upper} ${message}`;
|
|
18
|
+
return context ? `${base} ${JSON.stringify(context)}` : base;
|
|
19
|
+
}
|
|
20
|
+
function write(level, message, context) {
|
|
21
|
+
if (LEVELS[level] < LEVELS[currentLevel])
|
|
22
|
+
return;
|
|
23
|
+
// Always write to stderr — stdout is reserved for MCP stdio transport
|
|
24
|
+
process.stderr.write(formatMessage(level, message, context) + '\n');
|
|
25
|
+
}
|
|
26
|
+
export const logger = {
|
|
27
|
+
debug(message, context) {
|
|
28
|
+
write('debug', message, context);
|
|
29
|
+
},
|
|
30
|
+
info(message, context) {
|
|
31
|
+
write('info', message, context);
|
|
32
|
+
},
|
|
33
|
+
warn(message, context) {
|
|
34
|
+
write('warn', message, context);
|
|
35
|
+
},
|
|
36
|
+
error(message, context) {
|
|
37
|
+
write('error', message, context);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAA6B;IACvC,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAa,MAAM,CAAC;AAEpC,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,OAAe,EAAE,OAAiC;IACxF,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,KAAK,IAAI,OAAO,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,KAAK,CAAC,KAAe,EAAE,OAAe,EAAE,OAAiC;IAChF,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;QAAE,OAAO;IACjD,sEAAsE;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,CAAC,OAAe,EAAE,OAAiC;QACtD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,OAAiC;QACrD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,OAAiC;QACrD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,CAAC,OAAe,EAAE,OAAiC;QACtD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LanguageHandler } from './types.js';
|
|
2
|
+
import type { Tree } from './types.js';
|
|
3
|
+
export declare const GRAMMARS_DIR: string;
|
|
4
|
+
/**
|
|
5
|
+
* Initialize web-tree-sitter. Must be called once before parseFile().
|
|
6
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
7
|
+
*/
|
|
8
|
+
export declare function initParser(): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Parse source bytes using the grammar provided by the given handler.
|
|
11
|
+
* The returned Tree's node startIndex/endIndex are byte offsets into `source`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseFile(source: Buffer, handler: LanguageHandler): Promise<Tree>;
|
|
14
|
+
/** True once initParser() has completed successfully. */
|
|
15
|
+
export declare function isInitialized(): boolean;
|
|
16
|
+
/** Exposed for testing — resets all state. Use only in tests. */
|
|
17
|
+
export declare function _resetForTesting(): void;
|
|
18
|
+
//# sourceMappingURL=parse-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-dispatcher.d.ts","sourceRoot":"","sources":["../../src/core/parse-dispatcher.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAcvC,eAAO,MAAM,YAAY,QAAuC,CAAC;AAUjE;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAehD;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvF;AAED,yDAAyD;AACzD,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import _ParserImport from 'web-tree-sitter';
|
|
2
|
+
import { createRequire } from 'module';
|
|
3
|
+
import { dirname, resolve } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { GrammarNotFoundError, ParseError } from './errors.js';
|
|
6
|
+
const Parser = (_ParserImport.default ?? _ParserImport);
|
|
7
|
+
const _require = createRequire(import.meta.url);
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
// Resolve grammars/ relative to the compiled output location (dist/core/ → ../../grammars/)
|
|
10
|
+
export const GRAMMARS_DIR = resolve(__dirname, '../../grammars');
|
|
11
|
+
// ─── Module state ─────────────────────────────────────────────────────────────
|
|
12
|
+
let initialized = false;
|
|
13
|
+
let sharedParser = null;
|
|
14
|
+
const languageCache = new Map();
|
|
15
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Initialize web-tree-sitter. Must be called once before parseFile().
|
|
18
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
19
|
+
*/
|
|
20
|
+
export async function initParser() {
|
|
21
|
+
if (initialized)
|
|
22
|
+
return;
|
|
23
|
+
// Locate tree-sitter.wasm next to the web-tree-sitter package entry point
|
|
24
|
+
const wasmPath = resolve(dirname(_require.resolve('web-tree-sitter')), 'tree-sitter.wasm');
|
|
25
|
+
await Parser.init({
|
|
26
|
+
locateFile: () => wasmPath,
|
|
27
|
+
});
|
|
28
|
+
sharedParser = new Parser();
|
|
29
|
+
initialized = true;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parse source bytes using the grammar provided by the given handler.
|
|
33
|
+
* The returned Tree's node startIndex/endIndex are byte offsets into `source`.
|
|
34
|
+
*/
|
|
35
|
+
export async function parseFile(source, handler) {
|
|
36
|
+
if (!initialized || !sharedParser) {
|
|
37
|
+
throw new ParseError('Parser not initialized — call initParser() first', '<unknown>');
|
|
38
|
+
}
|
|
39
|
+
const language = await loadLanguage(handler.grammarPath());
|
|
40
|
+
sharedParser.setLanguage(language);
|
|
41
|
+
// Pass a callback so tree-sitter operates on the raw Buffer bytes.
|
|
42
|
+
// Node startIndex/endIndex are byte offsets into the original source Buffer.
|
|
43
|
+
const tree = sharedParser.parse((startByte) => {
|
|
44
|
+
if (startByte >= source.length)
|
|
45
|
+
return null;
|
|
46
|
+
return source.toString('utf8', startByte);
|
|
47
|
+
});
|
|
48
|
+
return tree;
|
|
49
|
+
}
|
|
50
|
+
/** True once initParser() has completed successfully. */
|
|
51
|
+
export function isInitialized() {
|
|
52
|
+
return initialized;
|
|
53
|
+
}
|
|
54
|
+
/** Exposed for testing — resets all state. Use only in tests. */
|
|
55
|
+
export function _resetForTesting() {
|
|
56
|
+
initialized = false;
|
|
57
|
+
sharedParser = null;
|
|
58
|
+
languageCache.clear();
|
|
59
|
+
}
|
|
60
|
+
// ─── Internals ────────────────────────────────────────────────────────────────
|
|
61
|
+
async function loadLanguage(grammarPath) {
|
|
62
|
+
const cached = languageCache.get(grammarPath);
|
|
63
|
+
if (cached)
|
|
64
|
+
return cached;
|
|
65
|
+
try {
|
|
66
|
+
const language = await Parser.Language.load(grammarPath);
|
|
67
|
+
languageCache.set(grammarPath, language);
|
|
68
|
+
return language;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
throw new GrammarNotFoundError(grammarPath, err);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=parse-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-dispatcher.js","sourceRoot":"","sources":["../../src/core/parse-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preprocesses a raw user query into a valid FTS5 MATCH string.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline:
|
|
5
|
+
* 1. Strip FTS5 special characters that would cause syntax errors.
|
|
6
|
+
* 2. If the input is a multi-word natural-language phrase, pass it through
|
|
7
|
+
* unchanged (FTS5 treats whitespace as implicit AND).
|
|
8
|
+
* 3. If the input is a single snake_case or camelCase identifier, expand it
|
|
9
|
+
* with OR alternatives so partial-word queries still find the symbol.
|
|
10
|
+
* 4. Drop expanded tokens shorter than 2 characters.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Convert a raw search query into an FTS5 MATCH-safe query string.
|
|
14
|
+
*
|
|
15
|
+
* Examples:
|
|
16
|
+
* preprocessQuery('parseFile') → 'parseFile OR parse OR file'
|
|
17
|
+
* preprocessQuery('get_symbol_source') → 'get_symbol_source OR get OR symbol OR source'
|
|
18
|
+
* preprocessQuery('orchestrate indexing') → 'orchestrate indexing'
|
|
19
|
+
* preprocessQuery('"bad chars"') → 'bad chars'
|
|
20
|
+
*/
|
|
21
|
+
export declare function preprocessQuery(raw: string): string;
|
|
22
|
+
//# sourceMappingURL=query-preprocessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-preprocessor.d.ts","sourceRoot":"","sources":["../../../src/core/search/query-preprocessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoCnD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preprocesses a raw user query into a valid FTS5 MATCH string.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline:
|
|
5
|
+
* 1. Strip FTS5 special characters that would cause syntax errors.
|
|
6
|
+
* 2. If the input is a multi-word natural-language phrase, pass it through
|
|
7
|
+
* unchanged (FTS5 treats whitespace as implicit AND).
|
|
8
|
+
* 3. If the input is a single snake_case or camelCase identifier, expand it
|
|
9
|
+
* with OR alternatives so partial-word queries still find the symbol.
|
|
10
|
+
* 4. Drop expanded tokens shorter than 2 characters.
|
|
11
|
+
*/
|
|
12
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Convert a raw search query into an FTS5 MATCH-safe query string.
|
|
15
|
+
*
|
|
16
|
+
* Examples:
|
|
17
|
+
* preprocessQuery('parseFile') → 'parseFile OR parse OR file'
|
|
18
|
+
* preprocessQuery('get_symbol_source') → 'get_symbol_source OR get OR symbol OR source'
|
|
19
|
+
* preprocessQuery('orchestrate indexing') → 'orchestrate indexing'
|
|
20
|
+
* preprocessQuery('"bad chars"') → 'bad chars'
|
|
21
|
+
*/
|
|
22
|
+
export function preprocessQuery(raw) {
|
|
23
|
+
// Step 1: strip/replace characters that have special meaning in FTS5 MATCH syntax.
|
|
24
|
+
// Hyphen is replaced with a space because FTS5 interprets "word-word" as a column
|
|
25
|
+
// filter ("column:token") which causes a syntax error for unknown column names.
|
|
26
|
+
const escaped = raw.replace(/["()\^*+\-]/g, ' ').trim();
|
|
27
|
+
if (!escaped)
|
|
28
|
+
return '';
|
|
29
|
+
// Step 2: if the input contains spaces it is a natural-language phrase —
|
|
30
|
+
// pass it through so FTS5 treats each word as an implicit AND term.
|
|
31
|
+
const words = escaped.split(/\s+/).filter(Boolean);
|
|
32
|
+
if (words.length > 1) {
|
|
33
|
+
return words.join(' ');
|
|
34
|
+
}
|
|
35
|
+
const token = words[0];
|
|
36
|
+
// Step 3a: snake_case expansion — 'get_symbol_source' → parts joined with OR
|
|
37
|
+
if (token.includes('_')) {
|
|
38
|
+
const parts = token.split('_').filter((t) => t.length >= 2);
|
|
39
|
+
if (parts.length > 1) {
|
|
40
|
+
return [token, ...parts].join(' OR ');
|
|
41
|
+
}
|
|
42
|
+
return token;
|
|
43
|
+
}
|
|
44
|
+
// Step 3b: camelCase expansion — 'parseFile' → 'parseFile OR parse OR file'
|
|
45
|
+
const camelParts = splitCamelCase(token);
|
|
46
|
+
if (camelParts.length > 1) {
|
|
47
|
+
const expanded = camelParts
|
|
48
|
+
.map((t) => t.toLowerCase())
|
|
49
|
+
.filter((t) => t.length >= 2);
|
|
50
|
+
return [token, ...expanded].join(' OR ');
|
|
51
|
+
}
|
|
52
|
+
return token;
|
|
53
|
+
}
|
|
54
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Split a camelCase or PascalCase identifier into its component words.
|
|
57
|
+
* All-caps tokens (acronyms: MCP, HTTP) are returned as a single element.
|
|
58
|
+
*
|
|
59
|
+
* Examples:
|
|
60
|
+
* splitCamelCase('parseFile') → ['parse', 'File']
|
|
61
|
+
* splitCamelCase('HybridSearcher') → ['Hybrid', 'Searcher']
|
|
62
|
+
* splitCamelCase('MCP') → ['MCP']
|
|
63
|
+
* splitCamelCase('getHTTPStatus') → ['get', 'HTTP', 'Status']
|
|
64
|
+
*/
|
|
65
|
+
function splitCamelCase(token) {
|
|
66
|
+
// All-caps acronym — do not split
|
|
67
|
+
if (/^[A-Z\d]+$/.test(token))
|
|
68
|
+
return [token];
|
|
69
|
+
const spaced = token
|
|
70
|
+
// Insert space between a lowercase/digit and the next uppercase letter
|
|
71
|
+
.replace(/([a-z\d])([A-Z])/g, '$1 $2')
|
|
72
|
+
// Insert space before the last uppercase letter in a run followed by lowercase
|
|
73
|
+
// e.g. 'HTTPStatus' → 'HTTP Status'
|
|
74
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');
|
|
75
|
+
return spaced.split(' ').filter(Boolean);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=query-preprocessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-preprocessor.js","sourceRoot":"","sources":["../../../src/core/search/query-preprocessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iFAAiF;AAEjF;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,mFAAmF;IACnF,kFAAkF;IAClF,gFAAgF;IAChF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAExD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,yEAAyE;IACzE,oEAAoE;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEvB,6EAA6E;IAC7E,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4EAA4E;IAC5E,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,UAAU;aACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,kCAAkC;IAClC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,KAAK;QAClB,uEAAuE;SACtE,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;QACtC,+EAA+E;QAC/E,oCAAoC;SACnC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-FTS5 relevance re-ranking layer.
|
|
3
|
+
*
|
|
4
|
+
* BM25 ranks by term frequency across all FTS content fields, so a symbol
|
|
5
|
+
* whose summary mentions "index" five times can outrank `indexFolder` whose
|
|
6
|
+
* name is an exact match. This ranker applies an explicit additive scoring
|
|
7
|
+
* scheme that promotes exact name matches to the top.
|
|
8
|
+
*
|
|
9
|
+
* Scoring (additive, higher = more relevant):
|
|
10
|
+
* 100 — exact name match (case-insensitive)
|
|
11
|
+
* 60 — name starts with query
|
|
12
|
+
* 40 — name contains query as substring
|
|
13
|
+
* 30 — all query words appear in name
|
|
14
|
+
* 20 — any query word is exact name match
|
|
15
|
+
* 10 — any query word appears in name (per word)
|
|
16
|
+
* 8 — query phrase in signature
|
|
17
|
+
* 2 — any query word in signature (per word)
|
|
18
|
+
* 5 — query phrase in summary
|
|
19
|
+
* 1 — any query word in summary (per word)
|
|
20
|
+
*/
|
|
21
|
+
import type { SymbolRecord } from '../types.js';
|
|
22
|
+
export interface ScoredSymbol {
|
|
23
|
+
symbol: SymbolRecord;
|
|
24
|
+
score: number;
|
|
25
|
+
matchReason: 'exact_name' | 'prefix_name' | 'name_contains' | 'word_overlap' | 'content_match';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Score and sort a list of symbols by relevance to `query`.
|
|
29
|
+
*
|
|
30
|
+
* Input symbols are assumed to already be filtered by FTS5 (or LIKE) — this
|
|
31
|
+
* layer only re-orders them. Ties in score preserve the original (BM25) order.
|
|
32
|
+
*/
|
|
33
|
+
export declare function rankSymbols(symbols: SymbolRecord[], query: string): ScoredSymbol[];
|
|
34
|
+
//# sourceMappingURL=relevance-ranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relevance-ranker.d.ts","sourceRoot":"","sources":["../../../src/core/search/relevance-ranker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,YAAY,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,CAAC;CAChG;AAID;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAkBlF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-FTS5 relevance re-ranking layer.
|
|
3
|
+
*
|
|
4
|
+
* BM25 ranks by term frequency across all FTS content fields, so a symbol
|
|
5
|
+
* whose summary mentions "index" five times can outrank `indexFolder` whose
|
|
6
|
+
* name is an exact match. This ranker applies an explicit additive scoring
|
|
7
|
+
* scheme that promotes exact name matches to the top.
|
|
8
|
+
*
|
|
9
|
+
* Scoring (additive, higher = more relevant):
|
|
10
|
+
* 100 — exact name match (case-insensitive)
|
|
11
|
+
* 60 — name starts with query
|
|
12
|
+
* 40 — name contains query as substring
|
|
13
|
+
* 30 — all query words appear in name
|
|
14
|
+
* 20 — any query word is exact name match
|
|
15
|
+
* 10 — any query word appears in name (per word)
|
|
16
|
+
* 8 — query phrase in signature
|
|
17
|
+
* 2 — any query word in signature (per word)
|
|
18
|
+
* 5 — query phrase in summary
|
|
19
|
+
* 1 — any query word in summary (per word)
|
|
20
|
+
*/
|
|
21
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Score and sort a list of symbols by relevance to `query`.
|
|
24
|
+
*
|
|
25
|
+
* Input symbols are assumed to already be filtered by FTS5 (or LIKE) — this
|
|
26
|
+
* layer only re-orders them. Ties in score preserve the original (BM25) order.
|
|
27
|
+
*/
|
|
28
|
+
export function rankSymbols(symbols, query) {
|
|
29
|
+
if (symbols.length === 0)
|
|
30
|
+
return [];
|
|
31
|
+
const queryLower = query.trim().toLowerCase();
|
|
32
|
+
const queryWords = extractQueryWords(query.trim());
|
|
33
|
+
const scored = symbols.map((symbol, originalIndex) => ({
|
|
34
|
+
...score(symbol, queryLower, queryWords),
|
|
35
|
+
symbol,
|
|
36
|
+
originalIndex,
|
|
37
|
+
}));
|
|
38
|
+
scored.sort((a, b) => {
|
|
39
|
+
if (b.score !== a.score)
|
|
40
|
+
return b.score - a.score;
|
|
41
|
+
return a.originalIndex - b.originalIndex; // preserve FTS order on tie
|
|
42
|
+
});
|
|
43
|
+
return scored.map(({ symbol, score: s, matchReason }) => ({ symbol, score: s, matchReason }));
|
|
44
|
+
}
|
|
45
|
+
// ─── Scoring ─────────────────────────────────────────────────────────────────
|
|
46
|
+
function score(symbol, queryLower, queryWords) {
|
|
47
|
+
const nameLower = symbol.name.toLowerCase();
|
|
48
|
+
const sigLower = symbol.signature.toLowerCase();
|
|
49
|
+
const sumLower = symbol.summary.toLowerCase();
|
|
50
|
+
let total = 0;
|
|
51
|
+
let matchReason = 'content_match';
|
|
52
|
+
// ── Name-level rules (mutually exclusive for matchReason priority) ──────────
|
|
53
|
+
if (nameLower === queryLower) {
|
|
54
|
+
total += 100;
|
|
55
|
+
matchReason = 'exact_name';
|
|
56
|
+
}
|
|
57
|
+
else if (nameLower.startsWith(queryLower)) {
|
|
58
|
+
total += 60;
|
|
59
|
+
matchReason = 'prefix_name';
|
|
60
|
+
}
|
|
61
|
+
else if (nameLower.includes(queryLower)) {
|
|
62
|
+
total += 40;
|
|
63
|
+
matchReason = 'name_contains';
|
|
64
|
+
}
|
|
65
|
+
// ── Word-overlap rules (always additive; update matchReason if not yet set) ─
|
|
66
|
+
if (queryWords.length > 0) {
|
|
67
|
+
let wordScore = 0;
|
|
68
|
+
if (queryWords.every((w) => nameLower.includes(w))) {
|
|
69
|
+
wordScore += 30;
|
|
70
|
+
}
|
|
71
|
+
if (queryWords.some((w) => nameLower === w)) {
|
|
72
|
+
wordScore += 20;
|
|
73
|
+
}
|
|
74
|
+
const wordsInName = queryWords.filter((w) => nameLower.includes(w)).length;
|
|
75
|
+
wordScore += wordsInName * 10;
|
|
76
|
+
if (wordScore > 0) {
|
|
77
|
+
total += wordScore;
|
|
78
|
+
if (matchReason === 'content_match')
|
|
79
|
+
matchReason = 'word_overlap';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ── Content rules (signature + summary) ────────────────────────────────────
|
|
83
|
+
if (sigLower.includes(queryLower))
|
|
84
|
+
total += 8;
|
|
85
|
+
total += queryWords.filter((w) => sigLower.includes(w)).length * 2;
|
|
86
|
+
if (sumLower.includes(queryLower))
|
|
87
|
+
total += 5;
|
|
88
|
+
total += queryWords.filter((w) => sumLower.includes(w)).length * 1;
|
|
89
|
+
return { score: total, matchReason };
|
|
90
|
+
}
|
|
91
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Extract a deduplicated set of lowercase search terms from the raw query.
|
|
94
|
+
*
|
|
95
|
+
* For camelCase/snake_case identifiers the component words are included so
|
|
96
|
+
* scoring works on both the full token and its parts.
|
|
97
|
+
*
|
|
98
|
+
* Examples:
|
|
99
|
+
* 'indexFolder' → ['indexfolder', 'index', 'folder']
|
|
100
|
+
* 'blast radius' → ['blast', 'radius']
|
|
101
|
+
* 'get_symbol_source'→ ['get_symbol_source', 'get', 'symbol', 'source']
|
|
102
|
+
*/
|
|
103
|
+
function extractQueryWords(raw) {
|
|
104
|
+
const words = new Set();
|
|
105
|
+
for (const part of raw.split(/\s+/).filter(Boolean)) {
|
|
106
|
+
const lower = part.toLowerCase();
|
|
107
|
+
words.add(lower);
|
|
108
|
+
if (part.includes('_')) {
|
|
109
|
+
// snake_case — split on underscores
|
|
110
|
+
for (const seg of part.split('_')) {
|
|
111
|
+
const s = seg.toLowerCase();
|
|
112
|
+
if (s.length >= 2)
|
|
113
|
+
words.add(s);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// camelCase — split on case boundaries using the raw (cased) token
|
|
118
|
+
const parts = part
|
|
119
|
+
.replace(/([a-z\d])([A-Z])/g, '$1 $2')
|
|
120
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
121
|
+
.split(' ')
|
|
122
|
+
.map((s) => s.toLowerCase())
|
|
123
|
+
.filter((s) => s.length >= 2);
|
|
124
|
+
if (parts.length > 1) {
|
|
125
|
+
for (const s of parts)
|
|
126
|
+
words.add(s);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return Array.from(words);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=relevance-ranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relevance-ranker.js","sourceRoot":"","sources":["../../../src/core/search/relevance-ranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PureContextError } from './errors.js';
|
|
2
|
+
export declare class SecurityError extends PureContextError {
|
|
3
|
+
readonly code: 'path_traversal' | 'symlink_escape' | 'file_too_large';
|
|
4
|
+
constructor(code: 'path_traversal' | 'symlink_escape' | 'file_too_large', message: string);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve `filePath` relative to `projectRoot` and verify it stays within the
|
|
8
|
+
* project root. Throws `SecurityError('path_traversal')` on escape attempts.
|
|
9
|
+
* Returns the absolute resolved path.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validatePath(filePath: string, projectRoot: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Verify that `resolvedPath` does not escape `projectRoot` after all symlinks
|
|
14
|
+
* are resolved. Throws `SecurityError('symlink_escape')` if it does.
|
|
15
|
+
* No-ops when the path does not exist (not yet created files are not a threat).
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkSymlinkEscape(resolvedPath: string, projectRoot: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Returns `true` when the file name matches a known credential/secret pattern
|
|
20
|
+
* and should be excluded from indexing. Case-insensitive.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isSecretFile(filePath: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Returns `true` when the content buffer contains a null byte, which is a
|
|
25
|
+
* reliable indicator of binary (non-text) content. Only the first 8192 bytes
|
|
26
|
+
* are examined.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isBinaryFile(content: Buffer): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Read up to `BINARY_PEEK_BYTES` from the beginning of a file for binary
|
|
31
|
+
* detection without loading the whole file into memory.
|
|
32
|
+
* Returns an empty buffer on read failure.
|
|
33
|
+
*/
|
|
34
|
+
export declare function peekFileContent(absPath: string): Buffer;
|
|
35
|
+
export declare const DEFAULT_MAX_FILE_BYTES = 1048576;
|
|
36
|
+
/**
|
|
37
|
+
* Throws `SecurityError('file_too_large')` when `size` exceeds `maxBytes`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkFileSize(size: number, maxBytes?: number): void;
|
|
40
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C,qBAAa,aAAc,SAAQ,gBAAgB;aAE/B,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB;gBAA5D,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,EAC5E,OAAO,EAAE,MAAM;CAIlB;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAa1E;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAyBlF;AAyBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtD;AAMD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcvD;AAID,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAEhD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAA+B,GACxC,IAAI,CAON"}
|