managed-deepagents 0.10.0-dev.18 → 0.10.0-dev.19

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 (144) hide show
  1. package/README.md +23 -4
  2. package/dist/browser.d.ts +37 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +31 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/channels/assistant-text.d.ts +1 -1
  7. package/dist/channels/assistant-text.js +1 -1
  8. package/dist/channels/binding.d.ts.map +1 -1
  9. package/dist/channels/binding.js +6 -2
  10. package/dist/channels/binding.js.map +1 -1
  11. package/dist/channels/delivery.d.ts +23 -8
  12. package/dist/channels/delivery.d.ts.map +1 -1
  13. package/dist/channels/delivery.js +181 -18
  14. package/dist/channels/delivery.js.map +1 -1
  15. package/dist/channels/github/app-setup.d.ts +32 -0
  16. package/dist/channels/github/app-setup.d.ts.map +1 -0
  17. package/dist/channels/github/app-setup.js +146 -0
  18. package/dist/channels/github/app-setup.js.map +1 -0
  19. package/dist/channels/github/index.d.ts.map +1 -1
  20. package/dist/channels/github/index.js +9 -23
  21. package/dist/channels/github/index.js.map +1 -1
  22. package/dist/channels/http/index.d.ts +6 -0
  23. package/dist/channels/http/index.d.ts.map +1 -1
  24. package/dist/channels/http/index.js +24 -9
  25. package/dist/channels/http/index.js.map +1 -1
  26. package/dist/channels/linear/app-setup.d.ts +29 -0
  27. package/dist/channels/linear/app-setup.d.ts.map +1 -0
  28. package/dist/channels/linear/app-setup.js +102 -0
  29. package/dist/channels/linear/app-setup.js.map +1 -0
  30. package/dist/channels/linear/index.d.ts.map +1 -1
  31. package/dist/channels/linear/index.js +11 -55
  32. package/dist/channels/linear/index.js.map +1 -1
  33. package/dist/channels/runtime.d.ts +4 -1
  34. package/dist/channels/runtime.d.ts.map +1 -1
  35. package/dist/channels/runtime.js +19 -10
  36. package/dist/channels/runtime.js.map +1 -1
  37. package/dist/channels/schedule-delivery.d.ts +1 -12
  38. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  39. package/dist/channels/schedule-delivery.js +5 -61
  40. package/dist/channels/schedule-delivery.js.map +1 -1
  41. package/dist/channels/slack/index.d.ts.map +1 -1
  42. package/dist/channels/slack/index.js +3 -0
  43. package/dist/channels/slack/index.js.map +1 -1
  44. package/dist/channels/trigger/client.d.ts.map +1 -1
  45. package/dist/channels/trigger/client.js +3 -1
  46. package/dist/channels/trigger/client.js.map +1 -1
  47. package/dist/channels/trigger/conversation.d.ts +11 -0
  48. package/dist/channels/trigger/conversation.d.ts.map +1 -0
  49. package/dist/channels/trigger/conversation.js +72 -0
  50. package/dist/channels/trigger/conversation.js.map +1 -0
  51. package/dist/channels/trigger/http.d.ts +9 -1
  52. package/dist/channels/trigger/http.d.ts.map +1 -1
  53. package/dist/channels/trigger/http.js +28 -12
  54. package/dist/channels/trigger/http.js.map +1 -1
  55. package/dist/channels/trigger/ingress.d.ts +32 -0
  56. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  57. package/dist/channels/trigger/ingress.js +89 -6
  58. package/dist/channels/trigger/ingress.js.map +1 -1
  59. package/dist/channels/trigger/transport.d.ts +10 -0
  60. package/dist/channels/trigger/transport.d.ts.map +1 -1
  61. package/dist/channels/trigger/transport.js +25 -9
  62. package/dist/channels/trigger/transport.js.map +1 -1
  63. package/dist/channels/trigger/types.d.ts +10 -0
  64. package/dist/channels/trigger/types.d.ts.map +1 -1
  65. package/dist/channels/trigger/types.js.map +1 -1
  66. package/dist/channels/types.d.ts +24 -1
  67. package/dist/channels/types.d.ts.map +1 -1
  68. package/dist/channels/types.js.map +1 -1
  69. package/dist/define-deep-agent.d.ts +2 -2
  70. package/dist/define-deep-agent.d.ts.map +1 -1
  71. package/dist/define-deep-agent.js +53 -8
  72. package/dist/define-deep-agent.js.map +1 -1
  73. package/dist/index.d.ts +3 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +1 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/managed-composition.d.ts +3 -0
  78. package/dist/managed-composition.d.ts.map +1 -1
  79. package/dist/managed-composition.js +21 -0
  80. package/dist/managed-composition.js.map +1 -1
  81. package/dist/runtime/async-subagents.d.ts +27 -0
  82. package/dist/runtime/async-subagents.d.ts.map +1 -0
  83. package/dist/runtime/async-subagents.js +139 -0
  84. package/dist/runtime/async-subagents.js.map +1 -0
  85. package/dist/runtime/auth.d.ts.map +1 -1
  86. package/dist/runtime/auth.js +37 -2
  87. package/dist/runtime/auth.js.map +1 -1
  88. package/dist/runtime/backend.d.ts +7 -0
  89. package/dist/runtime/backend.d.ts.map +1 -1
  90. package/dist/runtime/backend.js +32 -7
  91. package/dist/runtime/backend.js.map +1 -1
  92. package/dist/runtime/browser-facade.d.ts +10 -0
  93. package/dist/runtime/browser-facade.d.ts.map +1 -0
  94. package/dist/runtime/browser-facade.js +23 -0
  95. package/dist/runtime/browser-facade.js.map +1 -0
  96. package/dist/runtime/browser-langsmith.d.ts +108 -0
  97. package/dist/runtime/browser-langsmith.d.ts.map +1 -0
  98. package/dist/runtime/browser-langsmith.js +379 -0
  99. package/dist/runtime/browser-langsmith.js.map +1 -0
  100. package/dist/runtime/browser-selection.d.ts +10 -0
  101. package/dist/runtime/browser-selection.d.ts.map +1 -0
  102. package/dist/runtime/browser-selection.js +21 -0
  103. package/dist/runtime/browser-selection.js.map +1 -0
  104. package/dist/runtime/browser.d.ts +125 -0
  105. package/dist/runtime/browser.d.ts.map +1 -0
  106. package/dist/runtime/browser.js +606 -0
  107. package/dist/runtime/browser.js.map +1 -0
  108. package/dist/runtime/index.d.ts +38 -1
  109. package/dist/runtime/index.d.ts.map +1 -1
  110. package/dist/runtime/index.js +47 -16
  111. package/dist/runtime/index.js.map +1 -1
  112. package/dist/runtime/managed-thread.d.ts +1 -0
  113. package/dist/runtime/managed-thread.d.ts.map +1 -1
  114. package/dist/runtime/managed-thread.js +1 -1
  115. package/dist/runtime/managed-thread.js.map +1 -1
  116. package/dist/runtime/parent-run.d.ts +33 -0
  117. package/dist/runtime/parent-run.d.ts.map +1 -0
  118. package/dist/runtime/parent-run.js +114 -0
  119. package/dist/runtime/parent-run.js.map +1 -0
  120. package/dist/runtime/run-input.d.ts +4 -1
  121. package/dist/runtime/run-input.d.ts.map +1 -1
  122. package/dist/runtime/run-input.js +30 -7
  123. package/dist/runtime/run-input.js.map +1 -1
  124. package/dist/runtime/sandbox-manager.d.ts +14 -1
  125. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  126. package/dist/runtime/sandbox-manager.js +33 -8
  127. package/dist/runtime/sandbox-manager.js.map +1 -1
  128. package/dist/runtime/schedule-auth.d.ts +62 -0
  129. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  130. package/dist/runtime/schedule-auth.js +125 -6
  131. package/dist/runtime/schedule-auth.js.map +1 -1
  132. package/dist/runtime/static-entry.d.ts.map +1 -1
  133. package/dist/runtime/static-entry.js +1 -0
  134. package/dist/runtime/static-entry.js.map +1 -1
  135. package/dist/runtime/thread-record.d.ts +9 -2
  136. package/dist/runtime/thread-record.d.ts.map +1 -1
  137. package/dist/runtime/thread-record.js +13 -5
  138. package/dist/runtime/thread-record.js.map +1 -1
  139. package/dist/runtime/types.d.ts +7 -0
  140. package/dist/runtime/types.d.ts.map +1 -1
  141. package/dist/types.d.ts +19 -2
  142. package/dist/types.d.ts.map +1 -1
  143. package/dist/types.js.map +1 -1
  144. package/package.json +22 -8
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Browser use, the LangSmith side: create a key's browser, put Stagehand's
3
+ * extension on it, and connect Stagehand to one of its windows.
4
+ *
5
+ * The LangSmith half of Python's `browser.py`, kept apart from the middleware
6
+ * (`browser.ts`) so its tests can stand in for it, as Python's do for `_open`
7
+ * and `_share_localhost`.
8
+ */
9
+ import { createHash } from "node:crypto";
10
+ import { mkdtemp, rm } from "node:fs/promises";
11
+ import { tmpdir } from "node:os";
12
+ import { join } from "node:path";
13
+ import { setTimeout as sleep } from "node:timers/promises";
14
+ import { getExtensionArchive, localBrowser, Stagehand, } from "@browserbasehq/stagehand";
15
+ import { SandboxClient } from "langsmith/sandbox";
16
+ import { z } from "zod";
17
+ import { StagehandFacadeTools } from "./browser-facade.js";
18
+ import { managedDeploymentName, managedSandboxName, } from "./sandbox-manager.js";
19
+ /** The client and the browser's extension must match; `mda` pins this in deployments. */
20
+ export const STAGEHAND_VERSION = "4.3.0";
21
+ const BROWSER_GENERATIONS = 5;
22
+ const UNUSABLE = new Set(["deleting", "deleted", "failed", "error"]); // browser states to move past
23
+ const EXTENSION_DIR = `/var/lib/browserd/extensions/stagehand-${STAGEHAND_VERSION}`;
24
+ const EXTENSION_ZIP = "/tmp/mda-stagehand.zip"; // in the browser sandbox
25
+ const WINDOWS_FILE = "/var/lib/browserd/attachments.json"; // browserd's windows and their ports
26
+ const LOCALHOST_WINDOW = "mda-localhost"; // shares a sandbox's localhost with every window
27
+ export const HANDOFF_LINK_TTL_S = 900; // how long the link a user gets for a handoff works
28
+ /** A handoff that waits on the user, in the thread's state. */
29
+ export const PendingBrowserHandoffSchema = z.object({
30
+ /** The LangSmith browser's name. */
31
+ browser: z.string(),
32
+ /** The window the user has. */
33
+ window_id: z.string(),
34
+ /** When the user's link runs out, in epoch seconds. */
35
+ until: z.number(),
36
+ });
37
+ export async function closeSession(session) {
38
+ // Not `browser.close()`, which closes the browser. Closing Stagehand frees the
39
+ // extension; dropping the CDP connection lets the browser idle out.
40
+ await Promise.race([
41
+ session.stagehand.close(),
42
+ sleep(3_000, undefined, { ref: false }),
43
+ ]).catch(() => undefined);
44
+ try {
45
+ session.transport?.close();
46
+ }
47
+ catch { }
48
+ // As Python's rmtree(ignore_errors=True): closing never fails.
49
+ await rm(session.artifacts, { recursive: true, force: true }).catch(() => undefined);
50
+ }
51
+ /**
52
+ * `key`'s browser, under the deployment's prefix like its sandboxes.
53
+ *
54
+ * A later `generation` replaces a browser that is being deleted or broke.
55
+ */
56
+ export function browserName(key, generation = 0) {
57
+ const scope = generation === 0 ? `browser:${key}` : `browser:${key}:${generation}`;
58
+ const deployment = managedDeploymentName();
59
+ if (deployment)
60
+ return managedSandboxName(deployment, scope);
61
+ return `mda-${createHash("sha256").update(scope).digest("hex").slice(0, 16)}`;
62
+ }
63
+ /**
64
+ * `key`'s browser, created or started as needed, and its sandbox.
65
+ *
66
+ * A browser that is being deleted, or broke, can't be used or recreated under
67
+ * its name, so `key` moves on to its next generation.
68
+ */
69
+ export async function usableBrowser(api, boxes, key, idleTtlSeconds) {
70
+ for (let generation = 0; generation < BROWSER_GENERATIONS; generation++) {
71
+ const name = browserName(key, generation);
72
+ try {
73
+ // HiDPI renders at twice the resolution, so a person watching or driving
74
+ // the window sees it sharp; it can only be chosen at creation.
75
+ const create = { name, idle_ttl_seconds: idleTtlSeconds, hidpi: true };
76
+ await request(api, "POST", `${api.url}/browsers`, create);
77
+ }
78
+ catch (err) {
79
+ if (err.status !== 409)
80
+ throw err; // conflict: it exists
81
+ }
82
+ let box = await boxes.getSandbox(name);
83
+ if (UNUSABLE.has(box.status ?? ""))
84
+ continue;
85
+ if (box.status === "stopped") {
86
+ box = await boxes.startSandbox(name, { timeout: 300 });
87
+ }
88
+ return { name, box };
89
+ }
90
+ throw new Error("could not find or create a usable browser");
91
+ }
92
+ /** LangSmith's sandboxes API, and its headers: the key, and the workspace if set. */
93
+ export function browsersApi() {
94
+ const workspace = process.env.LANGSMITH_WORKSPACE_ID;
95
+ const key = process.env.LANGSMITH_API_KEY || process.env.LANGCHAIN_API_KEY || "";
96
+ return {
97
+ url: `${endpoint()}/v2/sandboxes`,
98
+ headers: {
99
+ "X-Api-Key": key,
100
+ ...(workspace ? { "X-Tenant-Id": workspace } : {}),
101
+ },
102
+ };
103
+ }
104
+ /** LangSmith's API. */
105
+ export function endpoint() {
106
+ const url = process.env.LANGSMITH_ENDPOINT ||
107
+ process.env.LANGCHAIN_ENDPOINT ||
108
+ "https://api.smith.langchain.com";
109
+ return url.replace(/\/+$/, "");
110
+ }
111
+ /**
112
+ * Attach Stagehand to a window of `key`'s browser, creating either as needed.
113
+ *
114
+ * The client reaches Chrome through the API's CDP proxy; the extension, inside
115
+ * the browser sandbox, dials the window's local port. A window the user still
116
+ * holds from an ended handoff is taken back.
117
+ */
118
+ export async function openSession(key, windowName, idleTtlSeconds, onCloseRequested) {
119
+ const api = browsersApi();
120
+ const { headers } = api;
121
+ const browsers = `${api.url}/browsers`;
122
+ const boxes = new SandboxClient({ apiKey: headers["X-Api-Key"], headers });
123
+ const { name, box } = await usableBrowser(api, boxes, key, idleTtlSeconds);
124
+ await installExtension(box);
125
+ await request(api, "POST", `${browsers}/${name}/extensions/load`); // a no-op once loaded
126
+ const window = await findWindow(api, `${browsers}/${name}`, windowName);
127
+ if (window.controller === "user") {
128
+ const controller = `${browsers}/${name}/attachments/${window.id}/controller`;
129
+ await request(api, "POST", controller, { controller: "agent" });
130
+ }
131
+ const debugging = `${window.api_cdp_url}/json/version`;
132
+ const cdpUrl = (await request(api, "GET", debugging)).webSocketDebuggerUrl;
133
+ const port = await windowPort(box, window.id);
134
+ const localUrl = `ws://127.0.0.1:${port}/devtools/browser/${window.id}`;
135
+ const attach = () => connect(windowName, name, cdpUrl, localUrl, headers, onCloseRequested);
136
+ try {
137
+ return await attach();
138
+ }
139
+ catch (err) {
140
+ if (!String(err).includes("already initialized"))
141
+ throw err;
142
+ }
143
+ // A client that never closed (a crash, another replica) left its claim in the
144
+ // extension; reinstalling it clears the claim without restarting Chrome.
145
+ await reinstallExtension(cdpUrl, headers);
146
+ return attach();
147
+ }
148
+ /** The browser's window `name`, created for the agent if it has none. */
149
+ async function findWindow(api, browser, name) {
150
+ const info = await request(api, "GET", browser);
151
+ const window = info.attachments?.find((w) => w.name === name);
152
+ if (window)
153
+ return window;
154
+ const body = { name, controller: "agent" };
155
+ return request(api, "POST", `${browser}/attachments`, body);
156
+ }
157
+ /**
158
+ * Give the user `key`'s window, creating either as needed.
159
+ *
160
+ * Returns the browser's name, the window's id, and a short-lived link the user
161
+ * drives it with.
162
+ */
163
+ export async function handOver(key, windowName, idleTtlSeconds) {
164
+ const api = browsersApi();
165
+ const { headers } = api;
166
+ const browsers = `${api.url}/browsers`;
167
+ const boxes = new SandboxClient({ apiKey: headers["X-Api-Key"], headers });
168
+ const { name } = await usableBrowser(api, boxes, key, idleTtlSeconds);
169
+ const window = await findWindow(api, `${browsers}/${name}`, windowName);
170
+ const windowApi = `${browsers}/${name}/attachments/${window.id}`;
171
+ await request(api, "POST", `${windowApi}/controller`, { controller: "user" });
172
+ const body = {
173
+ ttl_seconds: HANDOFF_LINK_TTL_S,
174
+ embed_origins: await embedOrigins(api),
175
+ };
176
+ const link = await request(api, "POST", `${windowApi}/links`, body);
177
+ return { browser: name, windowId: window.id, url: link.act_url };
178
+ }
179
+ /** How the handoff ended, or `undefined` while the user still has the window. */
180
+ export async function handoffStatus(pending) {
181
+ const api = browsersApi();
182
+ try {
183
+ const browser = `${api.url}/browsers/${pending.browser}`;
184
+ const info = await request(api, "GET", browser, undefined, 10_000);
185
+ const window = info.attachments?.find((w) => w.id === pending.window_id);
186
+ if (window === undefined)
187
+ return "ended";
188
+ if (window.controller === "agent")
189
+ return "handed_back";
190
+ }
191
+ catch (err) {
192
+ if (err.status === 404)
193
+ return "ended";
194
+ // Asked again later.
195
+ }
196
+ return Date.now() / 1000 >= pending.until ? "ended" : undefined;
197
+ }
198
+ /**
199
+ * Origins whose pages may frame a handoff's window: the LangSmith UI, plus any
200
+ * in `MDA_BROWSER_EMBED_ORIGINS` (comma-separated), such as a UI preview build.
201
+ */
202
+ export async function embedOrigins(api) {
203
+ const extra = (process.env.MDA_BROWSER_EMBED_ORIGINS ?? "").split(",");
204
+ const ui = await langsmithUiOrigin(api);
205
+ const origins = [ui, ...extra.map((o) => o.trim()).filter(Boolean)];
206
+ return [...new Set(origins)];
207
+ }
208
+ /**
209
+ * The LangSmith UI's origin, where Studio may embed a handoff's window: the
210
+ * workspace's `dashboard_url`.
211
+ */
212
+ async function langsmithUiOrigin(api) {
213
+ const workspace = `${endpoint()}/v1/platform/workspaces/current/info`;
214
+ const info = await request(api, "GET", workspace);
215
+ return new URL(info.dashboard_url).origin;
216
+ }
217
+ /**
218
+ * Let browser `name` open `sandbox`'s servers at `http://localhost:<port>`.
219
+ *
220
+ * One window attached with `share_localhost` serves the whole browser. A
221
+ * sandbox MDA replaced under the same name keeps the window's `sandbox` but not
222
+ * its id, so the window is checked by the id its `localhost_alias` names.
223
+ */
224
+ export async function shareLocalhost(name, sandbox) {
225
+ const api = browsersApi();
226
+ const browser = `${api.url}/browsers/${name}`;
227
+ const info = await request(api, "GET", browser);
228
+ const window = info.attachments?.find((w) => w.name === LOCALHOST_WINDOW);
229
+ if (window) {
230
+ const box = `${api.url}/boxes/${sandbox}`;
231
+ const { id } = await request(api, "GET", box);
232
+ if (window.localhost_alias === localhostAlias(id))
233
+ return;
234
+ await request(api, "DELETE", `${browser}/attachments/${window.id}`); // an old sandbox's
235
+ }
236
+ const body = { name: LOCALHOST_WINDOW, sandbox, share_localhost: true };
237
+ await request(api, "POST", `${browser}/attachments`, body);
238
+ }
239
+ /** The browser's host for a sandbox's localhost: `sb-` and its id in base32. */
240
+ export function localhostAlias(sandboxId) {
241
+ const hex = sandboxId.replaceAll("-", "");
242
+ if (!/^[\da-f]{32}$/i.test(hex)) {
243
+ throw new Error("badly formed hexadecimal UUID string"); // as uuid.UUID
244
+ }
245
+ // RFC 4648 base32 of the UUID's 16 bytes, lowercase and unpadded: 26 digits.
246
+ const alphabet = "abcdefghijklmnopqrstuvwxyz234567";
247
+ const digits = (BigInt(`0x${hex}`) << 2n).toString(32).padStart(26, "0");
248
+ const label = [...digits].map((d) => alphabet[parseInt(d, 32)]).join("");
249
+ return `sb-${label}.localhost`;
250
+ }
251
+ /** A browsers API call's JSON, if any; an unsuccessful status throws, as Python's `_raise` does. */
252
+ async function request(api, method, url, body, timeoutMs = 90_000) {
253
+ const response = await fetch(url, {
254
+ method,
255
+ headers: body
256
+ ? { ...api.headers, "Content-Type": "application/json" }
257
+ : api.headers,
258
+ body: body && JSON.stringify(body),
259
+ redirect: "manual", // as httpx: a redirect is an error, and the key never follows one
260
+ signal: AbortSignal.timeout(timeoutMs),
261
+ });
262
+ const text = await response.text(); // read even when unused, freeing the connection
263
+ if (!response.ok) {
264
+ const msg = `LangSmith browsers API: HTTP ${response.status} ${text.slice(0, 300)}`;
265
+ throw Object.assign(new Error(msg), { status: response.status });
266
+ }
267
+ return (text ? JSON.parse(text) : undefined);
268
+ }
269
+ export async function connect(window, browser, cdpUrl, localUrl, headers, onCloseRequested) {
270
+ const handle = await localBrowser.connect({
271
+ cdpUrl,
272
+ extensionCdpUrl: localUrl,
273
+ headers,
274
+ });
275
+ // When this fails, 4.3.0 has no public way to drop `handle`: a known leak.
276
+ const stagehand = await Stagehand.create({ browser: handle });
277
+ const artifacts = await mkdtemp(join(tmpdir(), "mda-browser-"));
278
+ // Run code's `browser.close()` releases only our client, not the browser.
279
+ const tools = new StagehandFacadeTools(stagehand, {
280
+ artifactRoot: artifacts,
281
+ onCloseRequested,
282
+ quietWait: true,
283
+ keeperPage: false,
284
+ });
285
+ // The facade acts on Chrome's focused tab, which is often in a window this client
286
+ // cannot see (another thread's, or the shared localhost one), and `setActivePage`
287
+ // does not move headless Chrome's focus. It has no hook for the page, so name ours.
288
+ Object.assign(tools, { activePage: () => newestTab(handle.context) });
289
+ return {
290
+ window,
291
+ browser,
292
+ stagehand,
293
+ tools,
294
+ artifacts,
295
+ transport: stagehand.rpcClient?.cdp, // `stagehand.close()` clears `rpcClient`
296
+ closing: false,
297
+ shared: undefined,
298
+ };
299
+ }
300
+ /** The window's newest tab, as it was: the client's CDP lists only its window's. */
301
+ async function newestTab(context) {
302
+ const pages = await context.pages();
303
+ return pages.at(-1) ?? (await context.newPage());
304
+ }
305
+ /** Unpack the client's own extension into the browser, unless it is there already. */
306
+ export async function installExtension(box) {
307
+ const check = `test -f ${EXTENSION_DIR}/manifest.json`;
308
+ if ((await box.run(check, { timeout: 60 })).exit_code === 0)
309
+ return;
310
+ await box.write(EXTENSION_ZIP, await getExtensionArchive(), 300);
311
+ const tmp = `${EXTENSION_DIR}.tmp`; // unpacked aside, so a partial copy never passes the check
312
+ const unpacked = await box.run(`rm -rf ${tmp} && python3 -m zipfile -e ${EXTENSION_ZIP} ${tmp} && ` +
313
+ `rm -rf ${EXTENSION_DIR} && mv ${tmp} ${EXTENSION_DIR}`, { timeout: 300 });
314
+ if (unpacked.exit_code !== 0) {
315
+ const msg = `could not install Stagehand in the browser: ${unpacked.stderr.slice(-500)}`;
316
+ throw new Error(msg);
317
+ }
318
+ }
319
+ /** Uninstall Stagehand's extension and load it again over CDP. */
320
+ async function reinstallExtension(cdpUrl, headers) {
321
+ const ws = new WebSocket(cdpUrl, { headers });
322
+ let fail = () => undefined;
323
+ const failed = new Promise((_, reject) => {
324
+ fail = reject;
325
+ });
326
+ failed.catch(() => undefined); // raced by each step; it may also settle after the last
327
+ const deadline = AbortSignal.timeout(30_000);
328
+ deadline.addEventListener("abort", () => fail(deadline.reason));
329
+ ws.addEventListener("close", () => fail(new Error("CDP connection closed")));
330
+ const waiting = new Map();
331
+ ws.addEventListener("message", (event) => {
332
+ try {
333
+ const reply = JSON.parse(String(event.data));
334
+ waiting.get(reply.id ?? -1)?.(reply); // events share the socket
335
+ }
336
+ catch (err) {
337
+ fail(err); // a listener that throws would crash the process
338
+ }
339
+ });
340
+ async function cdp(id, method, params = {}) {
341
+ const reply = new Promise((resolve) => waiting.set(id, resolve));
342
+ ws.send(JSON.stringify({ id, method, params }));
343
+ const { error, result } = await Promise.race([reply, failed]);
344
+ if (error !== undefined) {
345
+ throw new Error(`CDP ${method} failed: ${JSON.stringify(error)}`);
346
+ }
347
+ return result ?? {};
348
+ }
349
+ try {
350
+ const open = new Promise((resolve) => ws.addEventListener("open", resolve));
351
+ await Promise.race([open, failed]);
352
+ const { extensions } = (await cdp(0, "Extensions.getExtensions"));
353
+ for (const extension of extensions) {
354
+ if (extension.name === "Stagehand Runtime") {
355
+ await cdp(1, "Extensions.uninstall", { id: extension.id });
356
+ }
357
+ }
358
+ await cdp(2, "Extensions.loadUnpacked", { path: EXTENSION_DIR });
359
+ }
360
+ finally {
361
+ ws.close();
362
+ }
363
+ }
364
+ /** The port browserd serves a window on inside the browser sandbox, once it is saved. */
365
+ async function windowPort(box, windowId) {
366
+ for (let attempt = 0; attempt < 20; attempt++) {
367
+ const saved = await box.run(`cat ${WINDOWS_FILE}`, { timeout: 60 });
368
+ try {
369
+ const { attachments } = JSON.parse(saved.stdout);
370
+ const port = attachments.find((w) => w.id === windowId)?.port;
371
+ if (port)
372
+ return Number(port);
373
+ }
374
+ catch { } // not saved yet
375
+ await sleep(250);
376
+ }
377
+ throw new Error("could not find the browser window's port");
378
+ }
379
+ //# sourceMappingURL=browser-langsmith.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-langsmith.js","sourceRoot":"","sources":["../../src/runtime/browser-langsmith.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { BrowserDefinition } from "../browser.js";
2
+ import type { DeepAgentDefinition } from "../types.js";
3
+ import type { ManagedAgentOptions } from "./types.js";
4
+ /**
5
+ * Keep, turn off, or replace `browser.ts`'s browser for this run.
6
+ *
7
+ * Eval builds ship no browser, as they ship no nested sandbox.
8
+ */
9
+ export declare function selectRunBrowser(config: DeepAgentDefinition["config"], options: Pick<ManagedAgentOptions, "browser" | "trialRootDir"> | undefined): BrowserDefinition | undefined;
10
+ //# sourceMappingURL=browser-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-selection.d.ts","sourceRoot":"","sources":["../../src/runtime/browser-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACrC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,cAAc,CAAC,GAAG,SAAS,GACzE,iBAAiB,GAAG,SAAS,CAc/B"}
@@ -0,0 +1,21 @@
1
+ import { snapshotBrowserSelection } from "../managed-composition.js";
2
+ /**
3
+ * Keep, turn off, or replace `browser.ts`'s browser for this run.
4
+ *
5
+ * Eval builds ship no browser, as they ship no nested sandbox.
6
+ */
7
+ export function selectRunBrowser(config, options) {
8
+ if (options?.trialRootDir)
9
+ return undefined;
10
+ const declared = options?.browser;
11
+ if (!Object.hasOwn(config, "browser") || config.browser === undefined) {
12
+ return declared;
13
+ }
14
+ const selected = snapshotBrowserSelection(config.browser);
15
+ if (selected !== null && declared === undefined) {
16
+ throw new Error("The agent factory selected a browser, but the project has no browser.ts. " +
17
+ "Declare `export const browser = defineBrowser()` there so the deployment installs Stagehand.");
18
+ }
19
+ return selected ?? undefined;
20
+ }
21
+ //# sourceMappingURL=browser-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-selection.js","sourceRoot":"","sources":["../../src/runtime/browser-selection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAIrE;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAqC,EACrC,OAA0E;IAE1E,IAAI,OAAO,EAAE,YAAY;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACtE,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,2EAA2E;YACzE,8FAA8F,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,IAAI,SAAS,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Browser use: Stagehand's TypeScript facade tools on a LangSmith browser.
3
+ *
4
+ * A browser per key (`thread:<id>`, or `user:<id>` under user scope). A
5
+ * thread's own browser has one window, `mda`; a user's has a window per
6
+ * thread, so their threads share logins but not tabs. Each browser has one
7
+ * Stagehand client in this process (the extension serves one at a time),
8
+ * released between runs and after a minute idle so the browser can idle out.
9
+ *
10
+ * `browser_handoff` hands the window to the user and returns at once. A run of
11
+ * the watcher graph, which `mda` builds beside the agent, waits on its own
12
+ * thread for the user to hand it back, then enqueues a run on the agent's
13
+ * thread with a notification, as an async subagent tells the agent that
14
+ * started it that it finished.
15
+ *
16
+ * The middleware half of Python's `browser.py`; `browser-langsmith.ts` holds
17
+ * the LangSmith half. Only projects that declare `browser.ts` import this
18
+ * module or install Stagehand.
19
+ */
20
+ import { type LangGraphRunnableConfig } from "@langchain/langgraph";
21
+ import { Client } from "@langchain/langgraph-sdk";
22
+ import { type BackendProtocolV2, type SandboxBackendProtocolV2 } from "deepagents";
23
+ import { type AgentMiddleware } from "langchain";
24
+ import type { BrowserDefinition, BrowserScope } from "../browser.js";
25
+ import { type BrowserHandoffStatus, type PendingBrowserHandoff } from "./browser-langsmith.js";
26
+ import type { ManagedServerInfo } from "./managed-tools.js";
27
+ /** The graph `mda` builds beside the agent, whose run waits out a handoff. */
28
+ export declare const HANDOFF_WATCHER_GRAPH = "mda-browser-handoff";
29
+ /** What tools and hooks read from their runtime; MDA adds `serverInfo` and `backend`. */
30
+ interface BrowserRuntime {
31
+ configurable?: Record<string, unknown>;
32
+ serverInfo?: ManagedServerInfo;
33
+ backend?: BackendProtocolV2;
34
+ state?: unknown;
35
+ context?: unknown;
36
+ toolCallId?: string;
37
+ }
38
+ /** Give the agent Stagehand's tools, named `browser_run`, `browser_snapshot` and so on. */
39
+ export declare function createBrowserMiddleware(options: Omit<BrowserDefinition, "kind">): AgentMiddleware;
40
+ /**
41
+ * Start a run of the watcher graph on a thread of its own, as deepagents starts
42
+ * an async subagent's task: the thread's metadata names this agent, which the
43
+ * Agent Server copies into the run, and the run gets this run's context.
44
+ *
45
+ * The wait is a run rather than a promise in this process, so the wake-up comes
46
+ * from a live run, the only caller a deployed graph's Agent Server takes.
47
+ */
48
+ export declare function startWatcher(client: Client, runtime: BrowserRuntime, handoff: PendingBrowserHandoff): Promise<void>;
49
+ declare const WatcherState: import("@langchain/langgraph").AnnotationRoot<{
50
+ handoff: import("@langchain/langgraph").LastValue<{
51
+ browser: string;
52
+ window_id: string;
53
+ until: number;
54
+ }>;
55
+ }>;
56
+ /**
57
+ * Once the handoff ends, notify the agent that started it, unless it has moved
58
+ * on: a newer handoff replaced this one, or the agent waits on a person, where
59
+ * a new run would drop what it waits for. Its browser tools work again either way.
60
+ */
61
+ export declare function watch(state: typeof WatcherState.State, config: LangGraphRunnableConfig): Promise<Partial<typeof WatcherState.State>>;
62
+ /** The watcher graph: one run per handoff, from `browser_handoff` until it ends. */
63
+ export declare const handoffWatcher: import("@langchain/langgraph").CompiledStateGraph<{
64
+ handoff: {
65
+ browser: string;
66
+ window_id: string;
67
+ until: number;
68
+ };
69
+ }, {
70
+ handoff?: {
71
+ browser: string;
72
+ window_id: string;
73
+ until: number;
74
+ } | undefined;
75
+ }, "__start__" | "watch", {
76
+ handoff: import("@langchain/langgraph").LastValue<{
77
+ browser: string;
78
+ window_id: string;
79
+ until: number;
80
+ }>;
81
+ }, {
82
+ handoff: import("@langchain/langgraph").LastValue<{
83
+ browser: string;
84
+ window_id: string;
85
+ until: number;
86
+ }>;
87
+ }, import("@langchain/langgraph").StateDefinition, {
88
+ watch: Partial<import("@langchain/langgraph").StateType<{
89
+ handoff: import("@langchain/langgraph").LastValue<{
90
+ browser: string;
91
+ window_id: string;
92
+ until: number;
93
+ }>;
94
+ }>>;
95
+ }, unknown, unknown, []>;
96
+ /**
97
+ * A notification in deepagents' task notification's shape: a user-role message
98
+ * framed as a system notification. Its `mda_notification` tells clients how the
99
+ * handoff ended, so they can tell it from the user's message.
100
+ */
101
+ export declare function wakeMessage(status: BrowserHandoffStatus): {
102
+ role: string;
103
+ content: string;
104
+ additional_kwargs: {
105
+ mda_notification: {
106
+ type: string;
107
+ status: BrowserHandoffStatus;
108
+ };
109
+ };
110
+ };
111
+ /** Write `data` to absolute `path` in the agent's sandbox, creating its folder. */
112
+ export declare function save(backend: BackendProtocolV2 | undefined, path: string, data: Uint8Array): Promise<string>;
113
+ /** Under user scope, a person's browser; service principals stand for many people. */
114
+ export declare function browserKey(serverInfo: ManagedServerInfo | undefined, thread: string, scope: BrowserScope): string;
115
+ /**
116
+ * The run's sandbox once MDA has opened it; the browser never opens one.
117
+ *
118
+ * Tools see it through a lazy handle made fresh for each run, so the handle
119
+ * asks the process whether the box is open.
120
+ */
121
+ export declare function threadSandbox(backend: BackendProtocolV2 | undefined): SandboxBackendProtocolV2 | undefined;
122
+ /** Close every session and stop its timer, for tests. */
123
+ export declare function clearBrowserSessionsForTests(): Promise<void>;
124
+ export {};
125
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/runtime/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH,OAAO,EAML,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAC9B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAGnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAUrE,OAAO,EAQL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAE3B,MAAM,wBAAwB,CAAC;AAKhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAyC5D,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAS3D,yFAAyF;AACzF,UAAU,cAAc;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsCD,2FAA2F;AAC3F,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GACvC,eAAe,CAkEjB;AAyFD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,QAAA,MAAM,YAAY;;;;;;EAEhB,CAAC;AAEH;;;;GAIG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,OAAO,YAAY,CAAC,KAAK,EAChC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CA0B7C;AAED,oFAAoF;AACpF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAIf,CAAC;AA2Db;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,oBAAoB;;;;;;;;;EAQvD;AAuKD,mFAAmF;AACnF,wBAAsB,IAAI,CACxB,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC,CAoBjB;AASD,sFAAsF;AACtF,wBAAgB,UAAU,CACxB,UAAU,EAAE,iBAAiB,GAAG,SAAS,EACzC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,GAClB,MAAM,CASR;AAiBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,wBAAwB,GAAG,SAAS,CAKtC;AAmBD,yDAAyD;AACzD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlE"}