@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/popup/classify-target.ts", "../../src/popup/target-list.ts", "../../src/popup/popup.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Heuristic classification of iframe targets as \"low-interest\" (ad trackers,\n * consent managers, analytics pixels, etc.) so the popup can collapse them\n * behind a toggle instead of cluttering the target list.\n *\n * Runs purely on the URL and title strings already available in PopupTarget \u2014\n * no DOM access or background queries needed.\n */\n\ntype ClassifiableTarget = {\n\ttype: 'page' | 'iframe'\n\turl: string\n\ttitle: string\n}\n\ntype LowInterestUrlRule = {\n\thost: string\n\tpathPrefix?: string\n}\n\n/**\n * URL rules for iframes that are usually browser/app infrastructure, not the\n * user's debuggable surface. Host suffix matching covers subdomains.\n */\nconst LOW_INTEREST_URL_RULES: LowInterestUrlRule[] = [\n\t{ host: 'accounts.google.com', pathPrefix: '/RotateCookiesPage' },\n\t{ host: 'clients6.google.com', pathPrefix: '/static/proxy.html' },\n\t{ host: 'contacts.google.com', pathPrefix: '/u/2/widget/hovercard/' },\n\t{ host: 'docs.google.com', pathPrefix: '/_/og/bscframe' },\n\t{ host: 'docs.google.com', pathPrefix: '/offline/iframeapi' },\n\t{ host: 'doubleclick.net' },\n\t{ host: 'googlesyndication.com' },\n\t{ host: 'google.com', pathPrefix: '/recaptcha' },\n\t{ host: 'googletagmanager.com' },\n\t{ host: 'google-analytics.com' },\n\t{ host: 'googleadservices.com' },\n\t{ host: 'connect.facebook.net' },\n\t{ host: 'facebook.com', pathPrefix: '/tr' },\n\t{ host: 'ozone-project.com' },\n\t{ host: 'amazon-adsystem.com' },\n\t{ host: 'adnxs.com' },\n\t{ host: 'adsrvr.org' },\n\t{ host: 'criteo.com' },\n\t{ host: 'inmobi.com' },\n\t{ host: 'rubiconproject.com' },\n\t{ host: 'pubmatic.com' },\n]\n\n/**\n * Title patterns that indicate framework-internal / utility iframes.\n * Matched against the full title string.\n */\nconst LOW_INTEREST_TITLE_PATTERNS: RegExp[] = [\n\t/^__\\w+__$/, // __pb_locator__, __tcfapiLocator\n\t/^googlefc/i, // googlefcPresent, googlefcInactive, googlefcLoaded\n]\n\nexport function isLowInterestTarget(target: ClassifiableTarget): boolean {\n\tif (target.type === 'page') return false\n\n\tconst url = target.url\n\tif (!url || url === 'about:blank' || url === 'about:srcdoc') return true\n\n\tif (matchesLowInterestUrl(url)) return true\n\n\tconst title = target.title\n\tif (title && LOW_INTEREST_TITLE_PATTERNS.some((pattern) => pattern.test(title))) return true\n\n\treturn false\n}\n\nfunction matchesLowInterestUrl(url: string): boolean {\n\ttry {\n\t\tconst parsed = new URL(url)\n\t\treturn LOW_INTEREST_URL_RULES.some((rule) => matchesUrlRule(parsed, rule))\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction matchesUrlRule(url: URL, rule: LowInterestUrlRule): boolean {\n\tif (!matchesHost(url.hostname, rule.host)) return false\n\tif (!rule.pathPrefix) return true\n\n\treturn url.pathname.startsWith(rule.pathPrefix)\n}\n\nfunction matchesHost(hostname: string, host: string): boolean {\n\treturn hostname === host || hostname.endsWith(`.${host}`)\n}\n", "import { isLowInterestTarget } from './classify-target.js'\nimport type { PopupTarget, TabInfo } from './types.js'\n\nconst HIDE_TARGET_ICON = `\n\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M10.7 5.1A10.7 10.7 0 0 1 12 5c5 0 8.5 4.5 9.5 6a13.4 13.4 0 0 1-2.7 3.2\"></path>\n\t\t<path d=\"M6.6 6.7A13.4 13.4 0 0 0 2.5 11c1 1.5 4.5 6 9.5 6a8.7 8.7 0 0 0 4.2-1.1\"></path>\n\t\t<path d=\"M14.1 14.1a3 3 0 0 1-4.2-4.2\"></path>\n\t\t<path d=\"M3 3l18 18\"></path>\n\t</svg>\n`\n\nconst SHOW_TARGET_ICON = `\n\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6z\"></path>\n\t\t<circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n\t</svg>\n`\n\nexport function renderTargetList(tab: TabInfo): string {\n\tconst targets = tab.targets ?? []\n\tconst hiddenTargets = tab.hiddenTargets ?? []\n\tif (targets.length <= 1 && hiddenTargets.length === 0) return ''\n\n\tconst primaryTargets: PopupTarget[] = []\n\tconst autoHiddenTargets: PopupTarget[] = []\n\tfor (const target of targets) {\n\t\tif (isLowInterestTarget(target)) {\n\t\t\tautoHiddenTargets.push(target)\n\t\t} else {\n\t\t\tprimaryTargets.push(target)\n\t\t}\n\t}\n\n\tconst primaryHtml = renderTargetItems(tab, primaryTargets, 'visible')\n\tconst hiddenFramesHtml = renderHiddenFramesSection(tab, autoHiddenTargets, hiddenTargets)\n\n\treturn `\n\t\t<div class=\"target-list\">\n\t\t\t${primaryHtml}\n\t\t\t${hiddenFramesHtml}\n\t\t</div>\n\t`\n}\n\nfunction renderHiddenFramesSection(tab: TabInfo, autoHiddenTargets: PopupTarget[], manuallyHiddenTargets: PopupTarget[]): string {\n\tconst count = autoHiddenTargets.length + manuallyHiddenTargets.length\n\tif (count === 0) {\n\t\treturn ''\n\t}\n\n\tconst hasSelectedAutoHiddenTarget = autoHiddenTargets.some((target) => isTargetSelected(tab.selectedFrameId, target.frameId))\n\tconst autoHiddenHtml = renderTargetItems(tab, autoHiddenTargets, 'visible')\n\tconst manuallyHiddenHtml = renderTargetItems(tab, manuallyHiddenTargets, 'hidden')\n\tconst expanded = hasSelectedAutoHiddenTarget ? 'open' : ''\n\n\treturn `\n <details class=\"target-collapsed target-hidden-list\" ${expanded}>\n <summary class=\"target-collapsed-toggle\">\n ${count} hidden frame${count === 1 ? '' : 's'}\n </summary>\n <div class=\"target-collapsed-list\">\n ${autoHiddenHtml}\n ${manuallyHiddenHtml}\n </div>\n </details>\n `\n}\n\nfunction renderTargetItems(tab: TabInfo, targets: PopupTarget[], visibility: 'visible' | 'hidden'): string {\n\treturn targets.map((target) => renderTargetItem(tab, target, visibility)).join('')\n}\n\nfunction renderTargetItem(tab: TabInfo, target: PopupTarget, visibility: 'visible' | 'hidden'): string {\n\tconst isSelected = isTargetSelected(tab.selectedFrameId, target.frameId)\n\tconst kindLabel = target.type === 'page' ? 'Page' : 'Iframe'\n\tconst title = target.title || kindLabel\n\tconst url = target.url || '(no url)'\n\tconst visibilityAction = renderTargetVisibilityAction(tab.tabId, target, visibility)\n\treturn `\n <div class=\"target-item ${isSelected ? 'selected' : ''} ${visibility === 'hidden' ? 'hidden-target' : ''}\">\n <button\n class=\"target-select-action\"\n data-action=\"select-target\"\n data-tab-id=\"${tab.tabId}\"\n data-frame-id=\"${escapeHtml(target.frameId ?? '')}\"\n type=\"button\"\n ${visibility === 'hidden' ? 'disabled' : ''}\n >\n <span class=\"target-kind\">${kindLabel}</span>\n <span class=\"target-meta\">\n <span class=\"target-title\" title=\"${escapeHtml(title)}\">${escapeHtml(title)}</span>\n <span class=\"target-url\" title=\"${escapeHtml(url)}\">${escapeHtml(url)}</span>\n </span>\n </button>\n ${visibilityAction}\n </div>\n `\n}\n\nfunction renderTargetVisibilityAction(tabId: number, target: PopupTarget, visibility: 'visible' | 'hidden'): string {\n\tif (target.type !== 'iframe' || !target.frameId) {\n\t\treturn ''\n\t}\n\n\tconst action = visibility === 'hidden' ? 'show-target' : 'hide-target'\n\tconst label = visibility === 'hidden' ? 'Show iframe target' : 'Hide iframe target'\n\tconst icon = visibility === 'hidden' ? SHOW_TARGET_ICON : HIDE_TARGET_ICON\n\n\treturn `\n\t\t<button\n\t\t\tclass=\"target-visibility-action\"\n\t\t\tdata-action=\"${action}\"\n\t\t\tdata-tab-id=\"${tabId}\"\n\t\t\tdata-frame-id=\"${escapeHtml(target.frameId)}\"\n\t\t\ttype=\"button\"\n\t\t\ttitle=\"${label}\"\n\t\t\taria-label=\"${label}\"\n\t\t>\n\t\t\t${icon}\n\t\t</button>\n\t`\n}\n\nfunction isTargetSelected(selectedFrameId: string | null | undefined, targetFrameId: string | null): boolean {\n\treturn selectedFrameId !== undefined && (selectedFrameId ?? null) === (targetFrameId ?? null)\n}\n\nfunction escapeHtml(text: string): string {\n\tconst div = document.createElement('div')\n\tdiv.textContent = text\n\treturn div.innerHTML\n}\n", "/**\n * Popup UI for the Argus CDP Bridge extension.\n * Displays tabs, target selection, and bridge/debugger health.\n */\n\nimport { renderTargetList } from './target-list.js'\nimport type { CurrentTargetSummary, PopupWatcherStatus, TabInfo } from './types.js'\n\ntype StatusPayload = {\n\tbridgeConnected: boolean\n\tattachedTabs: Array<{ tabId: number; url: string; title: string }>\n\twatchers: PopupWatcherStatus[]\n}\n\ntype StatusResponse = {\n\tsuccess: boolean\n\tstatus?: StatusPayload\n\terror?: string\n}\n\ntype TabsResponse = {\n\tsuccess: boolean\n\ttabs?: TabInfo[]\n\terror?: string\n}\n\ntype ActionResponse = {\n\tsuccess: boolean\n\terror?: string\n}\n\ntype PopupAction = 'attach' | 'detach' | 'focusTab' | 'selectTarget' | 'hideTarget' | 'showTarget'\ntype TabButtonAction = 'attach' | 'detach' | 'copy-info'\n\nconst COPY_ICON = `\n\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"></rect>\n\t\t<path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"></path>\n\t</svg>\n`\n\nconst CHECK_ICON = `\n\t<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M3 8.5l3.1 3.1L13 4.75\"></path>\n\t</svg>\n`\n\nconst DETACH_ICON = `\n\t<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M5.4 1.75h5.2l3.65 3.65v5.2l-3.65 3.65H5.4l-3.65-3.65V5.4z\"></path>\n\t\t<path d=\"M6 6l4 4\"></path>\n\t\t<path d=\"M10 6l-4 4\"></path>\n\t</svg>\n`\n\n// DOM elements\nconst statusIndicator = document.getElementById('statusIndicator') as HTMLDivElement\nconst statusText = document.getElementById('statusText') as HTMLSpanElement\nconst attachedSection = document.getElementById('attachedSection') as HTMLDivElement\nconst attachedContent = document.getElementById('attachedContent') as HTMLDivElement\nconst availableSection = document.getElementById('availableSection') as HTMLDivElement\nconst availableContent = document.getElementById('availableContent') as HTMLDivElement\nconst attachedCount = document.getElementById('attachedCount') as HTMLSpanElement\nconst errorBanner = document.getElementById('errorBanner') as HTMLDivElement\nconst healthSummary = document.getElementById('healthSummary') as HTMLSpanElement\nconst healthNativeHost = document.getElementById('healthNativeHost') as HTMLDivElement\nconst healthWatcherReady = document.getElementById('healthWatcherReady') as HTMLDivElement\nconst healthWatcherId = document.getElementById('healthWatcherId') as HTMLDivElement\nconst healthAttachedCount = document.getElementById('healthAttachedCount') as HTMLDivElement\nconst healthSelectedTarget = document.getElementById('healthSelectedTarget') as HTMLDivElement\nconst healthLastMessage = document.getElementById('healthLastMessage') as HTMLDivElement\nconst healthPid = document.getElementById('healthPid') as HTMLDivElement\nconst copyAllButton = document.getElementById('copyAllButton') as HTMLButtonElement\nconst detachAllButton = document.getElementById('detachAllButton') as HTMLButtonElement\n\nlet prevStateHash = ''\nlet currentError: string | null = null\nlet latestCurrentWatcher: PopupWatcherStatus | null = null\n// Copy actions run per attached row, so keep the latest watcher list alongside the focused watcher.\nlet latestWatchers: PopupWatcherStatus[] = []\n\ncopyAllButton.addEventListener('click', () => {\n\tvoid copyAllWatchersInfo().catch((error) => {\n\t\tshowError(error instanceof Error ? error.message : 'Copy failed')\n\t})\n})\n\ndetachAllButton.addEventListener('click', () => {\n\tvoid detachAllWatchers()\n})\n\n// Prevent button clicks inside the health summary from toggling the <details> open/close.\ndocument.querySelector('.health-summary-actions')?.addEventListener('click', (event) => {\n\tevent.stopPropagation()\n})\n\nasync function sendMessage<T>(message: { action: string; tabId?: number; frameId?: string | null }): Promise<T> {\n\treturn new Promise((resolve) => {\n\t\tchrome.runtime.sendMessage(message, resolve)\n\t})\n}\n\nfunction setEmptyState(icon: string, message: string): void {\n\tavailableSection.classList.remove('hidden')\n\tattachedSection.classList.add('hidden')\n\tavailableContent.innerHTML = `\n <div class=\"empty-state\">\n <div class=\"icon\">${escapeHtml(icon)}</div>\n <div>${escapeHtml(message)}</div>\n </div>\n `\n}\n\nfunction updateStatus(connected: boolean, tabCount: number): void {\n\tstatusIndicator.classList.toggle('connected', connected)\n\tstatusText.textContent = connected ? 'Bridge connected' : 'Bridge disconnected'\n\tattachedCount.textContent = `${tabCount} attached`\n}\n\nfunction showError(message: string | null): void {\n\tcurrentError = message\n\terrorBanner.textContent = message ?? ''\n\terrorBanner.classList.toggle('hidden', !message)\n}\n\nfunction updateHealth(status: StatusPayload | undefined, watcher: PopupWatcherStatus | null): void {\n\tconst target = watcher?.currentTarget ?? null\n\tconst tabCount = status?.attachedTabs.length ?? 0\n\tconst nativeHostConnected = watcher?.nativeHostConnected ?? status?.bridgeConnected ?? false\n\tconst watcherReady = watcher?.watcherReady ?? false\n\tconst targetState = watcher?.targetState ?? 'not-selected'\n\n\thealthSummary.textContent = buildHealthSummaryText({\n\t\tnativeHostConnected,\n\t\twatcherReady,\n\t\ttargetState,\n\t\twatcherId: watcher?.watcherId ?? null,\n\t\ttabCount,\n\t})\n\tsetHealthValueState(healthNativeHost, nativeHostConnected ? 'Connected' : 'Disconnected', nativeHostConnected ? 'connected' : 'disconnected')\n\tsetHealthValueState(healthWatcherReady, watcherReady ? 'Ready' : 'Not ready', watcherReady ? 'connected' : 'disconnected')\n\thealthWatcherId.textContent = watcher?.watcherId ?? '-'\n\thealthAttachedCount.textContent = String(tabCount)\n\tsetHealthValueState(healthSelectedTarget, formatTargetState(target, targetState), getTargetStateClass(targetState))\n\thealthLastMessage.textContent = formatRelativeTimestamp(watcher?.lastMessageAt ?? null)\n\thealthPid.textContent = watcher?.nativeHostPid ? String(watcher.nativeHostPid) : '-'\n\tconst hasWatchers = latestWatchers.length > 0\n\tcopyAllButton.disabled = !hasWatchers\n\tdetachAllButton.disabled = !hasWatchers\n}\n\nfunction buildHealthSummaryText(input: {\n\tnativeHostConnected: boolean\n\twatcherReady: boolean\n\ttargetState: PopupWatcherStatus['targetState']\n\twatcherId: string | null\n\ttabCount: number\n}): string {\n\tconst parts: string[] = []\n\tif (input.watcherId) parts.push(input.watcherId)\n\tparts.push(input.nativeHostConnected ? 'Host connected' : 'Host disconnected')\n\tparts.push(input.watcherReady ? 'Watcher ready' : 'Watcher not ready')\n\tif (input.targetState === 'rebinding') parts.push('Target rebinding')\n\tif (input.tabCount > 0) parts.push(`${input.tabCount} tab${input.tabCount === 1 ? '' : 's'}`)\n\treturn parts.join(' \u00B7 ')\n}\n\nfunction setHealthValueState(element: HTMLElement, text: string, stateClass: 'connected' | 'disconnected' | 'warning' | null): void {\n\telement.textContent = text\n\telement.classList.toggle('connected', stateClass === 'connected')\n\telement.classList.toggle('disconnected', stateClass === 'disconnected')\n\telement.classList.toggle('warning', stateClass === 'warning')\n}\n\nfunction formatTargetState(target: CurrentTargetSummary | null, state: PopupWatcherStatus['targetState']): string {\n\tif (!target || state === 'not-selected') {\n\t\treturn '-'\n\t}\n\n\tconst label = target.type === 'page' ? 'Page' : 'Iframe'\n\treturn state === 'ready' ? `${label} ready` : `${label} rebinding`\n}\n\nfunction getTargetStateClass(state: PopupWatcherStatus['targetState']): 'connected' | 'disconnected' | 'warning' | null {\n\tif (state === 'ready') {\n\t\treturn 'connected'\n\t}\n\tif (state === 'rebinding') {\n\t\treturn 'warning'\n\t}\n\treturn null\n}\n\nfunction renderTabs(tabs: TabInfo[], currentTabId?: number): void {\n\tif (tabs.length === 0) {\n\t\tsetEmptyState('\uD83D\uDD0D', 'No tabs available')\n\t\treturn\n\t}\n\n\tconst attachedTabs = tabs.filter((tab) => tab.attached)\n\tlet availableTabs = tabs.filter((tab) => !tab.attached)\n\n\tif (currentTabId !== undefined) {\n\t\tconst currentTabIndex = availableTabs.findIndex((tab) => tab.tabId === currentTabId)\n\t\tif (currentTabIndex > 0) {\n\t\t\tconst [currentTab] = availableTabs.splice(currentTabIndex, 1)\n\t\t\tavailableTabs.unshift(currentTab)\n\t\t}\n\t}\n\n\trenderTabGroup(attachedSection, attachedContent, attachedTabs, true)\n\trenderTabGroup(availableSection, availableContent, availableTabs, false)\n}\n\nfunction renderTabItem(tab: TabInfo, showTargets: boolean): string {\n\tconst favicon = tab.faviconUrl\n\t\t? `<img class=\"tab-favicon\" src=\"${escapeHtml(tab.faviconUrl)}\" alt=\"\">`\n\t\t: `<div class=\"tab-favicon\" style=\"background: #e0e0e0\"></div>`\n\tconst watcherSuffix = tab.attached && tab.watcher?.watcherId ? ` (${tab.watcher.watcherId})` : ''\n\tconst actions = tab.attached ? renderAttachedTabActions(tab.tabId) : renderAttachButton(tab.tabId)\n\tconst fullTitle = (tab.title || 'Untitled') + watcherSuffix\n\n\treturn `\n <div class=\"tab-item ${tab.attached ? 'attached' : ''}\" data-tab-id=\"${tab.tabId}\">\n ${favicon}\n <div class=\"tab-info\">\n <div class=\"tab-title\" title=\"${escapeHtml(fullTitle)}\">${escapeHtml(fullTitle)}</div>\n <div class=\"tab-url\" title=\"${escapeHtml(tab.url)}\">${escapeHtml(tab.url)}</div>\n </div>\n ${actions}\n </div>\n ${showTargets ? renderTargetList(tab) : ''}\n `\n}\n\nfunction renderTabGroup(section: HTMLDivElement, content: HTMLDivElement, tabs: TabInfo[], showTargets: boolean): void {\n\tif (tabs.length === 0) {\n\t\tsection.classList.add('hidden')\n\t\tcontent.innerHTML = ''\n\t\treturn\n\t}\n\n\tsection.classList.remove('hidden')\n\tcontent.innerHTML = `<div class=\"tab-list\">${tabs.map((tab) => renderTabItem(tab, showTargets)).join('')}</div>`\n\tbindTabInteractions(content)\n}\n\nfunction bindTabInteractions(root: ParentNode): void {\n\troot.querySelectorAll('.tab-action').forEach((button) => {\n\t\tbutton.addEventListener('click', handleTabAction)\n\t})\n\troot.querySelectorAll('[data-action=\"select-target\"]').forEach((button) => {\n\t\tbutton.addEventListener('click', handleTargetSelection)\n\t})\n\troot.querySelectorAll('[data-action=\"hide-target\"], [data-action=\"show-target\"]').forEach((button) => {\n\t\tbutton.addEventListener('click', handleTargetVisibility)\n\t})\n\troot.querySelectorAll('.tab-item').forEach((item) => {\n\t\titem.addEventListener('click', handleTabItemClick)\n\t})\n}\n\nfunction renderAttachedTabActions(tabId: number): string {\n\treturn `\n\t\t<div class=\"tab-actions\">\n\t\t\t${renderIconActionButton(tabId, 'copy-info', 'copy', 'Copy watcher info', COPY_ICON)}\n\t\t\t${renderIconActionButton(tabId, 'detach', 'detach', 'Detach', DETACH_ICON)}\n\t\t</div>\n\t`\n}\n\nfunction renderAttachButton(tabId: number): string {\n\treturn `<button class=\"tab-action attach\" data-tab-id=\"${tabId}\" data-action=\"attach\" type=\"button\">Attach</button>`\n}\n\nfunction renderIconActionButton(tabId: number, action: Exclude<TabButtonAction, 'attach'>, variant: string, label: string, icon: string): string {\n\treturn `\n\t\t<button\n\t\t\tclass=\"tab-action icon-only ${variant}\"\n\t\t\tdata-tab-id=\"${tabId}\"\n\t\t\tdata-action=\"${action}\"\n\t\t\ttype=\"button\"\n\t\t\ttitle=\"${label}\"\n\t\t\taria-label=\"${label}\"\n\t\t>\n\t\t\t<span class=\"tab-action-icon\" aria-hidden=\"true\">${icon}</span>\n\t\t</button>\n\t`\n}\n\nasync function handleTabItemClick(event: Event): Promise<void> {\n\tconst target = event.target as HTMLElement\n\tif (target.closest('.tab-action')) {\n\t\treturn\n\t}\n\n\tconst tabItem = event.currentTarget as HTMLElement\n\tconst tabId = getTabId(tabItem)\n\tconst action = getTabItemAction(tabItem)\n\n\ttabItem.style.opacity = '0.6'\n\ttabItem.style.pointerEvents = 'none'\n\n\ttry {\n\t\tawait runPopupAction(action, { tabId })\n\t\tif (action === 'attach') {\n\t\t\tawait refreshTabs(true)\n\t\t}\n\t} catch (error) {\n\t\tshowError(error instanceof Error ? error.message : `${capitalize(action)} failed`)\n\t\ttabItem.style.opacity = '1'\n\t\ttabItem.style.pointerEvents = 'auto'\n\t}\n}\n\n/**\n * Attached rows act like \"jump to this Chrome tab\"; unattached rows keep the existing one-click attach flow.\n */\nfunction getTabItemAction(tabItem: HTMLElement): Extract<PopupAction, 'attach' | 'focusTab'> {\n\treturn tabItem.classList.contains('attached') ? 'focusTab' : 'attach'\n}\n\nasync function handleTabAction(event: Event): Promise<void> {\n\tconst button = (event.target as HTMLElement).closest('.tab-action') as HTMLButtonElement | null\n\tif (!button) {\n\t\treturn\n\t}\n\n\tconst tabId = getTabId(button)\n\tconst action = button.dataset.action as TabButtonAction\n\n\tif (action === 'copy-info') {\n\t\ttry {\n\t\t\tawait copyWatcherInfo(tabId, button)\n\t\t} catch (error) {\n\t\t\tshowError(error instanceof Error ? error.message : 'Copy failed')\n\t\t}\n\t\treturn\n\t}\n\n\tconst restoreButton = setBusyButtonState(button, action)\n\n\ttry {\n\t\tawait runPopupAction(action, { tabId })\n\t\tawait refreshTabs(true)\n\t} catch (error) {\n\t\tshowError(error instanceof Error ? error.message : `${capitalize(action)} failed`)\n\t\trestoreButton()\n\t}\n}\n\nasync function handleTargetSelection(event: Event): Promise<void> {\n\tconst button = event.currentTarget as HTMLButtonElement\n\tconst tabId = getTabId(button)\n\tconst frameId = button.dataset.frameId || null\n\n\tbutton.disabled = true\n\n\ttry {\n\t\tawait runPopupAction('selectTarget', { tabId, frameId })\n\t\tawait refreshTabs(true)\n\t} catch (error) {\n\t\tshowError(error instanceof Error ? error.message : 'Target selection failed')\n\t\tbutton.disabled = false\n\t}\n}\n\nasync function handleTargetVisibility(event: Event): Promise<void> {\n\tevent.stopPropagation()\n\tconst button = event.currentTarget as HTMLButtonElement\n\tconst tabId = getTabId(button)\n\tconst frameId = button.dataset.frameId || null\n\tconst action = button.dataset.action === 'show-target' ? 'showTarget' : 'hideTarget'\n\n\tbutton.disabled = true\n\n\ttry {\n\t\tawait runPopupAction(action, { tabId, frameId })\n\t\tawait refreshTabs(true)\n\t} catch (error) {\n\t\tshowError(error instanceof Error ? error.message : action === 'hideTarget' ? 'Target hide failed' : 'Target restore failed')\n\t\tbutton.disabled = false\n\t}\n}\n\nasync function runPopupAction(action: PopupAction, args: { tabId: number; frameId?: string | null }): Promise<void> {\n\tconst response = await sendMessage<ActionResponse>({ action, ...args })\n\tif (!response.success) {\n\t\tthrow new Error(response.error ?? `${capitalize(action)} failed`)\n\t}\n\n\tshowError(null)\n}\n\nasync function refreshTabs(forceRender = false): Promise<void> {\n\ttry {\n\t\tconst [statusResponse, tabsResponse, activeTab] = await Promise.all([\n\t\t\tsendMessage<StatusResponse>({ action: 'getStatus' }),\n\t\t\tsendMessage<TabsResponse>({ action: 'getTargets' }),\n\t\t\tgetCurrentTab(),\n\t\t])\n\n\t\tif (!statusResponse.success) {\n\t\t\tthrow new Error(statusResponse.error ?? 'Failed to load bridge status')\n\t\t}\n\n\t\tconst status = statusResponse.status\n\t\tlatestWatchers = status?.watchers ?? []\n\t\tlatestCurrentWatcher = selectCurrentWatcher(status ?? null, tabsResponse.tabs ?? [], activeTab?.id)\n\n\t\tconst stateHash = JSON.stringify({\n\t\t\tstatus,\n\t\t\ttabs: tabsResponse.tabs,\n\t\t\tcurrentTabId: activeTab?.id,\n\t\t\terror: currentError ?? tabsResponse.error ?? null,\n\t\t})\n\n\t\tif (!forceRender && stateHash === prevStateHash) {\n\t\t\treturn\n\t\t}\n\t\tprevStateHash = stateHash\n\n\t\tupdateStatus(status?.bridgeConnected ?? false, status?.attachedTabs.length ?? 0)\n\t\tupdateHealth(status, latestCurrentWatcher)\n\n\t\tif (tabsResponse.success && tabsResponse.tabs) {\n\t\t\trenderTabs(tabsResponse.tabs, activeTab?.id)\n\t\t\tshowError(currentError)\n\t\t\treturn\n\t\t}\n\n\t\tshowError(tabsResponse.error ?? 'Failed to load tabs')\n\t\tsetEmptyState('\u26A0\uFE0F', tabsResponse.error ?? 'Failed to load tabs')\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : 'Failed to refresh popup'\n\t\tshowError(message)\n\t\tupdateStatus(false, 0)\n\t\tlatestWatchers = []\n\t\tlatestCurrentWatcher = null\n\t\tupdateHealth(undefined, null)\n\t\tsetEmptyState('\u26A0\uFE0F', message)\n\t}\n}\n\nfunction formatRelativeTimestamp(timestamp: number | null): string {\n\tif (!timestamp) {\n\t\treturn '-'\n\t}\n\n\tconst elapsedMs = Math.max(0, Date.now() - timestamp)\n\tif (elapsedMs < 1000) {\n\t\treturn 'Just now'\n\t}\n\n\tconst elapsedSeconds = Math.floor(elapsedMs / 1000)\n\tif (elapsedSeconds < 60) {\n\t\treturn `${elapsedSeconds}s ago`\n\t}\n\n\tconst elapsedMinutes = Math.floor(elapsedSeconds / 60)\n\tif (elapsedMinutes < 60) {\n\t\treturn `${elapsedMinutes}m ago`\n\t}\n\n\tconst elapsedHours = Math.floor(elapsedMinutes / 60)\n\treturn `${elapsedHours}h ago`\n}\n\nasync function copyWatcherInfo(tabId: number, button: HTMLButtonElement): Promise<void> {\n\tconst watcher = findWatcherByTabId(latestWatchers, tabId)\n\tconst text = buildWatcherInfoText(watcher)\n\tif (!text) {\n\t\treturn\n\t}\n\n\tawait copyTextToClipboard(text)\n\tshowError(null)\n\trestoreButtonFeedback(button, 'Copied!', 1500, CHECK_ICON)\n}\n\nasync function copyAllWatchersInfo(): Promise<void> {\n\tconst text = buildAllWatchersInfoText(latestWatchers)\n\tif (!text) {\n\t\treturn\n\t}\n\n\tawait copyTextToClipboard(text)\n\tshowError(null)\n\trestoreButtonFeedback(copyAllButton, 'Copied!')\n}\n\nasync function copyTextToClipboard(text: string): Promise<void> {\n\ttry {\n\t\tawait navigator.clipboard.writeText(text)\n\t\treturn\n\t} catch {\n\t\t// Chrome extension popups can lose Clipboard API access depending on focus/permission state.\n\t}\n\n\tconst textarea = document.createElement('textarea')\n\ttextarea.value = text\n\ttextarea.setAttribute('readonly', 'true')\n\ttextarea.style.position = 'fixed'\n\ttextarea.style.opacity = '0'\n\ttextarea.style.pointerEvents = 'none'\n\tdocument.body.appendChild(textarea)\n\ttextarea.select()\n\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\ttry {\n\t\tconst copied = document.execCommand('copy')\n\t\tif (!copied) {\n\t\t\tthrow new Error('Browser denied clipboard write')\n\t\t}\n\t} finally {\n\t\ttextarea.remove()\n\t}\n}\n\nasync function detachAllWatchers(): Promise<void> {\n\tif (latestWatchers.length === 0) {\n\t\treturn\n\t}\n\n\tconst restoreBusyState = setButtonFeedback(detachAllButton, 'Detaching...')\n\tconst failures = await detachWatchers(latestWatchers.map((watcher) => watcher.tabId))\n\trestoreBusyState()\n\tawait refreshTabs(true)\n\n\tif (failures.length > 0) {\n\t\tshowError(buildDetachAllError(failures.length))\n\t\treturn\n\t}\n\n\tshowError(null)\n\trestoreButtonFeedback(detachAllButton, 'Detached!')\n}\n\n/**\n * Detach watchers one by one so a single failure does not block the rest of the cleanup.\n */\nasync function detachWatchers(tabIds: number[]): Promise<number[]> {\n\tconst failures: number[] = []\n\n\tfor (const tabId of tabIds) {\n\t\ttry {\n\t\t\tawait runPopupAction('detach', { tabId })\n\t\t} catch {\n\t\t\tfailures.push(tabId)\n\t\t}\n\t}\n\n\treturn failures\n}\n\nfunction setBusyButtonState(button: HTMLButtonElement, action: Extract<TabButtonAction, 'attach' | 'detach'>): () => void {\n\tconst previousMarkup = button.innerHTML\n\tconst restoreFeedback = setButtonFeedback(button, action === 'attach' ? 'Attaching...' : 'Detaching...')\n\tif (action === 'attach') {\n\t\tbutton.textContent = 'Attaching...'\n\t}\n\n\treturn () => {\n\t\tbutton.innerHTML = previousMarkup\n\t\trestoreFeedback()\n\t}\n}\n\nfunction restoreButtonFeedback(button: HTMLButtonElement, label: string, timeoutMs = 1500, iconMarkup?: string): void {\n\tconst restore = setButtonFeedback(button, label, iconMarkup)\n\tsetTimeout(restore, timeoutMs)\n}\n\nfunction setButtonFeedback(button: HTMLButtonElement, label: string, iconMarkup?: string): () => void {\n\tconst previousTitle = button.title\n\tconst previousLabel = button.getAttribute('aria-label')\n\tconst previousText = getButtonLabel(button)\n\tconst previousIcon = getButtonIconMarkup(button)\n\tconst previousDisabled = button.disabled\n\n\tbutton.disabled = true\n\tbutton.title = label\n\tbutton.setAttribute('aria-label', label)\n\tsetButtonLabel(button, label)\n\tif (iconMarkup) {\n\t\tsetButtonIconMarkup(button, iconMarkup)\n\t}\n\n\treturn () => {\n\t\tbutton.disabled = previousDisabled\n\t\tbutton.title = previousTitle\n\t\tbutton.setAttribute('aria-label', previousLabel ?? previousTitle)\n\t\tsetButtonLabel(button, previousText)\n\t\tsetButtonIconMarkup(button, previousIcon)\n\t}\n}\n\nfunction buildWatcherInfoText(watcher: PopupWatcherStatus | null): string | null {\n\tif (!canCopyWatcherInfo(watcher)) {\n\t\treturn null\n\t}\n\n\tconst readyWatcher = watcher!\n\tconst target = readyWatcher.currentTarget!\n\tconst attached = target.attachedAt ? new Date(target.attachedAt).toISOString() : new Date().toISOString()\n\tconst fields = [\n\t\t['ID', readyWatcher.watcherId!],\n\t\t['Host', `${readyWatcher.watcherHost!}:${readyWatcher.watcherPort!}`],\n\t\t['PID', String(readyWatcher.nativeHostPid!)],\n\t\t['Target', target.title || '(no title)'],\n\t\t['URL', target.url || '(no url)'],\n\t\t['Attached', attached],\n\t]\n\n\treturn `Argus Watcher Info\\n${fields.map(([label, value]) => `${label}: ${value}`).join('\\n')}`\n}\n\nfunction buildAllWatchersInfoText(watchers: PopupWatcherStatus[]): string | null {\n\tconst watcherInfo = watchers.map((watcher) => buildWatcherInfoText(watcher)).filter((text): text is string => Boolean(text))\n\tif (watcherInfo.length === 0) {\n\t\treturn null\n\t}\n\n\treturn watcherInfo.join('\\n\\n')\n}\n\nfunction buildDetachAllError(failureCount: number): string {\n\treturn failureCount === 1 ? 'Failed to detach 1 watcher' : `Failed to detach ${failureCount} watchers`\n}\n\nfunction capitalize(text: string): string {\n\treturn text.charAt(0).toUpperCase() + text.slice(1)\n}\n\nfunction selectCurrentWatcher(status: StatusPayload | null, tabs: TabInfo[], activeTabId?: number): PopupWatcherStatus | null {\n\tif (!status) {\n\t\treturn null\n\t}\n\n\tif (activeTabId !== undefined) {\n\t\tconst activeWatcher = findWatcherByTabId(status.watchers, activeTabId)\n\t\tif (activeWatcher) {\n\t\t\treturn activeWatcher\n\t\t}\n\t}\n\n\tfor (const tab of tabs) {\n\t\tif (!tab.attached) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst watcher = findWatcherByTabId(status.watchers, tab.tabId)\n\t\tif (watcher) {\n\t\t\treturn watcher\n\t\t}\n\t}\n\n\treturn status.watchers[0] ?? null\n}\n\nfunction canCopyWatcherInfo(watcher: PopupWatcherStatus | null | undefined): boolean {\n\treturn Boolean(watcher?.watcherId && watcher?.watcherHost && watcher?.watcherPort != null && watcher?.nativeHostPid && watcher?.currentTarget)\n}\n\nfunction findWatcherByTabId(watchers: PopupWatcherStatus[], tabId: number): PopupWatcherStatus | null {\n\treturn watchers.find((watcher) => watcher.tabId === tabId) ?? null\n}\n\nfunction getTabId(element: HTMLElement): number {\n\treturn parseInt(element.dataset.tabId ?? '0', 10)\n}\n\nfunction getButtonLabel(button: HTMLButtonElement): string {\n\treturn button.querySelector<HTMLElement>('[data-button-label]')?.textContent ?? ''\n}\n\nfunction setButtonLabel(button: HTMLButtonElement, label: string): void {\n\tconst labelNode = button.querySelector<HTMLElement>('[data-button-label]')\n\tif (labelNode) {\n\t\tlabelNode.textContent = label\n\t}\n}\n\nfunction getButtonIconMarkup(button: HTMLButtonElement): string {\n\treturn button.querySelector<HTMLElement>('.tab-action-icon')?.innerHTML ?? ''\n}\n\nfunction setButtonIconMarkup(button: HTMLButtonElement, iconMarkup: string): void {\n\tconst iconNode = button.querySelector<HTMLElement>('.tab-action-icon')\n\tif (iconNode) {\n\t\ticonNode.innerHTML = iconMarkup\n\t}\n}\n\nfunction escapeHtml(text: string): string {\n\tconst div = document.createElement('div')\n\tdiv.textContent = text\n\treturn div.innerHTML\n}\n\nasync function getCurrentTab(): Promise<chrome.tabs.Tab | undefined> {\n\tconst tabs = await chrome.tabs.query({ active: true, currentWindow: true })\n\treturn tabs[0]\n}\n\nvoid refreshTabs()\nsetInterval(() => {\n\tvoid refreshTabs()\n}, 2000)\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": [
|
|
3
|
+
"sources": ["../../src/popup/html.ts", "../../src/popup/classify-target.ts", "../../src/popup/target-list.ts", "../../src/popup/popup-client.ts", "../../src/popup/health-panel.ts", "../../src/popup/watcher-info.ts", "../../src/popup/tab-feedback.ts", "../../src/popup/popup.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Escape a string for interpolation into popup HTML.\n *\n * Quotes are escaped, unlike the two `div.textContent` + `innerHTML` copies this replaces:\n * that idiom escapes `&`, `<`, and `>` but leaves `\"` intact, and every call site here\n * interpolates into an attribute (`title=\"${escapeHtml(title)}\"`). A tab whose title\n * contained a double quote would break out of the attribute.\n */\nexport const escapeHtml = (text: string): string =>\n\ttext.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''')\n", "/**\n * Heuristic classification of iframe targets as \"low-interest\" (ad trackers,\n * consent managers, analytics pixels, etc.) so the popup can collapse them\n * behind a toggle instead of cluttering the target list.\n *\n * Runs purely on the URL and title strings already available in PopupTarget \u2014\n * no DOM access or background queries needed.\n */\n\ntype ClassifiableTarget = {\n\ttype: 'page' | 'iframe'\n\turl: string\n\ttitle: string\n}\n\ntype LowInterestUrlRule = {\n\thost: string\n\tpathPrefix?: string\n}\n\n/**\n * URL rules for iframes that are usually browser/app infrastructure, not the\n * user's debuggable surface. Host suffix matching covers subdomains.\n */\nconst LOW_INTEREST_URL_RULES: LowInterestUrlRule[] = [\n\t{ host: 'accounts.google.com', pathPrefix: '/RotateCookiesPage' },\n\t{ host: 'clients6.google.com', pathPrefix: '/static/proxy.html' },\n\t{ host: 'contacts.google.com', pathPrefix: '/u/2/widget/hovercard/' },\n\t{ host: 'docs.google.com', pathPrefix: '/_/og/bscframe' },\n\t{ host: 'docs.google.com', pathPrefix: '/offline/iframeapi' },\n\t{ host: 'doubleclick.net' },\n\t{ host: 'googlesyndication.com' },\n\t{ host: 'google.com', pathPrefix: '/recaptcha' },\n\t{ host: 'googletagmanager.com' },\n\t{ host: 'google-analytics.com' },\n\t{ host: 'googleadservices.com' },\n\t{ host: 'connect.facebook.net' },\n\t{ host: 'facebook.com', pathPrefix: '/tr' },\n\t{ host: 'ozone-project.com' },\n\t{ host: 'amazon-adsystem.com' },\n\t{ host: 'adnxs.com' },\n\t{ host: 'adsrvr.org' },\n\t{ host: 'criteo.com' },\n\t{ host: 'inmobi.com' },\n\t{ host: 'rubiconproject.com' },\n\t{ host: 'pubmatic.com' },\n]\n\n/**\n * Title patterns that indicate framework-internal / utility iframes.\n * Matched against the full title string.\n */\nconst LOW_INTEREST_TITLE_PATTERNS: RegExp[] = [\n\t/^__\\w+__$/, // __pb_locator__, __tcfapiLocator\n\t/^googlefc/i, // googlefcPresent, googlefcInactive, googlefcLoaded\n]\n\nexport function isLowInterestTarget(target: ClassifiableTarget): boolean {\n\tif (target.type === 'page') return false\n\n\tconst url = target.url\n\tif (!url || url === 'about:blank' || url === 'about:srcdoc') return true\n\n\tif (matchesLowInterestUrl(url)) return true\n\n\tconst title = target.title\n\tif (title && LOW_INTEREST_TITLE_PATTERNS.some((pattern) => pattern.test(title))) return true\n\n\treturn false\n}\n\nfunction matchesLowInterestUrl(url: string): boolean {\n\ttry {\n\t\tconst parsed = new URL(url)\n\t\treturn LOW_INTEREST_URL_RULES.some((rule) => matchesUrlRule(parsed, rule))\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction matchesUrlRule(url: URL, rule: LowInterestUrlRule): boolean {\n\tif (!matchesHost(url.hostname, rule.host)) return false\n\tif (!rule.pathPrefix) return true\n\n\treturn url.pathname.startsWith(rule.pathPrefix)\n}\n\nfunction matchesHost(hostname: string, host: string): boolean {\n\treturn hostname === host || hostname.endsWith(`.${host}`)\n}\n", "import { escapeHtml } from './html.js'\nimport { isLowInterestTarget } from './classify-target.js'\nimport type { PopupTabWithTargets, PopupTarget } from '../background/popup-protocol.js'\n\nconst HIDE_TARGET_ICON = `\n\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M10.7 5.1A10.7 10.7 0 0 1 12 5c5 0 8.5 4.5 9.5 6a13.4 13.4 0 0 1-2.7 3.2\"></path>\n\t\t<path d=\"M6.6 6.7A13.4 13.4 0 0 0 2.5 11c1 1.5 4.5 6 9.5 6a8.7 8.7 0 0 0 4.2-1.1\"></path>\n\t\t<path d=\"M14.1 14.1a3 3 0 0 1-4.2-4.2\"></path>\n\t\t<path d=\"M3 3l18 18\"></path>\n\t</svg>\n`\n\nconst SHOW_TARGET_ICON = `\n\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6z\"></path>\n\t\t<circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n\t</svg>\n`\n\nexport function renderTargetList(tab: PopupTabWithTargets): string {\n\tconst targets = tab.targets ?? []\n\tconst hiddenTargets = tab.hiddenTargets ?? []\n\tif (targets.length <= 1 && hiddenTargets.length === 0) return ''\n\n\tconst primaryTargets: PopupTarget[] = []\n\tconst autoHiddenTargets: PopupTarget[] = []\n\tfor (const target of targets) {\n\t\tif (isLowInterestTarget(target)) {\n\t\t\tautoHiddenTargets.push(target)\n\t\t} else {\n\t\t\tprimaryTargets.push(target)\n\t\t}\n\t}\n\n\tconst primaryHtml = renderTargetItems(tab, primaryTargets, 'visible')\n\tconst hiddenFramesHtml = renderHiddenFramesSection(tab, autoHiddenTargets, hiddenTargets)\n\n\treturn `\n\t\t<div class=\"target-list\">\n\t\t\t${primaryHtml}\n\t\t\t${hiddenFramesHtml}\n\t\t</div>\n\t`\n}\n\nfunction renderHiddenFramesSection(tab: PopupTabWithTargets, autoHiddenTargets: PopupTarget[], manuallyHiddenTargets: PopupTarget[]): string {\n\tconst count = autoHiddenTargets.length + manuallyHiddenTargets.length\n\tif (count === 0) {\n\t\treturn ''\n\t}\n\n\tconst hasSelectedAutoHiddenTarget = autoHiddenTargets.some((target) => isTargetSelected(tab.selectedFrameId, target.frameId))\n\tconst autoHiddenHtml = renderTargetItems(tab, autoHiddenTargets, 'visible')\n\tconst manuallyHiddenHtml = renderTargetItems(tab, manuallyHiddenTargets, 'hidden')\n\tconst expanded = hasSelectedAutoHiddenTarget ? 'open' : ''\n\n\treturn `\n <details class=\"target-collapsed target-hidden-list\" ${expanded}>\n <summary class=\"target-collapsed-toggle\">\n ${count} hidden frame${count === 1 ? '' : 's'}\n </summary>\n <div class=\"target-collapsed-list\">\n ${autoHiddenHtml}\n ${manuallyHiddenHtml}\n </div>\n </details>\n `\n}\n\nfunction renderTargetItems(tab: PopupTabWithTargets, targets: PopupTarget[], visibility: 'visible' | 'hidden'): string {\n\treturn targets.map((target) => renderTargetItem(tab, target, visibility)).join('')\n}\n\nfunction renderTargetItem(tab: PopupTabWithTargets, target: PopupTarget, visibility: 'visible' | 'hidden'): string {\n\tconst isSelected = isTargetSelected(tab.selectedFrameId, target.frameId)\n\tconst kindLabel = target.type === 'page' ? 'Page' : 'Iframe'\n\tconst title = target.title || kindLabel\n\tconst url = target.url || '(no url)'\n\tconst visibilityAction = renderTargetVisibilityAction(tab.tabId, target, visibility)\n\treturn `\n <div class=\"target-item ${isSelected ? 'selected' : ''} ${visibility === 'hidden' ? 'hidden-target' : ''}\">\n <button\n class=\"target-select-action\"\n data-action=\"select-target\"\n data-tab-id=\"${tab.tabId}\"\n data-frame-id=\"${escapeHtml(target.frameId ?? '')}\"\n type=\"button\"\n ${visibility === 'hidden' ? 'disabled' : ''}\n >\n <span class=\"target-kind\">${kindLabel}</span>\n <span class=\"target-meta\">\n <span class=\"target-title\" title=\"${escapeHtml(title)}\">${escapeHtml(title)}</span>\n <span class=\"target-url\" title=\"${escapeHtml(url)}\">${escapeHtml(url)}</span>\n </span>\n </button>\n ${visibilityAction}\n </div>\n `\n}\n\nfunction renderTargetVisibilityAction(tabId: number, target: PopupTarget, visibility: 'visible' | 'hidden'): string {\n\tif (target.type !== 'iframe' || !target.frameId) {\n\t\treturn ''\n\t}\n\n\tconst action = visibility === 'hidden' ? 'show-target' : 'hide-target'\n\tconst label = visibility === 'hidden' ? 'Show iframe target' : 'Hide iframe target'\n\tconst icon = visibility === 'hidden' ? SHOW_TARGET_ICON : HIDE_TARGET_ICON\n\n\treturn `\n\t\t<button\n\t\t\tclass=\"target-visibility-action\"\n\t\t\tdata-action=\"${action}\"\n\t\t\tdata-tab-id=\"${tabId}\"\n\t\t\tdata-frame-id=\"${escapeHtml(target.frameId)}\"\n\t\t\ttype=\"button\"\n\t\t\ttitle=\"${label}\"\n\t\t\taria-label=\"${label}\"\n\t\t>\n\t\t\t${icon}\n\t\t</button>\n\t`\n}\n\nfunction isTargetSelected(selectedFrameId: string | null | undefined, targetFrameId: string | null): boolean {\n\treturn selectedFrameId !== undefined && (selectedFrameId ?? null) === (targetFrameId ?? null)\n}\n", "import type { PopupAction, PopupActionMessage, PopupResponseFor } from '../background/popup-protocol.js'\n\n/**\n * Send one action to the service worker and get back that action's response type.\n *\n * The response type is looked up from the action rather than supplied by the caller, so\n * a call site cannot claim the wrong shape \u2014 the mistake the old\n * `sendMessage<T>(message)` signature allowed silently.\n */\nexport const sendPopupMessage = async <M extends PopupActionMessage>(message: M): Promise<PopupResponseFor<M['action']>> => {\n\treturn new Promise((resolve) => {\n\t\tchrome.runtime.sendMessage(message, resolve)\n\t})\n}\n\n/**\n * Send an action and throw if it failed.\n *\n * @throws {Error} With the service worker's error message when `success` is false.\n */\nexport const runPopupMessage = async <M extends PopupActionMessage>(\n\tmessage: M,\n): Promise<Extract<PopupResponseFor<M['action']>, { success: true }>> => {\n\tconst response = await sendPopupMessage(message)\n\tif (!response.success) {\n\t\tthrow new Error(response.error)\n\t}\n\n\treturn response as Extract<PopupResponseFor<M['action']>, { success: true }>\n}\n\nexport type { PopupAction }\n", "import type { PopupCurrentTarget, PopupStatusPayload, PopupWatcherStatus } from '../background/popup-protocol.js'\n\n/**\n * The health summary panel.\n *\n * Split out of popup.ts, which had grown past 700 lines by holding the tab list, the\n * health panel, and the messaging client at once.\n */\nconst healthSummary = document.getElementById('healthSummary') as HTMLSpanElement\nconst healthNativeHost = document.getElementById('healthNativeHost') as HTMLDivElement\nconst healthWatcherReady = document.getElementById('healthWatcherReady') as HTMLDivElement\nconst healthWatcherId = document.getElementById('healthWatcherId') as HTMLDivElement\nconst healthAttachedCount = document.getElementById('healthAttachedCount') as HTMLDivElement\nconst healthSelectedTarget = document.getElementById('healthSelectedTarget') as HTMLDivElement\nconst healthLastMessage = document.getElementById('healthLastMessage') as HTMLDivElement\nconst healthPid = document.getElementById('healthPid') as HTMLDivElement\n\n/** Repaint the health panel from the latest status. */\nexport const updateHealth = (\n\tstatus: PopupStatusPayload | undefined,\n\twatcher: PopupWatcherStatus | null,\n\tbuttons: { copyAll: HTMLButtonElement; detachAll: HTMLButtonElement },\n\thasWatchers: boolean,\n): void => {\n\tconst target = watcher?.currentTarget ?? null\n\tconst tabCount = status?.attachedTabs.length ?? 0\n\tconst nativeHostConnected = watcher?.bridgeConnected ?? status?.bridgeConnected ?? false\n\tconst watcherReady = watcher?.watcherReady ?? false\n\tconst targetState = watcher?.targetState ?? 'not-selected'\n\n\thealthSummary.textContent = buildHealthSummaryText({\n\t\tnativeHostConnected,\n\t\twatcherReady,\n\t\ttargetState,\n\t\twatcherId: watcher?.watcherId ?? null,\n\t\ttabCount,\n\t})\n\tsetHealthValueState(healthNativeHost, nativeHostConnected ? 'Connected' : 'Disconnected', nativeHostConnected ? 'connected' : 'disconnected')\n\tsetHealthValueState(healthWatcherReady, watcherReady ? 'Ready' : 'Not ready', watcherReady ? 'connected' : 'disconnected')\n\thealthWatcherId.textContent = watcher?.watcherId ?? '-'\n\thealthAttachedCount.textContent = String(tabCount)\n\tsetHealthValueState(healthSelectedTarget, formatTargetState(target, targetState), getTargetStateClass(targetState))\n\thealthLastMessage.textContent = formatRelativeTimestamp(watcher?.lastMessageAt ?? null)\n\thealthPid.textContent = watcher?.nativeHostPid ? String(watcher.nativeHostPid) : '-'\n\tbuttons.copyAll.disabled = !hasWatchers\n\tbuttons.detachAll.disabled = !hasWatchers\n}\n\nconst buildHealthSummaryText = (input: {\n\tnativeHostConnected: boolean\n\twatcherReady: boolean\n\ttargetState: PopupWatcherStatus['targetState']\n\twatcherId: string | null\n\ttabCount: number\n}): string => {\n\tconst parts: string[] = []\n\tif (input.watcherId) parts.push(input.watcherId)\n\tparts.push(input.nativeHostConnected ? 'Host connected' : 'Host disconnected')\n\tparts.push(input.watcherReady ? 'Watcher ready' : 'Watcher not ready')\n\tif (input.targetState === 'rebinding') parts.push('Target rebinding')\n\tif (input.tabCount > 0) parts.push(`${input.tabCount} tab${input.tabCount === 1 ? '' : 's'}`)\n\treturn parts.join(' \u00B7 ')\n}\n\nconst setHealthValueState = (element: HTMLElement, text: string, stateClass: 'connected' | 'disconnected' | 'warning' | null): void => {\n\telement.textContent = text\n\telement.classList.toggle('connected', stateClass === 'connected')\n\telement.classList.toggle('disconnected', stateClass === 'disconnected')\n\telement.classList.toggle('warning', stateClass === 'warning')\n}\n\nconst formatTargetState = (target: PopupCurrentTarget | null, state: PopupWatcherStatus['targetState']): string => {\n\tif (!target || state === 'not-selected') {\n\t\treturn '-'\n\t}\n\n\tconst label = target.type === 'page' ? 'Page' : 'Iframe'\n\treturn state === 'ready' ? `${label} ready` : `${label} rebinding`\n}\n\nconst getTargetStateClass = (state: PopupWatcherStatus['targetState']): 'connected' | 'disconnected' | 'warning' | null => {\n\tif (state === 'ready') {\n\t\treturn 'connected'\n\t}\n\tif (state === 'rebinding') {\n\t\treturn 'warning'\n\t}\n\treturn null\n}\n\nfunction formatRelativeTimestamp(timestamp: number | null): string {\n\tif (!timestamp) {\n\t\treturn '-'\n\t}\n\n\tconst elapsedMs = Math.max(0, Date.now() - timestamp)\n\tif (elapsedMs < 1000) {\n\t\treturn 'Just now'\n\t}\n\n\tconst elapsedSeconds = Math.floor(elapsedMs / 1000)\n\tif (elapsedSeconds < 60) {\n\t\treturn `${elapsedSeconds}s ago`\n\t}\n\n\tconst elapsedMinutes = Math.floor(elapsedSeconds / 60)\n\tif (elapsedMinutes < 60) {\n\t\treturn `${elapsedMinutes}m ago`\n\t}\n\n\tconst elapsedHours = Math.floor(elapsedMinutes / 60)\n\treturn `${elapsedHours}h ago`\n}\n", "import type { PopupWatcherStatus } from '../background/popup-protocol.js'\n\n/**\n * Watcher info the popup copies to the clipboard.\n *\n * Split out of popup.ts with the health panel and the button-feedback state, which\n * together had pushed that file past 700 lines.\n */\n\nexport async function copyTextToClipboard(text: string): Promise<void> {\n\ttry {\n\t\tawait navigator.clipboard.writeText(text)\n\t\treturn\n\t} catch {\n\t\t// Chrome extension popups can lose Clipboard API access depending on focus/permission state.\n\t}\n\n\tconst textarea = document.createElement('textarea')\n\ttextarea.value = text\n\ttextarea.setAttribute('readonly', 'true')\n\ttextarea.style.position = 'fixed'\n\ttextarea.style.opacity = '0'\n\ttextarea.style.pointerEvents = 'none'\n\tdocument.body.appendChild(textarea)\n\ttextarea.select()\n\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\ttry {\n\t\tconst copied = document.execCommand('copy')\n\t\tif (!copied) {\n\t\t\tthrow new Error('Browser denied clipboard write')\n\t\t}\n\t} finally {\n\t\ttextarea.remove()\n\t}\n}\n\nexport function buildWatcherInfoText(watcher: PopupWatcherStatus | null): string | null {\n\tif (!canCopyWatcherInfo(watcher)) {\n\t\treturn null\n\t}\n\n\tconst readyWatcher = watcher!\n\tconst target = readyWatcher.currentTarget!\n\tconst attached = target.attachedAt ? new Date(target.attachedAt).toISOString() : new Date().toISOString()\n\tconst fields = [\n\t\t['ID', readyWatcher.watcherId!],\n\t\t['Host', `${readyWatcher.watcherHost!}:${readyWatcher.watcherPort!}`],\n\t\t['PID', String(readyWatcher.nativeHostPid!)],\n\t\t['Target', target.title || '(no title)'],\n\t\t['URL', target.url || '(no url)'],\n\t\t['Attached', attached],\n\t]\n\n\treturn `Argus Watcher Info\\n${fields.map(([label, value]) => `${label}: ${value}`).join('\\n')}`\n}\n\nexport function buildAllWatchersInfoText(watchers: PopupWatcherStatus[]): string | null {\n\tconst watcherInfo = watchers.map((watcher) => buildWatcherInfoText(watcher)).filter((text): text is string => Boolean(text))\n\tif (watcherInfo.length === 0) {\n\t\treturn null\n\t}\n\n\treturn watcherInfo.join('\\n\\n')\n}\n\nexport function findWatcherByTabId(watchers: PopupWatcherStatus[], tabId: number): PopupWatcherStatus | null {\n\treturn watchers.find((watcher) => watcher.tabId === tabId) ?? null\n}\n\n/** True when the watcher has everything the copied text needs. */\nfunction canCopyWatcherInfo(watcher: PopupWatcherStatus | null | undefined): boolean {\n\treturn Boolean(watcher?.watcherId && watcher?.watcherHost && watcher?.watcherPort != null && watcher?.nativeHostPid && watcher?.currentTarget)\n}\n", "import type { PopupTabAction } from '../background/popup-protocol.js'\n\n/** Per-tab buttons that show transient feedback. */\nexport type TabButtonAction = Extract<PopupTabAction, 'attach' | 'detach'> | 'copy-info'\n\ntype Feedback = {\n\tlabel: string\n\t/** Replacement icon markup, when the button is icon-only. */\n\ticon?: string\n\t/** Epoch ms after which the feedback stops being painted. */\n\texpiresAt: number\n}\n\n/**\n * Transient per-tab button state, as data rather than as DOM mutations.\n *\n * The popup re-renders its tab list by wholesale `innerHTML` replacement every 2s, while\n * a parallel system used to mutate individual buttons (\"Attaching\u2026\", \"Copied!\") and hold\n * restore closures over those nodes. Any forced re-render \u2014 which every action triggers \u2014\n * replaced the nodes, so the closures and their `setTimeout(restore, 1500)` operated on\n * detached DOM.\n *\n * Keeping the state here means the single render pass paints it and no node is ever\n * mutated behind the renderer's back.\n */\nconst feedback = new Map<string, Feedback>()\n\nconst key = (tabId: number, action: TabButtonAction): string => `${tabId}:${action}`\n\n/** Show feedback on a button until `durationMs` elapses. Pass `Infinity` for \"until cleared\". */\nexport const setTabFeedback = (tabId: number, action: TabButtonAction, label: string, durationMs: number, icon?: string): void => {\n\tfeedback.set(key(tabId, action), { label, icon, expiresAt: durationMs === Infinity ? Infinity : Date.now() + durationMs })\n}\n\n/** Stop showing feedback on a button. */\nexport const clearTabFeedback = (tabId: number, action: TabButtonAction): void => {\n\tfeedback.delete(key(tabId, action))\n}\n\n/** Read live feedback for a button, dropping it once expired. */\nexport const getTabFeedback = (tabId: number, action: TabButtonAction): Feedback | null => {\n\tconst entry = feedback.get(key(tabId, action))\n\tif (!entry) {\n\t\treturn null\n\t}\n\tif (entry.expiresAt <= Date.now()) {\n\t\tfeedback.delete(key(tabId, action))\n\t\treturn null\n\t}\n\treturn entry\n}\n\n/** True when any feedback is still live, so the caller knows a re-render is pending. */\nexport const hasPendingTabFeedback = (): boolean => {\n\tfor (const [entryKey, entry] of feedback.entries()) {\n\t\tif (entry.expiresAt <= Date.now()) {\n\t\t\tfeedback.delete(entryKey)\n\t\t\tcontinue\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n", "/**\n * Popup UI for the Argus CDP Bridge extension.\n * Displays tabs, target selection, and bridge/debugger health.\n */\n\nimport { escapeHtml } from './html.js'\nimport { renderTargetList } from './target-list.js'\nimport { runPopupMessage, sendPopupMessage } from './popup-client.js'\nimport { updateHealth } from './health-panel.js'\nimport { buildAllWatchersInfoText, buildWatcherInfoText, copyTextToClipboard, findWatcherByTabId } from './watcher-info.js'\nimport { clearTabFeedback, getTabFeedback, hasPendingTabFeedback, setTabFeedback, type TabButtonAction } from './tab-feedback.js'\nimport type { PopupStatusPayload, PopupTabAction, PopupTabWithTargets, PopupTargetAction, PopupWatcherStatus } from '../background/popup-protocol.js'\n\nconst COPY_ICON = `\n\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"></rect>\n\t\t<path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"></path>\n\t</svg>\n`\n\nconst CHECK_ICON = `\n\t<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M3 8.5l3.1 3.1L13 4.75\"></path>\n\t</svg>\n`\n\nconst DETACH_ICON = `\n\t<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t<path d=\"M5.4 1.75h5.2l3.65 3.65v5.2l-3.65 3.65H5.4l-3.65-3.65V5.4z\"></path>\n\t\t<path d=\"M6 6l4 4\"></path>\n\t\t<path d=\"M10 6l-4 4\"></path>\n\t</svg>\n`\n\n// DOM elements\nconst statusIndicator = document.getElementById('statusIndicator') as HTMLDivElement\nconst statusText = document.getElementById('statusText') as HTMLSpanElement\nconst attachedSection = document.getElementById('attachedSection') as HTMLDivElement\nconst attachedContent = document.getElementById('attachedContent') as HTMLDivElement\nconst availableSection = document.getElementById('availableSection') as HTMLDivElement\nconst availableContent = document.getElementById('availableContent') as HTMLDivElement\nconst attachedCount = document.getElementById('attachedCount') as HTMLSpanElement\nconst errorBanner = document.getElementById('errorBanner') as HTMLDivElement\nconst copyAllButton = document.getElementById('copyAllButton') as HTMLButtonElement\nconst detachAllButton = document.getElementById('detachAllButton') as HTMLButtonElement\n\nlet prevStateHash = ''\nlet latestTabs: PopupTabWithTargets[] = []\nlet latestActiveTabId: number | undefined\n\n/**\n * Repaint from the last loaded tabs without a round-trip.\n *\n * Button feedback lives in render state, so showing \"Attaching\u2026\" is a re-render rather\n * than a mutation of the node the renderer is about to replace.\n */\nasync function renderFromLatestState(): Promise<void> {\n\tif (latestTabs.length > 0) {\n\t\trenderTabs(latestTabs, latestActiveTabId)\n\t}\n}\nlet currentError: string | null = null\nlet latestCurrentWatcher: PopupWatcherStatus | null = null\n// Copy actions run per attached row, so keep the latest watcher list alongside the focused watcher.\nlet latestWatchers: PopupWatcherStatus[] = []\n\ncopyAllButton.addEventListener('click', () => {\n\tvoid copyAllWatchersInfo().catch((error) => {\n\t\tshowError(error instanceof Error ? error.message : 'Copy failed')\n\t})\n})\n\ndetachAllButton.addEventListener('click', () => {\n\tvoid detachAllWatchers()\n})\n\n// Prevent button clicks inside the health summary from toggling the <details> open/close.\ndocument.querySelector('.health-summary-actions')?.addEventListener('click', (event) => {\n\tevent.stopPropagation()\n})\n\n// Bound once, for the lifetime of the popup \u2014 never per render.\nbindTabContainer(attachedContent)\nbindTabContainer(availableContent)\n\nfunction setEmptyState(icon: string, message: string): void {\n\tavailableSection.classList.remove('hidden')\n\tattachedSection.classList.add('hidden')\n\tavailableContent.innerHTML = `\n <div class=\"empty-state\">\n <div class=\"icon\">${escapeHtml(icon)}</div>\n <div>${escapeHtml(message)}</div>\n </div>\n `\n}\n\nfunction updateStatus(connected: boolean, tabCount: number): void {\n\tstatusIndicator.classList.toggle('connected', connected)\n\tstatusText.textContent = connected ? 'Bridge connected' : 'Bridge disconnected'\n\tattachedCount.textContent = `${tabCount} attached`\n}\n\nfunction showError(message: string | null): void {\n\tcurrentError = message\n\terrorBanner.textContent = message ?? ''\n\terrorBanner.classList.toggle('hidden', !message)\n}\n\nfunction renderTabs(tabs: PopupTabWithTargets[], currentTabId?: number): void {\n\tif (tabs.length === 0) {\n\t\tsetEmptyState('\uD83D\uDD0D', 'No tabs available')\n\t\treturn\n\t}\n\n\tconst attachedTabs = tabs.filter((tab) => tab.attached)\n\tlet availableTabs = tabs.filter((tab) => !tab.attached)\n\n\tif (currentTabId !== undefined) {\n\t\tconst currentTabIndex = availableTabs.findIndex((tab) => tab.tabId === currentTabId)\n\t\tif (currentTabIndex > 0) {\n\t\t\tconst [currentTab] = availableTabs.splice(currentTabIndex, 1)\n\t\t\tavailableTabs.unshift(currentTab)\n\t\t}\n\t}\n\n\trenderTabGroup(attachedSection, attachedContent, attachedTabs, true)\n\trenderTabGroup(availableSection, availableContent, availableTabs, false)\n}\n\nfunction renderTabItem(tab: PopupTabWithTargets, showTargets: boolean): string {\n\tconst favicon = tab.faviconUrl\n\t\t? `<img class=\"tab-favicon\" src=\"${escapeHtml(tab.faviconUrl)}\" alt=\"\">`\n\t\t: `<div class=\"tab-favicon\" style=\"background: #e0e0e0\"></div>`\n\tconst watcherSuffix = tab.attached && tab.watcher?.watcherId ? ` (${tab.watcher.watcherId})` : ''\n\tconst actions = tab.attached ? renderAttachedTabActions(tab.tabId) : renderAttachButton(tab.tabId)\n\tconst fullTitle = (tab.title || 'Untitled') + watcherSuffix\n\n\treturn `\n <div class=\"tab-item ${tab.attached ? 'attached' : ''}\" data-tab-id=\"${tab.tabId}\">\n ${favicon}\n <div class=\"tab-info\">\n <div class=\"tab-title\" title=\"${escapeHtml(fullTitle)}\">${escapeHtml(fullTitle)}</div>\n <div class=\"tab-url\" title=\"${escapeHtml(tab.url)}\">${escapeHtml(tab.url)}</div>\n </div>\n ${actions}\n </div>\n ${showTargets ? renderTargetList(tab) : ''}\n `\n}\n\nfunction renderTabGroup(section: HTMLDivElement, content: HTMLDivElement, tabs: PopupTabWithTargets[], showTargets: boolean): void {\n\tif (tabs.length === 0) {\n\t\tsection.classList.add('hidden')\n\t\tcontent.innerHTML = ''\n\t\treturn\n\t}\n\n\tsection.classList.remove('hidden')\n\tcontent.innerHTML = `<div class=\"tab-list\">${tabs.map((tab) => renderTabItem(tab, showTargets)).join('')}</div>`\n}\n\n/**\n * One delegated listener per tab container, bound once.\n *\n * Re-attaching handlers to every button on every render is what made the renderer and the\n * per-button mutation system fight over the same nodes; dispatching on `data-action`\n * survives any number of re-renders.\n */\nfunction bindTabContainer(container: HTMLElement): void {\n\tcontainer.addEventListener('click', (event) => {\n\t\tconst actionButton = (event.target as HTMLElement).closest<HTMLButtonElement>('.tab-action, [data-action]')\n\n\t\tif (actionButton?.classList.contains('tab-action')) {\n\t\t\tvoid handleTabAction(actionButton)\n\t\t\treturn\n\t\t}\n\t\tif (actionButton?.dataset.action === 'select-target') {\n\t\t\tvoid handleTargetSelection(actionButton)\n\t\t\treturn\n\t\t}\n\t\tif (actionButton?.dataset.action === 'hide-target' || actionButton?.dataset.action === 'show-target') {\n\t\t\tevent.stopPropagation()\n\t\t\tvoid handleTargetVisibility(actionButton)\n\t\t\treturn\n\t\t}\n\n\t\tconst tabItem = (event.target as HTMLElement).closest<HTMLElement>('.tab-item')\n\t\tif (tabItem) {\n\t\t\tvoid handleTabItemClick(tabItem)\n\t\t}\n\t})\n}\n\nfunction renderAttachedTabActions(tabId: number): string {\n\treturn `\n\t\t<div class=\"tab-actions\">\n\t\t\t${renderIconActionButton(tabId, 'copy-info', 'copy', 'Copy watcher info', COPY_ICON)}\n\t\t\t${renderIconActionButton(tabId, 'detach', 'detach', 'Detach', DETACH_ICON)}\n\t\t</div>\n\t`\n}\n\nfunction renderAttachButton(tabId: number): string {\n\tconst pending = getTabFeedback(tabId, 'attach')\n\tconst disabled = pending ? ' disabled' : ''\n\treturn `<button class=\"tab-action attach\" data-tab-id=\"${tabId}\" data-action=\"attach\" type=\"button\"${disabled}>${escapeHtml(pending?.label ?? 'Attach')}</button>`\n}\n\nfunction renderIconActionButton(tabId: number, action: Exclude<TabButtonAction, 'attach'>, variant: string, label: string, icon: string): string {\n\tconst pending = getTabFeedback(tabId, action)\n\treturn `\n\t\t<button\n\t\t\tclass=\"tab-action icon-only ${variant}\"\n\t\t\tdata-tab-id=\"${tabId}\"\n\t\t\tdata-action=\"${action}\"\n\t\t\ttype=\"button\"\n\t\t\ttitle=\"${escapeHtml(pending?.label ?? label)}\"\n\t\t\taria-label=\"${escapeHtml(pending?.label ?? label)}\"\n\t\t\t${pending ? 'disabled' : ''}\n\t\t>\n\t\t\t<span class=\"tab-action-icon\" aria-hidden=\"true\">${pending?.icon ?? icon}</span>\n\t\t</button>\n\t`\n}\n\nasync function handleTabItemClick(tabItem: HTMLElement): Promise<void> {\n\tconst tabId = getTabId(tabItem)\n\tconst action = getTabItemAction(tabItem)\n\n\tsetTabFeedback(tabId, 'attach', action === 'attach' ? 'Attaching...' : 'Focusing...', Infinity)\n\tawait renderFromLatestState()\n\n\ttry {\n\t\tawait runTabAction(action, tabId)\n\t\tclearTabFeedback(tabId, 'attach')\n\t\tif (action === 'attach') {\n\t\t\tawait refreshTabs(true)\n\t\t} else {\n\t\t\tawait renderFromLatestState()\n\t\t}\n\t} catch (error) {\n\t\tclearTabFeedback(tabId, 'attach')\n\t\tshowError(error instanceof Error ? error.message : `${capitalize(action)} failed`)\n\t\tawait renderFromLatestState()\n\t}\n}\n\n/**\n * Attached rows act like \"jump to this Chrome tab\"; unattached rows keep the existing one-click attach flow.\n */\nfunction getTabItemAction(tabItem: HTMLElement): Extract<PopupTabAction, 'attach' | 'focusTab'> {\n\treturn tabItem.classList.contains('attached') ? 'focusTab' : 'attach'\n}\n\nasync function handleTabAction(button: HTMLButtonElement): Promise<void> {\n\tconst tabId = getTabId(button)\n\tconst action = button.dataset.action as TabButtonAction\n\n\tif (action === 'copy-info') {\n\t\ttry {\n\t\t\tawait copyWatcherInfo(tabId)\n\t\t} catch (error) {\n\t\t\tshowError(error instanceof Error ? error.message : 'Copy failed')\n\t\t}\n\t\treturn\n\t}\n\n\tsetTabFeedback(tabId, action, action === 'attach' ? 'Attaching...' : 'Detaching...', Infinity)\n\tawait renderFromLatestState()\n\n\ttry {\n\t\tawait runTabAction(action, tabId)\n\t\tclearTabFeedback(tabId, action)\n\t\tawait refreshTabs(true)\n\t} catch (error) {\n\t\tclearTabFeedback(tabId, action)\n\t\tshowError(error instanceof Error ? error.message : `${capitalize(action)} failed`)\n\t\tawait renderFromLatestState()\n\t}\n}\n\nasync function handleTargetSelection(button: HTMLButtonElement): Promise<void> {\n\tconst tabId = getTabId(button)\n\tconst frameId = button.dataset.frameId || null\n\n\tbutton.disabled = true\n\n\ttry {\n\t\tawait runTargetAction('selectTarget', tabId, frameId)\n\t\tawait refreshTabs(true)\n\t} catch (error) {\n\t\tshowError(error instanceof Error ? error.message : 'Target selection failed')\n\t\tbutton.disabled = false\n\t}\n}\n\nasync function handleTargetVisibility(button: HTMLButtonElement): Promise<void> {\n\tconst tabId = getTabId(button)\n\tconst frameId = button.dataset.frameId || null\n\tconst action = button.dataset.action === 'show-target' ? 'showTarget' : 'hideTarget'\n\n\tbutton.disabled = true\n\n\ttry {\n\t\tawait runTargetAction(action, tabId, frameId)\n\t\tawait refreshTabs(true)\n\t} catch (error) {\n\t\tshowError(error instanceof Error ? error.message : action === 'hideTarget' ? 'Target hide failed' : 'Target restore failed')\n\t\tbutton.disabled = false\n\t}\n}\n\nasync function runTabAction(action: PopupTabAction, tabId: number): Promise<void> {\n\tawait runPopupMessage({ action, tabId })\n\tshowError(null)\n}\n\nasync function runTargetAction(action: PopupTargetAction, tabId: number, frameId: string | null): Promise<void> {\n\tawait runPopupMessage({ action, tabId, frameId })\n\tshowError(null)\n}\n\nasync function refreshTabs(forceRender = false): Promise<void> {\n\ttry {\n\t\tconst [statusResponse, tabsResponse, activeTab] = await Promise.all([\n\t\t\tsendPopupMessage({ action: 'getStatus' }),\n\t\t\tsendPopupMessage({ action: 'getTargets' }),\n\t\t\tgetCurrentTab(),\n\t\t])\n\n\t\tif (!statusResponse.success) {\n\t\t\tthrow new Error(statusResponse.error)\n\t\t}\n\n\t\tconst status = statusResponse.status\n\t\tconst tabs = tabsResponse.success ? tabsResponse.tabs : null\n\t\tconst tabsError = tabsResponse.success ? null : tabsResponse.error\n\n\t\tlatestWatchers = status.watchers\n\t\tlatestCurrentWatcher = selectCurrentWatcher(status, tabs ?? [], activeTab?.id)\n\n\t\tconst stateHash = JSON.stringify({\n\t\t\tstatus,\n\t\t\ttabs,\n\t\t\tcurrentTabId: activeTab?.id,\n\t\t\terror: currentError ?? tabsError,\n\t\t})\n\n\t\t// Live button feedback is render state too, so a pending one must not be skipped.\n\t\tif (!forceRender && stateHash === prevStateHash && !hasPendingTabFeedback()) {\n\t\t\treturn\n\t\t}\n\t\tprevStateHash = stateHash\n\n\t\tupdateStatus(status.bridgeConnected, status.attachedTabs.length)\n\t\tupdateHealth(status, latestCurrentWatcher, { copyAll: copyAllButton, detachAll: detachAllButton }, latestWatchers.length > 0)\n\n\t\tif (tabs) {\n\t\t\tlatestTabs = tabs\n\t\t\tlatestActiveTabId = activeTab?.id\n\t\t\trenderTabs(tabs, activeTab?.id)\n\t\t\tshowError(currentError)\n\t\t\treturn\n\t\t}\n\n\t\tshowError(tabsError ?? 'Failed to load tabs')\n\t\tsetEmptyState('\u26A0\uFE0F', tabsError ?? 'Failed to load tabs')\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : 'Failed to refresh popup'\n\t\tshowError(message)\n\t\tupdateStatus(false, 0)\n\t\tlatestWatchers = []\n\t\tlatestCurrentWatcher = null\n\t\tupdateHealth(undefined, null, { copyAll: copyAllButton, detachAll: detachAllButton }, false)\n\t\tsetEmptyState('\u26A0\uFE0F', message)\n\t}\n}\n\nasync function copyWatcherInfo(tabId: number): Promise<void> {\n\tconst watcher = findWatcherByTabId(latestWatchers, tabId)\n\tconst text = buildWatcherInfoText(watcher)\n\tif (!text) {\n\t\treturn\n\t}\n\n\tawait copyTextToClipboard(text)\n\tshowError(null)\n\tsetTabFeedback(tabId, 'copy-info', 'Copied!', 1500, CHECK_ICON)\n\tawait renderFromLatestState()\n}\n\nasync function copyAllWatchersInfo(): Promise<void> {\n\tconst text = buildAllWatchersInfoText(latestWatchers)\n\tif (!text) {\n\t\treturn\n\t}\n\n\tawait copyTextToClipboard(text)\n\tshowError(null)\n\trestoreButtonFeedback(copyAllButton, 'Copied!')\n}\n\nasync function detachAllWatchers(): Promise<void> {\n\tif (latestWatchers.length === 0) {\n\t\treturn\n\t}\n\n\tconst restoreBusyState = setButtonFeedback(detachAllButton, 'Detaching...')\n\tconst failures = await detachWatchers(latestWatchers.map((watcher) => watcher.tabId))\n\trestoreBusyState()\n\tawait refreshTabs(true)\n\n\tif (failures.length > 0) {\n\t\tshowError(buildDetachAllError(failures.length))\n\t\treturn\n\t}\n\n\tshowError(null)\n\trestoreButtonFeedback(detachAllButton, 'Detached!')\n}\n\n/**\n * Detach watchers one by one so a single failure does not block the rest of the cleanup.\n */\nasync function detachWatchers(tabIds: number[]): Promise<number[]> {\n\tconst failures: number[] = []\n\n\tfor (const tabId of tabIds) {\n\t\ttry {\n\t\t\tawait runTabAction('detach', tabId)\n\t\t} catch {\n\t\t\tfailures.push(tabId)\n\t\t}\n\t}\n\n\treturn failures\n}\n\nfunction restoreButtonFeedback(button: HTMLButtonElement, label: string, timeoutMs = 1500, iconMarkup?: string): void {\n\tconst restore = setButtonFeedback(button, label, iconMarkup)\n\tsetTimeout(restore, timeoutMs)\n}\n\nfunction setButtonFeedback(button: HTMLButtonElement, label: string, iconMarkup?: string): () => void {\n\tconst previousTitle = button.title\n\tconst previousLabel = button.getAttribute('aria-label')\n\tconst previousText = getButtonLabel(button)\n\tconst previousIcon = getButtonIconMarkup(button)\n\tconst previousDisabled = button.disabled\n\n\tbutton.disabled = true\n\tbutton.title = label\n\tbutton.setAttribute('aria-label', label)\n\tsetButtonLabel(button, label)\n\tif (iconMarkup) {\n\t\tsetButtonIconMarkup(button, iconMarkup)\n\t}\n\n\treturn () => {\n\t\tbutton.disabled = previousDisabled\n\t\tbutton.title = previousTitle\n\t\tbutton.setAttribute('aria-label', previousLabel ?? previousTitle)\n\t\tsetButtonLabel(button, previousText)\n\t\tsetButtonIconMarkup(button, previousIcon)\n\t}\n}\n\nfunction buildDetachAllError(failureCount: number): string {\n\treturn failureCount === 1 ? 'Failed to detach 1 watcher' : `Failed to detach ${failureCount} watchers`\n}\n\nfunction capitalize(text: string): string {\n\treturn text.charAt(0).toUpperCase() + text.slice(1)\n}\n\nfunction selectCurrentWatcher(status: PopupStatusPayload | null, tabs: PopupTabWithTargets[], activeTabId?: number): PopupWatcherStatus | null {\n\tif (!status) {\n\t\treturn null\n\t}\n\n\tif (activeTabId !== undefined) {\n\t\tconst activeWatcher = findWatcherByTabId(status.watchers, activeTabId)\n\t\tif (activeWatcher) {\n\t\t\treturn activeWatcher\n\t\t}\n\t}\n\n\tfor (const tab of tabs) {\n\t\tif (!tab.attached) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst watcher = findWatcherByTabId(status.watchers, tab.tabId)\n\t\tif (watcher) {\n\t\t\treturn watcher\n\t\t}\n\t}\n\n\treturn status.watchers[0] ?? null\n}\n\nfunction getTabId(element: HTMLElement): number {\n\treturn parseInt(element.dataset.tabId ?? '0', 10)\n}\n\nfunction getButtonLabel(button: HTMLButtonElement): string {\n\treturn button.querySelector<HTMLElement>('[data-button-label]')?.textContent ?? ''\n}\n\nfunction setButtonLabel(button: HTMLButtonElement, label: string): void {\n\tconst labelNode = button.querySelector<HTMLElement>('[data-button-label]')\n\tif (labelNode) {\n\t\tlabelNode.textContent = label\n\t}\n}\n\nfunction getButtonIconMarkup(button: HTMLButtonElement): string {\n\treturn button.querySelector<HTMLElement>('.tab-action-icon')?.innerHTML ?? ''\n}\n\nfunction setButtonIconMarkup(button: HTMLButtonElement, iconMarkup: string): void {\n\tconst iconNode = button.querySelector<HTMLElement>('.tab-action-icon')\n\tif (iconNode) {\n\t\ticonNode.innerHTML = iconMarkup\n\t}\n}\n\nasync function getCurrentTab(): Promise<chrome.tabs.Tab | undefined> {\n\tconst tabs = await chrome.tabs.query({ active: true, currentWindow: true })\n\treturn tabs[0]\n}\n\nvoid refreshTabs()\nsetInterval(() => {\n\tvoid refreshTabs()\n}, 2000)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "Argus CDP Bridge",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"description": "Bridge CDP access for Argus without --remote-debugging-port",
|
|
6
6
|
"permissions": ["cookies", "debugger", "tabs", "nativeMessaging", "storage"],
|
|
7
7
|
"host_permissions": ["<all_urls>"],
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-internal entry point, consumed only by `e2e/`.
|
|
3
|
+
*
|
|
4
|
+
* **Not public API.** Nothing here carries semver guarantees and none of it is supported for
|
|
5
|
+
* outside consumers; anything genuinely public belongs in `index.ts`. It exists so the test suite
|
|
6
|
+
* reaches the CLI through the package's export map instead of relative paths into `src/`, which
|
|
7
|
+
* keeps the set of test-visible symbols explicit — adding a line here is a deliberate act, and a
|
|
8
|
+
* moved file no longer silently rewires a test.
|
|
9
|
+
*/
|
|
10
|
+
export { loadArgusConfig, resolveArgusConfigPath } from './config/loadConfig.js';
|
|
11
|
+
export { mergeChromeStartOptionsWithConfig, mergeWatcherStartOptionsWithConfig } from './config/mergeConfig.js';
|
|
12
|
+
export { loadEvalArgsFile, parseEvalArgFlags, resolveEvalArgs } from './commands/evalArgs.js';
|
|
13
|
+
export { bundleEvalEntry, type BundleEvalEntryResult } from './commands/evalBundle.js';
|
|
14
|
+
export { fileUsesModuleSyntax } from './commands/evalModuleSyntax.js';
|
|
15
|
+
export { createEvalResultFileSink, formatRotatedPath } from './commands/evalResultOutput.js';
|
|
16
|
+
export { parseDurationFlagMs, parseTimeoutMs, resolveBundleDecision, resolveExpression, wrapExpressionWithArgs } from './commands/evalShared.js';
|
|
17
|
+
export { inferRecordFormatFromOutFile, parseRecordClipValue, parseRecordFormatValue, parseRecordFpsValue, validateRecordOutFile, validateRecordOutFileForFormat, } from './commands/record.js';
|
|
18
|
+
export { formatEvalTransportError } from './eval/evalClient.js';
|
|
19
|
+
export { createOutput, type Output } from './output/io.js';
|
|
20
|
+
export { ARGUS_EXTENSION_ID } from './commands/extension/extensionId.js';
|
|
21
|
+
export { installNativeHostsTo, type InstalledNativeHost } from './commands/extension/nativeHost.js';
|
|
22
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAChF,OAAO,EAAE,iCAAiC,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAA;AAC/G,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7F,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAC5F,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAChJ,OAAO,EACN,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,GAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oCAAoC,CAAA"}
|
package/dist/internal.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-internal entry point, consumed only by `e2e/`.
|
|
3
|
+
*
|
|
4
|
+
* **Not public API.** Nothing here carries semver guarantees and none of it is supported for
|
|
5
|
+
* outside consumers; anything genuinely public belongs in `index.ts`. It exists so the test suite
|
|
6
|
+
* reaches the CLI through the package's export map instead of relative paths into `src/`, which
|
|
7
|
+
* keeps the set of test-visible symbols explicit — adding a line here is a deliberate act, and a
|
|
8
|
+
* moved file no longer silently rewires a test.
|
|
9
|
+
*/
|
|
10
|
+
export { loadArgusConfig, resolveArgusConfigPath } from './config/loadConfig.js';
|
|
11
|
+
export { mergeChromeStartOptionsWithConfig, mergeWatcherStartOptionsWithConfig } from './config/mergeConfig.js';
|
|
12
|
+
export { loadEvalArgsFile, parseEvalArgFlags, resolveEvalArgs } from './commands/evalArgs.js';
|
|
13
|
+
export { bundleEvalEntry } from './commands/evalBundle.js';
|
|
14
|
+
export { fileUsesModuleSyntax } from './commands/evalModuleSyntax.js';
|
|
15
|
+
export { createEvalResultFileSink, formatRotatedPath } from './commands/evalResultOutput.js';
|
|
16
|
+
export { parseDurationFlagMs, parseTimeoutMs, resolveBundleDecision, resolveExpression, wrapExpressionWithArgs } from './commands/evalShared.js';
|
|
17
|
+
export { inferRecordFormatFromOutFile, parseRecordClipValue, parseRecordFormatValue, parseRecordFpsValue, validateRecordOutFile, validateRecordOutFileForFormat, } from './commands/record.js';
|
|
18
|
+
export { formatEvalTransportError } from './eval/evalClient.js';
|
|
19
|
+
export { createOutput } from './output/io.js';
|
|
20
|
+
export { ARGUS_EXTENSION_ID } from './commands/extension/extensionId.js';
|
|
21
|
+
export { installNativeHostsTo } from './commands/extension/nativeHost.js';
|
|
22
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAChF,OAAO,EAAE,iCAAiC,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAA;AAC/G,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7F,OAAO,EAAE,eAAe,EAA8B,MAAM,0BAA0B,CAAA;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAC5F,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAChJ,OAAO,EACN,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,GAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAA4B,MAAM,oCAAoC,CAAA"}
|
package/dist/output/io.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
type OutputOptions = {
|
|
2
2
|
json?: boolean;
|
|
3
3
|
};
|
|
4
|
+
import type { ArgusOutput } from '@vforsh/argus-plugin-api';
|
|
4
5
|
/** Route incidental console progress to stderr before JSON-mode plugins are loaded. */
|
|
5
6
|
export declare const configureMachineSafeConsole: (argv: readonly string[]) => void;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
writeWarn: (text: string) => void;
|
|
14
|
-
};
|
|
7
|
+
/**
|
|
8
|
+
* Output helpers that enforce JSON/stdout vs human/stderr rules.
|
|
9
|
+
*
|
|
10
|
+
* Declared by `@vforsh/argus-plugin-api`, which is the published contract: the CLI hands
|
|
11
|
+
* this exact object to plugins, so re-declaring it here would let the two drift silently.
|
|
12
|
+
*/
|
|
13
|
+
export type Output = ArgusOutput;
|
|
15
14
|
/** Output helpers that enforce JSON/stdout vs human/stderr rules. */
|
|
16
15
|
export declare const createOutput: (options: OutputOptions) => Output;
|
|
17
16
|
export {};
|
package/dist/output/io.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/output/io.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/output/io.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAED,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAG3D,uFAAuF;AACvF,eAAO,MAAM,2BAA2B,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,IASrE,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,WAAW,CAAA;AAEhC,qEAAqE;AACrE,eAAO,MAAM,YAAY,GAAI,SAAS,aAAa,KAAG,MAoCrD,CAAA"}
|
package/dist/output/io.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/output/io.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/output/io.ts"],"names":[],"mappings":"AAKA,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAA;AAEtG,uFAAuF;AACvF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,IAAuB,EAAQ,EAAE;IAC5E,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/D,OAAM;IACP,CAAC;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,GAAG,iBAAiB,CAAA;IAC/B,OAAO,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAChC,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAA;AAClC,CAAC,CAAA;AAUD,qEAAqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAsB,EAAU,EAAE;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,CAAA;IAClC,IAAI,iBAAiB,GAAG,KAAK,CAAA;IAE7B,MAAM,aAAa,GAAG,CAAC,KAAc,EAAQ,EAAE;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;IACnD,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,KAAc,EAAQ,EAAE;QAC1C,IAAI,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;QAC5E,CAAC;QACD,iBAAiB,GAAG,IAAI,CAAA;QACxB,aAAa,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAQ,EAAE;QACzC,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC;IACF,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,IAAY,EAAQ,EAAE;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAA;IAClD,CAAC,CAAA;IAED,OAAO;QACN,IAAI;QACJ,SAAS;QACT,aAAa;QACb,UAAU;QACV,SAAS;KACT,CAAA;AACF,CAAC,CAAA"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -3,8 +3,5 @@ import type { RegistryV1 } from '@vforsh/argus-core';
|
|
|
3
3
|
export declare const loadRegistry: () => Promise<RegistryV1>;
|
|
4
4
|
/** Prune stale entries atomically (locked read-modify-write) and return the pruned registry. */
|
|
5
5
|
export declare const pruneRegistry: (ttlMs?: number) => Promise<RegistryV1>;
|
|
6
|
-
|
|
7
|
-
export declare const removeWatcherAndPersist: (id: string) => Promise<RegistryV1>;
|
|
8
|
-
/** Remove multiple watcher entries atomically (locked read-modify-write) and return the updated registry. */
|
|
9
|
-
export declare const removeWatchersAndPersist: (ids: string[]) => Promise<RegistryV1>;
|
|
6
|
+
export { removeWatcherAndPersist, removeWatchersAndPersist } from '@vforsh/argus-core';
|
|
10
7
|
//# sourceMappingURL=registry.d.ts.map
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,iDAAiD;AACjD,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,UAAU,CAMvD,CAAA;AAED,gGAAgG;AAChG,eAAO,MAAM,aAAa,GAAU,cAAsB,KAAG,OAAO,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,iDAAiD;AACjD,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,UAAU,CAMvD,CAAA;AAED,gGAAgG;AAChG,eAAO,MAAM,aAAa,GAAU,cAAsB,KAAG,OAAO,CAAC,UAAU,CAAoC,CAAA;AAGnH,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/registry.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_TTL_MS,
|
|
1
|
+
import { DEFAULT_TTL_MS, readAndPruneRegistry, readRegistry } from '@vforsh/argus-core';
|
|
2
2
|
/** Read registry and emit warnings to stderr. */
|
|
3
3
|
export const loadRegistry = async () => {
|
|
4
4
|
const { registry, warnings } = await readRegistry();
|
|
@@ -8,28 +8,7 @@ export const loadRegistry = async () => {
|
|
|
8
8
|
return registry;
|
|
9
9
|
};
|
|
10
10
|
/** Prune stale entries atomically (locked read-modify-write) and return the pruned registry. */
|
|
11
|
-
export const pruneRegistry = async (ttlMs = DEFAULT_TTL_MS) => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return pruned;
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
|
-
/** Remove watcher entry atomically (locked read-modify-write) and return the updated registry. */
|
|
18
|
-
export const removeWatcherAndPersist = async (id) => {
|
|
19
|
-
return updateRegistry((registry) => removeWatcherEntry(registry, id));
|
|
20
|
-
};
|
|
21
|
-
/** Remove multiple watcher entries atomically (locked read-modify-write) and return the updated registry. */
|
|
22
|
-
export const removeWatchersAndPersist = async (ids) => {
|
|
23
|
-
if (ids.length === 0) {
|
|
24
|
-
const { registry } = await readRegistry();
|
|
25
|
-
return registry;
|
|
26
|
-
}
|
|
27
|
-
return updateRegistry((registry) => {
|
|
28
|
-
let next = registry;
|
|
29
|
-
for (const id of ids) {
|
|
30
|
-
next = removeWatcherEntry(next, id);
|
|
31
|
-
}
|
|
32
|
-
return next;
|
|
33
|
-
});
|
|
34
|
-
};
|
|
11
|
+
export const pruneRegistry = async (ttlMs = DEFAULT_TTL_MS) => readAndPruneRegistry({ ttlMs });
|
|
12
|
+
// Registry mutation lives in argus-core so the CLI and the SDK cannot drift on a file they share.
|
|
13
|
+
export { removeWatcherAndPersist, removeWatchersAndPersist } from '@vforsh/argus-core';
|
|
35
14
|
//# sourceMappingURL=registry.js.map
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGvF,iDAAiD;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,IAAyB,EAAE;IAC3D,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,EAAE,CAAA;IACnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;IACD,OAAO,QAAQ,CAAA;AAChB,CAAC,CAAA;AAED,gGAAgG;AAChG,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAAK,GAAG,cAAc,EAAuB,EAAE,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAEnH,kGAAkG;AAClG,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/runtime-code/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAKvD,OAAO,KAAK,EAAkB,eAAe,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/runtime-code/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAKvD,OAAO,KAAK,EAAkB,eAAe,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAS5F,eAAO,MAAM,mBAAmB,GAAU,QAAQ,MAAM,EAAE,MAAM,gBAAgB,KAAG,OAAO,CAAC,yBAAyB,CAsBnH,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,SAAS,aAAa,EAAE,EAAE,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,WAAW,KAAG,eAAe,EAwBtI,CAAA"}
|
|
@@ -3,6 +3,7 @@ import prettier from 'prettier/standalone';
|
|
|
3
3
|
import babelPlugin from 'prettier/plugins/babel';
|
|
4
4
|
import estreePlugin from 'prettier/plugins/estree';
|
|
5
5
|
import postcssPlugin from 'prettier/plugins/postcss';
|
|
6
|
+
import { formatError } from '../cli/parse.js';
|
|
6
7
|
const PRETTY_CONTEXT_BEFORE = 1;
|
|
7
8
|
const PRETTY_CONTEXT_AFTER = 1;
|
|
8
9
|
const MAX_PRETTY_LINE_WIDTH = 160;
|
|
@@ -26,7 +27,7 @@ export const formatRuntimeSource = async (source, type) => {
|
|
|
26
27
|
return {
|
|
27
28
|
source,
|
|
28
29
|
changed: false,
|
|
29
|
-
error:
|
|
30
|
+
error: formatError(error),
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/runtime-code/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAA2C,MAAM,oBAAoB,CAAA;AAElG,OAAO,QAAQ,MAAM,qBAAqB,CAAA;AAC1C,OAAO,WAAW,MAAM,wBAAwB,CAAA;AAChD,OAAO,YAAY,MAAM,yBAAyB,CAAA;AAClD,OAAO,aAAa,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/runtime-code/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -112,6 +112,8 @@ argus ext doctor --watcher "$WATCHER_ID"
|
|
|
112
112
|
|
|
113
113
|
`--iframe auto` is a convenience heuristic and should fail closed when multiple iframes look equally plausible. Prefer `--iframe-url` or `--iframe-title` when correctness matters.
|
|
114
114
|
|
|
115
|
+
Reload remains tab-scoped. A selected iframe stays selected while detached: commands wait up to 3s for recovery, then fail with `extension_frame_not_ready` instead of running on the host. `ext targets --tree` shows the missing selection as `pending`; use `ext select <id> --page` explicitly to work on the host.
|
|
116
|
+
|
|
115
117
|
---
|
|
116
118
|
|
|
117
119
|
## Inspect Loop
|
|
@@ -137,12 +139,15 @@ argus click app --selector "button.submit"
|
|
|
137
139
|
argus click app --ref e5
|
|
138
140
|
argus drag app --selector "canvas" --pos 320,240 --by 80,-30
|
|
139
141
|
argus fill app --selector "#email" "user@example.com"
|
|
142
|
+
argus fill app --selector "#email" --value "user@example.com"
|
|
140
143
|
argus keydown app --key Enter
|
|
141
144
|
argus keydown app --key G
|
|
142
145
|
argus keydown app --code KeyG --print-event
|
|
143
146
|
argus scroll-to app --selector "#footer"
|
|
144
147
|
```
|
|
145
148
|
|
|
149
|
+
For generated commands, `argus eval app --expression "document.title"` is equivalent to the positional expression form.
|
|
150
|
+
|
|
146
151
|
For iframe-active extension watchers, commands run against the selected iframe target. Screenshots, recordings, selectors, and eval are resolved relative to that iframe.
|
|
147
152
|
Network mocks default to the top-level page; pass `--scope selected` (or `--frame selected`) to intercept requests from the selected iframe.
|
|
148
153
|
|
|
@@ -177,6 +182,8 @@ Keep these commands in the background in agent shells. See [START.md](./referenc
|
|
|
177
182
|
|
|
178
183
|
**No extension-control watcher** — First time? Run `argus extension install`. Otherwise open/reload the extension, then run `argus ext doctor --json`.
|
|
179
184
|
|
|
185
|
+
**Debugger attach rejected** — Popup and CLI return Chrome's original error; the failed session is cleaned up. Release the conflicting debugger and retry. `ext doctor --watcher <id>` checks actual target attachment/readiness separately from native bridge connectivity.
|
|
186
|
+
|
|
180
187
|
**Multiple tabs matched** — Use `argus ext tabs --url <url> --json`, choose a `tabId`, then pass `--tab <tabId>`.
|
|
181
188
|
|
|
182
189
|
**Iframe not found** — `argus ext show <id>`, `argus reload <id>`, wait for iframes, then `argus ext targets <id> --tree`.
|
|
@@ -34,6 +34,14 @@ argus logs extension
|
|
|
34
34
|
argus eval extension "document.title"
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
+
Attachment failures surface Chrome's original error in both popup and CLI; no successful attachment is reported and the failed tab bridge is removed. A connected control bridge does not mean a tab is attached: `argus ext doctor --watcher <id>` flags detached, disconnected, or pending selected targets.
|
|
38
|
+
|
|
39
|
+
### Iframe Recovery
|
|
40
|
+
|
|
41
|
+
`argus reload <id>` reloads the whole tab. A requested iframe remains selected while missing or booting; eval, DOM, and capture wait up to 3s for readiness, then fail with `extension_frame_not_ready`. They never fall back to the host page. Recovery requires a unique URL/hint match; `ext targets <id> --tree` keeps a `pending` placeholder visible (`attached: true` denotes selection, `targetReady: false` denotes pending readiness in JSON).
|
|
42
|
+
|
|
43
|
+
Retry once the iframe loads, or explicitly select the host with `argus ext select <id> --page`. Use `argus ext doctor --watcher <id>` to distinguish target readiness from bridge health.
|
|
44
|
+
|
|
37
45
|
### Limitations
|
|
38
46
|
|
|
39
47
|
- Debugging bar can't be hidden (Chrome security)
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { MatchCase, NetQuery } from '@vforsh/argus-core';
|
|
2
|
+
import { normalizeMatchPatterns } from '@vforsh/argus-core';
|
|
3
|
+
export { normalizeMatchPatterns };
|
|
1
4
|
type MatchCaseOptions = {
|
|
2
5
|
ignoreCase?: boolean;
|
|
3
6
|
caseSensitive?: boolean;
|
|
@@ -23,7 +26,8 @@ export declare const appendLogFilterParams: (params: URLSearchParams, options: {
|
|
|
23
26
|
}) => {
|
|
24
27
|
error?: string;
|
|
25
28
|
};
|
|
26
|
-
|
|
29
|
+
/** CLI-facing shape of the network filter flags, before validation. */
|
|
30
|
+
export type NetFilterCliOptions = {
|
|
27
31
|
grep?: string;
|
|
28
32
|
host?: string[];
|
|
29
33
|
method?: string[];
|
|
@@ -32,21 +36,19 @@ export declare const appendNetFilterParams: (params: URLSearchParams, options: {
|
|
|
32
36
|
mime?: string[];
|
|
33
37
|
scope?: string;
|
|
34
38
|
frame?: string;
|
|
35
|
-
party?:
|
|
39
|
+
party?: NetQuery['party'];
|
|
36
40
|
failedOnly?: boolean;
|
|
37
41
|
minDurationMs?: number;
|
|
38
42
|
minTransferBytes?: number;
|
|
39
|
-
}
|
|
43
|
+
};
|
|
44
|
+
export declare const appendNetFilterParams: (params: URLSearchParams, options: NetFilterCliOptions) => {
|
|
45
|
+
error?: string;
|
|
46
|
+
};
|
|
40
47
|
export declare const appendNetIgnoreParams: (params: URLSearchParams, options: {
|
|
41
48
|
ignoreHost?: string[];
|
|
42
49
|
ignorePattern?: string[];
|
|
43
50
|
}) => {
|
|
44
51
|
error?: string;
|
|
45
52
|
};
|
|
46
|
-
export declare const
|
|
47
|
-
patterns: string[];
|
|
48
|
-
error?: string;
|
|
49
|
-
};
|
|
50
|
-
export declare const resolveMatchCase: (options: MatchCaseOptions) => "sensitive" | "insensitive" | undefined;
|
|
51
|
-
export {};
|
|
53
|
+
export declare const resolveMatchCase: (options: MatchCaseOptions) => MatchCase | undefined;
|
|
52
54
|
//# sourceMappingURL=queryParams.d.ts.map
|