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,155 @@
|
|
|
1
|
+
import { StorageError } from '../errors.js';
|
|
2
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
3
|
+
function rowToEdge(row) {
|
|
4
|
+
return {
|
|
5
|
+
repoId: row.repo_id,
|
|
6
|
+
sourceFile: row.source_file,
|
|
7
|
+
sourceSymbolId: row.source_symbol_id,
|
|
8
|
+
targetFile: row.target_file,
|
|
9
|
+
targetSymbolId: row.target_symbol_id,
|
|
10
|
+
edgeType: row.edge_type,
|
|
11
|
+
specifier: row.specifier,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function rowToSymbol(row) {
|
|
15
|
+
return {
|
|
16
|
+
id: row.id,
|
|
17
|
+
name: row.name,
|
|
18
|
+
kind: row.kind,
|
|
19
|
+
filePath: row.file_path,
|
|
20
|
+
startByte: row.start_byte,
|
|
21
|
+
endByte: row.end_byte,
|
|
22
|
+
signature: row.signature,
|
|
23
|
+
summary: row.summary,
|
|
24
|
+
frameworkMeta: row.framework_meta
|
|
25
|
+
? JSON.parse(row.framework_meta)
|
|
26
|
+
: undefined,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
30
|
+
export function insertEdges(db, edges, tenantId = 'local') {
|
|
31
|
+
if (edges.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
const stmt = db.prepare(`
|
|
34
|
+
INSERT INTO dep_edges
|
|
35
|
+
(repo_id, source_file, source_symbol_id, target_file, target_symbol_id, edge_type, specifier, tenant_id)
|
|
36
|
+
VALUES
|
|
37
|
+
(@repoId, @sourceFile, @sourceSymbolId, @targetFile, @targetSymbolId, @edgeType, @specifier, @tenantId)
|
|
38
|
+
`);
|
|
39
|
+
const insert = db.transaction((rows) => {
|
|
40
|
+
for (const e of rows) {
|
|
41
|
+
try {
|
|
42
|
+
stmt.run({
|
|
43
|
+
repoId: e.repoId,
|
|
44
|
+
sourceFile: e.sourceFile,
|
|
45
|
+
sourceSymbolId: e.sourceSymbolId ?? null,
|
|
46
|
+
targetFile: e.targetFile,
|
|
47
|
+
targetSymbolId: e.targetSymbolId ?? null,
|
|
48
|
+
edgeType: e.edgeType,
|
|
49
|
+
specifier: e.specifier,
|
|
50
|
+
tenantId,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw new StorageError(`Failed to insert edge ${e.sourceFile} → ${e.targetFile}`, 'insertEdges', err);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
insert(edges);
|
|
59
|
+
}
|
|
60
|
+
export function deleteEdgesByFile(db, repoId, filePath) {
|
|
61
|
+
db.prepare('DELETE FROM dep_edges WHERE repo_id = ? AND (source_file = ? OR target_file = ?)').run(repoId, filePath, filePath);
|
|
62
|
+
}
|
|
63
|
+
/** All dependency edges for a repo. */
|
|
64
|
+
export function getAllDepEdges(db, repoId, tenantId) {
|
|
65
|
+
if (tenantId !== undefined) {
|
|
66
|
+
return db
|
|
67
|
+
.prepare('SELECT * FROM dep_edges WHERE repo_id = ? AND tenant_id = ?')
|
|
68
|
+
.all(repoId, tenantId)
|
|
69
|
+
.map(rowToEdge);
|
|
70
|
+
}
|
|
71
|
+
return db
|
|
72
|
+
.prepare('SELECT * FROM dep_edges WHERE repo_id = ?')
|
|
73
|
+
.all(repoId)
|
|
74
|
+
.map(rowToEdge);
|
|
75
|
+
}
|
|
76
|
+
/** Files and symbols that `sourceFile` imports (forward walk, one hop). */
|
|
77
|
+
export function getForwardDeps(db, repoId, sourceFile, tenantId) {
|
|
78
|
+
if (tenantId !== undefined) {
|
|
79
|
+
return db
|
|
80
|
+
.prepare('SELECT * FROM dep_edges WHERE repo_id = ? AND source_file = ? AND tenant_id = ?')
|
|
81
|
+
.all(repoId, sourceFile, tenantId)
|
|
82
|
+
.map(rowToEdge);
|
|
83
|
+
}
|
|
84
|
+
return db
|
|
85
|
+
.prepare('SELECT * FROM dep_edges WHERE repo_id = ? AND source_file = ?')
|
|
86
|
+
.all(repoId, sourceFile)
|
|
87
|
+
.map(rowToEdge);
|
|
88
|
+
}
|
|
89
|
+
/** Files and symbols that import `targetFile` (reverse walk, one hop). */
|
|
90
|
+
export function getReverseDeps(db, repoId, targetFile, tenantId) {
|
|
91
|
+
if (tenantId !== undefined) {
|
|
92
|
+
return db
|
|
93
|
+
.prepare('SELECT * FROM dep_edges WHERE repo_id = ? AND target_file = ? AND tenant_id = ?')
|
|
94
|
+
.all(repoId, targetFile, tenantId)
|
|
95
|
+
.map(rowToEdge);
|
|
96
|
+
}
|
|
97
|
+
return db
|
|
98
|
+
.prepare('SELECT * FROM dep_edges WHERE repo_id = ? AND target_file = ?')
|
|
99
|
+
.all(repoId, targetFile)
|
|
100
|
+
.map(rowToEdge);
|
|
101
|
+
}
|
|
102
|
+
/** Distinct file paths that import `targetFile`. */
|
|
103
|
+
export function getImportersOf(db, repoId, targetFile, tenantId) {
|
|
104
|
+
if (tenantId !== undefined) {
|
|
105
|
+
return db
|
|
106
|
+
.prepare('SELECT DISTINCT source_file FROM dep_edges WHERE repo_id = ? AND target_file = ? AND tenant_id = ?')
|
|
107
|
+
.all(repoId, targetFile, tenantId)
|
|
108
|
+
.map((r) => r.source_file);
|
|
109
|
+
}
|
|
110
|
+
return db
|
|
111
|
+
.prepare('SELECT DISTINCT source_file FROM dep_edges WHERE repo_id = ? AND target_file = ?')
|
|
112
|
+
.all(repoId, targetFile)
|
|
113
|
+
.map((r) => r.source_file);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Returns exported symbols whose file is never imported by any other file in
|
|
117
|
+
* the repo. Phase 1: file-level dead code detection.
|
|
118
|
+
*/
|
|
119
|
+
export function findDeadExports(db, repoId, tenantId) {
|
|
120
|
+
if (tenantId !== undefined) {
|
|
121
|
+
return db
|
|
122
|
+
.prepare(`
|
|
123
|
+
SELECT s.id, s.name, s.kind, s.file_path, s.start_byte, s.end_byte,
|
|
124
|
+
s.signature, s.summary, s.framework_meta
|
|
125
|
+
FROM symbols s
|
|
126
|
+
WHERE s.repo_id = ?
|
|
127
|
+
AND s.tenant_id = ?
|
|
128
|
+
AND NOT EXISTS (
|
|
129
|
+
SELECT 1 FROM dep_edges e
|
|
130
|
+
WHERE e.repo_id = ?
|
|
131
|
+
AND e.tenant_id = ?
|
|
132
|
+
AND e.target_file = s.file_path
|
|
133
|
+
)
|
|
134
|
+
ORDER BY s.file_path, s.start_byte
|
|
135
|
+
`)
|
|
136
|
+
.all(repoId, tenantId, repoId, tenantId)
|
|
137
|
+
.map(rowToSymbol);
|
|
138
|
+
}
|
|
139
|
+
return db
|
|
140
|
+
.prepare(`
|
|
141
|
+
SELECT s.id, s.name, s.kind, s.file_path, s.start_byte, s.end_byte,
|
|
142
|
+
s.signature, s.summary, s.framework_meta
|
|
143
|
+
FROM symbols s
|
|
144
|
+
WHERE s.repo_id = ?
|
|
145
|
+
AND NOT EXISTS (
|
|
146
|
+
SELECT 1 FROM dep_edges e
|
|
147
|
+
WHERE e.repo_id = ?
|
|
148
|
+
AND e.target_file = s.file_path
|
|
149
|
+
)
|
|
150
|
+
ORDER BY s.file_path, s.start_byte
|
|
151
|
+
`)
|
|
152
|
+
.all(repoId, repoId)
|
|
153
|
+
.map(rowToSymbol);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=dep-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep-store.js","sourceRoot":"","sources":["../../../src/core/db/dep-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite persistence layer for symbol embedding vectors.
|
|
3
|
+
*
|
|
4
|
+
* Stores Float32Array embeddings as BLOB (binary) so they can be loaded back
|
|
5
|
+
* after a restart and used to rebuild the HNSW in-memory index without re-calling
|
|
6
|
+
* the embedding API.
|
|
7
|
+
*
|
|
8
|
+
* Table: embeddings
|
|
9
|
+
* symbol_id TEXT PK — matches symbols.id
|
|
10
|
+
* repo_id TEXT — for scoped queries / bulk delete
|
|
11
|
+
* embedding BLOB — raw Float32Array bytes (little-endian, 4 bytes per float)
|
|
12
|
+
* dimension INTEGER — number of floats (sanity check)
|
|
13
|
+
* provider TEXT — 'anthropic' | 'openai' | 'local'
|
|
14
|
+
* created_at TEXT — ISO-8601 timestamp
|
|
15
|
+
*/
|
|
16
|
+
import type Database from 'better-sqlite3';
|
|
17
|
+
export declare const EMBEDDINGS_DDL = "\nCREATE TABLE IF NOT EXISTS embeddings (\n symbol_id TEXT NOT NULL,\n repo_id TEXT NOT NULL,\n embedding BLOB NOT NULL,\n dimension INTEGER NOT NULL,\n provider TEXT NOT NULL,\n created_at TEXT NOT NULL,\n tenant_id TEXT NOT NULL DEFAULT 'local',\n PRIMARY KEY (symbol_id, repo_id),\n FOREIGN KEY (symbol_id, repo_id) REFERENCES symbols(id, repo_id) ON DELETE CASCADE,\n FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE CASCADE\n);\nCREATE INDEX IF NOT EXISTS idx_embeddings_repo ON embeddings(repo_id);\n";
|
|
18
|
+
/**
|
|
19
|
+
* Persist a batch of embeddings to SQLite.
|
|
20
|
+
* Replaces any existing embedding for the same (symbol_id, repo_id) pair.
|
|
21
|
+
*/
|
|
22
|
+
export declare function saveEmbeddings(db: Database.Database, repoId: string, provider: string, embeddings: Map<string, Float32Array>, tenantId?: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Load all embeddings for a repo.
|
|
25
|
+
* Returns a Map from symbol_id → Float32Array.
|
|
26
|
+
*/
|
|
27
|
+
export declare function loadEmbeddings(db: Database.Database, repoId: string): Map<string, Float32Array>;
|
|
28
|
+
/**
|
|
29
|
+
* Delete embeddings for specific symbol IDs (e.g., when symbols are removed).
|
|
30
|
+
*/
|
|
31
|
+
export declare function deleteEmbeddings(db: Database.Database, symbolIds: string[]): void;
|
|
32
|
+
/**
|
|
33
|
+
* Delete all embeddings for a repo (e.g., on full re-index).
|
|
34
|
+
*/
|
|
35
|
+
export declare function deleteAllEmbeddings(db: Database.Database, repoId: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Return the number of stored embeddings for a repo.
|
|
38
|
+
*/
|
|
39
|
+
export declare function countEmbeddings(db: Database.Database, repoId: string): number;
|
|
40
|
+
//# sourceMappingURL=embedding-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../../src/core/db/embedding-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,eAAO,MAAM,cAAc,wiBAc1B,CAAC;AAiBF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,QAAQ,SAAU,GACjB,IAAI,CA6BN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAqB3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7E"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite persistence layer for symbol embedding vectors.
|
|
3
|
+
*
|
|
4
|
+
* Stores Float32Array embeddings as BLOB (binary) so they can be loaded back
|
|
5
|
+
* after a restart and used to rebuild the HNSW in-memory index without re-calling
|
|
6
|
+
* the embedding API.
|
|
7
|
+
*
|
|
8
|
+
* Table: embeddings
|
|
9
|
+
* symbol_id TEXT PK — matches symbols.id
|
|
10
|
+
* repo_id TEXT — for scoped queries / bulk delete
|
|
11
|
+
* embedding BLOB — raw Float32Array bytes (little-endian, 4 bytes per float)
|
|
12
|
+
* dimension INTEGER — number of floats (sanity check)
|
|
13
|
+
* provider TEXT — 'anthropic' | 'openai' | 'local'
|
|
14
|
+
* created_at TEXT — ISO-8601 timestamp
|
|
15
|
+
*/
|
|
16
|
+
import { StorageError } from '../errors.js';
|
|
17
|
+
// ─── DDL (called from schema init) ───────────────────────────────────────────
|
|
18
|
+
export const EMBEDDINGS_DDL = `
|
|
19
|
+
CREATE TABLE IF NOT EXISTS embeddings (
|
|
20
|
+
symbol_id TEXT NOT NULL,
|
|
21
|
+
repo_id TEXT NOT NULL,
|
|
22
|
+
embedding BLOB NOT NULL,
|
|
23
|
+
dimension INTEGER NOT NULL,
|
|
24
|
+
provider TEXT NOT NULL,
|
|
25
|
+
created_at TEXT NOT NULL,
|
|
26
|
+
tenant_id TEXT NOT NULL DEFAULT 'local',
|
|
27
|
+
PRIMARY KEY (symbol_id, repo_id),
|
|
28
|
+
FOREIGN KEY (symbol_id, repo_id) REFERENCES symbols(id, repo_id) ON DELETE CASCADE,
|
|
29
|
+
FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE CASCADE
|
|
30
|
+
);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_embeddings_repo ON embeddings(repo_id);
|
|
32
|
+
`;
|
|
33
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
34
|
+
function float32ToBuffer(arr) {
|
|
35
|
+
return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);
|
|
36
|
+
}
|
|
37
|
+
function bufferToFloat32(buf) {
|
|
38
|
+
// Buffer.from may share memory — copy to ensure alignment
|
|
39
|
+
const ab = new ArrayBuffer(buf.length);
|
|
40
|
+
buf.copy(Buffer.from(ab));
|
|
41
|
+
return new Float32Array(ab);
|
|
42
|
+
}
|
|
43
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
44
|
+
/**
|
|
45
|
+
* Persist a batch of embeddings to SQLite.
|
|
46
|
+
* Replaces any existing embedding for the same (symbol_id, repo_id) pair.
|
|
47
|
+
*/
|
|
48
|
+
export function saveEmbeddings(db, repoId, provider, embeddings, tenantId = 'local') {
|
|
49
|
+
if (embeddings.size === 0)
|
|
50
|
+
return;
|
|
51
|
+
const stmt = db.prepare(`
|
|
52
|
+
INSERT OR REPLACE INTO embeddings (symbol_id, repo_id, embedding, dimension, provider, created_at, tenant_id)
|
|
53
|
+
VALUES (@symbolId, @repoId, @embedding, @dimension, @provider, @createdAt, @tenantId)
|
|
54
|
+
`);
|
|
55
|
+
const createdAt = new Date().toISOString();
|
|
56
|
+
const insert = db.transaction(() => {
|
|
57
|
+
for (const [symbolId, vec] of embeddings) {
|
|
58
|
+
try {
|
|
59
|
+
stmt.run({
|
|
60
|
+
symbolId,
|
|
61
|
+
repoId,
|
|
62
|
+
embedding: float32ToBuffer(vec),
|
|
63
|
+
dimension: vec.length,
|
|
64
|
+
provider,
|
|
65
|
+
createdAt,
|
|
66
|
+
tenantId,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
throw new StorageError(`Failed to save embedding for symbol ${symbolId}`, 'saveEmbeddings', err);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
insert();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Load all embeddings for a repo.
|
|
78
|
+
* Returns a Map from symbol_id → Float32Array.
|
|
79
|
+
*/
|
|
80
|
+
export function loadEmbeddings(db, repoId) {
|
|
81
|
+
const rows = db.prepare('SELECT symbol_id, embedding, dimension FROM embeddings WHERE repo_id = ?').all(repoId);
|
|
82
|
+
const result = new Map();
|
|
83
|
+
for (const row of rows) {
|
|
84
|
+
const vec = bufferToFloat32(row.embedding);
|
|
85
|
+
if (vec.length !== row.dimension) {
|
|
86
|
+
// Corrupted row — skip rather than crash
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
result.set(row.symbol_id, vec);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Delete embeddings for specific symbol IDs (e.g., when symbols are removed).
|
|
95
|
+
*/
|
|
96
|
+
export function deleteEmbeddings(db, symbolIds) {
|
|
97
|
+
if (symbolIds.length === 0)
|
|
98
|
+
return;
|
|
99
|
+
const del = db.transaction(() => {
|
|
100
|
+
const stmt = db.prepare('DELETE FROM embeddings WHERE symbol_id = ?');
|
|
101
|
+
for (const id of symbolIds) {
|
|
102
|
+
stmt.run(id);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
del();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Delete all embeddings for a repo (e.g., on full re-index).
|
|
109
|
+
*/
|
|
110
|
+
export function deleteAllEmbeddings(db, repoId) {
|
|
111
|
+
db.prepare('DELETE FROM embeddings WHERE repo_id = ?').run(repoId);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Return the number of stored embeddings for a repo.
|
|
115
|
+
*/
|
|
116
|
+
export function countEmbeddings(db, repoId) {
|
|
117
|
+
const row = db.prepare('SELECT COUNT(*) AS n FROM embeddings WHERE repo_id = ?').get(repoId);
|
|
118
|
+
return row?.n ?? 0;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=embedding-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-store.js","sourceRoot":"","sources":["../../../src/core/db/embedding-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,gFAAgF;AAEhF,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;CAc7B,CAAC;AAEF,gFAAgF;AAEhF,SAAS,eAAe,CAAC,GAAiB;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,0DAA0D;IAC1D,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,OAAO,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,MAAc,EACd,QAAgB,EAChB,UAAqC,EACrC,QAAQ,GAAG,OAAO;IAElB,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAElC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC;oBACP,QAAQ;oBACR,MAAM;oBACN,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC;oBAC/B,SAAS,EAAE,GAAG,CAAC,MAAM;oBACrB,QAAQ;oBACR,SAAS;oBACT,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,YAAY,CAAC,uCAAuC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,MAAc;IAQd,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,0EAA0E,CAC3E,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;YACjC,yCAAyC;YACzC,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,SAAmB;IAEnB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEnC,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;QACtE,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IACH,GAAG,EAAE,CAAC;AACR,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAqB,EAAE,MAAc;IACvE,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAqB,EAAE,MAAc;IACnE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,wDAAwD,CACzD,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACd,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export declare function upsertFile(db: Database.Database, repoId: string, filePath: string, contentHash: string, rawContent?: Buffer, tenantId?: string): void;
|
|
3
|
+
export declare function getFileContent(db: Database.Database, repoId: string, filePath: string, tenantId?: string): Buffer | null;
|
|
4
|
+
export declare function getFileHash(db: Database.Database, repoId: string, filePath: string, tenantId?: string): string | null;
|
|
5
|
+
export declare function deleteFile(db: Database.Database, repoId: string, filePath: string): void;
|
|
6
|
+
export declare function getAllFileHashes(db: Database.Database, repoId: string): Map<string, string>;
|
|
7
|
+
/**
|
|
8
|
+
* Returns the byte length of a file's stored content, or 0 if not found.
|
|
9
|
+
* Uses SQLite's length() on the blob to avoid loading content into memory.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getFileSizeBytes(db: Database.Database, repoId: string, filePath: string): number;
|
|
12
|
+
/**
|
|
13
|
+
* Returns byte lengths for multiple files in a single pass.
|
|
14
|
+
* Files not found in the DB get a size of 0.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getFileSizesBatch(db: Database.Database, repoId: string, filePaths: string[]): Map<string, number>;
|
|
17
|
+
export interface FileEntry {
|
|
18
|
+
path: string;
|
|
19
|
+
rawContent: Buffer | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function getAllFilesWithContent(db: Database.Database, repoId: string): FileEntry[];
|
|
22
|
+
/**
|
|
23
|
+
* Return the total bytes of stored raw_content for a tenant across all repos.
|
|
24
|
+
* Used for storage quota tracking.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getTenantStorageBytes(db: Database.Database, tenantId: string): number;
|
|
27
|
+
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../../src/core/db/file-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,SAAU,GACjB,IAAI,CAqBN;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAgBf;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAgBf;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,IAAI,CAEN;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQrB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAcrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,GACb,SAAS,EAAE,CAQb;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { StorageError } from '../errors.js';
|
|
2
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
3
|
+
export function upsertFile(db, repoId, filePath, contentHash, rawContent, tenantId = 'local') {
|
|
4
|
+
try {
|
|
5
|
+
db.prepare(`
|
|
6
|
+
INSERT INTO files (repo_id, path, content_hash, raw_content, indexed_at, tenant_id)
|
|
7
|
+
VALUES (@repoId, @path, @contentHash, @rawContent, @indexedAt, @tenantId)
|
|
8
|
+
ON CONFLICT(repo_id, path) DO UPDATE SET
|
|
9
|
+
content_hash = excluded.content_hash,
|
|
10
|
+
raw_content = excluded.raw_content,
|
|
11
|
+
indexed_at = excluded.indexed_at,
|
|
12
|
+
tenant_id = excluded.tenant_id
|
|
13
|
+
`).run({
|
|
14
|
+
repoId,
|
|
15
|
+
path: filePath,
|
|
16
|
+
contentHash,
|
|
17
|
+
rawContent: rawContent ?? null,
|
|
18
|
+
indexedAt: Date.now(),
|
|
19
|
+
tenantId,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
throw new StorageError(`Failed to upsert file "${filePath}"`, 'upsertFile', err);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function getFileContent(db, repoId, filePath, tenantId) {
|
|
27
|
+
if (tenantId !== undefined) {
|
|
28
|
+
const row = db
|
|
29
|
+
.prepare('SELECT raw_content FROM files WHERE repo_id = ? AND path = ? AND tenant_id = ?')
|
|
30
|
+
.get(repoId, filePath, tenantId);
|
|
31
|
+
return row?.raw_content ?? null;
|
|
32
|
+
}
|
|
33
|
+
const row = db
|
|
34
|
+
.prepare('SELECT raw_content FROM files WHERE repo_id = ? AND path = ?')
|
|
35
|
+
.get(repoId, filePath);
|
|
36
|
+
return row?.raw_content ?? null;
|
|
37
|
+
}
|
|
38
|
+
export function getFileHash(db, repoId, filePath, tenantId) {
|
|
39
|
+
if (tenantId !== undefined) {
|
|
40
|
+
const row = db
|
|
41
|
+
.prepare('SELECT content_hash FROM files WHERE repo_id = ? AND path = ? AND tenant_id = ?')
|
|
42
|
+
.get(repoId, filePath, tenantId);
|
|
43
|
+
return row?.content_hash ?? null;
|
|
44
|
+
}
|
|
45
|
+
const row = db
|
|
46
|
+
.prepare('SELECT content_hash FROM files WHERE repo_id = ? AND path = ?')
|
|
47
|
+
.get(repoId, filePath);
|
|
48
|
+
return row?.content_hash ?? null;
|
|
49
|
+
}
|
|
50
|
+
export function deleteFile(db, repoId, filePath) {
|
|
51
|
+
db.prepare('DELETE FROM files WHERE repo_id = ? AND path = ?').run(repoId, filePath);
|
|
52
|
+
}
|
|
53
|
+
export function getAllFileHashes(db, repoId) {
|
|
54
|
+
const rows = db
|
|
55
|
+
.prepare('SELECT path, content_hash FROM files WHERE repo_id = ?')
|
|
56
|
+
.all(repoId);
|
|
57
|
+
return new Map(rows.map((r) => [r.path, r.content_hash]));
|
|
58
|
+
}
|
|
59
|
+
// ─── Size queries ─────────────────────────────────────────────────────────────
|
|
60
|
+
/**
|
|
61
|
+
* Returns the byte length of a file's stored content, or 0 if not found.
|
|
62
|
+
* Uses SQLite's length() on the blob to avoid loading content into memory.
|
|
63
|
+
*/
|
|
64
|
+
export function getFileSizeBytes(db, repoId, filePath) {
|
|
65
|
+
const row = db
|
|
66
|
+
.prepare('SELECT length(raw_content) as size FROM files WHERE repo_id = ? AND path = ?')
|
|
67
|
+
.get(repoId, filePath);
|
|
68
|
+
return row?.size ?? 0;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns byte lengths for multiple files in a single pass.
|
|
72
|
+
* Files not found in the DB get a size of 0.
|
|
73
|
+
*/
|
|
74
|
+
export function getFileSizesBatch(db, repoId, filePaths) {
|
|
75
|
+
const result = new Map();
|
|
76
|
+
if (filePaths.length === 0)
|
|
77
|
+
return result;
|
|
78
|
+
const stmt = db.prepare('SELECT path, length(raw_content) as size FROM files WHERE repo_id = ? AND path = ?');
|
|
79
|
+
for (const fp of filePaths) {
|
|
80
|
+
const row = stmt.get(repoId, fp);
|
|
81
|
+
result.set(fp, row?.size ?? 0);
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
export function getAllFilesWithContent(db, repoId) {
|
|
86
|
+
const rows = db
|
|
87
|
+
.prepare('SELECT path, raw_content FROM files WHERE repo_id = ?')
|
|
88
|
+
.all(repoId);
|
|
89
|
+
return rows.map((r) => ({ path: r.path, rawContent: r.raw_content }));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Return the total bytes of stored raw_content for a tenant across all repos.
|
|
93
|
+
* Used for storage quota tracking.
|
|
94
|
+
*/
|
|
95
|
+
export function getTenantStorageBytes(db, tenantId) {
|
|
96
|
+
const row = db
|
|
97
|
+
.prepare('SELECT SUM(length(raw_content)) AS total FROM files WHERE tenant_id = ?')
|
|
98
|
+
.get(tenantId);
|
|
99
|
+
return row?.total ?? 0;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=file-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../../src/core/db/file-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestLogStore — persists per-request telemetry in the central auth database.
|
|
3
|
+
*
|
|
4
|
+
* Used by the Admin API to compute usage stats and detect abuse patterns.
|
|
5
|
+
* Logs are pruned periodically to prevent unbounded growth.
|
|
6
|
+
*/
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
export declare const REQUEST_LOG_DDL = "\nCREATE TABLE IF NOT EXISTS request_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp TEXT NOT NULL,\n tenant_id TEXT,\n tool TEXT NOT NULL,\n duration_ms INTEGER,\n status TEXT NOT NULL,\n error_message TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_request_log_tenant\n ON request_log(tenant_id, timestamp);\nCREATE INDEX IF NOT EXISTS idx_request_log_timestamp\n ON request_log(timestamp);\n";
|
|
9
|
+
export interface RequestLogEntry {
|
|
10
|
+
timestamp: string;
|
|
11
|
+
tenantId: string | null;
|
|
12
|
+
tool: string;
|
|
13
|
+
durationMs: number | null;
|
|
14
|
+
status: 'success' | 'error' | 'rate_limited';
|
|
15
|
+
errorMessage: string | null;
|
|
16
|
+
}
|
|
17
|
+
export interface LogStats {
|
|
18
|
+
requests: number;
|
|
19
|
+
rateLimited: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class RequestLogStore {
|
|
22
|
+
private readonly db;
|
|
23
|
+
constructor(db: Database.Database);
|
|
24
|
+
/** Insert a log entry. Best-effort — never throws. */
|
|
25
|
+
log(entry: RequestLogEntry): void;
|
|
26
|
+
/**
|
|
27
|
+
* Aggregate stats for all tenants since `since` (ISO timestamp).
|
|
28
|
+
*/
|
|
29
|
+
getStats(since: string): LogStats;
|
|
30
|
+
/**
|
|
31
|
+
* Aggregate stats for a single tenant since `since` (ISO timestamp).
|
|
32
|
+
*/
|
|
33
|
+
getTenantStats(tenantId: string, since: string): LogStats;
|
|
34
|
+
/**
|
|
35
|
+
* Delete log entries older than `daysToKeep` days.
|
|
36
|
+
* Returns the number of rows deleted.
|
|
37
|
+
*/
|
|
38
|
+
pruneOld(daysToKeep: number): number;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=request-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-log.d.ts","sourceRoot":"","sources":["../../../src/core/db/request-log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,eAAO,MAAM,eAAe,ycAc3B,CAAC;AAIF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,cAAc,CAAC;IAC7C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD,sDAAsD;IACtD,GAAG,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAoBjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ;IAgBjC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ;IAgBzD;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;CAKrC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestLogStore — persists per-request telemetry in the central auth database.
|
|
3
|
+
*
|
|
4
|
+
* Used by the Admin API to compute usage stats and detect abuse patterns.
|
|
5
|
+
* Logs are pruned periodically to prevent unbounded growth.
|
|
6
|
+
*/
|
|
7
|
+
// ─── DDL ──────────────────────────────────────────────────────────────────────
|
|
8
|
+
export const REQUEST_LOG_DDL = `
|
|
9
|
+
CREATE TABLE IF NOT EXISTS request_log (
|
|
10
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
11
|
+
timestamp TEXT NOT NULL,
|
|
12
|
+
tenant_id TEXT,
|
|
13
|
+
tool TEXT NOT NULL,
|
|
14
|
+
duration_ms INTEGER,
|
|
15
|
+
status TEXT NOT NULL,
|
|
16
|
+
error_message TEXT
|
|
17
|
+
);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_request_log_tenant
|
|
19
|
+
ON request_log(tenant_id, timestamp);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_request_log_timestamp
|
|
21
|
+
ON request_log(timestamp);
|
|
22
|
+
`;
|
|
23
|
+
// ─── RequestLogStore ──────────────────────────────────────────────────────────
|
|
24
|
+
export class RequestLogStore {
|
|
25
|
+
db;
|
|
26
|
+
constructor(db) {
|
|
27
|
+
this.db = db;
|
|
28
|
+
}
|
|
29
|
+
/** Insert a log entry. Best-effort — never throws. */
|
|
30
|
+
log(entry) {
|
|
31
|
+
try {
|
|
32
|
+
this.db
|
|
33
|
+
.prepare(`INSERT INTO request_log (timestamp, tenant_id, tool, duration_ms, status, error_message)
|
|
34
|
+
VALUES (@timestamp, @tenantId, @tool, @durationMs, @status, @errorMessage)`)
|
|
35
|
+
.run({
|
|
36
|
+
timestamp: entry.timestamp,
|
|
37
|
+
tenantId: entry.tenantId ?? null,
|
|
38
|
+
tool: entry.tool,
|
|
39
|
+
durationMs: entry.durationMs ?? null,
|
|
40
|
+
status: entry.status,
|
|
41
|
+
errorMessage: entry.errorMessage ?? null,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Never let logging errors affect the caller
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Aggregate stats for all tenants since `since` (ISO timestamp).
|
|
50
|
+
*/
|
|
51
|
+
getStats(since) {
|
|
52
|
+
const row = this.db
|
|
53
|
+
.prepare(`SELECT
|
|
54
|
+
COUNT(*) AS requests,
|
|
55
|
+
SUM(CASE WHEN status = 'rate_limited' THEN 1 ELSE 0 END) AS rate_limited
|
|
56
|
+
FROM request_log
|
|
57
|
+
WHERE timestamp >= ?`)
|
|
58
|
+
.get(since);
|
|
59
|
+
return {
|
|
60
|
+
requests: row?.requests ?? 0,
|
|
61
|
+
rateLimited: row?.rate_limited ?? 0,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Aggregate stats for a single tenant since `since` (ISO timestamp).
|
|
66
|
+
*/
|
|
67
|
+
getTenantStats(tenantId, since) {
|
|
68
|
+
const row = this.db
|
|
69
|
+
.prepare(`SELECT
|
|
70
|
+
COUNT(*) AS requests,
|
|
71
|
+
SUM(CASE WHEN status = 'rate_limited' THEN 1 ELSE 0 END) AS rate_limited
|
|
72
|
+
FROM request_log
|
|
73
|
+
WHERE tenant_id = ? AND timestamp >= ?`)
|
|
74
|
+
.get(tenantId, since);
|
|
75
|
+
return {
|
|
76
|
+
requests: row?.requests ?? 0,
|
|
77
|
+
rateLimited: row?.rate_limited ?? 0,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Delete log entries older than `daysToKeep` days.
|
|
82
|
+
* Returns the number of rows deleted.
|
|
83
|
+
*/
|
|
84
|
+
pruneOld(daysToKeep) {
|
|
85
|
+
const cutoff = new Date(Date.now() - daysToKeep * 24 * 60 * 60 * 1000).toISOString();
|
|
86
|
+
const result = this.db.prepare('DELETE FROM request_log WHERE timestamp < ?').run(cutoff);
|
|
87
|
+
return result.changes;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=request-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-log.js","sourceRoot":"","sources":["../../../src/core/db/request-log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,iFAAiF;AAEjF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;CAc9B,CAAC;AAkBF,iFAAiF;AAEjF,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD,sDAAsD;IACtD,GAAG,CAAC,KAAsB;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;sFAC4E,CAC7E;iBACA,GAAG,CAAC;gBACH,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;gBACpC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;aACzC,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;8BAIsB,CACvB;aACA,GAAG,CAAC,KAAK,CAAC,CAAC;QACd,OAAO;YACL,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC;YAC5B,WAAW,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;SACpC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAgB,EAAE,KAAa;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;gDAIwC,CACzC;aACA,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC;YAC5B,WAAW,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;SACpC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,UAAkB;QACzB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SavingsData {
|
|
2
|
+
total_tokens_saved: number;
|
|
3
|
+
anon_id: string;
|
|
4
|
+
last_updated: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function _setSavingsPathForTesting(path: string | null): void;
|
|
7
|
+
export declare function loadSavings(): SavingsData;
|
|
8
|
+
export declare function saveSavings(data: SavingsData): void;
|
|
9
|
+
//# sourceMappingURL=savings-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings-store.d.ts","sourceRoot":"","sources":["../../../src/core/db/savings-store.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAOD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGnE;AAoBD,wBAAgB,WAAW,IAAI,WAAW,CAsBzC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAWnD"}
|