@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,549 @@
1
+ // dist/constants.js
2
+ var DEFAULT_SERVER_PORT = 9515;
3
+ var MAX_INPUT_SIZE = 10 * 1024 * 1024;
4
+ var WS_CLOSE_PONG_TIMEOUT = 4e3;
5
+ var WS_CLOSE_AUTH_FAILED = 4001;
6
+ var WS_INFO_TIMEOUT_MS = 3e3;
7
+ var buildWsUrl = (port) => `ws://localhost:${port}/ws`;
8
+
9
+ // dist/known-methods.js
10
+ var DISPATCH_METHODS = [
11
+ "sync.full",
12
+ "plugin.update",
13
+ "plugin.uninstall",
14
+ "tool.dispatch",
15
+ "resource.read",
16
+ "prompt.get",
17
+ "browser.listTabs",
18
+ "browser.openTab",
19
+ "browser.closeTab",
20
+ "browser.navigateTab",
21
+ "browser.focusTab",
22
+ "browser.getTabInfo",
23
+ "browser.screenshotTab",
24
+ "browser.getTabContent",
25
+ "browser.getPageHtml",
26
+ "browser.getStorage",
27
+ "browser.clickElement",
28
+ "browser.typeText",
29
+ "browser.selectOption",
30
+ "browser.waitForElement",
31
+ "browser.queryElements",
32
+ "browser.getCookies",
33
+ "browser.setCookie",
34
+ "browser.deleteCookies",
35
+ "browser.enableNetworkCapture",
36
+ "browser.getNetworkRequests",
37
+ "browser.disableNetworkCapture",
38
+ "browser.getConsoleLogs",
39
+ "browser.clearConsoleLogs",
40
+ "browser.executeScript",
41
+ "browser.listResources",
42
+ "browser.getResourceContent",
43
+ "browser.pressKey",
44
+ "browser.scroll",
45
+ "browser.hoverElement",
46
+ "browser.handleDialog",
47
+ "extension.reload",
48
+ "extension.getState",
49
+ "extension.getLogs",
50
+ "extension.getSidePanel",
51
+ "extension.checkAdapter",
52
+ "extension.forceReconnect"
53
+ ];
54
+ var PASSTHROUGH_METHODS = [
55
+ "pong",
56
+ "tool.invocationStart",
57
+ "tool.invocationEnd",
58
+ "confirmation.request",
59
+ "plugins.changed"
60
+ ];
61
+ var ALL_ALLOWED_METHODS = [...DISPATCH_METHODS, ...PASSTHROUGH_METHODS];
62
+
63
+ // dist/log-collector.js
64
+ var MAX_MESSAGE_LENGTH = 2e3;
65
+ var DEFAULT_MAX_ENTRIES = 500;
66
+ var formatArg = (arg) => {
67
+ if (typeof arg === "string")
68
+ return arg;
69
+ if (arg instanceof Error)
70
+ return `${arg.message}${arg.stack ? `
71
+ ${arg.stack}` : ""}`;
72
+ try {
73
+ return JSON.stringify(arg);
74
+ } catch {
75
+ return String(arg);
76
+ }
77
+ };
78
+ var formatMessage = (args) => {
79
+ const raw = args.map(formatArg).join(" ");
80
+ return raw.length > MAX_MESSAGE_LENGTH ? raw.slice(0, MAX_MESSAGE_LENGTH) : raw;
81
+ };
82
+ var LogCollector = class {
83
+ buffer = [];
84
+ maxEntries;
85
+ source;
86
+ totalCaptured = 0;
87
+ constructor(source, maxEntries = DEFAULT_MAX_ENTRIES) {
88
+ this.source = source;
89
+ this.maxEntries = maxEntries;
90
+ }
91
+ capture(level, args) {
92
+ const entry = {
93
+ timestamp: Date.now(),
94
+ level,
95
+ source: this.source,
96
+ message: formatMessage(args)
97
+ };
98
+ if (this.buffer.length >= this.maxEntries) {
99
+ this.buffer.shift();
100
+ }
101
+ this.buffer.push(entry);
102
+ this.totalCaptured++;
103
+ }
104
+ getEntries(options) {
105
+ let entries = this.buffer;
106
+ if (options?.level) {
107
+ const level = options.level;
108
+ entries = entries.filter((e) => e.level === level);
109
+ }
110
+ if (options?.source) {
111
+ const source = options.source;
112
+ entries = entries.filter((e) => e.source === source);
113
+ }
114
+ if (options?.since !== void 0) {
115
+ const since = options.since;
116
+ entries = entries.filter((e) => e.timestamp >= since);
117
+ }
118
+ const result = [...entries].reverse();
119
+ if (options?.limit !== void 0 && options.limit > 0) {
120
+ return result.slice(0, options.limit);
121
+ }
122
+ return result;
123
+ }
124
+ clear() {
125
+ this.buffer.length = 0;
126
+ }
127
+ getStats() {
128
+ const oldest = this.buffer[0];
129
+ const newest = this.buffer[this.buffer.length - 1];
130
+ return {
131
+ totalCaptured: this.totalCaptured,
132
+ bufferSize: this.buffer.length,
133
+ oldestTimestamp: oldest?.timestamp ?? null,
134
+ newestTimestamp: newest?.timestamp ?? null
135
+ };
136
+ }
137
+ };
138
+ var installLogCollector = (source, maxEntries) => {
139
+ const collector = new LogCollector(source, maxEntries);
140
+ const levels = ["log", "warn", "error", "info"];
141
+ for (const level of levels) {
142
+ const original = console[level].bind(console);
143
+ console[level] = (...args) => {
144
+ collector.capture(level, args);
145
+ original(...args);
146
+ };
147
+ }
148
+ return collector;
149
+ };
150
+
151
+ // dist/offscreen/index.js
152
+ var offscreenLogCollector = installLogCollector("offscreen");
153
+ var DEFAULT_MCP_SERVER_URL = buildWsUrl(DEFAULT_SERVER_PORT);
154
+ var INITIAL_BACKOFF_MS = 1e3;
155
+ var MAX_BACKOFF_MS = 3e4;
156
+ var BACKOFF_MULTIPLIER = 2;
157
+ var PING_INTERVAL_MS = 15e3;
158
+ var PONG_TIMEOUT_MS = 5e3;
159
+ var ALLOWED_METHODS = new Set(ALL_ALLOWED_METHODS);
160
+ var isValidWsOrigin = (wsUrl, httpBase) => {
161
+ try {
162
+ const parsed = new URL(wsUrl);
163
+ if (parsed.protocol !== "ws:" && parsed.protocol !== "wss:") {
164
+ console.warn(`[opentabs:offscreen] Rejected wsUrl with invalid protocol: ${parsed.protocol}`);
165
+ return false;
166
+ }
167
+ const source = new URL(httpBase);
168
+ if (parsed.host !== source.host) {
169
+ console.warn(`[opentabs:offscreen] Rejected wsUrl with mismatched host: ${parsed.host} (expected ${source.host})`);
170
+ return false;
171
+ }
172
+ if (parsed.pathname !== "/ws") {
173
+ console.warn(`[opentabs:offscreen] Rejected wsUrl with invalid path: ${parsed.pathname}`);
174
+ return false;
175
+ }
176
+ return true;
177
+ } catch {
178
+ console.warn("[opentabs:offscreen] Rejected wsUrl: failed to parse URL");
179
+ return false;
180
+ }
181
+ };
182
+ var wsToHttpBase = (wsUrl) => wsUrl.replace(/^ws/, "http").replace(/\/ws$/, "");
183
+ var fetchWsInfo = async (httpBase) => {
184
+ try {
185
+ const headers = {};
186
+ if (wsSecret)
187
+ headers["Authorization"] = `Bearer ${wsSecret}`;
188
+ let res = await fetch(`${httpBase}/ws-info`, {
189
+ headers,
190
+ signal: AbortSignal.timeout(WS_INFO_TIMEOUT_MS),
191
+ cache: "no-store"
192
+ });
193
+ if (res.status === 401) {
194
+ await bootstrapFromAuthFile();
195
+ const retryHeaders = {};
196
+ if (wsSecret)
197
+ retryHeaders["Authorization"] = `Bearer ${wsSecret}`;
198
+ res = await fetch(`${httpBase}/ws-info`, {
199
+ headers: retryHeaders,
200
+ signal: AbortSignal.timeout(WS_INFO_TIMEOUT_MS),
201
+ cache: "no-store"
202
+ });
203
+ }
204
+ if (res.status === 401)
205
+ return { reason: "auth_failed" };
206
+ return { response: res };
207
+ } catch {
208
+ return { reason: "connection_refused" };
209
+ }
210
+ };
211
+ var disconnectAndReconnect = (closeReason) => {
212
+ backoffMs = INITIAL_BACKOFF_MS;
213
+ if (ws) {
214
+ try {
215
+ ws.close(1e3, closeReason);
216
+ } catch {
217
+ }
218
+ } else if (reconnectTimeoutId !== null) {
219
+ clearTimeout(reconnectTimeoutId);
220
+ reconnectTimeoutId = null;
221
+ void connect();
222
+ } else {
223
+ void connect();
224
+ }
225
+ };
226
+ var mcpServerUrl = DEFAULT_MCP_SERVER_URL;
227
+ var wsSecret = null;
228
+ var ws = null;
229
+ var backoffMs = INITIAL_BACKOFF_MS;
230
+ var pingIntervalId = null;
231
+ var reconnectTimeoutId = null;
232
+ var pongWatchdogId = null;
233
+ var awaitingPong = false;
234
+ var reconnectScheduledByWatchdog = false;
235
+ var connecting = false;
236
+ var lastDisconnectReason;
237
+ var sendToBackground = (message) => {
238
+ chrome.runtime.sendMessage(message).catch(() => {
239
+ });
240
+ };
241
+ var clearPingInterval = () => {
242
+ if (pingIntervalId !== null) {
243
+ clearInterval(pingIntervalId);
244
+ pingIntervalId = null;
245
+ }
246
+ };
247
+ var clearPongWatchdog = () => {
248
+ if (pongWatchdogId !== null) {
249
+ clearTimeout(pongWatchdogId);
250
+ pongWatchdogId = null;
251
+ }
252
+ awaitingPong = false;
253
+ };
254
+ var onPongReceived = () => {
255
+ clearPongWatchdog();
256
+ };
257
+ var sendPing = () => {
258
+ if (!ws || ws.readyState !== WebSocket.OPEN)
259
+ return;
260
+ if (awaitingPong)
261
+ return;
262
+ ws.send(JSON.stringify({ jsonrpc: "2.0", method: "ping" }));
263
+ awaitingPong = true;
264
+ pongWatchdogId = setTimeout(() => {
265
+ pongWatchdogId = null;
266
+ if (!awaitingPong)
267
+ return;
268
+ console.warn("[opentabs:offscreen] Pong timeout \u2014 connection is dead (likely server hot reload). Forcing reconnect.");
269
+ awaitingPong = false;
270
+ if (ws) {
271
+ reconnectScheduledByWatchdog = true;
272
+ try {
273
+ ws.close(WS_CLOSE_PONG_TIMEOUT, "Pong timeout");
274
+ } catch {
275
+ }
276
+ ws = null;
277
+ clearPingInterval();
278
+ lastDisconnectReason = "timeout";
279
+ sendToBackground({
280
+ type: "ws:state",
281
+ connected: false,
282
+ disconnectReason: "timeout"
283
+ });
284
+ scheduleReconnect();
285
+ }
286
+ }, PONG_TIMEOUT_MS);
287
+ };
288
+ var startPingInterval = () => {
289
+ clearPingInterval();
290
+ clearPongWatchdog();
291
+ pingIntervalId = setInterval(sendPing, PING_INTERVAL_MS);
292
+ };
293
+ var scheduleReconnect = () => {
294
+ if (reconnectTimeoutId !== null) {
295
+ clearTimeout(reconnectTimeoutId);
296
+ }
297
+ const delay = backoffMs;
298
+ reconnectTimeoutId = setTimeout(() => {
299
+ reconnectTimeoutId = null;
300
+ void connect();
301
+ }, delay);
302
+ backoffMs = Math.min(backoffMs * BACKOFF_MULTIPLIER, MAX_BACKOFF_MS);
303
+ };
304
+ var refreshWsUrl = async () => {
305
+ const httpBase = wsToHttpBase(mcpServerUrl);
306
+ const result = await fetchWsInfo(httpBase);
307
+ if ("reason" in result)
308
+ return result.reason;
309
+ const res = result.response;
310
+ if (res.ok) {
311
+ const wsInfo = await res.json();
312
+ if (typeof wsInfo.wsUrl === "string" && wsInfo.wsUrl !== "" && wsInfo.wsUrl !== mcpServerUrl) {
313
+ if (isValidWsOrigin(wsInfo.wsUrl, httpBase)) {
314
+ mcpServerUrl = wsInfo.wsUrl;
315
+ }
316
+ }
317
+ }
318
+ return void 0;
319
+ };
320
+ var connect = async () => {
321
+ if (connecting || ws?.readyState === WebSocket.OPEN || ws?.readyState === WebSocket.CONNECTING) {
322
+ return;
323
+ }
324
+ connecting = true;
325
+ try {
326
+ const reason = await refreshWsUrl();
327
+ if (reason) {
328
+ lastDisconnectReason = reason;
329
+ sendToBackground({ type: "ws:state", connected: false, disconnectReason: reason });
330
+ scheduleReconnect();
331
+ return;
332
+ }
333
+ const protocols = ["opentabs"];
334
+ if (wsSecret)
335
+ protocols.push(wsSecret);
336
+ ws = protocols.length > 1 ? new WebSocket(mcpServerUrl, protocols) : new WebSocket(mcpServerUrl);
337
+ } catch {
338
+ lastDisconnectReason = "connection_refused";
339
+ sendToBackground({
340
+ type: "ws:state",
341
+ connected: false,
342
+ disconnectReason: "connection_refused"
343
+ });
344
+ scheduleReconnect();
345
+ return;
346
+ } finally {
347
+ connecting = false;
348
+ }
349
+ ws.onopen = () => {
350
+ backoffMs = INITIAL_BACKOFF_MS;
351
+ lastDisconnectReason = void 0;
352
+ startPingInterval();
353
+ sendToBackground({ type: "ws:state", connected: true });
354
+ };
355
+ ws.onmessage = (event) => {
356
+ if (typeof event.data !== "string") {
357
+ console.warn("[opentabs:offscreen] Received non-string WebSocket message, discarding");
358
+ return;
359
+ }
360
+ const text = event.data;
361
+ try {
362
+ const parsed = JSON.parse(text);
363
+ if (typeof parsed !== "object" || parsed === null)
364
+ return;
365
+ const msg = parsed;
366
+ if (msg.method === "pong") {
367
+ onPongReceived();
368
+ return;
369
+ }
370
+ const method = msg.method;
371
+ const hasId = "id" in msg;
372
+ if (method && !ALLOWED_METHODS.has(method)) {
373
+ console.warn(`[opentabs:offscreen] Dropping message with unknown method: ${method}`);
374
+ return;
375
+ }
376
+ if (!method && !hasId) {
377
+ console.warn("[opentabs:offscreen] Dropping message with neither method nor id");
378
+ return;
379
+ }
380
+ sendToBackground({ type: "ws:message", data: msg });
381
+ } catch {
382
+ console.warn("[opentabs:offscreen] Failed to parse WebSocket message as JSON");
383
+ }
384
+ };
385
+ ws.onclose = (event) => {
386
+ if (!ws) {
387
+ reconnectScheduledByWatchdog = false;
388
+ return;
389
+ }
390
+ ws = null;
391
+ clearPingInterval();
392
+ clearPongWatchdog();
393
+ if (event.code === WS_CLOSE_AUTH_FAILED) {
394
+ lastDisconnectReason = "auth_failed";
395
+ } else if (!lastDisconnectReason) {
396
+ lastDisconnectReason = "connection_refused";
397
+ }
398
+ sendToBackground({
399
+ type: "ws:state",
400
+ connected: false,
401
+ disconnectReason: lastDisconnectReason
402
+ });
403
+ if (reconnectScheduledByWatchdog) {
404
+ reconnectScheduledByWatchdog = false;
405
+ return;
406
+ }
407
+ scheduleReconnect();
408
+ };
409
+ ws.onerror = () => {
410
+ };
411
+ };
412
+ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
413
+ if (sender.id !== chrome.runtime.id)
414
+ return false;
415
+ switch (message.type) {
416
+ case "ws:send": {
417
+ if (ws?.readyState === WebSocket.OPEN) {
418
+ ws.send(JSON.stringify(message.data));
419
+ sendResponse({ sent: true });
420
+ } else {
421
+ sendResponse({ sent: false, reason: "not connected" });
422
+ }
423
+ break;
424
+ }
425
+ case "ws:getState": {
426
+ const isConnected = ws?.readyState === WebSocket.OPEN;
427
+ sendResponse({
428
+ connected: isConnected,
429
+ disconnectReason: isConnected ? void 0 : lastDisconnectReason
430
+ });
431
+ break;
432
+ }
433
+ case "ws:setUrl": {
434
+ void (async () => {
435
+ const rawUrl = message.url;
436
+ try {
437
+ const parsed = new URL(rawUrl);
438
+ if (parsed.protocol !== "ws:" && parsed.protocol !== "wss:") {
439
+ console.warn(`[opentabs:offscreen] Rejected ws:setUrl with invalid protocol: ${parsed.protocol}`);
440
+ sendResponse({ ok: false, reason: "Invalid WebSocket protocol" });
441
+ return;
442
+ }
443
+ } catch {
444
+ console.warn("[opentabs:offscreen] Rejected ws:setUrl: invalid URL format");
445
+ sendResponse({ ok: false, reason: "Invalid URL format" });
446
+ return;
447
+ }
448
+ const httpBase = wsToHttpBase(rawUrl);
449
+ let resolvedUrl = rawUrl;
450
+ const result = await fetchWsInfo(httpBase);
451
+ if ("response" in result && result.response.ok) {
452
+ const wsInfo = await result.response.json();
453
+ if (typeof wsInfo.wsUrl === "string" && wsInfo.wsUrl !== "") {
454
+ if (isValidWsOrigin(wsInfo.wsUrl, httpBase)) {
455
+ resolvedUrl = wsInfo.wsUrl;
456
+ } else {
457
+ sendResponse({ ok: false, reason: "WebSocket URL origin mismatch" });
458
+ return;
459
+ }
460
+ } else if (typeof wsInfo.wsUrl === "string") {
461
+ console.warn("[opentabs:offscreen] /ws-info returned empty wsUrl, using fallback URL");
462
+ }
463
+ }
464
+ if (!isValidWsOrigin(resolvedUrl, httpBase)) {
465
+ sendResponse({ ok: false, reason: "WebSocket URL origin mismatch" });
466
+ return;
467
+ }
468
+ if (resolvedUrl !== mcpServerUrl) {
469
+ console.log(`[opentabs:offscreen] MCP server URL changed to ${resolvedUrl}`);
470
+ mcpServerUrl = resolvedUrl;
471
+ disconnectAndReconnect("URL changed");
472
+ }
473
+ sendResponse({ ok: true });
474
+ })();
475
+ return true;
476
+ }
477
+ case "offscreen:getLogs": {
478
+ sendResponse({
479
+ entries: offscreenLogCollector.getEntries(message.options),
480
+ stats: offscreenLogCollector.getStats()
481
+ });
482
+ break;
483
+ }
484
+ case "bg:forceReconnect": {
485
+ disconnectAndReconnect("Force reconnect");
486
+ sendResponse({ ok: true });
487
+ break;
488
+ }
489
+ case "port-changed": {
490
+ const newUrl = buildWsUrl(message.port);
491
+ if (newUrl !== mcpServerUrl) {
492
+ console.log(`[opentabs:offscreen] Port changed to ${message.port}, reconnecting`);
493
+ mcpServerUrl = newUrl;
494
+ disconnectAndReconnect("Port changed");
495
+ }
496
+ sendResponse({ ok: true });
497
+ break;
498
+ }
499
+ // Messages handled by the background script or side panel — not processed here.
500
+ case "offscreen:getUrl":
501
+ case "ws:state":
502
+ case "ws:message":
503
+ case "bg:send":
504
+ case "bg:getConnectionState":
505
+ case "plugin:logs":
506
+ case "tool:progress":
507
+ case "sp:getState":
508
+ case "sp:connectionState":
509
+ case "sp:serverMessage":
510
+ case "sp:confirmationRequest":
511
+ case "sp:confirmationResponse":
512
+ case "sp:confirmationTimeout":
513
+ break;
514
+ }
515
+ return void 0;
516
+ });
517
+ var bootstrapFromAuthFile = async () => {
518
+ try {
519
+ const authUrl = `${chrome.runtime.getURL("auth.json")}?_t=${Date.now()}`;
520
+ const res = await fetch(authUrl, { signal: AbortSignal.timeout(1e3), cache: "no-store" });
521
+ if (res.ok) {
522
+ const auth = await res.json();
523
+ if (typeof auth.secret === "string" && auth.secret !== "") {
524
+ wsSecret = auth.secret;
525
+ }
526
+ }
527
+ } catch {
528
+ }
529
+ };
530
+ void (async () => {
531
+ await bootstrapFromAuthFile();
532
+ try {
533
+ const response = await new Promise((resolve) => {
534
+ chrome.runtime.sendMessage({ type: "offscreen:getUrl" }, (resp) => {
535
+ if (chrome.runtime.lastError) {
536
+ resolve(void 0);
537
+ return;
538
+ }
539
+ resolve(resp);
540
+ });
541
+ });
542
+ if (response?.url && typeof response.url === "string" && response.url !== mcpServerUrl) {
543
+ mcpServerUrl = response.url;
544
+ }
545
+ } catch {
546
+ }
547
+ console.log(`[opentabs:offscreen] Connecting to ${mcpServerUrl}`);
548
+ void connect();
549
+ })();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/offscreen/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { PluginMeta } from './extension-messages.js';
2
+ /**
3
+ * Store a batch of plugins in a single chrome.storage.local.set() call.
4
+ * Builds the full meta index in memory and writes the meta index atomically.
5
+ */
6
+ declare const storePluginsBatch: (metas: PluginMeta[]) => Promise<void>;
7
+ declare const removePlugin: (pluginName: string) => Promise<void>;
8
+ /**
9
+ * Remove multiple plugins in a single batched operation.
10
+ * Reads the meta index once, removes all named plugins, then writes the
11
+ * updated index in one call.
12
+ */
13
+ declare const removePluginsBatch: (pluginNames: string[]) => Promise<void>;
14
+ declare const getAllPluginMeta: () => Promise<Record<string, PluginMeta>>;
15
+ declare const getPluginMeta: (pluginName: string) => Promise<PluginMeta | undefined>;
16
+ /** Invalidate the in-memory cache, forcing the next read to hit chrome.storage.local. */
17
+ declare const invalidatePluginCache: () => void;
18
+ export { storePluginsBatch, removePlugin, removePluginsBatch, getAllPluginMeta, getPluginMeta, invalidatePluginCache };
19
+ //# sourceMappingURL=plugin-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-storage.d.ts","sourceRoot":"","sources":["../src/plugin-storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAsB1D;;;GAGG;AACH,QAAA,MAAM,iBAAiB,GAAI,OAAO,UAAU,EAAE,KAAG,OAAO,CAAC,IAAI,CAWzD,CAAC;AAEL,QAAA,MAAM,YAAY,GAAI,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAOnD,CAAC;AAEL;;;;GAIG;AACH,QAAA,MAAM,kBAAkB,GAAI,aAAa,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAa5D,CAAC;AAiBL,QAAA,MAAM,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAsBpE,CAAC;AAEF,QAAA,MAAM,aAAa,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAG/E,CAAC;AAEF,yFAAyF;AACzF,QAAA,MAAM,qBAAqB,QAAO,IAEjC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC"}