From 763c734a1c6ce34ed06e3e33cec43c60eab14a0f Mon Sep 17 00:00:00 2001 From: khaliqgant Date: Sun, 18 Oct 2026 07:01:08 -0700 Subject: [PATCH 1/2] fix(engine): size the connect plan at 10M api_calls A Connect room can hold 10 seats for up to 7 days, and each joined seat polls its inbox every few seconds. At 3M calls a full room would run out of quota before it expires, so connect now matches pro's monthly call budget while keeping its lower agent, message, file and rate limits. Co-Authored-By: Claude Opus 5.5 (1M context) --- CHANGELOG.md | 6 +++++- README.md | 2 +- packages/engine/CHANGELOG.md | 6 +++++- .../src/providers/__tests__/static-entitlements.test.ts | 7 ++++++- packages/engine/src/providers/static-entitlements.ts | 2 +- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abdda0ae..0ae24dc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,11 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Packages without a separate changelog are covered by the cross-package notes below. -## [Unreleased] +## [Unreleased - Patch] + +### Changed + +- The `connect` plan's monthly `api_calls` rises from 3,000,000 to 10,000,000, so a full 10-seat room polling for its whole 7-day life stays within quota. ## [10.6.1] - 2026-10-18 diff --git a/README.md b/README.md index 74a64986..911f21f7 100644 --- a/README.md +++ b/README.md @@ -346,7 +346,7 @@ A workspace's `plan` (returned by `GET /v1/workspace`) sets both limits: | Plan | Agents | API calls / month | Requests / minute | | --- | --- | --- | --- | | `free` | 5 | 100,000 | 300 | -| `connect` | 10 | 3,000,000 | 1,200 | +| `connect` | 10 | 10,000,000 | 1,200 | | `pro` | 100 | 10,000,000 | 6,000 | | `enterprise` | unlimited | unlimited | 30,000 | diff --git a/packages/engine/CHANGELOG.md b/packages/engine/CHANGELOG.md index 9f109f74..7e2625e9 100644 --- a/packages/engine/CHANGELOG.md +++ b/packages/engine/CHANGELOG.md @@ -7,7 +7,11 @@ See the [root changelog](../../CHANGELOG.md) for cross-package release highlight The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [Unreleased - Patch] + +### Changed + +- `PLAN_LIMITS.connect.api_calls` rises from 3,000,000 to 10,000,000 (equal to `pro`), sized for a full 10-seat room polling for its 7-day maximum life. ## [10.6.1] - 2026-10-18 diff --git a/packages/engine/src/providers/__tests__/static-entitlements.test.ts b/packages/engine/src/providers/__tests__/static-entitlements.test.ts index 420dc3be..d8379d92 100644 --- a/packages/engine/src/providers/__tests__/static-entitlements.test.ts +++ b/packages/engine/src/providers/__tests__/static-entitlements.test.ts @@ -11,15 +11,20 @@ describe('StaticEntitlementsProvider', () => { const provider = new StaticEntitlementsProvider(undefined, 'free'); const limits = await provider.getLimits(workspace('connect')); expect(limits).toBe(PLAN_LIMITS.connect); - expect(limits.api_calls).toBe(3_000_000); + expect(limits.api_calls).toBe(10_000_000); expect(limits.agents).toBe(10); }); it('sizes connect between free and pro on every metric', () => { for (const metric of ['messages', 'agents', 'file_bytes', 'api_calls', 'rate_per_min'] as const) { expect(PLAN_LIMITS.connect![metric]).toBeGreaterThan(PLAN_LIMITS.free![metric]); + } + for (const metric of ['messages', 'agents', 'file_bytes', 'rate_per_min'] as const) { expect(PLAN_LIMITS.connect![metric]).toBeLessThan(PLAN_LIMITS.pro![metric]); } + // A full 10-seat room polling for its whole 7-day life needs pro's monthly + // call budget, so connect matches it rather than sitting below it. + expect(PLAN_LIMITS.connect!.api_calls).toBeLessThanOrEqual(PLAN_LIMITS.pro!.api_calls); }); it('falls back to the default plan for an unknown plan', async () => { diff --git a/packages/engine/src/providers/static-entitlements.ts b/packages/engine/src/providers/static-entitlements.ts index 8c27ae80..ab3c6fb4 100644 --- a/packages/engine/src/providers/static-entitlements.ts +++ b/packages/engine/src/providers/static-entitlements.ts @@ -13,7 +13,7 @@ export const PLAN_LIMITS: Record = { // Short-lived collaboration rooms (Relay Connect): a handful of seats that // poll their inbox continuously, so api_calls dominates while messages stay // low. Sized for a two-seat room polling every few seconds for a full month. - connect: { messages: 100_000, agents: 10, file_bytes: 1024 * 1024 * 1024, api_calls: 3_000_000, rate_per_min: 1200 }, + connect: { messages: 100_000, agents: 10, file_bytes: 1024 * 1024 * 1024, api_calls: 10_000_000, rate_per_min: 1200 }, pro: { messages: 1_000_000, agents: 100, file_bytes: 50 * 1024 * 1024 * 1024, api_calls: 10_000_000, rate_per_min: 6000 }, enterprise: { messages: Infinity, agents: Infinity, file_bytes: 500 * 1024 * 1024 * 1024, api_calls: Infinity, rate_per_min: 30000 }, selfhost: { messages: Infinity, agents: Infinity, file_bytes: Infinity, api_calls: Infinity, rate_per_min: 30000 }, From 055706746a53b26fbad72433cc5b9b375bb17813 Mon Sep 17 00:00:00 2001 From: khaliqgant Date: Sun, 18 Oct 2026 07:04:12 -0700 Subject: [PATCH 2/2] test(engine): correct the connect api_calls comment Co-Authored-By: Claude Opus 5.5 (1M context) --- .../src/providers/__tests__/static-entitlements.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/engine/src/providers/__tests__/static-entitlements.test.ts b/packages/engine/src/providers/__tests__/static-entitlements.test.ts index d8379d92..b49c5aa2 100644 --- a/packages/engine/src/providers/__tests__/static-entitlements.test.ts +++ b/packages/engine/src/providers/__tests__/static-entitlements.test.ts @@ -22,8 +22,8 @@ describe('StaticEntitlementsProvider', () => { for (const metric of ['messages', 'agents', 'file_bytes', 'rate_per_min'] as const) { expect(PLAN_LIMITS.connect![metric]).toBeLessThan(PLAN_LIMITS.pro![metric]); } - // A full 10-seat room polling for its whole 7-day life needs pro's monthly - // call budget, so connect matches it rather than sitting below it. + // Rooms poll constantly; connect's call budget is set to pro's for + // headroom, while its other limits stay below pro. expect(PLAN_LIMITS.connect!.api_calls).toBeLessThanOrEqual(PLAN_LIMITS.pro!.api_calls); });