@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
@@ -0,0 +1,273 @@
1
+ export type BrowserBackendKind = 'electron' | 'headless';
2
+ export type BrowserCapability = 'core' | 'computer-use' | 'recording' | 'auth' | 'full-page-capture' | 'ad-blocking' | 'visible-surface' | 'live-login';
3
+ export type BrowserSessionStatus = 'creating' | 'ready' | 'closing' | 'closed' | 'failed';
4
+ export type BrowserProfileKind = 'durable' | 'ephemeral';
5
+ export interface BrowserRuntimeContext {
6
+ ownerId?: string;
7
+ callerId?: string;
8
+ clientKind?: 'desktop' | 'web' | 'cli' | 'mcp' | 'rest' | 'automation' | 'agent';
9
+ projectRef?: string;
10
+ cwdRef?: string;
11
+ artifactDestination?: string;
12
+ authorization?: unknown;
13
+ signal?: AbortSignal;
14
+ }
15
+ export interface BrowserProfile {
16
+ id: string;
17
+ name: string;
18
+ kind: BrowserProfileKind;
19
+ createdAt: string;
20
+ updatedAt: string;
21
+ lastUsedAt: string;
22
+ }
23
+ export interface BrowserProfileStatus {
24
+ profile: BrowserProfile;
25
+ live: boolean;
26
+ referenced: boolean;
27
+ locked: boolean;
28
+ }
29
+ export interface BrowserSession {
30
+ id: string;
31
+ ownerId?: string;
32
+ profileId: string;
33
+ backend: BrowserBackendKind;
34
+ status: BrowserSessionStatus;
35
+ capabilities: BrowserCapability[];
36
+ createdAt: string;
37
+ updatedAt: string;
38
+ lastActiveAt: string;
39
+ url?: string;
40
+ title?: string;
41
+ error?: string;
42
+ }
43
+ export interface BrowserCapture {
44
+ mimeType: 'image/png' | 'image/jpeg';
45
+ base64: string;
46
+ bytes: number;
47
+ width?: number;
48
+ height?: number;
49
+ coordinateSpace: 'css-pixel';
50
+ }
51
+ export interface BrowserArtifact {
52
+ id: string;
53
+ kind: 'capture' | 'recording' | 'download' | 'trace';
54
+ path: string;
55
+ mimeType: string;
56
+ bytes: number;
57
+ createdAt: string;
58
+ }
59
+ export interface BrowserRecording {
60
+ id: string;
61
+ sessionId: string;
62
+ ownerPid?: number;
63
+ status: 'active' | 'stopped' | 'failed';
64
+ fps: number;
65
+ createdAt: string;
66
+ stoppedAt?: string;
67
+ wallSeconds?: number;
68
+ videoSeconds?: number;
69
+ frames?: number;
70
+ framesReceived?: number;
71
+ skippedTicks?: number;
72
+ artifact?: BrowserArtifact;
73
+ warning?: string;
74
+ }
75
+ export type CuaOperation = {
76
+ kind: 'screenshot';
77
+ fullPage?: boolean;
78
+ } | {
79
+ kind: 'click' | 'double_click' | 'move';
80
+ x: number;
81
+ y: number;
82
+ button?: 'left' | 'middle' | 'right';
83
+ } | {
84
+ kind: 'scroll';
85
+ scrollX?: number;
86
+ scrollY?: number;
87
+ } | {
88
+ kind: 'type';
89
+ text: string;
90
+ } | {
91
+ kind: 'keypress';
92
+ keys: string[];
93
+ } | {
94
+ kind: 'drag';
95
+ path: Array<{
96
+ x: number;
97
+ y: number;
98
+ }>;
99
+ };
100
+ export type BrowserAction = {
101
+ type: 'open';
102
+ url: string;
103
+ } | {
104
+ type: 'snapshot';
105
+ } | {
106
+ type: 'screenshot';
107
+ fullPage?: boolean;
108
+ } | {
109
+ type: 'click';
110
+ target: string;
111
+ } | {
112
+ type: 'fill';
113
+ target: string;
114
+ text: string;
115
+ submit?: boolean;
116
+ } | {
117
+ type: 'press';
118
+ key: string;
119
+ } | {
120
+ type: 'select';
121
+ target: string;
122
+ value: string;
123
+ } | {
124
+ type: 'eval';
125
+ script: string;
126
+ } | {
127
+ type: 'wait';
128
+ selector?: string;
129
+ url?: string;
130
+ ms?: number;
131
+ timeoutMs?: number;
132
+ } | {
133
+ type: 'cli';
134
+ args: string[];
135
+ timeoutMs?: number;
136
+ } | {
137
+ type: 'dialog';
138
+ action: 'accept' | 'dismiss';
139
+ text?: string;
140
+ } | {
141
+ type: 'tab';
142
+ action: 'list' | 'switch' | 'new' | 'close';
143
+ id?: string;
144
+ } | {
145
+ type: 'console';
146
+ clear?: boolean;
147
+ } | {
148
+ type: 'cua';
149
+ operation: CuaOperation;
150
+ } | {
151
+ type: 'close';
152
+ };
153
+ export type BrowserActionName = BrowserAction['type'];
154
+ export type BrowserActionResult = {
155
+ type: 'page';
156
+ url: string;
157
+ title: string;
158
+ text?: string;
159
+ } | {
160
+ type: 'capture';
161
+ capture: BrowserCapture;
162
+ } | {
163
+ type: 'value';
164
+ value: unknown;
165
+ } | {
166
+ type: 'tabs';
167
+ tabs: unknown[];
168
+ } | {
169
+ type: 'console';
170
+ logs: unknown;
171
+ errors: unknown;
172
+ } | {
173
+ type: 'ok';
174
+ message?: string;
175
+ evidence?: BrowserActionEvidence;
176
+ };
177
+ export interface BrowserActionEvidence {
178
+ targetEnabled?: boolean;
179
+ value?: {
180
+ before?: string;
181
+ after: string;
182
+ changed?: boolean;
183
+ };
184
+ keys?: {
185
+ dispatched: number;
186
+ flood?: boolean;
187
+ };
188
+ page?: {
189
+ url?: string;
190
+ title?: string;
191
+ urlChanged?: boolean;
192
+ dialog?: string;
193
+ };
194
+ warnings: string[];
195
+ }
196
+ export type BrowserEvent = {
197
+ version: 1;
198
+ id: string;
199
+ at: string;
200
+ sessionId?: string;
201
+ profileId?: string;
202
+ } & ({
203
+ type: 'session.created' | 'session.ready' | 'session.closed';
204
+ backend: BrowserBackendKind;
205
+ } | {
206
+ type: 'session.failed';
207
+ error: string;
208
+ } | {
209
+ type: 'page.navigated';
210
+ origin: string;
211
+ } | {
212
+ type: 'page.failed';
213
+ origin: string;
214
+ errorCode: number;
215
+ } | {
216
+ type: 'profile.updated';
217
+ } | {
218
+ type: 'recording.started' | 'recording.stopped';
219
+ recordingId: string;
220
+ } | {
221
+ type: 'login.updated';
222
+ loginSessionId: string;
223
+ status: BrowserLoginSession['status'];
224
+ } | {
225
+ type: 'cookie-jar.changed';
226
+ versionToken: string;
227
+ } | {
228
+ type: 'surface.requested' | 'surface.bound' | 'surface.updated' | 'surface.lost';
229
+ surfaceId?: string;
230
+ } | {
231
+ type: 'download.updated';
232
+ downloadId: string;
233
+ state: string;
234
+ receivedBytes: number;
235
+ totalBytes: number;
236
+ } | {
237
+ type: 'permission.requested';
238
+ permission: string;
239
+ origin: string;
240
+ });
241
+ export type BrowserEventInput = BrowserEvent extends infer Event ? Event extends BrowserEvent ? Omit<Event, 'version' | 'id' | 'at'> : never : never;
242
+ export interface BrowserAuthBundle {
243
+ id: string;
244
+ name: string;
245
+ profileId: string;
246
+ domains: string[];
247
+ storageKinds: Array<'cookies' | 'localStorage' | 'sessionStorage'>;
248
+ createdAt: string;
249
+ updatedAt: string;
250
+ }
251
+ export interface BrowserLoginSession {
252
+ id: string;
253
+ profileId: string;
254
+ targetUrl: string;
255
+ domains: string[];
256
+ status: 'pending' | 'active' | 'completed' | 'cancelled' | 'expired';
257
+ transport: 'electron-surface' | 'novnc' | 'external';
258
+ liveUrl?: string;
259
+ setupStatus?: 'ready' | 'missing_novnc_url' | 'manual';
260
+ expiresAt: string;
261
+ createdAt: string;
262
+ updatedAt: string;
263
+ authBundleId?: string;
264
+ }
265
+ export interface BrowserHostAdvertisement {
266
+ protocol: number;
267
+ backend: 'electron';
268
+ pid: number;
269
+ cdpUrl: string;
270
+ targetTypes: Array<'page' | 'webview'>;
271
+ createdAt?: string;
272
+ file?: string;
273
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ # Action surface
2
+
3
+ The descriptor array in `src/adapters/actions.ts` is the source of truth for
4
+ all public actions. SDK adapters must project every descriptor exactly once.
5
+
6
+ Core actions are `open`, `snapshot`, `screenshot`, `click`, `fill`, `press`,
7
+ `select`, `eval`, `wait`, `cli`, `dialog`, `tab`, `console`, and `close`.
8
+ Browser-scoped computer use is `cua`. Recording adds `record_start`,
9
+ `record_stop`, and `record_list`. Authentication adds `auth_list`,
10
+ `auth_link_create`, `auth_save`, and `auth_load`.
11
+
12
+ CLI resource commands are ergonomic spellings over these actions. MCP uses
13
+ `browser_<action>`. Toolbox uses `browser.<action>` with
14
+ `toolbox__browser_<action>` as its transport name. REST uses resource paths
15
+ and posts canonical action inputs. No adapter assigns different semantics.
16
+
17
+ Targets use one stable grammar: accessibility snapshot references such as
18
+ `@e12`, CSS selectors, or `text=Visible label`. Prefer snapshot references;
19
+ use browser-scoped CUA for canvas, WebGL, image-only, or hostile custom UI.
20
+
21
+ `cua.operation.kind` is one of `screenshot`, `click`, `double_click`, `move`,
22
+ `scroll`, `type`, `keypress`, or `drag`. Coordinates are CSS pixels and map
23
+ 1:1 to returned viewport screenshots.
24
+
25
+ Backends advertise capability groups. Core semantics are never approximated
26
+ when a backend lacks `computer-use`, `recording`, `auth`, full-page capture,
27
+ visible surfaces, live login, or native ad blocking.
@@ -0,0 +1,71 @@
1
+ # Architecture
2
+
3
+ `BrowserProductService` is the product boundary. It composes session and
4
+ profile policy, encrypted cookie coordination, auth bundles, login handoffs,
5
+ and recording lifecycles. Drivers operate physical browsers. Transport
6
+ adapters translate their inputs into this service and do not own browser
7
+ policy.
8
+
9
+ ## Derivation
10
+
11
+ The purpose requires one meaning for every browser action across desktop and
12
+ server environments. Therefore:
13
+
14
+ 1. A typed action enters `BrowserService`.
15
+ 2. The service authorizes it, checks session state and capabilities, and
16
+ acquires the session lease.
17
+ 3. The session's immutable backend selects exactly one driver.
18
+ 4. The driver acts on the session's exact page or verified visible surface.
19
+ 5. The service persists the transition and emits a sanitized event.
20
+
21
+ CLI, MCP, REST, and Toolbox all dispatch through the same canonical action
22
+ descriptor array. The generated reachability test calls all 22 actions through
23
+ all five surfaces.
24
+
25
+ ## Ownership map
26
+
27
+ - `service.ts`, `product-service.ts` — mutation boundary and product services
28
+ - `sessions/`, `profiles/` — leases and lifecycle policy
29
+ - `drivers/headless/` — `agent-browser`, CDP, profiles, and physical cookies
30
+ - `drivers/electron/` — verified visible driver and host advertisement
31
+ - `drivers/electron/native/` — `WebContentsView` shell, surfaces, policy,
32
+ downloads, permissions, menus, and native ad blocking
33
+ - `drivers/cdp/` — exact-target capture, input, and cancellable protocol client
34
+ - `cookies/` — encrypted logical authority and adapter reconciliation
35
+ - `auth/` — explicit bundles and TTL-bound human login
36
+ - `recording/` — page screencast, latest-frame sampler, and bounded encoder
37
+ - `persistence/`, `migration/` — SQLite state and idempotent legacy import
38
+ - `adapters/` — CLI, MCP, REST/SSE, and Toolbox projections
39
+
40
+ ## Runtime selection
41
+
42
+ Selection happens once before open. A forced backend or explicit CDP endpoint
43
+ wins. A fresh, compatible, loopback Electron host advertisement selects
44
+ Electron only for a desktop owner. Everything else selects headless. A visible
45
+ session never falls back to headless after identity loss.
46
+
47
+ ## Persistence and concurrency
48
+
49
+ SQLite stores each metadata entity independently, uses WAL and a busy timeout,
50
+ and holds cross-process session leases. Encrypted cookie/auth payloads use
51
+ atomic private files because their security and integrity envelope is a better
52
+ fit than ordinary database rows. Registry and migration writes are
53
+ transactional. A restarted service reopens a persisted ready session through
54
+ its assigned driver before acting.
55
+
56
+ ## Visible surfaces
57
+
58
+ The Electron host creates native `WebContentsView` pages in the isolated
59
+ Browser partition. Protocol-6 identity combines a session stamp, surface ID,
60
+ marker URL, and declared target type. The driver verifies that identity before
61
+ every action. It may reattach once only when the original surface is genuinely
62
+ gone; ambiguity or mismatch fails before page input.
63
+
64
+ ## Data movement
65
+
66
+ Physical Chromium stores remain isolated. Cookie adapters exchange normalized
67
+ records with the encrypted logical jar, never with each other. Deletion is a
68
+ tombstone and timestamp/source ordering makes merges deterministic. Named auth
69
+ bundles are explicit filtered snapshots and can additionally contain supported
70
+ origin storage. Events and ordinary resource projections contain metadata
71
+ only.
@@ -0,0 +1,56 @@
1
+ # Authentication and login handoff
2
+
3
+ Browser separates working profiles, automatic cookies, named auth bundles,
4
+ and human login sessions. None is an alias for another.
5
+
6
+ ## Named auth bundles
7
+
8
+ `browser.auth.save` asks the assigned driver for state, filters it to explicit
9
+ domains, encrypts the payload, and stores only metadata in SQLite. Supported
10
+ payloads can include cookies, localStorage, and sessionStorage. List/get return
11
+ ID, name, profile, domains, storage kinds, and timestamps—never values.
12
+
13
+ Loading is explicit and requires a capable session. Deleting removes both the
14
+ encrypted payload and metadata. A bundle's profile reference protects that
15
+ profile from pruning.
16
+
17
+ Portable export/import re-encrypts a bundle with an explicitly authorized
18
+ 32-byte portable key and verifies metadata integrity on import. The portable
19
+ resource is still ciphertext and should be handled as a credential.
20
+
21
+ ## Human login
22
+
23
+ `browser.login.create` returns a session plus one random token and a
24
+ token-bearing handoff URL. The credential is delivered only in that creation
25
+ result. Browser stores a SHA-256 hash and compares verification values in
26
+ constant time. Ordinary list/get never returns the token.
27
+
28
+ TTL defaults to 15 minutes and is clamped from one minute to one hour. A handoff
29
+ uses a durable profile while pending or active:
30
+
31
+ 1. Create the handoff for a target URL and filtered domains.
32
+ 2. Activate it after validating the token; Browser opens the owned profile.
33
+ 3. Forward browser-scoped CUA screenshot/input while the human signs in.
34
+ 4. Complete to save an encrypted named bundle and close the live session, or
35
+ cancel to close it without saving.
36
+
37
+ Expired active sessions are closed. Completed, cancelled, and expired tokens
38
+ cannot be reused.
39
+
40
+ ## Transports
41
+
42
+ - `electron-surface` presents the verified page in the desktop app.
43
+ - `novnc` uses `AMALGM_BROWSER_NOVNC_PUBLIC_URL` or
44
+ `AMALGM_BROWSER_NOVNC_URL` when configured.
45
+ - `external` provides a host-integrated handoff.
46
+
47
+ Transport selection is presentation; the auth lifecycle and profile ownership
48
+ remain Browser rules.
49
+
50
+ ## Security boundary
51
+
52
+ Device-local AES-GCM encryption protects against accidental plaintext
53
+ exposure, not an attacker who can read both encrypted files and the local key.
54
+ Treat token-bearing handoff URLs, portable resources, captures, and origin
55
+ storage as credentials. They must not enter logs, events, chat history, or
56
+ ordinary resource projections.
package/docs/AXIOMS.md ADDED
@@ -0,0 +1,20 @@
1
+ # Axiom map
2
+
3
+ [PURPOSE.md](../PURPOSE.md) is the authoritative list of primitives and 18
4
+ product axioms. This document maps them to observable boundaries.
5
+
6
+ | Axioms | Consequence | Evidence |
7
+ | --- | --- | --- |
8
+ | 1–3 | Browser owns state; sessions bind one profile and immutable backend | service and restart contracts |
9
+ | 4–5 | Electron identity is verified; ordinary fallback is headless | identity and advertisement tests |
10
+ | 6–8 | Capabilities are honest; work is cancellable and bounded | driver, CDP, process, and parity tests |
11
+ | 9–13 | Cookie stores are isolated and secrets remain encrypted | cookie, auth, partition, and migration tests |
12
+ | 14 | Capture and recording address the actual page | DPR, target, sampler, and real-runtime tests |
13
+ | 15 | Context enters through ports; events are sanitized | artifact and SSE contracts |
14
+ | 16 | Existing state is imported safely | transactional legacy fixture test |
15
+ | 17–18 | One TypeScript implementation works without Engine/Electron | package install and adapter parity tests |
16
+
17
+ When behavior fails, classify it against this map. If code drifted, restore the
18
+ axiom everywhere it applies. If the axiom is incomplete, update
19
+ `PURPOSE.md`, implementation, documentation, and invariant tests together. A
20
+ transport-specific exception is not an acceptable fix for a domain rule.
package/docs/CLI.md ADDED
@@ -0,0 +1,61 @@
1
+ # CLI
2
+
3
+ `amalgm-browser` prints stable JSON to stdout and sanitized diagnostics to
4
+ stderr. It never constructs a shell command.
5
+
6
+ ## Actions
7
+
8
+ ```text
9
+ open <url> snapshot
10
+ screenshot [--full-page] click <target>
11
+ fill <target> <text> press <key>
12
+ select <target> <value> eval <script>
13
+ wait [--selector|--url|--ms] dialog|tab|console|cua --input <json>
14
+ close action <name> --input <json>
15
+ ```
16
+
17
+ Use one `--session` value across related invocations. The generic `action`
18
+ form reaches every canonical action, including recording and auth actions.
19
+
20
+ ## Resources
21
+
22
+ ```text
23
+ sessions list|get|close|cancel|prune [id]
24
+ profiles list|get|create|update|delete|prune [id]
25
+ auth list|link|save|load|delete [id]
26
+ recordings start|stop|cancel|list|get [id]
27
+ capabilities
28
+ doctor
29
+ serve
30
+ mcp
31
+ ```
32
+
33
+ Common options are `--session`, `--profile`, `--root`, `--cwd`, `--timeout`,
34
+ `--headless`, `--headed`, and `--cdp`. `--cwd` supplies opaque cwd context and
35
+ a local artifact destination; it does not create a Browser workspace model.
36
+
37
+ `--headed` is an explicit debug choice. Ordinary standalone and background use
38
+ stays headless. `--cdp` attaches to an operator-provided endpoint.
39
+
40
+ ## REST and MCP modes
41
+
42
+ ```sh
43
+ amalgm-browser mcp
44
+ amalgm-browser serve --token "$AMALGM_BROWSER_TOKEN" --port 8787
45
+ ```
46
+
47
+ `serve` binds `127.0.0.1` unless `--host` is supplied. A non-loopback host also
48
+ requires `--allow-remote`; bearer authentication remains mandatory.
49
+
50
+ ## Exit codes
51
+
52
+ - `0` success
53
+ - `2` invalid input
54
+ - `3` authorization denied
55
+ - `4` resource not found
56
+ - `5` timeout or cancellation
57
+ - `1` other typed failure
58
+
59
+ Use `--timeout <ms>` to abort a blocking operation. Recording start without a
60
+ duration remains active until SIGINT or SIGTERM, then stops and flushes within
61
+ the encoder deadline.
@@ -0,0 +1,45 @@
1
+ # Compatibility
2
+
3
+ ## Runtime and package
4
+
5
+ - Node.js: 20 or newer
6
+ - modules: ESM import only
7
+ - Electron: optional peer, version 33 or newer
8
+ - Electron surface protocols: writes protocol 6; reads protocols 5 and 6
9
+ - Browser partition: exactly `persist:amalgm-browser`
10
+
11
+ Core and headless imports do not load Electron. The Electron native code is
12
+ available only from `@amalgm/browser/electron`.
13
+
14
+ ## Action identities
15
+
16
+ Canonical SDK actions are the 22 names in [ACTIONS.md](./ACTIONS.md). MCP uses
17
+ `browser_<action>`. Toolbox uses `browser.<action>` and
18
+ `toolbox__browser_<action>`.
19
+
20
+ Historical aggregate Browser grants, older prefixed IDs, and individual
21
+ `cua_*` names are normalized in the Toolbox compatibility adapter. They are
22
+ not core action aliases and never create doubled Browser prefixes.
23
+
24
+ ## Engine routes and data
25
+
26
+ Engine can keep its previous HTTP/IPC route shapes during rolling integration
27
+ by delegating into this SDK. Raw cookie bootstrap and merge must use the
28
+ restricted adapter transport, not public OpenAPI.
29
+
30
+ Legacy Engine profiles, encrypted auth/cookie-source bundles, cookie
31
+ tombstones, and login sessions are supported by the versioned importer. Paths
32
+ and the Electron partition are reused to avoid forced sign-in.
33
+
34
+ ## Backend differences
35
+
36
+ Capabilities make differences explicit. Electron advertises visible-surface,
37
+ live-login, and ad-blocking behavior. Headless advertises full-page capture and
38
+ does not claim native Electron ad blocking. Unsupported operations return
39
+ `CAPABILITY_UNSUPPORTED`; adapters must not synthesize a substitute.
40
+
41
+ ## Agent-browser envelopes
42
+
43
+ The headless adapter accepts supported historical JSON result envelopes and
44
+ normalizes them at its boundary. The SDK result union is stable and does not
45
+ expose agent-browser's transport format.
@@ -0,0 +1,61 @@
1
+ # Cookies
2
+
3
+ Browser has three separate security domains:
4
+
5
+ 1. the Amalgm application renderer and account session;
6
+ 2. the visible Electron `persist:amalgm-browser` partition;
7
+ 3. each headless Chromium profile store.
8
+
9
+ The application renderer is outside Browser. Electron and headless stores are
10
+ physically isolated and never read one another.
11
+
12
+ ## Logical jar
13
+
14
+ Cross-backend portability occurs through one encrypted Browser cookie jar.
15
+ Each trusted `BrowserCookieAdapter` reports a normalized snapshot or mutation;
16
+ the coordinator merges records and applies changes back to other adapters.
17
+
18
+ The record identity includes domain, path, name, and partition key. Merges use
19
+ timestamp then source ID for deterministic last-writer-wins ordering. Deletes
20
+ are durable tombstones, so a stale physical snapshot cannot resurrect a logged
21
+ out cookie. One adapter update cannot replace unrelated records.
22
+
23
+ Adapter baselines suppress feedback generated while applying jar changes.
24
+ Failed application is retried. Partitioned identity is preserved; an adapter
25
+ that cannot represent partitioned cookies skips them rather than flattening
26
+ them.
27
+
28
+ ## Filtering
29
+
30
+ The central boundary rejects application/authentication hosts, Amalgm API
31
+ hosts, Supabase hosts, loopback, and configured exclusions. Filtering happens
32
+ before secret persistence or propagation. Automatic synchronization moves
33
+ cookies only; it never copies localStorage or sessionStorage.
34
+
35
+ ## Encryption and failure behavior
36
+
37
+ The jar uses AES-256-GCM with an integrity tag, atomic replacement, private
38
+ directories, and mode `0600`. The local key is stored separately but on the
39
+ same device. This prevents accidental plaintext exposure; it does not defend
40
+ against an attacker able to read both ciphertext and key.
41
+
42
+ A missing or corrupt jar reports value-free health metadata and ordinary
43
+ browsing continues with backend-local state. An incorrect key never causes
44
+ cookie values to enter an error.
45
+
46
+ ## Public versus trusted APIs
47
+
48
+ Ordinary SDK, CLI, MCP, REST, events, and Toolbox projections return only
49
+ sanitized metadata such as domains, names, expiry, partition presence, count,
50
+ and version. Raw values are available only to trusted in-process adapters or
51
+ the separately credentialed loopback internal REST transport.
52
+
53
+ Named auth bundles are a separate explicit snapshot mechanism. They may carry
54
+ filtered origin storage and do not become the automatic jar.
55
+
56
+ ## Reconciliation lifecycle
57
+
58
+ Register physical adapters with `browser.cookieAdapters`, then initialize the
59
+ coordinator. The first available physical store may seed an absent logical jar
60
+ exactly once. Thereafter the jar is authoritative. Subscribe to sanitized
61
+ `cookie-jar.changed` events or version tokens rather than secret data.