@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
@@ -1,189 +0,0 @@
1
- /**
2
- * In-page typing — the scripts behind fill and press in attached mode.
3
- *
4
- * In the desktop app the agent and the user share one chromium window, and
5
- * synthesized keystrokes (CDP Input events) are routed by *window focus* —
6
- * an agent "typing" while the user's caret sits in the chat box lands the
7
- * text in the chat box (observed live). These scripts act inside the
8
- * session's page instead, through the same stamp-guarded transport as every
9
- * other command, so agent input physically cannot reach anything but the
10
- * page it was meant for.
11
- *
12
- * The boundary: page-level semantics work (value setting with real
13
- * input/change events, key handlers, Enter activating buttons and
14
- * submitting forms); OS-level editing defaults (Tab focus traversal,
15
- * arrow-key scrolling) are real-input territory — that is what the cua_*
16
- * verbs are for, and they stay focus-dependent by design.
17
- */
18
- /**
19
- * Set the focused field's value the way the page expects: through the
20
- * native prototype setter (so frameworks tracking the value descriptor —
21
- * React — see the change), followed by real input/change events.
22
- */
23
- export function setValueScript(text) {
24
- return `(() => {
25
- const el = document.activeElement;
26
- if (!el || el === document.body) throw new Error('focus did not land on a field');
27
- const text = ${JSON.stringify(String(text))};
28
- if (el.isContentEditable) {
29
- el.textContent = text;
30
- } else {
31
- const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
32
- : el instanceof HTMLInputElement ? HTMLInputElement.prototype
33
- : null;
34
- if (!proto && !('value' in el)) {
35
- throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not fillable');
36
- }
37
- const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
38
- if (setter) setter.call(el, text); else el.value = text;
39
- }
40
- el.dispatchEvent(new InputEvent('input', { bubbles: true, data: text, inputType: 'insertReplacementText' }));
41
- el.dispatchEvent(new Event('change', { bubbles: true }));
42
- return true;
43
- })()`;
44
- }
45
- /**
46
- * Insert text at the focused field/caret without using browser-window
47
- * keyboard focus. This is the attached-mode implementation for cua_type and
48
- * CLI keyboard typing: if the page did not focus an editable element, fail
49
- * closed instead of letting real keystrokes leak into Amalgm's own UI.
50
- */
51
- export function insertTextScript(text) {
52
- return `(() => {
53
- const el = document.activeElement;
54
- if (!el || el === document.body || el === document.documentElement) {
55
- throw new Error('focus did not land on an editable field');
56
- }
57
- const text = ${JSON.stringify(String(text))};
58
- const inputEvent = (inputType, data = text) => new InputEvent('input', {
59
- bubbles: true,
60
- data,
61
- inputType,
62
- });
63
-
64
- if (el.isContentEditable) {
65
- const selection = window.getSelection();
66
- if (selection && selection.rangeCount) {
67
- const range = selection.getRangeAt(0);
68
- range.deleteContents();
69
- const node = document.createTextNode(text);
70
- range.insertNode(node);
71
- range.setStartAfter(node);
72
- range.setEndAfter(node);
73
- selection.removeAllRanges();
74
- selection.addRange(range);
75
- } else {
76
- el.textContent = (el.textContent || '') + text;
77
- }
78
- el.dispatchEvent(inputEvent('insertText'));
79
- return true;
80
- }
81
-
82
- const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
83
- : el instanceof HTMLInputElement ? HTMLInputElement.prototype
84
- : null;
85
- if (!proto && !('value' in el)) {
86
- throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not editable');
87
- }
88
- const value = String(el.value || '');
89
- const start = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
90
- const end = typeof el.selectionEnd === 'number' ? el.selectionEnd : start;
91
- const next = value.slice(0, start) + text + value.slice(end);
92
- const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
93
- if (setter) setter.call(el, next); else el.value = next;
94
- const caret = start + text.length;
95
- if (typeof el.setSelectionRange === 'function') {
96
- try { el.setSelectionRange(caret, caret); } catch {}
97
- }
98
- el.dispatchEvent(inputEvent('insertText'));
99
- return true;
100
- })()`;
101
- }
102
- /** "KeyA" for letters, "Digit1" for digits, the key's own name otherwise. */
103
- export function codeFor(key) {
104
- if (/^[a-z]$/i.test(key))
105
- return `Key${key.toUpperCase()}`;
106
- if (/^[0-9]$/.test(key))
107
- return `Digit${key}`;
108
- if (key === ' ')
109
- return 'Space';
110
- return key;
111
- }
112
- /**
113
- * Dispatch a key combination ("Enter", "Escape", "Control+a") to the focused
114
- * element, mirroring the browser's own Enter defaults when no handler
115
- * prevents them: buttons and links activate, single-line form fields submit
116
- * their form (through requestSubmit, so submit handlers and validation run).
117
- */
118
- export function keyScript(combo) {
119
- const parts = String(combo).split('+');
120
- const key = parts.pop() || '';
121
- const mods = parts.map((part) => part.toLowerCase());
122
- const init = {
123
- key,
124
- code: codeFor(key),
125
- bubbles: true,
126
- cancelable: true,
127
- ctrlKey: mods.includes('control') || mods.includes('ctrl'),
128
- shiftKey: mods.includes('shift'),
129
- altKey: mods.includes('alt') || mods.includes('option'),
130
- metaKey: mods.includes('meta') || mods.includes('cmd') || mods.includes('command'),
131
- };
132
- return `(() => {
133
- const el = document.activeElement || document.body;
134
- const init = ${JSON.stringify(init)};
135
- const isInput = el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement;
136
- const isEditable = isInput || el.isContentEditable;
137
- const inputEvent = (inputType, data = null) => new InputEvent('input', {
138
- bubbles: true,
139
- data,
140
- inputType,
141
- });
142
- const setValue = (next, start, end = start) => {
143
- const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
144
- : el instanceof HTMLInputElement ? HTMLInputElement.prototype
145
- : null;
146
- const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
147
- if (setter) setter.call(el, next); else el.value = next;
148
- if (typeof el.setSelectionRange === 'function') {
149
- try { el.setSelectionRange(start, end); } catch {}
150
- }
151
- };
152
- const proceed = el.dispatchEvent(new KeyboardEvent('keydown', init));
153
- if (proceed) {
154
- el.dispatchEvent(new KeyboardEvent('keypress', init));
155
- if ((init.ctrlKey || init.metaKey) && init.key.toLowerCase() === 'a' && isEditable) {
156
- if (isInput && typeof el.select === 'function') {
157
- el.select();
158
- } else {
159
- const range = document.createRange();
160
- range.selectNodeContents(el);
161
- const selection = window.getSelection();
162
- selection.removeAllRanges();
163
- selection.addRange(range);
164
- }
165
- } else if ((init.key === 'Backspace' || init.key === 'Delete') && isInput) {
166
- const value = String(el.value || '');
167
- const selectionStart = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
168
- const selectionEnd = typeof el.selectionEnd === 'number' ? el.selectionEnd : selectionStart;
169
- let start = selectionStart;
170
- let end = selectionEnd;
171
- if (start === end && init.key === 'Backspace' && start > 0) start -= 1;
172
- if (start === end && init.key === 'Delete' && end < value.length) end += 1;
173
- if (start !== end) {
174
- setValue(value.slice(0, start) + value.slice(end), start);
175
- el.dispatchEvent(inputEvent(init.key === 'Backspace' ? 'deleteContentBackward' : 'deleteContentForward'));
176
- }
177
- } else if (init.key === 'Enter') {
178
- if (el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement) {
179
- el.click();
180
- } else if (el instanceof HTMLInputElement && el.form) {
181
- if (el.form.requestSubmit) el.form.requestSubmit(); else el.form.submit();
182
- }
183
- }
184
- }
185
- el.dispatchEvent(new KeyboardEvent('keyup', init));
186
- return true;
187
- })()`;
188
- }
189
- //# sourceMappingURL=typing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"typing.js","sourceRoot":"","sources":["../../../src/interaction/typing.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO;;;mBAGU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;OAgBxC,CAAC;AACR,CAAC;AACD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO;;;;;mBAKU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CxC,CAAC;AACR,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IAC3D,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,GAAG,EAAE,CAAC;IAC9C,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG;QACX,GAAG;QACH,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;QAClB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1D,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;KACnF,CAAC;IACF,OAAO;;mBAEU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqDhC,CAAC;AACR,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { BrowserProfileDirectories } from '../ports.js';
2
- export declare class LocalBrowserProfileDirectories implements BrowserProfileDirectories {
3
- readonly root: string;
4
- constructor(root: string);
5
- pathFor(id: string): string;
6
- lastTouchedAt(id: string): number;
7
- isLocked(id: string): boolean;
8
- remove(id: string): void;
9
- }
@@ -1,57 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { BrowserError } from '../errors.js';
4
- import { safeId } from '../ids.js';
5
- export class LocalBrowserProfileDirectories {
6
- root;
7
- constructor(root) {
8
- this.root = root;
9
- fs.mkdirSync(path.resolve(root), { recursive: true, mode: 0o700 });
10
- }
11
- pathFor(id) { return path.join(path.resolve(this.root), safeId(id)); }
12
- lastTouchedAt(id) {
13
- const profile = this.pathFor(id);
14
- return [profile, 'Local State', 'Default', 'Default/Cookies', 'Default/Network/Cookies', 'Default/History']
15
- .map((entry) => entry === profile ? entry : path.join(profile, entry))
16
- .reduce((latest, candidate) => {
17
- try {
18
- return Math.max(latest, fs.statSync(candidate).mtimeMs);
19
- }
20
- catch {
21
- return latest;
22
- }
23
- }, 0);
24
- }
25
- isLocked(id) {
26
- const lock = path.join(this.pathFor(id), 'SingletonLock');
27
- try {
28
- const stat = fs.lstatSync(lock);
29
- const value = stat.isSymbolicLink()
30
- ? fs.readlinkSync(lock)
31
- : fs.readFileSync(lock, 'utf8').slice(0, 256);
32
- const pid = Number(value.match(/(?:^|[-\s])(\d+)(?:$|\s)/)?.[1] || 0);
33
- if (pid) {
34
- try {
35
- process.kill(pid, 0);
36
- return true;
37
- }
38
- catch (error) {
39
- if (error.code === 'EPERM')
40
- return true;
41
- }
42
- }
43
- return !stat.isSymbolicLink() && Date.now() - stat.mtimeMs < 5 * 60_000;
44
- }
45
- catch {
46
- return false;
47
- }
48
- }
49
- remove(id) {
50
- const target = this.pathFor(id);
51
- if (path.dirname(target) !== path.resolve(this.root)) {
52
- throw new BrowserError('INVALID_INPUT', `Unsafe Browser profile path: ${target}`);
53
- }
54
- fs.rmSync(target, { recursive: true, force: true });
55
- }
56
- }
57
- //# sourceMappingURL=directories.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"directories.js","sourceRoot":"","sources":["../../../src/profiles/directories.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import type { BrowserProfileDirectories, BrowserRegistry } from '../ports.js';
2
- import type { BrowserProfile, BrowserProfileStatus, BrowserSession } from '../types.js';
3
- export interface BrowserProfileStoreOptions {
4
- registry: BrowserRegistry;
5
- directories?: BrowserProfileDirectories;
6
- now(): string;
7
- generate(): string;
8
- publish(profileId: string): void;
9
- }
10
- export declare class BrowserProfileStore {
11
- private readonly options;
12
- constructor(options: BrowserProfileStoreOptions);
13
- create(input: {
14
- id?: string;
15
- name: string;
16
- kind?: BrowserProfile['kind'];
17
- }): BrowserProfile;
18
- list(): BrowserProfile[];
19
- get(id: string): BrowserProfile;
20
- update(id: string, patch: {
21
- name?: string;
22
- kind?: BrowserProfile['kind'];
23
- }): BrowserProfile;
24
- inspect(id: string, sessions: BrowserSession[], referenced: ReadonlySet<string>): BrowserProfileStatus;
25
- delete(id: string, sessions: BrowserSession[]): void;
26
- prune(maxAgeMs: number, referenced: ReadonlySet<string>, sessions: BrowserSession[]): string[];
27
- ensure(idValue: string, kind: BrowserProfile['kind'], name?: string): BrowserProfile;
28
- touch(id: string): void;
29
- private find;
30
- }
@@ -1,89 +0,0 @@
1
- import { BrowserError } from '../errors.js';
2
- import { safeId } from '../ids.js';
3
- export class BrowserProfileStore {
4
- options;
5
- constructor(options) {
6
- this.options = options;
7
- }
8
- create(input) {
9
- const id = safeId(input.id || this.options.generate());
10
- if (this.find(id))
11
- throw new BrowserError('CONFLICT', `Browser profile ${id} already exists.`);
12
- return this.ensure(id, input.kind || 'durable', input.name);
13
- }
14
- list() { return this.options.registry.snapshot().profiles; }
15
- get(id) {
16
- const profile = this.find(id);
17
- if (!profile)
18
- throw new BrowserError('NOT_FOUND', `Browser profile ${id} does not exist.`);
19
- return profile;
20
- }
21
- update(id, patch) {
22
- const profile = this.get(id);
23
- const updated = {
24
- ...profile,
25
- ...(patch.name !== undefined ? { name: patch.name.trim() || profile.name } : {}),
26
- ...(patch.kind !== undefined ? { kind: patch.kind } : {}),
27
- updatedAt: this.options.now(),
28
- };
29
- this.options.registry.putProfile(updated);
30
- this.options.publish(updated.id);
31
- return updated;
32
- }
33
- inspect(id, sessions, referenced) {
34
- return {
35
- profile: this.get(id),
36
- live: sessions.some((session) => session.profileId === id && !isFinished(session)),
37
- referenced: referenced.has(id),
38
- locked: this.options.directories?.isLocked(id) || false,
39
- };
40
- }
41
- delete(id, sessions) {
42
- if (sessions.some((session) => session.profileId === id && !isFinished(session))) {
43
- throw new BrowserError('CONFLICT', `Browser profile ${id} belongs to a live session.`);
44
- }
45
- if (this.options.directories?.isLocked(id)) {
46
- throw new BrowserError('CONFLICT', `Browser profile ${id} has a live Chromium lock.`);
47
- }
48
- this.options.directories?.remove(id);
49
- this.options.registry.deleteProfile(id);
50
- }
51
- prune(maxAgeMs, referenced, sessions) {
52
- const cutoff = Date.parse(this.options.now()) - maxAgeMs;
53
- const live = new Set(sessions.filter((session) => !isFinished(session)).map((session) => session.profileId));
54
- const removed = this.list().filter((profile) => profile.kind === 'ephemeral'
55
- && !live.has(profile.id)
56
- && !referenced.has(profile.id)
57
- && !this.options.directories?.isLocked(profile.id)
58
- && Math.max(Date.parse(profile.lastUsedAt), this.options.directories?.lastTouchedAt(profile.id) || 0) < cutoff)
59
- .map((profile) => profile.id);
60
- for (const id of removed) {
61
- this.options.directories?.remove(id);
62
- this.options.registry.deleteProfile(id);
63
- }
64
- return removed;
65
- }
66
- ensure(idValue, kind, name = idValue) {
67
- const id = safeId(idValue);
68
- const existing = this.find(id);
69
- if (existing)
70
- return existing;
71
- const now = this.options.now();
72
- const profile = { id, name, kind, createdAt: now, updatedAt: now, lastUsedAt: now };
73
- this.options.registry.putProfile(profile);
74
- this.options.publish(id);
75
- return profile;
76
- }
77
- touch(id) {
78
- const profile = this.get(id);
79
- const now = this.options.now();
80
- this.options.registry.putProfile({ ...profile, updatedAt: now, lastUsedAt: now });
81
- }
82
- find(id) {
83
- return this.list().find((profile) => profile.id === safeId(id));
84
- }
85
- }
86
- function isFinished(session) {
87
- return session.status === 'closed' || session.status === 'failed';
88
- }
89
- //# sourceMappingURL=service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/profiles/service.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { BrowserRuntimeSelector } from './ports.js';
2
- import type { BrowserBackendKind, BrowserHostAdvertisement, BrowserRuntimeContext } from './types.js';
3
- export declare const ELECTRON_SURFACE_PROTOCOLS: readonly [5, 6];
4
- export declare function pidIsRunning(pid: number): boolean;
5
- export declare function bridgeFileCandidates(env?: NodeJS.ProcessEnv): string[];
6
- export declare function readHostAdvertisement(files?: string[]): BrowserHostAdvertisement | null;
7
- export declare class DefaultRuntimeSelector implements BrowserRuntimeSelector {
8
- readonly advertisement: () => BrowserHostAdvertisement | null;
9
- readonly env: NodeJS.ProcessEnv;
10
- constructor(advertisement?: () => BrowserHostAdvertisement | null, env?: NodeJS.ProcessEnv);
11
- select(context: BrowserRuntimeContext): BrowserBackendKind;
12
- }
@@ -1,72 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { runtimeBindingFromEnvironment, runtimeStateDir } from '@amalgm/core/identity';
4
- import { isLoopbackCdpUrl } from './drivers/electron/advertisement.js';
5
- import { BROWSER_SURFACE_PROTOCOLS } from './drivers/electron/contracts.js';
6
- export const ELECTRON_SURFACE_PROTOCOLS = BROWSER_SURFACE_PROTOCOLS;
7
- export function pidIsRunning(pid) {
8
- if (!Number.isInteger(pid) || pid <= 0)
9
- return false;
10
- try {
11
- process.kill(pid, 0);
12
- return true;
13
- }
14
- catch (error) {
15
- return error.code === 'EPERM';
16
- }
17
- }
18
- export function bridgeFileCandidates(env = process.env) {
19
- const binding = runtimeBindingFromEnvironment(env);
20
- // The host supplies its reserved machine namespace. A shared user root is
21
- // never a discovery fallback, and an unknown binding never selects main.
22
- const directory = env.AMALGM_RUNTIME_STATE_DIR || (env.AMALGM_DIR && env.AMALGM_DEVICE_ID
23
- ? runtimeStateDir(env.AMALGM_DIR, env.AMALGM_DEVICE_ID, binding.runtimeLabel) : null);
24
- return directory ? [path.join(directory, 'electron-browser-bridge.json')] : [];
25
- }
26
- export function readHostAdvertisement(files = bridgeFileCandidates()) {
27
- for (const file of files) {
28
- try {
29
- const raw = JSON.parse(fs.readFileSync(file, 'utf8'));
30
- const cdp = raw.cdp;
31
- const cdpUrl = typeof cdp?.url === 'string' ? cdp.url : raw.cdpUrl;
32
- const protocol = Number.isInteger(raw.browserSurfaceProtocol) ? Number(raw.browserSurfaceProtocol) : 5;
33
- const pid = Number(raw.pid);
34
- if (typeof cdpUrl !== 'string' || !isLoopbackCdpUrl(cdpUrl) || !pidIsRunning(pid))
35
- continue;
36
- const declared = Array.isArray(raw.browserSurfaceTargetTypes)
37
- ? raw.browserSurfaceTargetTypes
38
- : [raw.browserSurfaceTargetType || 'webview'];
39
- const targetTypes = declared.filter((value) => value === 'page' || value === 'webview');
40
- return {
41
- protocol, backend: 'electron', pid, cdpUrl, targetTypes, file,
42
- ...(typeof raw.startedAt === 'string' ? { createdAt: raw.startedAt } : {}),
43
- };
44
- }
45
- catch { }
46
- }
47
- return null;
48
- }
49
- export class DefaultRuntimeSelector {
50
- advertisement;
51
- env;
52
- constructor(advertisement = readHostAdvertisement, env = process.env) {
53
- this.advertisement = advertisement;
54
- this.env = env;
55
- }
56
- select(context) {
57
- const forced = String(this.env.AMALGM_BROWSER_BACKEND || '').toLowerCase();
58
- if (['headless', 'cli', 'agent-browser', 'cdp'].includes(forced))
59
- return 'headless';
60
- if (['electron', 'visible', 'attached'].includes(forced))
61
- return 'electron';
62
- if (this.env.AMALGM_BROWSER_CDP_URL)
63
- return 'headless';
64
- if (context.clientKind !== 'desktop')
65
- return 'headless';
66
- const host = this.advertisement();
67
- return host && ELECTRON_SURFACE_PROTOCOLS.includes(host.protocol)
68
- ? 'electron'
69
- : 'headless';
70
- }
71
- }
72
- //# sourceMappingURL=runtime-selector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-selector.js","sourceRoot":"","sources":["../../src/runtime-selector.ts"],"names":[],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- # Headless runtime
2
-
3
- Headless is the default for standalone SDK/CLI use, servers, automations,
4
- agents, and background jobs. It uses `agent-browser` behind `BrowserDriver`;
5
- the core service does not know its command-line arguments.
6
-
7
- ## Process and executable selection
8
-
9
- Resolution prefers:
10
-
11
- 1. `AMALGM_AGENT_BROWSER_BIN`
12
- 2. the platform-native binary shipped by `agent-browser`
13
- 3. the package's JavaScript wrapper
14
- 4. an `agent-browser` executable on PATH
15
-
16
- When packaged in Electron, native binaries and ffmpeg are resolved from
17
- `app.asar.unpacked`. Every process uses an argv array with `shell: false`, a
18
- safe explicit cwd, bounded stdout/stderr, an operation timeout, cancellation,
19
- SIGTERM, and bounded SIGKILL escalation.
20
-
21
- ## Configuration
22
-
23
- - `AMALGM_BROWSER_EXECUTABLE_PATH` — explicit Chromium executable
24
- - `AMALGM_BROWSER_PROVIDER` — external provider understood by agent-browser
25
- - `AMALGM_BROWSER_CDP_URL` — attach to an operator-owned CDP endpoint
26
- - `AMALGM_AGENT_BROWSER_BIN` — explicit agent-browser executable
27
- - `AMALGM_BROWSER_HEADED=1` — explicit standalone headed debug mode
28
- - `AMALGM_FFMPEG` — encoder override
29
-
30
- An explicit CDP endpoint remains a headless-driver session in the domain model;
31
- it does not opt into Electron surfaces. Ordinary background work never opens a
32
- headed window or steals focus.
33
-
34
- ## Profiles and state
35
-
36
- Each session uses its assigned Browser profile directory. Durable profiles
37
- survive explicit reuse; ephemeral profiles are pruned only when not live,
38
- referenced, or physically Chromium-locked. Backend-local cookies remain in
39
- that profile. The trusted headless cookie adapter reconciles individual records
40
- through the encrypted logical jar without inspecting Electron.
41
-
42
- ## Capture and input
43
-
44
- Accessibility snapshots create stable `@eN` references for ordinary DOM
45
- actions. Direct CDP resolves the session's actual target for screenshot,
46
- computer use, and recording—never the first or only page. Viewport screenshots
47
- are normalized to CSS pixels even when device pixel ratio exceeds one;
48
- full-page capture is height-bounded.
49
-
50
- Computer use supports screenshot, click, double click, move, scroll, type,
51
- keypress, and drag. Native CDP input is page-scoped. Use it for canvas, WebGL,
52
- image-only, or hostile custom controls; prefer snapshot references elsewhere.
53
-
54
- ## Real verification
55
-
56
- `npm run test:real` launches the installed Chromium runtime and verifies
57
- navigation, snapshot, exact-target CDP capture, DPR normalization, page-scoped
58
- typing, and real page-only recording.
@@ -1,45 +0,0 @@
1
- import {
2
- createBrowser,
3
- BrowserError,
4
- type BrowserAction,
5
- type BrowserActionResult,
6
- type BrowserDriver,
7
- type BrowserDriverSession,
8
- } from '@amalgm/browser';
9
-
10
- class RemoteBrowserDriver implements BrowserDriver {
11
- readonly kind = 'headless' as const;
12
- readonly capabilities = ['core', 'computer-use'] as const;
13
-
14
- constructor(readonly endpoint: string, readonly token: string) {}
15
-
16
- async open(input: BrowserDriverSession): Promise<void> {
17
- await this.request('/sessions', { session: input.session });
18
- }
19
-
20
- async execute(input: BrowserDriverSession, action: BrowserAction): Promise<BrowserActionResult> {
21
- return this.request(`/sessions/${encodeURIComponent(input.session.id)}/actions`, { action }, input.context.signal);
22
- }
23
-
24
- async close(input: BrowserDriverSession): Promise<void> {
25
- await this.request(`/sessions/${encodeURIComponent(input.session.id)}/close`, {});
26
- }
27
-
28
- private async request<T>(path: string, body: unknown, signal?: AbortSignal): Promise<T> {
29
- const response = await fetch(new URL(path, this.endpoint), {
30
- method: 'POST',
31
- headers: { authorization: `Bearer ${this.token}`, 'content-type': 'application/json' },
32
- body: JSON.stringify(body),
33
- ...(signal ? { signal } : {}),
34
- });
35
- if (!response.ok) throw new BrowserError('PROCESS_FAILED', `Remote driver returned ${response.status}.`);
36
- return response.json() as Promise<T>;
37
- }
38
- }
39
-
40
- const browser = createBrowser({
41
- headlessDriver: new RemoteBrowserDriver('https://browser-provider.example', 'token'),
42
- });
43
-
44
- const session = await browser.createSession({ id: 'remote-example' });
45
- await browser.execute(session.id, { type: 'open', url: 'https://example.com' });
File without changes
File without changes
File without changes