@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,386 @@
1
+ import { requireStringParam, requireTabId, sendErrorResult, sendSuccessResult, sendValidationError, } from './helpers.js';
2
+ import { bgLogCollector } from '../background-log-state.js';
3
+ import { buildWsUrl, DEFAULT_LOG_LIMIT, DEFAULT_SERVER_PORT, EXEC_MAX_ASYNC_WAIT_MS, EXEC_POLL_INTERVAL_MS, EXEC_RESULT_TRUNCATION_LIMIT, IS_READY_TIMEOUT_MS, SCRIPT_TIMEOUT_MS, SERVER_PORT_KEY, SIDE_PANEL_TIMEOUT_MS, WS_CONNECTED_KEY, WS_FLUSH_DELAY_MS, } from '../constants.js';
4
+ import { getActiveCapturesSummary } from '../network-capture.js';
5
+ import { getAllPluginMeta, getPluginMeta } from '../plugin-storage.js';
6
+ import { findAllMatchingTabs } from '../tab-matching.js';
7
+ import { getLastKnownStates } from '../tab-state.js';
8
+ export const handleExtensionGetState = async (id) => {
9
+ try {
10
+ // Connection state from chrome.storage.session
11
+ const sessionData = await chrome.storage.session
12
+ .get(WS_CONNECTED_KEY)
13
+ .catch(() => ({}));
14
+ const wsConnected = typeof sessionData[WS_CONNECTED_KEY] === 'boolean' ? sessionData[WS_CONNECTED_KEY] : false;
15
+ // MCP server URL derived from port in chrome.storage.local
16
+ const localData = await chrome.storage.local
17
+ .get(SERVER_PORT_KEY)
18
+ .catch(() => ({}));
19
+ const port = typeof localData[SERVER_PORT_KEY] === 'number' && localData[SERVER_PORT_KEY] > 0
20
+ ? localData[SERVER_PORT_KEY]
21
+ : DEFAULT_SERVER_PORT;
22
+ const mcpServerUrl = buildWsUrl(port);
23
+ // Plugin metadata with tab states
24
+ const pluginIndex = await getAllPluginMeta();
25
+ const lastKnownStates = getLastKnownStates();
26
+ const plugins = Object.values(pluginIndex).map(meta => ({
27
+ name: meta.name,
28
+ version: meta.version,
29
+ displayName: meta.displayName,
30
+ urlPatterns: meta.urlPatterns,
31
+ toolCount: meta.tools.length,
32
+ tabState: lastKnownStates.get(meta.name) ?? 'closed',
33
+ }));
34
+ // Active network captures
35
+ const networkCaptures = getActiveCapturesSummary();
36
+ // Offscreen document existence
37
+ let offscreenExists = false;
38
+ try {
39
+ const contexts = await chrome.runtime.getContexts({
40
+ contextTypes: ['OFFSCREEN_DOCUMENT'],
41
+ });
42
+ offscreenExists = contexts.length > 0;
43
+ }
44
+ catch {
45
+ // chrome.runtime.getContexts may not be available in all Chrome versions
46
+ }
47
+ sendSuccessResult(id, {
48
+ connection: { wsConnected, mcpServerUrl },
49
+ plugins,
50
+ networkCaptures,
51
+ offscreen: { exists: offscreenExists },
52
+ });
53
+ }
54
+ catch (err) {
55
+ sendErrorResult(id, err);
56
+ }
57
+ };
58
+ export const handleExtensionGetLogs = async (params, id) => {
59
+ try {
60
+ const filterOptions = {};
61
+ if (typeof params.level === 'string' && params.level !== 'all') {
62
+ filterOptions.level = params.level;
63
+ }
64
+ if (typeof params.source === 'string' && params.source !== 'all') {
65
+ filterOptions.source = params.source;
66
+ }
67
+ if (typeof params.limit === 'number') {
68
+ filterOptions.limit = params.limit;
69
+ }
70
+ if (typeof params.since === 'number') {
71
+ filterOptions.since = params.since;
72
+ }
73
+ // Get background logs directly from the local collector
74
+ const bgEntries = bgLogCollector.getEntries(filterOptions);
75
+ const bgStats = bgLogCollector.getStats();
76
+ // Get offscreen logs via internal message
77
+ let offscreenEntries = [];
78
+ let offscreenStats = {
79
+ totalCaptured: 0,
80
+ bufferSize: 0,
81
+ oldestTimestamp: null,
82
+ newestTimestamp: null,
83
+ };
84
+ try {
85
+ const raw = await chrome.runtime.sendMessage({
86
+ type: 'offscreen:getLogs',
87
+ options: Object.keys(filterOptions).length > 0 ? filterOptions : undefined,
88
+ });
89
+ const response = raw;
90
+ if (response && Array.isArray(response.entries)) {
91
+ offscreenEntries = response.entries;
92
+ }
93
+ if (response?.stats) {
94
+ offscreenStats = response.stats;
95
+ }
96
+ }
97
+ catch {
98
+ // Offscreen document may not be running
99
+ }
100
+ // Merge entries by timestamp (newest first — both arrays are already newest-first)
101
+ const merged = [...bgEntries, ...offscreenEntries].sort((a, b) => b.timestamp - a.timestamp);
102
+ // Apply limit to the merged result
103
+ const limit = filterOptions.limit ?? DEFAULT_LOG_LIMIT;
104
+ const entries = merged.slice(0, limit);
105
+ sendSuccessResult(id, {
106
+ entries,
107
+ stats: {
108
+ totalBackground: bgStats.totalCaptured,
109
+ totalOffscreen: offscreenStats.totalCaptured,
110
+ bufferSize: bgStats.bufferSize + offscreenStats.bufferSize,
111
+ },
112
+ });
113
+ }
114
+ catch (err) {
115
+ sendErrorResult(id, err);
116
+ }
117
+ };
118
+ export const handleExtensionGetSidePanel = async (id) => {
119
+ try {
120
+ const sidePanelResult = await Promise.race([
121
+ chrome.runtime.sendMessage({ type: 'sp:getState' }).then((raw) => raw),
122
+ new Promise(resolve => setTimeout(() => resolve(null), SIDE_PANEL_TIMEOUT_MS)),
123
+ ]);
124
+ if (!sidePanelResult || typeof sidePanelResult !== 'object') {
125
+ sendSuccessResult(id, { open: false });
126
+ return;
127
+ }
128
+ const response = sidePanelResult;
129
+ sendSuccessResult(id, { open: true, state: response.state, html: response.html });
130
+ }
131
+ catch {
132
+ // Side panel not open or message failed — return { open: false }
133
+ sendSuccessResult(id, { open: false });
134
+ }
135
+ };
136
+ export const handleExtensionCheckAdapter = async (params, id) => {
137
+ try {
138
+ const pluginName = requireStringParam(params, 'plugin', id);
139
+ if (pluginName === null)
140
+ return;
141
+ const meta = await getPluginMeta(pluginName);
142
+ if (!meta) {
143
+ sendValidationError(id, `Plugin not found: "${pluginName}"`);
144
+ return;
145
+ }
146
+ const matchingTabs = await findAllMatchingTabs(meta);
147
+ const tabResults = await Promise.allSettled(matchingTabs.map(async (tab) => {
148
+ const tabId = tab.id;
149
+ if (tabId === undefined)
150
+ return null;
151
+ // Inspect the adapter in the tab's MAIN world
152
+ const inspectResults = await chrome.scripting.executeScript({
153
+ target: { tabId },
154
+ world: 'MAIN',
155
+ func: (pName) => {
156
+ const ot = globalThis.__openTabs;
157
+ const adapter = ot?.adapters?.[pName];
158
+ if (!adapter || typeof adapter !== 'object') {
159
+ return { adapterPresent: false };
160
+ }
161
+ const toolNames = [];
162
+ if (Array.isArray(adapter.tools)) {
163
+ for (const tool of adapter.tools) {
164
+ if (tool && typeof tool === 'object' && typeof tool.name === 'string') {
165
+ toolNames.push(tool.name);
166
+ }
167
+ }
168
+ }
169
+ return {
170
+ adapterPresent: true,
171
+ adapterHash: typeof adapter.__hash === 'string' ? adapter.__hash : null,
172
+ toolCount: toolNames.length,
173
+ toolNames,
174
+ };
175
+ },
176
+ args: [pluginName],
177
+ });
178
+ const inspectResult = inspectResults[0]?.result;
179
+ if (!inspectResult) {
180
+ return {
181
+ tabId,
182
+ tabUrl: tab.url ?? '',
183
+ adapterPresent: false,
184
+ adapterHash: null,
185
+ hashMatch: false,
186
+ isReady: false,
187
+ toolCount: 0,
188
+ toolNames: [],
189
+ };
190
+ }
191
+ if (!inspectResult.adapterPresent) {
192
+ return {
193
+ tabId,
194
+ tabUrl: tab.url ?? '',
195
+ adapterPresent: false,
196
+ adapterHash: null,
197
+ hashMatch: false,
198
+ isReady: false,
199
+ toolCount: 0,
200
+ toolNames: [],
201
+ };
202
+ }
203
+ // Probe isReady() with timeout
204
+ let isReady = false;
205
+ try {
206
+ const readyResults = await Promise.race([
207
+ chrome.scripting.executeScript({
208
+ target: { tabId },
209
+ world: 'MAIN',
210
+ func: async (pName) => {
211
+ const ot = globalThis.__openTabs;
212
+ const adapter = ot?.adapters?.[pName];
213
+ if (!adapter || typeof adapter.isReady !== 'function')
214
+ return false;
215
+ return await adapter.isReady();
216
+ },
217
+ args: [pluginName],
218
+ }),
219
+ new Promise(resolve => setTimeout(() => resolve(null), IS_READY_TIMEOUT_MS)),
220
+ ]);
221
+ if (readyResults !== null) {
222
+ const readyResult = readyResults[0];
223
+ isReady = readyResult?.result === true;
224
+ }
225
+ }
226
+ catch {
227
+ // isReady probe failed — leave as false
228
+ }
229
+ return {
230
+ tabId,
231
+ tabUrl: tab.url ?? '',
232
+ adapterPresent: true,
233
+ adapterHash: inspectResult.adapterHash ?? null,
234
+ hashMatch: meta.adapterHash ? inspectResult.adapterHash === meta.adapterHash : false,
235
+ isReady,
236
+ toolCount: inspectResult.toolCount ?? 0,
237
+ toolNames: inspectResult.toolNames ?? [],
238
+ };
239
+ }));
240
+ const matchingTabResults = [];
241
+ for (const result of tabResults) {
242
+ if (result.status === 'fulfilled' && result.value !== null) {
243
+ matchingTabResults.push(result.value);
244
+ }
245
+ }
246
+ sendSuccessResult(id, {
247
+ plugin: pluginName,
248
+ expectedHash: meta.adapterHash ?? null,
249
+ matchingTabs: matchingTabResults,
250
+ });
251
+ }
252
+ catch (err) {
253
+ sendErrorResult(id, err);
254
+ }
255
+ };
256
+ export const handleExtensionForceReconnect = async (id) => {
257
+ try {
258
+ // Send the success response FIRST, before the WebSocket is torn down.
259
+ // The response travels over the current WebSocket connection; if we
260
+ // close it first, the response would never reach the MCP server.
261
+ sendSuccessResult(id, { reconnecting: true });
262
+ await new Promise(resolve => setTimeout(resolve, WS_FLUSH_DELAY_MS));
263
+ await chrome.runtime.sendMessage({
264
+ type: 'bg:forceReconnect',
265
+ });
266
+ }
267
+ catch (err) {
268
+ // The response was already sent above, so this catch is best-effort.
269
+ // If sendToServer itself failed, there's nothing more we can do.
270
+ console.warn('[opentabs] extension.forceReconnect failed:', err);
271
+ }
272
+ };
273
+ /**
274
+ * Executes a pre-written JavaScript file in a tab's MAIN world, supporting both sync and async code.
275
+ * @param params - Expects `{ tabId: number, execFile: string }` where execFile matches the `__exec-<uuid>.js` pattern.
276
+ * @returns The script's return value, serialized as JSON. Async scripts are polled until resolved or timed out.
277
+ */
278
+ export const handleBrowserExecuteScript = async (params, id) => {
279
+ try {
280
+ const tabId = requireTabId(params, id);
281
+ if (tabId === null)
282
+ return;
283
+ const execFile = requireStringParam(params, 'execFile', id);
284
+ if (execFile === null)
285
+ return;
286
+ if (!/^__exec-[a-f0-9-]+\.js$/.test(execFile)) {
287
+ sendValidationError(id, 'Invalid execFile format');
288
+ return;
289
+ }
290
+ let timeoutId;
291
+ // Step 1: Inject the exec file into the tab's MAIN world (bypasses page CSP)
292
+ const injectPromise = (async () => {
293
+ await chrome.scripting.executeScript({
294
+ target: { tabId },
295
+ world: 'MAIN',
296
+ files: [`adapters/${execFile}`],
297
+ });
298
+ // Step 2: Read the result. For sync code, __lastExecResult is set
299
+ // immediately by the wrapper. For async code (Promises), the wrapper
300
+ // sets __lastExecAsync=true and resolves __lastExecResult when the
301
+ // Promise settles. Poll until the result is available.
302
+ let elapsed = 0;
303
+ while (elapsed <= EXEC_MAX_ASYNC_WAIT_MS) {
304
+ const results = await chrome.scripting.executeScript({
305
+ target: { tabId },
306
+ world: 'MAIN',
307
+ func: (truncLimit) => {
308
+ const ot = globalThis.__openTabs;
309
+ if (!ot)
310
+ return { pending: false, result: { error: '__openTabs not found' } };
311
+ const result = ot.__lastExecResult;
312
+ const isAsync = ot.__lastExecAsync === true;
313
+ // Result available (sync or async resolved) — read and clean up
314
+ if (result && ('value' in result || 'error' in result)) {
315
+ const captured = { ...result };
316
+ // undefined is dropped by structured cloning — normalize to null
317
+ if (captured.value === undefined)
318
+ captured.value = null;
319
+ // Serialize non-primitive values
320
+ if (captured.value !== null && typeof captured.value === 'object') {
321
+ try {
322
+ const json = JSON.stringify(captured.value);
323
+ captured.value =
324
+ json.length > truncLimit ? json.slice(0, truncLimit) + '... (truncated)' : JSON.parse(json);
325
+ }
326
+ catch {
327
+ captured.value = String(captured.value);
328
+ }
329
+ }
330
+ // Clean up globals
331
+ delete ot.__lastExecResult;
332
+ delete ot.__lastExecAsync;
333
+ return { pending: false, result: captured };
334
+ }
335
+ // Async code hasn't resolved yet — keep polling
336
+ if (isAsync)
337
+ return { pending: true };
338
+ // Sync code produced no __lastExecResult (should not happen)
339
+ return { pending: false, result: { error: 'No result captured' } };
340
+ },
341
+ args: [EXEC_RESULT_TRUNCATION_LIMIT],
342
+ });
343
+ const first = results[0];
344
+ const data = first?.result;
345
+ if (data && !data.pending) {
346
+ return { value: data.result };
347
+ }
348
+ // Still pending — wait and retry
349
+ await new Promise(resolve => setTimeout(resolve, EXEC_POLL_INTERVAL_MS));
350
+ elapsed += EXEC_POLL_INTERVAL_MS;
351
+ }
352
+ // Async timed out — clean up and report error
353
+ await chrome.scripting
354
+ .executeScript({
355
+ target: { tabId },
356
+ world: 'MAIN',
357
+ func: () => {
358
+ const ot = globalThis.__openTabs;
359
+ if (ot) {
360
+ delete ot.__lastExecResult;
361
+ delete ot.__lastExecAsync;
362
+ }
363
+ },
364
+ })
365
+ .catch(() => { });
366
+ return { value: { error: `Async code did not resolve within ${EXEC_MAX_ASYNC_WAIT_MS}ms` } };
367
+ })();
368
+ const timeoutPromise = new Promise((_resolve, reject) => {
369
+ timeoutId = setTimeout(() => {
370
+ reject(new Error(`Script execution timed out after ${SCRIPT_TIMEOUT_MS}ms`));
371
+ }, SCRIPT_TIMEOUT_MS);
372
+ });
373
+ let result;
374
+ try {
375
+ result = await Promise.race([injectPromise, timeoutPromise]);
376
+ }
377
+ finally {
378
+ clearTimeout(timeoutId);
379
+ }
380
+ sendSuccessResult(id, result);
381
+ }
382
+ catch (err) {
383
+ sendErrorResult(id, err);
384
+ }
385
+ };
386
+ //# sourceMappingURL=extension-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-commands.js","sourceRoot":"","sources":["../../src/browser-commands/extension-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Validates that `params.tabId` is a number.
3
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
4
+ */
5
+ export declare const requireTabId: (params: Record<string, unknown>, id: string | number) => number | null;
6
+ /**
7
+ * Validates that `params.selector` is a non-empty string.
8
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
9
+ */
10
+ export declare const requireSelector: (params: Record<string, unknown>, id: string | number) => string | null;
11
+ /**
12
+ * Validates that `params[paramName]` is a non-empty string.
13
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
14
+ */
15
+ export declare const requireStringParam: (params: Record<string, unknown>, paramName: string, id: string | number) => string | null;
16
+ /**
17
+ * Validates that `params.url` is a string and not a blocked URL scheme.
18
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
19
+ */
20
+ export declare const requireUrl: (params: Record<string, unknown>, id: string | number) => string | null;
21
+ /**
22
+ * Extracts the first result from `chrome.scripting.executeScript` output.
23
+ * Sends a JSONRPC_INTERNAL_ERROR if no result, or JSONRPC_INVALID_PARAMS if the result has an `error` field.
24
+ * Returns the result or `null`.
25
+ */
26
+ export declare const extractScriptResult: (results: Array<{
27
+ result?: unknown;
28
+ }>, id: string | number, fallbackMsg?: string) => Record<string, unknown> | null;
29
+ /** Sends a JSONRPC_INTERNAL_ERROR with a sanitized error message. */
30
+ export declare const sendErrorResult: (id: string | number, err: unknown) => void;
31
+ /** Sends a JSONRPC_INVALID_PARAMS error with the given message. */
32
+ export declare const sendValidationError: (id: string | number, message: string) => void;
33
+ /** Sends a JSON-RPC 2.0 success response. */
34
+ export declare const sendSuccessResult: (id: string | number, result: unknown) => void;
35
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/browser-commands/helpers.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,MAAM,GAAG,MAAM,KAAG,MAAM,GAAG,IAW5F,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,MAAM,GAAG,MAAM,KAAG,MAAM,GAAG,IAW/F,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,MAAM,EACjB,IAAI,MAAM,GAAG,MAAM,KAClB,MAAM,GAAG,IAWX,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,MAAM,GAAG,MAAM,KAAG,MAAM,GAAG,IAsB1F,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,KAAK,CAAC;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACpC,IAAI,MAAM,GAAG,MAAM,EACnB,oBAA+C,KAC9C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAe5B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,GAAG,MAAM,EAAE,KAAK,OAAO,KAAG,IAMnE,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,GAAI,IAAI,MAAM,GAAG,MAAM,EAAE,SAAS,MAAM,KAAG,IAM1E,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,iBAAiB,GAAI,IAAI,MAAM,GAAG,MAAM,EAAE,QAAQ,OAAO,KAAG,IAExE,CAAC"}
@@ -0,0 +1,121 @@
1
+ import { JSONRPC_INTERNAL_ERROR, JSONRPC_INVALID_PARAMS } from '../json-rpc-errors.js';
2
+ import { sendToServer } from '../messaging.js';
3
+ import { sanitizeErrorMessage } from '../sanitize-error.js';
4
+ import { isBlockedUrlScheme, toErrorMessage } from '@opentabs-dev/shared';
5
+ /**
6
+ * Validates that `params.tabId` is a number.
7
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
8
+ */
9
+ export const requireTabId = (params, id) => {
10
+ const tabId = params.tabId;
11
+ if (typeof tabId !== 'number') {
12
+ sendToServer({
13
+ jsonrpc: '2.0',
14
+ error: { code: JSONRPC_INVALID_PARAMS, message: 'Missing or invalid tabId parameter' },
15
+ id,
16
+ });
17
+ return null;
18
+ }
19
+ return tabId;
20
+ };
21
+ /**
22
+ * Validates that `params.selector` is a non-empty string.
23
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
24
+ */
25
+ export const requireSelector = (params, id) => {
26
+ const selector = params.selector;
27
+ if (typeof selector !== 'string' || selector.length === 0) {
28
+ sendToServer({
29
+ jsonrpc: '2.0',
30
+ error: { code: JSONRPC_INVALID_PARAMS, message: 'Missing or invalid selector parameter' },
31
+ id,
32
+ });
33
+ return null;
34
+ }
35
+ return selector;
36
+ };
37
+ /**
38
+ * Validates that `params[paramName]` is a non-empty string.
39
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
40
+ */
41
+ export const requireStringParam = (params, paramName, id) => {
42
+ const value = params[paramName];
43
+ if (typeof value !== 'string' || value.length === 0) {
44
+ sendToServer({
45
+ jsonrpc: '2.0',
46
+ error: { code: JSONRPC_INVALID_PARAMS, message: `Missing or invalid ${paramName} parameter` },
47
+ id,
48
+ });
49
+ return null;
50
+ }
51
+ return value;
52
+ };
53
+ /**
54
+ * Validates that `params.url` is a string and not a blocked URL scheme.
55
+ * Sends a JSONRPC_INVALID_PARAMS error if invalid, returning `null`.
56
+ */
57
+ export const requireUrl = (params, id) => {
58
+ const url = params.url;
59
+ if (typeof url !== 'string') {
60
+ sendToServer({
61
+ jsonrpc: '2.0',
62
+ error: { code: JSONRPC_INVALID_PARAMS, message: 'Missing or invalid url parameter' },
63
+ id,
64
+ });
65
+ return null;
66
+ }
67
+ if (isBlockedUrlScheme(url)) {
68
+ sendToServer({
69
+ jsonrpc: '2.0',
70
+ error: {
71
+ code: JSONRPC_INVALID_PARAMS,
72
+ message: 'URL scheme not allowed (javascript:, data:, file:, chrome:, blob: are blocked)',
73
+ },
74
+ id,
75
+ });
76
+ return null;
77
+ }
78
+ return url;
79
+ };
80
+ /**
81
+ * Extracts the first result from `chrome.scripting.executeScript` output.
82
+ * Sends a JSONRPC_INTERNAL_ERROR if no result, or JSONRPC_INVALID_PARAMS if the result has an `error` field.
83
+ * Returns the result or `null`.
84
+ */
85
+ export const extractScriptResult = (results, id, fallbackMsg = 'No result from script execution') => {
86
+ const result = results[0]?.result;
87
+ if (!result) {
88
+ sendToServer({ jsonrpc: '2.0', error: { code: JSONRPC_INTERNAL_ERROR, message: fallbackMsg }, id });
89
+ return null;
90
+ }
91
+ if (result.error) {
92
+ sendToServer({
93
+ jsonrpc: '2.0',
94
+ error: { code: JSONRPC_INVALID_PARAMS, message: sanitizeErrorMessage(result.error) },
95
+ id,
96
+ });
97
+ return null;
98
+ }
99
+ return result;
100
+ };
101
+ /** Sends a JSONRPC_INTERNAL_ERROR with a sanitized error message. */
102
+ export const sendErrorResult = (id, err) => {
103
+ sendToServer({
104
+ jsonrpc: '2.0',
105
+ error: { code: JSONRPC_INTERNAL_ERROR, message: sanitizeErrorMessage(toErrorMessage(err)) },
106
+ id,
107
+ });
108
+ };
109
+ /** Sends a JSONRPC_INVALID_PARAMS error with the given message. */
110
+ export const sendValidationError = (id, message) => {
111
+ sendToServer({
112
+ jsonrpc: '2.0',
113
+ error: { code: JSONRPC_INVALID_PARAMS, message },
114
+ id,
115
+ });
116
+ };
117
+ /** Sends a JSON-RPC 2.0 success response. */
118
+ export const sendSuccessResult = (id, result) => {
119
+ sendToServer({ jsonrpc: '2.0', result, id });
120
+ };
121
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/browser-commands/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { handleBrowserGetTabContent, handleBrowserGetPageHtml, handleBrowserGetStorage, handleBrowserScreenshotTab, } from './content-commands.js';
2
+ export { handleBrowserGetCookies, handleBrowserSetCookie, handleBrowserDeleteCookies } from './cookie-commands.js';
3
+ export { handleBrowserExecuteScript, handleExtensionCheckAdapter, handleExtensionForceReconnect, handleExtensionGetLogs, handleExtensionGetSidePanel, handleExtensionGetState, } from './extension-commands.js';
4
+ export { handleBrowserClickElement, handleBrowserHandleDialog, handleBrowserHoverElement, handleBrowserQueryElements, handleBrowserSelectOption, handleBrowserTypeText, handleBrowserWaitForElement, } from './interaction-commands.js';
5
+ export { handleBrowserPressKey } from './key-press-command.js';
6
+ export { handleBrowserScroll } from './scroll-command.js';
7
+ export { handleBrowserClearConsoleLogs, handleBrowserDisableNetworkCapture, handleBrowserEnableNetworkCapture, handleBrowserGetConsoleLogs, handleBrowserGetNetworkRequests, } from './network-commands.js';
8
+ export { handleBrowserGetResourceContent, handleBrowserListResources, withDebugger, findFrameForResource, isTextMimeType, TEXT_MIME_PREFIXES, TEXT_MIME_EXACT, } from './resource-commands.js';
9
+ export type { CdpFrame, CdpFrameResourceTree, CdpResource } from './resource-commands.js';
10
+ export { handleBrowserCloseTab, handleBrowserFocusTab, handleBrowserGetTabInfo, handleBrowserListTabs, handleBrowserNavigateTab, handleBrowserOpenTab, } from './tab-commands.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AACnH,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,iCAAiC,EACjC,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { handleBrowserGetTabContent, handleBrowserGetPageHtml, handleBrowserGetStorage, handleBrowserScreenshotTab, } from './content-commands.js';
2
+ export { handleBrowserGetCookies, handleBrowserSetCookie, handleBrowserDeleteCookies } from './cookie-commands.js';
3
+ export { handleBrowserExecuteScript, handleExtensionCheckAdapter, handleExtensionForceReconnect, handleExtensionGetLogs, handleExtensionGetSidePanel, handleExtensionGetState, } from './extension-commands.js';
4
+ export { handleBrowserClickElement, handleBrowserHandleDialog, handleBrowserHoverElement, handleBrowserQueryElements, handleBrowserSelectOption, handleBrowserTypeText, handleBrowserWaitForElement, } from './interaction-commands.js';
5
+ export { handleBrowserPressKey } from './key-press-command.js';
6
+ export { handleBrowserScroll } from './scroll-command.js';
7
+ export { handleBrowserClearConsoleLogs, handleBrowserDisableNetworkCapture, handleBrowserEnableNetworkCapture, handleBrowserGetConsoleLogs, handleBrowserGetNetworkRequests, } from './network-commands.js';
8
+ export { handleBrowserGetResourceContent, handleBrowserListResources, withDebugger, findFrameForResource, isTextMimeType, TEXT_MIME_PREFIXES, TEXT_MIME_EXACT, } from './resource-commands.js';
9
+ export { handleBrowserCloseTab, handleBrowserFocusTab, handleBrowserGetTabInfo, handleBrowserListTabs, handleBrowserNavigateTab, handleBrowserOpenTab, } from './tab-commands.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser-commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AACnH,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,iCAAiC,EACjC,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Clicks a DOM element matched by a CSS selector in a tab's page context.
3
+ * @param params - Expects `{ tabId: number, selector: string }`.
4
+ * @returns `{ clicked, tagName, text }` describing the clicked element.
5
+ */
6
+ export declare const handleBrowserClickElement: (params: Record<string, unknown>, id: string | number) => Promise<void>;
7
+ /**
8
+ * Types text into an input, textarea, or contentEditable element, dispatching input and change events.
9
+ * @param params - Expects `{ tabId: number, selector: string, text: string, clear?: boolean }`. Defaults to clearing existing value before typing.
10
+ * @returns `{ typed, tagName, value }` with the element's resulting value.
11
+ */
12
+ export declare const handleBrowserTypeText: (params: Record<string, unknown>, id: string | number) => Promise<void>;
13
+ export declare const handleBrowserSelectOption: (params: Record<string, unknown>, id: string | number) => Promise<void>;
14
+ export declare const handleBrowserWaitForElement: (params: Record<string, unknown>, id: string | number) => Promise<void>;
15
+ /**
16
+ * Queries DOM elements matching a CSS selector and returns their tag names, text content, and specified attributes.
17
+ * @param params - Expects `{ tabId: number, selector: string, limit?: number, attributes?: string[] }`. Defaults to 100 element limit and standard attribute set.
18
+ * @returns `{ count, elements }` where count is the total matches and elements is the (possibly limited) result array.
19
+ */
20
+ export declare const handleBrowserQueryElements: (params: Record<string, unknown>, id: string | number) => Promise<void>;
21
+ export declare const handleBrowserHoverElement: (params: Record<string, unknown>, id: string | number) => Promise<void>;
22
+ export declare const handleBrowserHandleDialog: (params: Record<string, unknown>, id: string | number) => Promise<void>;
23
+ //# sourceMappingURL=interaction-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-commands.d.ts","sourceRoot":"","sources":["../../src/browser-commands/interaction-commands.ts"],"names":[],"mappings":"AAkBA;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACpC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,MAAM,GAAG,MAAM,KAClB,OAAO,CAAC,IAAI,CA6Bd,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAU,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,IAAI,CA2D9G,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,MAAM,GAAG,MAAM,KAClB,OAAO,CAAC,IAAI,CAuDd,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,MAAM,GAAG,MAAM,KAClB,OAAO,CAAC,IAAI,CA8Cd,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GACrC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,MAAM,GAAG,MAAM,KAClB,OAAO,CAAC,IAAI,CAkCd,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,MAAM,GAAG,MAAM,KAClB,OAAO,CAAC,IAAI,CAwDd,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,MAAM,GAAG,MAAM,KAClB,OAAO,CAAC,IAAI,CA8Bd,CAAC"}