@amalgm/browser 0.1.0

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 (384) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +5 -0
  3. package/PURPOSE.md +117 -0
  4. package/README.md +120 -0
  5. package/SECURITY.md +49 -0
  6. package/dist/bin/amalgm-browser-mcp.d.ts +2 -0
  7. package/dist/bin/amalgm-browser-mcp.js +5 -0
  8. package/dist/bin/amalgm-browser-mcp.js.map +1 -0
  9. package/dist/bin/amalgm-browser-rest.d.ts +2 -0
  10. package/dist/bin/amalgm-browser-rest.js +20 -0
  11. package/dist/bin/amalgm-browser-rest.js.map +1 -0
  12. package/dist/bin/amalgm-browser.d.ts +2 -0
  13. package/dist/bin/amalgm-browser.js +4 -0
  14. package/dist/bin/amalgm-browser.js.map +1 -0
  15. package/dist/src/action.d.ts +5 -0
  16. package/dist/src/action.js +42 -0
  17. package/dist/src/action.js.map +1 -0
  18. package/dist/src/adapters/actions.d.ts +10 -0
  19. package/dist/src/adapters/actions.js +41 -0
  20. package/dist/src/adapters/actions.js.map +1 -0
  21. package/dist/src/adapters/cli/actions.d.ts +7 -0
  22. package/dist/src/adapters/cli/actions.js +63 -0
  23. package/dist/src/adapters/cli/actions.js.map +1 -0
  24. package/dist/src/adapters/cli/args.d.ts +8 -0
  25. package/dist/src/adapters/cli/args.js +41 -0
  26. package/dist/src/adapters/cli/args.js.map +1 -0
  27. package/dist/src/adapters/cli/help.d.ts +1 -0
  28. package/dist/src/adapters/cli/help.js +29 -0
  29. package/dist/src/adapters/cli/help.js.map +1 -0
  30. package/dist/src/adapters/cli/resources.d.ts +4 -0
  31. package/dist/src/adapters/cli/resources.js +116 -0
  32. package/dist/src/adapters/cli/resources.js.map +1 -0
  33. package/dist/src/adapters/cli/run.d.ts +7 -0
  34. package/dist/src/adapters/cli/run.js +108 -0
  35. package/dist/src/adapters/cli/run.js.map +1 -0
  36. package/dist/src/adapters/execute.d.ts +4 -0
  37. package/dist/src/adapters/execute.js +91 -0
  38. package/dist/src/adapters/execute.js.map +1 -0
  39. package/dist/src/adapters/http/auth-routes.d.ts +2 -0
  40. package/dist/src/adapters/http/auth-routes.js +93 -0
  41. package/dist/src/adapters/http/auth-routes.js.map +1 -0
  42. package/dist/src/adapters/http/events.d.ts +3 -0
  43. package/dist/src/adapters/http/events.js +20 -0
  44. package/dist/src/adapters/http/events.js.map +1 -0
  45. package/dist/src/adapters/http/internal-routes.d.ts +2 -0
  46. package/dist/src/adapters/http/internal-routes.js +35 -0
  47. package/dist/src/adapters/http/internal-routes.js.map +1 -0
  48. package/dist/src/adapters/http/openapi.d.ts +1 -0
  49. package/dist/src/adapters/http/openapi.js +78 -0
  50. package/dist/src/adapters/http/openapi.js.map +1 -0
  51. package/dist/src/adapters/http/profile-routes.d.ts +2 -0
  52. package/dist/src/adapters/http/profile-routes.js +42 -0
  53. package/dist/src/adapters/http/profile-routes.js.map +1 -0
  54. package/dist/src/adapters/http/recording-routes.d.ts +2 -0
  55. package/dist/src/adapters/http/recording-routes.js +41 -0
  56. package/dist/src/adapters/http/recording-routes.js.map +1 -0
  57. package/dist/src/adapters/http/request.d.ts +4 -0
  58. package/dist/src/adapters/http/request.js +44 -0
  59. package/dist/src/adapters/http/request.js.map +1 -0
  60. package/dist/src/adapters/http/server.d.ts +2 -0
  61. package/dist/src/adapters/http/server.js +114 -0
  62. package/dist/src/adapters/http/server.js.map +1 -0
  63. package/dist/src/adapters/http/session-routes.d.ts +2 -0
  64. package/dist/src/adapters/http/session-routes.js +54 -0
  65. package/dist/src/adapters/http/session-routes.js.map +1 -0
  66. package/dist/src/adapters/http/types.d.ts +29 -0
  67. package/dist/src/adapters/http/types.js +2 -0
  68. package/dist/src/adapters/http/types.js.map +1 -0
  69. package/dist/src/adapters/mcp/server.d.ts +3 -0
  70. package/dist/src/adapters/mcp/server.js +74 -0
  71. package/dist/src/adapters/mcp/server.js.map +1 -0
  72. package/dist/src/adapters/mcp/tools.d.ts +3 -0
  73. package/dist/src/adapters/mcp/tools.js +45 -0
  74. package/dist/src/adapters/mcp/tools.js.map +1 -0
  75. package/dist/src/adapters/mcp/types.d.ts +17 -0
  76. package/dist/src/adapters/mcp/types.js +2 -0
  77. package/dist/src/adapters/mcp/types.js.map +1 -0
  78. package/dist/src/adapters/toolbox/aliases.d.ts +5 -0
  79. package/dist/src/adapters/toolbox/aliases.js +14 -0
  80. package/dist/src/adapters/toolbox/aliases.js.map +1 -0
  81. package/dist/src/adapters/toolbox/executor.d.ts +6 -0
  82. package/dist/src/adapters/toolbox/executor.js +13 -0
  83. package/dist/src/adapters/toolbox/executor.js.map +1 -0
  84. package/dist/src/adapters/toolbox/manifest.d.ts +15 -0
  85. package/dist/src/adapters/toolbox/manifest.js +24 -0
  86. package/dist/src/adapters/toolbox/manifest.js.map +1 -0
  87. package/dist/src/artifacts.d.ts +14 -0
  88. package/dist/src/artifacts.js +28 -0
  89. package/dist/src/artifacts.js.map +1 -0
  90. package/dist/src/auth/filter.d.ts +3 -0
  91. package/dist/src/auth/filter.js +60 -0
  92. package/dist/src/auth/filter.js.map +1 -0
  93. package/dist/src/auth/login.d.ts +41 -0
  94. package/dist/src/auth/login.js +145 -0
  95. package/dist/src/auth/login.js.map +1 -0
  96. package/dist/src/auth/portable.d.ts +18 -0
  97. package/dist/src/auth/portable.js +48 -0
  98. package/dist/src/auth/portable.js.map +1 -0
  99. package/dist/src/auth/service.d.ts +29 -0
  100. package/dist/src/auth/service.js +104 -0
  101. package/dist/src/auth/service.js.map +1 -0
  102. package/dist/src/auth/transport.d.ts +8 -0
  103. package/dist/src/auth/transport.js +45 -0
  104. package/dist/src/auth/transport.js.map +1 -0
  105. package/dist/src/auth/vault.d.ts +10 -0
  106. package/dist/src/auth/vault.js +27 -0
  107. package/dist/src/auth/vault.js.map +1 -0
  108. package/dist/src/cli.d.ts +2 -0
  109. package/dist/src/cli.js +3 -0
  110. package/dist/src/cli.js.map +1 -0
  111. package/dist/src/cookies/coordinator.d.ts +17 -0
  112. package/dist/src/cookies/coordinator.js +93 -0
  113. package/dist/src/cookies/coordinator.js.map +1 -0
  114. package/dist/src/cookies/jar.d.ts +21 -0
  115. package/dist/src/cookies/jar.js +146 -0
  116. package/dist/src/cookies/jar.js.map +1 -0
  117. package/dist/src/cookies/policy.d.ts +6 -0
  118. package/dist/src/cookies/policy.js +58 -0
  119. package/dist/src/cookies/policy.js.map +1 -0
  120. package/dist/src/cookies/secret-file.d.ts +10 -0
  121. package/dist/src/cookies/secret-file.js +80 -0
  122. package/dist/src/cookies/secret-file.js.map +1 -0
  123. package/dist/src/cookies/types.d.ts +64 -0
  124. package/dist/src/cookies/types.js +2 -0
  125. package/dist/src/cookies/types.js.map +1 -0
  126. package/dist/src/cookies.d.ts +5 -0
  127. package/dist/src/cookies.js +5 -0
  128. package/dist/src/cookies.js.map +1 -0
  129. package/dist/src/defaults.d.ts +24 -0
  130. package/dist/src/defaults.js +107 -0
  131. package/dist/src/defaults.js.map +1 -0
  132. package/dist/src/drivers/cdp/capture.d.ts +5 -0
  133. package/dist/src/drivers/cdp/capture.js +39 -0
  134. package/dist/src/drivers/cdp/capture.js.map +1 -0
  135. package/dist/src/drivers/cdp/client.d.ts +8 -0
  136. package/dist/src/drivers/cdp/client.js +88 -0
  137. package/dist/src/drivers/cdp/client.js.map +1 -0
  138. package/dist/src/drivers/cdp/input.d.ts +2 -0
  139. package/dist/src/drivers/cdp/input.js +15 -0
  140. package/dist/src/drivers/cdp/input.js.map +1 -0
  141. package/dist/src/drivers/cdp/screencast.d.ts +2 -0
  142. package/dist/src/drivers/cdp/screencast.js +39 -0
  143. package/dist/src/drivers/cdp/screencast.js.map +1 -0
  144. package/dist/src/drivers/cdp/target.d.ts +4 -0
  145. package/dist/src/drivers/cdp/target.js +34 -0
  146. package/dist/src/drivers/cdp/target.js.map +1 -0
  147. package/dist/src/drivers/electron/advertisement.d.ts +12 -0
  148. package/dist/src/drivers/electron/advertisement.js +57 -0
  149. package/dist/src/drivers/electron/advertisement.js.map +1 -0
  150. package/dist/src/drivers/electron/contracts.d.ts +45 -0
  151. package/dist/src/drivers/electron/contracts.js +10 -0
  152. package/dist/src/drivers/electron/contracts.js.map +1 -0
  153. package/dist/src/drivers/electron/cookie-adapter.d.ts +17 -0
  154. package/dist/src/drivers/electron/cookie-adapter.js +69 -0
  155. package/dist/src/drivers/electron/cookie-adapter.js.map +1 -0
  156. package/dist/src/drivers/electron/driver.d.ts +19 -0
  157. package/dist/src/drivers/electron/driver.js +115 -0
  158. package/dist/src/drivers/electron/driver.js.map +1 -0
  159. package/dist/src/drivers/electron/native/adblock/cache.d.ts +4 -0
  160. package/dist/src/drivers/electron/native/adblock/cache.js +54 -0
  161. package/dist/src/drivers/electron/native/adblock/cache.js.map +1 -0
  162. package/dist/src/drivers/electron/native/adblock/cosmetics.d.ts +11 -0
  163. package/dist/src/drivers/electron/native/adblock/cosmetics.js +45 -0
  164. package/dist/src/drivers/electron/native/adblock/cosmetics.js.map +1 -0
  165. package/dist/src/drivers/electron/native/adblock/index.d.ts +44 -0
  166. package/dist/src/drivers/electron/native/adblock/index.js +153 -0
  167. package/dist/src/drivers/electron/native/adblock/index.js.map +1 -0
  168. package/dist/src/drivers/electron/native/adblock/policy.d.ts +2 -0
  169. package/dist/src/drivers/electron/native/adblock/policy.js +12 -0
  170. package/dist/src/drivers/electron/native/adblock/policy.js.map +1 -0
  171. package/dist/src/drivers/electron/native/adblock/preload.d.ts +1 -0
  172. package/dist/src/drivers/electron/native/adblock/preload.js +131 -0
  173. package/dist/src/drivers/electron/native/adblock/preload.js.map +1 -0
  174. package/dist/src/drivers/electron/native/adblock/settings.d.ts +9 -0
  175. package/dist/src/drivers/electron/native/adblock/settings.js +37 -0
  176. package/dist/src/drivers/electron/native/adblock/settings.js.map +1 -0
  177. package/dist/src/drivers/electron/native/config.d.ts +4 -0
  178. package/dist/src/drivers/electron/native/config.js +9 -0
  179. package/dist/src/drivers/electron/native/config.js.map +1 -0
  180. package/dist/src/drivers/electron/native/contracts.d.ts +174 -0
  181. package/dist/src/drivers/electron/native/contracts.js +20 -0
  182. package/dist/src/drivers/electron/native/contracts.js.map +1 -0
  183. package/dist/src/drivers/electron/native/policy.d.ts +7 -0
  184. package/dist/src/drivers/electron/native/policy.js +43 -0
  185. package/dist/src/drivers/electron/native/policy.js.map +1 -0
  186. package/dist/src/drivers/electron/native/session.d.ts +4 -0
  187. package/dist/src/drivers/electron/native/session.js +11 -0
  188. package/dist/src/drivers/electron/native/session.js.map +1 -0
  189. package/dist/src/drivers/electron/native/shell/adblock-ipc.d.ts +10 -0
  190. package/dist/src/drivers/electron/native/shell/adblock-ipc.js +44 -0
  191. package/dist/src/drivers/electron/native/shell/adblock-ipc.js.map +1 -0
  192. package/dist/src/drivers/electron/native/shell/context-menu.d.ts +11 -0
  193. package/dist/src/drivers/electron/native/shell/context-menu.js +129 -0
  194. package/dist/src/drivers/electron/native/shell/context-menu.js.map +1 -0
  195. package/dist/src/drivers/electron/native/shell/downloads.d.ts +11 -0
  196. package/dist/src/drivers/electron/native/shell/downloads.js +90 -0
  197. package/dist/src/drivers/electron/native/shell/downloads.js.map +1 -0
  198. package/dist/src/drivers/electron/native/shell/helpers.d.ts +5 -0
  199. package/dist/src/drivers/electron/native/shell/helpers.js +53 -0
  200. package/dist/src/drivers/electron/native/shell/helpers.js.map +1 -0
  201. package/dist/src/drivers/electron/native/shell/permissions.d.ts +16 -0
  202. package/dist/src/drivers/electron/native/shell/permissions.js +107 -0
  203. package/dist/src/drivers/electron/native/shell/permissions.js.map +1 -0
  204. package/dist/src/drivers/electron/native/shell/sites.d.ts +24 -0
  205. package/dist/src/drivers/electron/native/shell/sites.js +119 -0
  206. package/dist/src/drivers/electron/native/shell/sites.js.map +1 -0
  207. package/dist/src/drivers/electron/native/shell/types.d.ts +13 -0
  208. package/dist/src/drivers/electron/native/shell/types.js +2 -0
  209. package/dist/src/drivers/electron/native/shell/types.js.map +1 -0
  210. package/dist/src/drivers/electron/native/shell.d.ts +14 -0
  211. package/dist/src/drivers/electron/native/shell.js +115 -0
  212. package/dist/src/drivers/electron/native/shell.js.map +1 -0
  213. package/dist/src/drivers/electron/native/surface/commands.d.ts +4 -0
  214. package/dist/src/drivers/electron/native/surface/commands.js +49 -0
  215. package/dist/src/drivers/electron/native/surface/commands.js.map +1 -0
  216. package/dist/src/drivers/electron/native/surface/create.d.ts +4 -0
  217. package/dist/src/drivers/electron/native/surface/create.js +46 -0
  218. package/dist/src/drivers/electron/native/surface/create.js.map +1 -0
  219. package/dist/src/drivers/electron/native/surface/events.d.ts +3 -0
  220. package/dist/src/drivers/electron/native/surface/events.js +55 -0
  221. package/dist/src/drivers/electron/native/surface/events.js.map +1 -0
  222. package/dist/src/drivers/electron/native/surface/presentation.d.ts +15 -0
  223. package/dist/src/drivers/electron/native/surface/presentation.js +87 -0
  224. package/dist/src/drivers/electron/native/surface/presentation.js.map +1 -0
  225. package/dist/src/drivers/electron/native/surface/state.d.ts +7 -0
  226. package/dist/src/drivers/electron/native/surface/state.js +45 -0
  227. package/dist/src/drivers/electron/native/surface/state.js.map +1 -0
  228. package/dist/src/drivers/electron/native/surface/types.d.ts +39 -0
  229. package/dist/src/drivers/electron/native/surface/types.js +2 -0
  230. package/dist/src/drivers/electron/native/surface/types.js.map +1 -0
  231. package/dist/src/drivers/electron/native/surface-controller.d.ts +6 -0
  232. package/dist/src/drivers/electron/native/surface-controller.js +138 -0
  233. package/dist/src/drivers/electron/native/surface-controller.js.map +1 -0
  234. package/dist/src/drivers/electron/policy.d.ts +4 -0
  235. package/dist/src/drivers/electron/policy.js +39 -0
  236. package/dist/src/drivers/electron/policy.js.map +1 -0
  237. package/dist/src/drivers/electron/session.d.ts +4 -0
  238. package/dist/src/drivers/electron/session.js +5 -0
  239. package/dist/src/drivers/electron/session.js.map +1 -0
  240. package/dist/src/drivers/headless/command.d.ts +25 -0
  241. package/dist/src/drivers/headless/command.js +114 -0
  242. package/dist/src/drivers/headless/command.js.map +1 -0
  243. package/dist/src/drivers/headless/cookie-adapter.d.ts +16 -0
  244. package/dist/src/drivers/headless/cookie-adapter.js +59 -0
  245. package/dist/src/drivers/headless/cookie-adapter.js.map +1 -0
  246. package/dist/src/drivers/headless/driver.d.ts +31 -0
  247. package/dist/src/drivers/headless/driver.js +238 -0
  248. package/dist/src/drivers/headless/driver.js.map +1 -0
  249. package/dist/src/drivers/headless/executable.d.ts +8 -0
  250. package/dist/src/drivers/headless/executable.js +56 -0
  251. package/dist/src/drivers/headless/executable.js.map +1 -0
  252. package/dist/src/drivers/headless/screencast.d.ts +3 -0
  253. package/dist/src/drivers/headless/screencast.js +21 -0
  254. package/dist/src/drivers/headless/screencast.js.map +1 -0
  255. package/dist/src/electron.d.ts +14 -0
  256. package/dist/src/electron.js +15 -0
  257. package/dist/src/electron.js.map +1 -0
  258. package/dist/src/errors.d.ts +9 -0
  259. package/dist/src/errors.js +25 -0
  260. package/dist/src/errors.js.map +1 -0
  261. package/dist/src/events.d.ts +13 -0
  262. package/dist/src/events.js +32 -0
  263. package/dist/src/events.js.map +1 -0
  264. package/dist/src/headless.d.ts +3 -0
  265. package/dist/src/headless.js +4 -0
  266. package/dist/src/headless.js.map +1 -0
  267. package/dist/src/http.d.ts +3 -0
  268. package/dist/src/http.js +3 -0
  269. package/dist/src/http.js.map +1 -0
  270. package/dist/src/ids.d.ts +2 -0
  271. package/dist/src/ids.js +9 -0
  272. package/dist/src/ids.js.map +1 -0
  273. package/dist/src/index.d.ts +14 -0
  274. package/dist/src/index.js +11 -0
  275. package/dist/src/index.js.map +1 -0
  276. package/dist/src/interaction/delta.d.ts +25 -0
  277. package/dist/src/interaction/delta.js +102 -0
  278. package/dist/src/interaction/delta.js.map +1 -0
  279. package/dist/src/interaction/typing.d.ts +39 -0
  280. package/dist/src/interaction/typing.js +189 -0
  281. package/dist/src/interaction/typing.js.map +1 -0
  282. package/dist/src/mcp.d.ts +3 -0
  283. package/dist/src/mcp.js +3 -0
  284. package/dist/src/mcp.js.map +1 -0
  285. package/dist/src/migration/legacy-cookies.d.ts +2 -0
  286. package/dist/src/migration/legacy-cookies.js +60 -0
  287. package/dist/src/migration/legacy-cookies.js.map +1 -0
  288. package/dist/src/migration/legacy-crypto.d.ts +1 -0
  289. package/dist/src/migration/legacy-crypto.js +35 -0
  290. package/dist/src/migration/legacy-crypto.js.map +1 -0
  291. package/dist/src/migration/legacy-migration.d.ts +20 -0
  292. package/dist/src/migration/legacy-migration.js +81 -0
  293. package/dist/src/migration/legacy-migration.js.map +1 -0
  294. package/dist/src/migration/legacy-rows.d.ts +5 -0
  295. package/dist/src/migration/legacy-rows.js +72 -0
  296. package/dist/src/migration/legacy-rows.js.map +1 -0
  297. package/dist/src/persistence/sqlite-registry.d.ts +32 -0
  298. package/dist/src/persistence/sqlite-registry.js +136 -0
  299. package/dist/src/persistence/sqlite-registry.js.map +1 -0
  300. package/dist/src/ports.d.ts +93 -0
  301. package/dist/src/ports.js +4 -0
  302. package/dist/src/ports.js.map +1 -0
  303. package/dist/src/process.d.ts +4 -0
  304. package/dist/src/process.js +63 -0
  305. package/dist/src/process.js.map +1 -0
  306. package/dist/src/product-service.d.ts +30 -0
  307. package/dist/src/product-service.js +38 -0
  308. package/dist/src/product-service.js.map +1 -0
  309. package/dist/src/profiles/directories.d.ts +9 -0
  310. package/dist/src/profiles/directories.js +57 -0
  311. package/dist/src/profiles/directories.js.map +1 -0
  312. package/dist/src/profiles/service.d.ts +30 -0
  313. package/dist/src/profiles/service.js +89 -0
  314. package/dist/src/profiles/service.js.map +1 -0
  315. package/dist/src/recording/encoder.d.ts +22 -0
  316. package/dist/src/recording/encoder.js +89 -0
  317. package/dist/src/recording/encoder.js.map +1 -0
  318. package/dist/src/recording/sampler.d.ts +18 -0
  319. package/dist/src/recording/sampler.js +33 -0
  320. package/dist/src/recording/sampler.js.map +1 -0
  321. package/dist/src/recording/service.d.ts +27 -0
  322. package/dist/src/recording/service.js +180 -0
  323. package/dist/src/recording/service.js.map +1 -0
  324. package/dist/src/recording/source.d.ts +1 -0
  325. package/dist/src/recording/source.js +21 -0
  326. package/dist/src/recording/source.js.map +1 -0
  327. package/dist/src/recording.d.ts +3 -0
  328. package/dist/src/recording.js +4 -0
  329. package/dist/src/recording.js.map +1 -0
  330. package/dist/src/registry.d.ts +15 -0
  331. package/dist/src/registry.js +46 -0
  332. package/dist/src/registry.js.map +1 -0
  333. package/dist/src/runtime-selector.d.ts +12 -0
  334. package/dist/src/runtime-selector.js +78 -0
  335. package/dist/src/runtime-selector.js.map +1 -0
  336. package/dist/src/service-options.d.ts +19 -0
  337. package/dist/src/service-options.js +2 -0
  338. package/dist/src/service-options.js.map +1 -0
  339. package/dist/src/service.d.ts +39 -0
  340. package/dist/src/service.js +204 -0
  341. package/dist/src/service.js.map +1 -0
  342. package/dist/src/sessions/leases.d.ts +10 -0
  343. package/dist/src/sessions/leases.js +41 -0
  344. package/dist/src/sessions/leases.js.map +1 -0
  345. package/dist/src/sessions/prune.d.ts +2 -0
  346. package/dist/src/sessions/prune.js +8 -0
  347. package/dist/src/sessions/prune.js.map +1 -0
  348. package/dist/src/testing.d.ts +18 -0
  349. package/dist/src/testing.js +21 -0
  350. package/dist/src/testing.js.map +1 -0
  351. package/dist/src/toolbox.d.ts +3 -0
  352. package/dist/src/toolbox.js +4 -0
  353. package/dist/src/toolbox.js.map +1 -0
  354. package/dist/src/types.d.ts +273 -0
  355. package/dist/src/types.js +2 -0
  356. package/dist/src/types.js.map +1 -0
  357. package/docs/ACTIONS.md +27 -0
  358. package/docs/ARCHITECTURE.md +71 -0
  359. package/docs/AUTHENTICATION.md +56 -0
  360. package/docs/AXIOMS.md +20 -0
  361. package/docs/CLI.md +61 -0
  362. package/docs/COMPATIBILITY.md +45 -0
  363. package/docs/COOKIES.md +61 -0
  364. package/docs/ELECTRON_INTEGRATION.md +87 -0
  365. package/docs/ENGINE_INTEGRATION.md +73 -0
  366. package/docs/EVENTS.md +30 -0
  367. package/docs/HEADLESS_RUNTIME.md +58 -0
  368. package/docs/MCP.md +36 -0
  369. package/docs/MIGRATION.md +64 -0
  370. package/docs/OPERATIONS.md +69 -0
  371. package/docs/README.md +21 -0
  372. package/docs/REALTIME_BOUNDARY.md +33 -0
  373. package/docs/RECORDING.md +55 -0
  374. package/docs/REST.md +69 -0
  375. package/docs/SDK.md +101 -0
  376. package/docs/TESTING.md +57 -0
  377. package/docs/TOOLBOX_INTEGRATION.md +34 -0
  378. package/docs/TROUBLESHOOTING.md +67 -0
  379. package/examples/basic.ts +7 -0
  380. package/examples/custom-driver.ts +45 -0
  381. package/package.json +78 -0
  382. package/skills/use-amalgm-browser/SKILL.md +42 -0
  383. package/skills/use-amalgm-browser/agents/openai.yaml +4 -0
  384. package/skills/use-amalgm-browser/references/actions.md +40 -0
package/docs/SDK.md ADDED
@@ -0,0 +1,101 @@
1
+ # TypeScript SDK
2
+
3
+ The package is ESM-only and supports Node.js 20 or newer.
4
+
5
+ ```ts
6
+ import { createBrowser, BrowserError } from '@amalgm/browser';
7
+ ```
8
+
9
+ `createBrowser(options)` returns `BrowserProductService`. Defaults include a
10
+ SQLite registry, local artifact store, encrypted cookie/auth files, headless
11
+ driver, event bus, system clock, safe logger, and runtime selector. Injected
12
+ ports can replace registry, drivers, selector, event sink, clock, ID generator,
13
+ logger, authorization, profile directories, artifact store, process launcher,
14
+ cookie jar/coordinator, auth vault, login secret store, and ffmpeg. Native
15
+ ad-block construction separately accepts an injected fetch implementation.
16
+
17
+ ## Sessions and actions
18
+
19
+ - `createSession({ id?, profileId?, profileKind?, context? })`
20
+ - `getSession(id)` / `listSessions()`
21
+ - `execute(sessionId, BrowserAction, context?)`
22
+ - `cancel(sessionId)`
23
+ - `closeSession(sessionId, context?)`
24
+ - `pruneSessions(maxAgeMs?)`
25
+
26
+ `BrowserAction` is a discriminated union for `open`, `snapshot`, `screenshot`,
27
+ `click`, `fill`, `press`, `select`, `eval`, `wait`, `cli`, `dialog`, `tab`,
28
+ `console`, `cua`, and `close`. See [ACTIONS.md](./ACTIONS.md). Blocking calls
29
+ take `context.signal`; cancellation propagates to the driver, CDP, encoder, or
30
+ child process.
31
+
32
+ ## Profiles
33
+
34
+ - `createProfile({ id?, name, kind? })`
35
+ - `listProfiles()` / `getProfile(id)` / `inspectProfile(id)`
36
+ - `updateProfile(id, { name?, kind? })`
37
+ - `deleteProfile(id)` / `pruneProfiles(maxAgeMs?)`
38
+
39
+ Inspection returns `live`, `referenced`, and physical `locked` status. Delete
40
+ and prune refuse live, referenced, or Chromium-locked profiles.
41
+
42
+ ## Authentication and login
43
+
44
+ - `browser.auth.list()` / `get(id)` / `delete(id)`
45
+ - `browser.auth.save({ sessionId, name, domains?, context? })`
46
+ - `browser.auth.load({ sessionId, bundleId, context? })`
47
+ - `browser.auth.exportEncrypted(id, portableKey, context?)`
48
+ - `browser.auth.importEncrypted(resource, portableKey, context?)`
49
+ - `browser.login.create(...)` / `list()` / `get(id)`
50
+ - `browser.login.activate(id, token, context?)`
51
+ - `browser.login.input(id, token, cuaOperation, context?)`
52
+ - `browser.login.complete(...)` / `cancel(id, token)`
53
+
54
+ The token and token-bearing URL exist only in the one-time login creation
55
+ result. Stored login resources contain a hash and ordinary list/get projections
56
+ never return the credential.
57
+
58
+ ## Cookies
59
+
60
+ `browser.cookies` is the encrypted jar. `browser.cookieAdapters` registers and
61
+ reconciles trusted physical-store adapters. This is an embedding API, not an
62
+ ordinary automation API; raw cookie values must not be projected to users.
63
+ See [COOKIES.md](./COOKIES.md).
64
+
65
+ ## Recordings
66
+
67
+ - `browser.recordings.start({ sessionId, fps?, name?, context? })`
68
+ - `stop(sessionId)` / `forceStop(sessionId)`
69
+ - `list()` / `get(recordingId)` / `activeRecordings()`
70
+
71
+ FPS is clamped to 1–30. Artifact placement uses `context.artifactDestination`
72
+ before the standalone fallback.
73
+
74
+ ## Runtime context
75
+
76
+ `BrowserRuntimeContext` accepts opaque `ownerId`, `callerId`, `clientKind`,
77
+ `projectRef`, `cwdRef`, `artifactDestination`, authorization context, and
78
+ `AbortSignal`. Browser does not discover these from Chat or a workspace
79
+ registry.
80
+
81
+ ## Errors and capabilities
82
+
83
+ Failures are `BrowserError` values with stable codes such as `INVALID_INPUT`,
84
+ `NOT_FOUND`, `CONFLICT`, `CAPABILITY_UNSUPPORTED`, `AUTHORIZATION_DENIED`,
85
+ `TIMEOUT`, `ABORTED`, `PROCESS_FAILED`, and `SURFACE_IDENTITY_MISMATCH`.
86
+ Inspect `session.capabilities` before optional behavior. Unsupported behavior
87
+ fails explicitly; it is not silently approximated.
88
+
89
+ ## Entry points
90
+
91
+ - `@amalgm/browser` — service, ports, types, persistence, migration
92
+ - `@amalgm/browser/headless` — headless driver and executable resolution
93
+ - `@amalgm/browser/electron` — Electron-only host and native shell
94
+ - `@amalgm/browser/cookies` — trusted cookie integration
95
+ - `@amalgm/browser/recording` — recording components
96
+ - `@amalgm/browser/toolbox`, `/mcp`, `/http` — adapters
97
+ - `@amalgm/browser/testing` — deterministic test driver
98
+
99
+ The [custom driver example](../examples/custom-driver.ts) implements the small
100
+ `BrowserDriver` contract for a remote provider. A provider must advertise only
101
+ capabilities it implements and must honor the runtime cancellation signal.
@@ -0,0 +1,57 @@
1
+ # Testing
2
+
3
+ Tests are organized by invariant rather than implementation file. The default
4
+ suite is deterministic and uses injected drivers/stores; opt-in suites exercise
5
+ real browser processes.
6
+
7
+ ```sh
8
+ npm run check # tree hygiene and strict TypeScript
9
+ npm test # unit and transport contracts
10
+ npm run test:real # real bundled headless Chromium
11
+ npm run test:electron # real Electron; macOS
12
+ npm run verify # check, build, test, package/install
13
+ ```
14
+
15
+ ## Contract coverage
16
+
17
+ - immutable backend/profile binding, restart reopen, leases, cancellation
18
+ - all 22 actions reachable through SDK, CLI, MCP, REST, and Toolbox
19
+ - capability honesty and typed errors
20
+ - two-surface identity, ambiguity, loss, and one verified reattach
21
+ - isolated Electron partition and trusted cookie adapter
22
+ - record-level cookie merges, tombstones, stale snapshots, retry, and feedback
23
+ - protected hosts, partition keys, encryption integrity, wrong-key redaction
24
+ - auth filtering, token TTL/hash, live login, portable import/export
25
+ - profile locks, references, deletion refusal, and ephemeral pruning
26
+ - CSS-pixel/DPR capture and page-scoped native input
27
+ - recording viability, latest-frame buffer, backpressure, cancellation, ffmpeg
28
+ - SQLite cross-process writes and encrypted legacy migration fixtures
29
+ - REST auth/limits/SSE and MCP cancellation
30
+ - argv process safety, bounded output/termination, asar resolution
31
+ - native Electron URL/popup/download/permission/ad-block policies
32
+
33
+ ## Real boundaries
34
+
35
+ The headless suite launches bundled Chromium and ffmpeg. The Electron harness
36
+ launches the actual Electron binary with two `WebContentsView` surfaces and
37
+ checks partition identity, isolation, capture, remount, and WebM recording.
38
+ These tests exist because mocks cannot validate CDP target identity or physical
39
+ partition behavior.
40
+
41
+ ## Package verification
42
+
43
+ `verify:pack` runs `npm pack`, inspects contents for runtime data/secrets,
44
+ checks the compiled CLI, installs the tarball into a temporary consumer without
45
+ Electron, and imports the ESM core. Build output and temporary tarballs remain
46
+ ignored.
47
+
48
+ Production TypeScript in `src/` and `bin/` is limited to 220 lines per file.
49
+ The tree check fails on generated-source evasions and tracked build/runtime
50
+ artifacts.
51
+
52
+ ## Adding behavior
53
+
54
+ Update purpose/axioms if the model changes, then the typed SDK, shared action
55
+ descriptor, every transport projection, documentation, and an invariant test.
56
+ A new action that is not reachable through all five public surfaces must fail
57
+ the parity suite.
@@ -0,0 +1,34 @@
1
+ # Toolbox integration
2
+
3
+ Browser projects into `@amalgm/tools` as one tool:
4
+
5
+ - tool ID: `browser`
6
+ - action IDs: `browser.<short-action>`
7
+ - MCP names: `toolbox__browser_<short-action>`
8
+ - capability sections: `core`, `computer-use`, `recording`, `auth`
9
+
10
+ Import `browserToolboxManifest` and `createBrowserToolboxExecutor` from
11
+ `@amalgm/browser/toolbox`. Tools owns registry presentation, enablement,
12
+ loadouts, grants, and picker UI. Browser owns validation and execution.
13
+
14
+ ```ts
15
+ import {
16
+ browserToolboxManifest,
17
+ createBrowserToolboxExecutor,
18
+ } from '@amalgm/browser/toolbox';
19
+
20
+ tools.register(browserToolboxManifest);
21
+ const execute = createBrowserToolboxExecutor(browser, enabledActionIds);
22
+ ```
23
+
24
+ The executor normalizes compatibility aliases once, verifies the action is
25
+ granted, and dispatches the canonical action through the SDK. Disabled actions
26
+ fail before session creation or browser execution.
27
+
28
+ Legacy individual `cua_*` actions, old prefixed IDs, and historical aggregate
29
+ grants are adapter aliases. They do not create new SDK action identities. In
30
+ particular, never generate `toolbox__browser_browser_<action>`.
31
+
32
+ The parity contract executes every canonical action through the Toolbox
33
+ executor as well as SDK, CLI, MCP, and REST. Adding an action descriptor without
34
+ a reachable Toolbox projection fails verification.
@@ -0,0 +1,67 @@
1
+ # Troubleshooting
2
+
3
+ ## A session unexpectedly uses headless
4
+
5
+ Electron selection requires `clientKind: 'desktop'` and a live, loopback,
6
+ protocol-5/6 host advertisement with a running PID. Check the advertisement
7
+ path, CDP URL, protocol, and process. Backend selection cannot be changed after
8
+ session creation; create a new session after fixing the host.
9
+
10
+ ## Surface identity mismatch
11
+
12
+ Do not retry against an active tab or another target. Confirm the surface
13
+ marker, stamp, ID, and protocol belong to the session. Browser permits one
14
+ reattach only after a genuine target loss; mismatch is intentionally fail
15
+ closed.
16
+
17
+ ## Headless executable is missing
18
+
19
+ Run `amalgm-browser doctor`, reinstall production dependencies, or set
20
+ `AMALGM_AGENT_BROWSER_BIN`. In packaged Electron builds, ensure native assets
21
+ are unpacked from `app.asar`.
22
+
23
+ ## Recording cannot start
24
+
25
+ Set `AMALGM_FFMPEG` to a working binary and run `<binary> -version`. Browser
26
+ verifies ffmpeg first, then requires a page frame within five seconds. Open a
27
+ navigable page and check that the assigned driver advertises `recording`.
28
+
29
+ ## A profile cannot be deleted
30
+
31
+ Inspect it through SDK/CLI/REST. A live session, pending login, auth bundle, or
32
+ Chromium process lock intentionally protects the directory. Close/cancel the
33
+ owner or remove the explicit reference; never delete lock files from a running
34
+ profile.
35
+
36
+ ## Cookie jar reports unhealthy
37
+
38
+ Ordinary browsing should continue with the physical profile store. Do not print
39
+ or hand-edit encrypted payloads. Restore a matching jar/key backup or clear the
40
+ damaged automatic jar only after accepting that cross-backend cookie state is
41
+ lost. Named auth bundles are separate.
42
+
43
+ ## REST returns 401/403
44
+
45
+ Health is the only unauthenticated route. Supply the exact bearer token. Raw
46
+ cookie routes additionally require `X-Browser-Adapter-Token`. Non-loopback
47
+ listen also requires explicit remote authorization.
48
+
49
+ ## Login handoff fails
50
+
51
+ Tokens are one-time credentials returned only at creation, TTL is at most one
52
+ hour, and completed/cancelled/expired sessions reject reuse. For noVNC, set a
53
+ valid HTTP(S) `AMALGM_BROWSER_NOVNC_PUBLIC_URL`.
54
+
55
+ ## SQLite is busy or a session conflicts
56
+
57
+ Another process may hold the session lease. Do not run two active owners for
58
+ one browser session. Let the operation finish or cancel it through the owning
59
+ service; stale leases expire. Avoid placing the DB on filesystems with broken
60
+ SQLite locking.
61
+
62
+ ## Migration fails
63
+
64
+ Keep old writers stopped. Verify the legacy DB exists, the source auth blob
65
+ hashes match, and the legacy 32-byte key is available. The importer is
66
+ transactional and does not mark completion on failure; fix the violated
67
+ invariant and rerun rather than editing the migration marker.
@@ -0,0 +1,7 @@
1
+ import { createBrowser } from '@amalgm/browser';
2
+
3
+ const browser = createBrowser();
4
+ const session = await browser.createSession({ id: 'example' });
5
+ await browser.execute(session.id, { type: 'open', url: 'https://example.com' });
6
+ console.log(await browser.execute(session.id, { type: 'snapshot' }));
7
+ await browser.closeSession(session.id);
@@ -0,0 +1,45 @@
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' });
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@amalgm/browser",
3
+ "version": "0.1.0",
4
+ "description": "Safe persistent browser automation across headless Chromium and visible Electron surfaces.",
5
+ "repository": { "type": "git", "url": "git+https://github.com/amalgm-inc/amalgm-browser.git" },
6
+ "bugs": { "url": "https://github.com/amalgm-inc/amalgm-browser/issues" },
7
+ "homepage": "https://github.com/amalgm-inc/amalgm-browser#readme",
8
+ "license": "UNLICENSED",
9
+ "type": "module",
10
+ "private": false,
11
+ "publishConfig": { "access": "public" },
12
+ "main": "./dist/src/index.js",
13
+ "types": "./dist/src/index.d.ts",
14
+ "exports": {
15
+ ".": { "types": "./dist/src/index.d.ts", "import": "./dist/src/index.js" },
16
+ "./headless": { "types": "./dist/src/headless.d.ts", "import": "./dist/src/headless.js" },
17
+ "./electron": { "types": "./dist/src/electron.d.ts", "import": "./dist/src/electron.js" },
18
+ "./cookies": { "types": "./dist/src/cookies.d.ts", "import": "./dist/src/cookies.js" },
19
+ "./recording": { "types": "./dist/src/recording.d.ts", "import": "./dist/src/recording.js" },
20
+ "./toolbox": { "types": "./dist/src/toolbox.d.ts", "import": "./dist/src/toolbox.js" },
21
+ "./mcp": { "types": "./dist/src/mcp.d.ts", "import": "./dist/src/mcp.js" },
22
+ "./http": { "types": "./dist/src/http.d.ts", "import": "./dist/src/http.js" },
23
+ "./testing": { "types": "./dist/src/testing.d.ts", "import": "./dist/src/testing.js" }
24
+ },
25
+ "bin": {
26
+ "amalgm-browser": "./dist/bin/amalgm-browser.js",
27
+ "amalgm-browser-mcp": "./dist/bin/amalgm-browser-mcp.js",
28
+ "amalgm-browser-rest": "./dist/bin/amalgm-browser-rest.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "docs",
33
+ "examples",
34
+ "skills",
35
+ "CHANGELOG.md",
36
+ "LICENSE",
37
+ "PURPOSE.md",
38
+ "README.md",
39
+ "SECURITY.md"
40
+ ],
41
+ "scripts": {
42
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && tsx scripts/mark-executables.ts",
43
+ "check": "tsx scripts/check-tree.ts && tsc -p tsconfig.json && tsc -p tsconfig.test.json",
44
+ "test": "tsx --test --test-concurrency=1 --test-timeout=30000 test/*.test.ts",
45
+ "test:real": "cross-env AMALGM_BROWSER_REAL=1 tsx --test --test-timeout=60000 test/real-headless.test.ts",
46
+ "pretest:electron": "npm run build",
47
+ "test:electron": "tsx scripts/run-electron-test.ts",
48
+ "verify": "npm run check && npm run build && npm test && npm run verify:pack",
49
+ "verify:pack": "tsx scripts/verify-package.ts",
50
+ "prepack": "npm run build"
51
+ },
52
+ "engines": { "node": ">=20" },
53
+ "dependencies": {
54
+ "@amalgm/core": "^0.1.0",
55
+ "@ghostery/adblocker": "^2.18.1",
56
+ "agent-browser": "0.26.0",
57
+ "better-sqlite3": "^12.10.1",
58
+ "ffmpeg-static": "^5.3.0",
59
+ "tldts-experimental": "^7.4.9",
60
+ "ws": "^8.18.3"
61
+ },
62
+ "peerDependencies": {
63
+ "electron": ">=33"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "electron": { "optional": true }
67
+ },
68
+ "devDependencies": {
69
+ "@types/ffmpeg-static": "^3.0.3",
70
+ "@types/node": "^20.19.43",
71
+ "@types/better-sqlite3": "^7.6.13",
72
+ "@types/ws": "^8.18.1",
73
+ "cross-env": "^7.0.3",
74
+ "electron": "41.7.1",
75
+ "tsx": "^4.23.1",
76
+ "typescript": "^5.9.3"
77
+ }
78
+ }
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: use-amalgm-browser
3
+ description: Operate web pages through the standalone Amalgm Browser MCP or CLI using persistent sessions, accessibility snapshots, screenshots, browser-scoped computer use, recordings, and human login handoff. Use for web navigation, form interaction, page inspection, visual verification, canvas or image-only controls, authenticated browsing, or browser recordings.
4
+ ---
5
+
6
+ # Use Amalgm Browser
7
+
8
+ Use Browser as one persistent page session. Let the host select visible Electron
9
+ or headless Chromium; do not ask users to choose a backend during normal work.
10
+
11
+ ## Work in this order
12
+
13
+ 1. Call `browser_open` once with the target URL.
14
+ 2. Call `browser_snapshot` to read the page and obtain stable `@eN` references.
15
+ 3. Prefer `browser_click`, `browser_fill`, `browser_select`, and `browser_press`
16
+ with snapshot references.
17
+ 4. Re-run `browser_snapshot` after navigation or material page changes.
18
+ 5. Use `browser_screenshot` only when pixels matter.
19
+ 6. Use `browser_cua` for canvas, WebGL, image-only, or hostile custom controls.
20
+ 7. Keep the same `session` value throughout one task. Close it when finished.
21
+
22
+ Use `text=Visible label` or CSS only when a snapshot reference is unavailable.
23
+ Use `browser_cli` only for an operation absent from the canonical actions.
24
+
25
+ ## Safety and identity
26
+
27
+ - Treat screenshot and computer-use coordinates as CSS pixels with a 1:1 map.
28
+ - Never try to switch an Electron session onto another visible surface.
29
+ - Let surface verification fail closed; retry once only when Browser reports a
30
+ genuine surface reconnection.
31
+ - Never request or print raw cookies, tokens, auth payloads, or storage values.
32
+ - Use `browser_auth_link_create` when a human must complete authentication.
33
+ - Use named auth bundles explicitly; do not treat a profile as an auth bundle.
34
+
35
+ ## Specialized operations
36
+
37
+ - For action inputs and CUA variants, read
38
+ [references/actions.md](references/actions.md).
39
+ - For recordings, start only after the page is open and stop before closing the
40
+ session. Report `videoSeconds` and `wallSeconds` by their actual names.
41
+ - For visual verification, use the returned screenshot image rather than
42
+ inferring appearance from the accessibility snapshot.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Use Amalgm Browser"
3
+ short_description: "Browse and operate pages through Amalgm Browser"
4
+ default_prompt: "Use $use-amalgm-browser to inspect and operate the requested web page safely."
@@ -0,0 +1,40 @@
1
+ # Browser actions
2
+
3
+ ## Targets
4
+
5
+ - `@e12`: preferred stable reference from the latest snapshot.
6
+ - `text=Sign in`: visible-text fallback.
7
+ - `#submit` or another CSS selector: structural fallback.
8
+
9
+ ## Computer use
10
+
11
+ Call `browser_cua` with one `operation`:
12
+
13
+ ```json
14
+ { "kind": "screenshot" }
15
+ { "kind": "click", "x": 320, "y": 240, "button": "left" }
16
+ { "kind": "double_click", "x": 320, "y": 240 }
17
+ { "kind": "move", "x": 320, "y": 240 }
18
+ { "kind": "scroll", "scrollY": 600, "scrollX": 0 }
19
+ { "kind": "type", "text": "hello" }
20
+ { "kind": "keypress", "keys": ["Control", "a"] }
21
+ { "kind": "drag", "path": [{ "x": 10, "y": 10 }, { "x": 80, "y": 90 }] }
22
+ ```
23
+
24
+ Normal DOM work should use snapshot refs. Computer use is the fallback for
25
+ interfaces without usable DOM semantics.
26
+
27
+ ## Tabs and dialogs
28
+
29
+ Use `browser_tab` with `list`, `new`, `switch`, or `close`. Visible Electron
30
+ sessions are bound to one verified surface and may reject switching.
31
+
32
+ Use `browser_dialog` with `accept` or `dismiss`; add `text` only for prompts.
33
+
34
+ ## Authentication and recording
35
+
36
+ - `browser_auth_link_create`: mint a human login handoff.
37
+ - `browser_auth_save`: explicitly save named encrypted browser state.
38
+ - `browser_auth_load`: explicitly load a named bundle into a session.
39
+ - `browser_record_start`, `browser_record_stop`, `browser_record_list`: manage
40
+ page-only WebM recordings.