From c280e974c03331fe562a2b66f6ec9af9d82d32e8 Mon Sep 17 00:00:00 2001 From: josedario87 Date: Sat, 14 Feb 2026 17:36:09 -0600 Subject: [PATCH] fix: Force re-register tools with handlers after torch connection - Clear WebMCP storage before registering tools - Force re-register all tools to ensure handlers are attached - Add activatePageToolsForced for clean tool registration after reconnect --- frontend/src/services/toolRegistry.ts | 52 ++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/frontend/src/services/toolRegistry.ts b/frontend/src/services/toolRegistry.ts index 5e21588..955f70c 100644 --- a/frontend/src/services/toolRegistry.ts +++ b/frontend/src/services/toolRegistry.ts @@ -36,15 +36,21 @@ export type PageName = 'home' | 'canvas' | 'components' | 'themes' | 'projects' let webmcpInstance: any = null const registeredToolsSet = new Set() -async function internalRegisterTool(config: ToolConfig): Promise { +async function internalRegisterTool(config: ToolConfig, force: boolean = false): Promise { if (!webmcpInstance) { webmcpInstance = await initWebMCP() } - if (registeredToolsSet.has(config.name)) { + // Always re-register if force is true (needed after reconnection) + if (!force && registeredToolsSet.has(config.name)) { return false // Already registered } + // Unregister first if exists (to clear any stale handlers from storage) + if (registeredToolsSet.has(config.name)) { + webmcpInstance.unregisterTool(config.name) + } + webmcpInstance.registerTool(config.name, config.description, config.schema, config.handler) registeredToolsSet.add(config.name) console.log(`[ToolRegistry] Registered: ${config.name}`) @@ -290,8 +296,46 @@ export async function onTorchConnected() { } console.log(`[ToolRegistry] Torch connected, activating tools for "${currentPage}"`) - internalClearAllTools() - await activatePageTools(currentPage, true) + + // Clear any stale tools from WebMCP storage first + clearWebMCPTools() + registeredToolsSet.clear() + + // Force re-register all tools for current page + await activatePageToolsForced(currentPage) +} + +/** + * Force activate tools for a page (used after torch connection) + */ +async function activatePageToolsForced(pageName: PageName) { + const toolsStore = useToolsStore() + const pinnedTools = toolsStore.getPinnedToolNames() + const configs = getToolConfigs() + const categories = pageCategories[pageName] + const tools = new Set(categories.flatMap(cat => categoryTools[cat])) + + // Register all tools with force flag + for (const toolName of tools) { + const config = configs.get(toolName) + if (config) { + await internalRegisterTool(config, true) + } + } + + // Also register pinned tools + for (const toolName of pinnedTools) { + if (!tools.has(toolName)) { + const config = configs.get(toolName) + if (config) { + await internalRegisterTool(config, true) + } + } + } + + currentPage = pageName + syncStoreWithActiveTools() + console.log(`[ToolRegistry] Force activated ${registeredToolsSet.size} tools for "${pageName}"`) } /**