managed-deepagents 0.10.0-dev.17 → 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.
- package/README.md +530 -83
- package/dist/browser.d.ts +37 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +31 -0
- package/dist/browser.js.map +1 -0
- package/dist/channels/actor.d.ts +43 -0
- package/dist/channels/actor.d.ts.map +1 -0
- package/dist/channels/actor.js +2 -0
- package/dist/channels/actor.js.map +1 -0
- package/dist/channels/assistant-text.d.ts +29 -0
- package/dist/channels/assistant-text.d.ts.map +1 -1
- package/dist/channels/assistant-text.js +72 -1
- package/dist/channels/assistant-text.js.map +1 -1
- package/dist/channels/binding.d.ts +20 -1
- package/dist/channels/binding.d.ts.map +1 -1
- package/dist/channels/binding.js +44 -11
- package/dist/channels/binding.js.map +1 -1
- package/dist/channels/delivery.d.ts +36 -0
- package/dist/channels/delivery.d.ts.map +1 -0
- package/dist/channels/delivery.js +359 -0
- package/dist/channels/delivery.js.map +1 -0
- package/dist/channels/github/app-setup.d.ts +32 -0
- package/dist/channels/github/app-setup.d.ts.map +1 -0
- package/dist/channels/github/app-setup.js +146 -0
- package/dist/channels/github/app-setup.js.map +1 -0
- package/dist/channels/github/index.d.ts.map +1 -1
- package/dist/channels/github/index.js +21 -33
- package/dist/channels/github/index.js.map +1 -1
- package/dist/channels/github/schema.d.ts +50 -1
- package/dist/channels/github/schema.d.ts.map +1 -1
- package/dist/channels/github/schema.js +12 -0
- package/dist/channels/github/schema.js.map +1 -1
- package/dist/channels/http/endpoint.d.ts +6 -4
- package/dist/channels/http/endpoint.d.ts.map +1 -1
- package/dist/channels/http/endpoint.js.map +1 -1
- package/dist/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +4 -10
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +6 -0
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js +32 -23
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +2 -2
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +9 -21
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +10 -5
- package/dist/channels/http/provider.d.ts.map +1 -1
- package/dist/channels/http/provider.js +17 -10
- package/dist/channels/http/provider.js.map +1 -1
- package/dist/channels/http/studio.d.ts +5 -5
- package/dist/channels/http/studio.d.ts.map +1 -1
- package/dist/channels/http/studio.js +4 -6
- package/dist/channels/http/studio.js.map +1 -1
- package/dist/channels/http/types.d.ts +7 -1
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/linear/app-setup.d.ts +29 -0
- package/dist/channels/linear/app-setup.d.ts.map +1 -0
- package/dist/channels/linear/app-setup.js +102 -0
- package/dist/channels/linear/app-setup.js.map +1 -0
- package/dist/channels/linear/index.d.ts.map +1 -1
- package/dist/channels/linear/index.js +26 -65
- package/dist/channels/linear/index.js.map +1 -1
- package/dist/channels/linear/schema.d.ts +11 -25
- package/dist/channels/linear/schema.d.ts.map +1 -1
- package/dist/channels/linear/schema.js +6 -0
- package/dist/channels/linear/schema.js.map +1 -1
- package/dist/channels/linear/types.d.ts +9 -2
- package/dist/channels/linear/types.d.ts.map +1 -1
- package/dist/channels/messaging-registry.d.ts +16 -0
- package/dist/channels/messaging-registry.d.ts.map +1 -1
- package/dist/channels/messaging-registry.js +29 -0
- package/dist/channels/messaging-registry.js.map +1 -1
- package/dist/channels/reserved-connections.d.ts.map +1 -1
- package/dist/channels/reserved-connections.js +10 -0
- package/dist/channels/reserved-connections.js.map +1 -1
- package/dist/channels/run-input.d.ts +11 -0
- package/dist/channels/run-input.d.ts.map +1 -1
- package/dist/channels/run-input.js +18 -8
- package/dist/channels/run-input.js.map +1 -1
- package/dist/channels/runtime.d.ts +5 -2
- package/dist/channels/runtime.d.ts.map +1 -1
- package/dist/channels/runtime.js +19 -10
- package/dist/channels/runtime.js.map +1 -1
- package/dist/channels/schedule-delivery.d.ts +2 -13
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +6 -73
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/channels/slack/api.d.ts +2 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +6 -0
- package/dist/channels/slack/api.js.map +1 -1
- package/dist/channels/slack/connections.d.ts +6 -0
- package/dist/channels/slack/connections.d.ts.map +1 -0
- package/dist/channels/slack/connections.js +6 -0
- package/dist/channels/slack/connections.js.map +1 -0
- package/dist/channels/slack/events.d.ts +272 -0
- package/dist/channels/slack/events.d.ts.map +1 -0
- package/dist/channels/slack/events.js +235 -0
- package/dist/channels/slack/events.js.map +1 -0
- package/dist/channels/slack/files.d.ts.map +1 -1
- package/dist/channels/slack/files.js +2 -3
- package/dist/channels/slack/files.js.map +1 -1
- package/dist/channels/slack/index.d.ts +44 -2
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +127 -3
- package/dist/channels/slack/index.js.map +1 -1
- package/dist/channels/slack/message-content.d.ts.map +1 -1
- package/dist/channels/slack/message-content.js +23 -28
- package/dist/channels/slack/message-content.js.map +1 -1
- package/dist/channels/slack/status.d.ts +76 -0
- package/dist/channels/slack/status.d.ts.map +1 -0
- package/dist/channels/slack/status.js +427 -0
- package/dist/channels/slack/status.js.map +1 -0
- package/dist/channels/trigger/client.d.ts.map +1 -1
- package/dist/channels/trigger/client.js +6 -9
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/conversation.d.ts +11 -0
- package/dist/channels/trigger/conversation.d.ts.map +1 -0
- package/dist/channels/trigger/conversation.js +72 -0
- package/dist/channels/trigger/conversation.js.map +1 -0
- package/dist/channels/trigger/http.d.ts +123 -4
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +331 -76
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/ingress.d.ts +70 -1
- package/dist/channels/trigger/ingress.d.ts.map +1 -1
- package/dist/channels/trigger/ingress.js +136 -7
- package/dist/channels/trigger/ingress.js.map +1 -1
- package/dist/channels/trigger/transport.d.ts +10 -0
- package/dist/channels/trigger/transport.d.ts.map +1 -1
- package/dist/channels/trigger/transport.js +25 -9
- package/dist/channels/trigger/transport.js.map +1 -1
- package/dist/channels/trigger/types.d.ts +92 -3
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js +36 -0
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/channels/types.d.ts +43 -4
- package/dist/channels/types.d.ts.map +1 -1
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -1
- package/dist/define-deep-agent.d.ts +2 -2
- package/dist/define-deep-agent.d.ts.map +1 -1
- package/dist/define-deep-agent.js +53 -8
- package/dist/define-deep-agent.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/runs.d.ts +22 -0
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +45 -1
- package/dist/ingress/runs.js.map +1 -1
- package/dist/managed-composition.d.ts +3 -0
- package/dist/managed-composition.d.ts.map +1 -1
- package/dist/managed-composition.js +29 -13
- package/dist/managed-composition.js.map +1 -1
- package/dist/namespaces.d.ts +0 -21
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +0 -29
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/async-subagents.d.ts +27 -0
- package/dist/runtime/async-subagents.d.ts.map +1 -0
- package/dist/runtime/async-subagents.js +139 -0
- package/dist/runtime/async-subagents.js.map +1 -0
- package/dist/runtime/auth.d.ts +1 -2
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +125 -63
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/backend.d.ts +7 -0
- package/dist/runtime/backend.d.ts.map +1 -1
- package/dist/runtime/backend.js +32 -7
- package/dist/runtime/backend.js.map +1 -1
- package/dist/runtime/browser-facade.d.ts +10 -0
- package/dist/runtime/browser-facade.d.ts.map +1 -0
- package/dist/runtime/browser-facade.js +23 -0
- package/dist/runtime/browser-facade.js.map +1 -0
- package/dist/runtime/browser-langsmith.d.ts +108 -0
- package/dist/runtime/browser-langsmith.d.ts.map +1 -0
- package/dist/runtime/browser-langsmith.js +379 -0
- package/dist/runtime/browser-langsmith.js.map +1 -0
- package/dist/runtime/browser-selection.d.ts +10 -0
- package/dist/runtime/browser-selection.d.ts.map +1 -0
- package/dist/runtime/browser-selection.js +21 -0
- package/dist/runtime/browser-selection.js.map +1 -0
- package/dist/runtime/browser.d.ts +125 -0
- package/dist/runtime/browser.d.ts.map +1 -0
- package/dist/runtime/browser.js +606 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/identity-runtime.d.ts +4 -9
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +12 -25
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts +38 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +74 -34
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/managed-thread.d.ts +61 -0
- package/dist/runtime/managed-thread.d.ts.map +1 -0
- package/dist/runtime/managed-thread.js +76 -0
- package/dist/runtime/managed-thread.js.map +1 -0
- package/dist/runtime/managed-tools.d.ts +10 -2
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +10 -8
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/memory/policy.d.ts.map +1 -1
- package/dist/runtime/memory/policy.js +1 -3
- package/dist/runtime/memory/policy.js.map +1 -1
- package/dist/runtime/parent-run.d.ts +33 -0
- package/dist/runtime/parent-run.d.ts.map +1 -0
- package/dist/runtime/parent-run.js +114 -0
- package/dist/runtime/parent-run.js.map +1 -0
- package/dist/runtime/run-input.d.ts +14 -1
- package/dist/runtime/run-input.d.ts.map +1 -1
- package/dist/runtime/run-input.js +75 -6
- package/dist/runtime/run-input.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +14 -1
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +34 -9
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/schedule-auth.d.ts +79 -0
- package/dist/runtime/schedule-auth.d.ts.map +1 -1
- package/dist/runtime/schedule-auth.js +163 -6
- package/dist/runtime/schedule-auth.js.map +1 -1
- package/dist/runtime/static-entry.d.ts.map +1 -1
- package/dist/runtime/static-entry.js +1 -0
- package/dist/runtime/static-entry.js.map +1 -1
- package/dist/runtime/thread-record.d.ts +88 -0
- package/dist/runtime/thread-record.d.ts.map +1 -0
- package/dist/runtime/thread-record.js +213 -0
- package/dist/runtime/thread-record.js.map +1 -0
- package/dist/runtime/types.d.ts +12 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime-schedules.d.ts +13 -0
- package/dist/runtime-schedules.d.ts.map +1 -1
- package/dist/runtime-schedules.js +83 -20
- package/dist/runtime-schedules.js.map +1 -1
- package/dist/sandbox.d.ts +0 -6
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +3 -7
- package/dist/sandbox.js.map +1 -1
- package/dist/schedule-channel.d.ts +5 -2
- package/dist/schedule-channel.d.ts.map +1 -1
- package/dist/schedule-channel.js +13 -12
- package/dist/schedule-channel.js.map +1 -1
- package/dist/types.d.ts +19 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/values.d.ts +15 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +31 -0
- package/dist/values.js.map +1 -0
- package/package.json +22 -8
- package/dist/channels/http/reply.d.ts +0 -20
- package/dist/channels/http/reply.d.ts.map +0 -1
- package/dist/channels/http/reply.js +0 -116
- package/dist/channels/http/reply.js.map +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
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 { Stagehand } from "@browserbasehq/stagehand";
|
|
10
|
+
import type { SandboxBackendProtocolV2 } from "deepagents";
|
|
11
|
+
import { SandboxClient, type Sandbox } from "langsmith/sandbox";
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { StagehandFacadeTools } from "./browser-facade.js";
|
|
14
|
+
/** The client and the browser's extension must match; `mda` pins this in deployments. */
|
|
15
|
+
export declare const STAGEHAND_VERSION = "4.3.0";
|
|
16
|
+
export declare const HANDOFF_LINK_TTL_S = 900;
|
|
17
|
+
export interface Session {
|
|
18
|
+
readonly window: string;
|
|
19
|
+
readonly browser: string;
|
|
20
|
+
readonly stagehand: Stagehand;
|
|
21
|
+
readonly tools: StagehandFacadeTools;
|
|
22
|
+
readonly artifacts: string;
|
|
23
|
+
readonly transport: {
|
|
24
|
+
close(): void;
|
|
25
|
+
} | undefined;
|
|
26
|
+
closing: boolean;
|
|
27
|
+
shared: SandboxBackendProtocolV2 | undefined;
|
|
28
|
+
}
|
|
29
|
+
export type BrowsersApi = ReturnType<typeof browsersApi>;
|
|
30
|
+
/**
|
|
31
|
+
* How a handoff ended: `handed_back` when the user hands the window back;
|
|
32
|
+
* `ended` when the handoff's link ran out, or its browser or window is gone.
|
|
33
|
+
*/
|
|
34
|
+
export type BrowserHandoffStatus = "handed_back" | "ended";
|
|
35
|
+
/** A handoff that waits on the user, in the thread's state. */
|
|
36
|
+
export declare const PendingBrowserHandoffSchema: z.ZodObject<{
|
|
37
|
+
browser: z.ZodString;
|
|
38
|
+
window_id: z.ZodString;
|
|
39
|
+
until: z.ZodNumber;
|
|
40
|
+
}, z.core.$strip>;
|
|
41
|
+
export type PendingBrowserHandoff = z.infer<typeof PendingBrowserHandoffSchema>;
|
|
42
|
+
export declare function closeSession(session: Session): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* `key`'s browser, under the deployment's prefix like its sandboxes.
|
|
45
|
+
*
|
|
46
|
+
* A later `generation` replaces a browser that is being deleted or broke.
|
|
47
|
+
*/
|
|
48
|
+
export declare function browserName(key: string, generation?: number): string;
|
|
49
|
+
/**
|
|
50
|
+
* `key`'s browser, created or started as needed, and its sandbox.
|
|
51
|
+
*
|
|
52
|
+
* A browser that is being deleted, or broke, can't be used or recreated under
|
|
53
|
+
* its name, so `key` moves on to its next generation.
|
|
54
|
+
*/
|
|
55
|
+
export declare function usableBrowser(api: BrowsersApi, boxes: Pick<SandboxClient, "getSandbox" | "startSandbox">, key: string, idleTtlSeconds: number): Promise<{
|
|
56
|
+
name: string;
|
|
57
|
+
box: Sandbox;
|
|
58
|
+
}>;
|
|
59
|
+
/** LangSmith's sandboxes API, and its headers: the key, and the workspace if set. */
|
|
60
|
+
export declare function browsersApi(): {
|
|
61
|
+
url: string;
|
|
62
|
+
headers: {
|
|
63
|
+
"X-Api-Key": string;
|
|
64
|
+
"X-Tenant-Id"?: string | undefined;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
/** LangSmith's API. */
|
|
68
|
+
export declare function endpoint(): string;
|
|
69
|
+
/**
|
|
70
|
+
* Attach Stagehand to a window of `key`'s browser, creating either as needed.
|
|
71
|
+
*
|
|
72
|
+
* The client reaches Chrome through the API's CDP proxy; the extension, inside
|
|
73
|
+
* the browser sandbox, dials the window's local port. A window the user still
|
|
74
|
+
* holds from an ended handoff is taken back.
|
|
75
|
+
*/
|
|
76
|
+
export declare function openSession(key: string, windowName: string, idleTtlSeconds: number, onCloseRequested: () => Promise<void>): Promise<Session>;
|
|
77
|
+
/**
|
|
78
|
+
* Give the user `key`'s window, creating either as needed.
|
|
79
|
+
*
|
|
80
|
+
* Returns the browser's name, the window's id, and a short-lived link the user
|
|
81
|
+
* drives it with.
|
|
82
|
+
*/
|
|
83
|
+
export declare function handOver(key: string, windowName: string, idleTtlSeconds: number): Promise<{
|
|
84
|
+
browser: string;
|
|
85
|
+
windowId: string;
|
|
86
|
+
url: string;
|
|
87
|
+
}>;
|
|
88
|
+
/** How the handoff ended, or `undefined` while the user still has the window. */
|
|
89
|
+
export declare function handoffStatus(pending: PendingBrowserHandoff): Promise<BrowserHandoffStatus | undefined>;
|
|
90
|
+
/**
|
|
91
|
+
* Origins whose pages may frame a handoff's window: the LangSmith UI, plus any
|
|
92
|
+
* in `MDA_BROWSER_EMBED_ORIGINS` (comma-separated), such as a UI preview build.
|
|
93
|
+
*/
|
|
94
|
+
export declare function embedOrigins(api: BrowsersApi): Promise<string[]>;
|
|
95
|
+
/**
|
|
96
|
+
* Let browser `name` open `sandbox`'s servers at `http://localhost:<port>`.
|
|
97
|
+
*
|
|
98
|
+
* One window attached with `share_localhost` serves the whole browser. A
|
|
99
|
+
* sandbox MDA replaced under the same name keeps the window's `sandbox` but not
|
|
100
|
+
* its id, so the window is checked by the id its `localhost_alias` names.
|
|
101
|
+
*/
|
|
102
|
+
export declare function shareLocalhost(name: string, sandbox: string): Promise<void>;
|
|
103
|
+
/** The browser's host for a sandbox's localhost: `sb-` and its id in base32. */
|
|
104
|
+
export declare function localhostAlias(sandboxId: string): string;
|
|
105
|
+
export declare function connect(window: string, browser: string, cdpUrl: string, localUrl: string, headers: Record<string, string>, onCloseRequested: () => Promise<void>): Promise<Session>;
|
|
106
|
+
/** Unpack the client's own extension into the browser, unless it is there already. */
|
|
107
|
+
export declare function installExtension(box: Sandbox): Promise<void>;
|
|
108
|
+
//# sourceMappingURL=browser-langsmith.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-langsmith.d.ts","sourceRoot":"","sources":["../../src/runtime/browser-langsmith.ts"],"names":[],"mappings":"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clE"}
|
|
@@ -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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,SAAS,GAGV,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,aAAa,EAAgB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,yFAAyF;AACzF,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,8BAA8B;AACpG,MAAM,aAAa,GAAG,0CAA0C,iBAAiB,EAAE,CAAC;AACpF,MAAM,aAAa,GAAG,wBAAwB,CAAC,CAAC,yBAAyB;AACzE,MAAM,YAAY,GAAG,oCAAoC,CAAC,CAAC,qCAAqC;AAChG,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,iDAAiD;AAC3F,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC,CAAC,oDAAoD;AA+B3F,+DAA+D;AAC/D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,oCAAoC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,+BAA+B;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,uDAAuD;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAKH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IACjD,+EAA+E;IAC/E,oEAAoE;IACpE,MAAM,OAAO,CAAC,IAAI,CAAC;QACjB,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE;QACzB,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;KACxC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,+DAA+D;IAC/D,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CACjE,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,UAAU,GAAG,CAAC;IACrD,MAAM,KAAK,GACT,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC;IACvE,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAC3C,IAAI,UAAU;QAAE,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7D,OAAO,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAChF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAgB,EAChB,KAAyD,EACzD,GAAW,EACX,cAAsB;IAEtB,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,mBAAmB,EAAE,UAAU,EAAE,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,yEAAyE;YACzE,+DAA+D;YAC/D,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACvE,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA4B,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,GAAG,CAAC,CAAC,sBAAsB;QACrF,CAAC;QACD,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;YAAE,SAAS;QAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC/D,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,WAAW;IACzB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACrD,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACvE,OAAO;QACL,GAAG,EAAE,GAAG,QAAQ,EAAE,eAAe;QACjC,OAAO,EAAE;YACP,WAAW,EAAE,GAAG;YAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD;KACF,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,QAAQ;IACtB,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,iCAAiC,CAAC;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,UAAkB,EAClB,cAAsB,EACtB,gBAAqC;IAErC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IACxB,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAE3E,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;IAC3E,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,IAAI,IAAI,kBAAkB,CAAC,CAAC,CAAC,sBAAsB;IACzF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,GAAG,QAAQ,IAAI,IAAI,gBAAgB,MAAM,CAAC,EAAE,aAAa,CAAC;QAC7E,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,WAAW,eAAe,CAAC;IACvD,MAAM,MAAM,GAAG,CACb,MAAM,OAAO,CAAmC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CACvE,CAAC,oBAAoB,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,kBAAkB,IAAI,qBAAqB,MAAM,CAAC,EAAE,EAAE,CAAC;IACxE,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAAE,MAAM,GAAG,CAAC;IAC9D,CAAC;IACD,8EAA8E;IAC9E,yEAAyE;IACzE,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,MAAM,EAAE,CAAC;AAClB,CAAC;AAED,yEAAyE;AACzE,KAAK,UAAU,UAAU,CACvB,GAAgB,EAChB,OAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAc,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC9D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAgB,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,cAAc,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,UAAkB,EAClB,cAAsB;IAEtB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IACxB,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,IAAI,gBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC;IACjE,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG;QACX,WAAW,EAAE,kBAAkB;QAC/B,aAAa,EAAE,MAAM,YAAY,CAAC,GAAG,CAAC;KACvC,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,GAAG,EACH,MAAM,EACN,GAAG,SAAS,QAAQ,EACpB,IAAI,CACL,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACnE,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA8B;IAE9B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,aAAa,OAAO,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,GAAG,EACH,KAAK,EACL,OAAO,EACP,SAAS,EACT,MAAM,CACP,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;QACzE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;QACzC,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO;YAAE,OAAO,aAAa,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA4B,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC;QACjE,qBAAqB;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAgB;IACjD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAgB;IAC/C,MAAM,SAAS,GAAG,GAAG,QAAQ,EAAE,sCAAsC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,OAAO,CAA4B,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7E,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,OAAe;IAEf,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,aAAa,IAAI,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAc,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;IAC1E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,UAAU,OAAO,EAAE,CAAC;QAC1C,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,OAAO,CAAiB,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,eAAe,KAAK,cAAc,CAAC,EAAE,CAAC;YAAE,OAAO;QAC1D,MAAM,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,gBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IACxE,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,cAAc,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC,eAAe;IAC1E,CAAC;IACD,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,kCAAkC,CAAC;IACpD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,MAAM,KAAK,YAAY,CAAC;AACjC,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,OAAO,CACpB,GAAgB,EAChB,MAAc,EACd,GAAW,EACX,IAAa,EACb,SAAS,GAAG,MAAM;IAElB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM;QACN,OAAO,EAAE,IAAI;YACX,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE;YACxD,CAAC,CAAC,GAAG,CAAC,OAAO;QACf,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAClC,QAAQ,EAAE,QAAQ,EAAE,kEAAkE;QACtF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;KACvC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,gDAAgD;IACpF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,gCAAgC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACpF,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAM,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,OAAe,EACf,MAAc,EACd,QAAgB,EAChB,OAA+B,EAC/B,gBAAqC;IAErC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;QACxC,MAAM;QACN,eAAe,EAAE,QAAQ;QACzB,OAAO;KACR,CAAC,CAAC;IACH,2EAA2E;IAC3E,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAChE,0EAA0E;IAC1E,MAAM,KAAK,GAAG,IAAI,oBAAoB,CAAC,SAAS,EAAE;QAChD,YAAY,EAAE,SAAS;QACvB,gBAAgB;QAChB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,kFAAkF;IAClF,kFAAkF;IAClF,oFAAoF;IACpF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtE,OAAO;QACL,MAAM;QACN,OAAO;QACP,SAAS;QACT,KAAK;QACL,SAAS;QACT,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,yCAAyC;QAC9E,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,KAAK,UAAU,SAAS,CAAC,OAAuB;IAC9C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY;IACjD,MAAM,KAAK,GAAG,WAAW,aAAa,gBAAgB,CAAC;IACvD,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC;QAAE,OAAO;IACpE,MAAM,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,GAAG,aAAa,MAAM,CAAC,CAAC,2DAA2D;IAC/F,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAC5B,UAAU,GAAG,6BAA6B,aAAa,IAAI,GAAG,MAAM;QAClE,UAAU,aAAa,UAAU,GAAG,IAAI,aAAa,EAAE,EACzD,EAAE,OAAO,EAAE,GAAG,EAAE,CACjB,CAAC;IACF,IAAI,QAAQ,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,+CAA+C,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,OAA+B;IAE/B,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,IAAI,IAAI,GAA8B,GAAG,EAAE,CAAC,SAAS,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC9C,IAAI,GAAG,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,wDAAwD;IACvF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAE7E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,0BAA0B;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,iDAAiD;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,GAAG,CAAC,EAAU,EAAE,MAAc,EAAE,MAAM,GAAW,EAAE;QAChE,MAAM,KAAK,GAAG,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAE/D,CAAC;QACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBAC3C,MAAM,GAAG,CAAC,CAAC,EAAE,sBAAsB,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC,CAAC,EAAE,yBAAyB,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,KAAK,UAAU,UAAU,CAAC,GAAY,EAAE,QAAgB;IACtD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAE9C,CAAC;YACF,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC;YAC9D,IAAI,IAAI;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC,CAAC,gBAAgB;QAC3B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -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"}
|