@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,571 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
const pluginSrcDir = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const elizaRoot = path.resolve(pluginSrcDir, "../../../");
|
|
7
|
+
const outerRepoRoot = path.resolve(elizaRoot, "../");
|
|
8
|
+
function uniquePaths(paths) {
|
|
9
|
+
return [...new Set(paths.map((candidate) => path.resolve(candidate)))];
|
|
10
|
+
}
|
|
11
|
+
function ancestorPaths(start) {
|
|
12
|
+
const ancestors = [];
|
|
13
|
+
let current = path.resolve(start);
|
|
14
|
+
while (true) {
|
|
15
|
+
ancestors.push(current);
|
|
16
|
+
const parent = path.dirname(current);
|
|
17
|
+
if (parent === current) {
|
|
18
|
+
return ancestors;
|
|
19
|
+
}
|
|
20
|
+
current = parent;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const workspaceRootCandidates = uniquePaths([
|
|
24
|
+
process.cwd(),
|
|
25
|
+
outerRepoRoot,
|
|
26
|
+
elizaRoot,
|
|
27
|
+
...ancestorPaths(pluginSrcDir),
|
|
28
|
+
...ancestorPaths(process.cwd())
|
|
29
|
+
]);
|
|
30
|
+
const extensionRootCandidates = workspaceRootCandidates.flatMap((root) => [
|
|
31
|
+
path.join(root, "packages", "browser-bridge-extension"),
|
|
32
|
+
path.join(root, "eliza", "packages", "browser-bridge-extension"),
|
|
33
|
+
path.join(root, "eliza", "apps", "browser-bridge"),
|
|
34
|
+
path.join(root, "apps", "browser-bridge"),
|
|
35
|
+
path.join(root, "apps", "app-lifeops", "extensions", "lifeops-browser"),
|
|
36
|
+
path.join(
|
|
37
|
+
root,
|
|
38
|
+
"eliza",
|
|
39
|
+
"apps",
|
|
40
|
+
"app-lifeops",
|
|
41
|
+
"extensions",
|
|
42
|
+
"lifeops-browser"
|
|
43
|
+
),
|
|
44
|
+
path.join(root, "apps", "extensions", "lifeops-browser"),
|
|
45
|
+
path.join(root, "eliza", "apps", "extensions", "lifeops-browser")
|
|
46
|
+
]);
|
|
47
|
+
const packageJsonCandidates = workspaceRootCandidates.flatMap((root) => [
|
|
48
|
+
path.join(root, "package.json"),
|
|
49
|
+
path.join(root, "eliza", "package.json")
|
|
50
|
+
]);
|
|
51
|
+
const extensionPackageJsonCandidates = uniquePaths(
|
|
52
|
+
extensionRootCandidates.map(
|
|
53
|
+
(candidate) => path.join(candidate, "package.json")
|
|
54
|
+
)
|
|
55
|
+
);
|
|
56
|
+
const buildInfoCandidates = workspaceRootCandidates.flatMap((root) => [
|
|
57
|
+
path.join(root, "dist", "build-info.json"),
|
|
58
|
+
path.join(root, "eliza", "dist", "build-info.json")
|
|
59
|
+
]);
|
|
60
|
+
const NIGHTLY_EPOCH_UTC_MS = Date.UTC(2020, 0, 1);
|
|
61
|
+
const DEFAULT_REPOSITORY = "elizaos/eliza";
|
|
62
|
+
function existingPath(candidate) {
|
|
63
|
+
return fs.existsSync(candidate) ? candidate : null;
|
|
64
|
+
}
|
|
65
|
+
function firstExisting(candidates) {
|
|
66
|
+
for (const candidate of candidates) {
|
|
67
|
+
const resolved = existingPath(candidate);
|
|
68
|
+
if (resolved) {
|
|
69
|
+
return resolved;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
function readVersionField(filePath) {
|
|
75
|
+
if (!fs.existsSync(filePath)) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
79
|
+
return typeof parsed.version === "string" && parsed.version.trim() ? parsed.version.trim() : null;
|
|
80
|
+
}
|
|
81
|
+
function normalizeRepositoryIdentifier(value) {
|
|
82
|
+
if (typeof value === "string") {
|
|
83
|
+
const trimmed = value.trim().replace(/^git\+/, "");
|
|
84
|
+
if (!trimmed) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const shorthandMatch = trimmed.match(/^([^/\s]+)\/([^/\s]+)$/);
|
|
88
|
+
if (shorthandMatch) {
|
|
89
|
+
return `${shorthandMatch[1]}/${shorthandMatch[2]}`;
|
|
90
|
+
}
|
|
91
|
+
const githubMatch = trimmed.match(
|
|
92
|
+
/github\.com[/:]([^/]+)\/([^/]+?)(?:\.git)?$/i
|
|
93
|
+
);
|
|
94
|
+
if (githubMatch) {
|
|
95
|
+
return `${githubMatch[1]}/${githubMatch[2]}`;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
100
|
+
const repositoryRecord = value;
|
|
101
|
+
return normalizeRepositoryIdentifier(repositoryRecord.url);
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
function readRepositoryField(filePath) {
|
|
106
|
+
if (!fs.existsSync(filePath)) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
110
|
+
return normalizeRepositoryIdentifier(parsed.repository);
|
|
111
|
+
}
|
|
112
|
+
function resolveBrowserBridgeReleaseVersion() {
|
|
113
|
+
for (const candidate of extensionPackageJsonCandidates) {
|
|
114
|
+
const value = readVersionField(candidate);
|
|
115
|
+
if (value) {
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
for (const candidate of packageJsonCandidates) {
|
|
120
|
+
const value = readVersionField(candidate);
|
|
121
|
+
if (value) {
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
for (const candidate of buildInfoCandidates) {
|
|
126
|
+
const value = readVersionField(candidate);
|
|
127
|
+
if (value) {
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return "0.0.0";
|
|
132
|
+
}
|
|
133
|
+
function resolveBrowserBridgeReleaseRepository(env = process.env) {
|
|
134
|
+
const configuredRepository = typeof env.GITHUB_REPOSITORY === "string" && env.GITHUB_REPOSITORY.trim() ? env.GITHUB_REPOSITORY.trim() : null;
|
|
135
|
+
if (configuredRepository) {
|
|
136
|
+
return configuredRepository;
|
|
137
|
+
}
|
|
138
|
+
for (const candidate of extensionPackageJsonCandidates) {
|
|
139
|
+
const repository = readRepositoryField(candidate);
|
|
140
|
+
if (repository) {
|
|
141
|
+
return repository;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const candidate of packageJsonCandidates) {
|
|
145
|
+
const repository = readRepositoryField(candidate);
|
|
146
|
+
if (repository) {
|
|
147
|
+
return repository;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return DEFAULT_REPOSITORY;
|
|
151
|
+
}
|
|
152
|
+
function normalizeReleaseVersionCandidate(raw) {
|
|
153
|
+
const trimmed = raw.trim();
|
|
154
|
+
if (!trimmed) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return trimmed.startsWith("v") ? trimmed.slice(1) : trimmed;
|
|
158
|
+
}
|
|
159
|
+
function parseReleaseVersion(raw) {
|
|
160
|
+
const normalized = normalizeReleaseVersionCandidate(raw);
|
|
161
|
+
if (!normalized) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const match = normalized.match(
|
|
165
|
+
/^(\d+)\.(\d+)\.(\d+)(?:-(beta|rc|nightly)\.([0-9A-Za-z.-]+))?$/
|
|
166
|
+
);
|
|
167
|
+
if (!match) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
const majorRaw = match[1];
|
|
171
|
+
const minorRaw = match[2];
|
|
172
|
+
const patchRaw = match[3];
|
|
173
|
+
if (!majorRaw || !minorRaw || !patchRaw) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
const major = Number.parseInt(majorRaw, 10);
|
|
177
|
+
const minor = Number.parseInt(minorRaw, 10);
|
|
178
|
+
const patch = Number.parseInt(patchRaw, 10);
|
|
179
|
+
const prereleaseLabel = match[4] ?? null;
|
|
180
|
+
const prereleaseValue = match[5] ?? null;
|
|
181
|
+
return {
|
|
182
|
+
raw: normalized,
|
|
183
|
+
tag: `v${normalized}`,
|
|
184
|
+
major,
|
|
185
|
+
minor,
|
|
186
|
+
patch,
|
|
187
|
+
prereleaseLabel,
|
|
188
|
+
prereleaseValue,
|
|
189
|
+
baseVersion: `${major}.${minor}.${patch}`,
|
|
190
|
+
hasPrerelease: prereleaseLabel !== null
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function clamp(value, minimum, maximum) {
|
|
194
|
+
return Math.min(maximum, Math.max(minimum, value));
|
|
195
|
+
}
|
|
196
|
+
function parseNumericPrereleaseValue(value) {
|
|
197
|
+
if (!value) {
|
|
198
|
+
return 0;
|
|
199
|
+
}
|
|
200
|
+
const parsed = Number.parseInt(value, 10);
|
|
201
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
202
|
+
}
|
|
203
|
+
function deriveNightlyOrdinal(value) {
|
|
204
|
+
if (typeof value === "string" && /^\d{8}$/.test(value)) {
|
|
205
|
+
const year = Number.parseInt(value.slice(0, 4), 10);
|
|
206
|
+
const month = Number.parseInt(value.slice(4, 6), 10);
|
|
207
|
+
const day = Number.parseInt(value.slice(6, 8), 10);
|
|
208
|
+
const utcMs = Date.UTC(year, month - 1, day);
|
|
209
|
+
if (Number.isFinite(utcMs)) {
|
|
210
|
+
return clamp(
|
|
211
|
+
Math.floor((utcMs - NIGHTLY_EPOCH_UTC_MS) / 864e5) + 1,
|
|
212
|
+
1,
|
|
213
|
+
9999
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const parsed = parseNumericPrereleaseValue(value);
|
|
218
|
+
if (parsed > 0) {
|
|
219
|
+
return clamp(parsed, 1, 9999);
|
|
220
|
+
}
|
|
221
|
+
let hash = 0;
|
|
222
|
+
for (const character of String(value ?? "")) {
|
|
223
|
+
hash = (hash * 33 + character.charCodeAt(0)) % 9999;
|
|
224
|
+
}
|
|
225
|
+
return clamp(hash, 1, 9999);
|
|
226
|
+
}
|
|
227
|
+
function derivePrereleaseOrdinal(release) {
|
|
228
|
+
if (!release.hasPrerelease || !release.prereleaseLabel) {
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
if (release.prereleaseLabel === "nightly") {
|
|
232
|
+
return deriveNightlyOrdinal(release.prereleaseValue);
|
|
233
|
+
}
|
|
234
|
+
return clamp(parseNumericPrereleaseValue(release.prereleaseValue), 0, 9999);
|
|
235
|
+
}
|
|
236
|
+
function buildChromeExtensionVersion(release) {
|
|
237
|
+
let buildSegment = 6e4;
|
|
238
|
+
if (release.hasPrerelease && release.prereleaseLabel) {
|
|
239
|
+
const ordinal = derivePrereleaseOrdinal(release);
|
|
240
|
+
buildSegment = release.prereleaseLabel === "rc" ? 5e4 + ordinal : release.prereleaseLabel === "beta" ? 4e4 + ordinal : 1e4 + ordinal;
|
|
241
|
+
}
|
|
242
|
+
return [release.major, release.minor, release.patch, buildSegment].join(".");
|
|
243
|
+
}
|
|
244
|
+
function buildSafariExtensionVersions(release) {
|
|
245
|
+
const ordinal = derivePrereleaseOrdinal(release);
|
|
246
|
+
const suffix = !release.hasPrerelease || !release.prereleaseLabel ? 9e3 : release.prereleaseLabel === "rc" ? 8e3 + ordinal : release.prereleaseLabel === "beta" ? 7e3 + ordinal : 5e3 + ordinal;
|
|
247
|
+
return {
|
|
248
|
+
marketingVersion: release.baseVersion,
|
|
249
|
+
buildVersion: String(
|
|
250
|
+
release.major * 1e8 + release.minor * 1e6 + release.patch * 1e4 + suffix
|
|
251
|
+
)
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function versionedArtifactName(prefix, extension, release) {
|
|
255
|
+
return `${prefix}-${release.tag}.${extension.replace(/^\./, "")}`;
|
|
256
|
+
}
|
|
257
|
+
function buildGitHubReleasePageUrl(repository, release) {
|
|
258
|
+
return `https://github.com/${repository}/releases/tag/${release.tag}`;
|
|
259
|
+
}
|
|
260
|
+
function buildGitHubReleaseAssetDownloadUrl(repository, release, assetName) {
|
|
261
|
+
return `https://github.com/${repository}/releases/download/${release.tag}/${assetName}`;
|
|
262
|
+
}
|
|
263
|
+
function resolveBrowserBridgeStoreUrls(env = process.env) {
|
|
264
|
+
const chromeWebStoreUrl = typeof env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL === "string" && env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim() ? env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim() : null;
|
|
265
|
+
const safariAppStoreUrl = typeof env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL === "string" && env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim() ? env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim() : null;
|
|
266
|
+
return {
|
|
267
|
+
chromeWebStoreUrl,
|
|
268
|
+
safariAppStoreUrl
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function buildBrowserBridgeReleaseManifestForVersion(rawVersion, env = process.env) {
|
|
272
|
+
const release = parseReleaseVersion(rawVersion);
|
|
273
|
+
if (!release) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const repository = resolveBrowserBridgeReleaseRepository(env);
|
|
277
|
+
const storeUrls = resolveBrowserBridgeStoreUrls(env);
|
|
278
|
+
const chromeAssetName = versionedArtifactName(
|
|
279
|
+
"browser-bridge-chrome",
|
|
280
|
+
"zip",
|
|
281
|
+
release
|
|
282
|
+
);
|
|
283
|
+
const safariAssetName = versionedArtifactName(
|
|
284
|
+
"browser-bridge-safari",
|
|
285
|
+
"zip",
|
|
286
|
+
release
|
|
287
|
+
);
|
|
288
|
+
const safariVersions = buildSafariExtensionVersions(release);
|
|
289
|
+
return {
|
|
290
|
+
schema: "browser_bridge_release_v2",
|
|
291
|
+
releaseTag: release.tag,
|
|
292
|
+
releaseVersion: release.raw,
|
|
293
|
+
repository,
|
|
294
|
+
releasePageUrl: buildGitHubReleasePageUrl(repository, release),
|
|
295
|
+
chromeVersion: buildChromeExtensionVersion(release),
|
|
296
|
+
chromeVersionName: release.raw,
|
|
297
|
+
safariMarketingVersion: safariVersions.marketingVersion,
|
|
298
|
+
safariBuildVersion: safariVersions.buildVersion,
|
|
299
|
+
chrome: {
|
|
300
|
+
installKind: storeUrls.chromeWebStoreUrl ? "chrome_web_store" : "github_release",
|
|
301
|
+
installUrl: storeUrls.chromeWebStoreUrl ?? buildGitHubReleaseAssetDownloadUrl(
|
|
302
|
+
repository,
|
|
303
|
+
release,
|
|
304
|
+
chromeAssetName
|
|
305
|
+
),
|
|
306
|
+
storeListingUrl: storeUrls.chromeWebStoreUrl,
|
|
307
|
+
asset: {
|
|
308
|
+
fileName: chromeAssetName,
|
|
309
|
+
downloadUrl: buildGitHubReleaseAssetDownloadUrl(
|
|
310
|
+
repository,
|
|
311
|
+
release,
|
|
312
|
+
chromeAssetName
|
|
313
|
+
)
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
safari: {
|
|
317
|
+
installKind: storeUrls.safariAppStoreUrl ? "apple_app_store" : "github_release",
|
|
318
|
+
installUrl: storeUrls.safariAppStoreUrl ?? buildGitHubReleaseAssetDownloadUrl(
|
|
319
|
+
repository,
|
|
320
|
+
release,
|
|
321
|
+
safariAssetName
|
|
322
|
+
),
|
|
323
|
+
storeListingUrl: storeUrls.safariAppStoreUrl,
|
|
324
|
+
asset: {
|
|
325
|
+
fileName: safariAssetName,
|
|
326
|
+
downloadUrl: buildGitHubReleaseAssetDownloadUrl(
|
|
327
|
+
repository,
|
|
328
|
+
release,
|
|
329
|
+
safariAssetName
|
|
330
|
+
)
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function readReleaseManifest(artifactsDir) {
|
|
337
|
+
const manifestPath = path.join(
|
|
338
|
+
artifactsDir,
|
|
339
|
+
"browser-bridge-release-manifest.json"
|
|
340
|
+
);
|
|
341
|
+
if (!fs.existsSync(manifestPath)) {
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
try {
|
|
345
|
+
return JSON.parse(
|
|
346
|
+
fs.readFileSync(manifestPath, "utf8")
|
|
347
|
+
);
|
|
348
|
+
} catch {
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
function resolveBrowserBridgeReleaseManifest(artifactsDir, options) {
|
|
353
|
+
if (artifactsDir) {
|
|
354
|
+
const releaseManifest = readReleaseManifest(artifactsDir);
|
|
355
|
+
if (releaseManifest) {
|
|
356
|
+
return releaseManifest;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (!options?.allowSynthesis) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
return buildBrowserBridgeReleaseManifestForVersion(
|
|
363
|
+
options.version ?? resolveBrowserBridgeReleaseVersion(),
|
|
364
|
+
options.env
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
function resolveBrowserBridgeExtensionRoot() {
|
|
368
|
+
return firstExisting(extensionRootCandidates);
|
|
369
|
+
}
|
|
370
|
+
function packageScriptName(browser) {
|
|
371
|
+
return browser === "safari" ? "package-safari.mjs" : "package-chrome.mjs";
|
|
372
|
+
}
|
|
373
|
+
function runCommand(command, args, cwd) {
|
|
374
|
+
return new Promise((resolve, reject) => {
|
|
375
|
+
const child = spawn(command, args, {
|
|
376
|
+
cwd,
|
|
377
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
378
|
+
env: process.env
|
|
379
|
+
});
|
|
380
|
+
let stderr = "";
|
|
381
|
+
child.stderr.on("data", (chunk) => {
|
|
382
|
+
stderr += String(chunk);
|
|
383
|
+
});
|
|
384
|
+
child.on("error", reject);
|
|
385
|
+
child.on("exit", (code) => {
|
|
386
|
+
if (code === 0) {
|
|
387
|
+
resolve();
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
reject(
|
|
391
|
+
new Error(
|
|
392
|
+
stderr.trim() || `${command} ${args.join(" ")} exited with code ${code ?? "unknown"}`
|
|
393
|
+
)
|
|
394
|
+
);
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
function resolveBrowserBridgeExtensionPath() {
|
|
399
|
+
return resolveBrowserBridgeExtensionRoot();
|
|
400
|
+
}
|
|
401
|
+
function resolveBrowserBridgeCompanionPackagePath(status, target) {
|
|
402
|
+
switch (target) {
|
|
403
|
+
case "extension_root":
|
|
404
|
+
return status.extensionPath;
|
|
405
|
+
case "chrome_build":
|
|
406
|
+
return status.chromeBuildPath;
|
|
407
|
+
case "chrome_package":
|
|
408
|
+
return status.chromePackagePath;
|
|
409
|
+
case "safari_web_extension":
|
|
410
|
+
return status.safariWebExtensionPath;
|
|
411
|
+
case "safari_app":
|
|
412
|
+
return status.safariAppPath;
|
|
413
|
+
case "safari_package":
|
|
414
|
+
return status.safariPackagePath;
|
|
415
|
+
default:
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
async function openPathInHost(pathValue, revealOnly) {
|
|
420
|
+
const revealDirectory = revealOnly && fs.existsSync(pathValue) && fs.statSync(pathValue).isDirectory() ? pathValue : path.dirname(pathValue);
|
|
421
|
+
const cwd = outerRepoRoot;
|
|
422
|
+
switch (process.platform) {
|
|
423
|
+
case "darwin":
|
|
424
|
+
await runCommand(
|
|
425
|
+
"open",
|
|
426
|
+
revealOnly ? ["-R", pathValue] : [pathValue],
|
|
427
|
+
cwd
|
|
428
|
+
);
|
|
429
|
+
return;
|
|
430
|
+
case "win32":
|
|
431
|
+
await runCommand(
|
|
432
|
+
revealOnly ? "explorer.exe" : "cmd",
|
|
433
|
+
revealOnly ? [`/select,${pathValue}`] : ["/c", "start", "", pathValue],
|
|
434
|
+
cwd
|
|
435
|
+
);
|
|
436
|
+
return;
|
|
437
|
+
case "linux":
|
|
438
|
+
await runCommand(
|
|
439
|
+
"xdg-open",
|
|
440
|
+
[revealOnly ? revealDirectory : pathValue],
|
|
441
|
+
cwd
|
|
442
|
+
);
|
|
443
|
+
return;
|
|
444
|
+
default:
|
|
445
|
+
throw new Error(
|
|
446
|
+
`Opening local paths is not supported on ${process.platform}`
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async function openChromeExtensionsManager() {
|
|
451
|
+
const cwd = outerRepoRoot;
|
|
452
|
+
switch (process.platform) {
|
|
453
|
+
case "darwin":
|
|
454
|
+
await runCommand(
|
|
455
|
+
"open",
|
|
456
|
+
["-a", "Google Chrome", "chrome://extensions/"],
|
|
457
|
+
cwd
|
|
458
|
+
);
|
|
459
|
+
return;
|
|
460
|
+
case "win32":
|
|
461
|
+
await runCommand(
|
|
462
|
+
"cmd",
|
|
463
|
+
["/c", "start", "", "chrome", "chrome://extensions/"],
|
|
464
|
+
cwd
|
|
465
|
+
);
|
|
466
|
+
return;
|
|
467
|
+
case "linux":
|
|
468
|
+
await runCommand("xdg-open", ["chrome://extensions/"], cwd);
|
|
469
|
+
return;
|
|
470
|
+
default:
|
|
471
|
+
throw new Error(
|
|
472
|
+
`Opening the Chrome extensions manager is not supported on ${process.platform}`
|
|
473
|
+
);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
function getBrowserBridgeCompanionPackageStatus() {
|
|
477
|
+
const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();
|
|
478
|
+
if (!resolvedExtensionPath) {
|
|
479
|
+
return {
|
|
480
|
+
extensionPath: null,
|
|
481
|
+
chromeBuildPath: null,
|
|
482
|
+
chromePackagePath: null,
|
|
483
|
+
safariWebExtensionPath: null,
|
|
484
|
+
safariAppPath: null,
|
|
485
|
+
safariPackagePath: null,
|
|
486
|
+
releaseManifest: resolveBrowserBridgeReleaseManifest(null, {
|
|
487
|
+
allowSynthesis: true
|
|
488
|
+
})
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
const distDir = path.join(resolvedExtensionPath, "dist");
|
|
492
|
+
const artifactsDir = path.join(distDir, "artifacts");
|
|
493
|
+
return {
|
|
494
|
+
extensionPath: resolvedExtensionPath,
|
|
495
|
+
chromeBuildPath: existingPath(path.join(distDir, "chrome")),
|
|
496
|
+
chromePackagePath: existingPath(
|
|
497
|
+
path.join(artifactsDir, "browser-bridge-chrome.zip")
|
|
498
|
+
),
|
|
499
|
+
safariWebExtensionPath: existingPath(path.join(distDir, "safari")),
|
|
500
|
+
safariAppPath: existingPath(
|
|
501
|
+
path.join(artifactsDir, "Agent Browser Bridge.app")
|
|
502
|
+
),
|
|
503
|
+
safariPackagePath: existingPath(
|
|
504
|
+
path.join(artifactsDir, "browser-bridge-safari.zip")
|
|
505
|
+
),
|
|
506
|
+
releaseManifest: resolveBrowserBridgeReleaseManifest(artifactsDir, {
|
|
507
|
+
allowSynthesis: true
|
|
508
|
+
})
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
function getBrowserBridgeCompanionDownloadFile(browser) {
|
|
512
|
+
const status = getBrowserBridgeCompanionPackageStatus();
|
|
513
|
+
const filePath = browser === "safari" ? status.safariPackagePath : status.chromePackagePath;
|
|
514
|
+
if (!filePath) {
|
|
515
|
+
throw new Error(
|
|
516
|
+
`${browser === "safari" ? "Safari" : "Chrome"} package has not been built yet`
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
return {
|
|
520
|
+
path: filePath,
|
|
521
|
+
filename: path.basename(filePath),
|
|
522
|
+
contentType: "application/zip"
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
async function openBrowserBridgeCompanionPackagePath(target, options) {
|
|
526
|
+
const revealOnly = options?.revealOnly ?? false;
|
|
527
|
+
const status = getBrowserBridgeCompanionPackageStatus();
|
|
528
|
+
const resolvedPath = resolveBrowserBridgeCompanionPackagePath(status, target);
|
|
529
|
+
if (!resolvedPath) {
|
|
530
|
+
throw new Error(`Browser Bridge path is not available for ${target}`);
|
|
531
|
+
}
|
|
532
|
+
await openPathInHost(resolvedPath, revealOnly);
|
|
533
|
+
return {
|
|
534
|
+
target,
|
|
535
|
+
path: resolvedPath,
|
|
536
|
+
revealOnly
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
async function openBrowserBridgeCompanionManager(browser) {
|
|
540
|
+
if (browser !== "chrome") {
|
|
541
|
+
throw new Error(
|
|
542
|
+
"Only Chrome exposes a local extensions manager for unpacked install"
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
await openChromeExtensionsManager();
|
|
546
|
+
return { browser };
|
|
547
|
+
}
|
|
548
|
+
async function buildBrowserBridgeCompanionPackage(browser) {
|
|
549
|
+
const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();
|
|
550
|
+
if (!resolvedExtensionPath) {
|
|
551
|
+
throw new Error("Browser Bridge extension workspace is not available");
|
|
552
|
+
}
|
|
553
|
+
await runCommand(
|
|
554
|
+
"bun",
|
|
555
|
+
[path.join(resolvedExtensionPath, "scripts", packageScriptName(browser))],
|
|
556
|
+
resolvedExtensionPath
|
|
557
|
+
);
|
|
558
|
+
return getBrowserBridgeCompanionPackageStatus();
|
|
559
|
+
}
|
|
560
|
+
export {
|
|
561
|
+
buildBrowserBridgeCompanionPackage,
|
|
562
|
+
buildBrowserBridgeReleaseManifestForVersion,
|
|
563
|
+
getBrowserBridgeCompanionDownloadFile,
|
|
564
|
+
getBrowserBridgeCompanionPackageStatus,
|
|
565
|
+
openBrowserBridgeCompanionManager,
|
|
566
|
+
openBrowserBridgeCompanionPackagePath,
|
|
567
|
+
resolveBrowserBridgeCompanionPackagePath,
|
|
568
|
+
resolveBrowserBridgeExtensionPath,
|
|
569
|
+
resolveBrowserBridgeReleaseManifest
|
|
570
|
+
};
|
|
571
|
+
//# sourceMappingURL=packaging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/packaging.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n BrowserBridgeCompanionPackageStatus,\n BrowserBridgeCompanionReleaseManifest,\n BrowserBridgeKind,\n BrowserBridgePackagePathTarget,\n} from \"./contracts.js\";\n\nconst pluginSrcDir = path.dirname(fileURLToPath(import.meta.url));\nconst elizaRoot = path.resolve(pluginSrcDir, \"../../../\");\nconst outerRepoRoot = path.resolve(elizaRoot, \"../\");\n\nfunction uniquePaths(paths: string[]): string[] {\n return [...new Set(paths.map((candidate) => path.resolve(candidate)))];\n}\n\nfunction ancestorPaths(start: string): string[] {\n const ancestors: string[] = [];\n let current = path.resolve(start);\n while (true) {\n ancestors.push(current);\n const parent = path.dirname(current);\n if (parent === current) {\n return ancestors;\n }\n current = parent;\n }\n}\n\nconst workspaceRootCandidates = uniquePaths([\n process.cwd(),\n outerRepoRoot,\n elizaRoot,\n ...ancestorPaths(pluginSrcDir),\n ...ancestorPaths(process.cwd()),\n]);\n\nconst extensionRootCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"packages\", \"browser-bridge-extension\"),\n path.join(root, \"eliza\", \"packages\", \"browser-bridge-extension\"),\n path.join(root, \"eliza\", \"apps\", \"browser-bridge\"),\n path.join(root, \"apps\", \"browser-bridge\"),\n path.join(root, \"apps\", \"app-lifeops\", \"extensions\", \"lifeops-browser\"),\n path.join(\n root,\n \"eliza\",\n \"apps\",\n \"app-lifeops\",\n \"extensions\",\n \"lifeops-browser\",\n ),\n path.join(root, \"apps\", \"extensions\", \"lifeops-browser\"),\n path.join(root, \"eliza\", \"apps\", \"extensions\", \"lifeops-browser\"),\n]);\nconst packageJsonCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"package.json\"),\n path.join(root, \"eliza\", \"package.json\"),\n]);\nconst extensionPackageJsonCandidates = uniquePaths(\n extensionRootCandidates.map((candidate) =>\n path.join(candidate, \"package.json\"),\n ),\n);\nconst buildInfoCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"dist\", \"build-info.json\"),\n path.join(root, \"eliza\", \"dist\", \"build-info.json\"),\n]);\nconst NIGHTLY_EPOCH_UTC_MS = Date.UTC(2020, 0, 1);\nconst DEFAULT_REPOSITORY = \"elizaos/eliza\";\n\nfunction existingPath(candidate: string): string | null {\n return fs.existsSync(candidate) ? candidate : null;\n}\n\nfunction firstExisting(candidates: readonly string[]): string | null {\n for (const candidate of candidates) {\n const resolved = existingPath(candidate);\n if (resolved) {\n return resolved;\n }\n }\n return null;\n}\n\nfunction readVersionField(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as {\n version?: unknown;\n };\n return typeof parsed.version === \"string\" && parsed.version.trim()\n ? parsed.version.trim()\n : null;\n}\n\nfunction normalizeRepositoryIdentifier(value: unknown): string | null {\n if (typeof value === \"string\") {\n const trimmed = value.trim().replace(/^git\\+/, \"\");\n if (!trimmed) {\n return null;\n }\n const shorthandMatch = trimmed.match(/^([^/\\s]+)\\/([^/\\s]+)$/);\n if (shorthandMatch) {\n return `${shorthandMatch[1]}/${shorthandMatch[2]}`;\n }\n const githubMatch = trimmed.match(\n /github\\.com[/:]([^/]+)\\/([^/]+?)(?:\\.git)?$/i,\n );\n if (githubMatch) {\n return `${githubMatch[1]}/${githubMatch[2]}`;\n }\n return null;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const repositoryRecord = value as { url?: unknown };\n return normalizeRepositoryIdentifier(repositoryRecord.url);\n }\n\n return null;\n}\n\nfunction readRepositoryField(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as {\n repository?: unknown;\n };\n return normalizeRepositoryIdentifier(parsed.repository);\n}\n\nfunction resolveBrowserBridgeReleaseVersion(): string {\n for (const candidate of extensionPackageJsonCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n for (const candidate of packageJsonCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n for (const candidate of buildInfoCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n return \"0.0.0\";\n}\n\nfunction resolveBrowserBridgeReleaseRepository(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const configuredRepository =\n typeof env.GITHUB_REPOSITORY === \"string\" && env.GITHUB_REPOSITORY.trim()\n ? env.GITHUB_REPOSITORY.trim()\n : null;\n if (configuredRepository) {\n return configuredRepository;\n }\n\n for (const candidate of extensionPackageJsonCandidates) {\n const repository = readRepositoryField(candidate);\n if (repository) {\n return repository;\n }\n }\n\n for (const candidate of packageJsonCandidates) {\n const repository = readRepositoryField(candidate);\n if (repository) {\n return repository;\n }\n }\n\n return DEFAULT_REPOSITORY;\n}\n\ntype ReleaseVersion = {\n raw: string;\n tag: string;\n major: number;\n minor: number;\n patch: number;\n prereleaseLabel: string | null;\n prereleaseValue: string | null;\n baseVersion: string;\n hasPrerelease: boolean;\n};\n\nfunction normalizeReleaseVersionCandidate(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.startsWith(\"v\") ? trimmed.slice(1) : trimmed;\n}\n\nfunction parseReleaseVersion(raw: string): ReleaseVersion | null {\n const normalized = normalizeReleaseVersionCandidate(raw);\n if (!normalized) {\n return null;\n }\n const match = normalized.match(\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(beta|rc|nightly)\\.([0-9A-Za-z.-]+))?$/,\n );\n if (!match) {\n return null;\n }\n const majorRaw = match[1];\n const minorRaw = match[2];\n const patchRaw = match[3];\n if (!majorRaw || !minorRaw || !patchRaw) {\n return null;\n }\n const major = Number.parseInt(majorRaw, 10);\n const minor = Number.parseInt(minorRaw, 10);\n const patch = Number.parseInt(patchRaw, 10);\n const prereleaseLabel = match[4] ?? null;\n const prereleaseValue = match[5] ?? null;\n return {\n raw: normalized,\n tag: `v${normalized}`,\n major,\n minor,\n patch,\n prereleaseLabel,\n prereleaseValue,\n baseVersion: `${major}.${minor}.${patch}`,\n hasPrerelease: prereleaseLabel !== null,\n };\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(maximum, Math.max(minimum, value));\n}\n\nfunction parseNumericPrereleaseValue(value: string | null): number {\n if (!value) {\n return 0;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction deriveNightlyOrdinal(value: string | null): number {\n if (typeof value === \"string\" && /^\\d{8}$/.test(value)) {\n const year = Number.parseInt(value.slice(0, 4), 10);\n const month = Number.parseInt(value.slice(4, 6), 10);\n const day = Number.parseInt(value.slice(6, 8), 10);\n const utcMs = Date.UTC(year, month - 1, day);\n if (Number.isFinite(utcMs)) {\n return clamp(\n Math.floor((utcMs - NIGHTLY_EPOCH_UTC_MS) / 86_400_000) + 1,\n 1,\n 9999,\n );\n }\n }\n\n const parsed = parseNumericPrereleaseValue(value);\n if (parsed > 0) {\n return clamp(parsed, 1, 9999);\n }\n\n let hash = 0;\n for (const character of String(value ?? \"\")) {\n hash = (hash * 33 + character.charCodeAt(0)) % 9999;\n }\n return clamp(hash, 1, 9999);\n}\n\nfunction derivePrereleaseOrdinal(release: ReleaseVersion): number {\n if (!release.hasPrerelease || !release.prereleaseLabel) {\n return 0;\n }\n if (release.prereleaseLabel === \"nightly\") {\n return deriveNightlyOrdinal(release.prereleaseValue);\n }\n return clamp(parseNumericPrereleaseValue(release.prereleaseValue), 0, 9999);\n}\n\nfunction buildChromeExtensionVersion(release: ReleaseVersion): string {\n let buildSegment = 60000;\n if (release.hasPrerelease && release.prereleaseLabel) {\n const ordinal = derivePrereleaseOrdinal(release);\n buildSegment =\n release.prereleaseLabel === \"rc\"\n ? 50000 + ordinal\n : release.prereleaseLabel === \"beta\"\n ? 40000 + ordinal\n : 10000 + ordinal;\n }\n return [release.major, release.minor, release.patch, buildSegment].join(\".\");\n}\n\nfunction buildSafariExtensionVersions(release: ReleaseVersion): {\n marketingVersion: string;\n buildVersion: string;\n} {\n const ordinal = derivePrereleaseOrdinal(release);\n const suffix =\n !release.hasPrerelease || !release.prereleaseLabel\n ? 9000\n : release.prereleaseLabel === \"rc\"\n ? 8000 + ordinal\n : release.prereleaseLabel === \"beta\"\n ? 7000 + ordinal\n : 5000 + ordinal;\n\n return {\n marketingVersion: release.baseVersion,\n buildVersion: String(\n release.major * 100_000_000 +\n release.minor * 1_000_000 +\n release.patch * 10_000 +\n suffix,\n ),\n };\n}\n\nfunction versionedArtifactName(\n prefix: string,\n extension: string,\n release: ReleaseVersion,\n): string {\n return `${prefix}-${release.tag}.${extension.replace(/^\\./, \"\")}`;\n}\n\nfunction buildGitHubReleasePageUrl(\n repository: string,\n release: ReleaseVersion,\n): string {\n return `https://github.com/${repository}/releases/tag/${release.tag}`;\n}\n\nfunction buildGitHubReleaseAssetDownloadUrl(\n repository: string,\n release: ReleaseVersion,\n assetName: string,\n): string {\n return `https://github.com/${repository}/releases/download/${release.tag}/${assetName}`;\n}\n\nfunction resolveBrowserBridgeStoreUrls(env = process.env): {\n chromeWebStoreUrl: string | null;\n safariAppStoreUrl: string | null;\n} {\n const chromeWebStoreUrl =\n typeof env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL === \"string\" &&\n env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim()\n ? env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim()\n : null;\n const safariAppStoreUrl =\n typeof env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL === \"string\" &&\n env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim()\n ? env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim()\n : null;\n return {\n chromeWebStoreUrl,\n safariAppStoreUrl,\n };\n}\n\nexport function buildBrowserBridgeReleaseManifestForVersion(\n rawVersion: string,\n env = process.env,\n): BrowserBridgeCompanionReleaseManifest | null {\n const release = parseReleaseVersion(rawVersion);\n if (!release) {\n return null;\n }\n const repository = resolveBrowserBridgeReleaseRepository(env);\n const storeUrls = resolveBrowserBridgeStoreUrls(env);\n const chromeAssetName = versionedArtifactName(\n \"browser-bridge-chrome\",\n \"zip\",\n release,\n );\n const safariAssetName = versionedArtifactName(\n \"browser-bridge-safari\",\n \"zip\",\n release,\n );\n const safariVersions = buildSafariExtensionVersions(release);\n return {\n schema: \"browser_bridge_release_v2\",\n releaseTag: release.tag,\n releaseVersion: release.raw,\n repository,\n releasePageUrl: buildGitHubReleasePageUrl(repository, release),\n chromeVersion: buildChromeExtensionVersion(release),\n chromeVersionName: release.raw,\n safariMarketingVersion: safariVersions.marketingVersion,\n safariBuildVersion: safariVersions.buildVersion,\n chrome: {\n installKind: storeUrls.chromeWebStoreUrl\n ? \"chrome_web_store\"\n : \"github_release\",\n installUrl:\n storeUrls.chromeWebStoreUrl ??\n buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n chromeAssetName,\n ),\n storeListingUrl: storeUrls.chromeWebStoreUrl,\n asset: {\n fileName: chromeAssetName,\n downloadUrl: buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n chromeAssetName,\n ),\n },\n },\n safari: {\n installKind: storeUrls.safariAppStoreUrl\n ? \"apple_app_store\"\n : \"github_release\",\n installUrl:\n storeUrls.safariAppStoreUrl ??\n buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n safariAssetName,\n ),\n storeListingUrl: storeUrls.safariAppStoreUrl,\n asset: {\n fileName: safariAssetName,\n downloadUrl: buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n safariAssetName,\n ),\n },\n },\n generatedAt: new Date().toISOString(),\n };\n}\n\nfunction readReleaseManifest(\n artifactsDir: string,\n): BrowserBridgeCompanionReleaseManifest | null {\n const manifestPath = path.join(\n artifactsDir,\n \"browser-bridge-release-manifest.json\",\n );\n if (!fs.existsSync(manifestPath)) {\n return null;\n }\n try {\n return JSON.parse(\n fs.readFileSync(manifestPath, \"utf8\"),\n ) as BrowserBridgeCompanionReleaseManifest;\n } catch {\n return null;\n }\n}\n\nexport function resolveBrowserBridgeReleaseManifest(\n artifactsDir: string | null,\n options?: {\n allowSynthesis?: boolean;\n version?: string;\n env?: NodeJS.ProcessEnv;\n },\n): BrowserBridgeCompanionReleaseManifest | null {\n if (artifactsDir) {\n const releaseManifest = readReleaseManifest(artifactsDir);\n if (releaseManifest) {\n return releaseManifest;\n }\n }\n if (!options?.allowSynthesis) {\n return null;\n }\n return buildBrowserBridgeReleaseManifestForVersion(\n options.version ?? resolveBrowserBridgeReleaseVersion(),\n options.env,\n );\n}\n\nfunction resolveBrowserBridgeExtensionRoot(): string | null {\n return firstExisting(extensionRootCandidates);\n}\n\nfunction packageScriptName(browser: BrowserBridgeKind): string {\n return browser === \"safari\" ? \"package-safari.mjs\" : \"package-chrome.mjs\";\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk) => {\n stderr += String(chunk);\n });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(\n new Error(\n stderr.trim() ||\n `${command} ${args.join(\" \")} exited with code ${code ?? \"unknown\"}`,\n ),\n );\n });\n });\n}\n\nexport function resolveBrowserBridgeExtensionPath(): string | null {\n return resolveBrowserBridgeExtensionRoot();\n}\n\nexport function resolveBrowserBridgeCompanionPackagePath(\n status: BrowserBridgeCompanionPackageStatus,\n target: BrowserBridgePackagePathTarget,\n): string | null {\n switch (target) {\n case \"extension_root\":\n return status.extensionPath;\n case \"chrome_build\":\n return status.chromeBuildPath;\n case \"chrome_package\":\n return status.chromePackagePath;\n case \"safari_web_extension\":\n return status.safariWebExtensionPath;\n case \"safari_app\":\n return status.safariAppPath;\n case \"safari_package\":\n return status.safariPackagePath;\n default:\n return null;\n }\n}\n\nasync function openPathInHost(\n pathValue: string,\n revealOnly: boolean,\n): Promise<void> {\n const revealDirectory =\n revealOnly &&\n fs.existsSync(pathValue) &&\n fs.statSync(pathValue).isDirectory()\n ? pathValue\n : path.dirname(pathValue);\n const cwd = outerRepoRoot;\n switch (process.platform) {\n case \"darwin\":\n await runCommand(\n \"open\",\n revealOnly ? [\"-R\", pathValue] : [pathValue],\n cwd,\n );\n return;\n case \"win32\":\n await runCommand(\n revealOnly ? \"explorer.exe\" : \"cmd\",\n revealOnly ? [`/select,${pathValue}`] : [\"/c\", \"start\", \"\", pathValue],\n cwd,\n );\n return;\n case \"linux\":\n await runCommand(\n \"xdg-open\",\n [revealOnly ? revealDirectory : pathValue],\n cwd,\n );\n return;\n default:\n throw new Error(\n `Opening local paths is not supported on ${process.platform}`,\n );\n }\n}\n\nasync function openChromeExtensionsManager(): Promise<void> {\n const cwd = outerRepoRoot;\n switch (process.platform) {\n case \"darwin\":\n await runCommand(\n \"open\",\n [\"-a\", \"Google Chrome\", \"chrome://extensions/\"],\n cwd,\n );\n return;\n case \"win32\":\n await runCommand(\n \"cmd\",\n [\"/c\", \"start\", \"\", \"chrome\", \"chrome://extensions/\"],\n cwd,\n );\n return;\n case \"linux\":\n await runCommand(\"xdg-open\", [\"chrome://extensions/\"], cwd);\n return;\n default:\n throw new Error(\n `Opening the Chrome extensions manager is not supported on ${process.platform}`,\n );\n }\n}\n\nexport function getBrowserBridgeCompanionPackageStatus(): BrowserBridgeCompanionPackageStatus {\n const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();\n if (!resolvedExtensionPath) {\n return {\n extensionPath: null,\n chromeBuildPath: null,\n chromePackagePath: null,\n safariWebExtensionPath: null,\n safariAppPath: null,\n safariPackagePath: null,\n releaseManifest: resolveBrowserBridgeReleaseManifest(null, {\n allowSynthesis: true,\n }),\n };\n }\n\n const distDir = path.join(resolvedExtensionPath, \"dist\");\n const artifactsDir = path.join(distDir, \"artifacts\");\n\n return {\n extensionPath: resolvedExtensionPath,\n chromeBuildPath: existingPath(path.join(distDir, \"chrome\")),\n chromePackagePath: existingPath(\n path.join(artifactsDir, \"browser-bridge-chrome.zip\"),\n ),\n safariWebExtensionPath: existingPath(path.join(distDir, \"safari\")),\n safariAppPath: existingPath(\n path.join(artifactsDir, \"Agent Browser Bridge.app\"),\n ),\n safariPackagePath: existingPath(\n path.join(artifactsDir, \"browser-bridge-safari.zip\"),\n ),\n releaseManifest: resolveBrowserBridgeReleaseManifest(artifactsDir, {\n allowSynthesis: true,\n }),\n };\n}\n\nexport function getBrowserBridgeCompanionDownloadFile(\n browser: BrowserBridgeKind,\n): { path: string; filename: string; contentType: string } {\n const status = getBrowserBridgeCompanionPackageStatus();\n const filePath =\n browser === \"safari\" ? status.safariPackagePath : status.chromePackagePath;\n if (!filePath) {\n throw new Error(\n `${browser === \"safari\" ? \"Safari\" : \"Chrome\"} package has not been built yet`,\n );\n }\n return {\n path: filePath,\n filename: path.basename(filePath),\n contentType: \"application/zip\",\n };\n}\n\nexport async function openBrowserBridgeCompanionPackagePath(\n target: BrowserBridgePackagePathTarget,\n options?: { revealOnly?: boolean },\n): Promise<{\n target: BrowserBridgePackagePathTarget;\n path: string;\n revealOnly: boolean;\n}> {\n const revealOnly = options?.revealOnly ?? false;\n const status = getBrowserBridgeCompanionPackageStatus();\n const resolvedPath = resolveBrowserBridgeCompanionPackagePath(status, target);\n if (!resolvedPath) {\n throw new Error(`Browser Bridge path is not available for ${target}`);\n }\n await openPathInHost(resolvedPath, revealOnly);\n return {\n target,\n path: resolvedPath,\n revealOnly,\n };\n}\n\nexport async function openBrowserBridgeCompanionManager(\n browser: BrowserBridgeKind,\n): Promise<{ browser: BrowserBridgeKind }> {\n if (browser !== \"chrome\") {\n throw new Error(\n \"Only Chrome exposes a local extensions manager for unpacked install\",\n );\n }\n await openChromeExtensionsManager();\n return { browser };\n}\n\nexport async function buildBrowserBridgeCompanionPackage(\n browser: BrowserBridgeKind,\n): Promise<BrowserBridgeCompanionPackageStatus> {\n const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();\n if (!resolvedExtensionPath) {\n throw new Error(\"Browser Bridge extension workspace is not available\");\n }\n\n await runCommand(\n \"bun\",\n [path.join(resolvedExtensionPath, \"scripts\", packageScriptName(browser))],\n resolvedExtensionPath,\n );\n\n return getBrowserBridgeCompanionPackageStatus();\n}\n"],"mappings":"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","names":[]}
|