@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,3 +1,9 @@
1
+ import { requestBrowserWorkspace } from "../workspace/browser-workspace-desktop.js";
2
+ import {
3
+ createBrowserWorkspaceError,
4
+ isBrowserWorkspaceError
5
+ } from "../workspace/browser-workspace-errors.js";
6
+ import { assertBrowserWorkspaceUserScriptAllowed } from "../workspace/browser-workspace-helpers.js";
1
7
  import {
2
8
  closeBrowserWorkspaceTab,
3
9
  evaluateBrowserWorkspaceTab,
@@ -5,6 +11,7 @@ import {
5
11
  getBrowserWorkspaceSnapshot,
6
12
  getBrowserWorkspaceUnavailableMessage,
7
13
  hideBrowserWorkspaceTab,
14
+ isBrowserWorkspaceBridgeConfigured,
8
15
  listBrowserWorkspaceTabs,
9
16
  navigateBrowserWorkspaceTab,
10
17
  openBrowserWorkspaceTab,
@@ -15,10 +22,36 @@ import {
15
22
  assertBrowserWorkspaceCommandConnectorAccountGate,
16
23
  assertBrowserWorkspaceConnectorAccountGate
17
24
  } from "./workspace-account-gate.js";
25
+ function statusFromBrowserWorkspaceErrorCode(code, message) {
26
+ switch (code) {
27
+ case "invalid_url":
28
+ case "unknown_element_ref":
29
+ return 400;
30
+ case "tab_not_found":
31
+ return 404;
32
+ case "target_missing":
33
+ return 409;
34
+ case "desktop_only":
35
+ return message.includes(getBrowserWorkspaceUnavailableMessage()) ? 503 : 409;
36
+ case "script_forbidden":
37
+ case "connector_secret_export_forbidden":
38
+ return 403;
39
+ case "timeout":
40
+ return 504;
41
+ case "command_failed":
42
+ return 500;
43
+ }
44
+ }
18
45
  function statusFromBrowserWorkspaceError(error, message) {
19
46
  if (error instanceof Error && "status" in error && typeof error.status === "number") {
20
47
  return error.status;
21
48
  }
49
+ if (isBrowserWorkspaceError(error)) {
50
+ return statusFromBrowserWorkspaceErrorCode(
51
+ error.browserWorkspaceErrorCode,
52
+ message
53
+ );
54
+ }
22
55
  if (message.includes(getBrowserWorkspaceUnavailableMessage())) {
23
56
  return 503;
24
57
  }
@@ -40,6 +73,33 @@ function connectorReferenceFromSearchParams(url) {
40
73
  partition: url?.searchParams.get("partition")
41
74
  };
42
75
  }
76
+ function buildBrowserWorkspaceEventsBridgePath(url) {
77
+ const params = new URLSearchParams();
78
+ for (const key of ["after", "limit", "tabId", "type"]) {
79
+ const value = url?.searchParams.get(key)?.trim();
80
+ if (value) {
81
+ params.set(key, value);
82
+ }
83
+ }
84
+ const query = params.toString();
85
+ return query ? `/events?${query}` : "/events";
86
+ }
87
+ function isBrowserWorkspaceRouteBodyObject(value) {
88
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
89
+ }
90
+ function rejectMalformedBrowserWorkspacePayload(ctx) {
91
+ ctx.json(ctx.res, { error: "request body must be a JSON object" }, 400);
92
+ return true;
93
+ }
94
+ function decodeBrowserWorkspaceTabId(raw) {
95
+ if (typeof raw !== "string") return null;
96
+ try {
97
+ const decoded = decodeURIComponent(raw).trim();
98
+ return decoded ? decoded : null;
99
+ } catch {
100
+ return null;
101
+ }
102
+ }
43
103
  async function assertBrowserWorkspaceTabConnectorAccountGate(ctx, tabId, reference, operation) {
44
104
  const tabs = await listBrowserWorkspaceTabs();
45
105
  const tab = tabs.find((entry) => entry.id === tabId) ?? null;
@@ -53,7 +113,7 @@ async function assertBrowserWorkspaceTabConnectorAccountGate(ctx, tabId, referen
53
113
  }
54
114
  async function handleBrowserWorkspaceRoutes(ctx) {
55
115
  const { req, res, method, pathname, readJsonBody, json } = ctx;
56
- if (pathname !== "/api/browser-workspace" && pathname !== "/api/browser-workspace/command" && pathname !== "/api/browser-workspace/tabs" && !pathname.startsWith("/api/browser-workspace/tabs/")) {
116
+ if (pathname !== "/api/browser-workspace" && pathname !== "/api/browser-workspace/command" && pathname !== "/api/browser-workspace/events" && pathname !== "/api/browser-workspace/tabs" && !pathname.startsWith("/api/browser-workspace/tabs/")) {
57
117
  return false;
58
118
  }
59
119
  try {
@@ -61,8 +121,27 @@ async function handleBrowserWorkspaceRoutes(ctx) {
61
121
  json(res, await getBrowserWorkspaceSnapshot());
62
122
  return true;
63
123
  }
124
+ if (pathname === "/api/browser-workspace/events" && method === "GET") {
125
+ if (!isBrowserWorkspaceBridgeConfigured()) {
126
+ throw createBrowserWorkspaceError(
127
+ "desktop_only",
128
+ "events",
129
+ getBrowserWorkspaceUnavailableMessage()
130
+ );
131
+ }
132
+ json(
133
+ res,
134
+ await requestBrowserWorkspace(
135
+ buildBrowserWorkspaceEventsBridgePath(ctx.url)
136
+ )
137
+ );
138
+ return true;
139
+ }
64
140
  if (pathname === "/api/browser-workspace/command" && method === "POST") {
65
141
  const body = await readJsonBody(req, res) ?? null;
142
+ if (!isBrowserWorkspaceRouteBodyObject(body)) {
143
+ return rejectMalformedBrowserWorkspacePayload(ctx);
144
+ }
66
145
  if (!body?.subaction) {
67
146
  json(res, { error: "subaction is required" }, 400);
68
147
  return true;
@@ -80,7 +159,10 @@ async function handleBrowserWorkspaceRoutes(ctx) {
80
159
  return true;
81
160
  }
82
161
  if (pathname === "/api/browser-workspace/tabs" && method === "POST") {
83
- const body = await readJsonBody(req, res) ?? {};
162
+ const body = await readJsonBody(req, res) ?? null;
163
+ if (!isBrowserWorkspaceRouteBodyObject(body)) {
164
+ return rejectMalformedBrowserWorkspacePayload(ctx);
165
+ }
84
166
  const connectorGate = await assertBrowserWorkspaceConnectorAccountGate({
85
167
  runtime: ctx.state?.runtime ?? null,
86
168
  connectorProvider: body.connectorProvider,
@@ -102,7 +184,11 @@ async function handleBrowserWorkspaceRoutes(ctx) {
102
184
  if (!match) {
103
185
  return false;
104
186
  }
105
- const tabId = decodeURIComponent(match[1]).trim();
187
+ const tabId = decodeBrowserWorkspaceTabId(match[1]);
188
+ if (!tabId) {
189
+ json(res, { error: "valid tab id is required" }, 400);
190
+ return true;
191
+ }
106
192
  const action = match[2] ?? null;
107
193
  if (!action && method === "DELETE") {
108
194
  await assertBrowserWorkspaceTabConnectorAccountGate(
@@ -151,6 +237,9 @@ async function handleBrowserWorkspaceRoutes(ctx) {
151
237
  }
152
238
  if (action === "navigate" && method === "POST") {
153
239
  const body = await readJsonBody(req, res);
240
+ if (!isBrowserWorkspaceRouteBodyObject(body)) {
241
+ return rejectMalformedBrowserWorkspacePayload(ctx);
242
+ }
154
243
  if (!body?.url?.trim()) {
155
244
  json(res, { error: "url is required" }, 400);
156
245
  return true;
@@ -171,6 +260,9 @@ async function handleBrowserWorkspaceRoutes(ctx) {
171
260
  }
172
261
  if (action === "eval" && method === "POST") {
173
262
  const body = await readJsonBody(req, res);
263
+ if (!isBrowserWorkspaceRouteBodyObject(body)) {
264
+ return rejectMalformedBrowserWorkspacePayload(ctx);
265
+ }
174
266
  if (!body?.script?.trim()) {
175
267
  json(res, { error: "script is required" }, 400);
176
268
  return true;
@@ -181,6 +273,7 @@ async function handleBrowserWorkspaceRoutes(ctx) {
181
273
  body,
182
274
  "evaluate browser workspace tab"
183
275
  );
276
+ assertBrowserWorkspaceUserScriptAllowed(body.script, "eval", "desktop");
184
277
  json(res, {
185
278
  result: await evaluateBrowserWorkspaceTab({
186
279
  id: tabId,
@@ -193,13 +286,20 @@ async function handleBrowserWorkspaceRoutes(ctx) {
193
286
  } catch (error) {
194
287
  const message = error instanceof Error ? error.message : String(error);
195
288
  const status = statusFromBrowserWorkspaceError(error, message);
196
- json(res, { error: message }, status);
289
+ const body = {
290
+ error: message
291
+ };
292
+ if (isBrowserWorkspaceError(error)) {
293
+ body.code = error.browserWorkspaceErrorCode;
294
+ }
295
+ json(res, body, status);
197
296
  return true;
198
297
  }
199
298
  }
200
299
  const BROWSER_WORKSPACE_ROUTE_PATHS = [
201
300
  { type: "GET", path: "/api/browser-workspace" },
202
301
  { type: "POST", path: "/api/browser-workspace/command" },
302
+ { type: "GET", path: "/api/browser-workspace/events" },
203
303
  { type: "GET", path: "/api/browser-workspace/tabs" },
204
304
  { type: "POST", path: "/api/browser-workspace/tabs" },
205
305
  { type: "DELETE", path: "/api/browser-workspace/tabs/:tabId" },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/workspace.ts"],"sourcesContent":["/**\n * Browser workspace HTTP routes.\n *\n * The runtime mounts these via `Plugin.routes` with `rawPath: true` so the\n * legacy `/api/browser-workspace/*` paths are preserved. Implementation\n * lives in `@elizaos/plugin-browser/workspace`; this is the HTTP edge.\n */\n\nimport type { RouteRequestContext } from \"@elizaos/core\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n type BrowserWorkspaceCommand,\n closeBrowserWorkspaceTab,\n evaluateBrowserWorkspaceTab,\n executeBrowserWorkspaceCommand,\n getBrowserWorkspaceSnapshot,\n getBrowserWorkspaceUnavailableMessage,\n hideBrowserWorkspaceTab,\n listBrowserWorkspaceTabs,\n navigateBrowserWorkspaceTab,\n openBrowserWorkspaceTab,\n showBrowserWorkspaceTab,\n snapshotBrowserWorkspaceTab,\n} from \"../workspace/index.js\";\nimport {\n assertBrowserWorkspaceCommandConnectorAccountGate,\n assertBrowserWorkspaceConnectorAccountGate,\n} from \"./workspace-account-gate.js\";\n\ntype OpenBrowserWorkspaceBody = {\n url?: string;\n title?: string;\n show?: boolean;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n kind?: \"internal\" | \"standard\";\n width?: number;\n height?: number;\n};\n\ntype NavigateBrowserWorkspaceBody = {\n url?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype EvaluateBrowserWorkspaceBody = {\n script?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype BrowserWorkspaceCommandBody = BrowserWorkspaceCommand;\ntype BrowserWorkspaceConnectorReference = {\n partition?: string | null;\n connectorProvider?: string | null;\n connectorAccountId?: string | null;\n};\n\nexport interface BrowserWorkspaceRouteContext extends RouteRequestContext {\n url?: URL;\n state?: {\n runtime?: IAgentRuntime | null;\n };\n}\n\nfunction statusFromBrowserWorkspaceError(\n error: unknown,\n message: string,\n): number {\n if (\n error instanceof Error &&\n \"status\" in error &&\n typeof error.status === \"number\"\n ) {\n return error.status;\n }\n if (message.includes(getBrowserWorkspaceUnavailableMessage())) {\n return 503;\n }\n if (message.includes(\"only available in the desktop app\")) {\n return 409;\n }\n if (message.includes(\"failed (404)\")) {\n return 404;\n }\n if (message.includes(\"failed (409)\")) {\n return 409;\n }\n return 500;\n}\n\nfunction connectorReferenceFromSearchParams(\n url: URL | undefined,\n): BrowserWorkspaceConnectorReference {\n return {\n connectorProvider: url?.searchParams.get(\"connectorProvider\"),\n connectorAccountId: url?.searchParams.get(\"connectorAccountId\"),\n partition: url?.searchParams.get(\"partition\"),\n };\n}\n\nasync function assertBrowserWorkspaceTabConnectorAccountGate(\n ctx: BrowserWorkspaceRouteContext,\n tabId: string,\n reference: BrowserWorkspaceConnectorReference,\n operation: string,\n): Promise<void> {\n const tabs = await listBrowserWorkspaceTabs();\n const tab = tabs.find((entry) => entry.id === tabId) ?? null;\n await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: reference.connectorProvider,\n connectorAccountId: reference.connectorAccountId,\n partition: tab?.partition ?? reference.partition,\n operation,\n });\n}\n\nexport async function handleBrowserWorkspaceRoutes(\n ctx: BrowserWorkspaceRouteContext,\n): Promise<boolean> {\n const { req, res, method, pathname, readJsonBody, json } = ctx;\n\n if (\n pathname !== \"/api/browser-workspace\" &&\n pathname !== \"/api/browser-workspace/command\" &&\n pathname !== \"/api/browser-workspace/tabs\" &&\n !pathname.startsWith(\"/api/browser-workspace/tabs/\")\n ) {\n return false;\n }\n\n try {\n if (pathname === \"/api/browser-workspace\" && method === \"GET\") {\n json(res, await getBrowserWorkspaceSnapshot());\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/command\" && method === \"POST\") {\n const body =\n (await readJsonBody<BrowserWorkspaceCommandBody>(req, res)) ?? null;\n if (!body?.subaction) {\n json(res, { error: \"subaction is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceCommandConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n command: body,\n operation: \"browser workspace command\",\n });\n json(res, await executeBrowserWorkspaceCommand(body));\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"GET\") {\n json(res, { tabs: await listBrowserWorkspaceTabs() });\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"POST\") {\n const body =\n (await readJsonBody<OpenBrowserWorkspaceBody>(req, res)) ?? {};\n const connectorGate = await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: body.connectorProvider,\n connectorAccountId: body.connectorAccountId,\n partition: body.partition,\n operation: \"open browser workspace tab\",\n });\n json(res, {\n tab: await openBrowserWorkspaceTab({\n ...body,\n partition: connectorGate?.expectedPartition ?? body.partition,\n }),\n });\n return true;\n }\n\n const match = pathname.match(\n /^\\/api\\/browser-workspace\\/tabs\\/([^/]+)(?:\\/(navigate|eval|show|hide|snapshot))?$/,\n );\n if (!match) {\n return false;\n }\n\n const tabId = decodeURIComponent(match[1]).trim();\n const action = match[2] ?? null;\n\n if (!action && method === \"DELETE\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"close browser workspace tab\",\n );\n const closed = await closeBrowserWorkspaceTab(tabId);\n json(\n res,\n closed ? { closed: true } : { closed: false },\n closed ? 200 : 404,\n );\n return true;\n }\n\n if (action === \"show\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"show browser workspace tab\",\n );\n json(res, { tab: await showBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"hide\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"hide browser workspace tab\",\n );\n json(res, { tab: await hideBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"snapshot\" && method === \"GET\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"snapshot browser workspace tab\",\n );\n json(res, await snapshotBrowserWorkspaceTab(tabId));\n return true;\n }\n\n if (action === \"navigate\" && method === \"POST\") {\n const body = await readJsonBody<NavigateBrowserWorkspaceBody>(req, res);\n if (!body?.url?.trim()) {\n json(res, { error: \"url is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"navigate browser workspace tab\",\n );\n json(res, {\n tab: await navigateBrowserWorkspaceTab({\n id: tabId,\n url: body.url,\n }),\n });\n return true;\n }\n\n if (action === \"eval\" && method === \"POST\") {\n const body = await readJsonBody<EvaluateBrowserWorkspaceBody>(req, res);\n if (!body?.script?.trim()) {\n json(res, { error: \"script is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"evaluate browser workspace tab\",\n );\n json(res, {\n result: await evaluateBrowserWorkspaceTab({\n id: tabId,\n script: body.script,\n }),\n });\n return true;\n }\n\n return false;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = statusFromBrowserWorkspaceError(error, message);\n json(res, { error: message }, status);\n return true;\n }\n}\n\nexport const BROWSER_WORKSPACE_ROUTE_PATHS: Array<{\n type: string;\n path: string;\n}> = [\n { type: \"GET\", path: \"/api/browser-workspace\" },\n { type: \"POST\", path: \"/api/browser-workspace/command\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs\" },\n { type: \"DELETE\", path: \"/api/browser-workspace/tabs/:tabId\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/show\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/hide\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs/:tabId/snapshot\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/navigate\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/eval\" },\n];\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/routes/workspace.ts"],"sourcesContent":["/**\n * Browser workspace HTTP routes.\n *\n * The runtime mounts these via `Plugin.routes` with `rawPath: true` so the\n * legacy `/api/browser-workspace/*` paths are preserved. Implementation\n * lives in `@elizaos/plugin-browser/workspace`; this is the HTTP edge.\n */\n\nimport type { IAgentRuntime, RouteRequestContext } from \"@elizaos/core\";\nimport { requestBrowserWorkspace } from \"../workspace/browser-workspace-desktop.js\";\nimport {\n type BrowserWorkspaceErrorCode,\n createBrowserWorkspaceError,\n isBrowserWorkspaceError,\n} from \"../workspace/browser-workspace-errors.js\";\nimport { assertBrowserWorkspaceUserScriptAllowed } from \"../workspace/browser-workspace-helpers.js\";\nimport type { BrowserWorkspaceEventLogSnapshot } from \"../workspace/browser-workspace-types.js\";\nimport {\n type BrowserWorkspaceCommand,\n closeBrowserWorkspaceTab,\n evaluateBrowserWorkspaceTab,\n executeBrowserWorkspaceCommand,\n getBrowserWorkspaceSnapshot,\n getBrowserWorkspaceUnavailableMessage,\n hideBrowserWorkspaceTab,\n isBrowserWorkspaceBridgeConfigured,\n listBrowserWorkspaceTabs,\n navigateBrowserWorkspaceTab,\n openBrowserWorkspaceTab,\n showBrowserWorkspaceTab,\n snapshotBrowserWorkspaceTab,\n} from \"../workspace/index.js\";\nimport {\n assertBrowserWorkspaceCommandConnectorAccountGate,\n assertBrowserWorkspaceConnectorAccountGate,\n} from \"./workspace-account-gate.js\";\n\ntype OpenBrowserWorkspaceBody = {\n url?: string;\n title?: string;\n show?: boolean;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n kind?: \"internal\" | \"standard\";\n width?: number;\n height?: number;\n};\n\ntype NavigateBrowserWorkspaceBody = {\n url?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype EvaluateBrowserWorkspaceBody = {\n script?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype BrowserWorkspaceCommandBody = BrowserWorkspaceCommand;\ntype BrowserWorkspaceConnectorReference = {\n partition?: string | null;\n connectorProvider?: string | null;\n connectorAccountId?: string | null;\n};\n\nexport interface BrowserWorkspaceRouteContext extends RouteRequestContext {\n url?: URL;\n state?: {\n runtime?: IAgentRuntime | null;\n };\n}\n\nfunction statusFromBrowserWorkspaceErrorCode(\n code: BrowserWorkspaceErrorCode,\n message: string,\n): number {\n switch (code) {\n case \"invalid_url\":\n case \"unknown_element_ref\":\n return 400;\n case \"tab_not_found\":\n return 404;\n case \"target_missing\":\n return 409;\n case \"desktop_only\":\n return message.includes(getBrowserWorkspaceUnavailableMessage())\n ? 503\n : 409;\n case \"script_forbidden\":\n case \"connector_secret_export_forbidden\":\n return 403;\n case \"timeout\":\n return 504;\n case \"command_failed\":\n return 500;\n }\n}\n\nfunction statusFromBrowserWorkspaceError(\n error: unknown,\n message: string,\n): number {\n if (\n error instanceof Error &&\n \"status\" in error &&\n typeof error.status === \"number\"\n ) {\n return error.status;\n }\n if (isBrowserWorkspaceError(error)) {\n return statusFromBrowserWorkspaceErrorCode(\n error.browserWorkspaceErrorCode,\n message,\n );\n }\n if (message.includes(getBrowserWorkspaceUnavailableMessage())) {\n return 503;\n }\n if (message.includes(\"only available in the desktop app\")) {\n return 409;\n }\n if (message.includes(\"failed (404)\")) {\n return 404;\n }\n if (message.includes(\"failed (409)\")) {\n return 409;\n }\n return 500;\n}\n\nfunction connectorReferenceFromSearchParams(\n url: URL | undefined,\n): BrowserWorkspaceConnectorReference {\n return {\n connectorProvider: url?.searchParams.get(\"connectorProvider\"),\n connectorAccountId: url?.searchParams.get(\"connectorAccountId\"),\n partition: url?.searchParams.get(\"partition\"),\n };\n}\n\nfunction buildBrowserWorkspaceEventsBridgePath(url: URL | undefined): string {\n const params = new URLSearchParams();\n for (const key of [\"after\", \"limit\", \"tabId\", \"type\"]) {\n const value = url?.searchParams.get(key)?.trim();\n if (value) {\n params.set(key, value);\n }\n }\n const query = params.toString();\n return query ? `/events?${query}` : \"/events\";\n}\n\nfunction isBrowserWorkspaceRouteBodyObject(\n value: unknown,\n): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction rejectMalformedBrowserWorkspacePayload(\n ctx: BrowserWorkspaceRouteContext,\n): true {\n ctx.json(ctx.res, { error: \"request body must be a JSON object\" }, 400);\n return true;\n}\n\nfunction decodeBrowserWorkspaceTabId(raw: string | undefined): string | null {\n if (typeof raw !== \"string\") return null;\n try {\n const decoded = decodeURIComponent(raw).trim();\n return decoded ? decoded : null;\n } catch {\n return null;\n }\n}\n\nasync function assertBrowserWorkspaceTabConnectorAccountGate(\n ctx: BrowserWorkspaceRouteContext,\n tabId: string,\n reference: BrowserWorkspaceConnectorReference,\n operation: string,\n): Promise<void> {\n const tabs = await listBrowserWorkspaceTabs();\n const tab = tabs.find((entry) => entry.id === tabId) ?? null;\n await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: reference.connectorProvider,\n connectorAccountId: reference.connectorAccountId,\n partition: tab?.partition ?? reference.partition,\n operation,\n });\n}\n\nexport async function handleBrowserWorkspaceRoutes(\n ctx: BrowserWorkspaceRouteContext,\n): Promise<boolean> {\n const { req, res, method, pathname, readJsonBody, json } = ctx;\n\n if (\n pathname !== \"/api/browser-workspace\" &&\n pathname !== \"/api/browser-workspace/command\" &&\n pathname !== \"/api/browser-workspace/events\" &&\n pathname !== \"/api/browser-workspace/tabs\" &&\n !pathname.startsWith(\"/api/browser-workspace/tabs/\")\n ) {\n return false;\n }\n\n try {\n if (pathname === \"/api/browser-workspace\" && method === \"GET\") {\n json(res, await getBrowserWorkspaceSnapshot());\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/events\" && method === \"GET\") {\n if (!isBrowserWorkspaceBridgeConfigured()) {\n throw createBrowserWorkspaceError(\n \"desktop_only\",\n \"events\",\n getBrowserWorkspaceUnavailableMessage(),\n );\n }\n json(\n res,\n await requestBrowserWorkspace<BrowserWorkspaceEventLogSnapshot>(\n buildBrowserWorkspaceEventsBridgePath(ctx.url),\n ),\n );\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/command\" && method === \"POST\") {\n const body =\n (await readJsonBody<BrowserWorkspaceCommandBody>(req, res)) ?? null;\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n if (!body?.subaction) {\n json(res, { error: \"subaction is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceCommandConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n command: body,\n operation: \"browser workspace command\",\n });\n json(res, await executeBrowserWorkspaceCommand(body));\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"GET\") {\n json(res, { tabs: await listBrowserWorkspaceTabs() });\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"POST\") {\n const body =\n (await readJsonBody<OpenBrowserWorkspaceBody>(req, res)) ?? null;\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n const connectorGate = await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: body.connectorProvider,\n connectorAccountId: body.connectorAccountId,\n partition: body.partition,\n operation: \"open browser workspace tab\",\n });\n json(res, {\n tab: await openBrowserWorkspaceTab({\n ...body,\n partition: connectorGate?.expectedPartition ?? body.partition,\n }),\n });\n return true;\n }\n\n const match = pathname.match(\n /^\\/api\\/browser-workspace\\/tabs\\/([^/]+)(?:\\/(navigate|eval|show|hide|snapshot))?$/,\n );\n if (!match) {\n return false;\n }\n\n const tabId = decodeBrowserWorkspaceTabId(match[1]);\n if (!tabId) {\n json(res, { error: \"valid tab id is required\" }, 400);\n return true;\n }\n const action = match[2] ?? null;\n\n if (!action && method === \"DELETE\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"close browser workspace tab\",\n );\n const closed = await closeBrowserWorkspaceTab(tabId);\n json(\n res,\n closed ? { closed: true } : { closed: false },\n closed ? 200 : 404,\n );\n return true;\n }\n\n if (action === \"show\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"show browser workspace tab\",\n );\n json(res, { tab: await showBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"hide\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"hide browser workspace tab\",\n );\n json(res, { tab: await hideBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"snapshot\" && method === \"GET\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"snapshot browser workspace tab\",\n );\n json(res, await snapshotBrowserWorkspaceTab(tabId));\n return true;\n }\n\n if (action === \"navigate\" && method === \"POST\") {\n const body = await readJsonBody<NavigateBrowserWorkspaceBody>(req, res);\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n if (!body?.url?.trim()) {\n json(res, { error: \"url is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"navigate browser workspace tab\",\n );\n json(res, {\n tab: await navigateBrowserWorkspaceTab({\n id: tabId,\n url: body.url,\n }),\n });\n return true;\n }\n\n if (action === \"eval\" && method === \"POST\") {\n const body = await readJsonBody<EvaluateBrowserWorkspaceBody>(req, res);\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n if (!body?.script?.trim()) {\n json(res, { error: \"script is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"evaluate browser workspace tab\",\n );\n assertBrowserWorkspaceUserScriptAllowed(body.script, \"eval\", \"desktop\");\n json(res, {\n result: await evaluateBrowserWorkspaceTab({\n id: tabId,\n script: body.script,\n }),\n });\n return true;\n }\n\n return false;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = statusFromBrowserWorkspaceError(error, message);\n const body: { code?: BrowserWorkspaceErrorCode; error: string } = {\n error: message,\n };\n if (isBrowserWorkspaceError(error)) {\n body.code = error.browserWorkspaceErrorCode;\n }\n json(res, body, status);\n return true;\n }\n}\n\nexport const BROWSER_WORKSPACE_ROUTE_PATHS: Array<{\n type: string;\n path: string;\n}> = [\n { type: \"GET\", path: \"/api/browser-workspace\" },\n { type: \"POST\", path: \"/api/browser-workspace/command\" },\n { type: \"GET\", path: \"/api/browser-workspace/events\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs\" },\n { type: \"DELETE\", path: \"/api/browser-workspace/tabs/:tabId\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/show\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/hide\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs/:tabId/snapshot\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/navigate\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/eval\" },\n];\n"],"mappings":"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","names":[]}
package/dist/schema.d.ts CHANGED
@@ -17,8 +17,8 @@
17
17
  * Migrations are applied via elizaOS plugin-sql's `runPluginMigrations`
18
18
  * when the plugin's `schema` field is populated and an appropriate
19
19
  * migration strategy is selected. Renaming the old `life_browser_*`
20
- * tables to `browser_bridge_*` is a destructive migration gate it on
21
- * `ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS=true`.
20
+ * tables to `browser_bridge_*` is a destructive migration controlled by
21
+ * plugin-sql's destructive-migration override.
22
22
  */
23
23
  export declare const browserPgSchema: import("drizzle-orm/pg-core").PgSchema<"browser">;
24
24
  export declare const browserBridgeCompanions: import("drizzle-orm/pg-core").PgTableWithColumns<{
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema.ts"],"sourcesContent":["/**\n * Agent Browser Bridge Drizzle schema.\n *\n * The four generic browser tables (`browser_bridge_companions`,\n * `browser_bridge_settings`, `browser_bridge_tabs`,\n * `browser_bridge_page_contexts`) are owned by this plugin. The\n * workflow-bound `life_browser_sessions` table remains in LifeOps because\n * it carries `workflowId` plus LifeOps-only scoping columns.\n *\n * Tables are placed in the `browser` PostgreSQL schema (matches the\n * `deriveSchemaName(\"@elizaos/plugin-browser\")` result used by\n * plugin-sql's runtime migrator) so they no longer trip the\n * \"Plugin table is using public schema\" warning. The runtime migrator\n * issues `CREATE SCHEMA IF NOT EXISTS` automatically before applying\n * migrations.\n *\n * Migrations are applied via elizaOS plugin-sql's `runPluginMigrations`\n * when the plugin's `schema` field is populated and an appropriate\n * migration strategy is selected. Renaming the old `life_browser_*`\n * tables to `browser_bridge_*` is a destructive migration — gate it on\n * `ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS=true`.\n */\n\nimport {\n boolean,\n index,\n integer,\n pgSchema,\n text,\n unique,\n} from \"drizzle-orm/pg-core\";\n\nexport const browserPgSchema = pgSchema(\"browser\");\n\nexport const browserBridgeCompanions = browserPgSchema.table(\n \"browser_bridge_companions\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n profileLabel: text(\"profile_label\").notNull().default(\"\"),\n label: text(\"label\").notNull().default(\"\"),\n extensionVersion: text(\"extension_version\"),\n connectionState: text(\"connection_state\").notNull().default(\"disconnected\"),\n permissionsJson: text(\"permissions_json\").notNull().default(\"{}\"),\n pairingTokenHash: text(\"pairing_token_hash\"),\n pairingTokenExpiresAt: text(\"pairing_token_expires_at\"),\n pairingTokenRevokedAt: text(\"pairing_token_revoked_at\"),\n pendingPairingTokenHashesJson: text(\"pending_pairing_token_hashes_json\")\n .notNull()\n .default(\"[]\"),\n lastSeenAt: text(\"last_seen_at\"),\n pairedAt: text(\"paired_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId),\n index(\"idx_browser_bridge_companions_agent\").on(\n t.agentId,\n t.browser,\n t.updatedAt,\n ),\n ],\n);\n\nexport const browserBridgeSettings = browserPgSchema.table(\n \"browser_bridge_settings\",\n {\n agentId: text(\"agent_id\").primaryKey(),\n enabled: boolean(\"enabled\").notNull().default(false),\n trackingMode: text(\"tracking_mode\").notNull().default(\"current_tab\"),\n allowBrowserControl: boolean(\"allow_browser_control\")\n .notNull()\n .default(false),\n requireConfirmationForAccountAffecting: boolean(\n \"require_confirmation_for_account_affecting\",\n )\n .notNull()\n .default(true),\n incognitoEnabled: boolean(\"incognito_enabled\").notNull().default(false),\n siteAccessMode: text(\"site_access_mode\")\n .notNull()\n .default(\"current_site_only\"),\n grantedOriginsJson: text(\"granted_origins_json\").notNull().default(\"[]\"),\n blockedOriginsJson: text(\"blocked_origins_json\").notNull().default(\"[]\"),\n maxRememberedTabs: integer(\"max_remembered_tabs\").notNull().default(10),\n pauseUntil: text(\"pause_until\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n);\n\nexport const browserBridgeTabs = browserPgSchema.table(\n \"browser_bridge_tabs\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n companionId: text(\"companion_id\"),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n activeInWindow: boolean(\"active_in_window\").notNull().default(false),\n focusedWindow: boolean(\"focused_window\").notNull().default(false),\n focusedActive: boolean(\"focused_active\").notNull().default(false),\n incognito: boolean(\"incognito\").notNull().default(false),\n faviconUrl: text(\"favicon_url\"),\n lastSeenAt: text(\"last_seen_at\").notNull(),\n lastFocusedAt: text(\"last_focused_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_tabs_agent\").on(\n t.agentId,\n t.focusedActive,\n t.activeInWindow,\n t.lastSeenAt,\n ),\n ],\n);\n\nexport const browserBridgePageContexts = browserPgSchema.table(\n \"browser_bridge_page_contexts\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n selectionText: text(\"selection_text\"),\n mainText: text(\"main_text\"),\n headingsJson: text(\"headings_json\").notNull().default(\"[]\"),\n linksJson: text(\"links_json\").notNull().default(\"[]\"),\n formsJson: text(\"forms_json\").notNull().default(\"[]\"),\n capturedAt: text(\"captured_at\").notNull(),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_page_contexts_agent\").on(t.agentId, t.capturedAt),\n ],\n);\n\nexport const browserBridgeSchema = {\n browserBridgeCompanions,\n browserBridgeSettings,\n browserBridgeTabs,\n browserBridgePageContexts,\n} as const;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/schema.ts"],"sourcesContent":["/**\n * Agent Browser Bridge Drizzle schema.\n *\n * The four generic browser tables (`browser_bridge_companions`,\n * `browser_bridge_settings`, `browser_bridge_tabs`,\n * `browser_bridge_page_contexts`) are owned by this plugin. The\n * workflow-bound `life_browser_sessions` table remains in LifeOps because\n * it carries `workflowId` plus LifeOps-only scoping columns.\n *\n * Tables are placed in the `browser` PostgreSQL schema (matches the\n * `deriveSchemaName(\"@elizaos/plugin-browser\")` result used by\n * plugin-sql's runtime migrator) so they no longer trip the\n * \"Plugin table is using public schema\" warning. The runtime migrator\n * issues `CREATE SCHEMA IF NOT EXISTS` automatically before applying\n * migrations.\n *\n * Migrations are applied via elizaOS plugin-sql's `runPluginMigrations`\n * when the plugin's `schema` field is populated and an appropriate\n * migration strategy is selected. Renaming the old `life_browser_*`\n * tables to `browser_bridge_*` is a destructive migration controlled by\n * plugin-sql's destructive-migration override.\n */\n\nimport {\n boolean,\n index,\n integer,\n pgSchema,\n text,\n unique,\n} from \"drizzle-orm/pg-core\";\n\nexport const browserPgSchema = pgSchema(\"browser\");\n\nexport const browserBridgeCompanions = browserPgSchema.table(\n \"browser_bridge_companions\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n profileLabel: text(\"profile_label\").notNull().default(\"\"),\n label: text(\"label\").notNull().default(\"\"),\n extensionVersion: text(\"extension_version\"),\n connectionState: text(\"connection_state\").notNull().default(\"disconnected\"),\n permissionsJson: text(\"permissions_json\").notNull().default(\"{}\"),\n pairingTokenHash: text(\"pairing_token_hash\"),\n pairingTokenExpiresAt: text(\"pairing_token_expires_at\"),\n pairingTokenRevokedAt: text(\"pairing_token_revoked_at\"),\n pendingPairingTokenHashesJson: text(\"pending_pairing_token_hashes_json\")\n .notNull()\n .default(\"[]\"),\n lastSeenAt: text(\"last_seen_at\"),\n pairedAt: text(\"paired_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId),\n index(\"idx_browser_bridge_companions_agent\").on(\n t.agentId,\n t.browser,\n t.updatedAt,\n ),\n ],\n);\n\nexport const browserBridgeSettings = browserPgSchema.table(\n \"browser_bridge_settings\",\n {\n agentId: text(\"agent_id\").primaryKey(),\n enabled: boolean(\"enabled\").notNull().default(false),\n trackingMode: text(\"tracking_mode\").notNull().default(\"current_tab\"),\n allowBrowserControl: boolean(\"allow_browser_control\")\n .notNull()\n .default(false),\n requireConfirmationForAccountAffecting: boolean(\n \"require_confirmation_for_account_affecting\",\n )\n .notNull()\n .default(true),\n incognitoEnabled: boolean(\"incognito_enabled\").notNull().default(false),\n siteAccessMode: text(\"site_access_mode\")\n .notNull()\n .default(\"current_site_only\"),\n grantedOriginsJson: text(\"granted_origins_json\").notNull().default(\"[]\"),\n blockedOriginsJson: text(\"blocked_origins_json\").notNull().default(\"[]\"),\n maxRememberedTabs: integer(\"max_remembered_tabs\").notNull().default(10),\n pauseUntil: text(\"pause_until\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n);\n\nexport const browserBridgeTabs = browserPgSchema.table(\n \"browser_bridge_tabs\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n companionId: text(\"companion_id\"),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n activeInWindow: boolean(\"active_in_window\").notNull().default(false),\n focusedWindow: boolean(\"focused_window\").notNull().default(false),\n focusedActive: boolean(\"focused_active\").notNull().default(false),\n incognito: boolean(\"incognito\").notNull().default(false),\n faviconUrl: text(\"favicon_url\"),\n lastSeenAt: text(\"last_seen_at\").notNull(),\n lastFocusedAt: text(\"last_focused_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_tabs_agent\").on(\n t.agentId,\n t.focusedActive,\n t.activeInWindow,\n t.lastSeenAt,\n ),\n ],\n);\n\nexport const browserBridgePageContexts = browserPgSchema.table(\n \"browser_bridge_page_contexts\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n selectionText: text(\"selection_text\"),\n mainText: text(\"main_text\"),\n headingsJson: text(\"headings_json\").notNull().default(\"[]\"),\n linksJson: text(\"links_json\").notNull().default(\"[]\"),\n formsJson: text(\"forms_json\").notNull().default(\"[]\"),\n capturedAt: text(\"captured_at\").notNull(),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_page_contexts_agent\").on(t.agentId, t.capturedAt),\n ],\n);\n\nexport const browserBridgeSchema = {\n browserBridgeCompanions,\n browserBridgeSettings,\n browserBridgeTabs,\n browserBridgePageContexts,\n} as const;\n"],"mappings":"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","names":[]}
package/dist/service.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { Service, UUID } from "@elizaos/core";
2
- import type { CompleteLifeOpsBrowserSessionRequest, ConfirmLifeOpsBrowserSessionRequest, CreateLifeOpsBrowserSessionRequest, LifeOpsBrowserSession } from "./lifeops-session-contracts.js";
3
2
  import type { BrowserBridgeCompanionAutoPairResponse, BrowserBridgeCompanionPairingResponse, BrowserBridgeCompanionRevokeResponse, BrowserBridgeCompanionStatus, BrowserBridgeCompanionSyncResponse, BrowserBridgePageContext, BrowserBridgeSettings, BrowserBridgeTabSummary, CreateBrowserBridgeCompanionAutoPairRequest, CreateBrowserBridgeCompanionPairingRequest, SyncBrowserBridgeStateRequest, UpdateBrowserBridgeSessionProgressRequest, UpdateBrowserBridgeSettingsRequest } from "./contracts.js";
3
+ import type { CompleteLifeOpsBrowserSessionRequest, ConfirmLifeOpsBrowserSessionRequest, CreateLifeOpsBrowserSessionRequest, LifeOpsBrowserSession } from "./lifeops-session-contracts.js";
4
4
  export declare const BROWSER_BRIDGE_ROUTE_SERVICE_TYPE = "lifeops_browser_plugin";
5
5
  export interface BrowserBridgeRouteService extends Service {
6
6
  getBrowserSettings(ownerEntityId?: UUID | null): Promise<BrowserBridgeSettings>;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/service.ts"],"sourcesContent":["import type { Service, UUID } from \"@elizaos/core\";\nimport type {\n CompleteLifeOpsBrowserSessionRequest,\n ConfirmLifeOpsBrowserSessionRequest,\n CreateLifeOpsBrowserSessionRequest,\n LifeOpsBrowserSession,\n} from \"./lifeops-session-contracts.js\";\nimport type {\n BrowserBridgeCompanionAutoPairResponse,\n BrowserBridgeCompanionPairingResponse,\n BrowserBridgeCompanionRevokeResponse,\n BrowserBridgeCompanionStatus,\n BrowserBridgeCompanionSyncResponse,\n BrowserBridgePageContext,\n BrowserBridgeSettings,\n BrowserBridgeTabSummary,\n CreateBrowserBridgeCompanionAutoPairRequest,\n CreateBrowserBridgeCompanionPairingRequest,\n SyncBrowserBridgeStateRequest,\n UpdateBrowserBridgeSessionProgressRequest,\n UpdateBrowserBridgeSettingsRequest,\n} from \"./contracts.js\";\n\nexport const BROWSER_BRIDGE_ROUTE_SERVICE_TYPE = \"lifeops_browser_plugin\";\n\nexport interface BrowserBridgeRouteService extends Service {\n getBrowserSettings(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeSettings>;\n updateBrowserSettings(\n request: UpdateBrowserBridgeSettingsRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeSettings>;\n listBrowserCompanions(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionStatus[]>;\n listBrowserTabs(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeTabSummary[]>;\n getCurrentBrowserPage(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgePageContext | null>;\n syncBrowserState(\n request: SyncBrowserBridgeStateRequest,\n ownerEntityId?: UUID | null,\n ): Promise<{\n companion: BrowserBridgeCompanionStatus;\n tabs: BrowserBridgeTabSummary[];\n currentPage: BrowserBridgePageContext | null;\n }>;\n createBrowserCompanionPairing(\n request: CreateBrowserBridgeCompanionPairingRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionPairingResponse>;\n autoPairBrowserCompanion(\n request: CreateBrowserBridgeCompanionAutoPairRequest,\n apiBaseUrl: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionAutoPairResponse>;\n revokeBrowserCompanion(\n companionId: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionRevokeResponse>;\n revokeBrowserCompanionFromCompanion(\n companionId: string,\n pairingToken: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionRevokeResponse>;\n syncBrowserCompanion(\n companionId: string,\n pairingToken: string,\n request: SyncBrowserBridgeStateRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionSyncResponse>;\n listBrowserSessions(\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession[]>;\n getBrowserSession(\n sessionId: string,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n createBrowserSession(\n request: CreateLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n confirmBrowserSession(\n sessionId: string,\n request: ConfirmLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n updateBrowserSessionProgress(\n sessionId: string,\n request: UpdateBrowserBridgeSessionProgressRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n completeBrowserSession(\n sessionId: string,\n request: CompleteLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n updateBrowserSessionProgressFromCompanion(\n companionId: string,\n pairingToken: string,\n sessionId: string,\n request: UpdateBrowserBridgeSessionProgressRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n completeBrowserSessionFromCompanion(\n companionId: string,\n pairingToken: string,\n sessionId: string,\n request: CompleteLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n}\n"],"mappings":"AAuBO,MAAM,oCAAoC;","names":[]}
1
+ {"version":3,"sources":["../src/service.ts"],"sourcesContent":["import type { Service, UUID } from \"@elizaos/core\";\nimport type {\n BrowserBridgeCompanionAutoPairResponse,\n BrowserBridgeCompanionPairingResponse,\n BrowserBridgeCompanionRevokeResponse,\n BrowserBridgeCompanionStatus,\n BrowserBridgeCompanionSyncResponse,\n BrowserBridgePageContext,\n BrowserBridgeSettings,\n BrowserBridgeTabSummary,\n CreateBrowserBridgeCompanionAutoPairRequest,\n CreateBrowserBridgeCompanionPairingRequest,\n SyncBrowserBridgeStateRequest,\n UpdateBrowserBridgeSessionProgressRequest,\n UpdateBrowserBridgeSettingsRequest,\n} from \"./contracts.js\";\nimport type {\n CompleteLifeOpsBrowserSessionRequest,\n ConfirmLifeOpsBrowserSessionRequest,\n CreateLifeOpsBrowserSessionRequest,\n LifeOpsBrowserSession,\n} from \"./lifeops-session-contracts.js\";\n\nexport const BROWSER_BRIDGE_ROUTE_SERVICE_TYPE = \"lifeops_browser_plugin\";\n\nexport interface BrowserBridgeRouteService extends Service {\n getBrowserSettings(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeSettings>;\n updateBrowserSettings(\n request: UpdateBrowserBridgeSettingsRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeSettings>;\n listBrowserCompanions(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionStatus[]>;\n listBrowserTabs(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeTabSummary[]>;\n getCurrentBrowserPage(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgePageContext | null>;\n syncBrowserState(\n request: SyncBrowserBridgeStateRequest,\n ownerEntityId?: UUID | null,\n ): Promise<{\n companion: BrowserBridgeCompanionStatus;\n tabs: BrowserBridgeTabSummary[];\n currentPage: BrowserBridgePageContext | null;\n }>;\n createBrowserCompanionPairing(\n request: CreateBrowserBridgeCompanionPairingRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionPairingResponse>;\n autoPairBrowserCompanion(\n request: CreateBrowserBridgeCompanionAutoPairRequest,\n apiBaseUrl: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionAutoPairResponse>;\n revokeBrowserCompanion(\n companionId: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionRevokeResponse>;\n revokeBrowserCompanionFromCompanion(\n companionId: string,\n pairingToken: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionRevokeResponse>;\n syncBrowserCompanion(\n companionId: string,\n pairingToken: string,\n request: SyncBrowserBridgeStateRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionSyncResponse>;\n listBrowserSessions(\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession[]>;\n getBrowserSession(\n sessionId: string,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n createBrowserSession(\n request: CreateLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n confirmBrowserSession(\n sessionId: string,\n request: ConfirmLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n updateBrowserSessionProgress(\n sessionId: string,\n request: UpdateBrowserBridgeSessionProgressRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n completeBrowserSession(\n sessionId: string,\n request: CompleteLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n updateBrowserSessionProgressFromCompanion(\n companionId: string,\n pairingToken: string,\n sessionId: string,\n request: UpdateBrowserBridgeSessionProgressRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n completeBrowserSessionFromCompanion(\n companionId: string,\n pairingToken: string,\n sessionId: string,\n request: CompleteLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n}\n"],"mappings":"AAuBO,MAAM,oCAAoC;","names":[]}
@@ -25,7 +25,7 @@
25
25
  * `confirmBrowserSession`, etc.) are LifeOps workflow concerns and live
26
26
  * in a dedicated lifeops session action, not here.
27
27
  */
28
- import type { BrowserWorkspaceCommand, BrowserWorkspaceCommandResult } from "../workspace/browser-workspace-types.js";
29
28
  import type { BrowserBridgeRouteService } from "../service.js";
29
+ import type { BrowserWorkspaceCommand, BrowserWorkspaceCommandResult } from "../workspace/browser-workspace-types.js";
30
30
  export declare function dispatchBridgeCommand(service: BrowserBridgeRouteService, command: BrowserWorkspaceCommand): Promise<BrowserWorkspaceCommandResult>;
31
31
  //# sourceMappingURL=bridge-target.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-target.d.ts","sourceRoot":"","sources":["../../src/targets/bridge-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAE9B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AA0C/D,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CAsExC"}
1
+ {"version":3,"file":"bridge-target.d.ts","sourceRoot":"","sources":["../../src/targets/bridge-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAE9B,MAAM,yCAAyC,CAAC;AAyCjD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CAsExC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/targets/bridge-target.ts"],"sourcesContent":["/**\n * Bridge target — routes a `BrowserWorkspaceCommand` to the Agent Browser\n * Bridge companion (Chrome / Safari) via `BrowserBridgeRouteService`.\n *\n * The bridge surface is intentionally narrower than the workspace surface.\n * It speaks at the level of paired browser tabs, not of an embedded\n * BrowserView, so subactions like `eval` / `pdf` / `trace` / `profiler`\n * have no clean translation. We translate the read-mostly subset that DOES\n * map cleanly:\n *\n * list → list companion-tracked tabs\n * state → snapshot of current page context\n * open → ask the companion to open a URL in a new tab\n * navigate → ask the companion to navigate the current/named tab\n * close → ask the companion to close a tab\n * show / hide → focus / unfocus a tab in the companion window\n * get → return the current page text/title/url\n * back / forward / reload → companion navigation history nav\n *\n * Anything outside that subset throws a clear error so the caller\n * (typically the BROWSER action) can surface a \"this isn't supported on\n * the bridge target — try the workspace target\" message back to the user.\n *\n * The bridge protocol's session-tracking semantics (`createBrowserSession`,\n * `confirmBrowserSession`, etc.) are LifeOps workflow concerns and live\n * in a dedicated lifeops session action, not here.\n */\n\nimport type {\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n BrowserWorkspaceTab,\n} from \"../workspace/browser-workspace-types.js\";\nimport type { BrowserBridgeRouteService } from \"../service.js\";\nimport type { BrowserBridgeTabSummary } from \"../contracts.js\";\n\nconst SUPPORTED_SUBACTIONS = new Set<BrowserWorkspaceCommand[\"subaction\"]>([\n \"list\",\n \"state\",\n \"open\",\n \"navigate\",\n \"close\",\n \"show\",\n \"hide\",\n \"tab\",\n \"get\",\n \"back\",\n \"forward\",\n \"reload\",\n]);\n\nfunction bridgeTabToWorkspaceTab(tab: BrowserBridgeTabSummary): BrowserWorkspaceTab {\n // The bridge speaks BrowserBridgeTabSummary; the BROWSER action expects\n // BrowserWorkspaceTab. Map the overlapping fields and stub the rest.\n return {\n id: tab.id,\n title: tab.title,\n url: tab.url,\n partition: `bridge:${tab.profileId}`,\n kind: \"standard\",\n visible: tab.activeInWindow,\n createdAt: tab.createdAt,\n updatedAt: tab.updatedAt,\n lastFocusedAt: tab.lastFocusedAt,\n };\n}\n\nfunction unsupported(\n subaction: BrowserWorkspaceCommand[\"subaction\"],\n): Error {\n return new Error(\n `Browser bridge target does not support subaction \"${subaction}\". Use the workspace target for embedded-browser features (eval, pdf, snapshot, trace, profiler, etc.).`,\n );\n}\n\nexport async function dispatchBridgeCommand(\n service: BrowserBridgeRouteService,\n command: BrowserWorkspaceCommand,\n): Promise<BrowserWorkspaceCommandResult> {\n if (!SUPPORTED_SUBACTIONS.has(command.subaction)) {\n throw unsupported(command.subaction);\n }\n switch (command.subaction) {\n case \"list\":\n case \"tab\":\n // Bridge `tab` always behaves like list; the bridge has no concept of\n // creating an internal tab via the agent — the user owns the tabs.\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n tabs: (await service.listBrowserTabs()).map(bridgeTabToWorkspaceTab),\n };\n case \"state\": {\n const page = await service.getCurrentBrowserPage();\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: page\n ? {\n url: page.url,\n title: page.title,\n browser: page.browser,\n profileId: page.profileId,\n windowId: page.windowId,\n tabId: page.tabId,\n capturedAt: page.capturedAt,\n }\n : null,\n };\n }\n case \"get\": {\n const page = await service.getCurrentBrowserPage();\n if (!page) {\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: null,\n };\n }\n const mode = command.getMode ?? \"text\";\n const value =\n mode === \"url\"\n ? page.url\n : mode === \"title\"\n ? page.title\n : (page.mainText ?? \"\");\n return { mode: \"desktop\", subaction: command.subaction, value };\n }\n // open / navigate / close / show / hide / back / forward / reload are\n // session-creating operations on the bridge — they require a\n // LifeOpsBrowserSession to record the action and gate confirmation.\n // The bridge's session APIs aren't appropriate to call from a generic\n // BROWSER target, so we throw a clear error directing the caller to\n // the dedicated lifeops session action.\n case \"open\":\n case \"navigate\":\n case \"close\":\n case \"show\":\n case \"hide\":\n case \"back\":\n case \"forward\":\n case \"reload\":\n throw new Error(\n `Bridge target subaction \"${command.subaction}\" requires a recorded LifeOpsBrowserSession (the bridge gates account-affecting ops behind owner confirmation). Use the lifeops browser-session action to start a session, or pin target=workspace for embedded-browser tabs.`,\n );\n default:\n throw unsupported(command.subaction);\n }\n}\n"],"mappings":"AAoCA,MAAM,uBAAuB,oBAAI,IAA0C;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,wBAAwB,KAAmD;AAGlF,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,KAAK,IAAI;AAAA,IACT,WAAW,UAAU,IAAI,SAAS;AAAA,IAClC,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,eAAe,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,YACP,WACO;AACP,SAAO,IAAI;AAAA,IACT,qDAAqD,SAAS;AAAA,EAChE;AACF;AAEA,eAAsB,sBACpB,SACA,SACwC;AACxC,MAAI,CAAC,qBAAqB,IAAI,QAAQ,SAAS,GAAG;AAChD,UAAM,YAAY,QAAQ,SAAS;AAAA,EACrC;AACA,UAAQ,QAAQ,WAAW;AAAA,IACzB,KAAK;AAAA,IACL,KAAK;AAGH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO,MAAM,QAAQ,gBAAgB,GAAG,IAAI,uBAAuB;AAAA,MACrE;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,OAAO,MAAM,QAAQ,sBAAsB;AACjD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO,OACH;AAAA,UACE,KAAK,KAAK;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,SAAS,KAAK;AAAA,UACd,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,YAAY,KAAK;AAAA,QACnB,IACA;AAAA,MACN;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,YAAM,OAAO,MAAM,QAAQ,sBAAsB;AACjD,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,QAAQ;AAAA,UACnB,OAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,OAAO,QAAQ,WAAW;AAChC,YAAM,QACJ,SAAS,QACL,KAAK,MACL,SAAS,UACP,KAAK,QACJ,KAAK,YAAY;AAC1B,aAAO,EAAE,MAAM,WAAW,WAAW,QAAQ,WAAW,MAAM;AAAA,IAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,YAAM,IAAI;AAAA,QACR,4BAA4B,QAAQ,SAAS;AAAA,MAC/C;AAAA,IACF;AACE,YAAM,YAAY,QAAQ,SAAS;AAAA,EACvC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/targets/bridge-target.ts"],"sourcesContent":["/**\n * Bridge target — routes a `BrowserWorkspaceCommand` to the Agent Browser\n * Bridge companion (Chrome / Safari) via `BrowserBridgeRouteService`.\n *\n * The bridge surface is intentionally narrower than the workspace surface.\n * It speaks at the level of paired browser tabs, not of an embedded\n * BrowserView, so subactions like `eval` / `pdf` / `trace` / `profiler`\n * have no clean translation. We translate the read-mostly subset that DOES\n * map cleanly:\n *\n * list → list companion-tracked tabs\n * state → snapshot of current page context\n * open → ask the companion to open a URL in a new tab\n * navigate → ask the companion to navigate the current/named tab\n * close → ask the companion to close a tab\n * show / hide → focus / unfocus a tab in the companion window\n * get → return the current page text/title/url\n * back / forward / reload → companion navigation history nav\n *\n * Anything outside that subset throws a clear error so the caller\n * (typically the BROWSER action) can surface a \"this isn't supported on\n * the bridge target — try the workspace target\" message back to the user.\n *\n * The bridge protocol's session-tracking semantics (`createBrowserSession`,\n * `confirmBrowserSession`, etc.) are LifeOps workflow concerns and live\n * in a dedicated lifeops session action, not here.\n */\n\nimport type { BrowserBridgeTabSummary } from \"../contracts.js\";\nimport type { BrowserBridgeRouteService } from \"../service.js\";\nimport type {\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n BrowserWorkspaceTab,\n} from \"../workspace/browser-workspace-types.js\";\n\nconst SUPPORTED_SUBACTIONS = new Set<BrowserWorkspaceCommand[\"subaction\"]>([\n \"list\",\n \"state\",\n \"open\",\n \"navigate\",\n \"close\",\n \"show\",\n \"hide\",\n \"tab\",\n \"get\",\n \"back\",\n \"forward\",\n \"reload\",\n]);\n\nfunction bridgeTabToWorkspaceTab(\n tab: BrowserBridgeTabSummary,\n): BrowserWorkspaceTab {\n // The bridge speaks BrowserBridgeTabSummary; the BROWSER action expects\n // BrowserWorkspaceTab. Map the overlapping fields and use defaults for the rest.\n return {\n id: tab.id,\n title: tab.title,\n url: tab.url,\n partition: `bridge:${tab.profileId}`,\n kind: \"standard\",\n visible: tab.activeInWindow,\n createdAt: tab.createdAt,\n updatedAt: tab.updatedAt,\n lastFocusedAt: tab.lastFocusedAt,\n };\n}\n\nfunction unsupported(subaction: BrowserWorkspaceCommand[\"subaction\"]): Error {\n return new Error(\n `Browser bridge target does not support subaction \"${subaction}\". Use the workspace target for embedded-browser features (eval, pdf, snapshot, trace, profiler, etc.).`,\n );\n}\n\nexport async function dispatchBridgeCommand(\n service: BrowserBridgeRouteService,\n command: BrowserWorkspaceCommand,\n): Promise<BrowserWorkspaceCommandResult> {\n if (!SUPPORTED_SUBACTIONS.has(command.subaction)) {\n throw unsupported(command.subaction);\n }\n switch (command.subaction) {\n case \"list\":\n case \"tab\":\n // Bridge `tab` always behaves like list; the bridge has no concept of\n // creating an internal tab via the agent — the user owns the tabs.\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n tabs: (await service.listBrowserTabs()).map(bridgeTabToWorkspaceTab),\n };\n case \"state\": {\n const page = await service.getCurrentBrowserPage();\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: page\n ? {\n url: page.url,\n title: page.title,\n browser: page.browser,\n profileId: page.profileId,\n windowId: page.windowId,\n tabId: page.tabId,\n capturedAt: page.capturedAt,\n }\n : null,\n };\n }\n case \"get\": {\n const page = await service.getCurrentBrowserPage();\n if (!page) {\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: null,\n };\n }\n const mode = command.getMode ?? \"text\";\n const value =\n mode === \"url\"\n ? page.url\n : mode === \"title\"\n ? page.title\n : (page.mainText ?? \"\");\n return { mode: \"desktop\", subaction: command.subaction, value };\n }\n // open / navigate / close / show / hide / back / forward / reload are\n // session-creating operations on the bridge — they require a\n // LifeOpsBrowserSession to record the action and gate confirmation.\n // The bridge's session APIs aren't appropriate to call from a generic\n // BROWSER target, so we throw a clear error directing the caller to\n // the dedicated lifeops session action.\n case \"open\":\n case \"navigate\":\n case \"close\":\n case \"show\":\n case \"hide\":\n case \"back\":\n case \"forward\":\n case \"reload\":\n throw new Error(\n `Bridge target subaction \"${command.subaction}\" requires a recorded LifeOpsBrowserSession (the bridge gates account-affecting ops behind owner confirmation). Use the lifeops browser-session action to start a session, or pin target=workspace for embedded-browser tabs.`,\n );\n default:\n throw unsupported(command.subaction);\n }\n}\n"],"mappings":"AAoCA,MAAM,uBAAuB,oBAAI,IAA0C;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,wBACP,KACqB;AAGrB,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,KAAK,IAAI;AAAA,IACT,WAAW,UAAU,IAAI,SAAS;AAAA,IAClC,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,eAAe,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,YAAY,WAAwD;AAC3E,SAAO,IAAI;AAAA,IACT,qDAAqD,SAAS;AAAA,EAChE;AACF;AAEA,eAAsB,sBACpB,SACA,SACwC;AACxC,MAAI,CAAC,qBAAqB,IAAI,QAAQ,SAAS,GAAG;AAChD,UAAM,YAAY,QAAQ,SAAS;AAAA,EACrC;AACA,UAAQ,QAAQ,WAAW;AAAA,IACzB,KAAK;AAAA,IACL,KAAK;AAGH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO,MAAM,QAAQ,gBAAgB,GAAG,IAAI,uBAAuB;AAAA,MACrE;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,OAAO,MAAM,QAAQ,sBAAsB;AACjD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO,OACH;AAAA,UACE,KAAK,KAAK;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,SAAS,KAAK;AAAA,UACd,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,YAAY,KAAK;AAAA,QACnB,IACA;AAAA,MACN;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,YAAM,OAAO,MAAM,QAAQ,sBAAsB;AACjD,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,QAAQ;AAAA,UACnB,OAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,OAAO,QAAQ,WAAW;AAChC,YAAM,QACJ,SAAS,QACL,KAAK,MACL,SAAS,UACP,KAAK,QACJ,KAAK,YAAY;AAC1B,aAAO,EAAE,MAAM,WAAW,WAAW,QAAQ,WAAW,MAAM;AAAA,IAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,YAAM,IAAI;AAAA,QACR,4BAA4B,QAAQ,SAAS;AAAA,MAC/C;AAAA,IACF;AACE,YAAM,YAAY,QAAQ,SAAS;AAAA,EACvC;AACF;","names":[]}
@@ -0,0 +1,3 @@
1
+ import type { BrowserTarget } from "../browser-service.js";
2
+ export declare function maybeCreateStagehandTarget(env?: NodeJS.ProcessEnv): Promise<BrowserTarget | null>;
3
+ //# sourceMappingURL=stagehand-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stagehand-target.d.ts","sourceRoot":"","sources":["../../src/targets/stagehand-target.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAuB3D,wBAAsB,0BAA0B,CAC9C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAkC/B"}