From 351024d581a1e160d14f7b45c34062d34205328b Mon Sep 17 00:00:00 2001 From: Zuri Date: Sat, 7 Nov 2026 20:59:42 +0200 Subject: [PATCH 1/2] fix(server): merged tool schemas say which fields each tag requires Merging a tagged union into one object kept only the fields every branch requires, so models launched worktree threads without baseRef and T3 rejected the call. The tag now names each branch's own required fields. --- apps/server/src/mcp/advertisedJsonSchema.test.ts | 6 +++++- apps/server/src/mcp/advertisedJsonSchema.ts | 12 ++++++++++++ apps/server/src/provider/agentContextBudget.json | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/server/src/mcp/advertisedJsonSchema.test.ts b/apps/server/src/mcp/advertisedJsonSchema.test.ts index 09a90556a9dd0..4fb0b58895202 100644 --- a/apps/server/src/mcp/advertisedJsonSchema.test.ts +++ b/apps/server/src/mcp/advertisedJsonSchema.test.ts @@ -33,7 +33,11 @@ it("drops JSON noise, merges tagged unions, and keeps null where it is required" target: { type: "object", properties: { - kind: { type: "string", enum: ["url", "number"] }, + kind: { + type: "string", + enum: ["url", "number"], + description: "`url` requires `url`. `number` requires `number`.", + }, url: { type: "string" }, number: { type: "integer" }, }, diff --git a/apps/server/src/mcp/advertisedJsonSchema.ts b/apps/server/src/mcp/advertisedJsonSchema.ts index 10001307f2d6c..2ba71da70a844 100644 --- a/apps/server/src/mcp/advertisedJsonSchema.ts +++ b/apps/server/src/mcp/advertisedJsonSchema.ts @@ -64,6 +64,18 @@ const mergeTaggedObjects = (branches: ReadonlyArray): JsonObject | undefin const requiredByAll = first.filter( (name) => name !== tag && others.every((required) => required.includes(name)), ); + // Merging drops each tag's own required fields, so the tag says which they are. + const perTag = objects.flatMap((object, index) => { + const own = (index === 0 ? first : others[index - 1]!).filter( + (name) => name !== tag && !requiredByAll.includes(name), + ); + return own.length === 0 + ? [] + : [ + `\`${String(tagOf(object, tag))}\` requires ${own.map((name) => `\`${name}\``).join(", ")}.`, + ]; + }); + if (perTag.length > 0) (properties[tag] as JsonObject).description = perTag.join(" "); return { type: "object", properties, required: [tag, ...requiredByAll] }; }; diff --git a/apps/server/src/provider/agentContextBudget.json b/apps/server/src/provider/agentContextBudget.json index 0d9f26d44c40a..2c8141e15bac3 100644 --- a/apps/server/src/provider/agentContextBudget.json +++ b/apps/server/src/provider/agentContextBudget.json @@ -1,5 +1,5 @@ { "claudeSystemAppendBytes": 5366, "codexAdditionalContextBytes": 7096, - "mcpToolListJsonBytes": 48119 + "mcpToolListJsonBytes": 48584 } From 2fa521de78e1bd9875a92bee47269ddfa1b88397 Mon Sep 17 00:00:00 2001 From: maria-rcks Date: Tue, 10 Nov 2026 04:24:13 +0000 Subject: [PATCH 2/2] fix(server): record merged tool schema budget after main merge --- apps/server/src/provider/agentContextBudget.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/provider/agentContextBudget.json b/apps/server/src/provider/agentContextBudget.json index 50ce63aa8a2b3..11114a315c881 100644 --- a/apps/server/src/provider/agentContextBudget.json +++ b/apps/server/src/provider/agentContextBudget.json @@ -1,5 +1,5 @@ { "claudeSystemAppendBytes": 5547, "codexAdditionalContextBytes": 7277, - "mcpToolListJsonBytes": 48217 + "mcpToolListJsonBytes": 48682 }