@elizaos/plugin-browser 2.0.0-alpha.9 → 2.0.11-beta.7
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/LICENSE +21 -0
- package/README.md +98 -83
- package/auto-enable.ts +24 -0
- package/dist/actions/browser-autofill-login.d.ts +43 -0
- package/dist/actions/browser-autofill-login.d.ts.map +1 -0
- package/dist/actions/browser-autofill-login.js +278 -0
- package/dist/actions/browser-autofill-login.js.map +1 -0
- package/dist/actions/browser.d.ts +11 -0
- package/dist/actions/browser.d.ts.map +1 -0
- package/dist/actions/browser.js +412 -0
- package/dist/actions/browser.js.map +1 -0
- package/dist/actions/manage-browser-bridge.d.ts +34 -0
- package/dist/actions/manage-browser-bridge.d.ts.map +1 -0
- package/dist/actions/manage-browser-bridge.js +572 -0
- package/dist/actions/manage-browser-bridge.js.map +1 -0
- package/dist/bridge-policy.d.ts +10 -0
- package/dist/bridge-policy.d.ts.map +1 -0
- package/dist/bridge-policy.js +37 -0
- package/dist/bridge-policy.js.map +1 -0
- package/dist/bridge-readiness.d.ts +16 -0
- package/dist/bridge-readiness.d.ts.map +1 -0
- package/dist/bridge-readiness.js +82 -0
- package/dist/bridge-readiness.js.map +1 -0
- package/dist/bridge-records.d.ts +9 -0
- package/dist/bridge-records.d.ts.map +1 -0
- package/dist/bridge-records.js +37 -0
- package/dist/bridge-records.js.map +1 -0
- package/dist/browser-capture-hooks.d.ts +9 -0
- package/dist/browser-capture-hooks.d.ts.map +1 -0
- package/dist/browser-capture-hooks.js +15 -0
- package/dist/browser-capture-hooks.js.map +1 -0
- package/dist/browser-service.d.ts +103 -0
- package/dist/browser-service.d.ts.map +1 -0
- package/dist/browser-service.js +186 -0
- package/dist/browser-service.js.map +1 -0
- package/dist/browser-workspace-hooks.d.ts +14 -0
- package/dist/browser-workspace-hooks.d.ts.map +1 -0
- package/dist/browser-workspace-hooks.js +15 -0
- package/dist/browser-workspace-hooks.js.map +1 -0
- package/dist/companion-auth.d.ts +34 -0
- package/dist/companion-auth.d.ts.map +1 -0
- package/dist/companion-auth.js +98 -0
- package/dist/companion-auth.js.map +1 -0
- package/dist/contracts.d.ts +284 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +56 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +30 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -90
- package/dist/index.js.map +1 -1
- package/dist/lifeops-session-contracts.d.ts +46 -0
- package/dist/lifeops-session-contracts.d.ts.map +1 -0
- package/dist/lifeops-session-contracts.js +1 -0
- package/dist/lifeops-session-contracts.js.map +1 -0
- package/dist/message-adapter.d.ts +9 -0
- package/dist/message-adapter.d.ts.map +1 -0
- package/dist/message-adapter.js +104 -0
- package/dist/message-adapter.js.map +1 -0
- package/dist/packaging.d.ts +27 -0
- package/dist/packaging.d.ts.map +1 -0
- package/dist/packaging.js +571 -0
- package/dist/packaging.js.map +1 -0
- package/dist/password-manager-bridge.d.ts +50 -0
- package/dist/password-manager-bridge.d.ts.map +1 -0
- package/dist/password-manager-bridge.js +437 -0
- package/dist/password-manager-bridge.js.map +1 -0
- package/dist/plugin.d.ts +10 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +168 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/workspace.d.ts +13 -0
- package/dist/providers/workspace.d.ts.map +1 -0
- package/dist/providers/workspace.js +64 -0
- package/dist/providers/workspace.js.map +1 -0
- package/dist/routes/bridge.d.ts +37 -0
- package/dist/routes/bridge.d.ts.map +1 -0
- package/dist/routes/bridge.js +844 -0
- package/dist/routes/bridge.js.map +1 -0
- package/dist/routes/workspace-account-gate.d.ts +29 -0
- package/dist/routes/workspace-account-gate.d.ts.map +1 -0
- package/dist/routes/workspace-account-gate.js +147 -0
- package/dist/routes/workspace-account-gate.js.map +1 -0
- package/dist/routes/workspace-setup.d.ts +10 -0
- package/dist/routes/workspace-setup.d.ts.map +1 -0
- package/dist/routes/workspace-setup.js +65 -0
- package/dist/routes/workspace-setup.js.map +1 -0
- package/dist/routes/workspace.d.ts +20 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +276 -0
- package/dist/routes/workspace.js.map +1 -0
- package/dist/schema.d.ts +2326 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +133 -0
- package/dist/schema.js.map +1 -0
- package/dist/service.d.ts +30 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +5 -0
- package/dist/service.js.map +1 -0
- package/dist/targets/bridge-target.d.ts +31 -0
- package/dist/targets/bridge-target.d.ts.map +1 -0
- package/dist/targets/bridge-target.js +98 -0
- package/dist/targets/bridge-target.js.map +1 -0
- package/dist/targets/stagehand-target.d.ts +3 -0
- package/dist/targets/stagehand-target.d.ts.map +1 -0
- package/dist/targets/stagehand-target.js +187 -0
- package/dist/targets/stagehand-target.js.map +1 -0
- package/dist/workspace/browser-capture.d.ts +41 -0
- package/dist/workspace/browser-capture.d.ts.map +1 -0
- package/dist/workspace/browser-capture.js +159 -0
- package/dist/workspace/browser-capture.js.map +1 -0
- package/dist/workspace/browser-workspace-desktop.d.ts +19 -0
- package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-desktop.js +1578 -0
- package/dist/workspace/browser-workspace-desktop.js.map +1 -0
- package/dist/workspace/browser-workspace-elements.d.ts +42 -0
- package/dist/workspace/browser-workspace-elements.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-elements.js +547 -0
- package/dist/workspace/browser-workspace-elements.js.map +1 -0
- package/dist/workspace/browser-workspace-forms.d.ts +19 -0
- package/dist/workspace/browser-workspace-forms.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-forms.js +277 -0
- package/dist/workspace/browser-workspace-forms.js.map +1 -0
- package/dist/workspace/browser-workspace-helpers.d.ts +32 -0
- package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-helpers.js +232 -0
- package/dist/workspace/browser-workspace-helpers.js.map +1 -0
- package/dist/workspace/browser-workspace-jsdom.d.ts +16 -0
- package/dist/workspace/browser-workspace-jsdom.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-jsdom.js +233 -0
- package/dist/workspace/browser-workspace-jsdom.js.map +1 -0
- package/dist/workspace/browser-workspace-network.d.ts +7 -0
- package/dist/workspace/browser-workspace-network.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-network.js +145 -0
- package/dist/workspace/browser-workspace-network.js.map +1 -0
- package/dist/workspace/browser-workspace-snapshots.d.ts +14 -0
- package/dist/workspace/browser-workspace-snapshots.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-snapshots.js +144 -0
- package/dist/workspace/browser-workspace-snapshots.js.map +1 -0
- package/dist/workspace/browser-workspace-state.d.ts +24 -0
- package/dist/workspace/browser-workspace-state.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-state.js +155 -0
- package/dist/workspace/browser-workspace-state.js.map +1 -0
- package/dist/workspace/browser-workspace-types.d.ts +345 -0
- package/dist/workspace/browser-workspace-types.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-types.js +11 -0
- package/dist/workspace/browser-workspace-types.js.map +1 -0
- package/dist/workspace/browser-workspace-web.d.ts +8 -0
- package/dist/workspace/browser-workspace-web.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-web.js +1342 -0
- package/dist/workspace/browser-workspace-web.js.map +1 -0
- package/dist/workspace/browser-workspace.d.ts +39 -0
- package/dist/workspace/browser-workspace.d.ts.map +1 -0
- package/dist/workspace/browser-workspace.js +958 -0
- package/dist/workspace/browser-workspace.js.map +1 -0
- package/dist/workspace/index.d.ts +26 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +3 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace.d.ts +2 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +2 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +71 -110
- package/dist/actions/click.d.ts +0 -3
- package/dist/actions/click.d.ts.map +0 -1
- package/dist/actions/click.js +0 -158
- package/dist/actions/click.js.map +0 -1
- package/dist/actions/extract.d.ts +0 -3
- package/dist/actions/extract.d.ts.map +0 -1
- package/dist/actions/extract.js +0 -168
- package/dist/actions/extract.js.map +0 -1
- package/dist/actions/index.d.ts +0 -7
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/actions/index.js +0 -7
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/navigate.d.ts +0 -3
- package/dist/actions/navigate.d.ts.map +0 -1
- package/dist/actions/navigate.js +0 -187
- package/dist/actions/navigate.js.map +0 -1
- package/dist/actions/screenshot.d.ts +0 -3
- package/dist/actions/screenshot.d.ts.map +0 -1
- package/dist/actions/screenshot.js +0 -167
- package/dist/actions/screenshot.js.map +0 -1
- package/dist/actions/select.d.ts +0 -3
- package/dist/actions/select.d.ts.map +0 -1
- package/dist/actions/select.js +0 -167
- package/dist/actions/select.js.map +0 -1
- package/dist/actions/type.d.ts +0 -3
- package/dist/actions/type.d.ts.map +0 -1
- package/dist/actions/type.js +0 -167
- package/dist/actions/type.js.map +0 -1
- package/dist/cli/index.d.ts +0 -8
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -13
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/register.d.ts +0 -20
- package/dist/cli/register.d.ts.map +0 -1
- package/dist/cli/register.js +0 -403
- package/dist/cli/register.js.map +0 -1
- package/dist/providerRelevance.d.ts +0 -4
- package/dist/providerRelevance.d.ts.map +0 -1
- package/dist/providerRelevance.js +0 -33
- package/dist/providerRelevance.js.map +0 -1
- package/dist/providers/browser-state.d.ts +0 -3
- package/dist/providers/browser-state.d.ts.map +0 -1
- package/dist/providers/browser-state.js +0 -72
- package/dist/providers/browser-state.js.map +0 -1
- package/dist/providers/index.d.ts +0 -2
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -2
- package/dist/providers/index.js.map +0 -1
- package/dist/services/browser-service.d.ts +0 -32
- package/dist/services/browser-service.d.ts.map +0 -1
- package/dist/services/browser-service.js +0 -213
- package/dist/services/browser-service.js.map +0 -1
- package/dist/services/index.d.ts +0 -4
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -4
- package/dist/services/index.js.map +0 -1
- package/dist/services/process-manager.d.ts +0 -24
- package/dist/services/process-manager.d.ts.map +0 -1
- package/dist/services/process-manager.js +0 -270
- package/dist/services/process-manager.js.map +0 -1
- package/dist/services/websocket-client.d.ts +0 -35
- package/dist/services/websocket-client.d.ts.map +0 -1
- package/dist/services/websocket-client.js +0 -221
- package/dist/services/websocket-client.js.map +0 -1
- package/dist/types.d.ts +0 -101
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/captcha.d.ts +0 -33
- package/dist/utils/captcha.d.ts.map +0 -1
- package/dist/utils/captcha.js +0 -219
- package/dist/utils/captcha.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -37
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -81
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -5
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -26
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -55
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/security.d.ts +0 -27
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -139
- package/dist/utils/security.js.map +0 -1
- package/dist/utils/url.d.ts +0 -12
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/url.js +0 -39
- package/dist/utils/url.js.map +0 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { normalizeBrowserWorkspaceText } from "./browser-workspace-helpers.js";
|
|
6
|
+
import { fetchBrowserWorkspaceTrackedResponse } from "./browser-workspace-network.js";
|
|
7
|
+
import {
|
|
8
|
+
browserWorkspaceClipboardText,
|
|
9
|
+
getBrowserWorkspaceRuntimeState,
|
|
10
|
+
getBrowserWorkspaceTimestamp,
|
|
11
|
+
setBrowserWorkspaceClipboardText
|
|
12
|
+
} from "./browser-workspace-state.js";
|
|
13
|
+
let jsdomCtor;
|
|
14
|
+
function findJsdomPackageJsonPath() {
|
|
15
|
+
const candidatesUnderBase = (base) => {
|
|
16
|
+
const rels = [
|
|
17
|
+
path.join("node_modules", "jsdom", "package.json"),
|
|
18
|
+
path.join("apps", "app", "node_modules", "jsdom", "package.json")
|
|
19
|
+
];
|
|
20
|
+
for (const rel of rels) {
|
|
21
|
+
const full = path.join(base, rel);
|
|
22
|
+
if (existsSync(full)) {
|
|
23
|
+
return full;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return void 0;
|
|
27
|
+
};
|
|
28
|
+
const walk = (start, maxDepth) => {
|
|
29
|
+
let dir = start;
|
|
30
|
+
for (let depth = 0; depth < maxDepth; depth += 1) {
|
|
31
|
+
const hit = candidatesUnderBase(dir);
|
|
32
|
+
if (hit) {
|
|
33
|
+
return hit;
|
|
34
|
+
}
|
|
35
|
+
const parent = path.dirname(dir);
|
|
36
|
+
if (parent === dir) {
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
dir = parent;
|
|
40
|
+
}
|
|
41
|
+
return void 0;
|
|
42
|
+
};
|
|
43
|
+
const fromSource = walk(path.dirname(fileURLToPath(import.meta.url)), 24);
|
|
44
|
+
if (fromSource) {
|
|
45
|
+
return fromSource;
|
|
46
|
+
}
|
|
47
|
+
const fromCwd = walk(process.cwd(), 16);
|
|
48
|
+
if (fromCwd) {
|
|
49
|
+
return fromCwd;
|
|
50
|
+
}
|
|
51
|
+
throw new Error(
|
|
52
|
+
"Could not find jsdom on disk (install dependencies: jsdom is listed on @elizaos/agent and apps/app)."
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function getJSDOMClass() {
|
|
56
|
+
if (!jsdomCtor) {
|
|
57
|
+
const jsdomPkg = findJsdomPackageJsonPath();
|
|
58
|
+
const jsdomDir = path.dirname(jsdomPkg);
|
|
59
|
+
const meta = JSON.parse(readFileSync(jsdomPkg, "utf8"));
|
|
60
|
+
const mainRel = (meta.main ?? "./lib/api.js").replace(/^\.\//, "");
|
|
61
|
+
const entry = path.join(jsdomDir, mainRel);
|
|
62
|
+
const req = createRequire(jsdomPkg);
|
|
63
|
+
const mod = req(entry);
|
|
64
|
+
jsdomCtor = mod.JSDOM;
|
|
65
|
+
}
|
|
66
|
+
return jsdomCtor;
|
|
67
|
+
}
|
|
68
|
+
function createEmptyWebBrowserWorkspaceDom(url) {
|
|
69
|
+
return new (getJSDOMClass())(
|
|
70
|
+
'<!doctype html><html lang="en"><head><title>New Tab</title></head><body></body></html>',
|
|
71
|
+
{
|
|
72
|
+
pretendToBeVisual: true,
|
|
73
|
+
url
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
function applyBrowserWorkspaceDomSettings(dom, state) {
|
|
78
|
+
const viewport = state.settings.viewport;
|
|
79
|
+
if (viewport) {
|
|
80
|
+
Object.defineProperty(dom.window, "innerWidth", {
|
|
81
|
+
configurable: true,
|
|
82
|
+
value: viewport.width
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(dom.window, "innerHeight", {
|
|
85
|
+
configurable: true,
|
|
86
|
+
value: viewport.height
|
|
87
|
+
});
|
|
88
|
+
Object.defineProperty(dom.window, "devicePixelRatio", {
|
|
89
|
+
configurable: true,
|
|
90
|
+
value: viewport.scale
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
Object.defineProperty(dom.window.navigator, "onLine", {
|
|
94
|
+
configurable: true,
|
|
95
|
+
get: () => !state.settings.offline
|
|
96
|
+
});
|
|
97
|
+
if (state.settings.device) {
|
|
98
|
+
Object.defineProperty(dom.window.navigator, "userAgent", {
|
|
99
|
+
configurable: true,
|
|
100
|
+
value: `ElizaBrowserWorkspace/${state.settings.device}`
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const matchMedia = (query) => {
|
|
104
|
+
const matches = query.includes("prefers-color-scheme") && (state.settings.media === "dark" && query.includes("dark") || state.settings.media === "light" && query.includes("light"));
|
|
105
|
+
return {
|
|
106
|
+
addEventListener() {
|
|
107
|
+
},
|
|
108
|
+
addListener() {
|
|
109
|
+
},
|
|
110
|
+
dispatchEvent() {
|
|
111
|
+
return true;
|
|
112
|
+
},
|
|
113
|
+
matches,
|
|
114
|
+
media: query,
|
|
115
|
+
onchange: null,
|
|
116
|
+
removeEventListener() {
|
|
117
|
+
},
|
|
118
|
+
removeListener() {
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
Object.defineProperty(dom.window, "matchMedia", {
|
|
123
|
+
configurable: true,
|
|
124
|
+
value: matchMedia
|
|
125
|
+
});
|
|
126
|
+
Object.defineProperty(dom.window.navigator, "clipboard", {
|
|
127
|
+
configurable: true,
|
|
128
|
+
value: {
|
|
129
|
+
readText: async () => browserWorkspaceClipboardText,
|
|
130
|
+
writeText: async (value) => {
|
|
131
|
+
setBrowserWorkspaceClipboardText(String(value ?? ""));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
Object.defineProperty(dom.window.navigator, "geolocation", {
|
|
136
|
+
configurable: true,
|
|
137
|
+
value: {
|
|
138
|
+
getCurrentPosition: (success) => {
|
|
139
|
+
const coords = state.settings.geo ?? { latitude: 0, longitude: 0 };
|
|
140
|
+
success({
|
|
141
|
+
coords: {
|
|
142
|
+
accuracy: 1,
|
|
143
|
+
latitude: coords.latitude,
|
|
144
|
+
longitude: coords.longitude
|
|
145
|
+
},
|
|
146
|
+
timestamp: Date.now()
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function installBrowserWorkspaceWebRuntime(tab, dom) {
|
|
153
|
+
const state = getBrowserWorkspaceRuntimeState("web", tab.id);
|
|
154
|
+
applyBrowserWorkspaceDomSettings(dom, state);
|
|
155
|
+
Object.defineProperty(dom.window, "__elizaBrowserWorkspaceState", {
|
|
156
|
+
value: state,
|
|
157
|
+
writable: true,
|
|
158
|
+
configurable: true
|
|
159
|
+
});
|
|
160
|
+
const consoleTarget = dom.window.console;
|
|
161
|
+
if (!consoleTarget.__elizaWrapped) {
|
|
162
|
+
for (const level of ["log", "info", "warn", "error"]) {
|
|
163
|
+
consoleTarget[level] = (...args) => {
|
|
164
|
+
state.consoleEntries.push({
|
|
165
|
+
level,
|
|
166
|
+
message: args.map((value) => normalizeBrowserWorkspaceText(value)).join(" "),
|
|
167
|
+
timestamp: getBrowserWorkspaceTimestamp()
|
|
168
|
+
});
|
|
169
|
+
return void 0;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
consoleTarget.__elizaWrapped = true;
|
|
173
|
+
}
|
|
174
|
+
dom.window.alert = (message) => {
|
|
175
|
+
state.dialog = {
|
|
176
|
+
defaultValue: null,
|
|
177
|
+
message: String(message ?? ""),
|
|
178
|
+
open: true,
|
|
179
|
+
type: "alert"
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
dom.window.confirm = (message) => {
|
|
183
|
+
state.dialog = {
|
|
184
|
+
defaultValue: null,
|
|
185
|
+
message: String(message ?? ""),
|
|
186
|
+
open: true,
|
|
187
|
+
type: "confirm"
|
|
188
|
+
};
|
|
189
|
+
return false;
|
|
190
|
+
};
|
|
191
|
+
dom.window.prompt = (message, defaultValue) => {
|
|
192
|
+
state.dialog = {
|
|
193
|
+
defaultValue: defaultValue ?? null,
|
|
194
|
+
message: String(message ?? ""),
|
|
195
|
+
open: true,
|
|
196
|
+
type: "prompt"
|
|
197
|
+
};
|
|
198
|
+
return null;
|
|
199
|
+
};
|
|
200
|
+
Object.defineProperty(dom.window, "fetch", {
|
|
201
|
+
configurable: true,
|
|
202
|
+
value: async (input, init) => {
|
|
203
|
+
const inputUrl = typeof input === "string" ? input : input instanceof URL ? input.toString() : typeof input.url === "string" ? input.url : String(input);
|
|
204
|
+
return fetchBrowserWorkspaceTrackedResponse(
|
|
205
|
+
state,
|
|
206
|
+
new URL(inputUrl, tab.url).toString(),
|
|
207
|
+
{
|
|
208
|
+
...init,
|
|
209
|
+
headers: init?.headers ?? (input.headers ? input.headers : void 0),
|
|
210
|
+
method: init?.method ?? (typeof input.method === "string" ? input.method : void 0)
|
|
211
|
+
},
|
|
212
|
+
"fetch"
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function ensureBrowserWorkspaceDom(tab) {
|
|
218
|
+
if (tab.dom && tab.loadedUrl === tab.url) {
|
|
219
|
+
return tab.dom;
|
|
220
|
+
}
|
|
221
|
+
throw new Error(
|
|
222
|
+
`Browser workspace tab ${tab.id} is not loaded yet. Reload or inspect the page first.`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
export {
|
|
226
|
+
applyBrowserWorkspaceDomSettings,
|
|
227
|
+
createEmptyWebBrowserWorkspaceDom,
|
|
228
|
+
ensureBrowserWorkspaceDom,
|
|
229
|
+
findJsdomPackageJsonPath,
|
|
230
|
+
getJSDOMClass,
|
|
231
|
+
installBrowserWorkspaceWebRuntime
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=browser-workspace-jsdom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/workspace/browser-workspace-jsdom.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { JSDOM } from \"jsdom\";\nimport { normalizeBrowserWorkspaceText } from \"./browser-workspace-helpers.js\";\nimport { fetchBrowserWorkspaceTrackedResponse } from \"./browser-workspace-network.js\";\nimport {\n browserWorkspaceClipboardText,\n getBrowserWorkspaceRuntimeState,\n getBrowserWorkspaceTimestamp,\n setBrowserWorkspaceClipboardText,\n} from \"./browser-workspace-state.js\";\nimport type {\n BrowserWorkspaceRuntimeState,\n WebBrowserWorkspaceTabState,\n} from \"./browser-workspace-types.js\";\n\nlet jsdomCtor: typeof import(\"jsdom\").JSDOM | undefined;\n\n/**\n * Locate jsdom's package.json on disk, then resolve its declared entry file from there.\n * Vitest workers run on Node; Node cannot resolve `jsdom` from workspace roots when\n * Bun hoists deps under node_modules/.bun, but requiring jsdom from its own package\n * directory still works.\n */\nexport function findJsdomPackageJsonPath(): string {\n const candidatesUnderBase = (base: string): string | undefined => {\n const rels = [\n path.join(\"node_modules\", \"jsdom\", \"package.json\"),\n path.join(\"apps\", \"app\", \"node_modules\", \"jsdom\", \"package.json\"),\n ];\n for (const rel of rels) {\n const full = path.join(base, rel);\n if (existsSync(full)) {\n return full;\n }\n }\n return undefined;\n };\n\n const walk = (start: string, maxDepth: number): string | undefined => {\n let dir = start;\n for (let depth = 0; depth < maxDepth; depth += 1) {\n const hit = candidatesUnderBase(dir);\n if (hit) {\n return hit;\n }\n const parent = path.dirname(dir);\n if (parent === dir) {\n break;\n }\n dir = parent;\n }\n return undefined;\n };\n\n const fromSource = walk(path.dirname(fileURLToPath(import.meta.url)), 24);\n if (fromSource) {\n return fromSource;\n }\n const fromCwd = walk(process.cwd(), 16);\n if (fromCwd) {\n return fromCwd;\n }\n\n throw new Error(\n \"Could not find jsdom on disk (install dependencies: jsdom is listed on @elizaos/agent and apps/app).\",\n );\n}\n\n/** Lazy-load jsdom so importing this module does not require jsdom at parse time (Vitest / server tests). */\nexport function getJSDOMClass(): typeof import(\"jsdom\").JSDOM {\n if (!jsdomCtor) {\n const jsdomPkg = findJsdomPackageJsonPath();\n const jsdomDir = path.dirname(jsdomPkg);\n const meta = JSON.parse(readFileSync(jsdomPkg, \"utf8\")) as {\n main?: string;\n };\n const mainRel = (meta.main ?? \"./lib/api.js\").replace(/^\\.\\//, \"\");\n const entry = path.join(jsdomDir, mainRel);\n const req = createRequire(jsdomPkg);\n const mod = req(entry) as { JSDOM: typeof import(\"jsdom\").JSDOM };\n jsdomCtor = mod.JSDOM;\n }\n return jsdomCtor;\n}\n\nexport function createEmptyWebBrowserWorkspaceDom(url: string): JSDOM {\n return new (getJSDOMClass())(\n '<!doctype html><html lang=\"en\"><head><title>New Tab</title></head><body></body></html>',\n {\n pretendToBeVisual: true,\n url,\n },\n );\n}\n\nexport function applyBrowserWorkspaceDomSettings(\n dom: JSDOM,\n state: BrowserWorkspaceRuntimeState,\n): void {\n const viewport = state.settings.viewport;\n if (viewport) {\n Object.defineProperty(dom.window, \"innerWidth\", {\n configurable: true,\n value: viewport.width,\n });\n Object.defineProperty(dom.window, \"innerHeight\", {\n configurable: true,\n value: viewport.height,\n });\n Object.defineProperty(dom.window, \"devicePixelRatio\", {\n configurable: true,\n value: viewport.scale,\n });\n }\n\n Object.defineProperty(dom.window.navigator, \"onLine\", {\n configurable: true,\n get: () => !state.settings.offline,\n });\n\n if (state.settings.device) {\n Object.defineProperty(dom.window.navigator, \"userAgent\", {\n configurable: true,\n value: `ElizaBrowserWorkspace/${state.settings.device}`,\n });\n }\n\n const matchMedia = (query: string) => {\n const matches =\n query.includes(\"prefers-color-scheme\") &&\n ((state.settings.media === \"dark\" && query.includes(\"dark\")) ||\n (state.settings.media === \"light\" && query.includes(\"light\")));\n return {\n addEventListener() {},\n addListener() {},\n dispatchEvent() {\n return true;\n },\n matches,\n media: query,\n onchange: null,\n removeEventListener() {},\n removeListener() {},\n };\n };\n Object.defineProperty(dom.window, \"matchMedia\", {\n configurable: true,\n value: matchMedia,\n });\n\n Object.defineProperty(dom.window.navigator, \"clipboard\", {\n configurable: true,\n value: {\n readText: async () => browserWorkspaceClipboardText,\n writeText: async (value: string) => {\n setBrowserWorkspaceClipboardText(String(value ?? \"\"));\n },\n },\n });\n\n Object.defineProperty(dom.window.navigator, \"geolocation\", {\n configurable: true,\n value: {\n getCurrentPosition: (success: (position: unknown) => void) => {\n const coords = state.settings.geo ?? { latitude: 0, longitude: 0 };\n success({\n coords: {\n accuracy: 1,\n latitude: coords.latitude,\n longitude: coords.longitude,\n },\n timestamp: Date.now(),\n });\n },\n },\n });\n}\n\nexport function installBrowserWorkspaceWebRuntime(\n tab: WebBrowserWorkspaceTabState,\n dom: JSDOM,\n): void {\n const state = getBrowserWorkspaceRuntimeState(\"web\", tab.id);\n applyBrowserWorkspaceDomSettings(dom, state);\n\n Object.defineProperty(dom.window, \"__elizaBrowserWorkspaceState\", {\n value: state,\n writable: true,\n configurable: true,\n });\n\n const consoleTarget = dom.window.console as Console & Record<string, unknown>;\n if (!consoleTarget.__elizaWrapped) {\n for (const level of [\"log\", \"info\", \"warn\", \"error\"] as const) {\n consoleTarget[level] = (...args: unknown[]) => {\n state.consoleEntries.push({\n level,\n message: args\n .map((value) => normalizeBrowserWorkspaceText(value))\n .join(\" \"),\n timestamp: getBrowserWorkspaceTimestamp(),\n });\n return undefined;\n };\n }\n consoleTarget.__elizaWrapped = true;\n }\n\n dom.window.alert = (message?: string) => {\n state.dialog = {\n defaultValue: null,\n message: String(message ?? \"\"),\n open: true,\n type: \"alert\",\n };\n };\n dom.window.confirm = (message?: string) => {\n state.dialog = {\n defaultValue: null,\n message: String(message ?? \"\"),\n open: true,\n type: \"confirm\",\n };\n return false;\n };\n dom.window.prompt = (message?: string, defaultValue?: string) => {\n state.dialog = {\n defaultValue: defaultValue ?? null,\n message: String(message ?? \"\"),\n open: true,\n type: \"prompt\",\n };\n return null;\n };\n\n Object.defineProperty(dom.window, \"fetch\", {\n configurable: true,\n value: async (input: RequestInfo | URL, init?: RequestInit) => {\n const inputUrl =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : typeof (input as Request).url === \"string\"\n ? (input as Request).url\n : String(input);\n return fetchBrowserWorkspaceTrackedResponse(\n state,\n new URL(inputUrl, tab.url).toString(),\n {\n ...init,\n headers:\n init?.headers ??\n ((input as Request).headers\n ? (input as Request).headers\n : undefined),\n method:\n init?.method ??\n (typeof (input as Request).method === \"string\"\n ? (input as Request).method\n : undefined),\n },\n \"fetch\",\n );\n },\n });\n}\n\nexport function ensureBrowserWorkspaceDom(\n tab: WebBrowserWorkspaceTabState,\n): JSDOM {\n if (tab.dom && tab.loadedUrl === tab.url) {\n return tab.dom;\n }\n\n throw new Error(\n `Browser workspace tab ${tab.id} is not loaded yet. Reload or inspect the page first.`,\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BrowserWorkspaceNetworkRequestRecord, BrowserWorkspaceNetworkRoute, BrowserWorkspaceRuntimeState } from "./browser-workspace-types.js";
|
|
2
|
+
export declare function browserWorkspacePatternMatches(pattern: string, value: string): boolean;
|
|
3
|
+
export declare function normalizeBrowserWorkspaceHeaders(headers: Record<string, string> | undefined): Record<string, string>;
|
|
4
|
+
export declare function findBrowserWorkspaceNetworkRoute(state: BrowserWorkspaceRuntimeState, url: string): BrowserWorkspaceNetworkRoute | null;
|
|
5
|
+
export declare function recordBrowserWorkspaceNetworkRequest(state: BrowserWorkspaceRuntimeState, request: Omit<BrowserWorkspaceNetworkRequestRecord, "id" | "timestamp">): BrowserWorkspaceNetworkRequestRecord;
|
|
6
|
+
export declare function fetchBrowserWorkspaceTrackedResponse(state: BrowserWorkspaceRuntimeState, url: string, init: RequestInit | undefined, resourceType: string): Promise<Response>;
|
|
7
|
+
//# sourceMappingURL=browser-workspace-network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-workspace-network.d.ts","sourceRoot":"","sources":["../../src/workspace/browser-workspace-network.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,oCAAoC,EACpC,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAwBT;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,4BAA4B,EACnC,GAAG,EAAE,MAAM,GACV,4BAA4B,GAAG,IAAI,CAOrC;AAED,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,IAAI,CAAC,oCAAoC,EAAE,IAAI,GAAG,WAAW,CAAC,GACtE,oCAAoC,CAWtC;AAED,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,4BAA4B,EACnC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,YAAK,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,QAAQ,CAAC,CA8FnB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import {
|
|
2
|
+
browserWorkspacePageFetch,
|
|
3
|
+
DEFAULT_TIMEOUT_MS
|
|
4
|
+
} from "./browser-workspace-helpers.js";
|
|
5
|
+
import { getBrowserWorkspaceTimestamp } from "./browser-workspace-state.js";
|
|
6
|
+
function browserWorkspacePatternMatches(pattern, value) {
|
|
7
|
+
const trimmed = pattern.trim();
|
|
8
|
+
if (!trimmed) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (!trimmed.includes("*")) {
|
|
12
|
+
return value.includes(trimmed);
|
|
13
|
+
}
|
|
14
|
+
let wildcardPattern = "";
|
|
15
|
+
for (let index = 0; index < trimmed.length; index += 1) {
|
|
16
|
+
const char = trimmed[index] ?? "";
|
|
17
|
+
if (char === "*") {
|
|
18
|
+
const next = trimmed[index + 1];
|
|
19
|
+
if (next === "*") {
|
|
20
|
+
wildcardPattern += ".*";
|
|
21
|
+
index += 1;
|
|
22
|
+
} else {
|
|
23
|
+
wildcardPattern += ".*";
|
|
24
|
+
}
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
wildcardPattern += char.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
28
|
+
}
|
|
29
|
+
return new RegExp(`^${wildcardPattern}$`, "i").test(value);
|
|
30
|
+
}
|
|
31
|
+
function normalizeBrowserWorkspaceHeaders(headers) {
|
|
32
|
+
if (!headers) {
|
|
33
|
+
return {};
|
|
34
|
+
}
|
|
35
|
+
return Object.fromEntries(
|
|
36
|
+
Object.entries(headers).filter(
|
|
37
|
+
(entry) => typeof entry[0] === "string" && entry[0].trim().length > 0 && typeof entry[1] === "string"
|
|
38
|
+
)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function findBrowserWorkspaceNetworkRoute(state, url) {
|
|
42
|
+
return [...state.networkRoutes].reverse().find((route) => browserWorkspacePatternMatches(route.pattern, url)) ?? null;
|
|
43
|
+
}
|
|
44
|
+
function recordBrowserWorkspaceNetworkRequest(state, request) {
|
|
45
|
+
const entry = {
|
|
46
|
+
...request,
|
|
47
|
+
id: `req_${state.networkNextRequestId++}`,
|
|
48
|
+
timestamp: getBrowserWorkspaceTimestamp()
|
|
49
|
+
};
|
|
50
|
+
state.networkRequests.push(entry);
|
|
51
|
+
if (state.networkHar.active) {
|
|
52
|
+
state.networkHar.entries.push(entry);
|
|
53
|
+
}
|
|
54
|
+
return entry;
|
|
55
|
+
}
|
|
56
|
+
async function fetchBrowserWorkspaceTrackedResponse(state, url, init = {}, resourceType) {
|
|
57
|
+
if (state.settings.offline) {
|
|
58
|
+
recordBrowserWorkspaceNetworkRequest(state, {
|
|
59
|
+
matchedRoute: null,
|
|
60
|
+
method: String(init.method ?? "GET").toUpperCase(),
|
|
61
|
+
resourceType,
|
|
62
|
+
responseBody: null,
|
|
63
|
+
responseHeaders: {},
|
|
64
|
+
status: 0,
|
|
65
|
+
url
|
|
66
|
+
});
|
|
67
|
+
throw new Error("Browser workspace is offline.");
|
|
68
|
+
}
|
|
69
|
+
const route = findBrowserWorkspaceNetworkRoute(state, url);
|
|
70
|
+
if (route?.abort) {
|
|
71
|
+
recordBrowserWorkspaceNetworkRequest(state, {
|
|
72
|
+
matchedRoute: route.pattern,
|
|
73
|
+
method: String(init.method ?? "GET").toUpperCase(),
|
|
74
|
+
resourceType,
|
|
75
|
+
responseBody: null,
|
|
76
|
+
responseHeaders: route.headers,
|
|
77
|
+
status: 0,
|
|
78
|
+
url
|
|
79
|
+
});
|
|
80
|
+
throw new Error(`Browser workspace network route aborted request: ${url}`);
|
|
81
|
+
}
|
|
82
|
+
if (route && (route.body !== null || route.status !== null || Object.keys(route.headers).length > 0)) {
|
|
83
|
+
const response2 = new Response(route?.body ?? "", {
|
|
84
|
+
headers: route?.headers,
|
|
85
|
+
status: route?.status ?? 200
|
|
86
|
+
});
|
|
87
|
+
recordBrowserWorkspaceNetworkRequest(state, {
|
|
88
|
+
matchedRoute: route?.pattern ?? null,
|
|
89
|
+
method: String(init.method ?? "GET").toUpperCase(),
|
|
90
|
+
resourceType,
|
|
91
|
+
responseBody: route?.body ?? "",
|
|
92
|
+
responseHeaders: route?.headers ?? {},
|
|
93
|
+
status: route?.status ?? 200,
|
|
94
|
+
url
|
|
95
|
+
});
|
|
96
|
+
return response2;
|
|
97
|
+
}
|
|
98
|
+
const headers = new Headers(init.headers ?? {});
|
|
99
|
+
for (const [key, value] of Object.entries(state.settings.headers)) {
|
|
100
|
+
if (!headers.has(key)) {
|
|
101
|
+
headers.set(key, value);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (state.settings.credentials && !headers.has("Authorization") && state.settings.credentials.username) {
|
|
105
|
+
headers.set(
|
|
106
|
+
"Authorization",
|
|
107
|
+
`Basic ${Buffer.from(
|
|
108
|
+
`${state.settings.credentials.username}:${state.settings.credentials.password}`
|
|
109
|
+
).toString("base64")}`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const response = await browserWorkspacePageFetch(url, {
|
|
113
|
+
...init,
|
|
114
|
+
headers,
|
|
115
|
+
redirect: init.redirect ?? "follow",
|
|
116
|
+
signal: init.signal ?? AbortSignal.timeout(DEFAULT_TIMEOUT_MS)
|
|
117
|
+
});
|
|
118
|
+
let responseBody = null;
|
|
119
|
+
if (resourceType !== "document") {
|
|
120
|
+
const clone = response.clone();
|
|
121
|
+
try {
|
|
122
|
+
responseBody = await clone.text();
|
|
123
|
+
} catch {
|
|
124
|
+
responseBody = null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
recordBrowserWorkspaceNetworkRequest(state, {
|
|
128
|
+
matchedRoute: null,
|
|
129
|
+
method: String(init.method ?? "GET").toUpperCase(),
|
|
130
|
+
resourceType,
|
|
131
|
+
responseBody,
|
|
132
|
+
responseHeaders: Object.fromEntries(response.headers.entries()),
|
|
133
|
+
status: response.status,
|
|
134
|
+
url: response.url || url
|
|
135
|
+
});
|
|
136
|
+
return response;
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
browserWorkspacePatternMatches,
|
|
140
|
+
fetchBrowserWorkspaceTrackedResponse,
|
|
141
|
+
findBrowserWorkspaceNetworkRoute,
|
|
142
|
+
normalizeBrowserWorkspaceHeaders,
|
|
143
|
+
recordBrowserWorkspaceNetworkRequest
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=browser-workspace-network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/workspace/browser-workspace-network.ts"],"sourcesContent":["import {\n browserWorkspacePageFetch,\n DEFAULT_TIMEOUT_MS,\n} from \"./browser-workspace-helpers.js\";\nimport { getBrowserWorkspaceTimestamp } from \"./browser-workspace-state.js\";\nimport type {\n BrowserWorkspaceNetworkRequestRecord,\n BrowserWorkspaceNetworkRoute,\n BrowserWorkspaceRuntimeState,\n} from \"./browser-workspace-types.js\";\n\nexport function browserWorkspacePatternMatches(\n pattern: string,\n value: string,\n): boolean {\n const trimmed = pattern.trim();\n if (!trimmed) {\n return false;\n }\n if (!trimmed.includes(\"*\")) {\n return value.includes(trimmed);\n }\n let wildcardPattern = \"\";\n for (let index = 0; index < trimmed.length; index += 1) {\n const char = trimmed[index] ?? \"\";\n if (char === \"*\") {\n const next = trimmed[index + 1];\n if (next === \"*\") {\n wildcardPattern += \".*\";\n index += 1;\n } else {\n wildcardPattern += \".*\";\n }\n continue;\n }\n wildcardPattern += char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n }\n return new RegExp(`^${wildcardPattern}$`, \"i\").test(value);\n}\n\nexport function normalizeBrowserWorkspaceHeaders(\n headers: Record<string, string> | undefined,\n): Record<string, string> {\n if (!headers) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(headers).filter(\n (entry): entry is [string, string] =>\n typeof entry[0] === \"string\" &&\n entry[0].trim().length > 0 &&\n typeof entry[1] === \"string\",\n ),\n );\n}\n\nexport function findBrowserWorkspaceNetworkRoute(\n state: BrowserWorkspaceRuntimeState,\n url: string,\n): BrowserWorkspaceNetworkRoute | null {\n return (\n [...state.networkRoutes]\n .reverse()\n .find((route) => browserWorkspacePatternMatches(route.pattern, url)) ??\n null\n );\n}\n\nexport function recordBrowserWorkspaceNetworkRequest(\n state: BrowserWorkspaceRuntimeState,\n request: Omit<BrowserWorkspaceNetworkRequestRecord, \"id\" | \"timestamp\">,\n): BrowserWorkspaceNetworkRequestRecord {\n const entry: BrowserWorkspaceNetworkRequestRecord = {\n ...request,\n id: `req_${state.networkNextRequestId++}`,\n timestamp: getBrowserWorkspaceTimestamp(),\n };\n state.networkRequests.push(entry);\n if (state.networkHar.active) {\n state.networkHar.entries.push(entry);\n }\n return entry;\n}\n\nexport async function fetchBrowserWorkspaceTrackedResponse(\n state: BrowserWorkspaceRuntimeState,\n url: string,\n init: RequestInit = {},\n resourceType: string,\n): Promise<Response> {\n if (state.settings.offline) {\n recordBrowserWorkspaceNetworkRequest(state, {\n matchedRoute: null,\n method: String(init.method ?? \"GET\").toUpperCase(),\n resourceType,\n responseBody: null,\n responseHeaders: {},\n status: 0,\n url,\n });\n throw new Error(\"Browser workspace is offline.\");\n }\n\n const route = findBrowserWorkspaceNetworkRoute(state, url);\n if (route?.abort) {\n recordBrowserWorkspaceNetworkRequest(state, {\n matchedRoute: route.pattern,\n method: String(init.method ?? \"GET\").toUpperCase(),\n resourceType,\n responseBody: null,\n responseHeaders: route.headers,\n status: 0,\n url,\n });\n throw new Error(`Browser workspace network route aborted request: ${url}`);\n }\n\n if (\n route &&\n (route.body !== null ||\n route.status !== null ||\n Object.keys(route.headers).length > 0)\n ) {\n const response = new Response(route?.body ?? \"\", {\n headers: route?.headers,\n status: route?.status ?? 200,\n });\n recordBrowserWorkspaceNetworkRequest(state, {\n matchedRoute: route?.pattern ?? null,\n method: String(init.method ?? \"GET\").toUpperCase(),\n resourceType,\n responseBody: route?.body ?? \"\",\n responseHeaders: route?.headers ?? {},\n status: route?.status ?? 200,\n url,\n });\n return response;\n }\n\n const headers = new Headers(init.headers ?? {});\n for (const [key, value] of Object.entries(state.settings.headers)) {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n if (\n state.settings.credentials &&\n !headers.has(\"Authorization\") &&\n state.settings.credentials.username\n ) {\n headers.set(\n \"Authorization\",\n `Basic ${Buffer.from(\n `${state.settings.credentials.username}:${state.settings.credentials.password}`,\n ).toString(\"base64\")}`,\n );\n }\n\n const response = await browserWorkspacePageFetch(url, {\n ...init,\n headers,\n redirect: init.redirect ?? \"follow\",\n signal: init.signal ?? AbortSignal.timeout(DEFAULT_TIMEOUT_MS),\n });\n let responseBody: string | null = null;\n if (resourceType !== \"document\") {\n const clone = response.clone();\n try {\n responseBody = await clone.text();\n } catch {\n responseBody = null;\n }\n }\n recordBrowserWorkspaceNetworkRequest(state, {\n matchedRoute: null,\n method: String(init.method ?? \"GET\").toUpperCase(),\n resourceType,\n responseBody,\n responseHeaders: Object.fromEntries(response.headers.entries()),\n status: response.status,\n url: response.url || url,\n });\n return response;\n}\n"],"mappings":"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","names":["response"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BrowserWorkspaceSnapshotRecord } from "./browser-workspace-types.js";
|
|
2
|
+
export declare function escapeBrowserWorkspacePdfText(value: string): string;
|
|
3
|
+
export declare function createBrowserWorkspacePdfBuffer(title: string, bodyText: string): Buffer;
|
|
4
|
+
export declare function createBrowserWorkspaceSyntheticScreenshotData(title: string, url: string, bodyText: string, viewport?: {
|
|
5
|
+
height: number;
|
|
6
|
+
width: number;
|
|
7
|
+
}): string;
|
|
8
|
+
export declare function createBrowserWorkspaceSnapshotRecord(title: string, url: string, bodyText: string): BrowserWorkspaceSnapshotRecord;
|
|
9
|
+
export declare function buildBrowserWorkspaceDocumentSnapshotText(document: Document): string;
|
|
10
|
+
export declare function diffBrowserWorkspaceSnapshots(before: BrowserWorkspaceSnapshotRecord | null, after: BrowserWorkspaceSnapshotRecord): Record<string, unknown>;
|
|
11
|
+
export declare function readBrowserWorkspaceStorage(storage: Storage): Record<string, string>;
|
|
12
|
+
export declare function readBrowserWorkspaceCookies(document: Document): Record<string, string>;
|
|
13
|
+
export declare function applyBrowserWorkspaceStateToWebDocument(document: Document, snapshot: Record<string, unknown>): void;
|
|
14
|
+
//# sourceMappingURL=browser-workspace-snapshots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-workspace-snapshots.d.ts","sourceRoot":"","sources":["../../src/workspace/browser-workspace-snapshots.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAEnF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,MAAM,CAmCR;AAED,wBAAgB,6CAA6C,CAC3D,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C,MAAM,CAqBR;AAED,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,8BAA8B,CAMhC;AAED,wBAAgB,yCAAyC,CACvD,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAqBR;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,8BAA8B,GAAG,IAAI,EAC7C,KAAK,EAAE,8BAA8B,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB;AAED,wBAAgB,uCAAuC,CACrD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAyBN"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { normalizeBrowserWorkspaceText } from "./browser-workspace-helpers.js";
|
|
2
|
+
function escapeBrowserWorkspacePdfText(value) {
|
|
3
|
+
return value.replaceAll("\\", "\\\\").replaceAll("(", "\\(").replaceAll(")", "\\)");
|
|
4
|
+
}
|
|
5
|
+
function createBrowserWorkspacePdfBuffer(title, bodyText) {
|
|
6
|
+
const lines = [
|
|
7
|
+
title.trim() || "Eliza Browser Workspace",
|
|
8
|
+
"",
|
|
9
|
+
...bodyText.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).slice(0, 32)
|
|
10
|
+
];
|
|
11
|
+
const contentLines = lines.map((line, index) => {
|
|
12
|
+
const offset = index === 0 ? "50 750 Td" : "0 -18 Td";
|
|
13
|
+
return `${offset} (${escapeBrowserWorkspacePdfText(line)}) Tj`;
|
|
14
|
+
});
|
|
15
|
+
const stream = `BT
|
|
16
|
+
/F1 12 Tf
|
|
17
|
+
${contentLines.join("\n")}
|
|
18
|
+
ET`;
|
|
19
|
+
const objects = [
|
|
20
|
+
"<< /Type /Catalog /Pages 2 0 R >>",
|
|
21
|
+
"<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
|
|
22
|
+
"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>",
|
|
23
|
+
`<< /Length ${Buffer.byteLength(stream, "utf8")} >>
|
|
24
|
+
stream
|
|
25
|
+
${stream}
|
|
26
|
+
endstream`,
|
|
27
|
+
"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>"
|
|
28
|
+
];
|
|
29
|
+
let pdf = "%PDF-1.4\n";
|
|
30
|
+
const offsets = [0];
|
|
31
|
+
for (let index = 0; index < objects.length; index += 1) {
|
|
32
|
+
offsets.push(Buffer.byteLength(pdf, "utf8"));
|
|
33
|
+
pdf += `${index + 1} 0 obj
|
|
34
|
+
${objects[index]}
|
|
35
|
+
endobj
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
const xrefOffset = Buffer.byteLength(pdf, "utf8");
|
|
39
|
+
pdf += `xref
|
|
40
|
+
0 ${objects.length + 1}
|
|
41
|
+
0000000000 65535 f
|
|
42
|
+
`;
|
|
43
|
+
for (let index = 1; index < offsets.length; index += 1) {
|
|
44
|
+
pdf += `${String(offsets[index]).padStart(10, "0")} 00000 n
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
pdf += `trailer
|
|
48
|
+
<< /Size ${objects.length + 1} /Root 1 0 R >>
|
|
49
|
+
startxref
|
|
50
|
+
${xrefOffset}
|
|
51
|
+
%%EOF`;
|
|
52
|
+
return Buffer.from(pdf, "utf8");
|
|
53
|
+
}
|
|
54
|
+
function createBrowserWorkspaceSyntheticScreenshotData(title, url, bodyText, viewport) {
|
|
55
|
+
const width = viewport?.width ?? 1280;
|
|
56
|
+
const height = viewport?.height ?? 720;
|
|
57
|
+
const lines = [
|
|
58
|
+
title || "Eliza Browser Workspace",
|
|
59
|
+
url,
|
|
60
|
+
"",
|
|
61
|
+
...bodyText.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).slice(0, 18)
|
|
62
|
+
];
|
|
63
|
+
const escapedLines = lines.map(
|
|
64
|
+
(line) => line.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">")
|
|
65
|
+
);
|
|
66
|
+
const svg = `<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}"><rect width="100%" height="100%" fill="#faf7f1"/><rect x="24" y="24" width="${width - 48}" height="${height - 48}" rx="18" fill="#ffffff" stroke="#d8d1c4"/><text x="48" y="72" font-family="Menlo, Monaco, monospace" font-size="20" fill="#111111">${escapedLines.map((line, index) => `<tspan x="48" dy="${index === 0 ? 0 : 28}">${line}</tspan>`).join("")}</text></svg>`;
|
|
67
|
+
return Buffer.from(svg, "utf8").toString("base64");
|
|
68
|
+
}
|
|
69
|
+
function createBrowserWorkspaceSnapshotRecord(title, url, bodyText) {
|
|
70
|
+
return {
|
|
71
|
+
bodyText: normalizeBrowserWorkspaceText(bodyText),
|
|
72
|
+
title: normalizeBrowserWorkspaceText(title),
|
|
73
|
+
url: normalizeBrowserWorkspaceText(url)
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function buildBrowserWorkspaceDocumentSnapshotText(document) {
|
|
77
|
+
const bodyText = normalizeBrowserWorkspaceText(document.body?.textContent);
|
|
78
|
+
const controlText = Array.from(
|
|
79
|
+
document.querySelectorAll("input, textarea, select, option:checked")
|
|
80
|
+
).map((element) => {
|
|
81
|
+
const name = element.getAttribute("name") || element.getAttribute("id") || element.tagName.toLowerCase();
|
|
82
|
+
const value = element.tagName === "SELECT" ? element.value : "value" in element ? element.value : element.textContent ?? "";
|
|
83
|
+
return `${name}:${normalizeBrowserWorkspaceText(value)}`;
|
|
84
|
+
}).filter(Boolean).join(" ");
|
|
85
|
+
return normalizeBrowserWorkspaceText(`${bodyText} ${controlText}`);
|
|
86
|
+
}
|
|
87
|
+
function diffBrowserWorkspaceSnapshots(before, after) {
|
|
88
|
+
return {
|
|
89
|
+
changed: !before || before.bodyText !== after.bodyText || before.title !== after.title || before.url !== after.url,
|
|
90
|
+
previous: before,
|
|
91
|
+
current: after
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function readBrowserWorkspaceStorage(storage) {
|
|
95
|
+
const entries = {};
|
|
96
|
+
for (let index = 0; index < storage.length; index += 1) {
|
|
97
|
+
const key = storage.key(index);
|
|
98
|
+
if (!key) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
entries[key] = storage.getItem(key) ?? "";
|
|
102
|
+
}
|
|
103
|
+
return entries;
|
|
104
|
+
}
|
|
105
|
+
function readBrowserWorkspaceCookies(document) {
|
|
106
|
+
const cookieString = document.cookie || "";
|
|
107
|
+
if (!cookieString.trim()) {
|
|
108
|
+
return {};
|
|
109
|
+
}
|
|
110
|
+
return Object.fromEntries(
|
|
111
|
+
cookieString.split(/;\s*/).map((entry) => {
|
|
112
|
+
const [name, ...rest] = entry.split("=");
|
|
113
|
+
return [name ?? "", rest.join("=")];
|
|
114
|
+
}).filter((entry) => entry[0].trim().length > 0)
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
function applyBrowserWorkspaceStateToWebDocument(document, snapshot) {
|
|
118
|
+
const localEntries = snapshot.localStorage && typeof snapshot.localStorage === "object" ? snapshot.localStorage : {};
|
|
119
|
+
const sessionEntries = snapshot.sessionStorage && typeof snapshot.sessionStorage === "object" ? snapshot.sessionStorage : {};
|
|
120
|
+
const cookies = snapshot.cookies && typeof snapshot.cookies === "object" ? snapshot.cookies : {};
|
|
121
|
+
document.defaultView?.localStorage.clear();
|
|
122
|
+
for (const [key, value] of Object.entries(localEntries)) {
|
|
123
|
+
document.defaultView?.localStorage.setItem(key, String(value ?? ""));
|
|
124
|
+
}
|
|
125
|
+
document.defaultView?.sessionStorage.clear();
|
|
126
|
+
for (const [key, value] of Object.entries(sessionEntries)) {
|
|
127
|
+
document.defaultView?.sessionStorage.setItem(key, String(value ?? ""));
|
|
128
|
+
}
|
|
129
|
+
for (const [key, value] of Object.entries(cookies)) {
|
|
130
|
+
document.cookie = `${key}=${String(value ?? "")}; path=/`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
applyBrowserWorkspaceStateToWebDocument,
|
|
135
|
+
buildBrowserWorkspaceDocumentSnapshotText,
|
|
136
|
+
createBrowserWorkspacePdfBuffer,
|
|
137
|
+
createBrowserWorkspaceSnapshotRecord,
|
|
138
|
+
createBrowserWorkspaceSyntheticScreenshotData,
|
|
139
|
+
diffBrowserWorkspaceSnapshots,
|
|
140
|
+
escapeBrowserWorkspacePdfText,
|
|
141
|
+
readBrowserWorkspaceCookies,
|
|
142
|
+
readBrowserWorkspaceStorage
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=browser-workspace-snapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/workspace/browser-workspace-snapshots.ts"],"sourcesContent":["import { normalizeBrowserWorkspaceText } from \"./browser-workspace-helpers.js\";\nimport type { BrowserWorkspaceSnapshotRecord } from \"./browser-workspace-types.js\";\n\nexport function escapeBrowserWorkspacePdfText(value: string): string {\n return value\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"(\", \"\\\\(\")\n .replaceAll(\")\", \"\\\\)\");\n}\n\nexport function createBrowserWorkspacePdfBuffer(\n title: string,\n bodyText: string,\n): Buffer {\n const lines = [\n title.trim() || \"Eliza Browser Workspace\",\n \"\",\n ...bodyText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .slice(0, 32),\n ];\n const contentLines = lines.map((line, index) => {\n const offset = index === 0 ? \"50 750 Td\" : \"0 -18 Td\";\n return `${offset} (${escapeBrowserWorkspacePdfText(line)}) Tj`;\n });\n const stream = `BT\\n/F1 12 Tf\\n${contentLines.join(\"\\n\")}\\nET`;\n const objects = [\n \"<< /Type /Catalog /Pages 2 0 R >>\",\n \"<< /Type /Pages /Kids [3 0 R] /Count 1 >>\",\n \"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>\",\n `<< /Length ${Buffer.byteLength(stream, \"utf8\")} >>\\nstream\\n${stream}\\nendstream`,\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n ];\n let pdf = \"%PDF-1.4\\n\";\n const offsets = [0];\n for (let index = 0; index < objects.length; index += 1) {\n offsets.push(Buffer.byteLength(pdf, \"utf8\"));\n pdf += `${index + 1} 0 obj\\n${objects[index]}\\nendobj\\n`;\n }\n const xrefOffset = Buffer.byteLength(pdf, \"utf8\");\n pdf += `xref\\n0 ${objects.length + 1}\\n0000000000 65535 f \\n`;\n for (let index = 1; index < offsets.length; index += 1) {\n pdf += `${String(offsets[index]).padStart(10, \"0\")} 00000 n \\n`;\n }\n pdf += `trailer\\n<< /Size ${objects.length + 1} /Root 1 0 R >>\\nstartxref\\n${xrefOffset}\\n%%EOF`;\n return Buffer.from(pdf, \"utf8\");\n}\n\nexport function createBrowserWorkspaceSyntheticScreenshotData(\n title: string,\n url: string,\n bodyText: string,\n viewport?: { height: number; width: number },\n): string {\n const width = viewport?.width ?? 1280;\n const height = viewport?.height ?? 720;\n const lines = [\n title || \"Eliza Browser Workspace\",\n url,\n \"\",\n ...bodyText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .slice(0, 18),\n ];\n const escapedLines = lines.map((line) =>\n line\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\"),\n );\n const svg = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\"><rect width=\"100%\" height=\"100%\" fill=\"#faf7f1\"/><rect x=\"24\" y=\"24\" width=\"${width - 48}\" height=\"${height - 48}\" rx=\"18\" fill=\"#ffffff\" stroke=\"#d8d1c4\"/><text x=\"48\" y=\"72\" font-family=\"Menlo, Monaco, monospace\" font-size=\"20\" fill=\"#111111\">${escapedLines.map((line, index) => `<tspan x=\"48\" dy=\"${index === 0 ? 0 : 28}\">${line}</tspan>`).join(\"\")}</text></svg>`;\n return Buffer.from(svg, \"utf8\").toString(\"base64\");\n}\n\nexport function createBrowserWorkspaceSnapshotRecord(\n title: string,\n url: string,\n bodyText: string,\n): BrowserWorkspaceSnapshotRecord {\n return {\n bodyText: normalizeBrowserWorkspaceText(bodyText),\n title: normalizeBrowserWorkspaceText(title),\n url: normalizeBrowserWorkspaceText(url),\n };\n}\n\nexport function buildBrowserWorkspaceDocumentSnapshotText(\n document: Document,\n): string {\n const bodyText = normalizeBrowserWorkspaceText(document.body?.textContent);\n const controlText = Array.from(\n document.querySelectorAll(\"input, textarea, select, option:checked\"),\n )\n .map((element) => {\n const name =\n element.getAttribute(\"name\") ||\n element.getAttribute(\"id\") ||\n element.tagName.toLowerCase();\n const value =\n element.tagName === \"SELECT\"\n ? (element as HTMLSelectElement).value\n : \"value\" in (element as HTMLInputElement | HTMLTextAreaElement)\n ? (element as HTMLInputElement | HTMLTextAreaElement).value\n : (element.textContent ?? \"\");\n return `${name}:${normalizeBrowserWorkspaceText(value)}`;\n })\n .filter(Boolean)\n .join(\" \");\n return normalizeBrowserWorkspaceText(`${bodyText} ${controlText}`);\n}\n\nexport function diffBrowserWorkspaceSnapshots(\n before: BrowserWorkspaceSnapshotRecord | null,\n after: BrowserWorkspaceSnapshotRecord,\n): Record<string, unknown> {\n return {\n changed:\n !before ||\n before.bodyText !== after.bodyText ||\n before.title !== after.title ||\n before.url !== after.url,\n previous: before,\n current: after,\n };\n}\n\nexport function readBrowserWorkspaceStorage(\n storage: Storage,\n): Record<string, string> {\n const entries: Record<string, string> = {};\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index);\n if (!key) {\n continue;\n }\n entries[key] = storage.getItem(key) ?? \"\";\n }\n return entries;\n}\n\nexport function readBrowserWorkspaceCookies(\n document: Document,\n): Record<string, string> {\n const cookieString = document.cookie || \"\";\n if (!cookieString.trim()) {\n return {};\n }\n return Object.fromEntries(\n cookieString\n .split(/;\\s*/)\n .map((entry) => {\n const [name, ...rest] = entry.split(\"=\");\n return [name ?? \"\", rest.join(\"=\")] as const;\n })\n .filter((entry) => entry[0].trim().length > 0),\n );\n}\n\nexport function applyBrowserWorkspaceStateToWebDocument(\n document: Document,\n snapshot: Record<string, unknown>,\n): void {\n const localEntries =\n snapshot.localStorage && typeof snapshot.localStorage === \"object\"\n ? (snapshot.localStorage as Record<string, unknown>)\n : {};\n const sessionEntries =\n snapshot.sessionStorage && typeof snapshot.sessionStorage === \"object\"\n ? (snapshot.sessionStorage as Record<string, unknown>)\n : {};\n const cookies =\n snapshot.cookies && typeof snapshot.cookies === \"object\"\n ? (snapshot.cookies as Record<string, unknown>)\n : {};\n\n document.defaultView?.localStorage.clear();\n for (const [key, value] of Object.entries(localEntries)) {\n document.defaultView?.localStorage.setItem(key, String(value ?? \"\"));\n }\n document.defaultView?.sessionStorage.clear();\n for (const [key, value] of Object.entries(sessionEntries)) {\n document.defaultView?.sessionStorage.setItem(key, String(value ?? \"\"));\n }\n for (const [key, value] of Object.entries(cookies)) {\n document.cookie = `${key}=${String(value ?? \"\")}; path=/`;\n }\n}\n"],"mappings":"AAAA,SAAS,qCAAqC;AAGvC,SAAS,8BAA8B,OAAuB;AACnE,SAAO,MACJ,WAAW,MAAM,MAAM,EACvB,WAAW,KAAK,KAAK,EACrB,WAAW,KAAK,KAAK;AAC1B;AAEO,SAAS,gCACd,OACA,UACQ;AACR,QAAM,QAAQ;AAAA,IACZ,MAAM,KAAK,KAAK;AAAA,IAChB;AAAA,IACA,GAAG,SACA,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,MAAM,GAAG,EAAE;AAAA,EAChB;AACA,QAAM,eAAe,MAAM,IAAI,CAAC,MAAM,UAAU;AAC9C,UAAM,SAAS,UAAU,IAAI,cAAc;AAC3C,WAAO,GAAG,MAAM,KAAK,8BAA8B,IAAI,CAAC;AAAA,EAC1D,CAAC;AACD,QAAM,SAAS;AAAA;AAAA,EAAkB,aAAa,KAAK,IAAI,CAAC;AAAA;AACxD,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,OAAO,WAAW,QAAQ,MAAM,CAAC;AAAA;AAAA,EAAgB,MAAM;AAAA;AAAA,IACrE;AAAA,EACF;AACA,MAAI,MAAM;AACV,QAAM,UAAU,CAAC,CAAC;AAClB,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,YAAQ,KAAK,OAAO,WAAW,KAAK,MAAM,CAAC;AAC3C,WAAO,GAAG,QAAQ,CAAC;AAAA,EAAW,QAAQ,KAAK,CAAC;AAAA;AAAA;AAAA,EAC9C;AACA,QAAM,aAAa,OAAO,WAAW,KAAK,MAAM;AAChD,SAAO;AAAA,IAAW,QAAQ,SAAS,CAAC;AAAA;AAAA;AACpC,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,WAAO,GAAG,OAAO,QAAQ,KAAK,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC;AAAA;AAAA,EACpD;AACA,SAAO;AAAA,WAAqB,QAAQ,SAAS,CAAC;AAAA;AAAA,EAA+B,UAAU;AAAA;AACvF,SAAO,OAAO,KAAK,KAAK,MAAM;AAChC;AAEO,SAAS,8CACd,OACA,KACA,UACA,UACQ;AACR,QAAM,QAAQ,UAAU,SAAS;AACjC,QAAM,SAAS,UAAU,UAAU;AACnC,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAG,SACA,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,MAAM,GAAG,EAAE;AAAA,EAChB;AACA,QAAM,eAAe,MAAM;AAAA,IAAI,CAAC,SAC9B,KACG,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM;AAAA,EAC3B;AACA,QAAM,MAAM,wFAAwF,KAAK,aAAa,MAAM,iFAAiF,QAAQ,EAAE,aAAa,SAAS,EAAE,uIAAuI,aAAa,IAAI,CAAC,MAAM,UAAU,qBAAqB,UAAU,IAAI,IAAI,EAAE,KAAK,IAAI,UAAU,EAAE,KAAK,EAAE,CAAC;AAC9d,SAAO,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,QAAQ;AACnD;AAEO,SAAS,qCACd,OACA,KACA,UACgC;AAChC,SAAO;AAAA,IACL,UAAU,8BAA8B,QAAQ;AAAA,IAChD,OAAO,8BAA8B,KAAK;AAAA,IAC1C,KAAK,8BAA8B,GAAG;AAAA,EACxC;AACF;AAEO,SAAS,0CACd,UACQ;AACR,QAAM,WAAW,8BAA8B,SAAS,MAAM,WAAW;AACzE,QAAM,cAAc,MAAM;AAAA,IACxB,SAAS,iBAAiB,yCAAyC;AAAA,EACrE,EACG,IAAI,CAAC,YAAY;AAChB,UAAM,OACJ,QAAQ,aAAa,MAAM,KAC3B,QAAQ,aAAa,IAAI,KACzB,QAAQ,QAAQ,YAAY;AAC9B,UAAM,QACJ,QAAQ,YAAY,WACf,QAA8B,QAC/B,WAAY,UACT,QAAmD,QACnD,QAAQ,eAAe;AAChC,WAAO,GAAG,IAAI,IAAI,8BAA8B,KAAK,CAAC;AAAA,EACxD,CAAC,EACA,OAAO,OAAO,EACd,KAAK,GAAG;AACX,SAAO,8BAA8B,GAAG,QAAQ,IAAI,WAAW,EAAE;AACnE;AAEO,SAAS,8BACd,QACA,OACyB;AACzB,SAAO;AAAA,IACL,SACE,CAAC,UACD,OAAO,aAAa,MAAM,YAC1B,OAAO,UAAU,MAAM,SACvB,OAAO,QAAQ,MAAM;AAAA,IACvB,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AACF;AAEO,SAAS,4BACd,SACwB;AACxB,QAAM,UAAkC,CAAC;AACzC,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,MAAM,QAAQ,IAAI,KAAK;AAC7B,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,YAAQ,GAAG,IAAI,QAAQ,QAAQ,GAAG,KAAK;AAAA,EACzC;AACA,SAAO;AACT;AAEO,SAAS,4BACd,UACwB;AACxB,QAAM,eAAe,SAAS,UAAU;AACxC,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO;AAAA,IACZ,aACG,MAAM,MAAM,EACZ,IAAI,CAAC,UAAU;AACd,YAAM,CAAC,MAAM,GAAG,IAAI,IAAI,MAAM,MAAM,GAAG;AACvC,aAAO,CAAC,QAAQ,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,IACpC,CAAC,EACA,OAAO,CAAC,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC;AAAA,EACjD;AACF;AAEO,SAAS,wCACd,UACA,UACM;AACN,QAAM,eACJ,SAAS,gBAAgB,OAAO,SAAS,iBAAiB,WACrD,SAAS,eACV,CAAC;AACP,QAAM,iBACJ,SAAS,kBAAkB,OAAO,SAAS,mBAAmB,WACzD,SAAS,iBACV,CAAC;AACP,QAAM,UACJ,SAAS,WAAW,OAAO,SAAS,YAAY,WAC3C,SAAS,UACV,CAAC;AAEP,WAAS,aAAa,aAAa,MAAM;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,aAAS,aAAa,aAAa,QAAQ,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,EACrE;AACA,WAAS,aAAa,eAAe,MAAM;AAC3C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,aAAS,aAAa,eAAe,QAAQ,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,EACvE;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,aAAS,SAAS,GAAG,GAAG,IAAI,OAAO,SAAS,EAAE,CAAC;AAAA,EACjD;AACF;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BrowserWorkspaceDomElementSummary, BrowserWorkspaceMode, BrowserWorkspaceRuntimeState, WebBrowserWorkspaceTabState } from "./browser-workspace-types.js";
|
|
2
|
+
export declare const webWorkspaceState: {
|
|
3
|
+
nextId: number;
|
|
4
|
+
tabs: WebBrowserWorkspaceTabState[];
|
|
5
|
+
};
|
|
6
|
+
export declare const browserWorkspaceElementRefs: Map<string, Map<string, string>>;
|
|
7
|
+
export declare const browserWorkspaceRuntimeState: Map<string, BrowserWorkspaceRuntimeState>;
|
|
8
|
+
export declare let browserWorkspaceClipboardText: string;
|
|
9
|
+
export declare function setBrowserWorkspaceClipboardText(value: string): void;
|
|
10
|
+
export declare function withWebStateLock<T>(fn: () => T | Promise<T>): Promise<T>;
|
|
11
|
+
export declare function resetWebStateLock(): void;
|
|
12
|
+
export declare function createBrowserWorkspaceRuntimeState(): BrowserWorkspaceRuntimeState;
|
|
13
|
+
export declare function getBrowserWorkspaceRuntimeState(mode: BrowserWorkspaceMode, tabId: string): BrowserWorkspaceRuntimeState;
|
|
14
|
+
export declare function clearBrowserWorkspaceRuntimeState(mode: BrowserWorkspaceMode, tabId: string): void;
|
|
15
|
+
export declare function resetBrowserWorkspaceRuntimeNavigationState(state: BrowserWorkspaceRuntimeState): void;
|
|
16
|
+
export declare function clearBrowserWorkspaceElementRefs(mode: BrowserWorkspaceMode, tabId: string): void;
|
|
17
|
+
export declare function registerBrowserWorkspaceElementRefs(mode: BrowserWorkspaceMode, tabId: string, elements: BrowserWorkspaceDomElementSummary[]): BrowserWorkspaceDomElementSummary[];
|
|
18
|
+
export declare function resolveBrowserWorkspaceElementRef(mode: BrowserWorkspaceMode, tabId: string, ref: string): string | null;
|
|
19
|
+
export declare function appendBrowserWorkspaceTraceEntry(state: BrowserWorkspaceRuntimeState, entry: Record<string, unknown>): void;
|
|
20
|
+
export declare function appendBrowserWorkspaceProfilerEntry(state: BrowserWorkspaceRuntimeState, entry: Record<string, unknown>): void;
|
|
21
|
+
export declare function getBrowserWorkspaceTimestamp(): string;
|
|
22
|
+
/** @internal - test-only reset */
|
|
23
|
+
export declare function __resetBrowserWorkspaceStateForTests(): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=browser-workspace-state.d.ts.map
|