This commit is contained in:
Tommy D. Rossi
2025-11-24 16:40:07 +01:00
parent 5d93b977d1
commit 7eb5060d71
6 changed files with 31 additions and 26 deletions
+1 -17
View File
@@ -1,26 +1,10 @@
import { RelayConnection, logger } from './relayConnection' import { RelayConnection, logger } from './relayConnection'
import { createStore } from 'zustand/vanilla' import { createStore } from 'zustand/vanilla'
import type { ExtensionState, ConnectionState, TabState, TabInfo } from './types'
// Relay URL - fixed port for MCP bridge // Relay URL - fixed port for MCP bridge
const RELAY_URL = 'ws://localhost:19988/extension' const RELAY_URL = 'ws://localhost:19988/extension'
type ConnectionState = 'disconnected' | 'reconnecting' | 'connected' | 'error'
type TabState = 'connecting' | 'connected' | 'error'
interface TabInfo {
targetId: string
state: TabState
errorText?: string
}
interface ExtensionState {
connection: RelayConnection | undefined
connectedTabs: Map<number, TabInfo>
connectionState: ConnectionState
currentTabId: number | undefined
errorText: string | undefined
}
const useExtensionStore = createStore<ExtensionState>((set) => ({ const useExtensionStore = createStore<ExtensionState>((set) => ({
connection: undefined, connection: undefined,
connectedTabs: new Map(), connectedTabs: new Map(),
+18
View File
@@ -0,0 +1,18 @@
import type { RelayConnection } from './relayConnection'
export type ConnectionState = 'disconnected' | 'reconnecting' | 'connected' | 'error'
export type TabState = 'connecting' | 'connected' | 'error'
export interface TabInfo {
targetId: string
state: TabState
errorText?: string
}
export interface ExtensionState {
connection: RelayConnection | undefined
connectedTabs: Map<number, TabInfo>
connectionState: ConnectionState
currentTabId: number | undefined
errorText: string | undefined
}
+1
View File
@@ -27,6 +27,7 @@
"license": "", "license": "",
"devDependencies": { "devDependencies": {
"@mizchi/selector-generator": "1.50.0-next", "@mizchi/selector-generator": "1.50.0-next",
"@types/chrome": "^0.0.315",
"@types/node": "^24.10.1", "@types/node": "^24.10.1",
"@vitest/ui": "^4.0.8", "@vitest/ui": "^4.0.8",
"mcp-extension": "workspace:*", "mcp-extension": "workspace:*",
+6 -8
View File
@@ -55,7 +55,6 @@ declare global {
var toggleExtensionForActiveTab: () => Promise<{ isConnected: boolean; state: ExtensionState }>; var toggleExtensionForActiveTab: () => Promise<{ isConnected: boolean; state: ExtensionState }>;
var getExtensionState: () => ExtensionState; var getExtensionState: () => ExtensionState;
var disconnectEverything: () => Promise<void>; var disconnectEverything: () => Promise<void>;
var chrome: any;
} }
describe('MCP Server Tests', () => { describe('MCP Server Tests', () => {
@@ -224,13 +223,12 @@ describe('MCP Server Tests', () => {
// Get extension state to verify the page is marked as connected // Get extension state to verify the page is marked as connected
const extensionState = await serviceWorker.evaluate(async () => { const extensionState = await serviceWorker.evaluate(async () => {
const state = globalThis.getExtensionState() const state = globalThis.getExtensionState()
const chrome = globalThis.chrome
const tabs = await chrome.tabs.query({}) const tabs = await chrome.tabs.query({})
const testTab = tabs.find((t: any) => t.url?.includes('mcp-test')) const testTab = tabs.find((t: any) => t.url?.includes('mcp-test'))
return { return {
connected: !!testTab && state.connectedTabs.has(testTab.id), connected: !!testTab && !!testTab.id && state.connectedTabs.has(testTab.id),
tabId: testTab?.id, tabId: testTab?.id,
tabInfo: testTab ? state.connectedTabs.get(testTab.id) : null, tabInfo: testTab?.id ? state.connectedTabs.get(testTab.id) : null,
connectionState: state.connectionState connectionState: state.connectionState
} }
}) })
@@ -583,8 +581,8 @@ describe('MCP Server Tests', () => {
const tabA = tabs.find((t: any) => t.url?.includes('tab-a')) const tabA = tabs.find((t: any) => t.url?.includes('tab-a'))
const tabB = tabs.find((t: any) => t.url?.includes('tab-b')) const tabB = tabs.find((t: any) => t.url?.includes('tab-b'))
return { return {
idA: state.connectedTabs.get(tabA?.id)?.targetId, idA: state.connectedTabs.get(tabA?.id ?? -1)?.targetId,
idB: state.connectedTabs.get(tabB?.id)?.targetId idB: state.connectedTabs.get(tabB?.id ?? -1)?.targetId
} }
}) })
@@ -669,8 +667,8 @@ describe('MCP Server Tests', () => {
const tabA = tabs.find((t: any) => t.url?.includes('tab-a')) const tabA = tabs.find((t: any) => t.url?.includes('tab-a'))
const tabB = tabs.find((t: any) => t.url?.includes('tab-b')) const tabB = tabs.find((t: any) => t.url?.includes('tab-b'))
return { return {
idA: state.connectedTabs.get(tabA?.id)?.targetId, idA: state.connectedTabs.get(tabA?.id ?? -1)?.targetId,
idB: state.connectedTabs.get(tabB?.id)?.targetId idB: state.connectedTabs.get(tabB?.id ?? -1)?.targetId
} }
}) })
+2 -1
View File
@@ -2,7 +2,8 @@
"extends": "../tsconfig.base.json", "extends": "../tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"rootDir": "src", "rootDir": "src",
"outDir": "dist" "outDir": "dist",
"types": ["node", "chrome"]
}, },
"include": ["src"] "include": ["src"]
} }
+3
View File
@@ -94,6 +94,9 @@ importers:
'@mizchi/selector-generator': '@mizchi/selector-generator':
specifier: 1.50.0-next specifier: 1.50.0-next
version: 1.50.0-next version: 1.50.0-next
'@types/chrome':
specifier: ^0.0.315
version: 0.0.315
'@types/node': '@types/node':
specifier: ^24.10.1 specifier: ^24.10.1
version: 24.10.1 version: 24.10.1