@elizaos/plugin-browser 2.0.0-beta.1 → 2.0.3-beta.3

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.
Files changed (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -64
  3. package/dist/actions/browser-autofill-login.d.ts.map +1 -1
  4. package/dist/actions/browser-autofill-login.js.map +1 -1
  5. package/dist/actions/browser.d.ts +5 -6
  6. package/dist/actions/browser.d.ts.map +1 -1
  7. package/dist/actions/browser.js +312 -60
  8. package/dist/actions/browser.js.map +1 -1
  9. package/dist/actions/manage-browser-bridge.d.ts.map +1 -1
  10. package/dist/actions/manage-browser-bridge.js +10 -14
  11. package/dist/actions/manage-browser-bridge.js.map +1 -1
  12. package/dist/actions/wait-for-url-predicate.d.ts +34 -0
  13. package/dist/actions/wait-for-url-predicate.d.ts.map +1 -0
  14. package/dist/actions/wait-for-url-predicate.js +33 -0
  15. package/dist/actions/wait-for-url-predicate.js.map +1 -0
  16. package/dist/actions/wait-for-url.d.ts +64 -0
  17. package/dist/actions/wait-for-url.d.ts.map +1 -0
  18. package/dist/actions/wait-for-url.js +89 -0
  19. package/dist/actions/wait-for-url.js.map +1 -0
  20. package/dist/bridge-policy.d.ts +10 -0
  21. package/dist/bridge-policy.d.ts.map +1 -0
  22. package/dist/bridge-policy.js +37 -0
  23. package/dist/bridge-policy.js.map +1 -0
  24. package/dist/bridge-readiness.d.ts +16 -0
  25. package/dist/bridge-readiness.d.ts.map +1 -0
  26. package/dist/bridge-readiness.js +82 -0
  27. package/dist/bridge-readiness.js.map +1 -0
  28. package/dist/bridge-records.d.ts +9 -0
  29. package/dist/bridge-records.d.ts.map +1 -0
  30. package/dist/bridge-records.js +37 -0
  31. package/dist/bridge-records.js.map +1 -0
  32. package/dist/browser-capture-hooks.d.ts +9 -0
  33. package/dist/browser-capture-hooks.d.ts.map +1 -0
  34. package/dist/browser-capture-hooks.js +15 -0
  35. package/dist/browser-capture-hooks.js.map +1 -0
  36. package/dist/browser-service.d.ts +22 -4
  37. package/dist/browser-service.d.ts.map +1 -1
  38. package/dist/browser-service.js +63 -15
  39. package/dist/browser-service.js.map +1 -1
  40. package/dist/browser-workspace-hooks.d.ts +14 -0
  41. package/dist/browser-workspace-hooks.d.ts.map +1 -0
  42. package/dist/browser-workspace-hooks.js +15 -0
  43. package/dist/browser-workspace-hooks.js.map +1 -0
  44. package/dist/companion-auth.d.ts +34 -0
  45. package/dist/companion-auth.d.ts.map +1 -0
  46. package/dist/companion-auth.js +98 -0
  47. package/dist/companion-auth.js.map +1 -0
  48. package/dist/index.d.ts +12 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +66 -12
  51. package/dist/index.js.map +1 -1
  52. package/dist/message-adapter.d.ts +9 -0
  53. package/dist/message-adapter.d.ts.map +1 -0
  54. package/dist/message-adapter.js +104 -0
  55. package/dist/message-adapter.js.map +1 -0
  56. package/dist/packaging.d.ts.map +1 -1
  57. package/dist/packaging.js +2 -0
  58. package/dist/packaging.js.map +1 -1
  59. package/dist/parity/browser-matrix.d.ts +45 -0
  60. package/dist/parity/browser-matrix.d.ts.map +1 -0
  61. package/dist/parity/browser-matrix.js +361 -0
  62. package/dist/parity/browser-matrix.js.map +1 -0
  63. package/dist/parity/index.d.ts +5 -0
  64. package/dist/parity/index.d.ts.map +1 -0
  65. package/dist/parity/index.js +13 -0
  66. package/dist/parity/index.js.map +1 -0
  67. package/dist/password-manager-bridge.d.ts +50 -0
  68. package/dist/password-manager-bridge.d.ts.map +1 -0
  69. package/dist/password-manager-bridge.js +437 -0
  70. package/dist/password-manager-bridge.js.map +1 -0
  71. package/dist/plugin.d.ts.map +1 -1
  72. package/dist/plugin.js +8 -4
  73. package/dist/plugin.js.map +1 -1
  74. package/dist/providers/workspace.d.ts +1 -1
  75. package/dist/providers/workspace.js.map +1 -1
  76. package/dist/routes/bridge.d.ts.map +1 -1
  77. package/dist/routes/bridge.js +63 -14
  78. package/dist/routes/bridge.js.map +1 -1
  79. package/dist/routes/workspace-setup.d.ts.map +1 -1
  80. package/dist/routes/workspace-setup.js +1 -1
  81. package/dist/routes/workspace-setup.js.map +1 -1
  82. package/dist/routes/workspace.d.ts +1 -2
  83. package/dist/routes/workspace.d.ts.map +1 -1
  84. package/dist/routes/workspace.js +104 -4
  85. package/dist/routes/workspace.js.map +1 -1
  86. package/dist/schema.d.ts +2 -2
  87. package/dist/schema.js.map +1 -1
  88. package/dist/service.d.ts +1 -1
  89. package/dist/service.d.ts.map +1 -1
  90. package/dist/service.js.map +1 -1
  91. package/dist/targets/bridge-target.d.ts +1 -1
  92. package/dist/targets/bridge-target.d.ts.map +1 -1
  93. package/dist/targets/bridge-target.js.map +1 -1
  94. package/dist/targets/stagehand-target.d.ts +3 -0
  95. package/dist/targets/stagehand-target.d.ts.map +1 -0
  96. package/dist/targets/stagehand-target.js +187 -0
  97. package/dist/targets/stagehand-target.js.map +1 -0
  98. package/dist/workspace/browser-capture.d.ts +1 -1
  99. package/dist/workspace/browser-capture.d.ts.map +1 -1
  100. package/dist/workspace/browser-capture.js +33 -1
  101. package/dist/workspace/browser-capture.js.map +1 -1
  102. package/dist/workspace/browser-workspace-desktop.d.ts +1 -1
  103. package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -1
  104. package/dist/workspace/browser-workspace-desktop.js +66 -30
  105. package/dist/workspace/browser-workspace-desktop.js.map +1 -1
  106. package/dist/workspace/browser-workspace-errors.d.ts +62 -0
  107. package/dist/workspace/browser-workspace-errors.d.ts.map +1 -0
  108. package/dist/workspace/browser-workspace-errors.js +69 -0
  109. package/dist/workspace/browser-workspace-errors.js.map +1 -0
  110. package/dist/workspace/browser-workspace-forms.d.ts.map +1 -1
  111. package/dist/workspace/browser-workspace-forms.js +1 -1
  112. package/dist/workspace/browser-workspace-forms.js.map +1 -1
  113. package/dist/workspace/browser-workspace-helpers.d.ts +7 -0
  114. package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -1
  115. package/dist/workspace/browser-workspace-helpers.js +64 -6
  116. package/dist/workspace/browser-workspace-helpers.js.map +1 -1
  117. package/dist/workspace/browser-workspace-network.d.ts +1 -1
  118. package/dist/workspace/browser-workspace-network.d.ts.map +1 -1
  119. package/dist/workspace/browser-workspace-types.d.ts +15 -0
  120. package/dist/workspace/browser-workspace-types.d.ts.map +1 -1
  121. package/dist/workspace/browser-workspace-types.js.map +1 -1
  122. package/dist/workspace/browser-workspace-web.d.ts.map +1 -1
  123. package/dist/workspace/browser-workspace-web.js +34 -93
  124. package/dist/workspace/browser-workspace-web.js.map +1 -1
  125. package/dist/workspace/browser-workspace.d.ts +1 -1
  126. package/dist/workspace/browser-workspace.d.ts.map +1 -1
  127. package/dist/workspace/browser-workspace.js +9 -4
  128. package/dist/workspace/browser-workspace.js.map +1 -1
  129. package/dist/workspace/index.d.ts +1 -0
  130. package/dist/workspace/index.d.ts.map +1 -1
  131. package/dist/workspace/index.js +1 -0
  132. package/dist/workspace/index.js.map +1 -1
  133. package/package.json +29 -7
  134. package/registry-entry.json +75 -0
  135. package/dist/actions/browser-autofill-login.d.js +0 -1
  136. package/dist/actions/browser-autofill-login.d.js.map +0 -1
  137. package/dist/actions/browser.d.js +0 -1
  138. package/dist/actions/browser.d.js.map +0 -1
  139. package/dist/actions/manage-browser-bridge.d.js +0 -1
  140. package/dist/actions/manage-browser-bridge.d.js.map +0 -1
  141. package/dist/ambient-jsdom.d.js +0 -1
  142. package/dist/ambient-jsdom.d.js.map +0 -1
  143. package/dist/browser-service.d.js +0 -1
  144. package/dist/browser-service.d.js.map +0 -1
  145. package/dist/contracts.d.js +0 -1
  146. package/dist/contracts.d.js.map +0 -1
  147. package/dist/index.d.js +0 -21
  148. package/dist/index.d.js.map +0 -1
  149. package/dist/lifeops-session-contracts.d.js +0 -1
  150. package/dist/lifeops-session-contracts.d.js.map +0 -1
  151. package/dist/packaging.d.js +0 -1
  152. package/dist/packaging.d.js.map +0 -1
  153. package/dist/plugin.d.js +0 -1
  154. package/dist/plugin.d.js.map +0 -1
  155. package/dist/providers/workspace.d.js +0 -1
  156. package/dist/providers/workspace.d.js.map +0 -1
  157. package/dist/routes/bridge.d.js +0 -1
  158. package/dist/routes/bridge.d.js.map +0 -1
  159. package/dist/routes/workspace-account-gate.d.js +0 -1
  160. package/dist/routes/workspace-account-gate.d.js.map +0 -1
  161. package/dist/routes/workspace-setup.d.js +0 -1
  162. package/dist/routes/workspace-setup.d.js.map +0 -1
  163. package/dist/routes/workspace.d.js +0 -1
  164. package/dist/routes/workspace.d.js.map +0 -1
  165. package/dist/schema.d.js +0 -1
  166. package/dist/schema.d.js.map +0 -1
  167. package/dist/service.d.js +0 -1
  168. package/dist/service.d.js.map +0 -1
  169. package/dist/targets/bridge-target.d.js +0 -1
  170. package/dist/targets/bridge-target.d.js.map +0 -1
  171. package/dist/workspace/browser-capture.d.js +0 -1
  172. package/dist/workspace/browser-capture.d.js.map +0 -1
  173. package/dist/workspace/browser-workspace-desktop.d.js +0 -1
  174. package/dist/workspace/browser-workspace-desktop.d.js.map +0 -1
  175. package/dist/workspace/browser-workspace-elements.d.js +0 -1
  176. package/dist/workspace/browser-workspace-elements.d.js.map +0 -1
  177. package/dist/workspace/browser-workspace-forms.d.js +0 -1
  178. package/dist/workspace/browser-workspace-forms.d.js.map +0 -1
  179. package/dist/workspace/browser-workspace-helpers.d.js +0 -1
  180. package/dist/workspace/browser-workspace-helpers.d.js.map +0 -1
  181. package/dist/workspace/browser-workspace-jsdom.d.js +0 -1
  182. package/dist/workspace/browser-workspace-jsdom.d.js.map +0 -1
  183. package/dist/workspace/browser-workspace-network.d.js +0 -1
  184. package/dist/workspace/browser-workspace-network.d.js.map +0 -1
  185. package/dist/workspace/browser-workspace-snapshots.d.js +0 -1
  186. package/dist/workspace/browser-workspace-snapshots.d.js.map +0 -1
  187. package/dist/workspace/browser-workspace-state.d.js +0 -1
  188. package/dist/workspace/browser-workspace-state.d.js.map +0 -1
  189. package/dist/workspace/browser-workspace-types.d.js +0 -1
  190. package/dist/workspace/browser-workspace-types.d.js.map +0 -1
  191. package/dist/workspace/browser-workspace-web.d.js +0 -1
  192. package/dist/workspace/browser-workspace-web.d.js.map +0 -1
  193. package/dist/workspace/browser-workspace.d.js +0 -11
  194. package/dist/workspace/browser-workspace.d.js.map +0 -1
  195. package/dist/workspace/index.d.js +0 -3
  196. package/dist/workspace/index.d.js.map +0 -1
@@ -1 +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, \"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":[]}
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":[]}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Machine-checkable browser action parity matrix (#9476).
3
+ *
4
+ * This is the browser equivalent of plugin-computeruse's parity guard: the
5
+ * matrix is data, and the validator cross-checks it against the live registered
6
+ * action surface plus the BROWSER action schema. That keeps browser capability
7
+ * coverage from drifting silently while real-driver and benchmark lanes are
8
+ * added.
9
+ */
10
+ import type { Action } from "@elizaos/core";
11
+ export type BrowserParityStatus = "have" | "partial" | "planned" | "na";
12
+ export type BrowserParitySurface = "workspace" | "legacy-alias" | "credential" | "waiter";
13
+ export interface BrowserParityCapability {
14
+ /** Canonical capability id. Usually the exposed BROWSER action value. */
15
+ id: string;
16
+ /** Value declared in the BROWSER action schema. */
17
+ actionValue?: string;
18
+ /** Registered promoted action name for this capability. */
19
+ elizaVerb?: string;
20
+ /** Runtime command/subaction this capability dispatches to. */
21
+ dispatchesTo?: string;
22
+ status: BrowserParityStatus;
23
+ surface: BrowserParitySurface;
24
+ note?: string;
25
+ }
26
+ export declare const BROWSER_PARITY_MATRIX: readonly BrowserParityCapability[];
27
+ export interface BrowserParityValidationProblem {
28
+ capability: string;
29
+ problem: string;
30
+ }
31
+ export interface BrowserParityValidationResult {
32
+ ok: boolean;
33
+ problems: BrowserParityValidationProblem[];
34
+ confirmed: number;
35
+ }
36
+ export declare function browserParitySummary(): {
37
+ have: number;
38
+ partial: number;
39
+ planned: number;
40
+ na: number;
41
+ total: number;
42
+ };
43
+ export declare function validateBrowserParityMatrix(actionNames: readonly string[], actionValues?: readonly string[]): BrowserParityValidationResult;
44
+ export declare function browserActionNames(actions: readonly Action[]): readonly string[];
45
+ //# sourceMappingURL=browser-matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-matrix.d.ts","sourceRoot":"","sources":["../../src/parity/browser-matrix.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;AACxE,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,cAAc,GACd,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,eAAO,MAAM,qBAAqB,EAAE,SAAS,uBAAuB,EAsQnE,CAAC;AAEF,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,8BAA8B,EAAE,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAgB,oBAAoB,IAAI;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAYA;AAED,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,YAAY,GAAE,SAAS,MAAM,EAA8B,GAC1D,6BAA6B,CA8E/B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS,MAAM,EAAE,CAEnB"}
@@ -0,0 +1,361 @@
1
+ import { listSubactionsFromParameters } from "@elizaos/core";
2
+ import { browserAction } from "../actions/browser.js";
3
+ const WORKSPACE = "workspace";
4
+ const BROWSER_PARITY_MATRIX = [
5
+ {
6
+ id: "open",
7
+ actionValue: "open",
8
+ elizaVerb: "BROWSER_OPEN",
9
+ dispatchesTo: "open",
10
+ status: "have",
11
+ surface: WORKSPACE
12
+ },
13
+ {
14
+ id: "navigate",
15
+ actionValue: "navigate",
16
+ elizaVerb: "BROWSER_NAVIGATE",
17
+ dispatchesTo: "navigate",
18
+ status: "have",
19
+ surface: WORKSPACE
20
+ },
21
+ {
22
+ id: "click",
23
+ actionValue: "click",
24
+ elizaVerb: "BROWSER_CLICK",
25
+ dispatchesTo: "click",
26
+ status: "have",
27
+ surface: WORKSPACE
28
+ },
29
+ {
30
+ id: "type",
31
+ actionValue: "type",
32
+ elizaVerb: "BROWSER_TYPE",
33
+ dispatchesTo: "type",
34
+ status: "have",
35
+ surface: WORKSPACE
36
+ },
37
+ {
38
+ id: "press",
39
+ actionValue: "press",
40
+ elizaVerb: "BROWSER_PRESS",
41
+ dispatchesTo: "press",
42
+ status: "have",
43
+ surface: WORKSPACE
44
+ },
45
+ {
46
+ id: "get",
47
+ actionValue: "get",
48
+ elizaVerb: "BROWSER_GET",
49
+ dispatchesTo: "get",
50
+ status: "have",
51
+ surface: WORKSPACE
52
+ },
53
+ {
54
+ id: "state",
55
+ actionValue: "state",
56
+ elizaVerb: "BROWSER_STATE",
57
+ dispatchesTo: "state",
58
+ status: "have",
59
+ surface: WORKSPACE
60
+ },
61
+ {
62
+ id: "snapshot",
63
+ actionValue: "snapshot",
64
+ elizaVerb: "BROWSER_SNAPSHOT",
65
+ dispatchesTo: "snapshot",
66
+ status: "have",
67
+ surface: WORKSPACE
68
+ },
69
+ {
70
+ id: "screenshot",
71
+ actionValue: "screenshot",
72
+ elizaVerb: "BROWSER_SCREENSHOT",
73
+ dispatchesTo: "screenshot",
74
+ status: "have",
75
+ surface: WORKSPACE
76
+ },
77
+ {
78
+ id: "reload",
79
+ actionValue: "reload",
80
+ elizaVerb: "BROWSER_RELOAD",
81
+ dispatchesTo: "reload",
82
+ status: "have",
83
+ surface: WORKSPACE
84
+ },
85
+ {
86
+ id: "back",
87
+ actionValue: "back",
88
+ elizaVerb: "BROWSER_BACK",
89
+ dispatchesTo: "back",
90
+ status: "have",
91
+ surface: WORKSPACE
92
+ },
93
+ {
94
+ id: "forward",
95
+ actionValue: "forward",
96
+ elizaVerb: "BROWSER_FORWARD",
97
+ dispatchesTo: "forward",
98
+ status: "have",
99
+ surface: WORKSPACE
100
+ },
101
+ {
102
+ id: "close",
103
+ actionValue: "close",
104
+ elizaVerb: "BROWSER_CLOSE",
105
+ dispatchesTo: "close",
106
+ status: "have",
107
+ surface: WORKSPACE
108
+ },
109
+ {
110
+ id: "show",
111
+ actionValue: "show",
112
+ elizaVerb: "BROWSER_SHOW",
113
+ dispatchesTo: "show",
114
+ status: "have",
115
+ surface: WORKSPACE
116
+ },
117
+ {
118
+ id: "hide",
119
+ actionValue: "hide",
120
+ elizaVerb: "BROWSER_HIDE",
121
+ dispatchesTo: "hide",
122
+ status: "have",
123
+ surface: WORKSPACE
124
+ },
125
+ {
126
+ id: "wait",
127
+ actionValue: "wait",
128
+ elizaVerb: "BROWSER_WAIT",
129
+ dispatchesTo: "wait",
130
+ status: "have",
131
+ surface: WORKSPACE
132
+ },
133
+ {
134
+ id: "tab",
135
+ actionValue: "tab",
136
+ elizaVerb: "BROWSER_TAB",
137
+ dispatchesTo: "tab",
138
+ status: "have",
139
+ surface: WORKSPACE
140
+ },
141
+ {
142
+ id: "realistic-click",
143
+ actionValue: "realistic_click",
144
+ elizaVerb: "BROWSER_REALISTIC_CLICK",
145
+ dispatchesTo: "realistic-click",
146
+ status: "have",
147
+ surface: WORKSPACE
148
+ },
149
+ {
150
+ id: "realistic-fill",
151
+ actionValue: "realistic_fill",
152
+ elizaVerb: "BROWSER_REALISTIC_FILL",
153
+ dispatchesTo: "realistic-fill",
154
+ status: "have",
155
+ surface: WORKSPACE
156
+ },
157
+ {
158
+ id: "realistic-type",
159
+ actionValue: "realistic_type",
160
+ elizaVerb: "BROWSER_REALISTIC_TYPE",
161
+ dispatchesTo: "realistic-type",
162
+ status: "have",
163
+ surface: WORKSPACE
164
+ },
165
+ {
166
+ id: "realistic-press",
167
+ actionValue: "realistic_press",
168
+ elizaVerb: "BROWSER_REALISTIC_PRESS",
169
+ dispatchesTo: "realistic-press",
170
+ status: "have",
171
+ surface: WORKSPACE
172
+ },
173
+ {
174
+ id: "cursor-move",
175
+ actionValue: "cursor_move",
176
+ elizaVerb: "BROWSER_CURSOR_MOVE",
177
+ dispatchesTo: "cursor-move",
178
+ status: "have",
179
+ surface: WORKSPACE
180
+ },
181
+ {
182
+ id: "cursor-hide",
183
+ actionValue: "cursor_hide",
184
+ elizaVerb: "BROWSER_CURSOR_HIDE",
185
+ dispatchesTo: "cursor-hide",
186
+ status: "have",
187
+ surface: WORKSPACE
188
+ },
189
+ {
190
+ id: "autofill-login",
191
+ actionValue: "autofill_login",
192
+ elizaVerb: "BROWSER_AUTOFILL_LOGIN",
193
+ dispatchesTo: "autofill-login",
194
+ status: "have",
195
+ surface: "credential",
196
+ note: "Vault-gated credential autofill over the active workspace tab."
197
+ },
198
+ {
199
+ id: "wait-for-url",
200
+ actionValue: "wait_for_url",
201
+ elizaVerb: "BROWSER_WAIT_FOR_URL",
202
+ dispatchesTo: "wait-for-url",
203
+ status: "have",
204
+ surface: "waiter",
205
+ note: "Polls current tab URL against a substring or /regex/ pattern."
206
+ },
207
+ // Legacy aliases remain promoted because they are still declared in the
208
+ // BROWSER action schema. Keep them explicit so removing one is deliberate.
209
+ {
210
+ id: "info",
211
+ actionValue: "info",
212
+ elizaVerb: "BROWSER_INFO",
213
+ dispatchesTo: "state",
214
+ status: "have",
215
+ surface: "legacy-alias"
216
+ },
217
+ {
218
+ id: "context",
219
+ actionValue: "context",
220
+ elizaVerb: "BROWSER_CONTEXT",
221
+ dispatchesTo: "state",
222
+ status: "have",
223
+ surface: "legacy-alias"
224
+ },
225
+ {
226
+ id: "get-context",
227
+ actionValue: "get_context",
228
+ elizaVerb: "BROWSER_GET_CONTEXT",
229
+ dispatchesTo: "state",
230
+ status: "have",
231
+ surface: "legacy-alias"
232
+ },
233
+ {
234
+ id: "list-tabs",
235
+ actionValue: "list_tabs",
236
+ elizaVerb: "BROWSER_LIST_TABS",
237
+ dispatchesTo: "tab:list",
238
+ status: "have",
239
+ surface: "legacy-alias"
240
+ },
241
+ {
242
+ id: "open-tab",
243
+ actionValue: "open_tab",
244
+ elizaVerb: "BROWSER_OPEN_TAB",
245
+ dispatchesTo: "tab:new",
246
+ status: "have",
247
+ surface: "legacy-alias"
248
+ },
249
+ {
250
+ id: "close-tab",
251
+ actionValue: "close_tab",
252
+ elizaVerb: "BROWSER_CLOSE_TAB",
253
+ dispatchesTo: "tab:close",
254
+ status: "have",
255
+ surface: "legacy-alias"
256
+ },
257
+ {
258
+ id: "switch-tab",
259
+ actionValue: "switch_tab",
260
+ elizaVerb: "BROWSER_SWITCH_TAB",
261
+ dispatchesTo: "tab:switch",
262
+ status: "have",
263
+ surface: "legacy-alias"
264
+ }
265
+ ];
266
+ function liveBrowserActionValues() {
267
+ return listSubactionsFromParameters(browserAction.parameters);
268
+ }
269
+ function browserParitySummary() {
270
+ let have = 0;
271
+ let partial = 0;
272
+ let planned = 0;
273
+ let na = 0;
274
+ for (const cap of BROWSER_PARITY_MATRIX) {
275
+ if (cap.status === "have") have += 1;
276
+ else if (cap.status === "partial") partial += 1;
277
+ else if (cap.status === "planned") planned += 1;
278
+ else na += 1;
279
+ }
280
+ return { have, partial, planned, na, total: BROWSER_PARITY_MATRIX.length };
281
+ }
282
+ function validateBrowserParityMatrix(actionNames, actionValues = liveBrowserActionValues()) {
283
+ const registered = new Set(actionNames);
284
+ const schemaValues = new Set(actionValues);
285
+ const matrixByVerb = /* @__PURE__ */ new Map();
286
+ const matrixByActionValue = /* @__PURE__ */ new Map();
287
+ const problems = [];
288
+ let confirmed = 0;
289
+ for (const cap of BROWSER_PARITY_MATRIX) {
290
+ if (cap.elizaVerb) {
291
+ const existing = matrixByVerb.get(cap.elizaVerb);
292
+ if (existing) {
293
+ problems.push({
294
+ capability: cap.id,
295
+ problem: `duplicates elizaVerb ${cap.elizaVerb} from ${existing.id}`
296
+ });
297
+ }
298
+ matrixByVerb.set(cap.elizaVerb, cap);
299
+ }
300
+ if (cap.actionValue) {
301
+ const existing = matrixByActionValue.get(cap.actionValue);
302
+ if (existing) {
303
+ problems.push({
304
+ capability: cap.id,
305
+ problem: `duplicates action value ${cap.actionValue} from ${existing.id}`
306
+ });
307
+ }
308
+ matrixByActionValue.set(cap.actionValue, cap);
309
+ }
310
+ if (cap.status === "na") {
311
+ if (cap.elizaVerb) {
312
+ problems.push({
313
+ capability: cap.id,
314
+ problem: `status "na" must not declare elizaVerb ${cap.elizaVerb}`
315
+ });
316
+ }
317
+ continue;
318
+ }
319
+ if (cap.elizaVerb && !registered.has(cap.elizaVerb)) {
320
+ problems.push({
321
+ capability: cap.id,
322
+ problem: `verb ${cap.elizaVerb} is marked "${cap.status}" but is NOT registered`
323
+ });
324
+ } else if (cap.elizaVerb) {
325
+ confirmed += 1;
326
+ }
327
+ if (cap.actionValue && !schemaValues.has(cap.actionValue)) {
328
+ problems.push({
329
+ capability: cap.id,
330
+ problem: `action value ${cap.actionValue} is not declared by the BROWSER action schema`
331
+ });
332
+ }
333
+ }
334
+ for (const actionValue of schemaValues) {
335
+ if (!matrixByActionValue.has(actionValue)) {
336
+ problems.push({
337
+ capability: actionValue,
338
+ problem: "BROWSER action schema value is missing from BROWSER_PARITY_MATRIX"
339
+ });
340
+ }
341
+ }
342
+ for (const actionName of registered) {
343
+ if (actionName.startsWith("BROWSER_") && !matrixByVerb.has(actionName)) {
344
+ problems.push({
345
+ capability: actionName,
346
+ problem: "registered promoted BROWSER action is missing from BROWSER_PARITY_MATRIX"
347
+ });
348
+ }
349
+ }
350
+ return { ok: problems.length === 0, problems, confirmed };
351
+ }
352
+ function browserActionNames(actions) {
353
+ return actions.map((action) => action.name);
354
+ }
355
+ export {
356
+ BROWSER_PARITY_MATRIX,
357
+ browserActionNames,
358
+ browserParitySummary,
359
+ validateBrowserParityMatrix
360
+ };
361
+ //# sourceMappingURL=browser-matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/parity/browser-matrix.ts"],"sourcesContent":["/**\n * Machine-checkable browser action parity matrix (#9476).\n *\n * This is the browser equivalent of plugin-computeruse's parity guard: the\n * matrix is data, and the validator cross-checks it against the live registered\n * action surface plus the BROWSER action schema. That keeps browser capability\n * coverage from drifting silently while real-driver and benchmark lanes are\n * added.\n */\n\nimport type { Action } from \"@elizaos/core\";\nimport { listSubactionsFromParameters } from \"@elizaos/core\";\nimport { browserAction } from \"../actions/browser.js\";\n\nexport type BrowserParityStatus = \"have\" | \"partial\" | \"planned\" | \"na\";\nexport type BrowserParitySurface =\n | \"workspace\"\n | \"legacy-alias\"\n | \"credential\"\n | \"waiter\";\n\nexport interface BrowserParityCapability {\n /** Canonical capability id. Usually the exposed BROWSER action value. */\n id: string;\n /** Value declared in the BROWSER action schema. */\n actionValue?: string;\n /** Registered promoted action name for this capability. */\n elizaVerb?: string;\n /** Runtime command/subaction this capability dispatches to. */\n dispatchesTo?: string;\n status: BrowserParityStatus;\n surface: BrowserParitySurface;\n note?: string;\n}\n\nconst WORKSPACE = \"workspace\" as const;\n\nexport const BROWSER_PARITY_MATRIX: readonly BrowserParityCapability[] = [\n {\n id: \"open\",\n actionValue: \"open\",\n elizaVerb: \"BROWSER_OPEN\",\n dispatchesTo: \"open\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"navigate\",\n actionValue: \"navigate\",\n elizaVerb: \"BROWSER_NAVIGATE\",\n dispatchesTo: \"navigate\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"click\",\n actionValue: \"click\",\n elizaVerb: \"BROWSER_CLICK\",\n dispatchesTo: \"click\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"type\",\n actionValue: \"type\",\n elizaVerb: \"BROWSER_TYPE\",\n dispatchesTo: \"type\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"press\",\n actionValue: \"press\",\n elizaVerb: \"BROWSER_PRESS\",\n dispatchesTo: \"press\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"get\",\n actionValue: \"get\",\n elizaVerb: \"BROWSER_GET\",\n dispatchesTo: \"get\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"state\",\n actionValue: \"state\",\n elizaVerb: \"BROWSER_STATE\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"snapshot\",\n actionValue: \"snapshot\",\n elizaVerb: \"BROWSER_SNAPSHOT\",\n dispatchesTo: \"snapshot\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"screenshot\",\n actionValue: \"screenshot\",\n elizaVerb: \"BROWSER_SCREENSHOT\",\n dispatchesTo: \"screenshot\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"reload\",\n actionValue: \"reload\",\n elizaVerb: \"BROWSER_RELOAD\",\n dispatchesTo: \"reload\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"back\",\n actionValue: \"back\",\n elizaVerb: \"BROWSER_BACK\",\n dispatchesTo: \"back\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"forward\",\n actionValue: \"forward\",\n elizaVerb: \"BROWSER_FORWARD\",\n dispatchesTo: \"forward\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"close\",\n actionValue: \"close\",\n elizaVerb: \"BROWSER_CLOSE\",\n dispatchesTo: \"close\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"show\",\n actionValue: \"show\",\n elizaVerb: \"BROWSER_SHOW\",\n dispatchesTo: \"show\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"hide\",\n actionValue: \"hide\",\n elizaVerb: \"BROWSER_HIDE\",\n dispatchesTo: \"hide\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"wait\",\n actionValue: \"wait\",\n elizaVerb: \"BROWSER_WAIT\",\n dispatchesTo: \"wait\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"tab\",\n actionValue: \"tab\",\n elizaVerb: \"BROWSER_TAB\",\n dispatchesTo: \"tab\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-click\",\n actionValue: \"realistic_click\",\n elizaVerb: \"BROWSER_REALISTIC_CLICK\",\n dispatchesTo: \"realistic-click\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-fill\",\n actionValue: \"realistic_fill\",\n elizaVerb: \"BROWSER_REALISTIC_FILL\",\n dispatchesTo: \"realistic-fill\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-type\",\n actionValue: \"realistic_type\",\n elizaVerb: \"BROWSER_REALISTIC_TYPE\",\n dispatchesTo: \"realistic-type\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-press\",\n actionValue: \"realistic_press\",\n elizaVerb: \"BROWSER_REALISTIC_PRESS\",\n dispatchesTo: \"realistic-press\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"cursor-move\",\n actionValue: \"cursor_move\",\n elizaVerb: \"BROWSER_CURSOR_MOVE\",\n dispatchesTo: \"cursor-move\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"cursor-hide\",\n actionValue: \"cursor_hide\",\n elizaVerb: \"BROWSER_CURSOR_HIDE\",\n dispatchesTo: \"cursor-hide\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"autofill-login\",\n actionValue: \"autofill_login\",\n elizaVerb: \"BROWSER_AUTOFILL_LOGIN\",\n dispatchesTo: \"autofill-login\",\n status: \"have\",\n surface: \"credential\",\n note: \"Vault-gated credential autofill over the active workspace tab.\",\n },\n {\n id: \"wait-for-url\",\n actionValue: \"wait_for_url\",\n elizaVerb: \"BROWSER_WAIT_FOR_URL\",\n dispatchesTo: \"wait-for-url\",\n status: \"have\",\n surface: \"waiter\",\n note: \"Polls current tab URL against a substring or /regex/ pattern.\",\n },\n\n // Legacy aliases remain promoted because they are still declared in the\n // BROWSER action schema. Keep them explicit so removing one is deliberate.\n {\n id: \"info\",\n actionValue: \"info\",\n elizaVerb: \"BROWSER_INFO\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"context\",\n actionValue: \"context\",\n elizaVerb: \"BROWSER_CONTEXT\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"get-context\",\n actionValue: \"get_context\",\n elizaVerb: \"BROWSER_GET_CONTEXT\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"list-tabs\",\n actionValue: \"list_tabs\",\n elizaVerb: \"BROWSER_LIST_TABS\",\n dispatchesTo: \"tab:list\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"open-tab\",\n actionValue: \"open_tab\",\n elizaVerb: \"BROWSER_OPEN_TAB\",\n dispatchesTo: \"tab:new\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"close-tab\",\n actionValue: \"close_tab\",\n elizaVerb: \"BROWSER_CLOSE_TAB\",\n dispatchesTo: \"tab:close\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"switch-tab\",\n actionValue: \"switch_tab\",\n elizaVerb: \"BROWSER_SWITCH_TAB\",\n dispatchesTo: \"tab:switch\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n];\n\nexport interface BrowserParityValidationProblem {\n capability: string;\n problem: string;\n}\n\nexport interface BrowserParityValidationResult {\n ok: boolean;\n problems: BrowserParityValidationProblem[];\n confirmed: number;\n}\n\nfunction liveBrowserActionValues(): readonly string[] {\n return listSubactionsFromParameters(browserAction.parameters);\n}\n\nexport function browserParitySummary(): {\n have: number;\n partial: number;\n planned: number;\n na: number;\n total: number;\n} {\n let have = 0;\n let partial = 0;\n let planned = 0;\n let na = 0;\n for (const cap of BROWSER_PARITY_MATRIX) {\n if (cap.status === \"have\") have += 1;\n else if (cap.status === \"partial\") partial += 1;\n else if (cap.status === \"planned\") planned += 1;\n else na += 1;\n }\n return { have, partial, planned, na, total: BROWSER_PARITY_MATRIX.length };\n}\n\nexport function validateBrowserParityMatrix(\n actionNames: readonly string[],\n actionValues: readonly string[] = liveBrowserActionValues(),\n): BrowserParityValidationResult {\n const registered = new Set(actionNames);\n const schemaValues = new Set(actionValues);\n const matrixByVerb = new Map<string, BrowserParityCapability>();\n const matrixByActionValue = new Map<string, BrowserParityCapability>();\n const problems: BrowserParityValidationProblem[] = [];\n let confirmed = 0;\n\n for (const cap of BROWSER_PARITY_MATRIX) {\n if (cap.elizaVerb) {\n const existing = matrixByVerb.get(cap.elizaVerb);\n if (existing) {\n problems.push({\n capability: cap.id,\n problem: `duplicates elizaVerb ${cap.elizaVerb} from ${existing.id}`,\n });\n }\n matrixByVerb.set(cap.elizaVerb, cap);\n }\n if (cap.actionValue) {\n const existing = matrixByActionValue.get(cap.actionValue);\n if (existing) {\n problems.push({\n capability: cap.id,\n problem: `duplicates action value ${cap.actionValue} from ${existing.id}`,\n });\n }\n matrixByActionValue.set(cap.actionValue, cap);\n }\n\n if (cap.status === \"na\") {\n if (cap.elizaVerb) {\n problems.push({\n capability: cap.id,\n problem: `status \"na\" must not declare elizaVerb ${cap.elizaVerb}`,\n });\n }\n continue;\n }\n\n if (cap.elizaVerb && !registered.has(cap.elizaVerb)) {\n problems.push({\n capability: cap.id,\n problem: `verb ${cap.elizaVerb} is marked \"${cap.status}\" but is NOT registered`,\n });\n } else if (cap.elizaVerb) {\n confirmed += 1;\n }\n\n if (cap.actionValue && !schemaValues.has(cap.actionValue)) {\n problems.push({\n capability: cap.id,\n problem: `action value ${cap.actionValue} is not declared by the BROWSER action schema`,\n });\n }\n }\n\n for (const actionValue of schemaValues) {\n if (!matrixByActionValue.has(actionValue)) {\n problems.push({\n capability: actionValue,\n problem:\n \"BROWSER action schema value is missing from BROWSER_PARITY_MATRIX\",\n });\n }\n }\n\n for (const actionName of registered) {\n if (actionName.startsWith(\"BROWSER_\") && !matrixByVerb.has(actionName)) {\n problems.push({\n capability: actionName,\n problem:\n \"registered promoted BROWSER action is missing from BROWSER_PARITY_MATRIX\",\n });\n }\n }\n\n return { ok: problems.length === 0, problems, confirmed };\n}\n\nexport function browserActionNames(\n actions: readonly Action[],\n): readonly string[] {\n return actions.map((action) => action.name);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Browser parity tooling (#9476) - public surface.
3
+ */
4
+ export { BROWSER_PARITY_MATRIX, type BrowserParityCapability, type BrowserParityStatus, type BrowserParitySurface, type BrowserParityValidationProblem, type BrowserParityValidationResult, browserActionNames, browserParitySummary, validateBrowserParityMatrix, } from "./browser-matrix.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parity/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import {
2
+ BROWSER_PARITY_MATRIX,
3
+ browserActionNames,
4
+ browserParitySummary,
5
+ validateBrowserParityMatrix
6
+ } from "./browser-matrix.js";
7
+ export {
8
+ BROWSER_PARITY_MATRIX,
9
+ browserActionNames,
10
+ browserParitySummary,
11
+ validateBrowserParityMatrix
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/parity/index.ts"],"sourcesContent":["/**\n * Browser parity tooling (#9476) - public surface.\n */\n\nexport {\n BROWSER_PARITY_MATRIX,\n type BrowserParityCapability,\n type BrowserParityStatus,\n type BrowserParitySurface,\n type BrowserParityValidationProblem,\n type BrowserParityValidationResult,\n browserActionNames,\n browserParitySummary,\n validateBrowserParityMatrix,\n} from \"./browser-matrix.js\";\n"],"mappings":"AAIA;AAAA,EACE;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}