From 9f85898937cb6cb776be65ae4fc9d378653496dc Mon Sep 17 00:00:00 2001 From: Ajax Davis Date: Thu, 4 Dec 2025 13:43:19 +1000 Subject: [PATCH] fix: use deployed /api/tools endpoint with client-side filtering and streamline git hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change search-registry to use /api/tools instead of /api/tools/search (not deployed yet) - Add client-side filtering for search queries since deployed API doesn't support search - Handle both deployed (/api/tools) and local dev (/api/tools/search) response formats - Remove lint from pre-commit hooks to speed up commits (keep format + type-check) - Fixes 404 errors when playground tries to search tools in production 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- apps/playground/next-env.d.ts | 2 +- .../src/components/sidebar/ToolsSidebar.tsx | 6 +++- .../playground/src/lib/dynamic-tool-loader.ts | 2 +- apps/railway-executor/server.ts | 4 ++- apps/web/next-env.d.ts | 2 +- lefthook.yml | 3 -- packages/tools/search-registry/src/index.ts | 33 +++++++++++++++++-- 7 files changed, 41 insertions(+), 11 deletions(-) diff --git a/apps/playground/next-env.d.ts b/apps/playground/next-env.d.ts index c4b7818..9edff1c 100644 --- a/apps/playground/next-env.d.ts +++ b/apps/playground/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/playground/src/components/sidebar/ToolsSidebar.tsx b/apps/playground/src/components/sidebar/ToolsSidebar.tsx index 6edcaae..34687ef 100644 --- a/apps/playground/src/components/sidebar/ToolsSidebar.tsx +++ b/apps/playground/src/components/sidebar/ToolsSidebar.tsx @@ -65,7 +65,11 @@ export function ToolsSidebar(): React.ReactElement {

No tools found

) : ( filteredTools.map((tool) => ( - + {tool.exportName} diff --git a/apps/playground/src/lib/dynamic-tool-loader.ts b/apps/playground/src/lib/dynamic-tool-loader.ts index 09a8815..438afd7 100644 --- a/apps/playground/src/lib/dynamic-tool-loader.ts +++ b/apps/playground/src/lib/dynamic-tool-loader.ts @@ -1,4 +1,4 @@ -import { tool, jsonSchema } from 'ai'; +import { jsonSchema, tool } from 'ai'; // Cache for tool wrappers (process-level) const moduleCache = new Map(); diff --git a/apps/railway-executor/server.ts b/apps/railway-executor/server.ts index 0d78c28..117f0b0 100644 --- a/apps/railway-executor/server.ts +++ b/apps/railway-executor/server.ts @@ -107,7 +107,9 @@ async function loadAndDescribe(req: Request): Promise { // Strategy 3: Try Zod v3 schema (detect via _def property and convert) if (!rawJsonSchema && toolModule.inputSchema._def) { - console.log(`📋 Detected Zod schema (v3), converting with zod-to-json-schema for ${cacheKey}`); + console.log( + `📋 Detected Zod schema (v3), converting with zod-to-json-schema for ${cacheKey}` + ); try { rawJsonSchema = zodToJsonSchema(toolModule.inputSchema); console.log(`✅ Successfully converted Zod schema for ${cacheKey}`); diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts index c4b7818..9edff1c 100644 --- a/apps/web/next-env.d.ts +++ b/apps/web/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/lefthook.yml b/lefthook.yml index 19df5eb..697b02f 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -9,9 +9,6 @@ pre-commit: type-check: run: pnpm type-check - lint: - run: pnpm lint - pre-push: commands: test: diff --git a/packages/tools/search-registry/src/index.ts b/packages/tools/search-registry/src/index.ts index daf6bfc..8cdfc70 100644 --- a/packages/tools/search-registry/src/index.ts +++ b/packages/tools/search-registry/src/index.ts @@ -68,7 +68,10 @@ export const searchTpmjsToolsTool = tool({ const baseUrl = process.env.TPMJS_API_URL || (process.env.NODE_ENV === 'production' ? 'https://tpmjs.com' : 'http://localhost:3000'); - const url = `${baseUrl}/api/tools/search?${params}`; + + // Note: /api/tools/search endpoint exists in local dev but not deployed yet + // Using /api/tools as fallback with client-side filtering for now + const url = `${baseUrl}/api/tools?${params}`; console.log(`🌐 Fetching: ${url}`); @@ -83,10 +86,34 @@ export const searchTpmjsToolsTool = tool({ const data = (await response.json()) as any; console.log('📦 Search response data:', JSON.stringify(data, null, 2)); + // Handle both /api/tools (deployed) and /api/tools/search (local dev) responses + const toolsArray = data.results?.tools || data.data || []; + + // Client-side filtering if query is provided (since deployed /api/tools doesn't support search yet) + let filteredTools = toolsArray; + if (query?.trim()) { + const queryLower = query.toLowerCase(); + filteredTools = toolsArray.filter((tool: any) => { + const searchableText = [ + tool.description, + tool.exportName, + tool.package?.npmPackageName, + tool.package?.npmDescription, + ...(tool.package?.npmKeywords || []), + ] + .join(' ') + .toLowerCase(); + return searchableText.includes(queryLower); + }); + } + + // Apply limit + const limitedTools = filteredTools.slice(0, limit); + return { query, - matchCount: data.results?.total || data.data?.length || 0, - tools: (data.results?.tools || data.data || []).map((tool: any) => ({ + matchCount: filteredTools.length, + tools: limitedTools.map((tool: any) => ({ toolId: tool.id, packageName: tool.package.npmPackageName, exportName: tool.exportName,