@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.
- package/CHANGELOG.md +16 -0
- package/LICENSE +5 -0
- package/PURPOSE.md +117 -0
- package/README.md +120 -0
- package/SECURITY.md +49 -0
- package/dist/bin/amalgm-browser-mcp.d.ts +2 -0
- package/dist/bin/amalgm-browser-mcp.js +5 -0
- package/dist/bin/amalgm-browser-mcp.js.map +1 -0
- package/dist/bin/amalgm-browser-rest.d.ts +2 -0
- package/dist/bin/amalgm-browser-rest.js +20 -0
- package/dist/bin/amalgm-browser-rest.js.map +1 -0
- package/dist/bin/amalgm-browser.d.ts +2 -0
- package/dist/bin/amalgm-browser.js +4 -0
- package/dist/bin/amalgm-browser.js.map +1 -0
- package/dist/src/action.d.ts +5 -0
- package/dist/src/action.js +42 -0
- package/dist/src/action.js.map +1 -0
- package/dist/src/adapters/actions.d.ts +10 -0
- package/dist/src/adapters/actions.js +41 -0
- package/dist/src/adapters/actions.js.map +1 -0
- package/dist/src/adapters/cli/actions.d.ts +7 -0
- package/dist/src/adapters/cli/actions.js +63 -0
- package/dist/src/adapters/cli/actions.js.map +1 -0
- package/dist/src/adapters/cli/args.d.ts +8 -0
- package/dist/src/adapters/cli/args.js +41 -0
- package/dist/src/adapters/cli/args.js.map +1 -0
- package/dist/src/adapters/cli/help.d.ts +1 -0
- package/dist/src/adapters/cli/help.js +29 -0
- package/dist/src/adapters/cli/help.js.map +1 -0
- package/dist/src/adapters/cli/resources.d.ts +4 -0
- package/dist/src/adapters/cli/resources.js +116 -0
- package/dist/src/adapters/cli/resources.js.map +1 -0
- package/dist/src/adapters/cli/run.d.ts +7 -0
- package/dist/src/adapters/cli/run.js +108 -0
- package/dist/src/adapters/cli/run.js.map +1 -0
- package/dist/src/adapters/execute.d.ts +4 -0
- package/dist/src/adapters/execute.js +91 -0
- package/dist/src/adapters/execute.js.map +1 -0
- package/dist/src/adapters/http/auth-routes.d.ts +2 -0
- package/dist/src/adapters/http/auth-routes.js +93 -0
- package/dist/src/adapters/http/auth-routes.js.map +1 -0
- package/dist/src/adapters/http/events.d.ts +3 -0
- package/dist/src/adapters/http/events.js +20 -0
- package/dist/src/adapters/http/events.js.map +1 -0
- package/dist/src/adapters/http/internal-routes.d.ts +2 -0
- package/dist/src/adapters/http/internal-routes.js +35 -0
- package/dist/src/adapters/http/internal-routes.js.map +1 -0
- package/dist/src/adapters/http/openapi.d.ts +1 -0
- package/dist/src/adapters/http/openapi.js +78 -0
- package/dist/src/adapters/http/openapi.js.map +1 -0
- package/dist/src/adapters/http/profile-routes.d.ts +2 -0
- package/dist/src/adapters/http/profile-routes.js +42 -0
- package/dist/src/adapters/http/profile-routes.js.map +1 -0
- package/dist/src/adapters/http/recording-routes.d.ts +2 -0
- package/dist/src/adapters/http/recording-routes.js +41 -0
- package/dist/src/adapters/http/recording-routes.js.map +1 -0
- package/dist/src/adapters/http/request.d.ts +4 -0
- package/dist/src/adapters/http/request.js +44 -0
- package/dist/src/adapters/http/request.js.map +1 -0
- package/dist/src/adapters/http/server.d.ts +2 -0
- package/dist/src/adapters/http/server.js +114 -0
- package/dist/src/adapters/http/server.js.map +1 -0
- package/dist/src/adapters/http/session-routes.d.ts +2 -0
- package/dist/src/adapters/http/session-routes.js +54 -0
- package/dist/src/adapters/http/session-routes.js.map +1 -0
- package/dist/src/adapters/http/types.d.ts +29 -0
- package/dist/src/adapters/http/types.js +2 -0
- package/dist/src/adapters/http/types.js.map +1 -0
- package/dist/src/adapters/mcp/server.d.ts +3 -0
- package/dist/src/adapters/mcp/server.js +74 -0
- package/dist/src/adapters/mcp/server.js.map +1 -0
- package/dist/src/adapters/mcp/tools.d.ts +3 -0
- package/dist/src/adapters/mcp/tools.js +45 -0
- package/dist/src/adapters/mcp/tools.js.map +1 -0
- package/dist/src/adapters/mcp/types.d.ts +17 -0
- package/dist/src/adapters/mcp/types.js +2 -0
- package/dist/src/adapters/mcp/types.js.map +1 -0
- package/dist/src/adapters/toolbox/aliases.d.ts +5 -0
- package/dist/src/adapters/toolbox/aliases.js +14 -0
- package/dist/src/adapters/toolbox/aliases.js.map +1 -0
- package/dist/src/adapters/toolbox/executor.d.ts +6 -0
- package/dist/src/adapters/toolbox/executor.js +13 -0
- package/dist/src/adapters/toolbox/executor.js.map +1 -0
- package/dist/src/adapters/toolbox/manifest.d.ts +15 -0
- package/dist/src/adapters/toolbox/manifest.js +24 -0
- package/dist/src/adapters/toolbox/manifest.js.map +1 -0
- package/dist/src/artifacts.d.ts +14 -0
- package/dist/src/artifacts.js +28 -0
- package/dist/src/artifacts.js.map +1 -0
- package/dist/src/auth/filter.d.ts +3 -0
- package/dist/src/auth/filter.js +60 -0
- package/dist/src/auth/filter.js.map +1 -0
- package/dist/src/auth/login.d.ts +41 -0
- package/dist/src/auth/login.js +145 -0
- package/dist/src/auth/login.js.map +1 -0
- package/dist/src/auth/portable.d.ts +18 -0
- package/dist/src/auth/portable.js +48 -0
- package/dist/src/auth/portable.js.map +1 -0
- package/dist/src/auth/service.d.ts +29 -0
- package/dist/src/auth/service.js +104 -0
- package/dist/src/auth/service.js.map +1 -0
- package/dist/src/auth/transport.d.ts +8 -0
- package/dist/src/auth/transport.js +45 -0
- package/dist/src/auth/transport.js.map +1 -0
- package/dist/src/auth/vault.d.ts +10 -0
- package/dist/src/auth/vault.js +27 -0
- package/dist/src/auth/vault.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +3 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/cookies/coordinator.d.ts +17 -0
- package/dist/src/cookies/coordinator.js +93 -0
- package/dist/src/cookies/coordinator.js.map +1 -0
- package/dist/src/cookies/jar.d.ts +21 -0
- package/dist/src/cookies/jar.js +146 -0
- package/dist/src/cookies/jar.js.map +1 -0
- package/dist/src/cookies/policy.d.ts +6 -0
- package/dist/src/cookies/policy.js +58 -0
- package/dist/src/cookies/policy.js.map +1 -0
- package/dist/src/cookies/secret-file.d.ts +10 -0
- package/dist/src/cookies/secret-file.js +80 -0
- package/dist/src/cookies/secret-file.js.map +1 -0
- package/dist/src/cookies/types.d.ts +64 -0
- package/dist/src/cookies/types.js +2 -0
- package/dist/src/cookies/types.js.map +1 -0
- package/dist/src/cookies.d.ts +5 -0
- package/dist/src/cookies.js +5 -0
- package/dist/src/cookies.js.map +1 -0
- package/dist/src/defaults.d.ts +24 -0
- package/dist/src/defaults.js +107 -0
- package/dist/src/defaults.js.map +1 -0
- package/dist/src/drivers/cdp/capture.d.ts +5 -0
- package/dist/src/drivers/cdp/capture.js +39 -0
- package/dist/src/drivers/cdp/capture.js.map +1 -0
- package/dist/src/drivers/cdp/client.d.ts +8 -0
- package/dist/src/drivers/cdp/client.js +88 -0
- package/dist/src/drivers/cdp/client.js.map +1 -0
- package/dist/src/drivers/cdp/input.d.ts +2 -0
- package/dist/src/drivers/cdp/input.js +15 -0
- package/dist/src/drivers/cdp/input.js.map +1 -0
- package/dist/src/drivers/cdp/screencast.d.ts +2 -0
- package/dist/src/drivers/cdp/screencast.js +39 -0
- package/dist/src/drivers/cdp/screencast.js.map +1 -0
- package/dist/src/drivers/cdp/target.d.ts +4 -0
- package/dist/src/drivers/cdp/target.js +34 -0
- package/dist/src/drivers/cdp/target.js.map +1 -0
- package/dist/src/drivers/electron/advertisement.d.ts +12 -0
- package/dist/src/drivers/electron/advertisement.js +57 -0
- package/dist/src/drivers/electron/advertisement.js.map +1 -0
- package/dist/src/drivers/electron/contracts.d.ts +45 -0
- package/dist/src/drivers/electron/contracts.js +10 -0
- package/dist/src/drivers/electron/contracts.js.map +1 -0
- package/dist/src/drivers/electron/cookie-adapter.d.ts +17 -0
- package/dist/src/drivers/electron/cookie-adapter.js +69 -0
- package/dist/src/drivers/electron/cookie-adapter.js.map +1 -0
- package/dist/src/drivers/electron/driver.d.ts +19 -0
- package/dist/src/drivers/electron/driver.js +115 -0
- package/dist/src/drivers/electron/driver.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/cache.d.ts +4 -0
- package/dist/src/drivers/electron/native/adblock/cache.js +54 -0
- package/dist/src/drivers/electron/native/adblock/cache.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/cosmetics.d.ts +11 -0
- package/dist/src/drivers/electron/native/adblock/cosmetics.js +45 -0
- package/dist/src/drivers/electron/native/adblock/cosmetics.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/index.d.ts +44 -0
- package/dist/src/drivers/electron/native/adblock/index.js +153 -0
- package/dist/src/drivers/electron/native/adblock/index.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/policy.d.ts +2 -0
- package/dist/src/drivers/electron/native/adblock/policy.js +12 -0
- package/dist/src/drivers/electron/native/adblock/policy.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/preload.d.ts +1 -0
- package/dist/src/drivers/electron/native/adblock/preload.js +131 -0
- package/dist/src/drivers/electron/native/adblock/preload.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/settings.d.ts +9 -0
- package/dist/src/drivers/electron/native/adblock/settings.js +37 -0
- package/dist/src/drivers/electron/native/adblock/settings.js.map +1 -0
- package/dist/src/drivers/electron/native/config.d.ts +4 -0
- package/dist/src/drivers/electron/native/config.js +9 -0
- package/dist/src/drivers/electron/native/config.js.map +1 -0
- package/dist/src/drivers/electron/native/contracts.d.ts +174 -0
- package/dist/src/drivers/electron/native/contracts.js +20 -0
- package/dist/src/drivers/electron/native/contracts.js.map +1 -0
- package/dist/src/drivers/electron/native/policy.d.ts +7 -0
- package/dist/src/drivers/electron/native/policy.js +43 -0
- package/dist/src/drivers/electron/native/policy.js.map +1 -0
- package/dist/src/drivers/electron/native/session.d.ts +4 -0
- package/dist/src/drivers/electron/native/session.js +11 -0
- package/dist/src/drivers/electron/native/session.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/adblock-ipc.d.ts +10 -0
- package/dist/src/drivers/electron/native/shell/adblock-ipc.js +44 -0
- package/dist/src/drivers/electron/native/shell/adblock-ipc.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/context-menu.d.ts +11 -0
- package/dist/src/drivers/electron/native/shell/context-menu.js +129 -0
- package/dist/src/drivers/electron/native/shell/context-menu.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/downloads.d.ts +11 -0
- package/dist/src/drivers/electron/native/shell/downloads.js +90 -0
- package/dist/src/drivers/electron/native/shell/downloads.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/helpers.d.ts +5 -0
- package/dist/src/drivers/electron/native/shell/helpers.js +53 -0
- package/dist/src/drivers/electron/native/shell/helpers.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/permissions.d.ts +16 -0
- package/dist/src/drivers/electron/native/shell/permissions.js +107 -0
- package/dist/src/drivers/electron/native/shell/permissions.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/sites.d.ts +24 -0
- package/dist/src/drivers/electron/native/shell/sites.js +119 -0
- package/dist/src/drivers/electron/native/shell/sites.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/types.d.ts +13 -0
- package/dist/src/drivers/electron/native/shell/types.js +2 -0
- package/dist/src/drivers/electron/native/shell/types.js.map +1 -0
- package/dist/src/drivers/electron/native/shell.d.ts +14 -0
- package/dist/src/drivers/electron/native/shell.js +115 -0
- package/dist/src/drivers/electron/native/shell.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/commands.d.ts +4 -0
- package/dist/src/drivers/electron/native/surface/commands.js +49 -0
- package/dist/src/drivers/electron/native/surface/commands.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/create.d.ts +4 -0
- package/dist/src/drivers/electron/native/surface/create.js +46 -0
- package/dist/src/drivers/electron/native/surface/create.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/events.d.ts +3 -0
- package/dist/src/drivers/electron/native/surface/events.js +55 -0
- package/dist/src/drivers/electron/native/surface/events.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/presentation.d.ts +15 -0
- package/dist/src/drivers/electron/native/surface/presentation.js +87 -0
- package/dist/src/drivers/electron/native/surface/presentation.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/state.d.ts +7 -0
- package/dist/src/drivers/electron/native/surface/state.js +45 -0
- package/dist/src/drivers/electron/native/surface/state.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/types.d.ts +39 -0
- package/dist/src/drivers/electron/native/surface/types.js +2 -0
- package/dist/src/drivers/electron/native/surface/types.js.map +1 -0
- package/dist/src/drivers/electron/native/surface-controller.d.ts +6 -0
- package/dist/src/drivers/electron/native/surface-controller.js +138 -0
- package/dist/src/drivers/electron/native/surface-controller.js.map +1 -0
- package/dist/src/drivers/electron/policy.d.ts +4 -0
- package/dist/src/drivers/electron/policy.js +39 -0
- package/dist/src/drivers/electron/policy.js.map +1 -0
- package/dist/src/drivers/electron/session.d.ts +4 -0
- package/dist/src/drivers/electron/session.js +5 -0
- package/dist/src/drivers/electron/session.js.map +1 -0
- package/dist/src/drivers/headless/command.d.ts +25 -0
- package/dist/src/drivers/headless/command.js +114 -0
- package/dist/src/drivers/headless/command.js.map +1 -0
- package/dist/src/drivers/headless/cookie-adapter.d.ts +16 -0
- package/dist/src/drivers/headless/cookie-adapter.js +59 -0
- package/dist/src/drivers/headless/cookie-adapter.js.map +1 -0
- package/dist/src/drivers/headless/driver.d.ts +31 -0
- package/dist/src/drivers/headless/driver.js +238 -0
- package/dist/src/drivers/headless/driver.js.map +1 -0
- package/dist/src/drivers/headless/executable.d.ts +8 -0
- package/dist/src/drivers/headless/executable.js +56 -0
- package/dist/src/drivers/headless/executable.js.map +1 -0
- package/dist/src/drivers/headless/screencast.d.ts +3 -0
- package/dist/src/drivers/headless/screencast.js +21 -0
- package/dist/src/drivers/headless/screencast.js.map +1 -0
- package/dist/src/electron.d.ts +14 -0
- package/dist/src/electron.js +15 -0
- package/dist/src/electron.js.map +1 -0
- package/dist/src/errors.d.ts +9 -0
- package/dist/src/errors.js +25 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/events.d.ts +13 -0
- package/dist/src/events.js +32 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/headless.d.ts +3 -0
- package/dist/src/headless.js +4 -0
- package/dist/src/headless.js.map +1 -0
- package/dist/src/http.d.ts +3 -0
- package/dist/src/http.js +3 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/ids.d.ts +2 -0
- package/dist/src/ids.js +9 -0
- package/dist/src/ids.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interaction/delta.d.ts +25 -0
- package/dist/src/interaction/delta.js +102 -0
- package/dist/src/interaction/delta.js.map +1 -0
- package/dist/src/interaction/typing.d.ts +39 -0
- package/dist/src/interaction/typing.js +189 -0
- package/dist/src/interaction/typing.js.map +1 -0
- package/dist/src/mcp.d.ts +3 -0
- package/dist/src/mcp.js +3 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/migration/legacy-cookies.d.ts +2 -0
- package/dist/src/migration/legacy-cookies.js +60 -0
- package/dist/src/migration/legacy-cookies.js.map +1 -0
- package/dist/src/migration/legacy-crypto.d.ts +1 -0
- package/dist/src/migration/legacy-crypto.js +35 -0
- package/dist/src/migration/legacy-crypto.js.map +1 -0
- package/dist/src/migration/legacy-migration.d.ts +20 -0
- package/dist/src/migration/legacy-migration.js +81 -0
- package/dist/src/migration/legacy-migration.js.map +1 -0
- package/dist/src/migration/legacy-rows.d.ts +5 -0
- package/dist/src/migration/legacy-rows.js +72 -0
- package/dist/src/migration/legacy-rows.js.map +1 -0
- package/dist/src/persistence/sqlite-registry.d.ts +32 -0
- package/dist/src/persistence/sqlite-registry.js +136 -0
- package/dist/src/persistence/sqlite-registry.js.map +1 -0
- package/dist/src/ports.d.ts +93 -0
- package/dist/src/ports.js +4 -0
- package/dist/src/ports.js.map +1 -0
- package/dist/src/process.d.ts +4 -0
- package/dist/src/process.js +63 -0
- package/dist/src/process.js.map +1 -0
- package/dist/src/product-service.d.ts +30 -0
- package/dist/src/product-service.js +38 -0
- package/dist/src/product-service.js.map +1 -0
- package/dist/src/profiles/directories.d.ts +9 -0
- package/dist/src/profiles/directories.js +57 -0
- package/dist/src/profiles/directories.js.map +1 -0
- package/dist/src/profiles/service.d.ts +30 -0
- package/dist/src/profiles/service.js +89 -0
- package/dist/src/profiles/service.js.map +1 -0
- package/dist/src/recording/encoder.d.ts +22 -0
- package/dist/src/recording/encoder.js +89 -0
- package/dist/src/recording/encoder.js.map +1 -0
- package/dist/src/recording/sampler.d.ts +18 -0
- package/dist/src/recording/sampler.js +33 -0
- package/dist/src/recording/sampler.js.map +1 -0
- package/dist/src/recording/service.d.ts +27 -0
- package/dist/src/recording/service.js +180 -0
- package/dist/src/recording/service.js.map +1 -0
- package/dist/src/recording/source.d.ts +1 -0
- package/dist/src/recording/source.js +21 -0
- package/dist/src/recording/source.js.map +1 -0
- package/dist/src/recording.d.ts +3 -0
- package/dist/src/recording.js +4 -0
- package/dist/src/recording.js.map +1 -0
- package/dist/src/registry.d.ts +15 -0
- package/dist/src/registry.js +46 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/runtime-selector.d.ts +12 -0
- package/dist/src/runtime-selector.js +78 -0
- package/dist/src/runtime-selector.js.map +1 -0
- package/dist/src/service-options.d.ts +19 -0
- package/dist/src/service-options.js +2 -0
- package/dist/src/service-options.js.map +1 -0
- package/dist/src/service.d.ts +39 -0
- package/dist/src/service.js +204 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/sessions/leases.d.ts +10 -0
- package/dist/src/sessions/leases.js +41 -0
- package/dist/src/sessions/leases.js.map +1 -0
- package/dist/src/sessions/prune.d.ts +2 -0
- package/dist/src/sessions/prune.js +8 -0
- package/dist/src/sessions/prune.js.map +1 -0
- package/dist/src/testing.d.ts +18 -0
- package/dist/src/testing.js +21 -0
- package/dist/src/testing.js.map +1 -0
- package/dist/src/toolbox.d.ts +3 -0
- package/dist/src/toolbox.js +4 -0
- package/dist/src/toolbox.js.map +1 -0
- package/dist/src/types.d.ts +273 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/docs/ACTIONS.md +27 -0
- package/docs/ARCHITECTURE.md +71 -0
- package/docs/AUTHENTICATION.md +56 -0
- package/docs/AXIOMS.md +20 -0
- package/docs/CLI.md +61 -0
- package/docs/COMPATIBILITY.md +45 -0
- package/docs/COOKIES.md +61 -0
- package/docs/ELECTRON_INTEGRATION.md +87 -0
- package/docs/ENGINE_INTEGRATION.md +73 -0
- package/docs/EVENTS.md +30 -0
- package/docs/HEADLESS_RUNTIME.md +58 -0
- package/docs/MCP.md +36 -0
- package/docs/MIGRATION.md +64 -0
- package/docs/OPERATIONS.md +69 -0
- package/docs/README.md +21 -0
- package/docs/REALTIME_BOUNDARY.md +33 -0
- package/docs/RECORDING.md +55 -0
- package/docs/REST.md +69 -0
- package/docs/SDK.md +101 -0
- package/docs/TESTING.md +57 -0
- package/docs/TOOLBOX_INTEGRATION.md +34 -0
- package/docs/TROUBLESHOOTING.md +67 -0
- package/examples/basic.ts +7 -0
- package/examples/custom-driver.ts +45 -0
- package/package.json +78 -0
- package/skills/use-amalgm-browser/SKILL.md +42 -0
- package/skills/use-amalgm-browser/agents/openai.yaml +4 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
package/docs/ACTIONS.md
ADDED
|
@@ -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.
|
package/docs/COOKIES.md
ADDED
|
@@ -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.
|