@amalgm/browser 0.1.2-preview.35466566682 → 0.1.2-preview.37158931600

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 +92 -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 +37 -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 +4 -10
  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 +585 -818
  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 +139 -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 +81 -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 +9 -16
  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
package/PURPOSE.md CHANGED
@@ -3,43 +3,39 @@
3
3
  ## Purpose
4
4
 
5
5
  Amalgm Browser gives users and software agents one safe, persistent,
6
- observable way to browse and operate the web across desktop and server
7
- environments. It presents the same browser actions through an SDK, CLI, MCP,
8
- and REST API while selecting the correct underlying browser implementation
9
- from host context. In the macOS desktop app, browser work can occur in a
10
- visible Electron surface that the user can watch and control. Everywhere else,
11
- the same work runs in an isolated headless Chromium session. Browser state
6
+ observable way to browse and operate the web. It presents the same browser
7
+ actions through an SDK, CLI, MCP, and REST API. Each runtime runs one headless
8
+ Chrome. Every session, usually one per chat, drives its own tabs in that
9
+ Chrome, and every session browses as the runtime's signed-in Amalgm account. A
10
+ viewer can watch and drive any session through its live view. Browser state
12
11
  belongs to Browser, never to Chat, Agents, Shell, Engine, or the application
13
12
  renderer.
14
13
 
15
- Browser serves users browsing visibly in Amalgm, agents using Browser through
16
- a Toolbox, background automations and sub-agents, standalone SDK and CLI
17
- consumers, MCP and REST clients, and future browser-driver implementations.
14
+ Browser serves agents using Browser through a Toolbox, background automations
15
+ and sub-agents, standalone SDK and CLI consumers, and MCP and REST clients.
18
16
 
19
- Amalgm Shell is the active composition root. It may provide host capabilities,
20
- execution context, artifact storage, event relay, and UI coordination through
21
- public Browser ports. It does not own a second browser implementation.
22
- Amalgm Engine is historical reference evidence only.
17
+ Amalgm Shell is the active composition root. It supplies the account, caller
18
+ context, artifact storage, event relay, and UI coordination through public
19
+ Browser ports. It does not own a second browser implementation.
23
20
 
24
21
  ## Primitives
25
22
 
26
23
  - A **browser service** is the sole mutation boundary for one Browser state
27
24
  directory.
28
- - A **driver** implements browser actions for one backend kind: `electron` or
29
- `headless`.
30
- - A **profile** is a durable or ephemeral browser working identity.
31
- - A **session** is one live automation lifetime bound to one driver and one
32
- profile.
33
- - A **page** is one web page belonging to one session.
34
- - A **surface** is one visible Electron-hosted page belonging to one session.
35
- - An **action** is one typed browser operation with backend-independent
36
- meaning.
37
- - A **capability** states whether a driver supports an operation.
38
- - A **capture** is a bounded raster result from a session's actual page.
25
+ - An **account** is the Amalgm identity the runtime browses as. Its one
26
+ durable profile owns every session, auth bundle, and login.
27
+ - The **Chrome host** is the runtime's one headless Chrome, shared by every
28
+ session.
29
+ - A **driver** runs actions for sessions. The default driver gives each
30
+ session its own agent-browser daemon attached to the Chrome host.
31
+ - A **session** is one named, durable browsing context with its own tabs.
32
+ - A **page** is one tab belonging to one session.
33
+ - An **action** is one typed browser operation.
34
+ - A **live view** is a session's stream of frames out and input in.
35
+ - A **capture** is a bounded raster result from a session's own page.
39
36
  - A **recording** is a bounded capture lifecycle and its stored artifact.
40
- - A **cookie jar** is Browser's encrypted logical cookie authority.
41
- - A **cookie adapter** reconciles one driver's physical cookie store with the
42
- logical jar.
37
+ - A **cookie jar** is the account's encrypted cookie store of record.
38
+ - A **cookie adapter** syncs one browser's physical cookie store with the jar.
43
39
  - An **auth bundle** is an explicit encrypted snapshot of named browser
44
40
  authentication state.
45
41
  - A **login session** is a TTL-bound handoff for human authentication.
@@ -77,86 +73,112 @@ locked dependency graph on the supported Node toolchain.
77
73
 
78
74
  1. Browser owns browser state and never depends on Chat, Agents, Shell, Engine,
79
75
  Realtime, or an application renderer to define it.
80
- 2. Every state change passes through `BrowserService`; drivers execute actions
81
- and adapters expose the service without reimplementing its rules.
82
- 3. Every live session belongs to exactly one backend and one profile, and its
83
- backend never changes during that session.
84
- 4. Every page and visible surface belongs to exactly one session. Visible
85
- identity is stamped and verified; ambiguity or mismatch fails closed before
86
- an action, and reconnection may only recover the same verified surface.
87
- 5. Requested capability and fresh host evidence select a backend before session
88
- creation. Work requiring a visible surface selects a compatible Electron
89
- host or fails clearly; background work selects headless; work that merely
90
- prefers visibility may fall back to headless. An explicit operator CDP
91
- endpoint and a standalone headed window are always deliberate overrides.
92
- 6. One action has one meaning across drivers. Backend differences are explicit
93
- capabilities or typed unsupported-operation errors.
94
- 7. Cancellation and deadlines reach the underlying CDP call, encoder, fetch,
95
- or child process. Process execution uses argv, bounded output, and bounded
96
- termination without a shell.
97
- 8. Browser output is bounded or externalized through an artifact store.
76
+ 2. Every state change passes through `BrowserService`. The driver executes
77
+ actions, and adapters expose the service without reimplementing its rules.
78
+ 3. Browsing identity is the Amalgm account alone. The registry keeps exactly
79
+ one durable profile, the account's, and every session, auth bundle, and
80
+ login belongs to it. A state root binds to that account atomically and
81
+ cannot be relabeled as another account.
82
+ 4. A runtime runs one Chrome, owned by one process at a time. Chrome starts on
83
+ first use and restarts on the next use after it dies. An OS-held lease
84
+ protects the profile; a dead owner's Chrome is retired only through the
85
+ exact browser endpoint that profile published, never by a PID guess.
86
+ 5. Every tab belongs to exactly one session. A session sees and controls only
87
+ its own tabs, every tab it opens lands in the account's browser context,
88
+ and no session may end or reshape the Chrome that others share.
89
+ Advanced argv describes page operations only; operation data is separate
90
+ from process configuration and cannot select another engine or account.
91
+ 6. Sessions are durable. A ready session from an earlier process reopens when
92
+ `createSession` names it again, as every adapter does on each call, and a
93
+ session keeps working after its Chrome dies and restarts. A session's live
94
+ view shows and drives only that session.
95
+ 7. Capture, computer-use input, and recording address the session's own page.
96
+ When that page is ambiguous, they fail with `SURFACE_IDENTITY_FAILED`
97
+ instead of guessing.
98
+ 8. Cancellation and deadlines reach the underlying CDP call, encoder, or child
99
+ process. Process execution uses argv, bounded output, and bounded
100
+ termination without a shell. Admission precedes asynchronous work; closing
101
+ stops admission, cancels and drains admitted operations, then releases
102
+ recordings, the driver and the registry, in that order.
103
+ 9. Browser output is bounded or externalized through an artifact store.
98
104
  Screenshot and computer-use coordinates share CSS-pixel space.
99
- 9. Application authentication, the Electron `defaultSession`, the isolated
100
- `persist:amalgm-browser` partition, and headless profile stores are separate
101
- security domains. Browser never reads application authentication state.
102
- 10. Cross-backend cookie portability occurs only through the encrypted Browser
103
- jar. Merges are record-level, deletions are tombstoned, partition identity
104
- is preserved, protected hosts are rejected, and drivers never reach into
105
- one another's stores.
106
- 11. Cookie values, tokens, origin storage, encryption keys, and authorization
107
- headers never appear in logs, events, diagnostics, ordinary API results, or
105
+ 10. Application authentication and the Electron `defaultSession` are outside
106
+ Browser. Browser never reads application authentication state, and
107
+ cookies for protected hosts never enter the account.
108
+ 11. The account's encrypted cookie jar is the store of record. Each browser
109
+ store syncs both ways with the jar and never reads another store
110
+ directly. Merges are record-level, deletions are tombstoned, and
111
+ host-only, domain and partition scope are preserved. A reconnect cannot
112
+ resurrect a tombstoned cookie; only an observed new local edit can do so.
113
+ An interrupted adapter apply remains an unacknowledged store projection,
114
+ so its partial echo cannot supersede newer store changes.
115
+ Native cookie events carry the changed record: save it durably, then deliver
116
+ the committed change to the other browser stores. Ordinary mutations never
117
+ scan a store, rewrite the jar, or download a full snapshot. Connection and
118
+ recovery events alone initialize a store from a snapshot. An idle account
119
+ performs no cookie work; synchronization has no polling, debounce, or retry
120
+ timer. An unavailable connection resumes on a host readiness or cookie event.
121
+ The jar stores one encrypted row per cookie identity, including deletions;
122
+ a transaction is durable before its value-free revision notification.
123
+ 12. Cookie values, tokens, origin storage, encryption keys, and authorization
124
+ headers never appear in logs, public events, diagnostics, ordinary API results, or
108
125
  resource projections. Automatic synchronization moves cookies only.
109
- 12. Profiles, cookie identity, auth bundles, and login sessions remain distinct.
110
- Ephemeral profiles are pruned unless live or explicitly referenced; named
111
- auth bundles move origin storage only when explicitly requested.
112
- 13. Secret-bearing writes are encrypted, integrity-checked, atomic, and
113
- permission-restricted. A missing or corrupt automatic cookie jar degrades
114
- ordinary browsing safely instead of exposing secrets or disabling actions.
115
- 14. Capture and recording resolve the session's actual page target without
116
- first-target fallbacks. Recording proves capture before encoding, permits
117
- one active recording per session, captures page imagery only, and stops an
118
- uncooperative encoder within a deadline.
119
- 15. Browser emits sanitized events. Project, cwd, authorization, and artifact
120
- destinations enter through explicit context and ports; Browser never
121
- invents a workspace or synchronization authority.
122
- 16. Browser migrations are versioned, atomic, idempotent, and restart-safe.
126
+ 13. Cookies, auth bundles, and login sessions remain distinct. Named auth
127
+ bundles move origin storage only when explicitly requested. A login handoff
128
+ serializes its transitions, repeated activation keeps the same active page,
129
+ and a terminal login cannot become active again.
130
+ 14. Browser-owned secret records are encrypted, integrity-checked, atomic, and
131
+ permission-restricted; physical browser profiles follow platform storage policy.
132
+ A missing or corrupt cookie jar degrades ordinary
133
+ browsing safely instead of exposing secrets or disabling actions.
134
+ 15. Recording proves capture before encoding, permits one active recording
135
+ per session, captures page imagery only, and stops an uncooperative
136
+ encoder within a deadline.
137
+ 16. Browser emits sanitized events. Project, cwd, caller, authorization, and
138
+ artifact destinations enter through explicit context and ports; Browser
139
+ never invents a workspace or synchronization authority.
140
+ 17. Browser migrations are versioned, atomic, idempotent, and restart-safe.
123
141
  Existing Browser data is reused or verified before any destructive change.
124
- 17. TypeScript under `src/` and `bin/` is the sole implementation source. The
142
+ 18. TypeScript under `src/` and `bin/` is the sole implementation source. The
125
143
  SDK owns behavior; CLI, MCP, REST, Toolbox, and Electron IPC remain thin
126
144
  adapters with parity tests.
127
- 18. Browser installs and operates without Shell, Engine, or Electron. Behavior
145
+ 19. Browser installs and operates without Shell, Engine, or Electron. Behavior
128
146
  on an unseen session follows from these axioms without another special case.
129
- 19. Shell composes exactly one Browser service. Electron supplies a hardened
130
- visible host and isolated cookie adapter to that service; it never creates a
131
- second Browser registry, session authority, or action implementation.
132
- 20. Headless IPC uses a private OS-temporary socket namespace and a digest of
133
- the canonical Browser root and session identity; durable path depth and
147
+ 20. Shell composes exactly one Browser service per runtime and closes it on
148
+ shutdown. Electron browses in a separate persistent partition for each
149
+ Amalgm account and syncs through Browser's private cookie adapter port;
150
+ it never creates a second registry, session authority, or action implementation.
151
+ Signing out retires that account's views and cookie adapter.
152
+ 21. agent-browser IPC uses a private OS-temporary socket namespace and a digest
153
+ of the canonical Browser root and session identity; durable path depth and
134
154
  session-name length cannot exceed the operating system's socket limit.
135
155
 
136
156
  ## Predictable behavior
137
157
 
138
- Before session creation, the requested capability and host context select one
139
- capable backend. The session keeps that backend until close; a lost visible page
140
- either verifies and reattaches to its original stamped surface or fails before
141
- acting. All public surfaces dispatch the same typed action through
142
- `BrowserService`. Background work stays headless unless visibility is requested
143
- or an operator explicitly asks for a headed debug window.
144
-
145
- The visible Electron partition and every headless profile keep physically
146
- separate Chromium stores. Their adapters may reconcile individual cookie
147
- records through Browser's encrypted jar, including tombstoned deletions, but
148
- they cannot inspect one another. Named auth bundles are separate, explicit
149
- snapshots. Captures, input coordinates, and recordings all address the same
150
- verified page, while large artifacts leave the API through the injected store.
151
- Shell and Realtime can compose and relay Browser without becoming Browser.
158
+ Every public surface dispatches the same typed action through
159
+ `BrowserService`. The session is an explicit `session` input, else the
160
+ caller's ID from the runtime context, else `default`, so each chat browses in
161
+ its own session without naming one. The first use of a session in a process
162
+ attaches its agent-browser daemon to the runtime's Chrome through the
163
+ session's relay endpoint.
164
+
165
+ All sessions share the account's browser context. A sign-in in one chat is
166
+ visible in every other chat. Chrome's account profile and Electron's isolated
167
+ account partition emit native cookie changes. Browser persists only those
168
+ records and delivers only changes since each adapter's acknowledged revision.
169
+ Chrome's private extension observes the profile, without attaching to websites
170
+ or inspecting network traffic. The jar initializes each new connection;
171
+ physical browser storage is a projection, never another authority.
172
+ Named auth bundles are separate, explicit snapshots. Captures, input
173
+ coordinates, and recordings address the session's own page, while large
174
+ artifacts leave the API through the injected store. Shell and Realtime can
175
+ compose and relay Browser without becoming Browser.
152
176
 
153
177
  The Browser build supplies its Electron CommonJS adapter and companion preload as
154
178
  SDK-owned artifacts; a UI copies those bytes without rebuilding Browser behavior.
155
- Desktop bridge discovery uses one host-selected machine namespace and a validated
156
- Core binding; neither a shared user root nor an unknown lane selects another host.
157
-
158
- Headless source examinations provision Chrome through the locked agent-browser
159
- launcher and record the actual browser identity and failing operation. Installing
160
- the npm dependency supplies the launcher, not Chrome; ambient browser discovery
161
- is not proof that the declared browser prerequisite was provisioned. Process
162
- and test deadlines retain the same bounds during diagnosis.
179
+
180
+ Browser uses an explicitly configured Chrome, then an installed
181
+ Chromium-family browser, then Chrome for Testing downloaded by agent-browser.
182
+ Installing the npm dependency supplies agent-browser, not Chrome. Source CI
183
+ provisions Chrome for Testing through the locked agent-browser dependency
184
+ before the real-browser suite.
package/README.md CHANGED
@@ -1,14 +1,15 @@
1
1
  # @amalgm/browser
2
2
 
3
- Amalgm Browser is one browser product for visible desktop browsing and
4
- isolated headless automation. Its TypeScript SDK owns behavior; the CLI, MCP
5
- server, REST API, Toolbox manifest, Electron host integration, and packaged
6
- skill are projections of the same actions.
3
+ Amalgm Browser gives agents and users one persistent, observable browser.
4
+ Each runtime runs one headless Chrome. Every session, usually one per chat,
5
+ drives its own tabs in it, and all sessions browse as the runtime's signed-in
6
+ Amalgm account. Its TypeScript SDK owns behavior; the CLI, MCP server, REST
7
+ API, Toolbox manifest, and packaged skill are projections of the same actions.
7
8
 
8
9
  Browser is independent of Amalgm Shell, Engine, Chat, Agents, Tools, and
9
10
  Realtime. Shell composes Browser through its public ports; it does not define
10
- Browser behavior.
11
- Read the [purpose and axioms](./PURPOSE.md) for the product contract.
11
+ Browser behavior. Read the [purpose and axioms](./PURPOSE.md) for the product
12
+ contract.
12
13
 
13
14
  ## Install
14
15
 
@@ -16,51 +17,46 @@ Node.js 24 or newer is required.
16
17
 
17
18
  ```sh
18
19
  npm install @amalgm/browser
19
- npx --no-install agent-browser install
20
+ npx --no-install agent-browser install # only if no Chrome is installed
20
21
  ```
21
22
 
22
- The `agent-browser` dependency supplies the launcher. Its `install` command
23
- downloads Chrome for Testing; an existing Chrome or an explicit CDP endpoint
24
- can also supply the browser.
23
+ The `agent-browser` dependency drives Chrome. Browser uses
24
+ `AMALGM_BROWSER_EXECUTABLE_PATH` if set, then an installed Chrome, Chromium, or
25
+ Brave, then the Chrome for Testing that `agent-browser install` downloads. See
26
+ [Chrome runtime](./docs/CHROME.md).
25
27
 
26
- Electron is an optional peer dependency. Server consumers can install and
27
- import the core or headless exports without loading Electron.
28
+ Electron is an optional peer dependency. Server consumers never load it.
28
29
 
29
30
  ## SDK quick start
30
31
 
31
32
  ```ts
32
33
  import { createBrowser } from '@amalgm/browser';
33
34
 
34
- const browser = createBrowser();
35
+ const browser = createBrowser({ account: { id: 'user-1', name: 'Ada' } });
35
36
  const session = await browser.createSession({ id: 'research' });
36
37
 
37
- await browser.execute(session.id, {
38
- type: 'open',
39
- url: 'https://example.com',
40
- });
41
-
38
+ await browser.execute(session.id, { type: 'open', url: 'https://example.com' });
42
39
  const snapshot = await browser.execute(session.id, { type: 'snapshot' });
40
+
43
41
  await browser.closeSession(session.id);
42
+ await browser.close(); // stops Chrome
44
43
  ```
45
44
 
46
- Standalone use selects the headless runtime. A desktop composition can
47
- inject `ElectronBrowserDriver`; an explicit `AMALGM_BROWSER_CDP_URL` attaches
48
- the headless driver to an operator-owned Chromium endpoint. Backend selection
49
- happens before session creation and never changes during the session.
45
+ Without `account`, the runtime browses as `{ id: 'local', name: 'Local' }`.
50
46
 
51
47
  ## CLI quick start
52
48
 
53
49
  ```sh
54
- amalgm-browser open https://example.com --session research
55
- amalgm-browser snapshot --session research
56
- amalgm-browser click @e3 --session research
57
- amalgm-browser screenshot --session research --full-page
58
- amalgm-browser close --session research
50
+ amalgm-browser open https://example.com
51
+ amalgm-browser sessions list
52
+ amalgm-browser auth list
59
53
  ```
60
54
 
61
- Machine-readable JSON is the normal output. Use `--timeout`, `--cwd`,
62
- `--headless`, `--headed`, or `--cdp` when the operation needs explicit runtime
63
- context. See the [CLI reference](./docs/CLI.md).
55
+ Output is JSON. A one-shot command starts Chrome, runs, and stops Chrome. The
56
+ session record and the account's cookies carry over to the next command, but
57
+ the open page does not. For multi-step browsing, keep one process running
58
+ with `amalgm-browser mcp` or `amalgm-browser serve`. See the
59
+ [CLI reference](./docs/CLI.md).
64
60
 
65
61
  ## MCP and REST
66
62
 
@@ -73,56 +69,55 @@ amalgm-browser serve --token 'replace-me'
73
69
  ```
74
70
 
75
71
  MCP uses newline-delimited JSON-RPC over stdio and exposes 22
76
- `browser_<action>` tools. REST defaults to loopback, authenticates every route
77
- except health, publishes OpenAPI at `/v1/openapi.json`, and streams sanitized
78
- events at `/v1/events`.
72
+ `browser_<action>` tools. REST binds loopback, authenticates every route
73
+ except health, publishes OpenAPI at `/v1/openapi.json`, streams sanitized
74
+ events at `/v1/events`, and serves each session's live view as a WebSocket at
75
+ `/v1/sessions/<id>/stream`.
79
76
 
80
77
  ## State, cookies, and authentication
81
78
 
82
- The default state root is `$AMALGM_BROWSER_DIR` (legacy
83
- `$AMALGM_BROWSER_ROOT`), then `$AMALGM_DIR/browser`, then
84
- `~/.amalgm/users/<scope>/browser`. Browser stores SQLite metadata, profile
85
- directories, encrypted cookie and authentication resources, and fallback
86
- artifacts there.
79
+ The state root is `$AMALGM_BROWSER_DIR` (or `$AMALGM_BROWSER_ROOT`), then
80
+ `$AMALGM_DIR/browser`, then `~/.amalgm/users/<scope>/browser`. It holds the
81
+ SQLite registry, Chrome's user data, the encrypted cookie jar, auth bundles and
82
+ login secrets, and fallback artifacts.
87
83
 
88
- The visible Electron browser must use `persist:amalgm-browser`; it must never
89
- use `defaultSession`. Electron and headless Chromium keep separate physical
90
- stores. Their adapters can reconcile cookie records only through Browser's
91
- encrypted, tombstone-aware logical jar. Named auth bundles are explicit and
92
- separate from automatic cookie synchronization. See [cookies](./docs/COOKIES.md)
93
- and [authentication](./docs/AUTHENTICATION.md).
84
+ The account's encrypted cookie jar is the store of record. Chrome's cookies
85
+ sync both ways with it, so a sign-in survives restarts and a sign-out anywhere
86
+ applies everywhere. Cookies for Amalgm, Supabase, and loopback hosts never
87
+ enter it. Named auth bundles are explicit and separate from this sync. See
88
+ [cookies](./docs/COOKIES.md) and [authentication](./docs/AUTHENTICATION.md).
94
89
 
95
90
  ## Recording
96
91
 
97
- ```sh
98
- amalgm-browser recordings start --session research --fps 15 --duration-ms 5000
92
+ ```ts
93
+ await browser.recordings.start({ sessionId: session.id, fps: 15 });
94
+ const recording = await browser.recordings.stop(session.id);
99
95
  ```
100
96
 
101
- Recordings contain the verified page only and are encoded as WebM. Results
97
+ Recordings contain the session's page only and are encoded as WebM. Results
102
98
  report `wallSeconds` and `videoSeconds` separately. A host-provided artifact
103
99
  destination writes to `<destination>/.amalgm/recordings`; otherwise Browser
104
- uses its local fallback. See [recording](./docs/RECORDING.md).
100
+ uses its state root. See [recording](./docs/RECORDING.md).
105
101
 
106
- ## Desktop and Toolbox integration
102
+ ## Host integration
107
103
 
108
- - [Electron integration](./docs/ELECTRON_INTEGRATION.md) covers native
109
- `WebContentsView` surfaces, identity, shell policy, cookies, and ad blocking.
104
+ - [Shell integration](./docs/SHELL_INTEGRATION.md) covers creating the one
105
+ service, mapping chats to sessions, the live view, and shutdown.
106
+ - [Electron integration](./docs/ELECTRON_INTEGRATION.md) covers the desktop
107
+ app's native browser tabs, policy, and ad blocking.
110
108
  - [Toolbox integration](./docs/TOOLBOX_INTEGRATION.md) covers the single
111
109
  `browser` tool, capability grants, and legacy aliases.
112
- - [Shell integration](./docs/SHELL_INTEGRATION.md) covers the one-service
113
- composition boundary and the historical Engine cutover rule.
114
110
 
115
111
  ## Verify
116
112
 
117
113
  ```sh
118
114
  npm run verify
119
- npm run test:real
120
- npm run test:electron # macOS real-Electron harness
115
+ npm run test:real # real Chrome and a real site
121
116
  ```
122
117
 
123
118
  Verification covers strict TypeScript, the 220-line source limit, runtime and
124
119
  adapter contracts, migration fixtures, package installation, and tarball
125
- hygiene. The opt-in suites use real Chromium and real Electron.
120
+ hygiene. The opt-in suite drives real Chrome through agent-browser.
126
121
 
127
122
  The complete documentation index is [docs/README.md](./docs/README.md).
128
123
 
package/SECURITY.md CHANGED
@@ -6,11 +6,11 @@ recordings.
6
6
 
7
7
  ## Isolation
8
8
 
9
- Browser separates application authentication, Electron
10
- `persist:amalgm-browser`, each headless profile, the logical cookie jar, and
11
- explicit auth bundles. It never queries Electron `defaultSession`. Drivers
12
- cannot inspect one another's physical stores; portability uses only the
13
- encrypted Browser adapter contract.
9
+ Browser separates application authentication, the runtime's one Chrome, the
10
+ Electron `persist:amalgm-browser` partition, the signed-in account's cookie
11
+ jar, and explicit auth bundles. It never queries Electron `defaultSession`.
12
+ Chrome and Electron never read each other's physical stores; cookies move
13
+ between them only through the encrypted account jar.
14
14
 
15
15
  ## Secrets
16
16
 
@@ -38,9 +38,11 @@ body parsing where feasible, defaults to loopback, and refuses remote binding
38
38
  without explicit authorization. Put TLS and network access control in front of
39
39
  any remote deployment. Never expose `/internal/v1/*` to untrusted clients.
40
40
 
41
- Electron bridge advertisements accept only loopback CDP URLs and are private,
42
- atomic, PID-owned files. Visible actions verify the exact stamped surface and
43
- fail before input or capture on ambiguity.
41
+ Chrome's debugging port listens on loopback only and is reached through
42
+ Browser's relay. A session's live view is a WebSocket on the REST server under
43
+ the same bearer token; an unauthorized viewer is closed with code 4401. A
44
+ capture that cannot identify the session's own page fails before input or
45
+ capture.
44
46
 
45
47
  ## User data
46
48
 
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import { createBrowser } from '../src/index.js';
3
- import { createBrowserMcpServer } from '../src/mcp.js';
4
- await createBrowserMcpServer(createBrowser()).start();
2
+ import { runBrowserCli } from '../src/cli.js';
3
+ process.exitCode = await runBrowserCli(['mcp']);
5
4
  //# sourceMappingURL=amalgm-browser-mcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"amalgm-browser-mcp.js","sourceRoot":"","sources":["../../bin/amalgm-browser-mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,sBAAsB,CAAC,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"amalgm-browser-mcp.js","sourceRoot":"","sources":["../../bin/amalgm-browser-mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,CAAC,QAAQ,GAAG,MAAM,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -1,20 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { createBrowser } from '../src/index.js';
3
- import { createBrowserHttpServer } from '../src/http.js';
4
- const token = process.env.AMALGM_BROWSER_TOKEN;
5
- if (!token)
6
- throw new Error('AMALGM_BROWSER_TOKEN is required.');
7
- const host = process.env.AMALGM_BROWSER_HOST || '127.0.0.1';
8
- const port = Number(process.env.AMALGM_BROWSER_PORT || 0);
9
- if (!['127.0.0.1', '::1', 'localhost'].includes(host) && process.env.AMALGM_BROWSER_ALLOW_REMOTE !== '1') {
10
- throw new Error('Non-loopback bind requires AMALGM_BROWSER_ALLOW_REMOTE=1.');
11
- }
12
- const server = createBrowserHttpServer({
13
- browser: createBrowser(),
14
- token,
15
- allowRemote: process.env.AMALGM_BROWSER_ALLOW_REMOTE === '1',
16
- ...(process.env.AMALGM_BROWSER_ADAPTER_TOKEN ? { adapterToken: process.env.AMALGM_BROWSER_ADAPTER_TOKEN } : {}),
17
- });
18
- const address = await server.listen(port, host);
19
- process.stderr.write(`amalgm-browser-rest listening on http://${address.address}:${address.port}\n`);
2
+ import { runBrowserCli } from '../src/cli.js';
3
+ // `amalgm-browser serve`, configured from the environment.
4
+ const env = process.env;
5
+ process.exitCode = await runBrowserCli(['serve',
6
+ ...(env.AMALGM_BROWSER_HOST ? ['--host', env.AMALGM_BROWSER_HOST] : []),
7
+ ...(env.AMALGM_BROWSER_PORT ? ['--port', env.AMALGM_BROWSER_PORT] : []),
8
+ ...(env.AMALGM_BROWSER_ALLOW_REMOTE === '1' ? ['--allow-remote'] : []),
9
+ ]);
20
10
  //# sourceMappingURL=amalgm-browser-rest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"amalgm-browser-rest.js","sourceRoot":"","sources":["../../bin/amalgm-browser-rest.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAC/C,IAAI,CAAC,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACjE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,WAAW,CAAC;AAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAC;AAC1D,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,EAAE,CAAC;IACzG,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;AAC/E,CAAC;AACD,MAAM,MAAM,GAAG,uBAAuB,CAAC;IACrC,OAAO,EAAE,aAAa,EAAE;IACxB,KAAK;IACL,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG;IAC5D,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAChH,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"amalgm-browser-rest.js","sourceRoot":"","sources":["../../bin/amalgm-browser-rest.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,2DAA2D;AAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;AACxB,OAAO,CAAC,QAAQ,GAAG,MAAM,aAAa,CAAC,CAAC,OAAO;IAC7C,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,GAAG,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;CACvE,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BrowserRegistry } from './ports.js';
2
+ import type { BrowserProfile } from './types.js';
3
+ export interface BrowserAccount {
4
+ id: string;
5
+ name: string;
6
+ }
7
+ export declare const LOCAL_ACCOUNT: BrowserAccount;
8
+ export declare function enrollAccount(registry: BrowserRegistry, account: BrowserAccount, now: string): BrowserProfile;
@@ -0,0 +1,42 @@
1
+ import { safeId } from './ids.js';
2
+ import { BrowserError } from './errors.js';
3
+ // The account a runtime browses as until it is told who is signed in.
4
+ export const LOCAL_ACCOUNT = { id: 'local', name: 'Local' };
5
+ // Browsing identity is the amalgm account alone: the registry keeps exactly
6
+ // one durable profile, the account's, and every session, login and auth
7
+ // bundle belongs to it.
8
+ export function enrollAccount(registry, account, now) {
9
+ return registry.transaction(() => {
10
+ const owner = registry.getMeta('account-id');
11
+ if (owner !== undefined && owner !== account.id) {
12
+ throw new BrowserError('AUTHORIZATION_DENIED', 'This Browser state belongs to another Amalgm account.');
13
+ }
14
+ const id = safeId(account.id);
15
+ const state = registry.snapshot();
16
+ for (const profile of state.profiles)
17
+ if (profile.id !== id)
18
+ registry.deleteProfile(profile.id);
19
+ for (const session of state.sessions)
20
+ if (session.profileId !== id)
21
+ registry.putSession({ ...session, profileId: id });
22
+ for (const bundle of state.authBundles)
23
+ if (bundle.profileId !== id)
24
+ registry.putAuthBundle({ ...bundle, profileId: id });
25
+ for (const login of state.loginSessions)
26
+ if (login.profileId !== id)
27
+ registry.putLoginSession({ ...login, profileId: id });
28
+ const existing = state.profiles.find((profile) => profile.id === id);
29
+ const profile = {
30
+ id,
31
+ name: account.name.trim() || id,
32
+ kind: 'durable',
33
+ createdAt: existing?.createdAt || now,
34
+ updatedAt: now,
35
+ lastUsedAt: now,
36
+ };
37
+ registry.putProfile(profile);
38
+ registry.setMeta('account-id', account.id);
39
+ return profile;
40
+ });
41
+ }
42
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAmB,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAE5E,4EAA4E;AAC5E,wEAAwE;AACxE,wBAAwB;AACxB,MAAM,UAAU,aAAa,CAAC,QAAyB,EAAE,OAAuB,EAAE,GAAW;IAC3F,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,IAAI,YAAY,CAAC,sBAAsB,EAAE,uDAAuD,CAAC,CAAC;QAC1G,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE;gBAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChG,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE;gBAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACvH,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,WAAW;YAAE,IAAI,MAAM,CAAC,SAAS,KAAK,EAAE;gBAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1H,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,aAAa;YAAE,IAAI,KAAK,CAAC,SAAS,KAAK,EAAE;gBAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3H,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,MAAM,OAAO,GAAmB;YAC9B,EAAE;YACF,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAC/B,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,GAAG;SAChB,CAAC;QACF,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,4 @@
1
- import type { BrowserAction, BrowserActionResult, BrowserCapability } from './types.js';
1
+ import type { BrowserAction, BrowserActionResult } from './types.js';
2
2
  export declare function validateAction(action: BrowserAction): void;
3
- export declare function assertActionCapability(action: BrowserAction, capabilities: readonly BrowserCapability[]): void;
4
3
  export declare function safeOrigin(value: string): string;
5
4
  export declare function boundResult(result: BrowserActionResult): BrowserActionResult;