From 97457ec7a3cf18c155ce8cdaf3af8efc3f556bc9 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Mon, 21 Sep 2026 16:59:31 -0500 Subject: [PATCH] feat(codemode): accept tools.-prefixed namespaces in search (#50438) --- packages/codemode/src/tool-runtime.ts | 13 +++++++------ packages/codemode/test/codemode.test.ts | 4 ++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/codemode/src/tool-runtime.ts b/packages/codemode/src/tool-runtime.ts index e05e2090028..7b83510c544 100644 --- a/packages/codemode/src/tool-runtime.ts +++ b/packages/codemode/src/tool-runtime.ts @@ -221,14 +221,15 @@ const makeSearchTool = (searchIndex: ReadonlyArray): Tool => ({ const request = input as typeof SearchInput.Type const query = request.query ?? "" const offset = request.offset ?? 0 + let ns = request.namespace + if (ns !== undefined && !searchIndex.some((entry) => entry.description.path.startsWith("tools."))) { + if (ns === "tools") ns = undefined + else if (ns.startsWith("tools.")) ns = ns.slice("tools.".length) + } const scoped = - request.namespace === undefined + ns === undefined ? searchIndex - : searchIndex.filter( - (entry) => - entry.description.path === request.namespace || - entry.description.path.startsWith(`${request.namespace}.`), - ) + : searchIndex.filter((entry) => entry.description.path === ns || entry.description.path.startsWith(`${ns}.`)) const trimmed = query.trim() const pathQuery = trimmed.startsWith("tools.") ? trimmed.slice("tools.".length) : trimmed const exact = diff --git a/packages/codemode/test/codemode.test.ts b/packages/codemode/test/codemode.test.ts index 24d7da80f21..fdcf60a93f2 100644 --- a/packages/codemode/test/codemode.test.ts +++ b/packages/codemode/test/codemode.test.ts @@ -995,6 +995,10 @@ describe("CodeMode public contract", () => { expect(value.items[0]?.path).toBe("tools.linear.list_issues") } + const prefixed = await Effect.runPromise(runtime.execute(`return search({ query: "", namespace: "tools.github" })`)) + expect(prefixed.ok).toBe(true) + if (prefixed.ok) expect((prefixed.value as { items: Array }).items).toHaveLength(2) + const invalid = await Effect.runPromise(runtime.execute(`return search({ query: "issues", namespace: 7 })`)) expect(invalid.ok).toBe(false) if (!invalid.ok) expect(invalid.error.kind).toBe("InvalidToolInput")