From fb6b541c577c1d4bdfc45b1f16e3cbac4a09bcfb Mon Sep 17 00:00:00 2001 From: Seth Raphael Date: Sat, 9 May 2026 22:45:45 -0600 Subject: [PATCH 1/3] fix: typecheck failure in example/convex/setup.test.ts Main has been failing `npm run typecheck` on every push since 2026-04-01, masking real type regressions in subsequent PRs. Root cause: commit e29f2bb made @convex-dev/agent's `register` signature generic, so it accepts a `TestConvex` with a specifically-inferred schema. But sibling components @convex-dev/workflow, /workpool, and /rate-limiter still shipped non-generic `register(t: TestConvex>)`. TestConvex is invariant in its schema param, so a specifically-typed `t` is not assignable to the wider type, and the example's `initConvexTest` failed to type-check on lines 13-14. Fix: - Bump @convex-dev/workflow 0.3.6 -> 0.3.12 (now generic). - Add @convex-dev/workpool 0.4.6 explicitly as a dev dep so the transitive workpool is upgraded too (previously pinned at 0.3.1, still non-generic). Workflow's internal `workpool.register(t, ...)` call was itself failing with the older workpool. - Cast `t` only at the rate-limiter call: rate-limiter@0.3.2 is the latest published version and still has the non-generic signature, so this cast is a temporary workaround. A separate upstream PR genericizes rate-limiter's register; once a new rate-limiter ships, the cast can be removed. After this change: `npm run typecheck`, `npm test`, and `npm run lint` all pass. --- example/convex/setup.test.ts | 12 ++++++++++-- package-lock.json | 18 +++++++++--------- package.json | 3 ++- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/example/convex/setup.test.ts b/example/convex/setup.test.ts index b6c0a4f7..c27fba8f 100644 --- a/example/convex/setup.test.ts +++ b/example/convex/setup.test.ts @@ -1,6 +1,7 @@ /// import { test } from "vitest"; -import { convexTest } from "convex-test"; +import { convexTest, type TestConvex } from "convex-test"; +import type { GenericSchema, SchemaDefinition } from "convex/server"; import schema from "./schema.js"; import agent from "@convex-dev/agent/test"; import workflow from "@convex-dev/workflow/test"; @@ -11,7 +12,14 @@ export function initConvexTest() { const t = convexTest(schema, modules); agent.register(t); workflow.register(t); - rateLimiter.register(t); + // @convex-dev/rate-limiter@0.3.2 still ships a non-generic register + // signature (`TestConvex>`), + // and TestConvex is invariant in its schema param, so a specifically- + // typed `t` does not satisfy it. Drop this cast once rate-limiter + // ships a generic register (tracked upstream). + rateLimiter.register( + t as unknown as TestConvex>, + ); return t; } diff --git a/package-lock.json b/package-lock.json index 49a3ce1c..ef162028 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,8 @@ "@ai-sdk/provider-utils": "4.0.6", "@convex-dev/rag": "0.7.2", "@convex-dev/rate-limiter": "0.3.2", - "@convex-dev/workflow": "0.3.6", + "@convex-dev/workflow": "0.3.12", + "@convex-dev/workpool": "0.4.6", "@edge-runtime/vm": "5.0.0", "@eslint/js": "9.39.4", "@hookform/resolvers": "5.2.2", @@ -648,9 +649,9 @@ } }, "node_modules/@convex-dev/workflow": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@convex-dev/workflow/-/workflow-0.3.6.tgz", - "integrity": "sha512-qLPOZ5lXleCRFlVGchC9Q9v9L72dCNgjF3+GLaPnS03Up7RusNLZxdszgAeyKjY6a02DBQQWPdc1RWn8WCWQDw==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@convex-dev/workflow/-/workflow-0.3.12.tgz", + "integrity": "sha512-4c4eSe2sXnhxE6Td4benRg6OMJahWkOHdLv++FxpjZVZUANFmJqYKZxx8Bxqs0SB4ECGd2j0MZalNppLPKxQ7Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -663,14 +664,13 @@ } }, "node_modules/@convex-dev/workpool": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@convex-dev/workpool/-/workpool-0.3.1.tgz", - "integrity": "sha512-uw4Mi+irhhoYA/KwaMo5wXyYJ7BbxqeaLcCZbst3t1SxPN5488rpnR0OwBcPDCmwcdQjBVHOx+q8S4GUjq0Csg==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@convex-dev/workpool/-/workpool-0.4.6.tgz", + "integrity": "sha512-e+cIgQePx5rrGizvzaYocWQCsDFbFlYqR1ZbtFPLa909izwc5GvoasPJPANeFhHRWaA5NBipNVqNtfHySi7Ldw==", "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { - "convex": "^1.24.8", + "convex": "^1.31.7", "convex-helpers": "^0.1.94" } }, diff --git a/package.json b/package.json index a40417de..bab1d06d 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,8 @@ "@ai-sdk/provider-utils": "4.0.6", "@convex-dev/rag": "0.7.2", "@convex-dev/rate-limiter": "0.3.2", - "@convex-dev/workflow": "0.3.6", + "@convex-dev/workflow": "0.3.12", + "@convex-dev/workpool": "0.4.6", "@edge-runtime/vm": "5.0.0", "@eslint/js": "9.39.4", "@hookform/resolvers": "5.2.2", From 57a819aa3f44b9dd3daf9b6b9fb43e6f841208bf Mon Sep 17 00:00:00 2001 From: Ian Macartney <366683+ianmacartney@users.noreply.github.com> Date: Wed, 13 May 2026 00:22:34 -0700 Subject: [PATCH 2/3] bump @convex-dev/rag to 0.7.3 to resolve workpool peer-dep conflict rag@0.7.2 pinned workpool to ^0.3.0, conflicting with the workpool 0.4.6 upgrade in the prior commit. rag@0.7.3 widens its peer to ^0.3.0 || ^0.4.0, so a clean npm install now works. --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef162028..7f6e8ba7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@ai-sdk/openai": "3.0.10", "@ai-sdk/provider": "3.0.3", "@ai-sdk/provider-utils": "4.0.6", - "@convex-dev/rag": "0.7.2", + "@convex-dev/rag": "0.7.3", "@convex-dev/rate-limiter": "0.3.2", "@convex-dev/workflow": "0.3.12", "@convex-dev/workpool": "0.4.6", @@ -618,16 +618,16 @@ "peer": true }, "node_modules/@convex-dev/rag": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@convex-dev/rag/-/rag-0.7.2.tgz", - "integrity": "sha512-LuwiJdnE6twrM+5tVldmOpZqmR6eIQpMroCOyXWTNE7XDfqWz52GKDenraLG95xNRbn5wcxg8mkOrZIUUgwGDg==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@convex-dev/rag/-/rag-0.7.3.tgz", + "integrity": "sha512-6XQ59wYiW6MIkYbcuNys4wAGa9las3psywDS1ipACKpUmm6Y+ggz+Tk6e2+f5uyK3fdOzuJKvoMXPPDyzhW6JQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "ai": "^6.0.0" }, "peerDependencies": { - "@convex-dev/workpool": "^0.3.0", + "@convex-dev/workpool": "^0.3.0 || ^0.4.0", "convex": "^1.24.8", "convex-helpers": "^0.1.94" } diff --git a/package.json b/package.json index bab1d06d..b8e83aa4 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "@ai-sdk/openai": "3.0.10", "@ai-sdk/provider": "3.0.3", "@ai-sdk/provider-utils": "4.0.6", - "@convex-dev/rag": "0.7.2", + "@convex-dev/rag": "0.7.3", "@convex-dev/rate-limiter": "0.3.2", "@convex-dev/workflow": "0.3.12", "@convex-dev/workpool": "0.4.6", From 224d882c83aa5340645ddf4b97d862c68ed11803 Mon Sep 17 00:00:00 2001 From: Ian Macartney <366683+ianmacartney@users.noreply.github.com> Date: Wed, 13 May 2026 00:28:12 -0700 Subject: [PATCH 3/3] bump convex-test 0.0.44 -> 0.0.52, drop rate-limiter cast convex-test 0.0.52 relaxes TestConvex's schema-param variance enough that a specifically-typed `t` is now assignable to non-generic register signatures like @convex-dev/rate-limiter@0.3.2's. The workaround cast in initConvexTest is no longer needed. --- example/convex/setup.test.ts | 12 ++---------- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/example/convex/setup.test.ts b/example/convex/setup.test.ts index c27fba8f..b6c0a4f7 100644 --- a/example/convex/setup.test.ts +++ b/example/convex/setup.test.ts @@ -1,7 +1,6 @@ /// import { test } from "vitest"; -import { convexTest, type TestConvex } from "convex-test"; -import type { GenericSchema, SchemaDefinition } from "convex/server"; +import { convexTest } from "convex-test"; import schema from "./schema.js"; import agent from "@convex-dev/agent/test"; import workflow from "@convex-dev/workflow/test"; @@ -12,14 +11,7 @@ export function initConvexTest() { const t = convexTest(schema, modules); agent.register(t); workflow.register(t); - // @convex-dev/rate-limiter@0.3.2 still ships a non-generic register - // signature (`TestConvex>`), - // and TestConvex is invariant in its schema param, so a specifically- - // typed `t` does not satisfy it. Drop this cast once rate-limiter - // ships a generic register (tracked upstream). - rateLimiter.register( - t as unknown as TestConvex>, - ); + rateLimiter.register(t); return t; } diff --git a/package-lock.json b/package-lock.json index 7f6e8ba7..a461714c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "clsx": "2.1.1", "convex": "1.35.1", "convex-helpers": "0.1.114", - "convex-test": "0.0.44", + "convex-test": "0.0.52", "dayjs": "1.11.20", "dotenv": "16.6.1", "eslint": "9.39.4", @@ -4733,9 +4733,9 @@ } }, "node_modules/convex-test": { - "version": "0.0.44", - "resolved": "https://registry.npmjs.org/convex-test/-/convex-test-0.0.44.tgz", - "integrity": "sha512-2tv5XRx1n9z4kKwIiUU1UZgC0UDgUGpqAL2D2Hq45cHJ6HBTemfP2wKPMOcfag6ATFfmyqK3Xau0fKiJCtrdxQ==", + "version": "0.0.52", + "resolved": "https://registry.npmjs.org/convex-test/-/convex-test-0.0.52.tgz", + "integrity": "sha512-C27plpAqg+5tT/whYaAoAAjSwl6bCNPZX/705nbijo1nu5L4Xnv1Ssd29KCvgM5liU5tvfo8Vz4o8Lu4wH+6fw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { diff --git a/package.json b/package.json index b8e83aa4..377f6c36 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "clsx": "2.1.1", "convex": "1.35.1", "convex-helpers": "0.1.114", - "convex-test": "0.0.44", + "convex-test": "0.0.52", "dayjs": "1.11.20", "dotenv": "16.6.1", "eslint": "9.39.4",