From 81f35cc8a10449dd5c08ba4d78ef07e4eb857c5e Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Sun, 27 Sep 2026 21:19:14 -0700 Subject: [PATCH 1/2] chore(deps): pin openai-responses to npm 0.2.0 --- bun.lock | 6 ++---- package.json | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index 1f81722f2..ac347d8ac 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@corbits/agent-intern": "workspace:*", "@corbits/codex-provider": "0.1.1", "@corbits/oauth-core": "0.2.0", - "@corbits/openai-responses": "github:corbitsdev/corbits-openai-responses", + "@corbits/openai-responses": "0.2.0", "@corbits/xai-provider": "0.1.1", "@intx/agent": "workspace:*", "@intx/authz": "workspace:*", @@ -255,7 +255,7 @@ "@corbits/oauth-core": ["@corbits/oauth-core@0.2.0", "", { "dependencies": { "@intx/db": "^0.4.0", "@intx/hub-api": "^0.4.0", "@intx/hub-common": "^0.4.0", "@intx/types": "^0.4.0", "arktype": "^2.2.3", "drizzle-orm": "^0.45.2", "hono": "^4.11.9" } }, "sha512-1pNMfxPUALwwXzpBzate3hDs61DOmv+fWo8/+aWfMhgXTxq8xtqeYk7Ue4uf/mW+FT0fUV/9vC2hZHyrm8+8KA=="], - "@corbits/openai-responses": ["@corbits/openai-responses@github:corbitsdev/corbits-openai-responses#1d20dbb", { "dependencies": { "arktype": "2.2.3" }, "peerDependencies": { "@intx/inference": ">=0.3.0", "@intx/types": ">=0.3.0" } }, "corbitsdev-corbits-openai-responses-1d20dbb", "sha512-lSJz1KkKD8mEUYiQ57dJprD9JavdJGt3OBRa42tvXLsikt1fJ6qX2mGCwaEXzkfZNc2XY5o7ZpxK5swSJX+LnA=="], + "@corbits/openai-responses": ["@corbits/openai-responses@0.2.0", "", { "dependencies": { "arktype": "2.2.3" }, "peerDependencies": { "@intx/inference": "^0.4.0", "@intx/types": "^0.4.0" } }, "sha512-6E06ktrleDHmGjuylELe3NZPb7AMXXKiW8Mzq0tqXESvpQoP/1Wna7tzNle/j+M6qVw1GDX3yN7m9+qiX2E8Ew=="], "@corbits/prompt-variance": ["@corbits/prompt-variance@workspace:packages/prompt-variance"], @@ -949,8 +949,6 @@ "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], - "@corbits/xai-provider/@corbits/oauth-core": ["@corbits/oauth-core@github:corbitsdev/corbits-oauth-core#e1e69e6", { "dependencies": { "arktype": "2.2.3" } }, "corbitsdev-corbits-oauth-core-e1e69e6", "sha512-wUrD73iVyk/Dtb4yRn3hCh6N8syfsEvAkRz4XYqT0FIB3sYDSMYEWHcDMJx9nq64my/HBOeN1J6PHIOtpjhtPg=="], - "@intx/db/@intx/crypto": ["@intx/crypto@0.4.0", "", { "dependencies": { "@intx/types": "0.4.0" } }, "sha512-4/qWypC90GevbV9u1i/93tn46jsXhj8wE1Pn+awg8/ECpwhHnhPLT5Uy423Arr9eGmRmF6HiMyXcEgH1Z9/Rkw=="], "@intx/hub-api/@intx/crypto": ["@intx/crypto@0.4.0", "", { "dependencies": { "@intx/types": "0.4.0" } }, "sha512-4/qWypC90GevbV9u1i/93tn46jsXhj8wE1Pn+awg8/ECpwhHnhPLT5Uy423Arr9eGmRmF6HiMyXcEgH1Z9/Rkw=="], diff --git a/package.json b/package.json index 718ef3fb2..4a58da2ac 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "@corbits/agent-intern": "workspace:*", "@corbits/codex-provider": "0.1.1", "@corbits/oauth-core": "0.2.0", - "@corbits/openai-responses": "github:corbitsdev/corbits-openai-responses", + "@corbits/openai-responses": "0.2.0", "@corbits/xai-provider": "0.1.1", "@intx/agent": "workspace:*", "@intx/authz": "workspace:*", From da5ef5d93dc465127c0ebaa0a32341676e7d7955 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Mon, 28 Sep 2026 09:08:00 -0700 Subject: [PATCH 2/2] chore(deps): pin openai-responses to npm 0.2.1 --- bun.lock | 4 ++-- package.json | 2 +- tests/unit/codex-sse-fixtures.test.ts | 21 ++++++++++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/bun.lock b/bun.lock index ac347d8ac..0624d460b 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@corbits/agent-intern": "workspace:*", "@corbits/codex-provider": "0.1.1", "@corbits/oauth-core": "0.2.0", - "@corbits/openai-responses": "0.2.0", + "@corbits/openai-responses": "0.2.1", "@corbits/xai-provider": "0.1.1", "@intx/agent": "workspace:*", "@intx/authz": "workspace:*", @@ -255,7 +255,7 @@ "@corbits/oauth-core": ["@corbits/oauth-core@0.2.0", "", { "dependencies": { "@intx/db": "^0.4.0", "@intx/hub-api": "^0.4.0", "@intx/hub-common": "^0.4.0", "@intx/types": "^0.4.0", "arktype": "^2.2.3", "drizzle-orm": "^0.45.2", "hono": "^4.11.9" } }, "sha512-1pNMfxPUALwwXzpBzate3hDs61DOmv+fWo8/+aWfMhgXTxq8xtqeYk7Ue4uf/mW+FT0fUV/9vC2hZHyrm8+8KA=="], - "@corbits/openai-responses": ["@corbits/openai-responses@0.2.0", "", { "dependencies": { "arktype": "2.2.3" }, "peerDependencies": { "@intx/inference": "^0.4.0", "@intx/types": "^0.4.0" } }, "sha512-6E06ktrleDHmGjuylELe3NZPb7AMXXKiW8Mzq0tqXESvpQoP/1Wna7tzNle/j+M6qVw1GDX3yN7m9+qiX2E8Ew=="], + "@corbits/openai-responses": ["@corbits/openai-responses@0.2.1", "", { "dependencies": { "arktype": "2.2.3" }, "peerDependencies": { "@intx/inference": "^0.4.0", "@intx/types": "^0.4.0" } }, "sha512-jhT1opXhFNoeq+Og8n1j3FaXlqxAsJGfNlVTwuN+2+Ee29z15mU4dzJ4JwY6njAOHVXvBk6mgYCGRu+NjU9rmw=="], "@corbits/prompt-variance": ["@corbits/prompt-variance@workspace:packages/prompt-variance"], diff --git a/package.json b/package.json index 4a58da2ac..dae7712ee 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "@corbits/agent-intern": "workspace:*", "@corbits/codex-provider": "0.1.1", "@corbits/oauth-core": "0.2.0", - "@corbits/openai-responses": "0.2.0", + "@corbits/openai-responses": "0.2.1", "@corbits/xai-provider": "0.1.1", "@intx/agent": "workspace:*", "@intx/authz": "workspace:*", diff --git a/tests/unit/codex-sse-fixtures.test.ts b/tests/unit/codex-sse-fixtures.test.ts index 4c0e7583f..7c56f5d73 100644 --- a/tests/unit/codex-sse-fixtures.test.ts +++ b/tests/unit/codex-sse-fixtures.test.ts @@ -149,12 +149,13 @@ describe("codex-sse fixtures (golden parse)", () => { ).toBe(true); }); - test("incomplete stream emits partial text and is terminal without usage", () => { + test("incomplete stream emits partial text and usage and is terminal", () => { const out = parseFixture("incomplete.json"); expect(eventTypes(out)).toEqual([ "inference.text.delta", "inference.text.delta", + "inference.usage", ]); expect(out[0]).toMatchObject({ type: "inference.text.delta", @@ -164,8 +165,22 @@ describe("codex-sse fixtures (golden parse)", () => { type: "inference.text.delta", data: { token: "answer", index: 0 }, }); - // response.incomplete is intentionally not mapped to usage (completed-only). - expect(out.some((e) => e.type === "inference.usage")).toBe(false); + // A truncated turn is still billed: the backend reports usage for the + // partial turn (input plus output emitted before the cap), so + // response.incomplete maps to usage like response.completed does. + expect(out[2]).toMatchObject({ + type: "inference.usage", + data: { + usage: { + input: 50, + output: 8, + cacheRead: 0, + cacheWrite: 0, + thinking: 0, + }, + source: SOURCE, + }, + }); const lastPayload = defined( loadFixture("incomplete.json").at(-1),