@amalgm/browser 0.1.2-preview.35541635545 → 0.1.2-preview.37254096068

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 (390) hide show
  1. package/PURPOSE.md +119 -97
  2. package/README.md +51 -56
  3. package/SECURITY.md +10 -8
  4. package/dist/bin/amalgm-browser-mcp.js +2 -3
  5. package/dist/bin/amalgm-browser-mcp.js.map +1 -1
  6. package/dist/bin/amalgm-browser-rest.js +8 -18
  7. package/dist/bin/amalgm-browser-rest.js.map +1 -1
  8. package/dist/src/account.d.ts +8 -0
  9. package/dist/src/account.js +42 -0
  10. package/dist/src/account.js.map +1 -0
  11. package/dist/src/action.d.ts +1 -2
  12. package/dist/src/action.js +3 -7
  13. package/dist/src/action.js.map +1 -1
  14. package/dist/src/adapters/cli/actions.d.ts +0 -1
  15. package/dist/src/adapters/cli/actions.js +0 -7
  16. package/dist/src/adapters/cli/actions.js.map +1 -1
  17. package/dist/src/adapters/cli/help.d.ts +1 -1
  18. package/dist/src/adapters/cli/help.js +1 -4
  19. package/dist/src/adapters/cli/help.js.map +1 -1
  20. package/dist/src/adapters/cli/resources.js +0 -22
  21. package/dist/src/adapters/cli/resources.js.map +1 -1
  22. package/dist/src/adapters/cli/run.js +25 -19
  23. package/dist/src/adapters/cli/run.js.map +1 -1
  24. package/dist/src/adapters/execute.js +2 -2
  25. package/dist/src/adapters/execute.js.map +1 -1
  26. package/dist/src/adapters/http/events.d.ts +5 -2
  27. package/dist/src/adapters/http/events.js +18 -2
  28. package/dist/src/adapters/http/events.js.map +1 -1
  29. package/dist/src/adapters/http/internal-routes.js +9 -4
  30. package/dist/src/adapters/http/internal-routes.js.map +1 -1
  31. package/dist/src/adapters/http/navigation-stream.d.ts +4 -0
  32. package/dist/src/adapters/http/navigation-stream.js +17 -0
  33. package/dist/src/adapters/http/navigation-stream.js.map +1 -0
  34. package/dist/src/adapters/http/openapi.js +2 -8
  35. package/dist/src/adapters/http/openapi.js.map +1 -1
  36. package/dist/src/adapters/http/server.js +54 -14
  37. package/dist/src/adapters/http/server.js.map +1 -1
  38. package/dist/src/adapters/http/session-routes.js +0 -1
  39. package/dist/src/adapters/http/session-routes.js.map +1 -1
  40. package/dist/src/adapters/http/stream.d.ts +6 -0
  41. package/dist/src/adapters/http/stream.js +89 -0
  42. package/dist/src/adapters/http/stream.js.map +1 -0
  43. package/dist/src/adapters/mcp/server.js +2 -2
  44. package/dist/src/adapters/mcp/server.js.map +1 -1
  45. package/dist/src/adapters/mcp/tools.js +2 -4
  46. package/dist/src/adapters/mcp/tools.js.map +1 -1
  47. package/dist/src/adapters/mcp/types.d.ts +3 -2
  48. package/dist/src/adapters/toolbox/manifest.js +1 -1
  49. package/dist/src/adapters/toolbox/manifest.js.map +1 -1
  50. package/dist/src/auth/login.d.ts +3 -1
  51. package/dist/src/auth/login.js +48 -33
  52. package/dist/src/auth/login.js.map +1 -1
  53. package/dist/src/auth/service.js +56 -67
  54. package/dist/src/auth/service.js.map +1 -1
  55. package/dist/src/{drivers/cdp → cdp}/capture.d.ts +1 -1
  56. package/dist/src/{drivers/cdp → cdp}/capture.js +1 -1
  57. package/dist/src/cdp/capture.js.map +1 -0
  58. package/dist/src/{drivers/cdp → cdp}/client.d.ts +3 -1
  59. package/dist/src/{drivers/cdp → cdp}/client.js +51 -14
  60. package/dist/src/cdp/client.js.map +1 -0
  61. package/dist/src/cdp/input.js.map +1 -0
  62. package/dist/src/cdp/navigation.d.ts +5 -0
  63. package/dist/src/cdp/navigation.js +47 -0
  64. package/dist/src/cdp/navigation.js.map +1 -0
  65. package/dist/src/{drivers/cdp → cdp}/screencast.js +1 -1
  66. package/dist/src/cdp/screencast.js.map +1 -0
  67. package/dist/src/chrome/cookie-adapter.d.ts +23 -0
  68. package/dist/src/chrome/cookie-adapter.js +74 -0
  69. package/dist/src/chrome/cookie-adapter.js.map +1 -0
  70. package/dist/src/chrome/cookie-changes.d.ts +12 -0
  71. package/dist/src/chrome/cookie-changes.js +100 -0
  72. package/dist/src/chrome/cookie-changes.js.map +1 -0
  73. package/dist/src/chrome/cookie-observer.d.ts +20 -0
  74. package/dist/src/chrome/cookie-observer.js +44 -0
  75. package/dist/src/chrome/cookie-observer.js.map +1 -0
  76. package/dist/src/chrome/executable.d.ts +1 -0
  77. package/dist/src/chrome/executable.js +55 -0
  78. package/dist/src/chrome/executable.js.map +1 -0
  79. package/dist/src/chrome/flags.d.ts +7 -0
  80. package/dist/src/chrome/flags.js +59 -0
  81. package/dist/src/chrome/flags.js.map +1 -0
  82. package/dist/src/chrome/host.d.ts +25 -0
  83. package/dist/src/chrome/host.js +137 -0
  84. package/dist/src/chrome/host.js.map +1 -0
  85. package/dist/src/chrome/launch.d.ts +11 -0
  86. package/dist/src/chrome/launch.js +105 -0
  87. package/dist/src/chrome/launch.js.map +1 -0
  88. package/dist/src/chrome/relay/editing.d.ts +2 -0
  89. package/dist/src/chrome/relay/editing.js +14 -0
  90. package/dist/src/chrome/relay/editing.js.map +1 -0
  91. package/dist/src/chrome/relay/server.d.ts +18 -0
  92. package/dist/src/chrome/relay/server.js +120 -0
  93. package/dist/src/chrome/relay/server.js.map +1 -0
  94. package/dist/src/chrome/relay/targets.d.ts +11 -0
  95. package/dist/src/chrome/relay/targets.js +59 -0
  96. package/dist/src/chrome/relay/targets.js.map +1 -0
  97. package/dist/src/chrome/relay/view.d.ts +34 -0
  98. package/dist/src/chrome/relay/view.js +185 -0
  99. package/dist/src/chrome/relay/view.js.map +1 -0
  100. package/dist/src/cookies/adapter-credential.d.ts +6 -0
  101. package/dist/src/cookies/adapter-credential.js +33 -0
  102. package/dist/src/cookies/adapter-credential.js.map +1 -0
  103. package/dist/src/cookies/coordinator.d.ts +14 -13
  104. package/dist/src/cookies/coordinator.js +157 -75
  105. package/dist/src/cookies/coordinator.js.map +1 -1
  106. package/dist/src/cookies/database.d.ts +29 -0
  107. package/dist/src/cookies/database.js +113 -0
  108. package/dist/src/cookies/database.js.map +1 -0
  109. package/dist/src/cookies/diff.d.ts +6 -0
  110. package/dist/src/cookies/diff.js +19 -0
  111. package/dist/src/cookies/diff.js.map +1 -0
  112. package/dist/src/cookies/http-store.d.ts +7 -0
  113. package/dist/src/cookies/http-store.js +105 -0
  114. package/dist/src/cookies/http-store.js.map +1 -0
  115. package/dist/src/cookies/jar.d.ts +12 -11
  116. package/dist/src/cookies/jar.js +128 -120
  117. package/dist/src/cookies/jar.js.map +1 -1
  118. package/dist/src/cookies/policy.js +10 -4
  119. package/dist/src/cookies/policy.js.map +1 -1
  120. package/dist/src/cookies/secret-file.d.ts +4 -0
  121. package/dist/src/cookies/secret-file.js +47 -9
  122. package/dist/src/cookies/secret-file.js.map +1 -1
  123. package/dist/src/cookies/types.d.ts +34 -2
  124. package/dist/src/cookies.d.ts +2 -0
  125. package/dist/src/cookies.js +2 -0
  126. package/dist/src/cookies.js.map +1 -1
  127. package/dist/src/defaults.d.ts +1 -5
  128. package/dist/src/defaults.js +49 -58
  129. package/dist/src/defaults.js.map +1 -1
  130. package/dist/src/driver/cli-policy.d.ts +1 -0
  131. package/dist/src/driver/cli-policy.js +17 -0
  132. package/dist/src/driver/cli-policy.js.map +1 -0
  133. package/dist/src/{drivers/headless → driver}/command.d.ts +3 -7
  134. package/dist/src/{drivers/headless → driver}/command.js +29 -29
  135. package/dist/src/driver/command.js.map +1 -0
  136. package/dist/src/{drivers/headless → driver}/driver.d.ts +13 -10
  137. package/dist/src/{drivers/headless → driver}/driver.js +67 -82
  138. package/dist/src/driver/driver.js.map +1 -0
  139. package/dist/src/{interaction/delta.d.ts → driver/evidence.d.ts} +3 -2
  140. package/dist/src/{interaction/delta.js → driver/evidence.js} +6 -3
  141. package/dist/src/driver/evidence.js.map +1 -0
  142. package/dist/src/driver/executable.js.map +1 -0
  143. package/dist/src/driver/stream.d.ts +1 -0
  144. package/dist/src/driver/stream.js +22 -0
  145. package/dist/src/driver/stream.js.map +1 -0
  146. package/dist/src/driver/wait.d.ts +6 -0
  147. package/dist/src/driver/wait.js +28 -0
  148. package/dist/src/driver/wait.js.map +1 -0
  149. package/dist/src/electron/adblock/cache.js.map +1 -0
  150. package/dist/src/electron/adblock/cosmetics.js.map +1 -0
  151. package/dist/src/{drivers/electron/native → electron}/adblock/index.d.ts +0 -1
  152. package/dist/src/{drivers/electron/native → electron}/adblock/index.js +0 -1
  153. package/dist/src/{drivers/electron/native → electron}/adblock/index.js.map +1 -1
  154. package/dist/src/electron/adblock/policy.js.map +1 -0
  155. package/dist/src/electron/adblock/preload.js.map +1 -0
  156. package/dist/src/electron/adblock/settings.js.map +1 -0
  157. package/dist/src/{drivers/electron/native → electron}/contracts.d.ts +0 -14
  158. package/dist/src/{drivers/electron/native → electron}/contracts.js +0 -1
  159. package/dist/src/electron/contracts.js.map +1 -0
  160. package/dist/src/{drivers/electron → electron}/cookie-adapter.d.ts +4 -4
  161. package/dist/src/{drivers/electron → electron}/cookie-adapter.js +9 -6
  162. package/dist/src/electron/cookie-adapter.js.map +1 -0
  163. package/dist/src/electron/cookie-sync.d.ts +6 -0
  164. package/dist/src/electron/cookie-sync.js +18 -0
  165. package/dist/src/electron/cookie-sync.js.map +1 -0
  166. package/dist/src/electron/policy.js.map +1 -0
  167. package/dist/src/electron/session.d.ts +2 -0
  168. package/dist/src/electron/session.js +9 -0
  169. package/dist/src/electron/session.js.map +1 -0
  170. package/dist/src/electron/shell/adblock-ipc.js.map +1 -0
  171. package/dist/src/electron/shell/context-menu.js.map +1 -0
  172. package/dist/src/electron/shell/downloads.js.map +1 -0
  173. package/dist/src/electron/shell/helpers.js.map +1 -0
  174. package/dist/src/electron/shell/permissions.js.map +1 -0
  175. package/dist/src/{drivers/electron/native → electron}/shell/sites.d.ts +1 -3
  176. package/dist/src/{drivers/electron/native → electron}/shell/sites.js +2 -34
  177. package/dist/src/electron/shell/sites.js.map +1 -0
  178. package/dist/src/{drivers/electron/native → electron}/shell/types.d.ts +0 -1
  179. package/dist/src/electron/shell/types.js.map +1 -0
  180. package/dist/src/electron/shell.d.ts +13 -0
  181. package/dist/src/electron/shell.js +73 -0
  182. package/dist/src/electron/shell.js.map +1 -0
  183. package/dist/src/electron/surface/commands.js.map +1 -0
  184. package/dist/src/{drivers/electron/native → electron}/surface/create.js +0 -6
  185. package/dist/src/electron/surface/create.js.map +1 -0
  186. package/dist/src/{drivers/electron/native → electron}/surface/events.js +1 -13
  187. package/dist/src/electron/surface/events.js.map +1 -0
  188. package/dist/src/{drivers/electron/native → electron}/surface/presentation.d.ts +2 -9
  189. package/dist/src/electron/surface/presentation.js +29 -0
  190. package/dist/src/electron/surface/presentation.js.map +1 -0
  191. package/dist/src/{drivers/electron/native → electron}/surface/state.d.ts +5 -0
  192. package/dist/src/{drivers/electron/native → electron}/surface/state.js +10 -4
  193. package/dist/src/electron/surface/state.js.map +1 -0
  194. package/dist/src/{drivers/electron/native → electron}/surface/types.d.ts +2 -8
  195. package/dist/src/electron/surface/types.js.map +1 -0
  196. package/dist/src/{drivers/electron/native → electron}/surface-controller.js +9 -12
  197. package/dist/src/electron/surface-controller.js.map +1 -0
  198. package/dist/src/electron-preload.cjs +1 -1
  199. package/dist/src/electron.cjs +587 -820
  200. package/dist/src/electron.d.cts +4 -14
  201. package/dist/src/electron.d.ts +4 -14
  202. package/dist/src/electron.js +4 -14
  203. package/dist/src/electron.js.map +1 -1
  204. package/dist/src/errors.d.ts +1 -1
  205. package/dist/src/errors.js.map +1 -1
  206. package/dist/src/index.d.ts +2 -3
  207. package/dist/src/index.js +0 -2
  208. package/dist/src/index.js.map +1 -1
  209. package/dist/src/migration/legacy-migration.d.ts +0 -1
  210. package/dist/src/migration/legacy-migration.js +3 -9
  211. package/dist/src/migration/legacy-migration.js.map +1 -1
  212. package/dist/src/migration/legacy-rows.d.ts +1 -2
  213. package/dist/src/migration/legacy-rows.js +0 -14
  214. package/dist/src/migration/legacy-rows.js.map +1 -1
  215. package/dist/src/ports.d.ts +12 -15
  216. package/dist/src/ports.js.map +1 -1
  217. package/dist/src/process.d.ts +1 -0
  218. package/dist/src/process.js +11 -0
  219. package/dist/src/process.js.map +1 -1
  220. package/dist/src/product-service.d.ts +4 -6
  221. package/dist/src/product-service.js +21 -15
  222. package/dist/src/product-service.js.map +1 -1
  223. package/dist/src/recording/encoder.js +1 -1
  224. package/dist/src/recording/encoder.js.map +1 -1
  225. package/dist/src/recording/service.d.ts +4 -0
  226. package/dist/src/recording/service.js +72 -62
  227. package/dist/src/recording/service.js.map +1 -1
  228. package/dist/src/recording/source.js +1 -1
  229. package/dist/src/recording/source.js.map +1 -1
  230. package/dist/src/registry.d.ts +4 -0
  231. package/dist/src/registry.js +17 -0
  232. package/dist/src/registry.js.map +1 -1
  233. package/dist/src/service-options.d.ts +5 -7
  234. package/dist/src/service.d.ts +16 -18
  235. package/dist/src/service.js +108 -108
  236. package/dist/src/service.js.map +1 -1
  237. package/dist/src/sessions/operations.d.ts +12 -0
  238. package/dist/src/sessions/operations.js +56 -0
  239. package/dist/src/sessions/operations.js.map +1 -0
  240. package/dist/src/testing.d.ts +8 -4
  241. package/dist/src/testing.js +7 -5
  242. package/dist/src/testing.js.map +1 -1
  243. package/dist/src/types.d.ts +0 -39
  244. package/docs/ACTIONS.md +0 -4
  245. package/docs/ARCHITECTURE.md +51 -55
  246. package/docs/AUTHENTICATION.md +41 -36
  247. package/docs/AXIOMS.md +13 -11
  248. package/docs/CHROME.md +143 -0
  249. package/docs/CLI.md +63 -31
  250. package/docs/COMPATIBILITY.md +14 -23
  251. package/docs/COOKIES.md +95 -52
  252. package/docs/ELECTRON_INTEGRATION.md +84 -77
  253. package/docs/EVENTS.md +5 -9
  254. package/docs/MCP.md +10 -6
  255. package/docs/MIGRATION.md +43 -36
  256. package/docs/OPERATIONS.md +48 -40
  257. package/docs/README.md +5 -5
  258. package/docs/REALTIME_BOUNDARY.md +3 -3
  259. package/docs/RECORDING.md +16 -15
  260. package/docs/REST.md +57 -26
  261. package/docs/SDK.md +65 -55
  262. package/docs/SHELL_INTEGRATION.md +78 -36
  263. package/docs/TESTING.md +58 -42
  264. package/docs/TOOLBOX_INTEGRATION.md +9 -4
  265. package/docs/TROUBLESHOOTING.md +68 -40
  266. package/examples/basic.ts +1 -0
  267. package/package.json +8 -15
  268. package/skills/use-amalgm-browser/SKILL.md +16 -29
  269. package/skills/use-amalgm-browser/references/actions.md +2 -2
  270. package/dist/src/adapters/http/profile-routes.d.ts +0 -2
  271. package/dist/src/adapters/http/profile-routes.js +0 -42
  272. package/dist/src/adapters/http/profile-routes.js.map +0 -1
  273. package/dist/src/auth/transport.d.ts +0 -8
  274. package/dist/src/auth/transport.js +0 -45
  275. package/dist/src/auth/transport.js.map +0 -1
  276. package/dist/src/drivers/cdp/capture.js.map +0 -1
  277. package/dist/src/drivers/cdp/client.js.map +0 -1
  278. package/dist/src/drivers/cdp/input.js.map +0 -1
  279. package/dist/src/drivers/cdp/screencast.js.map +0 -1
  280. package/dist/src/drivers/cdp/target.d.ts +0 -4
  281. package/dist/src/drivers/cdp/target.js +0 -34
  282. package/dist/src/drivers/cdp/target.js.map +0 -1
  283. package/dist/src/drivers/electron/advertisement.d.ts +0 -12
  284. package/dist/src/drivers/electron/advertisement.js +0 -57
  285. package/dist/src/drivers/electron/advertisement.js.map +0 -1
  286. package/dist/src/drivers/electron/contracts.d.ts +0 -45
  287. package/dist/src/drivers/electron/contracts.js +0 -10
  288. package/dist/src/drivers/electron/contracts.js.map +0 -1
  289. package/dist/src/drivers/electron/cookie-adapter.js.map +0 -1
  290. package/dist/src/drivers/electron/driver.d.ts +0 -19
  291. package/dist/src/drivers/electron/driver.js +0 -115
  292. package/dist/src/drivers/electron/driver.js.map +0 -1
  293. package/dist/src/drivers/electron/native/adblock/cache.js.map +0 -1
  294. package/dist/src/drivers/electron/native/adblock/cosmetics.js.map +0 -1
  295. package/dist/src/drivers/electron/native/adblock/policy.js.map +0 -1
  296. package/dist/src/drivers/electron/native/adblock/preload.js.map +0 -1
  297. package/dist/src/drivers/electron/native/adblock/settings.js.map +0 -1
  298. package/dist/src/drivers/electron/native/config.d.ts +0 -4
  299. package/dist/src/drivers/electron/native/config.js +0 -9
  300. package/dist/src/drivers/electron/native/config.js.map +0 -1
  301. package/dist/src/drivers/electron/native/contracts.js.map +0 -1
  302. package/dist/src/drivers/electron/native/policy.js.map +0 -1
  303. package/dist/src/drivers/electron/native/session.d.ts +0 -4
  304. package/dist/src/drivers/electron/native/session.js +0 -11
  305. package/dist/src/drivers/electron/native/session.js.map +0 -1
  306. package/dist/src/drivers/electron/native/shell/adblock-ipc.js.map +0 -1
  307. package/dist/src/drivers/electron/native/shell/context-menu.js.map +0 -1
  308. package/dist/src/drivers/electron/native/shell/downloads.js.map +0 -1
  309. package/dist/src/drivers/electron/native/shell/helpers.js.map +0 -1
  310. package/dist/src/drivers/electron/native/shell/permissions.js.map +0 -1
  311. package/dist/src/drivers/electron/native/shell/sites.js.map +0 -1
  312. package/dist/src/drivers/electron/native/shell/types.js.map +0 -1
  313. package/dist/src/drivers/electron/native/shell.d.ts +0 -14
  314. package/dist/src/drivers/electron/native/shell.js +0 -115
  315. package/dist/src/drivers/electron/native/shell.js.map +0 -1
  316. package/dist/src/drivers/electron/native/surface/commands.js.map +0 -1
  317. package/dist/src/drivers/electron/native/surface/create.js.map +0 -1
  318. package/dist/src/drivers/electron/native/surface/events.js.map +0 -1
  319. package/dist/src/drivers/electron/native/surface/presentation.js +0 -87
  320. package/dist/src/drivers/electron/native/surface/presentation.js.map +0 -1
  321. package/dist/src/drivers/electron/native/surface/state.js.map +0 -1
  322. package/dist/src/drivers/electron/native/surface/types.js.map +0 -1
  323. package/dist/src/drivers/electron/native/surface-controller.js.map +0 -1
  324. package/dist/src/drivers/electron/policy.d.ts +0 -4
  325. package/dist/src/drivers/electron/policy.js +0 -39
  326. package/dist/src/drivers/electron/policy.js.map +0 -1
  327. package/dist/src/drivers/electron/session.d.ts +0 -4
  328. package/dist/src/drivers/electron/session.js +0 -5
  329. package/dist/src/drivers/electron/session.js.map +0 -1
  330. package/dist/src/drivers/headless/command.js.map +0 -1
  331. package/dist/src/drivers/headless/cookie-adapter.d.ts +0 -16
  332. package/dist/src/drivers/headless/cookie-adapter.js +0 -59
  333. package/dist/src/drivers/headless/cookie-adapter.js.map +0 -1
  334. package/dist/src/drivers/headless/driver.js.map +0 -1
  335. package/dist/src/drivers/headless/executable.js.map +0 -1
  336. package/dist/src/drivers/headless/screencast.d.ts +0 -3
  337. package/dist/src/drivers/headless/screencast.js +0 -21
  338. package/dist/src/drivers/headless/screencast.js.map +0 -1
  339. package/dist/src/headless.d.ts +0 -3
  340. package/dist/src/headless.js +0 -4
  341. package/dist/src/headless.js.map +0 -1
  342. package/dist/src/interaction/delta.js.map +0 -1
  343. package/dist/src/interaction/typing.d.ts +0 -39
  344. package/dist/src/interaction/typing.js +0 -189
  345. package/dist/src/interaction/typing.js.map +0 -1
  346. package/dist/src/profiles/directories.d.ts +0 -9
  347. package/dist/src/profiles/directories.js +0 -57
  348. package/dist/src/profiles/directories.js.map +0 -1
  349. package/dist/src/profiles/service.d.ts +0 -30
  350. package/dist/src/profiles/service.js +0 -89
  351. package/dist/src/profiles/service.js.map +0 -1
  352. package/dist/src/runtime-selector.d.ts +0 -12
  353. package/dist/src/runtime-selector.js +0 -72
  354. package/dist/src/runtime-selector.js.map +0 -1
  355. package/docs/HEADLESS_RUNTIME.md +0 -58
  356. package/examples/custom-driver.ts +0 -45
  357. /package/dist/src/{drivers/cdp → cdp}/input.d.ts +0 -0
  358. /package/dist/src/{drivers/cdp → cdp}/input.js +0 -0
  359. /package/dist/src/{drivers/cdp → cdp}/screencast.d.ts +0 -0
  360. /package/dist/src/{drivers/headless → driver}/executable.d.ts +0 -0
  361. /package/dist/src/{drivers/headless → driver}/executable.js +0 -0
  362. /package/dist/src/{drivers/electron/native → electron}/adblock/cache.d.ts +0 -0
  363. /package/dist/src/{drivers/electron/native → electron}/adblock/cache.js +0 -0
  364. /package/dist/src/{drivers/electron/native → electron}/adblock/cosmetics.d.ts +0 -0
  365. /package/dist/src/{drivers/electron/native → electron}/adblock/cosmetics.js +0 -0
  366. /package/dist/src/{drivers/electron/native → electron}/adblock/policy.d.ts +0 -0
  367. /package/dist/src/{drivers/electron/native → electron}/adblock/policy.js +0 -0
  368. /package/dist/src/{drivers/electron/native → electron}/adblock/preload.d.ts +0 -0
  369. /package/dist/src/{drivers/electron/native → electron}/adblock/preload.js +0 -0
  370. /package/dist/src/{drivers/electron/native → electron}/adblock/settings.d.ts +0 -0
  371. /package/dist/src/{drivers/electron/native → electron}/adblock/settings.js +0 -0
  372. /package/dist/src/{drivers/electron/native → electron}/policy.d.ts +0 -0
  373. /package/dist/src/{drivers/electron/native → electron}/policy.js +0 -0
  374. /package/dist/src/{drivers/electron/native → electron}/shell/adblock-ipc.d.ts +0 -0
  375. /package/dist/src/{drivers/electron/native → electron}/shell/adblock-ipc.js +0 -0
  376. /package/dist/src/{drivers/electron/native → electron}/shell/context-menu.d.ts +0 -0
  377. /package/dist/src/{drivers/electron/native → electron}/shell/context-menu.js +0 -0
  378. /package/dist/src/{drivers/electron/native → electron}/shell/downloads.d.ts +0 -0
  379. /package/dist/src/{drivers/electron/native → electron}/shell/downloads.js +0 -0
  380. /package/dist/src/{drivers/electron/native → electron}/shell/helpers.d.ts +0 -0
  381. /package/dist/src/{drivers/electron/native → electron}/shell/helpers.js +0 -0
  382. /package/dist/src/{drivers/electron/native → electron}/shell/permissions.d.ts +0 -0
  383. /package/dist/src/{drivers/electron/native → electron}/shell/permissions.js +0 -0
  384. /package/dist/src/{drivers/electron/native → electron}/shell/types.js +0 -0
  385. /package/dist/src/{drivers/electron/native → electron}/surface/commands.d.ts +0 -0
  386. /package/dist/src/{drivers/electron/native → electron}/surface/commands.js +0 -0
  387. /package/dist/src/{drivers/electron/native → electron}/surface/create.d.ts +0 -0
  388. /package/dist/src/{drivers/electron/native → electron}/surface/events.d.ts +0 -0
  389. /package/dist/src/{drivers/electron/native → electron}/surface/types.js +0 -0
  390. /package/dist/src/{drivers/electron/native → electron}/surface-controller.d.ts +0 -0
@@ -808,356 +808,18 @@ var require_cjs = __commonJS({
808
808
  var electron_exports = {};
809
809
  __export(electron_exports, {
810
810
  BROWSER_IPC: () => BROWSER_IPC,
811
- BROWSER_SESSION_PARTITION: () => BROWSER_SESSION_PARTITION,
812
- BROWSER_SURFACE_PROTOCOL: () => BROWSER_SURFACE_PROTOCOL,
813
- BROWSER_SURFACE_PROTOCOLS: () => BROWSER_SURFACE_PROTOCOLS,
814
- ELECTRON_COOKIE_ADAPTER_ID: () => ELECTRON_COOKIE_ADAPTER_ID,
815
- ElectronBrowserDriver: () => ElectronBrowserDriver,
816
- ElectronCookieAdapter: () => ElectronCookieAdapter,
817
- NativeAdBlocker: () => NativeAdBlocker,
818
- adBlockHostname: () => adBlockHostname,
819
- browserNavigationPolicy: () => browserNavigationPolicy,
820
- codeFor: () => codeFor,
821
811
  createBrowserShell: () => createBrowserShell,
822
- createBrowserSurfaceController: () => createBrowserSurfaceController,
823
- getBrowserSession: () => getBrowserSession,
824
- insertTextScript: () => insertTextScript,
825
- isAdBlockCacheFresh: () => isAdBlockCacheFresh,
826
- isAllowedExternalUrl: () => isAllowedExternalUrl,
827
- isAllowedWebUrl: () => isAllowedWebUrl,
828
- isLoopbackCdpUrl: () => isLoopbackCdpUrl,
829
- isNativeAdBlockDisabled: () => isNativeAdBlockDisabled,
830
- isolatedBrowserSession: () => isolatedBrowserSession,
831
- keyScript: () => keyScript,
832
- markerUrl: () => markerUrl,
833
- nextAvailableDownloadPath: () => nextAvailableDownloadPath,
834
- normalizeBrowserLocation: () => normalizeBrowserLocation,
835
- parseUrl: () => parseUrl,
836
- permissionOrigin: () => permissionOrigin,
837
- removeHostAdvertisement: () => removeHostAdvertisement,
838
- safeDownloadFilename: () => safeDownloadFilename,
839
- safeDownloadName: () => safeDownloadName,
840
- setValueScript: () => setValueScript,
841
- shouldOpenAsTab: () => shouldOpenAsTab,
842
- surfaceStamp: () => surfaceStamp,
843
- writeHostAdvertisement: () => writeHostAdvertisement
812
+ createHttpCookieStore: () => createHttpCookieStore,
813
+ readCookieAdapter: () => readCookieAdapter
844
814
  });
845
815
  module.exports = __toCommonJS(electron_exports);
846
816
 
847
- // src/errors.ts
848
- var BrowserError = class extends Error {
849
- constructor(code, message, details) {
850
- super(message);
851
- this.code = code;
852
- this.details = details;
853
- }
854
- code;
855
- details;
856
- name = "BrowserError";
857
- };
858
-
859
- // src/drivers/electron/contracts.ts
860
- var BROWSER_SESSION_PARTITION = "persist:amalgm-browser";
861
- var BROWSER_SURFACE_PROTOCOL = 6;
862
- var BROWSER_SURFACE_PROTOCOLS = [5, BROWSER_SURFACE_PROTOCOL];
863
- function surfaceStamp(sessionId) {
864
- return `amalgm-browser:${sessionId}`;
865
- }
866
- function markerUrl(sessionId) {
867
- return `about:blank#amalgm-bsid-${encodeURIComponent(sessionId)}`;
868
- }
869
-
870
- // src/drivers/electron/driver.ts
871
- var ElectronBrowserDriver = class {
872
- constructor(host) {
873
- this.host = host;
874
- this.capabilities = [...host.capabilities];
875
- }
876
- host;
877
- kind = "electron";
878
- capabilities;
879
- identities = /* @__PURE__ */ new Map();
880
- async open(input) {
881
- const identity = await this.bind(input);
882
- this.identities.set(input.session.id, identity);
883
- }
884
- async execute(input, action) {
885
- let identity;
886
- try {
887
- identity = await this.verified(input);
888
- } catch (error2) {
889
- const previous = this.identities.get(input.session.id);
890
- if (!previous || !isMissingSurface(error2)) throw error2;
891
- identity = await this.reattachOnce(input, previous);
892
- }
893
- try {
894
- return await this.host.execute({ identity, action, context: input.context });
895
- } catch (error2) {
896
- if (!isSurfaceLoss(error2)) throw error2;
897
- identity = await this.reattachOnce(input, identity);
898
- return this.host.execute({ identity, action, context: input.context });
899
- }
900
- }
901
- async close(input) {
902
- const identity = this.identities.get(input.session.id);
903
- this.identities.delete(input.session.id);
904
- if (identity) await this.host.retire(identity);
905
- }
906
- async saveState(input) {
907
- const identity = await this.verified(input);
908
- if (!this.host.saveState) throw new BrowserError("CAPABILITY_UNSUPPORTED", "Electron host cannot save auth state.");
909
- return this.host.saveState(identity);
910
- }
911
- async loadState(input, state) {
912
- const identity = await this.verified(input);
913
- if (!this.host.loadState) throw new BrowserError("CAPABILITY_UNSUPPORTED", "Electron host cannot load auth state.");
914
- await this.host.loadState(identity, state);
915
- }
916
- async startScreencast(input, onFrame) {
917
- const identity = await this.verified(input);
918
- if (!this.host.startScreencast) throw new BrowserError("CAPABILITY_UNSUPPORTED", "Electron host cannot record its page.");
919
- return this.host.startScreencast(identity, onFrame, input.context.signal);
920
- }
921
- async bind(input) {
922
- const identity = await this.host.requestSurface({
923
- session: input.session,
924
- markerUrl: markerUrl(input.session.id),
925
- stamp: surfaceStamp(input.session.id),
926
- context: input.context
927
- });
928
- assertIdentity(identity, input.session.id);
929
- return identity;
930
- }
931
- async verified(input) {
932
- const identity = this.identities.get(input.session.id);
933
- if (!identity) throw new BrowserError(
934
- "SURFACE_IDENTITY_FAILED",
935
- "Visible surface is not bound.",
936
- { reason: "unbound" }
937
- );
938
- const state = await this.host.inspect(identity);
939
- if (!state) throw new BrowserError(
940
- "SURFACE_IDENTITY_FAILED",
941
- "Visible surface was lost.",
942
- { reason: "lost" }
943
- );
944
- if (!sameIdentity(state.identity, identity)) {
945
- throw new BrowserError(
946
- "SURFACE_IDENTITY_FAILED",
947
- "Visible surface identity did not match.",
948
- { reason: "mismatch" }
949
- );
950
- }
951
- return identity;
952
- }
953
- async reattachOnce(input, previous) {
954
- const next = await this.bind(input);
955
- if (next.surfaceId !== previous.surfaceId && next.stamp !== previous.stamp) {
956
- throw new BrowserError("SURFACE_IDENTITY_FAILED", "Visible surface reattachment returned an unrelated page.");
957
- }
958
- this.identities.set(input.session.id, next);
959
- return next;
960
- }
961
- };
962
- function assertIdentity(identity, sessionId) {
963
- if (identity.browserSessionId !== sessionId || identity.stamp !== surfaceStamp(sessionId) || !BROWSER_SURFACE_PROTOCOLS.includes(identity.protocol)) {
964
- throw new BrowserError("SURFACE_IDENTITY_FAILED", "Electron host returned an incompatible surface identity.");
965
- }
966
- }
967
- function sameIdentity(left, right) {
968
- return left.surfaceId === right.surfaceId && left.browserSessionId === right.browserSessionId && left.stamp === right.stamp && left.protocol === right.protocol;
969
- }
970
- function isSurfaceLoss(error2) {
971
- return error2 instanceof BrowserError && error2.code === "SURFACE_IDENTITY_FAILED" && error2.details?.reason === "lost";
972
- }
973
- function isMissingSurface(error2) {
974
- return error2 instanceof BrowserError && error2.code === "SURFACE_IDENTITY_FAILED" && error2.details?.reason === "lost";
975
- }
976
-
977
- // src/drivers/electron/cookie-adapter.ts
978
- var ELECTRON_COOKIE_ADAPTER_ID = "electron:default-session";
979
- var ElectronCookieAdapter = class {
980
- constructor(cookies) {
981
- this.cookies = cookies;
982
- }
983
- cookies;
984
- id = ELECTRON_COOKIE_ADAPTER_ID;
985
- supportsPartitionedCookies = false;
986
- async read() {
987
- return (await this.cookies.get({})).map(fromElectron);
988
- }
989
- async apply(input) {
990
- input.signal?.throwIfAborted();
991
- for (const cookie of input.upserts) {
992
- input.signal?.throwIfAborted();
993
- if (!cookie.partitionKey) await this.cookies.set(toElectron(cookie));
994
- }
995
- for (const cookie of input.deletes || []) {
996
- input.signal?.throwIfAborted();
997
- if (cookie.partitionKey) continue;
998
- await Promise.all([
999
- this.cookies.remove(cookieUrl(cookie.domain, cookie.path, false), cookie.name),
1000
- this.cookies.remove(cookieUrl(cookie.domain, cookie.path, true), cookie.name)
1001
- ]);
1002
- }
1003
- }
1004
- subscribe(changed) {
1005
- const listener = (_event, _cookie, _cause, _removed) => changed();
1006
- this.cookies.on("changed", listener);
1007
- return () => this.cookies.off("changed", listener);
1008
- }
1009
- };
1010
- function fromElectron(cookie) {
1011
- return {
1012
- name: cookie.name,
1013
- value: cookie.value,
1014
- domain: cookie.domain || "",
1015
- path: cookie.path || "/",
1016
- ...typeof cookie.expirationDate === "number" && cookie.expirationDate >= 0 ? { expires: cookie.expirationDate } : {},
1017
- httpOnly: Boolean(cookie.httpOnly),
1018
- secure: Boolean(cookie.secure),
1019
- sameSite: cookie.sameSite === "strict" ? "Strict" : cookie.sameSite === "no_restriction" ? "None" : "Lax"
1020
- };
1021
- }
1022
- function toElectron(cookie) {
1023
- const hostOnly = !cookie.domain.startsWith(".");
1024
- return {
1025
- url: cookieUrl(cookie.domain, cookie.path, Boolean(cookie.secure) || cookie.sameSite === "None"),
1026
- name: cookie.name,
1027
- value: cookie.value,
1028
- path: cookie.path || "/",
1029
- secure: Boolean(cookie.secure),
1030
- httpOnly: Boolean(cookie.httpOnly),
1031
- sameSite: cookie.sameSite === "Strict" ? "strict" : cookie.sameSite === "None" ? "no_restriction" : "lax",
1032
- ...!hostOnly ? { domain: cookie.domain } : {},
1033
- ...typeof cookie.expires === "number" ? { expirationDate: cookie.expires } : {}
1034
- };
1035
- }
1036
- function cookieUrl(domain, path6, secure) {
1037
- const host = domain.trim().toLowerCase().replace(/^\.+/, "");
1038
- const normalizedPath = String(path6 || "/").startsWith("/") ? path6 || "/" : `/${path6}`;
1039
- return `${secure ? "https" : "http"}://${host}${normalizedPath}`;
1040
- }
1041
-
1042
- // src/drivers/electron/advertisement.ts
1043
- var import_node_fs = __toESM(require("node:fs"), 1);
1044
- var import_node_path = __toESM(require("node:path"), 1);
1045
-
1046
- // node_modules/@amalgm/core/dist/transport/auth.js
1047
- var utf8 = new TextEncoder();
1048
- var RUNTIME_TOKEN_HEADER = "x-amalgm-runtime-token";
1049
- var LOOPBACK_ORIGIN_HOSTNAMES = ["localhost", "127.0.0.1", "[::1]", "::1"];
1050
- var RUNTIME_CORS_ALLOWED_HEADERS = [
1051
- "Content-Type",
1052
- "Authorization",
1053
- "Accept",
1054
- "Cache-Control",
1055
- "Last-Event-ID",
1056
- "Mcp-Session-Id",
1057
- "X-Amalgm-Session-Id",
1058
- RUNTIME_TOKEN_HEADER
1059
- ].join(", ");
1060
-
1061
- // node_modules/@amalgm/core/dist/transport/state/api.js
1062
- var encoder = new TextEncoder();
1063
-
1064
- // node_modules/@amalgm/core/dist/transport/diagnostics.js
1065
- var DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES = 256 * 1024;
1066
- var MAX_DIAGNOSTIC_LOG_TAIL_BYTES = 2 * 1024 * 1024;
1067
-
1068
- // src/drivers/electron/advertisement.ts
1069
- function writeHostAdvertisement(options) {
1070
- const protocol = options.protocol || BROWSER_SURFACE_PROTOCOL;
1071
- const pid = options.pid || process.pid;
1072
- if (!isLoopbackCdpUrl(options.cdpUrl)) {
1073
- throw new BrowserError("INVALID_INPUT", "Electron Browser CDP advertisement must use loopback.");
1074
- }
1075
- const data = {
1076
- browserSurfaceProtocol: protocol,
1077
- browserSurfaceTargetType: protocol === 5 ? "webview" : "page",
1078
- browserSurfaceTargetTypes: protocol === 5 ? ["webview"] : ["page", "webview"],
1079
- cdp: { url: options.cdpUrl, port: options.cdpPort },
1080
- ...protocol === 5 ? { cdpUrl: options.cdpUrl, cdpPort: options.cdpPort } : {},
1081
- ...options.label ? { label: options.label } : {},
1082
- pid,
1083
- startedAt: options.startedAt || (/* @__PURE__ */ new Date()).toISOString()
1084
- };
1085
- const temporary = `${options.file}.${pid}.${Date.now()}.tmp`;
1086
- import_node_fs.default.mkdirSync(import_node_path.default.dirname(options.file), { recursive: true, mode: 448 });
1087
- try {
1088
- import_node_fs.default.writeFileSync(temporary, `${JSON.stringify(data, null, 2)}
1089
- `, { mode: 384 });
1090
- import_node_fs.default.renameSync(temporary, options.file);
1091
- import_node_fs.default.chmodSync(options.file, 384);
1092
- } catch (error2) {
1093
- import_node_fs.default.rmSync(temporary, { force: true });
1094
- throw error2;
1095
- }
1096
- }
1097
- function removeHostAdvertisement(file, pid = process.pid) {
1098
- try {
1099
- const value = JSON.parse(import_node_fs.default.readFileSync(file, "utf8"));
1100
- if (value.pid !== pid) return false;
1101
- } catch (error2) {
1102
- if (error2.code === "ENOENT") return false;
1103
- }
1104
- import_node_fs.default.rmSync(file, { force: true });
1105
- return true;
1106
- }
1107
- function isLoopbackCdpUrl(value) {
1108
- try {
1109
- const url = new URL(value);
1110
- return ["http:", "https:", "ws:", "wss:"].includes(url.protocol) && LOOPBACK_ORIGIN_HOSTNAMES.includes(url.hostname);
1111
- } catch {
1112
- return false;
1113
- }
1114
- }
1115
-
1116
- // src/drivers/electron/session.ts
1117
- function isolatedBrowserSession(sessionModule) {
1118
- return sessionModule.fromPartition(BROWSER_SESSION_PARTITION);
1119
- }
1120
-
1121
- // src/drivers/electron/policy.ts
1122
- var WEB_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:"]);
1123
- var EXTERNAL_PROTOCOLS = /* @__PURE__ */ new Set(["mailto:", "tel:", "sms:"]);
1124
- function normalizeBrowserLocation(raw) {
1125
- const value = raw.trim();
1126
- if (!value) return "about:blank";
1127
- if (/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(value)) return value;
1128
- if (/^(localhost|\d{1,3}(?:\.\d{1,3}){3})(:\d+)?(?:\/|$)/i.test(value)) return `http://${value}`;
1129
- if (/^[^\s.]+\.[^\s]+/.test(value)) return `https://${value}`;
1130
- return `https://www.google.com/search?q=${encodeURIComponent(value)}`;
1131
- }
1132
- function browserNavigationPolicy(raw) {
1133
- try {
1134
- const url = new URL(raw);
1135
- if (WEB_PROTOCOLS.has(url.protocol) || url.protocol === "about:") return "allow";
1136
- if (EXTERNAL_PROTOCOLS.has(url.protocol)) return "external";
1137
- } catch {
1138
- }
1139
- return "deny";
1140
- }
1141
- function safeDownloadName(value) {
1142
- const name = value.replace(/[\\/:*?"<>|\u0000-\u001f]/g, "_").replace(/^\.+/, "").trim();
1143
- return name.slice(0, 180) || "download";
1144
- }
1145
- function permissionOrigin(url) {
1146
- try {
1147
- const value = new URL(url);
1148
- return WEB_PROTOCOLS.has(value.protocol) ? value.origin : null;
1149
- } catch {
1150
- return null;
1151
- }
1152
- }
1153
-
1154
- // src/drivers/electron/native/shell.ts
1155
- var import_node_path4 = __toESM(require("node:path"), 1);
1156
- var import_electron11 = require("electron");
817
+ // src/electron/shell.ts
818
+ var import_node_path3 = __toESM(require("node:path"), 1);
819
+ var import_electron10 = require("electron");
1157
820
 
1158
- // src/drivers/electron/native/contracts.ts
821
+ // src/electron/contracts.ts
1159
822
  var BROWSER_IPC = {
1160
- registerGuest: "browser:register-guest",
1161
823
  surfaceCreate: "browser:surface-create",
1162
824
  surfaceUpdate: "browser:surface-update",
1163
825
  surfaceDestroy: "browser:surface-destroy",
@@ -11824,12 +11486,12 @@ var utf8d = new Uint8Array([
11824
11486
  /* eslint-enable prettier/prettier */
11825
11487
  ]);
11826
11488
 
11827
- // src/drivers/electron/native/adblock/index.ts
11828
- var import_node_path3 = __toESM(require("node:path"), 1);
11829
-
11830
- // src/drivers/electron/native/adblock/cache.ts
11831
- var import_node_fs2 = __toESM(require("node:fs"), 1);
11489
+ // src/electron/adblock/index.ts
11832
11490
  var import_node_path2 = __toESM(require("node:path"), 1);
11491
+
11492
+ // src/electron/adblock/cache.ts
11493
+ var import_node_fs = __toESM(require("node:fs"), 1);
11494
+ var import_node_path = __toESM(require("node:path"), 1);
11833
11495
  var MAX_AGE_MS = 7 * 24 * 60 * 6e4;
11834
11496
  var DOWNLOAD_TIMEOUT_MS = 15e3;
11835
11497
  function isAdBlockCacheFresh(mtimeMs, now = Date.now()) {
@@ -11858,25 +11520,25 @@ async function loadAdBlockEngine(cachePath, fetchImpl) {
11858
11520
  }
11859
11521
  async function readCache(file) {
11860
11522
  try {
11861
- const [data, stat] = await Promise.all([import_node_fs2.default.promises.readFile(file), import_node_fs2.default.promises.stat(file)]);
11523
+ const [data, stat] = await Promise.all([import_node_fs.default.promises.readFile(file), import_node_fs.default.promises.stat(file)]);
11862
11524
  return { data, mtimeMs: stat.mtimeMs };
11863
11525
  } catch {
11864
11526
  return null;
11865
11527
  }
11866
11528
  }
11867
11529
  async function writeAtomic(file, data) {
11868
- await import_node_fs2.default.promises.mkdir(import_node_path2.default.dirname(file), { recursive: true, mode: 448 });
11530
+ await import_node_fs.default.promises.mkdir(import_node_path.default.dirname(file), { recursive: true, mode: 448 });
11869
11531
  const temporary = `${file}.${process.pid}.${Date.now()}.tmp`;
11870
11532
  try {
11871
- await import_node_fs2.default.promises.writeFile(temporary, data, { mode: 384 });
11872
- await import_node_fs2.default.promises.rename(temporary, file);
11533
+ await import_node_fs.default.promises.writeFile(temporary, data, { mode: 384 });
11534
+ await import_node_fs.default.promises.rename(temporary, file);
11873
11535
  } catch (error2) {
11874
- await import_node_fs2.default.promises.rm(temporary, { force: true });
11536
+ await import_node_fs.default.promises.rm(temporary, { force: true });
11875
11537
  throw error2;
11876
11538
  }
11877
11539
  }
11878
11540
 
11879
- // src/drivers/electron/native/adblock/cosmetics.ts
11541
+ // src/electron/adblock/cosmetics.ts
11880
11542
  var import_electron = require("electron");
11881
11543
  var import_tldts_experimental3 = __toESM(require_cjs(), 1);
11882
11544
  var COSMETIC_INJECTION_CHANNEL = "@ghostery/adblocker/inject-cosmetic-filters";
@@ -11918,8 +11580,8 @@ function installCosmeticHandlers(input) {
11918
11580
  };
11919
11581
  }
11920
11582
 
11921
- // src/drivers/electron/native/adblock/settings.ts
11922
- var import_node_fs3 = __toESM(require("node:fs"), 1);
11583
+ // src/electron/adblock/settings.ts
11584
+ var import_node_fs2 = __toESM(require("node:fs"), 1);
11923
11585
  var AdBlockAllowlist = class {
11924
11586
  constructor(file) {
11925
11587
  this.file = file;
@@ -11946,7 +11608,7 @@ var AdBlockAllowlist = class {
11946
11608
  };
11947
11609
  function read(file) {
11948
11610
  try {
11949
- const value = JSON.parse(import_node_fs3.default.readFileSync(file, "utf8"));
11611
+ const value = JSON.parse(import_node_fs2.default.readFileSync(file, "utf8"));
11950
11612
  return new Set(Array.isArray(value.pausedHosts) ? value.pausedHosts.filter((item) => typeof item === "string").map(normalize).filter(Boolean) : []);
11951
11613
  } catch {
11952
11614
  return /* @__PURE__ */ new Set();
@@ -11956,7 +11618,7 @@ function normalize(value) {
11956
11618
  return value.trim().toLowerCase();
11957
11619
  }
11958
11620
 
11959
- // src/drivers/electron/native/adblock/policy.ts
11621
+ // src/electron/adblock/policy.ts
11960
11622
  function adBlockHostname(value) {
11961
11623
  try {
11962
11624
  return new URL(value).hostname.toLowerCase();
@@ -11968,7 +11630,7 @@ function isNativeAdBlockDisabled(value = process.env.AMALGM_BROWSER_ADBLOCK) {
11968
11630
  return /^(0|false|no|off)$/i.test(String(value || "").trim());
11969
11631
  }
11970
11632
 
11971
- // src/drivers/electron/native/adblock/index.ts
11633
+ // src/electron/adblock/index.ts
11972
11634
  var NativeAdBlocker = class {
11973
11635
  constructor(options) {
11974
11636
  this.options = options;
@@ -11988,7 +11650,7 @@ var NativeAdBlocker = class {
11988
11650
  disabled;
11989
11651
  cosmeticPreloadPath() {
11990
11652
  const generatedName = true ? "electron-preload.cjs" : "preload.js";
11991
- return this.disabled ? null : this.options.preloadPath || import_node_path3.default.join(__dirname, generatedName);
11653
+ return this.disabled ? null : this.options.preloadPath || import_node_path2.default.join(__dirname, generatedName);
11992
11654
  }
11993
11655
  install(session2) {
11994
11656
  if (this.installed === session2) return;
@@ -12125,15 +11787,10 @@ var NativeAdBlocker = class {
12125
11787
  }
12126
11788
  };
12127
11789
 
12128
- // src/drivers/electron/native/config.ts
12129
- function nativeBrowserSurfacesEnabled(value = process.env.AMALGM_BROWSER_WCV) {
12130
- return !/^(0|false|no|off)$/i.test(String(value || "").trim());
12131
- }
12132
-
12133
- // src/drivers/electron/native/policy.ts
11790
+ // src/electron/policy.ts
12134
11791
  var import_path = __toESM(require("path"), 1);
12135
- var WEB_PROTOCOLS2 = /* @__PURE__ */ new Set(["http:", "https:", "about:"]);
12136
- var EXTERNAL_PROTOCOLS2 = /* @__PURE__ */ new Set(["mailto:", "tel:"]);
11792
+ var WEB_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:", "about:"]);
11793
+ var EXTERNAL_PROTOCOLS = /* @__PURE__ */ new Set(["mailto:", "tel:"]);
12137
11794
  function parseUrl(value) {
12138
11795
  try {
12139
11796
  return new URL(value);
@@ -12143,13 +11800,13 @@ function parseUrl(value) {
12143
11800
  }
12144
11801
  function isAllowedWebUrl(value) {
12145
11802
  const parsed = parseUrl(value);
12146
- return Boolean(parsed && WEB_PROTOCOLS2.has(parsed.protocol));
11803
+ return Boolean(parsed && WEB_PROTOCOLS.has(parsed.protocol));
12147
11804
  }
12148
11805
  function isAllowedExternalUrl(value) {
12149
11806
  const parsed = parseUrl(value);
12150
- return Boolean(parsed && EXTERNAL_PROTOCOLS2.has(parsed.protocol));
11807
+ return Boolean(parsed && EXTERNAL_PROTOCOLS.has(parsed.protocol));
12151
11808
  }
12152
- function permissionOrigin2(requestingUrl, fallbackUrl) {
11809
+ function permissionOrigin(requestingUrl, fallbackUrl) {
12153
11810
  const parsed = parseUrl(requestingUrl) ?? parseUrl(fallbackUrl);
12154
11811
  return parsed?.origin && parsed.origin !== "null" ? parsed.origin : "";
12155
11812
  }
@@ -12173,18 +11830,19 @@ function nextAvailableDownloadPath(downloadsDirectory, filename, exists) {
12173
11830
  return candidate;
12174
11831
  }
12175
11832
 
12176
- // src/drivers/electron/native/session.ts
11833
+ // src/electron/session.ts
12177
11834
  var import_electron2 = require("electron");
12178
- var browserSession = null;
12179
- function getBrowserSession() {
12180
- if (!browserSession) browserSession = import_electron2.session.fromPartition(BROWSER_SESSION_PARTITION, { cache: true });
12181
- return browserSession;
11835
+ var import_node_crypto = require("node:crypto");
11836
+ function getBrowserSession(accountId) {
11837
+ if (!accountId) throw new Error("Native browsing requires an Amalgm account.");
11838
+ const key = (0, import_node_crypto.createHash)("sha256").update(accountId).digest("hex");
11839
+ return import_electron2.session.fromPartition(`persist:amalgm-browser-${key}`, { cache: true });
12182
11840
  }
12183
11841
 
12184
- // src/drivers/electron/native/surface-controller.ts
12185
- var import_electron5 = require("electron");
11842
+ // src/electron/surface-controller.ts
11843
+ var import_electron4 = require("electron");
12186
11844
 
12187
- // src/drivers/electron/native/surface/state.ts
11845
+ // src/electron/surface/state.ts
12188
11846
  function validSurfaceId(value) {
12189
11847
  return typeof value === "string" && value.length > 0 && value.length <= 200;
12190
11848
  }
@@ -12194,11 +11852,12 @@ function normalizeBounds(bounds, owner) {
12194
11852
  const width = finiteNumber(bounds?.width);
12195
11853
  const height = finiteNumber(bounds?.height);
12196
11854
  if (x === null || y === null || width === null || height === null) return null;
11855
+ const zoom = owner.webContents.getZoomFactor();
12197
11856
  const content = owner.getContentBounds();
12198
- const left = Math.max(0, Math.round(x));
12199
- const top = Math.max(0, Math.round(y));
12200
- const right = Math.min(content.width, Math.round(x + Math.max(0, width)));
12201
- const bottom = Math.min(content.height, Math.round(y + Math.max(0, height)));
11857
+ const left = Math.max(0, Math.round(x * zoom));
11858
+ const top = Math.max(0, Math.round(y * zoom));
11859
+ const right = Math.min(content.width, Math.round((x + Math.max(0, width)) * zoom));
11860
+ const bottom = Math.min(content.height, Math.round((y + Math.max(0, height)) * zoom));
12202
11861
  return { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) };
12203
11862
  }
12204
11863
  function stateFor(record) {
@@ -12238,7 +11897,7 @@ function finiteNumber(value) {
12238
11897
  return typeof value === "number" && Number.isFinite(value) ? value : null;
12239
11898
  }
12240
11899
 
12241
- // src/drivers/electron/native/surface/commands.ts
11900
+ // src/electron/surface/commands.ts
12242
11901
  var MIN_ZOOM = 0.5;
12243
11902
  var MAX_ZOOM = 3;
12244
11903
  function executeSurfaceCommand(record, request, presentation, isAllowedUrl) {
@@ -12283,7 +11942,7 @@ function executeSurfaceCommand(record, request, presentation, isAllowedUrl) {
12283
11942
  return stateFor(record);
12284
11943
  }
12285
11944
 
12286
- // src/drivers/electron/native/surface/create.ts
11945
+ // src/electron/surface/create.ts
12287
11946
  var import_electron3 = require("electron");
12288
11947
  function createSurfaceRecord(sender, request, options) {
12289
11948
  const owner = import_electron3.BrowserWindow.fromWebContents(sender);
@@ -12311,13 +11970,8 @@ function createSurfaceRecord(sender, request, options) {
12311
11970
  view,
12312
11971
  owner,
12313
11972
  embedder: sender,
12314
- isAutomation: request.isAutomation === true,
12315
- automationSessionId: validSurfaceId(request.automationSessionId) ? request.automationSessionId : null,
12316
- parkingWindow: null,
12317
- parent: "owner",
12318
11973
  bounds: { x: 0, y: 0, width: 0, height: 0 },
12319
11974
  requestedVisible: false,
12320
- displayScale: 1,
12321
11975
  zoomFactor: 1,
12322
11976
  ready: false,
12323
11977
  title: "",
@@ -12328,7 +11982,7 @@ function createSurfaceRecord(sender, request, options) {
12328
11982
  };
12329
11983
  }
12330
11984
 
12331
- // src/drivers/electron/native/surface/events.ts
11985
+ // src/electron/surface/events.ts
12332
11986
  function configureSurfaceEvents(record, presentation, sendState, destroyed) {
12333
11987
  const contents = record.view.webContents;
12334
11988
  contents.on("did-start-loading", () => {
@@ -12344,7 +11998,6 @@ function configureSurfaceEvents(record, presentation, sendState, destroyed) {
12344
11998
  contents.on("dom-ready", () => {
12345
11999
  record.ready = true;
12346
12000
  presentation.applyZoom(record);
12347
- stampAutomationIdentity(record);
12348
12001
  presentation.apply(record);
12349
12002
  sendState();
12350
12003
  });
@@ -12358,13 +12011,11 @@ function configureSurfaceEvents(record, presentation, sendState, destroyed) {
12358
12011
  });
12359
12012
  contents.on("did-navigate", () => {
12360
12013
  record.loadError = null;
12361
- stampAutomationIdentity(record);
12362
12014
  sendState();
12363
12015
  });
12364
12016
  contents.on("did-navigate-in-page", (_event, _url, mainFrame) => {
12365
12017
  if (!mainFrame) return;
12366
12018
  record.loadError = null;
12367
- stampAutomationIdentity(record);
12368
12019
  sendState();
12369
12020
  });
12370
12021
  contents.on("did-fail-load", (_event, code, description, url, mainFrame) => {
@@ -12381,110 +12032,34 @@ function configureSurfaceEvents(record, presentation, sendState, destroyed) {
12381
12032
  });
12382
12033
  contents.once("destroyed", destroyed);
12383
12034
  }
12384
- function stampAutomationIdentity(record) {
12385
- const contents = record.view.webContents;
12386
- if (!record.automationSessionId || contents.isDestroyed()) return;
12387
- void contents.executeJavaScript(
12388
- `window.__amalgmBsid = ${JSON.stringify(record.automationSessionId)};`
12389
- ).catch(() => {
12390
- });
12391
- }
12392
12035
 
12393
- // src/drivers/electron/native/surface/presentation.ts
12394
- var import_electron4 = require("electron");
12395
- var PARKED_VIEWPORT = { width: 1440, height: 900 };
12396
- var PARKING_ORIGIN = -1e4;
12036
+ // src/electron/surface/presentation.ts
12397
12037
  var MAX_ZOOM2 = 3;
12398
12038
  var SurfacePresentation = class {
12399
12039
  detach(record) {
12400
- if (record.parent === "owner" && !record.owner.isDestroyed()) {
12401
- record.owner.contentView.removeChildView(record.view);
12402
- }
12403
- if (record.parent === "parking" && record.parkingWindow && !record.parkingWindow.isDestroyed()) {
12404
- record.parkingWindow.contentView.removeChildView(record.view);
12405
- }
12406
- record.parent = null;
12040
+ if (!record.owner.isDestroyed()) record.owner.contentView.removeChildView(record.view);
12407
12041
  }
12408
12042
  applyZoom(record) {
12409
12043
  const contents = record.view.webContents;
12410
12044
  if (contents.isDestroyed()) return;
12411
- const scale = record.parent === "parking" ? 1 : record.displayScale;
12412
- const factor = Math.max(0.1, Math.min(MAX_ZOOM2, record.zoomFactor * scale));
12045
+ const factor = Math.max(0.1, Math.min(MAX_ZOOM2, record.zoomFactor));
12413
12046
  if (Math.abs(contents.getZoomFactor() - factor) >= 1e-3) contents.setZoomFactor(factor);
12414
12047
  }
12048
+ /** Shows the page in its tab's box while the tab asks and has room; hides it otherwise. */
12415
12049
  apply(record) {
12416
- const hasArea = record.bounds.width > 0 && record.bounds.height > 0;
12417
- if (record.requestedVisible && hasArea) this.show(record);
12418
- else this.hide(record);
12419
- }
12420
- destroyParking(record) {
12421
- if (record.parkingWindow && !record.parkingWindow.isDestroyed()) record.parkingWindow.destroy();
12422
- record.parkingWindow = null;
12423
- }
12424
- show(record) {
12425
- if (record.parent !== "owner") {
12426
- this.detach(record);
12427
- record.owner.contentView.addChildView(record.view);
12428
- record.parent = "owner";
12429
- record.parkingWindow?.hide();
12430
- } else {
12431
- record.owner.contentView.addChildView(record.view);
12432
- }
12433
- record.view.setBounds(record.bounds);
12434
- record.view.setVisible(true);
12435
- this.applyZoom(record);
12436
- }
12437
- hide(record) {
12438
- if (record.isAutomation) {
12439
- this.park(record);
12050
+ if (!record.requestedVisible || record.bounds.width <= 0 || record.bounds.height <= 0) {
12051
+ record.view.setVisible(false);
12440
12052
  return;
12441
12053
  }
12442
- if (record.parent !== "owner") {
12443
- this.detach(record);
12444
- record.owner.contentView.addChildView(record.view);
12445
- record.parent = "owner";
12446
- }
12447
- record.view.setVisible(false);
12448
- }
12449
- park(record) {
12450
- const parkingWindow = this.parkingWindow(record);
12451
- if (record.parent !== "parking") {
12452
- this.detach(record);
12453
- parkingWindow.contentView.addChildView(record.view);
12454
- record.parent = "parking";
12455
- }
12456
- record.view.setBounds({ x: 0, y: 0, ...PARKED_VIEWPORT });
12054
+ record.owner.contentView.addChildView(record.view);
12055
+ record.view.setBounds(record.bounds);
12457
12056
  record.view.setVisible(true);
12458
12057
  this.applyZoom(record);
12459
- parkingWindow.showInactive();
12460
- }
12461
- parkingWindow(record) {
12462
- if (record.parkingWindow && !record.parkingWindow.isDestroyed()) return record.parkingWindow;
12463
- record.parkingWindow = new import_electron4.BaseWindow({
12464
- show: false,
12465
- x: PARKING_ORIGIN,
12466
- y: PARKING_ORIGIN,
12467
- ...PARKED_VIEWPORT,
12468
- focusable: true,
12469
- skipTaskbar: true,
12470
- hiddenInMissionControl: true,
12471
- frame: false,
12472
- hasShadow: false,
12473
- closable: false,
12474
- minimizable: false,
12475
- maximizable: false,
12476
- movable: false,
12477
- resizable: false,
12478
- fullscreenable: false,
12479
- roundedCorners: false,
12480
- backgroundColor: "#ffffff"
12481
- });
12482
- return record.parkingWindow;
12483
12058
  }
12484
12059
  };
12485
12060
 
12486
- // src/drivers/electron/native/surface-controller.ts
12487
- var CAPTURE_TIMEOUT_MS = 300;
12061
+ // src/electron/surface-controller.ts
12062
+ var CAPTURE_STALL_MS = 2e3;
12488
12063
  function createBrowserSurfaceController(options) {
12489
12064
  const surfaces = /* @__PURE__ */ new Map();
12490
12065
  const ownerSurfaceIds = /* @__PURE__ */ new Map();
@@ -12498,7 +12073,6 @@ function createBrowserSurfaceController(options) {
12498
12073
  surfaces.delete(record.surfaceId);
12499
12074
  ownerSurfaceIds.get(record.embedder.id)?.delete(record.surfaceId);
12500
12075
  presentation.detach(record);
12501
- presentation.destroyParking(record);
12502
12076
  if (closeContents && !record.view.webContents.isDestroyed()) record.view.webContents.close();
12503
12077
  };
12504
12078
  const destroyOwned = (ownerId) => {
@@ -12512,7 +12086,8 @@ function createBrowserSurfaceController(options) {
12512
12086
  const record = surfaces.get(surfaceId);
12513
12087
  return record && record.embedder.id === sender.id && !record.disposed ? record : null;
12514
12088
  };
12515
- import_electron5.ipcMain.handle(BROWSER_IPC.surfaceCreate, async (event, request) => {
12089
+ import_electron4.ipcMain.handle(BROWSER_IPC.surfaceCreate, async (event, request) => {
12090
+ if (!options.isTrustedAppUrl(event.senderFrame?.url ?? "")) return null;
12516
12091
  if (!request || !validSurfaceId(request.surfaceId)) return null;
12517
12092
  const url = String(request.url || "about:blank");
12518
12093
  if (!options.isAllowedUrl(url)) return null;
@@ -12537,8 +12112,7 @@ function createBrowserSurfaceController(options) {
12537
12112
  options.onSurfaceCreated({
12538
12113
  contents: record.view.webContents,
12539
12114
  embedder: event.sender,
12540
- tabId: record.tabId,
12541
- isAutomation: record.isAutomation
12115
+ tabId: record.tabId
12542
12116
  });
12543
12117
  configureSurfaceEvents(
12544
12118
  record,
@@ -12550,43 +12124,37 @@ function createBrowserSurfaceController(options) {
12550
12124
  });
12551
12125
  return stateFor(record);
12552
12126
  });
12553
- import_electron5.ipcMain.handle(BROWSER_IPC.surfaceUpdate, (event, request) => {
12127
+ import_electron4.ipcMain.handle(BROWSER_IPC.surfaceUpdate, (event, request) => {
12554
12128
  const record = request ? ownedSurface(event.sender, request.surfaceId) : null;
12555
12129
  if (!record || record.owner.isDestroyed()) return false;
12556
12130
  const bounds = normalizeBounds(request.bounds, record.owner);
12557
12131
  if (!bounds) return false;
12558
- const isAutomation = request.isAutomation === true;
12559
- if (record.isAutomation !== isAutomation) {
12560
- record.isAutomation = isAutomation;
12561
- options.onAutomationChanged(record.view.webContents, isAutomation);
12562
- }
12563
12132
  record.bounds = bounds;
12564
12133
  record.requestedVisible = request.visible === true;
12565
- record.displayScale = Math.max(0.1, Math.min(1, Number(request.scale) || 1));
12566
12134
  presentation.apply(record);
12567
12135
  return true;
12568
12136
  });
12569
- import_electron5.ipcMain.handle(BROWSER_IPC.surfaceDestroy, (event, surfaceId) => {
12137
+ import_electron4.ipcMain.handle(BROWSER_IPC.surfaceDestroy, (event, surfaceId) => {
12570
12138
  const record = ownedSurface(event.sender, surfaceId);
12571
12139
  if (!record) return false;
12572
12140
  destroyRecord(record, true);
12573
12141
  return true;
12574
12142
  });
12575
- import_electron5.ipcMain.handle(BROWSER_IPC.surfaceCommand, (event, request) => {
12143
+ import_electron4.ipcMain.handle(BROWSER_IPC.surfaceCommand, (event, request) => {
12576
12144
  const record = request ? ownedSurface(event.sender, request.surfaceId) : null;
12577
12145
  if (!record || record.view.webContents.isDestroyed()) return null;
12578
12146
  const state = executeSurfaceCommand(record, request, presentation, options.isAllowedUrl);
12579
12147
  sendState(record);
12580
12148
  return state;
12581
12149
  });
12582
- import_electron5.ipcMain.handle(BROWSER_IPC.surfaceCapture, async (event, surfaceId) => {
12150
+ import_electron4.ipcMain.handle(BROWSER_IPC.surfaceCapture, async (event, surfaceId) => {
12583
12151
  const record = ownedSurface(event.sender, surfaceId);
12584
12152
  if (!record || record.view.webContents.isDestroyed()) return null;
12585
12153
  try {
12586
- const image = await withDeadline(record.view.webContents.capturePage(), CAPTURE_TIMEOUT_MS);
12154
+ const image = await withDeadline(record.view.webContents.capturePage(), CAPTURE_STALL_MS);
12587
12155
  if (image.isEmpty()) return null;
12588
12156
  const size = image.getSize();
12589
- const targetWidth = Math.min(size.width, Math.max(1, record.bounds.width || PARKED_VIEWPORT.width));
12157
+ const targetWidth = Math.min(size.width, Math.max(1, record.bounds.width || size.width));
12590
12158
  const normalized = size.width > targetWidth ? image.resize({ width: targetWidth, quality: "good" }) : image;
12591
12159
  return `data:image/jpeg;base64,${normalized.toJPEG(78).toString("base64")}`;
12592
12160
  } catch {
@@ -12597,29 +12165,29 @@ function createBrowserSurfaceController(options) {
12597
12165
  dispose() {
12598
12166
  for (const record of [...surfaces.values()]) destroyRecord(record, true);
12599
12167
  ownerSurfaceIds.clear();
12600
- import_electron5.ipcMain.removeHandler(BROWSER_IPC.surfaceCreate);
12601
- import_electron5.ipcMain.removeHandler(BROWSER_IPC.surfaceUpdate);
12602
- import_electron5.ipcMain.removeHandler(BROWSER_IPC.surfaceDestroy);
12603
- import_electron5.ipcMain.removeHandler(BROWSER_IPC.surfaceCommand);
12604
- import_electron5.ipcMain.removeHandler(BROWSER_IPC.surfaceCapture);
12168
+ import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceCreate);
12169
+ import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceUpdate);
12170
+ import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceDestroy);
12171
+ import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceCommand);
12172
+ import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceCapture);
12605
12173
  }
12606
12174
  };
12607
12175
  }
12608
12176
 
12609
- // src/drivers/electron/native/shell/adblock-ipc.ts
12610
- var import_electron6 = require("electron");
12177
+ // src/electron/shell/adblock-ipc.ts
12178
+ var import_electron5 = require("electron");
12611
12179
  var BrowserAdBlockIpc = class {
12612
12180
  constructor(blocker, sites) {
12613
12181
  this.blocker = blocker;
12614
12182
  this.sites = sites;
12615
- import_electron6.ipcMain.handle(BROWSER_IPC.adBlockGetStatus, this.getStatus);
12616
- import_electron6.ipcMain.handle(BROWSER_IPC.adBlockSetEnabled, this.setEnabled);
12183
+ import_electron5.ipcMain.handle(BROWSER_IPC.adBlockGetStatus, this.getStatus);
12184
+ import_electron5.ipcMain.handle(BROWSER_IPC.adBlockSetEnabled, this.setEnabled);
12617
12185
  }
12618
12186
  blocker;
12619
12187
  sites;
12620
12188
  dispose() {
12621
- import_electron6.ipcMain.removeHandler(BROWSER_IPC.adBlockGetStatus);
12622
- import_electron6.ipcMain.removeHandler(BROWSER_IPC.adBlockSetEnabled);
12189
+ import_electron5.ipcMain.removeHandler(BROWSER_IPC.adBlockGetStatus);
12190
+ import_electron5.ipcMain.removeHandler(BROWSER_IPC.adBlockSetEnabled);
12623
12191
  }
12624
12192
  getStatus = (event, guestId) => {
12625
12193
  if (!Number.isInteger(guestId)) return null;
@@ -12643,11 +12211,11 @@ var BrowserAdBlockIpc = class {
12643
12211
  };
12644
12212
  };
12645
12213
 
12646
- // src/drivers/electron/native/shell/context-menu.ts
12647
- var import_node_crypto = __toESM(require("node:crypto"), 1);
12648
- var import_electron7 = require("electron");
12214
+ // src/electron/shell/context-menu.ts
12215
+ var import_node_crypto2 = __toESM(require("node:crypto"), 1);
12216
+ var import_electron6 = require("electron");
12649
12217
 
12650
- // src/drivers/electron/native/shell/helpers.ts
12218
+ // src/electron/shell/helpers.ts
12651
12219
  function send(embedder, channel, payload2) {
12652
12220
  if (!embedder.isDestroyed()) embedder.send(channel, payload2);
12653
12221
  }
@@ -12666,7 +12234,7 @@ function shortcutForInput(input) {
12666
12234
  if (key === "=" || key === "+") return "zoom-in";
12667
12235
  return null;
12668
12236
  }
12669
- function popupWindowOptions(cosmeticPreloadPath, browserSession2) {
12237
+ function popupWindowOptions(cosmeticPreloadPath, browserSession) {
12670
12238
  return {
12671
12239
  width: 520,
12672
12240
  height: 680,
@@ -12679,7 +12247,7 @@ function popupWindowOptions(cosmeticPreloadPath, browserSession2) {
12679
12247
  trafficLightPosition: { x: 14, y: 14 }
12680
12248
  } : {},
12681
12249
  webPreferences: {
12682
- session: browserSession2,
12250
+ session: browserSession,
12683
12251
  nodeIntegration: false,
12684
12252
  contextIsolation: true,
12685
12253
  sandbox: true,
@@ -12690,17 +12258,17 @@ function popupWindowOptions(cosmeticPreloadPath, browserSession2) {
12690
12258
  };
12691
12259
  }
12692
12260
 
12693
- // src/drivers/electron/native/shell/context-menu.ts
12261
+ // src/electron/shell/context-menu.ts
12694
12262
  var BrowserContextMenuController = class {
12695
12263
  constructor(isDev) {
12696
12264
  this.isDev = isDev;
12697
- import_electron7.ipcMain.handle(BROWSER_IPC.contextAction, this.handleAction);
12265
+ import_electron6.ipcMain.handle(BROWSER_IPC.contextAction, this.handleAction);
12698
12266
  }
12699
12267
  isDev;
12700
12268
  requests = /* @__PURE__ */ new Map();
12701
12269
  show(site, params) {
12702
12270
  if (site.contents.id !== site.rootGuestId) {
12703
- const menu = import_electron7.Menu.buildFromTemplate([
12271
+ const menu = import_electron6.Menu.buildFromTemplate([
12704
12272
  ...params.isEditable ? [
12705
12273
  { role: "cut" },
12706
12274
  { role: "copy" },
@@ -12709,18 +12277,18 @@ var BrowserContextMenuController = class {
12709
12277
  ] : [],
12710
12278
  { role: "selectAll" }
12711
12279
  ]);
12712
- const owner = import_electron7.BrowserWindow.fromWebContents(site.contents);
12280
+ const owner = import_electron6.BrowserWindow.fromWebContents(site.contents);
12713
12281
  menu.popup(owner ? { window: owner } : {});
12714
12282
  return;
12715
12283
  }
12716
- const requestId = import_node_crypto.default.randomUUID();
12284
+ const requestId = import_node_crypto2.default.randomUUID();
12717
12285
  this.requests.clear();
12718
12286
  this.requests.set(requestId, { site, params });
12719
12287
  send(site.embedder, BROWSER_IPC.contextMenu, payload(requestId, site, params));
12720
12288
  }
12721
12289
  dispose() {
12722
12290
  this.requests.clear();
12723
- import_electron7.ipcMain.removeHandler(BROWSER_IPC.contextAction);
12291
+ import_electron6.ipcMain.removeHandler(BROWSER_IPC.contextAction);
12724
12292
  }
12725
12293
  handleAction = async (event, request) => {
12726
12294
  const context = request ? this.requests.get(request.requestId) : null;
@@ -12751,19 +12319,19 @@ var BrowserContextMenuController = class {
12751
12319
  contents.selectAll();
12752
12320
  break;
12753
12321
  case "copy-link":
12754
- if (params.linkURL) import_electron7.clipboard.writeText(params.linkURL);
12322
+ if (params.linkURL) import_electron6.clipboard.writeText(params.linkURL);
12755
12323
  break;
12756
12324
  case "copy-image":
12757
12325
  if (params.hasImageContents) contents.copyImageAt(params.x, params.y);
12758
12326
  break;
12759
12327
  case "copy-image-address":
12760
- if (params.srcURL) import_electron7.clipboard.writeText(params.srcURL);
12328
+ if (params.srcURL) import_electron6.clipboard.writeText(params.srcURL);
12761
12329
  break;
12762
12330
  case "open-link-new-tab":
12763
12331
  if (isAllowedWebUrl(params.linkURL)) this.openTab(site, params.linkURL);
12764
12332
  break;
12765
12333
  case "open-link-external":
12766
- if (isAllowedWebUrl(params.linkURL)) await import_electron7.shell.openExternal(params.linkURL);
12334
+ if (isAllowedWebUrl(params.linkURL)) await import_electron6.shell.openExternal(params.linkURL);
12767
12335
  break;
12768
12336
  case "save-link":
12769
12337
  if (isAllowedWebUrl(params.linkURL)) contents.downloadURL(params.linkURL);
@@ -12818,17 +12386,17 @@ function payload(requestId, site, params) {
12818
12386
  };
12819
12387
  }
12820
12388
 
12821
- // src/drivers/electron/native/shell/downloads.ts
12822
- var import_node_crypto2 = __toESM(require("node:crypto"), 1);
12823
- var import_node_fs4 = __toESM(require("node:fs"), 1);
12824
- var import_electron8 = require("electron");
12389
+ // src/electron/shell/downloads.ts
12390
+ var import_node_crypto3 = __toESM(require("node:crypto"), 1);
12391
+ var import_node_fs3 = __toESM(require("node:fs"), 1);
12392
+ var import_electron7 = require("electron");
12825
12393
  var UPDATE_INTERVAL_MS = 100;
12826
12394
  var BrowserDownloadController = class {
12827
- constructor(browserSession2, sites) {
12828
- this.browserSession = browserSession2;
12395
+ constructor(browserSession, sites) {
12396
+ this.browserSession = browserSession;
12829
12397
  this.sites = sites;
12830
- browserSession2.on("will-download", this.started);
12831
- import_electron8.ipcMain.handle(BROWSER_IPC.downloadAction, this.handleAction);
12398
+ browserSession.on("will-download", this.started);
12399
+ import_electron7.ipcMain.handle(BROWSER_IPC.downloadAction, this.handleAction);
12832
12400
  }
12833
12401
  browserSession;
12834
12402
  sites;
@@ -12836,13 +12404,13 @@ var BrowserDownloadController = class {
12836
12404
  dispose() {
12837
12405
  this.downloads.clear();
12838
12406
  this.browserSession.off("will-download", this.started);
12839
- import_electron8.ipcMain.removeHandler(BROWSER_IPC.downloadAction);
12407
+ import_electron7.ipcMain.removeHandler(BROWSER_IPC.downloadAction);
12840
12408
  }
12841
12409
  started = (_event, item, contents) => {
12842
12410
  const site = this.sites.get(contents.id);
12843
12411
  if (!site) return;
12844
- const id = import_node_crypto2.default.randomUUID();
12845
- const savePath = nextAvailableDownloadPath(import_electron8.app.getPath("downloads"), item.getFilename(), import_node_fs4.default.existsSync);
12412
+ const id = import_node_crypto3.default.randomUUID();
12413
+ const savePath = nextAvailableDownloadPath(import_electron7.app.getPath("downloads"), item.getFilename(), import_node_fs3.default.existsSync);
12846
12414
  item.setSavePath(savePath);
12847
12415
  const payload2 = {
12848
12416
  id,
@@ -12894,12 +12462,12 @@ var BrowserDownloadController = class {
12894
12462
  break;
12895
12463
  case "open": {
12896
12464
  if (record.payload.state !== "completed") return false;
12897
- const error2 = await import_electron8.shell.openPath(record.payload.savePath);
12465
+ const error2 = await import_electron7.shell.openPath(record.payload.savePath);
12898
12466
  if (error2) throw new Error(error2);
12899
12467
  break;
12900
12468
  }
12901
12469
  case "show":
12902
- import_electron8.shell.showItemInFolder(record.payload.savePath);
12470
+ import_electron7.shell.showItemInFolder(record.payload.savePath);
12903
12471
  break;
12904
12472
  case "remove":
12905
12473
  this.downloads.delete(request.id);
@@ -12918,18 +12486,18 @@ function percentComplete(item) {
12918
12486
  return total <= 0 ? null : Math.max(0, Math.min(100, Math.round(item.getReceivedBytes() / total * 100)));
12919
12487
  }
12920
12488
 
12921
- // src/drivers/electron/native/shell/permissions.ts
12922
- var import_node_crypto3 = __toESM(require("node:crypto"), 1);
12923
- var import_electron9 = require("electron");
12489
+ // src/electron/shell/permissions.ts
12490
+ var import_node_crypto4 = __toESM(require("node:crypto"), 1);
12491
+ var import_electron8 = require("electron");
12924
12492
  var PERMISSION_TIMEOUT_MS = 3e4;
12925
12493
  var BrowserPermissionController = class {
12926
- constructor(browserSession2, sites, isTrustedAppUrl) {
12927
- this.browserSession = browserSession2;
12494
+ constructor(browserSession, sites, isTrustedAppUrl) {
12495
+ this.browserSession = browserSession;
12928
12496
  this.sites = sites;
12929
12497
  this.isTrustedAppUrl = isTrustedAppUrl;
12930
- browserSession2.setPermissionCheckHandler(this.check);
12931
- browserSession2.setPermissionRequestHandler(this.request);
12932
- import_electron9.ipcMain.on(BROWSER_IPC.permissionResponse, this.respond);
12498
+ browserSession.setPermissionCheckHandler(this.check);
12499
+ browserSession.setPermissionRequestHandler(this.request);
12500
+ import_electron8.ipcMain.on(BROWSER_IPC.permissionResponse, this.respond);
12933
12501
  }
12934
12502
  browserSession;
12935
12503
  sites;
@@ -12944,19 +12512,19 @@ var BrowserPermissionController = class {
12944
12512
  this.pending.clear();
12945
12513
  this.browserSession.setPermissionCheckHandler(null);
12946
12514
  this.browserSession.setPermissionRequestHandler(null);
12947
- import_electron9.ipcMain.off(BROWSER_IPC.permissionResponse, this.respond);
12515
+ import_electron8.ipcMain.off(BROWSER_IPC.permissionResponse, this.respond);
12948
12516
  }
12949
12517
  check = (contents, permission, requestingOrigin, details) => {
12950
12518
  const requestingUrl = details.requestingUrl || requestingOrigin;
12951
12519
  const site = this.findSite(contents, requestingUrl);
12952
- const origin = permissionOrigin2(requestingUrl, site?.contents.getURL() || "");
12520
+ const origin = permissionOrigin(requestingUrl, site?.contents.getURL() || "");
12953
12521
  if (site && origin) return this.decisions.get(permissionKey(origin, permission)) === true;
12954
12522
  return Boolean(origin && this.isTrustedAppUrl(origin) && (!contents || this.isTrustedAppUrl(contents.getURL())));
12955
12523
  };
12956
12524
  request = (contents, permission, callback, details) => {
12957
12525
  const requestingUrl = details.requestingUrl || contents.getURL();
12958
12526
  const site = this.findSite(contents, requestingUrl);
12959
- const origin = permissionOrigin2(requestingUrl, site?.contents.getURL() || "");
12527
+ const origin = permissionOrigin(requestingUrl, site?.contents.getURL() || "");
12960
12528
  if (!site && origin && this.isTrustedAppUrl(origin) && this.isTrustedAppUrl(contents.getURL())) {
12961
12529
  callback(true);
12962
12530
  return;
@@ -12976,7 +12544,7 @@ var BrowserPermissionController = class {
12976
12544
  inFlight.callbacks.push(callback);
12977
12545
  return;
12978
12546
  }
12979
- const requestId = import_node_crypto3.default.randomUUID();
12547
+ const requestId = import_node_crypto4.default.randomUUID();
12980
12548
  const timer = setTimeout(() => this.finish(requestId, false, false), PERMISSION_TIMEOUT_MS);
12981
12549
  this.pending.set(requestId, {
12982
12550
  embedderId: site.embedder.id,
@@ -13009,9 +12577,9 @@ var BrowserPermissionController = class {
13009
12577
  if (!contents) return null;
13010
12578
  const direct = this.sites.get(contents.id);
13011
12579
  if (direct) return direct;
13012
- const origin = permissionOrigin2(requestingUrl, "");
12580
+ const origin = permissionOrigin(requestingUrl, "");
13013
12581
  if (!origin) return null;
13014
- return [...this.sites.values()].find((site) => site.embedder.id === contents.id && permissionOrigin2(site.contents.getURL(), "") === origin) ?? null;
12582
+ return [...this.sites.values()].find((site) => site.embedder.id === contents.id && permissionOrigin(site.contents.getURL(), "") === origin) ?? null;
13015
12583
  }
13016
12584
  };
13017
12585
  function mediaTypes(details) {
@@ -13023,15 +12591,14 @@ function permissionKey(origin, permission) {
13023
12591
  ${permission}`;
13024
12592
  }
13025
12593
 
13026
- // src/drivers/electron/native/shell/sites.ts
13027
- var import_electron10 = require("electron");
12594
+ // src/electron/shell/sites.ts
12595
+ var import_electron9 = require("electron");
13028
12596
  var BrowserSiteManager = class {
13029
12597
  constructor(options) {
13030
12598
  this.options = options;
13031
12599
  }
13032
12600
  options;
13033
12601
  sites = /* @__PURE__ */ new Map();
13034
- automationEmbedders = /* @__PURE__ */ new Map();
13035
12602
  get(webContentsId) {
13036
12603
  return this.sites.get(webContentsId);
13037
12604
  }
@@ -13043,19 +12610,11 @@ var BrowserSiteManager = class {
13043
12610
  }
13044
12611
  configure(site) {
13045
12612
  this.sites.set(site.contents.id, site);
13046
- try {
13047
- site.contents.setBackgroundThrottling(!site.isAutomation);
13048
- } catch {
13049
- }
13050
- if (site.isAutomation) {
13051
- site.isAutomation = false;
13052
- this.updateAutomation(site, true);
13053
- }
13054
12613
  this.configurePopups(site);
13055
12614
  site.contents.on("will-navigate", (event, url) => {
13056
12615
  if (isAllowedWebUrl(url)) return;
13057
12616
  event.preventDefault();
13058
- if (isAllowedExternalUrl(url)) void import_electron10.shell.openExternal(url);
12617
+ if (isAllowedExternalUrl(url)) void import_electron9.shell.openExternal(url);
13059
12618
  });
13060
12619
  site.contents.on("did-navigate", () => {
13061
12620
  if (site.contents.id === site.rootGuestId) {
@@ -13077,25 +12636,8 @@ var BrowserSiteManager = class {
13077
12636
  });
13078
12637
  site.contents.once("destroyed", () => this.remove(site));
13079
12638
  }
13080
- updateAutomation(site, isAutomation) {
13081
- if (site.isAutomation === isAutomation) return;
13082
- site.isAutomation = isAutomation;
13083
- try {
13084
- site.contents.setBackgroundThrottling(!isAutomation);
13085
- } catch {
13086
- }
13087
- const current = this.automationEmbedders.get(site.embedder.id) ?? 0;
13088
- const next = Math.max(0, current + (isAutomation ? 1 : -1));
13089
- if (next > 0) this.automationEmbedders.set(site.embedder.id, next);
13090
- else this.automationEmbedders.delete(site.embedder.id);
13091
- try {
13092
- site.embedder.setBackgroundThrottling(next === 0);
13093
- } catch {
13094
- }
13095
- }
13096
12639
  dispose() {
13097
12640
  this.sites.clear();
13098
- this.automationEmbedders.clear();
13099
12641
  }
13100
12642
  configurePopups(site) {
13101
12643
  site.contents.setWindowOpenHandler((details) => {
@@ -13105,7 +12647,7 @@ var BrowserSiteManager = class {
13105
12647
  return { action: "deny" };
13106
12648
  }
13107
12649
  if (isAllowedExternalUrl(url)) {
13108
- void import_electron10.shell.openExternal(url);
12650
+ void import_electron9.shell.openExternal(url);
13109
12651
  return { action: "deny" };
13110
12652
  }
13111
12653
  if (!isAllowedWebUrl(url)) return { action: "deny" };
@@ -13122,28 +12664,348 @@ var BrowserSiteManager = class {
13122
12664
  contents: window2.webContents,
13123
12665
  embedder: site.embedder,
13124
12666
  rootGuestId: site.rootGuestId,
13125
- tabId: site.tabId,
13126
- isAutomation: false
12667
+ tabId: site.tabId
13127
12668
  }));
13128
12669
  }
13129
12670
  remove(site) {
13130
12671
  this.sites.delete(site.contents.id);
13131
- if (site.isAutomation) this.updateAutomation(site, false);
13132
12672
  if (site.contents.id === site.rootGuestId) this.options.adBlocker.forgetGuest(site.rootGuestId);
13133
12673
  }
13134
12674
  };
13135
- function shellSite(contents, embedder, tabId, isAutomation) {
13136
- return { contents, embedder, rootGuestId: contents.id, tabId, isAutomation };
12675
+ function shellSite(contents, embedder, tabId) {
12676
+ return { contents, embedder, rootGuestId: contents.id, tabId };
12677
+ }
12678
+
12679
+ // node_modules/@amalgm/core/dist/transport/auth.js
12680
+ var utf8 = new TextEncoder();
12681
+ var RUNTIME_TOKEN_HEADER = "x-amalgm-runtime-token";
12682
+ var LOOPBACK_ORIGIN_HOSTNAMES = ["localhost", "127.0.0.1", "[::1]", "::1"];
12683
+ var RUNTIME_CORS_ALLOWED_HEADERS = [
12684
+ "Content-Type",
12685
+ "Authorization",
12686
+ "Accept",
12687
+ "Cache-Control",
12688
+ "Last-Event-ID",
12689
+ "Mcp-Session-Id",
12690
+ "X-Amalgm-Session-Id",
12691
+ RUNTIME_TOKEN_HEADER
12692
+ ].join(", ");
12693
+
12694
+ // node_modules/@amalgm/core/dist/transport/state/api.js
12695
+ var encoder = new TextEncoder();
12696
+
12697
+ // node_modules/@amalgm/core/dist/transport/diagnostics.js
12698
+ var DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES = 256 * 1024;
12699
+ var MAX_DIAGNOSTIC_LOG_TAIL_BYTES = 2 * 1024 * 1024;
12700
+
12701
+ // src/cookies/policy.ts
12702
+ var PROTECTED_HOSTS = [
12703
+ "amalgm.ai",
12704
+ "supabase.co",
12705
+ "supabase.io",
12706
+ "supabase.in",
12707
+ ...LOOPBACK_ORIGIN_HOSTNAMES
12708
+ ];
12709
+ function normalizeCookieDomain(value) {
12710
+ return value.trim().replace(/^\./, "").toLowerCase();
12711
+ }
12712
+ function cookieHostIsProtected(value, excluded = []) {
12713
+ const host = normalizeCookieDomain(value);
12714
+ return [...PROTECTED_HOSTS, ...excluded.map(normalizeCookieDomain)].some((candidate) => host === candidate || host.endsWith(`.${candidate}`));
12715
+ }
12716
+ function normalizePartition(partition) {
12717
+ if (!partition?.topLevelSite) return void 0;
12718
+ try {
12719
+ const url = new URL(partition.topLevelSite);
12720
+ if (!["http:", "https:"].includes(url.protocol)) return void 0;
12721
+ const site = url.origin;
12722
+ return { topLevelSite: site, ...partition.hasCrossSiteAncestor === void 0 ? {} : { hasCrossSiteAncestor: partition.hasCrossSiteAncestor } };
12723
+ } catch {
12724
+ return void 0;
12725
+ }
12726
+ }
12727
+ function normalizeCookie(cookie, excluded = []) {
12728
+ const name = String(cookie.name || "").slice(0, 512);
12729
+ const host = normalizeCookieDomain(cookie.domain || "");
12730
+ const domain = cookie.domain?.trim().startsWith(".") ? `.${host}` : host;
12731
+ const path6 = cookie.path?.startsWith("/") ? cookie.path : "/";
12732
+ if (!name || !host || cookieHostIsProtected(host, excluded)) return null;
12733
+ const partitionKey = normalizePartition(cookie.partitionKey);
12734
+ if (cookie.partitionKey && !partitionKey) return null;
12735
+ return {
12736
+ name,
12737
+ value: String(cookie.value || ""),
12738
+ domain,
12739
+ path: path6,
12740
+ ...Number.isFinite(cookie.expires) ? { expires: cookie.expires } : {},
12741
+ ...cookie.httpOnly === void 0 ? {} : { httpOnly: cookie.httpOnly },
12742
+ ...cookie.secure === void 0 ? {} : { secure: cookie.secure },
12743
+ ...cookie.sameSite ? { sameSite: cookie.sameSite } : {},
12744
+ ...partitionKey ? { partitionKey } : {}
12745
+ };
12746
+ }
12747
+ function cookieKey(cookie) {
12748
+ const partition = normalizePartition(cookie.partitionKey);
12749
+ return JSON.stringify([
12750
+ cookie.domain.trim().toLowerCase(),
12751
+ cookie.path || "/",
12752
+ cookie.name,
12753
+ partition?.topLevelSite || "",
12754
+ partition?.hasCrossSiteAncestor ?? null
12755
+ ]);
12756
+ }
12757
+
12758
+ // src/cookies/diff.ts
12759
+ function diffCookies(before, after) {
12760
+ const left = new Map(before.map((cookie) => [cookieKey(cookie), cookie]));
12761
+ const right = new Map(after.map((cookie) => [cookieKey(cookie), cookie]));
12762
+ const upserts = [...right].filter(([key, value]) => !sameCookie(value, left.get(key))).map(([, value]) => value);
12763
+ const deletes = [...left].filter(([key]) => !right.has(key)).map(([, value]) => ({
12764
+ name: value.name,
12765
+ domain: value.domain,
12766
+ path: value.path,
12767
+ ...value.partitionKey ? { partitionKey: value.partitionKey } : {}
12768
+ }));
12769
+ return { upserts, deletes };
12770
+ }
12771
+ function sameCookie(left, right) {
12772
+ return left === right || !!left && !!right && left.value === right.value && left.expires === right.expires && Boolean(left.httpOnly) === Boolean(right.httpOnly) && Boolean(left.secure) === Boolean(right.secure) && (left.sameSite || "Lax") === (right.sameSite || "Lax");
12773
+ }
12774
+
12775
+ // src/cookies/coordinator.ts
12776
+ var BrowserCookieCoordinator = class {
12777
+ constructor(store) {
12778
+ this.store = store;
12779
+ }
12780
+ store;
12781
+ connections = /* @__PURE__ */ new Map();
12782
+ unsubscribeStore;
12783
+ register(adapter) {
12784
+ if (this.connections.has(adapter.id)) throw new Error(`Cookie adapter ${adapter.id} is already registered.`);
12785
+ const connection = {
12786
+ adapter,
12787
+ current: /* @__PURE__ */ new Map(),
12788
+ expected: /* @__PURE__ */ new Map(),
12789
+ pending: /* @__PURE__ */ new Map(),
12790
+ unsubscribe: () => {
12791
+ },
12792
+ initialized: false,
12793
+ dirty: false,
12794
+ closed: false,
12795
+ excludedHosts: this.store.excludedHosts || []
12796
+ };
12797
+ this.connections.set(adapter.id, connection);
12798
+ connection.unsubscribe = adapter.subscribe((change) => {
12799
+ if (connection.closed) return;
12800
+ if (!change) connection.initialized = false;
12801
+ else {
12802
+ const cookie = this.portable(connection, change.cookie);
12803
+ if (!cookie) return;
12804
+ const key = cookieKey(cookie);
12805
+ const value = change.removed ? void 0 : cookie;
12806
+ if (value) connection.current.set(key, value);
12807
+ else connection.current.delete(key);
12808
+ if (connection.expected.has(key) && sameCookie(value, connection.expected.get(key))) {
12809
+ connection.expected.delete(key);
12810
+ return;
12811
+ }
12812
+ connection.pending.set(key, { cookie, removed: change.removed });
12813
+ }
12814
+ this.wake(connection);
12815
+ });
12816
+ this.unsubscribeStore ||= this.store.subscribe?.(() => {
12817
+ for (const entry of this.connections.values()) this.wake(entry);
12818
+ });
12819
+ }
12820
+ sync(adapterId) {
12821
+ const connection = this.connections.get(adapterId);
12822
+ if (!connection || connection.closed) return Promise.resolve();
12823
+ connection.dirty = true;
12824
+ return this.flush(connection);
12825
+ }
12826
+ unregister(adapterId) {
12827
+ const connection = this.connections.get(adapterId);
12828
+ if (!connection) return;
12829
+ connection.closed = true;
12830
+ connection.unsubscribe();
12831
+ this.connections.delete(adapterId);
12832
+ if (!this.connections.size) {
12833
+ this.unsubscribeStore?.();
12834
+ this.unsubscribeStore = void 0;
12835
+ }
12836
+ }
12837
+ async close(adapterId) {
12838
+ try {
12839
+ await this.sync(adapterId);
12840
+ } finally {
12841
+ this.unregister(adapterId);
12842
+ }
12843
+ }
12844
+ wake(connection) {
12845
+ connection.dirty = true;
12846
+ if (!connection.running) void this.flush(connection).catch(() => void 0);
12847
+ }
12848
+ flush(connection) {
12849
+ if (connection.running) return connection.running;
12850
+ connection.running = Promise.resolve().then(() => this.drain(connection)).finally(() => {
12851
+ delete connection.running;
12852
+ if (connection.dirty && !connection.closed) this.wake(connection);
12853
+ });
12854
+ return connection.running;
12855
+ }
12856
+ async drain(connection) {
12857
+ while (connection.dirty && !connection.closed) {
12858
+ connection.dirty = false;
12859
+ if (!connection.initialized) await this.initialize(connection);
12860
+ if (!connection.initialized || connection.closed) return;
12861
+ const pending = connection.pending;
12862
+ connection.pending = /* @__PURE__ */ new Map();
12863
+ if (pending.size) {
12864
+ try {
12865
+ await this.store.merge({
12866
+ sourceId: connection.adapter.id,
12867
+ upserts: [...pending.values()].filter((change) => !change.removed).map((change) => change.cookie),
12868
+ deletes: [...pending.values()].filter((change) => change.removed).map((change) => change.cookie)
12869
+ });
12870
+ } catch (error2) {
12871
+ for (const [key, change] of pending) if (!connection.pending.has(key)) connection.pending.set(key, change);
12872
+ throw error2;
12873
+ }
12874
+ }
12875
+ const delta = await this.store.changes(connection.version);
12876
+ if (!delta.healthy || connection.closed) return;
12877
+ if (delta.reset) {
12878
+ connection.initialized = false;
12879
+ connection.dirty = true;
12880
+ continue;
12881
+ }
12882
+ await this.apply(connection, delta);
12883
+ connection.version = delta.versionToken;
12884
+ }
12885
+ }
12886
+ async initialize(connection) {
12887
+ const state = await this.store.materialize();
12888
+ if (!state.healthy || connection.closed) return;
12889
+ connection.excludedHosts = this.store.excludedHosts || state.excludedHosts || [];
12890
+ const local = (await connection.adapter.read()).flatMap((cookie) => this.portable(connection, cookie) || []);
12891
+ if (connection.closed) return;
12892
+ const previous = connection.current;
12893
+ connection.current = new Map(local.map((cookie) => [cookieKey(cookie), cookie]));
12894
+ const known = /* @__PURE__ */ new Set([...state.cookies.map(cookieKey), ...state.tombstones.map(({ key }) => key)]);
12895
+ const changes = connection.version === void 0 ? { upserts: local.filter((cookie) => !known.has(cookieKey(cookie))), deletes: [] } : diffCookies([...previous.values()], local);
12896
+ changes.upserts = changes.upserts.filter((cookie) => !sameCookie(cookie, connection.expected.get(cookieKey(cookie))));
12897
+ changes.deletes = changes.deletes.filter((cookie) => !connection.expected.has(cookieKey(cookie)) || connection.expected.get(cookieKey(cookie)) !== void 0);
12898
+ connection.expected.clear();
12899
+ if (changes.upserts.length || changes.deletes.length) await this.store.merge({ sourceId: connection.adapter.id, ...changes });
12900
+ const changed = new Set([...changes.upserts, ...changes.deletes].map(cookieKey));
12901
+ const target = [...state.cookies.filter((cookie) => !changed.has(cookieKey(cookie))), ...changes.upserts].flatMap((cookie) => this.portable(connection, cookie) || []);
12902
+ await this.apply(connection, { ...diffCookies(local, target), versionToken: state.versionToken });
12903
+ connection.version = state.versionToken;
12904
+ connection.initialized = true;
12905
+ }
12906
+ async apply(connection, delta) {
12907
+ const upserts = delta.upserts.flatMap((cookie) => this.portable(connection, cookie) || []).filter((cookie) => !sameCookie(cookie, connection.current.get(cookieKey(cookie))));
12908
+ const deletes = delta.deletes.filter((cookie) => this.portable(connection, { ...cookie, value: "" }) && connection.current.has(cookieKey(cookie)));
12909
+ if (!upserts.length && !deletes.length || connection.closed) return;
12910
+ for (const cookie of upserts) connection.expected.set(cookieKey(cookie), cookie);
12911
+ for (const cookie of deletes) connection.expected.set(cookieKey(cookie), void 0);
12912
+ await connection.adapter.apply({ upserts, deletes, versionToken: delta.versionToken });
12913
+ for (const cookie of upserts) if (!connection.pending.has(cookieKey(cookie))) connection.current.set(cookieKey(cookie), cookie);
12914
+ for (const cookie of deletes) if (!connection.pending.has(cookieKey(cookie))) connection.current.delete(cookieKey(cookie));
12915
+ }
12916
+ portable(connection, cookie) {
12917
+ if (cookie.partitionKey && !connection.adapter.supportsPartitionedCookies) return null;
12918
+ return normalizeCookie(cookie, connection.excludedHosts);
12919
+ }
12920
+ };
12921
+
12922
+ // src/electron/cookie-adapter.ts
12923
+ var ELECTRON_COOKIE_ADAPTER_ID = "electron:account";
12924
+ var ElectronCookieAdapter = class {
12925
+ constructor(cookies) {
12926
+ this.cookies = cookies;
12927
+ }
12928
+ cookies;
12929
+ id = ELECTRON_COOKIE_ADAPTER_ID;
12930
+ supportsPartitionedCookies = false;
12931
+ async read() {
12932
+ return (await this.cookies.get({})).map(fromElectron);
12933
+ }
12934
+ async apply(input) {
12935
+ input.signal?.throwIfAborted();
12936
+ for (const cookie of input.upserts) {
12937
+ input.signal?.throwIfAborted();
12938
+ if (!cookie.partitionKey) await this.cookies.set(toElectron(cookie));
12939
+ }
12940
+ for (const cookie of input.deletes || []) {
12941
+ input.signal?.throwIfAborted();
12942
+ if (cookie.partitionKey) continue;
12943
+ await this.cookies.set(toElectron({ ...cookie, value: "", secure: true, expires: 0 }));
12944
+ }
12945
+ }
12946
+ subscribe(changed) {
12947
+ const listener = (_event, cookie, cause, removed) => {
12948
+ if (removed && cause === "overwrite") return;
12949
+ changed({ cookie: fromElectron(cookie), removed });
12950
+ };
12951
+ this.cookies.on("changed", listener);
12952
+ return () => this.cookies.off("changed", listener);
12953
+ }
12954
+ };
12955
+ function fromElectron(cookie) {
12956
+ return {
12957
+ name: cookie.name,
12958
+ value: cookie.value,
12959
+ domain: cookie.domain || "",
12960
+ path: cookie.path || "/",
12961
+ ...typeof cookie.expirationDate === "number" && cookie.expirationDate >= 0 ? { expires: cookie.expirationDate } : {},
12962
+ httpOnly: Boolean(cookie.httpOnly),
12963
+ secure: Boolean(cookie.secure),
12964
+ sameSite: cookie.sameSite === "strict" ? "Strict" : cookie.sameSite === "no_restriction" ? "None" : "Lax"
12965
+ };
12966
+ }
12967
+ function toElectron(cookie) {
12968
+ const hostOnly = !cookie.domain.startsWith(".");
12969
+ return {
12970
+ url: cookieUrl(cookie.domain, cookie.path, Boolean(cookie.secure) || cookie.sameSite === "None"),
12971
+ name: cookie.name,
12972
+ value: cookie.value,
12973
+ path: cookie.path || "/",
12974
+ secure: Boolean(cookie.secure),
12975
+ httpOnly: Boolean(cookie.httpOnly),
12976
+ sameSite: cookie.sameSite === "Strict" ? "strict" : cookie.sameSite === "None" ? "no_restriction" : "lax",
12977
+ ...!hostOnly ? { domain: cookie.domain } : {},
12978
+ ...typeof cookie.expires === "number" ? { expirationDate: cookie.expires } : {}
12979
+ };
12980
+ }
12981
+ function cookieUrl(domain, path6, secure) {
12982
+ const host = domain.trim().toLowerCase().replace(/^\.+/, "");
12983
+ const normalizedPath = String(path6 || "/").startsWith("/") ? path6 || "/" : `/${path6}`;
12984
+ return `${secure ? "https" : "http"}://${host}${normalizedPath}`;
12985
+ }
12986
+
12987
+ // src/electron/cookie-sync.ts
12988
+ function syncElectronCookies(cookies, store) {
12989
+ const adapter = new ElectronCookieAdapter(cookies);
12990
+ const coordinator = new BrowserCookieCoordinator(store);
12991
+ coordinator.register(adapter);
12992
+ const sync = () => coordinator.sync(adapter.id);
12993
+ void sync().catch(() => void 0);
12994
+ return { async close() {
12995
+ try {
12996
+ await coordinator.close(adapter.id);
12997
+ } catch {
12998
+ }
12999
+ } };
13137
13000
  }
13138
13001
 
13139
- // src/drivers/electron/native/shell.ts
13140
- var AUTOMATION_MARKER = "amalgm-bsid-";
13002
+ // src/electron/shell.ts
13141
13003
  function createBrowserShell(options) {
13142
13004
  let sites;
13143
- const adBlockDirectory = import_node_path4.default.join(import_electron11.app.getPath("userData"), "browser", "adblock");
13005
+ const adBlockDirectory = import_node_path3.default.join(import_electron10.app.getPath("userData"), "browser", "adblock");
13144
13006
  const adBlocker = new NativeAdBlocker({
13145
- cachePath: import_node_path4.default.join(adBlockDirectory, "engine.bin"),
13146
- settingsPath: import_node_path4.default.join(adBlockDirectory, "settings.json"),
13007
+ cachePath: import_node_path3.default.join(adBlockDirectory, "engine.bin"),
13008
+ settingsPath: import_node_path3.default.join(adBlockDirectory, "settings.json"),
13147
13009
  resolvePage(webContentsId) {
13148
13010
  const site = sites?.get(webContentsId);
13149
13011
  if (!site || site.contents.isDestroyed()) return null;
@@ -13162,262 +13024,167 @@ function createBrowserShell(options) {
13162
13024
  },
13163
13025
  ...options.adBlockFetch ? { fetch: options.adBlockFetch } : {}
13164
13026
  });
13165
- const browserSession2 = getBrowserSession();
13027
+ const browserSession = getBrowserSession(options.accountId);
13028
+ const cookieSync = options.cookieStore ? syncElectronCookies(browserSession.cookies, options.cookieStore) : null;
13166
13029
  const contextMenus = new BrowserContextMenuController(options.isDev);
13167
- sites = new BrowserSiteManager({ browserSession: browserSession2, adBlocker, contextMenus });
13168
- const permissions = new BrowserPermissionController(browserSession2, sites, options.isTrustedAppUrl);
13169
- const downloads = new BrowserDownloadController(browserSession2, sites);
13030
+ sites = new BrowserSiteManager({ browserSession, adBlocker, contextMenus });
13031
+ const permissions = new BrowserPermissionController(browserSession, sites, options.isTrustedAppUrl);
13032
+ const downloads = new BrowserDownloadController(browserSession, sites);
13170
13033
  const adBlockIpc = new BrowserAdBlockIpc(adBlocker, sites);
13171
- adBlocker.install(browserSession2);
13172
- const surfaceController = nativeBrowserSurfacesEnabled() ? createBrowserSurfaceController({
13173
- browserSession: browserSession2,
13034
+ adBlocker.install(browserSession);
13035
+ const surfaceController = createBrowserSurfaceController({
13036
+ browserSession,
13174
13037
  cosmeticPreloadPath: () => adBlocker.cosmeticPreloadPath(),
13175
13038
  isAllowedUrl: isAllowedWebUrl,
13039
+ isTrustedAppUrl: options.isTrustedAppUrl,
13176
13040
  onSurfaceCreated(surface) {
13177
- sites?.configure(shellSite(
13178
- surface.contents,
13179
- surface.embedder,
13180
- surface.tabId,
13181
- surface.isAutomation
13182
- ));
13041
+ sites?.configure(shellSite(surface.contents, surface.embedder, surface.tabId));
13183
13042
  adBlocker.publish(surface.contents.id, surface.contents.id);
13184
- },
13185
- onAutomationChanged(contents, isAutomation) {
13186
- const site = sites?.get(contents.id);
13187
- if (site) sites?.updateAutomation(site, isAutomation);
13188
- }
13189
- }) : null;
13190
- const registerGuest = (event, registration) => {
13191
- if (!registration || !Number.isInteger(registration.guestId)) return;
13192
- const site = sites?.get(registration.guestId);
13193
- if (!site || site.embedder.id !== event.sender.id) return;
13194
- site.tabId = String(registration.tabId || "");
13195
- sites?.updateAutomation(site, registration.isAutomation === true);
13196
- adBlocker.publish(site.contents.id, site.rootGuestId);
13197
- };
13198
- import_electron11.ipcMain.on(BROWSER_IPC.registerGuest, registerGuest);
13043
+ }
13044
+ });
13199
13045
  return {
13200
- hardenWebview(webPreferences, params) {
13201
- if (!isAllowedWebUrl(params.src || "about:blank")) return false;
13202
- const preload = adBlocker.cosmeticPreloadPath();
13203
- if (preload) webPreferences.preload = preload;
13204
- else delete webPreferences.preload;
13205
- webPreferences.partition = BROWSER_SESSION_PARTITION;
13206
- webPreferences.nodeIntegration = false;
13207
- webPreferences.nodeIntegrationInSubFrames = false;
13208
- webPreferences.contextIsolation = true;
13209
- webPreferences.sandbox = true;
13210
- webPreferences.webSecurity = true;
13211
- webPreferences.webviewTag = false;
13212
- webPreferences.allowRunningInsecureContent = false;
13213
- return true;
13214
- },
13215
- attachGuest(embedder, guest) {
13216
- sites?.configure(shellSite(guest, embedder, null, guest.getURL().includes(AUTOMATION_MARKER)));
13217
- },
13218
- sendShortcut(target, command) {
13219
- if (target && !target.isDestroyed()) send(target, BROWSER_IPC.shortcut, { guestId: null, command });
13220
- },
13221
- dispose() {
13222
- surfaceController?.dispose();
13223
- import_electron11.ipcMain.off(BROWSER_IPC.registerGuest, registerGuest);
13046
+ async dispose() {
13047
+ surfaceController.dispose();
13224
13048
  permissions.dispose();
13225
13049
  downloads.dispose();
13226
13050
  adBlockIpc.dispose();
13227
13051
  contextMenus.dispose();
13228
13052
  sites?.dispose();
13229
13053
  adBlocker.dispose();
13054
+ await cookieSync?.close();
13230
13055
  }
13231
13056
  };
13232
13057
  }
13233
13058
 
13234
- // src/interaction/typing.ts
13235
- function setValueScript(text) {
13236
- return `(() => {
13237
- const el = document.activeElement;
13238
- if (!el || el === document.body) throw new Error('focus did not land on a field');
13239
- const text = ${JSON.stringify(String(text))};
13240
- if (el.isContentEditable) {
13241
- el.textContent = text;
13242
- } else {
13243
- const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
13244
- : el instanceof HTMLInputElement ? HTMLInputElement.prototype
13245
- : null;
13246
- if (!proto && !('value' in el)) {
13247
- throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not fillable');
13248
- }
13249
- const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
13250
- if (setter) setter.call(el, text); else el.value = text;
13251
- }
13252
- el.dispatchEvent(new InputEvent('input', { bubbles: true, data: text, inputType: 'insertReplacementText' }));
13253
- el.dispatchEvent(new Event('change', { bubbles: true }));
13254
- return true;
13255
- })()`;
13256
- }
13257
- function insertTextScript(text) {
13258
- return `(() => {
13259
- const el = document.activeElement;
13260
- if (!el || el === document.body || el === document.documentElement) {
13261
- throw new Error('focus did not land on an editable field');
13262
- }
13263
- const text = ${JSON.stringify(String(text))};
13264
- const inputEvent = (inputType, data = text) => new InputEvent('input', {
13265
- bubbles: true,
13266
- data,
13267
- inputType,
13268
- });
13059
+ // src/errors.ts
13060
+ var BrowserError = class extends Error {
13061
+ constructor(code, message, details) {
13062
+ super(message);
13063
+ this.code = code;
13064
+ this.details = details;
13065
+ }
13066
+ code;
13067
+ details;
13068
+ name = "BrowserError";
13069
+ };
13269
13070
 
13270
- if (el.isContentEditable) {
13271
- const selection = window.getSelection();
13272
- if (selection && selection.rangeCount) {
13273
- const range = selection.getRangeAt(0);
13274
- range.deleteContents();
13275
- const node = document.createTextNode(text);
13276
- range.insertNode(node);
13277
- range.setStartAfter(node);
13278
- range.setEndAfter(node);
13279
- selection.removeAllRanges();
13280
- selection.addRange(range);
13281
- } else {
13282
- el.textContent = (el.textContent || '') + text;
13071
+ // src/cookies/http-store.ts
13072
+ function createHttpCookieStore(options) {
13073
+ const listeners = /* @__PURE__ */ new Set();
13074
+ let watching;
13075
+ let unsubscribeReady;
13076
+ let version;
13077
+ async function request(action, mutation) {
13078
+ start();
13079
+ const response = await options.request(`/cookies/${action}`, {
13080
+ method: mutation ? "POST" : "GET",
13081
+ cache: "no-store",
13082
+ signal: AbortSignal.timeout(5e3),
13083
+ ...mutation ? { headers: { "content-type": "application/json" }, body: JSON.stringify(mutation) } : {}
13084
+ });
13085
+ if (!response.ok) throw new BrowserError("PROCESS_FAILED", `Browser cookie adapter is unavailable (${response.status}).`);
13086
+ const result = await response.json();
13087
+ if (result.accountId !== options.accountId || !result.jar) {
13088
+ throw new BrowserError("AUTHORIZATION_DENIED", "The Browser cookie adapter answered for another account.");
13089
+ }
13090
+ return result.jar;
13091
+ }
13092
+ function start() {
13093
+ if (watching || !listeners.size) return;
13094
+ const controller = watching = new AbortController();
13095
+ let live = false;
13096
+ void watch(controller.signal, () => {
13097
+ live = true;
13098
+ }).catch(() => void 0).finally(() => {
13099
+ if (watching !== controller) return;
13100
+ watching = void 0;
13101
+ version = void 0;
13102
+ if (live) start();
13103
+ });
13104
+ }
13105
+ async function watch(lifetime, delivered) {
13106
+ const response = await options.request("/cookies/changes", { method: "GET", cache: "no-store", signal: lifetime });
13107
+ if (!response.ok || !response.body) throw new Error("Cookie notifications unavailable.");
13108
+ const reader = response.body.getReader();
13109
+ const decoder = new TextDecoder();
13110
+ let buffer = "";
13111
+ try {
13112
+ for (; ; ) {
13113
+ const { done, value } = await reader.read();
13114
+ if (done) break;
13115
+ buffer += decoder.decode(value, { stream: true });
13116
+ if (buffer.length > 16e3) throw new Error("Invalid cookie notification.");
13117
+ let end;
13118
+ while ((end = buffer.indexOf("\n")) !== -1) {
13119
+ const line = buffer.slice(0, end);
13120
+ buffer = buffer.slice(end + 1);
13121
+ if (!line.startsWith("data:")) continue;
13122
+ const event = JSON.parse(line.slice(5));
13123
+ if (event.accountId !== options.accountId || typeof event.versionToken !== "string") {
13124
+ throw new Error("Invalid cookie notification identity.");
13125
+ }
13126
+ version = event.versionToken;
13127
+ delivered();
13128
+ for (const changed of listeners) changed(version);
13129
+ }
13283
13130
  }
13284
- el.dispatchEvent(inputEvent('insertText'));
13285
- return true;
13131
+ } finally {
13132
+ await reader.cancel().catch(() => void 0);
13133
+ }
13134
+ }
13135
+ return {
13136
+ materialize: () => request("bootstrap"),
13137
+ changes(after) {
13138
+ if (watching && version === after) return { upserts: [], deletes: [], versionToken: after, reset: false, healthy: true };
13139
+ return request(`delta?after=${encodeURIComponent(after)}`);
13140
+ },
13141
+ merge: (mutation) => request("merge", mutation),
13142
+ subscribe(changed) {
13143
+ listeners.add(changed);
13144
+ if (!unsubscribeReady) unsubscribeReady = options.subscribeReady?.(() => {
13145
+ watching?.abort();
13146
+ watching = void 0;
13147
+ version = void 0;
13148
+ start();
13149
+ });
13150
+ start();
13151
+ return () => {
13152
+ listeners.delete(changed);
13153
+ if (!listeners.size) {
13154
+ watching?.abort();
13155
+ watching = void 0;
13156
+ version = void 0;
13157
+ unsubscribeReady?.();
13158
+ unsubscribeReady = void 0;
13159
+ }
13160
+ };
13286
13161
  }
13287
-
13288
- const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
13289
- : el instanceof HTMLInputElement ? HTMLInputElement.prototype
13290
- : null;
13291
- if (!proto && !('value' in el)) {
13292
- throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not editable');
13293
- }
13294
- const value = String(el.value || '');
13295
- const start = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
13296
- const end = typeof el.selectionEnd === 'number' ? el.selectionEnd : start;
13297
- const next = value.slice(0, start) + text + value.slice(end);
13298
- const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
13299
- if (setter) setter.call(el, next); else el.value = next;
13300
- const caret = start + text.length;
13301
- if (typeof el.setSelectionRange === 'function') {
13302
- try { el.setSelectionRange(caret, caret); } catch {}
13303
- }
13304
- el.dispatchEvent(inputEvent('insertText'));
13305
- return true;
13306
- })()`;
13307
- }
13308
- function codeFor(key) {
13309
- if (/^[a-z]$/i.test(key)) return `Key${key.toUpperCase()}`;
13310
- if (/^[0-9]$/.test(key)) return `Digit${key}`;
13311
- if (key === " ") return "Space";
13312
- return key;
13313
- }
13314
- function keyScript(combo) {
13315
- const parts = String(combo).split("+");
13316
- const key = parts.pop() || "";
13317
- const mods = parts.map((part) => part.toLowerCase());
13318
- const init = {
13319
- key,
13320
- code: codeFor(key),
13321
- bubbles: true,
13322
- cancelable: true,
13323
- ctrlKey: mods.includes("control") || mods.includes("ctrl"),
13324
- shiftKey: mods.includes("shift"),
13325
- altKey: mods.includes("alt") || mods.includes("option"),
13326
- metaKey: mods.includes("meta") || mods.includes("cmd") || mods.includes("command")
13327
13162
  };
13328
- return `(() => {
13329
- const el = document.activeElement || document.body;
13330
- const init = ${JSON.stringify(init)};
13331
- const isInput = el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement;
13332
- const isEditable = isInput || el.isContentEditable;
13333
- const inputEvent = (inputType, data = null) => new InputEvent('input', {
13334
- bubbles: true,
13335
- data,
13336
- inputType,
13337
- });
13338
- const setValue = (next, start, end = start) => {
13339
- const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
13340
- : el instanceof HTMLInputElement ? HTMLInputElement.prototype
13341
- : null;
13342
- const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
13343
- if (setter) setter.call(el, next); else el.value = next;
13344
- if (typeof el.setSelectionRange === 'function') {
13345
- try { el.setSelectionRange(start, end); } catch {}
13346
- }
13347
- };
13348
- const proceed = el.dispatchEvent(new KeyboardEvent('keydown', init));
13349
- if (proceed) {
13350
- el.dispatchEvent(new KeyboardEvent('keypress', init));
13351
- if ((init.ctrlKey || init.metaKey) && init.key.toLowerCase() === 'a' && isEditable) {
13352
- if (isInput && typeof el.select === 'function') {
13353
- el.select();
13354
- } else {
13355
- const range = document.createRange();
13356
- range.selectNodeContents(el);
13357
- const selection = window.getSelection();
13358
- selection.removeAllRanges();
13359
- selection.addRange(range);
13360
- }
13361
- } else if ((init.key === 'Backspace' || init.key === 'Delete') && isInput) {
13362
- const value = String(el.value || '');
13363
- const selectionStart = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
13364
- const selectionEnd = typeof el.selectionEnd === 'number' ? el.selectionEnd : selectionStart;
13365
- let start = selectionStart;
13366
- let end = selectionEnd;
13367
- if (start === end && init.key === 'Backspace' && start > 0) start -= 1;
13368
- if (start === end && init.key === 'Delete' && end < value.length) end += 1;
13369
- if (start !== end) {
13370
- setValue(value.slice(0, start) + value.slice(end), start);
13371
- el.dispatchEvent(inputEvent(init.key === 'Backspace' ? 'deleteContentBackward' : 'deleteContentForward'));
13372
- }
13373
- } else if (init.key === 'Enter') {
13374
- if (el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement) {
13375
- el.click();
13376
- } else if (el instanceof HTMLInputElement && el.form) {
13377
- if (el.form.requestSubmit) el.form.requestSubmit(); else el.form.submit();
13378
- }
13379
- }
13380
- }
13381
- el.dispatchEvent(new KeyboardEvent('keyup', init));
13382
- return true;
13383
- })()`;
13163
+ }
13164
+
13165
+ // src/cookies/adapter-credential.ts
13166
+ var import_node_fs4 = __toESM(require("node:fs"), 1);
13167
+ var import_node_path4 = __toESM(require("node:path"), 1);
13168
+ var FILE = "cookie-adapter.json";
13169
+ function readCookieAdapter(root, accountId) {
13170
+ const file = import_node_path4.default.join(root, FILE);
13171
+ let record;
13172
+ try {
13173
+ record = JSON.parse(import_node_fs4.default.readFileSync(file, "utf8"));
13174
+ } catch {
13175
+ return null;
13176
+ }
13177
+ if (record.version !== 1 || record.accountId !== accountId) {
13178
+ throw new BrowserError("AUTHORIZATION_DENIED", "The Browser adapter belongs to another account.");
13179
+ }
13180
+ return typeof record.token === "string" && record.token.length >= 32 ? record.token : null;
13384
13181
  }
13385
13182
  // Annotate the CommonJS export names for ESM import in node:
13386
13183
  0 && (module.exports = {
13387
13184
  BROWSER_IPC,
13388
- BROWSER_SESSION_PARTITION,
13389
- BROWSER_SURFACE_PROTOCOL,
13390
- BROWSER_SURFACE_PROTOCOLS,
13391
- ELECTRON_COOKIE_ADAPTER_ID,
13392
- ElectronBrowserDriver,
13393
- ElectronCookieAdapter,
13394
- NativeAdBlocker,
13395
- adBlockHostname,
13396
- browserNavigationPolicy,
13397
- codeFor,
13398
13185
  createBrowserShell,
13399
- createBrowserSurfaceController,
13400
- getBrowserSession,
13401
- insertTextScript,
13402
- isAdBlockCacheFresh,
13403
- isAllowedExternalUrl,
13404
- isAllowedWebUrl,
13405
- isLoopbackCdpUrl,
13406
- isNativeAdBlockDisabled,
13407
- isolatedBrowserSession,
13408
- keyScript,
13409
- markerUrl,
13410
- nextAvailableDownloadPath,
13411
- normalizeBrowserLocation,
13412
- parseUrl,
13413
- permissionOrigin,
13414
- removeHostAdvertisement,
13415
- safeDownloadFilename,
13416
- safeDownloadName,
13417
- setValueScript,
13418
- shouldOpenAsTab,
13419
- surfaceStamp,
13420
- writeHostAdvertisement
13186
+ createHttpCookieStore,
13187
+ readCookieAdapter
13421
13188
  });
13422
13189
  /*! Bundled license information:
13423
13190