fix: Only register MCP tools when connected via torch

- Tools only register when connected to MCP (has torch)
- Store current page for tool activation when torch is obtained
- Add onTorchConnected to activate page tools after MCP connection
- Add onTorchDisconnected to clear tools when losing torch
- Page changes only update tools if connected, otherwise store for later
This commit is contained in:
2026-02-14 17:32:58 -06:00
parent 0f73bd60bf
commit 3817645919
2 changed files with 62 additions and 7 deletions

View File

@@ -8,9 +8,11 @@
import { import {
initWebMCP, initWebMCP,
getRegisteredTools as getWebMCPTools, getRegisteredTools as getWebMCPTools,
clearAllTools as clearWebMCPTools clearAllTools as clearWebMCPTools,
getWebMCP
} from './webmcp' } from './webmcp'
import { useToolsStore } from '../stores/tools' import { useToolsStore } from '../stores/tools'
import { useCanvasStore } from '../stores/canvas'
import { import {
createGlobalHandlers, createGlobalHandlers,
createCanvasHandlers, createCanvasHandlers,
@@ -158,6 +160,14 @@ const pageCategories: Record<PageName, ToolCategory[]> = {
let currentPage: PageName | null = null let currentPage: PageName | null = null
let isInitialized = false let isInitialized = false
/**
* Check if connected to MCP
*/
function isConnectedToMCP(): boolean {
const canvasStore = useCanvasStore()
return canvasStore.isConnected
}
/** /**
* Initialize the tool registry with Vue router * Initialize the tool registry with Vue router
*/ */
@@ -182,14 +192,22 @@ export function clearSourceCodeCredentials() {
/** /**
* Activate tools for a specific page * Activate tools for a specific page
* Only works when connected to MCP
*/ */
export async function activatePageTools(pageName: PageName) { export async function activatePageTools(pageName: PageName, force: boolean = false) {
if (!isInitialized) { if (!isInitialized) {
console.warn('[ToolRegistry] Not initialized') console.warn('[ToolRegistry] Not initialized')
return return
} }
if (currentPage === pageName) { // Only register tools if connected to MCP
if (!isConnectedToMCP()) {
console.log(`[ToolRegistry] Not connected to MCP, storing page "${pageName}" for later`)
currentPage = pageName
return
}
if (!force && currentPage === pageName) {
console.log(`[ToolRegistry] Already on "${pageName}", skipping`) console.log(`[ToolRegistry] Already on "${pageName}", skipping`)
return return
} }
@@ -238,6 +256,7 @@ export async function activatePageTools(pageName: PageName) {
/** /**
* Initialize tools on page refresh * Initialize tools on page refresh
* Just stores the current page, actual registration happens when connected
*/ */
export async function initToolsOnRefresh(pageName: PageName) { export async function initToolsOnRefresh(pageName: PageName) {
if (!isInitialized) { if (!isInitialized) {
@@ -245,11 +264,44 @@ export async function initToolsOnRefresh(pageName: PageName) {
return return
} }
console.log(`[ToolRegistry] Initializing on refresh for "${pageName}"`) console.log(`[ToolRegistry] Storing current page "${pageName}" for when connected`)
currentPage = pageName
// Only activate if already connected
if (isConnectedToMCP()) {
internalClearAllTools()
await activatePageTools(pageName, true)
}
}
/**
* Called when torch is obtained and MCP is connected
* Activates tools for the current page
*/
export async function onTorchConnected() {
if (!isInitialized) {
console.warn('[ToolRegistry] Not initialized')
return
}
if (!currentPage) {
console.warn('[ToolRegistry] No current page set')
return
}
console.log(`[ToolRegistry] Torch connected, activating tools for "${currentPage}"`)
internalClearAllTools() internalClearAllTools()
currentPage = null await activatePageTools(currentPage, true)
await activatePageTools(pageName) }
/**
* Called when torch is lost and MCP is disconnected
* Clears all tools
*/
export function onTorchDisconnected() {
console.log('[ToolRegistry] Torch disconnected, clearing tools')
internalClearAllTools()
syncStoreWithActiveTools()
} }
/** /**

View File

@@ -1,5 +1,6 @@
import { useTorchStore } from '../stores/torch' import { useTorchStore } from '../stores/torch'
import { autoConnect, disconnectWebMCP } from './webmcp' import { autoConnect, disconnectWebMCP } from './webmcp'
import { onTorchConnected, onTorchDisconnected } from './toolRegistry'
import { endpoints } from '../config/endpoints' import { endpoints } from '../config/endpoints'
let torchWs: WebSocket | null = null let torchWs: WebSocket | null = null
@@ -150,7 +151,8 @@ async function connectToMCP(): Promise<void> {
console.log('[Torch] Connecting to MCP...') console.log('[Torch] Connecting to MCP...')
const success = await autoConnect() const success = await autoConnect()
if (success) { if (success) {
console.log('[Torch] Connected to MCP') console.log('[Torch] Connected to MCP, activating tools')
await onTorchConnected()
} else { } else {
console.error('[Torch] Failed to connect to MCP') console.error('[Torch] Failed to connect to MCP')
} }
@@ -161,6 +163,7 @@ async function connectToMCP(): Promise<void> {
*/ */
function disconnectFromMCP(): void { function disconnectFromMCP(): void {
console.log('[Torch] Disconnecting from MCP...') console.log('[Torch] Disconnecting from MCP...')
onTorchDisconnected()
disconnectWebMCP() disconnectWebMCP()
} }