@poe-platform/safe-bash 0.1.696 → 0.1.698
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/README.md +1 -1
- package/dist/safe-bash/playwright/index.d.ts +2 -1
- package/dist/safe-bash/playwright/index.d.ts.map +1 -1
- package/dist/safe-bash/playwright/index.js +2 -1
- package/dist/safe-bash/playwright/index.js.map +1 -1
- package/dist/safe-bash/playwright/native-storage-targets.d.ts.map +1 -1
- package/dist/safe-bash/playwright/native-storage-targets.js +19 -2
- package/dist/safe-bash/playwright/native-storage-targets.js.map +1 -1
- package/dist/safe-bash/playwright/profile.d.ts +38 -0
- package/dist/safe-bash/playwright/profile.d.ts.map +1 -0
- package/dist/safe-bash/playwright/profile.js +172 -0
- package/dist/safe-bash/playwright/profile.js.map +1 -0
- package/dist/safe-playwright-cloudflare/browser-artifact.js +46 -0
- package/dist/safe-playwright-cloudflare/browser-code-executor.d.ts +7 -0
- package/dist/safe-playwright-cloudflare/browser-code-executor.js +20 -0
- package/dist/safe-playwright-cloudflare/browser-codegen.generated.js +8701 -0
- package/dist/safe-playwright-cloudflare/browser-codegen.js +26 -0
- package/dist/safe-playwright-cloudflare/browser-page-cdp.js +21 -0
- package/dist/safe-playwright-cloudflare/browser-private-transport.js +338 -0
- package/dist/safe-playwright-cloudflare/browser-profile-runtime.js +33 -0
- package/dist/safe-playwright-cloudflare/browser-run-code-budget.js +130 -0
- package/dist/safe-playwright-cloudflare/browser-run-code-context-state.js +54 -0
- package/dist/safe-playwright-cloudflare/browser-run-code-contract.js +1 -0
- package/dist/safe-playwright-cloudflare/browser-run-code-guest.generated.js +2 -0
- package/dist/safe-playwright-cloudflare/browser-run-code-native.js +180 -0
- package/dist/safe-playwright-cloudflare/browser-run-code-relay.js +149 -0
- package/dist/safe-playwright-cloudflare/browser-run-code-state.js +102 -0
- package/dist/safe-playwright-cloudflare/browser-run-code.js +251 -0
- package/dist/safe-playwright-cloudflare/browser-snapshot-json-injected.js +80 -0
- package/dist/safe-playwright-cloudflare/browser-snapshot-json.js +89 -0
- package/dist/safe-playwright-cloudflare/browser-socket-closure.js +111 -0
- package/dist/safe-playwright-cloudflare/browser-storage-control.js +262 -0
- package/dist/safe-playwright-cloudflare/browser-trace.js +143 -0
- package/dist/safe-playwright-cloudflare/index.d.ts +2 -0
- package/dist/safe-playwright-cloudflare/index.js +1 -0
- package/dist/safe-playwright-cloudflare/shell-browser-resource.d.ts +17 -0
- package/dist/safe-playwright-cloudflare/shell-browser-resource.js +217 -0
- package/dist/safe-playwright-cloudflare/shell-playwright.d.ts +11 -0
- package/dist/safe-playwright-cloudflare/shell-playwright.js +110 -0
- package/package.json +10 -2
- package/third-party/safe-playwright-cloudflare/third-party/playwright/LICENSE +202 -0
- package/third-party/safe-playwright-cloudflare/third-party/playwright/NOTICE +12 -0
package/README.md
CHANGED
|
@@ -89,7 +89,7 @@ These plugins are separate from `agentCommands()`; pass them to `shell.use(...)`
|
|
|
89
89
|
| `llm` | `llmCommands({ providers, defaultModel?, replace? })`: opt-in model routing, sandbox attachments and streamed text/binary output. Includes injected-transport OpenAI and ElevenLabs reference providers. [Configuration and provider contract](src/commands/llm/README.md). |
|
|
90
90
|
| `wkhtmltopdf` | `/commands/wkhtmltopdf`: opt-in CLI/SDK adapter with VFS byte I/O and explicit limits. Requires a supplied first-party static renderer; none is included. `wkhtmltopdfCommands({ limits, renderer? })` and `runWkhtmltopdf(context, options)` share behavior. Exported `switches` lists all 122 flags and rejections; `wkhtmltopdfLimits` defaults to 16 MiB PDF output, 64 objects and 128 batch jobs. `--help`, `--extended-help` and `--version` work without a renderer; TOC and dynamic execution are unavailable. |
|
|
91
91
|
| `exiftool` | `/commands/exiftool`: opt-in `exiftoolCommands({ limits? })` for uncompressed PNG text and `tIME` inspection/selected writes. Use `exiftool -j -Title /image.png`, `-csv` for union headers, or `-Title=Example` to edit with an `_original` backup. Typed SDK argv uses `createExiftoolArguments`. Defaults: 64 files, 16 MiB cumulative input/output, 8 MiB decoded and 32 MiB retained bytes. Private implementation/types ship inside safe-bash. PDF, Office, EXIF/XMP, broader timestamps, import and execute protocols remain unsupported; see the [supported profile](https://github.com/poe-platform/poe-code/blob/main/packages/safe-bash-command-exiftool/README.md). |
|
|
92
|
-
| `playwright-cli` | Standard browser commands, storage state, native snapshots, recordings, and traces through a host-owned adapter. [Sessions and host capabilities](src/contracts/playwright-sessions.md). `installPlaywrightNetworkPolicy` from `/playwright` supports browser-native redirects with per-hop bounded host HTTP fetch and independent direct HTTP/WebSocket denial. Cloudflare guardrails do not establish WebRTC/UDP denial or all-protocol accounting; hosts requiring those guarantees must refuse this integration. [Network policy and lifecycle](src/contracts/playwright-network-policy.md). |
|
|
92
|
+
| `playwright-cli` | Standard browser commands, storage state, native snapshots, recordings, and traces through a host-owned adapter. [Sessions and host capabilities](src/contracts/playwright-sessions.md). [Optional Cloudflare adapter and portable profiles](https://github.com/poe-platform/poe-code/blob/main/packages/safe-playwright-cloudflare/README.md). `installPlaywrightNetworkPolicy` from `/playwright` supports browser-native redirects with per-hop bounded host HTTP fetch and independent direct HTTP/WebSocket denial. Cloudflare guardrails do not establish WebRTC/UDP denial or all-protocol accounting; hosts requiring those guarantees must refuse this integration. [Network policy and lifecycle](src/contracts/playwright-network-policy.md). |
|
|
93
93
|
|
|
94
94
|
For a custom same-isolate Python JSPI host, use `createPythonJspiExecutor` from
|
|
95
95
|
the same Python entry with an explicit loader, precompiled Wasm modules and
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export * from './adapter.js';
|
|
2
|
+
export { parseBrowserProfile, encodeBrowserProfile, restoreBrowserProfile, checkpointBrowserProfile, type BrowserProfile, type BrowserProfileLimits, type BrowserProfileContext } from './profile.js';
|
|
2
3
|
export * from './billing.js';
|
|
3
4
|
export * from './controller.js';
|
|
4
5
|
export * from './catalog.js';
|
|
5
6
|
export * from './network-policy.js';
|
|
6
7
|
export { parsePlaywrightStorageState } from './storage-state.js';
|
|
7
8
|
export { createPlaywrightStorageOriginPreparer, type PlaywrightStorageControl, type PlaywrightStorageControlEvent } from './native-storage-targets.js';
|
|
8
|
-
export { readPlaywrightStorageState, type PlaywrightStorageOperationOptions, type PlaywrightStorageCDP, type PlaywrightStorageOriginLease, type PlaywrightStorageOriginPreparer } from './native-storage-replacement.js';
|
|
9
|
+
export { readPlaywrightStorageState, replacePlaywrightStorageState, type PlaywrightStorageOperationOptions, type PlaywrightStorageCDP, type PlaywrightStorageOriginLease, type PlaywrightStorageOriginPreparer } from './native-storage-replacement.js';
|
|
9
10
|
export { createPlaywrightPrivateTargetTransport, type PlaywrightCDPTransport, type PlaywrightPrivateTargetTransportLimits, type PlaywrightPrivateTargetCreation } from './private-target-transport.js';
|
|
10
11
|
export { parsePlaywrightContextOptions } from './open-options.js';
|
|
11
12
|
export { PlaywrightResourceLimitError } from './resource-limit.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/playwright/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,qCAAqC,EAAE,KAAK,wBAAwB,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvJ,OAAO,EAAE,0BAA0B,EAAE,KAAK,iCAAiC,EAAE,KAAK,oBAAoB,EAAE,KAAK,4BAA4B,EAAE,KAAK,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/playwright/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACtM,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,qCAAqC,EAAE,KAAK,wBAAwB,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvJ,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,KAAK,iCAAiC,EAAE,KAAK,oBAAoB,EAAE,KAAK,4BAA4B,EAAE,KAAK,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AACxP,OAAO,EAAE,sCAAsC,EAAE,KAAK,sBAAsB,EAAE,KAAK,sCAAsC,EAAE,KAAK,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACvM,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,mCAAmC,EAAE,KAAK,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AACtH,YAAY,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AACvG,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export * from './adapter.js';
|
|
2
|
+
export { parseBrowserProfile, encodeBrowserProfile, restoreBrowserProfile, checkpointBrowserProfile } from './profile.js';
|
|
2
3
|
export * from './billing.js';
|
|
3
4
|
export * from './controller.js';
|
|
4
5
|
export * from './catalog.js';
|
|
5
6
|
export * from './network-policy.js';
|
|
6
7
|
export { parsePlaywrightStorageState } from './storage-state.js';
|
|
7
8
|
export { createPlaywrightStorageOriginPreparer } from './native-storage-targets.js';
|
|
8
|
-
export { readPlaywrightStorageState } from './native-storage-replacement.js';
|
|
9
|
+
export { readPlaywrightStorageState, replacePlaywrightStorageState } from './native-storage-replacement.js';
|
|
9
10
|
export { createPlaywrightPrivateTargetTransport } from './private-target-transport.js';
|
|
10
11
|
export { parsePlaywrightContextOptions } from './open-options.js';
|
|
11
12
|
export { PlaywrightResourceLimitError } from './resource-limit.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/playwright/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,qCAAqC,EAAqE,MAAM,6BAA6B,CAAC;AACvJ,OAAO,EAAE,0BAA0B,EAA8I,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/playwright/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,wBAAwB,EAA8E,MAAM,cAAc,CAAC;AACtM,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,qCAAqC,EAAqE,MAAM,6BAA6B,CAAC;AACvJ,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAA8I,MAAM,iCAAiC,CAAC;AACxP,OAAO,EAAE,sCAAsC,EAAkH,MAAM,+BAA+B,CAAC;AACvM,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,mCAAmC,EAAuC,MAAM,4BAA4B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-storage-targets.d.ts","sourceRoot":"","sources":["../../src/playwright/native-storage-targets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAEvF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7G,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACjF;AAED,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE;IAAE,aAAa,IAAI,+BAA+B,CAAA;CAAE,GAAG,+BAA+B,
|
|
1
|
+
{"version":3,"file":"native-storage-targets.d.ts","sourceRoot":"","sources":["../../src/playwright/native-storage-targets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAEvF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7G,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACjF;AAED,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE;IAAE,aAAa,IAAI,+BAA+B,CAAA;CAAE,GAAG,+BAA+B,CAmI9L"}
|
|
@@ -16,6 +16,10 @@ export function createPlaywrightStorageOriginPreparer(control, privateTargets) {
|
|
|
16
16
|
let rejectRemoved;
|
|
17
17
|
let resolveLoaded;
|
|
18
18
|
let rejectLoaded;
|
|
19
|
+
let navigationLoaderId;
|
|
20
|
+
let navigationReplied = false;
|
|
21
|
+
let unqualifiedLoaded = false;
|
|
22
|
+
const loadedLoaders = new Set();
|
|
19
23
|
const removed = new Promise((resolve, reject) => { resolveDestroyed = resolve; rejectRemoved = reject; });
|
|
20
24
|
void removed.catch(() => { });
|
|
21
25
|
const loaded = new Promise((resolve, reject) => { resolveLoaded = resolve; rejectLoaded = reject; });
|
|
@@ -37,8 +41,16 @@ export function createPlaywrightStorageOriginPreparer(control, privateTargets) {
|
|
|
37
41
|
}
|
|
38
42
|
if (!sessionId || event.sessionId !== sessionId)
|
|
39
43
|
return;
|
|
40
|
-
if (event.method === 'Page.loadEventFired')
|
|
41
|
-
|
|
44
|
+
if (event.method === 'Page.loadEventFired') {
|
|
45
|
+
unqualifiedLoaded = true;
|
|
46
|
+
if (navigationReplied && navigationLoaderId === undefined)
|
|
47
|
+
resolveLoaded();
|
|
48
|
+
}
|
|
49
|
+
if (event.method === 'Page.lifecycleEvent' && event.params?.name === 'load' && typeof event.params.loaderId === 'string') {
|
|
50
|
+
loadedLoaders.add(event.params.loaderId);
|
|
51
|
+
if (event.params.loaderId === navigationLoaderId)
|
|
52
|
+
resolveLoaded();
|
|
53
|
+
}
|
|
42
54
|
if (event.method !== 'Fetch.requestPaused')
|
|
43
55
|
return;
|
|
44
56
|
const operation = Promise.resolve().then(async () => {
|
|
@@ -119,12 +131,17 @@ export function createPlaywrightStorageOriginPreparer(control, privateTargets) {
|
|
|
119
131
|
signal.throwIfAborted();
|
|
120
132
|
await control.send('Emulation.setScriptExecutionDisabled', { value: true }, sessionId);
|
|
121
133
|
await control.send('Page.enable', {}, sessionId);
|
|
134
|
+
await control.send('Page.setLifecycleEventsEnabled', { enabled: true }, sessionId);
|
|
122
135
|
await control.send('Network.setBypassServiceWorker', { bypass: true }, sessionId);
|
|
123
136
|
await control.send('Fetch.enable', { patterns: [{ resourceType: 'Document', requestStage: 'Request' }] }, sessionId);
|
|
124
137
|
signal.throwIfAborted();
|
|
125
138
|
const navigation = await control.send('Page.navigate', { url }, sessionId);
|
|
126
139
|
if (navigation.errorText)
|
|
127
140
|
throw new Error('Native storage synthetic navigation failed');
|
|
141
|
+
navigationLoaderId = navigation.loaderId;
|
|
142
|
+
navigationReplied = true;
|
|
143
|
+
if (typeof navigationLoaderId === 'string' ? loadedLoaders.has(navigationLoaderId) : navigationLoaderId === undefined && unqualifiedLoaded)
|
|
144
|
+
resolveLoaded();
|
|
128
145
|
await loaded;
|
|
129
146
|
await Promise.all(pending);
|
|
130
147
|
if (eventFailure)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-storage-targets.js","sourceRoot":"","sources":["../../src/playwright/native-storage-targets.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,qCAAqC,CAAC,OAAiC,EAAE,cAAoE;IAC3J,OAAO,KAAK,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpD,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACrH,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC;QACzB,IAAI,QAA4B,CAAC;QACjC,IAAI,SAA6B,CAAC;QAClC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,UAAqC,CAAC;QAC1C,IAAI,eAA0C,CAAC;QAC/C,IAAI,cAAiC,CAAC;QACtC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,gBAA6B,CAAC;QAClC,IAAI,aAAwC,CAAC;QAC7C,IAAI,aAA0B,CAAC;QAC/B,IAAI,YAAuC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,gBAAgB,GAAG,OAAO,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChH,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,aAAa,GAAG,OAAO,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC5C,IAAI,YAAqB,CAAC;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC3E,cAAc,KAAK,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACpE,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC7B,aAAa,CAAC,cAAc,CAAC,CAAC;gBAC9B,aAAa,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,wBAAwB,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjG,SAAS,GAAG,IAAI,CAAC;gBACjB,gBAAgB,EAAE,CAAC;gBACnB,YAAY,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;gBAAE,OAAO;YACxD,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB;
|
|
1
|
+
{"version":3,"file":"native-storage-targets.js","sourceRoot":"","sources":["../../src/playwright/native-storage-targets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { PlaywrightAdapter, PlaywrightContext, PlaywrightContextOptions, PlaywrightStorageState } from './adapter.js';
|
|
2
|
+
import type { PlaywrightSessionCheckpoint, PlaywrightSessionPersistence } from './controller.js';
|
|
3
|
+
import { type PlaywrightSessionConfiguration } from './session-configuration.js';
|
|
4
|
+
export interface BrowserProfile {
|
|
5
|
+
state: PlaywrightStorageState;
|
|
6
|
+
tabs: string[];
|
|
7
|
+
selected: number;
|
|
8
|
+
expiresAt?: number;
|
|
9
|
+
idleTimeoutMs?: number;
|
|
10
|
+
contextOptions?: PlaywrightContextOptions;
|
|
11
|
+
configuration?: PlaywrightSessionConfiguration;
|
|
12
|
+
/** Provider-qualified dynamic settings, validated by the restoring context. */
|
|
13
|
+
runtimeState?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface BrowserProfileContext extends PlaywrightContext {
|
|
16
|
+
readonly browserProfile?: {
|
|
17
|
+
capture(signal: AbortSignal): Promise<unknown>;
|
|
18
|
+
restore(state: unknown, signal: AbortSignal): Promise<void>;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Validate persisted JSON before it can allocate or navigate a browser. */
|
|
22
|
+
export declare function parseBrowserProfile(bytes: Uint8Array, limits: BrowserProfileLimits): BrowserProfile;
|
|
23
|
+
export interface BrowserProfileLimits {
|
|
24
|
+
readonly maxBytes: number;
|
|
25
|
+
readonly maxTabs: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function encodeBrowserProfile(profile: BrowserProfile, limits: BrowserProfileLimits): Uint8Array;
|
|
28
|
+
/** Return an initializer so the standard controller installs configuration before navigation. */
|
|
29
|
+
export declare function restoreBrowserProfile(options: {
|
|
30
|
+
adapter: PlaywrightAdapter;
|
|
31
|
+
profile: BrowserProfile;
|
|
32
|
+
limits: BrowserProfileLimits;
|
|
33
|
+
name: string;
|
|
34
|
+
signal: AbortSignal;
|
|
35
|
+
}): Promise<NonNullable<Awaited<ReturnType<PlaywrightSessionPersistence['restore']>>>>;
|
|
36
|
+
/** Read closed-origin IndexedDB using isolated targets and settle every registered reader cleanup. */
|
|
37
|
+
export declare function checkpointBrowserProfile(session: PlaywrightSessionCheckpoint, limits: BrowserProfileLimits, signal: AbortSignal): Promise<Uint8Array>;
|
|
38
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/playwright/profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAkB,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3I,OAAO,KAAK,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAGjG,OAAO,EAAE,KAAK,8BAA8B,EAAuC,MAAM,4BAA4B,CAAC;AAGtH,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,aAAa,CAAC,EAAE,8BAA8B,CAAC;IAC9C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7D,CAAC;CACH;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAiCnG;AAgCD,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAAE;AAM9F,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,GAAG,UAAU,CActG;AAED,iGAAiG;AACjG,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAClF,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;CACnC,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CA0CrF;AAED,sGAAsG;AACtG,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA4B3J"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { readPlaywrightStorageState } from './native-storage-replacement.js';
|
|
2
|
+
import { parsePlaywrightContextOptions } from './open-options.js';
|
|
3
|
+
import { parsePlaywrightSessionConfiguration } from './session-configuration.js';
|
|
4
|
+
import { parsePlaywrightStorageState } from './storage-state.js';
|
|
5
|
+
/** Validate persisted JSON before it can allocate or navigate a browser. */
|
|
6
|
+
export function parseBrowserProfile(bytes, limits) {
|
|
7
|
+
validateProfileLimits(limits);
|
|
8
|
+
if (bytes.byteLength > limits.maxBytes)
|
|
9
|
+
throw new Error("Browser profile byte limit exceeded");
|
|
10
|
+
const value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
11
|
+
if (!value ||
|
|
12
|
+
typeof value !== "object" ||
|
|
13
|
+
!("state" in value) ||
|
|
14
|
+
!("tabs" in value) ||
|
|
15
|
+
!Array.isArray(value.tabs) ||
|
|
16
|
+
value.tabs.length > limits.maxTabs ||
|
|
17
|
+
!("selected" in value) ||
|
|
18
|
+
typeof value.selected !== "number" ||
|
|
19
|
+
!Number.isSafeInteger(value.selected) ||
|
|
20
|
+
value.selected < 0 ||
|
|
21
|
+
value.selected >= Math.max(1, value.tabs.length))
|
|
22
|
+
throw new Error("Invalid stored browser profile");
|
|
23
|
+
const tabs = [];
|
|
24
|
+
for (const tab of value.tabs) {
|
|
25
|
+
if (typeof tab !== "string" || !URL.canParse(tab))
|
|
26
|
+
throw new Error("Invalid stored browser tab");
|
|
27
|
+
tabs.push(tab);
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
...profileSettings(value),
|
|
31
|
+
state: parsePlaywrightStorageState(value.state, { maxBytes: limits.maxBytes }),
|
|
32
|
+
tabs,
|
|
33
|
+
selected: value.selected,
|
|
34
|
+
...('runtimeState' in value ? { runtimeState: value.runtimeState } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function profileSettings(value) {
|
|
38
|
+
const settings = {};
|
|
39
|
+
if ("expiresAt" in value)
|
|
40
|
+
settings.expiresAt = timing(value.expiresAt);
|
|
41
|
+
if ("idleTimeoutMs" in value)
|
|
42
|
+
settings.idleTimeoutMs = timing(value.idleTimeoutMs);
|
|
43
|
+
if ("contextOptions" in value) {
|
|
44
|
+
settings.contextOptions = parsePlaywrightContextOptions(value.contextOptions);
|
|
45
|
+
if (settings.contextOptions.storageState)
|
|
46
|
+
throw new Error("Stored context options must use the current profile state");
|
|
47
|
+
}
|
|
48
|
+
if ("configuration" in value)
|
|
49
|
+
settings.configuration = parsePlaywrightSessionConfiguration(value.configuration);
|
|
50
|
+
return settings;
|
|
51
|
+
}
|
|
52
|
+
function timing(value) {
|
|
53
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)
|
|
54
|
+
throw new Error("Invalid stored browser expiry");
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function validateProfileLimits(limits) {
|
|
58
|
+
if (!limits || !Number.isSafeInteger(limits.maxBytes) || limits.maxBytes <= 0 || !Number.isSafeInteger(limits.maxTabs) || limits.maxTabs <= 0)
|
|
59
|
+
throw new TypeError("Invalid browser profile limits");
|
|
60
|
+
}
|
|
61
|
+
export function encodeBrowserProfile(profile, limits) {
|
|
62
|
+
validateProfileLimits(limits);
|
|
63
|
+
const tabs = Object.getOwnPropertyDescriptor(profile, 'tabs')?.value;
|
|
64
|
+
if (Array.isArray(tabs) && tabs.length > limits.maxTabs)
|
|
65
|
+
throw new Error('Browser profile tab limit exceeded');
|
|
66
|
+
const serialized = JSON.stringify(profile);
|
|
67
|
+
let byteLength = 0;
|
|
68
|
+
for (const character of serialized) {
|
|
69
|
+
const point = character.codePointAt(0);
|
|
70
|
+
byteLength += point <= 0x7f ? 1 : point <= 0x7ff ? 2 : point <= 0xffff ? 3 : 4;
|
|
71
|
+
if (byteLength > limits.maxBytes)
|
|
72
|
+
throw new Error('Browser profile byte limit exceeded');
|
|
73
|
+
}
|
|
74
|
+
const bytes = new TextEncoder().encode(serialized);
|
|
75
|
+
parseBrowserProfile(bytes, limits);
|
|
76
|
+
return bytes;
|
|
77
|
+
}
|
|
78
|
+
/** Return an initializer so the standard controller installs configuration before navigation. */
|
|
79
|
+
export async function restoreBrowserProfile(options) {
|
|
80
|
+
const { adapter, limits, name, signal } = options;
|
|
81
|
+
signal.throwIfAborted();
|
|
82
|
+
const profile = parseBrowserProfile(encodeBrowserProfile(options.profile, limits), limits);
|
|
83
|
+
const lease = await adapter.acquire({
|
|
84
|
+
acquisitionId: crypto.randomUUID(), session: name, browser: 'chromium', headless: true,
|
|
85
|
+
contextOptions: { ...profile.contextOptions, storageState: profile.state }, signal,
|
|
86
|
+
});
|
|
87
|
+
try {
|
|
88
|
+
signal.throwIfAborted();
|
|
89
|
+
const pages = [];
|
|
90
|
+
const urls = profile.tabs.length ? profile.tabs : ['about:blank'];
|
|
91
|
+
if (lease.context.pages().length + urls.length > limits.maxTabs)
|
|
92
|
+
throw new Error('Browser profile tab limit exceeded');
|
|
93
|
+
for (const ignoredUrl of urls) {
|
|
94
|
+
signal.throwIfAborted();
|
|
95
|
+
pages.push(await lease.context.newPage());
|
|
96
|
+
}
|
|
97
|
+
signal.throwIfAborted();
|
|
98
|
+
return {
|
|
99
|
+
lease, selectedPage: pages[profile.selected],
|
|
100
|
+
...(profile.configuration === undefined ? {} : { configuration: profile.configuration }),
|
|
101
|
+
...(profile.contextOptions === undefined ? {} : { contextOptions: profile.contextOptions }),
|
|
102
|
+
...(profile.expiresAt === undefined ? {} : { expiresAt: profile.expiresAt }),
|
|
103
|
+
...(profile.idleTimeoutMs === undefined ? {} : { idleTimeoutMs: profile.idleTimeoutMs }),
|
|
104
|
+
async initialize({ signal }) {
|
|
105
|
+
// The controller owns retirement after adoption, including failed navigation.
|
|
106
|
+
if (profile.runtimeState !== undefined) {
|
|
107
|
+
const runtime = lease.context.browserProfile;
|
|
108
|
+
if (!runtime)
|
|
109
|
+
throw new Error('Browser adapter cannot restore provider profile settings');
|
|
110
|
+
await runtime.restore(profile.runtimeState, signal);
|
|
111
|
+
}
|
|
112
|
+
for (let i = 0; i < pages.length; i++) {
|
|
113
|
+
signal.throwIfAborted();
|
|
114
|
+
await pages[i].goto(urls[i]);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
try {
|
|
121
|
+
await lease.release();
|
|
122
|
+
}
|
|
123
|
+
catch (cleanup) {
|
|
124
|
+
throw new AggregateError([error, cleanup], 'Browser profile restoration and cleanup failed');
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Read closed-origin IndexedDB using isolated targets and settle every registered reader cleanup. */
|
|
130
|
+
export async function checkpointBrowserProfile(session, limits, signal) {
|
|
131
|
+
validateProfileLimits(limits);
|
|
132
|
+
signal.throwIfAborted();
|
|
133
|
+
checkpointPages(session, limits);
|
|
134
|
+
const cleanups = [];
|
|
135
|
+
const [result] = await Promise.allSettled([readPlaywrightStorageState(session.context, {
|
|
136
|
+
signal, indexedDB: true, maxBytes: limits.maxBytes, registerCleanup: cleanup => cleanups.push(cleanup),
|
|
137
|
+
})]);
|
|
138
|
+
const outcomes = await Promise.allSettled(cleanups.map(cleanup => Promise.resolve().then(cleanup)));
|
|
139
|
+
const failures = outcomes.filter((outcome) => outcome.status === 'rejected').map(outcome => outcome.reason);
|
|
140
|
+
if (result.status === 'rejected' || signal.aborted)
|
|
141
|
+
failures.unshift(result.status === 'rejected' ? result.reason : signal.reason);
|
|
142
|
+
if (failures.length === 1)
|
|
143
|
+
throw failures[0];
|
|
144
|
+
if (failures.length > 1)
|
|
145
|
+
throw new AggregateError(failures, 'Browser profile checkpoint and cleanup failed');
|
|
146
|
+
if (result.status !== 'fulfilled')
|
|
147
|
+
throw new Error('Browser profile checkpoint failed');
|
|
148
|
+
const contextOptions = { ...session.contextOptions };
|
|
149
|
+
delete contextOptions.storageState;
|
|
150
|
+
const runtime = session.context.browserProfile;
|
|
151
|
+
const runtimeState = await runtime?.capture(signal);
|
|
152
|
+
signal.throwIfAborted();
|
|
153
|
+
const { pages, selected } = checkpointPages(session, limits);
|
|
154
|
+
return encodeBrowserProfile({
|
|
155
|
+
state: result.value, contextOptions,
|
|
156
|
+
tabs: pages.map(page => page.url()), selected,
|
|
157
|
+
...(session.configuration === undefined ? {} : { configuration: session.configuration }),
|
|
158
|
+
...(session.expiresAt === undefined ? {} : { expiresAt: session.expiresAt }),
|
|
159
|
+
...(session.idleTimeoutMs === undefined ? {} : { idleTimeoutMs: session.idleTimeoutMs }),
|
|
160
|
+
...(runtimeState === undefined ? {} : { runtimeState }),
|
|
161
|
+
}, limits);
|
|
162
|
+
}
|
|
163
|
+
function checkpointPages(session, limits) {
|
|
164
|
+
const pages = session.context.pages();
|
|
165
|
+
if (pages.length > limits.maxTabs)
|
|
166
|
+
throw new Error('Browser profile tab limit exceeded');
|
|
167
|
+
const selected = session.selectedPage === undefined ? 0 : pages.indexOf(session.selectedPage);
|
|
168
|
+
if (selected < 0)
|
|
169
|
+
throw new Error('Browser profile selected page does not belong to the context');
|
|
170
|
+
return { pages, selected };
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/playwright/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { mkdtemp, open, rm } from "node:fs/promises";
|
|
2
|
+
/** Cloudflare's tracing client writes to its private /tmp filesystem. Read a
|
|
3
|
+
* bounded artifact only after the producer settles, and always retire its files. */
|
|
4
|
+
export const captureBrowserArtifact = async (produce, options) => {
|
|
5
|
+
const { signal, maxBytes, extension } = options;
|
|
6
|
+
signal.throwIfAborted();
|
|
7
|
+
if (!Number.isSafeInteger(maxBytes) ||
|
|
8
|
+
maxBytes < 1 ||
|
|
9
|
+
!extension ||
|
|
10
|
+
extension.length > 16 ||
|
|
11
|
+
[...extension].some((letter) => !"abcdefghijklmnopqrstuvwxyz0123456789".includes(letter)))
|
|
12
|
+
throw new Error("Invalid browser artifact options");
|
|
13
|
+
const directory = await mkdtemp("/tmp/poe-browser-artifact-");
|
|
14
|
+
try {
|
|
15
|
+
signal.throwIfAborted();
|
|
16
|
+
const path = `${directory}/artifact.${extension}`;
|
|
17
|
+
await produce(path);
|
|
18
|
+
signal.throwIfAborted();
|
|
19
|
+
const file = await open(path, "r");
|
|
20
|
+
try {
|
|
21
|
+
const stat = await file.stat();
|
|
22
|
+
if (!stat.isFile() || stat.size > maxBytes)
|
|
23
|
+
throw new Error("Browser artifact byte limit exceeded");
|
|
24
|
+
const bytes = new Uint8Array(stat.size + 1);
|
|
25
|
+
let offset = 0;
|
|
26
|
+
while (offset < bytes.byteLength) {
|
|
27
|
+
signal.throwIfAborted();
|
|
28
|
+
// biome-ignore lint/performance/noAwaitInLoops: Each short read advances the same file cursor and bounded destination.
|
|
29
|
+
const { bytesRead } = await file.read(bytes, offset, bytes.byteLength - offset, null);
|
|
30
|
+
if (!bytesRead)
|
|
31
|
+
break;
|
|
32
|
+
offset += bytesRead;
|
|
33
|
+
}
|
|
34
|
+
if (offset !== stat.size)
|
|
35
|
+
throw new Error("Browser artifact changed during capture");
|
|
36
|
+
signal.throwIfAborted();
|
|
37
|
+
return bytes.slice(0, offset);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await file.close();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
await rm(directory, { recursive: true, force: true });
|
|
45
|
+
}
|
|
46
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PlaywrightCodeExecutor } from "../safe-bash/commands/playwright/index.js";
|
|
2
|
+
import type { acquireCloudflareBrowser } from "./shell-browser-resource.js";
|
|
3
|
+
export interface BrowserCodeRuntime {
|
|
4
|
+
ownerId: string;
|
|
5
|
+
loader?: WorkerLoader;
|
|
6
|
+
}
|
|
7
|
+
export declare function createBrowserCodeExecutor(resource: Awaited<ReturnType<typeof acquireCloudflareBrowser>>, runtime?: BrowserCodeRuntime): PlaywrightCodeExecutor;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createBrowserRunCode } from "./browser-run-code.js";
|
|
2
|
+
import { browserRunCodeGuestSource } from "./browser-run-code-guest.generated.js";
|
|
3
|
+
export function createBrowserCodeExecutor(resource, runtime) {
|
|
4
|
+
const execute = runtime?.loader
|
|
5
|
+
? createBrowserRunCode({
|
|
6
|
+
ownerId: runtime.ownerId,
|
|
7
|
+
loader: runtime.loader,
|
|
8
|
+
guestSource: browserRunCodeGuestSource,
|
|
9
|
+
browser: resource.browser,
|
|
10
|
+
connectSocket: resource.connectSocket,
|
|
11
|
+
retire: resource.release,
|
|
12
|
+
})
|
|
13
|
+
: undefined;
|
|
14
|
+
return async (input) => {
|
|
15
|
+
if (!execute)
|
|
16
|
+
throw new Error("Playwright run-code is unavailable: Worker Loader binding missing");
|
|
17
|
+
// The provider created this native Page; the portable adapter narrows its type.
|
|
18
|
+
return execute({ ...input, page: input.page });
|
|
19
|
+
};
|
|
20
|
+
}
|