@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
package/docs/SDK.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# TypeScript SDK
|
|
2
|
+
|
|
3
|
+
The package is ESM-only and supports Node.js 20 or newer.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { createBrowser, BrowserError } from '@amalgm/browser';
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
`createBrowser(options)` returns `BrowserProductService`. Defaults include a
|
|
10
|
+
SQLite registry, local artifact store, encrypted cookie/auth files, headless
|
|
11
|
+
driver, event bus, system clock, safe logger, and runtime selector. Injected
|
|
12
|
+
ports can replace registry, drivers, selector, event sink, clock, ID generator,
|
|
13
|
+
logger, authorization, profile directories, artifact store, process launcher,
|
|
14
|
+
cookie jar/coordinator, auth vault, login secret store, and ffmpeg. Native
|
|
15
|
+
ad-block construction separately accepts an injected fetch implementation.
|
|
16
|
+
|
|
17
|
+
## Sessions and actions
|
|
18
|
+
|
|
19
|
+
- `createSession({ id?, profileId?, profileKind?, context? })`
|
|
20
|
+
- `getSession(id)` / `listSessions()`
|
|
21
|
+
- `execute(sessionId, BrowserAction, context?)`
|
|
22
|
+
- `cancel(sessionId)`
|
|
23
|
+
- `closeSession(sessionId, context?)`
|
|
24
|
+
- `pruneSessions(maxAgeMs?)`
|
|
25
|
+
|
|
26
|
+
`BrowserAction` is a discriminated union for `open`, `snapshot`, `screenshot`,
|
|
27
|
+
`click`, `fill`, `press`, `select`, `eval`, `wait`, `cli`, `dialog`, `tab`,
|
|
28
|
+
`console`, `cua`, and `close`. See [ACTIONS.md](./ACTIONS.md). Blocking calls
|
|
29
|
+
take `context.signal`; cancellation propagates to the driver, CDP, encoder, or
|
|
30
|
+
child process.
|
|
31
|
+
|
|
32
|
+
## Profiles
|
|
33
|
+
|
|
34
|
+
- `createProfile({ id?, name, kind? })`
|
|
35
|
+
- `listProfiles()` / `getProfile(id)` / `inspectProfile(id)`
|
|
36
|
+
- `updateProfile(id, { name?, kind? })`
|
|
37
|
+
- `deleteProfile(id)` / `pruneProfiles(maxAgeMs?)`
|
|
38
|
+
|
|
39
|
+
Inspection returns `live`, `referenced`, and physical `locked` status. Delete
|
|
40
|
+
and prune refuse live, referenced, or Chromium-locked profiles.
|
|
41
|
+
|
|
42
|
+
## Authentication and login
|
|
43
|
+
|
|
44
|
+
- `browser.auth.list()` / `get(id)` / `delete(id)`
|
|
45
|
+
- `browser.auth.save({ sessionId, name, domains?, context? })`
|
|
46
|
+
- `browser.auth.load({ sessionId, bundleId, context? })`
|
|
47
|
+
- `browser.auth.exportEncrypted(id, portableKey, context?)`
|
|
48
|
+
- `browser.auth.importEncrypted(resource, portableKey, context?)`
|
|
49
|
+
- `browser.login.create(...)` / `list()` / `get(id)`
|
|
50
|
+
- `browser.login.activate(id, token, context?)`
|
|
51
|
+
- `browser.login.input(id, token, cuaOperation, context?)`
|
|
52
|
+
- `browser.login.complete(...)` / `cancel(id, token)`
|
|
53
|
+
|
|
54
|
+
The token and token-bearing URL exist only in the one-time login creation
|
|
55
|
+
result. Stored login resources contain a hash and ordinary list/get projections
|
|
56
|
+
never return the credential.
|
|
57
|
+
|
|
58
|
+
## Cookies
|
|
59
|
+
|
|
60
|
+
`browser.cookies` is the encrypted jar. `browser.cookieAdapters` registers and
|
|
61
|
+
reconciles trusted physical-store adapters. This is an embedding API, not an
|
|
62
|
+
ordinary automation API; raw cookie values must not be projected to users.
|
|
63
|
+
See [COOKIES.md](./COOKIES.md).
|
|
64
|
+
|
|
65
|
+
## Recordings
|
|
66
|
+
|
|
67
|
+
- `browser.recordings.start({ sessionId, fps?, name?, context? })`
|
|
68
|
+
- `stop(sessionId)` / `forceStop(sessionId)`
|
|
69
|
+
- `list()` / `get(recordingId)` / `activeRecordings()`
|
|
70
|
+
|
|
71
|
+
FPS is clamped to 1–30. Artifact placement uses `context.artifactDestination`
|
|
72
|
+
before the standalone fallback.
|
|
73
|
+
|
|
74
|
+
## Runtime context
|
|
75
|
+
|
|
76
|
+
`BrowserRuntimeContext` accepts opaque `ownerId`, `callerId`, `clientKind`,
|
|
77
|
+
`projectRef`, `cwdRef`, `artifactDestination`, authorization context, and
|
|
78
|
+
`AbortSignal`. Browser does not discover these from Chat or a workspace
|
|
79
|
+
registry.
|
|
80
|
+
|
|
81
|
+
## Errors and capabilities
|
|
82
|
+
|
|
83
|
+
Failures are `BrowserError` values with stable codes such as `INVALID_INPUT`,
|
|
84
|
+
`NOT_FOUND`, `CONFLICT`, `CAPABILITY_UNSUPPORTED`, `AUTHORIZATION_DENIED`,
|
|
85
|
+
`TIMEOUT`, `ABORTED`, `PROCESS_FAILED`, and `SURFACE_IDENTITY_MISMATCH`.
|
|
86
|
+
Inspect `session.capabilities` before optional behavior. Unsupported behavior
|
|
87
|
+
fails explicitly; it is not silently approximated.
|
|
88
|
+
|
|
89
|
+
## Entry points
|
|
90
|
+
|
|
91
|
+
- `@amalgm/browser` — service, ports, types, persistence, migration
|
|
92
|
+
- `@amalgm/browser/headless` — headless driver and executable resolution
|
|
93
|
+
- `@amalgm/browser/electron` — Electron-only host and native shell
|
|
94
|
+
- `@amalgm/browser/cookies` — trusted cookie integration
|
|
95
|
+
- `@amalgm/browser/recording` — recording components
|
|
96
|
+
- `@amalgm/browser/toolbox`, `/mcp`, `/http` — adapters
|
|
97
|
+
- `@amalgm/browser/testing` — deterministic test driver
|
|
98
|
+
|
|
99
|
+
The [custom driver example](../examples/custom-driver.ts) implements the small
|
|
100
|
+
`BrowserDriver` contract for a remote provider. A provider must advertise only
|
|
101
|
+
capabilities it implements and must honor the runtime cancellation signal.
|
package/docs/TESTING.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Testing
|
|
2
|
+
|
|
3
|
+
Tests are organized by invariant rather than implementation file. The default
|
|
4
|
+
suite is deterministic and uses injected drivers/stores; opt-in suites exercise
|
|
5
|
+
real browser processes.
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm run check # tree hygiene and strict TypeScript
|
|
9
|
+
npm test # unit and transport contracts
|
|
10
|
+
npm run test:real # real bundled headless Chromium
|
|
11
|
+
npm run test:electron # real Electron; macOS
|
|
12
|
+
npm run verify # check, build, test, package/install
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Contract coverage
|
|
16
|
+
|
|
17
|
+
- immutable backend/profile binding, restart reopen, leases, cancellation
|
|
18
|
+
- all 22 actions reachable through SDK, CLI, MCP, REST, and Toolbox
|
|
19
|
+
- capability honesty and typed errors
|
|
20
|
+
- two-surface identity, ambiguity, loss, and one verified reattach
|
|
21
|
+
- isolated Electron partition and trusted cookie adapter
|
|
22
|
+
- record-level cookie merges, tombstones, stale snapshots, retry, and feedback
|
|
23
|
+
- protected hosts, partition keys, encryption integrity, wrong-key redaction
|
|
24
|
+
- auth filtering, token TTL/hash, live login, portable import/export
|
|
25
|
+
- profile locks, references, deletion refusal, and ephemeral pruning
|
|
26
|
+
- CSS-pixel/DPR capture and page-scoped native input
|
|
27
|
+
- recording viability, latest-frame buffer, backpressure, cancellation, ffmpeg
|
|
28
|
+
- SQLite cross-process writes and encrypted legacy migration fixtures
|
|
29
|
+
- REST auth/limits/SSE and MCP cancellation
|
|
30
|
+
- argv process safety, bounded output/termination, asar resolution
|
|
31
|
+
- native Electron URL/popup/download/permission/ad-block policies
|
|
32
|
+
|
|
33
|
+
## Real boundaries
|
|
34
|
+
|
|
35
|
+
The headless suite launches bundled Chromium and ffmpeg. The Electron harness
|
|
36
|
+
launches the actual Electron binary with two `WebContentsView` surfaces and
|
|
37
|
+
checks partition identity, isolation, capture, remount, and WebM recording.
|
|
38
|
+
These tests exist because mocks cannot validate CDP target identity or physical
|
|
39
|
+
partition behavior.
|
|
40
|
+
|
|
41
|
+
## Package verification
|
|
42
|
+
|
|
43
|
+
`verify:pack` runs `npm pack`, inspects contents for runtime data/secrets,
|
|
44
|
+
checks the compiled CLI, installs the tarball into a temporary consumer without
|
|
45
|
+
Electron, and imports the ESM core. Build output and temporary tarballs remain
|
|
46
|
+
ignored.
|
|
47
|
+
|
|
48
|
+
Production TypeScript in `src/` and `bin/` is limited to 220 lines per file.
|
|
49
|
+
The tree check fails on generated-source evasions and tracked build/runtime
|
|
50
|
+
artifacts.
|
|
51
|
+
|
|
52
|
+
## Adding behavior
|
|
53
|
+
|
|
54
|
+
Update purpose/axioms if the model changes, then the typed SDK, shared action
|
|
55
|
+
descriptor, every transport projection, documentation, and an invariant test.
|
|
56
|
+
A new action that is not reachable through all five public surfaces must fail
|
|
57
|
+
the parity suite.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Toolbox integration
|
|
2
|
+
|
|
3
|
+
Browser projects into `@amalgm/tools` as one tool:
|
|
4
|
+
|
|
5
|
+
- tool ID: `browser`
|
|
6
|
+
- action IDs: `browser.<short-action>`
|
|
7
|
+
- MCP names: `toolbox__browser_<short-action>`
|
|
8
|
+
- capability sections: `core`, `computer-use`, `recording`, `auth`
|
|
9
|
+
|
|
10
|
+
Import `browserToolboxManifest` and `createBrowserToolboxExecutor` from
|
|
11
|
+
`@amalgm/browser/toolbox`. Tools owns registry presentation, enablement,
|
|
12
|
+
loadouts, grants, and picker UI. Browser owns validation and execution.
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import {
|
|
16
|
+
browserToolboxManifest,
|
|
17
|
+
createBrowserToolboxExecutor,
|
|
18
|
+
} from '@amalgm/browser/toolbox';
|
|
19
|
+
|
|
20
|
+
tools.register(browserToolboxManifest);
|
|
21
|
+
const execute = createBrowserToolboxExecutor(browser, enabledActionIds);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The executor normalizes compatibility aliases once, verifies the action is
|
|
25
|
+
granted, and dispatches the canonical action through the SDK. Disabled actions
|
|
26
|
+
fail before session creation or browser execution.
|
|
27
|
+
|
|
28
|
+
Legacy individual `cua_*` actions, old prefixed IDs, and historical aggregate
|
|
29
|
+
grants are adapter aliases. They do not create new SDK action identities. In
|
|
30
|
+
particular, never generate `toolbox__browser_browser_<action>`.
|
|
31
|
+
|
|
32
|
+
The parity contract executes every canonical action through the Toolbox
|
|
33
|
+
executor as well as SDK, CLI, MCP, and REST. Adding an action descriptor without
|
|
34
|
+
a reachable Toolbox projection fails verification.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Troubleshooting
|
|
2
|
+
|
|
3
|
+
## A session unexpectedly uses headless
|
|
4
|
+
|
|
5
|
+
Electron selection requires `clientKind: 'desktop'` and a live, loopback,
|
|
6
|
+
protocol-5/6 host advertisement with a running PID. Check the advertisement
|
|
7
|
+
path, CDP URL, protocol, and process. Backend selection cannot be changed after
|
|
8
|
+
session creation; create a new session after fixing the host.
|
|
9
|
+
|
|
10
|
+
## Surface identity mismatch
|
|
11
|
+
|
|
12
|
+
Do not retry against an active tab or another target. Confirm the surface
|
|
13
|
+
marker, stamp, ID, and protocol belong to the session. Browser permits one
|
|
14
|
+
reattach only after a genuine target loss; mismatch is intentionally fail
|
|
15
|
+
closed.
|
|
16
|
+
|
|
17
|
+
## Headless executable is missing
|
|
18
|
+
|
|
19
|
+
Run `amalgm-browser doctor`, reinstall production dependencies, or set
|
|
20
|
+
`AMALGM_AGENT_BROWSER_BIN`. In packaged Electron builds, ensure native assets
|
|
21
|
+
are unpacked from `app.asar`.
|
|
22
|
+
|
|
23
|
+
## Recording cannot start
|
|
24
|
+
|
|
25
|
+
Set `AMALGM_FFMPEG` to a working binary and run `<binary> -version`. Browser
|
|
26
|
+
verifies ffmpeg first, then requires a page frame within five seconds. Open a
|
|
27
|
+
navigable page and check that the assigned driver advertises `recording`.
|
|
28
|
+
|
|
29
|
+
## A profile cannot be deleted
|
|
30
|
+
|
|
31
|
+
Inspect it through SDK/CLI/REST. A live session, pending login, auth bundle, or
|
|
32
|
+
Chromium process lock intentionally protects the directory. Close/cancel the
|
|
33
|
+
owner or remove the explicit reference; never delete lock files from a running
|
|
34
|
+
profile.
|
|
35
|
+
|
|
36
|
+
## Cookie jar reports unhealthy
|
|
37
|
+
|
|
38
|
+
Ordinary browsing should continue with the physical profile store. Do not print
|
|
39
|
+
or hand-edit encrypted payloads. Restore a matching jar/key backup or clear the
|
|
40
|
+
damaged automatic jar only after accepting that cross-backend cookie state is
|
|
41
|
+
lost. Named auth bundles are separate.
|
|
42
|
+
|
|
43
|
+
## REST returns 401/403
|
|
44
|
+
|
|
45
|
+
Health is the only unauthenticated route. Supply the exact bearer token. Raw
|
|
46
|
+
cookie routes additionally require `X-Browser-Adapter-Token`. Non-loopback
|
|
47
|
+
listen also requires explicit remote authorization.
|
|
48
|
+
|
|
49
|
+
## Login handoff fails
|
|
50
|
+
|
|
51
|
+
Tokens are one-time credentials returned only at creation, TTL is at most one
|
|
52
|
+
hour, and completed/cancelled/expired sessions reject reuse. For noVNC, set a
|
|
53
|
+
valid HTTP(S) `AMALGM_BROWSER_NOVNC_PUBLIC_URL`.
|
|
54
|
+
|
|
55
|
+
## SQLite is busy or a session conflicts
|
|
56
|
+
|
|
57
|
+
Another process may hold the session lease. Do not run two active owners for
|
|
58
|
+
one browser session. Let the operation finish or cancel it through the owning
|
|
59
|
+
service; stale leases expire. Avoid placing the DB on filesystems with broken
|
|
60
|
+
SQLite locking.
|
|
61
|
+
|
|
62
|
+
## Migration fails
|
|
63
|
+
|
|
64
|
+
Keep old writers stopped. Verify the legacy DB exists, the source auth blob
|
|
65
|
+
hashes match, and the legacy 32-byte key is available. The importer is
|
|
66
|
+
transactional and does not mark completion on failure; fix the violated
|
|
67
|
+
invariant and rerun rather than editing the migration marker.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createBrowser } from '@amalgm/browser';
|
|
2
|
+
|
|
3
|
+
const browser = createBrowser();
|
|
4
|
+
const session = await browser.createSession({ id: 'example' });
|
|
5
|
+
await browser.execute(session.id, { type: 'open', url: 'https://example.com' });
|
|
6
|
+
console.log(await browser.execute(session.id, { type: 'snapshot' }));
|
|
7
|
+
await browser.closeSession(session.id);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createBrowser,
|
|
3
|
+
BrowserError,
|
|
4
|
+
type BrowserAction,
|
|
5
|
+
type BrowserActionResult,
|
|
6
|
+
type BrowserDriver,
|
|
7
|
+
type BrowserDriverSession,
|
|
8
|
+
} from '@amalgm/browser';
|
|
9
|
+
|
|
10
|
+
class RemoteBrowserDriver implements BrowserDriver {
|
|
11
|
+
readonly kind = 'headless' as const;
|
|
12
|
+
readonly capabilities = ['core', 'computer-use'] as const;
|
|
13
|
+
|
|
14
|
+
constructor(readonly endpoint: string, readonly token: string) {}
|
|
15
|
+
|
|
16
|
+
async open(input: BrowserDriverSession): Promise<void> {
|
|
17
|
+
await this.request('/sessions', { session: input.session });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async execute(input: BrowserDriverSession, action: BrowserAction): Promise<BrowserActionResult> {
|
|
21
|
+
return this.request(`/sessions/${encodeURIComponent(input.session.id)}/actions`, { action }, input.context.signal);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async close(input: BrowserDriverSession): Promise<void> {
|
|
25
|
+
await this.request(`/sessions/${encodeURIComponent(input.session.id)}/close`, {});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private async request<T>(path: string, body: unknown, signal?: AbortSignal): Promise<T> {
|
|
29
|
+
const response = await fetch(new URL(path, this.endpoint), {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { authorization: `Bearer ${this.token}`, 'content-type': 'application/json' },
|
|
32
|
+
body: JSON.stringify(body),
|
|
33
|
+
...(signal ? { signal } : {}),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) throw new BrowserError('PROCESS_FAILED', `Remote driver returned ${response.status}.`);
|
|
36
|
+
return response.json() as Promise<T>;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const browser = createBrowser({
|
|
41
|
+
headlessDriver: new RemoteBrowserDriver('https://browser-provider.example', 'token'),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const session = await browser.createSession({ id: 'remote-example' });
|
|
45
|
+
await browser.execute(session.id, { type: 'open', url: 'https://example.com' });
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@amalgm/browser",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Safe persistent browser automation across headless Chromium and visible Electron surfaces.",
|
|
5
|
+
"repository": { "type": "git", "url": "git+https://github.com/amalgm-inc/amalgm-browser.git" },
|
|
6
|
+
"bugs": { "url": "https://github.com/amalgm-inc/amalgm-browser/issues" },
|
|
7
|
+
"homepage": "https://github.com/amalgm-inc/amalgm-browser#readme",
|
|
8
|
+
"license": "UNLICENSED",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"private": false,
|
|
11
|
+
"publishConfig": { "access": "public" },
|
|
12
|
+
"main": "./dist/src/index.js",
|
|
13
|
+
"types": "./dist/src/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": { "types": "./dist/src/index.d.ts", "import": "./dist/src/index.js" },
|
|
16
|
+
"./headless": { "types": "./dist/src/headless.d.ts", "import": "./dist/src/headless.js" },
|
|
17
|
+
"./electron": { "types": "./dist/src/electron.d.ts", "import": "./dist/src/electron.js" },
|
|
18
|
+
"./cookies": { "types": "./dist/src/cookies.d.ts", "import": "./dist/src/cookies.js" },
|
|
19
|
+
"./recording": { "types": "./dist/src/recording.d.ts", "import": "./dist/src/recording.js" },
|
|
20
|
+
"./toolbox": { "types": "./dist/src/toolbox.d.ts", "import": "./dist/src/toolbox.js" },
|
|
21
|
+
"./mcp": { "types": "./dist/src/mcp.d.ts", "import": "./dist/src/mcp.js" },
|
|
22
|
+
"./http": { "types": "./dist/src/http.d.ts", "import": "./dist/src/http.js" },
|
|
23
|
+
"./testing": { "types": "./dist/src/testing.d.ts", "import": "./dist/src/testing.js" }
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"amalgm-browser": "./dist/bin/amalgm-browser.js",
|
|
27
|
+
"amalgm-browser-mcp": "./dist/bin/amalgm-browser-mcp.js",
|
|
28
|
+
"amalgm-browser-rest": "./dist/bin/amalgm-browser-rest.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"docs",
|
|
33
|
+
"examples",
|
|
34
|
+
"skills",
|
|
35
|
+
"CHANGELOG.md",
|
|
36
|
+
"LICENSE",
|
|
37
|
+
"PURPOSE.md",
|
|
38
|
+
"README.md",
|
|
39
|
+
"SECURITY.md"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json && tsx scripts/mark-executables.ts",
|
|
43
|
+
"check": "tsx scripts/check-tree.ts && tsc -p tsconfig.json && tsc -p tsconfig.test.json",
|
|
44
|
+
"test": "tsx --test --test-concurrency=1 --test-timeout=30000 test/*.test.ts",
|
|
45
|
+
"test:real": "cross-env AMALGM_BROWSER_REAL=1 tsx --test --test-timeout=60000 test/real-headless.test.ts",
|
|
46
|
+
"pretest:electron": "npm run build",
|
|
47
|
+
"test:electron": "tsx scripts/run-electron-test.ts",
|
|
48
|
+
"verify": "npm run check && npm run build && npm test && npm run verify:pack",
|
|
49
|
+
"verify:pack": "tsx scripts/verify-package.ts",
|
|
50
|
+
"prepack": "npm run build"
|
|
51
|
+
},
|
|
52
|
+
"engines": { "node": ">=20" },
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@amalgm/core": "^0.1.0",
|
|
55
|
+
"@ghostery/adblocker": "^2.18.1",
|
|
56
|
+
"agent-browser": "0.26.0",
|
|
57
|
+
"better-sqlite3": "^12.10.1",
|
|
58
|
+
"ffmpeg-static": "^5.3.0",
|
|
59
|
+
"tldts-experimental": "^7.4.9",
|
|
60
|
+
"ws": "^8.18.3"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"electron": ">=33"
|
|
64
|
+
},
|
|
65
|
+
"peerDependenciesMeta": {
|
|
66
|
+
"electron": { "optional": true }
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@types/ffmpeg-static": "^3.0.3",
|
|
70
|
+
"@types/node": "^20.19.43",
|
|
71
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
72
|
+
"@types/ws": "^8.18.1",
|
|
73
|
+
"cross-env": "^7.0.3",
|
|
74
|
+
"electron": "41.7.1",
|
|
75
|
+
"tsx": "^4.23.1",
|
|
76
|
+
"typescript": "^5.9.3"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: use-amalgm-browser
|
|
3
|
+
description: Operate web pages through the standalone Amalgm Browser MCP or CLI using persistent sessions, accessibility snapshots, screenshots, browser-scoped computer use, recordings, and human login handoff. Use for web navigation, form interaction, page inspection, visual verification, canvas or image-only controls, authenticated browsing, or browser recordings.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Use Amalgm Browser
|
|
7
|
+
|
|
8
|
+
Use Browser as one persistent page session. Let the host select visible Electron
|
|
9
|
+
or headless Chromium; do not ask users to choose a backend during normal work.
|
|
10
|
+
|
|
11
|
+
## Work in this order
|
|
12
|
+
|
|
13
|
+
1. Call `browser_open` once with the target URL.
|
|
14
|
+
2. Call `browser_snapshot` to read the page and obtain stable `@eN` references.
|
|
15
|
+
3. Prefer `browser_click`, `browser_fill`, `browser_select`, and `browser_press`
|
|
16
|
+
with snapshot references.
|
|
17
|
+
4. Re-run `browser_snapshot` after navigation or material page changes.
|
|
18
|
+
5. Use `browser_screenshot` only when pixels matter.
|
|
19
|
+
6. Use `browser_cua` for canvas, WebGL, image-only, or hostile custom controls.
|
|
20
|
+
7. Keep the same `session` value throughout one task. Close it when finished.
|
|
21
|
+
|
|
22
|
+
Use `text=Visible label` or CSS only when a snapshot reference is unavailable.
|
|
23
|
+
Use `browser_cli` only for an operation absent from the canonical actions.
|
|
24
|
+
|
|
25
|
+
## Safety and identity
|
|
26
|
+
|
|
27
|
+
- Treat screenshot and computer-use coordinates as CSS pixels with a 1:1 map.
|
|
28
|
+
- Never try to switch an Electron session onto another visible surface.
|
|
29
|
+
- Let surface verification fail closed; retry once only when Browser reports a
|
|
30
|
+
genuine surface reconnection.
|
|
31
|
+
- Never request or print raw cookies, tokens, auth payloads, or storage values.
|
|
32
|
+
- Use `browser_auth_link_create` when a human must complete authentication.
|
|
33
|
+
- Use named auth bundles explicitly; do not treat a profile as an auth bundle.
|
|
34
|
+
|
|
35
|
+
## Specialized operations
|
|
36
|
+
|
|
37
|
+
- For action inputs and CUA variants, read
|
|
38
|
+
[references/actions.md](references/actions.md).
|
|
39
|
+
- For recordings, start only after the page is open and stop before closing the
|
|
40
|
+
session. Report `videoSeconds` and `wallSeconds` by their actual names.
|
|
41
|
+
- For visual verification, use the returned screenshot image rather than
|
|
42
|
+
inferring appearance from the accessibility snapshot.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Browser actions
|
|
2
|
+
|
|
3
|
+
## Targets
|
|
4
|
+
|
|
5
|
+
- `@e12`: preferred stable reference from the latest snapshot.
|
|
6
|
+
- `text=Sign in`: visible-text fallback.
|
|
7
|
+
- `#submit` or another CSS selector: structural fallback.
|
|
8
|
+
|
|
9
|
+
## Computer use
|
|
10
|
+
|
|
11
|
+
Call `browser_cua` with one `operation`:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{ "kind": "screenshot" }
|
|
15
|
+
{ "kind": "click", "x": 320, "y": 240, "button": "left" }
|
|
16
|
+
{ "kind": "double_click", "x": 320, "y": 240 }
|
|
17
|
+
{ "kind": "move", "x": 320, "y": 240 }
|
|
18
|
+
{ "kind": "scroll", "scrollY": 600, "scrollX": 0 }
|
|
19
|
+
{ "kind": "type", "text": "hello" }
|
|
20
|
+
{ "kind": "keypress", "keys": ["Control", "a"] }
|
|
21
|
+
{ "kind": "drag", "path": [{ "x": 10, "y": 10 }, { "x": 80, "y": 90 }] }
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Normal DOM work should use snapshot refs. Computer use is the fallback for
|
|
25
|
+
interfaces without usable DOM semantics.
|
|
26
|
+
|
|
27
|
+
## Tabs and dialogs
|
|
28
|
+
|
|
29
|
+
Use `browser_tab` with `list`, `new`, `switch`, or `close`. Visible Electron
|
|
30
|
+
sessions are bound to one verified surface and may reject switching.
|
|
31
|
+
|
|
32
|
+
Use `browser_dialog` with `accept` or `dismiss`; add `text` only for prompts.
|
|
33
|
+
|
|
34
|
+
## Authentication and recording
|
|
35
|
+
|
|
36
|
+
- `browser_auth_link_create`: mint a human login handoff.
|
|
37
|
+
- `browser_auth_save`: explicitly save named encrypted browser state.
|
|
38
|
+
- `browser_auth_load`: explicitly load a named bundle into a session.
|
|
39
|
+
- `browser_record_start`, `browser_record_stop`, `browser_record_list`: manage
|
|
40
|
+
page-only WebM recordings.
|