fix(tools): keep canonical tool names for oauth
This commit is contained in:
@@ -158,22 +158,16 @@ describe("createClawdbotCodingTools", () => {
|
|||||||
expect(tools.some((tool) => tool.name === "process")).toBe(true);
|
expect(tools.some((tool) => tool.name === "process")).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renames blocked tool names only for Anthropic OAuth", () => {
|
it("keeps canonical tool names for Anthropic OAuth (pi-ai remaps on the wire)", () => {
|
||||||
const tools = createClawdbotCodingTools({
|
const tools = createClawdbotCodingTools({
|
||||||
modelProvider: "anthropic",
|
modelProvider: "anthropic",
|
||||||
modelAuthMode: "oauth",
|
modelAuthMode: "oauth",
|
||||||
});
|
});
|
||||||
const names = new Set(tools.map((tool) => tool.name));
|
const names = new Set(tools.map((tool) => tool.name));
|
||||||
expect(names.has("Bash")).toBe(true);
|
expect(names.has("bash")).toBe(true);
|
||||||
expect(names.has("Read")).toBe(true);
|
expect(names.has("read")).toBe(true);
|
||||||
expect(names.has("Write")).toBe(true);
|
expect(names.has("write")).toBe(true);
|
||||||
expect(names.has("Edit")).toBe(true);
|
expect(names.has("edit")).toBe(true);
|
||||||
|
|
||||||
// Ensure the blocked lowercase variants are not present in the schema.
|
|
||||||
expect(names.has("bash")).toBe(false);
|
|
||||||
expect(names.has("read")).toBe(false);
|
|
||||||
expect(names.has("write")).toBe(false);
|
|
||||||
expect(names.has("edit")).toBe(false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("provides top-level object schemas for all tools", () => {
|
it("provides top-level object schemas for all tools", () => {
|
||||||
|
|||||||
@@ -284,28 +284,6 @@ function normalizeToolNames(list?: string[]) {
|
|||||||
return list.map((entry) => entry.trim().toLowerCase()).filter(Boolean);
|
return list.map((entry) => entry.trim().toLowerCase()).filter(Boolean);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Anthropic blocks specific lowercase tool names (bash, read, write, edit) with OAuth tokens.
|
|
||||||
* Renaming to capitalized versions bypasses the block while maintaining compatibility
|
|
||||||
* with Anthropic API keys and other providers.
|
|
||||||
*/
|
|
||||||
const OAUTH_BLOCKED_TOOL_NAMES: Record<string, string> = {
|
|
||||||
bash: "Bash",
|
|
||||||
read: "Read",
|
|
||||||
write: "Write",
|
|
||||||
edit: "Edit",
|
|
||||||
};
|
|
||||||
|
|
||||||
function renameBlockedToolsForOAuth(tools: AnyAgentTool[]): AnyAgentTool[] {
|
|
||||||
return tools.map((tool) => {
|
|
||||||
const newName = OAUTH_BLOCKED_TOOL_NAMES[tool.name];
|
|
||||||
if (newName) {
|
|
||||||
return { ...tool, name: newName };
|
|
||||||
}
|
|
||||||
return tool;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const DEFAULT_SUBAGENT_TOOL_DENY = [
|
const DEFAULT_SUBAGENT_TOOL_DENY = [
|
||||||
"sessions_list",
|
"sessions_list",
|
||||||
"sessions_history",
|
"sessions_history",
|
||||||
@@ -667,11 +645,8 @@ export function createClawdbotCodingTools(options?: {
|
|||||||
)
|
)
|
||||||
: normalized;
|
: normalized;
|
||||||
|
|
||||||
// Anthropic blocks specific lowercase tool names (bash, read, write, edit) with OAuth tokens.
|
// NOTE: Keep canonical (lowercase) tool names here.
|
||||||
// Only apply the rename when we are actually using (or likely using) Anthropic OAuth.
|
// pi-ai's Anthropic OAuth transport remaps tool names to Claude Code-style names
|
||||||
const provider = options?.modelProvider?.trim();
|
// on the wire and maps them back for tool dispatch.
|
||||||
const authMode = options?.modelAuthMode;
|
return withAbort;
|
||||||
const isAnthropicOAuth =
|
|
||||||
provider === "anthropic" && (authMode === "oauth" || authMode === "mixed");
|
|
||||||
return isAnthropicOAuth ? renameBlockedToolsForOAuth(withAbort) : withAbort;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user