@sixthsummit/ship-api 0.0.0-stage → 4.1.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/CHANGELOG.md +605 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +58 -2
- package/cli/commands/add.js +537 -0
- package/cli/commands/contract.js +2 -0
- package/cli/commands/create.js +250 -0
- package/cli/commands/dev.js +227 -0
- package/cli/commands/doctor.js +286 -0
- package/cli/commands/generate.js +937 -0
- package/cli/commands/graph.js +2 -0
- package/cli/commands/migrate-orm.js +1171 -0
- package/cli/commands/update.js +37 -0
- package/cli/ship-api.js +285 -0
- package/lib/app/auth/AuthProvider.d.ts +91 -0
- package/lib/app/auth/AuthProvider.d.ts.map +1 -0
- package/lib/app/auth/AuthProvider.js +13 -0
- package/lib/app/auth/AuthProvider.js.map +1 -0
- package/lib/app/auth/adapters/firebase.d.ts +79 -0
- package/lib/app/auth/adapters/firebase.d.ts.map +1 -0
- package/lib/app/auth/adapters/firebase.js +122 -0
- package/lib/app/auth/adapters/firebase.js.map +1 -0
- package/lib/app/auth/adapters/jwtCookie.d.ts +55 -0
- package/lib/app/auth/adapters/jwtCookie.d.ts.map +1 -0
- package/lib/app/auth/adapters/jwtCookie.js +120 -0
- package/lib/app/auth/adapters/jwtCookie.js.map +1 -0
- package/lib/app/auth/index.d.ts +8 -0
- package/lib/app/auth/index.d.ts.map +1 -0
- package/lib/app/auth/index.js +7 -0
- package/lib/app/auth/index.js.map +1 -0
- package/lib/app/auth/jwt/AuthFlow.d.ts +94 -0
- package/lib/app/auth/jwt/AuthFlow.d.ts.map +1 -0
- package/lib/app/auth/jwt/AuthFlow.js +127 -0
- package/lib/app/auth/jwt/AuthFlow.js.map +1 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts +80 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts.map +1 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js +134 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js.map +1 -0
- package/lib/app/auth/jwt/JwtSigner.d.ts +123 -0
- package/lib/app/auth/jwt/JwtSigner.d.ts.map +1 -0
- package/lib/app/auth/jwt/JwtSigner.js +118 -0
- package/lib/app/auth/jwt/JwtSigner.js.map +1 -0
- package/lib/app/auth/jwt/RefreshTokenStore.d.ts +97 -0
- package/lib/app/auth/jwt/RefreshTokenStore.d.ts.map +1 -0
- package/lib/app/auth/jwt/RefreshTokenStore.js +122 -0
- package/lib/app/auth/jwt/RefreshTokenStore.js.map +1 -0
- package/lib/app/auth/permissionDefinition.d.ts +20 -0
- package/lib/app/auth/permissionDefinition.d.ts.map +1 -0
- package/lib/app/auth/permissionDefinition.js +2 -0
- package/lib/app/auth/permissionDefinition.js.map +1 -0
- package/lib/app/context/RequestContext.d.ts +59 -0
- package/lib/app/context/RequestContext.d.ts.map +1 -0
- package/lib/app/context/RequestContext.js +25 -0
- package/lib/app/context/RequestContext.js.map +1 -0
- package/lib/app/db/QueryOptions.d.ts +82 -0
- package/lib/app/db/QueryOptions.d.ts.map +1 -0
- package/lib/app/db/QueryOptions.js +37 -0
- package/lib/app/db/QueryOptions.js.map +1 -0
- package/lib/app/db/baseFields.d.ts +60 -0
- package/lib/app/db/baseFields.d.ts.map +1 -0
- package/lib/app/db/baseFields.js +54 -0
- package/lib/app/db/baseFields.js.map +1 -0
- package/lib/app/db/buildWhere.d.ts +22 -0
- package/lib/app/db/buildWhere.d.ts.map +1 -0
- package/lib/app/db/buildWhere.js +75 -0
- package/lib/app/db/buildWhere.js.map +1 -0
- package/lib/app/db/client.d.ts +111 -0
- package/lib/app/db/client.d.ts.map +1 -0
- package/lib/app/db/client.js +99 -0
- package/lib/app/db/client.js.map +1 -0
- package/lib/app/db/tenantScoped.d.ts +59 -0
- package/lib/app/db/tenantScoped.d.ts.map +1 -0
- package/lib/app/db/tenantScoped.js +54 -0
- package/lib/app/db/tenantScoped.js.map +1 -0
- package/lib/app/db/transaction.d.ts +58 -0
- package/lib/app/db/transaction.d.ts.map +1 -0
- package/lib/app/db/transaction.js +106 -0
- package/lib/app/db/transaction.js.map +1 -0
- package/lib/app/health/HealthCheck.d.ts +121 -0
- package/lib/app/health/HealthCheck.d.ts.map +1 -0
- package/lib/app/health/HealthCheck.js +151 -0
- package/lib/app/health/HealthCheck.js.map +1 -0
- package/lib/app/health/redisHealthCheck.d.ts +14 -0
- package/lib/app/health/redisHealthCheck.d.ts.map +1 -0
- package/lib/app/health/redisHealthCheck.js +21 -0
- package/lib/app/health/redisHealthCheck.js.map +1 -0
- package/lib/app/lifecycle/Bootstrapper.d.ts +92 -0
- package/lib/app/lifecycle/Bootstrapper.d.ts.map +1 -0
- package/lib/app/lifecycle/Bootstrapper.js +99 -0
- package/lib/app/lifecycle/Bootstrapper.js.map +1 -0
- package/lib/app/registry/routes.d.ts +89 -0
- package/lib/app/registry/routes.d.ts.map +1 -0
- package/lib/app/registry/routes.js +72 -0
- package/lib/app/registry/routes.js.map +1 -0
- package/lib/app/services/DrizzleEntityService.d.ts +123 -0
- package/lib/app/services/DrizzleEntityService.d.ts.map +1 -0
- package/lib/app/services/DrizzleEntityService.js +342 -0
- package/lib/app/services/DrizzleEntityService.js.map +1 -0
- package/lib/app/services/RedisProvider.d.ts +52 -0
- package/lib/app/services/RedisProvider.d.ts.map +1 -0
- package/lib/app/services/RedisProvider.js +75 -0
- package/lib/app/services/RedisProvider.js.map +1 -0
- package/lib/app/services/cache/Cache.d.ts +70 -0
- package/lib/app/services/cache/Cache.d.ts.map +1 -0
- package/lib/app/services/cache/Cache.js +18 -0
- package/lib/app/services/cache/Cache.js.map +1 -0
- package/lib/app/services/cache/InMemoryCache.d.ts +35 -0
- package/lib/app/services/cache/InMemoryCache.d.ts.map +1 -0
- package/lib/app/services/cache/InMemoryCache.js +76 -0
- package/lib/app/services/cache/InMemoryCache.js.map +1 -0
- package/lib/app/services/cache/RedisCache.d.ts +99 -0
- package/lib/app/services/cache/RedisCache.d.ts.map +1 -0
- package/lib/app/services/cache/RedisCache.js +150 -0
- package/lib/app/services/cache/RedisCache.js.map +1 -0
- package/lib/app/services/cache/cached.d.ts +30 -0
- package/lib/app/services/cache/cached.d.ts.map +1 -0
- package/lib/app/services/cache/cached.js +38 -0
- package/lib/app/services/cache/cached.js.map +1 -0
- package/lib/app/services/cache/index.d.ts +5 -0
- package/lib/app/services/cache/index.d.ts.map +1 -0
- package/lib/app/services/cache/index.js +4 -0
- package/lib/app/services/cache/index.js.map +1 -0
- package/lib/app/services/cron/defineCron.d.ts +57 -0
- package/lib/app/services/cron/defineCron.d.ts.map +1 -0
- package/lib/app/services/cron/defineCron.js +15 -0
- package/lib/app/services/cron/defineCron.js.map +1 -0
- package/lib/app/services/cron/index.d.ts +2 -0
- package/lib/app/services/cron/index.d.ts.map +1 -0
- package/lib/app/services/cron/index.js +2 -0
- package/lib/app/services/cron/index.js.map +1 -0
- package/lib/app/services/hooks/LifecycleHooks.d.ts +61 -0
- package/lib/app/services/hooks/LifecycleHooks.d.ts.map +1 -0
- package/lib/app/services/hooks/LifecycleHooks.js +85 -0
- package/lib/app/services/hooks/LifecycleHooks.js.map +1 -0
- package/lib/app/services/jobs/JobsManager.d.ts +67 -0
- package/lib/app/services/jobs/JobsManager.d.ts.map +1 -0
- package/lib/app/services/jobs/JobsManager.js +121 -0
- package/lib/app/services/jobs/JobsManager.js.map +1 -0
- package/lib/app/services/jobs/bullBoard.d.ts +72 -0
- package/lib/app/services/jobs/bullBoard.d.ts.map +1 -0
- package/lib/app/services/jobs/bullBoard.js +96 -0
- package/lib/app/services/jobs/bullBoard.js.map +1 -0
- package/lib/app/services/jobs/defineJob.d.ts +81 -0
- package/lib/app/services/jobs/defineJob.d.ts.map +1 -0
- package/lib/app/services/jobs/defineJob.js +49 -0
- package/lib/app/services/jobs/defineJob.js.map +1 -0
- package/lib/app/services/jobs/index.d.ts +4 -0
- package/lib/app/services/jobs/index.d.ts.map +1 -0
- package/lib/app/services/jobs/index.js +4 -0
- package/lib/app/services/jobs/index.js.map +1 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts +23 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js +51 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js.map +1 -0
- package/lib/app/services/rateLimit/RateLimitBackend.d.ts +41 -0
- package/lib/app/services/rateLimit/RateLimitBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/RateLimitBackend.js +19 -0
- package/lib/app/services/rateLimit/RateLimitBackend.js.map +1 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts +16 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js +80 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js.map +1 -0
- package/lib/app/services/rateLimit/index.d.ts +4 -0
- package/lib/app/services/rateLimit/index.d.ts.map +1 -0
- package/lib/app/services/rateLimit/index.js +3 -0
- package/lib/app/services/rateLimit/index.js.map +1 -0
- package/lib/app/services/storage/DiskStorageAdapter.d.ts +62 -0
- package/lib/app/services/storage/DiskStorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/DiskStorageAdapter.js +295 -0
- package/lib/app/services/storage/DiskStorageAdapter.js.map +1 -0
- package/lib/app/services/storage/GCSStorageAdapter.d.ts +44 -0
- package/lib/app/services/storage/GCSStorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/GCSStorageAdapter.js +133 -0
- package/lib/app/services/storage/GCSStorageAdapter.js.map +1 -0
- package/lib/app/services/storage/S3StorageAdapter.d.ts +57 -0
- package/lib/app/services/storage/S3StorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/S3StorageAdapter.js +162 -0
- package/lib/app/services/storage/S3StorageAdapter.js.map +1 -0
- package/lib/app/services/storage/StorageService.d.ts +88 -0
- package/lib/app/services/storage/StorageService.d.ts.map +1 -0
- package/lib/app/services/storage/StorageService.js +18 -0
- package/lib/app/services/storage/StorageService.js.map +1 -0
- package/lib/app/services/storage/index.d.ts +5 -0
- package/lib/app/services/storage/index.d.ts.map +1 -0
- package/lib/app/services/storage/index.js +4 -0
- package/lib/app/services/storage/index.js.map +1 -0
- package/lib/app/utils/ContextValidators.d.ts +46 -0
- package/lib/app/utils/ContextValidators.d.ts.map +1 -0
- package/lib/app/utils/ContextValidators.js +81 -0
- package/lib/app/utils/ContextValidators.js.map +1 -0
- package/lib/app/utils/defineEnv.d.ts +80 -0
- package/lib/app/utils/defineEnv.d.ts.map +1 -0
- package/lib/app/utils/defineEnv.js +95 -0
- package/lib/app/utils/defineEnv.js.map +1 -0
- package/lib/client.d.ts +139 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +98 -0
- package/lib/client.js.map +1 -0
- package/lib/contract/application.d.ts +3 -0
- package/lib/contract/application.d.ts.map +1 -0
- package/lib/contract/application.js +2 -0
- package/lib/contract/application.js.map +1 -0
- package/lib/contract/client.d.ts +3 -0
- package/lib/contract/client.d.ts.map +1 -0
- package/lib/contract/client.js +3 -0
- package/lib/contract/client.js.map +1 -0
- package/lib/contract/index.d.ts +3 -0
- package/lib/contract/index.d.ts.map +1 -0
- package/lib/contract/index.js +3 -0
- package/lib/contract/index.js.map +1 -0
- package/lib/contract/manifest.d.ts +3 -0
- package/lib/contract/manifest.d.ts.map +1 -0
- package/lib/contract/manifest.js +2 -0
- package/lib/contract/manifest.js.map +1 -0
- package/lib/contract/openapi.d.ts +3 -0
- package/lib/contract/openapi.d.ts.map +1 -0
- package/lib/contract/openapi.js +3 -0
- package/lib/contract/openapi.js.map +1 -0
- package/lib/contract/project.d.ts +3 -0
- package/lib/contract/project.d.ts.map +1 -0
- package/lib/contract/project.js +3 -0
- package/lib/contract/project.js.map +1 -0
- package/lib/contract/schema.d.ts +3 -0
- package/lib/contract/schema.d.ts.map +1 -0
- package/lib/contract/schema.js +3 -0
- package/lib/contract/schema.js.map +1 -0
- package/lib/drizzle/index.d.ts +3 -0
- package/lib/drizzle/index.d.ts.map +1 -0
- package/lib/drizzle/index.js +3 -0
- package/lib/drizzle/index.js.map +1 -0
- package/lib/hono/auth.d.ts +6 -0
- package/lib/hono/auth.d.ts.map +1 -0
- package/lib/hono/auth.js +54 -0
- package/lib/hono/auth.js.map +1 -0
- package/lib/hono/index.d.ts +4 -0
- package/lib/hono/index.d.ts.map +1 -0
- package/lib/hono/index.js +4 -0
- package/lib/hono/index.js.map +1 -0
- package/lib/http/app/createApp.d.ts +132 -0
- package/lib/http/app/createApp.d.ts.map +1 -0
- package/lib/http/app/createApp.js +215 -0
- package/lib/http/app/createApp.js.map +1 -0
- package/lib/http/app/devRoutes.d.ts +31 -0
- package/lib/http/app/devRoutes.d.ts.map +1 -0
- package/lib/http/app/devRoutes.js +145 -0
- package/lib/http/app/devRoutes.js.map +1 -0
- package/lib/http/app/errors.d.ts +45 -0
- package/lib/http/app/errors.d.ts.map +1 -0
- package/lib/http/app/errors.js +93 -0
- package/lib/http/app/errors.js.map +1 -0
- package/lib/http/app/health.d.ts +66 -0
- package/lib/http/app/health.d.ts.map +1 -0
- package/lib/http/app/health.js +104 -0
- package/lib/http/app/health.js.map +1 -0
- package/lib/http/errors/AppError.d.ts +10 -0
- package/lib/http/errors/AppError.d.ts.map +1 -0
- package/lib/http/errors/AppError.js +19 -0
- package/lib/http/errors/AppError.js.map +1 -0
- package/lib/http/errors/AuthenticationError.d.ts +8 -0
- package/lib/http/errors/AuthenticationError.d.ts.map +1 -0
- package/lib/http/errors/AuthenticationError.js +10 -0
- package/lib/http/errors/AuthenticationError.js.map +1 -0
- package/lib/http/errors/AuthorizationError.d.ts +8 -0
- package/lib/http/errors/AuthorizationError.d.ts.map +1 -0
- package/lib/http/errors/AuthorizationError.js +10 -0
- package/lib/http/errors/AuthorizationError.js.map +1 -0
- package/lib/http/errors/BadRequestError.d.ts +8 -0
- package/lib/http/errors/BadRequestError.d.ts.map +1 -0
- package/lib/http/errors/BadRequestError.js +10 -0
- package/lib/http/errors/BadRequestError.js.map +1 -0
- package/lib/http/errors/ConflictError.d.ts +8 -0
- package/lib/http/errors/ConflictError.d.ts.map +1 -0
- package/lib/http/errors/ConflictError.js +10 -0
- package/lib/http/errors/ConflictError.js.map +1 -0
- package/lib/http/errors/InternalServerError.d.ts +8 -0
- package/lib/http/errors/InternalServerError.d.ts.map +1 -0
- package/lib/http/errors/InternalServerError.js +10 -0
- package/lib/http/errors/InternalServerError.js.map +1 -0
- package/lib/http/errors/NotFoundError.d.ts +8 -0
- package/lib/http/errors/NotFoundError.d.ts.map +1 -0
- package/lib/http/errors/NotFoundError.js +10 -0
- package/lib/http/errors/NotFoundError.js.map +1 -0
- package/lib/http/errors/RateLimitError.d.ts +13 -0
- package/lib/http/errors/RateLimitError.d.ts.map +1 -0
- package/lib/http/errors/RateLimitError.js +16 -0
- package/lib/http/errors/RateLimitError.js.map +1 -0
- package/lib/http/errors/ServiceUnavailableError.d.ts +8 -0
- package/lib/http/errors/ServiceUnavailableError.d.ts.map +1 -0
- package/lib/http/errors/ServiceUnavailableError.js +10 -0
- package/lib/http/errors/ServiceUnavailableError.js.map +1 -0
- package/lib/http/errors/ValidationError.d.ts +9 -0
- package/lib/http/errors/ValidationError.d.ts.map +1 -0
- package/lib/http/errors/ValidationError.js +12 -0
- package/lib/http/errors/ValidationError.js.map +1 -0
- package/lib/http/errors/index.d.ts +11 -0
- package/lib/http/errors/index.d.ts.map +1 -0
- package/lib/http/errors/index.js +12 -0
- package/lib/http/errors/index.js.map +1 -0
- package/lib/http/middleware/apiKey.d.ts +9 -0
- package/lib/http/middleware/apiKey.d.ts.map +1 -0
- package/lib/http/middleware/apiKey.js +71 -0
- package/lib/http/middleware/apiKey.js.map +1 -0
- package/lib/http/middleware/csrf.d.ts +63 -0
- package/lib/http/middleware/csrf.d.ts.map +1 -0
- package/lib/http/middleware/csrf.js +169 -0
- package/lib/http/middleware/csrf.js.map +1 -0
- package/lib/http/middleware/httpLogger.d.ts +39 -0
- package/lib/http/middleware/httpLogger.d.ts.map +1 -0
- package/lib/http/middleware/httpLogger.js +118 -0
- package/lib/http/middleware/httpLogger.js.map +1 -0
- package/lib/http/middleware/idempotency.d.ts +48 -0
- package/lib/http/middleware/idempotency.d.ts.map +1 -0
- package/lib/http/middleware/idempotency.js +180 -0
- package/lib/http/middleware/idempotency.js.map +1 -0
- package/lib/http/middleware/rateLimit.d.ts +105 -0
- package/lib/http/middleware/rateLimit.d.ts.map +1 -0
- package/lib/http/middleware/rateLimit.js +84 -0
- package/lib/http/middleware/rateLimit.js.map +1 -0
- package/lib/http/middleware/requireAuth.d.ts +58 -0
- package/lib/http/middleware/requireAuth.d.ts.map +1 -0
- package/lib/http/middleware/requireAuth.js +63 -0
- package/lib/http/middleware/requireAuth.js.map +1 -0
- package/lib/http/middleware/requirePermission.d.ts +23 -0
- package/lib/http/middleware/requirePermission.d.ts.map +1 -0
- package/lib/http/middleware/requirePermission.js +50 -0
- package/lib/http/middleware/requirePermission.js.map +1 -0
- package/lib/http/middleware/resolveTenant.d.ts +41 -0
- package/lib/http/middleware/resolveTenant.d.ts.map +1 -0
- package/lib/http/middleware/resolveTenant.js +17 -0
- package/lib/http/middleware/resolveTenant.js.map +1 -0
- package/lib/http/streaming/sse.d.ts +31 -0
- package/lib/http/streaming/sse.d.ts.map +1 -0
- package/lib/http/streaming/sse.js +11 -0
- package/lib/http/streaming/sse.js.map +1 -0
- package/lib/http/streaming/streamLLM.d.ts +94 -0
- package/lib/http/streaming/streamLLM.d.ts.map +1 -0
- package/lib/http/streaming/streamLLM.js +94 -0
- package/lib/http/streaming/streamLLM.js.map +1 -0
- package/lib/http/utils/authCookies.d.ts +74 -0
- package/lib/http/utils/authCookies.d.ts.map +1 -0
- package/lib/http/utils/authCookies.js +102 -0
- package/lib/http/utils/authCookies.js.map +1 -0
- package/lib/http/utils/clientIp.d.ts +85 -0
- package/lib/http/utils/clientIp.d.ts.map +1 -0
- package/lib/http/utils/clientIp.js +249 -0
- package/lib/http/utils/clientIp.js.map +1 -0
- package/lib/http/utils/index.d.ts +4 -0
- package/lib/http/utils/index.d.ts.map +1 -0
- package/lib/http/utils/index.js +5 -0
- package/lib/http/utils/index.js.map +1 -0
- package/lib/http/utils/metaTags.d.ts +49 -0
- package/lib/http/utils/metaTags.d.ts.map +1 -0
- package/lib/http/utils/metaTags.js +32 -0
- package/lib/http/utils/metaTags.js.map +1 -0
- package/lib/http/utils/publicSuffix.d.ts +34 -0
- package/lib/http/utils/publicSuffix.d.ts.map +1 -0
- package/lib/http/utils/publicSuffix.js +276 -0
- package/lib/http/utils/publicSuffix.js.map +1 -0
- package/lib/http/utils/uploads.d.ts +92 -0
- package/lib/http/utils/uploads.d.ts.map +1 -0
- package/lib/http/utils/uploads.js +126 -0
- package/lib/http/utils/uploads.js.map +1 -0
- package/lib/http/utils/validate.d.ts +41 -0
- package/lib/http/utils/validate.d.ts.map +1 -0
- package/lib/http/utils/validate.js +55 -0
- package/lib/http/utils/validate.js.map +1 -0
- package/lib/http/utils/webhooks.d.ts +63 -0
- package/lib/http/utils/webhooks.d.ts.map +1 -0
- package/lib/http/utils/webhooks.js +133 -0
- package/lib/http/utils/webhooks.js.map +1 -0
- package/lib/http/ws/auth.d.ts +46 -0
- package/lib/http/ws/auth.d.ts.map +1 -0
- package/lib/http/ws/auth.js +123 -0
- package/lib/http/ws/auth.js.map +1 -0
- package/lib/index.d.ts +80 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +61 -0
- package/lib/index.js.map +1 -0
- package/lib/kernel/index.d.ts +3 -0
- package/lib/kernel/index.d.ts.map +1 -0
- package/lib/kernel/index.js +3 -0
- package/lib/kernel/index.js.map +1 -0
- package/lib/libraries/.gitkeep +0 -0
- package/lib/libraries/ai/CHANGELOG.md +17 -0
- package/lib/libraries/ai/README.md +164 -0
- package/lib/libraries/ai/adapters/AnthropicAdapter.ts +382 -0
- package/lib/libraries/ai/adapters/LLMProvider.ts +76 -0
- package/lib/libraries/ai/adapters/OpenAIAdapter.ts +466 -0
- package/lib/libraries/ai/experimental/index.ts +20 -0
- package/lib/libraries/ai/index.ts +128 -0
- package/lib/libraries/ai/library.json +19 -0
- package/lib/libraries/ai/loop/agentLoop.ts +377 -0
- package/lib/libraries/ai/prompts/definePrompt.ts +0 -0
- package/lib/libraries/ai/rag/retrieveAndAnswer.ts +177 -0
- package/lib/libraries/ai/streaming/streamLLM.ts +94 -0
- package/lib/libraries/ai/structured/completeStructured.ts +143 -0
- package/lib/libraries/ai/tokens/Tokenizer.ts +216 -0
- package/lib/libraries/ai/tools/defineTool.ts +208 -0
- package/lib/libraries/ai/types.ts +260 -0
- package/lib/libraries/chunking/ChunkingService.ts +103 -0
- package/lib/libraries/chunking/README.md +104 -0
- package/lib/libraries/chunking/docs/api-reference.md +549 -0
- package/lib/libraries/chunking/docs/best-practices.md +321 -0
- package/lib/libraries/chunking/docs/code-organization.md +538 -0
- package/lib/libraries/chunking/docs/configuration.md +418 -0
- package/lib/libraries/chunking/docs/index.md +236 -0
- package/lib/libraries/chunking/docs/quick-start.md +298 -0
- package/lib/libraries/chunking/docs/strategies.md +407 -0
- package/lib/libraries/chunking/docs/summary.md +258 -0
- package/lib/libraries/chunking/docs/troubleshooting.md +527 -0
- package/lib/libraries/chunking/index.ts +17 -0
- package/lib/libraries/chunking/library.json +16 -0
- package/lib/libraries/chunking/strategies/ChunkingStrategy.ts +13 -0
- package/lib/libraries/chunking/strategies/FixedLengthChunkingStrategy.ts +88 -0
- package/lib/libraries/chunking/strategies/SemanticChunkingStrategy.ts +389 -0
- package/lib/libraries/chunking/strategies/SlidingWindowChunkingStrategy.ts +258 -0
- package/lib/libraries/chunking/types/index.ts +63 -0
- package/lib/libraries/email/EmailService.ts +591 -0
- package/lib/libraries/email/README.md +777 -0
- package/lib/libraries/email/TemplateRegistry.ts +148 -0
- package/lib/libraries/email/TemplateRenderer.ts +273 -0
- package/lib/libraries/email/index.ts +4 -0
- package/lib/libraries/email/initializeEmailService.ts +60 -0
- package/lib/libraries/email/library.json +12 -0
- package/lib/libraries/email/types/EmailAddress.ts +4 -0
- package/lib/libraries/email/types/EmailAttachment.ts +11 -0
- package/lib/libraries/email/types/EmailTag.ts +9 -0
- package/lib/libraries/email/types/EmailTemplate.ts +124 -0
- package/lib/libraries/email/types/SendBatchEmailsOptions.ts +9 -0
- package/lib/libraries/email/types/SendBatchEmailsResult.ts +9 -0
- package/lib/libraries/email/types/SendEmailOptions.ts +33 -0
- package/lib/libraries/email/types/SendEmailResult.ts +9 -0
- package/lib/libraries/email/types/index.ts +8 -0
- package/lib/libraries/weaviate/QueryBuilder.ts +292 -0
- package/lib/libraries/weaviate/README.md +284 -0
- package/lib/libraries/weaviate/Weaviate.ts +1419 -0
- package/lib/libraries/weaviate/WeaviateConfig.ts +268 -0
- package/lib/libraries/weaviate/docs/.gitkeep +1 -0
- package/lib/libraries/weaviate/docs/API_REFERENCE.md +1067 -0
- package/lib/libraries/weaviate/docs/CONFIGURATION.md +320 -0
- package/lib/libraries/weaviate/docs/ERROR_HANDLING.md +271 -0
- package/lib/libraries/weaviate/docs/MULTI_TENANCY.md +348 -0
- package/lib/libraries/weaviate/docs/PERFORMANCE.md +602 -0
- package/lib/libraries/weaviate/docs/PLUGIN_DEVELOPMENT.md +547 -0
- package/lib/libraries/weaviate/docs/QUICK_START.md +443 -0
- package/lib/libraries/weaviate/docs/README.md +269 -0
- package/lib/libraries/weaviate/docs/SCHEMA_GUIDE.md +630 -0
- package/lib/libraries/weaviate/docs/WEAVIATE_README.md +520 -0
- package/lib/libraries/weaviate/errors/WeaviateError.ts +92 -0
- package/lib/libraries/weaviate/errors/index.ts +1 -0
- package/lib/libraries/weaviate/index.ts +35 -0
- package/lib/libraries/weaviate/library.json +26 -0
- package/lib/libraries/weaviate/plugins/index.ts +2 -0
- package/lib/libraries/weaviate/schemas/SchemaRegistry.ts +284 -0
- package/lib/libraries/weaviate/schemas/index.ts +2 -0
- package/lib/libraries/weaviate/types/BM25SearchOptions.ts +9 -0
- package/lib/libraries/weaviate/types/ExtendedWeaviateClient.ts +7 -0
- package/lib/libraries/weaviate/types/HybridSearchOptions.ts +11 -0
- package/lib/libraries/weaviate/types/MultiTenancy.ts +81 -0
- package/lib/libraries/weaviate/types/Plugin.ts +17 -0
- package/lib/libraries/weaviate/types/SchemaConfig.ts +25 -0
- package/lib/libraries/weaviate/types/SearchMethod.ts +8 -0
- package/lib/libraries/weaviate/types/SearchOptions.ts +16 -0
- package/lib/libraries/weaviate/types/SearchRequest.ts +19 -0
- package/lib/libraries/weaviate/types/SearchResult.ts +16 -0
- package/lib/libraries/weaviate/types/SearchableField.ts +87 -0
- package/lib/libraries/weaviate/types/VectorIndexConfig.ts +19 -0
- package/lib/libraries/weaviate/types/VectorSearchOptions.ts +18 -0
- package/lib/libraries/weaviate/types/VectorizerConfig.ts +8 -0
- package/lib/libraries/weaviate/types/index.ts +29 -0
- package/lib/libraries/weaviate/utils/TenantContextManager.ts +94 -0
- package/lib/modules/accounts/index.ts +47 -0
- package/lib/modules/accounts/module.json +15 -0
- package/lib/modules/accounts/permissions.ts +33 -0
- package/lib/modules/accounts/routes.ts +200 -0
- package/lib/modules/accounts/schema.ts +219 -0
- package/lib/modules/accounts/services/AccountService.ts +44 -0
- package/lib/modules/accounts/validation/schemas.ts +70 -0
- package/lib/modules/oauth/adapters/GmailOAuthAdapter.ts +35 -0
- package/lib/modules/oauth/adapters/GoogleOAuthAdapter.ts +278 -0
- package/lib/modules/oauth/adapters/MicrosoftOAuthAdapter.ts +269 -0
- package/lib/modules/oauth/adapters/MockOAuthAdapter.ts +138 -0
- package/lib/modules/oauth/adapters/OAuthAdapter.ts +211 -0
- package/lib/modules/oauth/adapters/OAuthAdapterRegistry.ts +77 -0
- package/lib/modules/oauth/adapters/OutlookOAuthAdapter.ts +38 -0
- package/lib/modules/oauth/index.ts +79 -0
- package/lib/modules/oauth/module.json +23 -0
- package/lib/modules/oauth/permissions.ts +39 -0
- package/lib/modules/oauth/routes.ts +497 -0
- package/lib/modules/oauth/schema.ts +127 -0
- package/lib/modules/oauth/services/OAuthConnectionService.ts +147 -0
- package/lib/modules/oauth/state.ts +234 -0
- package/lib/modules/oauth/stateJtiCache.ts +85 -0
- package/lib/modules/oauth/verifyIdToken.ts +178 -0
- package/lib/modules/outbox/EventEmitter.ts +106 -0
- package/lib/modules/outbox/OutboxDrainer.ts +163 -0
- package/lib/modules/outbox/handlers/EventHandler.ts +115 -0
- package/lib/modules/outbox/index.ts +43 -0
- package/lib/modules/outbox/module.json +15 -0
- package/lib/modules/outbox/permissions.ts +36 -0
- package/lib/modules/outbox/routes.ts +219 -0
- package/lib/modules/outbox/schema.ts +207 -0
- package/lib/modules/outbox/services/OutboxEventService.ts +223 -0
- package/lib/observability/logger.d.ts +30 -0
- package/lib/observability/logger.d.ts.map +1 -0
- package/lib/observability/logger.js +110 -0
- package/lib/observability/logger.js.map +1 -0
- package/lib/observability/metrics.d.ts +3 -0
- package/lib/observability/metrics.d.ts.map +1 -0
- package/lib/observability/metrics.js +3 -0
- package/lib/observability/metrics.js.map +1 -0
- package/lib/observability/otel.d.ts +3 -0
- package/lib/observability/otel.d.ts.map +1 -0
- package/lib/observability/otel.js +3 -0
- package/lib/observability/otel.js.map +1 -0
- package/lib/observability/safeErrorFields.d.ts +14 -0
- package/lib/observability/safeErrorFields.d.ts.map +1 -0
- package/lib/observability/safeErrorFields.js +14 -0
- package/lib/observability/safeErrorFields.js.map +1 -0
- package/lib/observability/tracing.d.ts +3 -0
- package/lib/observability/tracing.d.ts.map +1 -0
- package/lib/observability/tracing.js +3 -0
- package/lib/observability/tracing.js.map +1 -0
- package/lib/package.json +4 -0
- package/lib/testing.d.ts +3 -0
- package/lib/testing.d.ts.map +1 -0
- package/lib/testing.js +3 -0
- package/lib/testing.js.map +1 -0
- package/package.json +193 -3
- package/templates/default/.claude/agents/qa-brief.md +106 -0
- package/templates/default/.claude/commands/sherpa-brief.md +23 -0
- package/templates/default/.cursor/rules/api.mdc +80 -0
- package/templates/default/.cursor/rules/commits.mdc +88 -0
- package/templates/default/.cursor/rules/security.mdc +92 -0
- package/templates/default/.cursor/rules/testing.mdc +123 -0
- package/templates/default/.cursor/rules/typescript.mdc +86 -0
- package/templates/default/.env.example +79 -0
- package/templates/default/.github/workflows/sherpa-brief.yml +180 -0
- package/templates/default/AGENTS.md +166 -0
- package/templates/default/CLAUDE.md +17 -0
- package/templates/default/README.md +97 -0
- package/templates/default/_gitignore +27 -0
- package/templates/default/docker-compose.yml +83 -0
- package/templates/default/drizzle.config.ts +34 -0
- package/templates/default/eslint.config.mjs +106 -0
- package/templates/default/package.json +57 -0
- package/templates/default/ship-api.config.ts +21 -0
- package/templates/default/src/client.ts +34 -0
- package/templates/default/src/config/modules.ts +23 -0
- package/templates/default/src/db/schema.ts +26 -0
- package/templates/default/src/environment.ts +81 -0
- package/templates/default/src/index.test.ts +53 -0
- package/templates/default/src/index.ts +11 -0
- package/templates/default/src/instrumentation.ts +13 -0
- package/templates/default/src/server.ts +90 -0
- package/templates/default/tsconfig.json +24 -0
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
# Performance Guide
|
|
2
|
+
|
|
3
|
+
This guide covers performance optimization, best practices, and monitoring for the Weaviate framework.
|
|
4
|
+
|
|
5
|
+
## 📊 Performance Metrics
|
|
6
|
+
|
|
7
|
+
### Search Method Performance
|
|
8
|
+
|
|
9
|
+
| Method | Speed | Accuracy | Memory Usage | Best For |
|
|
10
|
+
| ------ | ------ | --------------- | ------------ | ------------------------ |
|
|
11
|
+
| Vector | Medium | High (semantic) | High | Natural language queries |
|
|
12
|
+
| BM25 | Fast | High (keyword) | Low | Exact term matching |
|
|
13
|
+
| Hybrid | Medium | **Highest** | Medium | General purpose search |
|
|
14
|
+
|
|
15
|
+
### Performance Benchmarks
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// Typical performance characteristics
|
|
19
|
+
const benchmarks = {
|
|
20
|
+
vector: {
|
|
21
|
+
latency: "50-200ms",
|
|
22
|
+
throughput: "100-500 queries/sec",
|
|
23
|
+
memory: "High (vector storage)",
|
|
24
|
+
},
|
|
25
|
+
bm25: {
|
|
26
|
+
latency: "10-50ms",
|
|
27
|
+
throughput: "500-2000 queries/sec",
|
|
28
|
+
memory: "Low (text index)",
|
|
29
|
+
},
|
|
30
|
+
hybrid: {
|
|
31
|
+
latency: "60-250ms",
|
|
32
|
+
throughput: "80-400 queries/sec",
|
|
33
|
+
memory: "Medium (combined)",
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 🚀 Optimization Strategies
|
|
39
|
+
|
|
40
|
+
### 1. Schema Optimization
|
|
41
|
+
|
|
42
|
+
#### Strategic Field Selection
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// ✅ Good: Only vectorize fields that benefit from semantic search
|
|
46
|
+
const Person: SchemaConfig = {
|
|
47
|
+
name: "Person",
|
|
48
|
+
properties: [
|
|
49
|
+
{
|
|
50
|
+
name: "bio",
|
|
51
|
+
type: "text",
|
|
52
|
+
vectorizable: true, // Rich semantic content
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "firstName",
|
|
56
|
+
type: "string",
|
|
57
|
+
vectorizable: false, // Exact matching better
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// ❌ Bad: Vectorizing everything
|
|
63
|
+
const BadPerson: SchemaConfig = {
|
|
64
|
+
properties: [
|
|
65
|
+
{ name: "email", vectorizable: true }, // Unnecessary
|
|
66
|
+
{ name: "phone", vectorizable: true }, // Unnecessary
|
|
67
|
+
{ name: "id", vectorizable: true }, // Unnecessary
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### Searchable Fields Optimization
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// ✅ Good: Limit searchable fields to essential ones
|
|
76
|
+
const Person: SchemaConfig = {
|
|
77
|
+
searchableFields: [
|
|
78
|
+
"firstName", // Essential for person search
|
|
79
|
+
"lastName", // Essential for person search
|
|
80
|
+
"bio", // Rich content for semantic search
|
|
81
|
+
// Avoid: "createdAt", "id", "internalId"
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// ❌ Bad: Making everything searchable
|
|
86
|
+
const BadPerson: SchemaConfig = {
|
|
87
|
+
searchableFields: [
|
|
88
|
+
"firstName",
|
|
89
|
+
"lastName",
|
|
90
|
+
"email",
|
|
91
|
+
"phone",
|
|
92
|
+
"createdAt",
|
|
93
|
+
"updatedAt",
|
|
94
|
+
"id",
|
|
95
|
+
"internalId",
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 2. Query Optimization
|
|
101
|
+
|
|
102
|
+
#### Limit and Pagination
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// ✅ Good: Use appropriate limits
|
|
106
|
+
const results = await weaviate.search("Person", {
|
|
107
|
+
method: "hybrid",
|
|
108
|
+
options: {
|
|
109
|
+
hybrid: { query: "engineer" },
|
|
110
|
+
limit: 10, // Reasonable limit
|
|
111
|
+
offset: 0,
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// ❌ Bad: No limits or excessive limits
|
|
116
|
+
const badResults = await weaviate.search("Person", {
|
|
117
|
+
method: "hybrid",
|
|
118
|
+
options: {
|
|
119
|
+
hybrid: { query: "engineer" },
|
|
120
|
+
// No limit = potentially thousands of results
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### Efficient Filtering
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// ✅ Good: Use filters to reduce search space
|
|
129
|
+
const results = await weaviate.search("Person", {
|
|
130
|
+
method: "hybrid",
|
|
131
|
+
options: {
|
|
132
|
+
hybrid: { query: "engineer" },
|
|
133
|
+
where: {
|
|
134
|
+
path: ["city"],
|
|
135
|
+
operator: "Equal",
|
|
136
|
+
valueText: "San Francisco",
|
|
137
|
+
},
|
|
138
|
+
limit: 10,
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// ❌ Bad: Search everything then filter in application
|
|
143
|
+
const allResults = await weaviate.search("Person", {
|
|
144
|
+
method: "hybrid",
|
|
145
|
+
options: {
|
|
146
|
+
hybrid: { query: "engineer" },
|
|
147
|
+
limit: 1000, // Too many results
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
// Then filter in JavaScript (inefficient)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 3. Vector Index Optimization
|
|
154
|
+
|
|
155
|
+
#### Vector Index Configuration
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
const Person: SchemaConfig = {
|
|
159
|
+
name: "Person",
|
|
160
|
+
vectorIndexConfig: {
|
|
161
|
+
distance: "cosine", // Best for text similarity
|
|
162
|
+
efConstruction: 128, // Higher = better quality, slower build
|
|
163
|
+
maxConnections: 16, // Higher = better quality, more memory
|
|
164
|
+
ef: 64, // Higher = better quality, slower queries
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
#### Performance Tuning
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// For high-performance scenarios
|
|
173
|
+
const HighPerfConfig = {
|
|
174
|
+
distance: "cosine",
|
|
175
|
+
efConstruction: 256, // Higher quality
|
|
176
|
+
maxConnections: 32, // More connections
|
|
177
|
+
ef: 128, // Better search quality
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// For fast queries (lower quality)
|
|
181
|
+
const FastConfig = {
|
|
182
|
+
distance: "cosine",
|
|
183
|
+
efConstruction: 64, // Faster build
|
|
184
|
+
maxConnections: 8, // Less memory
|
|
185
|
+
ef: 32, // Faster queries
|
|
186
|
+
};
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 4. Caching Strategies
|
|
190
|
+
|
|
191
|
+
#### Application-Level Caching
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
// Cache frequent queries
|
|
195
|
+
class CachedWeaviateService {
|
|
196
|
+
private cache = new Map<string, any>();
|
|
197
|
+
private cacheTimeout = 5 * 60 * 1000; // 5 minutes
|
|
198
|
+
|
|
199
|
+
async search(schemaName: string, method: string, options: any) {
|
|
200
|
+
const cacheKey = this.generateCacheKey(schemaName, method, options);
|
|
201
|
+
const cached = this.cache.get(cacheKey);
|
|
202
|
+
|
|
203
|
+
if (cached && this.isCacheValid(cached)) {
|
|
204
|
+
return cached.data;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const result = await this.weaviate.search(schemaName, method, options);
|
|
208
|
+
this.cache.set(cacheKey, {
|
|
209
|
+
data: result,
|
|
210
|
+
timestamp: Date.now(),
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
#### Redis Caching
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
import Redis from "ioredis";
|
|
222
|
+
|
|
223
|
+
class RedisCachedWeaviateService {
|
|
224
|
+
private redis = new Redis(process.env.REDIS_URL);
|
|
225
|
+
|
|
226
|
+
async search(schemaName: string, method: string, options: any) {
|
|
227
|
+
const cacheKey = `weaviate:${schemaName}:${method}:${JSON.stringify(options)}`;
|
|
228
|
+
|
|
229
|
+
// Try cache first
|
|
230
|
+
const cached = await this.redis.get(cacheKey);
|
|
231
|
+
if (cached) {
|
|
232
|
+
return JSON.parse(cached);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Execute search
|
|
236
|
+
const result = await this.weaviate.search(schemaName, method, options);
|
|
237
|
+
|
|
238
|
+
// Cache result
|
|
239
|
+
await this.redis.setex(cacheKey, 300, JSON.stringify(result)); // 5 min TTL
|
|
240
|
+
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 🔍 Monitoring and Profiling
|
|
247
|
+
|
|
248
|
+
### Performance Monitoring
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
class PerformanceMonitor {
|
|
252
|
+
private metrics = {
|
|
253
|
+
searchCount: 0,
|
|
254
|
+
totalLatency: 0,
|
|
255
|
+
averageLatency: 0,
|
|
256
|
+
errorCount: 0,
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
async monitorSearch<T>(
|
|
260
|
+
schemaName: string,
|
|
261
|
+
method: string,
|
|
262
|
+
options: any,
|
|
263
|
+
searchFn: () => Promise<T>,
|
|
264
|
+
): Promise<T> {
|
|
265
|
+
const startTime = performance.now();
|
|
266
|
+
|
|
267
|
+
try {
|
|
268
|
+
const result = await searchFn();
|
|
269
|
+
const endTime = performance.now();
|
|
270
|
+
|
|
271
|
+
this.updateMetrics(endTime - startTime, false);
|
|
272
|
+
return result;
|
|
273
|
+
} catch (error) {
|
|
274
|
+
this.updateMetrics(0, true);
|
|
275
|
+
throw error;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
private updateMetrics(latency: number, isError: boolean) {
|
|
280
|
+
this.metrics.searchCount++;
|
|
281
|
+
this.metrics.totalLatency += latency;
|
|
282
|
+
this.metrics.averageLatency = this.metrics.totalLatency / this.metrics.searchCount;
|
|
283
|
+
|
|
284
|
+
if (isError) {
|
|
285
|
+
this.metrics.errorCount++;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
getMetrics() {
|
|
290
|
+
return { ...this.metrics };
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Query Performance Analysis
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
class QueryAnalyzer {
|
|
299
|
+
analyzeQuery(options: any): QueryAnalysis {
|
|
300
|
+
const analysis = {
|
|
301
|
+
complexity: "low",
|
|
302
|
+
estimatedLatency: "fast",
|
|
303
|
+
recommendations: [],
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
// Analyze limit
|
|
307
|
+
if (!options.limit || options.limit > 100) {
|
|
308
|
+
analysis.recommendations.push("Consider adding a limit (recommended: 10-50)");
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Analyze filters
|
|
312
|
+
if (!options.where) {
|
|
313
|
+
analysis.recommendations.push("Consider adding filters to reduce search space");
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Analyze search method
|
|
317
|
+
if (options.hybrid?.alpha === 1.0) {
|
|
318
|
+
analysis.recommendations.push("Pure vector search - consider hybrid for better results");
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return analysis;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## 🏗️ Architecture Optimization
|
|
327
|
+
|
|
328
|
+
### Connection Pooling
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
// The framework automatically handles connection pooling
|
|
332
|
+
// No additional configuration needed for basic usage
|
|
333
|
+
|
|
334
|
+
// For high-load scenarios, consider:
|
|
335
|
+
class OptimizedWeaviateService {
|
|
336
|
+
private connectionPool: WeaviateClient[] = [];
|
|
337
|
+
private maxConnections = 10;
|
|
338
|
+
|
|
339
|
+
async initializePool() {
|
|
340
|
+
for (let i = 0; i < this.maxConnections; i++) {
|
|
341
|
+
const client = await WeaviateConfigService.initializeClient();
|
|
342
|
+
this.connectionPool.push(client);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
getConnection(): WeaviateClient {
|
|
347
|
+
// Round-robin connection selection
|
|
348
|
+
const index = Math.floor(Math.random() * this.connectionPool.length);
|
|
349
|
+
return this.connectionPool[index];
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Batch Processing
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
class BatchProcessor {
|
|
358
|
+
private batch: any[] = [];
|
|
359
|
+
private batchSize = 10;
|
|
360
|
+
private batchTimeout = 1000; // 1 second
|
|
361
|
+
|
|
362
|
+
async addToBatch(data: any) {
|
|
363
|
+
this.batch.push(data);
|
|
364
|
+
|
|
365
|
+
if (this.batch.length >= this.batchSize) {
|
|
366
|
+
return await this.processBatch();
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Set timeout for batch processing
|
|
370
|
+
setTimeout(() => this.processBatch(), this.batchTimeout);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private async processBatch() {
|
|
374
|
+
if (this.batch.length === 0) return;
|
|
375
|
+
|
|
376
|
+
const batch = [...this.batch];
|
|
377
|
+
this.batch = [];
|
|
378
|
+
|
|
379
|
+
// Process batch efficiently
|
|
380
|
+
await this.processBatchData(batch);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## 📈 Performance Best Practices
|
|
386
|
+
|
|
387
|
+
### 1. Schema Design
|
|
388
|
+
|
|
389
|
+
```typescript
|
|
390
|
+
// ✅ Good schema design
|
|
391
|
+
const OptimizedPerson: SchemaConfig = {
|
|
392
|
+
name: "Person",
|
|
393
|
+
// Only essential fields are searchable
|
|
394
|
+
searchableFields: ["firstName", "lastName", "bio"],
|
|
395
|
+
// Strategic vectorization
|
|
396
|
+
properties: [
|
|
397
|
+
{ name: "bio", type: "text", vectorizable: true },
|
|
398
|
+
{ name: "firstName", type: "string", vectorizable: false },
|
|
399
|
+
],
|
|
400
|
+
// Efficient indexing
|
|
401
|
+
vectorIndexConfig: {
|
|
402
|
+
distance: "cosine",
|
|
403
|
+
efConstruction: 128,
|
|
404
|
+
maxConnections: 16,
|
|
405
|
+
ef: 64,
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### 2. Query Patterns
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
// ✅ Efficient query patterns
|
|
414
|
+
const efficientQueries = {
|
|
415
|
+
// Use filters to reduce search space
|
|
416
|
+
filteredSearch: {
|
|
417
|
+
hybrid: { query: "engineer" },
|
|
418
|
+
where: { path: ["city"], operator: "Equal", valueText: "SF" },
|
|
419
|
+
limit: 10,
|
|
420
|
+
},
|
|
421
|
+
|
|
422
|
+
// Use appropriate limits
|
|
423
|
+
limitedSearch: {
|
|
424
|
+
hybrid: { query: "AI" },
|
|
425
|
+
limit: 20, // Reasonable limit
|
|
426
|
+
},
|
|
427
|
+
|
|
428
|
+
// Use pagination for large result sets
|
|
429
|
+
paginatedSearch: {
|
|
430
|
+
hybrid: { query: "developer" },
|
|
431
|
+
limit: 10,
|
|
432
|
+
offset: 0,
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### 3. Caching Strategy
|
|
438
|
+
|
|
439
|
+
```typescript
|
|
440
|
+
// ✅ Multi-level caching
|
|
441
|
+
class OptimizedCaching {
|
|
442
|
+
private l1Cache = new Map(); // In-memory cache
|
|
443
|
+
private l2Cache: Redis; // Redis cache
|
|
444
|
+
|
|
445
|
+
async search(query: string) {
|
|
446
|
+
// L1 Cache (fastest)
|
|
447
|
+
if (this.l1Cache.has(query)) {
|
|
448
|
+
return this.l1Cache.get(query);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// L2 Cache (fast)
|
|
452
|
+
const cached = await this.l2Cache.get(query);
|
|
453
|
+
if (cached) {
|
|
454
|
+
this.l1Cache.set(query, cached);
|
|
455
|
+
return cached;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Database (slowest)
|
|
459
|
+
const result = await this.executeSearch(query);
|
|
460
|
+
|
|
461
|
+
// Cache at both levels
|
|
462
|
+
this.l1Cache.set(query, result);
|
|
463
|
+
await this.l2Cache.setex(query, 300, result);
|
|
464
|
+
|
|
465
|
+
return result;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### 4. Error Handling
|
|
471
|
+
|
|
472
|
+
```typescript
|
|
473
|
+
// ✅ Robust error handling
|
|
474
|
+
class ResilientWeaviateService {
|
|
475
|
+
async searchWithRetry(schemaName: string, method: string, options: any, maxRetries = 3) {
|
|
476
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
477
|
+
try {
|
|
478
|
+
return await this.weaviate.search(schemaName, method, options);
|
|
479
|
+
} catch (error) {
|
|
480
|
+
if (attempt === maxRetries) {
|
|
481
|
+
throw error;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Exponential backoff
|
|
485
|
+
await this.sleep(Math.pow(2, attempt) * 1000);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
## 🚨 Performance Anti-Patterns
|
|
493
|
+
|
|
494
|
+
### ❌ Common Mistakes
|
|
495
|
+
|
|
496
|
+
```typescript
|
|
497
|
+
// ❌ Don't: Search without limits
|
|
498
|
+
const badSearch = await weaviate.search("Person", {
|
|
499
|
+
method: "hybrid",
|
|
500
|
+
options: {
|
|
501
|
+
hybrid: { query: "engineer" },
|
|
502
|
+
// No limit = potentially thousands of results
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
// ❌ Don't: Vectorize everything
|
|
507
|
+
const badSchema = {
|
|
508
|
+
properties: [
|
|
509
|
+
{ name: "id", vectorizable: true }, // Unnecessary
|
|
510
|
+
{ name: "email", vectorizable: true }, // Unnecessary
|
|
511
|
+
{ name: "phone", vectorizable: true }, // Unnecessary
|
|
512
|
+
],
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
// ❌ Don't: Search then filter in application
|
|
516
|
+
const badPattern = async () => {
|
|
517
|
+
const allResults = await weaviate.search("Person", {
|
|
518
|
+
method: "hybrid",
|
|
519
|
+
options: {
|
|
520
|
+
hybrid: { query: "engineer" },
|
|
521
|
+
limit: 1000,
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
// Filtering in JavaScript (inefficient)
|
|
526
|
+
return allResults.objects.filter((person) => person.city === "SF");
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
// ❌ Don't: No caching for repeated queries
|
|
530
|
+
const badCaching = async (query: string) => {
|
|
531
|
+
// Same query executed multiple times
|
|
532
|
+
return await weaviate.search("Person", {
|
|
533
|
+
method: "hybrid",
|
|
534
|
+
options: { hybrid: { query } }
|
|
535
|
+
});
|
|
536
|
+
};
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
## 📊 Performance Monitoring Dashboard
|
|
540
|
+
|
|
541
|
+
### Metrics to Track
|
|
542
|
+
|
|
543
|
+
```typescript
|
|
544
|
+
interface PerformanceMetrics {
|
|
545
|
+
// Search metrics
|
|
546
|
+
searchCount: number;
|
|
547
|
+
averageLatency: number;
|
|
548
|
+
p95Latency: number;
|
|
549
|
+
p99Latency: number;
|
|
550
|
+
|
|
551
|
+
// Error metrics
|
|
552
|
+
errorRate: number;
|
|
553
|
+
timeoutRate: number;
|
|
554
|
+
|
|
555
|
+
// Resource metrics
|
|
556
|
+
memoryUsage: number;
|
|
557
|
+
cpuUsage: number;
|
|
558
|
+
|
|
559
|
+
// Cache metrics
|
|
560
|
+
cacheHitRate: number;
|
|
561
|
+
cacheSize: number;
|
|
562
|
+
}
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
### Monitoring Implementation
|
|
566
|
+
|
|
567
|
+
```typescript
|
|
568
|
+
class PerformanceDashboard {
|
|
569
|
+
private metrics: PerformanceMetrics = {
|
|
570
|
+
searchCount: 0,
|
|
571
|
+
averageLatency: 0,
|
|
572
|
+
p95Latency: 0,
|
|
573
|
+
p99Latency: 0,
|
|
574
|
+
errorRate: 0,
|
|
575
|
+
timeoutRate: 0,
|
|
576
|
+
memoryUsage: 0,
|
|
577
|
+
cpuUsage: 0,
|
|
578
|
+
cacheHitRate: 0,
|
|
579
|
+
cacheSize: 0,
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
updateMetrics(searchLatency: number, isError: boolean) {
|
|
583
|
+
this.metrics.searchCount++;
|
|
584
|
+
this.metrics.averageLatency = (this.metrics.averageLatency + searchLatency) / 2;
|
|
585
|
+
|
|
586
|
+
if (isError) {
|
|
587
|
+
this.metrics.errorRate =
|
|
588
|
+
(this.metrics.errorRate * (this.metrics.searchCount - 1) + 1) / this.metrics.searchCount;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
getHealthStatus(): "healthy" | "degraded" | "unhealthy" {
|
|
593
|
+
if (this.metrics.errorRate > 0.1) return "unhealthy";
|
|
594
|
+
if (this.metrics.averageLatency > 1000) return "degraded";
|
|
595
|
+
return "healthy";
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
---
|
|
601
|
+
|
|
602
|
+
**Next Steps**: For complete API documentation, see the [API Reference](./API_REFERENCE.md).
|