@@ -12,6 +12,7 @@ const FGP_WS_URL = 'ws://localhost:9223'; // FGP extension bridge port
1212const RECONNECT_DELAY = 3000 ;
1313const FGP_TAB_GROUP_NAME = 'FGP' ;
1414const FGP_TAB_GROUP_COLOR = 'blue' ;
15+ const FGP_EXTENSION_VERSION = '0.1.1' ; // Bump on protocol changes
1516
1617let ws = null ;
1718let fgpTabGroupId = null ;
@@ -36,7 +37,7 @@ function connect() {
3637 updateBadge ( 'connected' ) ;
3738
3839 // Send hello message
39- send ( { type : 'hello' , version : '0.1.0' , capabilities : getCapabilities ( ) } ) ;
40+ send ( { type : 'hello' , version : FGP_EXTENSION_VERSION , capabilities : getCapabilities ( ) } ) ;
4041 } ;
4142
4243 ws . onmessage = async ( event ) => {
@@ -157,9 +158,11 @@ async function handleRequest(request) {
157158
158159 // === Utility ===
159160 case 'health' :
160- return { ok : true , status : 'healthy' } ;
161+ return { ok : true , result : { status : 'healthy' } } ;
161162 case 'capabilities' :
162- return { ok : true , capabilities : getCapabilities ( ) } ;
163+ return { ok : true , result : getCapabilities ( ) } ;
164+ case 'version' :
165+ return { ok : true , result : { version : FGP_EXTENSION_VERSION } } ;
163166
164167 default :
165168 return { ok : false , error : `Unknown method: ${ method } ` } ;
@@ -180,7 +183,7 @@ async function handleTabCreate(params) {
180183 await addTabToFgpGroup ( tab . id ) ;
181184 }
182185
183- return { ok : true , tab : serializeTab ( tab ) } ;
186+ return { ok : true , result : serializeTab ( tab ) } ;
184187}
185188
186189async function handleTabUpdate ( params ) {
@@ -192,31 +195,31 @@ async function handleTabUpdate(params) {
192195 if ( muted !== undefined ) updates . muted = muted ;
193196
194197 const tab = await chrome . tabs . update ( tabId , updates ) ;
195- return { ok : true , tab : serializeTab ( tab ) } ;
198+ return { ok : true , result : serializeTab ( tab ) } ;
196199}
197200
198201async function handleTabRemove ( params ) {
199202 const { tabId, tabIds } = params ;
200203 const ids = tabIds || [ tabId ] ;
201204 await chrome . tabs . remove ( ids ) ;
202- return { ok : true , removed : ids } ;
205+ return { ok : true , result : { removed : ids } } ;
203206}
204207
205208async function handleTabQuery ( params ) {
206209 const tabs = await chrome . tabs . query ( params ) ;
207- return { ok : true , tabs : tabs . map ( serializeTab ) } ;
210+ return { ok : true , result : tabs . map ( serializeTab ) } ;
208211}
209212
210213async function handleTabGet ( params ) {
211214 const { tabId } = params ;
212215 const tab = await chrome . tabs . get ( tabId ) ;
213- return { ok : true , tab : serializeTab ( tab ) } ;
216+ return { ok : true , result : serializeTab ( tab ) } ;
214217}
215218
216219async function handleTabNavigate ( params ) {
217220 const { tabId, url } = params ;
218221 const tab = await chrome . tabs . update ( tabId , { url } ) ;
219- return { ok : true , tab : serializeTab ( tab ) } ;
222+ return { ok : true , result : serializeTab ( tab ) } ;
220223}
221224
222225// ============================================================================
@@ -231,7 +234,7 @@ async function handleTabGroup(params) {
231234 if ( createProperties ) options . createProperties = createProperties ;
232235
233236 const resultGroupId = await chrome . tabs . group ( options ) ;
234- return { ok : true , groupId : resultGroupId } ;
237+ return { ok : true , result : { groupId : resultGroupId } } ;
235238}
236239
237240async function handleTabUngroup ( params ) {
@@ -248,12 +251,12 @@ async function handleTabGroupUpdate(params) {
248251 if ( collapsed !== undefined ) updates . collapsed = collapsed ;
249252
250253 const group = await chrome . tabGroups . update ( groupId , updates ) ;
251- return { ok : true , group } ;
254+ return { ok : true , result : group } ;
252255}
253256
254257async function handleTabGroupQuery ( params ) {
255258 const groups = await chrome . tabGroups . query ( params ) ;
256- return { ok : true , groups } ;
259+ return { ok : true , result : groups } ;
257260}
258261
259262async function handleTabGroupCollapse ( params ) {
@@ -302,7 +305,7 @@ async function handleExecuteScript(params) {
302305 args
303306 } ) ;
304307
305- return { ok : true , results : results . map ( r => r . result ) } ;
308+ return { ok : true , result : results . map ( r => r . result ) } ;
306309}
307310
308311async function handlePageSnapshot ( params ) {
@@ -314,7 +317,7 @@ async function handlePageSnapshot(params) {
314317 func : extractAriaTree
315318 } ) ;
316319
317- return { ok : true , snapshot : results [ 0 ] ?. result } ;
320+ return { ok : true , result : results [ 0 ] ?. result } ;
318321}
319322
320323async function handlePageClick ( params ) {
@@ -331,7 +334,7 @@ async function handlePageClick(params) {
331334 args : [ selector ]
332335 } ) ;
333336
334- return { ok : true , clicked : results [ 0 ] ?. result } ;
337+ return { ok : true , result : { clicked : results [ 0 ] ?. result } } ;
335338}
336339
337340async function handlePageFill ( params ) {
@@ -350,7 +353,7 @@ async function handlePageFill(params) {
350353 args : [ selector , value ]
351354 } ) ;
352355
353- return { ok : true , filled : results [ 0 ] ?. result } ;
356+ return { ok : true , result : { filled : results [ 0 ] ?. result } } ;
354357}
355358
356359// ============================================================================
@@ -360,17 +363,17 @@ async function handlePageFill(params) {
360363async function handleCookiesGet ( params ) {
361364 const { url, name } = params ;
362365 const cookie = await chrome . cookies . get ( { url, name } ) ;
363- return { ok : true , cookie } ;
366+ return { ok : true , result : cookie } ;
364367}
365368
366369async function handleCookiesGetAll ( params ) {
367370 const cookies = await chrome . cookies . getAll ( params ) ;
368- return { ok : true , cookies } ;
371+ return { ok : true , result : cookies } ;
369372}
370373
371374async function handleCookiesSet ( params ) {
372375 const cookie = await chrome . cookies . set ( params ) ;
373- return { ok : true , cookie } ;
376+ return { ok : true , result : cookie } ;
374377}
375378
376379// ============================================================================
@@ -381,7 +384,7 @@ async function handleStorageGet(params) {
381384 const { keys, area = 'local' } = params ;
382385 const storage = area === 'sync' ? chrome . storage . sync : chrome . storage . local ;
383386 const data = await storage . get ( keys ) ;
384- return { ok : true , data } ;
387+ return { ok : true , result : data } ;
385388}
386389
387390async function handleStorageSet ( params ) {
@@ -403,7 +406,7 @@ async function handleNotificationCreate(params) {
403406 title,
404407 message
405408 } ) ;
406- return { ok : true , notificationId : id } ;
409+ return { ok : true , result : { notificationId : id } } ;
407410}
408411
409412// ============================================================================
@@ -472,6 +475,29 @@ function extractAriaTree() {
472475 return { nodes, element_count : nodes . length } ;
473476}
474477
478+ // ============================================================================
479+ // Internal Message Handler (for popup communication)
480+ // ============================================================================
481+
482+ chrome . runtime . onMessage . addListener ( ( message , sender , sendResponse ) => {
483+ if ( message . type === 'getStatus' ) {
484+ sendResponse ( { status : connectionStatus } ) ;
485+ return true ;
486+ }
487+
488+ if ( message . type === 'reconnect' ) {
489+ if ( ws ) {
490+ ws . close ( ) ;
491+ }
492+ ws = null ;
493+ connect ( ) ;
494+ sendResponse ( { ok : true } ) ;
495+ return true ;
496+ }
497+
498+ return false ;
499+ } ) ;
500+
475501// ============================================================================
476502// Initialize
477503// ============================================================================
0 commit comments