@amalgm/browser 0.1.2-preview.35541635545 → 0.1.2-preview.37254096068
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 +100 -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 +44 -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 +9 -12
- package/dist/src/electron/surface-controller.js.map +1 -0
- package/dist/src/electron-preload.cjs +1 -1
- package/dist/src/electron.cjs +587 -820
- 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 +143 -0
- package/docs/CLI.md +63 -31
- package/docs/COMPATIBILITY.md +14 -23
- package/docs/COOKIES.md +95 -52
- package/docs/ELECTRON_INTEGRATION.md +84 -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
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-page typing — the scripts behind fill and press in attached mode.
|
|
3
|
-
*
|
|
4
|
-
* In the desktop app the agent and the user share one chromium window, and
|
|
5
|
-
* synthesized keystrokes (CDP Input events) are routed by *window focus* —
|
|
6
|
-
* an agent "typing" while the user's caret sits in the chat box lands the
|
|
7
|
-
* text in the chat box (observed live). These scripts act inside the
|
|
8
|
-
* session's page instead, through the same stamp-guarded transport as every
|
|
9
|
-
* other command, so agent input physically cannot reach anything but the
|
|
10
|
-
* page it was meant for.
|
|
11
|
-
*
|
|
12
|
-
* The boundary: page-level semantics work (value setting with real
|
|
13
|
-
* input/change events, key handlers, Enter activating buttons and
|
|
14
|
-
* submitting forms); OS-level editing defaults (Tab focus traversal,
|
|
15
|
-
* arrow-key scrolling) are real-input territory — that is what the cua_*
|
|
16
|
-
* verbs are for, and they stay focus-dependent by design.
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Set the focused field's value the way the page expects: through the
|
|
20
|
-
* native prototype setter (so frameworks tracking the value descriptor —
|
|
21
|
-
* React — see the change), followed by real input/change events.
|
|
22
|
-
*/
|
|
23
|
-
export function setValueScript(text) {
|
|
24
|
-
return `(() => {
|
|
25
|
-
const el = document.activeElement;
|
|
26
|
-
if (!el || el === document.body) throw new Error('focus did not land on a field');
|
|
27
|
-
const text = ${JSON.stringify(String(text))};
|
|
28
|
-
if (el.isContentEditable) {
|
|
29
|
-
el.textContent = text;
|
|
30
|
-
} else {
|
|
31
|
-
const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
|
|
32
|
-
: el instanceof HTMLInputElement ? HTMLInputElement.prototype
|
|
33
|
-
: null;
|
|
34
|
-
if (!proto && !('value' in el)) {
|
|
35
|
-
throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not fillable');
|
|
36
|
-
}
|
|
37
|
-
const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
|
|
38
|
-
if (setter) setter.call(el, text); else el.value = text;
|
|
39
|
-
}
|
|
40
|
-
el.dispatchEvent(new InputEvent('input', { bubbles: true, data: text, inputType: 'insertReplacementText' }));
|
|
41
|
-
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
42
|
-
return true;
|
|
43
|
-
})()`;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Insert text at the focused field/caret without using browser-window
|
|
47
|
-
* keyboard focus. This is the attached-mode implementation for cua_type and
|
|
48
|
-
* CLI keyboard typing: if the page did not focus an editable element, fail
|
|
49
|
-
* closed instead of letting real keystrokes leak into Amalgm's own UI.
|
|
50
|
-
*/
|
|
51
|
-
export function insertTextScript(text) {
|
|
52
|
-
return `(() => {
|
|
53
|
-
const el = document.activeElement;
|
|
54
|
-
if (!el || el === document.body || el === document.documentElement) {
|
|
55
|
-
throw new Error('focus did not land on an editable field');
|
|
56
|
-
}
|
|
57
|
-
const text = ${JSON.stringify(String(text))};
|
|
58
|
-
const inputEvent = (inputType, data = text) => new InputEvent('input', {
|
|
59
|
-
bubbles: true,
|
|
60
|
-
data,
|
|
61
|
-
inputType,
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
if (el.isContentEditable) {
|
|
65
|
-
const selection = window.getSelection();
|
|
66
|
-
if (selection && selection.rangeCount) {
|
|
67
|
-
const range = selection.getRangeAt(0);
|
|
68
|
-
range.deleteContents();
|
|
69
|
-
const node = document.createTextNode(text);
|
|
70
|
-
range.insertNode(node);
|
|
71
|
-
range.setStartAfter(node);
|
|
72
|
-
range.setEndAfter(node);
|
|
73
|
-
selection.removeAllRanges();
|
|
74
|
-
selection.addRange(range);
|
|
75
|
-
} else {
|
|
76
|
-
el.textContent = (el.textContent || '') + text;
|
|
77
|
-
}
|
|
78
|
-
el.dispatchEvent(inputEvent('insertText'));
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
|
|
83
|
-
: el instanceof HTMLInputElement ? HTMLInputElement.prototype
|
|
84
|
-
: null;
|
|
85
|
-
if (!proto && !('value' in el)) {
|
|
86
|
-
throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not editable');
|
|
87
|
-
}
|
|
88
|
-
const value = String(el.value || '');
|
|
89
|
-
const start = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
|
|
90
|
-
const end = typeof el.selectionEnd === 'number' ? el.selectionEnd : start;
|
|
91
|
-
const next = value.slice(0, start) + text + value.slice(end);
|
|
92
|
-
const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
|
|
93
|
-
if (setter) setter.call(el, next); else el.value = next;
|
|
94
|
-
const caret = start + text.length;
|
|
95
|
-
if (typeof el.setSelectionRange === 'function') {
|
|
96
|
-
try { el.setSelectionRange(caret, caret); } catch {}
|
|
97
|
-
}
|
|
98
|
-
el.dispatchEvent(inputEvent('insertText'));
|
|
99
|
-
return true;
|
|
100
|
-
})()`;
|
|
101
|
-
}
|
|
102
|
-
/** "KeyA" for letters, "Digit1" for digits, the key's own name otherwise. */
|
|
103
|
-
export function codeFor(key) {
|
|
104
|
-
if (/^[a-z]$/i.test(key))
|
|
105
|
-
return `Key${key.toUpperCase()}`;
|
|
106
|
-
if (/^[0-9]$/.test(key))
|
|
107
|
-
return `Digit${key}`;
|
|
108
|
-
if (key === ' ')
|
|
109
|
-
return 'Space';
|
|
110
|
-
return key;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Dispatch a key combination ("Enter", "Escape", "Control+a") to the focused
|
|
114
|
-
* element, mirroring the browser's own Enter defaults when no handler
|
|
115
|
-
* prevents them: buttons and links activate, single-line form fields submit
|
|
116
|
-
* their form (through requestSubmit, so submit handlers and validation run).
|
|
117
|
-
*/
|
|
118
|
-
export function keyScript(combo) {
|
|
119
|
-
const parts = String(combo).split('+');
|
|
120
|
-
const key = parts.pop() || '';
|
|
121
|
-
const mods = parts.map((part) => part.toLowerCase());
|
|
122
|
-
const init = {
|
|
123
|
-
key,
|
|
124
|
-
code: codeFor(key),
|
|
125
|
-
bubbles: true,
|
|
126
|
-
cancelable: true,
|
|
127
|
-
ctrlKey: mods.includes('control') || mods.includes('ctrl'),
|
|
128
|
-
shiftKey: mods.includes('shift'),
|
|
129
|
-
altKey: mods.includes('alt') || mods.includes('option'),
|
|
130
|
-
metaKey: mods.includes('meta') || mods.includes('cmd') || mods.includes('command'),
|
|
131
|
-
};
|
|
132
|
-
return `(() => {
|
|
133
|
-
const el = document.activeElement || document.body;
|
|
134
|
-
const init = ${JSON.stringify(init)};
|
|
135
|
-
const isInput = el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement;
|
|
136
|
-
const isEditable = isInput || el.isContentEditable;
|
|
137
|
-
const inputEvent = (inputType, data = null) => new InputEvent('input', {
|
|
138
|
-
bubbles: true,
|
|
139
|
-
data,
|
|
140
|
-
inputType,
|
|
141
|
-
});
|
|
142
|
-
const setValue = (next, start, end = start) => {
|
|
143
|
-
const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
|
|
144
|
-
: el instanceof HTMLInputElement ? HTMLInputElement.prototype
|
|
145
|
-
: null;
|
|
146
|
-
const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
|
|
147
|
-
if (setter) setter.call(el, next); else el.value = next;
|
|
148
|
-
if (typeof el.setSelectionRange === 'function') {
|
|
149
|
-
try { el.setSelectionRange(start, end); } catch {}
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
const proceed = el.dispatchEvent(new KeyboardEvent('keydown', init));
|
|
153
|
-
if (proceed) {
|
|
154
|
-
el.dispatchEvent(new KeyboardEvent('keypress', init));
|
|
155
|
-
if ((init.ctrlKey || init.metaKey) && init.key.toLowerCase() === 'a' && isEditable) {
|
|
156
|
-
if (isInput && typeof el.select === 'function') {
|
|
157
|
-
el.select();
|
|
158
|
-
} else {
|
|
159
|
-
const range = document.createRange();
|
|
160
|
-
range.selectNodeContents(el);
|
|
161
|
-
const selection = window.getSelection();
|
|
162
|
-
selection.removeAllRanges();
|
|
163
|
-
selection.addRange(range);
|
|
164
|
-
}
|
|
165
|
-
} else if ((init.key === 'Backspace' || init.key === 'Delete') && isInput) {
|
|
166
|
-
const value = String(el.value || '');
|
|
167
|
-
const selectionStart = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
|
|
168
|
-
const selectionEnd = typeof el.selectionEnd === 'number' ? el.selectionEnd : selectionStart;
|
|
169
|
-
let start = selectionStart;
|
|
170
|
-
let end = selectionEnd;
|
|
171
|
-
if (start === end && init.key === 'Backspace' && start > 0) start -= 1;
|
|
172
|
-
if (start === end && init.key === 'Delete' && end < value.length) end += 1;
|
|
173
|
-
if (start !== end) {
|
|
174
|
-
setValue(value.slice(0, start) + value.slice(end), start);
|
|
175
|
-
el.dispatchEvent(inputEvent(init.key === 'Backspace' ? 'deleteContentBackward' : 'deleteContentForward'));
|
|
176
|
-
}
|
|
177
|
-
} else if (init.key === 'Enter') {
|
|
178
|
-
if (el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement) {
|
|
179
|
-
el.click();
|
|
180
|
-
} else if (el instanceof HTMLInputElement && el.form) {
|
|
181
|
-
if (el.form.requestSubmit) el.form.requestSubmit(); else el.form.submit();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
el.dispatchEvent(new KeyboardEvent('keyup', init));
|
|
186
|
-
return true;
|
|
187
|
-
})()`;
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=typing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typing.js","sourceRoot":"","sources":["../../../src/interaction/typing.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO;;;mBAGU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;OAgBxC,CAAC;AACR,CAAC;AACD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO;;;;;mBAKU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CxC,CAAC;AACR,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IAC3D,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,GAAG,EAAE,CAAC;IAC9C,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG;QACX,GAAG;QACH,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;QAClB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1D,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;KACnF,CAAC;IACF,OAAO;;mBAEU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqDhC,CAAC;AACR,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { BrowserProfileDirectories } from '../ports.js';
|
|
2
|
-
export declare class LocalBrowserProfileDirectories implements BrowserProfileDirectories {
|
|
3
|
-
readonly root: string;
|
|
4
|
-
constructor(root: string);
|
|
5
|
-
pathFor(id: string): string;
|
|
6
|
-
lastTouchedAt(id: string): number;
|
|
7
|
-
isLocked(id: string): boolean;
|
|
8
|
-
remove(id: string): void;
|
|
9
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { BrowserError } from '../errors.js';
|
|
4
|
-
import { safeId } from '../ids.js';
|
|
5
|
-
export class LocalBrowserProfileDirectories {
|
|
6
|
-
root;
|
|
7
|
-
constructor(root) {
|
|
8
|
-
this.root = root;
|
|
9
|
-
fs.mkdirSync(path.resolve(root), { recursive: true, mode: 0o700 });
|
|
10
|
-
}
|
|
11
|
-
pathFor(id) { return path.join(path.resolve(this.root), safeId(id)); }
|
|
12
|
-
lastTouchedAt(id) {
|
|
13
|
-
const profile = this.pathFor(id);
|
|
14
|
-
return [profile, 'Local State', 'Default', 'Default/Cookies', 'Default/Network/Cookies', 'Default/History']
|
|
15
|
-
.map((entry) => entry === profile ? entry : path.join(profile, entry))
|
|
16
|
-
.reduce((latest, candidate) => {
|
|
17
|
-
try {
|
|
18
|
-
return Math.max(latest, fs.statSync(candidate).mtimeMs);
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return latest;
|
|
22
|
-
}
|
|
23
|
-
}, 0);
|
|
24
|
-
}
|
|
25
|
-
isLocked(id) {
|
|
26
|
-
const lock = path.join(this.pathFor(id), 'SingletonLock');
|
|
27
|
-
try {
|
|
28
|
-
const stat = fs.lstatSync(lock);
|
|
29
|
-
const value = stat.isSymbolicLink()
|
|
30
|
-
? fs.readlinkSync(lock)
|
|
31
|
-
: fs.readFileSync(lock, 'utf8').slice(0, 256);
|
|
32
|
-
const pid = Number(value.match(/(?:^|[-\s])(\d+)(?:$|\s)/)?.[1] || 0);
|
|
33
|
-
if (pid) {
|
|
34
|
-
try {
|
|
35
|
-
process.kill(pid, 0);
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
if (error.code === 'EPERM')
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return !stat.isSymbolicLink() && Date.now() - stat.mtimeMs < 5 * 60_000;
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
remove(id) {
|
|
50
|
-
const target = this.pathFor(id);
|
|
51
|
-
if (path.dirname(target) !== path.resolve(this.root)) {
|
|
52
|
-
throw new BrowserError('INVALID_INPUT', `Unsafe Browser profile path: ${target}`);
|
|
53
|
-
}
|
|
54
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=directories.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"directories.js","sourceRoot":"","sources":["../../../src/profiles/directories.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { BrowserProfileDirectories, BrowserRegistry } from '../ports.js';
|
|
2
|
-
import type { BrowserProfile, BrowserProfileStatus, BrowserSession } from '../types.js';
|
|
3
|
-
export interface BrowserProfileStoreOptions {
|
|
4
|
-
registry: BrowserRegistry;
|
|
5
|
-
directories?: BrowserProfileDirectories;
|
|
6
|
-
now(): string;
|
|
7
|
-
generate(): string;
|
|
8
|
-
publish(profileId: string): void;
|
|
9
|
-
}
|
|
10
|
-
export declare class BrowserProfileStore {
|
|
11
|
-
private readonly options;
|
|
12
|
-
constructor(options: BrowserProfileStoreOptions);
|
|
13
|
-
create(input: {
|
|
14
|
-
id?: string;
|
|
15
|
-
name: string;
|
|
16
|
-
kind?: BrowserProfile['kind'];
|
|
17
|
-
}): BrowserProfile;
|
|
18
|
-
list(): BrowserProfile[];
|
|
19
|
-
get(id: string): BrowserProfile;
|
|
20
|
-
update(id: string, patch: {
|
|
21
|
-
name?: string;
|
|
22
|
-
kind?: BrowserProfile['kind'];
|
|
23
|
-
}): BrowserProfile;
|
|
24
|
-
inspect(id: string, sessions: BrowserSession[], referenced: ReadonlySet<string>): BrowserProfileStatus;
|
|
25
|
-
delete(id: string, sessions: BrowserSession[]): void;
|
|
26
|
-
prune(maxAgeMs: number, referenced: ReadonlySet<string>, sessions: BrowserSession[]): string[];
|
|
27
|
-
ensure(idValue: string, kind: BrowserProfile['kind'], name?: string): BrowserProfile;
|
|
28
|
-
touch(id: string): void;
|
|
29
|
-
private find;
|
|
30
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { BrowserError } from '../errors.js';
|
|
2
|
-
import { safeId } from '../ids.js';
|
|
3
|
-
export class BrowserProfileStore {
|
|
4
|
-
options;
|
|
5
|
-
constructor(options) {
|
|
6
|
-
this.options = options;
|
|
7
|
-
}
|
|
8
|
-
create(input) {
|
|
9
|
-
const id = safeId(input.id || this.options.generate());
|
|
10
|
-
if (this.find(id))
|
|
11
|
-
throw new BrowserError('CONFLICT', `Browser profile ${id} already exists.`);
|
|
12
|
-
return this.ensure(id, input.kind || 'durable', input.name);
|
|
13
|
-
}
|
|
14
|
-
list() { return this.options.registry.snapshot().profiles; }
|
|
15
|
-
get(id) {
|
|
16
|
-
const profile = this.find(id);
|
|
17
|
-
if (!profile)
|
|
18
|
-
throw new BrowserError('NOT_FOUND', `Browser profile ${id} does not exist.`);
|
|
19
|
-
return profile;
|
|
20
|
-
}
|
|
21
|
-
update(id, patch) {
|
|
22
|
-
const profile = this.get(id);
|
|
23
|
-
const updated = {
|
|
24
|
-
...profile,
|
|
25
|
-
...(patch.name !== undefined ? { name: patch.name.trim() || profile.name } : {}),
|
|
26
|
-
...(patch.kind !== undefined ? { kind: patch.kind } : {}),
|
|
27
|
-
updatedAt: this.options.now(),
|
|
28
|
-
};
|
|
29
|
-
this.options.registry.putProfile(updated);
|
|
30
|
-
this.options.publish(updated.id);
|
|
31
|
-
return updated;
|
|
32
|
-
}
|
|
33
|
-
inspect(id, sessions, referenced) {
|
|
34
|
-
return {
|
|
35
|
-
profile: this.get(id),
|
|
36
|
-
live: sessions.some((session) => session.profileId === id && !isFinished(session)),
|
|
37
|
-
referenced: referenced.has(id),
|
|
38
|
-
locked: this.options.directories?.isLocked(id) || false,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
delete(id, sessions) {
|
|
42
|
-
if (sessions.some((session) => session.profileId === id && !isFinished(session))) {
|
|
43
|
-
throw new BrowserError('CONFLICT', `Browser profile ${id} belongs to a live session.`);
|
|
44
|
-
}
|
|
45
|
-
if (this.options.directories?.isLocked(id)) {
|
|
46
|
-
throw new BrowserError('CONFLICT', `Browser profile ${id} has a live Chromium lock.`);
|
|
47
|
-
}
|
|
48
|
-
this.options.directories?.remove(id);
|
|
49
|
-
this.options.registry.deleteProfile(id);
|
|
50
|
-
}
|
|
51
|
-
prune(maxAgeMs, referenced, sessions) {
|
|
52
|
-
const cutoff = Date.parse(this.options.now()) - maxAgeMs;
|
|
53
|
-
const live = new Set(sessions.filter((session) => !isFinished(session)).map((session) => session.profileId));
|
|
54
|
-
const removed = this.list().filter((profile) => profile.kind === 'ephemeral'
|
|
55
|
-
&& !live.has(profile.id)
|
|
56
|
-
&& !referenced.has(profile.id)
|
|
57
|
-
&& !this.options.directories?.isLocked(profile.id)
|
|
58
|
-
&& Math.max(Date.parse(profile.lastUsedAt), this.options.directories?.lastTouchedAt(profile.id) || 0) < cutoff)
|
|
59
|
-
.map((profile) => profile.id);
|
|
60
|
-
for (const id of removed) {
|
|
61
|
-
this.options.directories?.remove(id);
|
|
62
|
-
this.options.registry.deleteProfile(id);
|
|
63
|
-
}
|
|
64
|
-
return removed;
|
|
65
|
-
}
|
|
66
|
-
ensure(idValue, kind, name = idValue) {
|
|
67
|
-
const id = safeId(idValue);
|
|
68
|
-
const existing = this.find(id);
|
|
69
|
-
if (existing)
|
|
70
|
-
return existing;
|
|
71
|
-
const now = this.options.now();
|
|
72
|
-
const profile = { id, name, kind, createdAt: now, updatedAt: now, lastUsedAt: now };
|
|
73
|
-
this.options.registry.putProfile(profile);
|
|
74
|
-
this.options.publish(id);
|
|
75
|
-
return profile;
|
|
76
|
-
}
|
|
77
|
-
touch(id) {
|
|
78
|
-
const profile = this.get(id);
|
|
79
|
-
const now = this.options.now();
|
|
80
|
-
this.options.registry.putProfile({ ...profile, updatedAt: now, lastUsedAt: now });
|
|
81
|
-
}
|
|
82
|
-
find(id) {
|
|
83
|
-
return this.list().find((profile) => profile.id === safeId(id));
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function isFinished(session) {
|
|
87
|
-
return session.status === 'closed' || session.status === 'failed';
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/profiles/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { BrowserRuntimeSelector } from './ports.js';
|
|
2
|
-
import type { BrowserBackendKind, BrowserHostAdvertisement, BrowserRuntimeContext } from './types.js';
|
|
3
|
-
export declare const ELECTRON_SURFACE_PROTOCOLS: readonly [5, 6];
|
|
4
|
-
export declare function pidIsRunning(pid: number): boolean;
|
|
5
|
-
export declare function bridgeFileCandidates(env?: NodeJS.ProcessEnv): string[];
|
|
6
|
-
export declare function readHostAdvertisement(files?: string[]): BrowserHostAdvertisement | null;
|
|
7
|
-
export declare class DefaultRuntimeSelector implements BrowserRuntimeSelector {
|
|
8
|
-
readonly advertisement: () => BrowserHostAdvertisement | null;
|
|
9
|
-
readonly env: NodeJS.ProcessEnv;
|
|
10
|
-
constructor(advertisement?: () => BrowserHostAdvertisement | null, env?: NodeJS.ProcessEnv);
|
|
11
|
-
select(context: BrowserRuntimeContext): BrowserBackendKind;
|
|
12
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { runtimeBindingFromEnvironment, runtimeStateDir } from '@amalgm/core/identity';
|
|
4
|
-
import { isLoopbackCdpUrl } from './drivers/electron/advertisement.js';
|
|
5
|
-
import { BROWSER_SURFACE_PROTOCOLS } from './drivers/electron/contracts.js';
|
|
6
|
-
export const ELECTRON_SURFACE_PROTOCOLS = BROWSER_SURFACE_PROTOCOLS;
|
|
7
|
-
export function pidIsRunning(pid) {
|
|
8
|
-
if (!Number.isInteger(pid) || pid <= 0)
|
|
9
|
-
return false;
|
|
10
|
-
try {
|
|
11
|
-
process.kill(pid, 0);
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
catch (error) {
|
|
15
|
-
return error.code === 'EPERM';
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export function bridgeFileCandidates(env = process.env) {
|
|
19
|
-
const binding = runtimeBindingFromEnvironment(env);
|
|
20
|
-
// The host supplies its reserved machine namespace. A shared user root is
|
|
21
|
-
// never a discovery fallback, and an unknown binding never selects main.
|
|
22
|
-
const directory = env.AMALGM_RUNTIME_STATE_DIR || (env.AMALGM_DIR && env.AMALGM_DEVICE_ID
|
|
23
|
-
? runtimeStateDir(env.AMALGM_DIR, env.AMALGM_DEVICE_ID, binding.runtimeLabel) : null);
|
|
24
|
-
return directory ? [path.join(directory, 'electron-browser-bridge.json')] : [];
|
|
25
|
-
}
|
|
26
|
-
export function readHostAdvertisement(files = bridgeFileCandidates()) {
|
|
27
|
-
for (const file of files) {
|
|
28
|
-
try {
|
|
29
|
-
const raw = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
30
|
-
const cdp = raw.cdp;
|
|
31
|
-
const cdpUrl = typeof cdp?.url === 'string' ? cdp.url : raw.cdpUrl;
|
|
32
|
-
const protocol = Number.isInteger(raw.browserSurfaceProtocol) ? Number(raw.browserSurfaceProtocol) : 5;
|
|
33
|
-
const pid = Number(raw.pid);
|
|
34
|
-
if (typeof cdpUrl !== 'string' || !isLoopbackCdpUrl(cdpUrl) || !pidIsRunning(pid))
|
|
35
|
-
continue;
|
|
36
|
-
const declared = Array.isArray(raw.browserSurfaceTargetTypes)
|
|
37
|
-
? raw.browserSurfaceTargetTypes
|
|
38
|
-
: [raw.browserSurfaceTargetType || 'webview'];
|
|
39
|
-
const targetTypes = declared.filter((value) => value === 'page' || value === 'webview');
|
|
40
|
-
return {
|
|
41
|
-
protocol, backend: 'electron', pid, cdpUrl, targetTypes, file,
|
|
42
|
-
...(typeof raw.startedAt === 'string' ? { createdAt: raw.startedAt } : {}),
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
catch { }
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
export class DefaultRuntimeSelector {
|
|
50
|
-
advertisement;
|
|
51
|
-
env;
|
|
52
|
-
constructor(advertisement = readHostAdvertisement, env = process.env) {
|
|
53
|
-
this.advertisement = advertisement;
|
|
54
|
-
this.env = env;
|
|
55
|
-
}
|
|
56
|
-
select(context) {
|
|
57
|
-
const forced = String(this.env.AMALGM_BROWSER_BACKEND || '').toLowerCase();
|
|
58
|
-
if (['headless', 'cli', 'agent-browser', 'cdp'].includes(forced))
|
|
59
|
-
return 'headless';
|
|
60
|
-
if (['electron', 'visible', 'attached'].includes(forced))
|
|
61
|
-
return 'electron';
|
|
62
|
-
if (this.env.AMALGM_BROWSER_CDP_URL)
|
|
63
|
-
return 'headless';
|
|
64
|
-
if (context.clientKind !== 'desktop')
|
|
65
|
-
return 'headless';
|
|
66
|
-
const host = this.advertisement();
|
|
67
|
-
return host && ELECTRON_SURFACE_PROTOCOLS.includes(host.protocol)
|
|
68
|
-
? 'electron'
|
|
69
|
-
: 'headless';
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=runtime-selector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-selector.js","sourceRoot":"","sources":["../../src/runtime-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,MAAM,CAAC,MAAM,0BAA0B,GAAG,yBAAyB,CAAC;AAEpE,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC1C,OAAO,KAAK,EAAE,CAAC;QAAC,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,MAAM,OAAO,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACnD,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,SAAS,GAAG,GAAG,CAAC,wBAAwB,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,gBAAgB;QACvF,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxF,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAK,GAAG,oBAAoB,EAAE;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;YACjF,MAAM,GAAG,GAAG,GAAG,CAAC,GAA0C,CAAC;YAC3D,MAAM,MAAM,GAAG,OAAO,GAAG,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvG,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5F,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;gBAC3D,CAAC,CAAC,GAAG,CAAC,yBAAyB;gBAC/B,CAAC,CAAC,CAAC,GAAG,CAAC,wBAAwB,IAAI,SAAS,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAA+B,EAAE,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC;YACrH,OAAO;gBACL,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;gBAC7D,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3E,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,sBAAsB;IAEtB;IACA;IAFX,YACW,gBAAuD,qBAAqB,EAC5E,MAAyB,OAAO,CAAC,GAAG;QADpC,kBAAa,GAAb,aAAa,CAA+D;QAC5E,QAAG,GAAH,GAAG,CAAiC;IAC5C,CAAC;IAEJ,MAAM,CAAC,OAA8B;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3E,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,UAAU,CAAC;QACpF,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,UAAU,CAAC;QAC5E,IAAI,IAAI,CAAC,GAAG,CAAC,sBAAsB;YAAE,OAAO,UAAU,CAAC;QACvD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO,UAAU,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,OAAO,IAAI,IAAK,0BAAgD,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtF,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,CAAC;IACjB,CAAC;CACF"}
|
package/docs/HEADLESS_RUNTIME.md
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# Headless runtime
|
|
2
|
-
|
|
3
|
-
Headless is the default for standalone SDK/CLI use, servers, automations,
|
|
4
|
-
agents, and background jobs. It uses `agent-browser` behind `BrowserDriver`;
|
|
5
|
-
the core service does not know its command-line arguments.
|
|
6
|
-
|
|
7
|
-
## Process and executable selection
|
|
8
|
-
|
|
9
|
-
Resolution prefers:
|
|
10
|
-
|
|
11
|
-
1. `AMALGM_AGENT_BROWSER_BIN`
|
|
12
|
-
2. the platform-native binary shipped by `agent-browser`
|
|
13
|
-
3. the package's JavaScript wrapper
|
|
14
|
-
4. an `agent-browser` executable on PATH
|
|
15
|
-
|
|
16
|
-
When packaged in Electron, native binaries and ffmpeg are resolved from
|
|
17
|
-
`app.asar.unpacked`. Every process uses an argv array with `shell: false`, a
|
|
18
|
-
safe explicit cwd, bounded stdout/stderr, an operation timeout, cancellation,
|
|
19
|
-
SIGTERM, and bounded SIGKILL escalation.
|
|
20
|
-
|
|
21
|
-
## Configuration
|
|
22
|
-
|
|
23
|
-
- `AMALGM_BROWSER_EXECUTABLE_PATH` — explicit Chromium executable
|
|
24
|
-
- `AMALGM_BROWSER_PROVIDER` — external provider understood by agent-browser
|
|
25
|
-
- `AMALGM_BROWSER_CDP_URL` — attach to an operator-owned CDP endpoint
|
|
26
|
-
- `AMALGM_AGENT_BROWSER_BIN` — explicit agent-browser executable
|
|
27
|
-
- `AMALGM_BROWSER_HEADED=1` — explicit standalone headed debug mode
|
|
28
|
-
- `AMALGM_FFMPEG` — encoder override
|
|
29
|
-
|
|
30
|
-
An explicit CDP endpoint remains a headless-driver session in the domain model;
|
|
31
|
-
it does not opt into Electron surfaces. Ordinary background work never opens a
|
|
32
|
-
headed window or steals focus.
|
|
33
|
-
|
|
34
|
-
## Profiles and state
|
|
35
|
-
|
|
36
|
-
Each session uses its assigned Browser profile directory. Durable profiles
|
|
37
|
-
survive explicit reuse; ephemeral profiles are pruned only when not live,
|
|
38
|
-
referenced, or physically Chromium-locked. Backend-local cookies remain in
|
|
39
|
-
that profile. The trusted headless cookie adapter reconciles individual records
|
|
40
|
-
through the encrypted logical jar without inspecting Electron.
|
|
41
|
-
|
|
42
|
-
## Capture and input
|
|
43
|
-
|
|
44
|
-
Accessibility snapshots create stable `@eN` references for ordinary DOM
|
|
45
|
-
actions. Direct CDP resolves the session's actual target for screenshot,
|
|
46
|
-
computer use, and recording—never the first or only page. Viewport screenshots
|
|
47
|
-
are normalized to CSS pixels even when device pixel ratio exceeds one;
|
|
48
|
-
full-page capture is height-bounded.
|
|
49
|
-
|
|
50
|
-
Computer use supports screenshot, click, double click, move, scroll, type,
|
|
51
|
-
keypress, and drag. Native CDP input is page-scoped. Use it for canvas, WebGL,
|
|
52
|
-
image-only, or hostile custom controls; prefer snapshot references elsewhere.
|
|
53
|
-
|
|
54
|
-
## Real verification
|
|
55
|
-
|
|
56
|
-
`npm run test:real` launches the installed Chromium runtime and verifies
|
|
57
|
-
navigation, snapshot, exact-target CDP capture, DPR normalization, page-scoped
|
|
58
|
-
typing, and real page-only recording.
|
|
@@ -1,45 +0,0 @@
|
|
|
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' });
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|