@opentabs-dev/browser-extension 0.0.34

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 (305) hide show
  1. package/dist/background-log-state.d.ts +10 -0
  2. package/dist/background-log-state.d.ts.map +1 -0
  3. package/dist/background-log-state.js +11 -0
  4. package/dist/background-log-state.js.map +1 -0
  5. package/dist/background-message-handlers.d.ts +41 -0
  6. package/dist/background-message-handlers.d.ts.map +1 -0
  7. package/dist/background-message-handlers.js +214 -0
  8. package/dist/background-message-handlers.js.map +1 -0
  9. package/dist/background.d.ts +2 -0
  10. package/dist/background.d.ts.map +1 -0
  11. package/dist/background.js +3780 -0
  12. package/dist/background.js.map +1 -0
  13. package/dist/bg-log-state.d.ts +10 -0
  14. package/dist/bg-log-state.d.ts.map +1 -0
  15. package/dist/bg-log-state.js +11 -0
  16. package/dist/bg-log-state.js.map +1 -0
  17. package/dist/browser-commands/content-commands.d.ts +25 -0
  18. package/dist/browser-commands/content-commands.d.ts.map +1 -0
  19. package/dist/browser-commands/content-commands.js +166 -0
  20. package/dist/browser-commands/content-commands.js.map +1 -0
  21. package/dist/browser-commands/cookie-commands.d.ts +14 -0
  22. package/dist/browser-commands/cookie-commands.d.ts.map +1 -0
  23. package/dist/browser-commands/cookie-commands.js +99 -0
  24. package/dist/browser-commands/cookie-commands.js.map +1 -0
  25. package/dist/browser-commands/extension-commands.d.ts +12 -0
  26. package/dist/browser-commands/extension-commands.d.ts.map +1 -0
  27. package/dist/browser-commands/extension-commands.js +386 -0
  28. package/dist/browser-commands/extension-commands.js.map +1 -0
  29. package/dist/browser-commands/helpers.d.ts +35 -0
  30. package/dist/browser-commands/helpers.d.ts.map +1 -0
  31. package/dist/browser-commands/helpers.js +121 -0
  32. package/dist/browser-commands/helpers.js.map +1 -0
  33. package/dist/browser-commands/index.d.ts +11 -0
  34. package/dist/browser-commands/index.d.ts.map +1 -0
  35. package/dist/browser-commands/index.js +10 -0
  36. package/dist/browser-commands/index.js.map +1 -0
  37. package/dist/browser-commands/interaction-commands.d.ts +23 -0
  38. package/dist/browser-commands/interaction-commands.d.ts.map +1 -0
  39. package/dist/browser-commands/interaction-commands.js +353 -0
  40. package/dist/browser-commands/interaction-commands.js.map +1 -0
  41. package/dist/browser-commands/key-press-command.d.ts +2 -0
  42. package/dist/browser-commands/key-press-command.d.ts.map +1 -0
  43. package/dist/browser-commands/key-press-command.js +144 -0
  44. package/dist/browser-commands/key-press-command.js.map +1 -0
  45. package/dist/browser-commands/network-commands.d.ts +6 -0
  46. package/dist/browser-commands/network-commands.d.ts.map +1 -0
  47. package/dist/browser-commands/network-commands.js +69 -0
  48. package/dist/browser-commands/network-commands.js.map +1 -0
  49. package/dist/browser-commands/resource-commands.d.ts +37 -0
  50. package/dist/browser-commands/resource-commands.d.ts.map +1 -0
  51. package/dist/browser-commands/resource-commands.js +153 -0
  52. package/dist/browser-commands/resource-commands.js.map +1 -0
  53. package/dist/browser-commands/scroll-command.d.ts +2 -0
  54. package/dist/browser-commands/scroll-command.d.ts.map +1 -0
  55. package/dist/browser-commands/scroll-command.js +133 -0
  56. package/dist/browser-commands/scroll-command.js.map +1 -0
  57. package/dist/browser-commands/tab-commands.d.ts +33 -0
  58. package/dist/browser-commands/tab-commands.d.ts.map +1 -0
  59. package/dist/browser-commands/tab-commands.js +121 -0
  60. package/dist/browser-commands/tab-commands.js.map +1 -0
  61. package/dist/browser-commands.d.ts +36 -0
  62. package/dist/browser-commands.d.ts.map +1 -0
  63. package/dist/browser-commands.js +1931 -0
  64. package/dist/browser-commands.js.map +1 -0
  65. package/dist/confirmation-badge.d.ts +17 -0
  66. package/dist/confirmation-badge.d.ts.map +1 -0
  67. package/dist/confirmation-badge.js +64 -0
  68. package/dist/confirmation-badge.js.map +1 -0
  69. package/dist/constants.d.ts +79 -0
  70. package/dist/constants.d.ts.map +1 -0
  71. package/dist/constants.js +79 -0
  72. package/dist/constants.js.map +1 -0
  73. package/dist/dispatch-helpers.d.ts +61 -0
  74. package/dist/dispatch-helpers.d.ts.map +1 -0
  75. package/dist/dispatch-helpers.js +149 -0
  76. package/dist/dispatch-helpers.js.map +1 -0
  77. package/dist/extension-messages.d.ts +146 -0
  78. package/dist/extension-messages.d.ts.map +1 -0
  79. package/dist/extension-messages.js +2 -0
  80. package/dist/extension-messages.js.map +1 -0
  81. package/dist/iife-injection.d.ts +55 -0
  82. package/dist/iife-injection.d.ts.map +1 -0
  83. package/dist/iife-injection.js +474 -0
  84. package/dist/iife-injection.js.map +1 -0
  85. package/dist/json-rpc-errors.d.ts +8 -0
  86. package/dist/json-rpc-errors.d.ts.map +1 -0
  87. package/dist/json-rpc-errors.js +8 -0
  88. package/dist/json-rpc-errors.js.map +1 -0
  89. package/dist/known-methods.d.ts +19 -0
  90. package/dist/known-methods.d.ts.map +1 -0
  91. package/dist/known-methods.js +68 -0
  92. package/dist/known-methods.js.map +1 -0
  93. package/dist/log-collector.d.ts +45 -0
  94. package/dist/log-collector.d.ts.map +1 -0
  95. package/dist/log-collector.js +99 -0
  96. package/dist/log-collector.js.map +1 -0
  97. package/dist/message-router.d.ts +28 -0
  98. package/dist/message-router.d.ts.map +1 -0
  99. package/dist/message-router.js +367 -0
  100. package/dist/message-router.js.map +1 -0
  101. package/dist/messaging.d.ts +15 -0
  102. package/dist/messaging.d.ts.map +1 -0
  103. package/dist/messaging.js +41 -0
  104. package/dist/messaging.js.map +1 -0
  105. package/dist/network-capture.d.ts +56 -0
  106. package/dist/network-capture.d.ts.map +1 -0
  107. package/dist/network-capture.js +374 -0
  108. package/dist/network-capture.js.map +1 -0
  109. package/dist/offscreen/index.d.ts +16 -0
  110. package/dist/offscreen/index.d.ts.map +1 -0
  111. package/dist/offscreen/index.js +549 -0
  112. package/dist/offscreen/index.js.map +1 -0
  113. package/dist/plugin-storage.d.ts +19 -0
  114. package/dist/plugin-storage.d.ts.map +1 -0
  115. package/dist/plugin-storage.js +100 -0
  116. package/dist/plugin-storage.js.map +1 -0
  117. package/dist/rate-limiter.d.ts +18 -0
  118. package/dist/rate-limiter.d.ts.map +1 -0
  119. package/dist/rate-limiter.js +53 -0
  120. package/dist/rate-limiter.js.map +1 -0
  121. package/dist/resource-prompt-dispatch.d.ts +14 -0
  122. package/dist/resource-prompt-dispatch.d.ts.map +1 -0
  123. package/dist/resource-prompt-dispatch.js +195 -0
  124. package/dist/resource-prompt-dispatch.js.map +1 -0
  125. package/dist/sanitize-error.d.ts +8 -0
  126. package/dist/sanitize-error.d.ts.map +1 -0
  127. package/dist/sanitize-error.js +25 -0
  128. package/dist/sanitize-error.js.map +1 -0
  129. package/dist/sanitize-svg.d.ts +20 -0
  130. package/dist/sanitize-svg.d.ts.map +1 -0
  131. package/dist/sanitize-svg.js +296 -0
  132. package/dist/sanitize-svg.js.map +1 -0
  133. package/dist/side-panel/App.d.ts +3 -0
  134. package/dist/side-panel/App.d.ts.map +1 -0
  135. package/dist/side-panel/App.js +147 -0
  136. package/dist/side-panel/App.js.map +1 -0
  137. package/dist/side-panel/bridge.d.ts +50 -0
  138. package/dist/side-panel/bridge.d.ts.map +1 -0
  139. package/dist/side-panel/bridge.js +113 -0
  140. package/dist/side-panel/bridge.js.map +1 -0
  141. package/dist/side-panel/components/ConfirmationDialog.d.ts +16 -0
  142. package/dist/side-panel/components/ConfirmationDialog.d.ts.map +1 -0
  143. package/dist/side-panel/components/ConfirmationDialog.js +39 -0
  144. package/dist/side-panel/components/ConfirmationDialog.js.map +1 -0
  145. package/dist/side-panel/components/EmptyStates.d.ts +8 -0
  146. package/dist/side-panel/components/EmptyStates.d.ts.map +1 -0
  147. package/dist/side-panel/components/EmptyStates.js +40 -0
  148. package/dist/side-panel/components/EmptyStates.js.map +1 -0
  149. package/dist/side-panel/components/ErrorBoundary.d.ts +23 -0
  150. package/dist/side-panel/components/ErrorBoundary.d.ts.map +1 -0
  151. package/dist/side-panel/components/ErrorBoundary.js +28 -0
  152. package/dist/side-panel/components/ErrorBoundary.js.map +1 -0
  153. package/dist/side-panel/components/FailedPluginCard.d.ts +6 -0
  154. package/dist/side-panel/components/FailedPluginCard.d.ts.map +1 -0
  155. package/dist/side-panel/components/FailedPluginCard.js +9 -0
  156. package/dist/side-panel/components/FailedPluginCard.js.map +1 -0
  157. package/dist/side-panel/components/Footer.d.ts +3 -0
  158. package/dist/side-panel/components/Footer.d.ts.map +1 -0
  159. package/dist/side-panel/components/Footer.js +32 -0
  160. package/dist/side-panel/components/Footer.js.map +1 -0
  161. package/dist/side-panel/components/Header.d.ts +5 -0
  162. package/dist/side-panel/components/Header.d.ts.map +1 -0
  163. package/dist/side-panel/components/Header.js +6 -0
  164. package/dist/side-panel/components/Header.js.map +1 -0
  165. package/dist/side-panel/components/PluginCard.d.ts +10 -0
  166. package/dist/side-panel/components/PluginCard.d.ts.map +1 -0
  167. package/dist/side-panel/components/PluginCard.js +50 -0
  168. package/dist/side-panel/components/PluginCard.js.map +1 -0
  169. package/dist/side-panel/components/PluginIcon.d.ts +21 -0
  170. package/dist/side-panel/components/PluginIcon.d.ts.map +1 -0
  171. package/dist/side-panel/components/PluginIcon.js +48 -0
  172. package/dist/side-panel/components/PluginIcon.js.map +1 -0
  173. package/dist/side-panel/components/PluginList.d.ts +11 -0
  174. package/dist/side-panel/components/PluginList.d.ts.map +1 -0
  175. package/dist/side-panel/components/PluginList.js +17 -0
  176. package/dist/side-panel/components/PluginList.js.map +1 -0
  177. package/dist/side-panel/components/ToolIcon.d.ts +7 -0
  178. package/dist/side-panel/components/ToolIcon.d.ts.map +1 -0
  179. package/dist/side-panel/components/ToolIcon.js +8 -0
  180. package/dist/side-panel/components/ToolIcon.js.map +1 -0
  181. package/dist/side-panel/components/ToolRow.d.ts +11 -0
  182. package/dist/side-panel/components/ToolRow.d.ts.map +1 -0
  183. package/dist/side-panel/components/ToolRow.js +8 -0
  184. package/dist/side-panel/components/ToolRow.js.map +1 -0
  185. package/dist/side-panel/components/VersionMismatchBanner.d.ts +3 -0
  186. package/dist/side-panel/components/VersionMismatchBanner.d.ts.map +1 -0
  187. package/dist/side-panel/components/VersionMismatchBanner.js +5 -0
  188. package/dist/side-panel/components/VersionMismatchBanner.js.map +1 -0
  189. package/dist/side-panel/components/retro/Accordion.d.ts +8 -0
  190. package/dist/side-panel/components/retro/Accordion.d.ts.map +1 -0
  191. package/dist/side-panel/components/retro/Accordion.js +15 -0
  192. package/dist/side-panel/components/retro/Accordion.js.map +1 -0
  193. package/dist/side-panel/components/retro/Alert.d.ts +25 -0
  194. package/dist/side-panel/components/retro/Alert.d.ts.map +1 -0
  195. package/dist/side-panel/components/retro/Alert.js +33 -0
  196. package/dist/side-panel/components/retro/Alert.js.map +1 -0
  197. package/dist/side-panel/components/retro/Badge.d.ts +15 -0
  198. package/dist/side-panel/components/retro/Badge.d.ts.map +1 -0
  199. package/dist/side-panel/components/retro/Badge.js +23 -0
  200. package/dist/side-panel/components/retro/Badge.js.map +1 -0
  201. package/dist/side-panel/components/retro/Button.d.ts +13 -0
  202. package/dist/side-panel/components/retro/Button.d.ts.map +1 -0
  203. package/dist/side-panel/components/retro/Button.js +33 -0
  204. package/dist/side-panel/components/retro/Button.js.map +1 -0
  205. package/dist/side-panel/components/retro/Empty.d.ts +31 -0
  206. package/dist/side-panel/components/retro/Empty.d.ts.map +1 -0
  207. package/dist/side-panel/components/retro/Empty.js +25 -0
  208. package/dist/side-panel/components/retro/Empty.js.map +1 -0
  209. package/dist/side-panel/components/retro/Input.d.ts +8 -0
  210. package/dist/side-panel/components/retro/Input.d.ts.map +1 -0
  211. package/dist/side-panel/components/retro/Input.js +7 -0
  212. package/dist/side-panel/components/retro/Input.js.map +1 -0
  213. package/dist/side-panel/components/retro/Loader.d.ts +14 -0
  214. package/dist/side-panel/components/retro/Loader.d.ts.map +1 -0
  215. package/dist/side-panel/components/retro/Loader.js +30 -0
  216. package/dist/side-panel/components/retro/Loader.js.map +1 -0
  217. package/dist/side-panel/components/retro/Menu.d.ts +9 -0
  218. package/dist/side-panel/components/retro/Menu.d.ts.map +1 -0
  219. package/dist/side-panel/components/retro/Menu.js +17 -0
  220. package/dist/side-panel/components/retro/Menu.js.map +1 -0
  221. package/dist/side-panel/components/retro/NumberStepper.d.ts +18 -0
  222. package/dist/side-panel/components/retro/NumberStepper.d.ts.map +1 -0
  223. package/dist/side-panel/components/retro/NumberStepper.js +38 -0
  224. package/dist/side-panel/components/retro/NumberStepper.js.map +1 -0
  225. package/dist/side-panel/components/retro/Progress.d.ts +9 -0
  226. package/dist/side-panel/components/retro/Progress.d.ts.map +1 -0
  227. package/dist/side-panel/components/retro/Progress.js +6 -0
  228. package/dist/side-panel/components/retro/Progress.js.map +1 -0
  229. package/dist/side-panel/components/retro/Switch.d.ts +4 -0
  230. package/dist/side-panel/components/retro/Switch.d.ts.map +1 -0
  231. package/dist/side-panel/components/retro/Switch.js +6 -0
  232. package/dist/side-panel/components/retro/Switch.js.map +1 -0
  233. package/dist/side-panel/components/retro/Text.d.ts +11 -0
  234. package/dist/side-panel/components/retro/Text.d.ts.map +1 -0
  235. package/dist/side-panel/components/retro/Text.js +28 -0
  236. package/dist/side-panel/components/retro/Text.js.map +1 -0
  237. package/dist/side-panel/components/retro/Tooltip.d.ts +12 -0
  238. package/dist/side-panel/components/retro/Tooltip.d.ts.map +1 -0
  239. package/dist/side-panel/components/retro/Tooltip.js +32 -0
  240. package/dist/side-panel/components/retro/Tooltip.js.map +1 -0
  241. package/dist/side-panel/constants.d.ts +5 -0
  242. package/dist/side-panel/constants.d.ts.map +1 -0
  243. package/dist/side-panel/constants.js +5 -0
  244. package/dist/side-panel/constants.js.map +1 -0
  245. package/dist/side-panel/hooks/useServerNotifications.d.ts +21 -0
  246. package/dist/side-panel/hooks/useServerNotifications.d.ts.map +1 -0
  247. package/dist/side-panel/hooks/useServerNotifications.js +93 -0
  248. package/dist/side-panel/hooks/useServerNotifications.js.map +1 -0
  249. package/dist/side-panel/hooks/useTheme.d.ts +8 -0
  250. package/dist/side-panel/hooks/useTheme.d.ts.map +1 -0
  251. package/dist/side-panel/hooks/useTheme.js +30 -0
  252. package/dist/side-panel/hooks/useTheme.js.map +1 -0
  253. package/dist/side-panel/index.d.ts +2 -0
  254. package/dist/side-panel/index.d.ts.map +1 -0
  255. package/dist/side-panel/index.js +12 -0
  256. package/dist/side-panel/index.js.map +1 -0
  257. package/dist/side-panel/lib/cn.d.ts +3 -0
  258. package/dist/side-panel/lib/cn.d.ts.map +1 -0
  259. package/dist/side-panel/lib/cn.js +4 -0
  260. package/dist/side-panel/lib/cn.js.map +1 -0
  261. package/dist/side-panel/lib/utils.d.ts +3 -0
  262. package/dist/side-panel/lib/utils.d.ts.map +1 -0
  263. package/dist/side-panel/lib/utils.js +4 -0
  264. package/dist/side-panel/lib/utils.js.map +1 -0
  265. package/dist/side-panel/side-panel.js +78034 -0
  266. package/dist/side-panel/styles.css +2 -0
  267. package/dist/side-panel-state.d.ts +11 -0
  268. package/dist/side-panel-state.d.ts.map +1 -0
  269. package/dist/side-panel-state.js +38 -0
  270. package/dist/side-panel-state.js.map +1 -0
  271. package/dist/side-panel-toggle.d.ts +3 -0
  272. package/dist/side-panel-toggle.d.ts.map +1 -0
  273. package/dist/side-panel-toggle.js +31 -0
  274. package/dist/side-panel-toggle.js.map +1 -0
  275. package/dist/tab-matching.d.ts +51 -0
  276. package/dist/tab-matching.d.ts.map +1 -0
  277. package/dist/tab-matching.js +160 -0
  278. package/dist/tab-matching.js.map +1 -0
  279. package/dist/tab-state.d.ts +56 -0
  280. package/dist/tab-state.d.ts.map +1 -0
  281. package/dist/tab-state.js +282 -0
  282. package/dist/tab-state.js.map +1 -0
  283. package/dist/tool-dispatch.d.ts +19 -0
  284. package/dist/tool-dispatch.d.ts.map +1 -0
  285. package/dist/tool-dispatch.js +336 -0
  286. package/dist/tool-dispatch.js.map +1 -0
  287. package/dist/types.d.ts +82 -0
  288. package/dist/types.d.ts.map +1 -0
  289. package/dist/types.js +2 -0
  290. package/dist/types.js.map +1 -0
  291. package/icons/icon-128.png +0 -0
  292. package/icons/icon-16.png +0 -0
  293. package/icons/icon-32.png +0 -0
  294. package/icons/icon-48.png +0 -0
  295. package/icons/icon.svg +6 -0
  296. package/manifest.json +38 -0
  297. package/offscreen/offscreen.html +10 -0
  298. package/package.json +49 -0
  299. package/side-panel/dark-mode.js +29 -0
  300. package/side-panel/fonts/archivo-black-latin.woff2 +0 -0
  301. package/side-panel/fonts/space-grotesk-latin.woff2 +0 -0
  302. package/side-panel/fonts/space-mono-400-latin.woff2 +0 -0
  303. package/side-panel/fonts/space-mono-700-latin.woff2 +0 -0
  304. package/side-panel/fonts.css +34 -0
  305. package/side-panel/side-panel.html +16 -0
@@ -0,0 +1,474 @@
1
+ import { INJECTION_RETRY_DELAY_MS, isValidPluginName } from './constants.js';
2
+ import { getAllPluginMeta } from './plugin-storage.js';
3
+ import { urlMatchesPatterns } from './tab-matching.js';
4
+ import { toErrorMessage } from '@opentabs-dev/shared';
5
+ /** Names reserved for platform use — rejected at the injection layer as defense-in-depth */
6
+ const RESERVED_NAMES = new Set(['system', 'browser', 'opentabs', 'extension', 'config', 'plugin', 'tool', 'mcp']);
7
+ const isSafePluginName = (name) => isValidPluginName(name) && !RESERVED_NAMES.has(name);
8
+ /** Check if an adapter for the given plugin is already injected in a tab */
9
+ const isAdapterPresent = async (tabId, pluginName) => {
10
+ try {
11
+ const results = await chrome.scripting.executeScript({
12
+ target: { tabId },
13
+ world: 'MAIN',
14
+ func: (pName) => {
15
+ const ot = globalThis.__openTabs;
16
+ return ot?.adapters?.[pName] !== undefined;
17
+ },
18
+ args: [pluginName],
19
+ });
20
+ const first = results[0];
21
+ return first?.result === true;
22
+ }
23
+ catch (err) {
24
+ console.warn(`[opentabs] isAdapterPresent failed for tab ${String(tabId)}, plugin ${pluginName}:`, err);
25
+ return false;
26
+ }
27
+ };
28
+ /**
29
+ * Verify that the injected adapter reports the expected version.
30
+ * Returns true if versions match, false on mismatch or failure.
31
+ * Logs a warning on mismatch so the injection pipeline continues.
32
+ */
33
+ const verifyAdapterVersion = async (tabId, pluginName, expectedVersion) => {
34
+ try {
35
+ const results = await chrome.scripting.executeScript({
36
+ target: { tabId },
37
+ world: 'MAIN',
38
+ func: (pName) => {
39
+ const ot = globalThis.__openTabs;
40
+ return ot?.adapters?.[pName]?.version;
41
+ },
42
+ args: [pluginName],
43
+ });
44
+ const first = results[0];
45
+ const version = first?.result;
46
+ if (version !== expectedVersion) {
47
+ console.warn(`[opentabs] Adapter version mismatch for ${pluginName}: expected ${expectedVersion}, got ${String(version)}`);
48
+ return false;
49
+ }
50
+ return true;
51
+ }
52
+ catch {
53
+ console.warn(`[opentabs] Failed to verify adapter version for ${pluginName}`);
54
+ return false;
55
+ }
56
+ };
57
+ /** Read the adapter hash from the page for a given plugin. Returns undefined on failure. */
58
+ const readAdapterHash = async (tabId, pluginName) => {
59
+ try {
60
+ const results = await chrome.scripting.executeScript({
61
+ target: { tabId },
62
+ world: 'MAIN',
63
+ func: (pName) => {
64
+ const ot = globalThis.__openTabs;
65
+ return ot?.adapters?.[pName]?.__adapterHash;
66
+ },
67
+ args: [pluginName],
68
+ });
69
+ const first = results[0];
70
+ return typeof first?.result === 'string' ? first.result : undefined;
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ };
76
+ /**
77
+ * Verify that the injected adapter's content hash matches the expected hash.
78
+ * Returns true if hashes match, false otherwise. Does not throw.
79
+ */
80
+ const verifyAdapterHash = async (tabId, pluginName, expectedHash) => {
81
+ const hash = await readAdapterHash(tabId, pluginName);
82
+ return hash === expectedHash;
83
+ };
84
+ /**
85
+ * Inject a log relay listener into a tab's ISOLATED world.
86
+ * Listens for 'opentabs:plugin-logs' postMessages from the MAIN world adapter
87
+ * and forwards batched log entries to the background via chrome.runtime.sendMessage.
88
+ *
89
+ * A per-tab cryptographic nonce prevents malicious page scripts from spoofing
90
+ * log entries. The nonce is generated here and shared with both worlds:
91
+ * - ISOLATED world: validates `data.nonce` on every received postMessage
92
+ * - MAIN world: stored on `globalThis.__openTabs._logNonce`, read by the
93
+ * adapter IIFE's flushLogs() and included in every postMessage call
94
+ */
95
+ const injectLogRelay = async (tabId) => {
96
+ const nonce = crypto.randomUUID();
97
+ try {
98
+ // 1. Install the ISOLATED world listener with the nonce for validation
99
+ await chrome.scripting.executeScript({
100
+ target: { tabId },
101
+ world: 'ISOLATED',
102
+ func: (n) => {
103
+ // Idempotent guard: only register the listener once per tab.
104
+ // When re-invoked (e.g., on re-injection), the existing listener
105
+ // stays in place — the new nonce is injected into MAIN world so
106
+ // the adapter picks it up, and the ISOLATED listener accepts
107
+ // messages with ANY previously registered nonce via a Set.
108
+ const guard = '__opentabs_log_relay';
109
+ const win = window;
110
+ if (win[guard]) {
111
+ // Add the new nonce to the accepted set
112
+ const nonceSet = win.__opentabs_log_nonces;
113
+ if (nonceSet)
114
+ nonceSet.add(n);
115
+ return;
116
+ }
117
+ win[guard] = true;
118
+ const nonces = new Set([n]);
119
+ win.__opentabs_log_nonces = nonces;
120
+ window.addEventListener('message', event => {
121
+ if (event.source !== window)
122
+ return;
123
+ const data = event.data;
124
+ if (!data || data.type !== 'opentabs:plugin-logs')
125
+ return;
126
+ if (typeof data.nonce !== 'string' || !nonces.has(data.nonce))
127
+ return;
128
+ const plugin = data.plugin;
129
+ const entries = data.entries;
130
+ if (typeof plugin !== 'string' || !Array.isArray(entries) || entries.length === 0)
131
+ return;
132
+ chrome.runtime.sendMessage({ type: 'plugin:logs', plugin, entries }).catch(() => {
133
+ // Background may not be listening — drop silently
134
+ });
135
+ });
136
+ },
137
+ args: [nonce],
138
+ });
139
+ // 2. Inject the nonce into MAIN world on globalThis.__openTabs._logNonce.
140
+ // The adapter IIFE reads this value in its flushLogs() function and
141
+ // includes it in every postMessage call. On re-injection, the nonce is
142
+ // updated so the adapter picks up the new value on the next flush.
143
+ await chrome.scripting.executeScript({
144
+ target: { tabId },
145
+ world: 'MAIN',
146
+ func: (n) => {
147
+ const ot = (globalThis.__openTabs ?? {});
148
+ globalThis.__openTabs = ot;
149
+ ot._logNonce = n;
150
+ },
151
+ args: [nonce],
152
+ });
153
+ }
154
+ catch (err) {
155
+ console.warn(`[opentabs] injectLogRelay failed for tab ${String(tabId)}:`, err);
156
+ }
157
+ };
158
+ /**
159
+ * Inject an adapter file into a single tab via chrome.scripting.executeScript.
160
+ *
161
+ * Uses content-hashed filenames so each adapter version gets a unique path,
162
+ * bypassing Chrome's aggressive caching of executeScript({ files }) content.
163
+ * The `files` option bypasses all page CSP restrictions because file-based
164
+ * injection is not subject to page CSP.
165
+ */
166
+ const injectAdapterFile = async (tabId, pluginName, version, adapterHash, adapterFilePath) => {
167
+ // Inject the log relay in ISOLATED world before the adapter IIFE (MAIN world)
168
+ // so postMessage listeners are in place when the adapter starts logging.
169
+ await injectLogRelay(tabId);
170
+ const adapterFile = adapterFilePath ?? `adapters/${pluginName}.js`;
171
+ try {
172
+ await chrome.scripting.executeScript({
173
+ target: { tabId },
174
+ world: 'MAIN',
175
+ files: [adapterFile],
176
+ });
177
+ }
178
+ catch (err) {
179
+ throw new Error(`Failed to inject adapter file '${adapterFile}' into tab ${String(tabId)}: ${toErrorMessage(err)}`);
180
+ }
181
+ if (version) {
182
+ await verifyAdapterVersion(tabId, pluginName, version);
183
+ }
184
+ if (adapterHash) {
185
+ const hashMatched = await verifyAdapterHash(tabId, pluginName, adapterHash);
186
+ if (!hashMatched) {
187
+ // Retry once after a short delay — the file may have been partially written
188
+ await new Promise(resolve => setTimeout(resolve, INJECTION_RETRY_DELAY_MS));
189
+ try {
190
+ await chrome.scripting.executeScript({
191
+ target: { tabId },
192
+ world: 'MAIN',
193
+ files: [adapterFile],
194
+ });
195
+ }
196
+ catch (err) {
197
+ throw new Error(`Failed to re-inject adapter file '${adapterFile}' into tab ${String(tabId)}: ${toErrorMessage(err)}`);
198
+ }
199
+ if (version) {
200
+ await verifyAdapterVersion(tabId, pluginName, version);
201
+ }
202
+ const retryMatched = await verifyAdapterHash(tabId, pluginName, adapterHash);
203
+ if (!retryMatched) {
204
+ const actualHash = await readAdapterHash(tabId, pluginName);
205
+ throw new Error(`Adapter hash mismatch for ${pluginName} after retry: expected ${adapterHash}, got ${String(actualHash)}`);
206
+ }
207
+ }
208
+ }
209
+ };
210
+ /**
211
+ * Collect all unique tab IDs matching the given URL patterns.
212
+ * Queries each pattern independently and deduplicates by tab ID.
213
+ */
214
+ const queryMatchingTabIds = async (urlPatterns) => {
215
+ const tabIds = new Set();
216
+ for (const pattern of urlPatterns) {
217
+ try {
218
+ const tabs = await chrome.tabs.query({ url: pattern });
219
+ for (const tab of tabs) {
220
+ if (tab.id !== undefined) {
221
+ tabIds.add(tab.id);
222
+ }
223
+ }
224
+ }
225
+ catch (err) {
226
+ console.warn(`[opentabs] chrome.tabs.query failed for pattern ${pattern}:`, err);
227
+ }
228
+ }
229
+ return Array.from(tabIds);
230
+ };
231
+ /**
232
+ * Call an adapter's teardown() function in a tab via chrome.scripting.executeScript.
233
+ * Swallows errors — the injection pipeline continues regardless of teardown outcome.
234
+ */
235
+ const teardownAdapterInTab = async (tabId, pluginName) => {
236
+ await chrome.scripting
237
+ .executeScript({
238
+ target: { tabId },
239
+ world: 'MAIN',
240
+ func: (pName) => {
241
+ const ot = globalThis.__openTabs;
242
+ const adapter = ot?.adapters?.[pName];
243
+ if (adapter && typeof adapter.teardown === 'function') {
244
+ try {
245
+ adapter.teardown();
246
+ }
247
+ catch (e) {
248
+ console.warn('[opentabs] teardown error:', e);
249
+ }
250
+ }
251
+ },
252
+ args: [pluginName],
253
+ })
254
+ .catch((err) => {
255
+ console.warn(`[opentabs] adapter teardown script failed for ${pluginName}:`, err);
256
+ });
257
+ };
258
+ /**
259
+ * Replace a tab's frozen `__openTabs` container with a mutable copy,
260
+ * preserving all adapter entries (including the one about to be re-injected).
261
+ *
262
+ * The `hashAndFreeze` snippet (appended by the plugin build) makes
263
+ * `__openTabs.adapters` non-writable and `adapters[pluginName]` non-configurable.
264
+ * When the adapter IIFE runs during re-injection, its entry code
265
+ * (`globalThis.__openTabs.adapters = globalThis.__openTabs.adapters || {}`)
266
+ * throws `TypeError: Cannot assign to read only property 'adapters'` in
267
+ * strict mode. This function rebuilds `__openTabs` and `adapters` as fresh
268
+ * mutable objects so the IIFE can initialize without errors.
269
+ *
270
+ * The target plugin's adapter entry is preserved (as a writable property) so
271
+ * the IIFE wrapper's own teardown logic can find the existing adapter, call
272
+ * `onDeactivate()` and `teardown()`, then replace it — maintaining the correct
273
+ * lifecycle hook ordering (constructor clears stale markers, then teardown sets
274
+ * fresh markers).
275
+ */
276
+ const prepareForReinjection = async (tabId) => {
277
+ await chrome.scripting
278
+ .executeScript({
279
+ target: { tabId },
280
+ world: 'MAIN',
281
+ func: () => {
282
+ const ot = globalThis.__openTabs;
283
+ if (!ot)
284
+ return;
285
+ const adapters = ot.adapters;
286
+ if (!adapters)
287
+ return;
288
+ // Build a new adapters object preserving all entries. Each adapter's
289
+ // value is copied directly (the frozen adapter object stays frozen for
290
+ // integrity), but the PROPERTY on the new container is writable +
291
+ // configurable so the IIFE wrapper can delete/replace it.
292
+ const newAdapters = {};
293
+ for (const key of Object.keys(adapters)) {
294
+ newAdapters[key] = adapters[key];
295
+ }
296
+ // Build a new __openTabs object, copying all non-adapters properties.
297
+ const newOt = {};
298
+ for (const key of Object.keys(ot)) {
299
+ if (key === 'adapters')
300
+ continue;
301
+ const desc = Object.getOwnPropertyDescriptor(ot, key);
302
+ if (desc)
303
+ Object.defineProperty(newOt, key, desc);
304
+ }
305
+ newOt.adapters = newAdapters;
306
+ // Replace globalThis.__openTabs with the new mutable container
307
+ globalThis.__openTabs = newOt;
308
+ },
309
+ args: [],
310
+ })
311
+ .catch((err) => {
312
+ console.warn(`[opentabs] prepareForReinjection failed:`, err);
313
+ });
314
+ };
315
+ /**
316
+ * Injects a plugin's adapter IIFE into all tabs matching its URL patterns.
317
+ *
318
+ * @param pluginName - The plugin's unique name (validated against reserved names)
319
+ * @param urlPatterns - Chrome match patterns identifying which tabs to inject into
320
+ * @param forceReinject - When `true`, re-inject even if the adapter is already
321
+ * present (used by plugin.update to overwrite stale adapter code). When `false`
322
+ * (default), tabs that already have the adapter are skipped.
323
+ * @param version - Expected adapter version string for post-injection verification
324
+ * @param adapterHash - Expected content hash for post-injection integrity check
325
+ * @param adapterFile - Relative path to the content-hashed adapter file (e.g., "adapters/my-plugin-a1b2c3d4.js")
326
+ * @returns Tab IDs where injection succeeded
327
+ */
328
+ const injectPluginIntoMatchingTabs = async (pluginName, urlPatterns, forceReinject = false, version, adapterHash, adapterFile) => {
329
+ if (!isSafePluginName(pluginName)) {
330
+ console.warn(`[opentabs] Skipping injection for unsafe plugin name: ${pluginName}`);
331
+ return [];
332
+ }
333
+ const tabIds = await queryMatchingTabIds(urlPatterns);
334
+ // Process all tabs in parallel: check presence + inject
335
+ const results = await Promise.allSettled(tabIds.map(async (tabId) => {
336
+ if (!forceReinject && (await isAdapterPresent(tabId, pluginName))) {
337
+ return tabId;
338
+ }
339
+ // Replace frozen __openTabs/adapters with mutable copies so the new
340
+ // IIFE can initialize. The IIFE wrapper handles its own teardown
341
+ // lifecycle (onDeactivate → teardown → delete → install new adapter)
342
+ // in the correct order, so we do NOT call teardownAdapterInTab here.
343
+ if (forceReinject) {
344
+ await prepareForReinjection(tabId);
345
+ }
346
+ await injectAdapterFile(tabId, pluginName, version, adapterHash, adapterFile);
347
+ return tabId;
348
+ }));
349
+ const injectedTabIds = [];
350
+ for (const result of results) {
351
+ if (result.status === 'fulfilled') {
352
+ injectedTabIds.push(result.value);
353
+ }
354
+ }
355
+ return injectedTabIds;
356
+ };
357
+ /**
358
+ * Injects all stored plugins whose URL patterns match the given tab.
359
+ * Called on `chrome.tabs.onUpdated` (status=complete) so that tabs opened
360
+ * after `sync.full` still get their adapter files.
361
+ *
362
+ * @param tabId - The Chrome tab ID to inject adapters into
363
+ * @param tabUrl - The tab's current URL, used to filter plugins by URL pattern match
364
+ */
365
+ const injectPluginsIntoTab = async (tabId, tabUrl) => {
366
+ const index = await getAllPluginMeta();
367
+ const plugins = Object.values(index);
368
+ if (plugins.length === 0)
369
+ return;
370
+ // Filter to plugins whose URL patterns match this tab and have safe names
371
+ const matching = plugins.filter(p => isSafePluginName(p.name) && urlMatchesPatterns(tabUrl, p.urlPatterns));
372
+ if (matching.length === 0)
373
+ return;
374
+ // Check presence for all matching plugins in parallel
375
+ const presenceResults = await Promise.allSettled(matching.map(async (plugin) => ({
376
+ plugin,
377
+ present: await isAdapterPresent(tabId, plugin.name),
378
+ })));
379
+ const needsInjection = presenceResults
380
+ .filter((r) => r.status === 'fulfilled' && !r.value.present)
381
+ .map(r => r.value.plugin);
382
+ if (needsInjection.length === 0)
383
+ return;
384
+ // Inject all needed plugins in parallel
385
+ await Promise.allSettled(needsInjection.map(async (plugin) => {
386
+ try {
387
+ await injectAdapterFile(tabId, plugin.name, plugin.version, plugin.adapterHash, plugin.adapterFile);
388
+ }
389
+ catch (err) {
390
+ console.warn(`[opentabs] Injection failed for tab ${String(tabId)}, plugin ${plugin.name}:`, err);
391
+ }
392
+ }));
393
+ };
394
+ /**
395
+ * Removes an injected adapter from all tabs matching the plugin's URL patterns.
396
+ * Calls the adapter's `teardown()` function and deletes it from `__openTabs.adapters`.
397
+ *
398
+ * @param pluginName - The plugin whose adapter should be removed
399
+ * @param urlPatterns - Chrome match patterns identifying which tabs to clean up
400
+ */
401
+ const cleanupAdaptersInMatchingTabs = async (pluginName, urlPatterns) => {
402
+ if (!isSafePluginName(pluginName)) {
403
+ console.warn(`[opentabs] Skipping cleanup for unsafe plugin name: ${pluginName}`);
404
+ return;
405
+ }
406
+ const tabIds = await queryMatchingTabIds(urlPatterns);
407
+ // Run cleanup scripts in parallel across all matching tabs
408
+ await Promise.allSettled(tabIds.map(async (tabId) => {
409
+ try {
410
+ await chrome.scripting.executeScript({
411
+ target: { tabId },
412
+ world: 'MAIN',
413
+ func: (pName) => {
414
+ const ot = globalThis.__openTabs;
415
+ const adapters = ot?.adapters;
416
+ if (!adapters)
417
+ return;
418
+ const adapter = adapters[pName];
419
+ if (adapter) {
420
+ if (typeof adapter.teardown === 'function') {
421
+ try {
422
+ adapter.teardown();
423
+ }
424
+ catch (e) {
425
+ console.warn('[opentabs] teardown error:', e);
426
+ }
427
+ }
428
+ // Attempt deletion; if the property is non-configurable (locked
429
+ // by hashAndFreeze), rebuild the adapters container without the
430
+ // removed plugin and replace __openTabs on globalThis.
431
+ if (!Reflect.deleteProperty(adapters, pName)) {
432
+ const newAdapters = {};
433
+ for (const key of Object.keys(adapters)) {
434
+ if (key !== pName) {
435
+ const desc = Object.getOwnPropertyDescriptor(adapters, key);
436
+ if (desc)
437
+ Object.defineProperty(newAdapters, key, desc);
438
+ }
439
+ }
440
+ delete globalThis.__openTabs;
441
+ globalThis.__openTabs = Object.assign({}, ot, {
442
+ adapters: newAdapters,
443
+ });
444
+ }
445
+ }
446
+ },
447
+ args: [pluginName],
448
+ });
449
+ }
450
+ catch (err) {
451
+ console.warn(`[opentabs] Cleanup failed for tab ${String(tabId)}, plugin ${pluginName}:`, err);
452
+ }
453
+ }));
454
+ };
455
+ /**
456
+ * Re-injects all stored plugins into their matching tabs on extension startup.
457
+ * Runs all plugin injections in parallel, logging warnings for any failures.
458
+ */
459
+ const reinjectStoredPlugins = async () => {
460
+ const index = await getAllPluginMeta();
461
+ const plugins = Object.values(index);
462
+ if (plugins.length === 0)
463
+ return;
464
+ const results = await Promise.allSettled(plugins.map(plugin => injectPluginIntoMatchingTabs(plugin.name, plugin.urlPatterns, false, plugin.version, plugin.adapterHash, plugin.adapterFile)));
465
+ for (let i = 0; i < results.length; i++) {
466
+ const result = results[i];
467
+ if (result && result.status === 'rejected') {
468
+ const plugin = plugins[i];
469
+ console.warn(`[opentabs] Failed to reinject stored plugin ${plugin?.name ?? 'unknown'}:`, result.reason);
470
+ }
471
+ }
472
+ };
473
+ export { cleanupAdaptersInMatchingTabs, injectPluginIntoMatchingTabs, injectPluginsIntoTab, isSafePluginName, queryMatchingTabIds, reinjectStoredPlugins, teardownAdapterInTab, verifyAdapterVersion, };
474
+ //# sourceMappingURL=iife-injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iife-injection.js","sourceRoot":"","sources":["../src/iife-injection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** JSON-RPC 2.0 standard error codes */
2
+ export declare const JSONRPC_METHOD_NOT_FOUND = -32601;
3
+ export declare const JSONRPC_INVALID_PARAMS = -32602;
4
+ export declare const JSONRPC_INTERNAL_ERROR = -32603;
5
+ /** Application-defined JSON-RPC error codes (reserved range -32000 to -32099) */
6
+ export declare const JSONRPC_NO_USABLE_TAB = -32001;
7
+ export declare const JSONRPC_ADAPTER_NOT_READY = -32002;
8
+ //# sourceMappingURL=json-rpc-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc-errors.d.ts","sourceRoot":"","sources":["../src/json-rpc-errors.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAE7C,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAC5C,eAAO,MAAM,yBAAyB,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** JSON-RPC 2.0 standard error codes */
2
+ export const JSONRPC_METHOD_NOT_FOUND = -32601;
3
+ export const JSONRPC_INVALID_PARAMS = -32602;
4
+ export const JSONRPC_INTERNAL_ERROR = -32603;
5
+ /** Application-defined JSON-RPC error codes (reserved range -32000 to -32099) */
6
+ export const JSONRPC_NO_USABLE_TAB = -32001;
7
+ export const JSONRPC_ADAPTER_NOT_READY = -32002;
8
+ //# sourceMappingURL=json-rpc-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc-errors.js","sourceRoot":"","sources":["../src/json-rpc-errors.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,CAAC;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;AAE7C,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAK,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Canonical list of JSON-RPC methods the browser extension handles.
3
+ *
4
+ * Both the offscreen document's ALLOWED_METHODS allowlist and the background
5
+ * script's methodHandlers dispatch table derive from these constants, ensuring
6
+ * they stay in sync. A unit test verifies the invariant.
7
+ */
8
+ /** Methods routed to handlers in the background script's dispatch table */
9
+ export declare const DISPATCH_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect"];
10
+ /**
11
+ * Methods allowed through the offscreen WebSocket filter but NOT routed to
12
+ * a handler in methodHandlers. These are either:
13
+ * - handled directly by the offscreen document (pong)
14
+ * - forwarded to the side panel without a dispatch handler (invocation events)
15
+ */
16
+ export declare const PASSTHROUGH_METHODS: readonly ["pong", "tool.invocationStart", "tool.invocationEnd", "confirmation.request", "plugins.changed"];
17
+ /** All methods the offscreen document allows through the WebSocket filter */
18
+ export declare const ALL_ALLOWED_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect", "pong", "tool.invocationStart", "tool.invocationEnd", "confirmation.request", "plugins.changed"];
19
+ //# sourceMappingURL=known-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-methods.d.ts","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,68BA2CnB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,4GAMtB,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,8iCAAyD,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Canonical list of JSON-RPC methods the browser extension handles.
3
+ *
4
+ * Both the offscreen document's ALLOWED_METHODS allowlist and the background
5
+ * script's methodHandlers dispatch table derive from these constants, ensuring
6
+ * they stay in sync. A unit test verifies the invariant.
7
+ */
8
+ /** Methods routed to handlers in the background script's dispatch table */
9
+ export const DISPATCH_METHODS = [
10
+ 'sync.full',
11
+ 'plugin.update',
12
+ 'plugin.uninstall',
13
+ 'tool.dispatch',
14
+ 'resource.read',
15
+ 'prompt.get',
16
+ 'browser.listTabs',
17
+ 'browser.openTab',
18
+ 'browser.closeTab',
19
+ 'browser.navigateTab',
20
+ 'browser.focusTab',
21
+ 'browser.getTabInfo',
22
+ 'browser.screenshotTab',
23
+ 'browser.getTabContent',
24
+ 'browser.getPageHtml',
25
+ 'browser.getStorage',
26
+ 'browser.clickElement',
27
+ 'browser.typeText',
28
+ 'browser.selectOption',
29
+ 'browser.waitForElement',
30
+ 'browser.queryElements',
31
+ 'browser.getCookies',
32
+ 'browser.setCookie',
33
+ 'browser.deleteCookies',
34
+ 'browser.enableNetworkCapture',
35
+ 'browser.getNetworkRequests',
36
+ 'browser.disableNetworkCapture',
37
+ 'browser.getConsoleLogs',
38
+ 'browser.clearConsoleLogs',
39
+ 'browser.executeScript',
40
+ 'browser.listResources',
41
+ 'browser.getResourceContent',
42
+ 'browser.pressKey',
43
+ 'browser.scroll',
44
+ 'browser.hoverElement',
45
+ 'browser.handleDialog',
46
+ 'extension.reload',
47
+ 'extension.getState',
48
+ 'extension.getLogs',
49
+ 'extension.getSidePanel',
50
+ 'extension.checkAdapter',
51
+ 'extension.forceReconnect',
52
+ ];
53
+ /**
54
+ * Methods allowed through the offscreen WebSocket filter but NOT routed to
55
+ * a handler in methodHandlers. These are either:
56
+ * - handled directly by the offscreen document (pong)
57
+ * - forwarded to the side panel without a dispatch handler (invocation events)
58
+ */
59
+ export const PASSTHROUGH_METHODS = [
60
+ 'pong',
61
+ 'tool.invocationStart',
62
+ 'tool.invocationEnd',
63
+ 'confirmation.request',
64
+ 'plugins.changed',
65
+ ];
66
+ /** All methods the offscreen document allows through the WebSocket filter */
67
+ export const ALL_ALLOWED_METHODS = [...DISPATCH_METHODS, ...PASSTHROUGH_METHODS];
68
+ //# sourceMappingURL=known-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-methods.js","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,oBAAoB;IACpB,uBAAuB;IACvB,uBAAuB;IACvB,qBAAqB;IACrB,oBAAoB;IACpB,sBAAsB;IACtB,kBAAkB;IAClB,sBAAsB;IACtB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,8BAA8B;IAC9B,4BAA4B;IAC5B,+BAA+B;IAC/B,wBAAwB;IACxB,0BAA0B;IAC1B,uBAAuB;IACvB,uBAAuB;IACvB,4BAA4B;IAC5B,kBAAkB;IAClB,gBAAgB;IAChB,sBAAsB;IACtB,sBAAsB;IACtB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,wBAAwB;IACxB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM;IACN,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IACtB,iBAAiB;CACT,CAAC;AAEX,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,mBAAmB,CAAU,CAAC"}