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,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query expansion — generates lightweight variations of a search query to
|
|
3
|
+
* improve recall without requiring API calls.
|
|
4
|
+
*
|
|
5
|
+
* Techniques:
|
|
6
|
+
* - Abbreviation expansion: "auth" → ["authentication", "authorization"]
|
|
7
|
+
* - Camel/snake splitting: "getUserById" → ["get", "user", "by", "id"]
|
|
8
|
+
* - Common synonym expansion for programming terms
|
|
9
|
+
*/
|
|
10
|
+
// ─── Abbreviation Map ─────────────────────────────────────────────────────────
|
|
11
|
+
const ABBREVIATIONS = {
|
|
12
|
+
auth: ['authentication', 'authorization', 'authenticate', 'authorize'],
|
|
13
|
+
authn: ['authentication', 'authenticate'],
|
|
14
|
+
authz: ['authorization', 'authorize'],
|
|
15
|
+
db: ['database'],
|
|
16
|
+
repo: ['repository'],
|
|
17
|
+
cfg: ['config', 'configuration'],
|
|
18
|
+
config: ['configuration'],
|
|
19
|
+
env: ['environment'],
|
|
20
|
+
msg: ['message'],
|
|
21
|
+
err: ['error'],
|
|
22
|
+
req: ['request'],
|
|
23
|
+
res: ['response'],
|
|
24
|
+
resp: ['response'],
|
|
25
|
+
ctx: ['context'],
|
|
26
|
+
fn: ['function'],
|
|
27
|
+
func: ['function'],
|
|
28
|
+
cb: ['callback'],
|
|
29
|
+
param: ['parameter'],
|
|
30
|
+
params: ['parameters'],
|
|
31
|
+
args: ['arguments'],
|
|
32
|
+
arg: ['argument'],
|
|
33
|
+
val: ['value'],
|
|
34
|
+
vals: ['values'],
|
|
35
|
+
idx: ['index'],
|
|
36
|
+
info: ['information'],
|
|
37
|
+
mgr: ['manager'],
|
|
38
|
+
svc: ['service'],
|
|
39
|
+
srv: ['server'],
|
|
40
|
+
cmd: ['command'],
|
|
41
|
+
cmds: ['commands'],
|
|
42
|
+
init: ['initialize', 'initialization'],
|
|
43
|
+
util: ['utility', 'utilities'],
|
|
44
|
+
utils: ['utilities', 'utility'],
|
|
45
|
+
impl: ['implementation', 'implement'],
|
|
46
|
+
def: ['definition', 'default'],
|
|
47
|
+
calc: ['calculate', 'calculation'],
|
|
48
|
+
max: ['maximum'],
|
|
49
|
+
min: ['minimum'],
|
|
50
|
+
num: ['number'],
|
|
51
|
+
str: ['string'],
|
|
52
|
+
int: ['integer'],
|
|
53
|
+
bool: ['boolean'],
|
|
54
|
+
buf: ['buffer'],
|
|
55
|
+
perm: ['permission'],
|
|
56
|
+
perms: ['permissions'],
|
|
57
|
+
pwd: ['password'],
|
|
58
|
+
usr: ['user'],
|
|
59
|
+
addr: ['address'],
|
|
60
|
+
conn: ['connection'],
|
|
61
|
+
conns: ['connections'],
|
|
62
|
+
};
|
|
63
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* Split a camelCase or snake_case identifier into lowercase tokens.
|
|
66
|
+
*
|
|
67
|
+
* Examples:
|
|
68
|
+
* getUserById → ['get', 'user', 'by', 'id']
|
|
69
|
+
* validate_user → ['validate', 'user']
|
|
70
|
+
* HTTPSClient → ['https', 'client']
|
|
71
|
+
*/
|
|
72
|
+
function splitIdentifier(word) {
|
|
73
|
+
// snake_case / kebab-case split
|
|
74
|
+
const parts = word.replace(/[-_]/g, ' ').split(' ');
|
|
75
|
+
const tokens = [];
|
|
76
|
+
for (const part of parts) {
|
|
77
|
+
// camelCase / PascalCase split: insert space before uppercase sequences
|
|
78
|
+
const camelSplit = part
|
|
79
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
80
|
+
.replace(/([a-z\d])([A-Z])/g, '$1 $2')
|
|
81
|
+
.toLowerCase()
|
|
82
|
+
.split(' ')
|
|
83
|
+
.filter(Boolean);
|
|
84
|
+
tokens.push(...camelSplit);
|
|
85
|
+
}
|
|
86
|
+
return tokens;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Expand a single token using the abbreviation map.
|
|
90
|
+
* Returns the token itself plus any expansions.
|
|
91
|
+
*/
|
|
92
|
+
function expandToken(token) {
|
|
93
|
+
const lower = token.toLowerCase();
|
|
94
|
+
const expansions = ABBREVIATIONS[lower];
|
|
95
|
+
return expansions ? [lower, ...expansions] : [lower];
|
|
96
|
+
}
|
|
97
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* Generate query variations for better semantic search coverage.
|
|
100
|
+
*
|
|
101
|
+
* The returned array always includes the original query as the first element.
|
|
102
|
+
* Duplicates are removed. The result is limited to 8 variations to keep
|
|
103
|
+
* embedding costs bounded.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* expandQuery('auth')
|
|
107
|
+
* // → ['auth', 'authentication', 'authorization', 'authenticate', 'authorize']
|
|
108
|
+
*
|
|
109
|
+
* expandQuery('getUserById')
|
|
110
|
+
* // → ['getUserById', 'get user by id', 'getuser', 'by', 'id']
|
|
111
|
+
*/
|
|
112
|
+
export function expandQuery(query) {
|
|
113
|
+
const seen = new Set();
|
|
114
|
+
const results = [];
|
|
115
|
+
function add(s) {
|
|
116
|
+
const trimmed = s.trim();
|
|
117
|
+
if (trimmed && !seen.has(trimmed)) {
|
|
118
|
+
seen.add(trimmed);
|
|
119
|
+
results.push(trimmed);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Always include the original
|
|
123
|
+
add(query);
|
|
124
|
+
const words = query.trim().split(/\s+/);
|
|
125
|
+
// If query is a single word, try identifier splitting
|
|
126
|
+
if (words.length === 1) {
|
|
127
|
+
const tokens = splitIdentifier(query);
|
|
128
|
+
// Joined form (e.g., 'get user by id')
|
|
129
|
+
if (tokens.length > 1) {
|
|
130
|
+
add(tokens.join(' '));
|
|
131
|
+
}
|
|
132
|
+
// Abbreviation expansions for the whole word and each token
|
|
133
|
+
for (const token of [query.toLowerCase(), ...tokens]) {
|
|
134
|
+
for (const expansion of expandToken(token)) {
|
|
135
|
+
add(expansion);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// Multi-word query: expand each word individually
|
|
141
|
+
for (const word of words) {
|
|
142
|
+
for (const expansion of expandToken(word)) {
|
|
143
|
+
add(expansion);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Cap at 8 variations to keep embedding cost bounded
|
|
148
|
+
return results.slice(0, 8);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=query-expansion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-expansion.js","sourceRoot":"","sources":["../../src/semantic/query-expansion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SemanticIndexer — orchestrates the full semantic indexing pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Decides whether a repo should be semantically indexed, batches symbols,
|
|
5
|
+
* generates embeddings, and updates the HNSW vector store incrementally.
|
|
6
|
+
*
|
|
7
|
+
* The threshold gate (`shouldIndex`) keeps FTS-only search for small repos
|
|
8
|
+
* where HNSW provides no benefit while adding API cost.
|
|
9
|
+
*/
|
|
10
|
+
import type Database from 'better-sqlite3';
|
|
11
|
+
import type { SymbolRecord } from '../core/types.js';
|
|
12
|
+
import type { PureContextConfig } from '../config/config-schema.js';
|
|
13
|
+
import { type EmbeddingProvider } from './embedding-provider.js';
|
|
14
|
+
import { type VectorStoreOptions } from './vector-store.js';
|
|
15
|
+
export interface SemanticIndexResult {
|
|
16
|
+
symbolsIndexed: number;
|
|
17
|
+
embeddingTimeMs: number;
|
|
18
|
+
indexBuildTimeMs: number;
|
|
19
|
+
indexSizeBytes: number;
|
|
20
|
+
}
|
|
21
|
+
export interface SemanticIndexerOptions {
|
|
22
|
+
/** Optional overrides forwarded to VectorStore (useful for tests to set indexDir). */
|
|
23
|
+
storeOptions?: VectorStoreOptions;
|
|
24
|
+
/**
|
|
25
|
+
* Override the embedding provider factory (used in tests to inject a mock provider
|
|
26
|
+
* without having to mock the module).
|
|
27
|
+
*/
|
|
28
|
+
providerFactory?: (config: PureContextConfig) => EmbeddingProvider;
|
|
29
|
+
}
|
|
30
|
+
export declare class SemanticIndexer {
|
|
31
|
+
private readonly config;
|
|
32
|
+
private readonly storeOptions;
|
|
33
|
+
private readonly providerFactory;
|
|
34
|
+
constructor(config: PureContextConfig, options?: SemanticIndexerOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Returns true when semantic indexing should run for this repo.
|
|
37
|
+
* Requires `semantic.enabled`, a non-'none' provider, and enough symbols.
|
|
38
|
+
*/
|
|
39
|
+
shouldIndex(_repoId: string, symbolCount: number): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Embed all `symbols` and build a new HNSW index for `repoId`.
|
|
42
|
+
*
|
|
43
|
+
* Processing is batched according to `semantic.batchSize` and
|
|
44
|
+
* parallelized up to `semantic.concurrency` concurrent batches.
|
|
45
|
+
*/
|
|
46
|
+
index(repoId: string, symbols: SymbolRecord[], db: Database.Database): Promise<SemanticIndexResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Update the HNSW index after incremental file changes.
|
|
49
|
+
*
|
|
50
|
+
* - `added`: new or modified symbols to embed and add
|
|
51
|
+
* - `removed`: symbol IDs to remove from the index
|
|
52
|
+
*/
|
|
53
|
+
updateIncremental(repoId: string, added: SymbolRecord[], removed: string[], db: Database.Database): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Split `symbols` into batches and embed them with bounded concurrency.
|
|
56
|
+
*/
|
|
57
|
+
private processBatches;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a `SemanticIndexer` if semantic search is configured, else null.
|
|
61
|
+
* Returns null when `semantic.provider === 'none'` or `!semantic.enabled`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function createSemanticIndexer(config: PureContextConfig): SemanticIndexer | null;
|
|
64
|
+
//# sourceMappingURL=semantic-indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-indexer.d.ts","sourceRoot":"","sources":["../../src/semantic/semantic-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIzE,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,sBAAsB;IACrC,sFAAsF;IACtF,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,iBAAiB,CAAC;CACpE;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmD;gBAEvE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAE,sBAA2B;IAQ3E;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAS1D;;;;;OAKG;IACG,KAAK,CACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,EAAE,EACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,OAAO,CAAC,mBAAmB,CAAC;IAwC/B;;;;;OAKG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,MAAM,EAAE,EACjB,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,OAAO,CAAC,IAAI,CAAC;IAgChB;;OAEG;YACW,cAAc;CAmC7B;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAevF"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SemanticIndexer — orchestrates the full semantic indexing pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Decides whether a repo should be semantically indexed, batches symbols,
|
|
5
|
+
* generates embeddings, and updates the HNSW vector store incrementally.
|
|
6
|
+
*
|
|
7
|
+
* The threshold gate (`shouldIndex`) keeps FTS-only search for small repos
|
|
8
|
+
* where HNSW provides no benefit while adding API cost.
|
|
9
|
+
*/
|
|
10
|
+
import { PureContextError } from '../core/errors.js';
|
|
11
|
+
import { logger } from '../core/logger.js';
|
|
12
|
+
import { createEmbeddingProvider } from './embedding-provider.js';
|
|
13
|
+
import { VectorStore } from './vector-store.js';
|
|
14
|
+
export class SemanticIndexer {
|
|
15
|
+
config;
|
|
16
|
+
storeOptions;
|
|
17
|
+
providerFactory;
|
|
18
|
+
constructor(config, options = {}) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.storeOptions = options.storeOptions ?? {};
|
|
21
|
+
this.providerFactory = options.providerFactory ?? createEmbeddingProvider;
|
|
22
|
+
}
|
|
23
|
+
// ─── Gate ────────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Returns true when semantic indexing should run for this repo.
|
|
26
|
+
* Requires `semantic.enabled`, a non-'none' provider, and enough symbols.
|
|
27
|
+
*/
|
|
28
|
+
shouldIndex(_repoId, symbolCount) {
|
|
29
|
+
const { semantic } = this.config;
|
|
30
|
+
if (!semantic.enabled)
|
|
31
|
+
return false;
|
|
32
|
+
if (semantic.provider === 'none')
|
|
33
|
+
return false;
|
|
34
|
+
return symbolCount >= semantic.threshold;
|
|
35
|
+
}
|
|
36
|
+
// ─── Full index ──────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Embed all `symbols` and build a new HNSW index for `repoId`.
|
|
39
|
+
*
|
|
40
|
+
* Processing is batched according to `semantic.batchSize` and
|
|
41
|
+
* parallelized up to `semantic.concurrency` concurrent batches.
|
|
42
|
+
*/
|
|
43
|
+
async index(repoId, symbols, db) {
|
|
44
|
+
const t0 = Date.now();
|
|
45
|
+
const provider = this.providerFactory(this.config);
|
|
46
|
+
const store = new VectorStore(repoId, provider, db, this.storeOptions);
|
|
47
|
+
logger.info('SemanticIndexer: starting full index', {
|
|
48
|
+
repoId,
|
|
49
|
+
symbolCount: symbols.length,
|
|
50
|
+
batchSize: this.config.semantic.batchSize,
|
|
51
|
+
concurrency: this.config.semantic.concurrency,
|
|
52
|
+
});
|
|
53
|
+
const embeddingStart = Date.now();
|
|
54
|
+
await this.processBatches(store, symbols);
|
|
55
|
+
const embeddingTimeMs = Date.now() - embeddingStart;
|
|
56
|
+
const indexBuildStart = Date.now();
|
|
57
|
+
store.saveIndex();
|
|
58
|
+
const indexBuildTimeMs = Date.now() - indexBuildStart;
|
|
59
|
+
const result = {
|
|
60
|
+
symbolsIndexed: store.size,
|
|
61
|
+
embeddingTimeMs,
|
|
62
|
+
indexBuildTimeMs,
|
|
63
|
+
// Size approximation: each vector is dimension * 4 bytes + overhead
|
|
64
|
+
indexSizeBytes: store.size * provider.dimension * 4,
|
|
65
|
+
};
|
|
66
|
+
logger.info('SemanticIndexer: index complete', {
|
|
67
|
+
repoId,
|
|
68
|
+
...result,
|
|
69
|
+
totalMs: Date.now() - t0,
|
|
70
|
+
});
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
// ─── Incremental update ──────────────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Update the HNSW index after incremental file changes.
|
|
76
|
+
*
|
|
77
|
+
* - `added`: new or modified symbols to embed and add
|
|
78
|
+
* - `removed`: symbol IDs to remove from the index
|
|
79
|
+
*/
|
|
80
|
+
async updateIncremental(repoId, added, removed, db) {
|
|
81
|
+
if (added.length === 0 && removed.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
const provider = this.providerFactory(this.config);
|
|
84
|
+
const store = new VectorStore(repoId, provider, db, this.storeOptions);
|
|
85
|
+
// Restore in-memory HNSW from disk or SQLite
|
|
86
|
+
const loaded = store.loadIndex();
|
|
87
|
+
if (!loaded) {
|
|
88
|
+
await store.rebuild();
|
|
89
|
+
}
|
|
90
|
+
if (removed.length > 0) {
|
|
91
|
+
store.removeSymbols(removed);
|
|
92
|
+
logger.debug('SemanticIndexer: removed symbols', { repoId, count: removed.length });
|
|
93
|
+
}
|
|
94
|
+
if (added.length > 0) {
|
|
95
|
+
await this.processBatches(store, added);
|
|
96
|
+
logger.debug('SemanticIndexer: added symbols', { repoId, count: added.length });
|
|
97
|
+
}
|
|
98
|
+
store.saveIndex();
|
|
99
|
+
logger.info('SemanticIndexer: incremental update complete', {
|
|
100
|
+
repoId,
|
|
101
|
+
added: added.length,
|
|
102
|
+
removed: removed.length,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// ─── Batch processing ────────────────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Split `symbols` into batches and embed them with bounded concurrency.
|
|
108
|
+
*/
|
|
109
|
+
async processBatches(store, symbols) {
|
|
110
|
+
const { batchSize, concurrency } = this.config.semantic;
|
|
111
|
+
// Slice into batches
|
|
112
|
+
const batches = [];
|
|
113
|
+
for (let i = 0; i < symbols.length; i += batchSize) {
|
|
114
|
+
batches.push(symbols.slice(i, i + batchSize));
|
|
115
|
+
}
|
|
116
|
+
logger.info('SemanticIndexer: processing batches', {
|
|
117
|
+
total: symbols.length,
|
|
118
|
+
batches: batches.length,
|
|
119
|
+
batchSize,
|
|
120
|
+
concurrency,
|
|
121
|
+
});
|
|
122
|
+
// Process with bounded concurrency
|
|
123
|
+
let batchIndex = 0;
|
|
124
|
+
async function worker() {
|
|
125
|
+
while (batchIndex < batches.length) {
|
|
126
|
+
const idx = batchIndex++;
|
|
127
|
+
const batch = batches[idx];
|
|
128
|
+
logger.debug('SemanticIndexer: embedding batch', {
|
|
129
|
+
batch: idx + 1,
|
|
130
|
+
of: batches.length,
|
|
131
|
+
size: batch.length,
|
|
132
|
+
});
|
|
133
|
+
await store.indexSymbols(batch);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const workers = Array.from({ length: Math.min(concurrency, batches.length) }, worker);
|
|
137
|
+
await Promise.all(workers);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ─── Factory ──────────────────────────────────────────────────────────────────
|
|
141
|
+
/**
|
|
142
|
+
* Create a `SemanticIndexer` if semantic search is configured, else null.
|
|
143
|
+
* Returns null when `semantic.provider === 'none'` or `!semantic.enabled`.
|
|
144
|
+
*/
|
|
145
|
+
export function createSemanticIndexer(config) {
|
|
146
|
+
if (!config.semantic.enabled || config.semantic.provider === 'none') {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
// Validate the provider can be constructed (throws if misconfigured)
|
|
151
|
+
createEmbeddingProvider(config);
|
|
152
|
+
return new SemanticIndexer(config, {});
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
if (err instanceof PureContextError) {
|
|
156
|
+
logger.warn(`SemanticIndexer: provider misconfigured — ${err.message}`);
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
throw err;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=semantic-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-indexer.js","sourceRoot":"","sources":["../../src/semantic/semantic-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text preparation utilities for embedding generation.
|
|
3
|
+
*
|
|
4
|
+
* Converts SymbolRecord fields into a single string suitable for embedding.
|
|
5
|
+
* Consistent formatting across providers ensures comparable vector spaces.
|
|
6
|
+
*/
|
|
7
|
+
import type { SymbolRecord } from '../core/types.js';
|
|
8
|
+
import type { EmbeddingProvider } from './embedding-provider.js';
|
|
9
|
+
/**
|
|
10
|
+
* Combine a symbol's name, signature, and summary into a single embedding text.
|
|
11
|
+
*
|
|
12
|
+
* Format: `{name}: {signature}\n{summary}`
|
|
13
|
+
*
|
|
14
|
+
* If a `docstring` is stored in `frameworkMeta.docstring`, it is appended
|
|
15
|
+
* as a third line. The result is truncated to `maxTokens` (estimated).
|
|
16
|
+
*/
|
|
17
|
+
export declare function prepareSymbolText(symbol: SymbolRecord, maxTokens?: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Prepare a batch of symbols for embedding.
|
|
20
|
+
* Each text is independently truncated to the provider's `maxTokens` limit.
|
|
21
|
+
*/
|
|
22
|
+
export declare function prepareBatch(symbols: SymbolRecord[], provider: Pick<EmbeddingProvider, 'maxTokens'>): string[];
|
|
23
|
+
//# sourceMappingURL=text-preparation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-preparation.d.ts","sourceRoot":"","sources":["../../src/semantic/text-preparation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAmBjE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,SAAS,GAAE,MAAa,GACvB,MAAM,CAwBR;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,GAC7C,MAAM,EAAE,CAEV"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text preparation utilities for embedding generation.
|
|
3
|
+
*
|
|
4
|
+
* Converts SymbolRecord fields into a single string suitable for embedding.
|
|
5
|
+
* Consistent formatting across providers ensures comparable vector spaces.
|
|
6
|
+
*/
|
|
7
|
+
// ─── Character-based token estimation ────────────────────────────────────────
|
|
8
|
+
/**
|
|
9
|
+
* Rough token estimate: 1 token ≈ 4 characters (works well for code).
|
|
10
|
+
* Used for truncation — not for billing.
|
|
11
|
+
*/
|
|
12
|
+
function estimateTokens(text) {
|
|
13
|
+
return Math.ceil(text.length / 4);
|
|
14
|
+
}
|
|
15
|
+
function truncateToTokens(text, maxTokens) {
|
|
16
|
+
const maxChars = maxTokens * 4;
|
|
17
|
+
return text.length <= maxChars ? text : text.slice(0, maxChars);
|
|
18
|
+
}
|
|
19
|
+
// ─── Symbol text preparation ──────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Combine a symbol's name, signature, and summary into a single embedding text.
|
|
22
|
+
*
|
|
23
|
+
* Format: `{name}: {signature}\n{summary}`
|
|
24
|
+
*
|
|
25
|
+
* If a `docstring` is stored in `frameworkMeta.docstring`, it is appended
|
|
26
|
+
* as a third line. The result is truncated to `maxTokens` (estimated).
|
|
27
|
+
*/
|
|
28
|
+
export function prepareSymbolText(symbol, maxTokens = 4096) {
|
|
29
|
+
const parts = [];
|
|
30
|
+
// Line 1: name + signature
|
|
31
|
+
const sig = symbol.signature.trim();
|
|
32
|
+
parts.push(sig ? `${symbol.name}: ${sig}` : symbol.name);
|
|
33
|
+
// Line 2: summary (skip if empty or identical to signature)
|
|
34
|
+
const summary = symbol.summary.trim();
|
|
35
|
+
if (summary && summary !== sig) {
|
|
36
|
+
parts.push(summary);
|
|
37
|
+
}
|
|
38
|
+
// Line 3: docstring from frameworkMeta (optional)
|
|
39
|
+
const docstring = symbol.frameworkMeta?.['docstring'];
|
|
40
|
+
if (typeof docstring === 'string' && docstring.trim()) {
|
|
41
|
+
const doc = docstring.trim();
|
|
42
|
+
if (doc !== summary) {
|
|
43
|
+
parts.push(doc);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const text = parts.join('\n');
|
|
47
|
+
return truncateToTokens(text, maxTokens);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Prepare a batch of symbols for embedding.
|
|
51
|
+
* Each text is independently truncated to the provider's `maxTokens` limit.
|
|
52
|
+
*/
|
|
53
|
+
export function prepareBatch(symbols, provider) {
|
|
54
|
+
return symbols.map((s) => prepareSymbolText(s, provider.maxTokens));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=text-preparation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-preparation.js","sourceRoot":"","sources":["../../src/semantic/text-preparation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IACvD,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAoB,EACpB,YAAoB,IAAI;IAExB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,2BAA2B;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEzD,4DAA4D;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,kDAAkD;IAClD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAuB,EACvB,QAA8C;IAE9C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VectorStore — coordinates embedding generation, HNSW indexing, and SQLite persistence.
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle:
|
|
5
|
+
* 1. `indexSymbols(symbols)` — embed + add to HNSW + persist embeddings to SQLite
|
|
6
|
+
* 2. `searchSimilar(query, k)` — embed query → HNSW search → return SymbolRecords
|
|
7
|
+
* 3. `removeSymbols(ids)` — mark deleted in HNSW + delete from SQLite
|
|
8
|
+
* 4. `rebuild()` — load embeddings from SQLite and reconstruct the HNSW in-memory
|
|
9
|
+
*
|
|
10
|
+
* The HNSW index is held in memory. On startup, call `rebuild()` to restore from disk
|
|
11
|
+
* (SQLite embeddings are faster to reload than re-calling the embedding API).
|
|
12
|
+
*
|
|
13
|
+
* Index file: `~/.purecontext/indexes/{repoId}/hnsw.idx`
|
|
14
|
+
*/
|
|
15
|
+
import type Database from 'better-sqlite3';
|
|
16
|
+
import type { SymbolRecord } from '../core/types.js';
|
|
17
|
+
import type { EmbeddingProvider } from './embedding-provider.js';
|
|
18
|
+
export interface VectorStoreOptions {
|
|
19
|
+
/** Max elements the HNSW index can hold (default: 200_000). */
|
|
20
|
+
maxElements?: number;
|
|
21
|
+
/** HNSW M parameter — connections per node (default: 16). */
|
|
22
|
+
M?: number;
|
|
23
|
+
/** HNSW efConstruction — build quality (default: 200). */
|
|
24
|
+
efConstruction?: number;
|
|
25
|
+
/** HNSW efSearch — search quality (default: 100). */
|
|
26
|
+
efSearch?: number;
|
|
27
|
+
/** Root directory for index files (default: ~/.purecontext/indexes). */
|
|
28
|
+
indexDir?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class VectorStore {
|
|
31
|
+
private readonly repoId;
|
|
32
|
+
private readonly provider;
|
|
33
|
+
private readonly db;
|
|
34
|
+
private readonly indexPath;
|
|
35
|
+
private readonly maxElements;
|
|
36
|
+
private readonly M;
|
|
37
|
+
private readonly efConstruction;
|
|
38
|
+
private readonly efSearch;
|
|
39
|
+
private hnsw;
|
|
40
|
+
constructor(repoId: string, provider: EmbeddingProvider, db: Database.Database, options?: VectorStoreOptions);
|
|
41
|
+
private makeIndex;
|
|
42
|
+
/**
|
|
43
|
+
* Embed `symbols` and add them to the HNSW index and SQLite embeddings table.
|
|
44
|
+
* Already-indexed symbols (by ID) are skipped.
|
|
45
|
+
*/
|
|
46
|
+
indexSymbols(symbols: SymbolRecord[]): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Find the `k` most similar symbols to `query` text.
|
|
49
|
+
* Returns IDs sorted by ascending cosine distance (nearest first).
|
|
50
|
+
*/
|
|
51
|
+
searchSimilar(query: string, k: number): Promise<Array<{
|
|
52
|
+
id: string;
|
|
53
|
+
distance: number;
|
|
54
|
+
}>>;
|
|
55
|
+
/**
|
|
56
|
+
* Remove symbols from the HNSW index and SQLite embeddings.
|
|
57
|
+
*/
|
|
58
|
+
removeSymbols(ids: string[]): void;
|
|
59
|
+
/**
|
|
60
|
+
* Reconstruct the in-memory HNSW index from embeddings stored in SQLite.
|
|
61
|
+
* Call this on startup instead of re-embedding all symbols.
|
|
62
|
+
*/
|
|
63
|
+
rebuild(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Save the HNSW index to disk.
|
|
66
|
+
* Call after bulk indexing to avoid rebuilding on next startup.
|
|
67
|
+
*/
|
|
68
|
+
saveIndex(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Load the HNSW index from disk (if it exists).
|
|
71
|
+
* Faster than `rebuild()` — no SQLite round-trip.
|
|
72
|
+
*/
|
|
73
|
+
loadIndex(): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Full re-index: clear all embeddings and rebuild from scratch.
|
|
76
|
+
*/
|
|
77
|
+
fullReindex(symbols: SymbolRecord[]): Promise<void>;
|
|
78
|
+
/** Number of live vectors in the HNSW index. */
|
|
79
|
+
get size(): number;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=vector-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/semantic/vector-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAYjE,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,OAAO,CAAC,IAAI,CAAY;gBAGtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,iBAAiB,EAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE,kBAAuB;IAiBlC,OAAO,CAAC,SAAS;IAYjB;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC1D;;;OAGG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAW/F;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IASlC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB9B;;;OAGG;IACH,SAAS,IAAI,IAAI;IAIjB;;;OAGG;IACH,SAAS,IAAI,OAAO;IAUpB;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,gDAAgD;IAChD,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|