From acc43f155ec6f754e851eabc007b43b8fe6f6d21 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 16 Sep 2025 14:46:08 +0100 Subject: [PATCH 01/21] chore(tsconfig): move to dist structure --- apps/api/package.json | 3 +- apps/api/tsconfig.json | 3 +- apps/docs/tsconfig.json | 3 +- apps/gateway/package.json | 2 +- apps/gateway/tsconfig.json | 3 +- apps/ui/package.json | 3 +- apps/ui/tsconfig.json | 1 - apps/worker/package.json | 2 +- apps/worker/tsconfig.json | 3 +- package.json | 4 +- packages/cache/tsconfig.json | 3 +- packages/db/tsconfig.json | 3 +- packages/instrumentation/tsconfig.json | 3 +- packages/logger/tsconfig.json | 3 +- packages/models/src/models/alibaba.ts | 2 +- packages/models/src/models/anthropic.ts | 2 +- packages/models/src/models/deepseek.ts | 2 +- packages/models/src/models/google.ts | 2 +- packages/models/src/models/llmgateway.ts | 2 +- packages/models/src/models/meta.ts | 2 +- packages/models/src/models/microsoft.ts | 2 +- packages/models/src/models/mistral.ts | 2 +- packages/models/src/models/moonshot.ts | 2 +- packages/models/src/models/nousresearch.ts | 2 +- packages/models/src/models/openai.ts | 2 +- packages/models/src/models/perplexity.ts | 2 +- packages/models/src/models/routeway.ts | 2 +- packages/models/src/models/xai.ts | 2 +- packages/models/src/models/zai.ts | 2 +- packages/models/tsconfig.json | 3 +- packages/shared/tsconfig.json | 3 +- pnpm-lock.yaml | 228 ++++++++++++++++++--- 32 files changed, 237 insertions(+), 66 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index aeddfc97f3..807ee6d397 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -8,7 +8,7 @@ "dist/" ], "scripts": { - "build": "NODE_OPTIONS=\"--max-old-space-size=8192\" tsc && NODE_OPTIONS=\"--max-old-space-size=8192\" tsup && pnpm run generate", + "build": "tsc && tsup && pnpm run generate", "dev": "nodemon -e ts,json --exec 'tsx src/serve.ts'", "generate": "NODE_OPTIONS=\"--max-old-space-size=4096\" tsx ./src/scripts/generate-openapi.ts", "start": "node --enable-source-maps dist/serve.js" @@ -21,6 +21,7 @@ "@llmgateway/db": "workspace:*", "@llmgateway/instrumentation": "workspace:*", "@llmgateway/logger": "workspace:*", + "@llmgateway/models": "workspace:*", "@llmgateway/shared": "workspace:*", "@opentelemetry/api": "1.9.0", "@opentelemetry/sdk-node": "0.205.0", diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index 361a238583..8897d7dfc2 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -8,8 +8,7 @@ "moduleResolution": "bundler", "jsx": "preserve", "paths": { - "@/*": ["./*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./*"] }, "plugins": [ { diff --git a/apps/gateway/package.json b/apps/gateway/package.json index d9b020198c..0f4e3db1b1 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -9,7 +9,7 @@ "openapi.json" ], "scripts": { - "build": "NODE_OPTIONS=\"--max-old-space-size=8192\" tsc && NODE_OPTIONS=\"--max-old-space-size=8192\" tsup && pnpm run generate", + "build": "tsc && tsup && pnpm run generate", "dev": "nodemon -e ts,json --exec \"tsx src/serve.ts\"", "generate": "NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" tsx ./src/scripts/generate-openapi.ts", "start": "node --enable-source-maps dist/serve.js" diff --git a/apps/gateway/tsconfig.json b/apps/gateway/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/apps/gateway/tsconfig.json +++ b/apps/gateway/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/apps/ui/package.json b/apps/ui/package.json index 2abd3dd4c7..4429a71692 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -8,7 +8,7 @@ ".next" ], "scripts": { - "build": "NODE_OPTIONS=\"--max-old-space-size=8192\" tsc && NODE_OPTIONS=\"--max-old-space-size=8192\" next build", + "build": "tsc && next build", "dev": "next dev --port 3002 --turbopack", "generate": "NODE_OPTIONS=\"--max-old-space-size=4096\" openapi-typescript ../api/openapi.json -o ./src/lib/api/v1.d.ts", "start": "next start" @@ -18,6 +18,7 @@ "@content-collections/next": "0.2.1", "@hey-api/client-fetch": "0.13.1", "@hookform/resolvers": "5.1.1", + "@llmgateway/db": "workspace:*", "@llmgateway/models": "workspace:*", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", diff --git a/apps/ui/tsconfig.json b/apps/ui/tsconfig.json index f773d71798..0afea8afde 100644 --- a/apps/ui/tsconfig.json +++ b/apps/ui/tsconfig.json @@ -21,7 +21,6 @@ ], "paths": { "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"], "content-collections": ["./.content-collections/generated"] } }, diff --git a/apps/worker/package.json b/apps/worker/package.json index d3f1081b28..6f8fbeabcb 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -8,7 +8,7 @@ "dist/" ], "scripts": { - "build": "NODE_OPTIONS=\"--max-old-space-size=8192\" tsc && NODE_OPTIONS=\"--max-old-space-size=8192\" tsup", + "build": "tsc && tsup", "dev": "nodemon -e ts,json --exec \"tsx src/index.ts\"", "start": "node --enable-source-maps dist/index.js" }, diff --git a/apps/worker/tsconfig.json b/apps/worker/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/apps/worker/tsconfig.json +++ b/apps/worker/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/package.json b/package.json index 48b823b94d..277143ea54 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,10 @@ "clean": "find . -path \"./node_modules\" -prune -o \\( -type d -name \"dist\" -o -name \".turbo\" -o -name \".source\" -o -name \".vercel\" -o -name \".out\" -o -name \".vinxi\" -o -name \".next\" \\) -exec rm -rf {} +", "clean:node_modules": "find . -type d -name \"node_modules\" -exec rm -rf {} +", "dev": "turbo run dev", - "format": "NODE_OPTIONS=\"--max-old-space-size=8192\" eslint --fix . && prettier --write .", + "format": "eslint --fix . && prettier --write .", "generate": "turbo run generate", "postinstall": "husky && sync-editorconfig || true", - "lint": "NODE_OPTIONS=\"--max-old-space-size=8192\" eslint . && prettier --check .", + "lint": "eslint . && prettier --check .", "migrate": "pnpm --filter db migrate", "prepare-codex": "mv ~/.nvm ~/.nvm-bak && export PATH=\"${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH\" && . ~/.bashrc && sudo service postgresql start && sudo service redis-server start && sleep 20 && pnpm sync", "push-dev": "pnpm --filter db push", diff --git a/packages/cache/tsconfig.json b/packages/cache/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/packages/cache/tsconfig.json +++ b/packages/cache/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/packages/db/tsconfig.json +++ b/packages/db/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/packages/instrumentation/tsconfig.json b/packages/instrumentation/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/packages/instrumentation/tsconfig.json +++ b/packages/instrumentation/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/packages/models/src/models/alibaba.ts b/packages/models/src/models/alibaba.ts index 48e4b249da..fc40ddfc49 100644 --- a/packages/models/src/models/alibaba.ts +++ b/packages/models/src/models/alibaba.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const alibabaModels = [ { diff --git a/packages/models/src/models/anthropic.ts b/packages/models/src/models/anthropic.ts index 9bf7476d01..c0bf8dd11f 100644 --- a/packages/models/src/models/anthropic.ts +++ b/packages/models/src/models/anthropic.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const anthropicModels = [ { diff --git a/packages/models/src/models/deepseek.ts b/packages/models/src/models/deepseek.ts index ed97a4df4d..9ec810129a 100644 --- a/packages/models/src/models/deepseek.ts +++ b/packages/models/src/models/deepseek.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const deepseekModels = [ { diff --git a/packages/models/src/models/google.ts b/packages/models/src/models/google.ts index 713522aed6..aadcacdd46 100644 --- a/packages/models/src/models/google.ts +++ b/packages/models/src/models/google.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const googleModels = [ { diff --git a/packages/models/src/models/llmgateway.ts b/packages/models/src/models/llmgateway.ts index 03ef903918..a123ed10d3 100644 --- a/packages/models/src/models/llmgateway.ts +++ b/packages/models/src/models/llmgateway.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const llmgatewayModels = [ { diff --git a/packages/models/src/models/meta.ts b/packages/models/src/models/meta.ts index 543db4dc7c..0fb08c5b26 100644 --- a/packages/models/src/models/meta.ts +++ b/packages/models/src/models/meta.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const metaModels = [ { diff --git a/packages/models/src/models/microsoft.ts b/packages/models/src/models/microsoft.ts index 6406898efb..0dabc6fa73 100644 --- a/packages/models/src/models/microsoft.ts +++ b/packages/models/src/models/microsoft.ts @@ -1,3 +1,3 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const microsoftModels = [] as const satisfies ModelDefinition[]; diff --git a/packages/models/src/models/mistral.ts b/packages/models/src/models/mistral.ts index 6987f46e51..e814adb87f 100644 --- a/packages/models/src/models/mistral.ts +++ b/packages/models/src/models/mistral.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const mistralModels = [ { diff --git a/packages/models/src/models/moonshot.ts b/packages/models/src/models/moonshot.ts index ea4c479259..9e67d02ffe 100644 --- a/packages/models/src/models/moonshot.ts +++ b/packages/models/src/models/moonshot.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const moonshotModels = [ { diff --git a/packages/models/src/models/nousresearch.ts b/packages/models/src/models/nousresearch.ts index 4d390d3153..4ad30a3bb4 100644 --- a/packages/models/src/models/nousresearch.ts +++ b/packages/models/src/models/nousresearch.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const nousresearchModels = [ { diff --git a/packages/models/src/models/openai.ts b/packages/models/src/models/openai.ts index 9b528ed443..82d9465b0b 100644 --- a/packages/models/src/models/openai.ts +++ b/packages/models/src/models/openai.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const openaiModels = [ { diff --git a/packages/models/src/models/perplexity.ts b/packages/models/src/models/perplexity.ts index 2617a303cc..03d459431c 100644 --- a/packages/models/src/models/perplexity.ts +++ b/packages/models/src/models/perplexity.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const perplexityModels = [ { diff --git a/packages/models/src/models/routeway.ts b/packages/models/src/models/routeway.ts index 311936f202..c50614728f 100644 --- a/packages/models/src/models/routeway.ts +++ b/packages/models/src/models/routeway.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const routewayModels = [ { diff --git a/packages/models/src/models/xai.ts b/packages/models/src/models/xai.ts index c8a6e49253..cdef75f3f4 100644 --- a/packages/models/src/models/xai.ts +++ b/packages/models/src/models/xai.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const xaiModels = [ { diff --git a/packages/models/src/models/zai.ts b/packages/models/src/models/zai.ts index 08d72198ba..6825ee4676 100644 --- a/packages/models/src/models/zai.ts +++ b/packages/models/src/models/zai.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@llmgateway/models"; +import type { ModelDefinition } from "@/models"; export const zaiModels = [ { diff --git a/packages/models/tsconfig.json b/packages/models/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/packages/models/tsconfig.json +++ b/packages/models/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 936b91cd67..6b9eda0408 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "@llmgateway/*": ["../../packages/*/src"] + "@/*": ["./src/*"] } }, "include": ["./src/**/*.ts"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb8e3db7c3..8b378844fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,6 +114,9 @@ importers: '@llmgateway/logger': specifier: workspace:* version: link:../../packages/logger + '@llmgateway/models': + specifier: workspace:* + version: link:../../packages/models '@llmgateway/shared': specifier: workspace:* version: link:../../packages/shared @@ -186,7 +189,7 @@ importers: version: 15.6.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.12) gateway: specifier: workspace:* - version: link:../gateway + version: file:apps/gateway(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3) lucide-react: specifier: ^0.539.0 version: 0.539.0(react@19.1.1) @@ -311,6 +314,9 @@ importers: '@hookform/resolvers': specifier: 5.1.1 version: 5.1.1(react-hook-form@7.60.0(react@19.1.1)) + '@llmgateway/db': + specifier: workspace:* + version: link:../../packages/db '@llmgateway/models': specifier: workspace:* version: link:../../packages/models @@ -2132,6 +2138,21 @@ packages: '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} + '@llmgateway/cache@file:packages/cache': + resolution: {directory: packages/cache, type: directory} + + '@llmgateway/db@file:packages/db': + resolution: {directory: packages/db, type: directory} + + '@llmgateway/instrumentation@file:packages/instrumentation': + resolution: {directory: packages/instrumentation, type: directory} + + '@llmgateway/logger@file:packages/logger': + resolution: {directory: packages/logger, type: directory} + + '@llmgateway/models@file:packages/models': + resolution: {directory: packages/models, type: directory} + '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} @@ -5908,6 +5929,9 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gateway@file:apps/gateway: + resolution: {directory: apps/gateway, type: directory} + gaxios@6.7.1: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} @@ -9722,7 +9746,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9736,7 +9760,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -10028,6 +10052,105 @@ snapshots: '@levischuck/tiny-cbor@0.2.11': {} + '@llmgateway/cache@file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': + dependencies: + '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/logger': file:packages/logger + ioredis: 5.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - sql.js + - sqlite3 + - supports-color + + '@llmgateway/db@file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': + dependencies: + '@llmgateway/logger': file:packages/logger + drizzle-orm: 1.0.0-beta.1-7946562(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(pg@8.16.3) + nanoid: 5.1.5 + pg: 8.16.3 + zod: 3.25.75 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - sql.js + - sqlite3 + + '@llmgateway/instrumentation@file:packages/instrumentation': + dependencies: + '@google-cloud/opentelemetry-cloud-trace-exporter': 3.0.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)) + '@google-cloud/opentelemetry-cloud-trace-propagator': 0.21.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) + '@llmgateway/logger': file:packages/logger + '@opentelemetry/api': 1.9.0 + '@opentelemetry/auto-instrumentations-node': 0.64.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + hono: 4.9.7 + transitivePeerDependencies: + - encoding + - supports-color + + '@llmgateway/logger@file:packages/logger': + dependencies: + '@opentelemetry/api': 1.9.0 + pino: 9.9.0 + pino-pretty: 13.1.1 + + '@llmgateway/models@file:packages/models': + dependencies: + '@llmgateway/logger': file:packages/logger + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: '@types/estree': 1.0.8 @@ -12600,7 +12723,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -12610,7 +12733,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12629,7 +12752,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 @@ -12644,7 +12767,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13321,10 +13444,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1: - dependencies: - ms: 2.1.3 - debug@4.4.1(supports-color@10.0.0): dependencies: ms: 2.1.3 @@ -13585,7 +13704,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.19.12): dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.19.12 transitivePeerDependencies: - supports-color @@ -13787,7 +13906,7 @@ snapshots: eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)): dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 @@ -13907,7 +14026,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -14335,6 +14454,67 @@ snapshots: functions-have-names@1.2.3: {} + gateway@file:apps/gateway(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3): + dependencies: + '@hono/node-server': 1.19.0(hono@4.9.7) + '@hono/swagger-ui': 0.5.1(hono@4.9.7) + '@hono/zod-openapi': 0.19.8(hono@4.9.7)(zod@3.25.75) + '@hono/zod-validator': 0.7.2(hono@4.9.7)(zod@3.25.75) + '@llmgateway/cache': file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/instrumentation': file:packages/instrumentation + '@llmgateway/logger': file:packages/logger + '@llmgateway/models': file:packages/models + '@opentelemetry/api': 1.9.0 + '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) + gpt-tokenizer: 3.0.1 + hono: 4.9.7 + hono-openapi: 0.4.8(@hono/zod-validator@0.7.2(hono@4.9.7)(zod@3.25.75))(hono@4.9.7)(openapi-types@12.1.3)(zod-openapi@4.2.4(zod@3.25.75))(zod@3.25.75) + ioredis: 5.6.1 + redis: 5.8.2 + zod: 3.25.75 + zod-openapi: 4.2.4(zod@3.25.75) + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@hono/arktype-validator' + - '@hono/effect-validator' + - '@hono/typebox-validator' + - '@hono/valibot-validator' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@planetscale/database' + - '@prisma/client' + - '@sinclair/typebox' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@valibot/to-json-schema' + - '@vercel/postgres' + - '@xata.io/client' + - arktype + - better-sqlite3 + - bun-types + - effect + - encoding + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - openapi-types + - pg-native + - postgres + - prisma + - sql.js + - sqlite3 + - supports-color + - valibot + gaxios@6.7.1: dependencies: extend: 3.0.2 @@ -14358,7 +14538,7 @@ snapshots: gel@2.1.0: dependencies: '@petamoriken/float16': 3.9.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) env-paths: 3.0.0 semver: 7.7.2 shell-quote: 1.8.3 @@ -14621,7 +14801,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14676,7 +14856,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -14690,7 +14870,7 @@ snapshots: dependencies: '@ioredis/commands': 1.3.1 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -15016,7 +15196,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 @@ -15537,7 +15717,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16367,7 +16547,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -16967,7 +17147,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.25.9 joycon: 3.1.1 picocolors: 1.1.1 @@ -17211,7 +17391,7 @@ snapshots: vite-node@3.2.3(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.3.6(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1) @@ -17285,7 +17465,7 @@ snapshots: '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 chai: 5.2.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 From 6bea432c1831ac00950c45ac8915da8d6e0ccf58 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 16 Sep 2025 16:29:45 +0100 Subject: [PATCH 02/21] ci(workflow): update commands to include `pnpm build` Ensure all steps build the project before running additional commands such as linting, generating files, and unit tests. --- .github/workflows/ci.yml | 6 +++--- .github/workflows/e2e.yml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7fb2cdd2ee..1d1197ff29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,13 +12,13 @@ jobs: uses: ./.github/workflows/run.yml secrets: inherit with: - cmd: pnpm lint + cmd: pnpm build && pnpm lint generate: uses: ./.github/workflows/run.yml secrets: inherit with: - cmd: pnpm generate && git diff --exit-code + cmd: pnpm build && pnpm generate && git diff --exit-code build: uses: ./.github/workflows/run.yml @@ -30,4 +30,4 @@ jobs: uses: ./.github/workflows/run.yml secrets: inherit with: - cmd: pnpm run setup && pnpm test:unit + cmd: pnpm run setup pnpm build && && pnpm test:unit diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 026e863c61..c824709d2b 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -46,6 +46,7 @@ jobs: - name: Setup and run e2e shard ${{ matrix.shard }} run: | set -eux + pnpm build pnpm run setup export DATABASE_URL=postgres://postgres:pw@localhost:5432/test E2E_TEST=true pnpm vitest run -c vitest/vitest.e2e.config.mts --no-file-parallelism --shard=${{ matrix.shard }}/5 --reporter=blob --outputFile=e2e-results-${{ matrix.shard }}.blob || true From 459d6505842cff85a9f065a39383952772907359 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 16 Sep 2025 17:20:27 +0100 Subject: [PATCH 03/21] ci(workflow): reorder setup and build commands Ensure `pnpm build` runs before `pnpm run setup` for correct workflow execution. --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d1197ff29..f8a1a48777 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,10 +24,10 @@ jobs: uses: ./.github/workflows/run.yml secrets: inherit with: - cmd: pnpm run setup && pnpm build && bash .github/start.sh + cmd: pnpm build && pnpm run setup && bash .github/start.sh test: uses: ./.github/workflows/run.yml secrets: inherit with: - cmd: pnpm run setup pnpm build && && pnpm test:unit + cmd: pnpm build && pnpm run setup && pnpm test:unit From 595ffe005f6c5ea60bcdc1791754fe918813f897 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 16 Sep 2025 23:02:27 +0100 Subject: [PATCH 04/21] chore(dev-scripts): update dev commands to use tsup output Updated `dev` scripts in multiple packages to ensure compilation with `tsup` before running `nodemon`. Added new `watch` command in the `models` package for better development workflow. --- apps/api/package.json | 2 +- apps/gateway/package.json | 2 +- apps/worker/package.json | 2 +- packages/models/package.json | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 807ee6d397..69c27566d5 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -9,7 +9,7 @@ ], "scripts": { "build": "tsc && tsup && pnpm run generate", - "dev": "nodemon -e ts,json --exec 'tsx src/serve.ts'", + "dev": "tsup && nodemon dist/serve.js", "generate": "NODE_OPTIONS=\"--max-old-space-size=4096\" tsx ./src/scripts/generate-openapi.ts", "start": "node --enable-source-maps dist/serve.js" }, diff --git a/apps/gateway/package.json b/apps/gateway/package.json index 0f4e3db1b1..75438862f6 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -10,7 +10,7 @@ ], "scripts": { "build": "tsc && tsup && pnpm run generate", - "dev": "nodemon -e ts,json --exec \"tsx src/serve.ts\"", + "dev": "tsup && nodemon dist/serve.js", "generate": "NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" tsx ./src/scripts/generate-openapi.ts", "start": "node --enable-source-maps dist/serve.js" }, diff --git a/apps/worker/package.json b/apps/worker/package.json index 6f8fbeabcb..0b8b04fb47 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -9,7 +9,7 @@ ], "scripts": { "build": "tsc && tsup", - "dev": "nodemon -e ts,json --exec \"tsx src/index.ts\"", + "dev": "tsup && nodemon dist/index.js", "start": "node --enable-source-maps dist/index.js" }, "dependencies": { diff --git a/packages/models/package.json b/packages/models/package.json index 90f62a1b4c..94e7abd72e 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -18,7 +18,8 @@ "dist/" ], "scripts": { - "build": "tsc && tsup" + "build": "tsc && tsup", + "dev": "tsup --watch" }, "dependencies": { "@llmgateway/logger": "workspace:*" From ef711e621464acfb91601ac7ab536e54951a08f5 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 16 Sep 2025 23:32:32 +0100 Subject: [PATCH 05/21] refactor(blog): reuse allBlogs without dynamic import Removed redundant dynamic imports of `allBlogs` in blog pages to simplify code and improve readability. --- apps/ui/src/app/blog/category/[category]/page.tsx | 4 ++-- apps/ui/src/app/blog/page.tsx | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/ui/src/app/blog/category/[category]/page.tsx b/apps/ui/src/app/blog/category/[category]/page.tsx index e2ef7549b3..3bb138f4aa 100644 --- a/apps/ui/src/app/blog/category/[category]/page.tsx +++ b/apps/ui/src/app/blog/category/[category]/page.tsx @@ -1,6 +1,8 @@ import { BlogList } from "@/components/blog/list"; import { HeroRSC } from "@/components/landing/hero-rsc"; +import { allBlogs } from "content-collections"; + interface BlogItem { id: string; slug: string; @@ -24,7 +26,6 @@ interface CategoryPageProps { export default async function BlogCategoryPage({ params }: CategoryPageProps) { const { category } = await params; const slug = decodeURIComponent(category); - const { allBlogs } = (await import("content-collections")) as any; const filtered = (allBlogs as any[]) .filter((entry: any) => !entry?.draft) @@ -50,7 +51,6 @@ export default async function BlogCategoryPage({ params }: CategoryPageProps) { } export async function generateStaticParams() { - const { allBlogs } = (await import("content-collections")) as any; const slugs = new Set(); for (const post of allBlogs as any[]) { (post.categories || []).forEach((c: string) => slugs.add(slugify(c))); diff --git a/apps/ui/src/app/blog/page.tsx b/apps/ui/src/app/blog/page.tsx index 38f4de9319..542b47ca9e 100644 --- a/apps/ui/src/app/blog/page.tsx +++ b/apps/ui/src/app/blog/page.tsx @@ -1,6 +1,8 @@ import { BlogList } from "@/components/blog/list"; import { HeroRSC } from "@/components/landing/hero-rsc"; +import { allBlogs } from "content-collections"; + interface BlogItem { id: string; slug: string; @@ -10,9 +12,7 @@ interface BlogItem { } export default async function BlogPage() { - const { allBlogs } = (await import("content-collections")) as any; - - const sortedEntries = (allBlogs as any[]) + const sortedEntries = allBlogs .sort( (a: any, b: any) => new Date(b.date).getTime() - new Date(a.date).getTime(), From c0d5839851a0e9f20bd304926dc2b41ab040e708 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 16 Sep 2025 23:42:17 +0100 Subject: [PATCH 06/21] chore(build): standardize tsconfig and remove tsup usage Revised TypeScript configurations across packages by adding `outDir` and updating `module/moduleResolution`. Replaced `tsup` with `tsc` in build scripts for consistency. --- apps/api/package.json | 6 +++--- apps/api/tsconfig.json | 1 + apps/docs/package.json | 3 ++- apps/gateway/package.json | 6 +++--- apps/gateway/tsconfig.json | 2 ++ apps/worker/package.json | 4 ++-- apps/worker/tsconfig.json | 1 + packages/cache/package.json | 6 ++---- packages/cache/tsconfig.json | 1 + packages/db/package.json | 6 ++---- packages/db/tsconfig.json | 1 + packages/instrumentation/package.json | 6 ++---- packages/instrumentation/tsconfig.json | 1 + packages/logger/package.json | 6 ++---- packages/logger/tsconfig.json | 1 + packages/models/package.json | 7 ++----- packages/models/tsconfig.json | 1 + packages/shared/package.json | 6 ++---- packages/shared/src/index.ts | 2 +- packages/shared/tsconfig.json | 1 + tsconfig.json | 11 +++++------ 21 files changed, 38 insertions(+), 41 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 69c27566d5..caab069322 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -8,9 +8,9 @@ "dist/" ], "scripts": { - "build": "tsc && tsup && pnpm run generate", - "dev": "tsup && nodemon dist/serve.js", - "generate": "NODE_OPTIONS=\"--max-old-space-size=4096\" tsx ./src/scripts/generate-openapi.ts", + "build": "tsc && pnpm run generate", + "dev": "tsc && nodemon dist/serve.js", + "generate": "node ./dist/scripts/generate-openapi.js", "start": "node --enable-source-maps dist/serve.js" }, "dependencies": { diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/apps/docs/package.json b/apps/docs/package.json index 1191427dae..dbd0e3dc69 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -10,7 +10,8 @@ "openapi.json" ], "scripts": { - "build": "fumadocs-mdx && tsc && next build && cp ../gateway/openapi.json .", + "build": "fumadocs-mdx && next build && cp ../gateway/openapi.json .", + "build2": "fumadocs-mdx && tsc && next build && cp ../gateway/openapi.json .", "dev": "next dev --turbo --port 3005", "gen-docs": "node scripts/generate-docs.mjs", "generate": "pnpm gen-docs", diff --git a/apps/gateway/package.json b/apps/gateway/package.json index 75438862f6..d0237ab82c 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -9,9 +9,9 @@ "openapi.json" ], "scripts": { - "build": "tsc && tsup && pnpm run generate", - "dev": "tsup && nodemon dist/serve.js", - "generate": "NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" tsx ./src/scripts/generate-openapi.ts", + "build": "tsc && pnpm run generate", + "dev": "tsc && nodemon dist/serve.js", + "generate": "node ./dist/scripts/generate-openapi.js", "start": "node --enable-source-maps dist/serve.js" }, "dependencies": { diff --git a/apps/gateway/tsconfig.json b/apps/gateway/tsconfig.json index 6b9eda0408..f885cce2f2 100644 --- a/apps/gateway/tsconfig.json +++ b/apps/gateway/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/apps/worker/package.json b/apps/worker/package.json index 0b8b04fb47..6e036a77f3 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -8,8 +8,8 @@ "dist/" ], "scripts": { - "build": "tsc && tsup", - "dev": "tsup && nodemon dist/index.js", + "build": "tsc", + "dev": "tsc && nodemon dist/index.js", "start": "node --enable-source-maps dist/index.js" }, "dependencies": { diff --git a/apps/worker/tsconfig.json b/apps/worker/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/apps/worker/tsconfig.json +++ b/apps/worker/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/packages/cache/package.json b/packages/cache/package.json index 26cb415e7a..2b5b47c25e 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -7,15 +7,13 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "import": "./dist/index.js" } }, - "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc && tsup" + "build": "tsc" }, "dependencies": { "@llmgateway/db": "workspace:*", diff --git a/packages/cache/tsconfig.json b/packages/cache/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/packages/cache/tsconfig.json +++ b/packages/cache/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/packages/db/package.json b/packages/db/package.json index 68e7aa7461..55820e9afe 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -7,18 +7,16 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "import": "./dist/index.js" } }, - "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "files": [ "dist/" ], "scripts": { - "build": "tsc && tsup", + "build": "tsc", "generate": "pnpm drizzle-kit generate --config drizzle.config.ts", "migrate": "pnpm drizzle-kit migrate --config drizzle.config.ts", "push": "pnpm drizzle-kit push --force --config drizzle.config.ts", diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/packages/db/tsconfig.json +++ b/packages/db/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/packages/instrumentation/package.json b/packages/instrumentation/package.json index ebe7c41547..74629e6220 100644 --- a/packages/instrumentation/package.json +++ b/packages/instrumentation/package.json @@ -7,15 +7,13 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "import": "./dist/index.js" } }, - "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc && tsup" + "build": "tsc" }, "dependencies": { "@google-cloud/opentelemetry-cloud-trace-exporter": "3.0.0", diff --git a/packages/instrumentation/tsconfig.json b/packages/instrumentation/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/packages/instrumentation/tsconfig.json +++ b/packages/instrumentation/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/packages/logger/package.json b/packages/logger/package.json index d61a3de67d..3b4104bd5e 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -7,15 +7,13 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "import": "./dist/index.js" } }, - "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc && tsup" + "build": "tsc" }, "dependencies": { "@opentelemetry/api": "1.9.0", diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/packages/models/package.json b/packages/models/package.json index 94e7abd72e..acaf6e24d4 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -7,19 +7,16 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "import": "./dist/index.js" } }, - "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "files": [ "dist/" ], "scripts": { - "build": "tsc && tsup", - "dev": "tsup --watch" + "build": "tsc" }, "dependencies": { "@llmgateway/logger": "workspace:*" diff --git a/packages/models/tsconfig.json b/packages/models/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/packages/models/tsconfig.json +++ b/packages/models/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/packages/shared/package.json b/packages/shared/package.json index 224d4c80f1..d0f6a56529 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -7,18 +7,16 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "import": "./dist/index.js" } }, - "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "files": [ "dist/" ], "scripts": { - "build": "tsc && tsup" + "build": "tsc" }, "dependencies": { "zod": "3.25.75" diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index c665372b77..90f91c7d41 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -2,4 +2,4 @@ export { calculateFees, type FeeBreakdown, type FeeCalculationInput, -} from "./fees"; +} from "./fees.js"; diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 6b9eda0408..25cd3c488d 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "outDir": "./dist/", "paths": { "@/*": ["./src/*"] } diff --git a/tsconfig.json b/tsconfig.json index 7807bc33dc..7ff1ada849 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,10 @@ { "compilerOptions": { - "outDir": "./dist/", "noImplicitAny": true, - "moduleResolution": "bundler", - "module": "esnext", - "verbatimModuleSyntax": true, "target": "es2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, "removeComments": true, "skipLibCheck": true, "strict": true, @@ -15,10 +14,10 @@ "strictPropertyInitialization": true, "noImplicitThis": true, "alwaysStrict": true, - "esModuleInterop": true, "sourceMap": true, "noFallthroughCasesInSwitch": true, "forceConsistentCasingInFileNames": true, - "noImplicitReturns": true + "noImplicitReturns": true, + "declaration": true } } From 0b4e7f7d5c3b5476c03d95a2895451d1463c7781 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 00:44:01 +0100 Subject: [PATCH 07/21] chore(imports): update to use explicit file extensions Updated import statements across the project to include `.js` extensions for better compatibility with ES module resolution. Adjusted related TypeScript configurations and lockfile changes. --- apps/api/package.json | 4 +- apps/api/src/api.spec.ts | 2 +- apps/api/src/auth/config.spec.ts | 2 +- apps/api/src/auth/config.ts | 2 +- apps/api/src/auth/handler.ts | 4 +- apps/api/src/index.ts | 16 +- apps/api/src/lib/maskToken.spec.ts | 2 +- apps/api/src/routes/activity.spec.ts | 5 +- apps/api/src/routes/activity.ts | 2 +- apps/api/src/routes/beacon.spec.ts | 5 +- apps/api/src/routes/beacon.ts | 4 +- apps/api/src/routes/chat.ts | 2 +- apps/api/src/routes/chats.ts | 4 +- apps/api/src/routes/index.ts | 30 +- apps/api/src/routes/keys-api.spec.ts | 5 +- apps/api/src/routes/keys-api.ts | 4 +- apps/api/src/routes/keys-provider.e2e.ts | 13 +- apps/api/src/routes/keys-provider.spec.ts | 5 +- apps/api/src/routes/keys-provider.ts | 4 +- apps/api/src/routes/logs.spec.ts | 5 +- apps/api/src/routes/logs.ts | 2 +- apps/api/src/routes/organization.ts | 2 +- apps/api/src/routes/payments.ts | 4 +- apps/api/src/routes/projects.ts | 2 +- apps/api/src/routes/subscriptions.ts | 6 +- apps/api/src/routes/user.ts | 4 +- apps/api/src/scripts/generate-openapi.ts | 4 +- apps/api/src/serve.ts | 6 +- apps/api/src/stripe.ts | 6 +- apps/api/src/testing.ts | 6 +- apps/api/src/vars.ts | 2 +- apps/api/tsconfig.json | 1 + apps/api/tsup.config.ts | 2 +- apps/docs/tsconfig.json | 4 +- apps/gateway/package.json | 10 +- apps/gateway/src/anthropic/anthropic.ts | 2 +- apps/gateway/src/anthropic/index.ts | 4 +- apps/gateway/src/api-individual.e2e.ts | 6 +- apps/gateway/src/api.spec.ts | 6 +- apps/gateway/src/{index.ts => app.ts} | 10 +- apps/gateway/src/chat-basic.e2e.ts | 4 +- apps/gateway/src/chat-full.e2e.ts | 8 +- apps/gateway/src/chat-helpers.e2e.ts | 19 +- apps/gateway/src/chat-json.e2e.ts | 6 +- apps/gateway/src/chat-reasoning.e2e.ts | 4 +- apps/gateway/src/chat-rs.e2e.ts | 6 +- apps/gateway/src/chat-streaming.e2e.ts | 6 +- apps/gateway/src/chat-toolcalls-result.e2e.ts | 4 +- apps/gateway/src/chat-toolcalls.e2e.ts | 4 +- apps/gateway/src/chat/chat.ts | 40 +-- apps/gateway/src/chat/index.ts | 4 +- .../src/chat/tools/calculate-prompt-tokens.ts | 2 +- .../gateway/src/chat/tools/estimate-tokens.ts | 2 +- apps/gateway/src/chat/tools/extract-images.ts | 2 +- .../src/chat/tools/extract-token-usage.ts | 2 +- .../src/chat/tools/parse-provider-response.ts | 4 +- .../tools/transform-response-to-openai.ts | 2 +- .../tools/transform-streaming-to-openai.ts | 8 +- .../chat/tools/validate-free-model-usage.ts | 6 +- apps/gateway/src/lib/costs.spec.ts | 2 +- apps/gateway/src/lib/logs.spec.ts | 2 +- apps/gateway/src/lib/prompt-tokens.spec.ts | 6 +- apps/gateway/src/lib/rate-limit.spec.ts | 2 +- apps/gateway/src/models/models.spec.ts | 2 +- apps/gateway/src/models/models.ts | 2 +- .../gateway/src/models/{index.ts => route.ts} | 4 +- apps/gateway/src/scripts/generate-openapi.ts | 4 +- apps/gateway/src/serve.ts | 2 +- apps/gateway/src/test-utils/test-helpers.ts | 36 +-- apps/ui/package.json | 2 +- apps/ui/tsconfig.json | 1 + apps/worker/package.json | 12 +- apps/worker/src/index.ts | 4 +- apps/worker/src/log-processing.spec.ts | 2 +- .../src/services/stats-calculator.spec.ts | 2 +- apps/worker/src/services/sync-models.spec.ts | 2 +- apps/worker/src/worker.spec.ts | 2 +- apps/worker/src/worker.ts | 4 +- apps/worker/tsconfig.json | 1 + apps/worker/tsup.config.ts | 2 +- eslint.config.mjs | 2 +- package.json | 5 +- packages/cache/package.json | 2 +- packages/cache/src/cache.ts | 2 +- packages/cache/src/index.ts | 5 +- packages/cache/src/redis.ts | 6 +- packages/cache/tsconfig.json | 1 + packages/cache/tsup.config.ts | 2 +- packages/db/logs.ts | 2 +- packages/db/package.json | 2 +- packages/db/seed.ts | 4 +- packages/db/src/db.ts | 2 +- packages/db/src/index.ts | 10 +- packages/db/src/relations.ts | 2 +- packages/db/src/schema.ts | 2 +- packages/db/src/types.ts | 2 +- packages/db/tsconfig.json | 1 + packages/db/tsup.config.ts | 2 +- packages/instrumentation/package.json | 2 +- packages/instrumentation/src/index.spec.ts | 2 +- packages/instrumentation/tsconfig.json | 1 + packages/instrumentation/tsup.config.ts | 2 +- packages/logger/package.json | 2 +- packages/logger/src/logger.spec.ts | 2 +- packages/logger/tsconfig.json | 1 + packages/logger/tsup.config.ts | 2 +- packages/models/package.json | 2 +- .../get-cheapest-from-available-providers.ts | 2 +- .../src/get-cheapest-model-for-provider.ts | 4 +- packages/models/src/get-provider-endpoint.ts | 4 +- packages/models/src/get-provider-headers.ts | 2 +- packages/models/src/helpers.ts | 4 +- packages/models/src/index.ts | 31 ++- packages/models/src/models.spec.ts | 8 +- packages/models/src/models.ts | 32 +-- packages/models/src/models/alibaba.ts | 2 +- packages/models/src/models/anthropic.ts | 2 +- packages/models/src/models/deepseek.ts | 2 +- packages/models/src/models/google.ts | 2 +- packages/models/src/models/llmgateway.ts | 2 +- packages/models/src/models/meta.ts | 2 +- packages/models/src/models/microsoft.ts | 2 +- packages/models/src/models/mistral.ts | 2 +- packages/models/src/models/moonshot.ts | 2 +- packages/models/src/models/nousresearch.ts | 2 +- packages/models/src/models/openai.ts | 2 +- packages/models/src/models/perplexity.ts | 2 +- packages/models/src/models/routeway.ts | 2 +- packages/models/src/models/xai.ts | 2 +- packages/models/src/models/zai.ts | 2 +- packages/models/src/prepare-request-body.ts | 10 +- packages/models/src/provider.ts | 2 +- packages/models/src/testing.ts | 32 +++ .../src/transform-anthropic-messages.ts | 4 +- .../models/src/transform-google-messages.ts | 4 +- packages/models/src/type-guards.ts | 2 +- packages/models/src/types.ts | 2 +- packages/models/src/validate-provider-key.ts | 16 +- packages/models/tsconfig.json | 1 + packages/models/tsup.config.ts | 2 +- packages/shared/package.json | 2 +- packages/shared/tsconfig.json | 1 + packages/shared/tsup.config.ts | 2 +- pnpm-lock.yaml | 259 +++++------------- 144 files changed, 420 insertions(+), 544 deletions(-) rename apps/gateway/src/{index.ts => app.ts} (94%) rename apps/gateway/src/models/{index.ts => route.ts} (61%) create mode 100644 packages/models/src/testing.ts diff --git a/apps/api/package.json b/apps/api/package.json index caab069322..bb75c7acb6 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -8,8 +8,8 @@ "dist/" ], "scripts": { - "build": "tsc && pnpm run generate", - "dev": "tsc && nodemon dist/serve.js", + "build": "tsc && resolve-tspaths && pnpm run generate", + "dev": "tsc && resolve-tspaths && nodemon dist/serve.js", "generate": "node ./dist/scripts/generate-openapi.js", "start": "node --enable-source-maps dist/serve.js" }, diff --git a/apps/api/src/api.spec.ts b/apps/api/src/api.spec.ts index 0a63907f77..a15eb5b9b3 100644 --- a/apps/api/src/api.spec.ts +++ b/apps/api/src/api.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from "vitest"; -import { app } from "."; +import { app } from "./index.js"; test("/", async () => { const res = await app.request("/"); diff --git a/apps/api/src/auth/config.spec.ts b/apps/api/src/auth/config.spec.ts index 7ad1eeaf54..00312157ff 100644 --- a/apps/api/src/auth/config.spec.ts +++ b/apps/api/src/auth/config.spec.ts @@ -2,7 +2,7 @@ import { afterEach, beforeEach, describe, expect, test } from "vitest"; import { db, tables } from "@llmgateway/db"; -import { apiAuth, redisClient } from "./config"; +import { apiAuth, redisClient } from "./config.js"; describe("API auth configuration", () => { test("should inherit basic auth configuration", () => { diff --git a/apps/api/src/auth/config.ts b/apps/api/src/auth/config.ts index 49ee9142bf..ac3f03df8b 100644 --- a/apps/api/src/auth/config.ts +++ b/apps/api/src/auth/config.ts @@ -2,7 +2,7 @@ import { betterAuth } from "better-auth"; import { drizzleAdapter } from "better-auth/adapters/drizzle"; import { createAuthMiddleware } from "better-auth/api"; import { passkey } from "better-auth/plugins/passkey"; -import Redis from "ioredis"; +import { Redis } from "ioredis"; import nodemailer from "nodemailer"; import { db, tables } from "@llmgateway/db"; diff --git a/apps/api/src/auth/handler.ts b/apps/api/src/auth/handler.ts index f0b2c6f1af..c46b483fe1 100644 --- a/apps/api/src/auth/handler.ts +++ b/apps/api/src/auth/handler.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi"; -import { apiAuth } from "./config"; +import { apiAuth } from "./config.js"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; // Create a Hono app for auth routes export const authHandler = new OpenAPIHono(); diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 6b607b1020..58037b6dfc 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -10,14 +10,14 @@ import { z } from "zod"; import { db } from "@llmgateway/db"; import { logger } from "@llmgateway/logger"; -import { redisClient } from "./auth/config"; -import { authHandler } from "./auth/handler"; -import { tracingMiddleware } from "./middleware/tracing"; -import { routes } from "./routes"; -import { beacon } from "./routes/beacon"; -import { stripeRoutes } from "./stripe"; - -import type { ServerTypes } from "./vars"; +import { redisClient } from "./auth/config.js"; +import { authHandler } from "./auth/handler.js"; +import { tracingMiddleware } from "./middleware/tracing.js"; +import { beacon } from "./routes/beacon.js"; +import { routes } from "./routes/index.js"; +import { stripeRoutes } from "./stripe.js"; + +import type { ServerTypes } from "./vars.js"; export const config = { servers: [ diff --git a/apps/api/src/lib/maskToken.spec.ts b/apps/api/src/lib/maskToken.spec.ts index 0569085deb..2a6853c3d7 100644 --- a/apps/api/src/lib/maskToken.spec.ts +++ b/apps/api/src/lib/maskToken.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import { maskToken } from "./maskToken"; +import { maskToken } from "./maskToken.js"; describe("maskToken", () => { it("masks all characters after the visible ones", () => { diff --git a/apps/api/src/routes/activity.spec.ts b/apps/api/src/routes/activity.spec.ts index 13f21d9eca..d30e9573db 100644 --- a/apps/api/src/routes/activity.spec.ts +++ b/apps/api/src/routes/activity.spec.ts @@ -1,11 +1,10 @@ import { afterEach, beforeEach, describe, expect, test } from "vitest"; -import { createTestUser, deleteAll } from "@/testing"; +import { app } from "@/index.js"; +import { createTestUser, deleteAll } from "@/testing.js"; import { db, tables } from "@llmgateway/db"; -import { app } from ".."; - describe("activity endpoint", () => { let token: string; beforeEach(async () => { diff --git a/apps/api/src/routes/activity.ts b/apps/api/src/routes/activity.ts index 3d9683fc70..c39fb5355a 100644 --- a/apps/api/src/routes/activity.ts +++ b/apps/api/src/routes/activity.ts @@ -4,7 +4,7 @@ import { z } from "zod"; import { db } from "@llmgateway/db"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const activity = new OpenAPIHono(); diff --git a/apps/api/src/routes/beacon.spec.ts b/apps/api/src/routes/beacon.spec.ts index c41cc2fdf8..2963f07e91 100644 --- a/apps/api/src/routes/beacon.spec.ts +++ b/apps/api/src/routes/beacon.spec.ts @@ -1,8 +1,7 @@ import { describe, expect, it, vi } from "vitest"; -import { posthog } from "@/posthog"; - -import { app } from ".."; +import { app } from "@/index.js"; +import { posthog } from "@/posthog.js"; // Mock PostHog vi.mock("@/posthog", () => ({ diff --git a/apps/api/src/routes/beacon.ts b/apps/api/src/routes/beacon.ts index dfb26950ca..acf7e17799 100644 --- a/apps/api/src/routes/beacon.ts +++ b/apps/api/src/routes/beacon.ts @@ -1,11 +1,11 @@ import { createRoute, OpenAPIHono } from "@hono/zod-openapi"; import { z } from "zod"; -import { posthog } from "@/posthog"; +import { posthog } from "@/posthog.js"; import { logger } from "@llmgateway/logger"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const beacon = new OpenAPIHono(); diff --git a/apps/api/src/routes/chat.ts b/apps/api/src/routes/chat.ts index 0a92d36e4d..923596aeb0 100644 --- a/apps/api/src/routes/chat.ts +++ b/apps/api/src/routes/chat.ts @@ -4,7 +4,7 @@ import { z } from "zod"; import { logger } from "@llmgateway/logger"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; const chat = new OpenAPIHono(); diff --git a/apps/api/src/routes/chats.ts b/apps/api/src/routes/chats.ts index b2657d3edf..61af4698c5 100644 --- a/apps/api/src/routes/chats.ts +++ b/apps/api/src/routes/chats.ts @@ -1,11 +1,11 @@ import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; import { HTTPException } from "hono/http-exception"; -import { hasActiveApiKey } from "@/lib/hasActiveApiKey"; +import { hasActiveApiKey } from "@/lib/hasActiveApiKey.js"; import { db, tables, desc, eq, count, and } from "@llmgateway/db"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; const chats = new OpenAPIHono(); diff --git a/apps/api/src/routes/index.ts b/apps/api/src/routes/index.ts index b3fec25837..e603a3cfb7 100644 --- a/apps/api/src/routes/index.ts +++ b/apps/api/src/routes/index.ts @@ -1,20 +1,20 @@ import { OpenAPIHono } from "@hono/zod-openapi"; -import { apiAuth as auth } from "@/auth/config"; - -import { activity } from "./activity"; -import { chat } from "./chat"; -import { chats } from "./chats"; -import keysApi from "./keys-api"; -import keysProvider from "./keys-provider"; -import { logs } from "./logs"; -import organization from "./organization"; -import { payments } from "./payments"; -import projects from "./projects"; -import { subscriptions } from "./subscriptions"; -import { user } from "./user"; - -import type { ServerTypes } from "@/vars"; +import { apiAuth as auth } from "@/auth/config.js"; + +import { activity } from "./activity.js"; +import { chat } from "./chat.js"; +import { chats } from "./chats.js"; +import keysApi from "./keys-api.js"; +import keysProvider from "./keys-provider.js"; +import { logs } from "./logs.js"; +import organization from "./organization.js"; +import { payments } from "./payments.js"; +import projects from "./projects.js"; +import { subscriptions } from "./subscriptions.js"; +import { user } from "./user.js"; + +import type { ServerTypes } from "@/vars.js"; export const routes = new OpenAPIHono(); diff --git a/apps/api/src/routes/keys-api.spec.ts b/apps/api/src/routes/keys-api.spec.ts index ece74a0e2e..69183d6da9 100644 --- a/apps/api/src/routes/keys-api.spec.ts +++ b/apps/api/src/routes/keys-api.spec.ts @@ -1,11 +1,10 @@ import { expect, test, beforeEach, describe, afterEach } from "vitest"; -import { createTestUser, deleteAll } from "@/testing"; +import { app } from "@/index.js"; +import { createTestUser, deleteAll } from "@/testing.js"; import { db, tables } from "@llmgateway/db"; -import { app } from ".."; - describe("keys route", () => { let token: string; diff --git a/apps/api/src/routes/keys-api.ts b/apps/api/src/routes/keys-api.ts index d62846aa54..3b9cc7110b 100644 --- a/apps/api/src/routes/keys-api.ts +++ b/apps/api/src/routes/keys-api.ts @@ -2,11 +2,11 @@ import { createRoute, OpenAPIHono } from "@hono/zod-openapi"; import { HTTPException } from "hono/http-exception"; import { z } from "zod"; -import { maskToken } from "@/lib/maskToken"; +import { maskToken } from "@/lib/maskToken.js"; import { eq, db, shortid, tables } from "@llmgateway/db"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const keysApi = new OpenAPIHono(); diff --git a/apps/api/src/routes/keys-provider.e2e.ts b/apps/api/src/routes/keys-provider.e2e.ts index 58decd7ca9..5b509a9441 100644 --- a/apps/api/src/routes/keys-provider.e2e.ts +++ b/apps/api/src/routes/keys-provider.e2e.ts @@ -1,14 +1,15 @@ import "dotenv/config"; import { afterAll, beforeAll, describe, expect, test } from "vitest"; -import { app } from "@/index"; -import { deleteAll } from "@/testing"; +import { app } from "@/index.js"; +import { deleteAll } from "@/testing.js"; import { db, tables } from "@llmgateway/db"; -import { getProviderEnvVar, providers } from "@llmgateway/models"; - -// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths -import { getConcurrentTestOptions } from "../../../gateway/src/test-utils/test-helpers"; +import { + getConcurrentTestOptions, + getProviderEnvVar, + providers, +} from "@llmgateway/models"; // Helper function to generate unique IDs for tests function generateTestId(): string { diff --git a/apps/api/src/routes/keys-provider.spec.ts b/apps/api/src/routes/keys-provider.spec.ts index 94dbf9b169..da427b569d 100644 --- a/apps/api/src/routes/keys-provider.spec.ts +++ b/apps/api/src/routes/keys-provider.spec.ts @@ -1,11 +1,10 @@ import { expect, test, beforeEach, describe, afterEach } from "vitest"; -import { createTestUser, deleteAll } from "@/testing"; +import { app } from "@/index.js"; +import { createTestUser, deleteAll } from "@/testing.js"; import { db, tables } from "@llmgateway/db"; -import { app } from ".."; - describe("provider keys route", () => { let token: string; diff --git a/apps/api/src/routes/keys-provider.ts b/apps/api/src/routes/keys-provider.ts index 701a0a7116..5e0d1febf6 100644 --- a/apps/api/src/routes/keys-provider.ts +++ b/apps/api/src/routes/keys-provider.ts @@ -2,12 +2,12 @@ import { createRoute, OpenAPIHono } from "@hono/zod-openapi"; import { HTTPException } from "hono/http-exception"; import { z } from "zod"; -import { maskToken } from "@/lib/maskToken"; +import { maskToken } from "@/lib/maskToken.js"; import { db, eq, tables } from "@llmgateway/db"; import { providers, validateProviderKey } from "@llmgateway/models"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; import type { ProviderId } from "@llmgateway/models"; export const keysProvider = new OpenAPIHono(); diff --git a/apps/api/src/routes/logs.spec.ts b/apps/api/src/routes/logs.spec.ts index 1e7fe440f2..bcb80b9261 100644 --- a/apps/api/src/routes/logs.spec.ts +++ b/apps/api/src/routes/logs.spec.ts @@ -1,11 +1,10 @@ import { afterEach, beforeEach, describe, expect, test } from "vitest"; -import { createTestUser, deleteAll } from "@/testing"; +import { app } from "@/index.js"; +import { createTestUser, deleteAll } from "@/testing.js"; import { db, tables } from "@llmgateway/db"; -import { app } from ".."; - describe("logs route", () => { let token: string; diff --git a/apps/api/src/routes/logs.ts b/apps/api/src/routes/logs.ts index 64480f1e4b..71b946fedb 100644 --- a/apps/api/src/routes/logs.ts +++ b/apps/api/src/routes/logs.ts @@ -22,7 +22,7 @@ import { tools, } from "@llmgateway/db"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const logs = new OpenAPIHono(); diff --git a/apps/api/src/routes/organization.ts b/apps/api/src/routes/organization.ts index 643a09d2bd..0840c0686b 100644 --- a/apps/api/src/routes/organization.ts +++ b/apps/api/src/routes/organization.ts @@ -4,7 +4,7 @@ import { z } from "zod"; import { db, eq, tables } from "@llmgateway/db"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const organization = new OpenAPIHono(); diff --git a/apps/api/src/routes/payments.ts b/apps/api/src/routes/payments.ts index aef9c799c2..d3421494ad 100644 --- a/apps/api/src/routes/payments.ts +++ b/apps/api/src/routes/payments.ts @@ -3,12 +3,12 @@ import { HTTPException } from "hono/http-exception"; import Stripe from "stripe"; import { z } from "zod"; -import { ensureStripeCustomer } from "@/stripe"; +import { ensureStripeCustomer } from "@/stripe.js"; import { db, eq, tables } from "@llmgateway/db"; import { calculateFees } from "@llmgateway/shared"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const stripe = new Stripe( process.env.STRIPE_SECRET_KEY || "sk_test_123", diff --git a/apps/api/src/routes/projects.ts b/apps/api/src/routes/projects.ts index 0bfe3c3919..e028f6c0e5 100644 --- a/apps/api/src/routes/projects.ts +++ b/apps/api/src/routes/projects.ts @@ -4,7 +4,7 @@ import { z } from "zod"; import { db, eq, tables } from "@llmgateway/db"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const projects = new OpenAPIHono(); diff --git a/apps/api/src/routes/subscriptions.ts b/apps/api/src/routes/subscriptions.ts index da2ca7424a..40f16b2ff0 100644 --- a/apps/api/src/routes/subscriptions.ts +++ b/apps/api/src/routes/subscriptions.ts @@ -2,14 +2,14 @@ import { createRoute, OpenAPIHono } from "@hono/zod-openapi"; import { HTTPException } from "hono/http-exception"; import { z } from "zod"; -import { ensureStripeCustomer } from "@/stripe"; +import { ensureStripeCustomer } from "@/stripe.js"; import { db } from "@llmgateway/db"; import { logger } from "@llmgateway/logger"; -import { stripe } from "./payments"; +import { stripe } from "./payments.js"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const subscriptions = new OpenAPIHono(); diff --git a/apps/api/src/routes/user.ts b/apps/api/src/routes/user.ts index bffec35f2c..4e4485fd82 100644 --- a/apps/api/src/routes/user.ts +++ b/apps/api/src/routes/user.ts @@ -2,11 +2,11 @@ import { createRoute, OpenAPIHono } from "@hono/zod-openapi"; import { HTTPException } from "hono/http-exception"; import { z } from "zod"; -import { apiAuth as auth } from "@/auth/config"; +import { apiAuth as auth } from "@/auth/config.js"; import { db, eq, tables } from "@llmgateway/db"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const user = new OpenAPIHono(); diff --git a/apps/api/src/scripts/generate-openapi.ts b/apps/api/src/scripts/generate-openapi.ts index ab82fcf9ff..1092df1503 100644 --- a/apps/api/src/scripts/generate-openapi.ts +++ b/apps/api/src/scripts/generate-openapi.ts @@ -1,8 +1,8 @@ import { writeFileSync } from "fs"; -import { logger } from "@llmgateway/logger"; +import { app, config } from "@/apps/api/src/index.js"; -import { app, config } from ".."; +import { logger } from "@llmgateway/logger"; async function generateOpenAPI() { const spec = app.getOpenAPIDocument(config); diff --git a/apps/api/src/serve.ts b/apps/api/src/serve.ts index 54bb6dcc7b..d284600b5e 100644 --- a/apps/api/src/serve.ts +++ b/apps/api/src/serve.ts @@ -7,9 +7,9 @@ import { } from "@llmgateway/instrumentation"; import { logger } from "@llmgateway/logger"; -import { app } from "."; -import { redisClient } from "./auth/config"; -import { sendInstallationBeacon } from "./lib/beacon"; +import { redisClient } from "./auth/config.js"; +import { app } from "./index.js"; +import { sendInstallationBeacon } from "./lib/beacon.js"; import type { NodeSDK } from "@opentelemetry/sdk-node"; diff --git a/apps/api/src/stripe.ts b/apps/api/src/stripe.ts index 311c164663..4893c66277 100644 --- a/apps/api/src/stripe.ts +++ b/apps/api/src/stripe.ts @@ -5,10 +5,10 @@ import { z } from "zod"; import { db, eq, sql, tables } from "@llmgateway/db"; import { logger } from "@llmgateway/logger"; -import { posthog } from "./posthog"; -import { stripe } from "./routes/payments"; +import { posthog } from "./posthog.js"; +import { stripe } from "./routes/payments.js"; -import type { ServerTypes } from "./vars"; +import type { ServerTypes } from "./vars.js"; import type Stripe from "stripe"; export async function ensureStripeCustomer( diff --git a/apps/api/src/testing.ts b/apps/api/src/testing.ts index 66a9761cb9..a7b2080d8a 100644 --- a/apps/api/src/testing.ts +++ b/apps/api/src/testing.ts @@ -1,8 +1,6 @@ import { db, tables } from "@llmgateway/db"; -import { app } from "."; -// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths -import { clearCache } from "../../gateway/src/test-utils/test-helpers"; +import { app } from "./index.js"; import type { OpenAPIHono } from "@hono/zod-openapi"; @@ -12,7 +10,7 @@ const credentials = { }; export async function deleteAll() { - await clearCache(); + // await redisClient.flushdb(); await Promise.all([ db.delete(tables.log), diff --git a/apps/api/src/vars.ts b/apps/api/src/vars.ts index 9e6a3fc6af..aee689f53e 100644 --- a/apps/api/src/vars.ts +++ b/apps/api/src/vars.ts @@ -1,4 +1,4 @@ -import type { Variables } from "./auth/config"; +import type { Variables } from "./auth/config.js"; import type { Env } from "hono/types"; export interface ServerTypes extends Env { diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/apps/api/tsup.config.ts b/apps/api/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/apps/api/tsup.config.ts +++ b/apps/api/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index 8897d7dfc2..30ba08239e 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "declaration": false, "target": "ESNext", "lib": ["dom", "dom.iterable", "esnext"], "noEmit": true, @@ -18,7 +19,8 @@ "preserveSymlinks": true, "allowJs": true, "incremental": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "isolatedModules": true }, "include": [ "**/*.ts", diff --git a/apps/gateway/package.json b/apps/gateway/package.json index d0237ab82c..bdf81097ec 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -4,13 +4,18 @@ "private": true, "license": "SEE LICENSE IN ../../LICENSE", "type": "module", + "imports": { + "@/": { + "default": "." + } + }, "files": [ "dist/", "openapi.json" ], "scripts": { - "build": "tsc && pnpm run generate", - "dev": "tsc && nodemon dist/serve.js", + "build": "tsc && resolve-tspaths && pnpm run generate", + "dev": "tsc && resolve-tspaths && nodemon dist/serve.js", "generate": "node ./dist/scripts/generate-openapi.js", "start": "node --enable-source-maps dist/serve.js" }, @@ -31,6 +36,7 @@ "hono-openapi": "^0.4.6", "ioredis": "5.6.1", "redis": "5.8.2", + "worker": "workspace:*", "zod": "3.25.75", "zod-openapi": "^4.2.4" }, diff --git a/apps/gateway/src/anthropic/anthropic.ts b/apps/gateway/src/anthropic/anthropic.ts index 3e82aa0aeb..859b7c8c33 100644 --- a/apps/gateway/src/anthropic/anthropic.ts +++ b/apps/gateway/src/anthropic/anthropic.ts @@ -1,7 +1,7 @@ import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; import { HTTPException } from "hono/http-exception"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const anthropic = new OpenAPIHono(); diff --git a/apps/gateway/src/anthropic/index.ts b/apps/gateway/src/anthropic/index.ts index c0557b6920..7219ff6d5b 100644 --- a/apps/gateway/src/anthropic/index.ts +++ b/apps/gateway/src/anthropic/index.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi"; -import { anthropic } from "./anthropic"; +import { anthropic } from "./anthropic.js"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const exposed = new OpenAPIHono(); diff --git a/apps/gateway/src/api-individual.e2e.ts b/apps/gateway/src/api-individual.e2e.ts index e15efe9ff2..9d3c9343ea 100644 --- a/apps/gateway/src/api-individual.e2e.ts +++ b/apps/gateway/src/api-individual.e2e.ts @@ -5,17 +5,17 @@ import { generateTestRequestId, logMode, validateLogByRequestId, -} from "@/chat-helpers.e2e"; +} from "@/chat-helpers.e2e.js"; import { db, tables, eq } from "@llmgateway/db"; import { models, providers, getProviderEnvVar } from "@llmgateway/models"; -import { app } from "."; +import { app } from "./app.js"; import { clearCache, waitForLogByRequestId, readAll, -} from "./test-utils/test-helpers"; +} from "./test-utils/test-helpers.js"; describe("e2e individual tests", () => { // Helper to create unique test data for each test to avoid conflicts diff --git a/apps/gateway/src/api.spec.ts b/apps/gateway/src/api.spec.ts index 9d58bdddb9..063339cdf6 100644 --- a/apps/gateway/src/api.spec.ts +++ b/apps/gateway/src/api.spec.ts @@ -9,12 +9,12 @@ import { import { db, tables, eq } from "@llmgateway/db"; -import { app } from "."; +import { app } from "./app.js"; import { startMockServer, stopMockServer, -} from "./test-utils/mock-openai-server"; -import { clearCache, waitForLogs } from "./test-utils/test-helpers"; +} from "./test-utils/mock-openai-server.js"; +import { clearCache, waitForLogs } from "./test-utils/test-helpers.js"; describe("test", () => { let mockServerUrl: string; diff --git a/apps/gateway/src/index.ts b/apps/gateway/src/app.ts similarity index 94% rename from apps/gateway/src/index.ts rename to apps/gateway/src/app.ts index b3c2911e62..89c746ed51 100644 --- a/apps/gateway/src/index.ts +++ b/apps/gateway/src/app.ts @@ -10,12 +10,12 @@ import { redisClient } from "@llmgateway/cache"; import { db } from "@llmgateway/db"; import { logger } from "@llmgateway/logger"; -import { anthropic } from "./anthropic/anthropic"; -import { chat } from "./chat/chat"; -import { tracingMiddleware } from "./middleware/tracing"; -import { models } from "./models"; +import { anthropic } from "./anthropic/anthropic.js"; +import { chat } from "./chat/chat.js"; +import { tracingMiddleware } from "./middleware/tracing.js"; +import { models } from "./models/route.js"; -import type { ServerTypes } from "./vars"; +import type { ServerTypes } from "./vars.js"; export const config = { servers: [ diff --git a/apps/gateway/src/chat-basic.e2e.ts b/apps/gateway/src/chat-basic.e2e.ts index 94a573a9f4..66fd250c3b 100644 --- a/apps/gateway/src/chat-basic.e2e.ts +++ b/apps/gateway/src/chat-basic.e2e.ts @@ -11,9 +11,9 @@ import { testModels, validateLogByRequestId, validateResponse, -} from "@/chat-helpers.e2e"; +} from "@/chat-helpers.e2e.js"; -import { app } from "."; +import { app } from "./app.js"; // Helper function to generate unique request IDs for tests export function generateTestRequestId(): string { diff --git a/apps/gateway/src/chat-full.e2e.ts b/apps/gateway/src/chat-full.e2e.ts index f0bf753314..d7399b7c8a 100644 --- a/apps/gateway/src/chat-full.e2e.ts +++ b/apps/gateway/src/chat-full.e2e.ts @@ -1,7 +1,8 @@ import "dotenv/config"; import { beforeAll, beforeEach, describe, expect, test } from "vitest"; -import { imageModels, streamingImageModels } from "@/chat-helpers.e2e"; +import { app } from "@/app.js"; +import { imageModels, streamingImageModels } from "@/chat-helpers.e2e.js"; import { beforeAllHook, beforeEachHook, @@ -12,9 +13,8 @@ import { logMode, testModels, validateLogByRequestId, -} from "@/chat-helpers.e2e"; -import { app } from "@/index"; -import { readAll } from "@/test-utils/test-helpers"; +} from "@/chat-helpers.e2e.js"; +import { readAll } from "@/test-utils/test-helpers.js"; import type { ProviderModelMapping } from "@llmgateway/models"; diff --git a/apps/gateway/src/chat-helpers.e2e.ts b/apps/gateway/src/chat-helpers.e2e.ts index 2833404f01..4c762d3d4a 100644 --- a/apps/gateway/src/chat-helpers.e2e.ts +++ b/apps/gateway/src/chat-helpers.e2e.ts @@ -1,5 +1,5 @@ import "dotenv/config"; -import { describe, expect, it, type TestOptions } from "vitest"; +import { describe, expect, it } from "vitest"; import { db, tables } from "@llmgateway/db"; import { @@ -8,29 +8,22 @@ import { models, type ProviderModelMapping, providers, + getConcurrentTestOptions, + getTestOptions, } from "@llmgateway/models"; import { clearCache, waitForLogByRequestId, - getConcurrentTestOptions, -} from "./test-utils/test-helpers"; +} from "./test-utils/test-helpers.js"; + +export { getConcurrentTestOptions, getTestOptions }; // Helper function to generate unique request IDs for tests export function generateTestRequestId(): string { return `test-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; } -// Helper function to get test options with retry for CI environment -export function getTestOptions(): TestOptions { - return process.env.CI ? { retry: 3 } : {}; -} - -// Re-export getConcurrentTestOptions from test-utils -export { getConcurrentTestOptions }; - -console.log("running with test options:", getTestOptions()); - export const fullMode = process.env.FULL_MODE; export const logMode = process.env.LOG_MODE; diff --git a/apps/gateway/src/chat-json.e2e.ts b/apps/gateway/src/chat-json.e2e.ts index 32d1eb792f..b0063cbdd4 100644 --- a/apps/gateway/src/chat-json.e2e.ts +++ b/apps/gateway/src/chat-json.e2e.ts @@ -1,15 +1,15 @@ import "dotenv/config"; import { beforeAll, beforeEach, describe, expect, test } from "vitest"; -import { testModels } from "@/chat-helpers.e2e"; +import { app } from "@/app.js"; +import { testModels } from "@/chat-helpers.e2e.js"; import { beforeAllHook, beforeEachHook, getConcurrentTestOptions, getTestOptions, logMode, -} from "@/chat-helpers.e2e"; -import { app } from "@/index"; +} from "@/chat-helpers.e2e.js"; import { type ModelDefinition, models } from "@llmgateway/models"; diff --git a/apps/gateway/src/chat-reasoning.e2e.ts b/apps/gateway/src/chat-reasoning.e2e.ts index 1bd65ea589..205c83d43f 100644 --- a/apps/gateway/src/chat-reasoning.e2e.ts +++ b/apps/gateway/src/chat-reasoning.e2e.ts @@ -1,6 +1,7 @@ import "dotenv/config"; import { beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { app } from "@/app.js"; import { beforeAllHook, beforeEachHook, @@ -11,8 +12,7 @@ import { reasoningModels, validateLogByRequestId, validateResponse, -} from "@/chat-helpers.e2e"; -import { app } from "@/index"; +} from "@/chat-helpers.e2e.js"; import type { ProviderModelMapping } from "@llmgateway/models"; diff --git a/apps/gateway/src/chat-rs.e2e.ts b/apps/gateway/src/chat-rs.e2e.ts index 89d7ec0fb1..ef224ee8b1 100644 --- a/apps/gateway/src/chat-rs.e2e.ts +++ b/apps/gateway/src/chat-rs.e2e.ts @@ -1,6 +1,7 @@ import "dotenv/config"; import { beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { app } from "@/app.js"; import { beforeAllHook, beforeEachHook, @@ -10,9 +11,8 @@ import { logMode, streamingReasoningModels, validateLogByRequestId, -} from "@/chat-helpers.e2e"; -import { app } from "@/index"; -import { readAll } from "@/test-utils/test-helpers"; +} from "@/chat-helpers.e2e.js"; +import { readAll } from "@/test-utils/test-helpers.js"; import type { ProviderModelMapping } from "@llmgateway/models"; diff --git a/apps/gateway/src/chat-streaming.e2e.ts b/apps/gateway/src/chat-streaming.e2e.ts index 985c47b04e..29f4973878 100644 --- a/apps/gateway/src/chat-streaming.e2e.ts +++ b/apps/gateway/src/chat-streaming.e2e.ts @@ -1,6 +1,7 @@ import "dotenv/config"; import { beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { app } from "@/app.js"; import { beforeAllHook, beforeEachHook, @@ -10,9 +11,8 @@ import { logMode, streamingModels, validateLogByRequestId, -} from "@/chat-helpers.e2e"; -import { app } from "@/index"; -import { readAll } from "@/test-utils/test-helpers"; +} from "@/chat-helpers.e2e.js"; +import { readAll } from "@/test-utils/test-helpers.js"; describe("e2e", getConcurrentTestOptions(), () => { beforeAll(beforeAllHook); diff --git a/apps/gateway/src/chat-toolcalls-result.e2e.ts b/apps/gateway/src/chat-toolcalls-result.e2e.ts index 0e806081cf..98fd25ebf2 100644 --- a/apps/gateway/src/chat-toolcalls-result.e2e.ts +++ b/apps/gateway/src/chat-toolcalls-result.e2e.ts @@ -1,6 +1,7 @@ import "dotenv/config"; import { beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { app } from "@/app.js"; import { beforeAllHook, beforeEachHook, @@ -10,8 +11,7 @@ import { logMode, toolCallModels, validateLogByRequestId, -} from "@/chat-helpers.e2e"; -import { app } from "@/index"; +} from "@/chat-helpers.e2e.js"; describe("e2e", getConcurrentTestOptions(), () => { beforeAll(beforeAllHook); diff --git a/apps/gateway/src/chat-toolcalls.e2e.ts b/apps/gateway/src/chat-toolcalls.e2e.ts index 9e490cbcbe..d40f53a475 100644 --- a/apps/gateway/src/chat-toolcalls.e2e.ts +++ b/apps/gateway/src/chat-toolcalls.e2e.ts @@ -1,6 +1,7 @@ import "dotenv/config"; import { beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { app } from "@/app.js"; import { beforeAllHook, beforeEachHook, @@ -10,8 +11,7 @@ import { logMode, toolCallModels, validateLogByRequestId, -} from "@/chat-helpers.e2e"; -import { app } from "@/index"; +} from "@/chat-helpers.e2e.js"; describe("e2e", getConcurrentTestOptions(), () => { beforeAll(beforeAllHook); diff --git a/apps/gateway/src/chat/chat.ts b/apps/gateway/src/chat/chat.ts index b43a098a4b..0a27a859fb 100644 --- a/apps/gateway/src/chat/chat.ts +++ b/apps/gateway/src/chat/chat.ts @@ -3,10 +3,10 @@ import { encode, encodeChat } from "gpt-tokenizer"; import { HTTPException } from "hono/http-exception"; import { streamSSE } from "hono/streaming"; -import { validateSource } from "@/chat/tools/validate-source"; -import { calculateCosts } from "@/lib/costs"; -import { throwIamException, validateModelAccess } from "@/lib/iam"; -import { insertLog } from "@/lib/logs"; +import { validateSource } from "@/chat/tools/validate-source.js"; +import { calculateCosts } from "@/lib/costs.js"; +import { throwIamException, validateModelAccess } from "@/lib/iam.js"; +import { insertLog } from "@/lib/logs.js"; import { checkCustomProviderExists, @@ -47,22 +47,22 @@ import { providers, } from "@llmgateway/models"; -import { createLogEntry } from "./tools/create-log-entry"; -import { estimateTokens } from "./tools/estimate-tokens"; -import { extractContent } from "./tools/extract-content"; -import { extractCustomHeaders } from "./tools/extract-custom-headers"; -import { extractReasoning } from "./tools/extract-reasoning"; -import { extractTokenUsage } from "./tools/extract-token-usage"; -import { extractToolCalls } from "./tools/extract-tool-calls"; -import { getFinishReasonFromError } from "./tools/get-finish-reason-from-error"; -import { getProviderEnv } from "./tools/get-provider-env"; -import { parseProviderResponse } from "./tools/parse-provider-response"; -import { transformResponseToOpenai } from "./tools/transform-response-to-openai"; -import { transformStreamingToOpenai } from "./tools/transform-streaming-to-openai"; -import { type ChatMessage, DEFAULT_TOKENIZER_MODEL } from "./tools/types"; -import { validateFreeModelUsage } from "./tools/validate-free-model-usage"; - -import type { ServerTypes } from "@/vars"; +import { createLogEntry } from "./tools/create-log-entry.js"; +import { estimateTokens } from "./tools/estimate-tokens.js"; +import { extractContent } from "./tools/extract-content.js"; +import { extractCustomHeaders } from "./tools/extract-custom-headers.js"; +import { extractReasoning } from "./tools/extract-reasoning.js"; +import { extractTokenUsage } from "./tools/extract-token-usage.js"; +import { extractToolCalls } from "./tools/extract-tool-calls.js"; +import { getFinishReasonFromError } from "./tools/get-finish-reason-from-error.js"; +import { getProviderEnv } from "./tools/get-provider-env.js"; +import { parseProviderResponse } from "./tools/parse-provider-response.js"; +import { transformResponseToOpenai } from "./tools/transform-response-to-openai.js"; +import { transformStreamingToOpenai } from "./tools/transform-streaming-to-openai.js"; +import { type ChatMessage, DEFAULT_TOKENIZER_MODEL } from "./tools/types.js"; +import { validateFreeModelUsage } from "./tools/validate-free-model-usage.js"; + +import type { ServerTypes } from "@/vars.js"; /** * Estimates tokens from content length using simple division diff --git a/apps/gateway/src/chat/index.ts b/apps/gateway/src/chat/index.ts index 2163cf5070..d163159ee3 100644 --- a/apps/gateway/src/chat/index.ts +++ b/apps/gateway/src/chat/index.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi"; -import { chat } from "./chat"; +import { chat } from "./chat.js"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const exposed = new OpenAPIHono(); diff --git a/apps/gateway/src/chat/tools/calculate-prompt-tokens.ts b/apps/gateway/src/chat/tools/calculate-prompt-tokens.ts index 2dfb64318a..2a0241cf44 100644 --- a/apps/gateway/src/chat/tools/calculate-prompt-tokens.ts +++ b/apps/gateway/src/chat/tools/calculate-prompt-tokens.ts @@ -1,6 +1,6 @@ import { encodeChat } from "gpt-tokenizer"; -import { type ChatMessage, DEFAULT_TOKENIZER_MODEL } from "./types"; +import { type ChatMessage, DEFAULT_TOKENIZER_MODEL } from "./types.js"; /** * Transforms streaming chunk to OpenAI format for non-OpenAI providers diff --git a/apps/gateway/src/chat/tools/estimate-tokens.ts b/apps/gateway/src/chat/tools/estimate-tokens.ts index dbdcec4d6e..3f08a8e309 100644 --- a/apps/gateway/src/chat/tools/estimate-tokens.ts +++ b/apps/gateway/src/chat/tools/estimate-tokens.ts @@ -2,7 +2,7 @@ import { encode, encodeChat } from "gpt-tokenizer"; import { logger } from "@llmgateway/logger"; -import { type ChatMessage, DEFAULT_TOKENIZER_MODEL } from "./types"; +import { type ChatMessage, DEFAULT_TOKENIZER_MODEL } from "./types.js"; import type { Provider } from "@llmgateway/models"; diff --git a/apps/gateway/src/chat/tools/extract-images.ts b/apps/gateway/src/chat/tools/extract-images.ts index ca754cef97..5bb4edabd1 100644 --- a/apps/gateway/src/chat/tools/extract-images.ts +++ b/apps/gateway/src/chat/tools/extract-images.ts @@ -1,4 +1,4 @@ -import type { ImageObject } from "./types"; +import type { ImageObject } from "./types.js"; import type { Provider } from "@llmgateway/models"; /** diff --git a/apps/gateway/src/chat/tools/extract-token-usage.ts b/apps/gateway/src/chat/tools/extract-token-usage.ts index aac3c2a3bf..0cfb693c27 100644 --- a/apps/gateway/src/chat/tools/extract-token-usage.ts +++ b/apps/gateway/src/chat/tools/extract-token-usage.ts @@ -1,4 +1,4 @@ -import { estimateTokens } from "./estimate-tokens"; +import { estimateTokens } from "./estimate-tokens.js"; import type { Provider } from "@llmgateway/models"; diff --git a/apps/gateway/src/chat/tools/parse-provider-response.ts b/apps/gateway/src/chat/tools/parse-provider-response.ts index 1059607b83..9eb8ca2ce1 100644 --- a/apps/gateway/src/chat/tools/parse-provider-response.ts +++ b/apps/gateway/src/chat/tools/parse-provider-response.ts @@ -1,6 +1,6 @@ -import { estimateTokens } from "./estimate-tokens"; +import { estimateTokens } from "./estimate-tokens.js"; -import type { ImageObject } from "./types"; +import type { ImageObject } from "./types.js"; import type { Provider } from "@llmgateway/models"; /** diff --git a/apps/gateway/src/chat/tools/transform-response-to-openai.ts b/apps/gateway/src/chat/tools/transform-response-to-openai.ts index 74b1e24e4a..36a91a162d 100644 --- a/apps/gateway/src/chat/tools/transform-response-to-openai.ts +++ b/apps/gateway/src/chat/tools/transform-response-to-openai.ts @@ -1,4 +1,4 @@ -import type { ImageObject } from "./types"; +import type { ImageObject } from "./types.js"; import type { Provider } from "@llmgateway/models"; /** diff --git a/apps/gateway/src/chat/tools/transform-streaming-to-openai.ts b/apps/gateway/src/chat/tools/transform-streaming-to-openai.ts index d3b27bc5a1..e854ace229 100644 --- a/apps/gateway/src/chat/tools/transform-streaming-to-openai.ts +++ b/apps/gateway/src/chat/tools/transform-streaming-to-openai.ts @@ -1,8 +1,8 @@ -import { calculatePromptTokensFromMessages } from "./calculate-prompt-tokens"; -import { extractImages } from "./extract-images"; -import { transformOpenaiStreaming } from "./transform-openai-streaming"; +import { calculatePromptTokensFromMessages } from "./calculate-prompt-tokens.js"; +import { extractImages } from "./extract-images.js"; +import { transformOpenaiStreaming } from "./transform-openai-streaming.js"; -import type { StreamingDelta } from "./types"; +import type { StreamingDelta } from "./types.js"; import type { Provider } from "@llmgateway/models"; export function transformStreamingToOpenai( diff --git a/apps/gateway/src/chat/tools/validate-free-model-usage.ts b/apps/gateway/src/chat/tools/validate-free-model-usage.ts index e08f22ca2e..be76075edf 100644 --- a/apps/gateway/src/chat/tools/validate-free-model-usage.ts +++ b/apps/gateway/src/chat/tools/validate-free-model-usage.ts @@ -1,13 +1,13 @@ // Helper function to validate free model usage import { HTTPException } from "hono/http-exception"; -import { checkFreeModelRateLimit } from "@/lib/rate-limit"; +import { checkFreeModelRateLimit } from "@/lib/rate-limit.js"; import { logger } from "@llmgateway/logger"; -import { getUserFromOrganization } from "./get-user-from-organization"; +import { getUserFromOrganization } from "./get-user-from-organization.js"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; import type { ModelDefinition } from "@llmgateway/models"; import type { Context } from "hono"; diff --git a/apps/gateway/src/lib/costs.spec.ts b/apps/gateway/src/lib/costs.spec.ts index 690e155ae3..5db4bdd01a 100644 --- a/apps/gateway/src/lib/costs.spec.ts +++ b/apps/gateway/src/lib/costs.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import { calculateCosts } from "./costs"; +import { calculateCosts } from "./costs.js"; describe("calculateCosts", () => { it("should calculate costs with provided token counts", () => { diff --git a/apps/gateway/src/lib/logs.spec.ts b/apps/gateway/src/lib/logs.spec.ts index 39d20ee844..a90c01bc21 100644 --- a/apps/gateway/src/lib/logs.spec.ts +++ b/apps/gateway/src/lib/logs.spec.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { UnifiedFinishReason } from "@llmgateway/db"; -import { getUnifiedFinishReason } from "./logs"; +import { getUnifiedFinishReason } from "./logs.js"; describe("getUnifiedFinishReason", () => { it("maps OpenAI finish reasons correctly", () => { diff --git a/apps/gateway/src/lib/prompt-tokens.spec.ts b/apps/gateway/src/lib/prompt-tokens.spec.ts index 607052ef38..ad2252537a 100644 --- a/apps/gateway/src/lib/prompt-tokens.spec.ts +++ b/apps/gateway/src/lib/prompt-tokens.spec.ts @@ -1,8 +1,8 @@ import { describe, it, expect, vi } from "vitest"; -import { estimateTokensFromContent } from "@/chat/chat"; -import { calculatePromptTokensFromMessages } from "@/chat/tools/calculate-prompt-tokens"; -import { estimateTokens } from "@/chat/tools/estimate-tokens"; +import { estimateTokensFromContent } from "@/chat/chat.js"; +import { calculatePromptTokensFromMessages } from "@/chat/tools/calculate-prompt-tokens.js"; +import { estimateTokens } from "@/chat/tools/estimate-tokens.js"; describe("Prompt token calculation", () => { describe("estimateTokensFromContent", () => { diff --git a/apps/gateway/src/lib/rate-limit.spec.ts b/apps/gateway/src/lib/rate-limit.spec.ts index aab1ba9f7e..b3bed8f911 100644 --- a/apps/gateway/src/lib/rate-limit.spec.ts +++ b/apps/gateway/src/lib/rate-limit.spec.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { checkFreeModelRateLimit, isFreeModel } from "./rate-limit"; +import { checkFreeModelRateLimit, isFreeModel } from "./rate-limit.js"; // Mock dependencies vi.mock("@llmgateway/cache", () => ({ diff --git a/apps/gateway/src/models/models.spec.ts b/apps/gateway/src/models/models.spec.ts index 0f93981103..468f532161 100644 --- a/apps/gateway/src/models/models.spec.ts +++ b/apps/gateway/src/models/models.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "vitest"; -import { app } from ".."; +import { app } from "@/app.js"; describe("Models API", () => { test("GET /v1/models should return a list of models", async () => { diff --git a/apps/gateway/src/models/models.ts b/apps/gateway/src/models/models.ts index 728fb18fa2..bcf969e53d 100644 --- a/apps/gateway/src/models/models.ts +++ b/apps/gateway/src/models/models.ts @@ -9,7 +9,7 @@ import { type ModelDefinition, } from "@llmgateway/models"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const modelsApi = new OpenAPIHono(); diff --git a/apps/gateway/src/models/index.ts b/apps/gateway/src/models/route.ts similarity index 61% rename from apps/gateway/src/models/index.ts rename to apps/gateway/src/models/route.ts index 413f17e4bc..aa160eab2d 100644 --- a/apps/gateway/src/models/index.ts +++ b/apps/gateway/src/models/route.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi"; -import { modelsApi } from "./models"; +import { modelsApi } from "./models.js"; -import type { ServerTypes } from "@/vars"; +import type { ServerTypes } from "@/vars.js"; export const models = new OpenAPIHono(); diff --git a/apps/gateway/src/scripts/generate-openapi.ts b/apps/gateway/src/scripts/generate-openapi.ts index 8a5097f138..b4aa52fa45 100644 --- a/apps/gateway/src/scripts/generate-openapi.ts +++ b/apps/gateway/src/scripts/generate-openapi.ts @@ -1,8 +1,8 @@ import { writeFileSync } from "fs"; -import { logger } from "@llmgateway/logger"; +import { app, config } from "@/app.js"; -import { app, config } from ".."; +import { logger } from "@llmgateway/logger"; async function generateOpenAPI() { const spec = app.getOpenAPIDocument(config); diff --git a/apps/gateway/src/serve.ts b/apps/gateway/src/serve.ts index 9028a7263e..dcdd0cd990 100644 --- a/apps/gateway/src/serve.ts +++ b/apps/gateway/src/serve.ts @@ -8,7 +8,7 @@ import { } from "@llmgateway/instrumentation"; import { logger } from "@llmgateway/logger"; -import { app } from "."; +import { app } from "./app.js"; import type { ServerType } from "@hono/node-server"; import type { NodeSDK } from "@opentelemetry/sdk-node"; diff --git a/apps/gateway/src/test-utils/test-helpers.ts b/apps/gateway/src/test-utils/test-helpers.ts index e98c449929..3f714f4102 100644 --- a/apps/gateway/src/test-utils/test-helpers.ts +++ b/apps/gateway/src/test-utils/test-helpers.ts @@ -1,44 +1,12 @@ +import { processLogQueue } from "worker"; + import { redisClient } from "@llmgateway/cache"; import { db, tables, eq } from "@llmgateway/db"; -import { models, type ProviderModelMapping } from "@llmgateway/models"; - -// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths -import { processLogQueue } from "../../../worker/src/worker"; - -import type { TestOptions } from "vitest"; export async function clearCache() { await redisClient.flushdb(); } -/** - * Helper function to get test options with retry for CI environment - */ -export function getTestOptions( - opts: { completions?: boolean } = { - completions: true, - }, -): TestOptions { - const hasTestOnly = models.some((model) => - model.providers.some( - (provider: ProviderModelMapping) => provider.test === "only", - ), - ); - return process.env.CI || opts?.completions - ? { retry: 3 } - : { skip: hasTestOnly || !!process.env.TEST_MODELS }; -} - -/** - * Helper function to get concurrent test options with retry for CI environment - * @returns TestOptions with concurrent: true and CI retry configuration - */ -export function getConcurrentTestOptions(opts?: { - completions?: boolean; -}): TestOptions { - return { concurrent: true, ...getTestOptions(opts) }; -} - /** * Helper function to wait for logs to be processed by the worker * @param expectedCount The expected number of logs diff --git a/apps/ui/package.json b/apps/ui/package.json index 4429a71692..e3449cf681 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "tsc && next build", "dev": "next dev --port 3002 --turbopack", - "generate": "NODE_OPTIONS=\"--max-old-space-size=4096\" openapi-typescript ../api/openapi.json -o ./src/lib/api/v1.d.ts", + "generate": "openapi-typescript ../api/openapi.json -o ./src/lib/api/v1.d.ts", "start": "next start" }, "dependencies": { diff --git a/apps/ui/tsconfig.json b/apps/ui/tsconfig.json index 0afea8afde..53cca06463 100644 --- a/apps/ui/tsconfig.json +++ b/apps/ui/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "declaration": false, "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, diff --git a/apps/worker/package.json b/apps/worker/package.json index 6e036a77f3..10c7b74342 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -4,12 +4,20 @@ "private": true, "license": "SEE LICENSE IN ../../LICENSE", "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "module": "./dist/index.js", + "types": "./dist/index.d.ts", "files": [ "dist/" ], "scripts": { - "build": "tsc", - "dev": "tsc && nodemon dist/index.js", + "build": "tsc && resolve-tspaths && resolve-tspaths", + "dev": "tsc && resolve-tspaths && nodemon dist/index.js", "start": "node --enable-source-maps dist/index.js" }, "dependencies": { diff --git a/apps/worker/src/index.ts b/apps/worker/src/index.ts index 3bf2121667..4aca45c71e 100644 --- a/apps/worker/src/index.ts +++ b/apps/worker/src/index.ts @@ -1,6 +1,8 @@ import { logger } from "@llmgateway/logger"; -import { startWorker, stopWorker } from "./worker"; +import { startWorker, stopWorker } from "./worker.js"; + +export { processLogQueue } from "./worker.js"; let isShuttingDown = false; diff --git a/apps/worker/src/log-processing.spec.ts b/apps/worker/src/log-processing.spec.ts index b780a87830..fd390feee7 100644 --- a/apps/worker/src/log-processing.spec.ts +++ b/apps/worker/src/log-processing.spec.ts @@ -2,7 +2,7 @@ import { afterAll, beforeEach, describe, expect, test } from "vitest"; import { db, tables, log, organization, project, apiKey } from "@llmgateway/db"; -import { batchProcessLogs } from "./worker"; +import { batchProcessLogs } from "./worker.js"; describe("Log Processing", () => { let testOrg: any; diff --git a/apps/worker/src/services/stats-calculator.spec.ts b/apps/worker/src/services/stats-calculator.spec.ts index 7caaec4430..73ea5a9941 100644 --- a/apps/worker/src/services/stats-calculator.spec.ts +++ b/apps/worker/src/services/stats-calculator.spec.ts @@ -19,7 +19,7 @@ import { calculateMinutelyHistory, calculateAggregatedStatistics, backfillHistoryIfNeeded, -} from "./stats-calculator"; +} from "./stats-calculator.js"; // Mock current time for consistent testing const mockDate = new Date("2024-01-01T12:30:00.000Z"); diff --git a/apps/worker/src/services/sync-models.spec.ts b/apps/worker/src/services/sync-models.spec.ts index 9e5a435c7f..eefcd0e6cd 100644 --- a/apps/worker/src/services/sync-models.spec.ts +++ b/apps/worker/src/services/sync-models.spec.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from "vitest"; import { db, provider, model, modelProviderMapping, eq } from "@llmgateway/db"; -import { syncProvidersAndModels } from "./sync-models"; +import { syncProvidersAndModels } from "./sync-models.js"; describe("sync-models", () => { beforeEach(async () => { diff --git a/apps/worker/src/worker.spec.ts b/apps/worker/src/worker.spec.ts index 59f1a2741d..e38b08f457 100644 --- a/apps/worker/src/worker.spec.ts +++ b/apps/worker/src/worker.spec.ts @@ -2,7 +2,7 @@ import { afterAll, beforeEach, describe, expect, test } from "vitest"; import { db, tables } from "@llmgateway/db"; -import { acquireLock } from "./worker"; +import { acquireLock } from "./worker.js"; describe("worker", () => { beforeEach(async () => { diff --git a/apps/worker/src/worker.ts b/apps/worker/src/worker.ts index 94fcb55f4f..b3ec207b34 100644 --- a/apps/worker/src/worker.ts +++ b/apps/worker/src/worker.ts @@ -27,8 +27,8 @@ import { calculateMinutelyHistory, calculateAggregatedStatistics, backfillHistoryIfNeeded, -} from "./services/stats-calculator"; -import { syncProvidersAndModels } from "./services/sync-models"; +} from "./services/stats-calculator.js"; +import { syncProvidersAndModels } from "./services/sync-models.js"; const stripe = new Stripe(process.env.STRIPE_SECRET_KEY || "sk_test_123", { apiVersion: "2025-04-30.basil", diff --git a/apps/worker/tsconfig.json b/apps/worker/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/apps/worker/tsconfig.json +++ b/apps/worker/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/apps/worker/tsup.config.ts b/apps/worker/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/apps/worker/tsup.config.ts +++ b/apps/worker/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/eslint.config.mjs b/eslint.config.mjs index 37e16c08d8..f082c3b610 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -45,7 +45,7 @@ export default [ "import/no-useless-path-segments": [ "error", { - noUselessIndex: true, + noUselessIndex: false, }, ], "import/order": [ diff --git a/package.json b/package.json index 277143ea54..8c38158fbb 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "private": true, "license": "SEE LICENSE IN LICENSE", "workspaces": [ - "apps/*", - "packages/*" + "packages/*", + "apps/*" ], "scripts": { "build": "TURBO_TOKEN=turbotokenoss turbo run build", @@ -49,6 +49,7 @@ "nodemon": "3.1.10", "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.6.14", + "resolve-tspaths": "0.8.23", "sort-package-json": "3.4.0", "tsup": "8.4.0", "tsx": "^4.19.4", diff --git a/packages/cache/package.json b/packages/cache/package.json index 2b5b47c25e..b587dec44f 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -13,7 +13,7 @@ "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc" + "build": "tsc && resolve-tspaths && resolve-tspaths" }, "dependencies": { "@llmgateway/db": "workspace:*", diff --git a/packages/cache/src/cache.ts b/packages/cache/src/cache.ts index 74ce9091e2..5851e81100 100644 --- a/packages/cache/src/cache.ts +++ b/packages/cache/src/cache.ts @@ -3,7 +3,7 @@ import crypto from "crypto"; import { db, type InferSelectModel } from "@llmgateway/db"; import { logger } from "@llmgateway/logger"; -import redisClient from "./redis"; +import { redisClient } from "./redis.js"; import type { tables } from "@llmgateway/db"; diff --git a/packages/cache/src/index.ts b/packages/cache/src/index.ts index 03a6d22fff..c016b3f59e 100644 --- a/packages/cache/src/index.ts +++ b/packages/cache/src/index.ts @@ -1,3 +1,2 @@ -export * from "./cache"; -export * from "./redis"; -export { default as redisClient } from "./redis"; +export * from "./cache.js"; +export * from "./redis.js"; diff --git a/packages/cache/src/redis.ts b/packages/cache/src/redis.ts index 6df7594dfb..a0b10089b9 100644 --- a/packages/cache/src/redis.ts +++ b/packages/cache/src/redis.ts @@ -1,8 +1,8 @@ -import Redis from "ioredis"; +import { Redis } from "ioredis"; import { logger } from "@llmgateway/logger"; -const redisClient = new Redis({ +export const redisClient = new Redis({ host: process.env.REDIS_HOST || "localhost", port: Number(process.env.REDIS_PORT) || 6379, password: process.env.REDIS_PASSWORD, @@ -51,5 +51,3 @@ export async function consumeFromQueue( throw error; } } - -export default redisClient; diff --git a/packages/cache/tsconfig.json b/packages/cache/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/packages/cache/tsconfig.json +++ b/packages/cache/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/packages/cache/tsup.config.ts b/packages/cache/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/packages/cache/tsup.config.ts +++ b/packages/cache/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/packages/db/logs.ts b/packages/db/logs.ts index fe3ed44a3e..28846add31 100644 --- a/packages/db/logs.ts +++ b/packages/db/logs.ts @@ -1,4 +1,4 @@ -import type { tables } from "./src"; +import type { tables } from "./src/index.js"; import type { InferInsertModel } from "drizzle-orm"; type Log = InferInsertModel; diff --git a/packages/db/package.json b/packages/db/package.json index 55820e9afe..95ee546e8a 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -16,7 +16,7 @@ "dist/" ], "scripts": { - "build": "tsc", + "build": "tsc && resolve-tspaths && resolve-tspaths", "generate": "pnpm drizzle-kit generate --config drizzle.config.ts", "migrate": "pnpm drizzle-kit migrate --config drizzle.config.ts", "push": "pnpm drizzle-kit push --force --config drizzle.config.ts", diff --git a/packages/db/seed.ts b/packages/db/seed.ts index 87412250c7..113a6a8a6d 100644 --- a/packages/db/seed.ts +++ b/packages/db/seed.ts @@ -1,7 +1,7 @@ import { randomUUID } from "crypto"; -import { logs } from "./logs"; -import { closeDatabase, db, tables } from "./src"; +import { logs } from "./logs.js"; +import { closeDatabase, db, tables } from "./src/index.js"; import type { PgTable } from "drizzle-orm/pg-core"; diff --git a/packages/db/src/db.ts b/packages/db/src/db.ts index ab16dacb44..668fe0965b 100644 --- a/packages/db/src/db.ts +++ b/packages/db/src/db.ts @@ -3,7 +3,7 @@ import { Client } from "pg"; import { logger } from "@llmgateway/logger"; -import { relations } from "./relations"; +import { relations } from "./relations.js"; const client = new Client({ connectionString: diff --git a/packages/db/src/index.ts b/packages/db/src/index.ts index 6cf388097c..f780197c68 100644 --- a/packages/db/src/index.ts +++ b/packages/db/src/index.ts @@ -1,9 +1,9 @@ -import * as schema from "./schema"; +import * as schema from "./schema.js"; -export * from "./db"; -export * from "./schema"; -export * from "./types"; -export * from "./migrate"; +export * from "./db.js"; +export * from "./schema.js"; +export * from "./types.js"; +export * from "./migrate.js"; export * from "drizzle-orm"; diff --git a/packages/db/src/relations.ts b/packages/db/src/relations.ts index 6e9d68092c..4cdada217b 100644 --- a/packages/db/src/relations.ts +++ b/packages/db/src/relations.ts @@ -1,6 +1,6 @@ import { defineRelations } from "drizzle-orm"; -import * as schema from "./schema"; +import * as schema from "./schema.js"; export const relations = defineRelations(schema, (r) => ({ user: { diff --git a/packages/db/src/schema.ts b/packages/db/src/schema.ts index fe532cd4ec..1a9d3ecaac 100644 --- a/packages/db/src/schema.ts +++ b/packages/db/src/schema.ts @@ -13,7 +13,7 @@ import { } from "drizzle-orm/pg-core"; import { customAlphabet } from "nanoid"; -import type { errorDetails, tools, toolChoice, toolResults } from "./types"; +import type { errorDetails, tools, toolChoice, toolResults } from "./types.js"; import type z from "zod"; export const UnifiedFinishReason = { diff --git a/packages/db/src/types.ts b/packages/db/src/types.ts index 89a160ae3b..3ac4347bb5 100644 --- a/packages/db/src/types.ts +++ b/packages/db/src/types.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -import type { tables } from "."; +import type { tables } from "./index.js"; import type { InferSelectModel, InferInsertModel } from "drizzle-orm"; export const errorDetails = z.object({ diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/packages/db/tsconfig.json +++ b/packages/db/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/packages/db/tsup.config.ts b/packages/db/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/packages/db/tsup.config.ts +++ b/packages/db/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/packages/instrumentation/package.json b/packages/instrumentation/package.json index 74629e6220..4ce0c68e34 100644 --- a/packages/instrumentation/package.json +++ b/packages/instrumentation/package.json @@ -13,7 +13,7 @@ "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc" + "build": "tsc && resolve-tspaths && resolve-tspaths" }, "dependencies": { "@google-cloud/opentelemetry-cloud-trace-exporter": "3.0.0", diff --git a/packages/instrumentation/src/index.spec.ts b/packages/instrumentation/src/index.spec.ts index 30293e20b5..1512ff94c2 100644 --- a/packages/instrumentation/src/index.spec.ts +++ b/packages/instrumentation/src/index.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi, beforeEach } from "vitest"; // Import after mocking (Vitest hoists vi.mock) -import { initializeInstrumentation } from "."; +import { initializeInstrumentation } from "./index.js"; // Mock the logger and OpenTelemetry modules vi.mock("@llmgateway/logger", () => ({ diff --git a/packages/instrumentation/tsconfig.json b/packages/instrumentation/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/packages/instrumentation/tsconfig.json +++ b/packages/instrumentation/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/packages/instrumentation/tsup.config.ts b/packages/instrumentation/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/packages/instrumentation/tsup.config.ts +++ b/packages/instrumentation/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/packages/logger/package.json b/packages/logger/package.json index 3b4104bd5e..9ecd6aefbd 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -13,7 +13,7 @@ "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc" + "build": "tsc && resolve-tspaths && resolve-tspaths" }, "dependencies": { "@opentelemetry/api": "1.9.0", diff --git a/packages/logger/src/logger.spec.ts b/packages/logger/src/logger.spec.ts index 3ea22a9113..cf004d295b 100644 --- a/packages/logger/src/logger.spec.ts +++ b/packages/logger/src/logger.spec.ts @@ -1,6 +1,6 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; -import { logger, createLogger } from "@/index"; +import { logger, createLogger } from "@/index.js"; describe("LLMGateway Logger", () => { beforeEach(() => { diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/packages/logger/tsup.config.ts b/packages/logger/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/packages/logger/tsup.config.ts +++ b/packages/logger/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/packages/models/package.json b/packages/models/package.json index acaf6e24d4..8aa7ebc70d 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -16,7 +16,7 @@ "dist/" ], "scripts": { - "build": "tsc" + "build": "tsc && resolve-tspaths && resolve-tspaths" }, "dependencies": { "@llmgateway/logger": "workspace:*" diff --git a/packages/models/src/get-cheapest-from-available-providers.ts b/packages/models/src/get-cheapest-from-available-providers.ts index ecea72753f..df109fe754 100644 --- a/packages/models/src/get-cheapest-from-available-providers.ts +++ b/packages/models/src/get-cheapest-from-available-providers.ts @@ -1,4 +1,4 @@ -import type { AvailableModelProvider, ModelWithPricing } from "./types"; +import type { AvailableModelProvider, ModelWithPricing } from "./types.js"; /** * Get the cheapest provider and model from a list of available model providers diff --git a/packages/models/src/get-cheapest-model-for-provider.ts b/packages/models/src/get-cheapest-model-for-provider.ts index 3490e7d6e8..ea7fc9e477 100644 --- a/packages/models/src/get-cheapest-model-for-provider.ts +++ b/packages/models/src/get-cheapest-model-for-provider.ts @@ -1,6 +1,6 @@ -import { models } from "./models"; +import { models } from "./models.js"; -import type { ProviderId } from "./providers"; +import type { ProviderId } from "./providers.js"; /** * Get the cheapest model for a given provider based on input + output pricing diff --git a/packages/models/src/get-provider-endpoint.ts b/packages/models/src/get-provider-endpoint.ts index 7c50d1518c..cc29ef8b85 100644 --- a/packages/models/src/get-provider-endpoint.ts +++ b/packages/models/src/get-provider-endpoint.ts @@ -1,6 +1,6 @@ -import { models, type ProviderModelMapping } from "./models"; +import { models, type ProviderModelMapping } from "./models.js"; -import type { ProviderId } from "./providers"; +import type { ProviderId } from "./providers.js"; /** * Get the endpoint URL for a provider API call diff --git a/packages/models/src/get-provider-headers.ts b/packages/models/src/get-provider-headers.ts index 1ee13e47cb..3b354ef293 100644 --- a/packages/models/src/get-provider-headers.ts +++ b/packages/models/src/get-provider-headers.ts @@ -1,4 +1,4 @@ -import type { ProviderId } from "./providers"; +import type { ProviderId } from "./providers.js"; /** * Get the appropriate headers for a given provider API call diff --git a/packages/models/src/helpers.ts b/packages/models/src/helpers.ts index da9a22c9bd..9c73c93794 100644 --- a/packages/models/src/helpers.ts +++ b/packages/models/src/helpers.ts @@ -1,5 +1,5 @@ -import { models, type ProviderModelMapping } from "./models"; -import { providers } from "./providers"; +import { models, type ProviderModelMapping } from "./models.js"; +import { providers } from "./providers.js"; /** * Check if a specific model and provider combination supports streaming diff --git a/packages/models/src/index.ts b/packages/models/src/index.ts index 63556ff62b..1bfa24be79 100644 --- a/packages/models/src/index.ts +++ b/packages/models/src/index.ts @@ -1,15 +1,16 @@ -export * from "./models"; -export * from "./provider"; -export * from "./providers"; -export * from "./types"; -export * from "./type-guards"; -export * from "./helpers"; -export * from "./transform-anthropic-messages"; -export * from "./process-image-url"; -export * from "./transform-google-messages"; -export * from "./get-provider-headers"; -export * from "./prepare-request-body"; -export * from "./get-provider-endpoint"; -export * from "./get-cheapest-from-available-providers"; -export * from "./validate-provider-key"; -export * from "./get-cheapest-model-for-provider"; +export * from "./testing.js"; +export * from "./models.js"; +export * from "./provider.js"; +export * from "./providers.js"; +export * from "./types.js"; +export * from "./type-guards.js"; +export * from "./helpers.js"; +export * from "./transform-anthropic-messages.js"; +export * from "./process-image-url.js"; +export * from "./transform-google-messages.js"; +export * from "./get-provider-headers.js"; +export * from "./prepare-request-body.js"; +export * from "./get-provider-endpoint.js"; +export * from "./get-cheapest-from-available-providers.js"; +export * from "./validate-provider-key.js"; +export * from "./get-cheapest-model-for-provider.js"; diff --git a/packages/models/src/models.spec.ts b/packages/models/src/models.spec.ts index 87a7b94d26..7f378c8c4f 100644 --- a/packages/models/src/models.spec.ts +++ b/packages/models/src/models.spec.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from "vitest"; -import { getCheapestModelForProvider } from "./get-cheapest-model-for-provider"; -import { models } from "./models"; -import { prepareRequestBody } from "./prepare-request-body"; +import { getCheapestModelForProvider } from "./get-cheapest-model-for-provider.js"; +import { models } from "./models.js"; +import { prepareRequestBody } from "./prepare-request-body.js"; -import type { BaseMessage, OpenAIRequestBody } from "./types"; +import type { BaseMessage, OpenAIRequestBody } from "./types.js"; describe("Models", () => { it("should not have duplicate model IDs", () => { diff --git a/packages/models/src/models.ts b/packages/models/src/models.ts index a0fd027245..f6b6da8bfa 100644 --- a/packages/models/src/models.ts +++ b/packages/models/src/models.ts @@ -1,20 +1,20 @@ -import { alibabaModels } from "./models/alibaba"; -import { anthropicModels } from "./models/anthropic"; -import { deepseekModels } from "./models/deepseek"; -import { googleModels } from "./models/google"; -import { llmgatewayModels } from "./models/llmgateway"; -import { metaModels } from "./models/meta"; -import { microsoftModels } from "./models/microsoft"; -import { mistralModels } from "./models/mistral"; -import { moonshotModels } from "./models/moonshot"; -import { nousresearchModels } from "./models/nousresearch"; -import { openaiModels } from "./models/openai"; -import { perplexityModels } from "./models/perplexity"; -import { routewayModels } from "./models/routeway"; -import { xaiModels } from "./models/xai"; -import { zaiModels } from "./models/zai"; +import { alibabaModels } from "./models/alibaba.js"; +import { anthropicModels } from "./models/anthropic.js"; +import { deepseekModels } from "./models/deepseek.js"; +import { googleModels } from "./models/google.js"; +import { llmgatewayModels } from "./models/llmgateway.js"; +import { metaModels } from "./models/meta.js"; +import { microsoftModels } from "./models/microsoft.js"; +import { mistralModels } from "./models/mistral.js"; +import { moonshotModels } from "./models/moonshot.js"; +import { nousresearchModels } from "./models/nousresearch.js"; +import { openaiModels } from "./models/openai.js"; +import { perplexityModels } from "./models/perplexity.js"; +import { routewayModels } from "./models/routeway.js"; +import { xaiModels } from "./models/xai.js"; +import { zaiModels } from "./models/zai.js"; -import type { providers } from "./providers"; +import type { providers } from "./providers.js"; export type Provider = (typeof providers)[number]["id"]; diff --git a/packages/models/src/models/alibaba.ts b/packages/models/src/models/alibaba.ts index fc40ddfc49..d9f4759c32 100644 --- a/packages/models/src/models/alibaba.ts +++ b/packages/models/src/models/alibaba.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const alibabaModels = [ { diff --git a/packages/models/src/models/anthropic.ts b/packages/models/src/models/anthropic.ts index c0bf8dd11f..5513162ff6 100644 --- a/packages/models/src/models/anthropic.ts +++ b/packages/models/src/models/anthropic.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const anthropicModels = [ { diff --git a/packages/models/src/models/deepseek.ts b/packages/models/src/models/deepseek.ts index 9ec810129a..4b44cf337a 100644 --- a/packages/models/src/models/deepseek.ts +++ b/packages/models/src/models/deepseek.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const deepseekModels = [ { diff --git a/packages/models/src/models/google.ts b/packages/models/src/models/google.ts index aadcacdd46..f70a86a4fc 100644 --- a/packages/models/src/models/google.ts +++ b/packages/models/src/models/google.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const googleModels = [ { diff --git a/packages/models/src/models/llmgateway.ts b/packages/models/src/models/llmgateway.ts index a123ed10d3..2b0829c158 100644 --- a/packages/models/src/models/llmgateway.ts +++ b/packages/models/src/models/llmgateway.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const llmgatewayModels = [ { diff --git a/packages/models/src/models/meta.ts b/packages/models/src/models/meta.ts index 0fb08c5b26..ece6c94e77 100644 --- a/packages/models/src/models/meta.ts +++ b/packages/models/src/models/meta.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const metaModels = [ { diff --git a/packages/models/src/models/microsoft.ts b/packages/models/src/models/microsoft.ts index 0dabc6fa73..732b600aa3 100644 --- a/packages/models/src/models/microsoft.ts +++ b/packages/models/src/models/microsoft.ts @@ -1,3 +1,3 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const microsoftModels = [] as const satisfies ModelDefinition[]; diff --git a/packages/models/src/models/mistral.ts b/packages/models/src/models/mistral.ts index e814adb87f..d42d4111d5 100644 --- a/packages/models/src/models/mistral.ts +++ b/packages/models/src/models/mistral.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const mistralModels = [ { diff --git a/packages/models/src/models/moonshot.ts b/packages/models/src/models/moonshot.ts index 9e67d02ffe..a337b94f5c 100644 --- a/packages/models/src/models/moonshot.ts +++ b/packages/models/src/models/moonshot.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const moonshotModels = [ { diff --git a/packages/models/src/models/nousresearch.ts b/packages/models/src/models/nousresearch.ts index 4ad30a3bb4..6fbc608bc9 100644 --- a/packages/models/src/models/nousresearch.ts +++ b/packages/models/src/models/nousresearch.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const nousresearchModels = [ { diff --git a/packages/models/src/models/openai.ts b/packages/models/src/models/openai.ts index 82d9465b0b..a4b760eb77 100644 --- a/packages/models/src/models/openai.ts +++ b/packages/models/src/models/openai.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const openaiModels = [ { diff --git a/packages/models/src/models/perplexity.ts b/packages/models/src/models/perplexity.ts index 03d459431c..fa2a1088f5 100644 --- a/packages/models/src/models/perplexity.ts +++ b/packages/models/src/models/perplexity.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const perplexityModels = [ { diff --git a/packages/models/src/models/routeway.ts b/packages/models/src/models/routeway.ts index c50614728f..564afe0782 100644 --- a/packages/models/src/models/routeway.ts +++ b/packages/models/src/models/routeway.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const routewayModels = [ { diff --git a/packages/models/src/models/xai.ts b/packages/models/src/models/xai.ts index cdef75f3f4..9d80740378 100644 --- a/packages/models/src/models/xai.ts +++ b/packages/models/src/models/xai.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const xaiModels = [ { diff --git a/packages/models/src/models/zai.ts b/packages/models/src/models/zai.ts index 6825ee4676..2ae6a84b58 100644 --- a/packages/models/src/models/zai.ts +++ b/packages/models/src/models/zai.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models"; +import type { ModelDefinition } from "@/models.js"; export const zaiModels = [ { diff --git a/packages/models/src/prepare-request-body.ts b/packages/models/src/prepare-request-body.ts index 485cb16636..f22c9659c8 100644 --- a/packages/models/src/prepare-request-body.ts +++ b/packages/models/src/prepare-request-body.ts @@ -2,11 +2,11 @@ import { type ModelDefinition, models, type ProviderModelMapping, -} from "./models"; -import { transformAnthropicMessages } from "./transform-anthropic-messages"; -import { transformGoogleMessages } from "./transform-google-messages"; +} from "./models.js"; +import { transformAnthropicMessages } from "./transform-anthropic-messages.js"; +import { transformGoogleMessages } from "./transform-google-messages.js"; -import type { ProviderId } from "./providers"; +import type { ProviderId } from "./providers.js"; import type { BaseMessage, FunctionParameter, @@ -15,7 +15,7 @@ import type { OpenAIToolInput, ProviderRequestBody, ToolChoiceType, -} from "./types"; +} from "./types.js"; /** * Transforms messages for models that don't support system roles by converting system messages to user messages diff --git a/packages/models/src/provider.ts b/packages/models/src/provider.ts index 08156c7f71..6d7513d3f3 100644 --- a/packages/models/src/provider.ts +++ b/packages/models/src/provider.ts @@ -1,4 +1,4 @@ -import type { Provider } from "."; +import type { Provider } from "./index.js"; export const providerEnvVarMap: Record = { llmgateway: "LLMGATEWAY_API_KEY", diff --git a/packages/models/src/testing.ts b/packages/models/src/testing.ts new file mode 100644 index 0000000000..33d1e868e7 --- /dev/null +++ b/packages/models/src/testing.ts @@ -0,0 +1,32 @@ +import { models } from "@/models.js"; + +import type { ProviderModelMapping } from "@/models.js"; +import type { TestOptions } from "vitest"; + +/** + * Helper function to get test options with retry for CI environment + */ +export function getTestOptions( + opts: { completions?: boolean } = { + completions: true, + }, +): TestOptions { + const hasTestOnly = models.some((model) => + model.providers.some( + (provider: ProviderModelMapping) => provider.test === "only", + ), + ); + return process.env.CI || opts?.completions + ? { retry: 3 } + : { skip: hasTestOnly || !!process.env.TEST_MODELS }; +} + +/** + * Helper function to get concurrent test options with retry for CI environment + * @returns TestOptions with concurrent: true and CI retry configuration + */ +export function getConcurrentTestOptions(opts?: { + completions?: boolean; +}): TestOptions { + return { concurrent: true, ...getTestOptions(opts) }; +} diff --git a/packages/models/src/transform-anthropic-messages.ts b/packages/models/src/transform-anthropic-messages.ts index 7bc8271562..917816feb9 100644 --- a/packages/models/src/transform-anthropic-messages.ts +++ b/packages/models/src/transform-anthropic-messages.ts @@ -1,6 +1,6 @@ import { logger } from "@llmgateway/logger"; -import { processImageUrl } from "./process-image-url"; +import { processImageUrl } from "./process-image-url.js"; import { type AnthropicMessage, type BaseMessage, @@ -10,7 +10,7 @@ import { type TextContent, type ToolResultContent, type ToolUseContent, -} from "./types"; +} from "./types.js"; /** * Transforms Anthropic messages diff --git a/packages/models/src/transform-google-messages.ts b/packages/models/src/transform-google-messages.ts index 09aa4660e0..814d0c1a6c 100644 --- a/packages/models/src/transform-google-messages.ts +++ b/packages/models/src/transform-google-messages.ts @@ -1,11 +1,11 @@ -import { processImageUrl } from "./process-image-url"; +import { processImageUrl } from "./process-image-url.js"; import { type BaseMessage, type GoogleMessage, isImageUrlContent, isTextContent, type MessageContent, -} from "./types"; +} from "./types.js"; /** * Transforms Google messages to handle image URLs by converting them to base64 diff --git a/packages/models/src/type-guards.ts b/packages/models/src/type-guards.ts index b5aad271ec..d653c4ab01 100644 --- a/packages/models/src/type-guards.ts +++ b/packages/models/src/type-guards.ts @@ -3,7 +3,7 @@ * These functions provide type-safe runtime validation */ -import type { ProviderModelMapping } from "./models"; +import type { ProviderModelMapping } from "./models.js"; /** * Checks if an object has the required properties of a ProviderModelMapping diff --git a/packages/models/src/types.ts b/packages/models/src/types.ts index aa3df3875e..05f8ca3f81 100644 --- a/packages/models/src/types.ts +++ b/packages/models/src/types.ts @@ -2,7 +2,7 @@ * Comprehensive TypeScript types for provider API messages and tool definitions */ -import type { ProviderId } from "./providers"; +import type { ProviderId } from "./providers.js"; // Base content types export interface TextContent { diff --git a/packages/models/src/validate-provider-key.ts b/packages/models/src/validate-provider-key.ts index 43d9707918..88d595c0f3 100644 --- a/packages/models/src/validate-provider-key.ts +++ b/packages/models/src/validate-provider-key.ts @@ -1,13 +1,13 @@ import { logger } from "@llmgateway/logger"; -import { getCheapestModelForProvider } from "./get-cheapest-model-for-provider"; -import { getProviderEndpoint } from "./get-provider-endpoint"; -import { getProviderHeaders } from "./get-provider-headers"; -import { models, type ProviderModelMapping } from "./models"; -import { prepareRequestBody } from "./prepare-request-body"; - -import type { ProviderId } from "./providers"; -import type { BaseMessage, ProviderValidationResult } from "./types"; +import { getCheapestModelForProvider } from "./get-cheapest-model-for-provider.js"; +import { getProviderEndpoint } from "./get-provider-endpoint.js"; +import { getProviderHeaders } from "./get-provider-headers.js"; +import { models, type ProviderModelMapping } from "./models.js"; +import { prepareRequestBody } from "./prepare-request-body.js"; + +import type { ProviderId } from "./providers.js"; +import type { BaseMessage, ProviderValidationResult } from "./types.js"; /** * Validate a provider API key by making a minimal request diff --git a/packages/models/tsconfig.json b/packages/models/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/packages/models/tsconfig.json +++ b/packages/models/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/packages/models/tsup.config.ts b/packages/models/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/packages/models/tsup.config.ts +++ b/packages/models/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/packages/shared/package.json b/packages/shared/package.json index d0f6a56529..54d5169374 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -16,7 +16,7 @@ "dist/" ], "scripts": { - "build": "tsc" + "build": "tsc && resolve-tspaths && resolve-tspaths" }, "dependencies": { "zod": "3.25.75" diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 25cd3c488d..f885cce2f2 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "./dist/", "paths": { "@/*": ["./src/*"] diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts index 759c9786c1..bdddc82b93 100644 --- a/packages/shared/tsup.config.ts +++ b/packages/shared/tsup.config.ts @@ -1,3 +1,3 @@ -import { tsup } from "../../tsup.config"; +import { tsup } from "../../tsup.config.js"; export { tsup }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b378844fb..410761c0b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,6 +66,9 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.6.14 version: 0.6.14(prettier@3.6.2) + resolve-tspaths: + specifier: 0.8.23 + version: 0.8.23(typescript@5.9.2) sort-package-json: specifier: 3.4.0 version: 3.4.0 @@ -189,7 +192,7 @@ importers: version: 15.6.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.12) gateway: specifier: workspace:* - version: file:apps/gateway(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3) + version: link:../gateway lucide-react: specifier: ^0.539.0 version: 0.539.0(react@19.1.1) @@ -293,6 +296,9 @@ importers: redis: specifier: 5.8.2 version: 5.8.2 + worker: + specifier: workspace:* + version: link:../worker zod: specifier: 3.25.75 version: 3.25.75 @@ -2138,21 +2144,6 @@ packages: '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} - '@llmgateway/cache@file:packages/cache': - resolution: {directory: packages/cache, type: directory} - - '@llmgateway/db@file:packages/db': - resolution: {directory: packages/db, type: directory} - - '@llmgateway/instrumentation@file:packages/instrumentation': - resolution: {directory: packages/instrumentation, type: directory} - - '@llmgateway/logger@file:packages/logger': - resolution: {directory: packages/logger, type: directory} - - '@llmgateway/models@file:packages/models': - resolution: {directory: packages/models, type: directory} - '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} @@ -4850,6 +4841,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@13.0.0: resolution: {integrity: sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==} engines: {node: '>=18'} @@ -5640,6 +5635,10 @@ packages: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -5929,9 +5928,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gateway@file:apps/gateway: - resolution: {directory: apps/gateway, type: directory} - gaxios@6.7.1: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} @@ -7695,6 +7691,12 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-tspaths@0.8.23: + resolution: {integrity: sha512-VMZPjXnYLHnNHXOmJ9Unkkls08zDc+0LSBUo8Rp+SKzRt8rfD9dMpBudQJ5PNG8Szex/fnwdNKzd7rqipIH/zg==} + hasBin: true + peerDependencies: + typescript: '>=3.0.3' + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -9746,7 +9748,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9760,7 +9762,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -10052,105 +10054,6 @@ snapshots: '@levischuck/tiny-cbor@0.2.11': {} - '@llmgateway/cache@file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': - dependencies: - '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/logger': file:packages/logger - ioredis: 5.7.0 - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@vercel/postgres' - - '@xata.io/client' - - better-sqlite3 - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - pg-native - - postgres - - prisma - - sql.js - - sqlite3 - - supports-color - - '@llmgateway/db@file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': - dependencies: - '@llmgateway/logger': file:packages/logger - drizzle-orm: 1.0.0-beta.1-7946562(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(pg@8.16.3) - nanoid: 5.1.5 - pg: 8.16.3 - zod: 3.25.75 - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@vercel/postgres' - - '@xata.io/client' - - better-sqlite3 - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - pg-native - - postgres - - prisma - - sql.js - - sqlite3 - - '@llmgateway/instrumentation@file:packages/instrumentation': - dependencies: - '@google-cloud/opentelemetry-cloud-trace-exporter': 3.0.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)) - '@google-cloud/opentelemetry-cloud-trace-propagator': 0.21.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) - '@llmgateway/logger': file:packages/logger - '@opentelemetry/api': 1.9.0 - '@opentelemetry/auto-instrumentations-node': 0.64.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - hono: 4.9.7 - transitivePeerDependencies: - - encoding - - supports-color - - '@llmgateway/logger@file:packages/logger': - dependencies: - '@opentelemetry/api': 1.9.0 - pino: 9.9.0 - pino-pretty: 13.1.1 - - '@llmgateway/models@file:packages/models': - dependencies: - '@llmgateway/logger': file:packages/logger - '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: '@types/estree': 1.0.8 @@ -12723,7 +12626,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -12733,7 +12636,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12752,7 +12655,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 @@ -12767,7 +12670,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13288,6 +13191,8 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@12.1.0: {} + commander@13.0.0: {} commander@13.1.0: {} @@ -13444,6 +13349,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + debug@4.4.1(supports-color@10.0.0): dependencies: ms: 2.1.3 @@ -13704,7 +13613,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.19.12): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 esbuild: 0.19.12 transitivePeerDependencies: - supports-color @@ -13906,7 +13815,7 @@ snapshots: eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 @@ -14026,7 +13935,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -14125,6 +14034,14 @@ snapshots: fast-equals@5.2.2: {} + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14454,67 +14371,6 @@ snapshots: functions-have-names@1.2.3: {} - gateway@file:apps/gateway(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3): - dependencies: - '@hono/node-server': 1.19.0(hono@4.9.7) - '@hono/swagger-ui': 0.5.1(hono@4.9.7) - '@hono/zod-openapi': 0.19.8(hono@4.9.7)(zod@3.25.75) - '@hono/zod-validator': 0.7.2(hono@4.9.7)(zod@3.25.75) - '@llmgateway/cache': file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/instrumentation': file:packages/instrumentation - '@llmgateway/logger': file:packages/logger - '@llmgateway/models': file:packages/models - '@opentelemetry/api': 1.9.0 - '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) - gpt-tokenizer: 3.0.1 - hono: 4.9.7 - hono-openapi: 0.4.8(@hono/zod-validator@0.7.2(hono@4.9.7)(zod@3.25.75))(hono@4.9.7)(openapi-types@12.1.3)(zod-openapi@4.2.4(zod@3.25.75))(zod@3.25.75) - ioredis: 5.6.1 - redis: 5.8.2 - zod: 3.25.75 - zod-openapi: 4.2.4(zod@3.25.75) - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@hono/arktype-validator' - - '@hono/effect-validator' - - '@hono/typebox-validator' - - '@hono/valibot-validator' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@planetscale/database' - - '@prisma/client' - - '@sinclair/typebox' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@valibot/to-json-schema' - - '@vercel/postgres' - - '@xata.io/client' - - arktype - - better-sqlite3 - - bun-types - - effect - - encoding - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - openapi-types - - pg-native - - postgres - - prisma - - sql.js - - sqlite3 - - supports-color - - valibot - gaxios@6.7.1: dependencies: extend: 3.0.2 @@ -14538,7 +14394,7 @@ snapshots: gel@2.1.0: dependencies: '@petamoriken/float16': 3.9.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 env-paths: 3.0.0 semver: 7.7.2 shell-quote: 1.8.3 @@ -14801,7 +14657,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -14856,7 +14712,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -14870,7 +14726,7 @@ snapshots: dependencies: '@ioredis/commands': 1.3.1 cluster-key-slot: 1.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -15196,7 +15052,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 @@ -15717,7 +15573,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16547,7 +16403,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -16559,6 +16415,13 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve-tspaths@0.8.23(typescript@5.9.2): + dependencies: + ansi-colors: 4.1.3 + commander: 12.1.0 + fast-glob: 3.3.2 + typescript: 5.9.2 + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -17147,7 +17010,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 esbuild: 0.25.9 joycon: 3.1.1 picocolors: 1.1.1 @@ -17391,7 +17254,7 @@ snapshots: vite-node@3.2.3(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.3.6(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1) @@ -17465,7 +17328,7 @@ snapshots: '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 chai: 5.2.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 From 25b14d52262c1a9243d69d2959b341c23debc381 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 00:46:31 +0100 Subject: [PATCH 08/21] chore(build): remove tsup and related configs Removed `tsup` usage across all packages and deleted its configurations. Adjusted package.json and lockfile to remove `tsup` as a dependency. --- apps/api/tsup.config.ts | 3 - apps/gateway/tsup.config.ts | 3 - apps/worker/tsup.config.ts | 3 - package.json | 1 - packages/cache/tsup.config.ts | 3 - packages/db/tsup.config.ts | 3 - packages/instrumentation/tsup.config.ts | 3 - packages/logger/tsup.config.ts | 3 - packages/models/tsup.config.ts | 3 - packages/shared/tsup.config.ts | 3 - pnpm-lock.yaml | 257 ++---------------------- tsup.config.ts | 21 -- 12 files changed, 12 insertions(+), 294 deletions(-) delete mode 100644 apps/api/tsup.config.ts delete mode 100644 apps/gateway/tsup.config.ts delete mode 100644 apps/worker/tsup.config.ts delete mode 100644 packages/cache/tsup.config.ts delete mode 100644 packages/db/tsup.config.ts delete mode 100644 packages/instrumentation/tsup.config.ts delete mode 100644 packages/logger/tsup.config.ts delete mode 100644 packages/models/tsup.config.ts delete mode 100644 packages/shared/tsup.config.ts delete mode 100644 tsup.config.ts diff --git a/apps/api/tsup.config.ts b/apps/api/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/apps/api/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/apps/gateway/tsup.config.ts b/apps/gateway/tsup.config.ts deleted file mode 100644 index 759c9786c1..0000000000 --- a/apps/gateway/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config"; - -export { tsup }; diff --git a/apps/worker/tsup.config.ts b/apps/worker/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/apps/worker/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/package.json b/package.json index 8c38158fbb..c5d3668fc1 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "prettier-plugin-tailwindcss": "^0.6.14", "resolve-tspaths": "0.8.23", "sort-package-json": "3.4.0", - "tsup": "8.4.0", "tsx": "^4.19.4", "turbo": "^2.5.6", "typescript": "5.9.2", diff --git a/packages/cache/tsup.config.ts b/packages/cache/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/packages/cache/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/packages/db/tsup.config.ts b/packages/db/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/packages/db/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/packages/instrumentation/tsup.config.ts b/packages/instrumentation/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/packages/instrumentation/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/packages/logger/tsup.config.ts b/packages/logger/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/packages/logger/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/packages/models/tsup.config.ts b/packages/models/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/packages/models/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts deleted file mode 100644 index bdddc82b93..0000000000 --- a/packages/shared/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { tsup } from "../../tsup.config.js"; - -export { tsup }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 410761c0b5..a0a24ba8ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,9 +72,6 @@ importers: sort-package-json: specifier: 3.4.0 version: 3.4.0 - tsup: - specifier: 8.4.0 - version: 8.4.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.19.4)(typescript@5.9.2)(yaml@2.8.1) tsx: specifier: ^4.19.4 version: 4.19.4 @@ -2691,10 +2688,6 @@ packages: '@petamoriken/float16@3.9.2': resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@posthog/core@1.0.2': resolution: {integrity: sha512-hWk3rUtJl2crQK0WNmwg13n82hnTwB99BT99/XI5gZSvIlYZ1TPmMZE8H2dhJJ98J/rm9vYJ/UXNzw3RV5HTpQ==} @@ -4544,9 +4537,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4681,12 +4671,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - c12@2.0.1: resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} peerDependencies: @@ -4856,10 +4840,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commitlint@19.8.1: resolution: {integrity: sha512-j7jojdmHrVOZ16gnjK2nbQuzdwA9TpxS9iNb9Q9QS3ytgt3JZVIGmsNbCuhmnsJWGspotlQ34yH8n1HvIKImiQ==} engines: {node: '>=v18'} @@ -5998,10 +5978,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - glob@11.0.2: resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} engines: {node: 20 || >=22} @@ -6401,9 +6377,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.0: resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} engines: {node: 20 || >=22} @@ -6587,10 +6560,6 @@ packages: resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -6626,9 +6595,6 @@ packages: lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -6658,9 +6624,6 @@ packages: loupe@3.1.4: resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} @@ -6950,9 +6913,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nano-spawn@1.0.2: resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} engines: {node: '>=20.17'} @@ -7206,10 +7166,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -7295,10 +7251,6 @@ packages: resolution: {integrity: sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ==} hasBin: true - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -7310,24 +7262,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} @@ -7895,11 +7829,6 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -8026,11 +7955,6 @@ packages: babel-plugin-macros: optional: true - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - supports-color@10.0.0: resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} engines: {node: '>=18'} @@ -8092,13 +8016,6 @@ packages: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -8148,9 +8065,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -8167,9 +8081,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfck@3.1.5: resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} engines: {node: ^18 || >=20} @@ -8186,25 +8097,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - tsx@4.19.4: resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} engines: {node: '>=18.0.0'} @@ -8505,15 +8397,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -9748,7 +9634,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9762,7 +9648,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -10025,7 +9911,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} @@ -10046,7 +9932,6 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - optional: true '@js-sdsl/ordered-map@4.4.2': {} @@ -10839,9 +10724,6 @@ snapshots: '@petamoriken/float16@3.9.2': {} - '@pkgjs/parseargs@0.11.0': - optional: true - '@posthog/core@1.0.2': {} '@protobufjs/aspromise@1.1.2': {} @@ -12626,7 +12508,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -12636,7 +12518,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12655,7 +12537,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 @@ -12670,7 +12552,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12854,8 +12736,6 @@ snapshots: ansi-styles@6.2.1: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -13032,11 +12912,6 @@ snapshots: buffer-from@1.1.2: {} - bundle-require@5.1.0(esbuild@0.25.9): - dependencies: - esbuild: 0.25.9 - load-tsconfig: 0.2.5 - c12@2.0.1(magicast@0.3.5): dependencies: chokidar: 4.0.3 @@ -13200,8 +13075,6 @@ snapshots: commander@2.20.3: optional: true - commander@4.1.1: {} - commitlint@19.8.1(@types/node@24.3.3)(typescript@5.9.2): dependencies: '@commitlint/cli': 19.8.1(@types/node@24.3.3)(typescript@5.9.2) @@ -13815,7 +13688,7 @@ snapshots: eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)): dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 @@ -13935,7 +13808,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -14470,15 +14343,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@11.0.2: dependencies: foreground-child: 3.3.1 @@ -14902,12 +14766,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.0: dependencies: '@isaacs/cliui': 8.0.2 @@ -15052,7 +14910,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 @@ -15072,8 +14930,6 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 - load-tsconfig@0.2.5: {} - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -15100,8 +14956,6 @@ snapshots: lodash.snakecase@4.1.1: {} - lodash.sortby@4.7.0: {} - lodash.startcase@4.4.0: {} lodash.uniq@4.5.0: {} @@ -15128,8 +14982,6 @@ snapshots: loupe@3.1.4: {} - lru-cache@10.4.3: {} - lru-cache@11.1.0: {} lucide-react@0.488.0(react@19.1.1): @@ -15669,12 +15521,6 @@ snapshots: ms@2.1.3: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nano-spawn@1.0.2: {} nanoid@3.3.11: {} @@ -15930,11 +15776,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - path-scurry@2.0.0: dependencies: lru-cache: 11.1.0 @@ -16029,8 +15870,6 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 - pirates@4.0.7: {} - pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -16041,15 +15880,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.19.4)(yaml@2.8.1): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 2.5.1 - postcss: 8.5.6 - tsx: 4.19.4 - yaml: 2.8.1 - postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 @@ -16724,10 +16554,6 @@ snapshots: source-map@0.7.4: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} split2@4.2.0: {} @@ -16859,16 +16685,6 @@ snapshots: client-only: 0.0.1 react: 19.1.1 - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 - supports-color@10.0.0: {} supports-color@5.5.0: @@ -16929,14 +16745,6 @@ snapshots: text-extensions@2.4.0: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - thread-stream@3.1.0: dependencies: real-require: 0.2.0 @@ -16975,10 +16783,6 @@ snapshots: tr46@0.0.3: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -16989,8 +16793,6 @@ snapshots: dependencies: typescript: 5.9.2 - ts-interface-checker@0.1.13: {} - tsconfck@3.1.5(typescript@5.9.2): optionalDependencies: typescript: 5.9.2 @@ -17004,33 +16806,6 @@ snapshots: tslib@2.8.1: {} - tsup@8.4.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.19.4)(typescript@5.9.2)(yaml@2.8.1): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.9) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.1 - esbuild: 0.25.9 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.19.4)(yaml@2.8.1) - resolve-from: 5.0.0 - rollup: 4.50.1 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.6 - typescript: 5.9.2 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tsx@4.19.4: dependencies: esbuild: 0.25.4 @@ -17254,7 +17029,7 @@ snapshots: vite-node@3.2.3(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.3.6(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1) @@ -17328,7 +17103,7 @@ snapshots: '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 chai: 5.2.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 @@ -17363,19 +17138,11 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 diff --git a/tsup.config.ts b/tsup.config.ts deleted file mode 100644 index 92cdb78658..0000000000 --- a/tsup.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { fixExtensionsPlugin } from "esbuild-fix-imports-plugin"; -import { defineConfig } from "tsup"; - -export const tsup = defineConfig({ - splitting: true, - clean: true, - dts: true, - format: ["esm"], - bundle: true, - minify: false, - entry: ["src/**/!(*.spec|*.e2e).ts"], - sourcemap: true, - target: "esnext", - esbuildPlugins: [ - fixExtensionsPlugin(), // https://github.com/egoist/tsup/issues/953#issuecomment-2434492992 - ], - banner: { - // fix dynamic require for now - js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`, - }, -}); From 008fc720204281c3aeb23ee84c4e181db1c95ff5 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 00:57:51 +0100 Subject: [PATCH 09/21] chore(deps): update dependencies and add formatting scripts Added `dotenv` library to `apps/api` dependencies. Replaced `@steebchen/lint-next` with `@steebchen/lint-base` and removed unnecessary packages from `pnpm-lock.yaml`. Added `format` and `lint` scripts to package.json files for consistent code formatting. Updated some dependency resolutions in the lockfile for better compatibility. --- apps/api/eslint.config.mjs | 5 + apps/api/package.json | 3 + apps/api/src/scripts/generate-openapi.ts | 2 +- apps/docs/eslint.config.mjs | 5 + apps/docs/package.json | 2 + apps/gateway/eslint.config.mjs | 5 + apps/gateway/package.json | 6 +- apps/ui/eslint.config.mjs | 5 + apps/ui/package.json | 2 + apps/ui/src/app/blog/[slug]/page.tsx | 3 +- apps/ui/src/app/changelog/[slug]/page.tsx | 3 +- apps/worker/eslint.config.mjs | 5 + apps/worker/package.json | 2 + eslint.config.mjs | 3 +- package.json | 4 +- packages/cache/eslint.config.mjs | 5 + packages/cache/package.json | 4 +- packages/db/eslint.config.mjs | 5 + packages/db/package.json | 2 + packages/instrumentation/eslint.config.mjs | 5 + packages/instrumentation/package.json | 4 +- packages/logger/eslint.config.mjs | 5 + packages/logger/package.json | 4 +- packages/models/eslint.config.mjs | 5 + packages/models/package.json | 4 +- packages/models/src/models/anthropic.ts | 2 +- packages/shared/eslint.config.mjs | 5 + packages/shared/package.json | 4 +- pnpm-lock.yaml | 139 +++++---------------- turbo.json | 1 + 30 files changed, 125 insertions(+), 124 deletions(-) create mode 100644 apps/api/eslint.config.mjs create mode 100644 apps/docs/eslint.config.mjs create mode 100644 apps/gateway/eslint.config.mjs create mode 100644 apps/ui/eslint.config.mjs create mode 100644 apps/worker/eslint.config.mjs create mode 100644 packages/cache/eslint.config.mjs create mode 100644 packages/db/eslint.config.mjs create mode 100644 packages/instrumentation/eslint.config.mjs create mode 100644 packages/logger/eslint.config.mjs create mode 100644 packages/models/eslint.config.mjs create mode 100644 packages/shared/eslint.config.mjs diff --git a/apps/api/eslint.config.mjs b/apps/api/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/apps/api/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/apps/api/package.json b/apps/api/package.json index bb75c7acb6..8eda081dfd 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -10,7 +10,9 @@ "scripts": { "build": "tsc && resolve-tspaths && pnpm run generate", "dev": "tsc && resolve-tspaths && nodemon dist/serve.js", + "format": "eslint --fix . && prettier --write .", "generate": "node ./dist/scripts/generate-openapi.js", + "lint": "eslint . && prettier --check .", "start": "node --enable-source-maps dist/serve.js" }, "dependencies": { @@ -27,6 +29,7 @@ "@opentelemetry/sdk-node": "0.205.0", "bcrypt-ts": "7.0.0", "better-auth": "1.2.7", + "dotenv": "16.5.0", "drizzle-zod": "0.7.1", "gateway": "workspace:*", "hono": "^4.9.7", diff --git a/apps/api/src/scripts/generate-openapi.ts b/apps/api/src/scripts/generate-openapi.ts index 1092df1503..1d237f2191 100644 --- a/apps/api/src/scripts/generate-openapi.ts +++ b/apps/api/src/scripts/generate-openapi.ts @@ -1,6 +1,6 @@ import { writeFileSync } from "fs"; -import { app, config } from "@/apps/api/src/index.js"; +import { app, config } from "@/index.js"; import { logger } from "@llmgateway/logger"; diff --git a/apps/docs/eslint.config.mjs b/apps/docs/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/apps/docs/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/apps/docs/package.json b/apps/docs/package.json index dbd0e3dc69..f742f22c76 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -13,9 +13,11 @@ "build": "fumadocs-mdx && next build && cp ../gateway/openapi.json .", "build2": "fumadocs-mdx && tsc && next build && cp ../gateway/openapi.json .", "dev": "next dev --turbo --port 3005", + "format": "eslint --fix . && prettier --write .", "gen-docs": "node scripts/generate-docs.mjs", "generate": "pnpm gen-docs", "postinstall": "fumadocs-mdx || true", + "lint": "eslint . && prettier --check .", "start": "next start -H 0.0.0.0" }, "dependencies": { diff --git a/apps/gateway/eslint.config.mjs b/apps/gateway/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/apps/gateway/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/apps/gateway/package.json b/apps/gateway/package.json index bdf81097ec..bb3de96a35 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -16,7 +16,9 @@ "scripts": { "build": "tsc && resolve-tspaths && pnpm run generate", "dev": "tsc && resolve-tspaths && nodemon dist/serve.js", + "format": "eslint --fix . && prettier --write .", "generate": "node ./dist/scripts/generate-openapi.js", + "lint": "eslint . && prettier --check .", "start": "node --enable-source-maps dist/serve.js" }, "dependencies": { @@ -31,6 +33,7 @@ "@llmgateway/models": "workspace:*", "@opentelemetry/api": "1.9.0", "@opentelemetry/sdk-node": "0.205.0", + "dotenv": "16.5.0", "gpt-tokenizer": "3.0.1", "hono": "^4.9.7", "hono-openapi": "^0.4.6", @@ -39,6 +42,5 @@ "worker": "workspace:*", "zod": "3.25.75", "zod-openapi": "^4.2.4" - }, - "devDependencies": {} + } } diff --git a/apps/ui/eslint.config.mjs b/apps/ui/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/apps/ui/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/apps/ui/package.json b/apps/ui/package.json index e3449cf681..00fa52d6d7 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -10,7 +10,9 @@ "scripts": { "build": "tsc && next build", "dev": "next dev --port 3002 --turbopack", + "format": "eslint --fix . && prettier --write .", "generate": "openapi-typescript ../api/openapi.json -o ./src/lib/api/v1.d.ts", + "lint": "eslint . && prettier --check .", "start": "next start" }, "dependencies": { diff --git a/apps/ui/src/app/blog/[slug]/page.tsx b/apps/ui/src/app/blog/[slug]/page.tsx index 91d96060aa..4550422324 100644 --- a/apps/ui/src/app/blog/[slug]/page.tsx +++ b/apps/ui/src/app/blog/[slug]/page.tsx @@ -1,4 +1,3 @@ -import { allBlogs } from "content-collections"; import { ArrowLeftIcon } from "lucide-react"; import Markdown from "markdown-to-jsx"; import Image from "next/image"; @@ -9,6 +8,8 @@ import Footer from "@/components/landing/footer"; import { HeroRSC } from "@/components/landing/hero-rsc"; import { getMarkdownOptions } from "@/lib/utils/markdown"; +import { allBlogs } from "content-collections"; + import type { Blog } from "content-collections"; interface BlogEntryPageProps { diff --git a/apps/ui/src/app/changelog/[slug]/page.tsx b/apps/ui/src/app/changelog/[slug]/page.tsx index 6e7a26092d..18e3f2c9aa 100644 --- a/apps/ui/src/app/changelog/[slug]/page.tsx +++ b/apps/ui/src/app/changelog/[slug]/page.tsx @@ -1,4 +1,3 @@ -import { allChangelogs } from "content-collections"; import { ArrowLeftIcon } from "lucide-react"; import Markdown from "markdown-to-jsx"; import Image from "next/image"; @@ -9,6 +8,8 @@ import Footer from "@/components/landing/footer"; import { HeroRSC } from "@/components/landing/hero-rsc"; import { getMarkdownOptions } from "@/lib/utils/markdown"; +import { allChangelogs } from "content-collections"; + import type { Changelog } from "content-collections"; interface ChangelogEntryPageProps { diff --git a/apps/worker/eslint.config.mjs b/apps/worker/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/apps/worker/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/apps/worker/package.json b/apps/worker/package.json index 10c7b74342..f543b3ce66 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -18,6 +18,8 @@ "scripts": { "build": "tsc && resolve-tspaths && resolve-tspaths", "dev": "tsc && resolve-tspaths && nodemon dist/index.js", + "format": "eslint --fix . && prettier --write .", + "lint": "eslint . && prettier --check .", "start": "node --enable-source-maps dist/index.js" }, "dependencies": { diff --git a/eslint.config.mjs b/eslint.config.mjs index f082c3b610..1a20233ccd 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,4 @@ -import lint from "@steebchen/lint-next"; +import lint from "@steebchen/lint-base"; import importPlugin from "eslint-plugin-import"; import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; @@ -87,6 +87,7 @@ export default [ { allowSameFolder: true, prefix: "@", + rootDir: "./src", }, ], }, diff --git a/package.json b/package.json index c5d3668fc1..c2dfffd901 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,8 @@ "clean": "find . -path \"./node_modules\" -prune -o \\( -type d -name \"dist\" -o -name \".turbo\" -o -name \".source\" -o -name \".vercel\" -o -name \".out\" -o -name \".vinxi\" -o -name \".next\" \\) -exec rm -rf {} +", "clean:node_modules": "find . -type d -name \"node_modules\" -exec rm -rf {} +", "dev": "turbo run dev", - "format": "eslint --fix . && prettier --write .", "generate": "turbo run generate", "postinstall": "husky && sync-editorconfig || true", - "lint": "eslint . && prettier --check .", "migrate": "pnpm --filter db migrate", "prepare-codex": "mv ~/.nvm ~/.nvm-bak && export PATH=\"${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH\" && . ~/.bashrc && sudo service postgresql start && sudo service redis-server start && sleep 20 && pnpm sync", "push-dev": "pnpm --filter db push", @@ -32,7 +30,7 @@ "devDependencies": { "@steebchen/commitlint-config": "^1.5.2", "@steebchen/eslint-config": "^1.10.0", - "@steebchen/lint-next": "^1.19.4", + "@steebchen/lint-base": "1.0.6", "@steebchen/prettier-config": "^1.4.2", "@types/node": "24.3.3", "commitlint": "19.8.1", diff --git a/packages/cache/eslint.config.mjs b/packages/cache/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/packages/cache/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/packages/cache/package.json b/packages/cache/package.json index b587dec44f..37271ae665 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -13,7 +13,9 @@ "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc && resolve-tspaths && resolve-tspaths" + "build": "tsc && resolve-tspaths && resolve-tspaths", + "format": "eslint --fix . && prettier --write .", + "lint": "eslint . && prettier --check ." }, "dependencies": { "@llmgateway/db": "workspace:*", diff --git a/packages/db/eslint.config.mjs b/packages/db/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/packages/db/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/packages/db/package.json b/packages/db/package.json index 95ee546e8a..26a4e9bae5 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -17,7 +17,9 @@ ], "scripts": { "build": "tsc && resolve-tspaths && resolve-tspaths", + "format": "eslint --fix . && prettier --write .", "generate": "pnpm drizzle-kit generate --config drizzle.config.ts", + "lint": "eslint . && prettier --check .", "migrate": "pnpm drizzle-kit migrate --config drizzle.config.ts", "push": "pnpm drizzle-kit push --force --config drizzle.config.ts", "seed": "tsx seed.ts" diff --git a/packages/instrumentation/eslint.config.mjs b/packages/instrumentation/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/packages/instrumentation/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/packages/instrumentation/package.json b/packages/instrumentation/package.json index 4ce0c68e34..512ad7c319 100644 --- a/packages/instrumentation/package.json +++ b/packages/instrumentation/package.json @@ -13,7 +13,9 @@ "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc && resolve-tspaths && resolve-tspaths" + "build": "tsc && resolve-tspaths && resolve-tspaths", + "format": "eslint --fix . && prettier --write .", + "lint": "eslint . && prettier --check ." }, "dependencies": { "@google-cloud/opentelemetry-cloud-trace-exporter": "3.0.0", diff --git a/packages/logger/eslint.config.mjs b/packages/logger/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/packages/logger/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/packages/logger/package.json b/packages/logger/package.json index 9ecd6aefbd..cc5b58f6f6 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -13,7 +13,9 @@ "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc && resolve-tspaths && resolve-tspaths" + "build": "tsc && resolve-tspaths && resolve-tspaths", + "format": "eslint --fix . && prettier --write .", + "lint": "eslint . && prettier --check ." }, "dependencies": { "@opentelemetry/api": "1.9.0", diff --git a/packages/models/eslint.config.mjs b/packages/models/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/packages/models/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/packages/models/package.json b/packages/models/package.json index 8aa7ebc70d..33575a2052 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -16,7 +16,9 @@ "dist/" ], "scripts": { - "build": "tsc && resolve-tspaths && resolve-tspaths" + "build": "tsc && resolve-tspaths && resolve-tspaths", + "format": "eslint --fix . && prettier --write .", + "lint": "eslint . && prettier --check ." }, "dependencies": { "@llmgateway/logger": "workspace:*" diff --git a/packages/models/src/models/anthropic.ts b/packages/models/src/models/anthropic.ts index 5513162ff6..00e3cab05f 100644 --- a/packages/models/src/models/anthropic.ts +++ b/packages/models/src/models/anthropic.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "@/models.js"; +import type { ModelDefinition } from "../models.js"; export const anthropicModels = [ { diff --git a/packages/shared/eslint.config.mjs b/packages/shared/eslint.config.mjs new file mode 100644 index 0000000000..ff3c5534c2 --- /dev/null +++ b/packages/shared/eslint.config.mjs @@ -0,0 +1,5 @@ +import lint from "../../eslint.config.mjs"; +import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [...lint]; diff --git a/packages/shared/package.json b/packages/shared/package.json index 54d5169374..dafa9c2e0d 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -16,7 +16,9 @@ "dist/" ], "scripts": { - "build": "tsc && resolve-tspaths && resolve-tspaths" + "build": "tsc && resolve-tspaths && resolve-tspaths", + "format": "eslint --fix . && prettier --write .", + "lint": "eslint . && prettier --check ." }, "dependencies": { "zod": "3.25.75" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0a24ba8ec..f8600bafa0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,9 +15,9 @@ importers: '@steebchen/eslint-config': specifier: ^1.10.0 version: 1.10.0(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@steebchen/lint-next': - specifier: ^1.19.4 - version: 1.19.4(@steebchen/commitlint-config@1.5.2)(@steebchen/prettier-config@1.4.2(prettier@3.6.2))(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(husky@9.1.7)(lint-staged@16.0.0)(prettier@3.6.2)(sort-package-json@3.4.0)(tailwindcss@4.1.12)(typescript@5.9.2) + '@steebchen/lint-base': + specifier: 1.0.6 + version: 1.0.6(@steebchen/commitlint-config@1.5.2)(@steebchen/prettier-config@1.4.2(prettier@3.6.2))(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(husky@9.1.7)(lint-staged@16.0.0)(prettier@3.6.2)(sort-package-json@3.4.0)(typescript@5.9.2) '@steebchen/prettier-config': specifier: ^1.4.2 version: 1.4.2(prettier@3.6.2) @@ -132,6 +132,9 @@ importers: better-auth: specifier: 1.2.7 version: 1.2.7 + dotenv: + specifier: 16.5.0 + version: 16.5.0 drizzle-zod: specifier: 0.7.1 version: 0.7.1(drizzle-orm@1.0.0-beta.1-c0277c0(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(pg@8.16.3))(zod@3.25.75) @@ -278,6 +281,9 @@ importers: '@opentelemetry/sdk-node': specifier: 0.205.0 version: 0.205.0(@opentelemetry/api@1.9.0) + dotenv: + specifier: 16.5.0 + version: 16.5.0 gpt-tokenizer: specifier: 3.0.1 version: 3.0.1 @@ -631,11 +637,6 @@ packages: peerDependencies: eslint: ^9.0.0 - '@abinnovision/eslint-config-react@2.2.0': - resolution: {integrity: sha512-UjAupaNLrFxHIuF7NuYS/HNd7QxPNzshxPrtZ5Jljranv1Xr5waT29oqHH4UnGfLt8zlwSp6ecl3Wnd+pxKcuw==} - peerDependencies: - eslint: ^9.0.0 - '@abinnovision/eslint-config-typescript@2.2.1': resolution: {integrity: sha512-S4EON+aaI0jDFdpnhYuT5kae5GGeGHmyYoFse3bx2AG/S9Nuo3SjM2ZbVpmRno0ajShfU4St9jFmXCp3i2XS7A==} peerDependencies: @@ -3915,14 +3916,6 @@ packages: prettier: ^3.5.3 sort-package-json: ^3.0.0 - '@steebchen/lint-next@1.19.4': - resolution: {integrity: sha512-25ar7GIDJwQphVmrygOBokT6XbclYm2i/c9lCY2Q3PK40F+Wdmcz5Gb6mMuPsdd7kTqsGCqhRFvWxHsTfAkhsA==} - hasBin: true - peerDependencies: - '@steebchen/commitlint-config': '*' - '@steebchen/prettier-config': '*' - eslint: ^9 - '@steebchen/prettier-config@1.4.2': resolution: {integrity: sha512-8bT3zc4RA7R6QMqT8yv81VD7bAhACVHbfgERQwFNqsYsjYLN9KzourugPK5Mylp7f020QC7jrABpQtVwuoMpjw==} peerDependencies: @@ -4202,12 +4195,6 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/eslint-plugin-tailwindcss@3.17.0': - resolution: {integrity: sha512-ucQGf2YIdTcndYcxRU3UdZgmhUHsOlbIF4BaRtl0op+7k2JmqM2i3aXZ6XIcfZgVq1ZKov7VM5c/BR81ukmkyg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -5490,24 +5477,12 @@ packages: eslint-plugin-no-relative-import-paths@1.6.1: resolution: {integrity: sha512-YZNeOnsOrJcwhFw0X29MXjIzu2P/f5X2BZDPWw1R3VUYBRFxNIh77lyoL/XrMU9ewZNQPcEvAgL/cBOT1P330A==} - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-tailwindcss@3.18.0: - resolution: {integrity: sha512-PQDU4ZMzFH0eb2DrfHPpbgo87Zgg2EXSMOj1NSfzdZm+aJzpuwGerfowMIaVehSREEa0idbf/eoNYAOHSJoDAQ==} - engines: {node: '>=18.12.0'} - peerDependencies: - tailwindcss: ^3.4.0 - eslint-plugin-unused-imports@4.1.4: resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} peerDependencies: @@ -8544,21 +8519,6 @@ snapshots: - typescript - vue-eslint-parser - '@abinnovision/eslint-config-react@2.2.0(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - eslint: 9.34.0(jiti@2.5.1) - eslint-config-alloy: 5.1.2(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-react: 7.37.5(eslint@9.34.0(jiti@2.5.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.34.0(jiti@2.5.1)) - transitivePeerDependencies: - - '@babel/eslint-parser' - - '@babel/preset-react' - - '@typescript-eslint/eslint-plugin' - - '@typescript-eslint/parser' - - eslint-plugin-vue - - typescript - - vue-eslint-parser - '@abinnovision/eslint-config-typescript@2.2.1(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) @@ -9634,7 +9594,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9648,7 +9608,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -12119,36 +12079,6 @@ snapshots: - typescript - vue-eslint-parser - '@steebchen/lint-next@1.19.4(@steebchen/commitlint-config@1.5.2)(@steebchen/prettier-config@1.4.2(prettier@3.6.2))(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(husky@9.1.7)(lint-staged@16.0.0)(prettier@3.6.2)(sort-package-json@3.4.0)(tailwindcss@4.1.12)(typescript@5.9.2)': - dependencies: - '@abinnovision/eslint-config-base': 2.2.0(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@abinnovision/eslint-config-react': 2.2.0(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@abinnovision/eslint-config-typescript': 2.2.1(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@steebchen/commitlint-config': 1.5.2 - '@steebchen/eslint-config': 1.10.0(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@steebchen/lint-base': 1.0.6(@steebchen/commitlint-config@1.5.2)(@steebchen/prettier-config@1.4.2(prettier@3.6.2))(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(husky@9.1.7)(lint-staged@16.0.0)(prettier@3.6.2)(sort-package-json@3.4.0)(typescript@5.9.2) - '@steebchen/prettier-config': 1.4.2(prettier@3.6.2) - '@types/eslint-plugin-tailwindcss': 3.17.0 - eslint: 9.34.0(jiti@2.5.1) - eslint-plugin-tailwindcss: 3.18.0(tailwindcss@4.1.12) - transitivePeerDependencies: - - '@babel/eslint-parser' - - '@babel/preset-react' - - '@typescript-eslint/eslint-plugin' - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - eslint-plugin-react - - eslint-plugin-vue - - husky - - lint-staged - - prettier - - sort-package-json - - supports-color - - tailwindcss - - typescript - - vue-eslint-parser - '@steebchen/prettier-config@1.4.2(prettier@3.6.2)': dependencies: '@abinnovision/prettier-config': 2.1.3(prettier@3.6.2) @@ -12395,15 +12325,6 @@ snapshots: '@types/deep-eql@4.0.2': {} - '@types/eslint-plugin-tailwindcss@3.17.0': - dependencies: - '@types/eslint': 9.6.1 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -12508,7 +12429,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -12518,7 +12439,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12537,7 +12458,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 @@ -12552,7 +12473,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12781,6 +12702,7 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 + optional: true array.prototype.findlastindex@1.2.6: dependencies: @@ -12813,6 +12735,7 @@ snapshots: es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 + optional: true arraybuffer.prototype.slice@1.0.4: dependencies: @@ -13444,6 +13367,7 @@ snapshots: internal-slot: 1.1.0 iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 + optional: true es-module-lexer@1.7.0: {} @@ -13688,7 +13612,7 @@ snapshots: eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 @@ -13743,10 +13667,6 @@ snapshots: eslint-plugin-no-relative-import-paths@1.6.1: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.34.0(jiti@2.5.1)): - dependencies: - eslint: 9.34.0(jiti@2.5.1) - eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)): dependencies: array-includes: 3.1.9 @@ -13768,12 +13688,7 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - - eslint-plugin-tailwindcss@3.18.0(tailwindcss@4.1.12): - dependencies: - fast-glob: 3.3.3 - postcss: 8.5.6 - tailwindcss: 4.1.12 + optional: true eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1)): dependencies: @@ -13808,7 +13723,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -14765,6 +14680,7 @@ snapshots: get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 + optional: true jackspeak@4.1.0: dependencies: @@ -14830,6 +14746,7 @@ snapshots: array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 + optional: true jwa@2.0.1: dependencies: @@ -14910,7 +14827,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 @@ -15625,6 +15542,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 + optional: true object.fromentries@2.0.8: dependencies: @@ -16263,6 +16181,7 @@ snapshots: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + optional: true restore-cursor@5.1.0: dependencies: @@ -16608,11 +16527,13 @@ snapshots: regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 side-channel: 1.1.0 + optional: true string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.24.0 + optional: true string.prototype.trim@1.2.10: dependencies: @@ -17029,7 +16950,7 @@ snapshots: vite-node@3.2.3(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.3.6(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1) @@ -17103,7 +17024,7 @@ snapshots: '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 chai: 5.2.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 diff --git a/turbo.json b/turbo.json index edee06cfe1..241986fb27 100644 --- a/turbo.json +++ b/turbo.json @@ -38,6 +38,7 @@ "cache": false }, "lint": {}, + "format": {}, "test": {} } } From a13d2d27f9a0c916fed50a2b14d2332d390788ea Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 01:00:35 +0100 Subject: [PATCH 10/21] chore(imports): update paths and scripts for consistency Updated import paths to use base "@/..." syntax for consistency across packages. Adjusted seed script to reference the correct JS build output. Added `format` and `lint` scripts to package.json for standardized workflows. --- package.json | 2 ++ packages/db/package.json | 2 +- packages/db/{ => src}/logs.ts | 2 +- packages/db/{ => src}/seed.ts | 2 +- packages/models/src/models/anthropic.ts | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) rename packages/db/{ => src}/logs.ts (99%) rename packages/db/{ => src}/seed.ts (97%) diff --git a/package.json b/package.json index c2dfffd901..5dd8c6d7a3 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,10 @@ "clean": "find . -path \"./node_modules\" -prune -o \\( -type d -name \"dist\" -o -name \".turbo\" -o -name \".source\" -o -name \".vercel\" -o -name \".out\" -o -name \".vinxi\" -o -name \".next\" \\) -exec rm -rf {} +", "clean:node_modules": "find . -type d -name \"node_modules\" -exec rm -rf {} +", "dev": "turbo run dev", + "format": "turbo run format", "generate": "turbo run generate", "postinstall": "husky && sync-editorconfig || true", + "lint": "turbo run lint", "migrate": "pnpm --filter db migrate", "prepare-codex": "mv ~/.nvm ~/.nvm-bak && export PATH=\"${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH\" && . ~/.bashrc && sudo service postgresql start && sudo service redis-server start && sleep 20 && pnpm sync", "push-dev": "pnpm --filter db push", diff --git a/packages/db/package.json b/packages/db/package.json index 26a4e9bae5..eeec2ca359 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -22,7 +22,7 @@ "lint": "eslint . && prettier --check .", "migrate": "pnpm drizzle-kit migrate --config drizzle.config.ts", "push": "pnpm drizzle-kit push --force --config drizzle.config.ts", - "seed": "tsx seed.ts" + "seed": "node dist/seed.js" }, "dependencies": { "@llmgateway/logger": "workspace:*", diff --git a/packages/db/logs.ts b/packages/db/src/logs.ts similarity index 99% rename from packages/db/logs.ts rename to packages/db/src/logs.ts index 28846add31..d0401a79b3 100644 --- a/packages/db/logs.ts +++ b/packages/db/src/logs.ts @@ -1,4 +1,4 @@ -import type { tables } from "./src/index.js"; +import type { tables } from "./index.js"; import type { InferInsertModel } from "drizzle-orm"; type Log = InferInsertModel; diff --git a/packages/db/seed.ts b/packages/db/src/seed.ts similarity index 97% rename from packages/db/seed.ts rename to packages/db/src/seed.ts index 113a6a8a6d..f66df69148 100644 --- a/packages/db/seed.ts +++ b/packages/db/src/seed.ts @@ -1,7 +1,7 @@ import { randomUUID } from "crypto"; +import { closeDatabase, db, tables } from "./index.js"; import { logs } from "./logs.js"; -import { closeDatabase, db, tables } from "./src/index.js"; import type { PgTable } from "drizzle-orm/pg-core"; diff --git a/packages/models/src/models/anthropic.ts b/packages/models/src/models/anthropic.ts index 00e3cab05f..5513162ff6 100644 --- a/packages/models/src/models/anthropic.ts +++ b/packages/models/src/models/anthropic.ts @@ -1,4 +1,4 @@ -import type { ModelDefinition } from "../models.js"; +import type { ModelDefinition } from "@/models.js"; export const anthropicModels = [ { From 6919d48dce2cb683c365a6710efb6100dbd38b8f Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 01:13:51 +0100 Subject: [PATCH 11/21] chore(prettier): add .prettierignore files to gateway and api Added `.prettierignore` files to ignore `dist` directories in `apps/gateway` and `apps/api`. --- .prettierignore | 14 +- apps/api/.prettierignore | 1 + apps/docs/.prettierignore | 4 + apps/docs/eslint.config.mjs | 4 +- apps/gateway/.prettierignore | 1 + apps/ui/.prettierignore | 2 + apps/ui/eslint.config.mjs | 12 +- apps/ui/src/lib/api/v1.d.ts | 5837 +++++++++++----------- apps/worker/.prettierignore | 1 + eslint.config.mjs | 1 - package.json | 1 + packages/cache/.prettierignore | 1 + packages/db/.prettierignore | 2 + packages/db/eslint.config.mjs | 7 +- packages/instrumentation/.prettierignore | 1 + packages/logger/.prettierignore | 1 + packages/models/.prettierignore | 1 + packages/shared/.prettierignore | 1 + pnpm-lock.yaml | 43 +- 19 files changed, 3022 insertions(+), 2913 deletions(-) create mode 100644 apps/api/.prettierignore create mode 100644 apps/docs/.prettierignore create mode 100644 apps/gateway/.prettierignore create mode 100644 apps/ui/.prettierignore create mode 100644 apps/worker/.prettierignore create mode 100644 packages/cache/.prettierignore create mode 100644 packages/db/.prettierignore create mode 100644 packages/instrumentation/.prettierignore create mode 100644 packages/logger/.prettierignore create mode 100644 packages/models/.prettierignore create mode 100644 packages/shared/.prettierignore diff --git a/.prettierignore b/.prettierignore index 60eee481f6..1521c8b765 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,13 +1 @@ -routeTree.gen.ts -.next -.vinxi -.vercel -.output -.source -out -migrations -.content-collections -.tanstack -.conductor -v1.d.ts -apps/docs/content/(api)/ +dist diff --git a/apps/api/.prettierignore b/apps/api/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/apps/api/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/apps/docs/.prettierignore b/apps/docs/.prettierignore new file mode 100644 index 0000000000..de477d89b6 --- /dev/null +++ b/apps/docs/.prettierignore @@ -0,0 +1,4 @@ +content/(api)/ +.content-collections +.next +.source diff --git a/apps/docs/eslint.config.mjs b/apps/docs/eslint.config.mjs index ff3c5534c2..2134f22659 100644 --- a/apps/docs/eslint.config.mjs +++ b/apps/docs/eslint.config.mjs @@ -1,5 +1,5 @@ import lint from "../../eslint.config.mjs"; -import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; +import react from "@abinnovision/eslint-config-react"; /** @type {import("eslint").Linter.Config[]} */ -export default [...lint]; +export default [...lint, ...react]; diff --git a/apps/gateway/.prettierignore b/apps/gateway/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/apps/gateway/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/apps/ui/.prettierignore b/apps/ui/.prettierignore new file mode 100644 index 0000000000..798ecd3d1a --- /dev/null +++ b/apps/ui/.prettierignore @@ -0,0 +1,2 @@ +.content-collections +.next diff --git a/apps/ui/eslint.config.mjs b/apps/ui/eslint.config.mjs index ff3c5534c2..ea1ade92c0 100644 --- a/apps/ui/eslint.config.mjs +++ b/apps/ui/eslint.config.mjs @@ -1,5 +1,15 @@ import lint from "../../eslint.config.mjs"; +import react from "@abinnovision/eslint-config-react"; import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; /** @type {import("eslint").Linter.Config[]} */ -export default [...lint]; +export default [ + ...lint, + ...react, + { + rules: { + "no-console": "off", + "react/no-unescaped-entities": "off", + }, + }, +]; diff --git a/apps/ui/src/lib/api/v1.d.ts b/apps/ui/src/lib/api/v1.d.ts index c5d67eeb36..737cf32345 100644 --- a/apps/ui/src/lib/api/v1.d.ts +++ b/apps/ui/src/lib/api/v1.d.ts @@ -4,2894 +4,2961 @@ */ export interface paths { - "/": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Health check response. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - version: string; - health: { - status: string; - database: { - connected: boolean; - error?: string; - }; - redis: { - connected: boolean; - error?: string; - }; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/stripe/webhook": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Webhook received successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - received: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/beacon": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: uuid */ - uuid: string; - type: string; - /** Format: date-time */ - timestamp: string; - version: string; - }; - }; - }; - responses: { - /** @description Beacon data received successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/user/me": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description User response object. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - user: { - id: string; - email: string; - name: string | null; - onboardingCompleted: boolean; - emailVerified: boolean; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description User deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name?: string; - /** Format: email */ - email?: string; - }; - }; - }; - responses: { - /** @description User updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - user: { - id: string; - email: string; - name: string | null; - onboardingCompleted: boolean; - emailVerified: boolean; - }; - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/user/me/passkeys/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Passkey deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/user/password": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - currentPassword: string; - newPassword: string; - }; - }; - }; - responses: { - /** @description Password updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized or incorrect current password. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/user/me/complete-onboarding": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": Record; - }; - }; - responses: { - /** @description Onboarding completed successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - user: { - id: string; - email: string; - name: string | null; - onboardingCompleted: boolean; - emailVerified: boolean; - }; - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: { - apiKeyId?: string; - providerKeyId?: string; - projectId?: string; - orgId?: string; - startDate?: string; - endDate?: string; - finishReason?: string; - unifiedFinishReason?: string; - provider?: string; - model?: string; - source?: string; - cursor?: string; - orderBy?: "createdAt_asc" | "createdAt_desc"; - limit?: string; - customHeaderKey?: string; - customHeaderValue?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description User logs response with pagination. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Optional message about the response */ - message?: string; - /** @description Array of log entries */ - logs: { - id: string; - requestId: string; - createdAt: string; - updatedAt: string; - organizationId: string; - projectId: string; - apiKeyId: string; - duration: number; - requestedModel: string; - requestedProvider: string | null; - usedModel: string; - usedProvider: string; - responseSize: number; - content: string | null; - reasoningContent: string | null; - unifiedFinishReason: string | null; - finishReason: string | null; - promptTokens: string | null; - completionTokens: string | null; - totalTokens: string | null; - reasoningTokens: string | null; - messages?: unknown; - temperature: number | null; - maxTokens: number | null; - topP: number | null; - frequencyPenalty: number | null; - presencePenalty: number | null; - reasoningEffort: string | null; - tools: { - /** @enum {string} */ - type: "function"; - function: { - name: string; - description?: string; - parameters?: { - [key: string]: unknown; - }; - }; - }[] | null; - toolChoice: "none" | "auto" | "required" | { - /** @enum {string} */ - type: "function"; - function: { - name: string; - }; - } | unknown; - toolResults: { - id: string; - /** @enum {string} */ - type: "function"; - function: { - name: string; - arguments: string; - }; - }[] | null; - hasError: boolean | null; - errorDetails: { - statusCode: number; - statusText: string; - responseText: string; - } | null; - cost: number | null; - inputCost: number | null; - outputCost: number | null; - requestCost: number | null; - estimatedCost: boolean | null; - canceled: boolean | null; - streamed: boolean | null; - cached: boolean | null; - customHeaders?: unknown; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string} */ - usedMode: "api-keys" | "credits"; - source: string | null; - }[]; - /** @description Pagination metadata */ - pagination: { - /** @description Cursor to use for the next page of results, null if no more results */ - nextCursor: string | null; - /** @description Whether there are more results available */ - hasMore: boolean; - /** @description Number of items requested per page */ - limit: number; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/activity": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query: { - days: string; - projectId?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Activity data grouped by day */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - activity: { - date: string; - requestCount: number; - inputTokens: number; - outputTokens: number; - totalTokens: number; - cost: number; - inputCost: number; - outputCost: number; - requestCost: number; - errorCount: number; - errorRate: number; - cacheCount: number; - cacheRate: number; - modelBreakdown: { - id: string; - provider: string; - requestCount: number; - inputTokens: number; - outputTokens: number; - totalTokens: number; - cost: number; - }[]; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/api": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: { - projectId?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of API keys. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - apiKeys: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - maskedToken: string; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - description: string; - projectId: string; - usageLimit: string | null; - }; - }; - }; - responses: { - /** @description API key created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - apiKey: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - token: string; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/api/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description API key deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description API key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description API key status updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - apiKey: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - maskedToken: string; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description API key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/keys/api/limit/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - usageLimit: string | null; - }; - }; - }; - responses: { - /** @description API key usage limit updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - apiKey: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - maskedToken: string; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description API key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/keys/api/{id}/iam": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of IAM rules for the API key. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - rules: { - id: string; - createdAt: string; - updatedAt: string; - apiKeyId: string; - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** - * @default active - * @enum {string} - */ - status?: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description IAM rule created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - rule: { - id: string; - createdAt: string; - updatedAt: string; - apiKeyId: string; - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/api/{id}/iam/{ruleId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - ruleId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description IAM rule deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - ruleId: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - ruleType?: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue?: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** - * @default active - * @enum {string} - */ - status?: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description IAM rule updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - rule: { - id: string; - createdAt: string; - updatedAt: string; - apiKeyId: string; - /** @enum {string} */ - ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - }; - }; - }; - trace?: never; - }; - "/keys/provider": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of provider keys. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - providerKeys: { - id: string; - createdAt: string; - updatedAt: string; - provider: string; - name: string | null; - baseUrl: string | null; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - organizationId: string; - maskedToken: string; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - provider: string; - token: string; - name?: string; - /** Format: uri */ - baseUrl?: string; - organizationId: string; - }; - }; - }; - responses: { - /** @description Provider key created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - providerKey: { - id: string; - createdAt: string; - updatedAt: string; - provider: string; - name: string | null; - baseUrl: string | null; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - organizationId: string; - token: string; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/provider/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Provider key deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Provider key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description Provider key status updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - providerKey: { - id: string; - createdAt: string; - updatedAt: string; - provider: string; - name: string | null; - baseUrl: string | null; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - organizationId: string; - maskedToken: string; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Provider key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/projects/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Project retrieved successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - project: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Project deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Project not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - cachingEnabled?: boolean; - cacheDurationSeconds?: number; - /** @enum {string} */ - mode?: "api-keys" | "credits" | "hybrid"; - }; - }; - }; - responses: { - /** @description Project settings updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - project: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Project not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/projects": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name: string; - organizationId: string; - cachingEnabled?: boolean; - cacheDurationSeconds?: number; - /** @enum {string} */ - mode?: "api-keys" | "credits" | "hybrid"; - }; - }; - }; - responses: { - /** @description Project created successfully. */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - project: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description You do not have access to this organization. */ - 403: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/orgs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of organizations the user belongs to */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - organizations: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - credits: string; - /** @enum {string} */ - plan: "free" | "pro"; - planExpiresAt: string | null; - /** @enum {string} */ - retentionLevel: "retain" | "none"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - autoTopUpEnabled: boolean; - autoTopUpThreshold: string | null; - autoTopUpAmount: string | null; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name: string; - }; - }; - }; - responses: { - /** @description Organization created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - organization: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - credits: string; - /** @enum {string} */ - plan: "free" | "pro"; - planExpiresAt: string | null; - /** @enum {string} */ - retentionLevel: "retain" | "none"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - autoTopUpEnabled: boolean; - autoTopUpThreshold: string | null; - autoTopUpAmount: string | null; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/orgs/{id}/projects": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of projects for the specified organization */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - projects: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/orgs/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Organization deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Organization not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name?: string; - /** @enum {string} */ - retentionLevel?: "retain" | "none"; - autoTopUpEnabled?: boolean; - autoTopUpThreshold?: number; - autoTopUpAmount?: number; - }; - }; - }; - responses: { - /** @description Organization updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - organization: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - credits: string; - /** @enum {string} */ - plan: "free" | "pro"; - planExpiresAt: string | null; - /** @enum {string} */ - retentionLevel: "retain" | "none"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - autoTopUpEnabled: boolean; - autoTopUpThreshold: string | null; - autoTopUpAmount: string | null; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Organization not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/orgs/{id}/transactions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of transactions for the specified organization */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - transactions: { - id: string; - createdAt: string; - updatedAt: string; - organizationId: string; - /** @enum {string} */ - type: "subscription_start" | "subscription_cancel" | "subscription_end" | "credit_topup"; - amount: string | null; - creditAmount: string | null; - currency: string; - /** @enum {string} */ - status: "pending" | "completed" | "failed"; - stripePaymentIntentId: string | null; - stripeInvoiceId: string | null; - description: string | null; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/create-payment-intent": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - amount: number; - }; - }; - }; - responses: { - /** @description Payment intent created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - clientSecret: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/create-setup-intent": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Setup intent created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - clientSecret: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/payment-methods": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Payment methods retrieved successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - paymentMethods: { - id: string; - stripePaymentMethodId: string; - type: string; - isDefault: boolean; - cardBrand?: string; - cardLast4?: string; - expiryMonth?: number; - expiryYear?: number; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/payment-methods/default": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - paymentMethodId: string; - }; - }; - }; - responses: { - /** @description Default payment method set successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/payment-methods/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Payment method deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/top-up-with-saved-method": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - amount: number; - paymentMethodId: string; - }; - }; - }; - responses: { - /** @description Payment processed successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/calculate-fees": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - amount: number; - paymentMethodId?: string; - }; - }; - }; - responses: { - /** @description Fee calculation completed successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - baseAmount: number; - stripeFee: number; - internationalFee: number; - planFee: number; - totalFees: number; - totalAmount: number; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/chat/completion": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - messages: { - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content: string; - }[]; - model: string; - /** @default false */ - stream?: boolean; - apiKey?: string; - }; - }; - }; - responses: { - /** @description Chat completion response */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/chats": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of user's chats */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chats: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - title: string; - model: string; - }; - }; - }; - responses: { - /** @description Chat created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chat: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }; - }; - }; - }; - /** @description Chat limit reached or validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/chats/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Chat with messages */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chat: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }; - messages: { - id: string; - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content: string | null; - images: string | null; - sequence: number; - /** Format: date-time */ - createdAt: string; - }[]; - }; - }; - }; - /** @description Chat not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Chat deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - title?: string; - /** @enum {string} */ - status?: "active" | "archived"; - }; - }; - }; - responses: { - /** @description Chat updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chat: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }; - }; - }; - }; - }; - }; - trace?: never; - }; - "/chats/{id}/messages": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content?: string; - images?: string; - }; - }; - }; - responses: { - /** @description Message added successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: { - id: string; - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content: string | null; - images: string | null; - sequence: number; - /** Format: date-time */ - createdAt: string; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/create-pro-subscription": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** - * @default monthly - * @enum {string} - */ - billingCycle?: "monthly" | "yearly"; - }; - }; - }; - responses: { - /** @description Stripe Checkout session created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - checkoutUrl: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/cancel-pro-subscription": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Pro subscription canceled successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/resume-pro-subscription": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Pro subscription resumed successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/upgrade-to-yearly": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Subscription upgraded to yearly successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Subscription status retrieved successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @enum {string} */ - plan: "free" | "pro"; - subscriptionId: string | null; - planExpiresAt: string | null; - subscriptionCancelled: boolean; - /** @enum {string|null} */ - billingCycle: "monthly" | "yearly" | null; - isTrialActive: boolean; - trialStartDate: string | null; - trialEndDate: string | null; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; + "/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Health check response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + version: string; + health: { + status: string; + database: { + connected: boolean; + error?: string; + }; + redis: { + connected: boolean; + error?: string; + }; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/stripe/webhook": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Webhook received successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + received: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/beacon": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: uuid */ + uuid: string; + type: string; + /** Format: date-time */ + timestamp: string; + version: string; + }; + }; + }; + responses: { + /** @description Beacon data received successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/user/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User response object. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + user: { + id: string; + email: string; + name: string | null; + onboardingCompleted: boolean; + emailVerified: boolean; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name?: string; + /** Format: email */ + email?: string; + }; + }; + }; + responses: { + /** @description User updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + user: { + id: string; + email: string; + name: string | null; + onboardingCompleted: boolean; + emailVerified: boolean; + }; + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/user/me/passkeys/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Passkey deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/user/password": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + currentPassword: string; + newPassword: string; + }; + }; + }; + responses: { + /** @description Password updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized or incorrect current password. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/user/me/complete-onboarding": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description Onboarding completed successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + user: { + id: string; + email: string; + name: string | null; + onboardingCompleted: boolean; + emailVerified: boolean; + }; + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: { + apiKeyId?: string; + providerKeyId?: string; + projectId?: string; + orgId?: string; + startDate?: string; + endDate?: string; + finishReason?: string; + unifiedFinishReason?: string; + provider?: string; + model?: string; + source?: string; + cursor?: string; + orderBy?: "createdAt_asc" | "createdAt_desc"; + limit?: string; + customHeaderKey?: string; + customHeaderValue?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User logs response with pagination. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @description Optional message about the response */ + message?: string; + /** @description Array of log entries */ + logs: { + id: string; + requestId: string; + createdAt: string; + updatedAt: string; + organizationId: string; + projectId: string; + apiKeyId: string; + duration: number; + requestedModel: string; + requestedProvider: string | null; + usedModel: string; + usedProvider: string; + responseSize: number; + content: string | null; + reasoningContent: string | null; + unifiedFinishReason: string | null; + finishReason: string | null; + promptTokens: string | null; + completionTokens: string | null; + totalTokens: string | null; + reasoningTokens: string | null; + messages?: unknown; + temperature: number | null; + maxTokens: number | null; + topP: number | null; + frequencyPenalty: number | null; + presencePenalty: number | null; + reasoningEffort: string | null; + tools: + | { + /** @enum {string} */ + type: "function"; + function: { + name: string; + description?: string; + parameters?: { + [key: string]: unknown; + }; + }; + }[] + | null; + toolChoice: + | "none" + | "auto" + | "required" + | { + /** @enum {string} */ + type: "function"; + function: { + name: string; + }; + } + | unknown; + toolResults: + | { + id: string; + /** @enum {string} */ + type: "function"; + function: { + name: string; + arguments: string; + }; + }[] + | null; + hasError: boolean | null; + errorDetails: { + statusCode: number; + statusText: string; + responseText: string; + } | null; + cost: number | null; + inputCost: number | null; + outputCost: number | null; + requestCost: number | null; + estimatedCost: boolean | null; + canceled: boolean | null; + streamed: boolean | null; + cached: boolean | null; + customHeaders?: unknown; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string} */ + usedMode: "api-keys" | "credits"; + source: string | null; + }[]; + /** @description Pagination metadata */ + pagination: { + /** @description Cursor to use for the next page of results, null if no more results */ + nextCursor: string | null; + /** @description Whether there are more results available */ + hasMore: boolean; + /** @description Number of items requested per page */ + limit: number; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/activity": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query: { + days: string; + projectId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Activity data grouped by day */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + activity: { + date: string; + requestCount: number; + inputTokens: number; + outputTokens: number; + totalTokens: number; + cost: number; + inputCost: number; + outputCost: number; + requestCost: number; + errorCount: number; + errorRate: number; + cacheCount: number; + cacheRate: number; + modelBreakdown: { + id: string; + provider: string; + requestCount: number; + inputTokens: number; + outputTokens: number; + totalTokens: number; + cost: number; + }[]; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/api": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: { + projectId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of API keys. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + apiKeys: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + maskedToken: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + description: string; + projectId: string; + usageLimit: string | null; + }; + }; + }; + responses: { + /** @description API key created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + apiKey: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + token: string; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/api/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description API key deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description API key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description API key status updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + apiKey: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + maskedToken: string; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description API key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/keys/api/limit/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + usageLimit: string | null; + }; + }; + }; + responses: { + /** @description API key usage limit updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + apiKey: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + maskedToken: string; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description API key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/keys/api/{id}/iam": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of IAM rules for the API key. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + rules: { + id: string; + createdAt: string; + updatedAt: string; + apiKeyId: string; + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** + * @default active + * @enum {string} + */ + status?: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description IAM rule created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + rule: { + id: string; + createdAt: string; + updatedAt: string; + apiKeyId: string; + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/api/{id}/iam/{ruleId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + ruleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description IAM rule deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + ruleId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + ruleType?: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue?: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** + * @default active + * @enum {string} + */ + status?: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description IAM rule updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + rule: { + id: string; + createdAt: string; + updatedAt: string; + apiKeyId: string; + /** @enum {string} */ + ruleType: + | "allow_models" + | "deny_models" + | "allow_pricing" + | "deny_pricing" + | "allow_providers" + | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + }; + }; + }; + trace?: never; + }; + "/keys/provider": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of provider keys. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + providerKeys: { + id: string; + createdAt: string; + updatedAt: string; + provider: string; + name: string | null; + baseUrl: string | null; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + organizationId: string; + maskedToken: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + provider: string; + token: string; + name?: string; + /** Format: uri */ + baseUrl?: string; + organizationId: string; + }; + }; + }; + responses: { + /** @description Provider key created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + providerKey: { + id: string; + createdAt: string; + updatedAt: string; + provider: string; + name: string | null; + baseUrl: string | null; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + organizationId: string; + token: string; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/provider/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Provider key deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Provider key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description Provider key status updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + providerKey: { + id: string; + createdAt: string; + updatedAt: string; + provider: string; + name: string | null; + baseUrl: string | null; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + organizationId: string; + maskedToken: string; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Provider key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/projects/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Project retrieved successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + project: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Project deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Project not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + cachingEnabled?: boolean; + cacheDurationSeconds?: number; + /** @enum {string} */ + mode?: "api-keys" | "credits" | "hybrid"; + }; + }; + }; + responses: { + /** @description Project settings updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + project: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Project not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/projects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name: string; + organizationId: string; + cachingEnabled?: boolean; + cacheDurationSeconds?: number; + /** @enum {string} */ + mode?: "api-keys" | "credits" | "hybrid"; + }; + }; + }; + responses: { + /** @description Project created successfully. */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + project: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description You do not have access to this organization. */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/orgs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of organizations the user belongs to */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + organizations: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + credits: string; + /** @enum {string} */ + plan: "free" | "pro"; + planExpiresAt: string | null; + /** @enum {string} */ + retentionLevel: "retain" | "none"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + autoTopUpEnabled: boolean; + autoTopUpThreshold: string | null; + autoTopUpAmount: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name: string; + }; + }; + }; + responses: { + /** @description Organization created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + organization: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + credits: string; + /** @enum {string} */ + plan: "free" | "pro"; + planExpiresAt: string | null; + /** @enum {string} */ + retentionLevel: "retain" | "none"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + autoTopUpEnabled: boolean; + autoTopUpThreshold: string | null; + autoTopUpAmount: string | null; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/orgs/{id}/projects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of projects for the specified organization */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + projects: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/orgs/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Organization deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Organization not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name?: string; + /** @enum {string} */ + retentionLevel?: "retain" | "none"; + autoTopUpEnabled?: boolean; + autoTopUpThreshold?: number; + autoTopUpAmount?: number; + }; + }; + }; + responses: { + /** @description Organization updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + organization: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + credits: string; + /** @enum {string} */ + plan: "free" | "pro"; + planExpiresAt: string | null; + /** @enum {string} */ + retentionLevel: "retain" | "none"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + autoTopUpEnabled: boolean; + autoTopUpThreshold: string | null; + autoTopUpAmount: string | null; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Organization not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/orgs/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of transactions for the specified organization */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + transactions: { + id: string; + createdAt: string; + updatedAt: string; + organizationId: string; + /** @enum {string} */ + type: + | "subscription_start" + | "subscription_cancel" + | "subscription_end" + | "credit_topup"; + amount: string | null; + creditAmount: string | null; + currency: string; + /** @enum {string} */ + status: "pending" | "completed" | "failed"; + stripePaymentIntentId: string | null; + stripeInvoiceId: string | null; + description: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/create-payment-intent": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + amount: number; + }; + }; + }; + responses: { + /** @description Payment intent created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + clientSecret: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/create-setup-intent": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Setup intent created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + clientSecret: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/payment-methods": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Payment methods retrieved successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + paymentMethods: { + id: string; + stripePaymentMethodId: string; + type: string; + isDefault: boolean; + cardBrand?: string; + cardLast4?: string; + expiryMonth?: number; + expiryYear?: number; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/payment-methods/default": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + paymentMethodId: string; + }; + }; + }; + responses: { + /** @description Default payment method set successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/payment-methods/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Payment method deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/top-up-with-saved-method": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + amount: number; + paymentMethodId: string; + }; + }; + }; + responses: { + /** @description Payment processed successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/calculate-fees": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + amount: number; + paymentMethodId?: string; + }; + }; + }; + responses: { + /** @description Fee calculation completed successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + baseAmount: number; + stripeFee: number; + internationalFee: number; + planFee: number; + totalFees: number; + totalAmount: number; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chat/completion": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + messages: { + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content: string; + }[]; + model: string; + /** @default false */ + stream?: boolean; + apiKey?: string; + }; + }; + }; + responses: { + /** @description Chat completion response */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chats": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of user's chats */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chats: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + title: string; + model: string; + }; + }; + }; + responses: { + /** @description Chat created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chat: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }; + }; + }; + }; + /** @description Chat limit reached or validation error */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chats/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Chat with messages */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chat: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }; + messages: { + id: string; + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content: string | null; + images: string | null; + sequence: number; + /** Format: date-time */ + createdAt: string; + }[]; + }; + }; + }; + /** @description Chat not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Chat deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + title?: string; + /** @enum {string} */ + status?: "active" | "archived"; + }; + }; + }; + responses: { + /** @description Chat updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chat: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }; + }; + }; + }; + }; + }; + trace?: never; + }; + "/chats/{id}/messages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content?: string; + images?: string; + }; + }; + }; + responses: { + /** @description Message added successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: { + id: string; + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content: string | null; + images: string | null; + sequence: number; + /** Format: date-time */ + createdAt: string; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/create-pro-subscription": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** + * @default monthly + * @enum {string} + */ + billingCycle?: "monthly" | "yearly"; + }; + }; + }; + responses: { + /** @description Stripe Checkout session created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + checkoutUrl: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/cancel-pro-subscription": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Pro subscription canceled successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/resume-pro-subscription": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Pro subscription resumed successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/upgrade-to-yearly": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Subscription upgraded to yearly successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Subscription status retrieved successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @enum {string} */ + plan: "free" | "pro"; + subscriptionId: string | null; + planExpiresAt: string | null; + subscriptionCancelled: boolean; + /** @enum {string|null} */ + billingCycle: "monthly" | "yearly" | null; + isTrialActive: boolean; + trialStartDate: string | null; + trialEndDate: string | null; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { - schemas: never; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export type operations = Record; diff --git a/apps/worker/.prettierignore b/apps/worker/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/apps/worker/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/eslint.config.mjs b/eslint.config.mjs index 1a20233ccd..c2323e3888 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -6,7 +6,6 @@ import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths" export default [ ...lint, { - ignores: ["**/tsup.config.ts"], plugins: { import: importPlugin, "no-relative-import-paths": noRelativeImportPathsPlugin, diff --git a/package.json b/package.json index 5dd8c6d7a3..76b93978e6 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ }, "prettier": "@steebchen/prettier-config", "devDependencies": { + "@abinnovision/eslint-config-react": "2.2.0", "@steebchen/commitlint-config": "^1.5.2", "@steebchen/eslint-config": "^1.10.0", "@steebchen/lint-base": "1.0.6", diff --git a/packages/cache/.prettierignore b/packages/cache/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/packages/cache/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/packages/db/.prettierignore b/packages/db/.prettierignore new file mode 100644 index 0000000000..7c4ebdf6e7 --- /dev/null +++ b/packages/db/.prettierignore @@ -0,0 +1,2 @@ +migrations +dist diff --git a/packages/db/eslint.config.mjs b/packages/db/eslint.config.mjs index ff3c5534c2..26fc43bc2c 100644 --- a/packages/db/eslint.config.mjs +++ b/packages/db/eslint.config.mjs @@ -2,4 +2,9 @@ import lint from "../../eslint.config.mjs"; import noRelativeImportPathsPlugin from "eslint-plugin-no-relative-import-paths"; /** @type {import("eslint").Linter.Config[]} */ -export default [...lint]; +export default [ + ...lint, + { + ignores: ["drizzle.config.ts"], + }, +]; diff --git a/packages/instrumentation/.prettierignore b/packages/instrumentation/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/packages/instrumentation/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/packages/logger/.prettierignore b/packages/logger/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/packages/logger/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/packages/models/.prettierignore b/packages/models/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/packages/models/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/packages/shared/.prettierignore b/packages/shared/.prettierignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/packages/shared/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8600bafa0..46f2c673e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,9 @@ importers: .: devDependencies: + '@abinnovision/eslint-config-react': + specifier: 2.2.0 + version: 2.2.0(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@steebchen/commitlint-config': specifier: ^1.5.2 version: 1.5.2 @@ -637,6 +640,11 @@ packages: peerDependencies: eslint: ^9.0.0 + '@abinnovision/eslint-config-react@2.2.0': + resolution: {integrity: sha512-UjAupaNLrFxHIuF7NuYS/HNd7QxPNzshxPrtZ5Jljranv1Xr5waT29oqHH4UnGfLt8zlwSp6ecl3Wnd+pxKcuw==} + peerDependencies: + eslint: ^9.0.0 + '@abinnovision/eslint-config-typescript@2.2.1': resolution: {integrity: sha512-S4EON+aaI0jDFdpnhYuT5kae5GGeGHmyYoFse3bx2AG/S9Nuo3SjM2ZbVpmRno0ajShfU4St9jFmXCp3i2XS7A==} peerDependencies: @@ -5477,6 +5485,12 @@ packages: eslint-plugin-no-relative-import-paths@1.6.1: resolution: {integrity: sha512-YZNeOnsOrJcwhFw0X29MXjIzu2P/f5X2BZDPWw1R3VUYBRFxNIh77lyoL/XrMU9ewZNQPcEvAgL/cBOT1P330A==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} @@ -8519,6 +8533,21 @@ snapshots: - typescript - vue-eslint-parser + '@abinnovision/eslint-config-react@2.2.0(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + eslint: 9.34.0(jiti@2.5.1) + eslint-config-alloy: 5.1.2(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react: 7.37.5(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.34.0(jiti@2.5.1)) + transitivePeerDependencies: + - '@babel/eslint-parser' + - '@babel/preset-react' + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-plugin-vue + - typescript + - vue-eslint-parser + '@abinnovision/eslint-config-typescript@2.2.1(eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) @@ -12702,7 +12731,6 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 - optional: true array.prototype.findlastindex@1.2.6: dependencies: @@ -12735,7 +12763,6 @@ snapshots: es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 - optional: true arraybuffer.prototype.slice@1.0.4: dependencies: @@ -13367,7 +13394,6 @@ snapshots: internal-slot: 1.1.0 iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - optional: true es-module-lexer@1.7.0: {} @@ -13667,6 +13693,10 @@ snapshots: eslint-plugin-no-relative-import-paths@1.6.1: {} + eslint-plugin-react-hooks@5.2.0(eslint@9.34.0(jiti@2.5.1)): + dependencies: + eslint: 9.34.0(jiti@2.5.1) + eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)): dependencies: array-includes: 3.1.9 @@ -13688,7 +13718,6 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - optional: true eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1)): dependencies: @@ -14680,7 +14709,6 @@ snapshots: get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 - optional: true jackspeak@4.1.0: dependencies: @@ -14746,7 +14774,6 @@ snapshots: array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 - optional: true jwa@2.0.1: dependencies: @@ -15542,7 +15569,6 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 - optional: true object.fromentries@2.0.8: dependencies: @@ -16181,7 +16207,6 @@ snapshots: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - optional: true restore-cursor@5.1.0: dependencies: @@ -16527,13 +16552,11 @@ snapshots: regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 side-channel: 1.1.0 - optional: true string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.24.0 - optional: true string.prototype.trim@1.2.10: dependencies: From 0be5d2836ed9619657ae4c19a9323197e06e454f Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 01:20:00 +0100 Subject: [PATCH 12/21] chore(imports): fix import order to satisfy eslint rules Applied `eslint-disable-next-line import/order` to prevent import order warnings for specific files across changelog and blog pages. No functional changes. --- apps/ui/src/app/blog/[slug]/page.tsx | 5 +++-- apps/ui/src/app/blog/category/[category]/page.tsx | 5 +++-- apps/ui/src/app/blog/page.tsx | 5 +++-- apps/ui/src/app/changelog/[slug]/page.tsx | 5 +++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/ui/src/app/blog/[slug]/page.tsx b/apps/ui/src/app/blog/[slug]/page.tsx index 4550422324..ffeca78b2f 100644 --- a/apps/ui/src/app/blog/[slug]/page.tsx +++ b/apps/ui/src/app/blog/[slug]/page.tsx @@ -1,3 +1,6 @@ +// eslint-disable-next-line import/order +import { allBlogs } from "content-collections"; + import { ArrowLeftIcon } from "lucide-react"; import Markdown from "markdown-to-jsx"; import Image from "next/image"; @@ -8,8 +11,6 @@ import Footer from "@/components/landing/footer"; import { HeroRSC } from "@/components/landing/hero-rsc"; import { getMarkdownOptions } from "@/lib/utils/markdown"; -import { allBlogs } from "content-collections"; - import type { Blog } from "content-collections"; interface BlogEntryPageProps { diff --git a/apps/ui/src/app/blog/category/[category]/page.tsx b/apps/ui/src/app/blog/category/[category]/page.tsx index 3bb138f4aa..9b1e12c03d 100644 --- a/apps/ui/src/app/blog/category/[category]/page.tsx +++ b/apps/ui/src/app/blog/category/[category]/page.tsx @@ -1,8 +1,9 @@ +// eslint-disable-next-line import/order +import { allBlogs } from "content-collections"; + import { BlogList } from "@/components/blog/list"; import { HeroRSC } from "@/components/landing/hero-rsc"; -import { allBlogs } from "content-collections"; - interface BlogItem { id: string; slug: string; diff --git a/apps/ui/src/app/blog/page.tsx b/apps/ui/src/app/blog/page.tsx index 542b47ca9e..3119a57b5a 100644 --- a/apps/ui/src/app/blog/page.tsx +++ b/apps/ui/src/app/blog/page.tsx @@ -1,8 +1,9 @@ +// eslint-disable-next-line import/order +import { allBlogs } from "content-collections"; + import { BlogList } from "@/components/blog/list"; import { HeroRSC } from "@/components/landing/hero-rsc"; -import { allBlogs } from "content-collections"; - interface BlogItem { id: string; slug: string; diff --git a/apps/ui/src/app/changelog/[slug]/page.tsx b/apps/ui/src/app/changelog/[slug]/page.tsx index 18e3f2c9aa..5c75cda02e 100644 --- a/apps/ui/src/app/changelog/[slug]/page.tsx +++ b/apps/ui/src/app/changelog/[slug]/page.tsx @@ -1,3 +1,6 @@ +// eslint-disable-next-line import/order +import { allChangelogs } from "content-collections"; + import { ArrowLeftIcon } from "lucide-react"; import Markdown from "markdown-to-jsx"; import Image from "next/image"; @@ -8,8 +11,6 @@ import Footer from "@/components/landing/footer"; import { HeroRSC } from "@/components/landing/hero-rsc"; import { getMarkdownOptions } from "@/lib/utils/markdown"; -import { allChangelogs } from "content-collections"; - import type { Changelog } from "content-collections"; interface ChangelogEntryPageProps { From 62036d764e6ccb103d6cfd028f5d0963c57afceb Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 01:32:35 +0100 Subject: [PATCH 13/21] chore(turbo): add build dependency to generate task Updated `generate` task in `turbo.json` to include `build` as a dependency, ensuring the build step is executed before generating outputs. --- turbo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbo.json b/turbo.json index 241986fb27..f12b0f8758 100644 --- a/turbo.json +++ b/turbo.json @@ -30,7 +30,7 @@ ] }, "generate": { - "dependsOn": ["^generate"], + "dependsOn": ["^generate", "build"], "outputs": ["openapi.json", "content/**", "migrations", "**/v1.d.ts"] }, "dev": { From f0cddece3dea369abfd8d3b14525428444af1976 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 01:40:49 +0100 Subject: [PATCH 14/21] chore: wip --- apps/api/.prettierignore | 1 + apps/gateway/.prettierignore | 1 + apps/ui/.prettierignore | 1 + apps/ui/eslint.config.mjs | 3 +++ turbo.json | 2 +- 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/api/.prettierignore b/apps/api/.prettierignore index 1521c8b765..c6cba51fff 100644 --- a/apps/api/.prettierignore +++ b/apps/api/.prettierignore @@ -1 +1,2 @@ dist +openapi.json diff --git a/apps/gateway/.prettierignore b/apps/gateway/.prettierignore index 1521c8b765..c6cba51fff 100644 --- a/apps/gateway/.prettierignore +++ b/apps/gateway/.prettierignore @@ -1 +1,2 @@ dist +openapi.json diff --git a/apps/ui/.prettierignore b/apps/ui/.prettierignore index 798ecd3d1a..7048ce1062 100644 --- a/apps/ui/.prettierignore +++ b/apps/ui/.prettierignore @@ -1,2 +1,3 @@ .content-collections .next +v1.d.ts diff --git a/apps/ui/eslint.config.mjs b/apps/ui/eslint.config.mjs index ea1ade92c0..035cd7a136 100644 --- a/apps/ui/eslint.config.mjs +++ b/apps/ui/eslint.config.mjs @@ -12,4 +12,7 @@ export default [ "react/no-unescaped-entities": "off", }, }, + { + ignores: ["**/v1.d.ts"], + }, ]; diff --git a/turbo.json b/turbo.json index f12b0f8758..c99e84fd92 100644 --- a/turbo.json +++ b/turbo.json @@ -30,7 +30,7 @@ ] }, "generate": { - "dependsOn": ["^generate", "build"], + "dependsOn": ["build", "^generate"], "outputs": ["openapi.json", "content/**", "migrations", "**/v1.d.ts"] }, "dev": { From 1a866563a478299a1ccac5310076944366357e40 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 01:51:57 +0100 Subject: [PATCH 15/21] chore: lintstaged --- .prettierignore | 1 - apps/api/.lintstagedrc.json | 5 + apps/docs/.lintstagedrc.json | 5 + apps/docs/.prettierignore | 1 + apps/gateway/.lintstagedrc.json | 5 + apps/ui/.lintstagedrc.json | 5 + apps/ui/src/lib/api/v1.d.ts | 5837 +++++++++---------- apps/worker/.lintstagedrc.json | 5 + package.json | 2 - packages/cache/.lintstagedrc.json | 5 + packages/db/.lintstagedrc.json | 5 + packages/instrumentation/.lintstagedrc.json | 5 + packages/logger/.lintstagedrc.json | 5 + packages/models/.lintstagedrc.json | 5 + packages/shared/.lintstagedrc.json | 5 + pnpm-lock.yaml | 348 +- 16 files changed, 3195 insertions(+), 3049 deletions(-) delete mode 100644 .prettierignore create mode 100644 apps/api/.lintstagedrc.json create mode 100644 apps/docs/.lintstagedrc.json create mode 100644 apps/gateway/.lintstagedrc.json create mode 100644 apps/ui/.lintstagedrc.json create mode 100644 apps/worker/.lintstagedrc.json create mode 100644 packages/cache/.lintstagedrc.json create mode 100644 packages/db/.lintstagedrc.json create mode 100644 packages/instrumentation/.lintstagedrc.json create mode 100644 packages/logger/.lintstagedrc.json create mode 100644 packages/models/.lintstagedrc.json create mode 100644 packages/shared/.lintstagedrc.json diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 1521c8b765..0000000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/apps/api/.lintstagedrc.json b/apps/api/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/apps/api/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/apps/docs/.lintstagedrc.json b/apps/docs/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/apps/docs/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/apps/docs/.prettierignore b/apps/docs/.prettierignore index de477d89b6..ad9eb5119f 100644 --- a/apps/docs/.prettierignore +++ b/apps/docs/.prettierignore @@ -2,3 +2,4 @@ content/(api)/ .content-collections .next .source +openapi.json diff --git a/apps/gateway/.lintstagedrc.json b/apps/gateway/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/apps/gateway/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/apps/ui/.lintstagedrc.json b/apps/ui/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/apps/ui/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/apps/ui/src/lib/api/v1.d.ts b/apps/ui/src/lib/api/v1.d.ts index 737cf32345..c5d67eeb36 100644 --- a/apps/ui/src/lib/api/v1.d.ts +++ b/apps/ui/src/lib/api/v1.d.ts @@ -4,2961 +4,2894 @@ */ export interface paths { - "/": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Health check response. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - version: string; - health: { - status: string; - database: { - connected: boolean; - error?: string; - }; - redis: { - connected: boolean; - error?: string; - }; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/stripe/webhook": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Webhook received successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - received: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/beacon": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: uuid */ - uuid: string; - type: string; - /** Format: date-time */ - timestamp: string; - version: string; - }; - }; - }; - responses: { - /** @description Beacon data received successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/user/me": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description User response object. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - user: { - id: string; - email: string; - name: string | null; - onboardingCompleted: boolean; - emailVerified: boolean; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description User deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name?: string; - /** Format: email */ - email?: string; - }; - }; - }; - responses: { - /** @description User updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - user: { - id: string; - email: string; - name: string | null; - onboardingCompleted: boolean; - emailVerified: boolean; - }; - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/user/me/passkeys/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Passkey deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/user/password": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - currentPassword: string; - newPassword: string; - }; - }; - }; - responses: { - /** @description Password updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized or incorrect current password. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/user/me/complete-onboarding": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": Record; - }; - }; - responses: { - /** @description Onboarding completed successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - user: { - id: string; - email: string; - name: string | null; - onboardingCompleted: boolean; - emailVerified: boolean; - }; - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description User not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: { - apiKeyId?: string; - providerKeyId?: string; - projectId?: string; - orgId?: string; - startDate?: string; - endDate?: string; - finishReason?: string; - unifiedFinishReason?: string; - provider?: string; - model?: string; - source?: string; - cursor?: string; - orderBy?: "createdAt_asc" | "createdAt_desc"; - limit?: string; - customHeaderKey?: string; - customHeaderValue?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description User logs response with pagination. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Optional message about the response */ - message?: string; - /** @description Array of log entries */ - logs: { - id: string; - requestId: string; - createdAt: string; - updatedAt: string; - organizationId: string; - projectId: string; - apiKeyId: string; - duration: number; - requestedModel: string; - requestedProvider: string | null; - usedModel: string; - usedProvider: string; - responseSize: number; - content: string | null; - reasoningContent: string | null; - unifiedFinishReason: string | null; - finishReason: string | null; - promptTokens: string | null; - completionTokens: string | null; - totalTokens: string | null; - reasoningTokens: string | null; - messages?: unknown; - temperature: number | null; - maxTokens: number | null; - topP: number | null; - frequencyPenalty: number | null; - presencePenalty: number | null; - reasoningEffort: string | null; - tools: - | { - /** @enum {string} */ - type: "function"; - function: { - name: string; - description?: string; - parameters?: { - [key: string]: unknown; - }; - }; - }[] - | null; - toolChoice: - | "none" - | "auto" - | "required" - | { - /** @enum {string} */ - type: "function"; - function: { - name: string; - }; - } - | unknown; - toolResults: - | { - id: string; - /** @enum {string} */ - type: "function"; - function: { - name: string; - arguments: string; - }; - }[] - | null; - hasError: boolean | null; - errorDetails: { - statusCode: number; - statusText: string; - responseText: string; - } | null; - cost: number | null; - inputCost: number | null; - outputCost: number | null; - requestCost: number | null; - estimatedCost: boolean | null; - canceled: boolean | null; - streamed: boolean | null; - cached: boolean | null; - customHeaders?: unknown; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string} */ - usedMode: "api-keys" | "credits"; - source: string | null; - }[]; - /** @description Pagination metadata */ - pagination: { - /** @description Cursor to use for the next page of results, null if no more results */ - nextCursor: string | null; - /** @description Whether there are more results available */ - hasMore: boolean; - /** @description Number of items requested per page */ - limit: number; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/activity": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query: { - days: string; - projectId?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Activity data grouped by day */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - activity: { - date: string; - requestCount: number; - inputTokens: number; - outputTokens: number; - totalTokens: number; - cost: number; - inputCost: number; - outputCost: number; - requestCost: number; - errorCount: number; - errorRate: number; - cacheCount: number; - cacheRate: number; - modelBreakdown: { - id: string; - provider: string; - requestCount: number; - inputTokens: number; - outputTokens: number; - totalTokens: number; - cost: number; - }[]; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/api": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: { - projectId?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of API keys. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - apiKeys: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - maskedToken: string; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - description: string; - projectId: string; - usageLimit: string | null; - }; - }; - }; - responses: { - /** @description API key created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - apiKey: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - token: string; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/api/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description API key deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description API key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description API key status updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - apiKey: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - maskedToken: string; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description API key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/keys/api/limit/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - usageLimit: string | null; - }; - }; - }; - responses: { - /** @description API key usage limit updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - apiKey: { - id: string; - createdAt: string; - updatedAt: string; - description: string; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - usageLimit: string | null; - usage: string; - projectId: string; - iamRules?: { - id: string; - createdAt: string; - updatedAt: string; - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - maskedToken: string; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description API key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/keys/api/{id}/iam": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of IAM rules for the API key. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - rules: { - id: string; - createdAt: string; - updatedAt: string; - apiKeyId: string; - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** - * @default active - * @enum {string} - */ - status?: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description IAM rule created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - rule: { - id: string; - createdAt: string; - updatedAt: string; - apiKeyId: string; - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/api/{id}/iam/{ruleId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - ruleId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description IAM rule deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - ruleId: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - ruleType?: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue?: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** - * @default active - * @enum {string} - */ - status?: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description IAM rule updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - rule: { - id: string; - createdAt: string; - updatedAt: string; - apiKeyId: string; - /** @enum {string} */ - ruleType: - | "allow_models" - | "deny_models" - | "allow_pricing" - | "deny_pricing" - | "allow_providers" - | "deny_providers"; - ruleValue: { - models?: string[]; - providers?: string[]; - /** @enum {string} */ - pricingType?: "free" | "paid"; - maxInputPrice?: number; - maxOutputPrice?: number; - }; - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - }; - }; - }; - trace?: never; - }; - "/keys/provider": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of provider keys. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - providerKeys: { - id: string; - createdAt: string; - updatedAt: string; - provider: string; - name: string | null; - baseUrl: string | null; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - organizationId: string; - maskedToken: string; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - provider: string; - token: string; - name?: string; - /** Format: uri */ - baseUrl?: string; - organizationId: string; - }; - }; - }; - responses: { - /** @description Provider key created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - providerKey: { - id: string; - createdAt: string; - updatedAt: string; - provider: string; - name: string | null; - baseUrl: string | null; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - organizationId: string; - token: string; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/keys/provider/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Provider key deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Provider key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - status: "active" | "inactive"; - }; - }; - }; - responses: { - /** @description Provider key status updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - providerKey: { - id: string; - createdAt: string; - updatedAt: string; - provider: string; - name: string | null; - baseUrl: string | null; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - organizationId: string; - maskedToken: string; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Provider key not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/projects/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Project retrieved successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - project: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Project deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Project not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - cachingEnabled?: boolean; - cacheDurationSeconds?: number; - /** @enum {string} */ - mode?: "api-keys" | "credits" | "hybrid"; - }; - }; - }; - responses: { - /** @description Project settings updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - project: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Project not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/projects": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name: string; - organizationId: string; - cachingEnabled?: boolean; - cacheDurationSeconds?: number; - /** @enum {string} */ - mode?: "api-keys" | "credits" | "hybrid"; - }; - }; - }; - responses: { - /** @description Project created successfully. */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - project: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description You do not have access to this organization. */ - 403: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/orgs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of organizations the user belongs to */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - organizations: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - credits: string; - /** @enum {string} */ - plan: "free" | "pro"; - planExpiresAt: string | null; - /** @enum {string} */ - retentionLevel: "retain" | "none"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - autoTopUpEnabled: boolean; - autoTopUpThreshold: string | null; - autoTopUpAmount: string | null; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name: string; - }; - }; - }; - responses: { - /** @description Organization created successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - organization: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - credits: string; - /** @enum {string} */ - plan: "free" | "pro"; - planExpiresAt: string | null; - /** @enum {string} */ - retentionLevel: "retain" | "none"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - autoTopUpEnabled: boolean; - autoTopUpThreshold: string | null; - autoTopUpAmount: string | null; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/orgs/{id}/projects": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of projects for the specified organization */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - projects: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - organizationId: string; - cachingEnabled: boolean; - cacheDurationSeconds: number; - /** @enum {string} */ - mode: "api-keys" | "credits" | "hybrid"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/orgs/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Organization deleted successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Organization not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - name?: string; - /** @enum {string} */ - retentionLevel?: "retain" | "none"; - autoTopUpEnabled?: boolean; - autoTopUpThreshold?: number; - autoTopUpAmount?: number; - }; - }; - }; - responses: { - /** @description Organization updated successfully. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - organization: { - id: string; - createdAt: string; - updatedAt: string; - name: string; - credits: string; - /** @enum {string} */ - plan: "free" | "pro"; - planExpiresAt: string | null; - /** @enum {string} */ - retentionLevel: "retain" | "none"; - /** @enum {string|null} */ - status: "active" | "inactive" | "deleted" | null; - autoTopUpEnabled: boolean; - autoTopUpThreshold: string | null; - autoTopUpAmount: string | null; - }; - }; - }; - }; - /** @description Unauthorized. */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - /** @description Organization not found. */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - trace?: never; - }; - "/orgs/{id}/transactions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of transactions for the specified organization */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - transactions: { - id: string; - createdAt: string; - updatedAt: string; - organizationId: string; - /** @enum {string} */ - type: - | "subscription_start" - | "subscription_cancel" - | "subscription_end" - | "credit_topup"; - amount: string | null; - creditAmount: string | null; - currency: string; - /** @enum {string} */ - status: "pending" | "completed" | "failed"; - stripePaymentIntentId: string | null; - stripeInvoiceId: string | null; - description: string | null; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/create-payment-intent": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - amount: number; - }; - }; - }; - responses: { - /** @description Payment intent created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - clientSecret: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/create-setup-intent": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Setup intent created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - clientSecret: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/payment-methods": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Payment methods retrieved successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - paymentMethods: { - id: string; - stripePaymentMethodId: string; - type: string; - isDefault: boolean; - cardBrand?: string; - cardLast4?: string; - expiryMonth?: number; - expiryYear?: number; - }[]; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/payment-methods/default": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - paymentMethodId: string; - }; - }; - }; - responses: { - /** @description Default payment method set successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/payment-methods/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Payment method deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/top-up-with-saved-method": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - amount: number; - paymentMethodId: string; - }; - }; - }; - responses: { - /** @description Payment processed successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/payments/calculate-fees": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - amount: number; - paymentMethodId?: string; - }; - }; - }; - responses: { - /** @description Fee calculation completed successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - baseAmount: number; - stripeFee: number; - internationalFee: number; - planFee: number; - totalFees: number; - totalAmount: number; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/chat/completion": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - messages: { - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content: string; - }[]; - model: string; - /** @default false */ - stream?: boolean; - apiKey?: string; - }; - }; - }; - responses: { - /** @description Chat completion response */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/chats": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of user's chats */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chats: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }[]; - }; - }; - }; - }; - }; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - title: string; - model: string; - }; - }; - }; - responses: { - /** @description Chat created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chat: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }; - }; - }; - }; - /** @description Chat limit reached or validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/chats/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Chat with messages */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chat: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }; - messages: { - id: string; - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content: string | null; - images: string | null; - sequence: number; - /** Format: date-time */ - createdAt: string; - }[]; - }; - }; - }; - /** @description Chat not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Chat deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: string; - }; - }; - }; - }; - }; - options?: never; - head?: never; - patch: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - title?: string; - /** @enum {string} */ - status?: "active" | "archived"; - }; - }; - }; - responses: { - /** @description Chat updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - chat: { - id: string; - title: string; - model: string; - /** @enum {string} */ - status: "active" | "archived" | "deleted"; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - messageCount: number; - }; - }; - }; - }; - }; - }; - trace?: never; - }; - "/chats/{id}/messages": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content?: string; - images?: string; - }; - }; - }; - responses: { - /** @description Message added successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - message: { - id: string; - /** @enum {string} */ - role: "user" | "assistant" | "system"; - content: string | null; - images: string | null; - sequence: number; - /** Format: date-time */ - createdAt: string; - }; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/create-pro-subscription": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** - * @default monthly - * @enum {string} - */ - billingCycle?: "monthly" | "yearly"; - }; - }; - }; - responses: { - /** @description Stripe Checkout session created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - checkoutUrl: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/cancel-pro-subscription": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Pro subscription canceled successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/resume-pro-subscription": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Pro subscription resumed successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/upgrade-to-yearly": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Subscription upgraded to yearly successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/subscriptions/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Subscription status retrieved successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @enum {string} */ - plan: "free" | "pro"; - subscriptionId: string | null; - planExpiresAt: string | null; - subscriptionCancelled: boolean; - /** @enum {string|null} */ - billingCycle: "monthly" | "yearly" | null; - isTrialActive: boolean; - trialStartDate: string | null; - trialEndDate: string | null; - }; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; + "/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Health check response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + version: string; + health: { + status: string; + database: { + connected: boolean; + error?: string; + }; + redis: { + connected: boolean; + error?: string; + }; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/stripe/webhook": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Webhook received successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + received: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/beacon": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: uuid */ + uuid: string; + type: string; + /** Format: date-time */ + timestamp: string; + version: string; + }; + }; + }; + responses: { + /** @description Beacon data received successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/user/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User response object. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + user: { + id: string; + email: string; + name: string | null; + onboardingCompleted: boolean; + emailVerified: boolean; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name?: string; + /** Format: email */ + email?: string; + }; + }; + }; + responses: { + /** @description User updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + user: { + id: string; + email: string; + name: string | null; + onboardingCompleted: boolean; + emailVerified: boolean; + }; + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/user/me/passkeys/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Passkey deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/user/password": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + currentPassword: string; + newPassword: string; + }; + }; + }; + responses: { + /** @description Password updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized or incorrect current password. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/user/me/complete-onboarding": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description Onboarding completed successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + user: { + id: string; + email: string; + name: string | null; + onboardingCompleted: boolean; + emailVerified: boolean; + }; + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description User not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: { + apiKeyId?: string; + providerKeyId?: string; + projectId?: string; + orgId?: string; + startDate?: string; + endDate?: string; + finishReason?: string; + unifiedFinishReason?: string; + provider?: string; + model?: string; + source?: string; + cursor?: string; + orderBy?: "createdAt_asc" | "createdAt_desc"; + limit?: string; + customHeaderKey?: string; + customHeaderValue?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User logs response with pagination. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @description Optional message about the response */ + message?: string; + /** @description Array of log entries */ + logs: { + id: string; + requestId: string; + createdAt: string; + updatedAt: string; + organizationId: string; + projectId: string; + apiKeyId: string; + duration: number; + requestedModel: string; + requestedProvider: string | null; + usedModel: string; + usedProvider: string; + responseSize: number; + content: string | null; + reasoningContent: string | null; + unifiedFinishReason: string | null; + finishReason: string | null; + promptTokens: string | null; + completionTokens: string | null; + totalTokens: string | null; + reasoningTokens: string | null; + messages?: unknown; + temperature: number | null; + maxTokens: number | null; + topP: number | null; + frequencyPenalty: number | null; + presencePenalty: number | null; + reasoningEffort: string | null; + tools: { + /** @enum {string} */ + type: "function"; + function: { + name: string; + description?: string; + parameters?: { + [key: string]: unknown; + }; + }; + }[] | null; + toolChoice: "none" | "auto" | "required" | { + /** @enum {string} */ + type: "function"; + function: { + name: string; + }; + } | unknown; + toolResults: { + id: string; + /** @enum {string} */ + type: "function"; + function: { + name: string; + arguments: string; + }; + }[] | null; + hasError: boolean | null; + errorDetails: { + statusCode: number; + statusText: string; + responseText: string; + } | null; + cost: number | null; + inputCost: number | null; + outputCost: number | null; + requestCost: number | null; + estimatedCost: boolean | null; + canceled: boolean | null; + streamed: boolean | null; + cached: boolean | null; + customHeaders?: unknown; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string} */ + usedMode: "api-keys" | "credits"; + source: string | null; + }[]; + /** @description Pagination metadata */ + pagination: { + /** @description Cursor to use for the next page of results, null if no more results */ + nextCursor: string | null; + /** @description Whether there are more results available */ + hasMore: boolean; + /** @description Number of items requested per page */ + limit: number; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/activity": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query: { + days: string; + projectId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Activity data grouped by day */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + activity: { + date: string; + requestCount: number; + inputTokens: number; + outputTokens: number; + totalTokens: number; + cost: number; + inputCost: number; + outputCost: number; + requestCost: number; + errorCount: number; + errorRate: number; + cacheCount: number; + cacheRate: number; + modelBreakdown: { + id: string; + provider: string; + requestCount: number; + inputTokens: number; + outputTokens: number; + totalTokens: number; + cost: number; + }[]; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/api": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: { + projectId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of API keys. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + apiKeys: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + maskedToken: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + description: string; + projectId: string; + usageLimit: string | null; + }; + }; + }; + responses: { + /** @description API key created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + apiKey: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + token: string; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/api/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description API key deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description API key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description API key status updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + apiKey: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + maskedToken: string; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description API key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/keys/api/limit/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + usageLimit: string | null; + }; + }; + }; + responses: { + /** @description API key usage limit updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + apiKey: { + id: string; + createdAt: string; + updatedAt: string; + description: string; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + usageLimit: string | null; + usage: string; + projectId: string; + iamRules?: { + id: string; + createdAt: string; + updatedAt: string; + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + maskedToken: string; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description API key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/keys/api/{id}/iam": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of IAM rules for the API key. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + rules: { + id: string; + createdAt: string; + updatedAt: string; + apiKeyId: string; + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** + * @default active + * @enum {string} + */ + status?: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description IAM rule created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + rule: { + id: string; + createdAt: string; + updatedAt: string; + apiKeyId: string; + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/api/{id}/iam/{ruleId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + ruleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description IAM rule deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + ruleId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + ruleType?: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue?: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** + * @default active + * @enum {string} + */ + status?: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description IAM rule updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + rule: { + id: string; + createdAt: string; + updatedAt: string; + apiKeyId: string; + /** @enum {string} */ + ruleType: "allow_models" | "deny_models" | "allow_pricing" | "deny_pricing" | "allow_providers" | "deny_providers"; + ruleValue: { + models?: string[]; + providers?: string[]; + /** @enum {string} */ + pricingType?: "free" | "paid"; + maxInputPrice?: number; + maxOutputPrice?: number; + }; + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + }; + }; + }; + trace?: never; + }; + "/keys/provider": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of provider keys. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + providerKeys: { + id: string; + createdAt: string; + updatedAt: string; + provider: string; + name: string | null; + baseUrl: string | null; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + organizationId: string; + maskedToken: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + provider: string; + token: string; + name?: string; + /** Format: uri */ + baseUrl?: string; + organizationId: string; + }; + }; + }; + responses: { + /** @description Provider key created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + providerKey: { + id: string; + createdAt: string; + updatedAt: string; + provider: string; + name: string | null; + baseUrl: string | null; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + organizationId: string; + token: string; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keys/provider/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Provider key deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Provider key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + status: "active" | "inactive"; + }; + }; + }; + responses: { + /** @description Provider key status updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + providerKey: { + id: string; + createdAt: string; + updatedAt: string; + provider: string; + name: string | null; + baseUrl: string | null; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + organizationId: string; + maskedToken: string; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Provider key not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/projects/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Project retrieved successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + project: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Project deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Project not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + cachingEnabled?: boolean; + cacheDurationSeconds?: number; + /** @enum {string} */ + mode?: "api-keys" | "credits" | "hybrid"; + }; + }; + }; + responses: { + /** @description Project settings updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + project: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Project not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/projects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name: string; + organizationId: string; + cachingEnabled?: boolean; + cacheDurationSeconds?: number; + /** @enum {string} */ + mode?: "api-keys" | "credits" | "hybrid"; + }; + }; + }; + responses: { + /** @description Project created successfully. */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + project: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description You do not have access to this organization. */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/orgs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of organizations the user belongs to */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + organizations: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + credits: string; + /** @enum {string} */ + plan: "free" | "pro"; + planExpiresAt: string | null; + /** @enum {string} */ + retentionLevel: "retain" | "none"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + autoTopUpEnabled: boolean; + autoTopUpThreshold: string | null; + autoTopUpAmount: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name: string; + }; + }; + }; + responses: { + /** @description Organization created successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + organization: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + credits: string; + /** @enum {string} */ + plan: "free" | "pro"; + planExpiresAt: string | null; + /** @enum {string} */ + retentionLevel: "retain" | "none"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + autoTopUpEnabled: boolean; + autoTopUpThreshold: string | null; + autoTopUpAmount: string | null; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/orgs/{id}/projects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of projects for the specified organization */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + projects: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + organizationId: string; + cachingEnabled: boolean; + cacheDurationSeconds: number; + /** @enum {string} */ + mode: "api-keys" | "credits" | "hybrid"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/orgs/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Organization deleted successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Organization not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name?: string; + /** @enum {string} */ + retentionLevel?: "retain" | "none"; + autoTopUpEnabled?: boolean; + autoTopUpThreshold?: number; + autoTopUpAmount?: number; + }; + }; + }; + responses: { + /** @description Organization updated successfully. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + organization: { + id: string; + createdAt: string; + updatedAt: string; + name: string; + credits: string; + /** @enum {string} */ + plan: "free" | "pro"; + planExpiresAt: string | null; + /** @enum {string} */ + retentionLevel: "retain" | "none"; + /** @enum {string|null} */ + status: "active" | "inactive" | "deleted" | null; + autoTopUpEnabled: boolean; + autoTopUpThreshold: string | null; + autoTopUpAmount: string | null; + }; + }; + }; + }; + /** @description Unauthorized. */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Organization not found. */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + trace?: never; + }; + "/orgs/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of transactions for the specified organization */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + transactions: { + id: string; + createdAt: string; + updatedAt: string; + organizationId: string; + /** @enum {string} */ + type: "subscription_start" | "subscription_cancel" | "subscription_end" | "credit_topup"; + amount: string | null; + creditAmount: string | null; + currency: string; + /** @enum {string} */ + status: "pending" | "completed" | "failed"; + stripePaymentIntentId: string | null; + stripeInvoiceId: string | null; + description: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/create-payment-intent": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + amount: number; + }; + }; + }; + responses: { + /** @description Payment intent created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + clientSecret: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/create-setup-intent": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Setup intent created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + clientSecret: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/payment-methods": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Payment methods retrieved successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + paymentMethods: { + id: string; + stripePaymentMethodId: string; + type: string; + isDefault: boolean; + cardBrand?: string; + cardLast4?: string; + expiryMonth?: number; + expiryYear?: number; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/payment-methods/default": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + paymentMethodId: string; + }; + }; + }; + responses: { + /** @description Default payment method set successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/payment-methods/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Payment method deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/top-up-with-saved-method": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + amount: number; + paymentMethodId: string; + }; + }; + }; + responses: { + /** @description Payment processed successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/payments/calculate-fees": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + amount: number; + paymentMethodId?: string; + }; + }; + }; + responses: { + /** @description Fee calculation completed successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + baseAmount: number; + stripeFee: number; + internationalFee: number; + planFee: number; + totalFees: number; + totalAmount: number; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chat/completion": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + messages: { + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content: string; + }[]; + model: string; + /** @default false */ + stream?: boolean; + apiKey?: string; + }; + }; + }; + responses: { + /** @description Chat completion response */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chats": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of user's chats */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chats: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }[]; + }; + }; + }; + }; + }; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + title: string; + model: string; + }; + }; + }; + responses: { + /** @description Chat created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chat: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }; + }; + }; + }; + /** @description Chat limit reached or validation error */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chats/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Chat with messages */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chat: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }; + messages: { + id: string; + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content: string | null; + images: string | null; + sequence: number; + /** Format: date-time */ + createdAt: string; + }[]; + }; + }; + }; + /** @description Chat not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Chat deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + title?: string; + /** @enum {string} */ + status?: "active" | "archived"; + }; + }; + }; + responses: { + /** @description Chat updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + chat: { + id: string; + title: string; + model: string; + /** @enum {string} */ + status: "active" | "archived" | "deleted"; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + messageCount: number; + }; + }; + }; + }; + }; + }; + trace?: never; + }; + "/chats/{id}/messages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content?: string; + images?: string; + }; + }; + }; + responses: { + /** @description Message added successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: { + id: string; + /** @enum {string} */ + role: "user" | "assistant" | "system"; + content: string | null; + images: string | null; + sequence: number; + /** Format: date-time */ + createdAt: string; + }; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/create-pro-subscription": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** + * @default monthly + * @enum {string} + */ + billingCycle?: "monthly" | "yearly"; + }; + }; + }; + responses: { + /** @description Stripe Checkout session created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + checkoutUrl: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/cancel-pro-subscription": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Pro subscription canceled successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/resume-pro-subscription": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Pro subscription resumed successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/upgrade-to-yearly": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Subscription upgraded to yearly successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/subscriptions/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Subscription status retrieved successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @enum {string} */ + plan: "free" | "pro"; + subscriptionId: string | null; + planExpiresAt: string | null; + subscriptionCancelled: boolean; + /** @enum {string|null} */ + billingCycle: "monthly" | "yearly" | null; + isTrialActive: boolean; + trialStartDate: string | null; + trialEndDate: string | null; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { - schemas: never; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export type operations = Record; diff --git a/apps/worker/.lintstagedrc.json b/apps/worker/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/apps/worker/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/package.json b/package.json index 76b93978e6..fa1bc234bf 100644 --- a/package.json +++ b/package.json @@ -49,10 +49,8 @@ "lint-staged": "16.0.0", "nodemon": "3.1.10", "prettier": "^3.6.2", - "prettier-plugin-tailwindcss": "^0.6.14", "resolve-tspaths": "0.8.23", "sort-package-json": "3.4.0", - "tsx": "^4.19.4", "turbo": "^2.5.6", "typescript": "5.9.2", "vite": "^6.3.6", diff --git a/packages/cache/.lintstagedrc.json b/packages/cache/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/packages/cache/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/packages/db/.lintstagedrc.json b/packages/db/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/packages/db/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/packages/instrumentation/.lintstagedrc.json b/packages/instrumentation/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/packages/instrumentation/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/packages/logger/.lintstagedrc.json b/packages/logger/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/packages/logger/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/packages/models/.lintstagedrc.json b/packages/models/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/packages/models/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/packages/shared/.lintstagedrc.json b/packages/shared/.lintstagedrc.json new file mode 100644 index 0000000000..0c4499386f --- /dev/null +++ b/packages/shared/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "package.json": "pnpm sort-package-json", + "**/*.{js,jsx,ts,tsx}": ["pnpm eslint --fix", "pnpm prettier --write"], + "**/*.{md,mdx,json,yml,yaml}": ["pnpm prettier --write"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46f2c673e1..a632e72c4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,18 +66,12 @@ importers: prettier: specifier: ^3.6.2 version: 3.6.2 - prettier-plugin-tailwindcss: - specifier: ^0.6.14 - version: 0.6.14(prettier@3.6.2) resolve-tspaths: specifier: 0.8.23 version: 0.8.23(typescript@5.9.2) sort-package-json: specifier: 3.4.0 version: 3.4.0 - tsx: - specifier: ^4.19.4 - version: 4.19.4 turbo: specifier: ^2.5.6 version: 2.5.6 @@ -195,7 +189,7 @@ importers: version: 15.6.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.12) gateway: specifier: workspace:* - version: link:../gateway + version: file:apps/gateway(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3) lucide-react: specifier: ^0.539.0 version: 0.539.0(react@19.1.1) @@ -2150,6 +2144,24 @@ packages: '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} + '@llmgateway/cache@file:packages/cache': + resolution: {directory: packages/cache, type: directory} + + '@llmgateway/db@file:packages/db': + resolution: {directory: packages/db, type: directory} + + '@llmgateway/instrumentation@file:packages/instrumentation': + resolution: {directory: packages/instrumentation, type: directory} + + '@llmgateway/logger@file:packages/logger': + resolution: {directory: packages/logger, type: directory} + + '@llmgateway/models@file:packages/models': + resolution: {directory: packages/models, type: directory} + + '@llmgateway/shared@file:packages/shared': + resolution: {directory: packages/shared, type: directory} + '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} @@ -5897,6 +5909,9 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gateway@file:apps/gateway: + resolution: {directory: apps/gateway, type: directory} + gaxios@6.7.1: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} @@ -7308,67 +7323,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-tailwindcss@0.6.14: - resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} - engines: {node: '>=14.21.3'} - peerDependencies: - '@ianvs/prettier-plugin-sort-imports': '*' - '@prettier/plugin-hermes': '*' - '@prettier/plugin-oxc': '*' - '@prettier/plugin-pug': '*' - '@shopify/prettier-plugin-liquid': '*' - '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig': '*' - prettier: ^3.0 - prettier-plugin-astro: '*' - prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' - prettier-plugin-jsdoc: '*' - prettier-plugin-marko: '*' - prettier-plugin-multiline-arrays: '*' - prettier-plugin-organize-attributes: '*' - prettier-plugin-organize-imports: '*' - prettier-plugin-sort-imports: '*' - prettier-plugin-style-order: '*' - prettier-plugin-svelte: '*' - peerDependenciesMeta: - '@ianvs/prettier-plugin-sort-imports': - optional: true - '@prettier/plugin-hermes': - optional: true - '@prettier/plugin-oxc': - optional: true - '@prettier/plugin-pug': - optional: true - '@shopify/prettier-plugin-liquid': - optional: true - '@trivago/prettier-plugin-sort-imports': - optional: true - '@zackad/prettier-plugin-twig': - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-css-order: - optional: true - prettier-plugin-import-sort: - optional: true - prettier-plugin-jsdoc: - optional: true - prettier-plugin-marko: - optional: true - prettier-plugin-multiline-arrays: - optional: true - prettier-plugin-organize-attributes: - optional: true - prettier-plugin-organize-imports: - optional: true - prettier-plugin-sort-imports: - optional: true - prettier-plugin-style-order: - optional: true - prettier-plugin-svelte: - optional: true - prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} @@ -8427,6 +8381,9 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + worker@file:apps/worker: + resolution: {directory: apps/worker, type: directory} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -9623,7 +9580,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9637,7 +9594,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -9928,6 +9885,109 @@ snapshots: '@levischuck/tiny-cbor@0.2.11': {} + '@llmgateway/cache@file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': + dependencies: + '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/logger': file:packages/logger + ioredis: 5.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - sql.js + - sqlite3 + - supports-color + + '@llmgateway/db@file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': + dependencies: + '@llmgateway/logger': file:packages/logger + drizzle-orm: 1.0.0-beta.1-7946562(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(pg@8.16.3) + nanoid: 5.1.5 + pg: 8.16.3 + zod: 3.25.75 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - sql.js + - sqlite3 + + '@llmgateway/instrumentation@file:packages/instrumentation': + dependencies: + '@google-cloud/opentelemetry-cloud-trace-exporter': 3.0.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)) + '@google-cloud/opentelemetry-cloud-trace-propagator': 0.21.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) + '@llmgateway/logger': file:packages/logger + '@opentelemetry/api': 1.9.0 + '@opentelemetry/auto-instrumentations-node': 0.64.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + hono: 4.9.7 + transitivePeerDependencies: + - encoding + - supports-color + + '@llmgateway/logger@file:packages/logger': + dependencies: + '@opentelemetry/api': 1.9.0 + pino: 9.9.0 + pino-pretty: 13.1.1 + + '@llmgateway/models@file:packages/models': + dependencies: + '@llmgateway/logger': file:packages/logger + + '@llmgateway/shared@file:packages/shared': + dependencies: + zod: 3.25.75 + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: '@types/estree': 1.0.8 @@ -12458,7 +12518,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -12468,7 +12528,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12487,7 +12547,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 @@ -12502,7 +12562,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13172,10 +13232,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1: - dependencies: - ms: 2.1.3 - debug@4.4.1(supports-color@10.0.0): dependencies: ms: 2.1.3 @@ -13436,7 +13492,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.19.12): dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.19.12 transitivePeerDependencies: - supports-color @@ -13519,6 +13575,7 @@ snapshots: '@esbuild/win32-arm64': 0.25.4 '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 + optional: true esbuild@0.25.5: optionalDependencies: @@ -13638,7 +13695,7 @@ snapshots: eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)): dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.34.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 @@ -13752,7 +13809,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -14188,6 +14245,70 @@ snapshots: functions-have-names@1.2.3: {} + gateway@file:apps/gateway(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3): + dependencies: + '@hono/node-server': 1.19.0(hono@4.9.7) + '@hono/swagger-ui': 0.5.1(hono@4.9.7) + '@hono/zod-openapi': 0.19.8(hono@4.9.7)(zod@3.25.75) + '@hono/zod-validator': 0.7.2(hono@4.9.7)(zod@3.25.75) + '@llmgateway/cache': file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/instrumentation': file:packages/instrumentation + '@llmgateway/logger': file:packages/logger + '@llmgateway/models': file:packages/models + '@opentelemetry/api': 1.9.0 + '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) + dotenv: 16.5.0 + gpt-tokenizer: 3.0.1 + hono: 4.9.7 + hono-openapi: 0.4.8(@hono/zod-validator@0.7.2(hono@4.9.7)(zod@3.25.75))(hono@4.9.7)(openapi-types@12.1.3)(zod-openapi@4.2.4(zod@3.25.75))(zod@3.25.75) + ioredis: 5.6.1 + redis: 5.8.2 + worker: file:apps/worker(@opentelemetry/api@1.9.0)(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + zod: 3.25.75 + zod-openapi: 4.2.4(zod@3.25.75) + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@hono/arktype-validator' + - '@hono/effect-validator' + - '@hono/typebox-validator' + - '@hono/valibot-validator' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@planetscale/database' + - '@prisma/client' + - '@sinclair/typebox' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/node' + - '@types/pg' + - '@types/sql.js' + - '@valibot/to-json-schema' + - '@vercel/postgres' + - '@xata.io/client' + - arktype + - better-sqlite3 + - bun-types + - effect + - encoding + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - openapi-types + - pg-native + - postgres + - prisma + - sql.js + - sqlite3 + - supports-color + - valibot + gaxios@6.7.1: dependencies: extend: 3.0.2 @@ -14211,7 +14332,7 @@ snapshots: gel@2.1.0: dependencies: '@petamoriken/float16': 3.9.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) env-paths: 3.0.0 semver: 7.7.2 shell-quote: 1.8.3 @@ -14254,6 +14375,7 @@ snapshots: get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 + optional: true get-tsconfig@4.10.1: dependencies: @@ -14465,7 +14587,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14520,7 +14642,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -14534,7 +14656,7 @@ snapshots: dependencies: '@ioredis/commands': 1.3.1 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -14854,7 +14976,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 @@ -15369,7 +15491,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -15873,10 +15995,6 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.6.14(prettier@3.6.2): - dependencies: - prettier: 3.6.2 - prettier@3.6.2: {} pretty-bytes@7.0.0: {} @@ -16177,7 +16295,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -16756,6 +16874,7 @@ snapshots: get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 + optional: true turbo-darwin-64@2.5.6: optional: true @@ -16973,7 +17092,7 @@ snapshots: vite-node@3.2.3(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.3.6(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1) @@ -17047,7 +17166,7 @@ snapshots: '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 chai: 5.2.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 @@ -17145,6 +17264,47 @@ snapshots: wordwrap@1.0.0: {} + worker@file:apps/worker(@opentelemetry/api@1.9.0)(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6): + dependencies: + '@llmgateway/cache': file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) + '@llmgateway/logger': file:packages/logger + '@llmgateway/models': file:packages/models + '@llmgateway/shared': file:packages/shared + stripe: 18.1.1(@types/node@24.3.3) + zod: 3.25.75 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/node' + - '@types/pg' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - sql.js + - sqlite3 + - supports-color + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 From 93ee18528a3b8777a257ce5c2d2794bb281454da Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 02:25:54 +0100 Subject: [PATCH 16/21] chore(dev): add tsc-watch for improved DX Updated `dev` scripts in `apps/api` and `apps/worker` to use `tsc-watch` for triggering `resolve-tspaths` on successful builds. Added `tsc-watch` dependency to `package.json`. Cleaned up `pnpm-lock.yaml` by removing unused dependency mappings. --- apps/api/package.json | 2 +- apps/api/src/index.ts | 2 +- apps/gateway/package.json | 3 +- apps/worker/package.json | 2 +- package.json | 1 + pnpm-lock.yaml | 626 +++++++------------------------------- 6 files changed, 112 insertions(+), 524 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 8eda081dfd..57c5c21f5f 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -9,7 +9,7 @@ ], "scripts": { "build": "tsc && resolve-tspaths && pnpm run generate", - "dev": "tsc && resolve-tspaths && nodemon dist/serve.js", + "dev": "concurrently \"tsc-watch --onSuccess 'resolve-tspaths'\" \"nodemon dist/serve.js\"", "format": "eslint --fix . && prettier --write .", "generate": "node ./dist/scripts/generate-openapi.js", "lint": "eslint . && prettier --check .", diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 58037b6dfc..a158f28ac6 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -148,7 +148,7 @@ app.openapi(root, async (c) => { return c.json({ message: "OK", - version: process.env.APP_VERSION || "v0.0.0-unknown", + version: process.env.APP_VERSION || "v0.0.0-55555555", health, }); }); diff --git a/apps/gateway/package.json b/apps/gateway/package.json index bb3de96a35..345198ac43 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -15,7 +15,8 @@ ], "scripts": { "build": "tsc && resolve-tspaths && pnpm run generate", - "dev": "tsc && resolve-tspaths && nodemon dist/serve.js", + "dev": "concurrently \"tsc-watch --onSuccess 'resolve-tspaths'\" \"nodemon dist/serve.js\"", + "exec-dev": "resolve-tspaths && node dist/serve.js", "format": "eslint --fix . && prettier --write .", "generate": "node ./dist/scripts/generate-openapi.js", "lint": "eslint . && prettier --check .", diff --git a/apps/worker/package.json b/apps/worker/package.json index f543b3ce66..295084125d 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -17,7 +17,7 @@ ], "scripts": { "build": "tsc && resolve-tspaths && resolve-tspaths", - "dev": "tsc && resolve-tspaths && nodemon dist/index.js", + "dev": "concurrently \"tsc-watch --onSuccess 'resolve-tspaths'\" \"nodemon dist/index.js\"", "format": "eslint --fix . && prettier --write .", "lint": "eslint . && prettier --check .", "start": "node --enable-source-maps dist/index.js" diff --git a/package.json b/package.json index fa1bc234bf..367d2fa53f 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "prettier": "^3.6.2", "resolve-tspaths": "0.8.23", "sort-package-json": "3.4.0", + "tsc-watch": "7.1.1", "turbo": "^2.5.6", "typescript": "5.9.2", "vite": "^6.3.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a632e72c4b..07dd5a7952 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,6 +72,9 @@ importers: sort-package-json: specifier: 3.4.0 version: 3.4.0 + tsc-watch: + specifier: 7.1.1 + version: 7.1.1(typescript@5.9.2) turbo: specifier: ^2.5.6 version: 2.5.6 @@ -189,7 +192,7 @@ importers: version: 15.6.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.12) gateway: specifier: workspace:* - version: file:apps/gateway(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3) + version: link:../gateway lucide-react: specifier: ^0.539.0 version: 0.539.0(react@19.1.1) @@ -938,12 +941,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.5': resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} @@ -974,12 +971,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.5': resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} @@ -1010,12 +1001,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.5': resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} @@ -1046,12 +1031,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.5': resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} @@ -1082,12 +1061,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.5': resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} @@ -1118,12 +1091,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.5': resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} @@ -1154,12 +1121,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.5': resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} @@ -1190,12 +1151,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} @@ -1226,12 +1181,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.5': resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} @@ -1262,12 +1211,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.5': resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} @@ -1298,12 +1241,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.5': resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} @@ -1334,12 +1271,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.5': resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} @@ -1370,12 +1301,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.5': resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} @@ -1406,12 +1331,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.5': resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} @@ -1442,12 +1361,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.5': resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} @@ -1478,12 +1391,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.5': resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} @@ -1514,12 +1421,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.5': resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} @@ -1538,12 +1439,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.5': resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} @@ -1574,12 +1469,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} @@ -1598,12 +1487,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.5': resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} @@ -1634,12 +1517,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} @@ -1682,12 +1559,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.5': resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} @@ -1718,12 +1589,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.5': resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} @@ -1754,12 +1619,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.5': resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} @@ -1790,12 +1649,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.5': resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} @@ -2144,24 +1997,6 @@ packages: '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} - '@llmgateway/cache@file:packages/cache': - resolution: {directory: packages/cache, type: directory} - - '@llmgateway/db@file:packages/db': - resolution: {directory: packages/db, type: directory} - - '@llmgateway/instrumentation@file:packages/instrumentation': - resolution: {directory: packages/instrumentation, type: directory} - - '@llmgateway/logger@file:packages/logger': - resolution: {directory: packages/logger, type: directory} - - '@llmgateway/models@file:packages/models': - resolution: {directory: packages/models, type: directory} - - '@llmgateway/shared@file:packages/shared': - resolution: {directory: packages/shared, type: directory} - '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} @@ -5277,6 +5112,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -5376,11 +5214,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.5: resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} @@ -5589,6 +5422,9 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -5739,6 +5575,9 @@ packages: react-dom: optional: true + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -5909,9 +5748,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gateway@file:apps/gateway: - resolution: {directory: apps/gateway, type: directory} - gaxios@6.7.1: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} @@ -5953,9 +5789,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} @@ -6648,6 +6481,9 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -6977,6 +6813,9 @@ packages: sass: optional: true + node-cleanup@2.1.2: + resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==} + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -7184,6 +7023,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -7350,6 +7192,11 @@ packages: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} @@ -7779,6 +7626,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -7799,6 +7649,9 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -8024,6 +7877,13 @@ packages: peerDependencies: typescript: '>=4.8.4' + tsc-watch@7.1.1: + resolution: {integrity: sha512-r6t37Dkk4vK44HwxOe+OzjpE/gDamZAwqXhtcAJD/hPVblcjJK45NxbK0HcDASXG0U4pEnCh640JZbeDVSC6yA==} + engines: {node: '>=12.12.0'} + hasBin: true + peerDependencies: + typescript: '*' + tsconfck@3.1.5: resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} engines: {node: ^18 || >=20} @@ -8381,9 +8241,6 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - worker@file:apps/worker: - resolution: {directory: apps/worker, type: directory} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -9132,9 +8989,6 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.25.4': - optional: true - '@esbuild/aix-ppc64@0.25.5': optional: true @@ -9150,9 +9004,6 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.25.4': - optional: true - '@esbuild/android-arm64@0.25.5': optional: true @@ -9168,9 +9019,6 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.25.4': - optional: true - '@esbuild/android-arm@0.25.5': optional: true @@ -9186,9 +9034,6 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.25.4': - optional: true - '@esbuild/android-x64@0.25.5': optional: true @@ -9204,9 +9049,6 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.25.4': - optional: true - '@esbuild/darwin-arm64@0.25.5': optional: true @@ -9222,9 +9064,6 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.25.4': - optional: true - '@esbuild/darwin-x64@0.25.5': optional: true @@ -9240,9 +9079,6 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.25.4': - optional: true - '@esbuild/freebsd-arm64@0.25.5': optional: true @@ -9258,9 +9094,6 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.25.4': - optional: true - '@esbuild/freebsd-x64@0.25.5': optional: true @@ -9276,9 +9109,6 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.25.4': - optional: true - '@esbuild/linux-arm64@0.25.5': optional: true @@ -9294,9 +9124,6 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.25.4': - optional: true - '@esbuild/linux-arm@0.25.5': optional: true @@ -9312,9 +9139,6 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.25.4': - optional: true - '@esbuild/linux-ia32@0.25.5': optional: true @@ -9330,9 +9154,6 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.25.4': - optional: true - '@esbuild/linux-loong64@0.25.5': optional: true @@ -9348,9 +9169,6 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.25.4': - optional: true - '@esbuild/linux-mips64el@0.25.5': optional: true @@ -9366,9 +9184,6 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.25.4': - optional: true - '@esbuild/linux-ppc64@0.25.5': optional: true @@ -9384,9 +9199,6 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.25.4': - optional: true - '@esbuild/linux-riscv64@0.25.5': optional: true @@ -9402,9 +9214,6 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.25.4': - optional: true - '@esbuild/linux-s390x@0.25.5': optional: true @@ -9420,9 +9229,6 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.25.4': - optional: true - '@esbuild/linux-x64@0.25.5': optional: true @@ -9432,9 +9238,6 @@ snapshots: '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.25.4': - optional: true - '@esbuild/netbsd-arm64@0.25.5': optional: true @@ -9450,9 +9253,6 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.25.4': - optional: true - '@esbuild/netbsd-x64@0.25.5': optional: true @@ -9462,9 +9262,6 @@ snapshots: '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.25.4': - optional: true - '@esbuild/openbsd-arm64@0.25.5': optional: true @@ -9480,9 +9277,6 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.25.4': - optional: true - '@esbuild/openbsd-x64@0.25.5': optional: true @@ -9504,9 +9298,6 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.25.4': - optional: true - '@esbuild/sunos-x64@0.25.5': optional: true @@ -9522,9 +9313,6 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.25.4': - optional: true - '@esbuild/win32-arm64@0.25.5': optional: true @@ -9540,9 +9328,6 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.25.4': - optional: true - '@esbuild/win32-ia32@0.25.5': optional: true @@ -9558,9 +9343,6 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.25.4': - optional: true - '@esbuild/win32-x64@0.25.5': optional: true @@ -9580,7 +9362,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9594,7 +9376,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -9885,109 +9667,6 @@ snapshots: '@levischuck/tiny-cbor@0.2.11': {} - '@llmgateway/cache@file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': - dependencies: - '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/logger': file:packages/logger - ioredis: 5.7.0 - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@vercel/postgres' - - '@xata.io/client' - - better-sqlite3 - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - pg-native - - postgres - - prisma - - sql.js - - sqlite3 - - supports-color - - '@llmgateway/db@file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)': - dependencies: - '@llmgateway/logger': file:packages/logger - drizzle-orm: 1.0.0-beta.1-7946562(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(pg@8.16.3) - nanoid: 5.1.5 - pg: 8.16.3 - zod: 3.25.75 - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@vercel/postgres' - - '@xata.io/client' - - better-sqlite3 - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - pg-native - - postgres - - prisma - - sql.js - - sqlite3 - - '@llmgateway/instrumentation@file:packages/instrumentation': - dependencies: - '@google-cloud/opentelemetry-cloud-trace-exporter': 3.0.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)) - '@google-cloud/opentelemetry-cloud-trace-propagator': 0.21.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) - '@llmgateway/logger': file:packages/logger - '@opentelemetry/api': 1.9.0 - '@opentelemetry/auto-instrumentations-node': 0.64.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - hono: 4.9.7 - transitivePeerDependencies: - - encoding - - supports-color - - '@llmgateway/logger@file:packages/logger': - dependencies: - '@opentelemetry/api': 1.9.0 - pino: 9.9.0 - pino-pretty: 13.1.1 - - '@llmgateway/models@file:packages/models': - dependencies: - '@llmgateway/logger': file:packages/logger - - '@llmgateway/shared@file:packages/shared': - dependencies: - zod: 3.25.75 - '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: '@types/estree': 1.0.8 @@ -12518,7 +12197,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -12528,7 +12207,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12547,7 +12226,7 @@ snapshots: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 @@ -12562,7 +12241,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13232,6 +12911,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + debug@4.4.1(supports-color@10.0.0): dependencies: ms: 2.1.3 @@ -13338,6 +13021,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -13492,7 +13177,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.19.12): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 esbuild: 0.19.12 transitivePeerDependencies: - supports-color @@ -13548,35 +13233,6 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.25.4: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 - optional: true - esbuild@0.25.5: optionalDependencies: '@esbuild/aix-ppc64': 0.25.5 @@ -13695,7 +13351,7 @@ snapshots: eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 eslint: 9.34.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 @@ -13809,7 +13465,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -13890,6 +13546,16 @@ snapshots: esutils@2.0.3: {} + event-stream@3.3.4: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} @@ -14015,6 +13681,8 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) + from@0.1.7: {} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -14245,70 +13913,6 @@ snapshots: functions-have-names@1.2.3: {} - gateway@file:apps/gateway(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6)(openapi-types@12.1.3): - dependencies: - '@hono/node-server': 1.19.0(hono@4.9.7) - '@hono/swagger-ui': 0.5.1(hono@4.9.7) - '@hono/zod-openapi': 0.19.8(hono@4.9.7)(zod@3.25.75) - '@hono/zod-validator': 0.7.2(hono@4.9.7)(zod@3.25.75) - '@llmgateway/cache': file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/instrumentation': file:packages/instrumentation - '@llmgateway/logger': file:packages/logger - '@llmgateway/models': file:packages/models - '@opentelemetry/api': 1.9.0 - '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) - dotenv: 16.5.0 - gpt-tokenizer: 3.0.1 - hono: 4.9.7 - hono-openapi: 0.4.8(@hono/zod-validator@0.7.2(hono@4.9.7)(zod@3.25.75))(hono@4.9.7)(openapi-types@12.1.3)(zod-openapi@4.2.4(zod@3.25.75))(zod@3.25.75) - ioredis: 5.6.1 - redis: 5.8.2 - worker: file:apps/worker(@opentelemetry/api@1.9.0)(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - zod: 3.25.75 - zod-openapi: 4.2.4(zod@3.25.75) - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@hono/arktype-validator' - - '@hono/effect-validator' - - '@hono/typebox-validator' - - '@hono/valibot-validator' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@planetscale/database' - - '@prisma/client' - - '@sinclair/typebox' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/node' - - '@types/pg' - - '@types/sql.js' - - '@valibot/to-json-schema' - - '@vercel/postgres' - - '@xata.io/client' - - arktype - - better-sqlite3 - - bun-types - - effect - - encoding - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - openapi-types - - pg-native - - postgres - - prisma - - sql.js - - sqlite3 - - supports-color - - valibot - gaxios@6.7.1: dependencies: extend: 3.0.2 @@ -14332,7 +13936,7 @@ snapshots: gel@2.1.0: dependencies: '@petamoriken/float16': 3.9.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 env-paths: 3.0.0 semver: 7.7.2 shell-quote: 1.8.3 @@ -14372,11 +13976,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: - dependencies: - resolve-pkg-maps: 1.0.0 - optional: true - get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -14587,7 +14186,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -14642,7 +14241,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -14656,7 +14255,7 @@ snapshots: dependencies: '@ioredis/commands': 1.3.1 cluster-key-slot: 1.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -14976,7 +14575,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 @@ -15069,6 +14668,8 @@ snapshots: source-map-js: 1.2.1 optional: true + map-stream@0.1.0: {} + markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -15491,7 +15092,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -15632,6 +15233,8 @@ snapshots: - '@babel/core' - babel-plugin-macros + node-cleanup@2.1.2: {} + node-fetch-native@1.6.7: {} node-fetch@2.7.0: @@ -15853,6 +15456,10 @@ snapshots: pathval@2.0.0: {} + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + perfect-debounce@1.0.0: {} pg-cloudflare@1.2.7: @@ -16030,6 +15637,10 @@ snapshots: '@types/node': 24.3.3 long: 5.3.2 + ps-tree@1.2.0: + dependencies: + event-stream: 3.3.4 + pstree.remy@1.1.8: {} pump@3.0.3: @@ -16295,7 +15906,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -16620,6 +16231,10 @@ snapshots: split2@4.2.0: {} + split@0.3.3: + dependencies: + through: 2.3.8 + sprintf-js@1.0.3: {} stable-hash-x@0.2.0: {} @@ -16635,6 +16250,10 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-combiner@0.0.4: + dependencies: + duplexer: 0.1.2 + string-argv@0.3.2: {} string-width@4.2.3: @@ -16855,6 +16474,14 @@ snapshots: dependencies: typescript: 5.9.2 + tsc-watch@7.1.1(typescript@5.9.2): + dependencies: + cross-spawn: 7.0.6 + node-cleanup: 2.1.2 + ps-tree: 1.2.0 + string-argv: 0.3.2 + typescript: 5.9.2 + tsconfck@3.1.5(typescript@5.9.2): optionalDependencies: typescript: 5.9.2 @@ -16870,8 +16497,8 @@ snapshots: tsx@4.19.4: dependencies: - esbuild: 0.25.4 - get-tsconfig: 4.10.0 + esbuild: 0.25.9 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 optional: true @@ -17092,7 +16719,7 @@ snapshots: vite-node@3.2.3(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.3.6(@types/node@24.3.3)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.1) @@ -17166,7 +16793,7 @@ snapshots: '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 chai: 5.2.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 @@ -17264,47 +16891,6 @@ snapshots: wordwrap@1.0.0: {} - worker@file:apps/worker(@opentelemetry/api@1.9.0)(@types/node@24.3.3)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6): - dependencies: - '@llmgateway/cache': file:packages/cache(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/db': file:packages/db(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.0)(kysely@0.27.6) - '@llmgateway/logger': file:packages/logger - '@llmgateway/models': file:packages/models - '@llmgateway/shared': file:packages/shared - stripe: 18.1.1(@types/node@24.3.3) - zod: 3.25.75 - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/node' - - '@types/pg' - - '@types/sql.js' - - '@vercel/postgres' - - '@xata.io/client' - - better-sqlite3 - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - pg-native - - postgres - - prisma - - sql.js - - sqlite3 - - supports-color - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 From 6ce365122e2a743aa7702777eac495912b6977b4 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 02:29:44 +0100 Subject: [PATCH 17/21] chore(test-utils): remove console logs in test helpers Removed unnecessary `console.log` statements from `waitForLogWithRequestId` helper to clean up output and improve readability. No functional changes. --- apps/gateway/src/test-utils/test-helpers.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/gateway/src/test-utils/test-helpers.ts b/apps/gateway/src/test-utils/test-helpers.ts index 3f714f4102..78c0029199 100644 --- a/apps/gateway/src/test-utils/test-helpers.ts +++ b/apps/gateway/src/test-utils/test-helpers.ts @@ -59,9 +59,6 @@ export async function waitForLogByRequestId( intervalMs = 100, ) { const startTime = Date.now(); - console.log( - `Waiting for log with request ID ${requestId} (timeout: ${maxWaitMs}ms)...`, - ); while (Date.now() - startTime < maxWaitMs) { // Process the log queue to ensure any pending logs are written to the database @@ -77,9 +74,6 @@ export async function waitForLogByRequestId( const log = logs[0] || null; if (log) { - console.log( - `Found log with request ID ${requestId} after ${Date.now() - startTime}ms`, - ); return log; } From c9248622a0dc71057b106f72077231368eb37618 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 13:56:27 +0100 Subject: [PATCH 18/21] chore(models): skip free models in pricing logic Updated `getCheapestModelForProvider` to exclude free models from consideration as they may be less stable. Simplified null checks for `inputPrice` and `outputPrice`. --- packages/models/src/get-cheapest-model-for-provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/models/src/get-cheapest-model-for-provider.ts b/packages/models/src/get-cheapest-model-for-provider.ts index ea7fc9e477..2afe965472 100644 --- a/packages/models/src/get-cheapest-model-for-provider.ts +++ b/packages/models/src/get-cheapest-model-for-provider.ts @@ -4,6 +4,7 @@ import type { ProviderId } from "./providers.js"; /** * Get the cheapest model for a given provider based on input + output pricing + * Ignore free models as they might be less stable; there's different routing */ export function getCheapestModelForProvider( provider: ProviderId, @@ -17,8 +18,7 @@ export function getCheapestModelForProvider( })) .filter( ({ provider: providerInfo }) => - providerInfo.inputPrice !== undefined && - providerInfo.outputPrice !== undefined, + providerInfo.inputPrice && providerInfo.outputPrice, ); if (availableModels.length === 0) { From ede80f631ae334da6f6915a482df8ffa370c2149 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 14:07:05 +0100 Subject: [PATCH 19/21] Revert "chore(models): skip free models in pricing logic" This reverts commit c9248622a0dc71057b106f72077231368eb37618. --- packages/models/src/get-cheapest-model-for-provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/models/src/get-cheapest-model-for-provider.ts b/packages/models/src/get-cheapest-model-for-provider.ts index 2afe965472..ea7fc9e477 100644 --- a/packages/models/src/get-cheapest-model-for-provider.ts +++ b/packages/models/src/get-cheapest-model-for-provider.ts @@ -4,7 +4,6 @@ import type { ProviderId } from "./providers.js"; /** * Get the cheapest model for a given provider based on input + output pricing - * Ignore free models as they might be less stable; there's different routing */ export function getCheapestModelForProvider( provider: ProviderId, @@ -18,7 +17,8 @@ export function getCheapestModelForProvider( })) .filter( ({ provider: providerInfo }) => - providerInfo.inputPrice && providerInfo.outputPrice, + providerInfo.inputPrice !== undefined && + providerInfo.outputPrice !== undefined, ); if (availableModels.length === 0) { From a0659820019fb5b3a364541f1c0d7436596dae9c Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 14:08:37 +0100 Subject: [PATCH 20/21] chore(package): simplify postinstall script Removed `sync-editorconfig` from the `postinstall` script in `package.json` for clarity and to streamline the configuration. No functional impact expected. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 367d2fa53f..e45bd2a22f 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "dev": "turbo run dev", "format": "turbo run format", "generate": "turbo run generate", - "postinstall": "husky && sync-editorconfig || true", + "postinstall": "husky", "lint": "turbo run lint", "migrate": "pnpm --filter db migrate", "prepare-codex": "mv ~/.nvm ~/.nvm-bak && export PATH=\"${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH\" && . ~/.bashrc && sudo service postgresql start && sudo service redis-server start && sleep 20 && pnpm sync", From 8b75145fc72cdac2acc86554dfc7ad100277265d Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 17 Sep 2025 14:17:28 +0100 Subject: [PATCH 21/21] chore: wip --- packages/models/src/models/alibaba.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/models/src/models/alibaba.ts b/packages/models/src/models/alibaba.ts index dd27f38c32..100ca3a1ec 100644 --- a/packages/models/src/models/alibaba.ts +++ b/packages/models/src/models/alibaba.ts @@ -10,7 +10,6 @@ export const alibabaModels = [ deactivatedAt: undefined, providers: [ { - test: "only", providerId: "cloudrift", modelName: "Qwen/Qwen3-Next-80B-A3B-Thinking", inputPrice: 0.0 / 1e6,