@extension.dev/mcp 10.10.9 → 10.10.11

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.
Files changed (77) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +85 -1
  4. package/README.md +10 -10
  5. package/claude/ARCHITECTURE.md +13 -13
  6. package/claude/CLAUDE.md +11 -10
  7. package/claude/README.md +4 -4
  8. package/claude/commands/extension-debug.md +1 -1
  9. package/claude/commands/extension-publish.md +1 -1
  10. package/claude/commands/extension.md +1 -1
  11. package/claude/rules/cross-browser.md +4 -3
  12. package/claude/rules/mcp-tools.md +446 -1009
  13. package/dist/module.js +4621 -1501
  14. package/dist/src/index.d.ts +1 -0
  15. package/dist/src/lib/allowance.d.ts +1 -1
  16. package/dist/src/lib/artifacts-api.d.ts +1 -0
  17. package/dist/src/lib/boot-verdict.d.ts +5 -0
  18. package/dist/src/lib/bridge-tabs.d.ts +3 -1
  19. package/dist/src/lib/browser-family.d.ts +1 -0
  20. package/dist/src/lib/carrier-registry.d.ts +4 -0
  21. package/dist/src/lib/carrier.d.ts +10 -1
  22. package/dist/src/lib/cdp-connection.d.ts +2 -1
  23. package/dist/src/lib/cdp-devtools.d.ts +5 -0
  24. package/dist/src/lib/cdp-extension-page.d.ts +26 -2
  25. package/dist/src/lib/cdp-page-scripts.d.ts +2 -2
  26. package/dist/src/lib/cdp-port.d.ts +1 -1
  27. package/dist/src/lib/cdp.d.ts +13 -1
  28. package/dist/src/lib/common-schema.d.ts +1 -1
  29. package/dist/src/lib/create-answer.d.ts +20 -0
  30. package/dist/src/lib/credential-source.d.ts +25 -0
  31. package/dist/src/lib/credentials.d.ts +23 -0
  32. package/dist/src/lib/docs-tools.d.ts +9 -0
  33. package/dist/src/lib/engine-manifest-view.d.ts +1 -0
  34. package/dist/src/lib/envelope.d.ts +1 -1
  35. package/dist/src/lib/exec.d.ts +3 -0
  36. package/dist/src/lib/extension-identity.d.ts +7 -0
  37. package/dist/src/lib/first-build.d.ts +15 -0
  38. package/dist/src/lib/guest-load-oracle.d.ts +2 -1
  39. package/dist/src/lib/launch-flags.d.ts +2 -2
  40. package/dist/src/lib/match-patterns.d.ts +1 -1
  41. package/dist/src/lib/node-engine.d.ts +11 -0
  42. package/dist/src/lib/platform-hold.d.ts +1 -0
  43. package/dist/src/lib/process-identity.d.ts +5 -0
  44. package/dist/src/lib/process-manager.d.ts +5 -1
  45. package/dist/src/lib/project-manifest.d.ts +1 -0
  46. package/dist/src/lib/promote-outcome.d.ts +29 -0
  47. package/dist/src/lib/publish.d.ts +2 -0
  48. package/dist/src/lib/registry-access.d.ts +1 -0
  49. package/dist/src/lib/registry.d.ts +6 -1
  50. package/dist/src/lib/safari-automation.d.ts +2 -0
  51. package/dist/src/lib/session-browser.d.ts +5 -0
  52. package/dist/src/lib/session-paths.d.ts +1 -0
  53. package/dist/src/lib/store-review.d.ts +14 -2
  54. package/dist/src/lib/submit-outcome.d.ts +14 -0
  55. package/dist/src/lib/templates-cache.d.ts +13 -0
  56. package/dist/src/lib/types.d.ts +2 -1
  57. package/dist/src/lib/vendor/chrome-theme/chrome-theme-resolve.d.ts +1 -0
  58. package/dist/src/tools/assert.d.ts +4 -1
  59. package/dist/src/tools/create.d.ts +1 -0
  60. package/dist/src/tools/dev.d.ts +2 -2
  61. package/dist/src/tools/dom-snapshot.d.ts +1 -1
  62. package/dist/src/tools/eval.d.ts +1 -1
  63. package/dist/src/tools/inspect-gecko.d.ts +2 -1
  64. package/dist/src/tools/logs-filter.d.ts +6 -2
  65. package/dist/src/tools/open.d.ts +4 -1
  66. package/dist/src/tools/project-create.d.ts +1 -0
  67. package/dist/src/tools/reload.d.ts +1 -1
  68. package/dist/src/tools/start.d.ts +2 -2
  69. package/dist/src/tools/stop.d.ts +10 -0
  70. package/dist/src/tools/storage.d.ts +1 -6
  71. package/dist/src/tools/store-status.d.ts +4 -0
  72. package/extensions/live-preview/chromium/action/index.css +1 -1
  73. package/extensions/live-preview/chromium/action/index.js +1 -1
  74. package/extensions/live-preview/chromium/background/service_worker.js +98 -4
  75. package/extensions/live-preview/chromium/manifest.json +1 -1
  76. package/package.json +3 -2
  77. package/server.json +3 -3
@@ -1,4 +1,98 @@
1
- (()=>{"use strict";let e={alarms:["alarms"],bookmarks:["bookmarks"],contextMenus:["contextMenus"],cookies:["cookies"],downloads:["downloads"],history:["history"],notifications:["notifications"],offscreen:["offscreen"],contentSettings:["contentSettings"],debugger:["debugger"],declarativeNetRequest:["declarativeNetRequest","declarativeNetRequestWithHostAccess"],fontSettings:["fontSettings"],identity:["identity"],idle:["idle"],instanceID:["gcm"],management:["management"],mdns:["mdns"],power:["power"],printerProvider:["printerProvider"],printing:["printing"],privacy:["privacy"],proxy:["proxy"],sidePanel:["sidePanel"],tabCapture:["tabCapture"],tabGroups:["tabGroups"],topSites:["topSites"],tts:["tts"],userScripts:["userScripts"],webNavigation:["webNavigation"],webRequest:["webRequest"]};function t(e){let t=e.discarded??!1;return{id:e.id,index:e.index,windowId:e.windowId,url:e.url,title:e.title,active:e.active,highlighted:e.active,selected:e.active,pinned:e.pinned??!1,discarded:t,autoDiscardable:!0,frozen:!1,groupId:e.groupId??-1,splitViewId:-1,status:e.status??(t?"unloaded":"complete"),incognito:e.incognito??!1,audible:!1,mutedInfo:{muted:!1},width:e.width??1280,height:e.height??800,...void 0===e.lastAccessed?{}:{lastAccessed:e.lastAccessed}}}function r(e,r,n){return t({id:r.id,index:r.index??n,windowId:e.id,url:r.url,title:r.title,active:r.active??r.id===e.activeTabId,pinned:r.pinned,discarded:r.discarded,groupId:r.tabGroupId,status:r.status,incognito:r.incognito})}JSON.stringify(e),JSON.stringify(["getSelf","getPermissionWarningsByManifest","uninstallSelf","installReplacementWebApp"]),JSON.stringify({"system.cpu":["system.cpu"],"system.memory":["system.memory"],"system.storage":["system.storage"],"system.display":["system.display"]});let n=new Set(["0","1","2","3"]),o="Invalid downloadId",s="Can't modify the root bookmark folders.";function a(e){return`No tab with id: ${String(e)}.`}function i(e){return`No window with id: ${String(e)}.`}function l(e){return null!=e}function c(e,t){for(let r of Array.isArray(t)?t:[t])if(l(r)&&!function(e,t){for(let r of e)for(let e=0;e<r.tabs.length;e+=1){let n=r.tabs[e];if(n&&n.id===t)return{window:r,index:e}}}(e,r))return r}function d(e,t){let r=String(t);return e.some(e=>void 0!==e.id&&String(e.id)===r)}function u(e){return n.has(String(e??""))}let f=new Set(["storage.setAccessLevel","storage.get","storage.set","storage.remove","storage.clear","tabs.create","tabs.update","tabs.remove","tabs.move","tabs.discard","tabs.goBack","tabs.goForward","tabs.group","tabs.ungroup","tabGroups.query","tabGroups.get","tabGroups.update","tabGroups.move","tabs.get"]);async function g(e){let{data:t,windows:n,getStorage:o,setStorage:s,removeStorageKeys:i,clearStorage:d,onStorageChanged:u,onCreateTab:f,onUpdateTab:g,onRemoveTab:m,onMoveTab:p,onDiscardTab:h,onGroupTabs:b,onUngroupTabs:w,onQueryTabGroups:y,onGetTabGroup:v,onUpdateTabGroup:k,onMoveTabGroup:x,onTabGoBack:I,onTabGoForward:S,onSetStorageAccessLevel:A,respond:C}=e;switch(t.api){case"storage.setAccessLevel":{let[e,r]=t.args,n=e?.accessLevel;if("TRUSTED_CONTEXTS"!==n&&"TRUSTED_AND_UNTRUSTED_CONTEXTS"!==n)return void C({error:"Invalid access level."});await A?.(t.extensionId,r??"session",n),C({result:void 0});return}case"storage.get":{let[e,r]=t.args,n=o(t.extensionId,r??"local");if(!e)return void C({result:n});if(Array.isArray(e)){let t={};e.forEach(e=>{e in n&&(t[e]=n[e])}),C({result:t});return}if("string"==typeof e)return void C({result:e in n?{[e]:n[e]}:{}});if("object"==typeof e){let t={};Object.keys(e).forEach(r=>{t[r]=r in n?n[r]:e[r]}),C({result:t});return}C({result:n});return}case"storage.set":{let[e,r]=t.args,n=r??"local";if(e&&"object"==typeof e){let r=o(t.extensionId,n),a={};for(let t of Object.keys(e)){let n=r[t],o=e[t];if(JSON.stringify(n)===JSON.stringify(o))continue;let s={newValue:o};t in r&&(s.oldValue=n),a[t]=s}await s(t.extensionId,e,n),u&&Object.keys(a).length>0&&u(t.extensionId,a,n)}C({result:!0});return}case"storage.remove":{let[e,r]=t.args,n=r??"local",s=(Array.isArray(e)?e:[e]).filter(Boolean).map(String),a=o(t.extensionId,n),l={};for(let e of s)e in a&&(l[e]={oldValue:a[e]});await i(t.extensionId,s,n),u&&Object.keys(l).length>0&&u(t.extensionId,l,n),C({result:!0});return}case"storage.clear":{let[e]=t.args,r=e??"local",n=o(t.extensionId,r),s={};for(let e of Object.keys(n))s[e]={oldValue:n[e]};await d(t.extensionId,r),u&&Object.keys(s).length>0&&u(t.extensionId,s,r),C({result:!0});return}case"tabs.create":{let[e]=t.args;C({result:await f(e?.url??"chrome://newtab",e)??!0});return}case"tabs.update":{let[e,r]=t.args;if(null!==e&&"object"==typeof e&&(r=e,e=void 0),l(e)&&void 0!==c(n,e))return void C({error:a(e),refused:!0});C({result:await g(e,r??{})??!0});return}case"tabs.remove":{let[e]=t.args,r=c(n,e);if(void 0!==r)return void C({error:a(r),refused:!0});await m(e),C({result:void 0});return}case"tabs.move":{let[e,r]=t.args;C({result:await p?.(t.extensionId,e,r??{})});return}case"tabs.discard":{let[e]=t.args,r=c(n,e);if(void 0!==r)return void C({error:a(r),refused:!0});C({result:await h?.(t.extensionId,e)});return}case"tabs.goBack":{let[e]=t.args;await I?.(t.extensionId,e),C({result:void 0});return}case"tabs.goForward":{let[e]=t.args;await S?.(t.extensionId,e),C({result:void 0});return}case"tabs.group":{let[e]=t.args,r=c(n,e?.tabIds);if(void 0!==r)return void C({error:a(r),refused:!0});C({result:await b?.(t.extensionId,e??{})});return}case"tabs.ungroup":{let[e]=t.args,r=c(n,e);if(void 0!==r)return void C({error:a(r),refused:!0});await w?.(t.extensionId,e),C({result:void 0});return}case"tabGroups.query":{let[e]=t.args;C({result:await y?.(t.extensionId,e)??[]});return}case"tabGroups.get":{let[e]=t.args;C({result:await v?.(t.extensionId,e)});return}case"tabGroups.update":{let[e,r]=t.args;C({result:await k?.(t.extensionId,e,r??{})});return}case"tabGroups.move":{let[e,r]=t.args;C({result:await x?.(t.extensionId,e,r??{})});return}case"tabs.get":{let[e]=t.args;for(let t of n)for(let n=0;n<t.tabs.length;n+=1){let o=t.tabs[n];if(o&&o.id===e)return void C({result:r(t,o,n)})}C({error:`No tab with id: ${String(e)}.`})}}}let m=[0,0,0,0],p=e=>Math.max(0,Math.min(255,Math.round(e))),h={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"778899",lightslategrey:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"},b={transparent:[0,0,0,0]};function w(e,t,r,n){let o;return"function"!=typeof e&&(r({error:(o=n?` on the ${n} lane`:"",`No backend implements ${t}${o}, so the call did not run. This is a preview limitation, not an error in your extension: the API is on the bridge's wire protocol but nothing is wired behind it here.`),refused:!0}),!0)}let y=new Set(["tabs.query","sidePanel.open","action.openPopup","runtime.openOptionsPage","devtools.panels.create","action.setPopup","action.getBadgeText","action.getBadgeBackgroundColor","action.getTitle","action.setBadgeText","action.setBadgeBackgroundColor","action.setTitle","action.setIcon"]);async function v(e){let{data:t,windows:n,onOpenSidePanel:o,onOpenActionPopup:s,onOpenOptionsPage:a,onDevtoolsPanelCreate:i,onSetActionPopup:l,onGetActionState:c,onSetBadgeText:d,onSetBadgeBackground:u,onSetActionTitle:f,onSetActionIcon:g,respond:y}=e;switch(t.api){case"tabs.query":{let[e]=t.args,o=n.find(e=>e.focused)??n[0],s=n;e?.windowId!==void 0?s=-2===e.windowId?o?[o]:[]:n.filter(t=>t.id===e.windowId):e?.currentWindow===!0||e?.lastFocusedWindow===!0?s=o?[o]:[]:e?.currentWindow===!1&&(s=n.filter(e=>e!==o));let a=e?.url?Array.isArray(e.url)?e.url:[e.url]:null;y({result:s.flatMap(t=>t.tabs.map((e,n)=>r(t,e,n)).filter(t=>e?.active===void 0||t.active===e.active).filter(t=>e?.pinned===void 0||t.pinned===e.pinned).filter(t=>e?.status===void 0||t.status===e.status).filter(t=>e?.discarded===void 0||t.discarded===e.discarded).filter(t=>e?.groupId===void 0||(t.groupId??-1)===e.groupId).filter(e=>!a||a.some(t=>(function(e,t){if(!e)return!1;if("<all_urls>"===t)return!0;let r=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&");return RegExp(`^${r.replace(/\*/g,".*")}$`).test(e)})(e.url,t))))});return}case"sidePanel.open":await o(t.extensionId),y({result:void 0});return;case"action.openPopup":if(w(s,t.api,y))return;s?.(t.extensionId),y({result:void 0});return;case"runtime.openOptionsPage":if(w(a,t.api,y))return;a?.(t.extensionId),y({result:void 0});return;case"devtools.panels.create":{if(w(i,t.api,y))return;let[e]=t.args;i?.(t.extensionId,e?.page??""),y({result:!0});return}case"action.setPopup":{if(w(l,t.api,y))return;let[e]=t.args;l?.(t.extensionId,e?.popup??""),y({result:void 0});return}case"action.getBadgeText":{let[e]=t.args,r=await c?.(t.extensionId,e?.tabId);y({result:r?.badgeText??""});return}case"action.getBadgeBackgroundColor":{let[e]=t.args,r=await c?.(t.extensionId,e?.tabId);y({result:r?.badgeColor===void 0||null===r.badgeColor?m:function(e){if(Array.isArray(e)){let[t,r,n,o]=e;return[p(Number(t)||0),p(Number(r)||0),p(Number(n)||0),p(void 0===o?255:Number(o)||0)]}if("string"!=typeof e)return m;let t=e.trim().toLowerCase();if(!t)return m;let r=b[t];if(r)return[...r];let n=h[t];if(n)return[parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16),255];let o=/^rgba?\(([^)]+)\)$/.exec(t);if(o?.[1]){let e=o[1].split(",").map(e=>Number(e.trim()));if(e.length>=3&&e.slice(0,3).every(e=>!Number.isNaN(e))){let t=e[3];return[p(e[0]),p(e[1]),p(e[2]),void 0===t||Number.isNaN(t)?255:p(255*t)]}return m}let s=/^#([0-9a-f]{3,8})$/.exec(t);if(s?.[1]){let e=s[1],t=e=>1===e.length?parseInt(e+e,16):parseInt(e,16);if(3===e.length||4===e.length)return[t(e[0]),t(e[1]),t(e[2]),4===e.length?t(e[3]):255];if(6===e.length||8===e.length)return[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16),8===e.length?parseInt(e.slice(6,8),16):255]}return m}(r.badgeColor)});return}case"action.getTitle":{let[e]=t.args,r=await c?.(t.extensionId,e?.tabId);y({result:r?.title??""});return}case"action.setBadgeText":{let[e]=t.args;await d(t.extensionId,e?.text,e?.tabId),y({result:!0});return}case"action.setBadgeBackgroundColor":{let[e]=t.args;await u(t.extensionId,e?.color,e?.tabId),y({result:!0});return}case"action.setTitle":{let[e]=t.args;await f(t.extensionId,e?.title,e?.tabId),y({result:!0});return}case"action.setIcon":{let[e]=t.args,r="string"==typeof e?.path?e.path:"object"==typeof e?.path?Object.values(e.path)[0]:void 0;await g(t.extensionId,r),y({result:!0})}}}let k=new Set(["contextMenus.create","contextMenus.update","contextMenus.remove","contextMenus.removeAll","notifications.create","notifications.clear","notifications.update","notifications.getAll","downloads.search","downloads.cancel","downloads.pause","downloads.resume","downloads.erase","downloads.download"]);async function x(e){let{data:t,onCreateContextMenu:r,onUpdateContextMenu:n,onRemoveContextMenu:s,onClearContextMenus:a,onCreateNotification:i,onClearNotification:l,onUpdateNotification:c,onGetNotifications:d,onDownload:u,onSearchDownloads:f,onCancelDownload:g,onPauseDownload:m,onResumeDownload:p,onEraseDownloads:h,respond:b}=e;switch(t.api){case"contextMenus.create":{let[e]=t.args;b({result:await r(t.extensionId,e??{})});return}case"contextMenus.update":{let[e,r]=t.args;b({result:await n(t.extensionId,String(e??""),r??{})});return}case"contextMenus.remove":{let[e]=t.args;b({result:await s(t.extensionId,String(e??""))});return}case"contextMenus.removeAll":return void b({result:await a(t.extensionId)});case"notifications.create":{let[e,r]=t.args,n="string"==typeof e?e:void 0,o="string"==typeof e?r:e;b({result:await i(t.extensionId,n,o??{})});return}case"notifications.clear":{let[e]=t.args;b({result:await l(t.extensionId,String(e??""))});return}case"notifications.update":{let[e,r]=t.args;b({result:await c?.(t.extensionId,String(e??""),r??{})??!1});return}case"notifications.getAll":return void b({result:await d(t.extensionId)});case"downloads.search":{let[e]=t.args;b({result:await f?.(t.extensionId,e)??[]});return}case"downloads.cancel":{if(w(g,t.api,b))return;let[e]=t.args;if(await g?.(t.extensionId,e)===!1)return void b({error:o,refused:!0});b({result:void 0});return}case"downloads.pause":{if(w(m,t.api,b))return;let[e]=t.args;if(await m?.(t.extensionId,e)===!1)return void b({error:o,refused:!0});b({result:void 0});return}case"downloads.resume":{if(w(p,t.api,b))return;let[e]=t.args;if(await p?.(t.extensionId,e)===!1)return void b({error:o,refused:!0});b({result:void 0});return}case"downloads.erase":{if(w(h,t.api,b))return;let[e]=t.args;b({result:await h?.(t.extensionId,e)??[]});return}case"downloads.download":{let[e]=t.args;b({result:await u(t.extensionId,e??{})})}}}let I={"bookmarks-bar":"bookmarks-bar","other-bookmarks":"other","mobile-bookmarks":"mobile"};function S(e,t={}){let r=void 0===e.url,n=e.parentId??t.parentId,o=I[e.id];return{id:e.id,title:e.title??"",syncing:!1,...void 0===e.url?{}:{url:e.url},...void 0===e.index?{}:{index:e.index},...void 0===n?{}:{parentId:n},...void 0===e.dateAdded?{}:{dateAdded:e.dateAdded},...r&&void 0!==e.dateGroupModified?{dateGroupModified:e.dateGroupModified}:{},...o?{folderType:o}:{},...e.children?{children:e.children.map(t=>S(t,{parentId:e.id}))}:{}}}function A(e){return(e??[]).map(e=>S(e))}function C(e,r={}){let n={id:e.id,focused:e.focused??!1,incognito:e.incognito??!1,alwaysOnTop:e.alwaysOnTop??!1,state:e.state??"normal",type:e.type??"normal",top:e.top??0,left:e.left??0,width:e.width??1280,height:e.height??800};return r.populate?{...n,tabs:(e.tabs??[]).map((r,n)=>t({id:r.id,index:r.index??n,windowId:e.id,url:r.url,title:r.title,active:r.active??r.id===e.activeTabId,pinned:r.pinned,discarded:r.discarded,groupId:r.tabGroupId,status:r.status,incognito:r.incognito}))}:n}let T=new Set(["bookmarks.getTree","bookmarks.get","bookmarks.getChildren","bookmarks.search","bookmarks.create","bookmarks.update","bookmarks.remove","bookmarks.removeTree","bookmarks.move","history.search","history.getVisits","history.addUrl","history.deleteUrl","history.deleteRange","history.deleteAll","windows.get","windows.getAll","windows.getCurrent","windows.create","windows.update","windows.remove"]);async function $(e){let{data:t,windows:r,onGetWindow:n,onGetAllWindows:o,onCreateWindow:a,onUpdateWindow:c,onRemoveWindow:f,onGetBookmarkTree:g,onGetBookmarks:m,onGetBookmarkChildren:p,onSearchBookmarks:h,onCreateBookmark:b,onUpdateBookmark:w,onRemoveBookmark:y,onMoveBookmark:v,onSearchHistory:k,onGetHistoryVisits:x,onAddHistoryUrl:I,onDeleteHistoryUrl:T,onDeleteHistoryRange:$,onDeleteAllHistory:E,respond:N}=e;switch(t.api){case"bookmarks.getTree":let D,M;return void N({result:(M=(D=await g(t.extensionId)??[]).map(e=>e.dateAdded).filter(e=>void 0!==e).sort((e,t)=>e-t)[0],[S({id:"0",title:"",children:D,...void 0===M?{}:{dateAdded:M}})])});case"bookmarks.get":{let[e]=t.args,r=Array.isArray(e)?e:[e];N({result:A(await m(t.extensionId,r.filter(e=>null!=e).map(String)))});return}case"bookmarks.getChildren":{let[e]=t.args;N({result:A(await p(t.extensionId,null==e?void 0:String(e)))});return}case"bookmarks.search":{let[e]=t.args;N({result:A(await h(t.extensionId,e))});return}case"bookmarks.create":{let[e]=t.args,r=await b(t.extensionId,e??{});N({result:r?S(r):null});return}case"bookmarks.update":{let[e,r]=t.args;if(u(e))return void N({error:s,refused:!0});let n=await w(t.extensionId,String(e??""),r??{});N({result:n?S(n):null});return}case"bookmarks.remove":{let[e]=t.args;if(u(e))return void N({error:s,refused:!0});N({result:await y(t.extensionId,String(e??""),!1)});return}case"bookmarks.removeTree":{let[e]=t.args;if(u(e))return void N({error:s,refused:!0});N({result:await y(t.extensionId,String(e??""),!0)});return}case"bookmarks.move":{let[e,r]=t.args;if(u(e))return void N({error:s,refused:!0});N({result:await v?.(t.extensionId,String(e??""),r??{})});return}case"history.search":{let[e]=t.args;N({result:await k(t.extensionId,e??{})});return}case"history.getVisits":{let[e]=t.args;N({result:await x(t.extensionId,e??{})});return}case"history.addUrl":{let[e]=t.args;await I(t.extensionId,e??{}),N({result:!0});return}case"history.deleteUrl":{let[e]=t.args;await T(t.extensionId,e??{}),N({result:!0});return}case"history.deleteRange":{let[e]=t.args;await $(t.extensionId,e??{}),N({result:!0});return}case"history.deleteAll":await E(t.extensionId),N({result:!0});return;case"windows.get":{let[e,o]=t.args;if(l(e)&&!d(r,e))return void N({error:i(e),refused:!0});let s=await n(t.extensionId,null==e?void 0:String(e),o);N({result:s?C(s,{populate:o?.populate}):null});return}case"windows.getAll":{let[e]=t.args;N({result:function(e,t={}){return e.map(e=>C(e,t))}(await o(t.extensionId,e),{populate:e?.populate})});return}case"windows.getCurrent":{let[e]=t.args,n=r.find(e=>e.focused)??r[0];N({result:n?C(n,{populate:e?.populate}):null});return}case"windows.create":{let[e]=t.args,r=await a(t.extensionId,e?.url);N({result:r?C(r,{populate:!0}):null});return}case"windows.update":{let[e,n]=t.args;if(l(e)&&!d(r,e))return void N({error:i(e),refused:!0});let o=await c(t.extensionId,null==e?void 0:String(e),n??{});N({result:o?C(o):null});return}case"windows.remove":{let[e]=t.args;if(l(e)&&!d(r,e))return void N({error:i(e),refused:!0});N({result:await f(t.extensionId,null==e?void 0:String(e))})}}}let E=new Set(["runtime.sendMessage","tabs.sendMessage","runtime.getContexts","permissions.contains","permissions.request","permissions.remove","permissions.getAll","offscreen.createDocument","offscreen.closeDocument","offscreen.hasDocument","cookies.get","cookies.getAll","cookies.set","cookies.remove","scripting.executeScript","scripting.insertCSS"]);async function N(e){let{data:t,onRuntimeMessage:r,onTabMessage:n,onGetRuntimeContexts:o,onContainsPermissions:s,onRequestPermissions:a,onRemovePermissions:i,onGetAllPermissions:l,onCreateOffscreenDocument:c,onCloseOffscreenDocument:d,onHasOffscreenDocument:u,onGetCookie:f,onGetAllCookies:g,onSetCookie:m,onRemoveCookie:p,onExecuteScript:h,onInsertCss:b,respond:w,source:y}=e;switch(t.api){case"runtime.sendMessage":{let[e]=t.args;w({result:await r(t.extensionId,e,y)});return}case"tabs.sendMessage":{let[e,r]=t.args;if(!n)return void w({error:"Could not establish connection. Receiving end does not exist."});w({result:await n(t.extensionId,e,r)});return}case"runtime.getContexts":return void w({result:await o(t.extensionId)});case"permissions.contains":{let[e]=t.args;w({result:await s(t.extensionId,e??{})});return}case"permissions.request":{let[e]=t.args;w({result:await a(t.extensionId,e??{})});return}case"permissions.remove":{let[e]=t.args;w({result:await i(t.extensionId,e??{})});return}case"permissions.getAll":return void w({result:await l(t.extensionId)});case"offscreen.createDocument":{let[e]=t.args,r=await c(t.extensionId,e??{});w({result:"boolean"!=typeof r||r});return}case"offscreen.closeDocument":{let e=await d(t.extensionId);w({result:"boolean"!=typeof e||e});return}case"offscreen.hasDocument":return void w({result:await u(t.extensionId)});case"cookies.get":{let[e]=t.args;w({result:await f(t.extensionId,e??{})});return}case"cookies.getAll":{let[e]=t.args;w({result:await g(t.extensionId,e??{})});return}case"cookies.set":{let[e]=t.args;w({result:await m(t.extensionId,e??{})});return}case"cookies.remove":{let[e]=t.args;w({result:await p(t.extensionId,e??{})});return}case"scripting.executeScript":{let[e]=t.args;w({result:await h(t.extensionId,e??{})});return}case"scripting.insertCSS":{let[e]=t.args;await b(t.extensionId,e??{}),w({result:!0})}}}let D=["local","sync","session","managed"];function M(){return[...f,...y,...k,...T,...E].sort()}function U(e,t){let r=Math.min(e.length,t.length),n=0;for(;n<r&&e[n]===t[n];)n+=1;return n}function R(e){let t=function(e){let t=M();if(t.includes(e))return null;let r=e.split(".");if(3===r.length&&"storage"===r[0]&&D.includes(r[1]??"")){let e=`storage.${r[2]}`;if(t.includes(e))return e}let n=r[r.length-1]??"",o=t.filter(e=>e.endsWith(`.${n}`));if(o.length)return o.sort((t,r)=>U(r,e)-U(t,e))[0];let s=t.filter(e=>e.startsWith(`${r[0]}.`));return s.length?s[0]??null:null}(e),r=`Unsupported API: ${e}.`;if(!t)return`${r} No wire name resembles it, so this API is not on the bridge at all. It may still work natively inside your extension's own contexts: the bridge is what an observer page can DRIVE, not the whole runtime.`;let n=t.startsWith("storage.")&&e.startsWith("storage.")?` The bridge takes the storage area as an ARGUMENT, not as part of the name: ${t}(keys, "local").`:"";return`${r} The closest wire name the bridge routes is ${t}.${n}`}let B={dom:"*",extension:["getURL","inIncognitoContext","lastError","onRequest","sendRequest"],i18n:"*",runtime:["connect","getManifest","getURL","getVersion","id","onConnect","onMessage","sendMessage"],scripting:["globalParams"],storage:"*"};function q(e){let[t="",r=""]=e.split("."),n=B[t];return"*"===n||!!Array.isArray(n)&&n.includes(r)}let P=M().filter(e=>!q(e));function O(e){var t;let r;return e.untrustedContext?q(e.api)?null:(r=(t=e.api).split(".")[0]??t,`chrome.${r} is not available to content scripts. Chrome gives a content script only chrome.storage, chrome.i18n, chrome.dom, chrome.extension and the messaging half of chrome.runtime, so ${t} cannot be reached from a page context. Call it from the background service worker or an extension page and reach the content script with runtime.sendMessage.`):null}let j=["extension","i18n","runtime","scripting","storage"],G=P.filter(e=>j.includes(e.split(".")[0]??""));JSON.stringify(j),JSON.stringify(G);let L=["url","pendingUrl","title","favIconUrl"],_=new Set(["tabs.get","tabs.query","tabs.create","tabs.update","tabs.move","tabs.discard"]),W=new Set(["windows.get","windows.getAll","windows.getCurrent","windows.create","windows.update"]),V=["url","title"];function H(e){return"<all_urls>"===e||e.includes("://")}function F(e,t){if(!e||"object"!=typeof e||function(e,t){if(e.has("tabs"))return!0;if(!t)return!1;for(let r of e){if(!H(r))continue;let e=function(e){let t;if("<all_urls>"===e)return/^(?:https?|file|ftp):\/\//;let r=/^(\*|https?|file|ftp):\/\/([^/]*)(\/.*)?$/.exec(e);if(!r)return null;let[,n="",o="",s="/*"]=r,a="*"===n?"https?":n.replace(/[.+?^${}()|[\]\\]/g,"\\$&");t="*"===o?"[^/]+":o.startsWith("*.")?`(?:[^/]+\\.)?${o.slice(2).replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")}`:o.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*");let i=s.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return RegExp(`^${a}://${t}${i}$`)}(r);if(e?.test(t))return!0}return!1}(t,"string"==typeof e.url?e.url:"string"==typeof e.pendingUrl?e.pendingUrl:void 0))return e;let r={...e};for(let e of L)delete r[e];return r}function J(e,t){return e&&"object"==typeof e&&Array.isArray(e.tabs)?{...e,tabs:e.tabs.map(e=>F(e,t))}:e}let z={...e,storage:["storage"],scripting:["scripting","activeTab"]};function X(e,t){let r=e.split(".")[0]??"",n=z[r];return!n||null===t||n.some(e=>t.has(e))?null:`chrome.${r} needs the "${n.join('" or "')}" permission, which this session did not declare. Declare it in the manifest (and re-register the session) to use this API.`}let K=e=>"string"==typeof e&&e.length>0;function Q(e,t){return`Error in invocation of ${e}: ${t}`}function Y(e,t){return Q(e,`missing required property '${t}'`)}function Z(e,t,r,n){return Q(e,`'${t}' expects a ${r}, got ${typeof n}`)}async function ee(e){let{data:t,getDeclaredPermissions:r,getSessionStorageAccessLevel:n}=e,o=r?r(t.extensionId):void 0,s=r=>{var n,s;return e.respond("result"in r?{...r,result:(n=t.api,s=r.result,!o||o.has("tabs")?s:_.has(n)?Array.isArray(s)?s.map(e=>F(e,o)):F(s,o):W.has(n)?Array.isArray(s)?s.map(e=>J(e,o)):J(s,o):s)}:r)},a={...e,respond:s};try{var i;if(i=t.api,!(f.has(i)||y.has(i)||k.has(i)||T.has(i)||E.has(i)))return void s({error:R(t.api),refused:!0});let e=O(t);if(e)return void s({error:e,refused:!0});let r=function(e,t){let r=t[0];switch(e){case"downloads.download":if(!r||!("url"in r))return Y(e,"url");if(!K(r.url))return Z(e,"url","non-empty string",r.url);if(void 0!==r.filename&&"string"!=typeof r.filename)return Z(e,"filename","string",r.filename);return null;case"offscreen.createDocument":if(!r||!K(r.url))return Y(e,"url");if(!Array.isArray(r.reasons)||0===r.reasons.length)return Y(e,"reasons");if(!K(r.justification))return Y(e,"justification");return null;case"contextMenus.create":if(!r)return Y(e,"title");if(void 0!==r.id&&"string"!=typeof r.id)return Z(e,"id","string",r.id);if("separator"!==r.type&&!K(r.title))return Y(e,"title");return null;case"notifications.create":{let r="string"==typeof t[0]?t[1]:t[0];if(!r)return Y(e,"options");for(let t of["type","iconUrl","title","message"])if(!K(r[t]))return Y(e,t);return null}case"action.setTitle":if(r&&void 0!==r.title&&"string"!=typeof r.title)return Z(e,"title","string",r.title);return null;case"action.setBadgeText":if(r&&void 0!==r.text&&"string"!=typeof r.text)return Z(e,"text","string",r.text);return null;case"action.setBadgeBackgroundColor":if(!r||void 0===r.color)return Y(e,"color");if("string"!=typeof r.color&&!Array.isArray(r.color))return Z(e,"color","string or array",r.color);return null;case"tabs.create":if(r?.url!==void 0&&"string"!=typeof r.url)return Z(e,"url","string",r.url);return null;default:return null}}(t.api,t.args);if(r)return void s({error:r});let l=function(e,t,r){var n,o;let s=O(e);if(s)return s;if(void 0!==t){let r=X(e.api,t)??function(e,t,r){if("tabs.query"!==e||!r||r.has("tabs")||function(e){for(let t of e)if(H(t))return!0;return!1}(r))return null;let[n]=t;if(!n||"object"!=typeof n)return null;let o=V.filter(e=>void 0!==n[e]);return o.length?`chrome.tabs.query cannot filter by "${o.join('" or "')}" without the "tabs" permission or a matching host permission, which this session did not declare. Declare it in the manifest (and re-register the session) to filter on it.`:null}(e.api,e.args,t);if(r)return r}return e.untrustedContext&&e.api.startsWith("storage.")?"session"!==(n=e.api,o=e.args,"storage.clear"===n?o[0]:o[1])||"TRUSTED_AND_UNTRUSTED_CONTEXTS"===(r?.(e.extensionId)??"TRUSTED_CONTEXTS")?null:"Access to storage is not allowed from this context.":null}(t,o,n);if(l)return void s({error:l,refused:!0});if(f.has(t.api))return void await g(a);if(y.has(t.api))return void await v(a);if(k.has(t.api))return void await x(a);if(T.has(t.api))return void await $(a);if(E.has(t.api))return void await N(a);s({error:R(t.api),refused:!0})}catch(e){s({error:e instanceof Error?e.message:"Unknown error"})}}function et(e,t){if(t){if(/^(https?|blob|data|chrome-extension):/i.test(t))return t;if(e)for(let r of[t,t.replace(/^\.?\//,""),`/${t.replace(/^\.?\//,"")}`,`./${t.replace(/^\.?\//,"")}`]){let t=e[r];if(t)return t}}}async function er(e){let t=await fetch(e);if(!t.ok)throw Error(`could not read the guest asset (HTTP ${t.status})`);let r=await t.blob(),n=new Uint8Array(await r.arrayBuffer()),o="";for(let e of n)o+=String.fromCharCode(e);let s=r.type||"application/octet-stream";return`data:${s};base64,${btoa(o)}`}async function en(e){let t=await fetch(e);if(!t.ok)throw Error(`could not read the guest icon (HTTP ${t.status})`);let r=await createImageBitmap(await t.blob());try{let e=new OffscreenCanvas(r.width,r.height).getContext("2d");if(!e)throw Error("no 2d context is available to decode the guest icon");return e.drawImage(r,0,0),e.getImageData(0,0,r.width,r.height)}finally{r.close()}}async function eo(e,t){let r={...e};for(let e of["iconUrl","imageUrl","appIconMaskUrl"]){let n=et(t,r[e]);n&&(r[e]=await er(n))}return Array.isArray(r.buttons)&&(r.buttons=await Promise.all(r.buttons.map(async e=>{let r=et(t,e.iconUrl);return r?{...e,iconUrl:await er(r)}:e}))),r}function es(e,t){throw Error(`${e} did not run on the real lane: ${t}`)}let ea=e=>{let t=Number(e);return Number.isFinite(t)?t:void 0},ei=e=>{let t=Number(e);return Number.isFinite(t)?t:void 0},el=new Set(["system.cpu.getInfo","system.memory.getInfo","system.storage.getInfo","system.storage.ejectDevice","system.display.getInfo","system.display.getDisplayLayout","system.display.setDisplayProperties","system.display.setDisplayLayout"]),ec=["topSites","fontSettings","printing","power","tts","userScripts","debugger","system.network","enterprise.deviceAttributes","instanceID","identity","webNavigation","proxy.settings","contentSettings","tabCapture"].sort((e,t)=>t.length-e.length);function ed(e){if(el.has(e))return"refused";for(let t of ec)if(e===t||e.startsWith(`${t}.`))return"mocked";return"emulated"}let eu=/^__(ext|extjs|extension)[a-z0-9-]*__$/i,ef=new Set(["runtime.connect","runtime.onConnect","runtime.sendMessage","runtime.onMessage","tabs.connect","tabs.sendMessage"]);function eg(e){return"string"==typeof e&&eu.test(e)}let em=new Set(["storage","action","offscreen","runtime","tabs.sendMessage","scripting","downloads","notifications","contextMenus"]);function ep(e){return!!e&&(e.startsWith("Unsupported API: ")||e.startsWith("No backend implements ")||/needs the ".+" permission, which this (session did not declare|extension's manifest does not declare)/.test(e))}function eh(e){return e.refused||ep(e.error)?"refused":"real"===e.lane?"real":ed(e.api)}let eb=new Set(["local","sync","session","managed"]);function ew(e,t){let r=e.split(".");if("storage"!==r[0])return e;if(3===r.length&&eb.has(r[1]??""))return`storage.${r[2]}@${r[1]}`;if(2===r.length){let e="clear"===r[1]?t?.[0]:t?.[1];return`storage.${r[1]}@${"string"==typeof e?e:"local"}`}return e}let ey=new TextEncoder;function ev(e,t){return{path:e,bytes:ey.encode(t),text:t}}let ek={manifest_version:3,name:"Hello Emulator",version:"0.1.0",description:"Trace fixture exercising emulated, mocked, and refused chrome.* tiers.",permissions:["storage","tabs","notifications","system.cpu","bookmarks","history","cookies","alarms","topSites","fontSettings","power","tts","identity","webNavigation"],action:{default_title:"Hello Emulator",default_popup:"popup.html"},background:{service_worker:"background.js"}},ex=`<!doctype html>
1
+ (()=>{"use strict";(function(e){let t={},r=e=>e.replace(/^\.?\//,"").replace(/^\/+/,"").split("/").filter(Boolean).map(e=>encodeURIComponent(e)).join("/");if(null!==e.root)for(let n=0;n<e.paths.length;n+=1){let i=e.paths[n];void 0!==i&&(t[i]=e.root+r(i))}if(null!==e.aliasPrefix)for(let r=0;r<e.paths.length;r+=1){let n=e.paths[r];if(void 0===n||0!==n.indexOf(e.aliasPrefix))continue;let i=n.slice(e.aliasPrefix.length),o=t[n];!i||i in t||void 0===o||(t[i]=o)}for(let r in e.urls){let n=e.urls[r];Object.prototype.hasOwnProperty.call(e.urls,r)&&"string"==typeof n&&(t[r]=n)}return t}).toString(),JSON.stringify("The bridge tables asset did not run before the bridge: the document must load __extensiondev-bridge-tables.js ahead of the bridge script.");let e=Symbol.for("extensiondev.runtime.port-closed");JSON.stringify("The message port closed before a response was received.");let t="mock-find-match",r="mock-find-active",n=`::highlight(${t}){background-color:#ffff00;color:#000}::highlight(${r}){background-color:#ff9632;color:#000}`,i="Extension context invalidated.",o="__extensionInvalidateContext";JSON.stringify("guest-inject-v1"),JSON.stringify("__extensionGuestChannel"),JSON.stringify("__extensionGuestSlots"),JSON.stringify(t),JSON.stringify(r),JSON.stringify(n),JSON.stringify(500),JSON.stringify("__extensionGuestChannelToken"),JSON.stringify("__extensionGuestFrameUrl"),JSON.stringify("__extensionGuestFrameDepth"),JSON.stringify("__extensionGuestFrameParentOrigin"),JSON.stringify("__extensionGuestWorlds"),JSON.stringify("MAIN"),JSON.stringify("ISOLATED"),JSON.stringify(i),JSON.stringify(o),JSON.stringify("//# sourceURL="),JSON.stringify("data-extension-frame-url"),JSON.stringify("data-extension-frame-adopted");let s=Symbol.for("extension.dev/emulator/engine-tables");function a(){let e=globalThis,t=e[s];return t||(t={current:{state:"idle",tables:null},listeners:new Set,inflight:null},e[s]=t),t}function l(e){let t=a();for(let r of(t.current=e,Array.from(t.listeners)))r()}function d(){return a().current}function u(){let e=a().current;return"ready"===e.state?e.tables:null}function c(e,t){return`chrome.${e} did not run: emulated Chromium did not load its behaviour tables (${t}), so it answers no call. Reload the page to try again.`}function f(){let e=a().current;return"ready"===e.state?null:"refused"===e.state?e.reason:"loading"}function p(e){return c(e,f()??"loading")}function g(e){let t=f();return null===t?null:c(e,t)}function h(e){let t=e.discarded??!1;return{id:e.id,index:e.index,windowId:e.windowId,url:e.url,title:e.title,...void 0===e.favIconUrl?{}:{favIconUrl:e.favIconUrl},active:e.active,highlighted:e.highlighted??e.active,selected:e.active,pinned:e.pinned??!1,discarded:t,autoDiscardable:!0,frozen:!1,groupId:e.groupId??-1,splitViewId:e.splitViewId??-1,status:e.status??(t?"unloaded":"complete"),incognito:e.incognito??!1,audible:!1,mutedInfo:{muted:!1},width:e.width??1280,height:e.height??800,...void 0===e.lastAccessed?{}:{lastAccessed:e.lastAccessed}}}function m(e,t,r){return h({id:t.id,index:t.index??r,windowId:e.id,url:t.url,title:t.title,active:t.active??t.id===e.activeTabId,pinned:t.pinned,discarded:t.discarded,groupId:t.tabGroupId,splitViewId:t.splitViewId,highlighted:t.highlighted,status:t.status,incognito:t.incognito})}function b(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function w(e,t){let r="^",n=!1;for(let e of t){if(n){r+=b(e),n=!1;continue}if("\\"===e){n=!0;continue}if("*"===e){r+="[\\s\\S]*";continue}if("?"===e){r+="[\\s\\S]?";continue}r+=b(e)}return RegExp(`${r}$`,"u").test(e)}JSON.stringify(["getSelf","getPermissionWarningsByManifest","uninstallSelf","installReplacementWebApp"]),JSON.stringify("EXTENSION_USER_SCRIPTS_ALLOWED");let v=new Set(["http","https","file","ftp","ws","wss","filesystem","chrome","chrome-untrusted","chrome-extension","devtools","isolated-app"]),y={http:"80",https:"443",ws:"80",wss:"443",ftp:"21"};function x(e){let t={matchAllUrls:!1,scheme:"",matchSubdomains:!1,host:"",port:"*",path:""};if("<all_urls>"===e)return{...t,matchAllUrls:!0};let r=e.indexOf("://"),n=!0;if(-1===r&&(r=e.indexOf(":"),n=!1),-1===r)return null;let i=e.slice(0,r),o="*"===i||v.has(i);if(o!==n)return null;let s=r+(n?3:1);if(s>=e.length)return null;if(!o)return{...t,scheme:i,path:e.slice(s)};if("file"===i){let r=e.indexOf("/",s);return{...t,scheme:i,path:e.slice(-1===r?s-1:r)}}let a=e.indexOf("/",s);if(a===s||-1===a)return null;let l=function(e,t){let r=-1;if(t.startsWith("[")){let e=t.indexOf("]");if(-1===e||1===e)return null;if(e<t.length-1){if(":"!==t[e+1])return null;r=e+1}}else r=t.indexOf(":");if(-1===r)return{host:t,port:"*"};let n=t.slice(r+1);return"*"===n||void 0!==y[e]&&/^\d+$/.test(n)&&65536>Number(n)?{host:t.slice(0,r),port:n}:null}(i,e.slice(s,a));if(!l)return null;let d=l.host,u=!1;if(!d)return null;if("*"===d)u=!0,d="";else if(d.startsWith("*.")){if(2===d.length)return null;u=!0,d=d.slice(2)}return d.includes("*")?null:{matchAllUrls:!1,scheme:i,matchSubdomains:u,host:d.toLowerCase(),port:l.port,path:e.slice(a)}}function I(e){return e.endsWith(".")?e.slice(0,-1):e}let k=new Set(["0","1","2","3"]),S="Invalid downloadId",A="Can't modify the root bookmark folders.";function N(e){return`No tab with id: ${String(e)}.`}function O(e){return`No window with id: ${String(e)}.`}function C(e){return null!=e}function $(e,t){if(e.length>0){for(let r of Array.isArray(t)?t:[t])if(C(r)&&!function(e,t){for(let r of e)for(let e=0;e<r.tabs.length;e+=1){let n=r.tabs[e];if(n&&n.id===t)return{window:r,index:e}}}(e,r))return r}}function T(e,t){if(!(e.length>0))return!0;let r=String(t);return e.some(e=>void 0!==e.id&&String(e.id)===r)}function E(e){return k.has(String(e??""))}function R(e,t){return -2===t?e.find(e=>e.focused)??e[0]:e.find(e=>Number(e.id)===t)}function D(e,t){for(let r of e){let e=r.tabs.find(e=>Number(e.id)===t);if(e)return{window:r,tab:e}}}let _=new Set(["storage.setAccessLevel","storage.get","storage.set","storage.remove","storage.clear","tabs.create","tabs.update","tabs.remove","tabs.move","tabs.discard","tabs.goBack","tabs.goForward","tabs.getCurrent","tabs.reload","tabs.highlight","tabs.group","tabs.ungroup","tabGroups.query","tabGroups.get","tabGroups.update","tabGroups.move","tabs.get"]);async function P(e){let{data:t,windows:r,getStorage:n,setStorage:i,removeStorageKeys:o,clearStorage:s,onStorageChanged:a,onCreateTab:l,onUpdateTab:d,onHighlightTabs:u,onRemoveTab:c,onMoveTab:f,onDiscardTab:p,onGroupTabs:g,onUngroupTabs:h,onQueryTabGroups:b,onGetTabGroup:w,onUpdateTabGroup:v,onMoveTabGroup:y,onTabGoBack:x,onTabGoForward:I,onReloadTab:k,onGetCurrentTab:S,onGetWindow:A,source:O,onSetStorageAccessLevel:T,respond:E}=e;switch(t.api){case"storage.setAccessLevel":{let[e,r]=t.args,n=e?.accessLevel;if("TRUSTED_CONTEXTS"!==n&&"TRUSTED_AND_UNTRUSTED_CONTEXTS"!==n)return void E({error:"Invalid access level."});await T?.(t.extensionId,r??"session",n),E({result:void 0});return}case"storage.get":{let[e,r]=t.args,i=n(t.extensionId,r??"local");if(!e)return void E({result:i});if(Array.isArray(e)){let t={};e.forEach(e=>{e in i&&(t[e]=i[e])}),E({result:t});return}if("string"==typeof e)return void E({result:e in i?{[e]:i[e]}:{}});if("object"==typeof e){let t={};Object.keys(e).forEach(r=>{t[r]=r in i?i[r]:e[r]}),E({result:t});return}E({result:i});return}case"storage.set":{let[e,r]=t.args,o=r??"local";if(e&&"object"==typeof e){let r=n(t.extensionId,o),s={};for(let t of Object.keys(e)){let n=r[t],i=e[t];if(JSON.stringify(n)===JSON.stringify(i))continue;let o={newValue:i};t in r&&(o.oldValue=n),s[t]=o}await i(t.extensionId,e,o),a&&Object.keys(s).length>0&&a(t.extensionId,s,o)}E({result:!0});return}case"storage.remove":{let[e,r]=t.args,i=r??"local",s=(Array.isArray(e)?e:[e]).filter(Boolean).map(String),l=n(t.extensionId,i),d={};for(let e of s)e in l&&(d[e]={oldValue:l[e]});await o(t.extensionId,s,i),a&&Object.keys(d).length>0&&a(t.extensionId,d,i),E({result:!0});return}case"storage.clear":{let[e]=t.args,r=e??"local",i=n(t.extensionId,r),o={};for(let e of Object.keys(i))o[e]={oldValue:i[e]};await s(t.extensionId,r),a&&Object.keys(o).length>0&&a(t.extensionId,o,r),E({result:!0});return}case"tabs.create":{let[e]=t.args;E({result:await l(e?.url??"chrome://newtab",e)??!0});return}case"tabs.update":{let[e,n]=t.args;if(null!==e&&"object"==typeof e&&(n=e,e=void 0),C(e)&&void 0!==$(r,e))return void E({error:N(e),refused:!0});E({result:await d(e,n??{})??!0});return}case"tabs.remove":{let[e]=t.args,n=$(r,e);if(void 0!==n)return void E({error:N(n),refused:!0});await c(e),E({result:void 0});return}case"tabs.move":{let[e,r]=t.args;E({result:await f?.(t.extensionId,e,r??{})});return}case"tabs.discard":{let[e]=t.args,n=$(r,e);if(void 0!==n)return void E({error:N(n),refused:!0});E({result:await p?.(t.extensionId,e)});return}case"tabs.getCurrent":if("worker"===O)return void E({result:void 0});E({result:await S?.(t.extensionId,t.href)});return;case"tabs.reload":{let e,[n,i]=t.args;if(null==n){let t=R(r,-2);if(!t)return void E({error:"No current window"});let n=t.tabs.find(e=>Number(e.id)===Number(t.activeTabId));if(!n)return void E({error:"No selected tab"});e=Number(n.id)}else{if(!D(r,Number(n)))return void E({error:`No tab with id: ${n}.`});e=Number(n)}await k?.(t.extensionId,e,i?.bypassCache===!0),E({result:void 0});return}case"tabs.highlight":{let[e]=t.args,n=e?.windowId??-2,i=R(r,n);if(!i)return void E({error:`No window with id: ${n}.`});let o=e?.tabs,s=Array.isArray(o)?o:"number"==typeof o?[o]:[];if(0===s.length)return void E({error:"No highlighted tab"});for(let e of s)if(!Number.isInteger(e)||e<0||e>=i.tabs.length)return void E({error:`No tab at index: ${e}.`});let a=i.tabs[s[0]];a&&await d(a.id,{active:!0}),await u?.(Number(i.id),s.map(e=>Number(i.tabs[e]?.id))),E({result:await A(t.extensionId,i.id,{populate:!0})});return}case"tabs.goBack":{let[e]=t.args;await x?.(t.extensionId,e),E({result:void 0});return}case"tabs.goForward":{let[e]=t.args;await I?.(t.extensionId,e),E({result:void 0});return}case"tabs.group":{let[e]=t.args,n=$(r,e?.tabIds);if(void 0!==n)return void E({error:N(n),refused:!0});E({result:await g?.(t.extensionId,e??{})});return}case"tabs.ungroup":{let[e]=t.args,n=$(r,e);if(void 0!==n)return void E({error:N(n),refused:!0});await h?.(t.extensionId,e),E({result:void 0});return}case"tabGroups.query":{let[e]=t.args;E({result:await b?.(t.extensionId,e)??[]});return}case"tabGroups.get":{let[e]=t.args;E({result:await w?.(t.extensionId,e)});return}case"tabGroups.update":{let[e,r]=t.args;E({result:await v?.(t.extensionId,e,r??{})});return}case"tabGroups.move":{let[e,r]=t.args;E({result:await y?.(t.extensionId,e,r??{})});return}case"tabs.get":{let[e]=t.args;for(let t of r)for(let r=0;r<t.tabs.length;r+=1){let n=t.tabs[r];if(n&&n.id===e)return void E({result:m(t,n,r)})}E({error:`No tab with id: ${String(e)}.`})}}}let M=[0,0,0,0],U=e=>Math.max(0,Math.min(255,Math.round(e))),L={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"778899",lightslategrey:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"},j={transparent:[0,0,0,0]};function q(e){if(Array.isArray(e)){let[t,r,n,i]=e;return[U(Number(t)||0),U(Number(r)||0),U(Number(n)||0),U(void 0===i?255:Number(i)||0)]}if("string"!=typeof e)return M;let t=e.trim().toLowerCase();if(!t)return M;let r=j[t];if(r)return[...r];let n=L[t];if(n)return[parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16),255];let i=/^rgba?\(([^)]+)\)$/.exec(t);if(i?.[1]){let e=i[1].split(",").map(e=>Number(e.trim()));if(e.length>=3&&e.slice(0,3).every(e=>!Number.isNaN(e))){let t=e[3];return[U(e[0]),U(e[1]),U(e[2]),void 0===t||Number.isNaN(t)?255:U(255*t)]}return M}let o=/^#([0-9a-f]{3,8})$/.exec(t);if(o?.[1]){let e=o[1],t=e=>1===e.length?parseInt(e+e,16):parseInt(e,16);if(3===e.length||4===e.length)return[t(e[0]),t(e[1]),t(e[2]),4===e.length?t(e[3]):255];if(6===e.length||8===e.length)return[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16),8===e.length?parseInt(e.slice(6,8),16):255]}return M}function B(e){let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function G(e){return`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]/255})`}let F=Uint8Array.from([137,80,78,71,13,10,26,10]),W=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let e=0;e<8;e+=1)r=1&r?0xedb88320^r>>>1:r>>>1;e[t]=r>>>0}return e})();function J(e,t,r){e[t]=r>>>24&255,e[t+1]=r>>>16&255,e[t+2]=r>>>8&255,e[t+3]=255&r}function V(e,t){let r=new Uint8Array(12+t.length);J(r,0,t.length);for(let t=0;t<4;t+=1)r[4+t]=e.charCodeAt(t);return r.set(t,8),J(r,8+t.length,function(e){let t=0xffffffff;for(let r=0;r<e.length;r+=1)t=W[(t^e[r])&255]^t>>>8;return(0xffffffff^t)>>>0}(r.subarray(4,8+t.length))),r}let H=e=>!!e&&"object"==typeof e&&"number"==typeof e.width&&"number"==typeof e.height&&void 0!==e.data&&null!==e.data&&"number"==typeof e.data.length;function z(e,t,r,n){let i;return"function"!=typeof e&&(r({error:(i=n?` on the ${n} lane`:"",`No backend implements ${t}${i}, so the call did not run. This is a preview limitation, not an error in your extension: the API is on the bridge's wire protocol but nothing is wired behind it here.`),refused:!0}),!0)}let X=new Set(["tabs.query","action.openPopup","runtime.openOptionsPage","devtools.panels.create","action.setPopup","action.getBadgeText","action.getBadgeBackgroundColor","action.getTitle","action.setBadgeText","action.setBadgeBackgroundColor","action.setBadgeTextColor","action.getBadgeTextColor","action.setTitle","action.setIcon","action.enable","action.disable","action.isEnabled"]);async function K(e){let{data:t,windows:r,onOpenActionPopup:n,onOpenOptionsPage:i,onDevtoolsPanelCreate:o,onSetActionPopup:s,onGetActionState:a,onSetBadgeText:l,onSetBadgeBackground:d,onSetBadgeTextColor:u,onSetActionTitle:c,onSetActionIcon:f,onSetActionEnabled:p,onGetActionEnabled:g,respond:h}=e,b=e=>"number"==typeof e?e:void 0,v=e=>!(void 0===e||D(r,e))&&(h({error:`No tab with id: ${e}.`}),!0);switch(t.api){case"action.enable":case"action.disable":{if(z(p,t.api,h))return;let e=b(t.args[0]);if(v(e))return;await p?.(t.extensionId,"action.enable"===t.api,e),h({result:void 0});return}case"action.isEnabled":{if(z(g,t.api,h))return;let e=b(t.args[0]);if(v(e))return;h({result:await g?.(t.extensionId,e)??!0});return}case"tabs.query":{let[e]=t.args,n=e?.url,i=void 0===n?null:Array.isArray(n)?n:[n],o=i?function(e){for(let t of e)if(!("string"==typeof t&&x(t)))return`Invalid url pattern '${String(t)}'`;return null}(i):null;if(o)return void h({error:o});let s=i&&i.length>0?i:null,a=r.find(e=>e.focused)??r[0],l=r;e?.windowId!==void 0?l=-2===e.windowId?a?[a]:[]:r.filter(t=>t.id===e.windowId):e?.currentWindow===!0||e?.lastFocusedWindow===!0?l=a?[a]:[]:e?.currentWindow===!1&&(l=r.filter(e=>e!==a));let d=e?.title?e.title:null;h({result:l.flatMap(t=>t.tabs.map((e,r)=>m(t,e,r)).filter(t=>e?.active===void 0||t.active===e.active).filter(t=>e?.pinned===void 0||t.pinned===e.pinned).filter(t=>e?.status===void 0||t.status===e.status).filter(t=>e?.discarded===void 0||t.discarded===e.discarded).filter(t=>e?.groupId===void 0||(t.groupId??-1)===e.groupId).filter(t=>e?.splitViewId===void 0||t.splitViewId===e.splitViewId).filter(e=>!s||s.some(t=>(function(e,t){var r;let n,i;if(!e)return!1;let o=x(t);if(!o)return!1;try{n=new URL(e)}catch{return!1}if(o.matchAllUrls)return!0;let s=n.protocol.slice(0,-1).toLowerCase();if(!("*"===o.scheme?"http"===s||"https"===s:s===o.scheme)||!n.pathname||"file"!==o.scheme&&!function(e,t){let r=I(t.toLowerCase()),n=I(e.host);return r===n||!!e.matchSubdomains&&!n||!!e.matchSubdomains&&!(r.startsWith("[")||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(r))&&!(r.length<=n.length+1)&&!!r.endsWith(n)&&"."===r[r.length-n.length-1]}(o,n.hostname))return!1;let a=n.port||y[s]||"";return("*"===o.port||o.port===a)&&(r=`${n.pathname}${n.search}`,!!((i=o.path.replace(/\\/g,"\\\\").replace(/\?/g,"\\?")).length===r.length+2&&i.startsWith(r)&&i.endsWith("/*"))||w(r,i))})(e.url,t))).filter(e=>null===d||w(e.title??"",d)))});return}case"action.openPopup":if(z(n,t.api,h))return;n?.(t.extensionId),h({result:void 0});return;case"runtime.openOptionsPage":if(z(i,t.api,h))return;i?.(t.extensionId),h({result:void 0});return;case"devtools.panels.create":{if(z(o,t.api,h))return;let[e]=t.args;o?.(t.extensionId,e?.page??""),h({result:!0});return}case"action.setPopup":{if(z(s,t.api,h))return;let[e]=t.args;s?.(t.extensionId,e?.popup??""),h({result:void 0});return}case"action.getBadgeText":{let[e]=t.args,r=await a?.(t.extensionId,e?.tabId);h({result:r?.badgeText??""});return}case"action.getBadgeBackgroundColor":{let[e]=t.args,r=await a?.(t.extensionId,e?.tabId);h({result:r?.badgeColor===void 0||null===r.badgeColor?M:q(r.badgeColor)});return}case"action.getTitle":{let[e]=t.args,r=await a?.(t.extensionId,e?.tabId);h({result:r?.title??""});return}case"action.setBadgeText":{let[e]=t.args;await l(t.extensionId,e?.text,e?.tabId),h({result:!0});return}case"action.setBadgeTextColor":{if(z(u,t.api,h))return;let[e]=t.args,r=function(e){if(Array.isArray(e))return e.length<3||e.length>4||!e.every(e=>"number"==typeof e&&Number.isFinite(e))?null:q(e);if("string"!=typeof e)return null;let t=e.trim().toLowerCase();if(!t)return null;if(j[t]||L[t])return q(t);let r=/^rgba?\(([^)]+)\)$/.exec(t);if(r?.[1]){let e=r[1].split(",").map(e=>Number(e.trim()));return e.length<3||e.length>4||e.some(e=>Number.isNaN(e))?null:q(t)}return/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(t)?q(t):null}(e?.color);if(!r||0===r[3])return void h({error:"The color specification could not be parsed."});await u?.(t.extensionId,G(r),e?.tabId),h({result:void 0});return}case"action.getBadgeTextColor":{var k,S,A;let e,[r]=t.args,n=await a?.(t.extensionId,r?.tabId);h({result:n?.badgeTextColor===void 0||null===n.badgeTextColor?q(.2126*B((A=q((k=n?.badgeColor,S=void 0,0===(e=q(k))[3]?S?.dark?"rgb(138, 180, 248)":"rgb(26, 115, 232)":`rgb(${e[0]}, ${e[1]}, ${e[2]})`)))[0])+.7152*B(A[1])+.0722*B(A[2])<.211692036?"rgb(255, 255, 255)":"rgb(32, 33, 36)"):q(n.badgeTextColor)});return}case"action.setBadgeBackgroundColor":{let[e]=t.args;await d(t.extensionId,e?.color===void 0?void 0:G(q(e.color)),e?.tabId),h({result:!0});return}case"action.setTitle":{let[e]=t.args;await c(t.extensionId,e?.title,e?.tabId),h({result:!0});return}case"action.setIcon":{let[e]=t.args,r="string"==typeof e?.path?e.path:"object"==typeof e?.path?Object.values(e.path)[0]:void 0,n=e?.imageData!==void 0?function(e,t=Math.floor(16*("number"==typeof globalThis.devicePixelRatio&&globalThis.devicePixelRatio>0?globalThis.devicePixelRatio:1))){var r,n,i;if(!e||"object"!=typeof e)return;let o=(H(e)?[[e.width,e]]:Object.entries(e).filter(e=>H(e[1])).map(([e,t])=>[Number(e),t]).filter(([e])=>Number.isFinite(e)&&e>0)).filter(([,e])=>e.data.length===e.width*e.height*4);if(0===o.length)return;let s=o.filter(([e])=>e>=t).sort((e,t)=>e[0]-t[0])[0],a=o.filter(([e])=>e<t).sort((e,t)=>t[0]-e[0])[0],l=(s??a)[1];return r=l.width,n=l.height,i=l.data,`data:image/png;base64,${function(e){if("function"==typeof btoa){let t="";for(let r=0;r<e.length;r+=8192)t+=String.fromCharCode(...e.subarray(r,r+8192));return btoa(t)}return Buffer.from(e).toString("base64")}(function(e,t,r){if(!Number.isInteger(e)||!Number.isInteger(t)||e<=0||t<=0)throw Error("ImageData has invalid dimensions.");if(r.length!==e*t*4)throw Error("ImageData data length does not match dimensions.");let n=4*e,i=new Uint8Array((n+1)*t);for(let e=0;e<t;e+=1){let t=e*(n+1);i[t]=0;for(let o=0;o<n;o+=1)i[t+1+o]=255&r[e*n+o]}let o=new Uint8Array(13);J(o,0,e),J(o,4,t),o[8]=8,o[9]=6,o[10]=0,o[11]=0,o[12]=0;let s=[F,V("IHDR",o),V("IDAT",function(e){let t=Math.max(1,Math.ceil(e.length/65535)),r=new Uint8Array(2+e.length+5*t+4);r[0]=120,r[1]=1;let n=2;for(let i=0;i<t;i+=1){let o=65535*i,s=e.subarray(o,Math.min(e.length,o+65535));r[n]=+(i===t-1),r[n+1]=255&s.length,r[n+2]=s.length>>>8&255,r[n+3]=255&~s.length,r[n+4]=~s.length>>>8&255,r.set(s,n+5),n+=5+s.length}return J(r,n,function(e){let t=1,r=0;for(let n=0;n<e.length;n+=1)r=(r+(t=(t+e[n])%65521))%65521;return(r<<16|t)>>>0}(e)),r}(i)),V("IEND",new Uint8Array(0))],a=new Uint8Array(s.reduce((e,t)=>e+t.length,0)),l=0;for(let e of s)a.set(e,l),l+=e.length;return a}(r,n,i))}`}(e.imageData):void 0;await f(t.extensionId,n??r),h({result:!0})}}}function Y(e){let t=e?.priority;return"number"==typeof t&&t<0?"Low-priority notifications are deprecated on this platform.":null}let Q="Unable to download all specified images.",Z=/^(\*|https?|file|ftp|wss?):\/\/(\*|\*\.[^/*]+|[^/*]+)(\/.*)?$/i;function ee(e,t){let r=Array.isArray(e?.buttons)?e.buttons:[];for(let n of[e?.iconUrl,e?.imageUrl,...r.map(e=>e?.iconUrl)]){let e;if("string"==typeof n&&n){try{e=new URL(n,"chrome-extension://notification/")}catch{return Q}if(!/^(data|blob|chrome-extension):$/.test(e.protocol)&&!t.some(t=>(function(e,t){if("<all_urls>"===e)return/^(https?|file|ftp|wss?):$/.test(t.protocol);let r=Z.exec(e.trim());if(!r)return!1;let n=r[1]??"*",i=r[2]??"*",o=r[3]??"/*",s=t.protocol.replace(/:$/,"");if("*"===n?!/^https?$/.test(s):n.toLowerCase()!==s)return!1;let a=t.hostname.toLowerCase();if("*"!==i){let e=i.toLowerCase();if(e.startsWith("*.")){let t=e.slice(2);if(a!==t&&!a.endsWith(`.${t}`))return!1}else if(a!==e)return!1}return RegExp(`^${o.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")}$`).test(`${t.pathname}${t.search}`)})(t,e)))return Q}}return null}function et(e,t=e?.type){let r=e?.progress;if(null==r)return null;if(void 0!==t&&"progress"!==t)return"The progress value should not be specified for non-progress notification";let n=Number(r);return!Number.isFinite(n)||n<0||n>100?"The progress value should range from 0 to 100":null}let er=new Set(["contextMenus.create","contextMenus.update","contextMenus.remove","contextMenus.removeAll","notifications.create","notifications.clear","notifications.update","notifications.getAll","downloads.search","downloads.cancel","downloads.pause","downloads.resume","downloads.erase","downloads.download","downloads.acceptDanger","downloads.setUiOptions","downloads.removeFile","downloads.open","downloads.show","downloads.showDefaultFolder"]),en="Download must be complete",ei="Download file already deleted";function eo(e){let t=e??{},r=[];for(let e of[t.host_permissions,t.permissions])if(Array.isArray(e))for(let t of e)"string"==typeof t&&("<all_urls>"===t||t.includes("://"))&&r.push(t);return r}async function es(e){let{data:t,source:r,getDeclaredPermissions:n,getGuestManifest:i,onGetDownloadState:o,onRemoveDownloadFile:s,onCreateContextMenu:a,onUpdateContextMenu:l,onRemoveContextMenu:d,onClearContextMenus:u,onCreateNotification:c,onClearNotification:f,onUpdateNotification:p,onGetNotifications:g,onDownload:h,onSearchDownloads:m,onCancelDownload:b,onPauseDownload:w,onResumeDownload:v,onEraseDownloads:y,onAcceptDangerDownload:x,onSetDownloadsUi:I,respond:k}=e;switch(t.api){case"contextMenus.create":{let[e]=t.args;k({result:await a(t.extensionId,e??{})});return}case"contextMenus.update":{let[e,r]=t.args;k({result:await l(t.extensionId,String(e??""),r??{})});return}case"contextMenus.remove":{let[e]=t.args;k({result:await d(t.extensionId,String(e??""))});return}case"contextMenus.removeAll":return void k({result:await u(t.extensionId)});case"notifications.create":{let[e,r]=t.args,n="string"==typeof e?e:void 0,o="string"==typeof e?r:e,s=Y(o);if(s)return void k({error:s});let a=ee(o,eo(i?.(t.extensionId)));if(a)return void k({error:a});let l=et(o);if(l)return void k({error:l});let d="string"!=typeof n?null:n.length>500?"The notification's ID should be 500 characters or less":null;if(d)return void k({error:d});k({result:await c(t.extensionId,n,o??{})});return}case"notifications.clear":{let[e]=t.args;k({result:await f(t.extensionId,String(e??""))});return}case"notifications.update":{let[e,r]=t.args,n=Y(r);if(n)return void k({error:n});let o=ee(r,eo(i?.(t.extensionId)));if(o)return void k({error:o});let s=et(r);if(s)return void k({error:s});k({result:await p?.(t.extensionId,String(e??""),r??{})??!1});return}case"notifications.getAll":return void k({result:await g(t.extensionId)});case"downloads.search":{let[e]=t.args;k({result:await m?.(t.extensionId,e)??[]});return}case"downloads.cancel":{if(z(b,t.api,k))return;let[e]=t.args;if(await b?.(t.extensionId,e)===!1)return void k({error:S,refused:!0});k({result:void 0});return}case"downloads.pause":{if(z(w,t.api,k))return;let[e]=t.args,r=await w?.(t.extensionId,e);if(!1===r)return void k({error:S,refused:!0});if("string"==typeof r)return void k({error:r,refused:!0});k({result:void 0});return}case"downloads.resume":{if(z(v,t.api,k))return;let[e]=t.args,r=await v?.(t.extensionId,e);if(!1===r)return void k({error:S,refused:!0});if("string"==typeof r)return void k({error:r,refused:!0});k({result:void 0});return}case"downloads.erase":{if(z(y,t.api,k))return;let[e]=t.args;k({result:await y?.(t.extensionId,e)??[]});return}case"downloads.acceptDanger":{if(z(x,t.api,k))return;let[e]=t.args;if(await x?.(t.extensionId,e)===!1)return void k({error:S,refused:!0});k({result:void 0});return}case"downloads.removeFile":{if(z(o,t.api,k))return;let[e]=t.args,r=await o?.(t.extensionId,e);if(!r)return void k({error:S});if("complete"!==r.state)return void k({error:en});if(r.fileRemoved)return void k({error:ei});if(!0!==await s?.(t.extensionId,e))return void k({error:"Unable to remove file"});k({result:void 0});return}case"downloads.open":{if(z(o,t.api,k))return;let[e]=t.args,i=await o?.(t.extensionId,e);if(!i)return void k({error:S});if("worker"===r)return void k({error:"User gesture required"});if("complete"!==i.state)return void k({error:en});if(i.fileRemoved)return void k({error:ei});let s=n?.(t.extensionId);if(s&&!s.has("downloads.open"))return void k({error:'The "downloads.open" permission is required'});k({result:void 0});return}case"downloads.show":{if(z(o,t.api,k))return;let[e]=t.args;if(!await o?.(t.extensionId,e))return void k({error:S});k({result:void 0});return}case"downloads.showDefaultFolder":return void k({result:void 0});case"downloads.setUiOptions":{if(z(I,t.api,k))return;let[e]=t.args;await I?.(t.extensionId,e?.enabled!==!1),k({result:void 0});return}case"downloads.download":{let[e]=t.args;k({result:await h(t.extensionId,e??{})})}}}let ea={"bookmarks-bar":"bookmarks-bar","other-bookmarks":"other","mobile-bookmarks":"mobile"};function el(e,t={}){let r=void 0===e.url,n=e.parentId??t.parentId,i=ea[e.id];return{id:e.id,title:e.title??"",syncing:!1,...void 0===e.url?{}:{url:e.url},...void 0===e.index?{}:{index:e.index},...void 0===n?{}:{parentId:n},...void 0===e.dateAdded?{}:{dateAdded:e.dateAdded},...r&&void 0!==e.dateGroupModified?{dateGroupModified:e.dateGroupModified}:{},...i?{folderType:i}:{},...e.children?{children:e.children.map(t=>el(t,{parentId:e.id}))}:{}}}function ed(e){return(e??[]).map(e=>el(e))}function eu(e,t={}){let r={id:e.id,focused:e.focused??!1,incognito:e.incognito??!1,alwaysOnTop:e.alwaysOnTop??!1,state:e.state??"normal",type:e.type??"normal",top:e.top??0,left:e.left??0,width:e.width??1280,height:e.height??800};return t.populate?{...r,tabs:(e.tabs??[]).map((t,r)=>h({id:t.id,index:t.index??r,windowId:e.id,url:t.url,title:t.title,active:t.active??t.id===e.activeTabId,pinned:t.pinned,discarded:t.discarded,groupId:t.tabGroupId,status:t.status,incognito:t.incognito}))}:r}let ec=new Set(["bookmarks.getTree","bookmarks.get","bookmarks.getChildren","bookmarks.search","bookmarks.create","bookmarks.update","bookmarks.remove","bookmarks.removeTree","bookmarks.move","history.search","history.getVisits","history.addUrl","history.deleteUrl","history.deleteRange","history.deleteAll","windows.get","windows.getAll","windows.getCurrent","windows.create","windows.update","windows.remove"]);async function ef(e){let{data:t,windows:r,onGetWindow:n,onGetAllWindows:i,onCreateWindow:o,onUpdateWindow:s,onRemoveWindow:a,onGetBookmarkTree:l,onGetBookmarks:d,onGetBookmarkChildren:u,onSearchBookmarks:c,onCreateBookmark:f,onUpdateBookmark:p,onRemoveBookmark:g,onMoveBookmark:h,onSearchHistory:m,onGetHistoryVisits:b,onAddHistoryUrl:w,onDeleteHistoryUrl:v,onDeleteHistoryRange:y,onDeleteAllHistory:x,respond:I}=e;switch(t.api){case"bookmarks.getTree":return void I({result:function(e){if(function(e){if(!e||1!==e.length)return!1;let[t]=e;return void 0!==t&&"0"===t.id&&void 0===t.url&&void 0===t.parentId}(e))return ed(e);let t=e??[],r=t.map(e=>e.dateAdded).filter(e=>void 0!==e).sort((e,t)=>e-t)[0];return[el({id:"0",title:"",children:t,...void 0===r?{}:{dateAdded:r}})]}(await l(t.extensionId))});case"bookmarks.get":{let[e]=t.args,r=(Array.isArray(e)?e:[e]).filter(e=>null!=e).map(String),n=ed(await d(t.extensionId,r));if(r.filter(e=>!E(e)&&!n.some(t=>t.id===e)).length>0)return void I({error:"Can't find bookmark for id."});I({result:n});return}case"bookmarks.getChildren":{let[e]=t.args;I({result:ed(await u(t.extensionId,null==e?void 0:String(e)))});return}case"bookmarks.search":{let[e]=t.args;I({result:ed(await c(t.extensionId,e))});return}case"bookmarks.create":{let[e]=t.args,r=await f(t.extensionId,e??{});I({result:r?el(r):null});return}case"bookmarks.update":{let[e,r]=t.args;if(E(e))return void I({error:A,refused:!0});let n=await p(t.extensionId,String(e??""),r??{});I({result:n?el(n):null});return}case"bookmarks.remove":{let[e]=t.args;if(E(e))return void I({error:A,refused:!0});I({result:await g(t.extensionId,String(e??""),!1)});return}case"bookmarks.removeTree":{let[e]=t.args;if(E(e))return void I({error:A,refused:!0});I({result:await g(t.extensionId,String(e??""),!0)});return}case"bookmarks.move":{let[e,r]=t.args;if(E(e))return void I({error:A,refused:!0});I({result:await h?.(t.extensionId,String(e??""),r??{})});return}case"history.search":{let[e]=t.args;I({result:await m(t.extensionId,e??{})});return}case"history.getVisits":{let[e]=t.args;I({result:await b(t.extensionId,e??{})});return}case"history.addUrl":{let[e]=t.args;await w(t.extensionId,e??{}),I({result:!0});return}case"history.deleteUrl":{let[e]=t.args;await v(t.extensionId,e??{}),I({result:!0});return}case"history.deleteRange":{let[e]=t.args;await y(t.extensionId,e??{}),I({result:!0});return}case"history.deleteAll":await x(t.extensionId),I({result:!0});return;case"windows.get":{let[e,i]=t.args;if(C(e)&&!T(r,e))return void I({error:O(e),refused:!0});let o=await n(t.extensionId,null==e?void 0:String(e),i);I({result:o?eu(o,{populate:i?.populate}):null});return}case"windows.getAll":{let[e]=t.args;I({result:function(e,t={}){return e.map(e=>eu(e,t))}(await i(t.extensionId,e),{populate:e?.populate})});return}case"windows.getCurrent":{let[e]=t.args,n=r.find(e=>e.focused)??r[0];I({result:n?eu(n,{populate:e?.populate}):null});return}case"windows.create":{let[e]=t.args,r=await o(t.extensionId,e?.url);I({result:r?eu(r,{populate:!0}):null});return}case"windows.update":{let[e,n]=t.args;if(C(e)&&!T(r,e))return void I({error:O(e),refused:!0});let i=await s(t.extensionId,null==e?void 0:String(e),n??{});I({result:i?eu(i):null});return}case"windows.remove":{let[e]=t.args;if(C(e)&&!T(r,e))return void I({error:O(e),refused:!0});I({result:await a(t.extensionId,null==e?void 0:String(e))})}}}let ep=new Set(["runtime.sendMessage","tabs.sendMessage","runtime.getContexts","runtime.workerFetch","permissions.contains","permissions.request","permissions.remove","permissions.getAll","permissions.addHostAccessRequest","permissions.removeHostAccessRequest","offscreen.createDocument","offscreen.closeDocument","offscreen.hasDocument","cookies.get","cookies.getAll","cookies.set","cookies.remove","scripting.executeScript","scripting.insertCSS","management.setEnabled"]);async function eg(t){let{data:r,onSetExtensionEnabled:n,onRuntimeMessage:i,onTabMessage:o,onGetRuntimeContexts:s,onWorkerFetch:a,onContainsPermissions:l,onRequestPermissions:d,onRemovePermissions:u,onGetAllPermissions:c,onAddHostAccessRequest:f,onRemoveHostAccessRequest:p,onCreateOffscreenDocument:g,onCloseOffscreenDocument:h,onHasOffscreenDocument:m,onGetCookie:b,onGetAllCookies:w,onSetCookie:v,onRemoveCookie:y,onExecuteScript:x,onInsertCss:I,respond:k,source:S}=t;switch(r.api){case"runtime.sendMessage":{let[t]=r.args,n=await i(r.extensionId,t,S);if(n===e)return void k({result:void 0,portClosed:!0});k({result:n});return}case"tabs.sendMessage":{let[t,n]=r.args;if(!o)return void k({error:"Could not establish connection. Receiving end does not exist."});let i=await o(r.extensionId,t,n);if(i===e)return void k({result:void 0,portClosed:!0});k({result:i});return}case"runtime.getContexts":return void k({result:await s(r.extensionId)});case"runtime.workerFetch":{let[e]=r.args;k({result:(a&&e?await a(r.extensionId,e):null)??null});return}case"permissions.contains":{let[e]=r.args;k({result:await l(r.extensionId,e??{})});return}case"permissions.request":{let[e]=r.args;k({result:await d(r.extensionId,e??{})});return}case"permissions.remove":{let[e]=r.args;k({result:await u(r.extensionId,e??{})});return}case"permissions.getAll":return void k({result:await c(r.extensionId)});case"permissions.addHostAccessRequest":case"permissions.removeHostAccessRequest":{let e="permissions.addHostAccessRequest"===r.api?f:p;if(!e)return void k({error:`Unhandled api ${r.api}`});let[t]=r.args,n=await e(r.extensionId,t??{});if(void 0!==n.error)return void k({error:n.error});k({result:void 0});return}case"offscreen.createDocument":{let[e]=r.args,t=function(e){let{extensionId:t,details:r,hasDocument:n}=e,i=`chrome-extension://${t}`,o="string"==typeof r.url?r.url:"",s=null;try{s=new URL(o)}catch{try{s=new URL(o,`${i}/`)}catch{s=null}}return s&&`${s.protocol}//${s.host}`===i?n?"Only a single offscreen document may be created.":0===new Set(Array.isArray(r.reasons)?r.reasons:[]).size?"A `reason` must be provided.":null:"Invalid URL."}({extensionId:r.extensionId,details:e??{},hasDocument:await m(r.extensionId)});if(t)return void k({error:t,refused:!0});if(!1===await g(r.extensionId,e??{}))return void k({error:eh,refused:!0});k({result:void 0});return}case"offscreen.closeDocument":{if(!await m(r.extensionId))return void k({error:"No current offscreen document.",refused:!0});let e=await h(r.extensionId);k({result:"boolean"!=typeof e||e});return}case"management.setEnabled":{if(z(n,r.api,k))return;let[e,t]=r.args;if(!await n?.(r.extensionId,String(e),!0===t))return void k({error:`Failed to find extension with id ${String(e)}.`});k({result:void 0});return}case"offscreen.hasDocument":return void k({result:await m(r.extensionId)});case"cookies.get":{let[e]=r.args;k({result:await b(r.extensionId,e??{})});return}case"cookies.getAll":{let[e]=r.args;k({result:await w(r.extensionId,e??{})});return}case"cookies.set":{let[e]=r.args;k({result:await v(r.extensionId,e??{})});return}case"cookies.remove":{let[e]=r.args;k({result:await y(r.extensionId,e??{})});return}case"scripting.executeScript":{let[e]=r.args;k({result:await x(r.extensionId,e??{})});return}case"scripting.insertCSS":{let[e]=r.args;await I(r.extensionId,e??{}),k({result:!0})}}}let eh="Page failed to load.",em="__extensiondevSidePanelState";function eb(){let e=globalThis,t=e[em];if(t)return t;let r={behavior:new Map,panels:new Map,globalActive:null,contextualActive:new Map,listeners:new Set,version:0};return e[em]=r,r}function ew(){let e=eb();for(let t of(e.version+=1,e.listeners))t()}function ev(e){let t={};return e&&(t.path=e,t.enabled=!0),t}function ey(e,t,r){let n=eb().panels.get(e);if(!n)return ev(t);let i=r??-1;if(-1!==i){let e=n.get(i);if(e)return{...e}}let o=n.get(-1);return o?{...o}:ev(t)}function ex(e,t){let r=eb().panels.get(e)?.get(t);return!!r?.path&&r?.enabled===!0}function eI(e,t){let r=eb();void 0!==t&&r.contextualActive.delete(t),r.globalActive=e,ew()}let ek=new Set(["sidePanel.open","sidePanel.close","sidePanel.setOptions","sidePanel.getOptions","sidePanel.getPanelBehavior","sidePanel.setPanelBehavior"]),eS="At least one of `tabId` and `windowId` must be provided",eA="The specified tab does not belong to the specified window.";function eN(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function eO(e){let[t]=e;return{tabId:eN(t?.tabId),windowId:eN(t?.windowId)}}async function eC(e){var t,r,n,i;let{data:o,windows:s,respond:a,onOpenSidePanel:l,onCloseSidePanel:d,getGuestManifest:u}=e,c=o.extensionId,f=(t=u?.(c)??void 0,t?.side_panel?.default_path??t?.sidebar_action?.default_panel);switch(o.api){case"sidePanel.setPanelBehavior":{let[e]=o.args;"boolean"==typeof e?.openPanelOnActionClick&&(r=e.openPanelOnActionClick,eb().behavior.set(c,r),ew()),a({result:void 0});return}case"sidePanel.getPanelBehavior":return void a({result:{openPanelOnActionClick:!0===eb().behavior.get(c)}});case"sidePanel.setOptions":{let[e]=o.args;!function(e,t,r){let n=eb(),i=r.tabId??-1,o=n.panels.get(e)??new Map;n.panels.set(e,o);let s=e=>{void 0!==r.path&&(e.path=r.path),void 0!==r.enabled&&(e.enabled=r.enabled)},a=o.get(i);if(a)s(a);else if(-1===i){let e=ev(t);s(e),void 0===e.enabled&&(e.enabled=!0),o.set(i,e)}else{let e={tabId:i};void 0!==r.path&&(e.path=r.path),e.enabled=r.enabled??!0,o.set(i,e)}ew()}(c,f,{tabId:eN(e?.tabId),path:e?.path,enabled:e?.enabled}),a({result:void 0});return}case"sidePanel.getOptions":{let[e]=o.args;a({result:ey(c,f,eN(e?.tabId))});return}case"sidePanel.open":{let e=eO(o.args);if(void 0===e.tabId&&void 0===e.windowId)return void a({error:eS});if(void 0!==e.windowId){let t=R(s,e.windowId);if(!t)return void a({error:`No window with id: ${e.windowId}.`});e.windowId=Number(t.id)}let t=!1;if(void 0!==e.tabId){let r=D(s,e.tabId);if(!r)return void a({error:`No tab with id: ${e.tabId}.`});if(void 0!==e.windowId&&Number(r.window.id)!==e.windowId)return void a({error:eA});let i=ey(c,f,e.tabId);if(!i.path||!0!==i.enabled)return void a({error:`No active side panel for tabId: ${e.tabId}`});(t=ex(c,e.tabId))?(n=e.tabId,eb().contextualActive.set(n,c),ew()):eI(c,e.tabId)}else{let t=ey(c,f);if(!t.path||!0!==t.enabled)return void a({error:`No active side panel for windowId: ${e.windowId}`});eI(c)}await l(c,{...e,contextual:t}),a({result:void 0});return}case"sidePanel.close":{let e=eO(o.args);if(void 0===e.tabId&&void 0===e.windowId)return void a({error:eS});if(void 0!==e.tabId){let t,r=D(s,e.tabId);if(!r)return void a({error:`No tab with id: ${e.tabId}.`});if(void 0!==e.windowId&&Number(r.window.id)!==e.windowId)return void a({error:eA});if(!ex(c,e.tabId))return void a({error:`No active tab-specific side panel for tabId: ${e.tabId}`});i=e.tabId,(t=eb()).contextualActive.get(i)===c&&(t.contextualActive.delete(i),ew())}else{let t;if(!R(s,e.windowId))return void a({error:`No window with id: ${e.windowId}.`});let r=ey(c,f);if(!r.path||!0!==r.enabled)return void a({error:`No active side panel for windowId: ${e.windowId}`});(t=eb()).globalActive===c&&(t.globalActive=null,ew())}await d?.(c,e),a({result:void 0});return}default:a({error:`Unhandled side panel api ${o.api}`})}}let e$="Invalid XML",eT=new Set(["match","dim","url"]),eE="__extensiondevOmniboxState";function eR(){let e=globalThis,t=e[eE];if(t)return t;let r={byExtension:new Map,listeners:new Set,version:0};return e[eE]=r,r}function eD(){let e=eR();for(let t of(e.version+=1,e.listeners))t()}function e_(e){let t=eR(),r=t.byExtension.get(e);if(r)return r;let n={defaultSuggestion:null,requestId:null,suggestions:[]};return t.byExtension.set(e,n),n}function eP(e){let t,r=String(e??""),n="",i=[],o=[],s=/<\/?([A-Za-z][A-Za-z0-9-]*)\s*\/?>|[^<]+|</g;for(;null!==(t=s.exec(r));){let e=t[0];if("<"===e)return{error:e$};if(!e.startsWith("<")){n+=e.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&apos;/g,"'").replace(/&amp;/g,"&");continue}let r=(t[1]??"").toLowerCase();if(e.startsWith("</")){let e=o.pop();if(!e||e.tag!==r)return{error:e$};if(null!==e.styleIndex){let t=i[e.styleIndex];t.length=n.length-t.offset}continue}if(e.endsWith("/>"))continue;let s=null;eT.has(r)&&(s=i.length,i.push({type:r,offset:n.length,length:0})),o.push({tag:r,styleIndex:s})}return o.length>0?{error:e$}:{description:n.replace(/^\s+/,""),styles:i}}let eM=new Set(["omnibox.setDefaultSuggestion","omnibox.sendSuggestions"]);async function eU(e){let{data:t,respond:r}=e;switch(t.api){case"omnibox.setDefaultSuggestion":{let[e]=t.args,n=function(e,t){if(t.descriptionStyles)return e_(e).defaultSuggestion={description:t.description,descriptionStyles:[...t.descriptionStyles]},eD(),null;let r=eP(t.description);return"error"in r?r.error:(e_(e).defaultSuggestion={description:r.description,descriptionStyles:r.styles},eD(),null)}(t.extensionId,{description:String(e?.description??""),descriptionStyles:e?.descriptionStyles});if(n)return void r({error:n});r({result:void 0});return}case"omnibox.sendSuggestions":{let[e,n]=t.args,i=function(e,t,r){let n=[];for(let e of r){if(e.descriptionStyles){n.push({...e,descriptionStyles:[...e.descriptionStyles]});continue}let t=eP(e.description);if("error"in t)return t.error;n.push({...e,description:t.description,descriptionStyles:t.styles})}if(n.length!==r.length)return"Invalid input.";let i=e_(e);return i.requestId=t,i.suggestions=n,eD(),null}(t.extensionId,Number(e),Array.isArray(n)?n:[]);if(i)return void r({error:i});r({result:void 0});return}default:r({error:`Unhandled omnibox api ${t.api}`})}}let eL="Host can not be empty.",ej="Invalid host.",eq=["chrome","chrome-extension","data","file","filesystem","ftp","http","https","uuid-in-package","ws","wss"],eB=["*","chrome","chrome-extension","file","filesystem","ftp","http","https","ws","wss"],eG={ftp:"21",http:"80",https:"443",ws:"80",wss:"443"},eF=["file","ftp","http","https","uuid-in-package"];function eW(e,t=eF){if("<all_urls>"===e)return{ok:!0,pattern:{scheme:"*",host:"",port:"*",path:"/*",matchSubdomains:!0,matchAllUrls:!0}};let r=e.indexOf("://"),n=!0;if(r<0&&(r=e.indexOf(":"),n=!1),r<0)return{ok:!1,error:"Missing scheme separator."};let i=e.slice(0,r);if("*"!==i&&(!eq.includes(i)||!t.includes(i)))return{ok:!1,error:"Invalid scheme."};let o=eB.includes(i);if(o!==n)return{ok:!1,error:"Wrong scheme type."};let s=r+(o?3:1);if(s>=e.length)return{ok:!1,error:eL};let a="",l="*",d=!1,u=s;if(o)if("file"===i){let t=e.indexOf("/",s);u=t<0?s-1:t}else{let t=e.indexOf("/",s);if(t===s)return{ok:!1,error:eL};if(t<0)return{ok:!1,error:"Empty path."};let r=e.slice(s,t),n=-1;if("["!==r[0])n=r.indexOf(":");else{let e=r.indexOf("]");if(e<0)return{ok:!1,error:ej};if(1===e)return{ok:!1,error:eL};if(e<r.length-1){if(":"!==r[e+1])return{ok:!1,error:ej};n=e+1}}if(n>=0){var c;if(l=r.slice(n+1),!("*"===(c=l)||void 0!==eG[i]&&/^\d+$/.test(c)&&65535>=Number(c)))return{ok:!1,error:"Invalid port."}}let o=n>=0?r.slice(0,n):r;if(""===o)return{ok:!1,error:eL};if("*"===o)d=!0,o="";else if(o.startsWith("*.")){if(2===o.length)return{ok:!1,error:eL};d=!0,o=o.slice(2)}a=o,u=t}else u=s;let f=e.slice(u);return a.includes("*")?{ok:!1,error:"Invalid host wildcard."}:/[\s\0]/.test(a)?{ok:!1,error:ej}:{ok:!0,pattern:{scheme:i,host:a,port:l,path:f,matchSubdomains:d,matchAllUrls:!1}}}let eJ=e=>`Duplicate script ID '${e}'`,eV=e=>`Script with ID '${e}' must specify 'matches'.`,eH=e=>`Nonexistent script ID '${e}'`,ez=e=>`Script with ID '${e}' does not exist or is not fully registered`,eX=(e,t,r)=>`Script with ID '${e}' has invalid value for matches[${t}]: ${r}`,eK=(e,t,r)=>`Script with ID '${e}' has invalid value for exclude_matches[${t}]: ${r}`,eY=(e,t)=>`Could not load ${e} '${t}' for script.`,eQ="__extensiondevRegisteredScriptsState";function eZ(){let e=globalThis,t=e[eQ];if(t)return t;let r={byExtension:new Map,listeners:new Set,version:0};return e[eQ]=r,r}function e0(){let e=eZ();for(let t of(e.version+=1,e.listeners))t()}function e1(e){let t=eZ(),r=t.byExtension.get(e);if(r)return r;let n=new Map;return t.byExtension.set(e,n),n}function e2(e){if("string"!=typeof e||""===e)return"Script's ID must not be empty";if(e.startsWith("_"))return`Script's ID '${e}' must not start with '_'`;return null}function e8(e){return e.startsWith("/")?e.slice(1):e}function e5(e){return{...e,...e.js?{js:e.js.map(e8)}:{},...e.css?{css:e.css.map(e8)}:{}}}function e3(e){return{id:e.id,...e.matches?{matches:[...e.matches]}:{},...e.excludeMatches?{excludeMatches:[...e.excludeMatches]}:{},...e.js?{js:[...e.js]}:{},...e.css?{css:[...e.css]}:{},allFrames:e.allFrames??!1,matchOriginAsFallback:e.matchOriginAsFallback??!1,runAt:e.runAt??"document_idle",world:e.world??"ISOLATED",persistAcrossSessions:e.persistAcrossSessions??!0}}function e6(e){if(!e.js?.length&&!e.css?.length){let t;return t=e.id,`Script with ID '${t}' must specify at least one js or css file.`}let t=e.matches??[];if(0===t.length){let t;return t=e.id,`Script with ID '${t}' must specify at least one match.`}let r=[];for(let n=0;n<t.length;n+=1){let i=eW(t[n]);if(!i.ok)return eX(e.id,n,i.error);r.push(i.pattern.path)}let n=e.excludeMatches??[];for(let t=0;t<n.length;t+=1){let r=eW(n[t]);if(!r.ok)return eK(e.id,t,r.error)}return e.matchOriginAsFallback&&r.some(e=>"/*"!==e)?"The path component for scripts with 'match_origin_as_fallback' must be '*'.":null}function e4(e,t){if(!t)return null;for(let r of e){for(let e of r.js??[])if(!1===t(e))return eY("javascript",e);for(let e of r.css??[])if(!1===t(e))return eY("css",e)}return null}let e9=new Set(["scripting.registerContentScripts","scripting.getRegisteredContentScripts","scripting.unregisterContentScripts","scripting.updateContentScripts","scripting.removeCSS"]);async function e7(e){let{data:t,respond:r,hasExtensionFile:n,onRemoveCss:i}=e,o=t.extensionId,s=n?e=>n(o,e):void 0,a=e=>{e?r({error:e}):r({result:void 0})};switch(t.api){case"scripting.registerContentScripts":{let[e]=t.args;a(function(e,t,r){let n=e1(e),i=new Set;for(let e of t){let t=e2(e?.id);if(t)return t;if(n.has(e.id)||i.has(e.id))return eJ(e.id);i.add(e.id)}let o=[];for(let e of t){if(!Array.isArray(e.matches))return eV(e.id);let t=e5(e),r=e6(t);if(r)return r;o.push(t)}let s=e4(o,r);if(s)return s;for(let e of o)n.set(e.id,e3(e));return e0(),null}(o,Array.isArray(e)?e:[],s));return}case"scripting.getRegisteredContentScripts":{let[e]=t.args;r({result:function(e,t){let r=[...e1(e).values()];if(!t?.ids?.length)return r.map(e3);let n=new Set(t.ids);return r.filter(e=>n.has(e.id)).map(e3)}(o,e)});return}case"scripting.unregisterContentScripts":{let[e]=t.args;a(function(e,t){let r=e1(e),n=function(e,t){if(!t)return null;let r=e1(e);for(let e of t){let t=e2(e);if(t)return t;if(!r.has(e))return eH(e)}return null}(e,t?.ids);if(n)return n;if(t?.ids?.length)for(let e of t.ids)r.delete(e);else r.clear();return e0(),null}(o,e));return}case"scripting.updateContentScripts":{let[e]=t.args;a(function(e,t,r){let n=e1(e),i=new Set;for(let e of t){let t=e2(e?.id);if(t)return t;if(i.has(e.id))return eJ(e.id);i.add(e.id)}for(let e of t)if(!n.has(e.id))return ez(e.id);let o=[];for(let e of t){let t={...n.get(e.id),...e5(e)},r=e6(t);if(r)return r;o.push(t)}let s=e4(o,r);if(s)return s;for(let e of o)n.set(e.id,e3(e));return e0(),null}(o,Array.isArray(e)?e:[],s));return}case"scripting.removeCSS":{let[e]=t.args,n="string"==typeof e?.css,s=Array.isArray(e?.files);if(n&&s||!n&&!s)return void r({error:"Exactly one of 'css' and 'files' must be specified."});await i?.(o,e??{}),r({result:void 0});return}default:r({error:`Unhandled scripting api ${t.api}`})}}let te=new Set(["webNavigation.getFrame","webNavigation.getAllFrames"]);async function tt(e){let{data:t,windows:r,respond:n,onListTabFrames:i}=e,o=async(e,t)=>{let r=i?await i(e):[];return[{errorOccurred:!1,processId:1e3+e,frameId:0,parentFrameId:-1,url:t,documentId:`guest-document-${e}`.padEnd(32,"0").slice(0,32).toUpperCase(),documentLifecycle:"active",frameType:"outermost_frame"},...r.map(t=>({errorOccurred:!1,processId:1e3+e,frameId:t.frameId,parentFrameId:t.parentFrameId,url:t.url,documentId:t.documentId,documentLifecycle:"active",frameType:"sub_frame"}))]};switch(t.api){case"webNavigation.getAllFrames":{let[e]=t.args,i=Number(e?.tabId),s=Number.isFinite(i)?D(r,i):void 0;n({result:s?await o(i,s.tab.url):null});return}case"webNavigation.getFrame":{let[e]=t.args;if(e?.documentId!==void 0){for(let t of r)for(let r of t.tabs){let t=Number(r.id);if(void 0!==e.tabId&&e.tabId!==t)continue;let i=(await o(t,r.url)).find(t=>t.documentId===e.documentId);if(i){if(void 0!==e.frameId&&e.frameId!==i.frameId)return void n({result:null});n({result:i});return}}n({result:null});return}if(e?.tabId===void 0||e?.frameId===void 0)return void n({error:"Either documentId or both tabId and frameId must be specified."});let i=Number(e.tabId),s=D(r,i);if(!s)return void n({result:null});n({result:(await o(i,s.tab.url)).find(t=>t.frameId===e.frameId)??null});return}default:n({error:`Unhandled webNavigation api ${t.api}`})}}let tr="Object reference chain is too long";function tn(e){return{isError:!0,code:"E_PROTOCOLERROR",description:"Inspector protocol error: %s",details:[e]}}let ti=`function (expression) {
2
+ var TOO_LONG = ${JSON.stringify(tr)};
3
+ var MAX_DEPTH = 20;
4
+ function serialise(value, seen, depth) {
5
+ if (value === null) return null;
6
+ var type = typeof value;
7
+ if (type === "undefined") return undefined;
8
+ if (type === "string" || type === "number" || type === "boolean") return value;
9
+ if (type === "bigint" || type === "symbol") return String(value);
10
+ if (depth > MAX_DEPTH) throw new RangeError(TOO_LONG);
11
+ if (seen.indexOf(value) !== -1) throw new RangeError(TOO_LONG);
12
+ seen.push(value);
13
+ var out;
14
+ if (Array.isArray(value)) {
15
+ out = [];
16
+ for (var index = 0; index < value.length; index += 1) {
17
+ out.push(serialise(value[index], seen, depth + 1));
18
+ }
19
+ } else {
20
+ out = {};
21
+ var keys = Object.keys(value);
22
+ for (var at = 0; at < keys.length; at += 1) {
23
+ out[keys[at]] = serialise(value[keys[at]], seen, depth + 1);
24
+ }
25
+ }
26
+ seen.pop();
27
+ return out;
28
+ }
29
+ var evaluated;
30
+ try {
31
+ evaluated = (0, eval)(expression);
32
+ } catch (error) {
33
+ return {
34
+ kind: "exception",
35
+ value: error && error.stack ? String(error.stack) : String(error),
36
+ className:
37
+ error && error.constructor && error.constructor.name
38
+ ? String(error.constructor.name)
39
+ : "Error",
40
+ };
41
+ }
42
+ try {
43
+ return { kind: "value", value: serialise(evaluated, [], 0) };
44
+ } catch (error) {
45
+ void error;
46
+ return { kind: "protocol-error", detail: TOO_LONG };
47
+ }
48
+ }`,to=["Runtime.evaluate","Storage.clearDataForOrigin"],ts=["local_storage","cookies","indexeddb","cache_storage","service_workers","file_systems","shader_cache","all"],ta=["local_storage"],tl=e=>`chrome.debugger.sendCommand cannot run ${e}: Extension.dev serves ${to.join(", ")} against a preview guest and runs no CDP backend behind the rest, so nothing is executed and nothing is acknowledged. Run 'extension dev' to load this extension as itself for a real debugger target.`,td=`
49
+ var CDP_ABSENT_DOMAINS = ${JSON.stringify(["Profiler","HeapProfiler","Memory","Layers","Security","DOMStorage"])};
50
+ var CDP_SERVED_METHODS = ${JSON.stringify(to)};
51
+ var cdpNotFound = (method) =>
52
+ '{"code":-32601,"message":"\\'' + method + '\\' wasn\\'t found"}';
53
+ var cdpNoBackend = (method) =>
54
+ "chrome.debugger.sendCommand cannot run " +
55
+ method +
56
+ ": Extension.dev serves " +
57
+ CDP_SERVED_METHODS.join(", ") +
58
+ " against a preview guest and runs no CDP backend behind the rest, so " +
59
+ "nothing is executed and nothing is acknowledged. Run 'extension dev' " +
60
+ "to load this extension as itself for a real debugger target.";
61
+ `,tu=new Set(["devtools.inspectedWindow.eval","debugger.sendCommand","debugger.attach","debugger.detach"]),tc=["Cannot access a ","Cannot access contents of the page","Cannot access contents of url"];async function tf(e,t){let r=await e.onExecuteScript(e.data.extensionId,{funcSource:ti,funcArgs:[t],world:"MAIN"}),n=Array.isArray(r)?r[0]:void 0;return n?.result}async function tp(e){let{data:t,respond:r}=e,[n,i]=t.args;if("Storage.clearDataForOrigin"===n){let t=function(e){let t=String(e??"").split(",").map(e=>e.trim()).filter(Boolean).filter(e=>ts.includes(e));if(0===t.length)return{kind:"invalid"};let r=t.filter(e=>!ta.includes(e));return r.length>0?{kind:"unserved",types:r}:{kind:"served"}}(i?.storageTypes);if("invalid"===t.kind)return void r({error:'{"code":-32602,"message":"No valid storage type specified"}'});if("unserved"===t.kind){let e;return void r({error:(e=t.types,`Storage.clearDataForOrigin cannot clear ${e.join(", ")} here: this backend clears ${ta.join(", ")} for the preview guest and nothing else, and answering an empty result would claim a clear that did not happen. Run 'extension dev' to load this extension as itself for a real debugger target.`)})}try{let t=await tf(e,"localStorage.clear(); sessionStorage.clear()");if(t&&"exception"===t.kind)return void r({error:t.value});r({result:{}})}catch(e){r({error:e instanceof Error?e.message:String(e)})}return}if("Runtime.evaluate"!==n)return void r({error:tl(String(n))});try{let t=await tf(e,String(i?.expression??""));if(!t)return void r({error:tl("Runtime.evaluate")});if("exception"===t.kind){var o,s;let e;return void r({result:(o=t.value,s=t.className??"Error",{result:e={type:"object",subtype:"error",className:s,description:o},exceptionDetails:{exceptionId:1,text:"Uncaught",lineNumber:0,columnNumber:0,exception:e}})})}if("protocol-error"===t.kind)return void r({error:t.detail});let n=function(e,t){if(null===e)return{result:{type:"object",subtype:"null",value:null}};switch(typeof e){case"undefined":return{result:{type:"undefined"}};case"number":return{result:{type:"number",value:e,description:String(e)}};case"string":return{result:{type:"string",value:e}};case"boolean":return{result:{type:"boolean",value:e}}}return t?Array.isArray(e)?{result:{type:"object",subtype:"array",value:e}}:{result:{type:"object",value:e}}:{refusal:"Runtime.evaluate answered an object and this backend has no object handles, so there is no objectId a later call could use. Pass returnByValue: true to get the value itself."}}(t.value,i?.returnByValue===!0);if("refusal"in n)return void r({error:n.refusal});r({result:{result:n.result}})}catch(e){r({error:e instanceof Error?e.message:String(e)})}}async function tg(e){let{data:t,respond:r,onExecuteScript:n}=e;if(!tu.has(t.api))return void r({error:`Unhandled devtools api ${t.api}`});if("debugger.attach"===t.api||"debugger.detach"===t.api){let[n]=t.args,i="debugger.attach"===t.api?e.onDebuggerAttach:e.onDebuggerDetach;await i?.(t.extensionId,n??{}),r({result:void 0});return}if(z(n,t.api,r))return;if("debugger.sendCommand"===t.api)return void await tp(e);let[i]=t.args;try{var o;r({result:(o=await tf(e,String(i??"")))?"exception"===o.kind?[void 0,{isException:!0,value:o.value}]:"protocol-error"===o.kind?[void 0,tn(o.detail)]:[o.value,void 0]:[void 0,tn(tr)]})}catch(t){let e=t instanceof Error?t.message:String(t);r({result:[void 0,{isError:!0,code:"E_FAILED",description:"Operation failed: %s",details:[tc.some(t=>e.startsWith(t))?"Permission denied":e]}]})}}let th=["local","sync","session","managed"];function tm(){return[..._,...X,...er,...ec,...ep,...ek,...eM,...e9,...te,...tu].sort()}function tb(e,t){let r=Math.min(e.length,t.length),n=0;for(;n<r&&e[n]===t[n];)n+=1;return n}function tw(e){let t=function(e){let t=tm();if(t.includes(e))return null;let r=e.split(".");if(3===r.length&&"storage"===r[0]&&th.includes(r[1]??"")){let e=`storage.${r[2]}`;if(t.includes(e))return e}let n=r[r.length-1]??"",i=t.filter(e=>e.endsWith(`.${n}`));if(i.length)return i.sort((t,r)=>tb(r,e)-tb(t,e))[0];let o=t.filter(e=>e.startsWith(`${r[0]}.`));return o.length?o[0]??null:null}(e),r=`Unsupported API: ${e}.`;if(!t)return`${r} No wire name resembles it, so this API is not on the bridge at all. It may still work natively inside your extension's own contexts: the bridge is what an observer page can DRIVE, not the whole runtime.`;let n=t.startsWith("storage.")&&e.startsWith("storage.")?` The bridge takes the storage area as an ARGUMENT, not as part of the name: ${t}(keys, "local").`:"";return`${r} The closest wire name the bridge routes is ${t}.${n}`}function tv(e){var t;let r;return e.untrustedContext?!function(e){let[t="",r=""]=e.split("."),n=(u()?.contentScriptWireMembers??{})[t];return"*"===n||!!Array.isArray(n)&&n.includes(r)}(e.api)?(r=(t=e.api).split(".")[0]??t,`chrome.${r} is not available to content scripts. Chrome gives a content script only chrome.storage, chrome.i18n, chrome.dom, chrome.extension and the messaging half of chrome.runtime, so ${t} cannot be reached from a page context. Call it from the background service worker or an extension page and reach the content script with runtime.sendMessage.`):null:null}function ty(e,t){let r=g(e);if(r)return r;let n=e.split(".")[0]??"",i=(u()?.namespacePermissions??{})[n];return!i||null===t||i.some(e=>t.has(e))?null:`chrome.${n} needs the "${i.join('" or "')}" permission, which this session did not declare. Declare it in the manifest (and re-register the session) to use this API.`}let tx=["extension","i18n","runtime","scripting","storage"],tI=tm().filter(e=>tx.includes(e.split(".")[0]??""));JSON.stringify(tx),JSON.stringify(tI),JSON.stringify(i),JSON.stringify(o),(function(e){let t=String(e),r=t.length,n=[],i=[],o=0,s=["await","case","delete","do","else","in","instanceof","new","of","return","throw","typeof","void","yield"],a=["do","else"],l=["for","if","while","with"],d=["!","%","&","(","*","+",",","-","/",":","<","=",">","?","[","^","|","~"],u=[".","(","[","?",":",",","+","-","*","/","%","&","|","^","<",">","="],c=e=>t.charAt(e),f=e=>" "===e||" "===e||"\n"===e||"\r"===e||"\v"===e||"\f"===e||"\xa0"===e||"\uFEFF"===e||"\u2028"===e||"\u2029"===e,p=e=>""!==e&&e>="0"&&e<="9",g=e=>""!==e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||"_"===e||"$"===e||"#"===e||e.charCodeAt(0)>127),h=e=>g(e)||p(e),m=(e,t)=>{let n=e+1;for(;n<r;){let e=c(n);if("\\"===e){n+=2;continue}if(e===t)return n+1;if("\n"===e)break;n+=1}return n},b=e=>{let t=e+1,n=!1;for(;t<r;){let e=c(t);if("\\"===e){t+=2;continue}if("\n"===e)break;if(n)"]"===e&&(n=!1);else if("["===e)n=!0;else if("/"===e){for(t+=1;t<r&&h(c(t));)t+=1;return t}t+=1}return -1},w=e=>{let t=e;for(;t<r;){let e=c(t);if("\\"===e){t+=2;continue}if("`"===e)return{at:t+1,substitution:!1};if("$"===e&&"{"===c(t+1))return{at:t+2,substitution:!0};t+=1}return{at:t,substitution:!1}},v=e=>{let n=e;for(;n<r;){let e=c(n);if(f(e)){n+=1;continue}if("/"===e&&"/"===c(n+1)){for(;n<r&&"\n"!==c(n);)n+=1;continue}if("/"===e&&"*"===c(n+1)){let e=t.indexOf("*/",n+2);n=-1===e?r:e+2;continue}break}return n},y=e=>{let n=v(e),i=n;if(!g(c(i)))return{text:"",start:n,end:n};for(i+=1;i<r&&h(c(i));)i+=1;return{text:t.slice(n,i),start:n,end:i}},x=e=>{let t=v(e),r=c(t);if('"'!==r&&"'"!==r)return null;let n=m(t,r);if(c(n-1)!==r||n-1===t)return null;let i="",o=t+1;for(;o<n-1;){let e=c(o);if("\\"===e){i+=c(o+1),o+=2;continue}i+=e,o+=1}return{value:i,start:t,end:n}},I=e=>{let t=x(e);return t?{text:t.value,start:t.start,end:t.end}:y(e)},k=e=>{let t=e,n=y(t);if("with"===n.text||"assert"===n.text){let e=v(n.end);"{"===c(e)&&(t=(e=>{let t=e+1,n=1;for(;t<r&&n>0;){let e=c(t);if('"'===e||"'"===e){t=m(t,e);continue}"{"===e&&(n+=1),"}"===e&&(n-=1),t+=1}return t})(e))}let i=v(t);return";"===c(i)?i+1:t},S=e=>{let t=[],n=e+1;for(;n<r;){if("}"===c(n=v(n)))return{pairs:t,end:n+1};let e=I(n);if(""===e.text&&"}"!==c(e.start))break;let r=e,i=y(e.end);if("as"===i.text&&(r=I(i.end)),""===r.text)break;if(t.push([e.text,r.text]),","===c(n=v(r.end)))n+=1;else if("}"!==c(n))break}return null},A=[],N=[],O=0,C={kind:"none",text:"",regexAfter:!0},$=(e,t,r)=>{C={kind:e,text:t,regexAfter:r}},T=(e,t)=>($("word",t,!1),e+t.length),E=e=>{let t=v(e+6);if("("===c(t))return T(e,"import");if("."===c(t)){let r=y(t+1);return"meta"!==r.text?T(e,"import"):(i.push({start:e,end:r.end,replacement:"__pcMeta"}),$("word","__pcMeta",!1),r.end)}if(A.length+N.length+O!==0)return T(e,"import");let r="",n=t;if('"'!==c(t)&&"'"!==c(t)){let i=(e=>{let t=v(e),r="",n="",i=[];if("{"!==c(t)&&"*"!==c(t)){let e=y(t);if(""===e.text||"from"===e.text)return null;r=e.text,","===c(t=v(e.end))&&(t=v(t+1))}if("*"===c(t)){let e=y(t+1);if("as"!==e.text)return null;let r=y(e.end);if(""===r.text)return null;n=r.text,","===c(t=v(r.end))&&(t=v(t+1))}if("{"===c(t)){let e=S(t);if(!e)return null;i=e.pairs,t=e.end}let o=y(t);return"from"!==o.text?null:{defaultName:r,star:n,pairs:i,end:o.end}})(t);if(!i)return T(e,"import");let s=x(i.end);if(!s)return T(e,"import");let a="__pcM"+(o+=1),l=["const "+a+" = await __pcImportFrom("+JSON.stringify(s.value)+");"];for(let e of(""!==i.star&&l.push("const "+i.star+" = "+a+";"),i.pairs))l.push("const "+e[1]+" = "+a+"["+JSON.stringify(e[0])+"];");""!==i.defaultName&&l.push("const "+i.defaultName+" = "+a+'["default"];'),r=l.join(" "),n=s.end}else{let i=x(t);if(!i)return T(e,"import");r="await __pcImportFrom("+JSON.stringify(i.value)+");",n=i.end}let s=k(n);return i.push({start:e,end:s,replacement:r}),$("punct",";",!0),s},R=e=>{if(A.length+N.length+O!==0)return T(e,"export");let o=v(e+6),s=e=>"await __pcImportFrom("+JSON.stringify(e)+")";if("*"===c(o)){let t=o+1,r="",n=y(t);if("as"===n.text){let i=I(n.end);if(""===i.text)return T(e,"export");r=i.text,t=i.end}let a=y(t);if("from"!==a.text)return T(e,"export");let l=x(a.end);if(!l)return T(e,"export");let d=k(l.end);return i.push({start:e,end:d,replacement:""===r?"__pcNs.star("+s(l.value)+");":"__pcNs.define("+JSON.stringify(r)+", "+s(l.value)+");"}),$("punct",";",!0),d}if("{"===c(o)){let t=S(o);if(!t)return T(e,"export");let r=y(t.end);if("from"===r.text){let n=x(r.end);if(!n)return T(e,"export");let o=k(n.end);return i.push({start:e,end:o,replacement:"__pcNs.from("+s(n.value)+", "+JSON.stringify(t.pairs)+");"}),$("punct",";",!0),o}let n=k(t.end);return i.push({start:e,end:n,replacement:t.pairs.map(e=>"__pcNs.live("+JSON.stringify(e[1])+", () => "+e[0]+");").join(" ")}),$("punct",";",!0),n}let a=y(o);if("default"===a.text){let t=y(a.end),r=t;if("async"===t.text){let e=y(t.end);"function"===e.text&&(r=e)}let o="";if("function"===r.text){let e=v(r.end);"*"===c(e)&&(e+=1),o=y(e).text}else if("class"===r.text){let e=y(r.end);"extends"!==e.text&&(o=e.text)}return""!==o?(n.push(["default",o]),i.push({start:e,end:t.start,replacement:""}),$("punct",";",!0)):(i.push({start:e,end:t.start,replacement:'__pcNs.target["default"] = '}),$("punct","=",!0)),t.start}if(-1===["async","function","class","const","let","var"].indexOf(a.text))return T(e,"export");let l=a;if("async"===a.text){let t=y(a.end);if("function"!==t.text)return T(e,"export");l=t}let p=v(l.end);"function"===l.text&&"*"===c(p)&&(p+=1);let C=y(p);return""===C.text||"class"===l.text&&"extends"===C.text?T(e,"export"):(n.push([C.text,C.text]),("const"===l.text||"let"===l.text||"var"===l.text)&&(e=>{let i=e,o=0,s="",a=-1;for(;i<r;){let e=c(i);if("\n"===e||"\r"===e||"\u2028"===e||"\u2029"===e){0===o&&""!==s&&-1===a&&(a=i),i+=1;continue}if(f(e)){i+=1;continue}if("/"===e&&"/"===c(i+1)){for(;i<r&&"\n"!==c(i);)i+=1;continue}if("/"===e&&"*"===c(i+1)){let e=t.indexOf("*/",i+2);i=-1===e?r:e+2;continue}if(-1!==a){if(!(-1!==u.indexOf(e)||g(e)&&-1!==["in","instanceof"].indexOf(y(i).text)))return;a=-1}if('"'===e||"'"===e){i=m(i,e),s=e;continue}if("`"===e){let e=w(i+1);i=e.at,e.substitution&&(o+=1),s="`";continue}if("/"===e&&(""===s||-1!==d.indexOf(s)&&")"!==s||";"===s||"{"===s||"}"===s)){let e=b(i);if(-1!==e){i=e,s="/";continue}}if(";"===e&&0===o)return;if(("("===e||"["===e||"{"===e)&&(o+=1),(")"===e||"]"===e||"}"===e)&&(o-=1),","===e&&0===o){let e=y(i+1);if(""!==e.text){n.push([e.text,e.text]),i=e.end,s="a";continue}}if(h(e)){for(i+=1;i<r&&h(c(i));)i+=1;s="a";continue}s=e,i+=1}})(C.end),i.push({start:e,end:a.start,replacement:""}),$("punct",";",!0),a.start)},D=0;if(t.startsWith("#!")){for(;D<r&&"\n"!==c(D);)D+=1;i.push({start:0,end:D,replacement:""})}for(;D<r;){let e=c(D);if(f(e)){D+=1;continue}if("/"===e&&"/"===c(D+1)){for(;D<r&&"\n"!==c(D);)D+=1;continue}if("/"===e&&"*"===c(D+1)){let e=t.indexOf("*/",D+2);D=-1===e?r:e+2;continue}if('"'===e||"'"===e){D=m(D,e),$("value",e,!1);continue}if("`"===e){let e=w(D+1);D=e.at,e.substitution?A.push("template"):$("value","`",!1);continue}if("/"===e&&C.regexAfter){let e=b(D);if(-1!==e){D=e,$("value","/",!1);continue}}if(p(e)||"."===e&&p(c(D+1))){for(D+=1;D<r&&(h(c(D))||"."===c(D));)D+=1;$("value","0",!1);continue}if(g(e)){let e=D;for(D+=1;D<r&&h(c(D));)D+=1;let n=t.slice(e,D);if("."!==C.text&&"import"===n){D=E(e);continue}if("."!==C.text&&"export"===n){D=R(e);continue}$("word",n,-1!==s.indexOf(n));continue}if("("===e){N.push("word"===C.kind&&-1!==l.indexOf(C.text)),D+=1,$("punct","(",!0);continue}if(")"===e){D+=1,$("close",")",!0===N.pop());continue}if("{"===e){let e="punct"===C.kind&&-1!==d.indexOf(C.text)||"word"===C.kind&&-1!==s.indexOf(C.text)&&-1===a.indexOf(C.text);A.push(e?"object":"block"),D+=1,$("punct","{",!0);continue}if("}"===e){let e=A.pop();if(D+=1,"template"===e){let e=w(D);D=e.at,e.substitution?A.push("template"):$("value","`",!1);continue}$("close","}","object"!==e);continue}if("["===e){O+=1,D+=1,$("punct","[",!0);continue}if("]"===e){O=Math.max(0,O-1),D+=1,$("close","]",!1);continue}if(("+"===e||"-"===e)&&c(D+1)===e){D+=2,$("close",e+e,!1);continue}D+=1,$("punct",e,!0)}let _="",P=0;for(let e of i)_+=t.slice(P,e.start)+e.replacement,P=e.end;return(_+=t.slice(P))+"\n"+n.map(e=>"__pcNs.live("+JSON.stringify(e[0])+", () => "+e[1]+");").join("\n")}).toString();JSON.stringify("surface-boot-v1"),JSON.stringify("__extensionSurfaceBoot"),JSON.stringify(8);let tk=`
62
+ function openShadowRoots(scope) {
63
+ var hosts = scope.querySelectorAll("*");
64
+ var roots = [];
65
+ for (var i = 0; i < hosts.length; i += 1) {
66
+ if (hosts[i].shadowRoot) roots.push(hosts[i].shadowRoot);
67
+ }
68
+ return roots;
69
+ }
70
+ function deepQueryAll(scope, selector) {
71
+ var found = [];
72
+ var direct = scope.querySelectorAll(selector);
73
+ for (var d = 0; d < direct.length; d += 1) found.push(direct[d]);
74
+ var roots = openShadowRoots(scope);
75
+ for (var r = 0; r < roots.length; r += 1) {
76
+ var inner = deepQueryAll(roots[r], selector);
77
+ for (var n = 0; n < inner.length; n += 1) found.push(inner[n]);
78
+ }
79
+ return found;
80
+ }
81
+ function resolveUid(selector) {
82
+ var match = /^(\\d+)_(\\d+)$/.exec(String(selector).trim());
83
+ if (!match) return null;
84
+ var snap = window.__previewDriveSnapshot;
85
+ if (!snap || String(snap.id) !== match[1]) return [];
86
+ var node = snap.nodes[match[2]];
87
+ return node && node.isConnected ? [node] : [];
88
+ }
89
+ function resolveAll(selector) {
90
+ var byUid = resolveUid(selector);
91
+ if (byUid) return byUid;
92
+ var direct = document.querySelectorAll(selector);
93
+ if (direct.length > 0) return Array.prototype.slice.call(direct);
94
+ return deepQueryAll(document, selector);
95
+ }`;JSON.stringify("surface-hands-v1"),JSON.stringify("__extensionSurfaceHands"),JSON.stringify("__extensionSurfaceMutations");let tS=["url","pendingUrl","title","favIconUrl"],tA=new Set(["tabs.get","tabs.query","tabs.create","tabs.update","tabs.move","tabs.discard"]),tN=new Set(["windows.get","windows.getAll","windows.getCurrent","windows.create","windows.update"]),tO=["url","title"],tC=/^(\*|https?|file|ftp):\/\/([^/]*)(\/.*)?$/,t$=/^(\[[^\]]*\]|[^:]*)(?::([^:]*))?$/,tT=/^(?:https?|file|ftp):\/\//;function tE(e){return e.replace(/[.+?^${}()|[\]\\*]/g,"\\$&")}function tR(e,t){if(e.has("tabs"))return!0;if(!t)return!1;for(let r of e){if(!("<all_urls>"===r||r.includes("://")))continue;let e=function(e){var t;if("<all_urls>"===e)return tT;let r=function(e){var t;let r=tC.exec(e);if(!r)return null;let[,n="",i="",o]=r;if(void 0===o)return null;let s=t$.exec(i);if(!s)return null;let a=s[1]??"",l=void 0===(t=s[2])||"*"===t?"":/^\d+$/.test(t)?`:${t}`:null;return null===l||!function(e){if("*"===e)return!0;if(e.includes("@"))return!1;if(e.startsWith("*.")){let t=e.slice(2);return t.length>0&&!t.includes("*")}return e.length>0&&!e.includes("*")}(a)?null:{scheme:n,host:a,port:l}}(e);if(!r)return null;let n="*"===r.scheme?"https?":tE(r.scheme),i=r.port?tE(r.port):"(?::\\d+)?";return RegExp(`^${n}://${"*"===(t=r.host)?"[^/]+":t.startsWith("*.")?`(?:[^/:]+\\.)?${tE(t.slice(2))}`:tE(t)}${i}/.*$`)}(r);if(e?.test(t))return!0}return!1}function tD(e,t){if(!e||"object"!=typeof e||tR(t,"string"==typeof e.url?e.url:"string"==typeof e.pendingUrl?e.pendingUrl:void 0))return e;let r={...e};for(let e of tS)delete r[e];return r}let t_={onCreated:0,onUpdated:2};function tP(e){return e&&"object"==typeof e?"string"==typeof e.url?e.url:"string"==typeof e.pendingUrl?e.pendingUrl:void 0:void 0}function tM(e,t){return e&&"object"==typeof e&&Array.isArray(e.tabs)?{...e,tabs:e.tabs.map(e=>tD(e,t))}:e}function tU(e,t){return`Error in invocation of ${e}: ${t}`}function tL(e,t){return tU(e,`missing required property '${t}'`)}let tj={array:"array",string:"string",nonEmptyString:"non-empty string",stringOrArray:"string or array",nonEmptyArray:"non-empty array"};async function tq(e){let t=g(e.data.api);if(t)return void e.respond({error:t,refused:!0});let{data:r,getDeclaredPermissions:n,getSessionStorageAccessLevel:i}=e,o=n?n(r.extensionId):void 0,s=t=>e.respond("result"in t?{...t,result:function(e,t,r,n){if(!r)return t;let i="tabs.query"===e&&Array.isArray(t)&&function(e){let[t]=e??[];return!!t&&"object"==typeof t&&tO.some(e=>"title"===e?void 0!==t.title&&""!==t.title:"url"===e?void 0!==t.url&&(!Array.isArray(t.url)||t.url.length>0):void 0!==t[e])}(n)?t.filter(e=>tR(r,tP(e))):t;return r.has("tabs")?i:tA.has(e)?Array.isArray(i)?i.map(e=>tD(e,r)):tD(i,r):tN.has(e)?Array.isArray(i)?i.map(e=>tM(e,r)):tM(i,r):i}(r.api,t.result,o,r.args)}:t),a={...e,respond:s};try{var l;if(l=r.api,!(_.has(l)||X.has(l)||er.has(l)||ec.has(l)||ep.has(l)||ek.has(l)||eM.has(l)||e9.has(l)||te.has(l)||tu.has(l)))return void s({error:tw(r.api),refused:!0});let t=tv(r);if(t)return void s({error:t,refused:!0});let n=function(e,t){let r=u();if(!r)return p(e);let n=r.argumentRules[e];return n?function(e,t,r){let n="afterOptionalString"===t.optionsArg&&"string"==typeof r[0]?r[1]:r[0];if(!n)return t.missingOptions?tL(e,t.missingOptions):null;for(let r of t.props){let t=function(e,t,r){if(t.unless&&r[t.unless.name]===t.unless.equals)return null;let n=r[t.name];return(t.required&&"in"===t.presence?t.name in r:void 0!==n)?t.enum?"string"==typeof n&&t.enum.includes(n)?null:t.verbatim??tU(e,`'${t.name}' must be one of ${t.enum.join(", ")}`):!function(e,t){switch(e){case"array":return Array.isArray(t);case"string":return"string"==typeof t;case"nonEmptyString":return"string"==typeof t&&t.length>0;case"stringOrArray":return"string"==typeof t||Array.isArray(t);case"nonEmptyArray":return Array.isArray(t)&&t.length>0;default:return!1}}(t.type,n)?"missing"===t.onInvalid?tL(e,t.name):tU(e,`'${t.name}' expects a ${tj[t.type]}, got ${typeof n}`):null:t.required?tL(e,t.name):null}(e,r,n);if(t)return t}return null}(e,n,t):null}(r.api,r.args);if(n)return void s({error:n});let d=function(e,t,r){var n,i;let o=tv(e);if(o)return o;if(void 0!==t){let r=ty(e.api,t);if(r)return r}return e.untrustedContext&&e.api.startsWith("storage.")?"session"!==(n=e.api,i=e.args,"storage.clear"===n?i[0]:i[1])||"TRUSTED_AND_UNTRUSTED_CONTEXTS"===(r?.(e.extensionId)??"TRUSTED_CONTEXTS")?null:"Access to storage is not allowed from this context.":null}(r,o,i);if(d)return void s({error:d,refused:!0});let c=function(e){let{api:t,extensionId:r,getGuestManifest:n,lane:i="carrier"}=e,o=u()?.hostedLimits;if(!o)return p(t);if("offscreen.createDocument"===t)return"carrier"===i?o.offscreenCreateRefusal:null;if(o.devtoolsPanelApis.includes(t)){let e;if("function"!=typeof n)return null;let i=n(r);return null==i||"string"==typeof i?.devtools_page&&i.devtools_page.trim().length>0?null:(e=u()?.hostedLimits.devtoolsPageMissing)?e.split("{api}").join(t):p(t)}return null}({api:r.api,extensionId:r.extensionId,getGuestManifest:e.getGuestManifest,lane:"emulated"});if(c)return void s({error:c,refused:!0});if(_.has(r.api))return void await P(a);if(X.has(r.api))return void await K(a);if(er.has(r.api))return void await es(a);if(ec.has(r.api))return void await ef(a);if(ep.has(r.api))return void await eg(a);if(ek.has(r.api))return void await eC(a);if(eM.has(r.api))return void await eU(a);if(e9.has(r.api))return void await e7(a);if(te.has(r.api))return void await tt(a);if(tu.has(r.api))return void await tg(a);s({error:tw(r.api),refused:!0})}catch(e){s({error:e instanceof Error?e.message:"Unknown error"})}}new WeakMap,JSON.stringify(["log","info","warn","error","debug"]),JSON.stringify("EXTENSION_WORKER_LOG");let tB="EXTENSION_TEST_EVENT";JSON.stringify(tB),JSON.stringify(tB);let tG=["setTimeout","clearTimeout","setInterval","clearInterval","queueMicrotask","structuredClone","atob","btoa","fetch"],tF=["URL","URLSearchParams","Headers","Request","Response","Blob","TextEncoder","TextDecoder","FileReader","AbortController","caches","crypto","performance"];[...tG,...tF],[...tG.map(e=>` var ${e} = typeof self.${e} === "function" ? self.${e}.bind(self) : self.${e};`),...tF.map(e=>` var ${e} = self.${e};`)].join("\n");let tW={engineVersion:"0.1.2",bodySha256:"0e4774f2a771adcf5323d4d43160032e741ce2347c656ef83b251dfe4602a00e"},tJ=["actionManifestKeys","argumentRules","contentScriptWireMembers","hostedLimits","mockPolicySyncPaths","mockedNamespaces","namespacePermissions","refusedApiPaths","refusedSubNamespaceGates","surfaceGatedNamespaces","synthetic"],tV=e=>!!e&&"object"==typeof e&&!Array.isArray(e),tH=e=>Array.isArray(e)&&e.every(e=>"string"==typeof e),tz=(e,t)=>tV(e)&&Object.values(e).every(t);[{title:"Example",url:"https://example.com",host:"example.com",observedAt:"2026-08-05"},{title:"Wikipedia",url:"https://en.wikipedia.org",host:"en.wikipedia.org",observedAt:"2026-08-05"},{title:"Node.js",url:"https://nodejs.org",host:"nodejs.org",observedAt:"2026-08-05"},{title:"React",url:"https://react.dev",host:"react.dev",observedAt:"2026-08-05"},{title:"Vite",url:"https://vitejs.dev",host:"vitejs.dev",observedAt:"2026-08-05"},{title:"Rust",url:"https://www.rust-lang.org",host:"www.rust-lang.org",observedAt:"2026-08-05"},{title:"Archive",url:"https://archive.org",host:"archive.org",observedAt:"2026-08-05"},{title:"httpbin",url:"https://httpbin.org/html",host:"httpbin.org",observedAt:"2026-08-05"}].filter(e=>"httpbin.org"!==e.host);let tX=["example.com","www.example.com","example.org","example.net"];tX.map(e=>`https://${e}/`),tX[0];let tK="/fixtures/";function tY(e,t){if(t){if(/^(https?|blob|data|chrome-extension):/i.test(t))return t;if(e)for(let r of[t,t.replace(/^\.?\//,""),`/${t.replace(/^\.?\//,"")}`,`./${t.replace(/^\.?\//,"")}`]){let t=e[r];if(t)return t}}}async function tQ(e){let t=await fetch(e);if(!t.ok)throw Error(`could not read the guest asset (HTTP ${t.status})`);let r=await t.blob(),n=new Uint8Array(await r.arrayBuffer()),i="";for(let e of n)i+=String.fromCharCode(e);let o=r.type||"application/octet-stream";return`data:${o};base64,${btoa(i)}`}async function tZ(e){let t=await fetch(e);if(!t.ok)throw Error(`could not read the guest icon (HTTP ${t.status})`);let r=await createImageBitmap(await t.blob());try{let e=new OffscreenCanvas(r.width,r.height).getContext("2d");if(!e)throw Error("no 2d context is available to decode the guest icon");return e.drawImage(r,0,0),e.getImageData(0,0,r.width,r.height)}finally{r.close()}}async function t0(e,t){let r={...e};for(let e of["iconUrl","imageUrl","appIconMaskUrl"]){let n=tY(t,r[e]);n&&(r[e]=await tQ(n))}return Array.isArray(r.buttons)&&(r.buttons=await Promise.all(r.buttons.map(async e=>{let r=tY(t,e.iconUrl);return r?{...e,iconUrl:await tQ(r)}:e}))),r}function t1(e,t){throw Error(`${e} did not run on the real lane: ${t}`)}async function t2(e,t){let r=chrome.permissions[e];return"function"!=typeof r&&t1(`permissions.${e}`,"this Chrome build has no chrome.permissions host access request API"),await r.call(chrome.permissions,t),{}}[{name:"article",path:`${tK}article`,title:"The Long Read",contains:"a news article: h1 headline, byline, four paragraphs with h2 sections, a pull quote, a related-links list"},{name:"product",path:`${tK}product`,title:"Trailhead Pack 32L",contains:"a product page: h1 name, price in a .price element, size select, quantity input, Add to cart and Buy now buttons inside a form, three reviews"},{name:"search",path:`${tK}search`,title:"Search results for extensions",contains:"a search results list: a search form at the top, ten results each with an h3 link, a URL line and a snippet, pagination links"},{name:"frames",path:`${tK}frames`,title:"Embedded content",contains:"a page with two same-origin iframes (a video card and a comments widget) beside the main text, for all_frames and frame targeting"},{name:"live",path:`${tK}live`,title:"Live scores",contains:"a page whose DOM changes on a timer: a score table that updates every second and a feed that appends a row every two seconds, for MutationObserver work"},{name:"login",path:`${tK}login`,title:"Sign in",contains:"a login form: email input, password input, remember-me checkbox, submit button, a forgot-password link; submit stays on the page and shows a status line"}].map(e=>e.name),new TextEncoder,new WeakMap;let t8=e=>{let t=Number(e);return Number.isFinite(t)?t:void 0},t5=e=>{let t=Number(e);return Number.isFinite(t)?t:void 0};function t3(e){if((u()?.refusedApiPaths??[]).includes(e))return"refused";for(let t of Object.keys(u()?.mockedNamespaces??{}).sort((e,t)=>t.length-e.length))if(e===t||e.startsWith(`${t}.`))return"mocked";return"emulated"}let t6=/^__(ext|extjs|extension)[a-z0-9-]*__$/i,t4=new Set(["runtime.connect","runtime.onConnect","runtime.sendMessage","runtime.onMessage","tabs.connect","tabs.sendMessage"]);function t9(e){return"string"==typeof e&&t6.test(e)}let t7=new Set(["storage","action","offscreen","runtime","tabs.sendMessage","scripting","downloads","notifications","contextMenus"]);function re(e){return!!e&&(e.startsWith("Unsupported API: ")||e.startsWith("No backend implements ")||/needs the ".+" permission, which this (session did not declare|extension's manifest does not declare)/.test(e))}function rt(e){return e.refused||re(e.error)?"refused":"real"===e.lane?"real":t3(e.api)}let rr=new Set(["local","sync","session","managed"]);function rn(e,t){let r=e.split(".");if("storage"!==r[0])return e;if(3===r.length&&rr.has(r[1]??""))return`storage.${r[2]}@${r[1]}`;if(2===r.length){let e="clear"===r[1]?t?.[0]:t?.[1];return`storage.${r[1]}@${"string"==typeof e?e:"local"}`}return e}let ri=new TextEncoder;function ro(e,t){return{path:e,bytes:ri.encode(t),text:t}}let rs={manifest_version:3,name:"Hello Emulator",version:"0.1.0",description:"Trace fixture exercising emulated, mocked, and refused chrome.* tiers.",permissions:["storage","tabs","notifications","system.cpu","bookmarks","history","cookies","alarms","topSites","fontSettings","power","tts","identity","webNavigation"],action:{default_title:"Hello Emulator",default_popup:"popup.html"},background:{service_worker:"background.js"}},ra=`<!doctype html>
2
96
  <html>
3
97
  <head>
4
98
  <meta charset="utf-8" />
@@ -50,7 +144,7 @@
50
144
  <script src="popup.js"></script>
51
145
  </body>
52
146
  </html>
53
- `,eI=`const out = document.getElementById("out");
147
+ `,rl=`const out = document.getElementById("out");
54
148
  const show = (label, value) => {
55
149
  out.textContent = label + "\\n" + JSON.stringify(value, null, 2);
56
150
  };
@@ -156,7 +250,7 @@ document.getElementById("battery").addEventListener("click", async () => {
156
250
  failed: failed.length ? failed : "none",
157
251
  });
158
252
  });
159
- `,eS=`chrome.runtime.onInstalled.addListener(() => {
253
+ `,rd=`chrome.runtime.onInstalled.addListener(() => {
160
254
  console.log("[hello-emulator] installed");
161
255
  });
162
256
 
@@ -166,4 +260,4 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
166
260
  }
167
261
  return true;
168
262
  });
169
- `;ev("manifest.json",JSON.stringify(ek,null,2)),ev("popup.html",ex),ev("popup.js",eI),ev("background.js",eS),ek.name;let{PING:eA,PONG:eC,BRIDGE:eT,SESSION:e$,INJECT:eE,EVENT_PORT:eN,EVENT:eD,TRACE:eM}={PING:"extensiondev:ping",PONG:"extensiondev:pong",BRIDGE:"extensiondev:bridge",SESSION:"extensiondev:session",INJECT:"extensiondev:inject",EVENT_PORT:"extensiondev:events",EVENT:"extensiondev:event",TRACE:"extensiondev:trace"},eU=function(e={}){let t=e.engine??"chromium-emulated",r=e.limit??500,n=e.now??(()=>new Date),o=n().toISOString(),s=[],a=new Set,i=0,l=e=>{for(s.push(e);s.length>r;){let e=s.findIndex(e=>"framework"===e.attribution);s.splice(-1===e?0:e,1)}for(let t of a)t(e);return e};return{recordCall(e,r,o,s){let a=o??[];return l({seq:i+=1,api:e,args:a,extensionId:r,at:n().toISOString(),tier:ed(e),engine:t,policy:s,...!function(e,t=[]){if(!ef.has(e))return!1;for(let e of t)if(eg(e)||e&&"object"==typeof e&&(eg(e.name)||eg(e.type)||eg(e.channel)))return!0;return!1}(e,a)?{}:{attribution:"framework"}})},recordOutcome(e){let r=ew(e.api,e.args),o=s.find(t=>t.extensionId===e.extensionId&&ew(t.api,t.args)===r&&void 0===t.status&&void 0===t.requestId),c={requestId:e.requestId,lane:e.lane,status:void 0===e.error?"ok":"error",error:e.error,result:e.result,durationMs:e.durationMs,laneDowngraded:e.laneDowngraded||void 0,downgradeReason:e.downgradeReason,carrierScoped:!e.refused&&!ep(e.error)&&function(e,t){if("real"!==t)return!1;if(em.has(e))return!0;let r=e.split(".")[0]??"";return em.has(r)}(e.api,e.lane)||void 0};if(o){Object.assign(o,c),o.tier=eh(e);for(let e of a)e(o);return o}return l({seq:i+=1,api:e.api,args:e.args,extensionId:e.extensionId,at:n().toISOString(),tier:eh(e),engine:t,...c})},events:()=>[...s],snapshot(){let e={real:0,emulated:0,mocked:0,refused:0},r=0;for(let t of s)e[t.tier??ed(t.api)]+=1,"error"===t.status&&(r+=1);return{engine:t,startedAt:o,events:[...s],counts:{total:s.length,byTier:e,errors:r}}},subscribe:e=>(a.add(e),()=>a.delete(e)),clear(){s.length=0}}}({engine:"chromium-real"}),eR=new Set;eU.subscribe(e=>{for(let t of eR)try{t.postMessage({type:eM,event:e})}catch{}});let eB=new Map,eq=function(e={}){let t={local:{},sync:{},session:{},managed:{}},r=e=>chrome.storage[e??"local"]??chrome.storage.local,n=e=>t[e??"local"]??t.local;for(let e of["local","sync","session","managed"])r(e).get(null).then(t=>{Object.assign(n(e),t)}).catch(()=>void 0);chrome.storage.onChanged.addListener((e,r)=>{if(!(r in t))return;let o=n(r);for(let[t,r]of Object.entries(e))void 0===r.newValue?delete o[t]:o[t]=r.newValue});let o=new Map;return{getStorage:(e,t)=>({...n(t)}),setStorage:(e,t,o)=>(Object.assign(n(o),t),r(o).set(t)),removeStorageKeys:(e,t,o)=>{let s=n(o);for(let e of t)delete s[e];return r(o).remove(t)},clearStorage:(e,t)=>{let o=n(t);for(let e of Object.keys(o))delete o[e];return r(t).clear()},onSetStorageAccessLevel:async(e,t,r)=>{if("session"!==t)return;o.set(e,r);let n=chrome.storage.session;await n.setAccessLevel?.({accessLevel:r})},getSessionStorageAccessLevel:e=>o.get(e),...function(e={}){return{onCreateTab:(e,t)=>chrome.tabs.create({url:e,...t?.active!==void 0?{active:t.active}:{},...t?.pinned!==void 0?{pinned:t.pinned}:{},...t?.index!==void 0?{index:t.index}:{},...t?.windowId!==void 0?{windowId:t.windowId}:{},...t?.openerTabId!==void 0?{openerTabId:t.openerTabId}:{}}),onUpdateTab:(e,t)=>{let r=ea(e);return null!=r?chrome.tabs.update(r,t):chrome.tabs.update(t)},onRemoveTab:e=>{let t=ea(e);return null==t&&es("tabs.remove",`"${String(e)}" is not a real tab id`),chrome.tabs.remove(t)},onDiscardTab:(e,t)=>{let r=ea(t);return null!=r?chrome.tabs.discard(r):chrome.tabs.discard()},onGroupTabs:async(e,t)=>{let r=Array.isArray(t.tabIds)?t.tabIds:void 0!==t.tabIds?[t.tabIds]:[];return r.length||es("tabs.group","no tabIds were given to group"),chrome.tabs.group({tabIds:r,...void 0===t.groupId?{}:{groupId:t.groupId}})},onUngroupTabs:(e,t)=>chrome.tabs.ungroup(Array.isArray(t)?t:[t]),onGetWindow:(e,t,r)=>{let n=ei(t);return null==n?chrome.windows.getCurrent(r??{}):chrome.windows.get(n,r??{})},onGetAllWindows:(e,t)=>chrome.windows.getAll(t??{}),onCreateWindow:(e,t)=>chrome.windows.create({url:t}),onUpdateWindow:(e,t,r)=>{let n=ei(t);return null==n?null:chrome.windows.update(n,r)},onRemoveWindow:async(e,t)=>{let r=ei(t);return null!=r&&(await chrome.windows.remove(r),!0)},onOpenSidePanel:async()=>{let e=await chrome.windows.getCurrent();null==e.id&&es("sidePanel.open","there is no focused window to open it in"),await chrome.sidePanel.open({windowId:e.id})},onSetBadgeText:(e,t,r)=>{let n=ea(r);return chrome.action.setBadgeText(null!=n?{text:t??"",tabId:n}:{text:t??""})},onSetBadgeBackground:(e,t,r)=>{t||es("action.setBadgeBackgroundColor","no color was given");let n=ea(r);return chrome.action.setBadgeBackgroundColor(null!=n?{color:t,tabId:n}:{color:t})},onSetActionTitle:(e,t,r)=>{let n=ea(r);return chrome.action.setTitle(null!=n?{title:t??"",tabId:n}:{title:t??""})},onGetActionState:async(e,t)=>{let r=ea(t),n=null!=r?{tabId:r}:{},[o,s,a]=await Promise.all([chrome.action.getBadgeText(n),chrome.action.getBadgeBackgroundColor(n),chrome.action.getTitle(n)]);return{badgeText:o,badgeColor:Array.isArray(s)?`rgba(${s[0]}, ${s[1]}, ${s[2]}, ${(s[3]??255)/255})`:s??void 0,title:a}},onSetActionIcon:async(t,r)=>{r||es("action.setIcon","no icon path was given");let n=et(e.getGuestAssetUrls?.(t),r);return n||es("action.setIcon",`"${r}" is not in this guest's asset map, so the carrier cannot reach it`),chrome.action.setIcon({imageData:await en(n)})},onCreateContextMenu:(e,t)=>chrome.contextMenus.create(t),onUpdateContextMenu:async(e,t,r)=>(await chrome.contextMenus.update(t,r),!0),onRemoveContextMenu:async(e,t)=>(await chrome.contextMenus.remove(t),!0),onClearContextMenus:async()=>(await chrome.contextMenus.removeAll(),!0),onCreateNotification:async(t,r,n)=>chrome.notifications.create(r??"",await eo(n??{},e.getGuestAssetUrls?.(t))),onClearNotification:(e,t)=>chrome.notifications.clear(t),onGetNotifications:()=>chrome.notifications.getAll(),onDownload:(e,t)=>chrome.downloads.download(t),onSearchDownloads:(e,t)=>chrome.downloads.search(t??{}),onCancelDownload:async(e,t)=>{await chrome.downloads.cancel(t).catch(()=>void 0)},onPauseDownload:(e,t)=>chrome.downloads.pause(t),onResumeDownload:(e,t)=>chrome.downloads.resume(t),onEraseDownloads:(e,t)=>chrome.downloads.erase(t??{}),onGetBookmarkTree:()=>chrome.bookmarks.getTree(),onGetBookmarks:(e,t)=>chrome.bookmarks.get(t),onGetBookmarkChildren:(e,t)=>t?chrome.bookmarks.getChildren(t):chrome.bookmarks.getTree(),onSearchBookmarks:(e,t)=>chrome.bookmarks.search(t??""),onCreateBookmark:(e,t)=>chrome.bookmarks.create(t),onUpdateBookmark:(e,t,r)=>chrome.bookmarks.update(t,r),onRemoveBookmark:async(e,t,r)=>(r?await chrome.bookmarks.removeTree(t):await chrome.bookmarks.remove(t),!0),onMoveBookmark:(e,t,r)=>chrome.bookmarks.move(t,r),onSearchHistory:(e,t)=>chrome.history.search({text:t?.text??"",...t}),onGetHistoryVisits:(e,t)=>chrome.history.getVisits({url:t?.url??""}),onAddHistoryUrl:async(e,t)=>{t?.url&&await chrome.history.addUrl({url:t.url})},onDeleteHistoryUrl:async(e,t)=>{t?.url&&await chrome.history.deleteUrl({url:t.url})},onDeleteHistoryRange:async(e,t)=>{await chrome.history.deleteRange({startTime:t?.startTime??0,endTime:t?.endTime??Date.now()})},onDeleteAllHistory:async()=>{await chrome.history.deleteAll()},onRuntimeMessage:(e,t)=>chrome.runtime.sendMessage(t),onGetRuntimeContexts:()=>chrome.runtime.getContexts({}),onContainsPermissions:(e,t)=>chrome.permissions.contains(t),onRequestPermissions:(e,t)=>chrome.permissions.request(t),onRemovePermissions:(e,t)=>chrome.permissions.remove(t),onGetAllPermissions:async()=>{let e=await chrome.permissions.getAll();return{permissions:e.permissions??[],origins:e.origins??[]}},onCreateOffscreenDocument:async(e,t)=>{let r=t?.url;es("offscreen.createDocument",`the shared Live Preview carrier cannot host "${r??"an offscreen document"}", because Chrome only loads offscreen documents from the extension that asks for one. Run \`extension dev\` to load this extension as itself, where offscreen documents work normally`)},onCloseOffscreenDocument:async()=>(await chrome.offscreen.closeDocument(),await chrome.offscreen.hasDocument().catch(()=>!1)&&es("offscreen.closeDocument","the offscreen document was still open after closeDocument resolved"),!0),onHasOffscreenDocument:()=>chrome.offscreen.hasDocument(),onGetCookie:(e,t)=>chrome.cookies.get(t),onGetAllCookies:(e,t)=>chrome.cookies.getAll(t),onSetCookie:(e,t)=>chrome.cookies.set(t),onRemoveCookie:(e,t)=>chrome.cookies.remove(t),onExecuteScript:(e,t)=>{let r=ea(t.target?.tabId);return null==r&&es("scripting.executeScript",`target.tabId "${String(t.target?.tabId)}" is not a real tab id`),t.files?.length||es("scripting.executeScript","only the `files` form is supported here; a func/code body cannot be serialized across the bridge into a real page. Ship the code as a file in your extension and pass files: [...]"),chrome.scripting.executeScript({target:{tabId:r},files:t.files})},onInsertCss:async(e,t)=>{let r=ea(t.target?.tabId);(null==r&&es("scripting.insertCSS",`target.tabId "${String(t.target?.tabId)}" is not a real tab id`),t.css)?await chrome.scripting.insertCSS({target:{tabId:r},css:t.css}):t.files?.length?await chrome.scripting.insertCSS({target:{tabId:r},files:t.files}):es("scripting.insertCSS","neither css nor files was given")}}}(e)}}({getGuestAssetUrls:e=>eB.get(e)}),eP=globalThis.crypto?.randomUUID?.()??String(Date.now()),eO=new Set(["TRUSTED_CONTEXTS","TRUSTED_AND_UNTRUSTED_CONTEXTS"]),ej=new Map;async function eG(){try{return(await chrome.windows.getAll({populate:!0})).map(e=>{let t=e.tabs??[],r=t.find(e=>e.active);return{id:e.id??void 0,focused:e.focused,activeTabId:r?.id??"",tabs:t.map(e=>({id:e.id??"",url:e.url??e.pendingUrl??"",title:e.title??"",active:e.active,index:e.index,status:e.status,pinned:e.pinned,discarded:e.discarded,incognito:e.incognito,tabGroupId:e.groupId}))}})}catch{return[]}}async function eL(e){let t,r=Date.now(),n=t=>(eU.recordOutcome({requestId:e.requestId,extensionId:e.extensionId,api:e.api,args:e.args,lane:"real",result:t.result,error:t.error,durationMs:Date.now()-r,source:"frame",...t.refused?{refused:!0}:{}}),t),o=(t=X(e.api,ej.get(e.extensionId)??new Set))?{error:t,refused:!0}:null;if(o)return n(o);let s="tabs.query"===e.api||"tabs.get"===e.api||"windows.getCurrent"===e.api?await eG():[];return new Promise(t=>{let r=!1,o=e=>{r||(r=!0,t(n(e)))};ee({data:e,windows:s,...eq,getDeclaredPermissions:e=>ej.get(e)??new Set,respond:o,source:"frame"}).catch(e=>o({error:e instanceof Error?e.message:"Bridge error"}))})}async function e_(e){let t,r,{extensionId:n,url:o,code:s,css:a,matches:i=[]}=e,l=!0===e.active,c=ej.get(n);if(!(c&&(c.has("scripting")||c.has("activeTab"))))return{ok:!1,error:'This extension does not declare the "scripting" (or "activeTab") permission.'};if(!i.length||!i.some(e=>{let t=function(e){let t;if("<all_urls>"===e)return/^https?:\/\/.*/;let r=/^(\*|https?|file|ftp):\/\/([^/]*)(\/.*)$/.exec(e);if(!r)return null;let[,n="",o="",s=""]=r,a="*"===n?"https?":n.replace(/[.+?^${}()|[\]\\]/g,"\\$&");t="*"===o?"[^/]+":o.startsWith("*.")?`(?:[^/]+\\.)?${o.slice(2).replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")}`:o.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*");let i=s.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return RegExp(`^${a}://${t}${i}$`)}(e);return!!t&&t.test(o)}))return{ok:!1,error:`This extension's content scripts / host permissions do not match ${o}.`};try{t=await chrome.tabs.create({url:o,active:l})}catch(e){return{ok:!1,error:`Could not open the tab: ${String(e)}`}}let d=t.id;if(null==d)return{ok:!1,error:"No tab id."};if(await new Promise(e=>{let t=setTimeout(()=>e(),8e3),r=(n,o)=>{n===d&&"complete"===o.status&&(clearTimeout(t),chrome.tabs.onUpdated.removeListener(r),e())};chrome.tabs.onUpdated.addListener(r)}),a)try{await chrome.scripting.insertCSS({target:{tabId:d},css:a})}catch(e){r=String(e)}let u={tabId:d,active:l};if(!s)return{ok:!0,injected:!1,...u,...r?{cssError:r}:{}};try{let[e]=await chrome.scripting.executeScript({target:{tabId:d},world:"MAIN",func:e=>{try{return(0,eval)(e),{ran:!0}}catch(e){return{ran:!1,error:String(e)}}},args:[s]}),t=e?.result;if(t&&!1===t.ran)return{ok:!0,injected:!1,blocked:!0,reason:t.error,...u,...r?{cssError:r}:{}};return{ok:!0,injected:!0,...u,...r?{cssError:r}:{}}}catch(e){return{ok:!1,error:`Injection failed: ${String(e)}`}}}chrome.runtime.onInstalled.addListener(()=>{}),chrome.runtime.onConnectExternal.addListener(e=>{if(e.name!==eN)return;for(let t of(eR.add(e),eU.events()))try{e.postMessage({type:eM,event:t,backlog:!0})}catch{break}let t=[],r=(r,n)=>{let o=chrome[r],s=o?.[n];if(!s||"function"!=typeof s.addListener)return;let a=(...t)=>((t,r,n)=>{try{e.postMessage({type:eD,namespace:t,event:r,args:n})}catch{}})(r,n,t);s.addListener(a),t.push(()=>s.removeListener(a))};r("storage","onChanged"),r("alarms","onAlarm"),r("tabs","onCreated"),r("tabs","onUpdated"),r("tabs","onRemoved"),r("tabs","onActivated"),r("windows","onCreated"),r("windows","onRemoved"),r("windows","onFocusChanged"),r("bookmarks","onCreated"),r("bookmarks","onChanged"),r("bookmarks","onMoved"),r("bookmarks","onRemoved"),r("history","onVisited"),r("history","onVisitRemoved"),r("downloads","onCreated"),r("downloads","onChanged"),r("downloads","onErased"),r("cookies","onChanged"),r("notifications","onClicked"),r("notifications","onClosed"),r("notifications","onButtonClicked"),r("contextMenus","onClicked"),e.onDisconnect.addListener(()=>{for(let r of(eR.delete(e),t))r()})}),chrome.runtime.onMessageExternal.addListener((e,t,r)=>{if(e?.type===eA)return r({type:eC,version:chrome.runtime.getManifest().version,ready:!0,workerEpoch:eP}),!1;if(e?.type===e$&&"string"==typeof e.extensionId){var n,o;return ej.set(e.extensionId,new Set(Array.isArray(e.permissions)?e.permissions:[])),e.assetUrls&&"object"==typeof e.assetUrls&&eB.set(e.extensionId,e.assetUrls),n=e.extensionId,"string"==typeof(o=e.sessionAccessLevel)&&eO.has(o)&&Promise.resolve(eq.onSetStorageAccessLevel?.(n,"session",o)).catch(()=>void 0),r({ok:!0,workerEpoch:eP}),!1}return e?.type===eT&&e.request?(eL(e.request).then(r),!0):e?.type===eE&&"string"==typeof e.url&&(e_(e).then(r),!0)})})();
263
+ `;ro("manifest.json",JSON.stringify(rs,null,2)),ro("popup.html",ra),ro("popup.js",rl),ro("background.js",rd),rs.name;var ru=JSON.parse('{"chromiumPin":"146.0.7670.0","engineVersion":"0.1.2","sha256":"02a315d7b0aa23ca212626e5abb6720cebd6a3ad7e25c9da2cae8ae9d220decf","tables":{"actionManifestKeys":[["action","action"],["browser_action","browserAction"]],"argumentRules":{"action.setBadgeBackgroundColor":{"missingOptions":"color","optionsArg":0,"props":[{"name":"color","required":true,"type":"stringOrArray"}]},"action.setBadgeText":{"optionsArg":0,"props":[{"name":"text","type":"string"}]},"action.setTitle":{"optionsArg":0,"props":[{"name":"title","type":"string"}]},"contextMenus.create":{"missingOptions":"title","optionsArg":0,"props":[{"name":"id","type":"string"},{"name":"title","onInvalid":"missing","required":true,"type":"nonEmptyString","unless":{"equals":"separator","name":"type"}}]},"downloads.download":{"missingOptions":"url","optionsArg":0,"props":[{"name":"url","presence":"in","required":true,"type":"nonEmptyString"},{"name":"filename","type":"string"}]},"notifications.create":{"missingOptions":"options","optionsArg":"afterOptionalString","props":[{"name":"type","onInvalid":"missing","required":true,"type":"nonEmptyString"},{"name":"iconUrl","onInvalid":"missing","required":true,"type":"nonEmptyString"},{"name":"title","onInvalid":"missing","required":true,"type":"nonEmptyString"},{"name":"message","onInvalid":"missing","required":true,"type":"nonEmptyString"}]},"offscreen.createDocument":{"missingOptions":"url","optionsArg":0,"props":[{"name":"url","onInvalid":"missing","required":true,"type":"nonEmptyString"},{"name":"reasons","onInvalid":"missing","required":true,"type":"array"},{"name":"justification","onInvalid":"missing","required":true,"type":"nonEmptyString"}]},"scripting.executeScript":{"optionsArg":0,"props":[{"enum":["ISOLATED","MAIN"],"name":"world","type":"string","verbatim":"Error in invocation of scripting.executeScript(scripting.ScriptInjection injection, optional function callback): Error at parameter \'injection\': Error at property \'world\': Value must be one of ISOLATED, MAIN."}]},"tabs.create":{"optionsArg":0,"props":[{"name":"url","type":"string"}]}},"contentScriptWireMembers":{"dom":"*","extension":["getURL","inIncognitoContext","lastError","onRequest","sendRequest"],"i18n":"*","runtime":["connect","getManifest","getURL","getVersion","id","onConnect","onMessage","sendMessage"],"scripting":["globalParams"],"storage":"*"},"hostedLimits":{"devtoolsPageMissing":"{api} did not run: Chrome hands chrome.devtools only to the page named by the manifest\'s devtools_page key, and this manifest names none, so the call cannot run here, and it would not run in Chrome after install either. Declare a devtools_page and create panels from it.","devtoolsPanelApis":["devtools.panels.create"],"offscreenCreateRefusal":"offscreen.createDocument did not run: Chrome loads an offscreen document only from the extension that asks for one, and here your extension runs inside a page that is not your extension, so no offscreen document was created and no offscreen script ran. Load this extension in Chrome itself, where offscreen documents work normally."},"mockPolicySyncPaths":["runtime.getURL","runtime.getManifest","extension.getURL","extension.getViews","extension.getBackgroundPage","i18n.getMessage","i18n.getUILanguage","tts.stop","tts.pause","tts.resume","power.requestKeepAwake","power.releaseKeepAwake"],"mockedNamespaces":{"contentSettings":"Stored for read-back; not enforced on guest pages.","debugger":"Attach and detach are real; every sendCommand is refused, not acknowledged.","enterprise.deviceAttributes":"Returns an empty device asset id.","fontSettings":"In-memory settings store; nothing rerenders.","identity":"Signed-out identity: getAuthToken fails, profile info is empty.","instanceID":"Deterministic tokens; no FCM backend, onTokenRefresh never fires.","power":"Keep-awake state is tracked but has no OS effect.","printing":"Synthetic printer list; jobs are acknowledged, nothing prints.","proxy.settings":"Stored for read-back; not applied to network behavior.","system.network":"Returns an empty interface list.","tabCapture":"Synthetic MediaStream (canvas video); not real tab pixels.","topSites":"Synthetic most-visited list; no real browsing profile.","tts":"Routed to page speechSynthesis when available, else silent ack.","userScripts":"Registrations recorded; scripts are not injected into tabs.","webNavigation":"No-op frame/event surface; events never fire."},"namespacePermissions":{"alarms":["alarms"],"bookmarks":["bookmarks"],"contentSettings":["contentSettings"],"contextMenus":["contextMenus"],"cookies":["cookies"],"debugger":["debugger"],"declarativeNetRequest":["declarativeNetRequest","declarativeNetRequestWithHostAccess"],"downloads":["downloads"],"fontSettings":["fontSettings"],"history":["history"],"identity":["identity"],"idle":["idle"],"instanceID":["gcm"],"management":["management"],"mdns":["mdns"],"notifications":["notifications"],"offscreen":["offscreen"],"power":["power"],"printerProvider":["printerProvider"],"printing":["printing"],"privacy":["privacy"],"proxy":["proxy"],"scripting":["scripting","activeTab"],"sidePanel":["sidePanel"],"storage":["storage"],"tabCapture":["tabCapture"],"tabGroups":["tabGroups"],"topSites":["topSites"],"tts":["tts"],"userScripts":["userScripts"],"webNavigation":["webNavigation"],"webRequest":["webRequest"]},"refusedApiPaths":["system.cpu.getInfo","system.memory.getInfo","system.storage.getInfo","system.storage.ejectDevice","system.display.getInfo","system.display.getDisplayLayout","system.display.setDisplayProperties","system.display.setDisplayLayout"],"refusedSubNamespaceGates":{"system.cpu":["system.cpu"],"system.display":["system.display"],"system.memory":["system.memory"],"system.storage":["system.storage"]},"surfaceGatedNamespaces":{"alarms":["alarms"],"bookmarks":["bookmarks"],"contentSettings":["contentSettings"],"contextMenus":["contextMenus"],"cookies":["cookies"],"debugger":["debugger"],"declarativeNetRequest":["declarativeNetRequest","declarativeNetRequestWithHostAccess"],"downloads":["downloads"],"fontSettings":["fontSettings"],"history":["history"],"identity":["identity"],"idle":["idle"],"instanceID":["gcm"],"management":["management"],"mdns":["mdns"],"notifications":["notifications"],"offscreen":["offscreen"],"power":["power"],"printerProvider":["printerProvider"],"printing":["printing"],"privacy":["privacy"],"proxy":["proxy"],"sidePanel":["sidePanel"],"tabCapture":["tabCapture"],"tabGroups":["tabGroups"],"topSites":["topSites"],"tts":["tts"],"userScripts":["userScripts"],"webNavigation":["webNavigation"],"webRequest":["webRequest"]},"synthetic":{"fontDefaults":{"fontList":[{"displayName":"Arial","fontId":"Arial"},{"displayName":"Courier New","fontId":"Courier New"},{"displayName":"Georgia","fontId":"Georgia"},{"displayName":"Helvetica","fontId":"Helvetica"},{"displayName":"Times New Roman","fontId":"Times New Roman"},{"displayName":"Verdana","fontId":"Verdana"}],"sizes":{"defaultFixedFontSize":13,"defaultFontSize":16,"minimumFontSize":0}},"printers":{"info":{"capabilities":{"printer":{"color":{"option":[{"type":"STANDARD_MONOCHROME"},{"is_default":true,"type":"STANDARD_COLOR"}]},"copies":{"default":1,"max":99},"supported_content_type":[{"content_type":"application/pdf"}]},"version":"1.0"},"status":"AVAILABLE"},"list":[{"description":"Virtual printer answered by the emulated engine; jobs are acknowledged, nothing prints","id":"preview-printer","isDefault":true,"name":"Preview Printer","recentlyUsedRank":0,"source":"USER","uri":"ipp://preview.local:631/ipp/print"}]},"tabGroupColors":{"BLUE":"blue","CYAN":"cyan","GREEN":"green","GREY":"grey","ORANGE":"orange","PINK":"pink","PURPLE":"purple","RED":"red","YELLOW":"yellow"},"topSites":[{"title":"Chrome for Developers","url":"https://developer.chrome.com/"},{"title":"MDN Web Docs","url":"https://developer.mozilla.org/"},{"title":"GitHub","url":"https://github.com/"},{"title":"Stack Overflow","url":"https://stackoverflow.com/"},{"title":"Hacker News","url":"https://news.ycombinator.com/"},{"title":"Wikipedia","url":"https://en.wikipedia.org/"},{"title":"YouTube","url":"https://www.youtube.com/"},{"title":"web.dev","url":"https://web.dev/"}]}},"version":1}');let rc=new Set(["https://code.extension.dev","https://themes.extension.dev","https://preview.extension.dev"]),rf=new Set(["localhost","127.0.0.1","[::1]"]),rp=new Set(["3103","3104","3110","3111"]);function rg(e){if(e){if("string"==typeof e.origin&&e.origin)return e.origin;if("string"==typeof e.url&&e.url)try{return new URL(e.url).origin}catch{}}}function rh(e){let t;var r=rg(e);if(!r)return!1;if(rc.has(r))return!0;try{t=new URL(r)}catch{return!1}return"http:"===t.protocol&&!!rf.has(t.hostname)&&rp.has(t.port)}!function(e,t=tW){var r;if(!e||1!==e.version||e.engineVersion!==t.engineVersion||!function(e){if(!tV(e))return!1;for(let t of tJ)if(!(t in e))return!1;let t=e.actionManifestKeys;if(!Array.isArray(t)||0===t.length||!t.every(e=>tH(e)&&2===e.length)||!tz(e.argumentRules,e=>tV(e)&&Array.isArray(e.props))||!tz(e.contentScriptWireMembers,e=>"*"===e||tH(e)))return!1;let r=e.hostedLimits;if(!tV(r)||"string"!=typeof r.devtoolsPageMissing||"string"!=typeof r.offscreenCreateRefusal||!tH(r.devtoolsPanelApis)||!tH(e.mockPolicySyncPaths)||!tz(e.mockedNamespaces,e=>"string"==typeof e))return!1;for(let t of[e.namespacePermissions,e.refusedSubNamespaceGates,e.surfaceGatedNamespaces])if(!tz(t,tH)||0===Object.keys(t).length)return!1;if(!tH(e.refusedApiPaths)||0===e.refusedApiPaths.length)return!1;let n=e.synthetic;return!!tV(n)&&!!tV(n.fontDefaults)&&!!Array.isArray(n.fontDefaults.fontList)&&!!tV(n.fontDefaults.sizes)&&!!tV(n.printers)&&!!tV(n.printers.info)&&!!Array.isArray(n.printers.list)&&!!tz(n.tabGroupColors,e=>"string"==typeof e)&&!!Array.isArray(n.topSites)&&!0}(e.tables))return a().inflight=null,l({state:"refused",tables:null,reason:"malformed"}),d();r=e.tables,a().inflight=null,l({state:"ready",tables:r}),d()}(ru);let{PING:rm,PONG:rb,BRIDGE:rw,SESSION:rv,INJECT:ry,EVENT_PORT:rx,EVENT:rI,TRACE:rk}={PING:"extensiondev:ping",PONG:"extensiondev:pong",BRIDGE:"extensiondev:bridge",SESSION:"extensiondev:session",INJECT:"extensiondev:inject",EVENT_PORT:"extensiondev:events",EVENT:"extensiondev:event",TRACE:"extensiondev:trace"},rS=function(e={}){let t=e.engine??"chromium-emulated",r=e.limit??500,n=e.now??(()=>new Date),i=n().toISOString(),o=[],s=new Set,a=0,l=e=>{for(o.push(e);o.length>r;){let e=o.findIndex(e=>"framework"===e.attribution);o.splice(-1===e?0:e,1)}for(let t of s)t(e);return e};return{recordCall(e,r,i,o){let s=i??[];return l({seq:a+=1,api:e,args:s,extensionId:r,at:n().toISOString(),tier:t3(e),engine:t,policy:o,...!function(e,t=[]){if(!t4.has(e))return!1;for(let e of t)if(t9(e)||e&&"object"==typeof e&&(t9(e.name)||t9(e.type)||t9(e.channel)))return!0;return!1}(e,s)?{}:{attribution:"framework"}})},recordOutcome(e){let r=rn(e.api,e.args),i=o.find(t=>t.extensionId===e.extensionId&&rn(t.api,t.args)===r&&void 0===t.status&&void 0===t.requestId),d={requestId:e.requestId,lane:e.lane,status:void 0===e.error?"ok":"error",error:e.error,result:e.result,durationMs:e.durationMs,laneDowngraded:e.laneDowngraded||void 0,downgradeReason:e.downgradeReason,notForwarded:e.notForwarded||void 0,notForwardedReason:e.notForwardedReason,carrierScoped:!e.refused&&!re(e.error)&&function(e,t){if("real"!==t)return!1;if(t7.has(e))return!0;let r=e.split(".")[0]??"";return t7.has(r)}(e.api,e.lane)||void 0};if(i){Object.assign(i,d),i.tier=rt(e);for(let e of s)e(i);return i}return l({seq:a+=1,api:e.api,args:e.args,extensionId:e.extensionId,at:n().toISOString(),tier:rt(e),engine:t,...d})},events:()=>[...o],snapshot:()=>({engine:t,startedAt:i,events:[...o],counts:function(e){let t={real:0,emulated:0,mocked:0,refused:0},r=0;for(let n of e)t[n.tier??t3(n.api)]+=1,"error"===n.status&&(r+=1);return{total:e.length,byTier:t,errors:r}}(o)}),subscribe:e=>(s.add(e),()=>s.delete(e)),clear(){o.length=0}}}({engine:"chromium-real"}),rA=new Set,rN=new Map,rO=function(e={}){let t={local:{},sync:{},session:{},managed:{}},r=e=>chrome.storage[e??"local"]??chrome.storage.local,n=e=>t[e??"local"]??t.local;for(let e of["local","sync","session","managed"])r(e).get(null).then(t=>{Object.assign(n(e),t)}).catch(()=>void 0);chrome.storage.onChanged.addListener((e,r)=>{if(!(r in t))return;let i=n(r);for(let[t,r]of Object.entries(e))void 0===r.newValue?delete i[t]:i[t]=r.newValue});let i=new Map;return{getStorage:(e,t)=>({...n(t)}),setStorage:(e,t,i)=>(Object.assign(n(i),t),r(i).set(t)),removeStorageKeys:(e,t,i)=>{let o=n(i);for(let e of t)delete o[e];return r(i).remove(t)},clearStorage:(e,t)=>{let i=n(t);for(let e of Object.keys(i))delete i[e];return r(t).clear()},onSetStorageAccessLevel:async(e,t,r)=>{if("session"!==t)return;i.set(e,r);let n=chrome.storage.session;await n.setAccessLevel?.({accessLevel:r})},getSessionStorageAccessLevel:e=>i.get(e),...function(e={}){return{onCreateTab:(e,t)=>chrome.tabs.create({url:e,...t?.active!==void 0?{active:t.active}:{},...t?.pinned!==void 0?{pinned:t.pinned}:{},...t?.index!==void 0?{index:t.index}:{},...t?.windowId!==void 0?{windowId:t.windowId}:{},...t?.openerTabId!==void 0?{openerTabId:t.openerTabId}:{}}),onUpdateTab:(e,t)=>{let r=t8(e);return null!=r?chrome.tabs.update(r,t):chrome.tabs.update(t)},onRemoveTab:e=>{let t=t8(e);return null==t&&t1("tabs.remove",`"${String(e)}" is not a real tab id`),chrome.tabs.remove(t)},onDiscardTab:(e,t)=>{let r=t8(t);return null!=r?chrome.tabs.discard(r):chrome.tabs.discard()},onGroupTabs:async(e,t)=>{let r=Array.isArray(t.tabIds)?t.tabIds:void 0!==t.tabIds?[t.tabIds]:[];return r.length||t1("tabs.group","no tabIds were given to group"),chrome.tabs.group({tabIds:r,...void 0===t.groupId?{}:{groupId:t.groupId}})},onUngroupTabs:(e,t)=>chrome.tabs.ungroup(Array.isArray(t)?t:[t]),onGetWindow:(e,t,r)=>{let n=t5(t);return null==n?chrome.windows.getCurrent(r??{}):chrome.windows.get(n,r??{})},onGetAllWindows:(e,t)=>chrome.windows.getAll(t??{}),onCreateWindow:(e,t)=>chrome.windows.create({url:t}),onUpdateWindow:(e,t,r)=>{let n=t5(t);return null==n?null:chrome.windows.update(n,r)},onRemoveWindow:async(e,t)=>{let r=t5(t);return null!=r&&(await chrome.windows.remove(r),!0)},onOpenSidePanel:async(e,t)=>{let r=t8(t?.tabId);if(null!=r)return void await chrome.sidePanel.open({tabId:r});let n=t5(t?.windowId);if(null!=n)return void await chrome.sidePanel.open({windowId:n});let i=await chrome.windows.getCurrent();null==i.id&&t1("sidePanel.open","there is no focused window to open it in"),await chrome.sidePanel.open({windowId:i.id})},onReloadTab:(e,t,r)=>chrome.tabs.reload(t,{bypassCache:r}),onGetCurrentTab:(e,t)=>t1("tabs.getCurrent",`the carrier cannot know which tab hosts ${t??"the caller"}`),onSetBadgeText:(e,t,r)=>{let n=t8(r);return chrome.action.setBadgeText(null!=n?{text:t??"",tabId:n}:{text:t??""})},onSetBadgeTextColor:(e,t,r)=>{t||t1("action.setBadgeTextColor","no color was given");let n=t8(r);return chrome.action.setBadgeTextColor(null!=n?{color:t,tabId:n}:{color:t})},onSetBadgeBackground:(e,t,r)=>{t||t1("action.setBadgeBackgroundColor","no color was given");let n=t8(r);return chrome.action.setBadgeBackgroundColor(null!=n?{color:t,tabId:n}:{color:t})},onSetActionTitle:(e,t,r)=>{let n=t8(r);return chrome.action.setTitle(null!=n?{title:t??"",tabId:n}:{title:t??""})},onGetActionState:async(e,t)=>{let r=t8(t),n=null!=r?{tabId:r}:{},[i,o,s]=await Promise.all([chrome.action.getBadgeText(n),chrome.action.getBadgeBackgroundColor(n),chrome.action.getTitle(n)]);return{badgeText:i,badgeColor:Array.isArray(o)?`rgba(${o[0]}, ${o[1]}, ${o[2]}, ${(o[3]??255)/255})`:o??void 0,title:s}},onSetActionIcon:async(t,r)=>{r||t1("action.setIcon","no icon path was given");let n=tY(e.getGuestAssetUrls?.(t),r);return n||t1("action.setIcon",`"${r}" is not in this guest's asset map, so the carrier cannot reach it`),chrome.action.setIcon({imageData:await tZ(n)})},onCreateContextMenu:(e,t)=>chrome.contextMenus.create(t),onUpdateContextMenu:async(e,t,r)=>(await chrome.contextMenus.update(t,r),!0),onRemoveContextMenu:async(e,t)=>(await chrome.contextMenus.remove(t),!0),onClearContextMenus:async()=>(await chrome.contextMenus.removeAll(),!0),onCreateNotification:async(t,r,n)=>chrome.notifications.create(r??"",await t0(n??{},e.getGuestAssetUrls?.(t))),onClearNotification:(e,t)=>chrome.notifications.clear(t),onGetNotifications:()=>chrome.notifications.getAll(),onDownload:(e,t)=>chrome.downloads.download(t),onSearchDownloads:(e,t)=>chrome.downloads.search(t??{}),onCancelDownload:async(e,t)=>{await chrome.downloads.cancel(t).catch(()=>void 0)},onPauseDownload:(e,t)=>chrome.downloads.pause(t),onResumeDownload:(e,t)=>chrome.downloads.resume(t),onEraseDownloads:(e,t)=>chrome.downloads.erase(t??{}),onGetBookmarkTree:()=>chrome.bookmarks.getTree(),onGetBookmarks:(e,t)=>chrome.bookmarks.get(t),onGetBookmarkChildren:(e,t)=>t?chrome.bookmarks.getChildren(t):chrome.bookmarks.getTree(),onSearchBookmarks:(e,t)=>chrome.bookmarks.search(t??""),onCreateBookmark:(e,t)=>chrome.bookmarks.create(t),onUpdateBookmark:(e,t,r)=>chrome.bookmarks.update(t,r),onRemoveBookmark:async(e,t,r)=>(r?await chrome.bookmarks.removeTree(t):await chrome.bookmarks.remove(t),!0),onMoveBookmark:(e,t,r)=>chrome.bookmarks.move(t,r),onSearchHistory:(e,t)=>chrome.history.search({text:t?.text??"",...t}),onGetHistoryVisits:(e,t)=>chrome.history.getVisits({url:t?.url??""}),onAddHistoryUrl:async(e,t)=>{t?.url&&await chrome.history.addUrl({url:t.url})},onDeleteHistoryUrl:async(e,t)=>{t?.url&&await chrome.history.deleteUrl({url:t.url})},onDeleteHistoryRange:async(e,t)=>{await chrome.history.deleteRange({startTime:t?.startTime??0,endTime:t?.endTime??Date.now()})},onDeleteAllHistory:async()=>{await chrome.history.deleteAll()},onRuntimeMessage:(e,t)=>chrome.runtime.sendMessage(t),onGetRuntimeContexts:()=>chrome.runtime.getContexts({}),onContainsPermissions:(e,t)=>chrome.permissions.contains(t),onRequestPermissions:(e,t)=>chrome.permissions.request(t),onRemovePermissions:(e,t)=>chrome.permissions.remove(t),onGetAllPermissions:async()=>{let e=await chrome.permissions.getAll();return{permissions:e.permissions??[],origins:e.origins??[]}},onAddHostAccessRequest:(e,t)=>t2("addHostAccessRequest",t),onRemoveHostAccessRequest:(e,t)=>t2("removeHostAccessRequest",t),onCreateOffscreenDocument:async(e,t)=>{let r=t?.url;t1("offscreen.createDocument",`the shared Live Preview carrier cannot host "${r??"an offscreen document"}", because Chrome only loads offscreen documents from the extension that asks for one. Run \`extension dev\` to load this extension as itself, where offscreen documents work normally`)},onCloseOffscreenDocument:async()=>(await chrome.offscreen.closeDocument(),await chrome.offscreen.hasDocument().catch(()=>!1)&&t1("offscreen.closeDocument","the offscreen document was still open after closeDocument resolved"),!0),onHasOffscreenDocument:()=>chrome.offscreen.hasDocument(),onGetCookie:(e,t)=>chrome.cookies.get(t),onGetAllCookies:(e,t)=>chrome.cookies.getAll(t),onSetCookie:(e,t)=>chrome.cookies.set(t),onRemoveCookie:(e,t)=>chrome.cookies.remove(t),onExecuteScript:(e,t)=>{let r=t8(t.target?.tabId);return null==r&&t1("scripting.executeScript",`target.tabId "${String(t.target?.tabId)}" is not a real tab id`),t.files?.length||t1("scripting.executeScript","only the `files` form is supported here; a func/code body cannot be serialized across the bridge into a real page. Ship the code as a file in your extension and pass files: [...]"),chrome.scripting.executeScript({target:{tabId:r},files:t.files})},onInsertCss:async(e,t)=>{let r=t8(t.target?.tabId);(null==r&&t1("scripting.insertCSS",`target.tabId "${String(t.target?.tabId)}" is not a real tab id`),t.css)?await chrome.scripting.insertCSS({target:{tabId:r},css:t.css}):t.files?.length?await chrome.scripting.insertCSS({target:{tabId:r},files:t.files}):t1("scripting.insertCSS","neither css nor files was given")}}}(e)}}({getGuestAssetUrls:e=>rN.get(e)}),rC=globalThis.crypto?.randomUUID?.()??String(Date.now()),r$=new Set(["TRUSTED_CONTEXTS","TRUSTED_AND_UNTRUSTED_CONTEXTS"]),rT=new Map,rE="carrier-session-foreign",rR=new Map;function rD(e){let t=rR.get(e);if(t&&!(Date.now()-t.at>18e5))return t}function r_(){for(let e of[...rR.keys()])rD(e)||rU(e)}function rP(e,t){let r=rD(e);r?.origin===t&&(r.at=Date.now())}function rM(e,t){let r=rD(e);return r?r.origin!==t?{code:rE,error:"That session id belongs to another page. The carrier answers a session only for the origin that registered it."}:null:{code:"carrier-session-unknown",error:"This preview session is not registered with the carrier. Register the session again and retry the call."}}function rU(e){rR.delete(e),rT.delete(e),rN.delete(e)}function rL(e,t){return rD(t)?.origin===e}async function rj(){try{return(await chrome.windows.getAll({populate:!0})).map(e=>{let t=e.tabs??[],r=t.find(e=>e.active);return{id:e.id??void 0,focused:e.focused,activeTabId:r?.id??"",tabs:t.map(e=>({id:e.id??"",url:e.url??e.pendingUrl??"",title:e.title??"",active:e.active,index:e.index,status:e.status,pinned:e.pinned,discarded:e.discarded,incognito:e.incognito,tabGroupId:e.groupId}))}})}catch{return[]}}async function rq(e,t){let r,n=Date.now(),i=t=>(rS.recordOutcome({requestId:e.requestId,extensionId:e.extensionId,api:e.api,args:e.args,lane:"real",result:t.result,error:t.error,durationMs:Date.now()-n,source:"frame",...t.refused?{refused:!0}:{}}),t),o=rM(e.extensionId,t);if(o)return i({error:o.error,refused:!0,code:o.code,workerEpoch:rC});rP(e.extensionId,t);let s=(r=ty(e.api,rT.get(e.extensionId)??new Set))?{error:r,refused:!0}:null;if(s)return i(s);let a="tabs.query"===e.api||"tabs.get"===e.api||"windows.getCurrent"===e.api?await rj():[];return new Promise(t=>{let r=!1,n=e=>{r||(r=!0,t(i(e)))};tq({data:e,windows:a,...rO,getDeclaredPermissions:e=>rT.get(e)??new Set,respond:n,source:"frame"}).catch(e=>n({error:e instanceof Error?e.message:"Bridge error"}))})}async function rB(e,t){let r,n,{extensionId:i,url:o,code:s,css:a,matches:l=[]}=e,d=!0===e.active,u=rM(i,t);if(u)return{ok:!1,error:u.error,code:u.code,workerEpoch:rC};rP(i,t);let c=rT.get(i);if(!(c&&(c.has("scripting")||c.has("activeTab"))))return{ok:!1,error:'This extension does not declare the "scripting" (or "activeTab") permission.'};if(!l.length||!l.some(e=>{let t=function(e){let t;if("<all_urls>"===e)return/^https?:\/\/.*/;let r=/^(\*|https?|file|ftp):\/\/([^/]*)(\/.*)$/.exec(e);if(!r)return null;let[,n="",i="",o=""]=r,s="*"===n?"https?":n.replace(/[.+?^${}()|[\]\\]/g,"\\$&");t="*"===i?"[^/]+":i.startsWith("*.")?`(?:[^/]+\\.)?${i.slice(2).replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")}`:i.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*");let a=o.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return RegExp(`^${s}://${t}${a}$`)}(e);return!!t&&t.test(o)}))return{ok:!1,error:`This extension's content scripts / host permissions do not match ${o}.`};try{r=await chrome.tabs.create({url:o,active:d})}catch(e){return{ok:!1,error:`Could not open the tab: ${String(e)}`}}let f=r.id;if(null==f)return{ok:!1,error:"No tab id."};if(await new Promise(e=>{let t=setTimeout(()=>e(),8e3),r=(n,i)=>{n===f&&"complete"===i.status&&(clearTimeout(t),chrome.tabs.onUpdated.removeListener(r),e())};chrome.tabs.onUpdated.addListener(r)}),a)try{await chrome.scripting.insertCSS({target:{tabId:f},css:a})}catch(e){n=String(e)}let p={tabId:f,active:d};if(!s)return{ok:!0,injected:!1,...p,...n?{cssError:n}:{}};try{let[e]=await chrome.scripting.executeScript({target:{tabId:f},world:"MAIN",func:e=>{try{return(0,eval)(e),{ran:!0}}catch(e){return{ran:!1,error:String(e)}}},args:[s]}),t=e?.result;if(t&&!1===t.ran)return{ok:!0,injected:!1,blocked:!0,reason:t.error,...p,...n?{cssError:n}:{}};return{ok:!0,injected:!0,...p,...n?{cssError:n}:{}}}catch(e){return{ok:!1,error:`Injection failed: ${String(e)}`}}}rS.subscribe(e=>{for(let t of rA)if(rL(t.origin,e.extensionId))try{t.port.postMessage({type:rk,event:e})}catch{rA.delete(t)}}),chrome.runtime.onInstalled.addListener(()=>{}),chrome.runtime.onConnectExternal.addListener(e=>{if(e.name!==rx)return;let t=rg(e.sender);if(r_(),!t||!rh(e.sender))return void e.disconnect();let r={port:e,origin:t};for(let n of(rA.add(r),rS.events()))if(rL(t,n.extensionId))try{e.postMessage({type:rk,event:n,backlog:!0})}catch{break}let n=[],i=(r,i)=>{let o=chrome[r],s=o?.[i];if(!s||"function"!=typeof s.addListener)return;let a=(...n)=>((r,n,i)=>{let o=function(e){let t=[];for(let r of rR.keys()){let n=rD(r);n?.origin===e&&t.push([r,n])}return t}(t);if(0===o.length)return;let s=[];for(let[e,t]of o)2===t.contract&&s.push({type:rI,namespace:r,event:n,extensionId:e,args:"tabs"===r?function(e,t,r){if(null===r)return[...t];let n=t_[e],i=void 0===n?void 0:tP(t[n]);return r&&tR(r,i)?[...t]:t.map(e=>(function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;let t=tS.filter(t=>t in e);if(!t.length)return e;let r={...e};for(let e of t)delete r[e];return r})(e))}(n,i,rT.get(e)??new Set):i});for(let t of(o.some(([,e])=>2!==e.contract)&&s.push({type:rI,namespace:r,event:n,args:i}),s))try{e.postMessage(t)}catch{}})(r,i,n);s.addListener(a),n.push(()=>s.removeListener(a))};i("storage","onChanged"),i("alarms","onAlarm"),i("tabs","onCreated"),i("tabs","onUpdated"),i("tabs","onRemoved"),i("tabs","onActivated"),i("windows","onCreated"),i("windows","onRemoved"),i("windows","onFocusChanged"),i("bookmarks","onCreated"),i("bookmarks","onChanged"),i("bookmarks","onMoved"),i("bookmarks","onRemoved"),i("history","onVisited"),i("history","onVisitRemoved"),i("downloads","onCreated"),i("downloads","onChanged"),i("downloads","onErased"),i("cookies","onChanged"),i("notifications","onClicked"),i("notifications","onClosed"),i("notifications","onButtonClicked"),i("contextMenus","onClicked"),e.onDisconnect.addListener(()=>{for(let e of(rA.delete(r),n))e()})}),chrome.runtime.onMessageExternal.addListener((e,t,r)=>{let n=rg(t);if(r_(),!n||!rh(t))return r({ok:!1,error:"This page is not one the Live Preview carrier answers. The carrier only pairs with extension.dev preview surfaces and their dev servers."}),!1;if(e?.type===rm)return r({type:rb,version:chrome.runtime.getManifest().version,ready:!0,workerEpoch:rC,missingSessions:function(e,t){if(!Array.isArray(e))return[];let r=[];for(let n of e)"string"==typeof n&&(rD(n)?.origin===t?rP(n,t):r.push(n));return r}(e.heldSessions,n)}),!1;if(e?.type===rv&&"string"==typeof e.extensionId){var i,o,s,a,l;let t;if(!0===e.release){let t=rM(e.extensionId,n);return t&&t.code===rE?r({ok:!1,error:t.error,code:t.code}):(rU(e.extensionId),r({ok:!0,released:!0,workerEpoch:rC})),!1}return(i=e.extensionId,(t=rD(i))&&t.origin!==n)?(r({ok:!1,error:"That session id is already registered by another page. Reload the page that owns it, or use a different id."}),!1):(o=e.extensionId,s=2===e.contract?2:1,rR.set(o,{origin:n,at:Date.now(),contract:s}),rT.set(e.extensionId,new Set(Array.isArray(e.permissions)?e.permissions:[])),e.assetUrls&&"object"==typeof e.assetUrls&&rN.set(e.extensionId,e.assetUrls),a=e.extensionId,"string"==typeof(l=e.sessionAccessLevel)&&r$.has(l)&&Promise.resolve(rO.onSetStorageAccessLevel?.(a,"session",l)).catch(()=>void 0),(function(e){if(e===chrome.runtime.id)return Promise.resolve({checked:!0,admitted:!1,reason:"That session id is the Live Preview carrier's own id, so the extension the browser lists under it is the carrier and not the build."});let t=chrome.management;return t?.get?new Promise(r=>{try{t.get(e,t=>{let n=chrome.runtime.lastError;n||!t?r({checked:!0,admitted:!1,reason:`The browser lists no extension under ${e} (${n?.message??"no extension info returned"}), so it has never been asked to load this build.`}):r({checked:!0,admitted:!0===t.enabled,reason:t.enabled?`The browser lists ${t.name} enabled under ${e}, so this build is loaded in the browser.`:`The browser lists ${t.name} under ${e} but it is disabled, so nothing of it is running.`})})}catch(e){r({checked:!1,admitted:!1,reason:`The browser's list of installed extensions could not be read: ${e instanceof Error?e.message:String(e)}.`})}}):Promise.resolve({checked:!1,admitted:!1,reason:"This browser gives the carrier no management API, so the browser's own list of installed extensions could not be read."})})(e.extensionId).then(e=>{r({ok:!0,workerEpoch:rC,admission:e})}),!0)}return e?.type===rw&&e.request?(rq(e.request,n).then(r),!0):e?.type===ry&&"string"==typeof e.url&&(rB(e,n).then(r),!0)})})();
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.0.1",
2
+ "version": "0.0.2",
3
3
  "name": "Extension.dev Live Preview",
4
4
  "author": "Extension.dev",
5
5
  "description": "Lends real browser powers to the extension you are previewing on Extension.dev. Install while building so your popup, content scripts, and APIs run for real.",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@extension.dev/mcp",
3
3
  "type": "module",
4
- "version": "10.10.9",
4
+ "version": "10.10.11",
5
5
  "description": "MCP server that lets AI agents (Claude Code, Claude Desktop, Cursor, Copilot, Codex) build, run, inspect, and publish browser extensions. 32 tools for scaffolding, live DOM inspection, log streaming, and store-ready builds across Chrome, Edge, Firefox, Safari, and every Chromium- or Gecko-based browser (Brave, Opera, Vivaldi, Yandex, Waterfox, LibreWolf). Powered by extension.dev and Extension.js.",
6
6
  "mcpName": "io.github.extensiondev/mcp",
7
7
  "license": "Apache-2.0",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "homepage": "https://extension.dev",
21
21
  "engines": {
22
- "node": ">=20.18"
22
+ "node": ">=22.12"
23
23
  },
24
24
  "packageManager": "pnpm@10.19.0",
25
25
  "exports": {
@@ -49,6 +49,7 @@
49
49
  "LICENSE"
50
50
  ],
51
51
  "scripts": {
52
+ "docs:tools": "WRITE_TOOLS_DOC=1 vitest run src/__tests__/docs-match-the-code.test.ts",
52
53
  "clean": "rm -rf dist",
53
54
  "readme:clients": "UPDATE_README=1 vitest run src/__tests__/readme-clients.test.ts",
54
55
  "watch": "rslib build --watch",
package/server.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
3
3
  "name": "io.github.extensiondev/mcp",
4
- "description": "Build, run, inspect, and publish browser extensions from any MCP client. 32 tools, 11 browsers.",
4
+ "description": "Build, run, inspect, and publish browser extensions from any MCP client. 32 tools, 13 browsers.",
5
5
  "repository": {
6
6
  "url": "https://github.com/extensiondev/mcp",
7
7
  "source": "github"
8
8
  },
9
9
  "websiteUrl": "https://extension.dev",
10
- "version": "10.10.9",
10
+ "version": "10.10.11",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "registryBaseUrl": "https://registry.npmjs.org",
15
15
  "identifier": "@extension.dev/mcp",
16
- "version": "10.10.9",
16
+ "version": "10.10.11",
17
17
  "runtimeHint": "npx",
18
18
  "transport": {
19
19
  "type": "stdio"