@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
package/lib/index.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@sixthsummit/ship-api` — public API barrel for ShipAPI v4.
|
|
3
|
+
*
|
|
4
|
+
* This is the canonical entry point for consumer apps. The framework
|
|
5
|
+
* exports a curated, semver-stable surface here; deep-path imports
|
|
6
|
+
* (`@sixthsummit/ship-api/http/middleware/...`) are still available
|
|
7
|
+
* but NOT covered by semver — they're for internal cross-module use
|
|
8
|
+
* and advanced consumers who need primitives the barrel doesn't yet
|
|
9
|
+
* surface.
|
|
10
|
+
*
|
|
11
|
+
* The `@sixthsummit/ship-api/client` subpath remains a separate
|
|
12
|
+
* lightweight bundle for typed-client consumers (web / mobile) that
|
|
13
|
+
* shouldn't pull in the framework's runtime deps. Import from there:
|
|
14
|
+
*
|
|
15
|
+
* import { hc } from "@sixthsummit/ship-api/client";
|
|
16
|
+
* import type { ShipApiClient } from "@my-org/api";
|
|
17
|
+
*/
|
|
18
|
+
export { ApplicationCompilationError, anyPermission, authenticatedAccess, checkOperationAccess, compileApp, createExecutor, createTenantBypassAuthority, createTenantScopeAuthority, defineActorResolver, defineApp, defineModule, defineOperation, defineProvider, dependency, effectDependency, InvalidModuleDefinitionError, InvalidOperationDefinitionError, InvalidProviderDefinitionError, isActorResolution, isActorResolver, isEffectDependencyToken, isExplicitOperationResponse, isOperationActor, isOperationIdentity, isTenantBypass, isTenantScope, isUnitOfWork, isUnitOfWorkDependencyToken, normalizeActorResolution, normalizeOperationActor, OperationExecutionError, OperationFailure, operationActor, operationError, operationFailure, operationIdentity, optionalIdentityAccess, permission, permissionSnapshot, publicAccess, respond, TenantCapabilityError, unitOfWorkDependency, valueProvider, } from "./kernel/index.js";
|
|
19
|
+
export { createHonoAdapter, defineHonoCredentialAdapter, HonoAdapterError, honoAuthProvider, http, InvalidHttpTransportError, isHonoCredentialAdapter, isHttpTransport, requestHeadersCredential, } from "./hono/index.js";
|
|
20
|
+
export { createApp, createModuleApp } from "./http/app/createApp.js";
|
|
21
|
+
export { registerErrorHandlers } from "./http/app/errors.js";
|
|
22
|
+
export { apiKey } from "./http/middleware/apiKey.js";
|
|
23
|
+
export { csrf } from "./http/middleware/csrf.js";
|
|
24
|
+
export { httpLogger } from "./http/middleware/httpLogger.js";
|
|
25
|
+
export { idempotency } from "./http/middleware/idempotency.js";
|
|
26
|
+
export { rateLimit } from "./http/middleware/rateLimit.js";
|
|
27
|
+
export { AUTH_CONTEXT_KEYS, requireAuth } from "./http/middleware/requireAuth.js";
|
|
28
|
+
export { requirePermission } from "./http/middleware/requirePermission.js";
|
|
29
|
+
export { resolveTenant } from "./http/middleware/resolveTenant.js";
|
|
30
|
+
export { streamSSE } from "./http/streaming/sse.js";
|
|
31
|
+
export { streamLLM } from "./http/streaming/streamLLM.js";
|
|
32
|
+
export { parseUpload } from "./http/utils/uploads.js";
|
|
33
|
+
export { validate } from "./http/utils/validate.js";
|
|
34
|
+
export { parseWebhook } from "./http/utils/webhooks.js";
|
|
35
|
+
// ─── Error taxonomy ────────────────────────────────────────────────
|
|
36
|
+
export { AppError, AuthenticationError, AuthorizationError, BadRequestError, ConflictError, InternalServerError, NotFoundError, RateLimitError, ServiceUnavailableError, ValidationError, } from "./http/errors/index.js";
|
|
37
|
+
export { FirebaseAuthProvider, firebaseAuth } from "./app/auth/adapters/firebase.js";
|
|
38
|
+
export { getRequestContext } from "./app/context/RequestContext.js";
|
|
39
|
+
export { baseFields, baseFieldsTimestampsOnly } from "./app/db/baseFields.js";
|
|
40
|
+
// `DslQueryFilter` (the DSL filter shape) lives in app/db/QueryOptions.js and
|
|
41
|
+
// is intentionally NOT re-exported here — it's the ORM-translation detail, not
|
|
42
|
+
// the common surface. Consumers driving the DSL directly import it from the
|
|
43
|
+
// subpath:
|
|
44
|
+
// import type { DslQueryFilter } from "@sixthsummit/ship-api/app/db/QueryOptions";
|
|
45
|
+
// The barrel re-exports the lifecycle-hook `QueryFilter` below (the common one).
|
|
46
|
+
export { isQueryOperator, QUERY_OPERATORS } from "./app/db/QueryOptions.js";
|
|
47
|
+
export { tenantScoped } from "./app/db/tenantScoped.js";
|
|
48
|
+
export { RollbackError, withTransaction } from "./app/db/transaction.js";
|
|
49
|
+
export { DrizzleEntityService } from "./app/services/DrizzleEntityService.js";
|
|
50
|
+
export { composeHooks } from "./app/services/hooks/LifecycleHooks.js";
|
|
51
|
+
export { cached, InMemoryCache, RedisCache } from "./app/services/cache/index.js";
|
|
52
|
+
// ─── Redis provider ────────────────────────────────────────────────
|
|
53
|
+
export { RedisProvider } from "./app/services/RedisProvider.js";
|
|
54
|
+
export { defineJob, JobRegistry, JobsManager, jobRegistry } from "./app/services/jobs/index.js";
|
|
55
|
+
export { CRON_QUEUE, defineCron } from "./app/services/cron/index.js";
|
|
56
|
+
export { HealthCheckRegistry, healthCheckRegistry } from "./app/health/HealthCheck.js";
|
|
57
|
+
export { redisHealthCheck } from "./app/health/redisHealthCheck.js";
|
|
58
|
+
export { hasHealthRoutes, registerHealthRoutes } from "./http/app/health.js";
|
|
59
|
+
export { routeRegistry } from "./app/registry/routes.js";
|
|
60
|
+
export { defineEnv } from "./app/utils/defineEnv.js";
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA8GH,OAAO,EACL,2BAA2B,EAC3B,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAwB3B,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,IAAI,EACJ,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,sEAAsE;AAEtE,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAWhC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAKrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAO9E,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,WAAW;AACX,qFAAqF;AACrF,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAS9E,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAKtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAElF,sEAAsE;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAYhE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAKhG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAYtE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAMpE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAK7E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAWzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kernel/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kernel/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,cAAc,wBAAwB,CAAC"}
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# `ai` library — changelog
|
|
2
|
+
|
|
3
|
+
The `ai` library is **versioned independently of the framework core** (AI-A3 / A2-11): the AI substrate churns fastest, so it bumps on its own schedule without dragging the stable framework version. The current version lives in `library.json#version` and is stamped into a consumer's `src/lib/ai/.ship-lib.json` on `ship-api add -l ai` (so staleness is detectable and `ship-api update` has an anchor).
|
|
4
|
+
|
|
5
|
+
**Versioning rule:** bump `library.json#version` on any meaningful change to the `ai` surface. Pre-1.0, breaking changes bump the **minor**; additive/fix changes bump the **patch**. This is decoupled from the framework's `4.x` line.
|
|
6
|
+
|
|
7
|
+
## 0.2.0
|
|
8
|
+
|
|
9
|
+
Part II AI-library refinement (alpha-window, deliberate).
|
|
10
|
+
|
|
11
|
+
- **AI-R1** — the `LLMProvider` seam is now genuinely pass-through, not lowest-common-denominator: `CompleteResult` / `StreamStopEvent` carry `raw` + `providerExtras`, `TokenUsage` carries `reasoningTokens` + `raw`, both adapters populate them (Anthropic thinking/citations/server-tool-use; OpenAI refusal/reasoning tokens), and `agentLoop` / `retrieveAndAnswer` no longer drop `providerOptions` / `metadata`. Additive-optional.
|
|
12
|
+
- **AI-R2** (breaking) — `agentLoop` moved off the stable barrel to `@sixthsummit/ship-api/libraries/ai/experimental`; it carries no stability promise and is expected to be superseded by MCP / provider-native agent runtimes. `defineTool` / `toolRegistry` stay on the stable barrel.
|
|
13
|
+
- **AI-R3** — `HeuristicTokenizer` / `countMessageTokens` deprecated (token truth is the provider response `usage`); added thin `estimateTokens` / `estimateMessageTokens` for pre-call prompt-fit / rate-limit budgeting. The `Tokenizer` interface is unchanged.
|
|
14
|
+
|
|
15
|
+
## 0.1.0
|
|
16
|
+
|
|
17
|
+
Initial `ai` library: the `LLMProvider` interface + Anthropic & OpenAI adapters, `defineTool` / `toolRegistry`, `agentLoop`, `completeStructured`, the `definePrompt` prompt registry, the `retrieveAndAnswer` RAG pipeline, and a pluggable `Tokenizer`.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# `libraries/ai/` — LLM helper library
|
|
2
|
+
|
|
3
|
+
The framework's defining differentiator. Provider-agnostic LLM tooling that consumers compose into their app: provider adapters (Anthropic + OpenAI today), prompt registry, tool-calling, agent loop, structured outputs, RAG, token counting.
|
|
4
|
+
|
|
5
|
+
> **Install via**: `ship-api add -l ai`. The library itself takes **no** SDK runtime dependency — concrete provider adapters are opt-in (install only the SDK for the providers you use).
|
|
6
|
+
|
|
7
|
+
## What's inside
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
libraries/ai/
|
|
11
|
+
├── adapters/
|
|
12
|
+
│ ├── LLMProvider.ts — pluggable provider contract
|
|
13
|
+
│ ├── AnthropicAdapter.ts — wraps @anthropic-ai/sdk
|
|
14
|
+
│ └── OpenAIAdapter.ts — wraps openai
|
|
15
|
+
├── tools/
|
|
16
|
+
│ └── defineTool.ts — Zod schema → typed handler + ToolRegistry
|
|
17
|
+
├── loop/
|
|
18
|
+
│ └── agentLoop.ts — model→tool→model cycle with retry budget + signal honoring
|
|
19
|
+
├── structured/
|
|
20
|
+
│ └── completeStructured.ts — Zod-typed single-shot via synthetic-tool pattern
|
|
21
|
+
├── prompts/
|
|
22
|
+
│ └── definePrompt.ts — versioned prompt primitive + PromptRegistry
|
|
23
|
+
├── rag/
|
|
24
|
+
│ └── retrieveAndAnswer.ts — pluggable VectorStore + LLMProvider RAG driver
|
|
25
|
+
├── tokens/
|
|
26
|
+
│ └── Tokenizer.ts — pluggable tokenizer + HeuristicTokenizer baseline
|
|
27
|
+
├── types.ts — cross-provider lingua franca
|
|
28
|
+
└── index.ts — public barrel
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Quick reference
|
|
32
|
+
|
|
33
|
+
### Provider-portable completion
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { AnthropicAdapter } from "@sixthsummit/ship-api/libraries/ai";
|
|
37
|
+
|
|
38
|
+
const llm = new AnthropicAdapter({ apiKey: env.ANTHROPIC_API_KEY });
|
|
39
|
+
|
|
40
|
+
const result = await llm.complete({
|
|
41
|
+
model: "claude-opus-4-7",
|
|
42
|
+
system: "Be concise.",
|
|
43
|
+
messages: [{ role: "user", content: "What is 2+2?" }],
|
|
44
|
+
});
|
|
45
|
+
console.log(result.text); // "4"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Swap `AnthropicAdapter` for `OpenAIAdapter` and the same call site works — provider-specific tunables ride on `providerOptions` so the cross-provider surface stays narrow.
|
|
49
|
+
|
|
50
|
+
### Tool calling
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { defineTool, toolRegistry } from "@sixthsummit/ship-api/libraries/ai";
|
|
54
|
+
// agentLoop is experimental (AI-R2) — no stability promise; the hand-rolled
|
|
55
|
+
// loop is expected to be superseded by MCP / provider-native agent runtimes.
|
|
56
|
+
import { agentLoop } from "@sixthsummit/ship-api/libraries/ai/experimental";
|
|
57
|
+
import { z } from "zod";
|
|
58
|
+
|
|
59
|
+
const getWeather = defineTool({
|
|
60
|
+
name: "get_weather",
|
|
61
|
+
description: "Look up current weather for a city",
|
|
62
|
+
schema: z.object({ city: z.string() }),
|
|
63
|
+
handler: async ({ city }) => fetchWeather(city),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const result = await agentLoop({
|
|
67
|
+
llm,
|
|
68
|
+
tools: toolRegistry(getWeather),
|
|
69
|
+
model: "claude-opus-4-7",
|
|
70
|
+
messages: [{ role: "user", content: "What's the weather in Paris?" }],
|
|
71
|
+
maxIterations: 5,
|
|
72
|
+
});
|
|
73
|
+
console.log(result.finalText);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Structured outputs
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import { completeStructured } from "@sixthsummit/ship-api/libraries/ai";
|
|
80
|
+
import { z } from "zod";
|
|
81
|
+
|
|
82
|
+
const { data } = await completeStructured({
|
|
83
|
+
llm,
|
|
84
|
+
schema: z.object({
|
|
85
|
+
sentiment: z.enum(["positive", "neutral", "negative"]),
|
|
86
|
+
confidence: z.number().min(0).max(1),
|
|
87
|
+
}),
|
|
88
|
+
model: "claude-opus-4-7",
|
|
89
|
+
messages: [{ role: "user", content: "I love this product!" }],
|
|
90
|
+
});
|
|
91
|
+
// data: { sentiment: "positive", confidence: 0.95 }
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### RAG
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import { retrieveAndAnswer } from "@sixthsummit/ship-api/libraries/ai";
|
|
98
|
+
|
|
99
|
+
// Bring your own VectorStore — interface-only; no library coupling.
|
|
100
|
+
const store: VectorStore = {
|
|
101
|
+
name: "weaviate",
|
|
102
|
+
async search({ query, topK }) {
|
|
103
|
+
/* ... */
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const { answer, sources } = await retrieveAndAnswer({
|
|
108
|
+
llm,
|
|
109
|
+
vectorStore: store,
|
|
110
|
+
query: "What is the capital of France?",
|
|
111
|
+
topK: 5,
|
|
112
|
+
model: "claude-opus-4-7",
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Streaming
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
import { streamLLM } from "@sixthsummit/ship-api";
|
|
120
|
+
|
|
121
|
+
app.post("/chat", validate("json", schema), async (c) => {
|
|
122
|
+
const { prompt } = c.req.valid("json");
|
|
123
|
+
const stream = llm.streamComplete({
|
|
124
|
+
model: "claude-opus-4-7",
|
|
125
|
+
messages: [{ role: "user", content: prompt }],
|
|
126
|
+
});
|
|
127
|
+
return streamLLM(c, stream); // → SSE; client disconnect cancels upstream
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Versioned prompts
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
import { definePrompt, PromptRegistry } from "@sixthsummit/ship-api/libraries/ai";
|
|
135
|
+
|
|
136
|
+
const greetPrompt = definePrompt({
|
|
137
|
+
id: "greetings.welcome",
|
|
138
|
+
version: 3,
|
|
139
|
+
template: "Hello, {{name}}! Welcome to {{appName}}.",
|
|
140
|
+
schema: z.object({ name: z.string(), appName: z.string() }),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
greetPrompt.render({ name: "Ada", appName: "ShipAPI" });
|
|
144
|
+
// "Hello, Ada! Welcome to ShipAPI."
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
CI lint flags un-versioned changes — bumping `version` on every meaningful change makes the change auditable and lets eval suites pin to a known-good version.
|
|
148
|
+
|
|
149
|
+
## Conventions
|
|
150
|
+
|
|
151
|
+
- **The library never imports a provider SDK directly.** Adapters import the SDK they wrap; consumers install only the SDK for the providers they use.
|
|
152
|
+
- **Provider-specific tunables ride in `providerOptions` / `providerExtras`** so the cross-provider surface stays narrow.
|
|
153
|
+
- **Tools must be idempotent.** The agent loop's at-least-once delivery semantics mean a handler may be re-invoked after a crash or retry. Use `dedupeKey` for downstream deduplication where supported.
|
|
154
|
+
- **Streaming abort honored end-to-end.** Client disconnect propagates through `streamLLM` → `iterator.return()` → upstream provider stream cancellation.
|
|
155
|
+
|
|
156
|
+
## Versioning
|
|
157
|
+
|
|
158
|
+
This library is **versioned independently of the framework core** (AI-A3): the AI substrate moves fastest, so it bumps on its own schedule via `library.json#version` without dragging the stable `4.x` framework version. On `ship-api add -l ai` the vendored version is stamped into `src/lib/ai/.ship-lib.json`, so staleness is detectable and `ship-api update` has an anchor to diff against. **Bump `library.json#version` on any meaningful change** — pre-1.0, breaking changes bump the minor, additive/fix changes bump the patch. See [`CHANGELOG.md`](./CHANGELOG.md).
|
|
159
|
+
|
|
160
|
+
## See also
|
|
161
|
+
|
|
162
|
+
- [Plan §G](#) (LLM helpers section in the master plan)
|
|
163
|
+
- [v4 status](../../docs/V4_STATUS.md)
|
|
164
|
+
- [AGENTS.md](../../AGENTS.md)
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
import type {
|
|
3
|
+
Message as AnthropicMessage,
|
|
4
|
+
Tool as AnthropicTool,
|
|
5
|
+
ToolChoice as AnthropicToolChoice,
|
|
6
|
+
MessageCreateParamsBase,
|
|
7
|
+
MessageCreateParamsNonStreaming,
|
|
8
|
+
MessageCreateParamsStreaming,
|
|
9
|
+
MessageParam,
|
|
10
|
+
RawMessageStreamEvent,
|
|
11
|
+
ToolUseBlock,
|
|
12
|
+
} from "@anthropic-ai/sdk/resources/messages/messages.js";
|
|
13
|
+
import type {
|
|
14
|
+
CompleteOptions,
|
|
15
|
+
CompleteResult,
|
|
16
|
+
Message,
|
|
17
|
+
MessageContentPart,
|
|
18
|
+
StopReason,
|
|
19
|
+
StreamCompleteOptions,
|
|
20
|
+
StreamEvent,
|
|
21
|
+
TokenUsage,
|
|
22
|
+
ToolChoice,
|
|
23
|
+
ToolDefinition,
|
|
24
|
+
} from "../types.js";
|
|
25
|
+
import type { LLMProvider } from "./LLMProvider.js";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Concrete `LLMProvider` implementation backed by `@anthropic-ai/sdk`.
|
|
29
|
+
*
|
|
30
|
+
* Translation surface:
|
|
31
|
+
* - Cross-provider `Message` (text-or-content-parts) → Anthropic
|
|
32
|
+
* `MessageParam[]` (top-level `system` extracted out per API
|
|
33
|
+
* convention).
|
|
34
|
+
* - `ToolDefinition` → Anthropic `Tool` (passes `inputSchema` through
|
|
35
|
+
* as `input_schema` — both are JSON Schema).
|
|
36
|
+
* - Anthropic `Message` response → `CompleteResult` with normalized
|
|
37
|
+
* `StopReason` + `TokenUsage` (cache reads/creation surfaced when
|
|
38
|
+
* present so cost trackers can see them).
|
|
39
|
+
* - Anthropic `RawMessageStreamEvent` → normalized `StreamEvent`
|
|
40
|
+
* stream — buffers tool-use input JSON deltas and emits the parsed
|
|
41
|
+
* object on `content_block_stop` so consumers don't have to
|
|
42
|
+
* re-implement the buffer.
|
|
43
|
+
*
|
|
44
|
+
* Constructor takes either an `apiKey` (the common case — instantiates
|
|
45
|
+
* the SDK internally) or a pre-built `client` (tests inject a stub
|
|
46
|
+
* implementing `client.messages.create(...)`; lets us drive end-to-end
|
|
47
|
+
* translation without monkey-patching the SDK module).
|
|
48
|
+
*
|
|
49
|
+
* Error normalization across providers lands in a later commit (along
|
|
50
|
+
* with `LLMProviderError`); for now SDK errors propagate as-is.
|
|
51
|
+
*
|
|
52
|
+
* Default model: `claude-opus-4-7` (the most capable Claude as of v4
|
|
53
|
+
* launch). Callers override per request via `opts.model`.
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
export interface AnthropicAdapterOptions {
|
|
57
|
+
/** Anthropic API key. Required unless `client` is supplied. */
|
|
58
|
+
apiKey?: string;
|
|
59
|
+
/** Override the default Anthropic API base URL. */
|
|
60
|
+
baseURL?: string;
|
|
61
|
+
/** Forwarded as `defaultHeaders` to the SDK. */
|
|
62
|
+
defaultHeaders?: Record<string, string>;
|
|
63
|
+
/**
|
|
64
|
+
* Pre-built / stubbed SDK client. When supplied, `apiKey` / `baseURL`
|
|
65
|
+
* are ignored — useful for tests and for shared client reuse.
|
|
66
|
+
*/
|
|
67
|
+
client?: AnthropicMessagesClient;
|
|
68
|
+
/** Default `max_tokens` when caller doesn't supply one. Defaults 4096. */
|
|
69
|
+
defaultMaxTokens?: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Structural slice of `Anthropic` we actually call — narrows what tests
|
|
74
|
+
* have to stub. The real `Anthropic` client satisfies this trivially.
|
|
75
|
+
*/
|
|
76
|
+
export interface AnthropicMessagesClient {
|
|
77
|
+
messages: {
|
|
78
|
+
create(
|
|
79
|
+
body: MessageCreateParamsNonStreaming,
|
|
80
|
+
options?: { signal?: AbortSignal },
|
|
81
|
+
): Promise<AnthropicMessage>;
|
|
82
|
+
create(
|
|
83
|
+
body: MessageCreateParamsStreaming,
|
|
84
|
+
options?: { signal?: AbortSignal },
|
|
85
|
+
): Promise<AsyncIterable<RawMessageStreamEvent>>;
|
|
86
|
+
create(
|
|
87
|
+
body: MessageCreateParamsBase,
|
|
88
|
+
options?: { signal?: AbortSignal },
|
|
89
|
+
): Promise<AnthropicMessage | AsyncIterable<RawMessageStreamEvent>>;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const DEFAULT_MAX_TOKENS = 4096;
|
|
94
|
+
const DEFAULT_MODEL = "claude-opus-4-7";
|
|
95
|
+
|
|
96
|
+
export class AnthropicAdapter implements LLMProvider {
|
|
97
|
+
readonly name = "anthropic";
|
|
98
|
+
|
|
99
|
+
private readonly client: AnthropicMessagesClient;
|
|
100
|
+
private readonly defaultMaxTokens: number;
|
|
101
|
+
|
|
102
|
+
constructor(opts: AnthropicAdapterOptions = {}) {
|
|
103
|
+
if (opts.client) {
|
|
104
|
+
this.client = opts.client;
|
|
105
|
+
} else {
|
|
106
|
+
if (!opts.apiKey) {
|
|
107
|
+
throw new Error("AnthropicAdapter requires `apiKey` or a pre-built `client`");
|
|
108
|
+
}
|
|
109
|
+
this.client = new Anthropic({
|
|
110
|
+
apiKey: opts.apiKey,
|
|
111
|
+
baseURL: opts.baseURL,
|
|
112
|
+
defaultHeaders: opts.defaultHeaders,
|
|
113
|
+
}) as unknown as AnthropicMessagesClient;
|
|
114
|
+
}
|
|
115
|
+
this.defaultMaxTokens = opts.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async complete(opts: CompleteOptions): Promise<CompleteResult> {
|
|
119
|
+
const body = this.buildRequestBody(opts, false) as MessageCreateParamsNonStreaming;
|
|
120
|
+
const response = (await this.client.messages.create(body, {
|
|
121
|
+
signal: opts.signal,
|
|
122
|
+
})) as AnthropicMessage;
|
|
123
|
+
return this.translateResponse(response);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async *streamComplete(opts: StreamCompleteOptions): AsyncIterable<StreamEvent> {
|
|
127
|
+
const body = this.buildRequestBody(opts, true) as MessageCreateParamsStreaming;
|
|
128
|
+
const stream = (await this.client.messages.create(body, {
|
|
129
|
+
signal: opts.signal,
|
|
130
|
+
})) as AsyncIterable<RawMessageStreamEvent>;
|
|
131
|
+
|
|
132
|
+
// Indexed buffers: Anthropic identifies content blocks by `index` (a
|
|
133
|
+
// turn-local integer); we map index → adapter-issued ID + buffered
|
|
134
|
+
// input JSON for tool-use blocks.
|
|
135
|
+
const blocks = new Map<
|
|
136
|
+
number,
|
|
137
|
+
{ kind: "text" } | { kind: "tool_use"; id: string; name: string; jsonBuffer: string }
|
|
138
|
+
>();
|
|
139
|
+
let stopReason: StopReason = "unknown";
|
|
140
|
+
let stopSequence: string | undefined;
|
|
141
|
+
let usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };
|
|
142
|
+
|
|
143
|
+
for await (const event of stream) {
|
|
144
|
+
switch (event.type) {
|
|
145
|
+
case "message_start": {
|
|
146
|
+
const msg = event.message;
|
|
147
|
+
usage = translateUsage(msg.usage);
|
|
148
|
+
yield { type: "start", id: msg.id, model: msg.model };
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case "content_block_start": {
|
|
152
|
+
const block = event.content_block;
|
|
153
|
+
if (block.type === "text") {
|
|
154
|
+
blocks.set(event.index, { kind: "text" });
|
|
155
|
+
} else if (block.type === "tool_use") {
|
|
156
|
+
blocks.set(event.index, {
|
|
157
|
+
kind: "tool_use",
|
|
158
|
+
id: block.id,
|
|
159
|
+
name: block.name,
|
|
160
|
+
jsonBuffer: "",
|
|
161
|
+
});
|
|
162
|
+
yield { type: "tool_use_start", id: block.id, name: block.name };
|
|
163
|
+
}
|
|
164
|
+
// Other block kinds (thinking, server_tool_use, …) are not yet
|
|
165
|
+
// surfaced through the cross-provider stream — adapters can
|
|
166
|
+
// expand the StreamEvent union in a later commit.
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case "content_block_delta": {
|
|
170
|
+
const block = blocks.get(event.index);
|
|
171
|
+
if (!block) break;
|
|
172
|
+
const delta = event.delta;
|
|
173
|
+
if (delta.type === "text_delta" && block.kind === "text") {
|
|
174
|
+
yield { type: "text_delta", delta: delta.text };
|
|
175
|
+
} else if (delta.type === "input_json_delta" && block.kind === "tool_use") {
|
|
176
|
+
block.jsonBuffer += delta.partial_json;
|
|
177
|
+
yield {
|
|
178
|
+
type: "tool_input_delta",
|
|
179
|
+
id: block.id,
|
|
180
|
+
partialJson: delta.partial_json,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
case "content_block_stop": {
|
|
186
|
+
const block = blocks.get(event.index);
|
|
187
|
+
if (block?.kind === "tool_use") {
|
|
188
|
+
const input = parseToolInput(block.jsonBuffer);
|
|
189
|
+
yield { type: "tool_use_end", id: block.id, input };
|
|
190
|
+
}
|
|
191
|
+
blocks.delete(event.index);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
case "message_delta": {
|
|
195
|
+
if (event.delta.stop_reason) stopReason = translateStopReason(event.delta.stop_reason);
|
|
196
|
+
if (event.delta.stop_sequence) stopSequence = event.delta.stop_sequence;
|
|
197
|
+
// Output tokens accumulate in message_delta's usage.
|
|
198
|
+
if (event.usage) {
|
|
199
|
+
usage = {
|
|
200
|
+
...usage,
|
|
201
|
+
outputTokens: event.usage.output_tokens,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
case "message_stop": {
|
|
207
|
+
yield { type: "stop", stopReason, stopSequence, usage };
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// --- Translation helpers ------------------------------------------------
|
|
215
|
+
|
|
216
|
+
private buildRequestBody(
|
|
217
|
+
opts: CompleteOptions,
|
|
218
|
+
stream: boolean,
|
|
219
|
+
): MessageCreateParamsBase & { stream?: boolean } {
|
|
220
|
+
const body: MessageCreateParamsBase & { stream?: boolean } = {
|
|
221
|
+
model: opts.model || DEFAULT_MODEL,
|
|
222
|
+
messages: opts.messages.map(toAnthropicMessage),
|
|
223
|
+
max_tokens: opts.maxTokens ?? this.defaultMaxTokens,
|
|
224
|
+
};
|
|
225
|
+
if (opts.system) body.system = opts.system;
|
|
226
|
+
if (opts.temperature !== undefined) body.temperature = opts.temperature;
|
|
227
|
+
if (opts.stopSequences?.length) body.stop_sequences = opts.stopSequences;
|
|
228
|
+
if (opts.tools?.length) body.tools = opts.tools.map(toAnthropicTool);
|
|
229
|
+
if (opts.toolChoice) body.tool_choice = toAnthropicToolChoice(opts.toolChoice);
|
|
230
|
+
if (opts.metadata) body.metadata = opts.metadata as { user_id?: string };
|
|
231
|
+
if (opts.providerOptions) Object.assign(body, opts.providerOptions);
|
|
232
|
+
if (stream) body.stream = true;
|
|
233
|
+
return body;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
private translateResponse(response: AnthropicMessage): CompleteResult {
|
|
237
|
+
const content: MessageContentPart[] = [];
|
|
238
|
+
const extraBlocks: unknown[] = [];
|
|
239
|
+
for (const block of response.content) {
|
|
240
|
+
if (block.type === "text") {
|
|
241
|
+
content.push({ type: "text", text: block.text });
|
|
242
|
+
} else if (block.type === "tool_use") {
|
|
243
|
+
content.push({
|
|
244
|
+
type: "tool_use",
|
|
245
|
+
id: block.id,
|
|
246
|
+
name: block.name,
|
|
247
|
+
input: ((block as ToolUseBlock).input ?? {}) as Record<string, unknown>,
|
|
248
|
+
});
|
|
249
|
+
} else {
|
|
250
|
+
// Native blocks not on the cross-provider surface (thinking,
|
|
251
|
+
// redacted_thinking, citations, server_tool_use, …): pass them
|
|
252
|
+
// THROUGH `providerExtras` rather than drop them (AI-R1). The full
|
|
253
|
+
// untranslated response is also on `raw` below.
|
|
254
|
+
extraBlocks.push(block);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const text = content
|
|
258
|
+
.filter((p): p is { type: "text"; text: string } => p.type === "text")
|
|
259
|
+
.map((p) => p.text)
|
|
260
|
+
.join("");
|
|
261
|
+
|
|
262
|
+
const result: CompleteResult = {
|
|
263
|
+
id: response.id,
|
|
264
|
+
model: response.model,
|
|
265
|
+
content,
|
|
266
|
+
text,
|
|
267
|
+
stopReason: translateStopReason(response.stop_reason),
|
|
268
|
+
stopSequence: response.stop_sequence ?? undefined,
|
|
269
|
+
usage: translateUsage(response.usage),
|
|
270
|
+
raw: response,
|
|
271
|
+
};
|
|
272
|
+
if (extraBlocks.length > 0) result.providerExtras = { blocks: extraBlocks };
|
|
273
|
+
return result;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function toAnthropicMessage(msg: Message): MessageParam {
|
|
278
|
+
// Anthropic supports user/assistant roles in the messages array;
|
|
279
|
+
// tool-result messages are encoded as user messages with a
|
|
280
|
+
// `tool_result` content block per Anthropic API convention.
|
|
281
|
+
const role: MessageParam["role"] = msg.role === "assistant" ? "assistant" : "user";
|
|
282
|
+
|
|
283
|
+
if (typeof msg.content === "string") {
|
|
284
|
+
return { role, content: msg.content };
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// biome-ignore lint/suspicious/useIterableCallbackReturn: MessageContentPart is a closed discriminated union and every member returns.
|
|
288
|
+
const blocks = msg.content.map((part) => {
|
|
289
|
+
switch (part.type) {
|
|
290
|
+
case "text":
|
|
291
|
+
return { type: "text", text: part.text } as const;
|
|
292
|
+
case "tool_use":
|
|
293
|
+
return {
|
|
294
|
+
type: "tool_use",
|
|
295
|
+
id: part.id,
|
|
296
|
+
name: part.name,
|
|
297
|
+
input: part.input,
|
|
298
|
+
} as const;
|
|
299
|
+
case "tool_result":
|
|
300
|
+
return {
|
|
301
|
+
type: "tool_result",
|
|
302
|
+
tool_use_id: part.toolUseId,
|
|
303
|
+
content: part.content,
|
|
304
|
+
is_error: part.isError ?? false,
|
|
305
|
+
} as const;
|
|
306
|
+
case "image":
|
|
307
|
+
return {
|
|
308
|
+
type: "image",
|
|
309
|
+
source: {
|
|
310
|
+
type: "base64" as const,
|
|
311
|
+
media_type: part.mediaType,
|
|
312
|
+
data: part.data,
|
|
313
|
+
},
|
|
314
|
+
} as const;
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
return { role, content: blocks } as MessageParam;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function toAnthropicTool(tool: ToolDefinition): AnthropicTool {
|
|
322
|
+
return {
|
|
323
|
+
name: tool.name,
|
|
324
|
+
description: tool.description,
|
|
325
|
+
input_schema: tool.inputSchema as AnthropicTool["input_schema"],
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function toAnthropicToolChoice(choice: ToolChoice): AnthropicToolChoice {
|
|
330
|
+
switch (choice.type) {
|
|
331
|
+
case "auto":
|
|
332
|
+
return { type: "auto" };
|
|
333
|
+
case "any":
|
|
334
|
+
return { type: "any" };
|
|
335
|
+
case "none":
|
|
336
|
+
return { type: "none" };
|
|
337
|
+
case "tool":
|
|
338
|
+
return { type: "tool", name: choice.name };
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function translateStopReason(
|
|
343
|
+
reason: AnthropicMessage["stop_reason"] | string | null | undefined,
|
|
344
|
+
): StopReason {
|
|
345
|
+
switch (reason) {
|
|
346
|
+
case "end_turn":
|
|
347
|
+
case "max_tokens":
|
|
348
|
+
case "stop_sequence":
|
|
349
|
+
case "tool_use":
|
|
350
|
+
return reason;
|
|
351
|
+
case "refusal":
|
|
352
|
+
return "content_filter";
|
|
353
|
+
case "pause_turn":
|
|
354
|
+
// Treat extended-thinking pause as end-of-turn for cross-provider
|
|
355
|
+
// simplicity; consumers needing the distinction should target the
|
|
356
|
+
// Anthropic SDK directly.
|
|
357
|
+
return "end_turn";
|
|
358
|
+
default:
|
|
359
|
+
return "unknown";
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function translateUsage(usage: AnthropicMessage["usage"]): TokenUsage {
|
|
364
|
+
return {
|
|
365
|
+
inputTokens: usage.input_tokens,
|
|
366
|
+
outputTokens: usage.output_tokens,
|
|
367
|
+
cacheReadInputTokens: usage.cache_read_input_tokens ?? undefined,
|
|
368
|
+
cacheCreationInputTokens: usage.cache_creation_input_tokens ?? undefined,
|
|
369
|
+
raw: usage,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function parseToolInput(buffer: string): Record<string, unknown> {
|
|
374
|
+
if (!buffer) return {};
|
|
375
|
+
try {
|
|
376
|
+
return JSON.parse(buffer) as Record<string, unknown>;
|
|
377
|
+
} catch {
|
|
378
|
+
// The Anthropic stream guarantees valid JSON when complete; if we
|
|
379
|
+
// get here the upstream call was canceled mid-stream.
|
|
380
|
+
return { __ship_api_partial: buffer };
|
|
381
|
+
}
|
|
382
|
+
}
|