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