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
This commit is contained in:
@@ -36,15 +36,21 @@ export type PageName = 'home' | 'canvas' | 'components' | 'themes' | 'projects'
|
||||
let webmcpInstance: any = null
|
||||
const registeredToolsSet = new Set<string>()
|
||||
|
||||
async function internalRegisterTool(config: ToolConfig): Promise<boolean> {
|
||||
async function internalRegisterTool(config: ToolConfig, force: boolean = false): Promise<boolean> {
|
||||
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}"`)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user