@vforsh/argus 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/argus.js +5251 -5487
- package/dist/cdp/resolveCdpEndpoint.d.ts.map +1 -1
- package/dist/cdp/resolveCdpEndpoint.js +2 -1
- package/dist/cdp/resolveCdpEndpoint.js.map +1 -1
- package/dist/cli/defineCommand.d.ts +12 -0
- package/dist/cli/defineCommand.d.ts.map +1 -1
- package/dist/cli/defineCommand.js +71 -1
- package/dist/cli/defineCommand.js.map +1 -1
- package/dist/cli/defineWatcherCommand.d.ts +12 -54
- package/dist/cli/defineWatcherCommand.d.ts.map +1 -1
- package/dist/cli/defineWatcherCommand.js +1 -1
- package/dist/cli/defineWatcherCommand.js.map +1 -1
- package/dist/cli/parse.d.ts +1 -2
- package/dist/cli/parse.d.ts.map +1 -1
- package/dist/cli/parse.js +2 -10
- package/dist/cli/parse.js.map +1 -1
- package/dist/cli/plugins/pluginHost.d.ts.map +1 -1
- package/dist/cli/plugins/pluginHost.js +1 -1
- package/dist/cli/plugins/pluginHost.js.map +1 -1
- package/dist/cli/plugins/registerPlugins.d.ts.map +1 -1
- package/dist/cli/plugins/registerPlugins.js +10 -8
- package/dist/cli/plugins/registerPlugins.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +4 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/register/authCommands.d.ts.map +1 -1
- package/dist/cli/register/authCommands.js +8 -7
- package/dist/cli/register/authCommands.js.map +1 -1
- package/dist/cli/register/chromeCommands.d.ts.map +1 -1
- package/dist/cli/register/chromeCommands.js +12 -27
- package/dist/cli/register/chromeCommands.js.map +1 -1
- package/dist/cli/register/codeCommands.d.ts.map +1 -1
- package/dist/cli/register/codeCommands.js +7 -6
- package/dist/cli/register/codeCommands.js.map +1 -1
- package/dist/cli/register/dialogCommands.d.ts.map +1 -1
- package/dist/cli/register/dialogCommands.js +3 -2
- package/dist/cli/register/dialogCommands.js.map +1 -1
- package/dist/cli/register/domCommandBuilder.d.ts.map +1 -1
- package/dist/cli/register/domCommandBuilder.js +2 -1
- package/dist/cli/register/domCommandBuilder.js.map +1 -1
- package/dist/cli/register/domCommands.d.ts.map +1 -1
- package/dist/cli/register/domCommands.js +7 -6
- package/dist/cli/register/domCommands.js.map +1 -1
- package/dist/cli/register/evalCommands.d.ts.map +1 -1
- package/dist/cli/register/evalCommands.js +30 -49
- package/dist/cli/register/evalCommands.js.map +1 -1
- package/dist/cli/register/extensionCommands.d.ts.map +1 -1
- package/dist/cli/register/extensionCommands.js +1 -1
- package/dist/cli/register/extensionCommands.js.map +1 -1
- package/dist/cli/register/fillCommand.d.ts.map +1 -1
- package/dist/cli/register/fillCommand.js +11 -4
- package/dist/cli/register/fillCommand.js.map +1 -1
- package/dist/cli/register/hoverCommand.d.ts.map +1 -1
- package/dist/cli/register/hoverCommand.js +2 -1
- package/dist/cli/register/hoverCommand.js.map +1 -1
- package/dist/cli/register/keydownCommand.d.ts.map +1 -1
- package/dist/cli/register/keydownCommand.js +2 -1
- package/dist/cli/register/keydownCommand.js.map +1 -1
- package/dist/cli/register/locateCommands.d.ts.map +1 -1
- package/dist/cli/register/locateCommands.js +2 -1
- package/dist/cli/register/locateCommands.js.map +1 -1
- package/dist/cli/register/logsCommands.d.ts.map +1 -1
- package/dist/cli/register/logsCommands.js +8 -10
- package/dist/cli/register/logsCommands.js.map +1 -1
- package/dist/cli/register/netCommands.d.ts +0 -5
- package/dist/cli/register/netCommands.d.ts.map +1 -1
- package/dist/cli/register/netCommands.js +17 -143
- package/dist/cli/register/netCommands.js.map +1 -1
- package/dist/cli/register/pageCommands.d.ts.map +1 -1
- package/dist/cli/register/pageCommands.js +8 -7
- package/dist/cli/register/pageCommands.js.map +1 -1
- package/dist/cli/register/pluginCommands.d.ts.map +1 -1
- package/dist/cli/register/pluginCommands.js +3 -2
- package/dist/cli/register/pluginCommands.js.map +1 -1
- package/dist/cli/register/quickAccessCommands.d.ts.map +1 -1
- package/dist/cli/register/quickAccessCommands.js +16 -31
- package/dist/cli/register/quickAccessCommands.js.map +1 -1
- package/dist/cli/register/recordCommands.d.ts.map +1 -1
- package/dist/cli/register/recordCommands.js +12 -34
- package/dist/cli/register/recordCommands.js.map +1 -1
- package/dist/cli/register/scrollToCommand.d.ts.map +1 -1
- package/dist/cli/register/scrollToCommand.js +2 -1
- package/dist/cli/register/scrollToCommand.js.map +1 -1
- package/dist/cli/register/sharedOptions.d.ts +11 -0
- package/dist/cli/register/sharedOptions.d.ts.map +1 -0
- package/dist/cli/register/sharedOptions.js +10 -0
- package/dist/cli/register/sharedOptions.js.map +1 -0
- package/dist/cli/register/skillCommands.d.ts.map +1 -1
- package/dist/cli/register/skillCommands.js +2 -1
- package/dist/cli/register/skillCommands.js.map +1 -1
- package/dist/cli/register/snapshotCommands.d.ts.map +1 -1
- package/dist/cli/register/snapshotCommands.js +3 -2
- package/dist/cli/register/snapshotCommands.js.map +1 -1
- package/dist/cli/register/storageCommands.d.ts.map +1 -1
- package/dist/cli/register/storageCommands.js +2 -1
- package/dist/cli/register/storageCommands.js.map +1 -1
- package/dist/cli/register/throttleCommands.d.ts.map +1 -1
- package/dist/cli/register/throttleCommands.js +4 -3
- package/dist/cli/register/throttleCommands.js.map +1 -1
- package/dist/cli/register/traceCommands.d.ts.map +1 -1
- package/dist/cli/register/traceCommands.js +10 -30
- package/dist/cli/register/traceCommands.js.map +1 -1
- package/dist/cli/register/watcherCommands.d.ts.map +1 -1
- package/dist/cli/register/watcherCommands.js +12 -24
- package/dist/cli/register/watcherCommands.js.map +1 -1
- package/dist/cli/validation.d.ts +14 -0
- package/dist/cli/validation.d.ts.map +1 -1
- package/dist/cli/validation.js +17 -6
- package/dist/cli/validation.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +3 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/authCookieSupport.d.ts +4 -2
- package/dist/commands/authCookieSupport.d.ts.map +1 -1
- package/dist/commands/authCookieSupport.js +0 -4
- package/dist/commands/authCookieSupport.js.map +1 -1
- package/dist/commands/authCookies.d.ts +4 -4
- package/dist/commands/authCookies.d.ts.map +1 -1
- package/dist/commands/chrome/authState.d.ts +0 -12
- package/dist/commands/chrome/authState.d.ts.map +1 -1
- package/dist/commands/chrome/authState.js +0 -14
- package/dist/commands/chrome/authState.js.map +1 -1
- package/dist/commands/chrome/browser.d.ts.map +1 -1
- package/dist/commands/chrome/browser.js +2 -1
- package/dist/commands/chrome/browser.js.map +1 -1
- package/dist/commands/chrome/shared.d.ts.map +1 -1
- package/dist/commands/chrome/shared.js +3 -2
- package/dist/commands/chrome/shared.js.map +1 -1
- package/dist/commands/chrome/targets.d.ts.map +1 -1
- package/dist/commands/chrome/targets.js +6 -5
- package/dist/commands/chrome/targets.js.map +1 -1
- package/dist/commands/chromeStart.d.ts +10 -0
- package/dist/commands/chromeStart.d.ts.map +1 -1
- package/dist/commands/chromeStart.js +50 -41
- package/dist/commands/chromeStart.js.map +1 -1
- package/dist/commands/code.d.ts +2 -2
- package/dist/commands/code.d.ts.map +1 -1
- package/dist/commands/codeEdit.d.ts.map +1 -1
- package/dist/commands/codeEdit.js +3 -2
- package/dist/commands/codeEdit.js.map +1 -1
- package/dist/commands/configInit.d.ts +1 -0
- package/dist/commands/configInit.d.ts.map +1 -1
- package/dist/commands/configInit.js +17 -14
- package/dist/commands/configInit.js.map +1 -1
- package/dist/commands/dialog.d.ts +4 -4
- package/dist/commands/dialog.d.ts.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +14 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/dom/shared.js +1 -1
- package/dist/commands/dom/shared.js.map +1 -1
- package/dist/commands/domAdd.d.ts +1 -1
- package/dist/commands/domAdd.d.ts.map +1 -1
- package/dist/commands/domAdd.js +10 -54
- package/dist/commands/domAdd.js.map +1 -1
- package/dist/commands/domAddScript.d.ts.map +1 -1
- package/dist/commands/domAddScript.js +14 -58
- package/dist/commands/domAddScript.js.map +1 -1
- package/dist/commands/domClick.d.ts +1 -2
- package/dist/commands/domClick.d.ts.map +1 -1
- package/dist/commands/domClick.js +2 -4
- package/dist/commands/domClick.js.map +1 -1
- package/dist/commands/domDrag.d.ts +1 -2
- package/dist/commands/domDrag.d.ts.map +1 -1
- package/dist/commands/domDrag.js +3 -5
- package/dist/commands/domDrag.js.map +1 -1
- package/dist/commands/domFill.d.ts +2 -1
- package/dist/commands/domFill.d.ts.map +1 -1
- package/dist/commands/domFill.js +10 -42
- package/dist/commands/domFill.js.map +1 -1
- package/dist/commands/domFocus.d.ts +1 -1
- package/dist/commands/domFocus.d.ts.map +1 -1
- package/dist/commands/domHover.d.ts +1 -1
- package/dist/commands/domHover.d.ts.map +1 -1
- package/dist/commands/domInfo.d.ts +1 -1
- package/dist/commands/domInfo.d.ts.map +1 -1
- package/dist/commands/domKeydown.d.ts +1 -1
- package/dist/commands/domKeydown.d.ts.map +1 -1
- package/dist/commands/domModify.d.ts.map +1 -1
- package/dist/commands/domModify.js +6 -7
- package/dist/commands/domModify.js.map +1 -1
- package/dist/commands/domRemove.d.ts +1 -1
- package/dist/commands/domRemove.d.ts.map +1 -1
- package/dist/commands/domScroll.d.ts +1 -1
- package/dist/commands/domScroll.d.ts.map +1 -1
- package/dist/commands/domScroll.js +16 -10
- package/dist/commands/domScroll.js.map +1 -1
- package/dist/commands/domScrollTo.d.ts +1 -1
- package/dist/commands/domScrollTo.d.ts.map +1 -1
- package/dist/commands/domSetFile.d.ts +1 -1
- package/dist/commands/domSetFile.d.ts.map +1 -1
- package/dist/commands/domTree.d.ts +1 -1
- package/dist/commands/domTree.d.ts.map +1 -1
- package/dist/commands/eval.d.ts +3 -32
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +14 -33
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/evalBundle.js +2 -1
- package/dist/commands/evalBundle.js.map +1 -1
- package/dist/commands/evalEmit.d.ts +35 -0
- package/dist/commands/evalEmit.d.ts.map +1 -0
- package/dist/commands/evalEmit.js +65 -0
- package/dist/commands/evalEmit.js.map +1 -0
- package/dist/commands/evalIframe.d.ts +16 -0
- package/dist/commands/evalIframe.d.ts.map +1 -0
- package/dist/commands/evalIframe.js +37 -0
- package/dist/commands/evalIframe.js.map +1 -0
- package/dist/commands/evalShared.d.ts +52 -44
- package/dist/commands/evalShared.d.ts.map +1 -1
- package/dist/commands/evalShared.js +64 -192
- package/dist/commands/evalShared.js.map +1 -1
- package/dist/commands/evalUntil.d.ts +4 -32
- package/dist/commands/evalUntil.d.ts.map +1 -1
- package/dist/commands/evalUntil.js +9 -29
- package/dist/commands/evalUntil.js.map +1 -1
- package/dist/commands/extension/attach.d.ts.map +1 -1
- package/dist/commands/extension/attach.js +12 -28
- package/dist/commands/extension/attach.js.map +1 -1
- package/dist/commands/extension/doctor.d.ts.map +1 -1
- package/dist/commands/extension/doctor.js +10 -1
- package/dist/commands/extension/doctor.js.map +1 -1
- package/dist/commands/extension/failures.d.ts +62 -0
- package/dist/commands/extension/failures.d.ts.map +1 -0
- package/dist/commands/extension/failures.js +70 -0
- package/dist/commands/extension/failures.js.map +1 -0
- package/dist/commands/extension/info.d.ts.map +1 -1
- package/dist/commands/extension/info.js +4 -14
- package/dist/commands/extension/info.js.map +1 -1
- package/dist/commands/extension/install.d.ts.map +1 -1
- package/dist/commands/extension/install.js +12 -22
- package/dist/commands/extension/install.js.map +1 -1
- package/dist/commands/extension/nativeHost.d.ts +22 -0
- package/dist/commands/extension/nativeHost.d.ts.map +1 -1
- package/dist/commands/extension/nativeHost.js +38 -7
- package/dist/commands/extension/nativeHost.js.map +1 -1
- package/dist/commands/extension/remove.d.ts.map +1 -1
- package/dist/commands/extension/remove.js +5 -15
- package/dist/commands/extension/remove.js.map +1 -1
- package/dist/commands/extension/resolveExtensionWatcher.d.ts.map +1 -1
- package/dist/commands/extension/resolveExtensionWatcher.js +3 -2
- package/dist/commands/extension/resolveExtensionWatcher.js.map +1 -1
- package/dist/commands/extension/select.js +11 -23
- package/dist/commands/extension/select.js.map +1 -1
- package/dist/commands/extension/setup.d.ts.map +1 -1
- package/dist/commands/extension/setup.js +8 -30
- package/dist/commands/extension/setup.js.map +1 -1
- package/dist/commands/extension/show.d.ts.map +1 -1
- package/dist/commands/extension/show.js +10 -17
- package/dist/commands/extension/show.js.map +1 -1
- package/dist/commands/extension/status.d.ts.map +1 -1
- package/dist/commands/extension/status.js +5 -14
- package/dist/commands/extension/status.js.map +1 -1
- package/dist/commands/extension/tabAttach.d.ts.map +1 -1
- package/dist/commands/extension/tabAttach.js +2 -2
- package/dist/commands/extension/tabAttach.js.map +1 -1
- package/dist/commands/extension/tabSelection.d.ts.map +1 -1
- package/dist/commands/extension/tabSelection.js +1 -1
- package/dist/commands/extension/tabSelection.js.map +1 -1
- package/dist/commands/extension/tabWatcher.d.ts +7 -1
- package/dist/commands/extension/tabWatcher.d.ts.map +1 -1
- package/dist/commands/extension/tabWatcher.js +17 -21
- package/dist/commands/extension/tabWatcher.js.map +1 -1
- package/dist/commands/extension/tabs.d.ts.map +1 -1
- package/dist/commands/extension/tabs.js +6 -31
- package/dist/commands/extension/tabs.js.map +1 -1
- package/dist/commands/extension/targetSelection.d.ts +10 -23
- package/dist/commands/extension/targetSelection.d.ts.map +1 -1
- package/dist/commands/extension/targetSelection.js +4 -4
- package/dist/commands/extension/targetSelection.js.map +1 -1
- package/dist/commands/extension/targets.js +2 -11
- package/dist/commands/extension/targets.js.map +1 -1
- package/dist/commands/iframeHelper.d.ts +13 -0
- package/dist/commands/iframeHelper.d.ts.map +1 -1
- package/dist/commands/iframeHelper.js +7 -1
- package/dist/commands/iframeHelper.js.map +1 -1
- package/dist/commands/inputSource.d.ts +57 -0
- package/dist/commands/inputSource.d.ts.map +1 -0
- package/dist/commands/inputSource.js +75 -0
- package/dist/commands/inputSource.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +14 -6
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/logs.d.ts +3 -3
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/net.d.ts +1 -1
- package/dist/commands/net.d.ts.map +1 -1
- package/dist/commands/netClear.d.ts +1 -1
- package/dist/commands/netClear.d.ts.map +1 -1
- package/dist/commands/netExport.d.ts.map +1 -1
- package/dist/commands/netExport.js +9 -31
- package/dist/commands/netExport.js.map +1 -1
- package/dist/commands/netInspect.d.ts.map +1 -1
- package/dist/commands/netInspect.js +2 -1
- package/dist/commands/netInspect.js.map +1 -1
- package/dist/commands/netMock.d.ts +4 -4
- package/dist/commands/netMock.d.ts.map +1 -1
- package/dist/commands/netMock.js +2 -2
- package/dist/commands/netMock.js.map +1 -1
- package/dist/commands/netRequestClient.d.ts +2 -2
- package/dist/commands/netRequestClient.d.ts.map +1 -1
- package/dist/commands/netRequestClient.js.map +1 -1
- package/dist/commands/netShared.d.ts +22 -0
- package/dist/commands/netShared.d.ts.map +1 -1
- package/dist/commands/netShared.js +43 -16
- package/dist/commands/netShared.js.map +1 -1
- package/dist/commands/netSse.d.ts +1 -1
- package/dist/commands/netSse.d.ts.map +1 -1
- package/dist/commands/netSummary.js +6 -25
- package/dist/commands/netSummary.js.map +1 -1
- package/dist/commands/netWebSocket.d.ts +2 -2
- package/dist/commands/netWebSocket.d.ts.map +1 -1
- package/dist/commands/page.d.ts +8 -0
- package/dist/commands/page.d.ts.map +1 -1
- package/dist/commands/page.js +83 -83
- package/dist/commands/page.js.map +1 -1
- package/dist/commands/pageEmulation.d.ts +3 -3
- package/dist/commands/pageEmulation.d.ts.map +1 -1
- package/dist/commands/pageEmulation.js +17 -12
- package/dist/commands/pageEmulation.js.map +1 -1
- package/dist/commands/pluginConfig.d.ts.map +1 -1
- package/dist/commands/pluginConfig.js +21 -20
- package/dist/commands/pluginConfig.js.map +1 -1
- package/dist/commands/record.d.ts +3 -3
- package/dist/commands/record.d.ts.map +1 -1
- package/dist/commands/record.js +1 -1
- package/dist/commands/record.js.map +1 -1
- package/dist/commands/reload.d.ts +1 -1
- package/dist/commands/reload.d.ts.map +1 -1
- package/dist/commands/resolveTestId.d.ts.map +1 -1
- package/dist/commands/resolveTestId.js +2 -3
- package/dist/commands/resolveTestId.js.map +1 -1
- package/dist/commands/screenshot.d.ts +1 -1
- package/dist/commands/screenshot.d.ts.map +1 -1
- package/dist/commands/snapshot.d.ts +1 -1
- package/dist/commands/snapshot.d.ts.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +6 -28
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/startShared.d.ts.map +1 -1
- package/dist/commands/startShared.js +2 -1
- package/dist/commands/startShared.js.map +1 -1
- package/dist/commands/throttle.d.ts +3 -3
- package/dist/commands/throttle.d.ts.map +1 -1
- package/dist/commands/throttle.js +2 -3
- package/dist/commands/throttle.js.map +1 -1
- package/dist/commands/trace.d.ts.map +1 -1
- package/dist/commands/trace.js +2 -2
- package/dist/commands/trace.js.map +1 -1
- package/dist/commands/watcherNativeHost.d.ts.map +1 -1
- package/dist/commands/watcherNativeHost.js +4 -1
- package/dist/commands/watcherNativeHost.js.map +1 -1
- package/dist/commands/watcherPrune.d.ts.map +1 -1
- package/dist/commands/watcherPrune.js +3 -3
- package/dist/commands/watcherPrune.js.map +1 -1
- package/dist/commands/watcherSession.d.ts.map +1 -1
- package/dist/commands/watcherSession.js +2 -1
- package/dist/commands/watcherSession.js.map +1 -1
- package/dist/commands/watcherStatus.d.ts +1 -1
- package/dist/commands/watcherStatus.d.ts.map +1 -1
- package/dist/commands/watcherStatus.js +5 -0
- package/dist/commands/watcherStatus.js.map +1 -1
- package/dist/commands/watcherStop.d.ts.map +1 -1
- package/dist/commands/watcherStop.js +2 -2
- package/dist/commands/watcherStop.js.map +1 -1
- package/dist/config/configContext.d.ts +27 -0
- package/dist/config/configContext.d.ts.map +1 -0
- package/dist/config/configContext.js +57 -0
- package/dist/config/configContext.js.map +1 -0
- package/dist/config/loadConfig.d.ts.map +1 -1
- package/dist/config/loadConfig.js +3 -2
- package/dist/config/loadConfig.js.map +1 -1
- package/dist/eval/evalClient.d.ts.map +1 -1
- package/dist/eval/evalClient.js +2 -1
- package/dist/eval/evalClient.js.map +1 -1
- package/dist/extension/dist/background/service-worker.js +469 -449
- package/dist/extension/dist/background/service-worker.js.map +4 -4
- package/dist/extension/dist/popup/popup.js +279 -234
- package/dist/extension/dist/popup/popup.js.map +4 -4
- package/dist/extension/manifest.json +1 -1
- package/dist/internal.d.ts +22 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +22 -0
- package/dist/internal.js.map +1 -0
- package/dist/output/io.d.ts +8 -9
- package/dist/output/io.d.ts.map +1 -1
- package/dist/output/io.js.map +1 -1
- package/dist/registry.d.ts +1 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -25
- package/dist/registry.js.map +1 -1
- package/dist/runtime-code/format.d.ts.map +1 -1
- package/dist/runtime-code/format.js +2 -1
- package/dist/runtime-code/format.js.map +1 -1
- package/dist/skill/argus/SKILL.md +7 -0
- package/dist/skill/argus/reference/EXTENSION.md +8 -0
- package/dist/watchers/queryParams.d.ts +11 -9
- package/dist/watchers/queryParams.d.ts.map +1 -1
- package/dist/watchers/queryParams.js +63 -86
- package/dist/watchers/queryParams.js.map +1 -1
- package/dist/watchers/requestWatcher.d.ts +7 -25
- package/dist/watchers/requestWatcher.d.ts.map +1 -1
- package/dist/watchers/requestWatcher.js +9 -6
- package/dist/watchers/requestWatcher.js.map +1 -1
- package/dist/watchers/resolveWatcher.d.ts.map +1 -1
- package/dist/watchers/resolveWatcher.js +9 -2
- package/dist/watchers/resolveWatcher.js.map +1 -1
- package/package.json +9 -5
- package/dist/time.d.ts +0 -3
- package/dist/time.d.ts.map +0 -1
- package/dist/time.js +0 -19
- package/dist/time.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/background/debugger-manager.ts", "../../src/background/bridge-client.ts", "../../src/background/
|
|
4
|
-
"sourcesContent": ["/**\n * Manages chrome.debugger attachment lifecycle.\n * Handles root tab attachment, recursive child-target auto-attach, frame discovery,\n * and session-aware CDP command routing.\n */\n\ntype ChildSession = {\n\tsessionId: string\n\ttargetId: string\n\ttype: string\n\turl: string\n\ttitle: string\n\tattachedAt: number\n\tenabledDomains: Set<string>\n}\n\ntype DebuggeeWithSession = chrome.debugger.Debuggee & {\n\tsessionId?: string\n}\n\ntype FrameRecord = {\n\tframeId: string\n\tparentFrameId: string | null\n\turl: string\n\ttitle: string | null\n\tsessionId: string | null\n}\n\ntype CookieQuery = {\n\tdomain?: string\n\turl?: string\n}\n\ntype CdpFrameTreeNode = {\n\tframe?: { id?: string; parentId?: string; name?: string; url?: string }\n\tchildFrames?: CdpFrameTreeNode[]\n}\n\ntype NativeCookie = {\n\tname: string\n\tvalue: string\n\tdomain: string\n\tpath: string\n\tsecure: boolean\n\thttpOnly: boolean\n\tsession: boolean\n\texpires: number | null\n\tsameSite: string | null\n}\n\nconst FRAME_TREE_SYNC_DELAY_MS = 150\n\nexport type AttachedTarget = {\n\ttabId: number\n\tdebuggeeId: chrome.debugger.Debuggee\n\turl: string\n\ttitle: string\n\tfaviconUrl?: string\n\tattachedAt: number\n\tenabledDomains: Set<string>\n\tchildSessions: Map<string, ChildSession>\n\tframes: Map<string, FrameRecord>\n\ttopFrameId: string | null\n}\n\nexport type CdpEventHandler = (tabId: number, method: string, params: unknown, meta?: { sessionId?: string | null }) => void\nexport type DebuggerDetachHandler = (tabId: number, reason: string) => void\n\nexport class DebuggerManager {\n\tprivate attached = new Map<number, AttachedTarget>()\n\tprivate eventHandlers = new Set<CdpEventHandler>()\n\tprivate detachHandlers = new Set<DebuggerDetachHandler>()\n\tprivate frameTreeSyncTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\n\tconstructor() {\n\t\tchrome.debugger.onEvent.addListener((debuggee, method, params) => {\n\t\t\tthis.handleCdpEvent(debuggee, method, params)\n\t\t})\n\n\t\tchrome.debugger.onDetach.addListener((debuggee, reason) => {\n\t\t\tif (debuggee.tabId) {\n\t\t\t\tthis.handleDetach(debuggee.tabId, (debuggee as DebuggeeWithSession).sessionId ?? null, reason)\n\t\t\t}\n\t\t})\n\t}\n\n\tonEvent(handler: CdpEventHandler): () => void {\n\t\tthis.eventHandlers.add(handler)\n\t\treturn () => {\n\t\t\tthis.eventHandlers.delete(handler)\n\t\t}\n\t}\n\n\tonDetach(handler: DebuggerDetachHandler): () => void {\n\t\tthis.detachHandlers.add(handler)\n\t\treturn () => {\n\t\t\tthis.detachHandlers.delete(handler)\n\t\t}\n\t}\n\n\tprivate emitEvent(tabId: number, method: string, params: unknown, sessionId: string | null): void {\n\t\tfor (const handler of this.eventHandlers) {\n\t\t\thandler(tabId, method, params, { sessionId })\n\t\t}\n\t}\n\n\tprivate emitDetach(tabId: number, reason: string): void {\n\t\tfor (const handler of this.detachHandlers) {\n\t\t\thandler(tabId, reason)\n\t\t}\n\t}\n\n\tasync attach(tabId: number): Promise<AttachedTarget> {\n\t\tif (this.attached.has(tabId)) {\n\t\t\treturn this.attached.get(tabId)!\n\t\t}\n\n\t\tconst debuggee: chrome.debugger.Debuggee = { tabId }\n\t\tawait chrome.debugger.attach(debuggee, '1.3')\n\n\t\tconst tab = await chrome.tabs.get(tabId)\n\t\tconst target: AttachedTarget = {\n\t\t\ttabId,\n\t\t\tdebuggeeId: debuggee,\n\t\t\turl: tab.url ?? '',\n\t\t\ttitle: tab.title ?? '',\n\t\t\tfaviconUrl: tab.favIconUrl,\n\t\t\tattachedAt: Date.now(),\n\t\t\tenabledDomains: new Set(),\n\t\t\tchildSessions: new Map(),\n\t\t\tframes: new Map(),\n\t\t\ttopFrameId: null,\n\t\t}\n\n\t\tthis.attached.set(tabId, target)\n\t\tawait this.configureAutoAttach(tabId)\n\t\tawait this.refreshFrameTree(tabId, null)\n\t\treturn target\n\t}\n\n\tasync detach(tabId: number): Promise<void> {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) return\n\n\t\ttry {\n\t\t\tawait chrome.debugger.detach(target.debuggeeId)\n\t\t} catch {\n\t\t\t// Tab may already be closed\n\t\t}\n\t\tthis.attached.delete(tabId)\n\t}\n\n\tasync sendCommand<T = unknown>(tabId: number, method: string, params?: Record<string, unknown>, sessionId?: string | null): Promise<T> {\n\t\tconst target = this.getRequiredTarget(tabId)\n\t\tconst debuggee = this.toDebuggee(target, sessionId)\n\t\tconst result = await chrome.debugger.sendCommand(debuggee, method, params)\n\t\treturn result as T\n\t}\n\n\tasync enableDomain(tabId: number, domain: string, sessionId?: string | null): Promise<void> {\n\t\tconst enabledDomains = this.getRequiredEnabledDomains(tabId, sessionId)\n\t\tif (enabledDomains.has(domain)) {\n\t\t\treturn\n\t\t}\n\n\t\tawait this.sendCommand(tabId, `${domain}.enable`, undefined, sessionId)\n\t\tenabledDomains.add(domain)\n\t}\n\n\tisAttached(tabId: number): boolean {\n\t\treturn this.attached.has(tabId)\n\t}\n\n\tlistAttached(): AttachedTarget[] {\n\t\treturn [...this.attached.values()]\n\t}\n\n\tgetTarget(tabId: number): AttachedTarget | undefined {\n\t\treturn this.attached.get(tabId)\n\t}\n\n\tgetFrames(tabId: number): FrameRecord[] {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn []\n\t\t}\n\n\t\treturn [...target.frames.values()]\n\t}\n\n\t/**\n\t * Read cookies from the attached tab's cookie store so extension-mode auth export can keep\n\t * sibling subdomain session cookies such as `auth.example.com`.\n\t */\n\tasync getCookies(tabId: number, query: CookieQuery = {}): Promise<NativeCookie[]> {\n\t\tthis.getRequiredTarget(tabId)\n\t\tconst storeId = await this.findCookieStoreId(tabId)\n\t\tconst cookies = await chrome.cookies.getAll({\n\t\t\tdomain: query.domain,\n\t\t\tstoreId: storeId ?? undefined,\n\t\t\turl: query.domain ? undefined : query.url,\n\t\t})\n\n\t\treturn cookies.map((cookie) => ({\n\t\t\tname: cookie.name,\n\t\t\tvalue: cookie.value,\n\t\t\tdomain: cookie.domain,\n\t\t\tpath: cookie.path,\n\t\t\tsecure: cookie.secure,\n\t\t\thttpOnly: cookie.httpOnly,\n\t\t\tsession: cookie.session,\n\t\t\texpires: typeof cookie.expirationDate === 'number' ? cookie.expirationDate : null,\n\t\t\tsameSite: cookie.sameSite ?? null,\n\t\t}))\n\t}\n\n\tprivate async configureAutoAttach(tabId: number, sessionId?: string | null): Promise<void> {\n\t\tawait this.sendCommand(\n\t\t\ttabId,\n\t\t\t'Target.setAutoAttach',\n\t\t\t{\n\t\t\t\tautoAttach: true,\n\t\t\t\twaitForDebuggerOnStart: false,\n\t\t\t\tflatten: true,\n\t\t\t\tfilter: [{ type: 'iframe', exclude: false }],\n\t\t\t},\n\t\t\tsessionId,\n\t\t)\n\t}\n\n\tprivate getEnabledDomains(tabId: number, sessionId?: string | null): Set<string> | null {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn null\n\t\t}\n\n\t\tif (!sessionId) {\n\t\t\treturn target.enabledDomains\n\t\t}\n\n\t\treturn target.childSessions.get(sessionId)?.enabledDomains ?? null\n\t}\n\n\tprivate getRequiredTarget(tabId: number): AttachedTarget {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\tthrow new Error(`Tab ${tabId} is not attached`)\n\t\t}\n\t\treturn target\n\t}\n\n\tprivate getRequiredEnabledDomains(tabId: number, sessionId?: string | null): Set<string> {\n\t\tconst enabledDomains = this.getEnabledDomains(tabId, sessionId)\n\t\tif (!enabledDomains) {\n\t\t\tthrow new Error(`Tab ${tabId} is not attached`)\n\t\t}\n\t\treturn enabledDomains\n\t}\n\n\tprivate toDebuggee(target: AttachedTarget, sessionId?: string | null): chrome.debugger.Debuggee {\n\t\tif (!sessionId) {\n\t\t\treturn target.debuggeeId\n\t\t}\n\n\t\treturn { tabId: target.tabId, sessionId } as chrome.debugger.Debuggee\n\t}\n\n\tprivate async findCookieStoreId(tabId: number): Promise<string | null> {\n\t\tconst stores = await chrome.cookies.getAllCookieStores()\n\t\tconst store = stores.find((candidate) => candidate.tabIds.includes(tabId))\n\t\treturn store?.id ?? null\n\t}\n\n\tprivate handleCdpEvent(debuggee: chrome.debugger.Debuggee, method: string, params?: object): void {\n\t\tconst tabId = debuggee.tabId\n\t\tif (!tabId || !this.attached.has(tabId)) return\n\n\t\tconst sessionId = (debuggee as DebuggeeWithSession).sessionId ?? null\n\t\tif (method === 'Target.attachedToTarget' && params) {\n\t\t\tvoid this.handleAttachedToTarget(tabId, params)\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Target.detachedFromTarget' && params) {\n\t\t\tthis.handleDetachedFromTarget(tabId, params)\n\t\t\treturn\n\t\t}\n\n\t\tthis.updateStateFromEvent(tabId, sessionId, method, params)\n\t\tthis.emitEvent(tabId, method, params ?? {}, sessionId)\n\t\tthis.scheduleFrameTreeSyncIfNeeded(tabId, sessionId, method, params)\n\t}\n\n\tprivate async handleAttachedToTarget(tabId: number, params: object): Promise<void> {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst record = params as {\n\t\t\tsessionId?: string\n\t\t\ttargetInfo?: { targetId?: string; type?: string; title?: string; url?: string }\n\t\t}\n\t\tif (!record.sessionId) {\n\t\t\treturn\n\t\t}\n\n\t\ttarget.childSessions.set(record.sessionId, {\n\t\t\tsessionId: record.sessionId,\n\t\t\ttargetId: record.targetInfo?.targetId ?? record.sessionId,\n\t\t\ttype: record.targetInfo?.type ?? 'unknown',\n\t\t\turl: record.targetInfo?.url ?? '',\n\t\t\ttitle: record.targetInfo?.title ?? '',\n\t\t\tattachedAt: Date.now(),\n\t\t\tenabledDomains: new Set(),\n\t\t})\n\n\t\ttry {\n\t\t\tawait this.configureAutoAttach(tabId, record.sessionId)\n\t\t\tawait this.enableChildSessionDomains(tabId, record.sessionId)\n\t\t\tawait this.refreshFrameTree(tabId, record.sessionId)\n\t\t} catch (error) {\n\t\t\tconsole.warn('[DebuggerManager] Failed to bootstrap child target:', error)\n\t\t}\n\t}\n\n\tprivate async enableChildSessionDomains(tabId: number, sessionId: string): Promise<void> {\n\t\t// Keep child sessions aligned with the root tab so watcher features can observe iframe traffic too.\n\t\tfor (const domain of ['Runtime', 'Page', 'Network'] as const) {\n\t\t\tawait this.enableDomain(tabId, domain, sessionId)\n\t\t}\n\t}\n\n\tprivate handleDetachedFromTarget(tabId: number, params: object): void {\n\t\tconst record = params as { sessionId?: string }\n\t\tif (!record.sessionId) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearFrameTreeSync(record.sessionId, tabId)\n\t\tthis.dropChildSession(tabId, record.sessionId)\n\t}\n\n\tprivate async refreshFrameTree(tabId: number, sessionId: string | null): Promise<void> {\n\t\tconst result = (await this.sendCommand(tabId, 'Page.getFrameTree', undefined, sessionId)) as { frameTree?: CdpFrameTreeNode }\n\t\tthis.replaceFrameTreeSnapshot(tabId, sessionId, result.frameTree)\n\t}\n\n\t/**\n\t * Each `Page.getFrameTree` result is a full snapshot for that session, so merge the refreshed\n\t * nodes and then prune frames from the same session that no longer exist after reload.\n\t */\n\tprivate replaceFrameTreeSnapshot(tabId: number, sessionId: string | null, node: CdpFrameTreeNode | undefined): void {\n\t\tif (!node?.frame?.id) {\n\t\t\treturn\n\t\t}\n\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst nextFrameIds = new Set<string>()\n\t\tthis.mergeFrameTree(tabId, sessionId, node, nextFrameIds)\n\t\tthis.pruneMissingSessionFrames(tabId, sessionId, nextFrameIds)\n\t}\n\n\tprivate mergeFrameTree(tabId: number, sessionId: string | null, node: CdpFrameTreeNode | undefined, nextFrameIds: Set<string>): void {\n\t\tif (!node?.frame?.id) {\n\t\t\treturn\n\t\t}\n\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frameId = node.frame.id\n\t\tnextFrameIds.add(frameId)\n\t\ttarget.frames.set(frameId, this.toFrameRecord(node.frame, sessionId))\n\n\t\tif (!node.frame.parentId && !sessionId) {\n\t\t\ttarget.topFrameId = frameId\n\t\t}\n\n\t\tthis.emitEvent(\n\t\t\ttabId,\n\t\t\t'Page.frameNavigated',\n\t\t\t{\n\t\t\t\tframe: {\n\t\t\t\t\tid: frameId,\n\t\t\t\t\tparentId: node.frame.parentId ?? null,\n\t\t\t\t\turl: node.frame.url ?? '',\n\t\t\t\t\tname: node.frame.name ?? null,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionId,\n\t\t)\n\n\t\tfor (const child of node.childFrames ?? []) {\n\t\t\tthis.mergeFrameTree(tabId, sessionId, child, nextFrameIds)\n\t\t}\n\t}\n\n\tprivate pruneMissingSessionFrames(tabId: number, sessionId: string | null, nextFrameIds: Set<string>): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tfor (const [frameId, frame] of target.frames.entries()) {\n\t\t\tif (frame.sessionId !== sessionId || nextFrameIds.has(frameId)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttarget.frames.delete(frameId)\n\t\t\tthis.emitEvent(tabId, 'Page.frameDetached', { frameId }, sessionId)\n\t\t}\n\t}\n\n\tprivate updateStateFromEvent(tabId: number, sessionId: string | null, method: string, params?: object): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Page.frameNavigated' && params) {\n\t\t\tconst frame = (params as { frame?: { id?: string; parentId?: string | null; url?: string; name?: string } }).frame\n\t\t\tif (!frame?.id) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttarget.frames.set(frame.id, this.toFrameRecord(frame, sessionId))\n\n\t\t\tif (!frame.parentId && !sessionId && frame.url) {\n\t\t\t\ttarget.url = frame.url\n\t\t\t\ttarget.topFrameId = frame.id\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Page.frameAttached' && params) {\n\t\t\tconst frame = params as { frameId?: string; parentFrameId?: string }\n\t\t\tif (!frame.frameId) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst existing = target.frames.get(frame.frameId)\n\t\t\ttarget.frames.set(frame.frameId, {\n\t\t\t\tframeId: frame.frameId,\n\t\t\t\tparentFrameId: frame.parentFrameId ?? target.topFrameId,\n\t\t\t\turl: existing?.url ?? '',\n\t\t\t\ttitle: existing?.title ?? null,\n\t\t\t\tsessionId: existing?.sessionId ?? sessionId,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Page.frameDetached' && params) {\n\t\t\tconst frame = params as { frameId?: string }\n\t\t\tif (!frame.frameId) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttarget.frames.delete(frame.frameId)\n\t\t}\n\t}\n\n\t/**\n\t * Chrome's frame attach/detach events during reload are not always complete. When the root frame\n\t * for a session navigates, refresh that session's full frame tree shortly afterward and treat it\n\t * as authoritative so stale iframe records do not linger in extension state.\n\t */\n\tprivate scheduleFrameTreeSyncIfNeeded(tabId: number, sessionId: string | null, method: string, params?: object): void {\n\t\tif (!shouldSyncFrameTreeSnapshot(method, params)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst key = getFrameTreeSyncKey(tabId, sessionId)\n\t\tif (this.frameTreeSyncTimers.has(key)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.frameTreeSyncTimers.delete(key)\n\t\t\tvoid this.refreshFrameTree(tabId, sessionId).catch((error) => {\n\t\t\t\tconsole.warn('[DebuggerManager] Failed to refresh frame tree after navigation:', error)\n\t\t\t})\n\t\t}, FRAME_TREE_SYNC_DELAY_MS)\n\n\t\tthis.frameTreeSyncTimers.set(key, timer)\n\t}\n\n\tprivate clearFrameTreeSync(sessionId: string | null, tabId: number): void {\n\t\tconst key = getFrameTreeSyncKey(tabId, sessionId)\n\t\tconst timer = this.frameTreeSyncTimers.get(key)\n\t\tif (!timer) {\n\t\t\treturn\n\t\t}\n\n\t\tclearTimeout(timer)\n\t\tthis.frameTreeSyncTimers.delete(key)\n\t}\n\n\tprivate clearAllFrameTreeSync(tabId: number): void {\n\t\tfor (const [key, timer] of this.frameTreeSyncTimers.entries()) {\n\t\t\tif (!key.startsWith(`${tabId}:`)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tclearTimeout(timer)\n\t\t\tthis.frameTreeSyncTimers.delete(key)\n\t\t}\n\t}\n\n\tprivate toFrameRecord(frame: { id?: string; parentId?: string | null; url?: string; name?: string }, sessionId: string | null): FrameRecord {\n\t\treturn {\n\t\t\tframeId: frame.id!,\n\t\t\tparentFrameId: frame.parentId ?? null,\n\t\t\turl: frame.url ?? '',\n\t\t\ttitle: frame.name ?? null,\n\t\t\tsessionId,\n\t\t}\n\t}\n\n\tprivate handleDetach(tabId: number, sessionId: string | null, reason: string): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearFrameTreeSync(sessionId, tabId)\n\n\t\tif (sessionId) {\n\t\t\tthis.dropChildSession(tabId, sessionId)\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearAllFrameTreeSync(tabId)\n\t\tthis.attached.delete(tabId)\n\t\tthis.emitDetach(tabId, reason)\n\t}\n\n\tprivate dropChildSession(tabId: number, sessionId: string): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\ttarget.childSessions.delete(sessionId)\n\t\tfor (const [frameId, frame] of target.frames.entries()) {\n\t\t\tif (frame.sessionId !== sessionId) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttarget.frames.delete(frameId)\n\t\t\tthis.emitEvent(tabId, 'Page.frameDetached', { frameId }, sessionId)\n\t\t}\n\t}\n}\n\nfunction shouldSyncFrameTreeSnapshot(method: string, params?: object): boolean {\n\tif (method !== 'Page.frameNavigated' || !params) {\n\t\treturn false\n\t}\n\n\tconst frame = (params as { frame?: { parentId?: string | null } }).frame\n\treturn frame?.parentId == null\n}\n\nfunction getFrameTreeSyncKey(tabId: number, sessionId: string | null): string {\n\treturn `${tabId}:${sessionId ?? 'root'}`\n}\n", "/**\n * Native Messaging client for communicating with argus-watcher (extension mode).\n * Handles connection lifecycle, message serialization, and reconnection.\n */\n\nimport type { ExtensionToHost, HostToExtension } from '../types/messages.js'\n\nexport type MessageHandler<Inbound> = (message: Inbound) => void\nexport type ConnectionHandler = () => void\nexport type BridgeClientOptions = {\n\tautoReconnect?: boolean\n}\n\nexport class BridgeClient<Inbound = HostToExtension, Outbound = ExtensionToHost> {\n\tprivate port: chrome.runtime.Port | null = null\n\tprivate hostName: string\n\tprivate messageHandlers = new Set<MessageHandler<Inbound>>()\n\tprivate connectHandler: ConnectionHandler | null = null\n\tprivate disconnectHandler: ConnectionHandler | null = null\n\tprivate reconnectAttempts = 0\n\tprivate maxReconnectAttempts = 5\n\tprivate reconnectDelay = 1000\n\tprivate autoReconnect: boolean\n\tprivate reconnectEnabled = true\n\n\tconstructor(hostName: string = 'com.vforsh.argus.bridge', options: BridgeClientOptions = {}) {\n\t\tthis.hostName = hostName\n\t\tthis.autoReconnect = options.autoReconnect ?? true\n\t}\n\n\t/**\n\t * Set handler for incoming messages from the host.\n\t */\n\tonMessage(handler: MessageHandler<Inbound>): void {\n\t\tthis.messageHandlers.add(handler)\n\t}\n\n\t/**\n\t * Set handler for successful connection.\n\t */\n\tonConnect(handler: ConnectionHandler): void {\n\t\tthis.connectHandler = handler\n\t}\n\n\t/**\n\t * Set handler for disconnection.\n\t */\n\tonDisconnect(handler: ConnectionHandler): void {\n\t\tthis.disconnectHandler = handler\n\t}\n\n\t/**\n\t * Connect to the Native Messaging host.\n\t */\n\tconnect(): boolean {\n\t\tif (this.port) {\n\t\t\treturn true // Already connected\n\t\t}\n\n\t\tthis.reconnectEnabled = true\n\n\t\ttry {\n\t\t\tthis.port = chrome.runtime.connectNative(this.hostName)\n\n\t\t\tthis.port.onMessage.addListener((message: Inbound) => {\n\t\t\t\tthis.reconnectAttempts = 0 // Reset on successful message\n\t\t\t\tfor (const handler of this.messageHandlers) {\n\t\t\t\t\thandler(message)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tthis.port.onDisconnect.addListener(() => {\n\t\t\t\tconst error = chrome.runtime.lastError\n\t\t\t\tconsole.log('[BridgeClient] Disconnected:', error?.message ?? 'unknown reason')\n\n\t\t\t\tthis.port = null\n\n\t\t\t\tif (this.disconnectHandler) {\n\t\t\t\t\tthis.disconnectHandler()\n\t\t\t\t}\n\n\t\t\t\t// Attempt reconnection\n\t\t\t\tthis.scheduleReconnect()\n\t\t\t})\n\n\t\t\tconsole.log('[BridgeClient] Connected to', this.hostName)\n\t\t\tthis.reconnectAttempts = 0\n\n\t\t\tif (this.connectHandler) {\n\t\t\t\tthis.connectHandler()\n\t\t\t}\n\n\t\t\treturn true\n\t\t} catch (err) {\n\t\t\tconsole.error('[BridgeClient] Failed to connect:', err)\n\t\t\tthis.scheduleReconnect()\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from the Native Messaging host.\n\t */\n\tdisconnect(): void {\n\t\tthis.reconnectEnabled = false\n\t\tif (this.port) {\n\t\t\tthis.port.disconnect()\n\t\t\tthis.port = null\n\t\t}\n\t}\n\n\t/**\n\t * Send a message to the Native Messaging host.\n\t */\n\tsend(message: Outbound): boolean {\n\t\tif (!this.port) {\n\t\t\tconsole.warn('[BridgeClient] Cannot send, not connected')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.port.postMessage(message)\n\t\t\treturn true\n\t\t} catch (err) {\n\t\t\tconsole.error('[BridgeClient] Send failed:', err)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Check if connected to the host.\n\t */\n\tisConnected(): boolean {\n\t\treturn this.port !== null\n\t}\n\n\t/**\n\t * Schedule a reconnection attempt with exponential backoff.\n\t */\n\tprivate scheduleReconnect(): void {\n\t\tif (!this.autoReconnect || !this.reconnectEnabled) {\n\t\t\treturn\n\t\t}\n\n\t\tif (this.reconnectAttempts >= this.maxReconnectAttempts) {\n\t\t\tconsole.log('[BridgeClient] Max reconnection attempts reached')\n\t\t\treturn\n\t\t}\n\n\t\tconst delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts)\n\t\tthis.reconnectAttempts++\n\n\t\tconsole.log(`[BridgeClient] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`)\n\n\t\tsetTimeout(() => {\n\t\t\tthis.connect()\n\t\t}, delay)\n\t}\n}\n", "import type { DebuggerManager } from './debugger-manager.js'\nimport type { TabInfo } from '../types/messages.js'\n\ntype TabFilter = {\n\turl?: string\n\ttitle?: string\n}\n\ntype TabListOptions = {\n\tgetWatcherIdForTab?: (tabId: number) => string | null | undefined\n}\n\n/**\n * Shared tab-list query for popup UI and native-host requests so both surfaces stay in sync.\n */\nexport const listBrowserTabs = async (debuggerManager: DebuggerManager, filter?: TabFilter, options: TabListOptions = {}): Promise<TabInfo[]> => {\n\tconst chromeTabs = await chrome.tabs.query({})\n\tconst attachedTargets = debuggerManager.listAttached()\n\tconst attachedTabIds = new Set(attachedTargets.map((target) => target.tabId))\n\n\tlet tabs = chromeTabs\n\t\t.filter((tab): tab is chrome.tabs.Tab & { id: number; url: string } => tab.id !== undefined && tab.url !== undefined)\n\t\t.filter((tab) => !tab.url.startsWith('chrome://') && !tab.url.startsWith('chrome-extension://'))\n\t\t.map((tab) => ({\n\t\t\ttabId: tab.id,\n\t\t\turl: tab.url,\n\t\t\ttitle: tab.title ?? '',\n\t\t\tfaviconUrl: tab.favIconUrl,\n\t\t\tattached: attachedTabIds.has(tab.id),\n\t\t\twatcherId: options.getWatcherIdForTab?.(tab.id) ?? undefined,\n\t\t}))\n\n\tif (filter?.url) {\n\t\tconst urlFilter = filter.url.toLowerCase()\n\t\ttabs = tabs.filter((tab) => tab.url.toLowerCase().includes(urlFilter))\n\t}\n\n\tif (filter?.title) {\n\t\tconst titleFilter = filter.title.toLowerCase()\n\t\ttabs = tabs.filter((tab) => tab.title.toLowerCase().includes(titleFilter))\n\t}\n\n\ttabs.sort((left, right) => Number(right.attached) - Number(left.attached))\n\n\treturn tabs\n}\n", "/**\n * CDP Proxy - Routes CDP commands and events between the Native Messaging\n * host (argus-watcher in extension mode) and the chrome.debugger API.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { BridgeClient } from './bridge-client.js'\nimport type {\n\tCdpCommandMessage,\n\tAttachTabMessage,\n\tDetachTabMessage,\n\tEnableDomainMessage,\n\tCookieQueryMessage,\n\tExtensionToTabHost,\n\tTabInfo,\n\tTabHostToExtension,\n} from '../types/messages.js'\nimport { listBrowserTabs } from './tab-list.js'\n\nexport class CdpProxy {\n\tprivate debuggerManager: DebuggerManager\n\tprivate bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>\n\tprivate removeDebuggerEventForwarding: (() => void) | null = null\n\tprivate removeDebuggerDetachForwarding: (() => void) | null = null\n\n\tconstructor(debuggerManager: DebuggerManager, bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>) {\n\t\tthis.debuggerManager = debuggerManager\n\t\tthis.bridgeClient = bridgeClient\n\n\t\tthis.setupEventForwarding()\n\t\tthis.setupMessageHandling()\n\t}\n\n\t/**\n\t * Forward CDP events from debugger to bridge.\n\t */\n\tprivate setupEventForwarding(): void {\n\t\tthis.removeDebuggerEventForwarding = this.debuggerManager.onEvent((tabId, method, params, meta) => {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_event',\n\t\t\t\ttabId,\n\t\t\t\tmethod,\n\t\t\t\tparams,\n\t\t\t\tsessionId: meta?.sessionId ?? undefined,\n\t\t\t})\n\t\t})\n\n\t\tthis.removeDebuggerDetachForwarding = this.debuggerManager.onDetach((tabId, reason) => {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_detached',\n\t\t\t\ttabId,\n\t\t\t\treason,\n\t\t\t})\n\t\t})\n\t}\n\n\tdispose(): void {\n\t\tthis.removeDebuggerEventForwarding?.()\n\t\tthis.removeDebuggerEventForwarding = null\n\t\tthis.removeDebuggerDetachForwarding?.()\n\t\tthis.removeDebuggerDetachForwarding = null\n\t}\n\n\t/**\n\t * Handle messages from the bridge.\n\t */\n\tprivate setupMessageHandling(): void {\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tthis.handleMessage(message)\n\t\t})\n\t}\n\n\t/**\n\t * Process a message from the bridge.\n\t */\n\tprivate async handleMessage(message: TabHostToExtension): Promise<void> {\n\t\tswitch (message.type) {\n\t\t\tcase 'attach_tab':\n\t\t\t\tawait this.handleAttachTab(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'detach_tab':\n\t\t\t\tawait this.handleDetachTab(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'cdp_command':\n\t\t\t\tawait this.handleCdpCommand(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'cookie_query':\n\t\t\t\tawait this.handleCookieQuery(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'enable_domain':\n\t\t\t\tawait this.handleEnableDomain(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'host_info':\n\t\t\tcase 'host_ready':\n\t\t\tcase 'target_info':\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn('[CdpProxy] Unknown message type:', (message as { type: string }).type)\n\t\t}\n\t}\n\n\t/**\n\t * Attach to a tab.\n\t */\n\tprivate async handleAttachTab(message: AttachTabMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst target = await this.debuggerManager.attach(message.tabId)\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_attached',\n\t\t\t\ttabId: target.tabId,\n\t\t\t\turl: target.url,\n\t\t\t\ttitle: target.title,\n\t\t\t\tfaviconUrl: target.faviconUrl,\n\t\t\t\ttopFrameId: target.topFrameId,\n\t\t\t\tframes: this.debuggerManager.getFrames(target.tabId),\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tconsole.error('[CdpProxy] Failed to attach:', err)\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_detached',\n\t\t\t\ttabId: message.tabId,\n\t\t\t\treason: err instanceof Error ? err.message : 'attach_failed',\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Detach from a tab.\n\t */\n\tprivate async handleDetachTab(message: DetachTabMessage): Promise<void> {\n\t\tawait this.debuggerManager.detach(message.tabId)\n\t}\n\n\t/**\n\t * Execute a CDP command.\n\t */\n\tprivate async handleCdpCommand(message: CdpCommandMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await this.debuggerManager.sendCommand(message.tabId, message.method, message.params, message.sessionId)\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\tresult,\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: err instanceof Error ? err.message : 'Unknown error',\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Query browser cookies from the attached tab's cookie store.\n\t */\n\tprivate async handleCookieQuery(message: CookieQueryMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst cookies = await this.debuggerManager.getCookies(message.tabId, {\n\t\t\t\tdomain: message.domain,\n\t\t\t\turl: message.url,\n\t\t\t})\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cookie_query_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\tcookies,\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cookie_query_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: err instanceof Error ? err.message : 'Unknown error',\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Enable a CDP domain for a tab.\n\t */\n\tprivate async handleEnableDomain(message: EnableDomainMessage): Promise<void> {\n\t\ttry {\n\t\t\tawait this.debuggerManager.enableDomain(message.tabId, message.domain)\n\t\t} catch (err) {\n\t\t\tconsole.error('[CdpProxy] Failed to enable domain:', err)\n\t\t}\n\t}\n\n\t/**\n\t * Manually attach to a tab (called from popup).\n\t */\n\tasync attachTab(tabId: number): Promise<void> {\n\t\tawait this.handleAttachTab({ type: 'attach_tab', tabId })\n\t}\n\n\t/**\n\t * Manually detach from a tab (called from popup).\n\t */\n\tasync detachTab(tabId: number): Promise<void> {\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'tab_detached',\n\t\t\ttabId,\n\t\t\treason: 'user_requested',\n\t\t})\n\t\tawait this.debuggerManager.detach(tabId)\n\t}\n\n\t/**\n\t * Get list of tabs for popup UI.\n\t */\n\tasync getTabsForPopup(): Promise<TabInfo[]> {\n\t\treturn await listBrowserTabs(this.debuggerManager)\n\t}\n}\n", "export const BRIDGE_HOST_NAME = 'com.vforsh.argus.bridge'\nexport const CONTROL_HOST_NAME = 'com.vforsh.argus.control'\n", "import type { ExtensionToTabHost, TabHostToExtension } from '../types/messages.js'\nimport { BridgeClient } from './bridge-client.js'\nimport { CdpProxy } from './cdp-proxy.js'\nimport type { DebuggerManager } from './debugger-manager.js'\nimport { BRIDGE_HOST_NAME } from './native-hosts.js'\n\nexport type TabWatcherInfo = {\n\twatcherId: string\n\twatcherHost: string\n\twatcherPort: number\n\tpid: number\n}\n\nexport type TabTargetInfo = {\n\ttargetId: string\n\ttitle: string | null\n\turl: string | null\n\tattachedAt: number\n\ttargetReady: boolean | null\n}\n\nexport type TabBridgeSessionEvents = {\n\tonWatcherInfo?: (info: TabWatcherInfo) => void\n\tonTargetInfo?: (info: TabTargetInfo) => void\n\tonDisconnect?: () => void\n}\n\nexport type TabBridgeSessionOptions = {\n\twatcherId?: string\n}\n\n/**\n * Owns one Native Messaging bridge + one watcher process for a single attached tab.\n * Each session stays tab-scoped so the extension can expose true one-watcher-per-tab semantics.\n */\nexport class TabBridgeSession {\n\tprivate readonly tabId: number\n\tprivate readonly bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>\n\tprivate readonly cdpProxy: CdpProxy\n\tprivate readonly events: TabBridgeSessionEvents\n\tprivate watcherInfo: TabWatcherInfo | null = null\n\tprivate targetInfo: TabTargetInfo | null = null\n\tprivate desiredWatcherId: string | undefined\n\tprivate lastMessageAt: number | null = null\n\tprivate ready = false\n\tprivate readyWaiters: Array<() => void> = []\n\tprivate watcherInfoWaiters: Array<() => void> = []\n\tprivate disposed = false\n\n\tconstructor(tabId: number, debuggerManager: DebuggerManager, events: TabBridgeSessionEvents = {}, options: TabBridgeSessionOptions = {}) {\n\t\tthis.tabId = tabId\n\t\tthis.events = events\n\t\tthis.desiredWatcherId = options.watcherId\n\t\tthis.bridgeClient = new BridgeClient(BRIDGE_HOST_NAME, { autoReconnect: false })\n\t\tthis.cdpProxy = new CdpProxy(debuggerManager, this.bridgeClient)\n\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tthis.handleMessage(message)\n\t\t})\n\t\tthis.bridgeClient.onDisconnect(() => {\n\t\t\tif (this.disposed) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.events.onDisconnect?.()\n\t\t})\n\t}\n\n\tasync connectAndAttach(): Promise<void> {\n\t\tthis.assertOpen()\n\t\tconst connected = this.bridgeClient.connect()\n\t\tif (!connected) {\n\t\t\tthrow new Error(`Failed to connect native host for tab ${this.tabId}`)\n\t\t}\n\n\t\tconst sent = this.bridgeClient.send({\n\t\t\ttype: 'init_tab_watcher',\n\t\t\twatcherId: this.desiredWatcherId,\n\t\t})\n\t\tif (!sent) {\n\t\t\tthrow new Error(`Failed to initialize watcher for tab ${this.tabId}`)\n\t\t}\n\t\tawait this.waitUntilReady()\n\t\tawait this.waitForWatcherInfo()\n\t\tawait this.cdpProxy.attachTab(this.tabId)\n\t}\n\n\tasync waitUntilReady(timeoutMs = 3_000): Promise<void> {\n\t\tthis.assertOpen()\n\t\tif (this.ready) {\n\t\t\treturn\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.readyWaiters = this.readyWaiters.filter((waiter) => waiter !== onReady)\n\t\t\t\treject(new Error(`Native host session for tab ${this.tabId} did not become ready`))\n\t\t\t}, timeoutMs)\n\t\t\tconst onReady = (): void => {\n\t\t\t\tclearTimeout(timer)\n\t\t\t\tresolve()\n\t\t\t}\n\t\t\tthis.readyWaiters.push(onReady)\n\t\t})\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.cdpProxy.detachTab(this.tabId)\n\t\t} finally {\n\t\t\tthis.dispose()\n\t\t}\n\t}\n\n\tselectTarget(frameId: string | null): void {\n\t\tthis.assertOpen()\n\t\tconst sent = this.bridgeClient.send({\n\t\t\ttype: 'target_selected',\n\t\t\ttabId: this.tabId,\n\t\t\tframeId,\n\t\t})\n\t\tif (!sent) {\n\t\t\tthrow new Error(`Failed to select target for tab ${this.tabId}`)\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.disposed = true\n\t\tthis.cdpProxy.dispose()\n\t\tthis.bridgeClient.disconnect()\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.bridgeClient.isConnected()\n\t}\n\n\tgetWatcherInfo(): TabWatcherInfo | null {\n\t\treturn this.watcherInfo\n\t}\n\n\tgetTargetInfo(): TabTargetInfo | null {\n\t\treturn this.targetInfo\n\t}\n\n\tgetLastMessageAt(): number | null {\n\t\treturn this.lastMessageAt\n\t}\n\n\tprivate async waitForWatcherInfo(timeoutMs = 3_000): Promise<void> {\n\t\tthis.assertOpen()\n\t\tif (this.watcherInfo) {\n\t\t\treturn\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.watcherInfoWaiters = this.watcherInfoWaiters.filter((waiter) => waiter !== onWatcherInfo)\n\t\t\t\treject(new Error(`Native host session for tab ${this.tabId} did not report watcher info`))\n\t\t\t}, timeoutMs)\n\t\t\tconst onWatcherInfo = (): void => {\n\t\t\t\tclearTimeout(timer)\n\t\t\t\tresolve()\n\t\t\t}\n\t\t\tthis.watcherInfoWaiters.push(onWatcherInfo)\n\t\t})\n\t}\n\n\tprivate handleMessage(message: TabHostToExtension): void {\n\t\tthis.lastMessageAt = Date.now()\n\n\t\tswitch (message.type) {\n\t\t\tcase 'host_info':\n\t\t\t\tthis.watcherInfo = {\n\t\t\t\t\twatcherId: message.watcherId,\n\t\t\t\t\twatcherHost: message.watcherHost,\n\t\t\t\t\twatcherPort: message.watcherPort,\n\t\t\t\t\tpid: message.pid,\n\t\t\t\t}\n\t\t\t\tthis.events.onWatcherInfo?.(this.watcherInfo)\n\t\t\t\tthis.resolveWatcherInfoWaiters()\n\t\t\t\treturn\n\n\t\t\tcase 'host_ready':\n\t\t\t\tthis.resolveReadyWaiters()\n\t\t\t\treturn\n\n\t\t\tcase 'target_info':\n\t\t\t\tthis.targetInfo = {\n\t\t\t\t\ttargetId: message.targetId,\n\t\t\t\t\ttitle: message.title,\n\t\t\t\t\turl: message.url,\n\t\t\t\t\tattachedAt: message.attachedAt,\n\t\t\t\t\ttargetReady: message.targetReady ?? null,\n\t\t\t\t}\n\t\t\t\tthis.events.onTargetInfo?.(this.targetInfo)\n\t\t}\n\t}\n\n\tprivate resolveReadyWaiters(): void {\n\t\tthis.ready = true\n\t\tconst waiters = this.readyWaiters\n\t\tthis.readyWaiters = []\n\t\tfor (const waiter of waiters) {\n\t\t\twaiter()\n\t\t}\n\t}\n\n\tprivate resolveWatcherInfoWaiters(): void {\n\t\tconst waiters = this.watcherInfoWaiters\n\t\tthis.watcherInfoWaiters = []\n\t\tfor (const waiter of waiters) {\n\t\t\twaiter()\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.disposed) {\n\t\t\tthrow new Error(`Native host session for tab ${this.tabId} is already closed`)\n\t\t}\n\t}\n}\n", "import type { ControlDiagnostics, ControlHostToExtension, ExtensionToControlHost, TabInfo } from '../types/messages.js'\nimport { BridgeClient } from './bridge-client.js'\nimport type { DebuggerManager } from './debugger-manager.js'\nimport { CONTROL_HOST_NAME } from './native-hosts.js'\nimport { listBrowserTabs } from './tab-list.js'\n\nexport type ControlWatcherInfo = {\n\twatcherId: string\n\twatcherHost: string\n\twatcherPort: number\n\tpid: number\n}\n\nexport type ControlBridgeSessionEvents = {\n\tonWatcherInfo?: (info: ControlWatcherInfo) => void\n\tonAttachTabWatcher?: (tabId: number, options: { watcherId?: string }) => Promise<TabActionResult>\n\tonDetachTabWatcher?: (tabId: number) => Promise<TabActionResult>\n\tgetWatcherIdForTab?: (tabId: number) => string | null | undefined\n\tgetDiagnostics?: () => ControlDiagnostics\n\tonDisconnect?: () => void\n}\n\nexport type TabActionResult = { ok: true; tab: TabInfo; watcherId?: string } | { ok: false; error: string }\n\n/**\n * Owns the extension-level native host. It never attaches chrome.debugger to a tab;\n * it only gives Argus a stable HTTP transport for browser-level extension commands.\n */\nexport class ControlBridgeSession {\n\tprivate readonly bridgeClient: BridgeClient<ControlHostToExtension, ExtensionToControlHost>\n\tprivate readonly debuggerManager: DebuggerManager\n\tprivate readonly events: ControlBridgeSessionEvents\n\tprivate watcherInfo: ControlWatcherInfo | null = null\n\tprivate lastMessageAt: number | null = null\n\tprivate disposed = false\n\n\tconstructor(debuggerManager: DebuggerManager, events: ControlBridgeSessionEvents = {}) {\n\t\tthis.debuggerManager = debuggerManager\n\t\tthis.events = events\n\t\tthis.bridgeClient = new BridgeClient(CONTROL_HOST_NAME, { autoReconnect: true })\n\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tvoid this.handleMessage(message)\n\t\t})\n\t\tthis.bridgeClient.onDisconnect(() => {\n\t\t\tif (this.disposed) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.events.onDisconnect?.()\n\t\t})\n\t}\n\n\tconnect(): boolean {\n\t\tthis.assertOpen()\n\t\treturn this.bridgeClient.connect()\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.disposed = true\n\t\tthis.bridgeClient.disconnect()\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.bridgeClient.isConnected()\n\t}\n\n\tgetWatcherInfo(): ControlWatcherInfo | null {\n\t\treturn this.watcherInfo\n\t}\n\n\tgetLastMessageAt(): number | null {\n\t\treturn this.lastMessageAt\n\t}\n\n\tprivate async handleMessage(message: ControlHostToExtension): Promise<void> {\n\t\tthis.lastMessageAt = Date.now()\n\n\t\tswitch (message.type) {\n\t\t\tcase 'host_info':\n\t\t\t\tthis.watcherInfo = {\n\t\t\t\t\twatcherId: message.watcherId,\n\t\t\t\t\twatcherHost: message.watcherHost,\n\t\t\t\t\twatcherPort: message.watcherPort,\n\t\t\t\t\tpid: message.pid,\n\t\t\t\t}\n\t\t\t\tthis.events.onWatcherInfo?.(this.watcherInfo)\n\t\t\t\treturn\n\n\t\t\tcase 'attach_tab_watcher':\n\t\t\t\tawait this.handleTabAction(message.requestId, () => this.events.onAttachTabWatcher?.(message.tabId, { watcherId: message.watcherId }))\n\t\t\t\treturn\n\n\t\t\tcase 'detach_tab_watcher':\n\t\t\t\tawait this.handleTabAction(message.requestId, () => this.events.onDetachTabWatcher?.(message.tabId))\n\t\t\t\treturn\n\n\t\t\tcase 'list_tabs':\n\t\t\t\tawait this.handleListTabs(message.requestId, message.filter)\n\t\t\t\treturn\n\n\t\t\tcase 'control_status':\n\t\t\t\tthis.handleControlStatus(message.requestId)\n\t\t\t\treturn\n\n\t\t\tcase 'host_ready':\n\t\t\t\treturn\n\t\t}\n\t}\n\n\tprivate async handleTabAction(requestId: number, action: () => Promise<TabActionResult> | undefined): Promise<void> {\n\t\ttry {\n\t\t\tconst result = (await action()) ?? { ok: false, error: 'Extension control action is not available' }\n\t\t\tif (!result.ok) {\n\t\t\t\tthis.bridgeClient.send({ type: 'tab_action_response', requestId, ok: false, error: { message: result.error } })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.bridgeClient.send({ type: 'tab_action_response', requestId, ok: true, tab: result.tab, watcherId: result.watcherId })\n\t\t} catch (error) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_action_response',\n\t\t\t\trequestId,\n\t\t\t\tok: false,\n\t\t\t\terror: { message: error instanceof Error ? error.message : String(error) },\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate async handleListTabs(requestId: number, filter?: { url?: string; title?: string }): Promise<void> {\n\t\tconst tabs: TabInfo[] = await listBrowserTabs(this.debuggerManager, filter, {\n\t\t\tgetWatcherIdForTab: this.events.getWatcherIdForTab,\n\t\t})\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'list_tabs_response',\n\t\t\trequestId,\n\t\t\ttabs,\n\t\t})\n\t}\n\n\tprivate handleControlStatus(requestId: number): void {\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'control_status_response',\n\t\t\trequestId,\n\t\t\tdiagnostics: this.events.getDiagnostics?.() ?? this.buildFallbackDiagnostics(),\n\t\t})\n\t}\n\n\tprivate buildFallbackDiagnostics(): ControlDiagnostics {\n\t\treturn {\n\t\t\textensionId: null,\n\t\t\textensionVersion: null,\n\t\t\tcontrol: {\n\t\t\t\tconnected: this.isConnected(),\n\t\t\t\twatcherId: this.watcherInfo?.watcherId ?? null,\n\t\t\t\twatcherHost: this.watcherInfo?.watcherHost ?? null,\n\t\t\t\twatcherPort: this.watcherInfo?.watcherPort ?? null,\n\t\t\t\tpid: this.watcherInfo?.pid ?? null,\n\t\t\t\tlastMessageAt: this.lastMessageAt,\n\t\t\t},\n\t\t\ttabWatchers: [],\n\t\t\trecentEvents: [],\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.disposed) {\n\t\t\tthrow new Error('Native host control session is already closed')\n\t\t}\n\t}\n}\n", "export type SelectionTarget = {\n\ttype: 'page' | 'iframe'\n\tframeId: string | null\n\ttitle: string | null\n\turl: string | null\n}\n\nexport type RememberedTargetSelection =\n\t| {\n\t\t\tpageKey: string\n\t\t\tpageUrl: string\n\t\t\tupdatedAt: number\n\t\t\ttarget: { type: 'page' }\n\t }\n\t| {\n\t\t\tpageKey: string\n\t\t\tpageUrl: string\n\t\t\tupdatedAt: number\n\t\t\ttarget: {\n\t\t\t\ttype: 'iframe'\n\t\t\t\turl: string | null\n\t\t\t\ttitle: string | null\n\t\t\t}\n\t }\n\nexport type TargetSelectionHistoryPersistence = {\n\tload: () => Promise<RememberedTargetSelection[]>\n\tsave: (entries: RememberedTargetSelection[]) => Promise<void>\n}\n\ntype RememberedSelectionDraft = Partial<RememberedTargetSelection> & {\n\ttarget?: { type?: string; url?: unknown; title?: unknown }\n}\n\nconst DEFAULT_STORAGE_KEY = 'targetSelectionHistory'\nconst DEFAULT_MAX_ENTRIES = 20\n\n/**\n * Group history by the stable document path instead of the full URL so replay survives\n * nonce/hash/query churn. The iframe hint itself still uses strict matching and fails closed.\n */\nexport const normalizeSelectionPageKey = (pageUrl: string): string => {\n\ttry {\n\t\tconst parsed = new URL(pageUrl)\n\t\treturn `${parsed.origin}${parsed.pathname || '/'}`\n\t} catch {\n\t\treturn pageUrl.split('#', 1)[0] || pageUrl\n\t}\n}\n\nexport const matchRememberedIframeTarget = (entry: RememberedTargetSelection, targets: SelectionTarget[]): SelectionTarget | null => {\n\tif (entry.target.type !== 'iframe') {\n\t\treturn null\n\t}\n\tconst rememberedIframe = entry.target\n\tconst iframeTargets = getIframeTargets(targets)\n\n\tif (rememberedIframe.url) {\n\t\treturn pickSingleTargetMatch(iframeTargets, (target) => target.url === rememberedIframe.url)\n\t}\n\n\tif (!rememberedIframe.title) {\n\t\treturn null\n\t}\n\n\treturn pickSingleTargetMatch(iframeTargets, (target) => normalizeTargetTitle(target.title) === rememberedIframe.title)\n}\n\nexport class TargetSelectionHistoryStore {\n\tprivate readonly persistence: TargetSelectionHistoryPersistence\n\tprivate readonly maxEntries: number\n\tprivate entries: RememberedTargetSelection[] = []\n\tprivate loadPromise: Promise<void> | null = null\n\tprivate saveChain: Promise<void> = Promise.resolve()\n\n\tconstructor(persistence: TargetSelectionHistoryPersistence = createChromeStoragePersistence(), options: { maxEntries?: number } = {}) {\n\t\tthis.persistence = persistence\n\t\tthis.maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES\n\t}\n\n\tasync getByPageUrl(pageUrl: string): Promise<RememberedTargetSelection | null> {\n\t\tawait this.ensureLoaded()\n\t\tconst pageKey = normalizeSelectionPageKey(pageUrl)\n\t\treturn this.entries.find((entry) => entry.pageKey === pageKey) ?? null\n\t}\n\n\tasync remember(pageUrl: string, target: SelectionTarget): Promise<RememberedTargetSelection> {\n\t\tawait this.ensureLoaded()\n\n\t\tconst entry = buildRememberedSelection(pageUrl, target)\n\t\tthis.entries = [entry, ...this.entries.filter((candidate) => candidate.pageKey !== entry.pageKey)].slice(0, this.maxEntries)\n\t\tawait this.persist()\n\t\treturn entry\n\t}\n\n\tprivate async ensureLoaded(): Promise<void> {\n\t\tif (!this.loadPromise) {\n\t\t\tthis.loadPromise = this.persistence\n\t\t\t\t.load()\n\t\t\t\t.then((entries) => {\n\t\t\t\t\tthis.entries = sanitizeRememberedSelections(entries).slice(0, this.maxEntries)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('[TargetSelectionHistoryStore] Failed to load history:', error)\n\t\t\t\t\tthis.entries = []\n\t\t\t\t})\n\t\t}\n\n\t\tawait this.loadPromise\n\t}\n\n\tprivate async persist(): Promise<void> {\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => undefined)\n\t\t\t.then(() => this.persistence.save(this.entries))\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TargetSelectionHistoryStore] Failed to save history:', error)\n\t\t\t})\n\n\t\tawait this.saveChain\n\t}\n}\n\nexport const createChromeStoragePersistence = (\n\tstorageArea: chrome.storage.StorageArea = chrome.storage.local,\n\tstorageKey: string = DEFAULT_STORAGE_KEY,\n): TargetSelectionHistoryPersistence => ({\n\tload: async () => {\n\t\tconst stored = await readStorageValue<unknown>(storageArea, storageKey)\n\t\treturn sanitizeRememberedSelections(Array.isArray(stored) ? stored : [])\n\t},\n\tsave: async (entries) => {\n\t\tawait writeStorageValue(storageArea, { [storageKey]: entries })\n\t},\n})\n\nconst buildRememberedSelection = (pageUrl: string, target: SelectionTarget): RememberedTargetSelection => {\n\tconst base = {\n\t\tpageKey: normalizeSelectionPageKey(pageUrl),\n\t\tpageUrl,\n\t\tupdatedAt: Date.now(),\n\t}\n\n\tif (target.type === 'page') {\n\t\treturn {\n\t\t\t...base,\n\t\t\ttarget: { type: 'page' },\n\t\t}\n\t}\n\n\treturn {\n\t\t...base,\n\t\ttarget: {\n\t\t\ttype: 'iframe',\n\t\t\turl: normalizeTargetUrl(target.url),\n\t\t\ttitle: normalizeTargetTitle(target.title),\n\t\t},\n\t}\n}\n\nconst pickSingleTargetMatch = <T>(targets: T[], predicate: (target: T) => boolean): T | null => {\n\tconst matches = targets.filter(predicate)\n\treturn matches.length === 1 ? matches[0] : null\n}\n\nconst getIframeTargets = (targets: SelectionTarget[]): Array<SelectionTarget & { type: 'iframe'; frameId: string }> => {\n\treturn targets.filter((target): target is SelectionTarget & { type: 'iframe'; frameId: string } => {\n\t\treturn target.type === 'iframe' && typeof target.frameId === 'string' && target.frameId.length > 0\n\t})\n}\n\nconst sanitizeRememberedSelections = (entries: unknown[]): RememberedTargetSelection[] => {\n\treturn entries\n\t\t.map(sanitizeRememberedSelection)\n\t\t.filter((entry): entry is RememberedTargetSelection => entry !== null)\n\t\t.sort(sortByUpdatedAtDesc)\n}\n\nconst sanitizeRememberedSelection = (entry: unknown): RememberedTargetSelection | null => {\n\tconst candidate = entry as RememberedSelectionDraft\n\tif (typeof candidate?.pageUrl !== 'string' || candidate.pageUrl.length === 0) {\n\t\treturn null\n\t}\n\n\tconst base = {\n\t\tpageKey:\n\t\t\ttypeof candidate.pageKey === 'string' && candidate.pageKey.length > 0 ? candidate.pageKey : normalizeSelectionPageKey(candidate.pageUrl),\n\t\tpageUrl: candidate.pageUrl,\n\t\tupdatedAt: typeof candidate.updatedAt === 'number' ? candidate.updatedAt : 0,\n\t}\n\n\tif (candidate.target?.type === 'page') {\n\t\treturn {\n\t\t\t...base,\n\t\t\ttarget: { type: 'page' },\n\t\t}\n\t}\n\n\tif (candidate.target?.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...base,\n\t\ttarget: {\n\t\t\ttype: 'iframe',\n\t\t\turl: normalizeTargetUrl(typeof candidate.target.url === 'string' ? candidate.target.url : null),\n\t\t\ttitle: normalizeTargetTitle(typeof candidate.target.title === 'string' ? candidate.target.title : null),\n\t\t},\n\t}\n}\n\nfunction normalizeTargetUrl(url: string | null | undefined): string | null {\n\treturn normalizeOptionalText(url)\n}\n\nfunction normalizeTargetTitle(title: string | null | undefined): string | null {\n\treturn normalizeOptionalText(title)\n}\n\nfunction normalizeOptionalText(value: string | null | undefined): string | null {\n\treturn typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nconst sortByUpdatedAtDesc = (left: RememberedTargetSelection, right: RememberedTargetSelection): number => right.updatedAt - left.updatedAt\n\nconst readStorageValue = async <T>(storageArea: chrome.storage.StorageArea, key: string): Promise<T | undefined> => {\n\treturn await new Promise<T | undefined>((resolve, reject) => {\n\t\tstorageArea.get(key, (items) => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve(items[key] as T | undefined)\n\t\t})\n\t})\n}\n\nconst writeStorageValue = async (storageArea: chrome.storage.StorageArea, items: Record<string, unknown>): Promise<void> => {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tstorageArea.set(items, () => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve()\n\t\t})\n\t})\n}\n", "import { normalizeSelectionPageKey, type SelectionTarget } from './target-selection-history.js'\n\nexport type HiddenTarget = {\n\ttype: 'iframe'\n\turl: string | null\n\ttitle: string | null\n}\n\nexport type HiddenTargetPageEntry = {\n\tpageKey: string\n\tpageUrl: string\n\tupdatedAt: number\n\ttargets: HiddenTarget[]\n}\n\nexport type TargetVisibilityPersistence = {\n\tload: () => Promise<HiddenTargetPageEntry[]>\n\tsave: (entries: HiddenTargetPageEntry[]) => Promise<void>\n}\n\ntype HiddenTargetPageDraft = Partial<HiddenTargetPageEntry> & {\n\ttargets?: unknown\n}\n\ntype HiddenTargetDraft = Partial<HiddenTarget> & {\n\ttype?: unknown\n\turl?: unknown\n\ttitle?: unknown\n}\n\nconst DEFAULT_STORAGE_KEY = 'hiddenTargetHistory'\nconst DEFAULT_MAX_PAGE_ENTRIES = 20\n\n/**\n * Persists page-scoped iframe hide preferences. Frame ids are intentionally not stored:\n * Chrome regenerates them often, while URL/title signatures survive reloads well enough.\n */\nexport class TargetVisibilityHistoryStore {\n\tprivate readonly persistence: TargetVisibilityPersistence\n\tprivate readonly maxPageEntries: number\n\tprivate entries: HiddenTargetPageEntry[] = []\n\tprivate loadPromise: Promise<void> | null = null\n\tprivate saveChain: Promise<void> = Promise.resolve()\n\n\tconstructor(persistence: TargetVisibilityPersistence = createChromeStoragePersistence(), options: { maxPageEntries?: number } = {}) {\n\t\tthis.persistence = persistence\n\t\tthis.maxPageEntries = options.maxPageEntries ?? DEFAULT_MAX_PAGE_ENTRIES\n\t}\n\n\tasync getHiddenTargets(pageUrl: string): Promise<HiddenTarget[]> {\n\t\tawait this.ensureLoaded()\n\t\treturn [...(this.findEntry(pageUrl)?.targets ?? [])]\n\t}\n\n\tasync hide(pageUrl: string, target: SelectionTarget): Promise<HiddenTargetPageEntry | null> {\n\t\tawait this.ensureLoaded()\n\t\tconst hiddenTarget = toHiddenTarget(target)\n\t\tif (!hiddenTarget) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst pageKey = normalizeSelectionPageKey(pageUrl)\n\t\tconst existing = this.findEntry(pageUrl)\n\t\tconst targets = uniqueHiddenTargets([hiddenTarget, ...(existing?.targets ?? [])])\n\t\tconst entry = { pageKey, pageUrl, updatedAt: Date.now(), targets }\n\t\tthis.upsertEntry(entry)\n\t\tawait this.persist()\n\t\treturn entry\n\t}\n\n\tasync show(pageUrl: string, target: SelectionTarget): Promise<void> {\n\t\tawait this.ensureLoaded()\n\t\tconst hiddenTarget = toHiddenTarget(target)\n\t\tif (!hiddenTarget) {\n\t\t\treturn\n\t\t}\n\n\t\tconst existing = this.findEntry(pageUrl)\n\t\tif (!existing) {\n\t\t\treturn\n\t\t}\n\n\t\tconst targets = existing.targets.filter((candidate) => !isSameHiddenTarget(candidate, hiddenTarget))\n\t\tif (targets.length === 0) {\n\t\t\tthis.entries = this.entries.filter((entry) => entry.pageKey !== existing.pageKey)\n\t\t\tawait this.persist()\n\t\t\treturn\n\t\t}\n\n\t\tthis.entries = this.entries.map((entry) => (entry.pageKey === existing.pageKey ? { ...entry, targets, updatedAt: Date.now() } : entry))\n\t\tawait this.persist()\n\t}\n\n\tasync isHidden(pageUrl: string, target: SelectionTarget): Promise<boolean> {\n\t\tconst hiddenTargets = await this.getHiddenTargets(pageUrl)\n\t\treturn hiddenTargets.some((hiddenTarget) => matchesHiddenTarget(hiddenTarget, target))\n\t}\n\n\tprivate findEntry(pageUrl: string): HiddenTargetPageEntry | null {\n\t\tconst pageKey = normalizeSelectionPageKey(pageUrl)\n\t\treturn this.entries.find((entry) => entry.pageKey === pageKey) ?? null\n\t}\n\n\tprivate upsertEntry(entry: HiddenTargetPageEntry): void {\n\t\tthis.entries = [entry, ...this.entries.filter((candidate) => candidate.pageKey !== entry.pageKey)].slice(0, this.maxPageEntries)\n\t}\n\n\tprivate async ensureLoaded(): Promise<void> {\n\t\tif (!this.loadPromise) {\n\t\t\tthis.loadPromise = this.persistence\n\t\t\t\t.load()\n\t\t\t\t.then((entries) => {\n\t\t\t\t\tthis.entries = sanitizeHiddenTargetEntries(entries).slice(0, this.maxPageEntries)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('[TargetVisibilityHistoryStore] Failed to load history:', error)\n\t\t\t\t\tthis.entries = []\n\t\t\t\t})\n\t\t}\n\n\t\tawait this.loadPromise\n\t}\n\n\tprivate async persist(): Promise<void> {\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => undefined)\n\t\t\t.then(() => this.persistence.save(this.entries))\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TargetVisibilityHistoryStore] Failed to save history:', error)\n\t\t\t})\n\n\t\tawait this.saveChain\n\t}\n}\n\nexport const createChromeStoragePersistence = (\n\tstorageArea: chrome.storage.StorageArea = chrome.storage.local,\n\tstorageKey: string = DEFAULT_STORAGE_KEY,\n): TargetVisibilityPersistence => ({\n\tload: async () => {\n\t\tconst stored = await readStorageValue<unknown>(storageArea, storageKey)\n\t\treturn sanitizeHiddenTargetEntries(Array.isArray(stored) ? stored : [])\n\t},\n\tsave: async (entries) => {\n\t\tawait writeStorageValue(storageArea, { [storageKey]: entries })\n\t},\n})\n\nexport function matchesHiddenTarget(hiddenTarget: HiddenTarget, target: SelectionTarget): boolean {\n\tif (target.type !== 'iframe') {\n\t\treturn false\n\t}\n\n\tconst candidate = toHiddenTarget(target)\n\treturn candidate ? isSameHiddenTarget(hiddenTarget, candidate) : false\n}\n\nfunction toHiddenTarget(target: SelectionTarget): HiddenTarget | null {\n\tif (target.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\tconst url = normalizeOptionalText(target.url)\n\tconst title = normalizeOptionalText(target.title)\n\tif (!url && !title) {\n\t\treturn null\n\t}\n\n\treturn { type: 'iframe', url, title }\n}\n\nfunction uniqueHiddenTargets(targets: HiddenTarget[]): HiddenTarget[] {\n\tconst unique: HiddenTarget[] = []\n\tfor (const target of targets) {\n\t\tif (!unique.some((candidate) => isSameHiddenTarget(candidate, target))) {\n\t\t\tunique.push(target)\n\t\t}\n\t}\n\treturn unique\n}\n\nfunction isSameHiddenTarget(left: HiddenTarget, right: HiddenTarget): boolean {\n\tif (left.url || right.url) {\n\t\treturn left.url === right.url\n\t}\n\n\treturn left.title === right.title\n}\n\nfunction sanitizeHiddenTargetEntries(entries: unknown[]): HiddenTargetPageEntry[] {\n\treturn entries\n\t\t.map(sanitizeHiddenTargetEntry)\n\t\t.filter((entry): entry is HiddenTargetPageEntry => entry !== null)\n\t\t.sort(sortByUpdatedAtDesc)\n}\n\nfunction sanitizeHiddenTargetEntry(entry: unknown): HiddenTargetPageEntry | null {\n\tconst candidate = entry as HiddenTargetPageDraft\n\tif (typeof candidate?.pageUrl !== 'string' || candidate.pageUrl.length === 0 || !Array.isArray(candidate.targets)) {\n\t\treturn null\n\t}\n\n\tconst targets = uniqueHiddenTargets(candidate.targets.map(sanitizeHiddenTarget).filter((target): target is HiddenTarget => target !== null))\n\tif (targets.length === 0) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\tpageKey:\n\t\t\ttypeof candidate.pageKey === 'string' && candidate.pageKey.length > 0 ? candidate.pageKey : normalizeSelectionPageKey(candidate.pageUrl),\n\t\tpageUrl: candidate.pageUrl,\n\t\tupdatedAt: typeof candidate.updatedAt === 'number' ? candidate.updatedAt : 0,\n\t\ttargets,\n\t}\n}\n\nfunction sanitizeHiddenTarget(target: unknown): HiddenTarget | null {\n\tconst candidate = target as HiddenTargetDraft\n\tif (candidate?.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\tconst url = normalizeOptionalText(typeof candidate.url === 'string' ? candidate.url : null)\n\tconst title = normalizeOptionalText(typeof candidate.title === 'string' ? candidate.title : null)\n\tif (!url && !title) {\n\t\treturn null\n\t}\n\n\treturn { type: 'iframe', url, title }\n}\n\nfunction normalizeOptionalText(value: string | null | undefined): string | null {\n\treturn typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nconst sortByUpdatedAtDesc = (left: HiddenTargetPageEntry, right: HiddenTargetPageEntry): number => right.updatedAt - left.updatedAt\n\nconst readStorageValue = async <T>(storageArea: chrome.storage.StorageArea, key: string): Promise<T | undefined> => {\n\treturn await new Promise<T | undefined>((resolve, reject) => {\n\t\tstorageArea.get(key, (items) => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve(items[key] as T | undefined)\n\t\t})\n\t})\n}\n\nconst writeStorageValue = async (storageArea: chrome.storage.StorageArea, items: Record<string, unknown>): Promise<void> => {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tstorageArea.set(items, () => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve()\n\t\t})\n\t})\n}\n", "import type { DebuggerManager } from './debugger-manager.js'\n\nlet badgeSyncChain: Promise<void> = Promise.resolve()\n\n/**\n * Serialize badge writes and reconcile on popup reads so an external detach from Chrome's\n * debugger infobar cannot leave stale badge text behind.\n */\nexport function syncActionBadge(debuggerManager: DebuggerManager): Promise<void> {\n\tbadgeSyncChain = badgeSyncChain\n\t\t.catch(() => undefined)\n\t\t.then(async () => {\n\t\t\tconst attachedCount = debuggerManager.listAttached().length\n\t\t\tawait applyBadgeState(attachedCount)\n\t\t})\n\t\t.catch((error) => {\n\t\t\tconsole.error('[ServiceWorker] Failed to sync action badge:', error)\n\t\t})\n\n\treturn badgeSyncChain\n}\n\nasync function applyBadgeState(attachedCount: number): Promise<void> {\n\tconst badgeText = attachedCount > 0 ? String(attachedCount) : ''\n\tconst tabs = await chrome.tabs.query({})\n\n\t// Clear any tab-specific badge text Chrome may still be holding onto, then keep the default in sync.\n\tawait Promise.all(\n\t\ttabs\n\t\t\t.filter((tab): tab is chrome.tabs.Tab & { id: number } => tab.id !== undefined)\n\t\t\t.map((tab) => chrome.action.setBadgeText({ tabId: tab.id, text: badgeText })),\n\t)\n\tawait chrome.action.setBadgeText({ text: badgeText })\n\n\tif (attachedCount > 0) {\n\t\tawait chrome.action.setBadgeBackgroundColor({ color: '#4CAF50' })\n\t}\n}\n", "/**\n * Read-only views of the debugger frame tree, shaped for the popup UI.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { SelectionTarget } from './target-selection-history.js'\nimport type { PopupTarget } from './popup-protocol.js'\n\n/** Parse watcher target ids (`tab:<id>` / `frame:<tabId>:<frameId>`). Returns null for unknown formats. */\nexport function parseWatcherTargetId(targetId: string): { tabId: number; frameId: string | null } | null {\n\tif (targetId.startsWith('tab:')) {\n\t\tconst tabId = Number.parseInt(targetId.slice(4), 10)\n\t\treturn Number.isFinite(tabId) ? { tabId, frameId: null } : null\n\t}\n\n\tif (targetId.startsWith('frame:')) {\n\t\tconst [, tabIdRaw, ...frameIdParts] = targetId.split(':')\n\t\tconst tabId = Number.parseInt(tabIdRaw ?? '', 10)\n\t\tconst frameId = frameIdParts.join(':')\n\t\treturn Number.isFinite(tabId) && frameId ? { tabId, frameId } : null\n\t}\n\n\treturn null\n}\n\n/** List the page plus iframe targets for an attached tab, in popup display shape. */\nexport function getPopupTargets(debuggerManager: DebuggerManager, tabId: number): PopupTarget[] {\n\tconst frames = debuggerManager.getFrames(tabId)\n\tconst topFrameId = debuggerManager.getTarget(tabId)?.topFrameId ?? null\n\tconst topFrame = frames.find((frame) => frame.frameId === topFrameId) ?? frames.find((frame) => frame.parentFrameId == null)\n\tif (!topFrame) {\n\t\treturn []\n\t}\n\n\treturn [\n\t\t{\n\t\t\ttype: 'page',\n\t\t\tframeId: null,\n\t\t\tparentFrameId: null,\n\t\t\ttitle: topFrame.title || 'Page',\n\t\t\turl: topFrame.url,\n\t\t},\n\t\t...frames\n\t\t\t.filter((frame) => frame.frameId !== topFrame.frameId)\n\t\t\t.map((frame) => ({\n\t\t\t\ttype: 'iframe' as const,\n\t\t\t\tframeId: frame.frameId,\n\t\t\t\tparentFrameId: frame.parentFrameId === topFrame.frameId ? null : frame.parentFrameId,\n\t\t\t\ttitle: frame.title || frame.url || `iframe ${frame.frameId.slice(0, 8)}`,\n\t\t\t\turl: frame.url,\n\t\t\t})),\n\t]\n}\n\nexport function getPopupTarget(debuggerManager: DebuggerManager, tabId: number, frameId: string | null): PopupTarget | null {\n\treturn getPopupTargets(debuggerManager, tabId).find((target) => (target.frameId ?? null) === frameId) ?? null\n}\n\nexport function getRequiredIframeTarget(debuggerManager: DebuggerManager, tabId: number, frameId: string | null): PopupTarget {\n\tconst target = getPopupTarget(debuggerManager, tabId, frameId)\n\tif (!target || target.type !== 'iframe' || !target.frameId) {\n\t\tthrow new Error(`Unknown iframe target for tab ${tabId}`)\n\t}\n\n\treturn target\n}\n\nexport function getPageUrlForTab(debuggerManager: DebuggerManager, tabId: number): string | null {\n\treturn getPopupTarget(debuggerManager, tabId, null)?.url ?? debuggerManager.getTarget(tabId)?.url ?? null\n}\n\n/** Project a popup target to the shape persisted by selection/visibility history stores. */\nexport function toSelectionTarget(target: PopupTarget): SelectionTarget {\n\treturn {\n\t\ttype: target.type,\n\t\tframeId: target.frameId,\n\t\ttitle: target.title,\n\t\turl: target.url,\n\t}\n}\n", "/**\n * Build per-tab watcher status payloads for the popup from a live bridge session.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { TabBridgeSession } from './tab-bridge-session.js'\nimport type { PopupWatcherStatus } from './popup-protocol.js'\nimport { parseWatcherTargetId } from './popup-targets.js'\n\nexport function buildWatcherStatus(debuggerManager: DebuggerManager, tabId: number, session: TabBridgeSession): PopupWatcherStatus | null {\n\tconst watcherInfo = session.getWatcherInfo()\n\tconst targetInfo = session.getTargetInfo()\n\tconst parsedTarget = targetInfo ? parseWatcherTargetId(targetInfo.targetId) : null\n\n\tif (!watcherInfo && !targetInfo) {\n\t\treturn createWatcherStatus(debuggerManager, tabId, session, null, null)\n\t}\n\n\treturn createWatcherStatus(\n\t\tdebuggerManager,\n\t\ttabId,\n\t\tsession,\n\t\twatcherInfo ?? null,\n\t\ttargetInfo && parsedTarget\n\t\t\t? {\n\t\t\t\t\ttype: parsedTarget.frameId ? 'iframe' : 'page',\n\t\t\t\t\ttitle: targetInfo.title,\n\t\t\t\t\turl: targetInfo.url,\n\t\t\t\t\ttargetId: targetInfo.targetId,\n\t\t\t\t\tframeId: parsedTarget.frameId,\n\t\t\t\t\tattachedAt: targetInfo.attachedAt,\n\t\t\t\t\ttargetReady: targetInfo.targetReady,\n\t\t\t\t}\n\t\t\t: null,\n\t)\n}\n\nfunction createWatcherStatus(\n\tdebuggerManager: DebuggerManager,\n\ttabId: number,\n\tsession: TabBridgeSession,\n\twatcherInfo: ReturnType<TabBridgeSession['getWatcherInfo']>,\n\tcurrentTarget: PopupWatcherStatus['currentTarget'],\n): PopupWatcherStatus {\n\tconst readiness = buildWatcherReadiness(debuggerManager, tabId, session, watcherInfo, currentTarget)\n\treturn {\n\t\ttabId,\n\t\tbridgeConnected: readiness.nativeHostConnected,\n\t\tnativeHostConnected: readiness.nativeHostConnected,\n\t\twatcherReady: readiness.watcherReady,\n\t\ttargetReady: readiness.targetReady,\n\t\ttargetState: readiness.targetState,\n\t\twatcherId: watcherInfo?.watcherId ?? null,\n\t\twatcherHost: watcherInfo?.watcherHost ?? null,\n\t\twatcherPort: watcherInfo?.watcherPort ?? null,\n\t\tnativeHostPid: watcherInfo?.pid ?? null,\n\t\tlastMessageAt: session.getLastMessageAt(),\n\t\tcurrentTarget,\n\t}\n}\n\nfunction buildWatcherReadiness(\n\tdebuggerManager: DebuggerManager,\n\ttabId: number,\n\tsession: TabBridgeSession,\n\twatcherInfo: ReturnType<TabBridgeSession['getWatcherInfo']>,\n\tcurrentTarget: PopupWatcherStatus['currentTarget'],\n): Pick<PopupWatcherStatus, 'nativeHostConnected' | 'watcherReady' | 'targetReady' | 'targetState'> {\n\tconst nativeHostConnected = session.isConnected()\n\tconst watcherReady = nativeHostConnected && Boolean(watcherInfo?.watcherId && watcherInfo.watcherHost && watcherInfo.watcherPort != null)\n\tconst targetReady = currentTarget?.targetReady ?? getTargetReadiness(debuggerManager, tabId, currentTarget)\n\n\treturn {\n\t\tnativeHostConnected,\n\t\twatcherReady,\n\t\ttargetReady,\n\t\ttargetState: targetReady == null ? 'not-selected' : targetReady ? 'ready' : 'rebinding',\n\t}\n}\n\n/**\n * The watcher can be connected while a remembered iframe is still rebinding after reload.\n * Treat the extension's live frame map as the source of truth for whether frame-scoped\n * commands have a concrete execution target again.\n */\nfunction getTargetReadiness(debuggerManager: DebuggerManager, tabId: number, target: PopupWatcherStatus['currentTarget']): boolean | null {\n\tif (!target) {\n\t\treturn null\n\t}\n\n\tif (!target.frameId) {\n\t\treturn debuggerManager.isAttached(tabId)\n\t}\n\n\tconst frame = debuggerManager.getFrames(tabId).find((candidate) => candidate.frameId === target.frameId)\n\treturn Boolean(frame?.sessionId)\n}\n", "/**\n * Service Worker - Main entry point for the Argus CDP Bridge extension.\n * Owns one debugger manager plus one Native Messaging bridge session per attached tab,\n * and answers popup messages (see `popup-protocol.ts` for the message shapes).\n */\n\nimport { DebuggerManager } from './debugger-manager.js'\nimport { TabBridgeSession, type TabBridgeSessionOptions } from './tab-bridge-session.js'\nimport { ControlBridgeSession, type TabActionResult } from './control-bridge-session.js'\nimport { type RememberedTargetSelection, TargetSelectionHistoryStore, matchRememberedIframeTarget } from './target-selection-history.js'\nimport { TargetVisibilityHistoryStore, matchesHiddenTarget } from './target-visibility-history.js'\nimport { listBrowserTabs } from './tab-list.js'\nimport { syncActionBadge } from './action-badge.js'\nimport { buildWatcherStatus } from './watcher-status.js'\nimport {\n\tgetPageUrlForTab,\n\tgetPopupTarget,\n\tgetPopupTargets,\n\tgetRequiredIframeTarget,\n\tparseWatcherTargetId,\n\ttoSelectionTarget,\n} from './popup-targets.js'\nimport type {\n\tPopupActionMessage,\n\tPopupEvent,\n\tPopupResponse,\n\tPopupStatusPayload,\n\tPopupTabWithTargets,\n\tPopupTarget,\n\tPopupWatcherStatus,\n} from './popup-protocol.js'\nimport type { ControlDiagnostics, TabInfo } from '../types/messages.js'\n\nconst debuggerManager = new DebuggerManager()\nconst controlBridgeSession = new ControlBridgeSession(debuggerManager, {\n\tonWatcherInfo: (info) => {\n\t\trecordEvent('info', 'bridge', `Control watcher ready: ${info.watcherId} (pid ${info.pid})`)\n\t},\n\tonAttachTabWatcher: attachTabFromControl,\n\tonDetachTabWatcher: detachTabFromControl,\n\tgetWatcherIdForTab,\n\tgetDiagnostics: buildControlDiagnostics,\n\tonDisconnect: () => {\n\t\trecordEvent('error', 'bridge', 'Control native host disconnected')\n\t},\n})\nconst bridgeSessions = new Map<number, TabBridgeSession>()\nconst selectedFrameByTabId = new Map<number, string | null>()\n// Re-try a remembered iframe while Chrome is still populating frame metadata for a fresh attach.\nconst pendingRememberedTargetByTabId = new Map<number, RememberedTargetSelection>()\nconst targetSelectionHistory = new TargetSelectionHistoryStore()\nconst targetVisibilityHistory = new TargetVisibilityHistoryStore()\nconst recentEvents: PopupEvent[] = []\nconst MAX_RECENT_EVENTS = 8\nconst REMEMBERED_TARGET_RETRY_EVENTS = new Set(['Page.frameAttached', 'Page.frameDetached', 'Page.frameNavigated'])\n\nfunction recordEvent(level: PopupEvent['level'], source: PopupEvent['source'], message: string): void {\n\trecentEvents.unshift({\n\t\tts: Date.now(),\n\t\tlevel,\n\t\tsource,\n\t\tmessage,\n\t})\n\n\tif (recentEvents.length > MAX_RECENT_EVENTS) {\n\t\trecentEvents.length = MAX_RECENT_EVENTS\n\t}\n}\n\ndebuggerManager.onDetach((tabId, reason) => {\n\tclearTabState(tabId)\n\trecordEvent('error', 'debugger', `Tab ${tabId} detached: ${reason}`)\n\tvoid syncActionBadge(debuggerManager)\n})\n\ndebuggerManager.onEvent((tabId, method) => {\n\tif (!shouldReplayRememberedTarget(tabId, method)) {\n\t\treturn\n\t}\n\n\tvoid replayRememberedTargetSelection(tabId)\n})\n\nchrome.runtime.onMessage.addListener(\n\t(message: PopupActionMessage, _sender: chrome.runtime.MessageSender, sendResponse: (response: unknown) => void) => {\n\t\tvoid handlePopupMessage(message, sendResponse)\n\t\treturn true\n\t},\n)\n\nchrome.runtime.onStartup.addListener(() => {\n\tensureControlBridgeSession()\n})\n\nchrome.runtime.onInstalled.addListener(() => {\n\tensureControlBridgeSession()\n})\n\nasync function handlePopupMessage(message: PopupActionMessage, sendResponse: (response: unknown) => void): Promise<void> {\n\tensureControlBridgeSession()\n\tpruneStaleBridgeSessions()\n\tconst response = await buildPopupResponse(message)\n\tawait syncActionBadge(debuggerManager)\n\tsendResponse(response)\n}\n\nfunction ensureControlBridgeSession(): void {\n\tif (controlBridgeSession.isConnected()) {\n\t\treturn\n\t}\n\tcontrolBridgeSession.connect()\n}\n\nensureControlBridgeSession()\n\nasync function attachTabFromControl(tabId: number, options: TabBridgeSessionOptions = {}): Promise<TabActionResult> {\n\ttry {\n\t\tconst session = await attachBridgeSession(tabId, options)\n\t\tsetSelectedFrame(tabId, null)\n\t\tawait prepareRememberedTargetSelection(tabId)\n\t\trecordEvent('info', 'bridge', `Control attached tab ${tabId}`)\n\t\tvoid syncActionBadge(debuggerManager)\n\n\t\tconst tab = await getTabInfo(tabId)\n\t\tif (!tab) {\n\t\t\treturn { ok: false, error: `Tab ${tabId} is no longer available` }\n\t\t}\n\n\t\treturn { ok: true, tab, watcherId: session.getWatcherInfo()?.watcherId }\n\t} catch (error) {\n\t\treturn { ok: false, error: error instanceof Error ? error.message : String(error) }\n\t}\n}\n\nasync function detachTabFromControl(tabId: number): Promise<TabActionResult> {\n\ttry {\n\t\tawait detachTab(tabId)\n\t\trecordEvent('info', 'bridge', `Control detached tab ${tabId}`)\n\t\tvoid syncActionBadge(debuggerManager)\n\n\t\tconst tab = await getTabInfo(tabId)\n\t\tif (!tab) {\n\t\t\treturn { ok: false, error: `Tab ${tabId} is no longer available` }\n\t\t}\n\n\t\treturn { ok: true, tab }\n\t} catch (error) {\n\t\treturn { ok: false, error: error instanceof Error ? error.message : String(error) }\n\t}\n}\n\nasync function buildPopupResponse(message: PopupActionMessage): Promise<PopupResponse> {\n\ttry {\n\t\tswitch (message.action) {\n\t\t\tcase 'getTargets':\n\t\t\t\treturn { success: true, tabs: await getTabsWithTargets() }\n\n\t\t\tcase 'attach': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tawait attachBridgeSession(tabId)\n\t\t\t\tsetSelectedFrame(tabId, null)\n\t\t\t\tawait prepareRememberedTargetSelection(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Attached tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'detach': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tawait detachTab(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Detached tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'focusTab': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tawait focusTab(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Focused tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'selectTarget': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tconst session = bridgeSessions.get(tabId)\n\t\t\t\tif (!session) {\n\t\t\t\t\treturn { success: false, error: `No watcher bridge for tab ${tabId}` }\n\t\t\t\t}\n\n\t\t\t\tconst frameId = message.frameId ?? null\n\t\t\t\tconst target = getPopupTarget(debuggerManager, tabId, frameId)\n\t\t\t\tif (!target) {\n\t\t\t\t\treturn { success: false, error: `Unknown target for tab ${tabId}` }\n\t\t\t\t}\n\n\t\t\t\tsession.selectTarget(frameId)\n\t\t\t\tclearPendingRememberedTarget(tabId)\n\t\t\t\tsetSelectedFrame(tabId, frameId)\n\t\t\t\tawait rememberTargetSelection(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Selected ${frameId ? `iframe ${frameId}` : 'page'} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'hideTarget': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tconst target = getRequiredIframeTarget(debuggerManager, tabId, message.frameId ?? null)\n\t\t\t\tawait hideTarget(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Hid iframe ${target.frameId} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'showTarget': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tconst target = getRequiredIframeTarget(debuggerManager, tabId, message.frameId ?? null)\n\t\t\t\tawait showTarget(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Restored iframe ${target.frameId} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'getStatus':\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tstatus: buildPopupStatusPayload(),\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn { success: false, error: `Unknown action: ${message.action}` }\n\t\t}\n\t} catch (err) {\n\t\trecordEvent('error', 'popup', err instanceof Error ? err.message : 'Unknown popup error')\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: err instanceof Error ? err.message : 'Unknown error',\n\t\t}\n\t}\n}\n\nfunction requireTabId(message: PopupActionMessage): number {\n\tif (message.tabId !== undefined) {\n\t\treturn message.tabId\n\t}\n\n\tthrow new Error('No tabId provided')\n}\n\nasync function attachBridgeSession(tabId: number, options: TabBridgeSessionOptions = {}): Promise<TabBridgeSession> {\n\tconst existing = bridgeSessions.get(tabId)\n\tif (existing) {\n\t\tawait connectBridgeSession(tabId, existing)\n\t\treturn existing\n\t}\n\n\tconst session = new TabBridgeSession(\n\t\ttabId,\n\t\tdebuggerManager,\n\t\t{\n\t\t\tonWatcherInfo: (info) => {\n\t\t\t\trecordEvent('info', 'bridge', `Watcher ready for tab ${tabId}: ${info.watcherId} (pid ${info.pid})`)\n\t\t\t},\n\t\t\tonTargetInfo: (info) => {\n\t\t\t\tsyncSelectedFrameFromWatcher(info.targetId)\n\t\t\t},\n\t\t\tonDisconnect: () => {\n\t\t\t\trecordEvent('error', 'bridge', `Native host disconnected for tab ${tabId}`)\n\t\t\t\tvoid debuggerManager.detach(tabId).catch(() => {})\n\t\t\t\tclearTabState(tabId)\n\t\t\t\tvoid syncActionBadge(debuggerManager)\n\t\t\t},\n\t\t},\n\t\toptions,\n\t)\n\tbridgeSessions.set(tabId, session)\n\tawait connectBridgeSession(tabId, session)\n\treturn session\n}\n\nasync function detachTab(tabId: number): Promise<void> {\n\tconst session = bridgeSessions.get(tabId)\n\tif (session) {\n\t\tawait session.detach()\n\t} else {\n\t\tawait debuggerManager.detach(tabId)\n\t}\n\n\tclearTabState(tabId)\n}\n\n/**\n * Activating the tab is not enough when it lives in a background window, so explicitly focus the host window too.\n */\nasync function focusTab(tabId: number): Promise<void> {\n\tconst tab = await chrome.tabs.get(tabId)\n\tawait chrome.tabs.update(tabId, { active: true })\n\tawait chrome.windows.update(tab.windowId, { focused: true })\n}\n\nasync function connectBridgeSession(tabId: number, session: TabBridgeSession): Promise<void> {\n\ttry {\n\t\tawait session.connectAndAttach()\n\t} catch (error) {\n\t\tdestroyBridgeSession(tabId)\n\t\tthrow error\n\t}\n}\n\nfunction clearTabState(tabId: number): void {\n\tselectedFrameByTabId.delete(tabId)\n\tclearPendingRememberedTarget(tabId)\n\tdestroyBridgeSession(tabId)\n}\n\n/**\n * Chrome can drop the root debugger attachment from the infobar while the native host is still\n * alive long enough to keep reporting its last selected target. Trim those orphaned bridge\n * sessions before serving popup state so the badge and popup stay aligned with actual attachments.\n */\nfunction pruneStaleBridgeSessions(): void {\n\tfor (const [tabId, session] of bridgeSessions.entries()) {\n\t\tif (debuggerManager.isAttached(tabId)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!session.getTargetInfo()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tclearTabState(tabId)\n\t\trecordEvent('error', 'bridge', `Pruned stale watcher state for tab ${tabId}`)\n\t}\n}\n\nfunction destroyBridgeSession(tabId: number): void {\n\tconst session = bridgeSessions.get(tabId)\n\tif (!session) {\n\t\treturn\n\t}\n\n\tbridgeSessions.delete(tabId)\n\tsession.dispose()\n}\n\nfunction buildPopupStatusPayload(): PopupStatusPayload {\n\treturn {\n\t\tbridgeConnected: [...bridgeSessions.values()].some((session) => session.isConnected()),\n\t\tattachedTabs: debuggerManager.listAttached().map((target) => ({\n\t\t\ttabId: target.tabId,\n\t\t\turl: target.url,\n\t\t\ttitle: target.title,\n\t\t})),\n\t\twatchers: getWatcherStatuses(),\n\t\trecentEvents,\n\t}\n}\n\nfunction buildControlDiagnostics(): ControlDiagnostics {\n\tconst controlInfo = controlBridgeSession.getWatcherInfo()\n\treturn {\n\t\textensionId: chrome.runtime.id ?? null,\n\t\textensionVersion: chrome.runtime.getManifest().version ?? null,\n\t\tcontrol: {\n\t\t\tconnected: controlBridgeSession.isConnected(),\n\t\t\twatcherId: controlInfo?.watcherId ?? null,\n\t\t\twatcherHost: controlInfo?.watcherHost ?? null,\n\t\t\twatcherPort: controlInfo?.watcherPort ?? null,\n\t\t\tpid: controlInfo?.pid ?? null,\n\t\t\tlastMessageAt: controlBridgeSession.getLastMessageAt(),\n\t\t},\n\t\ttabWatchers: [...bridgeSessions.entries()].map(([tabId, session]) => buildTabBridgeStatus(tabId, session)),\n\t\trecentEvents,\n\t}\n}\n\nfunction buildTabBridgeStatus(tabId: number, session: TabBridgeSession): ControlDiagnostics['tabWatchers'][number] {\n\tconst watcher = session.getWatcherInfo()\n\tconst target = session.getTargetInfo()\n\treturn {\n\t\ttabId,\n\t\tconnected: session.isConnected(),\n\t\twatcherId: watcher?.watcherId ?? null,\n\t\twatcherHost: watcher?.watcherHost ?? null,\n\t\twatcherPort: watcher?.watcherPort ?? null,\n\t\tpid: watcher?.pid ?? null,\n\t\ttargetId: target?.targetId ?? null,\n\t\ttargetTitle: target?.title ?? null,\n\t\ttargetUrl: target?.url ?? null,\n\t\ttargetReady: target?.targetReady ?? null,\n\t\tlastMessageAt: session.getLastMessageAt(),\n\t}\n}\n\nasync function getTabInfo(tabId: number): Promise<TabInfo | null> {\n\tconst tabs = await listBrowserTabs(debuggerManager, undefined, {\n\t\tgetWatcherIdForTab,\n\t})\n\treturn tabs.find((tab) => tab.tabId === tabId) ?? null\n}\n\nfunction getWatcherIdForTab(tabId: number): string | null {\n\treturn bridgeSessions.get(tabId)?.getWatcherInfo()?.watcherId ?? null\n}\n\nfunction getWatcherStatuses(): PopupWatcherStatus[] {\n\treturn [...bridgeSessions.entries()]\n\t\t.map(([tabId, session]) => buildWatcherStatus(debuggerManager, tabId, session))\n\t\t.filter((status): status is PopupWatcherStatus => status !== null)\n}\n\nasync function getTabsWithTargets(): Promise<PopupTabWithTargets[]> {\n\tconst tabs = await listBrowserTabs(debuggerManager)\n\treturn await Promise.all(\n\t\ttabs.map(async (tab) => {\n\t\t\tconst session = bridgeSessions.get(tab.tabId)\n\t\t\tconst { visibleTargets, hiddenTargets } = await getPopupTargetVisibility(tab.tabId, tab.attached)\n\t\t\treturn {\n\t\t\t\t...tab,\n\t\t\t\ttargets: visibleTargets,\n\t\t\t\thiddenTargets,\n\t\t\t\tselectedFrameId: getSelectedFrameId(tab.tabId),\n\t\t\t\twatcher: session ? buildWatcherStatus(debuggerManager, tab.tabId, session) : null,\n\t\t\t}\n\t\t}),\n\t)\n}\n\nasync function getPopupTargetVisibility(tabId: number, attached: boolean): Promise<{ visibleTargets: PopupTarget[]; hiddenTargets: PopupTarget[] }> {\n\tconst targets = attached ? getPopupTargets(debuggerManager, tabId) : []\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn { visibleTargets: targets, hiddenTargets: [] }\n\t}\n\n\tconst hiddenTargets = await filterHiddenTargets(pageUrl, targets)\n\tif (hiddenTargets.length === 0) {\n\t\treturn { visibleTargets: targets, hiddenTargets }\n\t}\n\n\treturn {\n\t\tvisibleTargets: targets.filter((target) => !hiddenTargets.includes(target)),\n\t\thiddenTargets,\n\t}\n}\n\nfunction syncSelectedFrameFromWatcher(targetId: string): void {\n\tconst target = parseWatcherTargetId(targetId)\n\tif (!target) {\n\t\treturn\n\t}\n\n\tsetSelectedFrame(target.tabId, target.frameId)\n}\n\nfunction getSelectedFrameId(tabId: number): string | null | undefined {\n\tif (!selectedFrameByTabId.has(tabId)) {\n\t\treturn undefined\n\t}\n\n\treturn selectedFrameByTabId.get(tabId) ?? null\n}\n\nasync function rememberTargetSelection(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetSelectionHistory.remember(pageUrl, toSelectionTarget(target))\n}\n\nasync function hideTarget(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetVisibilityHistory.hide(pageUrl, toSelectionTarget(target))\n\tif (getSelectedFrameId(tabId) !== target.frameId) {\n\t\treturn\n\t}\n\n\tconst session = bridgeSessions.get(tabId)\n\tsession?.selectTarget(null)\n\tsetSelectedFrame(tabId, null)\n\tconst pageTarget = getPopupTarget(debuggerManager, tabId, null)\n\tif (pageTarget) {\n\t\tawait rememberTargetSelection(tabId, pageTarget)\n\t}\n}\n\nasync function showTarget(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetVisibilityHistory.show(pageUrl, toSelectionTarget(target))\n}\n\nasync function filterHiddenTargets(pageUrl: string, targets: PopupTarget[]): Promise<PopupTarget[]> {\n\tconst hiddenTargets = await targetVisibilityHistory.getHiddenTargets(pageUrl)\n\tif (hiddenTargets.length === 0) {\n\t\treturn []\n\t}\n\n\treturn targets.filter((target) => hiddenTargets.some((hiddenTarget) => matchesHiddenTarget(hiddenTarget, toSelectionTarget(target))))\n}\n\nasync function prepareRememberedTargetSelection(tabId: number): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\tclearPendingRememberedTarget(tabId)\n\t\treturn\n\t}\n\n\tconst remembered = await targetSelectionHistory.getByPageUrl(pageUrl)\n\tif (!remembered || remembered.target.type === 'page') {\n\t\tclearPendingRememberedTarget(tabId)\n\t\treturn\n\t}\n\n\tsetPendingRememberedTarget(tabId, remembered)\n\tawait replayRememberedTargetSelection(tabId)\n}\n\nasync function replayRememberedTargetSelection(tabId: number): Promise<void> {\n\tconst remembered = pendingRememberedTargetByTabId.get(tabId)\n\tconst session = bridgeSessions.get(tabId)\n\tif (!remembered || !session) {\n\t\treturn\n\t}\n\n\tconst target = matchRememberedIframeTarget(\n\t\tremembered,\n\t\tgetPopupTargets(debuggerManager, tabId).map((candidate) => toSelectionTarget(candidate)),\n\t)\n\tif (!target?.frameId) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tsession.selectTarget(target.frameId)\n\t\tsetSelectedFrame(tabId, target.frameId)\n\t\tclearPendingRememberedTarget(tabId)\n\t\trecordEvent('info', 'bridge', `Restored iframe ${target.frameId} on tab ${tabId}`)\n\t} catch (error) {\n\t\tconsole.warn(`[ServiceWorker] Failed to restore remembered iframe for tab ${tabId}:`, error)\n\t}\n}\n\nfunction shouldReplayRememberedTarget(tabId: number, method: string): boolean {\n\treturn pendingRememberedTargetByTabId.has(tabId) && REMEMBERED_TARGET_RETRY_EVENTS.has(method)\n}\n\nfunction setSelectedFrame(tabId: number, frameId: string | null): void {\n\tselectedFrameByTabId.set(tabId, frameId)\n}\n\nfunction setPendingRememberedTarget(tabId: number, remembered: RememberedTargetSelection): void {\n\tpendingRememberedTargetByTabId.set(tabId, remembered)\n}\n\nfunction clearPendingRememberedTarget(tabId: number): void {\n\tpendingRememberedTargetByTabId.delete(tabId)\n}\n\nconsole.log('[ServiceWorker] Argus CDP Bridge extension loaded')\nvoid syncActionBadge(debuggerManager)\n\nexport { debuggerManager, bridgeSessions }\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["debuggerManager", "debuggerManager", "debuggerManager", "debuggerManager", "
|
|
3
|
+
"sources": ["../../src/background/frame-table.ts", "../../src/background/tab-cookies.ts", "../../src/background/debugger-manager.ts", "../../src/background/bridge-client.ts", "../../src/background/cdp-proxy.ts", "../../src/background/native-hosts.ts", "../../src/background/latch.ts", "../../../argus-core/src/protocol/native-messaging.ts", "../../src/background/protocol-handshake.ts", "../../src/background/tab-bridge-session.ts", "../../src/background/tab-list.ts", "../../../argus-core/src/errorMessage.ts", "../../src/background/control-bridge-session.ts", "../../src/background/page-keyed-store.ts", "../../src/background/target-selection-history.ts", "../../src/background/target-visibility-history.ts", "../../src/background/action-badge.ts", "../../src/background/popup-targets.ts", "../../src/background/watcher-status.ts", "../../src/background/service-worker.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Pure frame-table bookkeeping for one attached tab.\n *\n * The extension owns the authoritative frame table (C2 redesign): these helpers mutate it\n * from real CDP events and from `Page.getFrameTree` snapshots, and never emit anything.\n * Publishing the table to the watcher (as a `frame_snapshot` bridge message) is the\n * caller's job \u2014 see `DebuggerManager.emitFramesChangedIfNeeded`.\n */\n\nexport type FrameRecord = {\n\tframeId: string\n\tparentFrameId: string | null\n\turl: string\n\ttitle: string | null\n\tsessionId: string | null\n}\n\nexport type CdpFrameTreeNode = {\n\tframe?: { id?: string; parentId?: string; name?: string; url?: string }\n\tchildFrames?: CdpFrameTreeNode[]\n}\n\n/** The slice of an attached target the frame helpers operate on. */\nexport type FrameTable = {\n\tframes: Map<string, FrameRecord>\n\ttopFrameId: string | null\n\turl: string\n}\n\n/**\n * Merge a full `Page.getFrameTree` result for one session into the table, then prune\n * frames of the same session that no longer exist. Each result is a complete snapshot\n * for that session, so anything missing from it is gone after a reload.\n */\nexport const applyFrameTreeSnapshot = (table: FrameTable, sessionId: string | null, node: CdpFrameTreeNode | undefined): void => {\n\tif (!node?.frame?.id) {\n\t\treturn\n\t}\n\n\tconst nextFrameIds = new Set<string>()\n\tmergeFrameTree(table, sessionId, node, nextFrameIds)\n\tfor (const [frameId, frame] of table.frames.entries()) {\n\t\tif (frame.sessionId === sessionId && !nextFrameIds.has(frameId)) {\n\t\t\ttable.frames.delete(frameId)\n\t\t}\n\t}\n}\n\nconst mergeFrameTree = (table: FrameTable, sessionId: string | null, node: CdpFrameTreeNode | undefined, nextFrameIds: Set<string>): void => {\n\tif (!node?.frame?.id) {\n\t\treturn\n\t}\n\n\tconst frameId = node.frame.id\n\tnextFrameIds.add(frameId)\n\ttable.frames.set(frameId, toFrameRecord(node.frame, sessionId))\n\n\tif (!node.frame.parentId && !sessionId) {\n\t\ttable.topFrameId = frameId\n\t}\n\n\tfor (const child of node.childFrames ?? []) {\n\t\tmergeFrameTree(table, sessionId, child, nextFrameIds)\n\t}\n}\n\n/**\n * Apply one real CDP frame event to the table. Returns true when the event changed\n * frame state (so the caller knows a snapshot publish may be due).\n */\nexport const applyFrameEvent = (table: FrameTable, sessionId: string | null, method: string, params?: object): boolean => {\n\tif (method === 'Page.frameNavigated' && params) {\n\t\tconst frame = (params as { frame?: { id?: string; parentId?: string | null; url?: string; name?: string } }).frame\n\t\tif (!frame?.id) {\n\t\t\treturn false\n\t\t}\n\n\t\ttable.frames.set(frame.id, toFrameRecord(frame, sessionId))\n\n\t\tif (!frame.parentId && !sessionId && frame.url) {\n\t\t\ttable.url = frame.url\n\t\t\ttable.topFrameId = frame.id\n\t\t}\n\t\treturn true\n\t}\n\n\tif (method === 'Page.frameAttached' && params) {\n\t\tconst frame = params as { frameId?: string; parentFrameId?: string }\n\t\tif (!frame.frameId) {\n\t\t\treturn false\n\t\t}\n\n\t\tconst existing = table.frames.get(frame.frameId)\n\t\ttable.frames.set(frame.frameId, {\n\t\t\tframeId: frame.frameId,\n\t\t\tparentFrameId: frame.parentFrameId ?? table.topFrameId,\n\t\t\turl: existing?.url ?? '',\n\t\t\ttitle: existing?.title ?? null,\n\t\t\tsessionId: existing?.sessionId ?? sessionId,\n\t\t})\n\t\treturn true\n\t}\n\n\tif (method === 'Page.frameDetached' && params) {\n\t\tconst frame = params as { frameId?: string }\n\t\tif (!frame.frameId) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn table.frames.delete(frame.frameId)\n\t}\n\n\treturn false\n}\n\n/** Remove every frame owned by a detached child session. Returns true when any were removed. */\nexport const dropSessionFrames = (table: FrameTable, sessionId: string): boolean => {\n\tlet removed = false\n\tfor (const [frameId, frame] of table.frames.entries()) {\n\t\tif (frame.sessionId === sessionId) {\n\t\t\ttable.frames.delete(frameId)\n\t\t\tremoved = true\n\t\t}\n\t}\n\treturn removed\n}\n\n/**\n * Stable serialization of the table used to deduplicate `frame_snapshot` publishes:\n * a resync that changed nothing must not generate bridge traffic.\n */\nexport const serializeFrameTable = (table: FrameTable): string => {\n\tconst frames = [...table.frames.values()].sort((a, b) => a.frameId.localeCompare(b.frameId))\n\treturn JSON.stringify({ topFrameId: table.topFrameId, frames })\n}\n\nconst toFrameRecord = (frame: { id?: string; parentId?: string | null; url?: string; name?: string }, sessionId: string | null): FrameRecord => ({\n\tframeId: frame.id!,\n\tparentFrameId: frame.parentId ?? null,\n\turl: frame.url ?? '',\n\ttitle: frame.name ?? null,\n\tsessionId,\n})\n", "/**\n * Cookie access for an attached tab's cookie store, used by extension-mode auth export to\n * keep sibling subdomain session cookies such as `auth.example.com`.\n */\n\nexport type CookieQuery = {\n\tdomain?: string\n\turl?: string\n}\n\nexport type NativeCookie = {\n\tname: string\n\tvalue: string\n\tdomain: string\n\tpath: string\n\tsecure: boolean\n\thttpOnly: boolean\n\tsession: boolean\n\texpires: number | null\n\tsameSite: string | null\n}\n\n/** Read cookies from the cookie store that owns `tabId` (incognito tabs use a separate store). */\nexport const readTabCookies = async (tabId: number, query: CookieQuery = {}): Promise<NativeCookie[]> => {\n\tconst storeId = await findCookieStoreId(tabId)\n\tconst cookies = await chrome.cookies.getAll({\n\t\tdomain: query.domain,\n\t\tstoreId: storeId ?? undefined,\n\t\turl: query.domain ? undefined : query.url,\n\t})\n\n\treturn cookies.map((cookie) => ({\n\t\tname: cookie.name,\n\t\tvalue: cookie.value,\n\t\tdomain: cookie.domain,\n\t\tpath: cookie.path,\n\t\tsecure: cookie.secure,\n\t\thttpOnly: cookie.httpOnly,\n\t\tsession: cookie.session,\n\t\texpires: typeof cookie.expirationDate === 'number' ? cookie.expirationDate : null,\n\t\tsameSite: cookie.sameSite ?? null,\n\t}))\n}\n\nconst findCookieStoreId = async (tabId: number): Promise<string | null> => {\n\tconst stores = await chrome.cookies.getAllCookieStores()\n\tconst store = stores.find((candidate) => candidate.tabIds.includes(tabId))\n\treturn store?.id ?? null\n}\n", "/**\n * Manages chrome.debugger attachment lifecycle.\n * Handles root tab attachment, recursive child-target auto-attach, frame discovery,\n * and session-aware CDP command routing.\n *\n * Frame bookkeeping contract (C2): this class owns the authoritative frame table per tab\n * (mutated via `frame-table.ts`). Only REAL Chrome CDP events are re-emitted through\n * `onEvent`; snapshot merges and session detaches never fabricate `Page.frameNavigated`/\n * `Page.frameDetached`. Instead, table changes are published through `onFramesChanged`,\n * which the bridge serializes into a `frame_snapshot` message.\n */\n\nimport type { FrameSnapshotReason } from '../types/messages.js'\nimport {\n\tapplyFrameEvent,\n\tapplyFrameTreeSnapshot,\n\tdropSessionFrames,\n\tserializeFrameTable,\n\ttype CdpFrameTreeNode,\n\ttype FrameRecord,\n} from './frame-table.js'\nimport { readTabCookies, type CookieQuery, type NativeCookie } from './tab-cookies.js'\n\ntype ChildSession = {\n\tsessionId: string\n\ttargetId: string\n\ttype: string\n\turl: string\n\ttitle: string\n\tattachedAt: number\n\tenabledDomains: Set<string>\n}\n\ntype DebuggeeWithSession = chrome.debugger.Debuggee & {\n\tsessionId?: string\n}\n\nconst FRAME_TREE_SYNC_DELAY_MS = 150\n\nexport type AttachedTarget = {\n\ttabId: number\n\tdebuggeeId: chrome.debugger.Debuggee\n\turl: string\n\ttitle: string\n\tfaviconUrl?: string\n\tattachedAt: number\n\tenabledDomains: Set<string>\n\tchildSessions: Map<string, ChildSession>\n\tframes: Map<string, FrameRecord>\n\ttopFrameId: string | null\n}\n\nexport type CdpEventHandler = (tabId: number, method: string, params: unknown, meta?: { sessionId?: string | null }) => void\nexport type DebuggerDetachHandler = (tabId: number, reason: string) => void\nexport type FramesChangedHandler = (tabId: number, reason: FrameSnapshotReason) => void\n\n/** Full frame table published to the watcher. */\nexport type FrameSnapshotPayload = {\n\ttopFrameId: string | null\n\tframes: FrameRecord[]\n}\n\nexport class DebuggerManager {\n\tprivate attached = new Map<number, AttachedTarget>()\n\tprivate eventHandlers = new Set<CdpEventHandler>()\n\tprivate detachHandlers = new Set<DebuggerDetachHandler>()\n\tprivate framesChangedHandlers = new Set<FramesChangedHandler>()\n\tprivate frameTreeSyncTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\t/** Last published frame table per tab; publishes that change nothing are suppressed. */\n\tprivate lastPublishedFrames = new Map<number, string>()\n\n\tconstructor() {\n\t\tchrome.debugger.onEvent.addListener((debuggee, method, params) => {\n\t\t\tthis.handleCdpEvent(debuggee, method, params)\n\t\t})\n\n\t\tchrome.debugger.onDetach.addListener((debuggee, reason) => {\n\t\t\tif (debuggee.tabId) {\n\t\t\t\tthis.handleDetach(debuggee.tabId, (debuggee as DebuggeeWithSession).sessionId ?? null, reason)\n\t\t\t}\n\t\t})\n\t}\n\n\tonEvent(handler: CdpEventHandler): () => void {\n\t\tthis.eventHandlers.add(handler)\n\t\treturn () => {\n\t\t\tthis.eventHandlers.delete(handler)\n\t\t}\n\t}\n\n\tonDetach(handler: DebuggerDetachHandler): () => void {\n\t\tthis.detachHandlers.add(handler)\n\t\treturn () => {\n\t\t\tthis.detachHandlers.delete(handler)\n\t\t}\n\t}\n\n\t/** Subscribe to authoritative frame-table changes (deduplicated; see class doc). */\n\tonFramesChanged(handler: FramesChangedHandler): () => void {\n\t\tthis.framesChangedHandlers.add(handler)\n\t\treturn () => {\n\t\t\tthis.framesChangedHandlers.delete(handler)\n\t\t}\n\t}\n\n\tprivate emitEvent(tabId: number, method: string, params: unknown, sessionId: string | null): void {\n\t\tfor (const handler of this.eventHandlers) {\n\t\t\thandler(tabId, method, params, { sessionId })\n\t\t}\n\t}\n\n\tprivate emitDetach(tabId: number, reason: string): void {\n\t\tfor (const handler of this.detachHandlers) {\n\t\t\thandler(tabId, reason)\n\t\t}\n\t}\n\n\tasync attach(tabId: number): Promise<AttachedTarget> {\n\t\tif (this.attached.has(tabId)) {\n\t\t\treturn this.attached.get(tabId)!\n\t\t}\n\n\t\tconst debuggee: chrome.debugger.Debuggee = { tabId }\n\t\tawait chrome.debugger.attach(debuggee, '1.3')\n\n\t\tconst tab = await chrome.tabs.get(tabId)\n\t\tconst target: AttachedTarget = {\n\t\t\ttabId,\n\t\t\tdebuggeeId: debuggee,\n\t\t\turl: tab.url ?? '',\n\t\t\ttitle: tab.title ?? '',\n\t\t\tfaviconUrl: tab.favIconUrl,\n\t\t\tattachedAt: Date.now(),\n\t\t\tenabledDomains: new Set(),\n\t\t\tchildSessions: new Map(),\n\t\t\tframes: new Map(),\n\t\t\ttopFrameId: null,\n\t\t}\n\n\t\tthis.attached.set(tabId, target)\n\t\tawait this.configureAutoAttach(tabId)\n\t\tawait this.refreshFrameTree(tabId, null)\n\t\t// The initial table travels inside tab_attached; prime the publish cache so the\n\t\t// first post-attach resync only publishes when something actually changed.\n\t\tthis.lastPublishedFrames.set(tabId, serializeFrameTable(target))\n\t\treturn target\n\t}\n\n\tasync detach(tabId: number): Promise<void> {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) return\n\n\t\ttry {\n\t\t\tawait chrome.debugger.detach(target.debuggeeId)\n\t\t} catch {\n\t\t\t// Tab may already be closed\n\t\t}\n\t\tthis.attached.delete(tabId)\n\t\tthis.lastPublishedFrames.delete(tabId)\n\t}\n\n\tasync sendCommand<T = unknown>(tabId: number, method: string, params?: Record<string, unknown>, sessionId?: string | null): Promise<T> {\n\t\tconst target = this.getRequiredTarget(tabId)\n\t\tconst debuggee = this.toDebuggee(target, sessionId)\n\t\tconst result = await chrome.debugger.sendCommand(debuggee, method, params)\n\t\treturn result as T\n\t}\n\n\tasync enableDomain(tabId: number, domain: string, sessionId?: string | null): Promise<void> {\n\t\tconst enabledDomains = this.getRequiredEnabledDomains(tabId, sessionId)\n\t\tif (enabledDomains.has(domain)) {\n\t\t\treturn\n\t\t}\n\n\t\tawait this.sendCommand(tabId, `${domain}.enable`, undefined, sessionId)\n\t\tenabledDomains.add(domain)\n\t}\n\n\tisAttached(tabId: number): boolean {\n\t\treturn this.attached.has(tabId)\n\t}\n\n\tlistAttached(): AttachedTarget[] {\n\t\treturn [...this.attached.values()]\n\t}\n\n\tgetTarget(tabId: number): AttachedTarget | undefined {\n\t\treturn this.attached.get(tabId)\n\t}\n\n\tgetFrames(tabId: number): FrameRecord[] {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn []\n\t\t}\n\n\t\treturn [...target.frames.values()]\n\t}\n\n\t/** Current authoritative frame table for a tab, in `frame_snapshot` payload shape. */\n\tgetFrameSnapshot(tabId: number): FrameSnapshotPayload {\n\t\treturn {\n\t\t\ttopFrameId: this.attached.get(tabId)?.topFrameId ?? null,\n\t\t\tframes: this.getFrames(tabId),\n\t\t}\n\t}\n\n\t/**\n\t * Re-read `Page.getFrameTree` for the root and every child session, then return the\n\t * fresh table. Serves `frame_snapshot_request { refresh: true }` (bootstrap and target\n\t * recovery on the watcher side). Marks the result as published \u2014 the caller ships it\n\t * as the request's reply, so no push should follow for the same state.\n\t */\n\tasync resyncFrames(tabId: number): Promise<FrameSnapshotPayload> {\n\t\tconst target = this.getRequiredTarget(tabId)\n\t\tawait this.refreshFrameTree(tabId, null)\n\t\tfor (const sessionId of target.childSessions.keys()) {\n\t\t\ttry {\n\t\t\t\tawait this.refreshFrameTree(tabId, sessionId)\n\t\t\t} catch {\n\t\t\t\t// A child session can die mid-resync (iframe removed); its frames are pruned on detach.\n\t\t\t}\n\t\t}\n\t\tthis.lastPublishedFrames.set(tabId, serializeFrameTable(target))\n\t\treturn this.getFrameSnapshot(tabId)\n\t}\n\n\t/** Read cookies from the attached tab's cookie store (see tab-cookies.ts). */\n\tasync getCookies(tabId: number, query: CookieQuery = {}): Promise<NativeCookie[]> {\n\t\tthis.getRequiredTarget(tabId)\n\t\treturn readTabCookies(tabId, query)\n\t}\n\n\tprivate async configureAutoAttach(tabId: number, sessionId?: string | null): Promise<void> {\n\t\tawait this.sendCommand(\n\t\t\ttabId,\n\t\t\t'Target.setAutoAttach',\n\t\t\t{\n\t\t\t\tautoAttach: true,\n\t\t\t\twaitForDebuggerOnStart: false,\n\t\t\t\tflatten: true,\n\t\t\t\tfilter: [{ type: 'iframe', exclude: false }],\n\t\t\t},\n\t\t\tsessionId,\n\t\t)\n\t}\n\n\tprivate getEnabledDomains(tabId: number, sessionId?: string | null): Set<string> | null {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn null\n\t\t}\n\n\t\tif (!sessionId) {\n\t\t\treturn target.enabledDomains\n\t\t}\n\n\t\treturn target.childSessions.get(sessionId)?.enabledDomains ?? null\n\t}\n\n\tprivate getRequiredTarget(tabId: number): AttachedTarget {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\tthrow new Error(`Tab ${tabId} is not attached`)\n\t\t}\n\t\treturn target\n\t}\n\n\tprivate getRequiredEnabledDomains(tabId: number, sessionId?: string | null): Set<string> {\n\t\tconst enabledDomains = this.getEnabledDomains(tabId, sessionId)\n\t\tif (!enabledDomains) {\n\t\t\tthrow new Error(`Tab ${tabId} is not attached`)\n\t\t}\n\t\treturn enabledDomains\n\t}\n\n\tprivate toDebuggee(target: AttachedTarget, sessionId?: string | null): chrome.debugger.Debuggee {\n\t\tif (!sessionId) {\n\t\t\treturn target.debuggeeId\n\t\t}\n\n\t\treturn { tabId: target.tabId, sessionId } as chrome.debugger.Debuggee\n\t}\n\n\tprivate handleCdpEvent(debuggee: chrome.debugger.Debuggee, method: string, params?: object): void {\n\t\tconst tabId = debuggee.tabId\n\t\tif (!tabId || !this.attached.has(tabId)) return\n\n\t\tconst sessionId = (debuggee as DebuggeeWithSession).sessionId ?? null\n\t\tif (method === 'Target.attachedToTarget' && params) {\n\t\t\tvoid this.handleAttachedToTarget(tabId, params)\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Target.detachedFromTarget' && params) {\n\t\t\tthis.handleDetachedFromTarget(tabId, params)\n\t\t\treturn\n\t\t}\n\n\t\tthis.updateStateFromEvent(tabId, sessionId, method, params)\n\t\tthis.emitEvent(tabId, method, params ?? {}, sessionId)\n\t\tthis.scheduleFrameTreeSyncIfNeeded(tabId, sessionId, method, params)\n\t}\n\n\tprivate async handleAttachedToTarget(tabId: number, params: object): Promise<void> {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst record = params as {\n\t\t\tsessionId?: string\n\t\t\ttargetInfo?: { targetId?: string; type?: string; title?: string; url?: string }\n\t\t}\n\t\tif (!record.sessionId) {\n\t\t\treturn\n\t\t}\n\n\t\ttarget.childSessions.set(record.sessionId, {\n\t\t\tsessionId: record.sessionId,\n\t\t\ttargetId: record.targetInfo?.targetId ?? record.sessionId,\n\t\t\ttype: record.targetInfo?.type ?? 'unknown',\n\t\t\turl: record.targetInfo?.url ?? '',\n\t\t\ttitle: record.targetInfo?.title ?? '',\n\t\t\tattachedAt: Date.now(),\n\t\t\tenabledDomains: new Set(),\n\t\t})\n\n\t\ttry {\n\t\t\tawait this.configureAutoAttach(tabId, record.sessionId)\n\t\t\tawait this.enableChildSessionDomains(tabId, record.sessionId)\n\t\t\tawait this.refreshFrameTree(tabId, record.sessionId)\n\t\t\tthis.emitFramesChangedIfNeeded(tabId, 'child_attached')\n\t\t} catch (error) {\n\t\t\tconsole.warn('[DebuggerManager] Failed to bootstrap child target:', error)\n\t\t}\n\t}\n\n\tprivate async enableChildSessionDomains(tabId: number, sessionId: string): Promise<void> {\n\t\t// Keep child sessions aligned with the root tab so watcher features can observe iframe traffic too.\n\t\tfor (const domain of ['Runtime', 'Page', 'Network'] as const) {\n\t\t\tawait this.enableDomain(tabId, domain, sessionId)\n\t\t}\n\t}\n\n\tprivate handleDetachedFromTarget(tabId: number, params: object): void {\n\t\tconst record = params as { sessionId?: string }\n\t\tif (!record.sessionId) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearFrameTreeSync(record.sessionId, tabId)\n\t\tthis.dropChildSession(tabId, record.sessionId)\n\t}\n\n\tprivate async refreshFrameTree(tabId: number, sessionId: string | null): Promise<void> {\n\t\tconst result = (await this.sendCommand(tabId, 'Page.getFrameTree', undefined, sessionId)) as { frameTree?: CdpFrameTreeNode }\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\t\tapplyFrameTreeSnapshot(target, sessionId, result.frameTree)\n\t}\n\n\tprivate updateStateFromEvent(tabId: number, sessionId: string | null, method: string, params?: object): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tif (applyFrameEvent(target, sessionId, method, params)) {\n\t\t\t// The real event is re-emitted right after this and the watcher applies it too,\n\t\t\t// so the resulting table is state the watcher already knows: fold it into the\n\t\t\t// publish cache so the next snapshot publish diffs against what the watcher has.\n\t\t\tthis.lastPublishedFrames.set(tabId, serializeFrameTable(target))\n\t\t}\n\t}\n\n\t/** Publish the tab's frame table through onFramesChanged, unless it matches the last publish. */\n\tprivate emitFramesChangedIfNeeded(tabId: number, reason: FrameSnapshotReason): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst serialized = serializeFrameTable(target)\n\t\tif (this.lastPublishedFrames.get(tabId) === serialized) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.lastPublishedFrames.set(tabId, serialized)\n\t\tfor (const handler of this.framesChangedHandlers) {\n\t\t\thandler(tabId, reason)\n\t\t}\n\t}\n\n\t/**\n\t * Chrome's frame attach/detach events during reload are not always complete. When the root frame\n\t * for a session navigates, refresh that session's full frame tree shortly afterward and treat it\n\t * as authoritative so stale iframe records do not linger in extension state.\n\t */\n\tprivate scheduleFrameTreeSyncIfNeeded(tabId: number, sessionId: string | null, method: string, params?: object): void {\n\t\tif (!shouldSyncFrameTreeSnapshot(method, params)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst key = getFrameTreeSyncKey(tabId, sessionId)\n\t\tif (this.frameTreeSyncTimers.has(key)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.frameTreeSyncTimers.delete(key)\n\t\t\tvoid this.refreshFrameTree(tabId, sessionId)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.emitFramesChangedIfNeeded(tabId, 'navigation_resync')\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.warn('[DebuggerManager] Failed to refresh frame tree after navigation:', error)\n\t\t\t\t})\n\t\t}, FRAME_TREE_SYNC_DELAY_MS)\n\n\t\tthis.frameTreeSyncTimers.set(key, timer)\n\t}\n\n\tprivate clearFrameTreeSync(sessionId: string | null, tabId: number): void {\n\t\tconst key = getFrameTreeSyncKey(tabId, sessionId)\n\t\tconst timer = this.frameTreeSyncTimers.get(key)\n\t\tif (!timer) {\n\t\t\treturn\n\t\t}\n\n\t\tclearTimeout(timer)\n\t\tthis.frameTreeSyncTimers.delete(key)\n\t}\n\n\tprivate clearAllFrameTreeSync(tabId: number): void {\n\t\tfor (const [key, timer] of this.frameTreeSyncTimers.entries()) {\n\t\t\tif (!key.startsWith(`${tabId}:`)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tclearTimeout(timer)\n\t\t\tthis.frameTreeSyncTimers.delete(key)\n\t\t}\n\t}\n\n\tprivate handleDetach(tabId: number, sessionId: string | null, reason: string): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearFrameTreeSync(sessionId, tabId)\n\n\t\tif (sessionId) {\n\t\t\tthis.dropChildSession(tabId, sessionId)\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearAllFrameTreeSync(tabId)\n\t\tthis.attached.delete(tabId)\n\t\tthis.lastPublishedFrames.delete(tabId)\n\t\tthis.emitDetach(tabId, reason)\n\t}\n\n\tprivate dropChildSession(tabId: number, sessionId: string): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\ttarget.childSessions.delete(sessionId)\n\t\tif (dropSessionFrames(target, sessionId)) {\n\t\t\tthis.emitFramesChangedIfNeeded(tabId, 'child_detached')\n\t\t}\n\t}\n}\n\nfunction shouldSyncFrameTreeSnapshot(method: string, params?: object): boolean {\n\tif (method !== 'Page.frameNavigated' || !params) {\n\t\treturn false\n\t}\n\n\tconst frame = (params as { frame?: { parentId?: string | null } }).frame\n\treturn frame?.parentId == null\n}\n\nfunction getFrameTreeSyncKey(tabId: number, sessionId: string | null): string {\n\treturn `${tabId}:${sessionId ?? 'root'}`\n}\n", "/**\n * Native Messaging client for communicating with argus-watcher (extension mode).\n * Handles connection lifecycle, message serialization, and reconnection.\n */\n\nimport type { ExtensionToHost, HostToExtension } from '../types/messages.js'\n\nexport type MessageHandler<Inbound> = (message: Inbound) => void\nexport type ConnectionHandler = () => void\nexport type BridgeClientOptions = {\n\tautoReconnect?: boolean\n}\n\nexport class BridgeClient<Inbound = HostToExtension, Outbound = ExtensionToHost> {\n\tprivate port: chrome.runtime.Port | null = null\n\tprivate hostName: string\n\tprivate messageHandlers = new Set<MessageHandler<Inbound>>()\n\tprivate disconnectHandler: ConnectionHandler | null = null\n\tprivate reconnectAttempts = 0\n\tprivate maxReconnectAttempts = 5\n\tprivate reconnectDelay = 1000\n\tprivate autoReconnect: boolean\n\tprivate reconnectEnabled = true\n\n\tconstructor(hostName: string = 'com.vforsh.argus.bridge', options: BridgeClientOptions = {}) {\n\t\tthis.hostName = hostName\n\t\tthis.autoReconnect = options.autoReconnect ?? true\n\t}\n\n\t/**\n\t * Set handler for incoming messages from the host.\n\t */\n\tonMessage(handler: MessageHandler<Inbound>): void {\n\t\tthis.messageHandlers.add(handler)\n\t}\n\n\t/**\n\t * Set handler for disconnection.\n\t */\n\tonDisconnect(handler: ConnectionHandler): void {\n\t\tthis.disconnectHandler = handler\n\t}\n\n\t/**\n\t * Connect to the Native Messaging host.\n\t */\n\tconnect(): boolean {\n\t\tif (this.port) {\n\t\t\treturn true // Already connected\n\t\t}\n\n\t\tthis.reconnectEnabled = true\n\n\t\ttry {\n\t\t\tthis.port = chrome.runtime.connectNative(this.hostName)\n\n\t\t\tthis.port.onMessage.addListener((message: Inbound) => {\n\t\t\t\tthis.reconnectAttempts = 0 // Reset on successful message\n\t\t\t\tfor (const handler of this.messageHandlers) {\n\t\t\t\t\thandler(message)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tthis.port.onDisconnect.addListener(() => {\n\t\t\t\tconst error = chrome.runtime.lastError\n\t\t\t\tconsole.log('[BridgeClient] Disconnected:', error?.message ?? 'unknown reason')\n\n\t\t\t\tthis.port = null\n\n\t\t\t\tif (this.disconnectHandler) {\n\t\t\t\t\tthis.disconnectHandler()\n\t\t\t\t}\n\n\t\t\t\t// Attempt reconnection\n\t\t\t\tthis.scheduleReconnect()\n\t\t\t})\n\n\t\t\tconsole.log('[BridgeClient] Connected to', this.hostName)\n\t\t\tthis.reconnectAttempts = 0\n\n\t\t\treturn true\n\t\t} catch (err) {\n\t\t\tconsole.error('[BridgeClient] Failed to connect:', err)\n\t\t\tthis.scheduleReconnect()\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from the Native Messaging host.\n\t */\n\tdisconnect(): void {\n\t\tthis.reconnectEnabled = false\n\t\tif (this.port) {\n\t\t\tthis.port.disconnect()\n\t\t\tthis.port = null\n\t\t}\n\t}\n\n\t/**\n\t * Send a message to the Native Messaging host.\n\t */\n\tsend(message: Outbound): boolean {\n\t\tif (!this.port) {\n\t\t\tconsole.warn('[BridgeClient] Cannot send, not connected')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.port.postMessage(message)\n\t\t\treturn true\n\t\t} catch (err) {\n\t\t\tconsole.error('[BridgeClient] Send failed:', err)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Check if connected to the host.\n\t */\n\tisConnected(): boolean {\n\t\treturn this.port !== null\n\t}\n\n\t/**\n\t * Schedule a reconnection attempt with exponential backoff.\n\t */\n\tprivate scheduleReconnect(): void {\n\t\tif (!this.autoReconnect || !this.reconnectEnabled) {\n\t\t\treturn\n\t\t}\n\n\t\tif (this.reconnectAttempts >= this.maxReconnectAttempts) {\n\t\t\tconsole.log('[BridgeClient] Max reconnection attempts reached')\n\t\t\treturn\n\t\t}\n\n\t\tconst delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts)\n\t\tthis.reconnectAttempts++\n\n\t\tconsole.log(`[BridgeClient] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`)\n\n\t\tsetTimeout(() => {\n\t\t\tthis.connect()\n\t\t}, delay)\n\t}\n}\n", "/**\n * CDP Proxy - Routes CDP commands and events between the Native Messaging\n * host (argus-watcher in extension mode) and the chrome.debugger API.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { BridgeClient } from './bridge-client.js'\nimport type {\n\tCdpCommandMessage,\n\tDetachTabMessage,\n\tCookieQueryMessage,\n\tExtensionToTabHost,\n\tFrameSnapshotRequestMessage,\n\tTabHostToExtension,\n} from '../types/messages.js'\n\nexport class CdpProxy {\n\tprivate debuggerManager: DebuggerManager\n\tprivate bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>\n\tprivate removeDebuggerEventForwarding: (() => void) | null = null\n\tprivate removeDebuggerDetachForwarding: (() => void) | null = null\n\tprivate removeFramesChangedForwarding: (() => void) | null = null\n\n\tconstructor(debuggerManager: DebuggerManager, bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>) {\n\t\tthis.debuggerManager = debuggerManager\n\t\tthis.bridgeClient = bridgeClient\n\n\t\tthis.setupEventForwarding()\n\t\tthis.setupMessageHandling()\n\t}\n\n\t/**\n\t * Forward CDP events from debugger to bridge.\n\t */\n\tprivate setupEventForwarding(): void {\n\t\tthis.removeDebuggerEventForwarding = this.debuggerManager.onEvent((tabId, method, params, meta) => {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_event',\n\t\t\t\ttabId,\n\t\t\t\tmethod,\n\t\t\t\tparams,\n\t\t\t\tsessionId: meta?.sessionId ?? undefined,\n\t\t\t})\n\t\t})\n\n\t\tthis.removeDebuggerDetachForwarding = this.debuggerManager.onDetach((tabId, reason) => {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_detached',\n\t\t\t\ttabId,\n\t\t\t\treason,\n\t\t\t})\n\t\t})\n\n\t\t// The authoritative frame table travels as full snapshots, never as fabricated\n\t\t// Page.frameNavigated/frameDetached events. The watcher filters by tabId.\n\t\tthis.removeFramesChangedForwarding = this.debuggerManager.onFramesChanged((tabId, reason) => {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'frame_snapshot',\n\t\t\t\ttabId,\n\t\t\t\treason,\n\t\t\t\t...this.debuggerManager.getFrameSnapshot(tabId),\n\t\t\t})\n\t\t})\n\t}\n\n\tdispose(): void {\n\t\tthis.removeDebuggerEventForwarding?.()\n\t\tthis.removeDebuggerEventForwarding = null\n\t\tthis.removeDebuggerDetachForwarding?.()\n\t\tthis.removeDebuggerDetachForwarding = null\n\t\tthis.removeFramesChangedForwarding?.()\n\t\tthis.removeFramesChangedForwarding = null\n\t}\n\n\t/**\n\t * Handle messages from the bridge.\n\t */\n\tprivate setupMessageHandling(): void {\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tvoid this.handleMessage(message).catch((error) => {\n\t\t\t\tconsole.error('[CdpProxy] Failed to handle bridge message:', error)\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Process a message from the bridge.\n\t */\n\tprivate async handleMessage(message: TabHostToExtension): Promise<void> {\n\t\tswitch (message.type) {\n\t\t\tcase 'detach_tab':\n\t\t\t\tawait this.handleDetachTab(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'cdp_command':\n\t\t\t\tawait this.handleCdpCommand(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'cookie_query':\n\t\t\t\tawait this.handleCookieQuery(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'frame_snapshot_request':\n\t\t\t\tawait this.handleFrameSnapshotRequest(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'host_info':\n\t\t\tcase 'host_ready':\n\t\t\tcase 'target_info':\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn('[CdpProxy] Unknown message type:', (message as { type: string }).type)\n\t\t}\n\t}\n\n\t/**\n\t * Attach to a tab (driven by the popup; the host never requests attachment).\n\t */\n\tasync attachTab(tabId: number): Promise<void> {\n\t\ttry {\n\t\t\tconst target = await this.debuggerManager.attach(tabId)\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_attached',\n\t\t\t\ttabId: target.tabId,\n\t\t\t\turl: target.url,\n\t\t\t\ttitle: target.title,\n\t\t\t\tfaviconUrl: target.faviconUrl,\n\t\t\t\ttopFrameId: target.topFrameId,\n\t\t\t\tframes: this.debuggerManager.getFrames(target.tabId),\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tconsole.error('[CdpProxy] Failed to attach:', err)\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_detached',\n\t\t\t\ttabId,\n\t\t\t\treason: err instanceof Error ? err.message : 'attach_failed',\n\t\t\t})\n\t\t\tthrow err\n\t\t}\n\t}\n\n\t/**\n\t * Detach from a tab.\n\t */\n\tprivate async handleDetachTab(message: DetachTabMessage): Promise<void> {\n\t\tawait this.debuggerManager.detach(message.tabId)\n\t}\n\n\t/**\n\t * Execute a CDP command.\n\t */\n\tprivate async handleCdpCommand(message: CdpCommandMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await this.debuggerManager.sendCommand(message.tabId, message.method, message.params, message.sessionId)\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\tresult,\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: err instanceof Error ? err.message : 'Unknown error',\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Answer a watcher pull for the frame table. With `refresh` the table is re-read from\n\t * Chrome first; either way the reply is the full current table, so applying it is\n\t * idempotent on the watcher side.\n\t */\n\tprivate async handleFrameSnapshotRequest(message: FrameSnapshotRequestMessage): Promise<void> {\n\t\tlet snapshot\n\t\ttry {\n\t\t\tsnapshot = message.refresh ? await this.debuggerManager.resyncFrames(message.tabId) : this.debuggerManager.getFrameSnapshot(message.tabId)\n\t\t} catch {\n\t\t\t// Tab not attached (or resync raced a detach); answer with what we have so the\n\t\t\t// watcher's request resolves instead of timing out.\n\t\t\tsnapshot = this.debuggerManager.getFrameSnapshot(message.tabId)\n\t\t}\n\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'frame_snapshot',\n\t\t\ttabId: message.tabId,\n\t\t\treason: 'requested',\n\t\t\trequestId: message.requestId,\n\t\t\t...snapshot,\n\t\t})\n\t}\n\n\t/**\n\t * Query browser cookies from the attached tab's cookie store.\n\t */\n\tprivate async handleCookieQuery(message: CookieQueryMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst cookies = await this.debuggerManager.getCookies(message.tabId, {\n\t\t\t\tdomain: message.domain,\n\t\t\t\turl: message.url,\n\t\t\t})\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cookie_query_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\tcookies,\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cookie_query_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: err instanceof Error ? err.message : 'Unknown error',\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Manually detach from a tab (called from popup).\n\t */\n\tasync detachTab(tabId: number): Promise<void> {\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'tab_detached',\n\t\t\ttabId,\n\t\t\treason: 'user_requested',\n\t\t})\n\t\tawait this.debuggerManager.detach(tabId)\n\t}\n}\n", "export const BRIDGE_HOST_NAME = 'com.vforsh.argus.bridge'\nexport const CONTROL_HOST_NAME = 'com.vforsh.argus.control'\n", "/**\n * A one-shot latch: callers await a signal that fires at most once.\n *\n * Once {@link Latch.signal} has been called the latch stays open, so later `wait()`\n * calls resolve immediately. Pending waiters are dropped on timeout, so a timed-out\n * wait leaves no listener behind.\n */\nexport type Latch = {\n\t/** Whether {@link Latch.signal} has already fired. */\n\treadonly isOpen: boolean\n\t/** Resolve once the latch is open, or reject with `timeoutMessage` after `timeoutMs`. */\n\twait: (timeoutMs: number, timeoutMessage: string) => Promise<void>\n\t/** Open the latch and release every pending waiter. Idempotent. */\n\tsignal: () => void\n}\n\n/** Create a {@link Latch}. */\nexport const createLatch = (): Latch => {\n\tlet open = false\n\tlet waiters: Array<() => void> = []\n\n\treturn {\n\t\tget isOpen(): boolean {\n\t\t\treturn open\n\t\t},\n\n\t\twait: (timeoutMs, timeoutMessage) => {\n\t\t\tif (open) {\n\t\t\t\treturn Promise.resolve()\n\t\t\t}\n\n\t\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\t\tconst onOpen = (): void => {\n\t\t\t\t\tclearTimeout(timer)\n\t\t\t\t\tresolve()\n\t\t\t\t}\n\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\twaiters = waiters.filter((waiter) => waiter !== onOpen)\n\t\t\t\t\treject(new Error(timeoutMessage))\n\t\t\t\t}, timeoutMs)\n\t\t\t\twaiters.push(onOpen)\n\t\t\t})\n\t\t},\n\n\t\tsignal: () => {\n\t\t\topen = true\n\t\t\tconst pending = waiters\n\t\t\twaiters = []\n\t\t\tfor (const waiter of pending) {\n\t\t\t\twaiter()\n\t\t\t}\n\t\t},\n\t}\n}\n", "/**\n * Native Messaging wire protocol shared by the Chrome extension and argus-watcher.\n *\n * This module is the single definition of the extension <-> watcher contract. The two\n * peers ship as independently versioned npm packages, so a field added on one side and\n * forgotten on the other would compile cleanly and only fail at runtime in a user's\n * Chrome \u2014 importing both ends from here makes that a compile error instead.\n *\n * The extension bundles this with esbuild: keep it types plus erasable constants only,\n * so the extension's no-runtime-dependencies property survives.\n */\n\n/**\n * Version of the native-messaging wire contract.\n *\n * Bump on any breaking change to the message shapes below. Peers exchange it in the\n * `host_info` handshake and refuse to proceed on a mismatch.\n */\nexport const NATIVE_MESSAGING_PROTOCOL_VERSION = 2 as const\n\n/** Type-level alias for the current native-messaging protocol version. */\nexport type NativeMessagingProtocolVersion = typeof NATIVE_MESSAGING_PROTOCOL_VERSION\n\n// ============================================================\n// Extension -> Host messages\n// ============================================================\n\nexport type TabAttachedMessage = {\n\ttype: 'tab_attached'\n\ttabId: number\n\turl: string\n\ttitle: string\n\tfaviconUrl?: string\n\ttopFrameId?: string | null\n\tframes?: FrameSnapshot[]\n}\n\nexport type TabDetachedMessage = {\n\ttype: 'tab_detached'\n\ttabId: number\n\treason: string\n}\n\nexport type CdpEventMessage = {\n\ttype: 'cdp_event'\n\ttabId: number\n\tmethod: string\n\tparams: unknown\n\tsessionId?: string\n}\n\n/** Why the extension published a frame snapshot; informational (diagnostics/logs only). */\nexport type FrameSnapshotReason = 'navigation_resync' | 'child_attached' | 'child_detached' | 'requested'\n\n/**\n * Authoritative frame table for one attached tab, pushed by the extension whenever its\n * table changes and returned in response to {@link FrameSnapshotRequestMessage}.\n *\n * `frames` is always the FULL table for the tab (never a delta) so applying a snapshot is\n * idempotent: the watcher replaces its copy wholesale instead of replaying synthetic\n * `Page.frameNavigated`/`Page.frameDetached` events. Real CDP events still flow as\n * `cdp_event` and remain the immediate-reaction channel; snapshots are the reconciliation.\n */\nexport type FrameSnapshotMessage = {\n\ttype: 'frame_snapshot'\n\ttabId: number\n\ttopFrameId: string | null\n\tframes: FrameSnapshot[]\n\treason: FrameSnapshotReason\n\t/** Present when this snapshot answers a `frame_snapshot_request`; absent on pushes. */\n\trequestId?: number\n}\n\n/**\n * Host -> extension pull for the current frame table (bootstrap and target recovery).\n * With `refresh: true` the extension re-reads `Page.getFrameTree` for the root and every\n * child session before answering, so the reply reflects Chrome, not just cached state.\n */\nexport type FrameSnapshotRequestMessage = {\n\ttype: 'frame_snapshot_request'\n\trequestId: number\n\ttabId: number\n\trefresh?: boolean\n}\n\nexport type CdpResponseMessage = {\n\ttype: 'cdp_response'\n\trequestId: number\n\tresult?: unknown\n\terror?: { code?: number; message: string }\n}\n\nexport type CookieQueryResponseMessage = {\n\ttype: 'cookie_query_response'\n\trequestId: number\n\tcookies?: NativeCookie[]\n\terror?: { message: string }\n}\n\nexport type ListTabsResponseMessage = {\n\ttype: 'list_tabs_response'\n\trequestId: number\n\ttabs: TabInfo[]\n}\n\nexport type TabActionResponseMessage = {\n\ttype: 'tab_action_response'\n\trequestId: number\n\tok: boolean\n\ttab?: TabInfo\n\twatcherId?: string\n\terror?: { message: string }\n}\n\n/**\n * Outcome of a control-host tab action, as both peers model it in memory.\n *\n * This is the discriminated form of {@link TabActionResponseMessage}, whose `ok`/`tab`/\n * `error` fields are independently optional on the wire. Producers build this and\n * serialize it; consumers reconstruct it on receipt.\n */\nexport type TabActionResult = { ok: true; tab: TabInfo; watcherId?: string } | { ok: false; error: string }\n\nexport type ControlStatusResponseMessage = {\n\ttype: 'control_status_response'\n\trequestId: number\n\tdiagnostics: ControlDiagnostics\n}\n\nexport type TargetSelectedMessage = {\n\ttype: 'target_selected'\n\ttabId: number\n\tframeId?: string | null\n}\n\nexport type HostInfoMessage = {\n\ttype: 'host_info'\n\twatcherId: string\n\twatcherHost: string\n\twatcherPort: number\n\tpid: number\n\t/**\n\t * Native-messaging protocol version the host was built against.\n\t *\n\t * Absent when an older watcher predates the handshake \u2014 treat that as an\n\t * unknown, incompatible version rather than as a match.\n\t */\n\tprotocolVersion?: NativeMessagingProtocolVersion\n}\n\nexport type HostReadyMessage = {\n\ttype: 'host_ready'\n}\n\nexport type TargetInfoMessage = {\n\ttype: 'target_info'\n\ttargetId: string\n\ttitle: string | null\n\turl: string | null\n\tattachedAt: number\n\ttargetReady?: boolean | null\n}\n\nexport type InitTabWatcherMessage = {\n\ttype: 'init_tab_watcher'\n\twatcherId?: string\n}\n\nexport type TabInfo = {\n\ttabId: number\n\turl: string\n\ttitle: string\n\tfaviconUrl?: string\n\tattached: boolean\n\twatcherId?: string\n}\n\n/** Runtime state of the extension-level control bridge. */\nexport type ExtensionControlBridgeStatus = {\n\tconnected: boolean\n\twatcherId: string | null\n\twatcherHost: string | null\n\twatcherPort: number | null\n\tpid: number | null\n\tlastMessageAt: number | null\n}\n\n/** Runtime state for one tab-scoped extension watcher bridge. */\nexport type ExtensionTabBridgeStatus = {\n\ttabId: number\n\tconnected: boolean\n\twatcherId: string | null\n\twatcherHost: string | null\n\twatcherPort: number | null\n\tpid: number | null\n\ttargetId: string | null\n\ttargetTitle: string | null\n\ttargetUrl: string | null\n\ttargetReady: boolean | null\n\tlastMessageAt: number | null\n}\n\n/** Recent extension-side event surfaced for diagnostics. */\nexport type ExtensionRecentEvent = {\n\tts: number\n\tlevel: 'info' | 'error'\n\tsource: 'popup' | 'bridge' | 'debugger'\n\tmessage: string\n}\n\n/**\n * Diagnostics snapshot the extension reports over the control bridge.\n *\n * `GET /extension/diagnostics` reshapes this into {@link ExtensionDiagnosticsResponse};\n * both use the same member types so a diagnostics change lands in one place.\n */\nexport type ControlDiagnostics = {\n\textensionId: string | null\n\textensionVersion: string | null\n\tcontrol: ExtensionControlBridgeStatus\n\ttabWatchers: ExtensionTabBridgeStatus[]\n\trecentEvents: ExtensionRecentEvent[]\n}\n\nexport type FrameSnapshot = {\n\tframeId: string\n\tparentFrameId: string | null\n\turl: string\n\ttitle: string | null\n\tsessionId: string | null\n}\n\nexport type NativeCookie = {\n\tname: string\n\tvalue: string\n\tdomain: string\n\tpath: string\n\tsecure: boolean\n\thttpOnly: boolean\n\tsession: boolean\n\texpires: number | null\n\tsameSite: string | null\n}\n\nexport type ExtensionToHost =\n\t| TabAttachedMessage\n\t| TabDetachedMessage\n\t| CdpEventMessage\n\t| CdpResponseMessage\n\t| CookieQueryResponseMessage\n\t| TargetSelectedMessage\n\t| FrameSnapshotMessage\n\nexport type ExtensionToControlHost = ListTabsResponseMessage | TabActionResponseMessage | ControlStatusResponseMessage\n\nexport type ExtensionToTabHost = ExtensionToHost | InitTabWatcherMessage\n\n// ============================================================\n// Host -> Extension messages\n// ============================================================\n\nexport type AttachTabWatcherMessage = {\n\ttype: 'attach_tab_watcher'\n\trequestId: number\n\ttabId: number\n\twatcherId?: string\n}\n\nexport type DetachTabWatcherMessage = {\n\ttype: 'detach_tab_watcher'\n\trequestId: number\n\ttabId: number\n}\n\nexport type DetachTabMessage = {\n\ttype: 'detach_tab'\n\ttabId: number\n}\n\nexport type CdpCommandMessage = {\n\ttype: 'cdp_command'\n\trequestId: number\n\ttabId: number\n\tmethod: string\n\tparams?: Record<string, unknown>\n\tsessionId?: string\n}\n\nexport type ListTabsMessage = {\n\ttype: 'list_tabs'\n\trequestId: number\n\tfilter?: {\n\t\turl?: string\n\t\ttitle?: string\n\t}\n}\n\nexport type ControlStatusMessage = {\n\ttype: 'control_status'\n\trequestId: number\n}\n\nexport type CookieQueryMessage = {\n\ttype: 'cookie_query'\n\trequestId: number\n\ttabId: number\n\tdomain?: string\n\turl?: string\n}\n\nexport type HostToExtension =\n\t| DetachTabMessage\n\t| CdpCommandMessage\n\t| CookieQueryMessage\n\t| FrameSnapshotRequestMessage\n\t| HostInfoMessage\n\t| HostReadyMessage\n\t| TargetInfoMessage\n\nexport type ControlHostToExtension =\n\t| AttachTabWatcherMessage\n\t| DetachTabWatcherMessage\n\t| ListTabsMessage\n\t| ControlStatusMessage\n\t| HostInfoMessage\n\t| HostReadyMessage\n\nexport type TabHostToExtension = HostToExtension\n", "import { NATIVE_MESSAGING_PROTOCOL_VERSION, type HostInfoMessage } from '../types/messages.js'\n\n/**\n * Check a `host_info` handshake against the protocol version this extension was built\n * against.\n *\n * The extension and the watcher ship as separately versioned artifacts, so a user can\n * easily end up running a new extension against an old native host (or vice versa).\n * Without this check a version skew surfaces as confusing per-command failures much\n * later; with it, the mismatch is named once, at connect time.\n *\n * @returns `null` when the peer is compatible, or a human-readable reason to reject it.\n * A missing `protocolVersion` means the host predates the handshake and is treated as\n * incompatible rather than assumed to match.\n */\nexport const checkHostProtocol = (message: HostInfoMessage): string | null => {\n\tconst hostVersion = message.protocolVersion\n\tif (hostVersion === NATIVE_MESSAGING_PROTOCOL_VERSION) {\n\t\treturn null\n\t}\n\n\tconst reported = hostVersion == null ? 'none (predates the handshake)' : String(hostVersion)\n\treturn `Argus native host speaks native-messaging protocol ${reported}, extension expects ${NATIVE_MESSAGING_PROTOCOL_VERSION}. Update argus (npm i -g @vforsh/argus) and reload the extension.`\n}\n", "import type { ExtensionToTabHost, TabHostToExtension } from '../types/messages.js'\nimport { BridgeClient } from './bridge-client.js'\nimport { CdpProxy } from './cdp-proxy.js'\nimport type { DebuggerManager } from './debugger-manager.js'\nimport { BRIDGE_HOST_NAME } from './native-hosts.js'\nimport { createLatch, type Latch } from './latch.js'\nimport { checkHostProtocol } from './protocol-handshake.js'\n\nexport type TabWatcherInfo = {\n\twatcherId: string\n\twatcherHost: string\n\twatcherPort: number\n\tpid: number\n}\n\nexport type TabTargetInfo = {\n\ttargetId: string\n\ttitle: string | null\n\turl: string | null\n\tattachedAt: number\n\ttargetReady: boolean | null\n}\n\nexport type TabBridgeSessionEvents = {\n\tonWatcherInfo?: (info: TabWatcherInfo) => void\n\tonTargetInfo?: (info: TabTargetInfo) => void\n\tonDisconnect?: () => void\n}\n\nexport type TabBridgeSessionOptions = {\n\twatcherId?: string\n}\n\n/**\n * Owns one Native Messaging bridge + one watcher process for a single attached tab.\n * Each session stays tab-scoped so the extension can expose true one-watcher-per-tab semantics.\n */\nexport class TabBridgeSession {\n\tprivate readonly tabId: number\n\tprivate readonly bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>\n\tprivate readonly cdpProxy: CdpProxy\n\tprivate readonly events: TabBridgeSessionEvents\n\tprivate watcherInfo: TabWatcherInfo | null = null\n\tprivate targetInfo: TabTargetInfo | null = null\n\tprivate desiredWatcherId: string | undefined\n\tprivate lastMessageAt: number | null = null\n\tprivate readonly hostReady = createLatch()\n\tprivate readonly watcherInfoReceived = createLatch()\n\tprivate disposed = false\n\tprivate protocolMismatch: string | null = null\n\n\tconstructor(tabId: number, debuggerManager: DebuggerManager, events: TabBridgeSessionEvents = {}, options: TabBridgeSessionOptions = {}) {\n\t\tthis.tabId = tabId\n\t\tthis.events = events\n\t\tthis.desiredWatcherId = options.watcherId\n\t\tthis.bridgeClient = new BridgeClient(BRIDGE_HOST_NAME, { autoReconnect: false })\n\t\tthis.cdpProxy = new CdpProxy(debuggerManager, this.bridgeClient)\n\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tthis.handleMessage(message)\n\t\t})\n\t\tthis.bridgeClient.onDisconnect(() => {\n\t\t\tif (this.disposed) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.events.onDisconnect?.()\n\t\t})\n\t}\n\n\tasync connectAndAttach(): Promise<void> {\n\t\tthis.assertOpen()\n\t\tconst connected = this.bridgeClient.connect()\n\t\tif (!connected) {\n\t\t\tthrow new Error(`Failed to connect native host for tab ${this.tabId}`)\n\t\t}\n\n\t\tconst sent = this.bridgeClient.send({\n\t\t\ttype: 'init_tab_watcher',\n\t\t\twatcherId: this.desiredWatcherId,\n\t\t})\n\t\tif (!sent) {\n\t\t\tthrow new Error(`Failed to initialize watcher for tab ${this.tabId}`)\n\t\t}\n\t\tawait this.awaitLatch(this.hostReady, 'did not become ready')\n\t\tawait this.awaitLatch(this.watcherInfoReceived, 'did not report watcher info')\n\t\tawait this.cdpProxy.attachTab(this.tabId)\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.cdpProxy.detachTab(this.tabId)\n\t\t} finally {\n\t\t\tthis.dispose()\n\t\t}\n\t}\n\n\tselectTarget(frameId: string | null): void {\n\t\tthis.assertOpen()\n\t\tconst sent = this.bridgeClient.send({\n\t\t\ttype: 'target_selected',\n\t\t\ttabId: this.tabId,\n\t\t\tframeId,\n\t\t})\n\t\tif (!sent) {\n\t\t\tthrow new Error(`Failed to select target for tab ${this.tabId}`)\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.disposed = true\n\t\tthis.cdpProxy.dispose()\n\t\tthis.bridgeClient.disconnect()\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.bridgeClient.isConnected()\n\t}\n\n\tgetWatcherInfo(): TabWatcherInfo | null {\n\t\treturn this.watcherInfo\n\t}\n\n\tgetTargetInfo(): TabTargetInfo | null {\n\t\treturn this.targetInfo\n\t}\n\n\tgetLastMessageAt(): number | null {\n\t\treturn this.lastMessageAt\n\t}\n\n\tprivate async awaitLatch(latch: Latch, failure: string, timeoutMs = 3_000): Promise<void> {\n\t\tthis.assertOpen()\n\t\tawait latch.wait(timeoutMs, `Native host session for tab ${this.tabId} ${failure}`)\n\t}\n\n\tprivate handleMessage(message: TabHostToExtension): void {\n\t\tthis.lastMessageAt = Date.now()\n\n\t\tswitch (message.type) {\n\t\t\tcase 'host_info': {\n\t\t\t\tconst mismatch = checkHostProtocol(message)\n\t\t\t\tif (mismatch) {\n\t\t\t\t\tconsole.error(`[TabBridgeSession] ${mismatch}`)\n\t\t\t\t\tthis.protocolMismatch = mismatch\n\t\t\t\t\tthis.dispose()\n\t\t\t\t\tthis.events.onDisconnect?.()\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tthis.watcherInfo = {\n\t\t\t\t\twatcherId: message.watcherId,\n\t\t\t\t\twatcherHost: message.watcherHost,\n\t\t\t\t\twatcherPort: message.watcherPort,\n\t\t\t\t\tpid: message.pid,\n\t\t\t\t}\n\t\t\t\tthis.events.onWatcherInfo?.(this.watcherInfo)\n\t\t\t\tthis.watcherInfoReceived.signal()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tcase 'host_ready':\n\t\t\t\tthis.hostReady.signal()\n\t\t\t\treturn\n\n\t\t\tcase 'target_info':\n\t\t\t\tthis.targetInfo = {\n\t\t\t\t\ttargetId: message.targetId,\n\t\t\t\t\ttitle: message.title,\n\t\t\t\t\turl: message.url,\n\t\t\t\t\tattachedAt: message.attachedAt,\n\t\t\t\t\ttargetReady: message.targetReady ?? null,\n\t\t\t\t}\n\t\t\t\tthis.events.onTargetInfo?.(this.targetInfo)\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.protocolMismatch) {\n\t\t\tthrow new Error(this.protocolMismatch)\n\t\t}\n\t\tif (this.disposed) {\n\t\t\tthrow new Error(`Native host session for tab ${this.tabId} is already closed`)\n\t\t}\n\t}\n}\n", "import type { DebuggerManager } from './debugger-manager.js'\nimport type { TabInfo } from '../types/messages.js'\n\ntype TabFilter = {\n\turl?: string\n\ttitle?: string\n}\n\ntype TabListOptions = {\n\tgetWatcherIdForTab?: (tabId: number) => string | null | undefined\n}\n\n/**\n * Shared tab-list query for popup UI and native-host requests so both surfaces stay in sync.\n */\nexport const listBrowserTabs = async (debuggerManager: DebuggerManager, filter?: TabFilter, options: TabListOptions = {}): Promise<TabInfo[]> => {\n\tconst chromeTabs = await chrome.tabs.query({})\n\tconst attachedTargets = debuggerManager.listAttached()\n\tconst attachedTabIds = new Set(attachedTargets.map((target) => target.tabId))\n\n\tlet tabs = chromeTabs\n\t\t.filter((tab): tab is chrome.tabs.Tab & { id: number; url: string } => tab.id !== undefined && tab.url !== undefined)\n\t\t.filter((tab) => !tab.url.startsWith('chrome://') && !tab.url.startsWith('chrome-extension://'))\n\t\t.map((tab) => ({\n\t\t\ttabId: tab.id,\n\t\t\turl: tab.url,\n\t\t\ttitle: tab.title ?? '',\n\t\t\tfaviconUrl: tab.favIconUrl,\n\t\t\tattached: attachedTabIds.has(tab.id),\n\t\t\twatcherId: options.getWatcherIdForTab?.(tab.id) ?? undefined,\n\t\t}))\n\n\tif (filter?.url) {\n\t\tconst urlFilter = filter.url.toLowerCase()\n\t\ttabs = tabs.filter((tab) => tab.url.toLowerCase().includes(urlFilter))\n\t}\n\n\tif (filter?.title) {\n\t\tconst titleFilter = filter.title.toLowerCase()\n\t\ttabs = tabs.filter((tab) => tab.title.toLowerCase().includes(titleFilter))\n\t}\n\n\ttabs.sort((left, right) => Number(right.attached) - Number(left.attached))\n\n\treturn tabs\n}\n", "/**\n * Extract a human-readable message from an unknown thrown value.\n *\n * `catch` binds `unknown`, so every call site otherwise writes the same\n * `error instanceof Error ? error.message : String(error)` ternary. Falsy throws (`throw null`,\n * a rejected promise with no reason) become `'unknown error'` rather than the literal `'null'`.\n */\nexport const formatError = (error: unknown): string => {\n\tif (!error) {\n\t\treturn 'unknown error'\n\t}\n\tif (error instanceof Error) {\n\t\treturn error.message\n\t}\n\treturn String(error)\n}\n", "import { checkHostProtocol } from './protocol-handshake.js'\nimport type { ControlDiagnostics, ControlHostToExtension, ExtensionToControlHost, TabInfo } from '../types/messages.js'\nimport { BridgeClient } from './bridge-client.js'\nimport type { DebuggerManager } from './debugger-manager.js'\nimport { CONTROL_HOST_NAME } from './native-hosts.js'\nimport { listBrowserTabs } from './tab-list.js'\n\nexport type ControlWatcherInfo = {\n\twatcherId: string\n\twatcherHost: string\n\twatcherPort: number\n\tpid: number\n}\n\nexport type ControlBridgeSessionEvents = {\n\tonWatcherInfo?: (info: ControlWatcherInfo) => void\n\tonAttachTabWatcher?: (tabId: number, options: { watcherId?: string }) => Promise<TabActionResult>\n\tonDetachTabWatcher?: (tabId: number) => Promise<TabActionResult>\n\tgetWatcherIdForTab?: (tabId: number) => string | null | undefined\n\tgetDiagnostics?: () => ControlDiagnostics\n\tonDisconnect?: () => void\n}\n\nimport type { TabActionResult } from '../types/messages.js'\nimport { formatError } from '@vforsh/argus-core/error-message'\nexport type { TabActionResult } from '../types/messages.js'\n\n/**\n * Owns the extension-level native host. It never attaches chrome.debugger to a tab;\n * it only gives Argus a stable HTTP transport for browser-level extension commands.\n */\nexport class ControlBridgeSession {\n\tprivate readonly bridgeClient: BridgeClient<ControlHostToExtension, ExtensionToControlHost>\n\tprivate readonly debuggerManager: DebuggerManager\n\tprivate readonly events: ControlBridgeSessionEvents\n\tprivate watcherInfo: ControlWatcherInfo | null = null\n\tprivate lastMessageAt: number | null = null\n\tprivate disposed = false\n\n\tconstructor(debuggerManager: DebuggerManager, events: ControlBridgeSessionEvents = {}) {\n\t\tthis.debuggerManager = debuggerManager\n\t\tthis.events = events\n\t\tthis.bridgeClient = new BridgeClient(CONTROL_HOST_NAME, { autoReconnect: true })\n\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tvoid this.handleMessage(message)\n\t\t})\n\t\tthis.bridgeClient.onDisconnect(() => {\n\t\t\tif (this.disposed) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.events.onDisconnect?.()\n\t\t})\n\t}\n\n\tconnect(): boolean {\n\t\tthis.assertOpen()\n\t\treturn this.bridgeClient.connect()\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.disposed = true\n\t\tthis.bridgeClient.disconnect()\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.bridgeClient.isConnected()\n\t}\n\n\tgetWatcherInfo(): ControlWatcherInfo | null {\n\t\treturn this.watcherInfo\n\t}\n\n\tgetLastMessageAt(): number | null {\n\t\treturn this.lastMessageAt\n\t}\n\n\tprivate async handleMessage(message: ControlHostToExtension): Promise<void> {\n\t\tthis.lastMessageAt = Date.now()\n\n\t\tswitch (message.type) {\n\t\t\tcase 'host_info': {\n\t\t\t\tconst mismatch = checkHostProtocol(message)\n\t\t\t\tif (mismatch) {\n\t\t\t\t\tconsole.error(`[ControlBridgeSession] ${mismatch}`)\n\t\t\t\t\tthis.bridgeClient.disconnect()\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tthis.watcherInfo = {\n\t\t\t\t\twatcherId: message.watcherId,\n\t\t\t\t\twatcherHost: message.watcherHost,\n\t\t\t\t\twatcherPort: message.watcherPort,\n\t\t\t\t\tpid: message.pid,\n\t\t\t\t}\n\t\t\t\tthis.events.onWatcherInfo?.(this.watcherInfo)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tcase 'attach_tab_watcher':\n\t\t\t\tawait this.handleTabAction(message.requestId, () => this.events.onAttachTabWatcher?.(message.tabId, { watcherId: message.watcherId }))\n\t\t\t\treturn\n\n\t\t\tcase 'detach_tab_watcher':\n\t\t\t\tawait this.handleTabAction(message.requestId, () => this.events.onDetachTabWatcher?.(message.tabId))\n\t\t\t\treturn\n\n\t\t\tcase 'list_tabs':\n\t\t\t\tawait this.handleListTabs(message.requestId, message.filter)\n\t\t\t\treturn\n\n\t\t\tcase 'control_status':\n\t\t\t\tthis.handleControlStatus(message.requestId)\n\t\t\t\treturn\n\n\t\t\tcase 'host_ready':\n\t\t\t\treturn\n\t\t}\n\t}\n\n\tprivate async handleTabAction(requestId: number, action: () => Promise<TabActionResult> | undefined): Promise<void> {\n\t\ttry {\n\t\t\tconst result = (await action()) ?? { ok: false, error: 'Extension control action is not available' }\n\t\t\tif (!result.ok) {\n\t\t\t\tthis.bridgeClient.send({ type: 'tab_action_response', requestId, ok: false, error: { message: result.error } })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.bridgeClient.send({ type: 'tab_action_response', requestId, ok: true, tab: result.tab, watcherId: result.watcherId })\n\t\t} catch (error) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_action_response',\n\t\t\t\trequestId,\n\t\t\t\tok: false,\n\t\t\t\terror: { message: formatError(error) },\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate async handleListTabs(requestId: number, filter?: { url?: string; title?: string }): Promise<void> {\n\t\tconst tabs: TabInfo[] = await listBrowserTabs(this.debuggerManager, filter, {\n\t\t\tgetWatcherIdForTab: this.events.getWatcherIdForTab,\n\t\t})\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'list_tabs_response',\n\t\t\trequestId,\n\t\t\ttabs,\n\t\t})\n\t}\n\n\tprivate handleControlStatus(requestId: number): void {\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'control_status_response',\n\t\t\trequestId,\n\t\t\tdiagnostics: this.events.getDiagnostics?.() ?? this.buildFallbackDiagnostics(),\n\t\t})\n\t}\n\n\tprivate buildFallbackDiagnostics(): ControlDiagnostics {\n\t\treturn {\n\t\t\textensionId: null,\n\t\t\textensionVersion: null,\n\t\t\tcontrol: {\n\t\t\t\tconnected: this.isConnected(),\n\t\t\t\twatcherId: this.watcherInfo?.watcherId ?? null,\n\t\t\t\twatcherHost: this.watcherInfo?.watcherHost ?? null,\n\t\t\t\twatcherPort: this.watcherInfo?.watcherPort ?? null,\n\t\t\t\tpid: this.watcherInfo?.pid ?? null,\n\t\t\t\tlastMessageAt: this.lastMessageAt,\n\t\t\t},\n\t\t\ttabWatchers: [],\n\t\t\trecentEvents: [],\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.disposed) {\n\t\t\tthrow new Error('Native host control session is already closed')\n\t\t}\n\t}\n}\n", "/**\n * Shared persistence plumbing for the extension's page-scoped history stores.\n *\n * `target-selection-history` and `target-visibility-history` are the same shape of store \u2014\n * a capped, most-recent-first list of page-keyed entries, loaded once and saved through a\n * serialized chain \u2014 and had grown line-for-line copies of every piece: the two\n * `chrome.storage` promise wrappers, the persistence factory (differing only in its key),\n * the load-once guard, the save chain, and the text/sort helpers.\n */\n\n/** Read one key from a `chrome.storage` area, rejecting on `runtime.lastError`. */\nexport const readStorageValue = async <T>(storageArea: chrome.storage.StorageArea, key: string): Promise<T | undefined> =>\n\tnew Promise<T | undefined>((resolve, reject) => {\n\t\tstorageArea.get(key, (items) => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve(items[key] as T | undefined)\n\t\t})\n\t})\n\n/** Write keys into a `chrome.storage` area, rejecting on `runtime.lastError`. */\nexport const writeStorageValue = async (storageArea: chrome.storage.StorageArea, items: Record<string, unknown>): Promise<void> =>\n\tnew Promise<void>((resolve, reject) => {\n\t\tstorageArea.set(items, () => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve()\n\t\t})\n\t})\n\n/** Trim a value to a non-empty string, or `null`. */\nexport const normalizeOptionalText = (value: unknown): string | null => {\n\tif (typeof value !== 'string') {\n\t\treturn null\n\t}\n\n\tconst trimmed = value.trim()\n\treturn trimmed === '' ? null : trimmed\n}\n\n/** Sort comparator putting the most recently updated entry first. */\nexport const sortByUpdatedAtDesc = (left: { updatedAt: number }, right: { updatedAt: number }): number => right.updatedAt - left.updatedAt\n\n/** How a store reads and writes its entries. */\nexport type StorePersistence<TEntry> = {\n\tload: () => Promise<TEntry[]>\n\tsave: (entries: TEntry[]) => Promise<void>\n}\n\n/**\n * Build a `chrome.storage`-backed persistence for one storage key.\n *\n * @param sanitize Applied on load, since anything may be sitting under the key.\n */\nexport const createChromeStorePersistence = <TEntry>(\n\tstorageKey: string,\n\tsanitize: (value: unknown) => TEntry[],\n\tstorageArea: chrome.storage.StorageArea = chrome.storage.local,\n): StorePersistence<TEntry> => ({\n\tload: async () => sanitize(await readStorageValue<unknown>(storageArea, storageKey)),\n\tsave: async (entries) => {\n\t\tawait writeStorageValue(storageArea, { [storageKey]: entries })\n\t},\n})\n\n/**\n * A capped list of entries loaded once and saved through a serialized chain.\n *\n * Load and save failures are logged and swallowed: a store that cannot reach\n * `chrome.storage` degrades to in-memory rather than breaking the popup.\n */\nexport class PageKeyedStore<TEntry extends { pageKey: string; updatedAt: number }> {\n\tprotected entries: TEntry[] = []\n\tprivate loadPromise: Promise<void> | null = null\n\tprivate saveChain: Promise<void> = Promise.resolve()\n\n\tconstructor(\n\t\tprivate readonly persistence: StorePersistence<TEntry>,\n\t\tprotected readonly maxEntries: number,\n\t\tprivate readonly label: string,\n\t) {}\n\n\t/** Load on first use; later calls await the same load. */\n\tprotected async ensureLoaded(): Promise<void> {\n\t\tif (!this.loadPromise) {\n\t\t\tthis.loadPromise = this.persistence\n\t\t\t\t.load()\n\t\t\t\t.then((entries) => {\n\t\t\t\t\tthis.entries = entries.slice(0, this.maxEntries)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(`[${this.label}] Failed to load history:`, error)\n\t\t\t\t\tthis.entries = []\n\t\t\t\t})\n\t\t}\n\n\t\tawait this.loadPromise\n\t}\n\n\t/** Persist the current entries, serialized behind any in-flight save. */\n\tprotected async persist(): Promise<void> {\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => undefined)\n\t\t\t.then(() => this.persistence.save(this.entries))\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error(`[${this.label}] Failed to save history:`, error)\n\t\t\t})\n\n\t\tawait this.saveChain\n\t}\n\n\t/** Move an entry to the front, replacing any entry with the same page key. */\n\tprotected upsert(entry: TEntry): void {\n\t\tthis.entries = [entry, ...this.entries.filter((candidate) => candidate.pageKey !== entry.pageKey)].slice(0, this.maxEntries)\n\t}\n\n\t/** Find the entry for a page key. */\n\tprotected findByPageKey(pageKey: string): TEntry | null {\n\t\treturn this.entries.find((entry) => entry.pageKey === pageKey) ?? null\n\t}\n}\n", "import { PageKeyedStore, createChromeStorePersistence, sortByUpdatedAtDesc } from './page-keyed-store.js'\nexport type SelectionTarget = {\n\ttype: 'page' | 'iframe'\n\tframeId: string | null\n\ttitle: string | null\n\turl: string | null\n}\n\nexport type RememberedTargetSelection =\n\t| {\n\t\t\tpageKey: string\n\t\t\tpageUrl: string\n\t\t\tupdatedAt: number\n\t\t\ttarget: { type: 'page' }\n\t }\n\t| {\n\t\t\tpageKey: string\n\t\t\tpageUrl: string\n\t\t\tupdatedAt: number\n\t\t\ttarget: {\n\t\t\t\ttype: 'iframe'\n\t\t\t\turl: string | null\n\t\t\t\ttitle: string | null\n\t\t\t}\n\t }\n\nexport type TargetSelectionHistoryPersistence = {\n\tload: () => Promise<RememberedTargetSelection[]>\n\tsave: (entries: RememberedTargetSelection[]) => Promise<void>\n}\n\ntype RememberedSelectionDraft = Partial<RememberedTargetSelection> & {\n\ttarget?: { type?: string; url?: unknown; title?: unknown }\n}\n\nconst DEFAULT_STORAGE_KEY = 'targetSelectionHistory'\nconst DEFAULT_MAX_ENTRIES = 20\n\n/**\n * Group history by the stable document path instead of the full URL so replay survives\n * nonce/hash/query churn. The iframe hint itself still uses strict matching and fails closed.\n */\nexport const normalizeSelectionPageKey = (pageUrl: string): string => {\n\ttry {\n\t\tconst parsed = new URL(pageUrl)\n\t\treturn `${parsed.origin}${parsed.pathname || '/'}`\n\t} catch {\n\t\treturn pageUrl.split('#', 1)[0] || pageUrl\n\t}\n}\n\nexport const matchRememberedIframeTarget = (entry: RememberedTargetSelection, targets: SelectionTarget[]): SelectionTarget | null => {\n\tif (entry.target.type !== 'iframe') {\n\t\treturn null\n\t}\n\tconst rememberedIframe = entry.target\n\tconst iframeTargets = getIframeTargets(targets)\n\n\tif (rememberedIframe.url) {\n\t\treturn pickSingleTargetMatch(iframeTargets, (target) => target.url === rememberedIframe.url)\n\t}\n\n\tif (!rememberedIframe.title) {\n\t\treturn null\n\t}\n\n\treturn pickSingleTargetMatch(iframeTargets, (target) => normalizeTargetTitle(target.title) === rememberedIframe.title)\n}\n\n/** Remembers which target the user last selected on each page. */\nexport class TargetSelectionHistoryStore extends PageKeyedStore<RememberedTargetSelection> {\n\tconstructor(persistence: TargetSelectionHistoryPersistence = createChromeStoragePersistence(), options: { maxEntries?: number } = {}) {\n\t\tsuper(persistence, options.maxEntries ?? DEFAULT_MAX_ENTRIES, 'TargetSelectionHistoryStore')\n\t}\n\n\tasync getByPageUrl(pageUrl: string): Promise<RememberedTargetSelection | null> {\n\t\tawait this.ensureLoaded()\n\t\treturn this.findByPageKey(normalizeSelectionPageKey(pageUrl))\n\t}\n\n\tasync remember(pageUrl: string, target: SelectionTarget): Promise<RememberedTargetSelection> {\n\t\tawait this.ensureLoaded()\n\n\t\tconst entry = buildRememberedSelection(pageUrl, target)\n\t\tthis.upsert(entry)\n\t\tawait this.persist()\n\t\treturn entry\n\t}\n}\n\nexport const createChromeStoragePersistence = (\n\tstorageArea: chrome.storage.StorageArea = chrome.storage.local,\n\tstorageKey: string = DEFAULT_STORAGE_KEY,\n): TargetSelectionHistoryPersistence =>\n\tcreateChromeStorePersistence(storageKey, (value) => sanitizeRememberedSelections(Array.isArray(value) ? value : []), storageArea)\n\nconst buildRememberedSelection = (pageUrl: string, target: SelectionTarget): RememberedTargetSelection => {\n\tconst base = {\n\t\tpageKey: normalizeSelectionPageKey(pageUrl),\n\t\tpageUrl,\n\t\tupdatedAt: Date.now(),\n\t}\n\n\tif (target.type === 'page') {\n\t\treturn {\n\t\t\t...base,\n\t\t\ttarget: { type: 'page' },\n\t\t}\n\t}\n\n\treturn {\n\t\t...base,\n\t\ttarget: {\n\t\t\ttype: 'iframe',\n\t\t\turl: normalizeTargetUrl(target.url),\n\t\t\ttitle: normalizeTargetTitle(target.title),\n\t\t},\n\t}\n}\n\nconst pickSingleTargetMatch = <T>(targets: T[], predicate: (target: T) => boolean): T | null => {\n\tconst matches = targets.filter(predicate)\n\treturn matches.length === 1 ? matches[0] : null\n}\n\nconst getIframeTargets = (targets: SelectionTarget[]): Array<SelectionTarget & { type: 'iframe'; frameId: string }> => {\n\treturn targets.filter((target): target is SelectionTarget & { type: 'iframe'; frameId: string } => {\n\t\treturn target.type === 'iframe' && typeof target.frameId === 'string' && target.frameId.length > 0\n\t})\n}\n\nconst sanitizeRememberedSelections = (entries: unknown[]): RememberedTargetSelection[] => {\n\treturn entries\n\t\t.map(sanitizeRememberedSelection)\n\t\t.filter((entry): entry is RememberedTargetSelection => entry !== null)\n\t\t.sort(sortByUpdatedAtDesc)\n}\n\nconst sanitizeRememberedSelection = (entry: unknown): RememberedTargetSelection | null => {\n\tconst candidate = entry as RememberedSelectionDraft\n\tif (typeof candidate?.pageUrl !== 'string' || candidate.pageUrl.length === 0) {\n\t\treturn null\n\t}\n\n\tconst base = {\n\t\tpageKey:\n\t\t\ttypeof candidate.pageKey === 'string' && candidate.pageKey.length > 0 ? candidate.pageKey : normalizeSelectionPageKey(candidate.pageUrl),\n\t\tpageUrl: candidate.pageUrl,\n\t\tupdatedAt: typeof candidate.updatedAt === 'number' ? candidate.updatedAt : 0,\n\t}\n\n\tif (candidate.target?.type === 'page') {\n\t\treturn {\n\t\t\t...base,\n\t\t\ttarget: { type: 'page' },\n\t\t}\n\t}\n\n\tif (candidate.target?.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...base,\n\t\ttarget: {\n\t\t\ttype: 'iframe',\n\t\t\turl: normalizeTargetUrl(typeof candidate.target.url === 'string' ? candidate.target.url : null),\n\t\t\ttitle: normalizeTargetTitle(typeof candidate.target.title === 'string' ? candidate.target.title : null),\n\t\t},\n\t}\n}\n\nfunction normalizeTargetUrl(url: string | null | undefined): string | null {\n\treturn normalizeOptionalText(url)\n}\n\nfunction normalizeTargetTitle(title: string | null | undefined): string | null {\n\treturn normalizeOptionalText(title)\n}\n\nfunction normalizeOptionalText(value: string | null | undefined): string | null {\n\treturn typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n", "import { normalizeSelectionPageKey, type SelectionTarget } from './target-selection-history.js'\nimport { PageKeyedStore, createChromeStorePersistence, normalizeOptionalText, sortByUpdatedAtDesc } from './page-keyed-store.js'\n\nexport type HiddenTarget = {\n\ttype: 'iframe'\n\turl: string | null\n\ttitle: string | null\n}\n\nexport type HiddenTargetPageEntry = {\n\tpageKey: string\n\tpageUrl: string\n\tupdatedAt: number\n\ttargets: HiddenTarget[]\n}\n\nexport type TargetVisibilityPersistence = {\n\tload: () => Promise<HiddenTargetPageEntry[]>\n\tsave: (entries: HiddenTargetPageEntry[]) => Promise<void>\n}\n\ntype HiddenTargetPageDraft = Partial<HiddenTargetPageEntry> & {\n\ttargets?: unknown\n}\n\ntype HiddenTargetDraft = Partial<HiddenTarget> & {\n\ttype?: unknown\n\turl?: unknown\n\ttitle?: unknown\n}\n\nconst DEFAULT_STORAGE_KEY = 'hiddenTargetHistory'\nconst DEFAULT_MAX_PAGE_ENTRIES = 20\n\n/**\n * Persists page-scoped iframe hide preferences. Frame ids are intentionally not stored:\n * Chrome regenerates them often, while URL/title signatures survive reloads well enough.\n */\nexport class TargetVisibilityHistoryStore extends PageKeyedStore<HiddenTargetPageEntry> {\n\tconstructor(persistence: TargetVisibilityPersistence = createChromeStoragePersistence(), options: { maxPageEntries?: number } = {}) {\n\t\tsuper(persistence, options.maxPageEntries ?? DEFAULT_MAX_PAGE_ENTRIES, 'TargetVisibilityHistoryStore')\n\t}\n\n\tasync getHiddenTargets(pageUrl: string): Promise<HiddenTarget[]> {\n\t\tawait this.ensureLoaded()\n\t\treturn [...(this.findByPageKey(normalizeSelectionPageKey(pageUrl))?.targets ?? [])]\n\t}\n\n\tasync hide(pageUrl: string, target: SelectionTarget): Promise<HiddenTargetPageEntry | null> {\n\t\tawait this.ensureLoaded()\n\t\tconst hiddenTarget = toHiddenTarget(target)\n\t\tif (!hiddenTarget) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst pageKey = normalizeSelectionPageKey(pageUrl)\n\t\tconst existing = this.findByPageKey(normalizeSelectionPageKey(pageUrl))\n\t\tconst targets = uniqueHiddenTargets([hiddenTarget, ...(existing?.targets ?? [])])\n\t\tconst entry = { pageKey, pageUrl, updatedAt: Date.now(), targets }\n\t\tthis.upsert(entry)\n\t\tawait this.persist()\n\t\treturn entry\n\t}\n\n\tasync show(pageUrl: string, target: SelectionTarget): Promise<void> {\n\t\tawait this.ensureLoaded()\n\t\tconst hiddenTarget = toHiddenTarget(target)\n\t\tif (!hiddenTarget) {\n\t\t\treturn\n\t\t}\n\n\t\tconst existing = this.findByPageKey(normalizeSelectionPageKey(pageUrl))\n\t\tif (!existing) {\n\t\t\treturn\n\t\t}\n\n\t\tconst targets = existing.targets.filter((candidate) => !isSameHiddenTarget(candidate, hiddenTarget))\n\t\tif (targets.length === 0) {\n\t\t\tthis.entries = this.entries.filter((entry) => entry.pageKey !== existing.pageKey)\n\t\t\tawait this.persist()\n\t\t\treturn\n\t\t}\n\n\t\tthis.entries = this.entries.map((entry) => (entry.pageKey === existing.pageKey ? { ...entry, targets, updatedAt: Date.now() } : entry))\n\t\tawait this.persist()\n\t}\n}\n\nexport const createChromeStoragePersistence = (\n\tstorageArea: chrome.storage.StorageArea = chrome.storage.local,\n\tstorageKey: string = DEFAULT_STORAGE_KEY,\n): TargetVisibilityPersistence =>\n\tcreateChromeStorePersistence(storageKey, (value) => sanitizeHiddenTargetEntries(Array.isArray(value) ? value : []), storageArea)\n\nexport function matchesHiddenTarget(hiddenTarget: HiddenTarget, target: SelectionTarget): boolean {\n\tif (target.type !== 'iframe') {\n\t\treturn false\n\t}\n\n\tconst candidate = toHiddenTarget(target)\n\treturn candidate ? isSameHiddenTarget(hiddenTarget, candidate) : false\n}\n\nfunction toHiddenTarget(target: SelectionTarget): HiddenTarget | null {\n\tif (target.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\tconst url = normalizeOptionalText(target.url)\n\tconst title = normalizeOptionalText(target.title)\n\tif (!url && !title) {\n\t\treturn null\n\t}\n\n\treturn { type: 'iframe', url, title }\n}\n\nfunction uniqueHiddenTargets(targets: HiddenTarget[]): HiddenTarget[] {\n\tconst unique: HiddenTarget[] = []\n\tfor (const target of targets) {\n\t\tif (!unique.some((candidate) => isSameHiddenTarget(candidate, target))) {\n\t\t\tunique.push(target)\n\t\t}\n\t}\n\treturn unique\n}\n\nfunction isSameHiddenTarget(left: HiddenTarget, right: HiddenTarget): boolean {\n\tif (left.url || right.url) {\n\t\treturn left.url === right.url\n\t}\n\n\treturn left.title === right.title\n}\n\nfunction sanitizeHiddenTargetEntries(entries: unknown[]): HiddenTargetPageEntry[] {\n\treturn entries\n\t\t.map(sanitizeHiddenTargetEntry)\n\t\t.filter((entry): entry is HiddenTargetPageEntry => entry !== null)\n\t\t.sort(sortByUpdatedAtDesc)\n}\n\nfunction sanitizeHiddenTargetEntry(entry: unknown): HiddenTargetPageEntry | null {\n\tconst candidate = entry as HiddenTargetPageDraft\n\tif (typeof candidate?.pageUrl !== 'string' || candidate.pageUrl.length === 0 || !Array.isArray(candidate.targets)) {\n\t\treturn null\n\t}\n\n\tconst targets = uniqueHiddenTargets(candidate.targets.map(sanitizeHiddenTarget).filter((target): target is HiddenTarget => target !== null))\n\tif (targets.length === 0) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\tpageKey:\n\t\t\ttypeof candidate.pageKey === 'string' && candidate.pageKey.length > 0 ? candidate.pageKey : normalizeSelectionPageKey(candidate.pageUrl),\n\t\tpageUrl: candidate.pageUrl,\n\t\tupdatedAt: typeof candidate.updatedAt === 'number' ? candidate.updatedAt : 0,\n\t\ttargets,\n\t}\n}\n\nfunction sanitizeHiddenTarget(target: unknown): HiddenTarget | null {\n\tconst candidate = target as HiddenTargetDraft\n\tif (candidate?.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\tconst url = normalizeOptionalText(typeof candidate.url === 'string' ? candidate.url : null)\n\tconst title = normalizeOptionalText(typeof candidate.title === 'string' ? candidate.title : null)\n\tif (!url && !title) {\n\t\treturn null\n\t}\n\n\treturn { type: 'iframe', url, title }\n}\n", "import type { DebuggerManager } from './debugger-manager.js'\n\nlet badgeSyncChain: Promise<void> = Promise.resolve()\n\n/**\n * Serialize badge writes and reconcile on popup reads so an external detach from Chrome's\n * debugger infobar cannot leave stale badge text behind.\n */\nexport function syncActionBadge(debuggerManager: DebuggerManager): Promise<void> {\n\tbadgeSyncChain = badgeSyncChain\n\t\t.catch(() => undefined)\n\t\t.then(async () => {\n\t\t\tconst attachedCount = debuggerManager.listAttached().length\n\t\t\tawait applyBadgeState(attachedCount)\n\t\t})\n\t\t.catch((error) => {\n\t\t\tconsole.error('[ServiceWorker] Failed to sync action badge:', error)\n\t\t})\n\n\treturn badgeSyncChain\n}\n\nasync function applyBadgeState(attachedCount: number): Promise<void> {\n\tconst badgeText = attachedCount > 0 ? String(attachedCount) : ''\n\tconst tabs = await chrome.tabs.query({})\n\n\t// Clear any tab-specific badge text Chrome may still be holding onto, then keep the default in sync.\n\tawait Promise.all(\n\t\ttabs\n\t\t\t.filter((tab): tab is chrome.tabs.Tab & { id: number } => tab.id !== undefined)\n\t\t\t.map((tab) => chrome.action.setBadgeText({ tabId: tab.id, text: badgeText })),\n\t)\n\tawait chrome.action.setBadgeText({ text: badgeText })\n\n\tif (attachedCount > 0) {\n\t\tawait chrome.action.setBadgeBackgroundColor({ color: '#4CAF50' })\n\t}\n}\n", "/**\n * Read-only views of the debugger frame tree, shaped for the popup UI.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { SelectionTarget } from './target-selection-history.js'\nimport type { PopupTarget } from './popup-protocol.js'\n\n/** Parse watcher target ids (`tab:<id>` / `frame:<tabId>:<frameId>`). Returns null for unknown formats. */\nexport function parseWatcherTargetId(targetId: string): { tabId: number; frameId: string | null } | null {\n\tif (targetId.startsWith('tab:')) {\n\t\tconst tabId = Number.parseInt(targetId.slice(4), 10)\n\t\treturn Number.isFinite(tabId) ? { tabId, frameId: null } : null\n\t}\n\n\tif (targetId.startsWith('frame:')) {\n\t\tconst [, tabIdRaw, ...frameIdParts] = targetId.split(':')\n\t\tconst tabId = Number.parseInt(tabIdRaw ?? '', 10)\n\t\tconst frameId = frameIdParts.join(':')\n\t\treturn Number.isFinite(tabId) && frameId ? { tabId, frameId } : null\n\t}\n\n\treturn null\n}\n\n/** List the page plus iframe targets for an attached tab, in popup display shape. */\nexport function getPopupTargets(debuggerManager: DebuggerManager, tabId: number): PopupTarget[] {\n\tconst frames = debuggerManager.getFrames(tabId)\n\tconst topFrameId = debuggerManager.getTarget(tabId)?.topFrameId ?? null\n\tconst topFrame = frames.find((frame) => frame.frameId === topFrameId) ?? frames.find((frame) => frame.parentFrameId == null)\n\tif (!topFrame) {\n\t\treturn []\n\t}\n\n\treturn [\n\t\t{\n\t\t\ttype: 'page',\n\t\t\tframeId: null,\n\t\t\tparentFrameId: null,\n\t\t\ttitle: topFrame.title || 'Page',\n\t\t\turl: topFrame.url,\n\t\t},\n\t\t...frames\n\t\t\t.filter((frame) => frame.frameId !== topFrame.frameId)\n\t\t\t.map((frame) => ({\n\t\t\t\ttype: 'iframe' as const,\n\t\t\t\tframeId: frame.frameId,\n\t\t\t\tparentFrameId: frame.parentFrameId === topFrame.frameId ? null : frame.parentFrameId,\n\t\t\t\ttitle: frame.title || frame.url || `iframe ${frame.frameId.slice(0, 8)}`,\n\t\t\t\turl: frame.url,\n\t\t\t})),\n\t]\n}\n\nexport function getPopupTarget(debuggerManager: DebuggerManager, tabId: number, frameId: string | null): PopupTarget | null {\n\treturn getPopupTargets(debuggerManager, tabId).find((target) => (target.frameId ?? null) === frameId) ?? null\n}\n\nexport function getRequiredIframeTarget(debuggerManager: DebuggerManager, tabId: number, frameId: string | null): PopupTarget {\n\tconst target = getPopupTarget(debuggerManager, tabId, frameId)\n\tif (!target || target.type !== 'iframe' || !target.frameId) {\n\t\tthrow new Error(`Unknown iframe target for tab ${tabId}`)\n\t}\n\n\treturn target\n}\n\nexport function getPageUrlForTab(debuggerManager: DebuggerManager, tabId: number): string | null {\n\treturn getPopupTarget(debuggerManager, tabId, null)?.url ?? debuggerManager.getTarget(tabId)?.url ?? null\n}\n\n/** Project a popup target to the shape persisted by selection/visibility history stores. */\nexport function toSelectionTarget(target: PopupTarget): SelectionTarget {\n\treturn {\n\t\ttype: target.type,\n\t\tframeId: target.frameId,\n\t\ttitle: target.title,\n\t\turl: target.url,\n\t}\n}\n", "/**\n * Build per-tab watcher status payloads for the popup from a live bridge session.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { TabBridgeSession } from './tab-bridge-session.js'\nimport type { PopupWatcherStatus } from './popup-protocol.js'\nimport { parseWatcherTargetId } from './popup-targets.js'\n\nexport function buildWatcherStatus(debuggerManager: DebuggerManager, tabId: number, session: TabBridgeSession): PopupWatcherStatus | null {\n\tconst watcherInfo = session.getWatcherInfo()\n\tconst targetInfo = session.getTargetInfo()\n\tconst parsedTarget = targetInfo ? parseWatcherTargetId(targetInfo.targetId) : null\n\n\tif (!watcherInfo && !targetInfo) {\n\t\treturn createWatcherStatus(debuggerManager, tabId, session, null, null)\n\t}\n\n\treturn createWatcherStatus(\n\t\tdebuggerManager,\n\t\ttabId,\n\t\tsession,\n\t\twatcherInfo ?? null,\n\t\ttargetInfo && parsedTarget\n\t\t\t? {\n\t\t\t\t\ttype: parsedTarget.frameId ? 'iframe' : 'page',\n\t\t\t\t\ttitle: targetInfo.title,\n\t\t\t\t\turl: targetInfo.url,\n\t\t\t\t\ttargetId: targetInfo.targetId,\n\t\t\t\t\tframeId: parsedTarget.frameId,\n\t\t\t\t\tattachedAt: targetInfo.attachedAt,\n\t\t\t\t\ttargetReady: targetInfo.targetReady,\n\t\t\t\t}\n\t\t\t: null,\n\t)\n}\n\nfunction createWatcherStatus(\n\tdebuggerManager: DebuggerManager,\n\ttabId: number,\n\tsession: TabBridgeSession,\n\twatcherInfo: ReturnType<TabBridgeSession['getWatcherInfo']>,\n\tcurrentTarget: PopupWatcherStatus['currentTarget'],\n): PopupWatcherStatus {\n\tconst readiness = buildWatcherReadiness(debuggerManager, tabId, session, watcherInfo, currentTarget)\n\treturn {\n\t\ttabId,\n\t\tbridgeConnected: readiness.bridgeConnected,\n\t\twatcherReady: readiness.watcherReady,\n\t\ttargetState: readiness.targetState,\n\t\twatcherId: watcherInfo?.watcherId ?? null,\n\t\twatcherHost: watcherInfo?.watcherHost ?? null,\n\t\twatcherPort: watcherInfo?.watcherPort ?? null,\n\t\tnativeHostPid: watcherInfo?.pid ?? null,\n\t\tlastMessageAt: session.getLastMessageAt(),\n\t\tcurrentTarget,\n\t}\n}\n\nfunction buildWatcherReadiness(\n\tdebuggerManager: DebuggerManager,\n\ttabId: number,\n\tsession: TabBridgeSession,\n\twatcherInfo: ReturnType<TabBridgeSession['getWatcherInfo']>,\n\tcurrentTarget: PopupWatcherStatus['currentTarget'],\n): Pick<PopupWatcherStatus, 'bridgeConnected' | 'watcherReady' | 'targetState'> {\n\tconst bridgeConnected = session.isConnected()\n\tconst watcherReady = bridgeConnected && Boolean(watcherInfo?.watcherId && watcherInfo.watcherHost && watcherInfo.watcherPort != null)\n\tconst targetReady = currentTarget?.targetReady ?? getTargetReadiness(debuggerManager, tabId, currentTarget)\n\n\treturn {\n\t\tbridgeConnected,\n\t\twatcherReady,\n\t\t// targetReady is not surfaced on its own: the popup only ever renders this\n\t\t// three-state derivation of it.\n\t\ttargetState: targetReady == null ? 'not-selected' : targetReady ? 'ready' : 'rebinding',\n\t}\n}\n\n/**\n * The watcher can be connected while a remembered iframe is still rebinding after reload.\n * Treat the extension's live frame map as the source of truth for whether frame-scoped\n * commands have a concrete execution target again.\n */\nfunction getTargetReadiness(debuggerManager: DebuggerManager, tabId: number, target: PopupWatcherStatus['currentTarget']): boolean | null {\n\tif (!target) {\n\t\treturn null\n\t}\n\n\tif (!target.frameId) {\n\t\treturn debuggerManager.isAttached(tabId)\n\t}\n\n\tconst frame = debuggerManager.getFrames(tabId).find((candidate) => candidate.frameId === target.frameId)\n\treturn Boolean(frame?.sessionId)\n}\n", "/**\n * Service Worker - Main entry point for the Argus CDP Bridge extension.\n * Owns one debugger manager plus one Native Messaging bridge session per attached tab,\n * and answers popup messages (see `popup-protocol.ts` for the message shapes).\n */\n\nimport { DebuggerManager } from './debugger-manager.js'\nimport { TabBridgeSession, type TabBridgeSessionOptions } from './tab-bridge-session.js'\nimport { ControlBridgeSession, type TabActionResult } from './control-bridge-session.js'\nimport { type RememberedTargetSelection, TargetSelectionHistoryStore, matchRememberedIframeTarget } from './target-selection-history.js'\nimport { TargetVisibilityHistoryStore, matchesHiddenTarget } from './target-visibility-history.js'\nimport { listBrowserTabs } from './tab-list.js'\nimport { syncActionBadge } from './action-badge.js'\nimport { buildWatcherStatus } from './watcher-status.js'\nimport {\n\tgetPageUrlForTab,\n\tgetPopupTarget,\n\tgetPopupTargets,\n\tgetRequiredIframeTarget,\n\tparseWatcherTargetId,\n\ttoSelectionTarget,\n} from './popup-targets.js'\nimport type {\n\tPopupActionMessage,\n\tPopupEvent,\n\tPopupResponse,\n\tPopupResponseFor,\n\tPopupStatusPayload,\n\tPopupTabWithTargets,\n\tPopupTarget,\n\tPopupWatcherStatus,\n} from './popup-protocol.js'\nimport type { ControlDiagnostics, TabInfo } from '../types/messages.js'\nimport { formatError } from '@vforsh/argus-core/error-message'\n\nconst debuggerManager = new DebuggerManager()\nconst controlBridgeSession = new ControlBridgeSession(debuggerManager, {\n\tonWatcherInfo: (info) => {\n\t\trecordEvent('info', 'bridge', `Control watcher ready: ${info.watcherId} (pid ${info.pid})`)\n\t},\n\tonAttachTabWatcher: attachTabFromControl,\n\tonDetachTabWatcher: detachTabFromControl,\n\tgetWatcherIdForTab,\n\tgetDiagnostics: buildControlDiagnostics,\n\tonDisconnect: () => {\n\t\trecordEvent('error', 'bridge', 'Control native host disconnected')\n\t},\n})\n/**\n * Everything the extension knows about one attached tab.\n *\n * This used to be three tabId-keyed maps plus DebuggerManager.attached, reconciled by a\n * sweep that ran on every popup message because the maps drifted. One record per tab\n * means attach, detach, and prune are single-map operations and a multi-step transition\n * cannot leave half of the state behind.\n */\ntype TabAttachment = {\n\tsession: TabBridgeSession\n\t/** Selected frame, or `null` for the page. Absent until a target is chosen. */\n\tselectedFrameId?: string | null\n\t/** A remembered iframe still waiting for Chrome to populate its frame metadata. */\n\tpendingRememberedTarget?: RememberedTargetSelection\n}\n\nconst attachments = new Map<number, TabAttachment>()\n\n/**\n * Live view over the attached tabs' sessions.\n *\n * Exported for the tests, which assert on session identity and lifetime.\n */\nconst bridgeSessions = {\n\tget: (tabId: number) => attachments.get(tabId)?.session,\n\thas: (tabId: number) => attachments.has(tabId),\n\tkeys: () => attachments.keys(),\n\tvalues: () => [...attachments.values()].map((attachment) => attachment.session),\n\tentries: () => [...attachments.entries()].map(([tabId, attachment]) => [tabId, attachment.session] as const),\n}\nconst targetSelectionHistory = new TargetSelectionHistoryStore()\nconst targetVisibilityHistory = new TargetVisibilityHistoryStore()\nconst recentEvents: PopupEvent[] = []\nconst MAX_RECENT_EVENTS = 8\nconst REMEMBERED_TARGET_RETRY_EVENTS = new Set(['Page.frameAttached', 'Page.frameDetached', 'Page.frameNavigated'])\n\nfunction recordEvent(level: PopupEvent['level'], source: PopupEvent['source'], message: string): void {\n\trecentEvents.unshift({\n\t\tts: Date.now(),\n\t\tlevel,\n\t\tsource,\n\t\tmessage,\n\t})\n\n\tif (recentEvents.length > MAX_RECENT_EVENTS) {\n\t\trecentEvents.length = MAX_RECENT_EVENTS\n\t}\n}\n\ndebuggerManager.onDetach((tabId, reason) => {\n\tclearTabState(tabId)\n\trecordEvent('error', 'debugger', `Tab ${tabId} detached: ${reason}`)\n\tvoid syncActionBadge(debuggerManager)\n})\n\ndebuggerManager.onEvent((tabId, method) => {\n\tif (!shouldReplayRememberedTarget(tabId, method)) {\n\t\treturn\n\t}\n\n\tvoid replayRememberedTargetSelection(tabId)\n})\n\nchrome.runtime.onMessage.addListener(\n\t(message: PopupActionMessage, _sender: chrome.runtime.MessageSender, sendResponse: (response: unknown) => void) => {\n\t\tvoid handlePopupMessage(message, sendResponse)\n\t\treturn true\n\t},\n)\n\nchrome.runtime.onStartup.addListener(() => {\n\tensureControlBridgeSession()\n})\n\nchrome.runtime.onInstalled.addListener(() => {\n\tensureControlBridgeSession()\n})\n\nasync function handlePopupMessage(message: PopupActionMessage, sendResponse: (response: unknown) => void): Promise<void> {\n\tensureControlBridgeSession()\n\tpruneStaleBridgeSessions()\n\tconst response = await buildPopupResponse(message)\n\tawait syncActionBadge(debuggerManager)\n\tsendResponse(response)\n}\n\nfunction ensureControlBridgeSession(): void {\n\tif (controlBridgeSession.isConnected()) {\n\t\treturn\n\t}\n\tcontrolBridgeSession.connect()\n}\n\nensureControlBridgeSession()\n\nasync function attachTabFromControl(tabId: number, options: TabBridgeSessionOptions = {}): Promise<TabActionResult> {\n\ttry {\n\t\tconst session = await attachBridgeSession(tabId, options)\n\t\tsetSelectedFrame(tabId, null)\n\t\tawait prepareRememberedTargetSelection(tabId)\n\t\trecordEvent('info', 'bridge', `Control attached tab ${tabId}`)\n\t\tvoid syncActionBadge(debuggerManager)\n\n\t\tconst tab = await getTabInfo(tabId)\n\t\tif (!tab) {\n\t\t\treturn { ok: false, error: `Tab ${tabId} is no longer available` }\n\t\t}\n\n\t\treturn { ok: true, tab, watcherId: session.getWatcherInfo()?.watcherId }\n\t} catch (error) {\n\t\treturn { ok: false, error: formatError(error) }\n\t}\n}\n\nasync function detachTabFromControl(tabId: number): Promise<TabActionResult> {\n\ttry {\n\t\tawait detachTab(tabId)\n\t\trecordEvent('info', 'bridge', `Control detached tab ${tabId}`)\n\t\tvoid syncActionBadge(debuggerManager)\n\n\t\tconst tab = await getTabInfo(tabId)\n\t\tif (!tab) {\n\t\t\treturn { ok: false, error: `Tab ${tabId} is no longer available` }\n\t\t}\n\n\t\treturn { ok: true, tab }\n\t} catch (error) {\n\t\treturn { ok: false, error: formatError(error) }\n\t}\n}\n\nasync function buildPopupResponse<M extends PopupActionMessage>(message: M): Promise<PopupResponseFor<M['action']>> {\n\t// The union is narrowed per case below; the cast re-attaches each case's payload to\n\t// the caller's action, which TypeScript cannot infer through a switch on a generic.\n\treturn (await dispatchPopupAction(message)) as PopupResponseFor<M['action']>\n}\n\nasync function dispatchPopupAction(message: PopupActionMessage): Promise<PopupResponse> {\n\ttry {\n\t\tswitch (message.action) {\n\t\t\tcase 'getTargets':\n\t\t\t\treturn { success: true, tabs: await getTabsWithTargets() }\n\n\t\t\tcase 'attach': {\n\t\t\t\tconst { tabId } = message\n\t\t\t\tawait attachBridgeSession(tabId)\n\t\t\t\tsetSelectedFrame(tabId, null)\n\t\t\t\tawait prepareRememberedTargetSelection(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Attached tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'detach': {\n\t\t\t\tconst { tabId } = message\n\t\t\t\tawait detachTab(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Detached tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'focusTab': {\n\t\t\t\tconst { tabId } = message\n\t\t\t\tawait focusTab(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Focused tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'selectTarget': {\n\t\t\t\tconst { tabId, frameId } = message\n\t\t\t\tconst session = bridgeSessions.get(tabId)\n\t\t\t\tif (!session) {\n\t\t\t\t\treturn { success: false, error: `No watcher bridge for tab ${tabId}` }\n\t\t\t\t}\n\n\t\t\t\tconst target = getPopupTarget(debuggerManager, tabId, frameId)\n\t\t\t\tif (!target) {\n\t\t\t\t\treturn { success: false, error: `Unknown target for tab ${tabId}` }\n\t\t\t\t}\n\n\t\t\t\tsession.selectTarget(frameId)\n\t\t\t\tclearPendingRememberedTarget(tabId)\n\t\t\t\tsetSelectedFrame(tabId, frameId)\n\t\t\t\tawait rememberTargetSelection(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Selected ${frameId ? `iframe ${frameId}` : 'page'} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'hideTarget': {\n\t\t\t\tconst { tabId, frameId } = message\n\t\t\t\tconst target = getRequiredIframeTarget(debuggerManager, tabId, frameId)\n\t\t\t\tawait hideTarget(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Hid iframe ${target.frameId} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'showTarget': {\n\t\t\t\tconst { tabId, frameId } = message\n\t\t\t\tconst target = getRequiredIframeTarget(debuggerManager, tabId, frameId)\n\t\t\t\tawait showTarget(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Restored iframe ${target.frameId} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'getStatus':\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tstatus: buildPopupStatusPayload(),\n\t\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\trecordEvent('error', 'popup', err instanceof Error ? err.message : 'Unknown popup error')\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: err instanceof Error ? err.message : 'Unknown error',\n\t\t}\n\t}\n}\n\nasync function attachBridgeSession(tabId: number, options: TabBridgeSessionOptions = {}): Promise<TabBridgeSession> {\n\tconst existing = bridgeSessions.get(tabId)\n\tif (existing) {\n\t\tawait connectBridgeSession(tabId, existing)\n\t\treturn existing\n\t}\n\n\tconst session = new TabBridgeSession(\n\t\ttabId,\n\t\tdebuggerManager,\n\t\t{\n\t\t\tonWatcherInfo: (info) => {\n\t\t\t\trecordEvent('info', 'bridge', `Watcher ready for tab ${tabId}: ${info.watcherId} (pid ${info.pid})`)\n\t\t\t},\n\t\t\tonTargetInfo: (info) => {\n\t\t\t\tsyncSelectedFrameFromWatcher(info.targetId)\n\t\t\t},\n\t\t\tonDisconnect: () => {\n\t\t\t\trecordEvent('error', 'bridge', `Native host disconnected for tab ${tabId}`)\n\t\t\t\tvoid debuggerManager.detach(tabId).catch(() => {})\n\t\t\t\tclearTabState(tabId)\n\t\t\t\tvoid syncActionBadge(debuggerManager)\n\t\t\t},\n\t\t},\n\t\toptions,\n\t)\n\tattachments.set(tabId, { session })\n\tawait connectBridgeSession(tabId, session)\n\treturn session\n}\n\nasync function detachTab(tabId: number): Promise<void> {\n\tconst session = bridgeSessions.get(tabId)\n\tif (session) {\n\t\tawait session.detach()\n\t} else {\n\t\tawait debuggerManager.detach(tabId)\n\t}\n\n\tclearTabState(tabId)\n}\n\n/**\n * Activating the tab is not enough when it lives in a background window, so explicitly focus the host window too.\n */\nasync function focusTab(tabId: number): Promise<void> {\n\tconst tab = await chrome.tabs.get(tabId)\n\tawait chrome.tabs.update(tabId, { active: true })\n\tawait chrome.windows.update(tab.windowId, { focused: true })\n}\n\nasync function connectBridgeSession(tabId: number, session: TabBridgeSession): Promise<void> {\n\ttry {\n\t\tawait session.connectAndAttach()\n\t} catch (error) {\n\t\tdestroyBridgeSession(tabId)\n\t\tthrow error\n\t}\n}\n\nfunction clearTabState(tabId: number): void {\n\tdestroyBridgeSession(tabId)\n}\n\n/**\n * Chrome can drop the root debugger attachment from the infobar while the native host is still\n * alive long enough to keep reporting its last selected target. Trim those orphaned bridge\n * sessions before serving popup state so the badge and popup stay aligned with actual attachments.\n */\nfunction pruneStaleBridgeSessions(): void {\n\tfor (const [tabId, attachment] of attachments.entries()) {\n\t\tif (debuggerManager.isAttached(tabId) || !attachment.session.getTargetInfo()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tclearTabState(tabId)\n\t\trecordEvent('error', 'bridge', `Pruned stale watcher state for tab ${tabId}`)\n\t}\n}\n\nfunction destroyBridgeSession(tabId: number): void {\n\tconst attachment = attachments.get(tabId)\n\tif (!attachment) {\n\t\treturn\n\t}\n\n\tattachments.delete(tabId)\n\tattachment.session.dispose()\n}\n\nfunction buildPopupStatusPayload(): PopupStatusPayload {\n\treturn {\n\t\tbridgeConnected: [...bridgeSessions.values()].some((session) => session.isConnected()),\n\t\tattachedTabs: debuggerManager.listAttached().map((target) => ({\n\t\t\ttabId: target.tabId,\n\t\t\turl: target.url,\n\t\t\ttitle: target.title,\n\t\t})),\n\t\twatchers: getWatcherStatuses(),\n\t}\n}\n\nfunction buildControlDiagnostics(): ControlDiagnostics {\n\tconst controlInfo = controlBridgeSession.getWatcherInfo()\n\treturn {\n\t\textensionId: chrome.runtime.id ?? null,\n\t\textensionVersion: chrome.runtime.getManifest().version ?? null,\n\t\tcontrol: {\n\t\t\tconnected: controlBridgeSession.isConnected(),\n\t\t\twatcherId: controlInfo?.watcherId ?? null,\n\t\t\twatcherHost: controlInfo?.watcherHost ?? null,\n\t\t\twatcherPort: controlInfo?.watcherPort ?? null,\n\t\t\tpid: controlInfo?.pid ?? null,\n\t\t\tlastMessageAt: controlBridgeSession.getLastMessageAt(),\n\t\t},\n\t\ttabWatchers: [...bridgeSessions.entries()].map(([tabId, session]) => buildTabBridgeStatus(tabId, session)),\n\t\trecentEvents,\n\t}\n}\n\nfunction buildTabBridgeStatus(tabId: number, session: TabBridgeSession): ControlDiagnostics['tabWatchers'][number] {\n\tconst watcher = session.getWatcherInfo()\n\tconst target = session.getTargetInfo()\n\treturn {\n\t\ttabId,\n\t\tconnected: session.isConnected(),\n\t\twatcherId: watcher?.watcherId ?? null,\n\t\twatcherHost: watcher?.watcherHost ?? null,\n\t\twatcherPort: watcher?.watcherPort ?? null,\n\t\tpid: watcher?.pid ?? null,\n\t\ttargetId: target?.targetId ?? null,\n\t\ttargetTitle: target?.title ?? null,\n\t\ttargetUrl: target?.url ?? null,\n\t\ttargetReady: target?.targetReady ?? null,\n\t\tlastMessageAt: session.getLastMessageAt(),\n\t}\n}\n\nasync function getTabInfo(tabId: number): Promise<TabInfo | null> {\n\tconst tabs = await listBrowserTabs(debuggerManager, undefined, {\n\t\tgetWatcherIdForTab,\n\t})\n\treturn tabs.find((tab) => tab.tabId === tabId) ?? null\n}\n\nfunction getWatcherIdForTab(tabId: number): string | null {\n\treturn bridgeSessions.get(tabId)?.getWatcherInfo()?.watcherId ?? null\n}\n\nfunction getWatcherStatuses(): PopupWatcherStatus[] {\n\treturn [...bridgeSessions.entries()]\n\t\t.map(([tabId, session]) => buildWatcherStatus(debuggerManager, tabId, session))\n\t\t.filter((status): status is PopupWatcherStatus => status !== null)\n}\n\nasync function getTabsWithTargets(): Promise<PopupTabWithTargets[]> {\n\tconst tabs = await listBrowserTabs(debuggerManager)\n\treturn await Promise.all(\n\t\ttabs.map(async (tab) => {\n\t\t\tconst session = bridgeSessions.get(tab.tabId)\n\t\t\tconst { visibleTargets, hiddenTargets } = await getPopupTargetVisibility(tab.tabId, tab.attached)\n\t\t\treturn {\n\t\t\t\t...tab,\n\t\t\t\ttargets: visibleTargets,\n\t\t\t\thiddenTargets,\n\t\t\t\tselectedFrameId: getSelectedFrameId(tab.tabId),\n\t\t\t\twatcher: session ? buildWatcherStatus(debuggerManager, tab.tabId, session) : null,\n\t\t\t}\n\t\t}),\n\t)\n}\n\nasync function getPopupTargetVisibility(tabId: number, attached: boolean): Promise<{ visibleTargets: PopupTarget[]; hiddenTargets: PopupTarget[] }> {\n\tconst targets = attached ? getPopupTargets(debuggerManager, tabId) : []\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn { visibleTargets: targets, hiddenTargets: [] }\n\t}\n\n\tconst hiddenTargets = await filterHiddenTargets(pageUrl, targets)\n\tif (hiddenTargets.length === 0) {\n\t\treturn { visibleTargets: targets, hiddenTargets }\n\t}\n\n\treturn {\n\t\tvisibleTargets: targets.filter((target) => !hiddenTargets.includes(target)),\n\t\thiddenTargets,\n\t}\n}\n\nfunction syncSelectedFrameFromWatcher(targetId: string): void {\n\tconst target = parseWatcherTargetId(targetId)\n\tif (!target) {\n\t\treturn\n\t}\n\n\tsetSelectedFrame(target.tabId, target.frameId)\n}\n\nfunction getSelectedFrameId(tabId: number): string | null | undefined {\n\treturn attachments.get(tabId)?.selectedFrameId\n}\n\nasync function rememberTargetSelection(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetSelectionHistory.remember(pageUrl, toSelectionTarget(target))\n}\n\nasync function hideTarget(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetVisibilityHistory.hide(pageUrl, toSelectionTarget(target))\n\tif (getSelectedFrameId(tabId) !== target.frameId) {\n\t\treturn\n\t}\n\n\tconst session = bridgeSessions.get(tabId)\n\tsession?.selectTarget(null)\n\tsetSelectedFrame(tabId, null)\n\tconst pageTarget = getPopupTarget(debuggerManager, tabId, null)\n\tif (pageTarget) {\n\t\tawait rememberTargetSelection(tabId, pageTarget)\n\t}\n}\n\nasync function showTarget(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetVisibilityHistory.show(pageUrl, toSelectionTarget(target))\n}\n\nasync function filterHiddenTargets(pageUrl: string, targets: PopupTarget[]): Promise<PopupTarget[]> {\n\tconst hiddenTargets = await targetVisibilityHistory.getHiddenTargets(pageUrl)\n\tif (hiddenTargets.length === 0) {\n\t\treturn []\n\t}\n\n\treturn targets.filter((target) => hiddenTargets.some((hiddenTarget) => matchesHiddenTarget(hiddenTarget, toSelectionTarget(target))))\n}\n\nasync function prepareRememberedTargetSelection(tabId: number): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\tclearPendingRememberedTarget(tabId)\n\t\treturn\n\t}\n\n\tconst remembered = await targetSelectionHistory.getByPageUrl(pageUrl)\n\tif (!remembered || remembered.target.type === 'page') {\n\t\tclearPendingRememberedTarget(tabId)\n\t\treturn\n\t}\n\n\tsetPendingRememberedTarget(tabId, remembered)\n\tawait replayRememberedTargetSelection(tabId)\n}\n\nasync function replayRememberedTargetSelection(tabId: number): Promise<void> {\n\tconst attachment = attachments.get(tabId)\n\tconst remembered = attachment?.pendingRememberedTarget\n\tif (!attachment || !remembered) {\n\t\treturn\n\t}\n\n\tconst target = matchRememberedIframeTarget(\n\t\tremembered,\n\t\tgetPopupTargets(debuggerManager, tabId).map((candidate) => toSelectionTarget(candidate)),\n\t)\n\tif (!target?.frameId) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tattachment.session.selectTarget(target.frameId)\n\t\tsetSelectedFrame(tabId, target.frameId)\n\t\tclearPendingRememberedTarget(tabId)\n\t\trecordEvent('info', 'bridge', `Restored iframe ${target.frameId} on tab ${tabId}`)\n\t} catch (error) {\n\t\tconsole.warn(`[ServiceWorker] Failed to restore remembered iframe for tab ${tabId}:`, error)\n\t}\n}\n\nfunction shouldReplayRememberedTarget(tabId: number, method: string): boolean {\n\treturn attachments.get(tabId)?.pendingRememberedTarget != null && REMEMBERED_TARGET_RETRY_EVENTS.has(method)\n}\n\nfunction setSelectedFrame(tabId: number, frameId: string | null): void {\n\tconst attachment = attachments.get(tabId)\n\tif (attachment) {\n\t\tattachment.selectedFrameId = frameId\n\t}\n}\n\nfunction setPendingRememberedTarget(tabId: number, remembered: RememberedTargetSelection): void {\n\tconst attachment = attachments.get(tabId)\n\tif (attachment) {\n\t\tattachment.pendingRememberedTarget = remembered\n\t}\n}\n\nfunction clearPendingRememberedTarget(tabId: number): void {\n\tconst attachment = attachments.get(tabId)\n\tif (attachment) {\n\t\tdelete attachment.pendingRememberedTarget\n\t}\n}\n\nconsole.log('[ServiceWorker] Argus CDP Bridge extension loaded')\nvoid syncActionBadge(debuggerManager)\n\nexport { debuggerManager, bridgeSessions }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["debuggerManager", "debuggerManager", "debuggerManager", "debuggerManager", "normalizeOptionalText", "DEFAULT_STORAGE_KEY", "createChromeStoragePersistence", "debuggerManager", "debuggerManager", "debuggerManager"]
|
|
7
7
|
}
|