From 028aef8c899bce4a2ee19eb091588d1480129607 Mon Sep 17 00:00:00 2001 From: Arjun Komath Date: Sun, 19 Jul 2026 17:50:27 +1000 Subject: [PATCH 1/4] Fix Techulus Cloud CLI error branding --- web/lib/cli-service.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/web/lib/cli-service.ts b/web/lib/cli-service.ts index 25bf8063..c860240f 100644 --- a/web/lib/cli-service.ts +++ b/web/lib/cli-service.ts @@ -252,34 +252,34 @@ function getUnsupportedReason( placementReplicaCount: number, ) { if (service.sourceType !== "image") { - return "tc only supports image-backed services. This service uses an unsupported source."; + return "Techulus Cloud only supports image-backed services. This service uses an unsupported source."; } if (service.stateful || volumeCount > 0) { - return "tc does not support stateful services or volumes. Manage this service from the web UI."; + return "Techulus Cloud does not support stateful services or volumes. Manage this service from the web UI."; } if (ports.some((port) => port.protocol !== "http")) { - return "tc only supports HTTP ports. This service has TCP or UDP ports configured."; + return "Techulus Cloud only supports HTTP ports. This service has TCP or UDP ports configured."; } if (ports.some((port) => port.isPublic && !port.domain)) { - return "tc requires every public HTTP port to have a domain."; + return "Techulus Cloud requires every public HTTP port to have a domain."; } if (placementReplicaCount < 1) { - return "tc requires manual server placement to be configured in the web UI before deploy."; + return "Techulus Cloud requires manual server placement to be configured in the web UI before deploy."; } if (placementReplicaCount > 10) { - return "tc only supports manually placed replica counts between 1 and 10."; + return "Techulus Cloud only supports manually placed replica counts between 1 and 10."; } const hasCpu = service.resourceCpuLimit !== null; const hasMemory = service.resourceMemoryLimitMb !== null; if (hasCpu !== hasMemory) { - return "tc requires both CPU and memory limits to be set together."; + return "Techulus Cloud requires both CPU and memory limits to be set together."; } return null; @@ -609,7 +609,7 @@ function assertManifestReplicaCount( ) { if (placementReplicaCount !== desiredReplicaCount) { throw new Error( - `tc cannot change server placement. Update placement in the web UI so it has ${desiredReplicaCount} replica${desiredReplicaCount === 1 ? "" : "s"}, or update replicas.count to match the current manual placement of ${placementReplicaCount}.`, + `Techulus Cloud cannot change server placement. Update placement in the web UI so it has ${desiredReplicaCount} replica${desiredReplicaCount === 1 ? "" : "s"}, or update replicas.count to match the current manual placement of ${placementReplicaCount}.`, ); } } @@ -620,14 +620,14 @@ export async function applyManifest( const project = await findProjectByManifest(manifest); if (!project) { throw new Error( - "Project not found. Create the service and select server placement in the web UI before using tc.", + "Project not found. Create the service and select server placement in the web UI before using Techulus Cloud.", ); } const environment = await findEnvironmentByManifest(project.id, manifest); if (!environment) { throw new Error( - "Environment not found. Create the service and select server placement in the web UI before using tc.", + "Environment not found. Create the service and select server placement in the web UI before using Techulus Cloud.", ); } @@ -640,7 +640,7 @@ export async function applyManifest( if (!service) { throw new Error( - "tc cannot create services because server placement must be selected in the web UI.", + "Techulus Cloud cannot create services because server placement must be selected in the web UI.", ); } From d4d8ce83ff3678035bc2144f2da92025190f7cf5 Mon Sep 17 00:00:00 2001 From: Techulus Agent <291950465+techulus-agent@users.noreply.github.com> Date: Sun, 19 Jul 2026 18:13:52 +1000 Subject: [PATCH 2/4] Migrate release builds to Blacksmith runners --- .github/workflows/release.yml | 153 +++++++++++++++++++------------- .github/workflows/web-build.yml | 2 +- 2 files changed, 92 insertions(+), 63 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0b7cda71..349295f0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,14 +16,16 @@ permissions: jobs: agent: - runs-on: ubuntu-latest + runs-on: ${{ matrix.runner }} strategy: matrix: include: - goos: linux goarch: amd64 + runner: blacksmith-2vcpu-ubuntu-2404 - goos: linux goarch: arm64 + runner: blacksmith-2vcpu-ubuntu-2404-arm steps: - name: Checkout @@ -52,20 +54,25 @@ jobs: retention-days: 1 cli: - runs-on: ubuntu-latest + runs-on: ${{ matrix.runner }} strategy: matrix: include: - goos: darwin goarch: amd64 + runner: blacksmith-2vcpu-ubuntu-2404 - goos: darwin goarch: arm64 + runner: blacksmith-2vcpu-ubuntu-2404-arm - goos: linux goarch: amd64 + runner: blacksmith-2vcpu-ubuntu-2404 - goos: linux goarch: arm64 + runner: blacksmith-2vcpu-ubuntu-2404-arm - goos: windows goarch: amd64 + runner: blacksmith-2vcpu-ubuntu-2404 steps: - name: Checkout @@ -96,8 +103,8 @@ jobs: retention-days: 1 release: - needs: [agent, cli, web, registry, updater] - runs-on: ubuntu-latest + needs: [agent, cli, containers] + runs-on: blacksmith-2vcpu-ubuntu-2404 steps: - name: Download agent artifacts uses: actions/download-artifact@v8 @@ -128,14 +135,49 @@ jobs: --generate-notes \ binaries/agent-* binaries/tc-* binaries/checksums.txt - web: - runs-on: ubuntu-latest + container: + name: Build ${{ matrix.image }} (${{ matrix.arch }}) + runs-on: ${{ matrix.runner }} + strategy: + matrix: + include: + - image: web + context: web + arch: amd64 + platform: linux/amd64 + runner: blacksmith-2vcpu-ubuntu-2404 + - image: web + context: web + arch: arm64 + platform: linux/arm64 + runner: blacksmith-2vcpu-ubuntu-2404-arm + - image: registry + context: registry + arch: amd64 + platform: linux/amd64 + runner: blacksmith-2vcpu-ubuntu-2404 + - image: registry + context: registry + arch: arm64 + platform: linux/arm64 + runner: blacksmith-2vcpu-ubuntu-2404-arm + - image: updater + context: deployment/updater + arch: amd64 + platform: linux/amd64 + runner: blacksmith-2vcpu-ubuntu-2404 + - image: updater + context: deployment/updater + arch: arm64 + platform: linux/arm64 + runner: blacksmith-2vcpu-ubuntu-2404-arm + steps: - name: Checkout uses: actions/checkout@v6 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4 + - name: Set up Docker builder + uses: useblacksmith/setup-docker-builder@v1 - name: Login to GHCR uses: docker/login-action@v4 @@ -145,55 +187,45 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v7 + id: build + uses: useblacksmith/build-push-action@v2 with: - context: web - push: true - tags: | - ghcr.io/${{ github.repository }}/web:${{ github.ref_name }} - ghcr.io/${{ github.repository }}/web:tip - build-args: | - APP_VERSION=${{ github.ref_name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha,scope=web - cache-to: type=gha,mode=max,scope=web - - registry: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v6 + context: ${{ matrix.context }} + tags: ghcr.io/${{ github.repository }}/${{ matrix.image }} + platforms: ${{ matrix.platform }} + build-args: ${{ matrix.image == 'web' && format('APP_VERSION={0}', github.ref_name) || '' }} + outputs: type=image,push-by-digest=true,name-canonical=true,push=true - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4 + - name: Export digest + run: | + mkdir -p /tmp/digests + touch "/tmp/digests/${DIGEST#sha256:}" + env: + DIGEST: ${{ steps.build.outputs.digest }} - - name: Login to GHCR - uses: docker/login-action@v4 + - name: Upload digest + uses: actions/upload-artifact@v7 with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + name: digest-${{ matrix.image }}-${{ matrix.arch }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 - - name: Build and push - uses: docker/build-push-action@v7 - with: - context: registry - push: true - tags: | - ghcr.io/${{ github.repository }}/registry:${{ github.ref_name }} - ghcr.io/${{ github.repository }}/registry:tip - platforms: linux/amd64,linux/arm64 - cache-from: type=gha,scope=registry - cache-to: type=gha,mode=max,scope=registry - - updater: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v6 + containers: + name: Publish ${{ matrix.image }} manifest + needs: container + runs-on: blacksmith-2vcpu-ubuntu-2404 + strategy: + matrix: + image: [web, registry, updater] - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4 + steps: + - name: Download digests + uses: actions/download-artifact@v8 + with: + path: /tmp/digests + pattern: digest-${{ matrix.image }}-* + merge-multiple: true - name: Login to GHCR uses: docker/login-action@v4 @@ -202,14 +234,11 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v7 - with: - context: deployment/updater - push: true - tags: | - ghcr.io/${{ github.repository }}/updater:${{ github.ref_name }} - ghcr.io/${{ github.repository }}/updater:tip - platforms: linux/amd64,linux/arm64 - cache-from: type=gha,scope=updater - cache-to: type=gha,mode=max,scope=updater + - name: Create and push multi-platform manifest + working-directory: /tmp/digests + run: | + image="ghcr.io/${{ github.repository }}/${{ matrix.image }}" + docker buildx imagetools create \ + --tag "$image:${{ github.ref_name }}" \ + --tag "$image:tip" \ + $(printf "$image@sha256:%s " *) diff --git a/.github/workflows/web-build.yml b/.github/workflows/web-build.yml index e846c829..7d6719e9 100644 --- a/.github/workflows/web-build.yml +++ b/.github/workflows/web-build.yml @@ -25,7 +25,7 @@ concurrency: jobs: build: - runs-on: ubuntu-latest + runs-on: blacksmith-2vcpu-ubuntu-2404 timeout-minutes: 30 defaults: run: From 971726b93ef53dac7ce09fd3dcac5ee52ebd8cb0 Mon Sep 17 00:00:00 2001 From: Arjun Komath Date: Sun, 19 Jul 2026 19:10:25 +1000 Subject: [PATCH 3/4] Update Drizzle dependencies --- web/db/schema.ts | 5 +---- web/package.json | 4 ++-- web/pnpm-lock.yaml | 4 ++-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/web/db/schema.ts b/web/db/schema.ts index 91a6044b..1fa54c8d 100644 --- a/web/db/schema.ts +++ b/web/db/schema.ts @@ -603,12 +603,9 @@ export const serviceRevisions = pgTable( .notNull(), }, (table) => [ - // The database constraint is physically (id, service_id), but drizzle-kit - // 0.31.10 reports it as (service_id, id) during push diffing. Keep this order - // to avoid a drop/recreate that fails because foreign keys depend on it. unique("service_revisions_id_service_id_unique").on( - table.serviceId, table.id, + table.serviceId, ), index("service_revisions_service_created_id_idx").on( table.serviceId, diff --git a/web/package.json b/web/package.json index 8bae61e0..4894ca0d 100644 --- a/web/package.json +++ b/web/package.json @@ -27,7 +27,7 @@ "clsx": "^2.1.1", "cron-parser": "^5.4.0", "cronstrue": "^3.9.0", - "drizzle-orm": "^0.45.1", + "drizzle-orm": "^0.45.2", "inngest": "^4.3.0", "input-otp": "^1.4.2", "ip-address": "^10.1.0", @@ -62,7 +62,7 @@ "@types/react": "19.2.17", "@types/react-dom": "19.2.3", "@types/validator": "^13.15.10", - "drizzle-kit": "^0.31.8", + "drizzle-kit": "^0.31.10", "eslint": "^9", "eslint-config-next": "16.2.9", "tailwindcss": "^4", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 83d1aea3..b5bc8b43 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: specifier: ^3.9.0 version: 3.14.0 drizzle-orm: - specifier: ^0.45.1 + specifier: ^0.45.2 version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0) inngest: specifier: ^4.3.0 @@ -149,7 +149,7 @@ importers: specifier: ^13.15.10 version: 13.15.10 drizzle-kit: - specifier: ^0.31.8 + specifier: ^0.31.10 version: 0.31.10 eslint: specifier: ^9 From 43ba9da6eea3faef06ba5b68ce2120716a1fd3a3 Mon Sep 17 00:00:00 2001 From: Arjun Komath Date: Sun, 19 Jul 2026 19:40:24 +1000 Subject: [PATCH 4/4] Fix Drizzle constraint introspection --- web/Dockerfile | 8 ++- web/patches/drizzle-kit@0.31.10.patch | 78 +++++++++++++++++++++++++++ web/pnpm-lock.yaml | 33 ++++++------ web/pnpm-workspace.yaml | 5 ++ 4 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 web/patches/drizzle-kit@0.31.10.patch diff --git a/web/Dockerfile b/web/Dockerfile index 6206f45d..c963f92e 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -2,6 +2,7 @@ FROM node:24-slim AS deps WORKDIR /app RUN corepack enable pnpm && corepack prepare pnpm@11 --activate COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY patches ./patches RUN pnpm install --frozen-lockfile FROM node:24-slim AS builder @@ -17,7 +18,12 @@ RUN npx next build FROM node:24-slim AS drizzle WORKDIR /drizzle -RUN npm install drizzle-kit drizzle-orm +RUN apt-get update \ + && apt-get install -y --no-install-recommends patch \ + && rm -rf /var/lib/apt/lists/* +RUN npm install drizzle-kit@0.31.10 drizzle-orm@0.45.2 +COPY patches/drizzle-kit@0.31.10.patch /tmp/drizzle-kit.patch +RUN patch --directory=node_modules/drizzle-kit --strip=1 < /tmp/drizzle-kit.patch FROM node:24-slim AS runner WORKDIR /app diff --git a/web/patches/drizzle-kit@0.31.10.patch b/web/patches/drizzle-kit@0.31.10.patch new file mode 100644 index 00000000..6f212aaa --- /dev/null +++ b/web/patches/drizzle-kit@0.31.10.patch @@ -0,0 +1,78 @@ +diff --git a/api.js b/api.js +index f4ecb91959f62fc938416a0585458c0a710af161..538e15d24636ffff2dee2b641629a8d5ed0422f9 100644 +--- a/api.js ++++ b/api.js +@@ -23174,10 +23174,16 @@ WHERE + const checkConstraints = {}; + const tableResponse = await getColumnsInfoQuery({ schema: tableSchema, table: tableName, db }); + const tableConstraints = await db.query( +- `SELECT c.column_name, c.data_type, constraint_type, constraint_name, constraint_schema ++ `SELECT kcu.column_name, c.data_type, tc.constraint_type, tc.constraint_name, tc.constraint_schema + FROM information_schema.table_constraints tc +- JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) +- JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema +- AND tc.table_name = c.table_name AND ccu.column_name = c.column_name +- WHERE tc.table_name = '${tableName}' and constraint_schema = '${tableSchema}';` ++ JOIN information_schema.key_column_usage kcu ++ ON tc.constraint_name = kcu.constraint_name ++ AND tc.constraint_schema = kcu.constraint_schema ++ AND tc.table_name = kcu.table_name ++ JOIN information_schema.columns AS c ++ ON c.table_schema = tc.constraint_schema ++ AND c.table_name = tc.table_name ++ AND c.column_name = kcu.column_name ++ WHERE tc.table_name = '${tableName}' and tc.constraint_schema = '${tableSchema}' ++ ORDER BY tc.constraint_name, kcu.ordinal_position;` + ); +diff --git a/api.mjs b/api.mjs +index a940272dfb05accf57a472c46c52652ec9ad0080..c6b4beb146da1777804b34768063c225224efd1e 100644 +--- a/api.mjs ++++ b/api.mjs +@@ -23190,10 +23190,16 @@ WHERE + const checkConstraints = {}; + const tableResponse = await getColumnsInfoQuery({ schema: tableSchema, table: tableName, db }); + const tableConstraints = await db.query( +- `SELECT c.column_name, c.data_type, constraint_type, constraint_name, constraint_schema ++ `SELECT kcu.column_name, c.data_type, tc.constraint_type, tc.constraint_name, tc.constraint_schema + FROM information_schema.table_constraints tc +- JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) +- JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema +- AND tc.table_name = c.table_name AND ccu.column_name = c.column_name +- WHERE tc.table_name = '${tableName}' and constraint_schema = '${tableSchema}';` ++ JOIN information_schema.key_column_usage kcu ++ ON tc.constraint_name = kcu.constraint_name ++ AND tc.constraint_schema = kcu.constraint_schema ++ AND tc.table_name = kcu.table_name ++ JOIN information_schema.columns AS c ++ ON c.table_schema = tc.constraint_schema ++ AND c.table_name = tc.table_name ++ AND c.column_name = kcu.column_name ++ WHERE tc.table_name = '${tableName}' and tc.constraint_schema = '${tableSchema}' ++ ORDER BY tc.constraint_name, kcu.ordinal_position;` + ); +diff --git a/bin.cjs b/bin.cjs +index 07274ea6f53fd54a129b3d338892feda6e995cff..d26825fc18ebe1859260828b6a4efa6e4f95e78c 100755 +--- a/bin.cjs ++++ b/bin.cjs +@@ -17732,10 +17732,16 @@ WHERE + const checkConstraints = {}; + const tableResponse = await getColumnsInfoQuery({ schema: tableSchema, table: tableName, db }); + const tableConstraints = await db.query( +- `SELECT c.column_name, c.data_type, constraint_type, constraint_name, constraint_schema ++ `SELECT kcu.column_name, c.data_type, tc.constraint_type, tc.constraint_name, tc.constraint_schema + FROM information_schema.table_constraints tc +- JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) +- JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema +- AND tc.table_name = c.table_name AND ccu.column_name = c.column_name +- WHERE tc.table_name = '${tableName}' and constraint_schema = '${tableSchema}';` ++ JOIN information_schema.key_column_usage kcu ++ ON tc.constraint_name = kcu.constraint_name ++ AND tc.constraint_schema = kcu.constraint_schema ++ AND tc.table_name = kcu.table_name ++ JOIN information_schema.columns AS c ++ ON c.table_schema = tc.constraint_schema ++ AND c.table_name = tc.table_name ++ AND c.column_name = kcu.column_name ++ WHERE tc.table_name = '${tableName}' and tc.constraint_schema = '${tableSchema}' ++ ORDER BY tc.constraint_name, kcu.ordinal_position;` + ); diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index b5bc8b43..f2a769d0 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -8,6 +8,9 @@ overrides: '@types/react': 19.2.17 '@types/react-dom': 19.2.3 +patchedDependencies: + drizzle-kit@0.31.10: 3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2 + importers: .: @@ -20,7 +23,7 @@ importers: version: 1.5.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@better-auth/api-key': specifier: 1.6.23 - version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.2)(better-auth@1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))))(better-call@1.3.7(zod@4.4.3)) + version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.2)(better-auth@1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2))(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))))(better-call@1.3.7(zod@4.4.3)) '@bprogress/next': specifier: ^3.2.12 version: 3.2.12(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -35,7 +38,7 @@ importers: version: 5.4.0 better-auth: specifier: 1.6.23 - version: 1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))) + version: 1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2))(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -150,7 +153,7 @@ importers: version: 13.15.10 drizzle-kit: specifier: ^0.31.10 - version: 0.31.10 + version: 0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2) eslint: specifier: ^9 version: 9.39.4(jiti@2.7.0) @@ -633,11 +636,11 @@ packages: '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' '@esbuild-kit/esm-loader@2.6.5': resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} @@ -6471,11 +6474,11 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 - '@better-auth/api-key@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.2)(better-auth@1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))))(better-call@1.3.7(zod@4.4.3))': + '@better-auth/api-key@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.2)(better-auth@1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2))(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))))(better-call@1.3.7(zod@4.4.3))': dependencies: '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.2 - better-auth: 1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))) + better-auth: 1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2))(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))) better-call: 1.3.7(zod@4.4.3) zod: 4.4.3 @@ -8919,7 +8922,7 @@ snapshots: baseline-browser-mapping@2.10.37: {} - better-auth@1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))): + better-auth@1.6.23(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2))(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0))(next@16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(msw@2.14.6(@types/node@24.13.2)(typescript@5.9.3))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))): dependencies: '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/drizzle-adapter': 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0)) @@ -8939,7 +8942,7 @@ snapshots: nanostores: 1.3.0 zod: 4.4.3 optionalDependencies: - drizzle-kit: 0.31.10 + drizzle-kit: 0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2) drizzle-orm: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.29.2)(pg@8.21.0) next: 16.2.9(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) pg: 8.21.0 @@ -9304,7 +9307,7 @@ snapshots: dotenv@17.4.2: {} - drizzle-kit@0.31.10: + drizzle-kit@0.31.10(patch_hash=3ebd38e94e42a539a2e289c2b932c00c0ee0c1cee99a6bc49147abb5d3cd2eb2): dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 @@ -9571,7 +9574,7 @@ snapshots: '@next/eslint-plugin-next': 16.2.9 eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.7.0)) @@ -9594,7 +9597,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -9609,14 +9612,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - supports-color @@ -9631,7 +9634,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 diff --git a/web/pnpm-workspace.yaml b/web/pnpm-workspace.yaml index 5cf76850..d1bd6295 100644 --- a/web/pnpm-workspace.yaml +++ b/web/pnpm-workspace.yaml @@ -11,3 +11,8 @@ allowBuilds: protobufjs: false sharp: false unrs-resolver: false + +# Backport https://github.com/drizzle-team/drizzle-orm/pull/5038 until a +# stable Drizzle Kit release preserves composite constraint column order. +patchedDependencies: + drizzle-kit@0.31.10: patches/drizzle-kit@0.31.10.patch