@elizaos/plugin-browser 2.0.0-beta.1 → 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.
Files changed (169) 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 +54 -59
  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/bridge-policy.d.ts +10 -0
  13. package/dist/bridge-policy.d.ts.map +1 -0
  14. package/dist/bridge-policy.js +37 -0
  15. package/dist/bridge-policy.js.map +1 -0
  16. package/dist/bridge-readiness.d.ts +16 -0
  17. package/dist/bridge-readiness.d.ts.map +1 -0
  18. package/dist/bridge-readiness.js +82 -0
  19. package/dist/bridge-readiness.js.map +1 -0
  20. package/dist/bridge-records.d.ts +9 -0
  21. package/dist/bridge-records.d.ts.map +1 -0
  22. package/dist/bridge-records.js +37 -0
  23. package/dist/bridge-records.js.map +1 -0
  24. package/dist/browser-capture-hooks.d.ts +9 -0
  25. package/dist/browser-capture-hooks.d.ts.map +1 -0
  26. package/dist/browser-capture-hooks.js +15 -0
  27. package/dist/browser-capture-hooks.js.map +1 -0
  28. package/dist/browser-service.d.ts +22 -4
  29. package/dist/browser-service.d.ts.map +1 -1
  30. package/dist/browser-service.js +63 -15
  31. package/dist/browser-service.js.map +1 -1
  32. package/dist/browser-workspace-hooks.d.ts +14 -0
  33. package/dist/browser-workspace-hooks.d.ts.map +1 -0
  34. package/dist/browser-workspace-hooks.js +15 -0
  35. package/dist/browser-workspace-hooks.js.map +1 -0
  36. package/dist/companion-auth.d.ts +34 -0
  37. package/dist/companion-auth.d.ts.map +1 -0
  38. package/dist/companion-auth.js +98 -0
  39. package/dist/companion-auth.js.map +1 -0
  40. package/dist/index.d.ts +9 -3
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +46 -11
  43. package/dist/index.js.map +1 -1
  44. package/dist/message-adapter.d.ts +9 -0
  45. package/dist/message-adapter.d.ts.map +1 -0
  46. package/dist/message-adapter.js +104 -0
  47. package/dist/message-adapter.js.map +1 -0
  48. package/dist/packaging.d.ts.map +1 -1
  49. package/dist/packaging.js +2 -0
  50. package/dist/packaging.js.map +1 -1
  51. package/dist/password-manager-bridge.d.ts +50 -0
  52. package/dist/password-manager-bridge.d.ts.map +1 -0
  53. package/dist/password-manager-bridge.js +437 -0
  54. package/dist/password-manager-bridge.js.map +1 -0
  55. package/dist/plugin.d.ts.map +1 -1
  56. package/dist/plugin.js +8 -4
  57. package/dist/plugin.js.map +1 -1
  58. package/dist/providers/workspace.d.ts +1 -1
  59. package/dist/providers/workspace.js.map +1 -1
  60. package/dist/routes/bridge.d.ts.map +1 -1
  61. package/dist/routes/bridge.js +63 -14
  62. package/dist/routes/bridge.js.map +1 -1
  63. package/dist/routes/workspace-setup.d.ts.map +1 -1
  64. package/dist/routes/workspace-setup.js +1 -1
  65. package/dist/routes/workspace-setup.js.map +1 -1
  66. package/dist/routes/workspace.d.ts +1 -2
  67. package/dist/routes/workspace.d.ts.map +1 -1
  68. package/dist/routes/workspace.js +63 -3
  69. package/dist/routes/workspace.js.map +1 -1
  70. package/dist/schema.d.ts +2 -2
  71. package/dist/schema.js.map +1 -1
  72. package/dist/service.d.ts +1 -1
  73. package/dist/service.d.ts.map +1 -1
  74. package/dist/service.js.map +1 -1
  75. package/dist/targets/bridge-target.d.ts +1 -1
  76. package/dist/targets/bridge-target.d.ts.map +1 -1
  77. package/dist/targets/bridge-target.js.map +1 -1
  78. package/dist/targets/stagehand-target.d.ts +3 -0
  79. package/dist/targets/stagehand-target.d.ts.map +1 -0
  80. package/dist/targets/stagehand-target.js +187 -0
  81. package/dist/targets/stagehand-target.js.map +1 -0
  82. package/dist/workspace/browser-capture.d.ts +1 -1
  83. package/dist/workspace/browser-capture.js.map +1 -1
  84. package/dist/workspace/browser-workspace-desktop.d.ts +1 -1
  85. package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -1
  86. package/dist/workspace/browser-workspace-desktop.js +47 -25
  87. package/dist/workspace/browser-workspace-desktop.js.map +1 -1
  88. package/dist/workspace/browser-workspace-forms.d.ts.map +1 -1
  89. package/dist/workspace/browser-workspace-forms.js +1 -1
  90. package/dist/workspace/browser-workspace-forms.js.map +1 -1
  91. package/dist/workspace/browser-workspace-helpers.d.ts +7 -0
  92. package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -1
  93. package/dist/workspace/browser-workspace-helpers.js +37 -0
  94. package/dist/workspace/browser-workspace-helpers.js.map +1 -1
  95. package/dist/workspace/browser-workspace-network.d.ts +1 -1
  96. package/dist/workspace/browser-workspace-network.d.ts.map +1 -1
  97. package/dist/workspace/browser-workspace-types.d.ts +15 -0
  98. package/dist/workspace/browser-workspace-types.d.ts.map +1 -1
  99. package/dist/workspace/browser-workspace-types.js.map +1 -1
  100. package/dist/workspace/browser-workspace-web.d.ts.map +1 -1
  101. package/dist/workspace/browser-workspace-web.js +15 -88
  102. package/dist/workspace/browser-workspace-web.js.map +1 -1
  103. package/dist/workspace/browser-workspace.d.ts +1 -1
  104. package/dist/workspace/browser-workspace.d.ts.map +1 -1
  105. package/dist/workspace/browser-workspace.js +9 -4
  106. package/dist/workspace/browser-workspace.js.map +1 -1
  107. package/package.json +28 -7
  108. package/dist/actions/browser-autofill-login.d.js +0 -1
  109. package/dist/actions/browser-autofill-login.d.js.map +0 -1
  110. package/dist/actions/browser.d.js +0 -1
  111. package/dist/actions/browser.d.js.map +0 -1
  112. package/dist/actions/manage-browser-bridge.d.js +0 -1
  113. package/dist/actions/manage-browser-bridge.d.js.map +0 -1
  114. package/dist/ambient-jsdom.d.js +0 -1
  115. package/dist/ambient-jsdom.d.js.map +0 -1
  116. package/dist/browser-service.d.js +0 -1
  117. package/dist/browser-service.d.js.map +0 -1
  118. package/dist/contracts.d.js +0 -1
  119. package/dist/contracts.d.js.map +0 -1
  120. package/dist/index.d.js +0 -21
  121. package/dist/index.d.js.map +0 -1
  122. package/dist/lifeops-session-contracts.d.js +0 -1
  123. package/dist/lifeops-session-contracts.d.js.map +0 -1
  124. package/dist/packaging.d.js +0 -1
  125. package/dist/packaging.d.js.map +0 -1
  126. package/dist/plugin.d.js +0 -1
  127. package/dist/plugin.d.js.map +0 -1
  128. package/dist/providers/workspace.d.js +0 -1
  129. package/dist/providers/workspace.d.js.map +0 -1
  130. package/dist/routes/bridge.d.js +0 -1
  131. package/dist/routes/bridge.d.js.map +0 -1
  132. package/dist/routes/workspace-account-gate.d.js +0 -1
  133. package/dist/routes/workspace-account-gate.d.js.map +0 -1
  134. package/dist/routes/workspace-setup.d.js +0 -1
  135. package/dist/routes/workspace-setup.d.js.map +0 -1
  136. package/dist/routes/workspace.d.js +0 -1
  137. package/dist/routes/workspace.d.js.map +0 -1
  138. package/dist/schema.d.js +0 -1
  139. package/dist/schema.d.js.map +0 -1
  140. package/dist/service.d.js +0 -1
  141. package/dist/service.d.js.map +0 -1
  142. package/dist/targets/bridge-target.d.js +0 -1
  143. package/dist/targets/bridge-target.d.js.map +0 -1
  144. package/dist/workspace/browser-capture.d.js +0 -1
  145. package/dist/workspace/browser-capture.d.js.map +0 -1
  146. package/dist/workspace/browser-workspace-desktop.d.js +0 -1
  147. package/dist/workspace/browser-workspace-desktop.d.js.map +0 -1
  148. package/dist/workspace/browser-workspace-elements.d.js +0 -1
  149. package/dist/workspace/browser-workspace-elements.d.js.map +0 -1
  150. package/dist/workspace/browser-workspace-forms.d.js +0 -1
  151. package/dist/workspace/browser-workspace-forms.d.js.map +0 -1
  152. package/dist/workspace/browser-workspace-helpers.d.js +0 -1
  153. package/dist/workspace/browser-workspace-helpers.d.js.map +0 -1
  154. package/dist/workspace/browser-workspace-jsdom.d.js +0 -1
  155. package/dist/workspace/browser-workspace-jsdom.d.js.map +0 -1
  156. package/dist/workspace/browser-workspace-network.d.js +0 -1
  157. package/dist/workspace/browser-workspace-network.d.js.map +0 -1
  158. package/dist/workspace/browser-workspace-snapshots.d.js +0 -1
  159. package/dist/workspace/browser-workspace-snapshots.d.js.map +0 -1
  160. package/dist/workspace/browser-workspace-state.d.js +0 -1
  161. package/dist/workspace/browser-workspace-state.d.js.map +0 -1
  162. package/dist/workspace/browser-workspace-types.d.js +0 -1
  163. package/dist/workspace/browser-workspace-types.d.js.map +0 -1
  164. package/dist/workspace/browser-workspace-web.d.js +0 -1
  165. package/dist/workspace/browser-workspace-web.d.js.map +0 -1
  166. package/dist/workspace/browser-workspace.d.js +0 -11
  167. package/dist/workspace/browser-workspace.d.js.map +0 -1
  168. package/dist/workspace/index.d.js +0 -3
  169. package/dist/workspace/index.d.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser-capture-hooks.ts"],"sourcesContent":["import type { BrowserCaptureConfig } from \"./workspace/browser-capture.js\";\n\nexport interface BrowserCaptureHooks {\n frameFile: string;\n startBrowserCapture(config: BrowserCaptureConfig): Promise<void>;\n stopBrowserCapture(): Promise<void>;\n}\n\nconst BROWSER_CAPTURE_HOOKS = Symbol.for(\"elizaos.browser-capture.hooks\");\n\ntype BrowserCaptureHooksGlobal = typeof globalThis & {\n [BROWSER_CAPTURE_HOOKS]?: BrowserCaptureHooks;\n};\n\nfunction hooksGlobal(): BrowserCaptureHooksGlobal {\n return globalThis as BrowserCaptureHooksGlobal;\n}\n\nexport function registerBrowserCaptureHooks(hooks: BrowserCaptureHooks): void {\n hooksGlobal()[BROWSER_CAPTURE_HOOKS] = hooks;\n}\n\nexport function getBrowserCaptureHooks(): BrowserCaptureHooks | null {\n return hooksGlobal()[BROWSER_CAPTURE_HOOKS] ?? null;\n}\n"],"mappings":"AAQA,MAAM,wBAAwB,uBAAO,IAAI,+BAA+B;AAMxE,SAAS,cAAyC;AAChD,SAAO;AACT;AAEO,SAAS,4BAA4B,OAAkC;AAC5E,cAAY,EAAE,qBAAqB,IAAI;AACzC;AAEO,SAAS,yBAAqD;AACnE,SAAO,YAAY,EAAE,qBAAqB,KAAK;AACjD;","names":[]}
@@ -20,6 +20,8 @@
20
20
  * - `computeruse` — registered by `@elizaos/plugin-computeruse` on plugin
21
21
  * init when its capabilities indicate the puppeteer-driven Chromium is
22
22
  * ready.
23
+ * - `stagehand` — registered by this plugin when a Stagehand command
24
+ * endpoint is configured; used as a low-priority fallback.
23
25
  *
24
26
  * Anyone can add a new target later by calling `registerTarget` — that's
25
27
  * the whole point of the pattern. The BROWSER action stays one action.
@@ -27,6 +29,12 @@
27
29
  import { type IAgentRuntime, Service } from "@elizaos/core";
28
30
  import type { BrowserWorkspaceCommand, BrowserWorkspaceCommandResult } from "./workspace/browser-workspace-types.js";
29
31
  export declare const BROWSER_SERVICE_TYPE = "browser";
32
+ export type BrowserTargetKind = "app" | "companion" | "stagehand" | "external";
33
+ export interface BrowserTargetResolutionContext {
34
+ command: BrowserWorkspaceCommand;
35
+ env: NodeJS.ProcessEnv;
36
+ mobile: boolean;
37
+ }
30
38
  /**
31
39
  * Pluggable browser backend. Implementations translate the canonical
32
40
  * BrowserWorkspaceCommand surface into whatever native shape they speak
@@ -35,7 +43,7 @@ export declare const BROWSER_SERVICE_TYPE = "browser";
35
43
  *
36
44
  * Targets MAY decline subactions they don't support — throw a clear
37
45
  * `Error` from `execute` and the caller will see the message. Don't
38
- * silently no-op.
46
+ * silently ignore it.
39
47
  */
40
48
  export interface BrowserTarget {
41
49
  /** Stable identifier — `workspace`, `bridge`, `computeruse`, etc. */
@@ -44,6 +52,15 @@ export interface BrowserTarget {
44
52
  readonly name: string;
45
53
  /** One-line description of what this target controls. */
46
54
  readonly description: string;
55
+ /** Broad target class used for automatic routing. */
56
+ readonly kind?: BrowserTargetKind;
57
+ /** Lower scores are fallback choices. */
58
+ readonly priority?: number;
59
+ /**
60
+ * Optional command-aware score. Return `null` to opt out of automatic
61
+ * routing for this command while still allowing explicit `target`.
62
+ */
63
+ score?(context: BrowserTargetResolutionContext): number | null;
47
64
  /**
48
65
  * Cheap availability check. Called when the BROWSER action wants to
49
66
  * route a command and the caller didn't pin a target. Should be fast
@@ -71,11 +88,12 @@ export declare class BrowserService extends Service {
71
88
  listTargets(): BrowserTarget[];
72
89
  /**
73
90
  * Resolve the active target for a command. If `preferredId` is given,
74
- * returns that target only if available; otherwise scans registered
75
- * targets in registration order and returns the first available one.
91
+ * returns that target only if available; otherwise scores registered
92
+ * targets and returns the best available one.
76
93
  * Returns `null` if nothing is available.
77
94
  */
78
- resolveTarget(preferredId?: string): Promise<BrowserTarget | null>;
95
+ resolveTarget(preferredId?: string, command?: BrowserWorkspaceCommand): Promise<BrowserTarget | null>;
96
+ resolveTargets(preferredId?: string, command?: BrowserWorkspaceCommand): Promise<BrowserTarget[]>;
79
97
  /**
80
98
  * Dispatch a command. `targetId` pins the target; otherwise the service
81
99
  * picks the first available one in registration order.
@@ -1 +1 @@
1
- {"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../src/browser-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,KAAK,aAAa,EAElB,OAAO,EACR,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAC9B,MAAM,wCAAwC,CAAC;AAEhD,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,wDAAwD;IACxD,OAAO,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;CACnF;AAED,qBAAa,cAAe,SAAQ,OAAO;IACzC,gBAAyB,WAAW,aAAwB;IACnD,qBAAqB,SAC8K;IAE5M,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAEtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;WAKL,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAmB5E;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAU3C,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IASrC,WAAW,IAAI,aAAa,EAAE;IAM9B;;;;;OAKG;IACG,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAsBxE;;;OAGG;IACG,OAAO,CACX,OAAO,EAAE,uBAAuB,EAChC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,6BAA6B,CAAC;CAY1C"}
1
+ {"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../src/browser-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AAMpE,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAC9B,MAAM,wCAAwC,CAAC;AAEhD,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/E,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,uBAAuB,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAClC,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,KAAK,CAAC,CAAC,OAAO,EAAE,8BAA8B,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/D;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,wDAAwD;IACxD,OAAO,CACL,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CAAC;CAC3C;AAED,qBAAa,cAAe,SAAQ,OAAO;IACzC,gBAAyB,WAAW,aAAwB;IACnD,qBAAqB,SAC8K;IAE5M,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAEtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;WAKL,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B5E;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAU3C,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IASrC,WAAW,IAAI,aAAa,EAAE;IAM9B;;;;;OAKG;IACG,aAAa,CACjB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,uBAAgD,GACxD,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAK1B,cAAc,CAClB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,uBAAgD,GACxD,OAAO,CAAC,aAAa,EAAE,CAAC;IA+C3B;;;OAGG;IACG,OAAO,CACX,OAAO,EAAE,uBAAuB,EAChC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,6BAA6B,CAAC;CA6B1C"}
@@ -1,10 +1,8 @@
1
- import {
2
- logger,
3
- Service
4
- } from "@elizaos/core";
1
+ import { logger, Service } from "@elizaos/core";
5
2
  import {
6
3
  BROWSER_BRIDGE_ROUTE_SERVICE_TYPE
7
4
  } from "./service.js";
5
+ import { maybeCreateStagehandTarget } from "./targets/stagehand-target.js";
8
6
  const BROWSER_SERVICE_TYPE = "browser";
9
7
  class BrowserService extends Service {
10
8
  static serviceType = BROWSER_SERVICE_TYPE;
@@ -28,6 +26,15 @@ class BrowserService extends Service {
28
26
  `[BrowserService] bridge target not registered at start: ${message}`
29
27
  );
30
28
  }
29
+ try {
30
+ const stagehandTarget = await maybeCreateStagehandTarget();
31
+ if (stagehandTarget) service.registerTarget(stagehandTarget);
32
+ } catch (err) {
33
+ const message = err instanceof Error ? err.message : String(err);
34
+ logger.debug(
35
+ `[BrowserService] stagehand target not registered at start: ${message}`
36
+ );
37
+ }
31
38
  return service;
32
39
  }
33
40
  /**
@@ -57,43 +64,74 @@ class BrowserService extends Service {
57
64
  }
58
65
  /**
59
66
  * Resolve the active target for a command. If `preferredId` is given,
60
- * returns that target only if available; otherwise scans registered
61
- * targets in registration order and returns the first available one.
67
+ * returns that target only if available; otherwise scores registered
68
+ * targets and returns the best available one.
62
69
  * Returns `null` if nothing is available.
63
70
  */
64
- async resolveTarget(preferredId) {
71
+ async resolveTarget(preferredId, command = { subaction: "state" }) {
72
+ const targets = await this.resolveTargets(preferredId, command);
73
+ return targets[0] ?? null;
74
+ }
75
+ async resolveTargets(preferredId, command = { subaction: "state" }) {
65
76
  if (preferredId) {
66
77
  const target = this.targets.get(preferredId);
67
- if (!target) return null;
78
+ if (!target) return [];
68
79
  try {
69
- return await target.available() ? target : null;
80
+ return await target.available() ? [target] : [];
70
81
  } catch {
71
- return null;
82
+ return [];
72
83
  }
73
84
  }
85
+ const context = {
86
+ command,
87
+ env: process.env,
88
+ mobile: isMobileBrowserRuntime(process.env)
89
+ };
90
+ const available = [];
74
91
  for (const id of this.targetOrder) {
75
92
  const target = this.targets.get(id);
76
93
  if (!target) continue;
77
94
  try {
78
- if (await target.available()) return target;
95
+ const score = target.score ? target.score(context) : target.priority ?? 0;
96
+ if (score === null) continue;
97
+ if (await target.available()) {
98
+ available.push({
99
+ score,
100
+ order: this.targetOrder.indexOf(id),
101
+ target
102
+ });
103
+ }
79
104
  } catch {
80
105
  }
81
106
  }
82
- return null;
107
+ return available.sort((a, b) => b.score - a.score || a.order - b.order).map(({ target }) => target);
83
108
  }
84
109
  /**
85
110
  * Dispatch a command. `targetId` pins the target; otherwise the service
86
111
  * picks the first available one in registration order.
87
112
  */
88
113
  async execute(command, targetId) {
89
- const target = await this.resolveTarget(targetId);
90
- if (!target) {
114
+ const targets = await this.resolveTargets(targetId, command);
115
+ if (targets.length === 0) {
91
116
  const availableIds = this.targetOrder.join(", ") || "(none)";
92
117
  throw new Error(
93
118
  targetId ? `Browser target "${targetId}" is not available. Registered targets: ${availableIds}.` : `No browser target is available. Registered targets: ${availableIds}.`
94
119
  );
95
120
  }
96
- return target.execute(command);
121
+ let lastError = null;
122
+ for (const target of targets) {
123
+ try {
124
+ return await target.execute(command);
125
+ } catch (err) {
126
+ lastError = err;
127
+ if (targetId) break;
128
+ const message = err instanceof Error ? err.message : String(err);
129
+ logger.debug(
130
+ `[BrowserService] target "${target.id}" failed; trying next target: ${message}`
131
+ );
132
+ }
133
+ }
134
+ throw lastError instanceof Error ? lastError : new Error("Browser target execution failed.");
97
135
  }
98
136
  }
99
137
  function createWorkspaceTarget() {
@@ -101,6 +139,9 @@ function createWorkspaceTarget() {
101
139
  id: "workspace",
102
140
  name: "Browser Workspace",
103
141
  description: "Eliza's electrobun-embedded BrowserView (desktop) or JSDOM fallback (web). Always available.",
142
+ kind: "app",
143
+ priority: 100,
144
+ score: ({ mobile }) => mobile ? 120 : 100,
104
145
  available: async () => true,
105
146
  execute: async (command) => {
106
147
  const { executeBrowserWorkspaceCommand } = await import("./workspace/browser-workspace.js");
@@ -117,6 +158,9 @@ async function maybeCreateBridgeTarget(runtime) {
117
158
  id: "bridge",
118
159
  name: "Browser Bridge (Chrome / Safari companion)",
119
160
  description: "Routes commands to the user's real Chrome or Safari via the Agent Browser Bridge companion extension. Subset of subactions supported (open / navigate / close / list / state / show / hide / tab / get).",
161
+ kind: "companion",
162
+ priority: 80,
163
+ score: ({ mobile }) => mobile ? null : 80,
120
164
  available: async () => {
121
165
  try {
122
166
  const companions = await service.listBrowserCompanions();
@@ -131,6 +175,10 @@ async function maybeCreateBridgeTarget(runtime) {
131
175
  }
132
176
  };
133
177
  }
178
+ function isMobileBrowserRuntime(env) {
179
+ const platform = (env.ELIZA_MOBILE_PLATFORM ?? env.ELIZA_PLATFORM ?? env.CAPACITOR_PLATFORM ?? "").toLowerCase();
180
+ return platform === "ios" || platform === "android" || platform === "mobile";
181
+ }
134
182
  export {
135
183
  BROWSER_SERVICE_TYPE,
136
184
  BrowserService
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser-service.ts"],"sourcesContent":["/**\n * BrowserService — single browser dispatcher with a pluggable target\n * registry.\n *\n * The agent uses what is available: targets register themselves at plugin\n * init (or later), and the BROWSER action calls into BrowserService which\n * picks the active target. Targets can be queried by id, listed, or\n * resolved by availability.\n *\n * Built-in targets:\n * - `workspace` — Eliza's electrobun-embedded BrowserView (with a JSDOM\n * web-mode fallback when the desktop bridge isn't configured). Always\n * registered by this plugin's `start`. Always available.\n *\n * Optional targets registered by other plugins:\n * - `bridge` — registered by this plugin when a `BrowserBridgeRouteService`\n * is reachable via the runtime; routes commands to the user's real\n * Chrome / Safari via the Agent Browser Bridge companion extension.\n * Available iff at least one companion is paired.\n * - `computeruse` — registered by `@elizaos/plugin-computeruse` on plugin\n * init when its capabilities indicate the puppeteer-driven Chromium is\n * ready.\n *\n * Anyone can add a new target later by calling `registerTarget` — that's\n * the whole point of the pattern. The BROWSER action stays one action.\n */\n\nimport {\n type IAgentRuntime,\n logger,\n Service,\n} from \"@elizaos/core\";\nimport {\n BROWSER_BRIDGE_ROUTE_SERVICE_TYPE,\n type BrowserBridgeRouteService,\n} from \"./service.js\";\nimport type {\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n} from \"./workspace/browser-workspace-types.js\";\n\nexport const BROWSER_SERVICE_TYPE = \"browser\";\n\n/**\n * Pluggable browser backend. Implementations translate the canonical\n * BrowserWorkspaceCommand surface into whatever native shape they speak\n * (electrobun bridge, Chrome companion HTTP, puppeteer CDP, etc.) and\n * return the canonical BrowserWorkspaceCommandResult.\n *\n * Targets MAY decline subactions they don't support — throw a clear\n * `Error` from `execute` and the caller will see the message. Don't\n * silently no-op.\n */\nexport interface BrowserTarget {\n /** Stable identifier — `workspace`, `bridge`, `computeruse`, etc. */\n readonly id: string;\n /** Short human-readable name for diagnostics. */\n readonly name: string;\n /** One-line description of what this target controls. */\n readonly description: string;\n /**\n * Cheap availability check. Called when the BROWSER action wants to\n * route a command and the caller didn't pin a target. Should be fast\n * (no network round-trips) when possible.\n */\n available(): Promise<boolean>;\n /** Run the command. Throw on unsupported subactions. */\n execute(command: BrowserWorkspaceCommand): Promise<BrowserWorkspaceCommandResult>;\n}\n\nexport class BrowserService extends Service {\n static override readonly serviceType = BROWSER_SERVICE_TYPE;\n override capabilityDescription =\n \"Single browser dispatcher with a pluggable target registry. Targets (workspace / bridge / computeruse / …) register themselves; the BROWSER action picks the active target or honors a pinned override.\";\n\n private readonly targets = new Map<string, BrowserTarget>();\n /** Registration order — used as the default preference order. */\n private readonly targetOrder: string[] = [];\n\n async stop(): Promise<void> {\n this.targets.clear();\n this.targetOrder.length = 0;\n }\n\n static override async start(runtime: IAgentRuntime): Promise<BrowserService> {\n const service = new BrowserService(runtime);\n service.registerTarget(createWorkspaceTarget());\n // Bridge target self-registers when its dependencies (BrowserBridgeRouteService\n // implementor) are reachable via the runtime; we attempt registration here\n // and silently skip if unavailable, so the agent can still boot in\n // workspace-only mode.\n try {\n const bridgeTarget = await maybeCreateBridgeTarget(runtime);\n if (bridgeTarget) service.registerTarget(bridgeTarget);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.debug(\n `[BrowserService] bridge target not registered at start: ${message}`,\n );\n }\n return service;\n }\n\n /**\n * Register a target. Idempotent on `id` — calling twice with the same id\n * replaces the previous registration without affecting registration\n * order. New ids are appended to the order list.\n */\n registerTarget(target: BrowserTarget): void {\n if (!this.targets.has(target.id)) {\n this.targetOrder.push(target.id);\n }\n this.targets.set(target.id, target);\n logger.debug(\n `[BrowserService] registered target \"${target.id}\" (${target.name})`,\n );\n }\n\n unregisterTarget(id: string): boolean {\n const removed = this.targets.delete(id);\n if (removed) {\n const idx = this.targetOrder.indexOf(id);\n if (idx >= 0) this.targetOrder.splice(idx, 1);\n }\n return removed;\n }\n\n listTargets(): BrowserTarget[] {\n return this.targetOrder\n .map((id) => this.targets.get(id))\n .filter((target): target is BrowserTarget => target !== undefined);\n }\n\n /**\n * Resolve the active target for a command. If `preferredId` is given,\n * returns that target only if available; otherwise scans registered\n * targets in registration order and returns the first available one.\n * Returns `null` if nothing is available.\n */\n async resolveTarget(preferredId?: string): Promise<BrowserTarget | null> {\n if (preferredId) {\n const target = this.targets.get(preferredId);\n if (!target) return null;\n try {\n return (await target.available()) ? target : null;\n } catch {\n return null;\n }\n }\n for (const id of this.targetOrder) {\n const target = this.targets.get(id);\n if (!target) continue;\n try {\n if (await target.available()) return target;\n } catch {\n // skip unhealthy targets\n }\n }\n return null;\n }\n\n /**\n * Dispatch a command. `targetId` pins the target; otherwise the service\n * picks the first available one in registration order.\n */\n async execute(\n command: BrowserWorkspaceCommand,\n targetId?: string,\n ): Promise<BrowserWorkspaceCommandResult> {\n const target = await this.resolveTarget(targetId);\n if (!target) {\n const availableIds = this.targetOrder.join(\", \") || \"(none)\";\n throw new Error(\n targetId\n ? `Browser target \"${targetId}\" is not available. Registered targets: ${availableIds}.`\n : `No browser target is available. Registered targets: ${availableIds}.`,\n );\n }\n return target.execute(command);\n }\n}\n\nfunction createWorkspaceTarget(): BrowserTarget {\n return {\n id: \"workspace\",\n name: \"Browser Workspace\",\n description:\n \"Eliza's electrobun-embedded BrowserView (desktop) or JSDOM fallback (web). Always available.\",\n available: async () => true,\n execute: async (command) => {\n const { executeBrowserWorkspaceCommand } = await import(\n \"./workspace/browser-workspace.js\"\n );\n return executeBrowserWorkspaceCommand(command);\n },\n };\n}\n\nasync function maybeCreateBridgeTarget(\n runtime: IAgentRuntime,\n): Promise<BrowserTarget | null> {\n const service = runtime.getService<BrowserBridgeRouteService>(\n BROWSER_BRIDGE_ROUTE_SERVICE_TYPE,\n );\n if (!service) return null;\n return {\n id: \"bridge\",\n name: \"Browser Bridge (Chrome / Safari companion)\",\n description:\n \"Routes commands to the user's real Chrome or Safari via the Agent Browser Bridge companion extension. Subset of subactions supported (open / navigate / close / list / state / show / hide / tab / get).\",\n available: async () => {\n try {\n const companions = await service.listBrowserCompanions();\n return companions.length > 0;\n } catch {\n return false;\n }\n },\n execute: async (command) => {\n const { dispatchBridgeCommand } = await import(\n \"./targets/bridge-target.js\"\n );\n return dispatchBridgeCommand(service, command);\n },\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/browser-service.ts"],"sourcesContent":["/**\n * BrowserService — single browser dispatcher with a pluggable target\n * registry.\n *\n * The agent uses what is available: targets register themselves at plugin\n * init (or later), and the BROWSER action calls into BrowserService which\n * picks the active target. Targets can be queried by id, listed, or\n * resolved by availability.\n *\n * Built-in targets:\n * - `workspace` — Eliza's electrobun-embedded BrowserView (with a JSDOM\n * web-mode fallback when the desktop bridge isn't configured). Always\n * registered by this plugin's `start`. Always available.\n *\n * Optional targets registered by other plugins:\n * - `bridge` — registered by this plugin when a `BrowserBridgeRouteService`\n * is reachable via the runtime; routes commands to the user's real\n * Chrome / Safari via the Agent Browser Bridge companion extension.\n * Available iff at least one companion is paired.\n * - `computeruse` — registered by `@elizaos/plugin-computeruse` on plugin\n * init when its capabilities indicate the puppeteer-driven Chromium is\n * ready.\n * - `stagehand` — registered by this plugin when a Stagehand command\n * endpoint is configured; used as a low-priority fallback.\n *\n * Anyone can add a new target later by calling `registerTarget` — that's\n * the whole point of the pattern. The BROWSER action stays one action.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport {\n BROWSER_BRIDGE_ROUTE_SERVICE_TYPE,\n type BrowserBridgeRouteService,\n} from \"./service.js\";\nimport { maybeCreateStagehandTarget } from \"./targets/stagehand-target.js\";\nimport type {\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n} from \"./workspace/browser-workspace-types.js\";\n\nexport const BROWSER_SERVICE_TYPE = \"browser\";\n\nexport type BrowserTargetKind = \"app\" | \"companion\" | \"stagehand\" | \"external\";\n\nexport interface BrowserTargetResolutionContext {\n command: BrowserWorkspaceCommand;\n env: NodeJS.ProcessEnv;\n mobile: boolean;\n}\n\n/**\n * Pluggable browser backend. Implementations translate the canonical\n * BrowserWorkspaceCommand surface into whatever native shape they speak\n * (electrobun bridge, Chrome companion HTTP, puppeteer CDP, etc.) and\n * return the canonical BrowserWorkspaceCommandResult.\n *\n * Targets MAY decline subactions they don't support — throw a clear\n * `Error` from `execute` and the caller will see the message. Don't\n * silently ignore it.\n */\nexport interface BrowserTarget {\n /** Stable identifier — `workspace`, `bridge`, `computeruse`, etc. */\n readonly id: string;\n /** Short human-readable name for diagnostics. */\n readonly name: string;\n /** One-line description of what this target controls. */\n readonly description: string;\n /** Broad target class used for automatic routing. */\n readonly kind?: BrowserTargetKind;\n /** Lower scores are fallback choices. */\n readonly priority?: number;\n /**\n * Optional command-aware score. Return `null` to opt out of automatic\n * routing for this command while still allowing explicit `target`.\n */\n score?(context: BrowserTargetResolutionContext): number | null;\n /**\n * Cheap availability check. Called when the BROWSER action wants to\n * route a command and the caller didn't pin a target. Should be fast\n * (no network round-trips) when possible.\n */\n available(): Promise<boolean>;\n /** Run the command. Throw on unsupported subactions. */\n execute(\n command: BrowserWorkspaceCommand,\n ): Promise<BrowserWorkspaceCommandResult>;\n}\n\nexport class BrowserService extends Service {\n static override readonly serviceType = BROWSER_SERVICE_TYPE;\n override capabilityDescription =\n \"Single browser dispatcher with a pluggable target registry. Targets (workspace / bridge / computeruse / …) register themselves; the BROWSER action picks the active target or honors a pinned override.\";\n\n private readonly targets = new Map<string, BrowserTarget>();\n /** Registration order — used as the default preference order. */\n private readonly targetOrder: string[] = [];\n\n async stop(): Promise<void> {\n this.targets.clear();\n this.targetOrder.length = 0;\n }\n\n static override async start(runtime: IAgentRuntime): Promise<BrowserService> {\n const service = new BrowserService(runtime);\n service.registerTarget(createWorkspaceTarget());\n // Bridge target self-registers when its dependencies (BrowserBridgeRouteService\n // implementor) are reachable via the runtime. Missing dependencies keep the\n // agent in workspace-only mode.\n try {\n const bridgeTarget = await maybeCreateBridgeTarget(runtime);\n if (bridgeTarget) service.registerTarget(bridgeTarget);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.debug(\n `[BrowserService] bridge target not registered at start: ${message}`,\n );\n }\n try {\n const stagehandTarget = await maybeCreateStagehandTarget();\n if (stagehandTarget) service.registerTarget(stagehandTarget);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.debug(\n `[BrowserService] stagehand target not registered at start: ${message}`,\n );\n }\n return service;\n }\n\n /**\n * Register a target. Idempotent on `id` — calling twice with the same id\n * replaces the previous registration without affecting registration\n * order. New ids are appended to the order list.\n */\n registerTarget(target: BrowserTarget): void {\n if (!this.targets.has(target.id)) {\n this.targetOrder.push(target.id);\n }\n this.targets.set(target.id, target);\n logger.debug(\n `[BrowserService] registered target \"${target.id}\" (${target.name})`,\n );\n }\n\n unregisterTarget(id: string): boolean {\n const removed = this.targets.delete(id);\n if (removed) {\n const idx = this.targetOrder.indexOf(id);\n if (idx >= 0) this.targetOrder.splice(idx, 1);\n }\n return removed;\n }\n\n listTargets(): BrowserTarget[] {\n return this.targetOrder\n .map((id) => this.targets.get(id))\n .filter((target): target is BrowserTarget => target !== undefined);\n }\n\n /**\n * Resolve the active target for a command. If `preferredId` is given,\n * returns that target only if available; otherwise scores registered\n * targets and returns the best available one.\n * Returns `null` if nothing is available.\n */\n async resolveTarget(\n preferredId?: string,\n command: BrowserWorkspaceCommand = { subaction: \"state\" },\n ): Promise<BrowserTarget | null> {\n const targets = await this.resolveTargets(preferredId, command);\n return targets[0] ?? null;\n }\n\n async resolveTargets(\n preferredId?: string,\n command: BrowserWorkspaceCommand = { subaction: \"state\" },\n ): Promise<BrowserTarget[]> {\n if (preferredId) {\n const target = this.targets.get(preferredId);\n if (!target) return [];\n try {\n return (await target.available()) ? [target] : [];\n } catch {\n return [];\n }\n }\n\n const context: BrowserTargetResolutionContext = {\n command,\n env: process.env,\n mobile: isMobileBrowserRuntime(process.env),\n };\n const available: Array<{\n score: number;\n order: number;\n target: BrowserTarget;\n }> = [];\n\n for (const id of this.targetOrder) {\n const target = this.targets.get(id);\n if (!target) continue;\n try {\n const score = target.score\n ? target.score(context)\n : (target.priority ?? 0);\n if (score === null) continue;\n if (await target.available()) {\n available.push({\n score,\n order: this.targetOrder.indexOf(id),\n target,\n });\n }\n } catch {\n // Ignore unhealthy targets during target resolution.\n }\n }\n\n return available\n .sort((a, b) => b.score - a.score || a.order - b.order)\n .map(({ target }) => target);\n }\n\n /**\n * Dispatch a command. `targetId` pins the target; otherwise the service\n * picks the first available one in registration order.\n */\n async execute(\n command: BrowserWorkspaceCommand,\n targetId?: string,\n ): Promise<BrowserWorkspaceCommandResult> {\n const targets = await this.resolveTargets(targetId, command);\n if (targets.length === 0) {\n const availableIds = this.targetOrder.join(\", \") || \"(none)\";\n throw new Error(\n targetId\n ? `Browser target \"${targetId}\" is not available. Registered targets: ${availableIds}.`\n : `No browser target is available. Registered targets: ${availableIds}.`,\n );\n }\n\n let lastError: unknown = null;\n for (const target of targets) {\n try {\n return await target.execute(command);\n } catch (err) {\n lastError = err;\n if (targetId) break;\n const message = err instanceof Error ? err.message : String(err);\n logger.debug(\n `[BrowserService] target \"${target.id}\" failed; trying next target: ${message}`,\n );\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error(\"Browser target execution failed.\");\n }\n}\n\nfunction createWorkspaceTarget(): BrowserTarget {\n return {\n id: \"workspace\",\n name: \"Browser Workspace\",\n description:\n \"Eliza's electrobun-embedded BrowserView (desktop) or JSDOM fallback (web). Always available.\",\n kind: \"app\",\n priority: 100,\n score: ({ mobile }) => (mobile ? 120 : 100),\n available: async () => true,\n execute: async (command) => {\n const { executeBrowserWorkspaceCommand } = await import(\n \"./workspace/browser-workspace.js\"\n );\n return executeBrowserWorkspaceCommand(command);\n },\n };\n}\n\nasync function maybeCreateBridgeTarget(\n runtime: IAgentRuntime,\n): Promise<BrowserTarget | null> {\n const service = runtime.getService<BrowserBridgeRouteService>(\n BROWSER_BRIDGE_ROUTE_SERVICE_TYPE,\n );\n if (!service) return null;\n return {\n id: \"bridge\",\n name: \"Browser Bridge (Chrome / Safari companion)\",\n description:\n \"Routes commands to the user's real Chrome or Safari via the Agent Browser Bridge companion extension. Subset of subactions supported (open / navigate / close / list / state / show / hide / tab / get).\",\n kind: \"companion\",\n priority: 80,\n score: ({ mobile }) => (mobile ? null : 80),\n available: async () => {\n try {\n const companions = await service.listBrowserCompanions();\n return companions.length > 0;\n } catch {\n return false;\n }\n },\n execute: async (command) => {\n const { dispatchBridgeCommand } = await import(\n \"./targets/bridge-target.js\"\n );\n return dispatchBridgeCommand(service, command);\n },\n };\n}\n\nfunction isMobileBrowserRuntime(env: NodeJS.ProcessEnv): boolean {\n const platform = (\n env.ELIZA_MOBILE_PLATFORM ??\n env.ELIZA_PLATFORM ??\n env.CAPACITOR_PLATFORM ??\n \"\"\n ).toLowerCase();\n return platform === \"ios\" || platform === \"android\" || platform === \"mobile\";\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ import type { BrowserWorkspaceTab, EvaluateBrowserWorkspaceTabRequest, NavigateBrowserWorkspaceTabRequest, OpenBrowserWorkspaceTabRequest } from "./workspace/browser-workspace-types.js";
2
+ export interface BrowserWorkspaceHooks {
3
+ closeBrowserWorkspaceTab(id: string, env?: NodeJS.ProcessEnv): Promise<boolean>;
4
+ evaluateBrowserWorkspaceTab(request: EvaluateBrowserWorkspaceTabRequest, env?: NodeJS.ProcessEnv): Promise<unknown>;
5
+ isBrowserWorkspaceBridgeConfigured(env?: NodeJS.ProcessEnv): boolean;
6
+ listBrowserWorkspaceTabs(env?: NodeJS.ProcessEnv): Promise<BrowserWorkspaceTab[]>;
7
+ navigateBrowserWorkspaceTab(request: NavigateBrowserWorkspaceTabRequest, env?: NodeJS.ProcessEnv): Promise<BrowserWorkspaceTab>;
8
+ openBrowserWorkspaceTab(request: OpenBrowserWorkspaceTabRequest, env?: NodeJS.ProcessEnv): Promise<BrowserWorkspaceTab>;
9
+ resolveBrowserWorkspaceConnectorPartition(provider: string, accountId: string): string;
10
+ showBrowserWorkspaceTab(id: string, env?: NodeJS.ProcessEnv): Promise<BrowserWorkspaceTab>;
11
+ }
12
+ export declare function registerBrowserWorkspaceHooks(hooks: BrowserWorkspaceHooks): void;
13
+ export declare function getBrowserWorkspaceHooks(): BrowserWorkspaceHooks | null;
14
+ //# sourceMappingURL=browser-workspace-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-workspace-hooks.d.ts","sourceRoot":"","sources":["../src/browser-workspace-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,kCAAkC,EAClC,kCAAkC,EAClC,8BAA8B,EAC/B,MAAM,wCAAwC,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,wBAAwB,CACtB,EAAE,EAAE,MAAM,EACV,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,2BAA2B,CACzB,OAAO,EAAE,kCAAkC,EAC3C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,kCAAkC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC;IACrE,wBAAwB,CACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAClC,2BAA2B,CACzB,OAAO,EAAE,kCAAkC,EAC3C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,uBAAuB,CACrB,OAAO,EAAE,8BAA8B,EACvC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,yCAAyC,CACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC;IACV,uBAAuB,CACrB,EAAE,EAAE,MAAM,EACV,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACjC;AAYD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,qBAAqB,GAC3B,IAAI,CAEN;AAED,wBAAgB,wBAAwB,IAAI,qBAAqB,GAAG,IAAI,CAEvE"}
@@ -0,0 +1,15 @@
1
+ const BROWSER_WORKSPACE_HOOKS = /* @__PURE__ */ Symbol.for("elizaos.browser-workspace.hooks");
2
+ function hooksGlobal() {
3
+ return globalThis;
4
+ }
5
+ function registerBrowserWorkspaceHooks(hooks) {
6
+ hooksGlobal()[BROWSER_WORKSPACE_HOOKS] = hooks;
7
+ }
8
+ function getBrowserWorkspaceHooks() {
9
+ return hooksGlobal()[BROWSER_WORKSPACE_HOOKS] ?? null;
10
+ }
11
+ export {
12
+ getBrowserWorkspaceHooks,
13
+ registerBrowserWorkspaceHooks
14
+ };
15
+ //# sourceMappingURL=browser-workspace-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser-workspace-hooks.ts"],"sourcesContent":["import type {\n BrowserWorkspaceTab,\n EvaluateBrowserWorkspaceTabRequest,\n NavigateBrowserWorkspaceTabRequest,\n OpenBrowserWorkspaceTabRequest,\n} from \"./workspace/browser-workspace-types.js\";\n\nexport interface BrowserWorkspaceHooks {\n closeBrowserWorkspaceTab(\n id: string,\n env?: NodeJS.ProcessEnv,\n ): Promise<boolean>;\n evaluateBrowserWorkspaceTab(\n request: EvaluateBrowserWorkspaceTabRequest,\n env?: NodeJS.ProcessEnv,\n ): Promise<unknown>;\n isBrowserWorkspaceBridgeConfigured(env?: NodeJS.ProcessEnv): boolean;\n listBrowserWorkspaceTabs(\n env?: NodeJS.ProcessEnv,\n ): Promise<BrowserWorkspaceTab[]>;\n navigateBrowserWorkspaceTab(\n request: NavigateBrowserWorkspaceTabRequest,\n env?: NodeJS.ProcessEnv,\n ): Promise<BrowserWorkspaceTab>;\n openBrowserWorkspaceTab(\n request: OpenBrowserWorkspaceTabRequest,\n env?: NodeJS.ProcessEnv,\n ): Promise<BrowserWorkspaceTab>;\n resolveBrowserWorkspaceConnectorPartition(\n provider: string,\n accountId: string,\n ): string;\n showBrowserWorkspaceTab(\n id: string,\n env?: NodeJS.ProcessEnv,\n ): Promise<BrowserWorkspaceTab>;\n}\n\nconst BROWSER_WORKSPACE_HOOKS = Symbol.for(\"elizaos.browser-workspace.hooks\");\n\ntype BrowserWorkspaceHooksGlobal = typeof globalThis & {\n [BROWSER_WORKSPACE_HOOKS]?: BrowserWorkspaceHooks;\n};\n\nfunction hooksGlobal(): BrowserWorkspaceHooksGlobal {\n return globalThis as BrowserWorkspaceHooksGlobal;\n}\n\nexport function registerBrowserWorkspaceHooks(\n hooks: BrowserWorkspaceHooks,\n): void {\n hooksGlobal()[BROWSER_WORKSPACE_HOOKS] = hooks;\n}\n\nexport function getBrowserWorkspaceHooks(): BrowserWorkspaceHooks | null {\n return hooksGlobal()[BROWSER_WORKSPACE_HOOKS] ?? null;\n}\n"],"mappings":"AAsCA,MAAM,0BAA0B,uBAAO,IAAI,iCAAiC;AAM5E,SAAS,cAA2C;AAClD,SAAO;AACT;AAEO,SAAS,8BACd,OACM;AACN,cAAY,EAAE,uBAAuB,IAAI;AAC3C;AAEO,SAAS,2BAAyD;AACvE,SAAO,YAAY,EAAE,uBAAuB,KAAK;AACnD;","names":[]}
@@ -0,0 +1,34 @@
1
+ export type BrowserBridgeCompanionCredentialLike = {
2
+ companion: {
3
+ pairingTokenExpiresAt?: string | null;
4
+ pairingTokenRevokedAt?: string | null;
5
+ };
6
+ pairingTokenHash: string | null;
7
+ pendingPairingTokens?: BrowserBridgeCompanionPendingToken[] | null;
8
+ pendingPairingTokenHashes?: string[] | null;
9
+ } | null;
10
+ export type BrowserBridgeCompanionPendingToken = {
11
+ hash: string;
12
+ expiresAt: string | null;
13
+ };
14
+ export type BrowserBridgeCompanionAuthCode = "browser_bridge_companion_pairing_invalid" | "browser_bridge_companion_token_expired" | "browser_bridge_companion_token_revoked";
15
+ export type BrowserBridgeCompanionAuthFailure = {
16
+ ok: false;
17
+ code: BrowserBridgeCompanionAuthCode;
18
+ message: string;
19
+ };
20
+ export type BrowserBridgeCompanionAuthSuccess = {
21
+ ok: true;
22
+ source: "active" | "pending";
23
+ expiresAt: string | null;
24
+ remainingPendingPairingTokens: BrowserBridgeCompanionPendingToken[];
25
+ };
26
+ export type BrowserBridgeCompanionAuthResult = BrowserBridgeCompanionAuthSuccess | BrowserBridgeCompanionAuthFailure;
27
+ export declare function browserBridgeCompanionAuthFailure(code: BrowserBridgeCompanionAuthCode): BrowserBridgeCompanionAuthFailure;
28
+ export declare function isoTimestampExpired(value: string | null | undefined, nowMs: number): boolean;
29
+ export declare function authenticateBrowserBridgeCompanionCredential(args: {
30
+ credential: BrowserBridgeCompanionCredentialLike;
31
+ pairingTokenHash: string;
32
+ nowMs: number;
33
+ }): BrowserBridgeCompanionAuthResult;
34
+ //# sourceMappingURL=companion-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion-auth.d.ts","sourceRoot":"","sources":["../src/companion-auth.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oCAAoC,GAAG;IACjD,SAAS,EAAE;QACT,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvC,CAAC;IACF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB,CAAC,EAAE,kCAAkC,EAAE,GAAG,IAAI,CAAC;IACnE,yBAAyB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC7C,GAAG,IAAI,CAAC;AAET,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GACtC,0CAA0C,GAC1C,wCAAwC,GACxC,wCAAwC,CAAC;AAE7C,MAAM,MAAM,iCAAiC,GAAG;IAC9C,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,8BAA8B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6BAA6B,EAAE,kCAAkC,EAAE,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,gCAAgC,GACxC,iCAAiC,GACjC,iCAAiC,CAAC;AAEtC,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,8BAA8B,GACnC,iCAAiC,CAqBnC;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,KAAK,EAAE,MAAM,GACZ,OAAO,CAMT;AAiBD,wBAAgB,4CAA4C,CAAC,IAAI,EAAE;IACjE,UAAU,EAAE,oCAAoC,CAAC;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,gCAAgC,CAuDnC"}
@@ -0,0 +1,98 @@
1
+ function browserBridgeCompanionAuthFailure(code) {
2
+ switch (code) {
3
+ case "browser_bridge_companion_token_expired":
4
+ return {
5
+ ok: false,
6
+ code,
7
+ message: "browser companion pairing token is expired"
8
+ };
9
+ case "browser_bridge_companion_token_revoked":
10
+ return {
11
+ ok: false,
12
+ code,
13
+ message: "browser companion pairing token is revoked"
14
+ };
15
+ case "browser_bridge_companion_pairing_invalid":
16
+ return {
17
+ ok: false,
18
+ code,
19
+ message: "browser companion pairing is invalid"
20
+ };
21
+ }
22
+ }
23
+ function isoTimestampExpired(value, nowMs) {
24
+ if (!value) {
25
+ return false;
26
+ }
27
+ const parsed = Date.parse(value);
28
+ return Number.isFinite(parsed) && parsed <= nowMs;
29
+ }
30
+ function pendingTokens(credential) {
31
+ if (Array.isArray(credential.pendingPairingTokens)) {
32
+ return credential.pendingPairingTokens.map((token) => ({
33
+ hash: token.hash,
34
+ expiresAt: token.expiresAt ?? null
35
+ }));
36
+ }
37
+ return (credential.pendingPairingTokenHashes ?? []).map((hash) => ({
38
+ hash,
39
+ expiresAt: null
40
+ }));
41
+ }
42
+ function authenticateBrowserBridgeCompanionCredential(args) {
43
+ const { credential, pairingTokenHash, nowMs } = args;
44
+ if (!credential) {
45
+ return browserBridgeCompanionAuthFailure(
46
+ "browser_bridge_companion_pairing_invalid"
47
+ );
48
+ }
49
+ if (credential.pairingTokenHash === pairingTokenHash) {
50
+ if (credential.companion.pairingTokenRevokedAt) {
51
+ return browserBridgeCompanionAuthFailure(
52
+ "browser_bridge_companion_token_revoked"
53
+ );
54
+ }
55
+ if (isoTimestampExpired(credential.companion.pairingTokenExpiresAt, nowMs)) {
56
+ return browserBridgeCompanionAuthFailure(
57
+ "browser_bridge_companion_token_expired"
58
+ );
59
+ }
60
+ return {
61
+ ok: true,
62
+ source: "active",
63
+ expiresAt: credential.companion.pairingTokenExpiresAt ?? null,
64
+ remainingPendingPairingTokens: pendingTokens(credential)
65
+ };
66
+ }
67
+ if (credential.companion.pairingTokenRevokedAt) {
68
+ return browserBridgeCompanionAuthFailure(
69
+ "browser_bridge_companion_token_revoked"
70
+ );
71
+ }
72
+ const tokens = pendingTokens(credential);
73
+ const pendingToken = tokens.find((token) => token.hash === pairingTokenHash);
74
+ if (!pendingToken) {
75
+ return browserBridgeCompanionAuthFailure(
76
+ "browser_bridge_companion_pairing_invalid"
77
+ );
78
+ }
79
+ if (isoTimestampExpired(pendingToken.expiresAt, nowMs)) {
80
+ return browserBridgeCompanionAuthFailure(
81
+ "browser_bridge_companion_token_expired"
82
+ );
83
+ }
84
+ return {
85
+ ok: true,
86
+ source: "pending",
87
+ expiresAt: pendingToken.expiresAt ?? null,
88
+ remainingPendingPairingTokens: tokens.filter(
89
+ (token) => token.hash !== pairingTokenHash
90
+ )
91
+ };
92
+ }
93
+ export {
94
+ authenticateBrowserBridgeCompanionCredential,
95
+ browserBridgeCompanionAuthFailure,
96
+ isoTimestampExpired
97
+ };
98
+ //# sourceMappingURL=companion-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/companion-auth.ts"],"sourcesContent":["export type BrowserBridgeCompanionCredentialLike = {\n companion: {\n pairingTokenExpiresAt?: string | null;\n pairingTokenRevokedAt?: string | null;\n };\n pairingTokenHash: string | null;\n pendingPairingTokens?: BrowserBridgeCompanionPendingToken[] | null;\n pendingPairingTokenHashes?: string[] | null;\n} | null;\n\nexport type BrowserBridgeCompanionPendingToken = {\n hash: string;\n expiresAt: string | null;\n};\n\nexport type BrowserBridgeCompanionAuthCode =\n | \"browser_bridge_companion_pairing_invalid\"\n | \"browser_bridge_companion_token_expired\"\n | \"browser_bridge_companion_token_revoked\";\n\nexport type BrowserBridgeCompanionAuthFailure = {\n ok: false;\n code: BrowserBridgeCompanionAuthCode;\n message: string;\n};\n\nexport type BrowserBridgeCompanionAuthSuccess = {\n ok: true;\n source: \"active\" | \"pending\";\n expiresAt: string | null;\n remainingPendingPairingTokens: BrowserBridgeCompanionPendingToken[];\n};\n\nexport type BrowserBridgeCompanionAuthResult =\n | BrowserBridgeCompanionAuthSuccess\n | BrowserBridgeCompanionAuthFailure;\n\nexport function browserBridgeCompanionAuthFailure(\n code: BrowserBridgeCompanionAuthCode,\n): BrowserBridgeCompanionAuthFailure {\n switch (code) {\n case \"browser_bridge_companion_token_expired\":\n return {\n ok: false,\n code,\n message: \"browser companion pairing token is expired\",\n };\n case \"browser_bridge_companion_token_revoked\":\n return {\n ok: false,\n code,\n message: \"browser companion pairing token is revoked\",\n };\n case \"browser_bridge_companion_pairing_invalid\":\n return {\n ok: false,\n code,\n message: \"browser companion pairing is invalid\",\n };\n }\n}\n\nexport function isoTimestampExpired(\n value: string | null | undefined,\n nowMs: number,\n): boolean {\n if (!value) {\n return false;\n }\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) && parsed <= nowMs;\n}\n\nfunction pendingTokens(\n credential: Exclude<BrowserBridgeCompanionCredentialLike, null>,\n): BrowserBridgeCompanionPendingToken[] {\n if (Array.isArray(credential.pendingPairingTokens)) {\n return credential.pendingPairingTokens.map((token) => ({\n hash: token.hash,\n expiresAt: token.expiresAt ?? null,\n }));\n }\n return (credential.pendingPairingTokenHashes ?? []).map((hash) => ({\n hash,\n expiresAt: null,\n }));\n}\n\nexport function authenticateBrowserBridgeCompanionCredential(args: {\n credential: BrowserBridgeCompanionCredentialLike;\n pairingTokenHash: string;\n nowMs: number;\n}): BrowserBridgeCompanionAuthResult {\n const { credential, pairingTokenHash, nowMs } = args;\n if (!credential) {\n return browserBridgeCompanionAuthFailure(\n \"browser_bridge_companion_pairing_invalid\",\n );\n }\n\n if (credential.pairingTokenHash === pairingTokenHash) {\n if (credential.companion.pairingTokenRevokedAt) {\n return browserBridgeCompanionAuthFailure(\n \"browser_bridge_companion_token_revoked\",\n );\n }\n if (\n isoTimestampExpired(credential.companion.pairingTokenExpiresAt, nowMs)\n ) {\n return browserBridgeCompanionAuthFailure(\n \"browser_bridge_companion_token_expired\",\n );\n }\n return {\n ok: true,\n source: \"active\",\n expiresAt: credential.companion.pairingTokenExpiresAt ?? null,\n remainingPendingPairingTokens: pendingTokens(credential),\n };\n }\n\n if (credential.companion.pairingTokenRevokedAt) {\n return browserBridgeCompanionAuthFailure(\n \"browser_bridge_companion_token_revoked\",\n );\n }\n\n const tokens = pendingTokens(credential);\n const pendingToken = tokens.find((token) => token.hash === pairingTokenHash);\n if (!pendingToken) {\n return browserBridgeCompanionAuthFailure(\n \"browser_bridge_companion_pairing_invalid\",\n );\n }\n if (isoTimestampExpired(pendingToken.expiresAt, nowMs)) {\n return browserBridgeCompanionAuthFailure(\n \"browser_bridge_companion_token_expired\",\n );\n }\n return {\n ok: true,\n source: \"pending\",\n expiresAt: pendingToken.expiresAt ?? null,\n remainingPendingPairingTokens: tokens.filter(\n (token) => token.hash !== pairingTokenHash,\n ),\n };\n}\n"],"mappings":"AAqCO,SAAS,kCACd,MACmC;AACnC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,MACX;AAAA,EACJ;AACF;AAEO,SAAS,oBACd,OACA,OACS;AACT,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,SAAO,OAAO,SAAS,MAAM,KAAK,UAAU;AAC9C;AAEA,SAAS,cACP,YACsC;AACtC,MAAI,MAAM,QAAQ,WAAW,oBAAoB,GAAG;AAClD,WAAO,WAAW,qBAAqB,IAAI,CAAC,WAAW;AAAA,MACrD,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM,aAAa;AAAA,IAChC,EAAE;AAAA,EACJ;AACA,UAAQ,WAAW,6BAA6B,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,IACjE;AAAA,IACA,WAAW;AAAA,EACb,EAAE;AACJ;AAEO,SAAS,6CAA6C,MAIxB;AACnC,QAAM,EAAE,YAAY,kBAAkB,MAAM,IAAI;AAChD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,qBAAqB,kBAAkB;AACpD,QAAI,WAAW,UAAU,uBAAuB;AAC9C,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AACA,QACE,oBAAoB,WAAW,UAAU,uBAAuB,KAAK,GACrE;AACA,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,WAAW,WAAW,UAAU,yBAAyB;AAAA,MACzD,+BAA+B,cAAc,UAAU;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,WAAW,UAAU,uBAAuB;AAC9C,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,eAAe,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,gBAAgB;AAC3E,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACA,MAAI,oBAAoB,aAAa,WAAW,KAAK,GAAG;AACtD,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,WAAW,aAAa,aAAa;AAAA,IACrC,+BAA+B,OAAO;AAAA,MACpC,CAAC,UAAU,MAAM,SAAS;AAAA,IAC5B;AAAA,EACF;AACF;","names":[]}
package/dist/index.d.ts CHANGED
@@ -10,16 +10,22 @@
10
10
  * - `@elizaos/plugin-browser/plugin`
11
11
  * - `@elizaos/plugin-browser/workspace` (browser-workspace command router)
12
12
  */
13
- export { BROWSER_SERVICE_TYPE, type BrowserTarget, BrowserService, } from "./browser-service.js";
14
- export { executeBrowserAutofillLogin } from "./actions/browser-autofill-login.js";
15
13
  export { browserAction } from "./actions/browser.js";
14
+ export { executeBrowserAutofillLogin } from "./actions/browser-autofill-login.js";
16
15
  export { BROWSER_BRIDGE_SUBACTIONS, type BrowserBridgeSubaction, manageBrowserBridgeAction, } from "./actions/manage-browser-bridge.js";
16
+ export { BROWSER_SERVICE_TYPE, BrowserService, type BrowserTarget, } from "./browser-service.js";
17
+ export * from "./bridge-policy.js";
18
+ export * from "./bridge-readiness.js";
19
+ export * from "./bridge-records.js";
20
+ export * from "./companion-auth.js";
17
21
  export * from "./contracts.js";
22
+ export { BrowserBridgeAdapter } from "./message-adapter.js";
18
23
  export * from "./packaging.js";
24
+ export * from "./password-manager-bridge.js";
19
25
  export { browserPlugin } from "./plugin.js";
20
26
  export * from "./routes/bridge.js";
21
27
  export * from "./schema.js";
22
28
  export * from "./service.js";
23
- export { FRAME_FILE, startBrowserCapture, stopBrowserCapture, type BrowserCaptureConfig, } from "./workspace/browser-capture.js";
29
+ export { type BrowserCaptureConfig, FRAME_FILE, startBrowserCapture, stopBrowserCapture, } from "./workspace/browser-capture.js";
24
30
  export * from "./workspace/index.js";
25
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,oBAAoB,EACpB,KAAK,aAAa,EAClB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,oBAAoB,GAC1B,MAAM,gCAAgC,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EACL,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,aAAa,GACnB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,KAAK,oBAAoB,EACzB,UAAU,EACV,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,15 +1,21 @@
1
- import {
2
- BROWSER_SERVICE_TYPE,
3
- BrowserService
4
- } from "./browser-service.js";
5
- import { executeBrowserAutofillLogin } from "./actions/browser-autofill-login.js";
6
1
  import { browserAction } from "./actions/browser.js";
2
+ import { executeBrowserAutofillLogin } from "./actions/browser-autofill-login.js";
7
3
  import {
8
4
  BROWSER_BRIDGE_SUBACTIONS,
9
5
  manageBrowserBridgeAction
10
6
  } from "./actions/manage-browser-bridge.js";
7
+ import {
8
+ BROWSER_SERVICE_TYPE,
9
+ BrowserService
10
+ } from "./browser-service.js";
11
+ export * from "./bridge-policy.js";
12
+ export * from "./bridge-readiness.js";
13
+ export * from "./bridge-records.js";
14
+ export * from "./companion-auth.js";
11
15
  export * from "./contracts.js";
16
+ import { BrowserBridgeAdapter } from "./message-adapter.js";
12
17
  export * from "./packaging.js";
18
+ export * from "./password-manager-bridge.js";
13
19
  import { browserPlugin } from "./plugin.js";
14
20
  export * from "./routes/bridge.js";
15
21
  export * from "./schema.js";
@@ -20,17 +26,46 @@ import {
20
26
  stopBrowserCapture
21
27
  } from "./workspace/browser-capture.js";
22
28
  export * from "./workspace/index.js";
23
- import { BROWSER_SERVICE_TYPE as _bs_1_BROWSER_SERVICE_TYPE, BrowserService as _bs_2_BrowserService } from "./browser-service.js";
24
- import { executeBrowserAutofillLogin as _bs_3_executeBrowserAutofillLogin } from "./actions/browser-autofill-login.js";
25
29
  import { browserAction as _bs_4_browserAction } from "./actions/browser.js";
26
- import { BROWSER_BRIDGE_SUBACTIONS as _bs_5_BROWSER_BRIDGE_SUBACTIONS, manageBrowserBridgeAction as _bs_6_manageBrowserBridgeAction } from "./actions/manage-browser-bridge.js";
30
+ import { executeBrowserAutofillLogin as _bs_3_executeBrowserAutofillLogin } from "./actions/browser-autofill-login.js";
31
+ import {
32
+ BROWSER_BRIDGE_SUBACTIONS as _bs_5_BROWSER_BRIDGE_SUBACTIONS,
33
+ manageBrowserBridgeAction as _bs_6_manageBrowserBridgeAction
34
+ } from "./actions/manage-browser-bridge.js";
35
+ import {
36
+ BROWSER_SERVICE_TYPE as _bs_1_BROWSER_SERVICE_TYPE,
37
+ BrowserService as _bs_2_BrowserService
38
+ } from "./browser-service.js";
39
+ import { resolveBrowserBridgeCompanionPairingTokenExpiresAt as _bs_13_resolveBrowserBridgeCompanionPairingTokenExpiresAt } from "./bridge-policy.js";
40
+ import { resolveBrowserBridgeReadiness as _bs_11_resolveBrowserBridgeReadiness } from "./bridge-readiness.js";
41
+ import { createBrowserBridgeCompanionStatus as _bs_12_createBrowserBridgeCompanionStatus } from "./bridge-records.js";
27
42
  import { browserPlugin as _bs_7_browserPlugin } from "./plugin.js";
28
- import { FRAME_FILE as _bs_8_FRAME_FILE, startBrowserCapture as _bs_9_startBrowserCapture, stopBrowserCapture as _bs_10_stopBrowserCapture } from "./workspace/browser-capture.js";
29
- const __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ = [_bs_1_BROWSER_SERVICE_TYPE, _bs_2_BrowserService, _bs_3_executeBrowserAutofillLogin, _bs_4_browserAction, _bs_5_BROWSER_BRIDGE_SUBACTIONS, _bs_6_manageBrowserBridgeAction, _bs_7_browserPlugin, _bs_8_FRAME_FILE, _bs_9_startBrowserCapture, _bs_10_stopBrowserCapture];
30
- globalThis.__bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ = __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__;
43
+ import {
44
+ FRAME_FILE as _bs_8_FRAME_FILE,
45
+ startBrowserCapture as _bs_9_startBrowserCapture,
46
+ stopBrowserCapture as _bs_10_stopBrowserCapture
47
+ } from "./workspace/browser-capture.js";
48
+ const __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ = [
49
+ _bs_1_BROWSER_SERVICE_TYPE,
50
+ _bs_2_BrowserService,
51
+ _bs_3_executeBrowserAutofillLogin,
52
+ _bs_4_browserAction,
53
+ _bs_5_BROWSER_BRIDGE_SUBACTIONS,
54
+ _bs_6_manageBrowserBridgeAction,
55
+ _bs_7_browserPlugin,
56
+ _bs_8_FRAME_FILE,
57
+ _bs_9_startBrowserCapture,
58
+ _bs_10_stopBrowserCapture,
59
+ _bs_11_resolveBrowserBridgeReadiness,
60
+ _bs_12_createBrowserBridgeCompanionStatus,
61
+ _bs_13_resolveBrowserBridgeCompanionPairingTokenExpiresAt
62
+ ];
63
+ const bundleSafetyGlobal = globalThis;
64
+ bundleSafetyGlobal.__bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ = __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__;
31
65
  export {
32
66
  BROWSER_BRIDGE_SUBACTIONS,
33
67
  BROWSER_SERVICE_TYPE,
68
+ BrowserBridgeAdapter,
34
69
  BrowserService,
35
70
  FRAME_FILE,
36
71
  browserAction,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @elizaos/plugin-browser — public barrel.\n *\n * Import specific surfaces through the subpath exports defined in\n * `package.json`:\n * - `@elizaos/plugin-browser/contracts`\n * - `@elizaos/plugin-browser/schema`\n * - `@elizaos/plugin-browser/packaging`\n * - `@elizaos/plugin-browser/routes`\n * - `@elizaos/plugin-browser/plugin`\n * - `@elizaos/plugin-browser/workspace` (browser-workspace command router)\n */\n\nexport {\n BROWSER_SERVICE_TYPE,\n type BrowserTarget,\n BrowserService,\n} from \"./browser-service.js\";\nexport { executeBrowserAutofillLogin } from \"./actions/browser-autofill-login.js\";\nexport { browserAction } from \"./actions/browser.js\";\nexport {\n BROWSER_BRIDGE_SUBACTIONS,\n type BrowserBridgeSubaction,\n manageBrowserBridgeAction,\n} from \"./actions/manage-browser-bridge.js\";\nexport * from \"./contracts.js\";\nexport * from \"./packaging.js\";\nexport { browserPlugin } from \"./plugin.js\";\nexport * from \"./routes/bridge.js\";\nexport * from \"./schema.js\";\nexport * from \"./service.js\";\nexport {\n FRAME_FILE,\n startBrowserCapture,\n stopBrowserCapture,\n type BrowserCaptureConfig,\n} from \"./workspace/browser-capture.js\";\nexport * from \"./workspace/index.js\";\n\n// Bundle-safety: force binding identities into the module's init\n// function so Bun.build's tree-shake doesn't collapse this barrel\n// into an empty `init_X = () => {}`. Without this the on-device\n// mobile agent explodes with `ReferenceError: <name> is not defined`\n// when a consumer dereferences a re-exported binding at runtime.\nimport { BROWSER_SERVICE_TYPE as _bs_1_BROWSER_SERVICE_TYPE, BrowserService as _bs_2_BrowserService } from \"./browser-service.js\";\nimport { executeBrowserAutofillLogin as _bs_3_executeBrowserAutofillLogin } from \"./actions/browser-autofill-login.js\";\nimport { browserAction as _bs_4_browserAction } from \"./actions/browser.js\";\nimport { BROWSER_BRIDGE_SUBACTIONS as _bs_5_BROWSER_BRIDGE_SUBACTIONS, manageBrowserBridgeAction as _bs_6_manageBrowserBridgeAction } from \"./actions/manage-browser-bridge.js\";\nimport { browserPlugin as _bs_7_browserPlugin } from \"./plugin.js\";\nimport { FRAME_FILE as _bs_8_FRAME_FILE, startBrowserCapture as _bs_9_startBrowserCapture, stopBrowserCapture as _bs_10_stopBrowserCapture } from \"./workspace/browser-capture.js\";\n// Path-derived symbol so parents that `export *` two of these don't\n// collide on a shared `__BUNDLE_SAFETY__` name.\n// biome-ignore lint/correctness/noUnusedVariables: bundle-safety sink.\nconst __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ = [_bs_1_BROWSER_SERVICE_TYPE, _bs_2_BrowserService, _bs_3_executeBrowserAutofillLogin, _bs_4_browserAction, _bs_5_BROWSER_BRIDGE_SUBACTIONS, _bs_6_manageBrowserBridgeAction, _bs_7_browserPlugin, _bs_8_FRAME_FILE, _bs_9_startBrowserCapture, _bs_10_stopBrowserCapture];\n// biome-ignore lint/suspicious/noExplicitAny: bundle-safety sink.\n(globalThis as any).__bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ = __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__;\n"],"mappings":"AAaA;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,mCAAmC;AAC5C,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,cAAc;AACd,cAAc;AACd,SAAS,qBAAqB;AAC9B,cAAc;AACd,cAAc;AACd,cAAc;AACd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,cAAc;AAOd,SAAS,wBAAwB,4BAA4B,kBAAkB,4BAA4B;AAC3G,SAAS,+BAA+B,yCAAyC;AACjF,SAAS,iBAAiB,2BAA2B;AACrD,SAAS,6BAA6B,iCAAiC,6BAA6B,uCAAuC;AAC3I,SAAS,iBAAiB,2BAA2B;AACrD,SAAS,cAAc,kBAAkB,uBAAuB,2BAA2B,sBAAsB,iCAAiC;AAIlJ,MAAM,qDAAqD,CAAC,4BAA4B,sBAAsB,mCAAmC,qBAAqB,iCAAiC,iCAAiC,qBAAqB,kBAAkB,2BAA2B,yBAAyB;AAElU,WAAmB,qDAAqD;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @elizaos/plugin-browser — public barrel.\n *\n * Import specific surfaces through the subpath exports defined in\n * `package.json`:\n * - `@elizaos/plugin-browser/contracts`\n * - `@elizaos/plugin-browser/schema`\n * - `@elizaos/plugin-browser/packaging`\n * - `@elizaos/plugin-browser/routes`\n * - `@elizaos/plugin-browser/plugin`\n * - `@elizaos/plugin-browser/workspace` (browser-workspace command router)\n */\n\nexport { browserAction } from \"./actions/browser.js\";\nexport { executeBrowserAutofillLogin } from \"./actions/browser-autofill-login.js\";\nexport {\n BROWSER_BRIDGE_SUBACTIONS,\n type BrowserBridgeSubaction,\n manageBrowserBridgeAction,\n} from \"./actions/manage-browser-bridge.js\";\nexport {\n BROWSER_SERVICE_TYPE,\n BrowserService,\n type BrowserTarget,\n} from \"./browser-service.js\";\nexport * from \"./bridge-policy.js\";\nexport * from \"./bridge-readiness.js\";\nexport * from \"./bridge-records.js\";\nexport * from \"./companion-auth.js\";\nexport * from \"./contracts.js\";\nexport { BrowserBridgeAdapter } from \"./message-adapter.js\";\nexport * from \"./packaging.js\";\nexport * from \"./password-manager-bridge.js\";\nexport { browserPlugin } from \"./plugin.js\";\nexport * from \"./routes/bridge.js\";\nexport * from \"./schema.js\";\nexport * from \"./service.js\";\nexport {\n type BrowserCaptureConfig,\n FRAME_FILE,\n startBrowserCapture,\n stopBrowserCapture,\n} from \"./workspace/browser-capture.js\";\nexport * from \"./workspace/index.js\";\n\nimport { browserAction as _bs_4_browserAction } from \"./actions/browser.js\";\nimport { executeBrowserAutofillLogin as _bs_3_executeBrowserAutofillLogin } from \"./actions/browser-autofill-login.js\";\nimport {\n BROWSER_BRIDGE_SUBACTIONS as _bs_5_BROWSER_BRIDGE_SUBACTIONS,\n manageBrowserBridgeAction as _bs_6_manageBrowserBridgeAction,\n} from \"./actions/manage-browser-bridge.js\";\n// Bundle-safety: force binding identities into the module's init\n// function so Bun.build's tree-shake doesn't collapse this barrel\n// into an empty `init_X = () => {}`. Without this the on-device\n// mobile agent explodes with `ReferenceError: <name> is not defined`\n// when a consumer dereferences a re-exported binding at runtime.\nimport {\n BROWSER_SERVICE_TYPE as _bs_1_BROWSER_SERVICE_TYPE,\n BrowserService as _bs_2_BrowserService,\n} from \"./browser-service.js\";\nimport { resolveBrowserBridgeCompanionPairingTokenExpiresAt as _bs_13_resolveBrowserBridgeCompanionPairingTokenExpiresAt } from \"./bridge-policy.js\";\nimport { resolveBrowserBridgeReadiness as _bs_11_resolveBrowserBridgeReadiness } from \"./bridge-readiness.js\";\nimport { createBrowserBridgeCompanionStatus as _bs_12_createBrowserBridgeCompanionStatus } from \"./bridge-records.js\";\nimport { browserPlugin as _bs_7_browserPlugin } from \"./plugin.js\";\nimport {\n FRAME_FILE as _bs_8_FRAME_FILE,\n startBrowserCapture as _bs_9_startBrowserCapture,\n stopBrowserCapture as _bs_10_stopBrowserCapture,\n} from \"./workspace/browser-capture.js\";\n\n// Path-derived symbol so parents that `export *` two of these don't\n// collide on a shared `__BUNDLE_SAFETY__` name.\n// biome-ignore lint/correctness/noUnusedVariables: bundle-safety sink.\nconst __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ = [\n _bs_1_BROWSER_SERVICE_TYPE,\n _bs_2_BrowserService,\n _bs_3_executeBrowserAutofillLogin,\n _bs_4_browserAction,\n _bs_5_BROWSER_BRIDGE_SUBACTIONS,\n _bs_6_manageBrowserBridgeAction,\n _bs_7_browserPlugin,\n _bs_8_FRAME_FILE,\n _bs_9_startBrowserCapture,\n _bs_10_stopBrowserCapture,\n _bs_11_resolveBrowserBridgeReadiness,\n _bs_12_createBrowserBridgeCompanionStatus,\n _bs_13_resolveBrowserBridgeCompanionPairingTokenExpiresAt,\n];\nconst bundleSafetyGlobal = globalThis as typeof globalThis & {\n __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__?: typeof __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__;\n};\nbundleSafetyGlobal.__bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__ =\n __bundle_safety_PLUGINS_PLUGIN_BROWSER_SRC_INDEX__;\n"],"mappings":"AAaA,SAAS,qBAAqB;AAC9B,SAAS,mCAAmC;AAC5C;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,4BAA4B;AACrC,cAAc;AACd,cAAc;AACd,SAAS,qBAAqB;AAC9B,cAAc;AACd,cAAc;AACd,cAAc;AACd;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,cAAc;AAEd,SAAS,iBAAiB,2BAA2B;AACrD,SAAS,+BAA+B,yCAAyC;AACjF;AAAA,EACE,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,OACxB;AAMP;AAAA,EACE,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,OACb;AACP,SAAS,sDAAsD,iEAAiE;AAChI,SAAS,iCAAiC,4CAA4C;AACtF,SAAS,sCAAsC,iDAAiD;AAChG,SAAS,iBAAiB,2BAA2B;AACrD;AAAA,EACE,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,OACjB;AAKP,MAAM,qDAAqD;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,qBAAqB;AAG3B,mBAAmB,qDACjB;","names":[]}